Passed
Push — master ( 7c5a58...bfe6ae )
by Brian
09:47 queued 04:30
created
includes/api/class-getpaid-rest-date-based-controller.php 1 patch
Indentation   +573 added lines, -573 removed lines patch added patch discarded remove patch
@@ -16,577 +16,577 @@
 block discarded – undo
16 16
  */
17 17
 class GetPaid_REST_Date_Based_Controller extends GetPaid_REST_Controller {
18 18
 
19
-	/**
20
-	 * Group response items by day or month.
21
-	 *
22
-	 * @var string
23
-	 */
24
-	public $groupby = 'day';
25
-
26
-	/**
27
-	 * Returns an array with arguments to request the previous report.
28
-	 *
29
-	 * @var array
30
-	 */
31
-	public $previous_range = array();
32
-
33
-	/**
34
-	 * The period interval.
35
-	 *
36
-	 * @var int
37
-	 */
38
-	public $interval;
39
-
40
-	/**
41
-	 * Retrieves the before and after dates.
42
-	 *
43
-	 * @param WP_REST_Request $request Request object.
44
-	 * @return array The appropriate date range.
45
-	 */
46
-	public function get_date_range( $request ) {
47
-
48
-		// If not supported, assume all time.
49
-		if ( ! in_array( $request['period'], array( 'custom', 'today', 'yesterday', 'week', 'last_week', '7_days', '30_days', '60_days', '90_days', '180_days', 'month', 'last_month', 'quarter', 'last_quarter', 'year', 'last_year' ) ) ) {
50
-			$request['period'] = '7_days';
51
-		}
52
-
53
-		$date_range = call_user_func( array( $this, 'get_' . $request['period'] . '_date_range' ), $request );
54
-		$this->prepare_interval( $date_range );
55
-
56
-		return $date_range;
57
-
58
-	}
59
-
60
-	/**
61
-	 * Groups by month or days.
62
-	 *
63
-	 * @param array $range Date range.
64
-	 * @return array The appropriate date range.
65
-	 */
66
-	public function prepare_interval( $range ) {
67
-
68
-		$before = strtotime( $range['before'] ) - DAY_IN_SECONDS;
69
-		$after  = strtotime( $range['after'] ) + DAY_IN_SECONDS;
70
-		if ( 'day' === $this->groupby ) {
71
-			$difference     = max( DAY_IN_SECONDS, ( DAY_IN_SECONDS + $before - $after ) ); // Prevent division by 0;
72
-			$this->interval = absint( ceil( max( 1, $difference / DAY_IN_SECONDS ) ) );
73
-			return;
74
-		}
75
-
76
-		$this->interval = 0;
77
-		$min_date       = strtotime( date( 'Y-m-01', $after ) );
78
-
79
-		while ( $min_date <= $before ) {
80
-			$this->interval ++;
81
-			$min_date = strtotime( '+1 MONTH', $min_date );
82
-		}
83
-
84
-		$this->interval = max( 1, $this->interval );
85
-
86
-	}
87
-
88
-	/**
89
-	 * Retrieves a custom date range.
90
-	 *
91
-	 * @param WP_REST_Request $request Request object.
92
-	 * @return array The appropriate date range.
93
-	 */
94
-	public function get_custom_date_range( $request ) {
95
-
96
-		$after  = max( strtotime( '-20 years' ), strtotime( sanitize_text_field( $request['after'] ) ) );
97
-		$before = strtotime( '+1 day', current_time( 'timestamp' ) );
98
-
99
-		if ( ! empty( $request['before'] ) ) {
100
-			$before  = min( $before, strtotime( sanitize_text_field( $request['before'] ) ) );
101
-		}
102
-
103
-		// 3 months max for day view
104
-		if ( floor( ( $before - $after ) / MONTH_IN_SECONDS ) > 3 ) {
105
-			$this->groupby = 'month';
106
-		}
107
-
108
-		// Set the previous date range.
109
-		$difference           = $before - $after;
110
-		$this->previous_range = array(
111
-			'period' => 'custom',
112
-			'before' => date( 'Y-m-d', $before - $difference ),
113
-			'after'  => date( 'Y-m-d', $after - $difference ),
114
-		);
115
-
116
-		// Generate the report.
117
-		return array(
118
-			'before' => date( 'Y-m-d', $before ),
119
-			'after'  => date( 'Y-m-d', $after ),
120
-		);
121
-
122
-	}
123
-
124
-	/**
125
-	 * Retrieves todays date range.
126
-	 *
127
-	 * @return array The appropriate date range.
128
-	 */
129
-	public function get_today_date_range() {
130
-
131
-		// Set the previous date range.
132
-		$this->previous_range = array(
133
-			'period' => 'yesterday',
134
-		);
135
-
136
-		// Generate the report.
137
-		return array(
138
-			'before' => date( 'Y-m-d', strtotime( '+1 day', current_time( 'timestamp' ) ) ),
139
-			'after'  => date( 'Y-m-d', strtotime( '-1 day', current_time( 'timestamp' ) ) ),
140
-		);
141
-
142
-	}
143
-
144
-	/**
145
-	 * Retrieves yesterdays date range.
146
-	 *
147
-	 * @return array The appropriate date range.
148
-	 */
149
-	public function get_yesterday_date_range() {
150
-
151
-		// Set the previous date range.
152
-		$this->previous_range = array(
153
-			'period' => 'custom',
154
-			'before' => date( 'Y-m-d', strtotime( '-1 day', current_time( 'timestamp' ) ) ),
155
-			'after'  => date( 'Y-m-d', strtotime( '-3 days', current_time( 'timestamp' ) ) ),
156
-		);
157
-
158
-		// Generate the report.
159
-		return array(
160
-			'before' => date( 'Y-m-d', current_time( 'timestamp' ) ),
161
-			'after'  => date( 'Y-m-d', strtotime( '-2 days', current_time( 'timestamp' ) ) ),
162
-		);
163
-
164
-	}
165
-
166
-	/**
167
-	 * Retrieves this week's date range.
168
-	 *
169
-	 * @return array The appropriate date range.
170
-	 */
171
-	public function get_week_date_range() {
172
-
173
-		// Set the previous date range.
174
-		$this->previous_range = array(
175
-			'period' => 'last_week',
176
-		);
177
-
178
-		// Generate the report.
179
-		return array(
180
-			'before' => date( 'Y-m-d', strtotime( 'sunday last week', current_time( 'timestamp' ) ) + 8 * DAY_IN_SECONDS ),
181
-			'after'  => date( 'Y-m-d', strtotime( 'sunday last week', current_time( 'timestamp' ) ) ),
182
-		);
183
-
184
-	}
185
-
186
-	/**
187
-	 * Retrieves last week's date range.
188
-	 *
189
-	 * @return array The appropriate date range.
190
-	 */
191
-	public function get_last_week_date_range() {
192
-
193
-		// Set the previous date range.
194
-		$this->previous_range = array(
195
-			'period' => 'custom',
196
-			'before' => date( 'Y-m-d', strtotime( 'monday last week', current_time( 'timestamp' ) ) ),
197
-			'after'  => date( 'Y-m-d', strtotime( 'monday last week', current_time( 'timestamp' ) ) - 8 * DAY_IN_SECONDS ),
198
-		);
199
-
200
-		// Generate the report.
201
-		return array(
202
-			'before' => date( 'Y-m-d', strtotime( 'monday this week', current_time( 'timestamp' ) ) ),
203
-			'after'  => date( 'Y-m-d', strtotime( 'monday last week', current_time( 'timestamp' ) ) - DAY_IN_SECONDS ),
204
-		);
205
-
206
-	}
207
-
208
-	/**
209
-	 * Retrieves last 7 days date range.
210
-	 *
211
-	 * @return array The appropriate date range.
212
-	 */
213
-	public function get_7_days_date_range() {
214
-
215
-		// Set the previous date range.
216
-		$this->previous_range = array(
217
-			'period' => 'custom',
218
-			'before' => date( 'Y-m-d', strtotime( '-7 days', current_time( 'timestamp' ) ) ),
219
-			'after'  => date( 'Y-m-d', strtotime( '-15 days', current_time( 'timestamp' ) ) ),
220
-		);
221
-
222
-		// Generate the report.
223
-		return array(
224
-			'before' => date( 'Y-m-d', current_time( 'timestamp' ) ),
225
-			'after'  => date( 'Y-m-d', strtotime( '-8 days', current_time( 'timestamp' ) ) ),
226
-		);
227
-
228
-	}
229
-
230
-	/**
231
-	 * Retrieves last 30 days date range.
232
-	 *
233
-	 * @return array The appropriate date range.
234
-	 */
235
-	public function get_30_days_date_range() {
236
-
237
-		// Set the previous date range.
238
-		$this->previous_range = array(
239
-			'period' => 'custom',
240
-			'before' => date( 'Y-m-d', strtotime( '-30 days', current_time( 'timestamp' ) ) ),
241
-			'after'  => date( 'Y-m-d', strtotime( '-61 days', current_time( 'timestamp' ) ) ),
242
-		);
243
-
244
-		// Generate the report.
245
-		return array(
246
-			'before' => date( 'Y-m-d', current_time( 'timestamp' ) ),
247
-			'after'  => date( 'Y-m-d', strtotime( '-31 days', current_time( 'timestamp' ) ) ),
248
-		);
249
-
250
-	}
251
-
252
-	/**
253
-	 * Retrieves last 90 days date range.
254
-	 *
255
-	 * @return array The appropriate date range.
256
-	 */
257
-	public function get_90_days_date_range() {
258
-
259
-		$this->groupby = 'month';
260
-
261
-		// Set the previous date range.
262
-		$this->previous_range = array(
263
-			'period' => 'custom',
264
-			'before' => date( 'Y-m-d', strtotime( '-90 days', current_time( 'timestamp' ) ) ),
265
-			'after'  => date( 'Y-m-d', strtotime( '-181 days', current_time( 'timestamp' ) ) ),
266
-		);
267
-
268
-		// Generate the report.
269
-		return array(
270
-			'before' => date( 'Y-m-d', current_time( 'timestamp' ) ),
271
-			'after'  => date( 'Y-m-d', strtotime( '-91 days', current_time( 'timestamp' ) ) ),
272
-		);
273
-
274
-	}
275
-
276
-	/**
277
-	 * Retrieves last 180 days date range.
278
-	 *
279
-	 * @return array The appropriate date range.
280
-	 */
281
-	public function get_180_days_date_range() {
282
-
283
-		$this->groupby = 'month';
284
-
285
-		// Set the previous date range.
286
-		$this->previous_range = array(
287
-			'period' => 'custom',
288
-			'before' => date( 'Y-m-d', strtotime( '-180 days', current_time( 'timestamp' ) ) ),
289
-			'after'  => date( 'Y-m-d', strtotime( '-361 days', current_time( 'timestamp' ) ) ),
290
-		);
291
-
292
-		// Generate the report.
293
-		return array(
294
-			'before' => date( 'Y-m-d', current_time( 'timestamp' ) ),
295
-			'after'  => date( 'Y-m-d', strtotime( '-181 days', current_time( 'timestamp' ) ) ),
296
-		);
297
-
298
-	}
299
-
300
-	/**
301
-	 * Retrieves last 60 days date range.
302
-	 *
303
-	 * @return array The appropriate date range.
304
-	 */
305
-	public function get_60_days_date_range() {
306
-
307
-		// Set the previous date range.
308
-		$this->previous_range = array(
309
-			'period' => 'custom',
310
-			'before' => date( 'Y-m-d', strtotime( '-60 days', current_time( 'timestamp' ) ) ),
311
-			'after'  => date( 'Y-m-d', strtotime( '-121 days', current_time( 'timestamp' ) ) ),
312
-		);
313
-
314
-		// Generate the report.
315
-		return array(
316
-			'before' => date( 'Y-m-d', current_time( 'timestamp' ) ),
317
-			'after'  => date( 'Y-m-d', strtotime( '-61 days', current_time( 'timestamp' ) ) ),
318
-		);
319
-
320
-	}
321
-
322
-	/**
323
-	 * Retrieves this month date range.
324
-	 *
325
-	 * @return array The appropriate date range.
326
-	 */
327
-	public function get_month_date_range() {
328
-
329
-		// Set the previous date range.
330
-		$this->previous_range = array(
331
-			'period' => 'last_month',
332
-		);
333
-
334
-		// Generate the report.
335
-		return array(
336
-			'before' => date( 'Y-m-01', strtotime( 'next month', current_time( 'timestamp' ) ) ),
337
-			'after'  => date( 'Y-m-t', strtotime( 'last month', current_time( 'timestamp' ) ) ),
338
-		);
339
-
340
-	}
341
-
342
-	/**
343
-	 * Retrieves last month's date range.
344
-	 *
345
-	 * @return array The appropriate date range.
346
-	 */
347
-	public function get_last_month_date_range() {
348
-
349
-		// Set the previous date range.
350
-		$this->previous_range = array(
351
-			'period' => 'custom',
352
-			'before' => date( 'Y-m-1', strtotime( 'last month', current_time( 'timestamp' ) ) ),
353
-			'after'  => date( 'Y-m-t', strtotime( '-3 months', current_time( 'timestamp' ) ) ),
354
-		);
355
-
356
-		// Generate the report.
357
-		return array(
358
-			'before' => date( 'Y-m-1', current_time( 'timestamp' ) ),
359
-			'after'  => date( 'Y-m-t', strtotime( '-2 months', current_time( 'timestamp' ) ) ),
360
-		);
361
-
362
-	}
363
-
364
-	/**
365
-	 * Retrieves this quarter date range.
366
-	 *
367
-	 * @return array The available quarters.
368
-	 */
369
-	public function get_quarters() {
370
-
371
-		$last_year = (int) date( 'Y' ) - 1;
372
-		$next_year = (int) date( 'Y' ) + 1;
373
-		$year      = (int) date( 'Y' );
374
-		return array(
375
-
376
-			array(
377
-				'after'  => "$last_year-06-30",
378
-				'before' => "$last_year-10-01",
379
-			),
380
-
381
-			array(
382
-				'before' => "$year-01-01",
383
-				'after'  => "$last_year-09-30",
384
-			),
385
-
386
-			array(
387
-				'before' => "$year-04-01",
388
-				'after'  => "$last_year-12-31",
389
-			),
390
-
391
-			array(
392
-				'before' => "$year-07-01",
393
-				'after'  => "$year-03-31",
394
-			),
395
-
396
-			array(
397
-				'after'  => "$year-06-30",
398
-				'before' => "$year-10-01",
399
-			),
400
-
401
-			array(
402
-				'before' => "$next_year-01-01",
403
-				'after'  => "$year-09-30",
404
-			),
405
-
406
-		);
407
-
408
-	}
409
-
410
-	/**
411
-	 * Retrieves the current quater.
412
-	 *
413
-	 * @return int The current quarter.
414
-	 */
415
-	public function get_quarter() {
416
-
417
-		$month    = (int) date( 'n', current_time( 'timestamp' ) );
418
-		$quarters = array( 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4 );
419
-		return $quarters[ $month - 1 ];
420
-
421
-	}
422
-
423
-	/**
424
-	 * Retrieves this quarter date range.
425
-	 *
426
-	 * @return array The appropriate date range.
427
-	 */
428
-	public function get_quarter_date_range() {
429
-
430
-		// Set the previous date range.
431
-		$this->previous_range = array(
432
-			'period' => 'last_quarter',
433
-		);
434
-
435
-		// Generate the report.
436
-		$quarters = $this->get_quarters();
437
-		return $quarters[ $this->get_quarter() + 1 ];
438
-
439
-	}
440
-
441
-	/**
442
-	 * Retrieves last quarter's date range.
443
-	 *
444
-	 * @return array The appropriate date range.
445
-	 */
446
-	public function get_last_quarter_date_range() {
447
-
448
-		$quarters = $this->get_quarters();
449
-		$quarter  = $this->get_quarter();
450
-
451
-		// Set the previous date range.
452
-		$this->previous_range = array_merge(
453
-			$quarters[ $quarter - 1 ],
454
-			array( 'period' => 'custom' )
455
-		);
456
-
457
-		// Generate the report.
458
-		return $quarters[ $quarter ];
459
-
460
-	}
461
-
462
-	/**
463
-	 * Retrieves this year date range.
464
-	 *
465
-	 * @return array The appropriate date range.
466
-	 */
467
-	public function get_year_date_range() {
468
-
469
-		$this->groupby = 'month';
470
-
471
-		// Set the previous date range.
472
-		$this->previous_range = array(
473
-			'period' => 'last_year',
474
-		);
475
-
476
-		// Generate the report.
477
-		return array(
478
-			'before' => date( 'Y-m-d', strtotime( 'next year January 1st', current_time( 'timestamp' ) ) ),
479
-			'after'  => date( 'Y-m-d', strtotime( 'last year December 31st', current_time( 'timestamp' ) ) ),
480
-		);
481
-
482
-	}
483
-
484
-	/**
485
-	 * Retrieves last year date range.
486
-	 *
487
-	 * @return array The appropriate date range.
488
-	 */
489
-	public function get_last_year_date_range() {
490
-
491
-		$this->groupby = 'month';
492
-
493
-		// Set the previous date range.
494
-		$year          = (int) date( 'Y' ) - 3;
495
-		$this->previous_range = array(
496
-			'period' => 'custom',
497
-			'before' => date( 'Y-m-d', strtotime( 'first day of january last year', current_time( 'timestamp' ) ) ),
498
-			'after'  => "$year-12-31",
499
-		);
500
-
501
-		// Generate the report.
502
-		$year          = (int) date( 'Y' ) - 2;
503
-		return array(
504
-			'after'  => "$year-12-31",
505
-			'before' => date( 'Y-m-d', strtotime( 'first day of january this year', current_time( 'timestamp' ) ) ),
506
-		);
507
-
508
-	}
509
-
510
-	/**
511
-	 * Prepare a the request date for SQL usage.
512
-	 *
513
-	 * @param WP_REST_Request $request Request object.
514
-	 * @param string $date_field The date field.
515
-	 * @return string The appropriate SQL.
516
-	 */
517
-	public function get_date_range_sql( $request, $date_field ) {
518
-		global $wpdb;
519
-
520
-		$sql = '1=1';
521
-		$range = $this->get_date_range( $request );
522
-
523
-		if ( ! empty( $range['after'] ) ) {
524
-			$sql .= ' AND ' . $wpdb->prepare(
525
-				"$date_field > %s",
526
-				$range['after']
527
-			);
528
-		}
529
-
530
-		if ( ! empty( $range['before'] ) ) {
531
-			$sql .= ' AND ' . $wpdb->prepare(
532
-				"$date_field < %s",
533
-				$range['before']
534
-			);
535
-		}
536
-
537
-		return $sql;
538
-
539
-	}
540
-
541
-	/**
542
-	 * Prepares a group by query.
543
-	 *
544
-	 * @param string $date_field The date field.
545
-	 * @return string The appropriate SQL.
546
-	 */
547
-	public function get_group_by_sql( $date_field ) {
548
-
549
-		if ( 'day' === $this->groupby ) {
550
-			return "YEAR($date_field), MONTH($date_field), DAY($date_field)";
551
-		}
552
-
553
-		return "YEAR($date_field), MONTH($date_field)";
554
-	}
555
-
556
-	/**
557
-	 * Get the query params for collections.
558
-	 *
559
-	 * @return array
560
-	 */
561
-	public function get_collection_params() {
562
-		return array(
563
-			'context' => $this->get_context_param( array( 'default' => 'view' ) ),
564
-			'period'  => array(
565
-				'description'       => __( 'Limit to results of a specific period.', 'invoicing' ),
566
-				'type'              => 'string',
567
-				'enum'              => array( 'custom', 'today', 'yesterday', 'week', 'last_week', '7_days', '30_days', '60_days', '90_days', '180_days', 'month', 'last_month', 'quarter', 'last_quarter', 'year', 'last_year', 'quarter', 'last_quarter' ),
568
-				'validate_callback' => 'rest_validate_request_arg',
569
-				'sanitize_callback' => 'sanitize_text_field',
570
-				'default'           => '7_days',
571
-			),
572
-			'after'   => array(
573
-				/* translators: %s: date format */
574
-				'description'       => sprintf( __( 'Limit to results after a specific date, the date needs to be in the %s format.', 'invoicing' ), 'YYYY-MM-DD' ),
575
-				'type'              => 'string',
576
-				'format'            => 'date',
577
-				'validate_callback' => 'rest_validate_request_arg',
578
-				'sanitize_callback' => 'sanitize_text_field',
579
-				'default'           => date( 'Y-m-d', strtotime( '-8 days', current_time( 'timestamp' ) ) ),
580
-			),
581
-			'before'  => array(
582
-				/* translators: %s: date format */
583
-				'description'       => sprintf( __( 'Limit to results before a specific date, the date needs to be in the %s format.', 'invoicing' ), 'YYYY-MM-DD' ),
584
-				'type'              => 'string',
585
-				'format'            => 'date',
586
-				'validate_callback' => 'rest_validate_request_arg',
587
-				'sanitize_callback' => 'sanitize_text_field',
588
-				'default'           => date( 'Y-m-d', current_time( 'timestamp' ) ),
589
-			),
590
-		);
591
-	}
19
+    /**
20
+     * Group response items by day or month.
21
+     *
22
+     * @var string
23
+     */
24
+    public $groupby = 'day';
25
+
26
+    /**
27
+     * Returns an array with arguments to request the previous report.
28
+     *
29
+     * @var array
30
+     */
31
+    public $previous_range = array();
32
+
33
+    /**
34
+     * The period interval.
35
+     *
36
+     * @var int
37
+     */
38
+    public $interval;
39
+
40
+    /**
41
+     * Retrieves the before and after dates.
42
+     *
43
+     * @param WP_REST_Request $request Request object.
44
+     * @return array The appropriate date range.
45
+     */
46
+    public function get_date_range( $request ) {
47
+
48
+        // If not supported, assume all time.
49
+        if ( ! in_array( $request['period'], array( 'custom', 'today', 'yesterday', 'week', 'last_week', '7_days', '30_days', '60_days', '90_days', '180_days', 'month', 'last_month', 'quarter', 'last_quarter', 'year', 'last_year' ) ) ) {
50
+            $request['period'] = '7_days';
51
+        }
52
+
53
+        $date_range = call_user_func( array( $this, 'get_' . $request['period'] . '_date_range' ), $request );
54
+        $this->prepare_interval( $date_range );
55
+
56
+        return $date_range;
57
+
58
+    }
59
+
60
+    /**
61
+     * Groups by month or days.
62
+     *
63
+     * @param array $range Date range.
64
+     * @return array The appropriate date range.
65
+     */
66
+    public function prepare_interval( $range ) {
67
+
68
+        $before = strtotime( $range['before'] ) - DAY_IN_SECONDS;
69
+        $after  = strtotime( $range['after'] ) + DAY_IN_SECONDS;
70
+        if ( 'day' === $this->groupby ) {
71
+            $difference     = max( DAY_IN_SECONDS, ( DAY_IN_SECONDS + $before - $after ) ); // Prevent division by 0;
72
+            $this->interval = absint( ceil( max( 1, $difference / DAY_IN_SECONDS ) ) );
73
+            return;
74
+        }
75
+
76
+        $this->interval = 0;
77
+        $min_date       = strtotime( date( 'Y-m-01', $after ) );
78
+
79
+        while ( $min_date <= $before ) {
80
+            $this->interval ++;
81
+            $min_date = strtotime( '+1 MONTH', $min_date );
82
+        }
83
+
84
+        $this->interval = max( 1, $this->interval );
85
+
86
+    }
87
+
88
+    /**
89
+     * Retrieves a custom date range.
90
+     *
91
+     * @param WP_REST_Request $request Request object.
92
+     * @return array The appropriate date range.
93
+     */
94
+    public function get_custom_date_range( $request ) {
95
+
96
+        $after  = max( strtotime( '-20 years' ), strtotime( sanitize_text_field( $request['after'] ) ) );
97
+        $before = strtotime( '+1 day', current_time( 'timestamp' ) );
98
+
99
+        if ( ! empty( $request['before'] ) ) {
100
+            $before  = min( $before, strtotime( sanitize_text_field( $request['before'] ) ) );
101
+        }
102
+
103
+        // 3 months max for day view
104
+        if ( floor( ( $before - $after ) / MONTH_IN_SECONDS ) > 3 ) {
105
+            $this->groupby = 'month';
106
+        }
107
+
108
+        // Set the previous date range.
109
+        $difference           = $before - $after;
110
+        $this->previous_range = array(
111
+            'period' => 'custom',
112
+            'before' => date( 'Y-m-d', $before - $difference ),
113
+            'after'  => date( 'Y-m-d', $after - $difference ),
114
+        );
115
+
116
+        // Generate the report.
117
+        return array(
118
+            'before' => date( 'Y-m-d', $before ),
119
+            'after'  => date( 'Y-m-d', $after ),
120
+        );
121
+
122
+    }
123
+
124
+    /**
125
+     * Retrieves todays date range.
126
+     *
127
+     * @return array The appropriate date range.
128
+     */
129
+    public function get_today_date_range() {
130
+
131
+        // Set the previous date range.
132
+        $this->previous_range = array(
133
+            'period' => 'yesterday',
134
+        );
135
+
136
+        // Generate the report.
137
+        return array(
138
+            'before' => date( 'Y-m-d', strtotime( '+1 day', current_time( 'timestamp' ) ) ),
139
+            'after'  => date( 'Y-m-d', strtotime( '-1 day', current_time( 'timestamp' ) ) ),
140
+        );
141
+
142
+    }
143
+
144
+    /**
145
+     * Retrieves yesterdays date range.
146
+     *
147
+     * @return array The appropriate date range.
148
+     */
149
+    public function get_yesterday_date_range() {
150
+
151
+        // Set the previous date range.
152
+        $this->previous_range = array(
153
+            'period' => 'custom',
154
+            'before' => date( 'Y-m-d', strtotime( '-1 day', current_time( 'timestamp' ) ) ),
155
+            'after'  => date( 'Y-m-d', strtotime( '-3 days', current_time( 'timestamp' ) ) ),
156
+        );
157
+
158
+        // Generate the report.
159
+        return array(
160
+            'before' => date( 'Y-m-d', current_time( 'timestamp' ) ),
161
+            'after'  => date( 'Y-m-d', strtotime( '-2 days', current_time( 'timestamp' ) ) ),
162
+        );
163
+
164
+    }
165
+
166
+    /**
167
+     * Retrieves this week's date range.
168
+     *
169
+     * @return array The appropriate date range.
170
+     */
171
+    public function get_week_date_range() {
172
+
173
+        // Set the previous date range.
174
+        $this->previous_range = array(
175
+            'period' => 'last_week',
176
+        );
177
+
178
+        // Generate the report.
179
+        return array(
180
+            'before' => date( 'Y-m-d', strtotime( 'sunday last week', current_time( 'timestamp' ) ) + 8 * DAY_IN_SECONDS ),
181
+            'after'  => date( 'Y-m-d', strtotime( 'sunday last week', current_time( 'timestamp' ) ) ),
182
+        );
183
+
184
+    }
185
+
186
+    /**
187
+     * Retrieves last week's date range.
188
+     *
189
+     * @return array The appropriate date range.
190
+     */
191
+    public function get_last_week_date_range() {
192
+
193
+        // Set the previous date range.
194
+        $this->previous_range = array(
195
+            'period' => 'custom',
196
+            'before' => date( 'Y-m-d', strtotime( 'monday last week', current_time( 'timestamp' ) ) ),
197
+            'after'  => date( 'Y-m-d', strtotime( 'monday last week', current_time( 'timestamp' ) ) - 8 * DAY_IN_SECONDS ),
198
+        );
199
+
200
+        // Generate the report.
201
+        return array(
202
+            'before' => date( 'Y-m-d', strtotime( 'monday this week', current_time( 'timestamp' ) ) ),
203
+            'after'  => date( 'Y-m-d', strtotime( 'monday last week', current_time( 'timestamp' ) ) - DAY_IN_SECONDS ),
204
+        );
205
+
206
+    }
207
+
208
+    /**
209
+     * Retrieves last 7 days date range.
210
+     *
211
+     * @return array The appropriate date range.
212
+     */
213
+    public function get_7_days_date_range() {
214
+
215
+        // Set the previous date range.
216
+        $this->previous_range = array(
217
+            'period' => 'custom',
218
+            'before' => date( 'Y-m-d', strtotime( '-7 days', current_time( 'timestamp' ) ) ),
219
+            'after'  => date( 'Y-m-d', strtotime( '-15 days', current_time( 'timestamp' ) ) ),
220
+        );
221
+
222
+        // Generate the report.
223
+        return array(
224
+            'before' => date( 'Y-m-d', current_time( 'timestamp' ) ),
225
+            'after'  => date( 'Y-m-d', strtotime( '-8 days', current_time( 'timestamp' ) ) ),
226
+        );
227
+
228
+    }
229
+
230
+    /**
231
+     * Retrieves last 30 days date range.
232
+     *
233
+     * @return array The appropriate date range.
234
+     */
235
+    public function get_30_days_date_range() {
236
+
237
+        // Set the previous date range.
238
+        $this->previous_range = array(
239
+            'period' => 'custom',
240
+            'before' => date( 'Y-m-d', strtotime( '-30 days', current_time( 'timestamp' ) ) ),
241
+            'after'  => date( 'Y-m-d', strtotime( '-61 days', current_time( 'timestamp' ) ) ),
242
+        );
243
+
244
+        // Generate the report.
245
+        return array(
246
+            'before' => date( 'Y-m-d', current_time( 'timestamp' ) ),
247
+            'after'  => date( 'Y-m-d', strtotime( '-31 days', current_time( 'timestamp' ) ) ),
248
+        );
249
+
250
+    }
251
+
252
+    /**
253
+     * Retrieves last 90 days date range.
254
+     *
255
+     * @return array The appropriate date range.
256
+     */
257
+    public function get_90_days_date_range() {
258
+
259
+        $this->groupby = 'month';
260
+
261
+        // Set the previous date range.
262
+        $this->previous_range = array(
263
+            'period' => 'custom',
264
+            'before' => date( 'Y-m-d', strtotime( '-90 days', current_time( 'timestamp' ) ) ),
265
+            'after'  => date( 'Y-m-d', strtotime( '-181 days', current_time( 'timestamp' ) ) ),
266
+        );
267
+
268
+        // Generate the report.
269
+        return array(
270
+            'before' => date( 'Y-m-d', current_time( 'timestamp' ) ),
271
+            'after'  => date( 'Y-m-d', strtotime( '-91 days', current_time( 'timestamp' ) ) ),
272
+        );
273
+
274
+    }
275
+
276
+    /**
277
+     * Retrieves last 180 days date range.
278
+     *
279
+     * @return array The appropriate date range.
280
+     */
281
+    public function get_180_days_date_range() {
282
+
283
+        $this->groupby = 'month';
284
+
285
+        // Set the previous date range.
286
+        $this->previous_range = array(
287
+            'period' => 'custom',
288
+            'before' => date( 'Y-m-d', strtotime( '-180 days', current_time( 'timestamp' ) ) ),
289
+            'after'  => date( 'Y-m-d', strtotime( '-361 days', current_time( 'timestamp' ) ) ),
290
+        );
291
+
292
+        // Generate the report.
293
+        return array(
294
+            'before' => date( 'Y-m-d', current_time( 'timestamp' ) ),
295
+            'after'  => date( 'Y-m-d', strtotime( '-181 days', current_time( 'timestamp' ) ) ),
296
+        );
297
+
298
+    }
299
+
300
+    /**
301
+     * Retrieves last 60 days date range.
302
+     *
303
+     * @return array The appropriate date range.
304
+     */
305
+    public function get_60_days_date_range() {
306
+
307
+        // Set the previous date range.
308
+        $this->previous_range = array(
309
+            'period' => 'custom',
310
+            'before' => date( 'Y-m-d', strtotime( '-60 days', current_time( 'timestamp' ) ) ),
311
+            'after'  => date( 'Y-m-d', strtotime( '-121 days', current_time( 'timestamp' ) ) ),
312
+        );
313
+
314
+        // Generate the report.
315
+        return array(
316
+            'before' => date( 'Y-m-d', current_time( 'timestamp' ) ),
317
+            'after'  => date( 'Y-m-d', strtotime( '-61 days', current_time( 'timestamp' ) ) ),
318
+        );
319
+
320
+    }
321
+
322
+    /**
323
+     * Retrieves this month date range.
324
+     *
325
+     * @return array The appropriate date range.
326
+     */
327
+    public function get_month_date_range() {
328
+
329
+        // Set the previous date range.
330
+        $this->previous_range = array(
331
+            'period' => 'last_month',
332
+        );
333
+
334
+        // Generate the report.
335
+        return array(
336
+            'before' => date( 'Y-m-01', strtotime( 'next month', current_time( 'timestamp' ) ) ),
337
+            'after'  => date( 'Y-m-t', strtotime( 'last month', current_time( 'timestamp' ) ) ),
338
+        );
339
+
340
+    }
341
+
342
+    /**
343
+     * Retrieves last month's date range.
344
+     *
345
+     * @return array The appropriate date range.
346
+     */
347
+    public function get_last_month_date_range() {
348
+
349
+        // Set the previous date range.
350
+        $this->previous_range = array(
351
+            'period' => 'custom',
352
+            'before' => date( 'Y-m-1', strtotime( 'last month', current_time( 'timestamp' ) ) ),
353
+            'after'  => date( 'Y-m-t', strtotime( '-3 months', current_time( 'timestamp' ) ) ),
354
+        );
355
+
356
+        // Generate the report.
357
+        return array(
358
+            'before' => date( 'Y-m-1', current_time( 'timestamp' ) ),
359
+            'after'  => date( 'Y-m-t', strtotime( '-2 months', current_time( 'timestamp' ) ) ),
360
+        );
361
+
362
+    }
363
+
364
+    /**
365
+     * Retrieves this quarter date range.
366
+     *
367
+     * @return array The available quarters.
368
+     */
369
+    public function get_quarters() {
370
+
371
+        $last_year = (int) date( 'Y' ) - 1;
372
+        $next_year = (int) date( 'Y' ) + 1;
373
+        $year      = (int) date( 'Y' );
374
+        return array(
375
+
376
+            array(
377
+                'after'  => "$last_year-06-30",
378
+                'before' => "$last_year-10-01",
379
+            ),
380
+
381
+            array(
382
+                'before' => "$year-01-01",
383
+                'after'  => "$last_year-09-30",
384
+            ),
385
+
386
+            array(
387
+                'before' => "$year-04-01",
388
+                'after'  => "$last_year-12-31",
389
+            ),
390
+
391
+            array(
392
+                'before' => "$year-07-01",
393
+                'after'  => "$year-03-31",
394
+            ),
395
+
396
+            array(
397
+                'after'  => "$year-06-30",
398
+                'before' => "$year-10-01",
399
+            ),
400
+
401
+            array(
402
+                'before' => "$next_year-01-01",
403
+                'after'  => "$year-09-30",
404
+            ),
405
+
406
+        );
407
+
408
+    }
409
+
410
+    /**
411
+     * Retrieves the current quater.
412
+     *
413
+     * @return int The current quarter.
414
+     */
415
+    public function get_quarter() {
416
+
417
+        $month    = (int) date( 'n', current_time( 'timestamp' ) );
418
+        $quarters = array( 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4 );
419
+        return $quarters[ $month - 1 ];
420
+
421
+    }
422
+
423
+    /**
424
+     * Retrieves this quarter date range.
425
+     *
426
+     * @return array The appropriate date range.
427
+     */
428
+    public function get_quarter_date_range() {
429
+
430
+        // Set the previous date range.
431
+        $this->previous_range = array(
432
+            'period' => 'last_quarter',
433
+        );
434
+
435
+        // Generate the report.
436
+        $quarters = $this->get_quarters();
437
+        return $quarters[ $this->get_quarter() + 1 ];
438
+
439
+    }
440
+
441
+    /**
442
+     * Retrieves last quarter's date range.
443
+     *
444
+     * @return array The appropriate date range.
445
+     */
446
+    public function get_last_quarter_date_range() {
447
+
448
+        $quarters = $this->get_quarters();
449
+        $quarter  = $this->get_quarter();
450
+
451
+        // Set the previous date range.
452
+        $this->previous_range = array_merge(
453
+            $quarters[ $quarter - 1 ],
454
+            array( 'period' => 'custom' )
455
+        );
456
+
457
+        // Generate the report.
458
+        return $quarters[ $quarter ];
459
+
460
+    }
461
+
462
+    /**
463
+     * Retrieves this year date range.
464
+     *
465
+     * @return array The appropriate date range.
466
+     */
467
+    public function get_year_date_range() {
468
+
469
+        $this->groupby = 'month';
470
+
471
+        // Set the previous date range.
472
+        $this->previous_range = array(
473
+            'period' => 'last_year',
474
+        );
475
+
476
+        // Generate the report.
477
+        return array(
478
+            'before' => date( 'Y-m-d', strtotime( 'next year January 1st', current_time( 'timestamp' ) ) ),
479
+            'after'  => date( 'Y-m-d', strtotime( 'last year December 31st', current_time( 'timestamp' ) ) ),
480
+        );
481
+
482
+    }
483
+
484
+    /**
485
+     * Retrieves last year date range.
486
+     *
487
+     * @return array The appropriate date range.
488
+     */
489
+    public function get_last_year_date_range() {
490
+
491
+        $this->groupby = 'month';
492
+
493
+        // Set the previous date range.
494
+        $year          = (int) date( 'Y' ) - 3;
495
+        $this->previous_range = array(
496
+            'period' => 'custom',
497
+            'before' => date( 'Y-m-d', strtotime( 'first day of january last year', current_time( 'timestamp' ) ) ),
498
+            'after'  => "$year-12-31",
499
+        );
500
+
501
+        // Generate the report.
502
+        $year          = (int) date( 'Y' ) - 2;
503
+        return array(
504
+            'after'  => "$year-12-31",
505
+            'before' => date( 'Y-m-d', strtotime( 'first day of january this year', current_time( 'timestamp' ) ) ),
506
+        );
507
+
508
+    }
509
+
510
+    /**
511
+     * Prepare a the request date for SQL usage.
512
+     *
513
+     * @param WP_REST_Request $request Request object.
514
+     * @param string $date_field The date field.
515
+     * @return string The appropriate SQL.
516
+     */
517
+    public function get_date_range_sql( $request, $date_field ) {
518
+        global $wpdb;
519
+
520
+        $sql = '1=1';
521
+        $range = $this->get_date_range( $request );
522
+
523
+        if ( ! empty( $range['after'] ) ) {
524
+            $sql .= ' AND ' . $wpdb->prepare(
525
+                "$date_field > %s",
526
+                $range['after']
527
+            );
528
+        }
529
+
530
+        if ( ! empty( $range['before'] ) ) {
531
+            $sql .= ' AND ' . $wpdb->prepare(
532
+                "$date_field < %s",
533
+                $range['before']
534
+            );
535
+        }
536
+
537
+        return $sql;
538
+
539
+    }
540
+
541
+    /**
542
+     * Prepares a group by query.
543
+     *
544
+     * @param string $date_field The date field.
545
+     * @return string The appropriate SQL.
546
+     */
547
+    public function get_group_by_sql( $date_field ) {
548
+
549
+        if ( 'day' === $this->groupby ) {
550
+            return "YEAR($date_field), MONTH($date_field), DAY($date_field)";
551
+        }
552
+
553
+        return "YEAR($date_field), MONTH($date_field)";
554
+    }
555
+
556
+    /**
557
+     * Get the query params for collections.
558
+     *
559
+     * @return array
560
+     */
561
+    public function get_collection_params() {
562
+        return array(
563
+            'context' => $this->get_context_param( array( 'default' => 'view' ) ),
564
+            'period'  => array(
565
+                'description'       => __( 'Limit to results of a specific period.', 'invoicing' ),
566
+                'type'              => 'string',
567
+                'enum'              => array( 'custom', 'today', 'yesterday', 'week', 'last_week', '7_days', '30_days', '60_days', '90_days', '180_days', 'month', 'last_month', 'quarter', 'last_quarter', 'year', 'last_year', 'quarter', 'last_quarter' ),
568
+                'validate_callback' => 'rest_validate_request_arg',
569
+                'sanitize_callback' => 'sanitize_text_field',
570
+                'default'           => '7_days',
571
+            ),
572
+            'after'   => array(
573
+                /* translators: %s: date format */
574
+                'description'       => sprintf( __( 'Limit to results after a specific date, the date needs to be in the %s format.', 'invoicing' ), 'YYYY-MM-DD' ),
575
+                'type'              => 'string',
576
+                'format'            => 'date',
577
+                'validate_callback' => 'rest_validate_request_arg',
578
+                'sanitize_callback' => 'sanitize_text_field',
579
+                'default'           => date( 'Y-m-d', strtotime( '-8 days', current_time( 'timestamp' ) ) ),
580
+            ),
581
+            'before'  => array(
582
+                /* translators: %s: date format */
583
+                'description'       => sprintf( __( 'Limit to results before a specific date, the date needs to be in the %s format.', 'invoicing' ), 'YYYY-MM-DD' ),
584
+                'type'              => 'string',
585
+                'format'            => 'date',
586
+                'validate_callback' => 'rest_validate_request_arg',
587
+                'sanitize_callback' => 'sanitize_text_field',
588
+                'default'           => date( 'Y-m-d', current_time( 'timestamp' ) ),
589
+            ),
590
+        );
591
+    }
592 592
 }
Please login to merge, or discard this patch.
includes/api/class-wpinv-rest-invoice-controller.php 1 patch
Indentation   +125 added lines, -125 removed lines patch added patch discarded remove patch
@@ -15,132 +15,132 @@
 block discarded – undo
15 15
 class WPInv_REST_Invoice_Controller extends GetPaid_REST_Posts_Controller {
16 16
 
17 17
     /**
18
-	 * Post type.
19
-	 *
20
-	 * @var string
21
-	 */
22
-	protected $post_type = 'wpi_invoice';
23
-
24
-	/**
25
-	 * The base of this controller's route.
26
-	 *
27
-	 * @since 1.0.13
28
-	 * @var string
29
-	 */
30
-	protected $rest_base = 'invoices';
31
-
32
-	/** Contains this controller's class name.
33
-	 *
34
-	 * @var string
35
-	 */
36
-	public $crud_class = 'WPInv_Invoice';
18
+     * Post type.
19
+     *
20
+     * @var string
21
+     */
22
+    protected $post_type = 'wpi_invoice';
37 23
 
38 24
     /**
39
-	 * Retrieves the query params for the invoices collection.
40
-	 *
41
-	 * @since 1.0.13
42
-	 *
43
-	 * @return array Collection parameters.
44
-	 */
45
-	public function get_collection_params() {
46
-
47
-		$params = array_merge(
48
-			parent::get_collection_params(),
49
-			array(
50
-
51
-				'customers'         => array(
52
-					'description'       => __( 'Limit result set to invoices for specific user ids.', 'invoicing' ),
53
-					'type'              => 'array',
54
-					'items'             => array(
55
-						'type' => 'integer',
56
-					),
57
-					'default'           => array(),
58
-					'sanitize_callback' => 'wp_parse_id_list',
59
-				),
60
-
61
-				'exclude_customers' => array(
62
-					'description'       => __( 'Exclude invoices to specific users.', 'invoicing' ),
63
-					'type'              => 'array',
64
-					'items'             => array(
65
-						'type' => 'integer',
66
-					),
67
-					'default'           => array(),
68
-					'sanitize_callback' => 'wp_parse_id_list',
69
-				),
70
-
71
-				'parent'            => array(
72
-					'description'       => __( 'Limit result set to those of particular parent IDs.', 'invoicing' ),
73
-					'type'              => 'array',
74
-					'items'             => array(
75
-						'type' => 'integer',
76
-					),
77
-					'sanitize_callback' => 'wp_parse_id_list',
78
-					'default'           => array(),
79
-				),
80
-
81
-				'parent_exclude'    => array(
82
-					'description'       => __( 'Limit result set to all items except those of a particular parent ID.', 'invoicing' ),
83
-					'type'              => 'array',
84
-					'items'             => array(
85
-						'type' => 'integer',
86
-					),
87
-					'sanitize_callback' => 'wp_parse_id_list',
88
-					'default'           => array(),
89
-				),
90
-
91
-			)
92
-		);
93
-
94
-		// Filter collection parameters for the invoices controller.
95
-		return apply_filters( 'getpaid_rest_invoices_collection_params', $params, $this );
96
-	}
97
-
98
-	/**
99
-	 * Determine the allowed query_vars for a get_items() response and
100
-	 * prepare for WP_Query.
101
-	 *
102
-	 * @param array           $prepared_args Prepared arguments.
103
-	 * @param WP_REST_Request $request Request object.
104
-	 * @return array          $query_args
105
-	 */
106
-	protected function prepare_items_query( $prepared_args = array(), $request = null ) {
107
-
108
-		$query_args = parent::prepare_items_query( $prepared_args );
109
-
110
-		// Retrieve invoices for specific customers.
111
-		if ( ! empty( $request['customers'] ) ) {
112
-			$query_args['author__in'] = $request['customers'];
113
-		}
114
-
115
-		// Skip invoices for specific customers.
116
-		if ( ! empty( $request['exclude_customers'] ) ) {
117
-			$query_args['author__not_in'] = $request['exclude_customers'];
118
-		}
119
-
120
-		return apply_filters( 'getpaid_rest_invoices_prepare_items_query', $query_args, $request, $this );
121
-
122
-	}
123
-
124
-	/**
125
-	 * Retrieves a valid list of post statuses.
126
-	 *
127
-	 * @since 1.0.15
128
-	 *
129
-	 * @return array A list of registered item statuses.
130
-	 */
131
-	public function get_post_statuses() {
132
-		return array_keys( wpinv_get_invoice_statuses( true, false, $this->post_type ) );
133
-	}
134
-
135
-	/**
136
-	 * Saves a single invoice.
137
-	 *
138
-	 * @param WPInv_Invoice $invoice Invoice to save.
139
-	 * @return WP_Error|WPInv_Invoice
140
-	 */
141
-	protected function save_object( $invoice ) {
142
-		$invoice->recalculate_total();
143
-		return parent::save_object( $invoice );
144
-	}
25
+     * The base of this controller's route.
26
+     *
27
+     * @since 1.0.13
28
+     * @var string
29
+     */
30
+    protected $rest_base = 'invoices';
31
+
32
+    /** Contains this controller's class name.
33
+     *
34
+     * @var string
35
+     */
36
+    public $crud_class = 'WPInv_Invoice';
37
+
38
+    /**
39
+     * Retrieves the query params for the invoices collection.
40
+     *
41
+     * @since 1.0.13
42
+     *
43
+     * @return array Collection parameters.
44
+     */
45
+    public function get_collection_params() {
46
+
47
+        $params = array_merge(
48
+            parent::get_collection_params(),
49
+            array(
50
+
51
+                'customers'         => array(
52
+                    'description'       => __( 'Limit result set to invoices for specific user ids.', 'invoicing' ),
53
+                    'type'              => 'array',
54
+                    'items'             => array(
55
+                        'type' => 'integer',
56
+                    ),
57
+                    'default'           => array(),
58
+                    'sanitize_callback' => 'wp_parse_id_list',
59
+                ),
60
+
61
+                'exclude_customers' => array(
62
+                    'description'       => __( 'Exclude invoices to specific users.', 'invoicing' ),
63
+                    'type'              => 'array',
64
+                    'items'             => array(
65
+                        'type' => 'integer',
66
+                    ),
67
+                    'default'           => array(),
68
+                    'sanitize_callback' => 'wp_parse_id_list',
69
+                ),
70
+
71
+                'parent'            => array(
72
+                    'description'       => __( 'Limit result set to those of particular parent IDs.', 'invoicing' ),
73
+                    'type'              => 'array',
74
+                    'items'             => array(
75
+                        'type' => 'integer',
76
+                    ),
77
+                    'sanitize_callback' => 'wp_parse_id_list',
78
+                    'default'           => array(),
79
+                ),
80
+
81
+                'parent_exclude'    => array(
82
+                    'description'       => __( 'Limit result set to all items except those of a particular parent ID.', 'invoicing' ),
83
+                    'type'              => 'array',
84
+                    'items'             => array(
85
+                        'type' => 'integer',
86
+                    ),
87
+                    'sanitize_callback' => 'wp_parse_id_list',
88
+                    'default'           => array(),
89
+                ),
90
+
91
+            )
92
+        );
93
+
94
+        // Filter collection parameters for the invoices controller.
95
+        return apply_filters( 'getpaid_rest_invoices_collection_params', $params, $this );
96
+    }
97
+
98
+    /**
99
+     * Determine the allowed query_vars for a get_items() response and
100
+     * prepare for WP_Query.
101
+     *
102
+     * @param array           $prepared_args Prepared arguments.
103
+     * @param WP_REST_Request $request Request object.
104
+     * @return array          $query_args
105
+     */
106
+    protected function prepare_items_query( $prepared_args = array(), $request = null ) {
107
+
108
+        $query_args = parent::prepare_items_query( $prepared_args );
109
+
110
+        // Retrieve invoices for specific customers.
111
+        if ( ! empty( $request['customers'] ) ) {
112
+            $query_args['author__in'] = $request['customers'];
113
+        }
114
+
115
+        // Skip invoices for specific customers.
116
+        if ( ! empty( $request['exclude_customers'] ) ) {
117
+            $query_args['author__not_in'] = $request['exclude_customers'];
118
+        }
119
+
120
+        return apply_filters( 'getpaid_rest_invoices_prepare_items_query', $query_args, $request, $this );
121
+
122
+    }
123
+
124
+    /**
125
+     * Retrieves a valid list of post statuses.
126
+     *
127
+     * @since 1.0.15
128
+     *
129
+     * @return array A list of registered item statuses.
130
+     */
131
+    public function get_post_statuses() {
132
+        return array_keys( wpinv_get_invoice_statuses( true, false, $this->post_type ) );
133
+    }
134
+
135
+    /**
136
+     * Saves a single invoice.
137
+     *
138
+     * @param WPInv_Invoice $invoice Invoice to save.
139
+     * @return WP_Error|WPInv_Invoice
140
+     */
141
+    protected function save_object( $invoice ) {
142
+        $invoice->recalculate_total();
143
+        return parent::save_object( $invoice );
144
+    }
145 145
 
146 146
 }
Please login to merge, or discard this patch.
includes/api/class-getpaid-rest-reports-controller.php 1 patch
Indentation   +170 added lines, -170 removed lines patch added patch discarded remove patch
@@ -18,178 +18,178 @@
 block discarded – undo
18 18
  */
19 19
 class GetPaid_REST_Reports_Controller extends GetPaid_REST_Controller {
20 20
 
21
-	/**
22
-	 * Route base.
23
-	 *
24
-	 * @var string
25
-	 */
26
-	protected $rest_base = 'reports';
27
-
28
-	/**
29
-	 * Registers the routes for the objects of the controller.
30
-	 *
31
-	 * @since 2.0.0
32
-	 *
33
-	 * @see register_rest_route()
34
-	 */
35
-	public function register_namespace_routes( $namespace ) {
36
-
37
-		// List all available reports.
38
-		register_rest_route(
39
-			$namespace,
40
-			$this->rest_base,
41
-			array(
42
-				array(
43
-					'methods'             => WP_REST_Server::READABLE,
44
-					'callback'            => array( $this, 'get_items' ),
45
-					'permission_callback' => array( $this, 'get_items_permissions_check' ),
46
-					'args'                => $this->get_collection_params(),
47
-				),
48
-				'schema' => array( $this, 'get_public_item_schema' ),
49
-			)
50
-		);
51
-
52
-	}
53
-
54
-	/**
55
-	 * Makes sure the current user has access to READ the report APIs.
56
-	 *
57
-	 * @since  2.0.0
58
-	 * @param WP_REST_Request $request Full data about the request.
59
-	 * @return WP_Error|boolean
60
-	 */
61
-	public function get_items_permissions_check( $request ) {
62
-
63
-		if ( ! wpinv_current_user_can_manage_invoicing() ) {
64
-			return new WP_Error( 'rest_cannot_view', __( 'Sorry, you cannot list resources.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
65
-		}
66
-
67
-		return true;
68
-	}
69
-
70
-	/**
71
-	 * Get reports list.
72
-	 *
73
-	 * @since 2.0.0
74
-	 * @return array
75
-	 */
76
-	protected function get_reports() {
77
-
78
-		$reports = array(
79
-			array(
80
-				'slug'        => 'sales',
81
-				'description' => __( 'List of sales reports.', 'invoicing' ),
82
-			),
83
-			array(
84
-				'slug'        => 'top_sellers',
85
-				'description' => __( 'List of top selling items.', 'invoicing' ),
86
-			),
87
-			array(
88
-				'slug'        => 'top_earners',
89
-				'description' => __( 'List of top earning items.', 'invoicing' ),
90
-			),
91
-			array(
92
-				'slug'        => 'invoices/counts',
93
-				'description' => __( 'Invoice counts.', 'invoicing' ),
94
-			),
95
-		);
96
-
97
-		return apply_filters( 'getpaid_available_api_reports', $reports );
98
-
99
-	}
100
-
101
-	/**
102
-	 * Get all reports.
103
-	 *
104
-	 * @since 2.0.0
105
-	 * @param WP_REST_Request $request
106
-	 * @return array|WP_Error
107
-	 */
108
-	public function get_items( $request ) {
109
-		$data    = array();
110
-		$reports = $this->get_reports();
111
-
112
-		foreach ( $reports as $report ) {
113
-			$item   = $this->prepare_item_for_response( (object) $report, $request );
114
-			$data[] = $this->prepare_response_for_collection( $item );
115
-		}
116
-
117
-		return rest_ensure_response( $data );
118
-	}
119
-
120
-	/**
121
-	 * Prepare a report object for serialization.
122
-	 *
123
-	 * @since 2.0.0
124
-	 * @param stdClass $report Report data.
125
-	 * @param WP_REST_Request $request Request object.
126
-	 * @return WP_REST_Response $response Response data.
127
-	 */
128
-	public function prepare_item_for_response( $report, $request ) {
129
-		$data = array(
130
-			'slug'        => $report->slug,
131
-			'description' => $report->description,
132
-		);
133
-
134
-		$context = ! empty( $request['context'] ) ? $request['context'] : 'view';
135
-		$data = $this->add_additional_fields_to_object( $data, $request );
136
-		$data = $this->filter_response_by_context( $data, $context );
137
-
138
-		// Wrap the data in a response object.
139
-		$response = rest_ensure_response( $data );
140
-		$response->add_links(
21
+    /**
22
+     * Route base.
23
+     *
24
+     * @var string
25
+     */
26
+    protected $rest_base = 'reports';
27
+
28
+    /**
29
+     * Registers the routes for the objects of the controller.
30
+     *
31
+     * @since 2.0.0
32
+     *
33
+     * @see register_rest_route()
34
+     */
35
+    public function register_namespace_routes( $namespace ) {
36
+
37
+        // List all available reports.
38
+        register_rest_route(
39
+            $namespace,
40
+            $this->rest_base,
141 41
             array(
142
-				'self'       => array(
143
-					'href' => rest_url( sprintf( '/%s/%s/%s', $this->namespace, $this->rest_base, $report->slug ) ),
144
-				),
145
-				'collection' => array(
146
-					'href' => rest_url( sprintf( '%s/%s', $this->namespace, $this->rest_base ) ),
147
-				),
42
+                array(
43
+                    'methods'             => WP_REST_Server::READABLE,
44
+                    'callback'            => array( $this, 'get_items' ),
45
+                    'permission_callback' => array( $this, 'get_items_permissions_check' ),
46
+                    'args'                => $this->get_collection_params(),
47
+                ),
48
+                'schema' => array( $this, 'get_public_item_schema' ),
148 49
             )
149 50
         );
150 51
 
151
-		return apply_filters( 'getpaid_rest_prepare_report', $response, $report, $request );
152
-	}
153
-
154
-	/**
155
-	 * Get the Report's schema, conforming to JSON Schema.
156
-	 *
157
-	 * @since 2.0.0
158
-	 * @return array
159
-	 */
160
-	public function get_item_schema() {
161
-		$schema = array(
162
-			'$schema'    => 'http://json-schema.org/draft-04/schema#',
163
-			'title'      => 'report',
164
-			'type'       => 'object',
165
-			'properties' => array(
166
-				'slug'        => array(
167
-					'description' => __( 'An alphanumeric identifier for the resource.', 'invoicing' ),
168
-					'type'        => 'string',
169
-					'context'     => array( 'view' ),
170
-					'readonly'    => true,
171
-				),
172
-				'description' => array(
173
-					'description' => __( 'A human-readable description of the resource.', 'invoicing' ),
174
-					'type'        => 'string',
175
-					'context'     => array( 'view' ),
176
-					'readonly'    => true,
177
-				),
178
-			),
179
-		);
180
-
181
-		return $this->add_additional_fields_schema( $schema );
182
-	}
183
-
184
-	/**
185
-	 * Get the query params for collections.
186
-	 *
187
-	 * @since 2.0.0
188
-	 * @return array
189
-	 */
190
-	public function get_collection_params() {
191
-		return array(
192
-			'context' => $this->get_context_param( array( 'default' => 'view' ) ),
193
-		);
194
-	}
52
+    }
53
+
54
+    /**
55
+     * Makes sure the current user has access to READ the report APIs.
56
+     *
57
+     * @since  2.0.0
58
+     * @param WP_REST_Request $request Full data about the request.
59
+     * @return WP_Error|boolean
60
+     */
61
+    public function get_items_permissions_check( $request ) {
62
+
63
+        if ( ! wpinv_current_user_can_manage_invoicing() ) {
64
+            return new WP_Error( 'rest_cannot_view', __( 'Sorry, you cannot list resources.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
65
+        }
66
+
67
+        return true;
68
+    }
69
+
70
+    /**
71
+     * Get reports list.
72
+     *
73
+     * @since 2.0.0
74
+     * @return array
75
+     */
76
+    protected function get_reports() {
77
+
78
+        $reports = array(
79
+            array(
80
+                'slug'        => 'sales',
81
+                'description' => __( 'List of sales reports.', 'invoicing' ),
82
+            ),
83
+            array(
84
+                'slug'        => 'top_sellers',
85
+                'description' => __( 'List of top selling items.', 'invoicing' ),
86
+            ),
87
+            array(
88
+                'slug'        => 'top_earners',
89
+                'description' => __( 'List of top earning items.', 'invoicing' ),
90
+            ),
91
+            array(
92
+                'slug'        => 'invoices/counts',
93
+                'description' => __( 'Invoice counts.', 'invoicing' ),
94
+            ),
95
+        );
96
+
97
+        return apply_filters( 'getpaid_available_api_reports', $reports );
98
+
99
+    }
100
+
101
+    /**
102
+     * Get all reports.
103
+     *
104
+     * @since 2.0.0
105
+     * @param WP_REST_Request $request
106
+     * @return array|WP_Error
107
+     */
108
+    public function get_items( $request ) {
109
+        $data    = array();
110
+        $reports = $this->get_reports();
111
+
112
+        foreach ( $reports as $report ) {
113
+            $item   = $this->prepare_item_for_response( (object) $report, $request );
114
+            $data[] = $this->prepare_response_for_collection( $item );
115
+        }
116
+
117
+        return rest_ensure_response( $data );
118
+    }
119
+
120
+    /**
121
+     * Prepare a report object for serialization.
122
+     *
123
+     * @since 2.0.0
124
+     * @param stdClass $report Report data.
125
+     * @param WP_REST_Request $request Request object.
126
+     * @return WP_REST_Response $response Response data.
127
+     */
128
+    public function prepare_item_for_response( $report, $request ) {
129
+        $data = array(
130
+            'slug'        => $report->slug,
131
+            'description' => $report->description,
132
+        );
133
+
134
+        $context = ! empty( $request['context'] ) ? $request['context'] : 'view';
135
+        $data = $this->add_additional_fields_to_object( $data, $request );
136
+        $data = $this->filter_response_by_context( $data, $context );
137
+
138
+        // Wrap the data in a response object.
139
+        $response = rest_ensure_response( $data );
140
+        $response->add_links(
141
+            array(
142
+                'self'       => array(
143
+                    'href' => rest_url( sprintf( '/%s/%s/%s', $this->namespace, $this->rest_base, $report->slug ) ),
144
+                ),
145
+                'collection' => array(
146
+                    'href' => rest_url( sprintf( '%s/%s', $this->namespace, $this->rest_base ) ),
147
+                ),
148
+            )
149
+        );
150
+
151
+        return apply_filters( 'getpaid_rest_prepare_report', $response, $report, $request );
152
+    }
153
+
154
+    /**
155
+     * Get the Report's schema, conforming to JSON Schema.
156
+     *
157
+     * @since 2.0.0
158
+     * @return array
159
+     */
160
+    public function get_item_schema() {
161
+        $schema = array(
162
+            '$schema'    => 'http://json-schema.org/draft-04/schema#',
163
+            'title'      => 'report',
164
+            'type'       => 'object',
165
+            'properties' => array(
166
+                'slug'        => array(
167
+                    'description' => __( 'An alphanumeric identifier for the resource.', 'invoicing' ),
168
+                    'type'        => 'string',
169
+                    'context'     => array( 'view' ),
170
+                    'readonly'    => true,
171
+                ),
172
+                'description' => array(
173
+                    'description' => __( 'A human-readable description of the resource.', 'invoicing' ),
174
+                    'type'        => 'string',
175
+                    'context'     => array( 'view' ),
176
+                    'readonly'    => true,
177
+                ),
178
+            ),
179
+        );
180
+
181
+        return $this->add_additional_fields_schema( $schema );
182
+    }
183
+
184
+    /**
185
+     * Get the query params for collections.
186
+     *
187
+     * @since 2.0.0
188
+     * @return array
189
+     */
190
+    public function get_collection_params() {
191
+        return array(
192
+            'context' => $this->get_context_param( array( 'default' => 'view' ) ),
193
+        );
194
+    }
195 195
 }
Please login to merge, or discard this patch.
includes/api/class-getpaid-rest-posts-controller.php 1 patch
Indentation   +617 added lines, -617 removed lines patch added patch discarded remove patch
@@ -18,626 +18,626 @@
 block discarded – undo
18 18
 class GetPaid_REST_Posts_Controller extends GetPaid_REST_CRUD_Controller {
19 19
 
20 20
     /**
21
-	 * Post type.
22
-	 *
23
-	 * @var string
24
-	 */
25
-	protected $post_type;
26
-
27
-	/**
28
-	 * Controls visibility on frontend.
29
-	 *
30
-	 * @var string
31
-	 */
32
-	public $public = false;
33
-
34
-	/**
35
-	 * Registers the routes for the objects of the controller.
36
-	 *
37
-	 * @since 1.0.19
38
-	 *
39
-	 * @see register_rest_route()
40
-	 */
41
-	public function register_namespace_routes( $namespace ) {
42
-
43
-		parent::register_namespace_routes( $namespace );
44
-
45
-		register_rest_route(
46
-			$namespace,
47
-			'/' . $this->rest_base . '/batch',
48
-			array(
49
-				array(
50
-					'methods'             => WP_REST_Server::EDITABLE,
51
-					'callback'            => array( $this, 'batch_items' ),
52
-					'permission_callback' => array( $this, 'batch_items_permissions_check' ),
53
-					'args'                => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
54
-				),
55
-				'schema' => array( $this, 'get_public_batch_schema' ),
56
-			)
57
-		);
58
-
59
-	}
60
-
61
-	/**
62
-	 * Check permissions of items on REST API.
63
-	 *
64
-	 * @since 1.0.19
65
-	 * @param string $context   Request context.
66
-	 * @param int    $object_id Post ID.
67
-	 * @return bool
68
-	 */
69
-	public function check_post_permissions( $context = 'read', $object_id = 0 ) {
70
-
71
-		$contexts = array(
72
-			'read'   => 'read_private_posts',
73
-			'create' => 'publish_posts',
74
-			'edit'   => 'edit_post',
75
-			'delete' => 'delete_post',
76
-			'batch'  => 'edit_others_posts',
77
-		);
78
-
79
-		$cap              = $contexts[ $context ];
80
-		$post_type_object = get_post_type_object( $this->post_type );
81
-		$permission       = current_user_can( $post_type_object->cap->$cap, $object_id );
82
-
83
-		return apply_filters( 'getpaid_rest_check_permissions', $permission, $context, $object_id, $this->post_type );
84
-	}
85
-
86
-	/**
87
-	 * Check if a given request has access to read items.
88
-	 *
89
-	 * @param  WP_REST_Request $request Full details about the request.
90
-	 * @return WP_Error|boolean
91
-	 */
92
-	public function get_items_permissions_check( $request ) {
93
-		return $this->check_post_permissions() ? true : new WP_Error( 'rest_cannot_view', __( 'Sorry, you cannot list resources.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
94
-	}
95
-
96
-	/**
97
-	 * Check if a given request has access to create an item.
98
-	 *
99
-	 * @param  WP_REST_Request $request Full details about the request.
100
-	 * @return WP_Error|boolean
101
-	 */
102
-	public function create_item_permissions_check( $request ) {
103
-		return $this->check_post_permissions( 'create' ) ? true : new WP_Error( 'rest_cannot_create', __( 'Sorry, you are not allowed to create resources.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
104
-	}
105
-
106
-	/**
107
-	 * Check if a given request has access to read an item.
108
-	 *
109
-	 * @param  WP_REST_Request $request Full details about the request.
110
-	 * @return WP_Error|boolean
111
-	 */
112
-	public function get_item_permissions_check( $request ) {
113
-		$post = get_post( (int) $request['id'] );
114
-
115
-		if ( $post && ! $this->check_post_permissions( 'read', $post->ID ) ) {
116
-			return new WP_Error( 'rest_cannot_view', __( 'Sorry, you cannot view this resource.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
117
-		}
118
-
119
-		return true;
120
-	}
121
-
122
-	/**
123
-	 * Check if a given request has access to update an item.
124
-	 *
125
-	 * @param  WP_REST_Request $request Full details about the request.
126
-	 * @return WP_Error|boolean
127
-	 */
128
-	public function update_item_permissions_check( $request ) {
129
-		$post = get_post( (int) $request['id'] );
130
-
131
-		if ( $post && ! $this->check_post_permissions( 'edit', $post->ID ) ) {
132
-			return new WP_Error( 'rest_cannot_edit', __( 'Sorry, you are not allowed to edit this resource.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
133
-		}
134
-
135
-		return true;
136
-	}
137
-
138
-	/**
139
-	 * Check if a given request has access to delete an item.
140
-	 *
141
-	 * @param  WP_REST_Request $request Full details about the request.
142
-	 * @return bool|WP_Error
143
-	 */
144
-	public function delete_item_permissions_check( $request ) {
145
-		$post = get_post( (int) $request['id'] );
146
-
147
-		if ( $post && ! $this->check_post_permissions( 'delete', $post->ID ) ) {
148
-			return new WP_Error( 'rest_cannot_delete', __( 'Sorry, you are not allowed to delete this resource.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
149
-		}
150
-
151
-		return true;
152
-	}
153
-
154
-	/**
155
-	 * Check if a given request has access batch create, update and delete items.
156
-	 *
157
-	 * @param  WP_REST_Request $request Full details about the request.
158
-	 *
159
-	 * @return boolean|WP_Error
160
-	 */
161
-	public function batch_items_permissions_check( $request ) {
162
-		return $this->check_post_permissions( 'batch' ) ? true : new WP_Error( 'rest_cannot_batch', __( 'Sorry, you are not allowed to batch manipulate this resource.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
163
-	}
164
-
165
-	/**
166
-	 * @deprecated
167
-	 */
168
-	public function get_post( $object_id ) {
169
-		return $this->get_object( $object_id );
21
+     * Post type.
22
+     *
23
+     * @var string
24
+     */
25
+    protected $post_type;
26
+
27
+    /**
28
+     * Controls visibility on frontend.
29
+     *
30
+     * @var string
31
+     */
32
+    public $public = false;
33
+
34
+    /**
35
+     * Registers the routes for the objects of the controller.
36
+     *
37
+     * @since 1.0.19
38
+     *
39
+     * @see register_rest_route()
40
+     */
41
+    public function register_namespace_routes( $namespace ) {
42
+
43
+        parent::register_namespace_routes( $namespace );
44
+
45
+        register_rest_route(
46
+            $namespace,
47
+            '/' . $this->rest_base . '/batch',
48
+            array(
49
+                array(
50
+                    'methods'             => WP_REST_Server::EDITABLE,
51
+                    'callback'            => array( $this, 'batch_items' ),
52
+                    'permission_callback' => array( $this, 'batch_items_permissions_check' ),
53
+                    'args'                => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
54
+                ),
55
+                'schema' => array( $this, 'get_public_batch_schema' ),
56
+            )
57
+        );
58
+
59
+    }
60
+
61
+    /**
62
+     * Check permissions of items on REST API.
63
+     *
64
+     * @since 1.0.19
65
+     * @param string $context   Request context.
66
+     * @param int    $object_id Post ID.
67
+     * @return bool
68
+     */
69
+    public function check_post_permissions( $context = 'read', $object_id = 0 ) {
70
+
71
+        $contexts = array(
72
+            'read'   => 'read_private_posts',
73
+            'create' => 'publish_posts',
74
+            'edit'   => 'edit_post',
75
+            'delete' => 'delete_post',
76
+            'batch'  => 'edit_others_posts',
77
+        );
78
+
79
+        $cap              = $contexts[ $context ];
80
+        $post_type_object = get_post_type_object( $this->post_type );
81
+        $permission       = current_user_can( $post_type_object->cap->$cap, $object_id );
82
+
83
+        return apply_filters( 'getpaid_rest_check_permissions', $permission, $context, $object_id, $this->post_type );
84
+    }
85
+
86
+    /**
87
+     * Check if a given request has access to read items.
88
+     *
89
+     * @param  WP_REST_Request $request Full details about the request.
90
+     * @return WP_Error|boolean
91
+     */
92
+    public function get_items_permissions_check( $request ) {
93
+        return $this->check_post_permissions() ? true : new WP_Error( 'rest_cannot_view', __( 'Sorry, you cannot list resources.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
94
+    }
95
+
96
+    /**
97
+     * Check if a given request has access to create an item.
98
+     *
99
+     * @param  WP_REST_Request $request Full details about the request.
100
+     * @return WP_Error|boolean
101
+     */
102
+    public function create_item_permissions_check( $request ) {
103
+        return $this->check_post_permissions( 'create' ) ? true : new WP_Error( 'rest_cannot_create', __( 'Sorry, you are not allowed to create resources.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
104
+    }
105
+
106
+    /**
107
+     * Check if a given request has access to read an item.
108
+     *
109
+     * @param  WP_REST_Request $request Full details about the request.
110
+     * @return WP_Error|boolean
111
+     */
112
+    public function get_item_permissions_check( $request ) {
113
+        $post = get_post( (int) $request['id'] );
114
+
115
+        if ( $post && ! $this->check_post_permissions( 'read', $post->ID ) ) {
116
+            return new WP_Error( 'rest_cannot_view', __( 'Sorry, you cannot view this resource.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
117
+        }
118
+
119
+        return true;
120
+    }
121
+
122
+    /**
123
+     * Check if a given request has access to update an item.
124
+     *
125
+     * @param  WP_REST_Request $request Full details about the request.
126
+     * @return WP_Error|boolean
127
+     */
128
+    public function update_item_permissions_check( $request ) {
129
+        $post = get_post( (int) $request['id'] );
130
+
131
+        if ( $post && ! $this->check_post_permissions( 'edit', $post->ID ) ) {
132
+            return new WP_Error( 'rest_cannot_edit', __( 'Sorry, you are not allowed to edit this resource.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
133
+        }
134
+
135
+        return true;
136
+    }
137
+
138
+    /**
139
+     * Check if a given request has access to delete an item.
140
+     *
141
+     * @param  WP_REST_Request $request Full details about the request.
142
+     * @return bool|WP_Error
143
+     */
144
+    public function delete_item_permissions_check( $request ) {
145
+        $post = get_post( (int) $request['id'] );
146
+
147
+        if ( $post && ! $this->check_post_permissions( 'delete', $post->ID ) ) {
148
+            return new WP_Error( 'rest_cannot_delete', __( 'Sorry, you are not allowed to delete this resource.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
149
+        }
150
+
151
+        return true;
152
+    }
153
+
154
+    /**
155
+     * Check if a given request has access batch create, update and delete items.
156
+     *
157
+     * @param  WP_REST_Request $request Full details about the request.
158
+     *
159
+     * @return boolean|WP_Error
160
+     */
161
+    public function batch_items_permissions_check( $request ) {
162
+        return $this->check_post_permissions( 'batch' ) ? true : new WP_Error( 'rest_cannot_batch', __( 'Sorry, you are not allowed to batch manipulate this resource.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
163
+    }
164
+
165
+    /**
166
+     * @deprecated
167
+     */
168
+    public function get_post( $object_id ) {
169
+        return $this->get_object( $object_id );
170
+    }
171
+
172
+    /**
173
+     * Get a single object.
174
+     *
175
+     * @param WP_REST_Request $request Full details about the request.
176
+     * @return WP_Error|WP_REST_Response
177
+     */
178
+    public function get_item( $request ) {
179
+
180
+        // Fetch item.
181
+        $response = parent::get_item( $request );
182
+
183
+        // (Maybe) add a link to the html pagee.
184
+        if ( $this->public && ! is_wp_error( $response ) ) {
185
+            $response->link_header( 'alternate', get_permalink( $this->data_object->get_id() ), array( 'type' => 'text/html' ) );
186
+        }
187
+
188
+        return $response;
189
+    }
190
+
191
+    /**
192
+     * Create a single object.
193
+     *
194
+     * @param WP_REST_Request $request Full details about the request.
195
+     * @return WP_Error|WP_REST_Response
196
+     */
197
+    public function create_item( $request ) {
198
+
199
+        // Create item.
200
+        $response = parent::create_item( $request );
201
+
202
+        // Fire a hook after an item is created.
203
+        if ( ! is_wp_error( $response ) ) {
204
+
205
+            /**
206
+             * Fires after a single item is created or updated via the REST API.
207
+             *
208
+             * @param WP_Post         $post      Post object.
209
+             * @param WP_REST_Request $request   Request object.
210
+             * @param boolean         $creating  True when creating item, false when updating.
211
+             */
212
+            do_action( "getpaid_rest_insert_{$this->post_type}", $this->data_object, $request, true );
213
+
214
+        }
215
+
216
+        return $response;
217
+
170 218
     }
171 219
 
172
-	/**
173
-	 * Get a single object.
174
-	 *
175
-	 * @param WP_REST_Request $request Full details about the request.
176
-	 * @return WP_Error|WP_REST_Response
177
-	 */
178
-	public function get_item( $request ) {
179
-
180
-		// Fetch item.
181
-		$response = parent::get_item( $request );
182
-
183
-		// (Maybe) add a link to the html pagee.
184
-		if ( $this->public && ! is_wp_error( $response ) ) {
185
-			$response->link_header( 'alternate', get_permalink( $this->data_object->get_id() ), array( 'type' => 'text/html' ) );
186
-		}
187
-
188
-		return $response;
189
-	}
190
-
191
-	/**
192
-	 * Create a single object.
193
-	 *
194
-	 * @param WP_REST_Request $request Full details about the request.
195
-	 * @return WP_Error|WP_REST_Response
196
-	 */
197
-	public function create_item( $request ) {
198
-
199
-		// Create item.
200
-		$response = parent::create_item( $request );
201
-
202
-		// Fire a hook after an item is created.
203
-		if ( ! is_wp_error( $response ) ) {
204
-
205
-			/**
206
-			 * Fires after a single item is created or updated via the REST API.
207
-			 *
208
-			 * @param WP_Post         $post      Post object.
209
-			 * @param WP_REST_Request $request   Request object.
210
-			 * @param boolean         $creating  True when creating item, false when updating.
211
-			 */
212
-			do_action( "getpaid_rest_insert_{$this->post_type}", $this->data_object, $request, true );
213
-
214
-		}
215
-
216
-		return $response;
217
-
218
-	}
219
-
220
-	/**
221
-	 * Update a single object.
222
-	 *
223
-	 * @param WP_REST_Request $request Full details about the request.
224
-	 * @return WP_Error|WP_REST_Response
225
-	 */
226
-	public function update_item( $request ) {
227
-
228
-		// Create item.
229
-		$response = parent::update_item( $request );
230
-
231
-		// Fire a hook after an item is created.
232
-		if ( ! is_wp_error( $response ) ) {
233
-
234
-			/**
235
-			 * Fires after a single item is created or updated via the REST API.
236
-			 *
237
-			 * @param WP_Post         $post      Post object.
238
-			 * @param WP_REST_Request $request   Request object.
239
-			 * @param boolean         $creating  True when creating item, false when updating.
240
-			 */
241
-			do_action( "getpaid_rest_insert_{$this->post_type}", $this->data_object, $request, false );
242
-
243
-		}
244
-
245
-		return $response;
246
-
247
-	}
248
-
249
-	/**
250
-	 * Get a collection of objects.
251
-	 *
252
-	 * @param WP_REST_Request $request Full details about the request.
253
-	 * @return WP_Error|WP_REST_Response
254
-	 */
255
-	public function get_items( $request ) {
256
-
257
-		$args                         = array();
258
-		$args['offset']               = $request['offset'];
259
-		$args['order']                = $request['order'];
260
-		$args['orderby']              = $request['orderby'];
261
-		$args['paged']                = $request['page'];
262
-		$args['post__in']             = $request['include'];
263
-		$args['post__not_in']         = $request['exclude'];
264
-		$args['posts_per_page']       = $request['per_page'];
265
-		$args['name']                 = $request['slug'];
266
-		$args['post_parent__in']      = $request['parent'];
267
-		$args['post_parent__not_in']  = $request['parent_exclude'];
268
-		$args['s']                    = $request['search'];
269
-		$args['post_status']          = wpinv_parse_list( $request['status'] );
270
-
271
-		$args['date_query'] = array();
272
-
273
-		// Set before into date query. Date query must be specified as an array of an array.
274
-		if ( isset( $request['before'] ) ) {
275
-			$args['date_query'][0]['before'] = $request['before'];
276
-		}
277
-
278
-		// Set after into date query. Date query must be specified as an array of an array.
279
-		if ( isset( $request['after'] ) ) {
280
-			$args['date_query'][0]['after'] = $request['after'];
281
-		}
282
-
283
-		// Force the post_type & fields arguments, since they're not a user input variable.
284
-		$args['post_type'] = $this->post_type;
285
-		$args['fields']    = 'ids';
286
-
287
-		// Filter the query arguments for a request.
288
-		$args       = apply_filters( "getpaid_rest_{$this->post_type}_query", $args, $request );
289
-		$query_args = $this->prepare_items_query( $args, $request );
290
-
291
-		$posts_query = new WP_Query();
292
-		$query_result = $posts_query->query( $query_args );
293
-
294
-		$posts = array();
295
-		foreach ( $query_result as $post_id ) {
296
-			if ( ! $this->check_post_permissions( 'read', $post_id ) ) {
297
-				continue;
298
-			}
299
-
300
-			$data    = $this->prepare_item_for_response( $this->get_object( $post_id ), $request );
301
-			$posts[] = $this->prepare_response_for_collection( $data );
302
-		}
303
-
304
-		$page        = (int) $query_args['paged'];
305
-		$total_posts = $posts_query->found_posts;
306
-
307
-		if ( $total_posts < 1 ) {
308
-			// Out-of-bounds, run the query again without LIMIT for total count.
309
-			unset( $query_args['paged'] );
310
-			$count_query = new WP_Query();
311
-			$count_query->query( $query_args );
312
-			$total_posts = $count_query->found_posts;
313
-		}
314
-
315
-		$max_pages = ceil( $total_posts / (int) $query_args['posts_per_page'] );
316
-
317
-		$response = rest_ensure_response( $posts );
318
-		$response->header( 'X-WP-Total', (int) $total_posts );
319
-		$response->header( 'X-WP-TotalPages', (int) $max_pages );
320
-
321
-		$request_params = $request->get_query_params();
322
-		$base = add_query_arg( $request_params, rest_url( sprintf( '/%s/%s', $this->namespace, $this->rest_base ) ) );
323
-
324
-		if ( $page > 1 ) {
325
-			$prev_page = $page - 1;
326
-			if ( $prev_page > $max_pages ) {
327
-				$prev_page = $max_pages;
328
-			}
329
-			$prev_link = add_query_arg( 'page', $prev_page, $base );
330
-			$response->link_header( 'prev', $prev_link );
331
-		}
332
-		if ( $max_pages > $page ) {
333
-			$next_page = $page + 1;
334
-			$next_link = add_query_arg( 'page', $next_page, $base );
335
-			$response->link_header( 'next', $next_link );
336
-		}
337
-
338
-		return $response;
339
-	}
340
-
341
-	/**
342
-	 * Delete a single item.
343
-	 *
344
-	 * @param WP_REST_Request $request Full details about the request.
345
-	 * @return WP_REST_Response|WP_Error
346
-	 */
347
-	public function delete_item( $request ) {
348
-
349
-		// Fetch the item.
350
-		$item = $this->get_object( $request['id'] );
351
-		if ( is_wp_error( $item ) ) {
352
-			return $item;
353
-		}
354
-
355
-		$supports_trash = EMPTY_TRASH_DAYS > 0;
356
-		$force          = $supports_trash && (bool) $request['force'];
357
-
358
-		if ( ! $this->check_post_permissions( 'delete', $item->ID ) ) {
359
-			return new WP_Error( 'cannot_delete', __( 'Sorry, you are not allowed to delete this resource.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
360
-		}
361
-
362
-		$request->set_param( 'context', 'edit' );
363
-		$response = $this->prepare_item_for_response( $item, $request );
364
-
365
-		if ( ! wp_delete_post( $item->ID, $force ) ) {
366
-			return new WP_Error( 'rest_cannot_delete', sprintf( __( 'The resource cannot be deleted.', 'invoicing' ), $this->post_type ), array( 'status' => 500 ) );
367
-		}
368
-
369
-		return $response;
370
-	}
371
-
372
-	/**
373
-	 * Prepare links for the request.
374
-	 *
375
-	 * @param GetPaid_Data    $object GetPaid_Data object.
376
-	 * @return array Links for the given object.
377
-	 */
378
-	protected function prepare_links( $object ) {
379
-
380
-		$links = parent::prepare_links( $object );
381
-
382
-		if ( is_callable( array( $object, 'get_user_id' ) ) ) {
383
-			$links['user'] = array(
384
-				'href'       => rest_url( 'wp/v2/users/' . call_user_func( array( $object, 'get_user_id' ) ) ),
385
-				'embeddable' => true,
386
-			);
387
-		}
388
-
389
-		if ( is_callable( array( $object, 'get_owner' ) ) ) {
390
-			$links['owner']  = array(
391
-				'href'       => rest_url( 'wp/v2/users/' . call_user_func( array( $object, 'get_owner' ) ) ),
392
-				'embeddable' => true,
393
-			);
394
-		}
395
-
396
-		if ( is_callable( array( $object, 'get_parent_id' ) ) && call_user_func( array( $object, 'get_parent_id' ) ) ) {
397
-			$links['parent']  = array(
398
-				'href'       => rest_url( "$this->namespace/$this->rest_base/" . call_user_func( array( $object, 'get_parent_id' ) ) ),
399
-				'embeddable' => true,
400
-			);
401
-		}
402
-
403
-		return $links;
404
-	}
405
-
406
-	/**
407
-	 * Determine the allowed query_vars for a get_items() response and
408
-	 * prepare for WP_Query.
409
-	 *
410
-	 * @param array           $prepared_args Prepared arguments.
411
-	 * @param WP_REST_Request $request Request object.
412
-	 * @return array          $query_args
413
-	 */
414
-	protected function prepare_items_query( $prepared_args = array(), $request = null ) {
415
-
416
-		$valid_vars = array_flip( $this->get_allowed_query_vars() );
417
-		$query_args = array();
418
-		foreach ( $valid_vars as $var => $index ) {
419
-			if ( isset( $prepared_args[ $var ] ) ) {
420
-				$query_args[ $var ] = apply_filters( "getpaid_rest_query_var-{$var}", $prepared_args[ $var ], $index );
421
-			}
422
-		}
423
-
424
-		$query_args['ignore_sticky_posts'] = true;
425
-
426
-		if ( 'include' === $query_args['orderby'] ) {
427
-			$query_args['orderby'] = 'post__in';
428
-		} elseif ( 'id' === $query_args['orderby'] ) {
429
-			$query_args['orderby'] = 'ID'; // ID must be capitalized.
430
-		} elseif ( 'slug' === $query_args['orderby'] ) {
431
-			$query_args['orderby'] = 'name';
432
-		}
433
-
434
-		return apply_filters( 'getpaid_rest_prepare_items_query', $query_args, $request, $this );
435
-
436
-	}
437
-
438
-	/**
439
-	 * Get all the WP Query vars that are allowed for the API request.
440
-	 *
441
-	 * @return array
442
-	 */
443
-	protected function get_allowed_query_vars() {
444
-		global $wp;
445
-
446
-		/**
447
-		 * Filter the publicly allowed query vars.
448
-		 *
449
-		 * Allows adjusting of the default query vars that are made public.
450
-		 *
451
-		 * @param array  Array of allowed WP_Query query vars.
452
-		 */
453
-		$valid_vars = apply_filters( 'query_vars', $wp->public_query_vars );
454
-
455
-		$post_type_obj = get_post_type_object( $this->post_type );
456
-		if ( current_user_can( $post_type_obj->cap->edit_posts ) ) {
457
-			$private = apply_filters( 'getpaid_rest_private_query_vars', $wp->private_query_vars );
458
-			$valid_vars = array_merge( $valid_vars, $private );
459
-		}
460
-
461
-		// Define our own in addition to WP's normal vars.
462
-		$rest_valid = array(
463
-			'post_status',
464
-			'date_query',
465
-			'ignore_sticky_posts',
466
-			'offset',
467
-			'post__in',
468
-			'post__not_in',
469
-			'post_parent',
470
-			'post_parent__in',
471
-			'post_parent__not_in',
472
-			'posts_per_page',
473
-			'meta_query',
474
-			'tax_query',
475
-			'meta_key',
476
-			'meta_value',
477
-			'meta_compare',
478
-			'meta_value_num',
479
-		);
480
-		$valid_vars = array_merge( $valid_vars, $rest_valid );
481
-
482
-		// Filter allowed query vars for the REST API.
483
-		$valid_vars = apply_filters( 'getpaid_rest_query_vars', $valid_vars, $this );
484
-
485
-		return $valid_vars;
486
-	}
487
-
488
-	/**
489
-	 * Get the query params for collections of attachments.
490
-	 *
491
-	 * @return array
492
-	 */
493
-	public function get_collection_params() {
494
-
495
-		return array_merge(
496
-			parent::get_collection_params(),
497
-			array(
498
-				'status'  => array(
499
-					'default'           => $this->get_post_statuses(),
500
-					'description'       => __( 'Limit result set to resources assigned one or more statuses.', 'invoicing' ),
501
-					'type'              => array( 'array', 'string' ),
502
-					'items'             => array(
503
-						'enum' => $this->get_post_statuses(),
504
-						'type' => 'string',
505
-					),
506
-					'validate_callback' => 'rest_validate_request_arg',
507
-					'sanitize_callback' => array( $this, 'sanitize_post_statuses' ),
508
-				),
509
-				'after'   => array(
510
-					'description'       => __( 'Limit response to resources created after a given ISO8601 compliant date.', 'invoicing' ),
511
-					'type'              => 'string',
512
-					'format'            => 'string',
513
-					'validate_callback' => 'rest_validate_request_arg',
514
-					'sanitize_callback' => 'sanitize_text_field',
515
-				),
516
-				'before'  => array(
517
-					'description'       => __( 'Limit response to resources created before a given ISO8601 compliant date.', 'invoicing' ),
518
-					'type'              => 'string',
519
-					'format'            => 'string',
520
-					'validate_callback' => 'rest_validate_request_arg',
521
-					'sanitize_callback' => 'sanitize_text_field',
522
-				),
523
-				'exclude' => array(
524
-					'description'       => __( 'Ensure result set excludes specific IDs.', 'invoicing' ),
525
-					'type'              => 'array',
526
-					'items'             => array(
527
-						'type' => 'integer',
528
-					),
529
-					'default'           => array(),
530
-					'sanitize_callback' => 'wp_parse_id_list',
531
-					'validate_callback' => 'rest_validate_request_arg',
532
-				),
533
-				'include' => array(
534
-					'description'       => __( 'Limit result set to specific ids.', 'invoicing' ),
535
-					'type'              => 'array',
536
-					'items'             => array(
537
-						'type' => 'integer',
538
-					),
539
-					'default'           => array(),
540
-					'sanitize_callback' => 'wp_parse_id_list',
541
-					'validate_callback' => 'rest_validate_request_arg',
542
-				),
543
-				'offset'  => array(
544
-					'description'       => __( 'Offset the result set by a specific number of items.', 'invoicing' ),
545
-					'type'              => 'integer',
546
-					'sanitize_callback' => 'absint',
547
-					'validate_callback' => 'rest_validate_request_arg',
548
-				),
549
-				'order'   => array(
550
-					'description'       => __( 'Order sort attribute ascending or descending.', 'invoicing' ),
551
-					'type'              => 'string',
552
-					'default'           => 'desc',
553
-					'enum'              => array( 'asc', 'desc' ),
554
-					'validate_callback' => 'rest_validate_request_arg',
555
-				),
556
-				'orderby' => array(
557
-					'description'       => __( 'Sort collection by object attribute.', 'invoicing' ),
558
-					'type'              => 'string',
559
-					'default'           => 'date',
560
-					'enum'              => array(
561
-						'date',
562
-						'id',
563
-						'include',
564
-						'title',
565
-						'slug',
566
-						'modified',
567
-					),
568
-					'validate_callback' => 'rest_validate_request_arg',
569
-				),
570
-			)
571
-		);
572
-	}
573
-
574
-	/**
575
-	 * Retrieves the items's schema, conforming to JSON Schema.
576
-	 *
577
-	 * @since 1.0.19
578
-	 *
579
-	 * @return array Item schema data.
580
-	 */
581
-	public function get_item_schema() {
582
-
583
-		// Maybe retrieve the schema from cache.
584
-		if ( ! empty( $this->schema ) ) {
585
-			return $this->add_additional_fields_schema( $this->schema );
586
-		}
587
-
588
-		$type   = str_replace( 'wpi_', '', $this->post_type );
589
-		$schema = array(
590
-			'$schema'    => 'http://json-schema.org/draft-04/schema#',
591
-			'title'      => $this->post_type,
592
-			'type'       => 'object',
593
-			'properties' => wpinv_get_data( "$type-schema" ),
594
-		);
595
-
596
-		// Filters the invoice schema for the REST API.
220
+    /**
221
+     * Update a single object.
222
+     *
223
+     * @param WP_REST_Request $request Full details about the request.
224
+     * @return WP_Error|WP_REST_Response
225
+     */
226
+    public function update_item( $request ) {
227
+
228
+        // Create item.
229
+        $response = parent::update_item( $request );
230
+
231
+        // Fire a hook after an item is created.
232
+        if ( ! is_wp_error( $response ) ) {
233
+
234
+            /**
235
+             * Fires after a single item is created or updated via the REST API.
236
+             *
237
+             * @param WP_Post         $post      Post object.
238
+             * @param WP_REST_Request $request   Request object.
239
+             * @param boolean         $creating  True when creating item, false when updating.
240
+             */
241
+            do_action( "getpaid_rest_insert_{$this->post_type}", $this->data_object, $request, false );
242
+
243
+        }
244
+
245
+        return $response;
246
+
247
+    }
248
+
249
+    /**
250
+     * Get a collection of objects.
251
+     *
252
+     * @param WP_REST_Request $request Full details about the request.
253
+     * @return WP_Error|WP_REST_Response
254
+     */
255
+    public function get_items( $request ) {
256
+
257
+        $args                         = array();
258
+        $args['offset']               = $request['offset'];
259
+        $args['order']                = $request['order'];
260
+        $args['orderby']              = $request['orderby'];
261
+        $args['paged']                = $request['page'];
262
+        $args['post__in']             = $request['include'];
263
+        $args['post__not_in']         = $request['exclude'];
264
+        $args['posts_per_page']       = $request['per_page'];
265
+        $args['name']                 = $request['slug'];
266
+        $args['post_parent__in']      = $request['parent'];
267
+        $args['post_parent__not_in']  = $request['parent_exclude'];
268
+        $args['s']                    = $request['search'];
269
+        $args['post_status']          = wpinv_parse_list( $request['status'] );
270
+
271
+        $args['date_query'] = array();
272
+
273
+        // Set before into date query. Date query must be specified as an array of an array.
274
+        if ( isset( $request['before'] ) ) {
275
+            $args['date_query'][0]['before'] = $request['before'];
276
+        }
277
+
278
+        // Set after into date query. Date query must be specified as an array of an array.
279
+        if ( isset( $request['after'] ) ) {
280
+            $args['date_query'][0]['after'] = $request['after'];
281
+        }
282
+
283
+        // Force the post_type & fields arguments, since they're not a user input variable.
284
+        $args['post_type'] = $this->post_type;
285
+        $args['fields']    = 'ids';
286
+
287
+        // Filter the query arguments for a request.
288
+        $args       = apply_filters( "getpaid_rest_{$this->post_type}_query", $args, $request );
289
+        $query_args = $this->prepare_items_query( $args, $request );
290
+
291
+        $posts_query = new WP_Query();
292
+        $query_result = $posts_query->query( $query_args );
293
+
294
+        $posts = array();
295
+        foreach ( $query_result as $post_id ) {
296
+            if ( ! $this->check_post_permissions( 'read', $post_id ) ) {
297
+                continue;
298
+            }
299
+
300
+            $data    = $this->prepare_item_for_response( $this->get_object( $post_id ), $request );
301
+            $posts[] = $this->prepare_response_for_collection( $data );
302
+        }
303
+
304
+        $page        = (int) $query_args['paged'];
305
+        $total_posts = $posts_query->found_posts;
306
+
307
+        if ( $total_posts < 1 ) {
308
+            // Out-of-bounds, run the query again without LIMIT for total count.
309
+            unset( $query_args['paged'] );
310
+            $count_query = new WP_Query();
311
+            $count_query->query( $query_args );
312
+            $total_posts = $count_query->found_posts;
313
+        }
314
+
315
+        $max_pages = ceil( $total_posts / (int) $query_args['posts_per_page'] );
316
+
317
+        $response = rest_ensure_response( $posts );
318
+        $response->header( 'X-WP-Total', (int) $total_posts );
319
+        $response->header( 'X-WP-TotalPages', (int) $max_pages );
320
+
321
+        $request_params = $request->get_query_params();
322
+        $base = add_query_arg( $request_params, rest_url( sprintf( '/%s/%s', $this->namespace, $this->rest_base ) ) );
323
+
324
+        if ( $page > 1 ) {
325
+            $prev_page = $page - 1;
326
+            if ( $prev_page > $max_pages ) {
327
+                $prev_page = $max_pages;
328
+            }
329
+            $prev_link = add_query_arg( 'page', $prev_page, $base );
330
+            $response->link_header( 'prev', $prev_link );
331
+        }
332
+        if ( $max_pages > $page ) {
333
+            $next_page = $page + 1;
334
+            $next_link = add_query_arg( 'page', $next_page, $base );
335
+            $response->link_header( 'next', $next_link );
336
+        }
337
+
338
+        return $response;
339
+    }
340
+
341
+    /**
342
+     * Delete a single item.
343
+     *
344
+     * @param WP_REST_Request $request Full details about the request.
345
+     * @return WP_REST_Response|WP_Error
346
+     */
347
+    public function delete_item( $request ) {
348
+
349
+        // Fetch the item.
350
+        $item = $this->get_object( $request['id'] );
351
+        if ( is_wp_error( $item ) ) {
352
+            return $item;
353
+        }
354
+
355
+        $supports_trash = EMPTY_TRASH_DAYS > 0;
356
+        $force          = $supports_trash && (bool) $request['force'];
357
+
358
+        if ( ! $this->check_post_permissions( 'delete', $item->ID ) ) {
359
+            return new WP_Error( 'cannot_delete', __( 'Sorry, you are not allowed to delete this resource.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
360
+        }
361
+
362
+        $request->set_param( 'context', 'edit' );
363
+        $response = $this->prepare_item_for_response( $item, $request );
364
+
365
+        if ( ! wp_delete_post( $item->ID, $force ) ) {
366
+            return new WP_Error( 'rest_cannot_delete', sprintf( __( 'The resource cannot be deleted.', 'invoicing' ), $this->post_type ), array( 'status' => 500 ) );
367
+        }
368
+
369
+        return $response;
370
+    }
371
+
372
+    /**
373
+     * Prepare links for the request.
374
+     *
375
+     * @param GetPaid_Data    $object GetPaid_Data object.
376
+     * @return array Links for the given object.
377
+     */
378
+    protected function prepare_links( $object ) {
379
+
380
+        $links = parent::prepare_links( $object );
381
+
382
+        if ( is_callable( array( $object, 'get_user_id' ) ) ) {
383
+            $links['user'] = array(
384
+                'href'       => rest_url( 'wp/v2/users/' . call_user_func( array( $object, 'get_user_id' ) ) ),
385
+                'embeddable' => true,
386
+            );
387
+        }
388
+
389
+        if ( is_callable( array( $object, 'get_owner' ) ) ) {
390
+            $links['owner']  = array(
391
+                'href'       => rest_url( 'wp/v2/users/' . call_user_func( array( $object, 'get_owner' ) ) ),
392
+                'embeddable' => true,
393
+            );
394
+        }
395
+
396
+        if ( is_callable( array( $object, 'get_parent_id' ) ) && call_user_func( array( $object, 'get_parent_id' ) ) ) {
397
+            $links['parent']  = array(
398
+                'href'       => rest_url( "$this->namespace/$this->rest_base/" . call_user_func( array( $object, 'get_parent_id' ) ) ),
399
+                'embeddable' => true,
400
+            );
401
+        }
402
+
403
+        return $links;
404
+    }
405
+
406
+    /**
407
+     * Determine the allowed query_vars for a get_items() response and
408
+     * prepare for WP_Query.
409
+     *
410
+     * @param array           $prepared_args Prepared arguments.
411
+     * @param WP_REST_Request $request Request object.
412
+     * @return array          $query_args
413
+     */
414
+    protected function prepare_items_query( $prepared_args = array(), $request = null ) {
415
+
416
+        $valid_vars = array_flip( $this->get_allowed_query_vars() );
417
+        $query_args = array();
418
+        foreach ( $valid_vars as $var => $index ) {
419
+            if ( isset( $prepared_args[ $var ] ) ) {
420
+                $query_args[ $var ] = apply_filters( "getpaid_rest_query_var-{$var}", $prepared_args[ $var ], $index );
421
+            }
422
+        }
423
+
424
+        $query_args['ignore_sticky_posts'] = true;
425
+
426
+        if ( 'include' === $query_args['orderby'] ) {
427
+            $query_args['orderby'] = 'post__in';
428
+        } elseif ( 'id' === $query_args['orderby'] ) {
429
+            $query_args['orderby'] = 'ID'; // ID must be capitalized.
430
+        } elseif ( 'slug' === $query_args['orderby'] ) {
431
+            $query_args['orderby'] = 'name';
432
+        }
433
+
434
+        return apply_filters( 'getpaid_rest_prepare_items_query', $query_args, $request, $this );
435
+
436
+    }
437
+
438
+    /**
439
+     * Get all the WP Query vars that are allowed for the API request.
440
+     *
441
+     * @return array
442
+     */
443
+    protected function get_allowed_query_vars() {
444
+        global $wp;
445
+
446
+        /**
447
+         * Filter the publicly allowed query vars.
448
+         *
449
+         * Allows adjusting of the default query vars that are made public.
450
+         *
451
+         * @param array  Array of allowed WP_Query query vars.
452
+         */
453
+        $valid_vars = apply_filters( 'query_vars', $wp->public_query_vars );
454
+
455
+        $post_type_obj = get_post_type_object( $this->post_type );
456
+        if ( current_user_can( $post_type_obj->cap->edit_posts ) ) {
457
+            $private = apply_filters( 'getpaid_rest_private_query_vars', $wp->private_query_vars );
458
+            $valid_vars = array_merge( $valid_vars, $private );
459
+        }
460
+
461
+        // Define our own in addition to WP's normal vars.
462
+        $rest_valid = array(
463
+            'post_status',
464
+            'date_query',
465
+            'ignore_sticky_posts',
466
+            'offset',
467
+            'post__in',
468
+            'post__not_in',
469
+            'post_parent',
470
+            'post_parent__in',
471
+            'post_parent__not_in',
472
+            'posts_per_page',
473
+            'meta_query',
474
+            'tax_query',
475
+            'meta_key',
476
+            'meta_value',
477
+            'meta_compare',
478
+            'meta_value_num',
479
+        );
480
+        $valid_vars = array_merge( $valid_vars, $rest_valid );
481
+
482
+        // Filter allowed query vars for the REST API.
483
+        $valid_vars = apply_filters( 'getpaid_rest_query_vars', $valid_vars, $this );
484
+
485
+        return $valid_vars;
486
+    }
487
+
488
+    /**
489
+     * Get the query params for collections of attachments.
490
+     *
491
+     * @return array
492
+     */
493
+    public function get_collection_params() {
494
+
495
+        return array_merge(
496
+            parent::get_collection_params(),
497
+            array(
498
+                'status'  => array(
499
+                    'default'           => $this->get_post_statuses(),
500
+                    'description'       => __( 'Limit result set to resources assigned one or more statuses.', 'invoicing' ),
501
+                    'type'              => array( 'array', 'string' ),
502
+                    'items'             => array(
503
+                        'enum' => $this->get_post_statuses(),
504
+                        'type' => 'string',
505
+                    ),
506
+                    'validate_callback' => 'rest_validate_request_arg',
507
+                    'sanitize_callback' => array( $this, 'sanitize_post_statuses' ),
508
+                ),
509
+                'after'   => array(
510
+                    'description'       => __( 'Limit response to resources created after a given ISO8601 compliant date.', 'invoicing' ),
511
+                    'type'              => 'string',
512
+                    'format'            => 'string',
513
+                    'validate_callback' => 'rest_validate_request_arg',
514
+                    'sanitize_callback' => 'sanitize_text_field',
515
+                ),
516
+                'before'  => array(
517
+                    'description'       => __( 'Limit response to resources created before a given ISO8601 compliant date.', 'invoicing' ),
518
+                    'type'              => 'string',
519
+                    'format'            => 'string',
520
+                    'validate_callback' => 'rest_validate_request_arg',
521
+                    'sanitize_callback' => 'sanitize_text_field',
522
+                ),
523
+                'exclude' => array(
524
+                    'description'       => __( 'Ensure result set excludes specific IDs.', 'invoicing' ),
525
+                    'type'              => 'array',
526
+                    'items'             => array(
527
+                        'type' => 'integer',
528
+                    ),
529
+                    'default'           => array(),
530
+                    'sanitize_callback' => 'wp_parse_id_list',
531
+                    'validate_callback' => 'rest_validate_request_arg',
532
+                ),
533
+                'include' => array(
534
+                    'description'       => __( 'Limit result set to specific ids.', 'invoicing' ),
535
+                    'type'              => 'array',
536
+                    'items'             => array(
537
+                        'type' => 'integer',
538
+                    ),
539
+                    'default'           => array(),
540
+                    'sanitize_callback' => 'wp_parse_id_list',
541
+                    'validate_callback' => 'rest_validate_request_arg',
542
+                ),
543
+                'offset'  => array(
544
+                    'description'       => __( 'Offset the result set by a specific number of items.', 'invoicing' ),
545
+                    'type'              => 'integer',
546
+                    'sanitize_callback' => 'absint',
547
+                    'validate_callback' => 'rest_validate_request_arg',
548
+                ),
549
+                'order'   => array(
550
+                    'description'       => __( 'Order sort attribute ascending or descending.', 'invoicing' ),
551
+                    'type'              => 'string',
552
+                    'default'           => 'desc',
553
+                    'enum'              => array( 'asc', 'desc' ),
554
+                    'validate_callback' => 'rest_validate_request_arg',
555
+                ),
556
+                'orderby' => array(
557
+                    'description'       => __( 'Sort collection by object attribute.', 'invoicing' ),
558
+                    'type'              => 'string',
559
+                    'default'           => 'date',
560
+                    'enum'              => array(
561
+                        'date',
562
+                        'id',
563
+                        'include',
564
+                        'title',
565
+                        'slug',
566
+                        'modified',
567
+                    ),
568
+                    'validate_callback' => 'rest_validate_request_arg',
569
+                ),
570
+            )
571
+        );
572
+    }
573
+
574
+    /**
575
+     * Retrieves the items's schema, conforming to JSON Schema.
576
+     *
577
+     * @since 1.0.19
578
+     *
579
+     * @return array Item schema data.
580
+     */
581
+    public function get_item_schema() {
582
+
583
+        // Maybe retrieve the schema from cache.
584
+        if ( ! empty( $this->schema ) ) {
585
+            return $this->add_additional_fields_schema( $this->schema );
586
+        }
587
+
588
+        $type   = str_replace( 'wpi_', '', $this->post_type );
589
+        $schema = array(
590
+            '$schema'    => 'http://json-schema.org/draft-04/schema#',
591
+            'title'      => $this->post_type,
592
+            'type'       => 'object',
593
+            'properties' => wpinv_get_data( "$type-schema" ),
594
+        );
595
+
596
+        // Filters the invoice schema for the REST API.
597 597
         $schema = apply_filters( "wpinv_rest_{$type}_schema", $schema );
598 598
 
599
-		// Cache the invoice schema.
600
-		$this->schema = $schema;
601
-
602
-		return $this->add_additional_fields_schema( $this->schema );
603
-	}
604
-
605
-	/**
606
-	 * Sanitizes and validates the list of post statuses.
607
-	 *
608
-	 * @since 1.0.13
609
-	 *
610
-	 * @param string|array    $statuses  One or more post statuses.
611
-	 * @param WP_REST_Request $request   Full details about the request.
612
-	 * @param string          $parameter Additional parameter to pass to validation.
613
-	 * @return array|WP_Error A list of valid statuses, otherwise WP_Error object.
614
-	 */
615
-	public function sanitize_post_statuses( $statuses, $request, $parameter ) {
616
-		return array_intersect( wp_parse_slug_list( $statuses ), $this->get_post_statuses() );
617
-	}
618
-
619
-	/**
620
-	 * Retrieves a valid list of post statuses.
621
-	 *
622
-	 * @since 1.0.19
623
-	 *
624
-	 * @return array A list of registered item statuses.
625
-	 */
626
-	public function get_post_statuses() {
627
-		return get_post_stati();
628
-	}
629
-
630
-	/**
631
-	 * Checks if a key should be included in a response.
632
-	 *
633
-	 * @since  1.0.19
634
-	 * @param  GetPaid_Data $object  Data object.
635
-	 * @param  string       $field_key The key to check for.
636
-	 * @return bool
637
-	 */
638
-	public function object_supports_field( $object, $field_key ) {
639
-		$supports = parent::object_supports_field( $object, $field_key );
640
-		return apply_filters( "getpaid_rest_{$this->post_type}_object_supports_key", $supports, $object, $field_key );
641
-	}
599
+        // Cache the invoice schema.
600
+        $this->schema = $schema;
601
+
602
+        return $this->add_additional_fields_schema( $this->schema );
603
+    }
604
+
605
+    /**
606
+     * Sanitizes and validates the list of post statuses.
607
+     *
608
+     * @since 1.0.13
609
+     *
610
+     * @param string|array    $statuses  One or more post statuses.
611
+     * @param WP_REST_Request $request   Full details about the request.
612
+     * @param string          $parameter Additional parameter to pass to validation.
613
+     * @return array|WP_Error A list of valid statuses, otherwise WP_Error object.
614
+     */
615
+    public function sanitize_post_statuses( $statuses, $request, $parameter ) {
616
+        return array_intersect( wp_parse_slug_list( $statuses ), $this->get_post_statuses() );
617
+    }
618
+
619
+    /**
620
+     * Retrieves a valid list of post statuses.
621
+     *
622
+     * @since 1.0.19
623
+     *
624
+     * @return array A list of registered item statuses.
625
+     */
626
+    public function get_post_statuses() {
627
+        return get_post_stati();
628
+    }
629
+
630
+    /**
631
+     * Checks if a key should be included in a response.
632
+     *
633
+     * @since  1.0.19
634
+     * @param  GetPaid_Data $object  Data object.
635
+     * @param  string       $field_key The key to check for.
636
+     * @return bool
637
+     */
638
+    public function object_supports_field( $object, $field_key ) {
639
+        $supports = parent::object_supports_field( $object, $field_key );
640
+        return apply_filters( "getpaid_rest_{$this->post_type}_object_supports_key", $supports, $object, $field_key );
641
+    }
642 642
 
643 643
 }
Please login to merge, or discard this patch.
includes/class-getpaid-template.php 1 patch
Indentation   +152 added lines, -152 removed lines patch added patch discarded remove patch
@@ -1,6 +1,6 @@  discard block
 block discarded – undo
1 1
 <?php
2 2
 if ( ! defined( 'ABSPATH' ) ) {
3
-	exit;
3
+    exit;
4 4
 }
5 5
 
6 6
 /**
@@ -20,29 +20,29 @@  discard block
 block discarded – undo
20 20
     public $templates_url;
21 21
 
22 22
     /**
23
-	 * Class constructor.
24
-	 *
25
-	 * @since 1.0.19
26
-	 */
27
-	public function __construct() {
23
+     * Class constructor.
24
+     *
25
+     * @since 1.0.19
26
+     */
27
+    public function __construct() {
28 28
 
29 29
         $this->templates_dir = apply_filters( 'getpaid_default_templates_dir', WPINV_PLUGIN_DIR . 'templates' );
30 30
         $this->templates_url = apply_filters( 'getpaid_default_templates_url', WPINV_PLUGIN_URL . 'templates' );
31 31
 
32 32
         // Oxygen plugin
33
-		if ( defined( 'CT_VERSION' ) ) {
34
-			add_filter( 'wpinv_locate_template', array( $this, 'oxygen_override_template' ), 11, 4 );
35
-		}
33
+        if ( defined( 'CT_VERSION' ) ) {
34
+            add_filter( 'wpinv_locate_template', array( $this, 'oxygen_override_template' ), 11, 4 );
35
+        }
36 36
 
37 37
     }
38 38
 
39 39
     /**
40
-	 * Checks if this is a preview page
41
-	 *
42
-	 * @since 1.0.19
43
-	 * @return bool
44
-	 */
45
-	public function is_preview() {
40
+     * Checks if this is a preview page
41
+     *
42
+     * @since 1.0.19
43
+     * @return bool
44
+     */
45
+    public function is_preview() {
46 46
         return $this->is_divi_preview() ||
47 47
             $this->is_elementor_preview() ||
48 48
             $this->is_beaver_preview() ||
@@ -53,73 +53,73 @@  discard block
 block discarded – undo
53 53
     }
54 54
 
55 55
     /**
56
-	 * Checks if this is an elementor preview page
57
-	 *
58
-	 * @since 1.0.19
59
-	 * @return bool
60
-	 */
61
-	public function is_elementor_preview() {
62
-		return isset( $_REQUEST['elementor-preview'] ) || ( is_admin() && isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'elementor' ) || ( isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'elementor_ajax' );
63
-	}
64
-
65
-	/**
66
-	 * Checks if this is a DIVI preview page
67
-	 *
68
-	 * @since 1.0.19
69
-	 * @return bool
70
-	 */
71
-	public function is_divi_preview() {
72
-		return isset( $_REQUEST['et_fb'] ) || isset( $_REQUEST['et_pb_preview'] ) || ( is_admin() && isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'et_pb' );
73
-	}
74
-
75
-	/**
76
-	 * Checks if this is a beaver builder preview page
77
-	 *
78
-	 * @since 1.0.19
79
-	 * @return bool
80
-	 */
81
-	public function is_beaver_preview() {
82
-		return isset( $_REQUEST['fl_builder'] );
83
-	}
84
-
85
-	/**
86
-	 * Checks if this is a siteorigin builder preview page
87
-	 *
88
-	 * @since 1.0.19
89
-	 * @return bool
90
-	 */
91
-	public function is_siteorigin_preview() {
92
-		return ! empty( $_REQUEST['siteorigin_panels_live_editor'] );
93
-	}
94
-
95
-	/**
96
-	 * Checks if this is a cornerstone builder preview page
97
-	 *
98
-	 * @since 1.0.19
99
-	 * @return bool
100
-	 */
101
-	public function is_cornerstone_preview() {
102
-		return ! empty( $_REQUEST['cornerstone_preview'] ) || basename( $_SERVER['REQUEST_URI'] ) == 'cornerstone-endpoint';
103
-	}
104
-
105
-	/**
106
-	 * Checks if this is a fusion builder preview page
107
-	 *
108
-	 * @since 1.0.19
109
-	 * @return bool
110
-	 */
111
-	public function is_fusion_preview() {
112
-		return ! empty( $_REQUEST['fb-edit'] ) || ! empty( $_REQUEST['fusion_load_nonce'] );
113
-	}
114
-
115
-	/**
116
-	 * Checks if this is an oxygen builder preview page
117
-	 *
118
-	 * @since 1.0.19
119
-	 * @return bool
120
-	 */
121
-	public function is_oxygen_preview() {
122
-		return ! empty( $_REQUEST['ct_builder'] ) || ( ! empty( $_REQUEST['action'] ) && ( substr( $_REQUEST['action'], 0, 11 ) === 'oxy_render_' || substr( $_REQUEST['action'], 0, 10 ) === 'ct_render_' ) );
56
+     * Checks if this is an elementor preview page
57
+     *
58
+     * @since 1.0.19
59
+     * @return bool
60
+     */
61
+    public function is_elementor_preview() {
62
+        return isset( $_REQUEST['elementor-preview'] ) || ( is_admin() && isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'elementor' ) || ( isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'elementor_ajax' );
63
+    }
64
+
65
+    /**
66
+     * Checks if this is a DIVI preview page
67
+     *
68
+     * @since 1.0.19
69
+     * @return bool
70
+     */
71
+    public function is_divi_preview() {
72
+        return isset( $_REQUEST['et_fb'] ) || isset( $_REQUEST['et_pb_preview'] ) || ( is_admin() && isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'et_pb' );
73
+    }
74
+
75
+    /**
76
+     * Checks if this is a beaver builder preview page
77
+     *
78
+     * @since 1.0.19
79
+     * @return bool
80
+     */
81
+    public function is_beaver_preview() {
82
+        return isset( $_REQUEST['fl_builder'] );
83
+    }
84
+
85
+    /**
86
+     * Checks if this is a siteorigin builder preview page
87
+     *
88
+     * @since 1.0.19
89
+     * @return bool
90
+     */
91
+    public function is_siteorigin_preview() {
92
+        return ! empty( $_REQUEST['siteorigin_panels_live_editor'] );
93
+    }
94
+
95
+    /**
96
+     * Checks if this is a cornerstone builder preview page
97
+     *
98
+     * @since 1.0.19
99
+     * @return bool
100
+     */
101
+    public function is_cornerstone_preview() {
102
+        return ! empty( $_REQUEST['cornerstone_preview'] ) || basename( $_SERVER['REQUEST_URI'] ) == 'cornerstone-endpoint';
103
+    }
104
+
105
+    /**
106
+     * Checks if this is a fusion builder preview page
107
+     *
108
+     * @since 1.0.19
109
+     * @return bool
110
+     */
111
+    public function is_fusion_preview() {
112
+        return ! empty( $_REQUEST['fb-edit'] ) || ! empty( $_REQUEST['fusion_load_nonce'] );
113
+    }
114
+
115
+    /**
116
+     * Checks if this is an oxygen builder preview page
117
+     *
118
+     * @since 1.0.19
119
+     * @return bool
120
+     */
121
+    public function is_oxygen_preview() {
122
+        return ! empty( $_REQUEST['ct_builder'] ) || ( ! empty( $_REQUEST['action'] ) && ( substr( $_REQUEST['action'], 0, 11 ) === 'oxy_render_' || substr( $_REQUEST['action'], 0, 10 ) === 'ct_render_' ) );
123 123
     }
124 124
 
125 125
     /**
@@ -129,7 +129,7 @@  discard block
 block discarded – undo
129 129
      * @param string $template_path The template path relative to the theme's root dir. Defaults to 'invoicing'.
130 130
      * @param string $default_path The root path to the default template. Defaults to invoicing/templates
131 131
      */
132
-	public function locate_template( $template_name, $template_path = '', $default_path = '' ) {
132
+    public function locate_template( $template_name, $template_path = '', $default_path = '' ) {
133 133
 
134 134
         // Load the defaults for the template path and default path.
135 135
         $template_path = empty( $template_path ) ? 'invoicing' : $template_path;
@@ -150,22 +150,22 @@  discard block
 block discarded – undo
150 150
     }
151 151
 
152 152
     /**
153
-	 * Loads a template
154
-	 *
155
-	 * @since 1.0.19
156
-	 * @return bool
157
-	 */
158
-	protected function load_template( $template_name, $template_path, $args ) {
153
+     * Loads a template
154
+     *
155
+     * @since 1.0.19
156
+     * @return bool
157
+     */
158
+    protected function load_template( $template_name, $template_path, $args ) {
159 159
 
160 160
         if ( is_array( $args ) ) {
161 161
             extract( $args );
162 162
         }
163 163
 
164 164
         // Fires before loading a template.
165
-	    do_action( 'wpinv_before_template_part', $template_name, $template_path, $args );
165
+        do_action( 'wpinv_before_template_part', $template_name, $template_path, $args );
166 166
 
167 167
         // Load the template.
168
-	    include $template_path;
168
+        include $template_path;
169 169
 
170 170
         // Fires after loading a template.
171 171
         do_action( 'wpinv_after_template_part', $template_name, $template_path, $args );
@@ -182,7 +182,7 @@  discard block
 block discarded – undo
182 182
      * @param string $template_path The templates directory relative to the theme's root dir. Defaults to 'invoicing'.
183 183
      * @param string $default_path The root path to the default template. Defaults to invoicing/templates
184 184
      */
185
-	public function display_template( $template_name, $args = array(), $template_path = '', $default_path = '' ) {
185
+    public function display_template( $template_name, $args = array(), $template_path = '', $default_path = '' ) {
186 186
 
187 187
         // Locate the template.
188 188
         $located = $this->locate_template( $template_name, $template_path, $default_path );
@@ -207,74 +207,74 @@  discard block
 block discarded – undo
207 207
      * @param string $template_path The templates directory relative to the theme's root dir. Defaults to 'invoicing'.
208 208
      * @param string $default_path The root path to the default template. Defaults to invoicing/templates
209 209
      */
210
-	public function get_template( $template_name, $args = array(), $template_path = '', $default_path = '' ) {
210
+    public function get_template( $template_name, $args = array(), $template_path = '', $default_path = '' ) {
211 211
         ob_start();
212 212
         $this->display_template( $template_name, $args, $template_path, $default_path );
213 213
         return ob_get_clean();
214 214
     }
215 215
 
216 216
     /**
217
-	 * Get the geodirectory templates theme path.
218
-	 *
219
-	 *
220
-	 * @return string Template path.
221
-	 */
222
-	public static function get_theme_template_path() {
223
-		$template   = get_template();
224
-		$theme_root = get_theme_root( $template );
225
-
226
-		return $theme_root . '/' . $template . '/' . untrailingslashit( wpinv_get_theme_template_dir_name() );
227
-
228
-	}
229
-
230
-	/**
231
-	 * Oxygen locate theme template.
232
-	 *
233
-	 * @param string $template The template.
234
-	 * @return string The theme template.
235
-	 */
236
-	public static function oxygen_locate_template( $template ) {
237
-
238
-		if ( empty( $template ) ) {
239
-			return '';
240
-		}
241
-
242
-		$has_filter = has_filter( 'template', 'ct_oxygen_template_name' );
243
-
244
-		// Remove template filter
245
-		if ( $has_filter ) {
246
-			remove_filter( 'template', 'ct_oxygen_template_name' );
247
-		}
248
-
249
-		$template = self::get_theme_template_path() . '/' . $template;
250
-
251
-		if ( ! file_exists( $template ) ) {
252
-			$template = '';
253
-		}
254
-
255
-		// Add template filter
256
-		if ( $has_filter ) {
257
-			add_filter( 'template', 'ct_oxygen_template_name' );
258
-		}
259
-
260
-		return $template;
261
-	}
262
-
263
-	/**
264
-	 * Oxygen override theme template.
265
-	 *
266
-	 * @param string $located Located template.
267
-	 * @param string $template_name Template name.
268
-	 * @return string Located template.
269
-	 */
270
-	public function oxygen_override_template( $located, $template_name ) {
217
+     * Get the geodirectory templates theme path.
218
+     *
219
+     *
220
+     * @return string Template path.
221
+     */
222
+    public static function get_theme_template_path() {
223
+        $template   = get_template();
224
+        $theme_root = get_theme_root( $template );
225
+
226
+        return $theme_root . '/' . $template . '/' . untrailingslashit( wpinv_get_theme_template_dir_name() );
227
+
228
+    }
229
+
230
+    /**
231
+     * Oxygen locate theme template.
232
+     *
233
+     * @param string $template The template.
234
+     * @return string The theme template.
235
+     */
236
+    public static function oxygen_locate_template( $template ) {
237
+
238
+        if ( empty( $template ) ) {
239
+            return '';
240
+        }
241
+
242
+        $has_filter = has_filter( 'template', 'ct_oxygen_template_name' );
243
+
244
+        // Remove template filter
245
+        if ( $has_filter ) {
246
+            remove_filter( 'template', 'ct_oxygen_template_name' );
247
+        }
248
+
249
+        $template = self::get_theme_template_path() . '/' . $template;
250
+
251
+        if ( ! file_exists( $template ) ) {
252
+            $template = '';
253
+        }
254
+
255
+        // Add template filter
256
+        if ( $has_filter ) {
257
+            add_filter( 'template', 'ct_oxygen_template_name' );
258
+        }
259
+
260
+        return $template;
261
+    }
262
+
263
+    /**
264
+     * Oxygen override theme template.
265
+     *
266
+     * @param string $located Located template.
267
+     * @param string $template_name Template name.
268
+     * @return string Located template.
269
+     */
270
+    public function oxygen_override_template( $located, $template_name ) {
271 271
 
272 272
         $oxygen_overide = self::oxygen_locate_template( $template_name );
273
-		if ( ! empty( $oxygen_overide ) ) {
274
-			return $oxygen_overide;
275
-		}
273
+        if ( ! empty( $oxygen_overide ) ) {
274
+            return $oxygen_overide;
275
+        }
276 276
 
277
-		return $located;
278
-	}
277
+        return $located;
278
+    }
279 279
 
280 280
 }
Please login to merge, or discard this patch.
includes/class-wpinv-db.php 1 patch
Indentation   +232 added lines, -232 removed lines patch added patch discarded remove patch
@@ -7,237 +7,237 @@
 block discarded – undo
7 7
 
8 8
 abstract class Wpinv_DB {
9 9
 
10
-	/**
11
-	 * The name of our database table
12
-	 *
13
-	 * @access  public
14
-	 * @since   1.0.0
15
-	 */
16
-	public $table_name;
17
-
18
-	/**
19
-	 * The version of our database table
20
-	 *
21
-	 * @access  public
22
-	 * @since   1.0.0
23
-	 */
24
-	public $version;
25
-
26
-	/**
27
-	 * The name of the primary column
28
-	 *
29
-	 * @access  public
30
-	 * @since   1.0.0
31
-	 */
32
-	public $primary_key;
33
-
34
-	/**
35
-	 * Get things started
36
-	 *
37
-	 * @access  public
38
-	 * @since   1.0.0
39
-	 */
40
-	public function __construct() {}
41
-
42
-	/**
43
-	 * Whitelist of columns
44
-	 *
45
-	 * @access  public
46
-	 * @since   1.0.0
47
-	 * @return  array
48
-	 */
49
-	public function get_columns() {
50
-		return array();
51
-	}
52
-
53
-	/**
54
-	 * Default column values
55
-	 *
56
-	 * @access  public
57
-	 * @since   1.0.0
58
-	 * @return  array
59
-	 */
60
-	public function get_column_defaults() {
61
-		return array();
62
-	}
63
-
64
-	/**
65
-	 * Retrieve a row by the primary key
66
-	 *
67
-	 * @access  public
68
-	 * @since   1.0.0
69
-	 * @return  object
70
-	 */
71
-	public function get( $row_id ) {
72
-		global $wpdb;
73
-		return $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $this->table_name WHERE $this->primary_key = %s LIMIT 1;", $row_id ) );
74
-	}
75
-
76
-	/**
77
-	 * Retrieve a row by a specific column / value
78
-	 *
79
-	 * @access  public
80
-	 * @since   1.0.0
81
-	 * @return  object
82
-	 */
83
-	public function get_by( $column, $row_id ) {
84
-		global $wpdb;
85
-		$column = esc_sql( $column );
86
-		return $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $this->table_name WHERE $column = %s LIMIT 1;", $row_id ) );
87
-	}
88
-
89
-	/**
90
-	 * Retrieve a specific column's value by the primary key
91
-	 *
92
-	 * @access  public
93
-	 * @since   1.0.0
94
-	 * @return  string
95
-	 */
96
-	public function get_column( $column, $row_id ) {
97
-		global $wpdb;
98
-		$column = esc_sql( $column );
99
-		return $wpdb->get_var( $wpdb->prepare( "SELECT $column FROM $this->table_name WHERE $this->primary_key = %s LIMIT 1;", $row_id ) );
100
-	}
101
-
102
-	/**
103
-	 * Retrieve a specific column's value by the the specified column / value
104
-	 *
105
-	 * @access  public
106
-	 * @since   1.0.0
107
-	 * @return  string
108
-	 */
109
-	public function get_column_by( $column, $column_where, $column_value ) {
110
-		global $wpdb;
111
-		$column_where = esc_sql( $column_where );
112
-		$column       = esc_sql( $column );
113
-		return $wpdb->get_var( $wpdb->prepare( "SELECT $column FROM $this->table_name WHERE $column_where = %s LIMIT 1;", $column_value ) );
114
-	}
115
-
116
-	/**
117
-	 * Insert a new row
118
-	 *
119
-	 * @access  public
120
-	 * @since   1.0.0
121
-	 * @return  int
122
-	 */
123
-	public function insert( $data, $type = '' ) {
124
-		global $wpdb;
125
-
126
-		// Set default values
127
-		$data = wp_parse_args( $data, $this->get_column_defaults() );
128
-
129
-		do_action( 'wpinv_pre_insert_' . $type, $data );
130
-
131
-		// Initialise column format array
132
-		$column_formats = $this->get_columns();
133
-
134
-		// Force fields to lower case
135
-		$data = array_change_key_case( $data );
136
-
137
-		// White list columns
138
-		$data = array_intersect_key( $data, $column_formats );
139
-
140
-		// Reorder $column_formats to match the order of columns given in $data
141
-		$data_keys = array_keys( $data );
142
-		$column_formats = array_merge( array_flip( $data_keys ), $column_formats );
143
-
144
-		$wpdb->insert( $this->table_name, $data, $column_formats );
145
-		$wpdb_insert_id = $wpdb->insert_id;
146
-
147
-		do_action( 'wpinv_post_insert_' . $type, $wpdb_insert_id, $data );
148
-
149
-		return $wpdb_insert_id;
150
-	}
151
-
152
-	/**
153
-	 * Update a row
154
-	 *
155
-	 * @access  public
156
-	 * @since   1.0.0
157
-	 * @return  bool
158
-	 */
159
-	public function update( $row_id, $data = array(), $where = '' ) {
160
-
161
-		global $wpdb;
162
-
163
-		// Row ID must be positive integer
164
-		$row_id = absint( $row_id );
165
-
166
-		if ( empty( $row_id ) ) {
167
-			return false;
168
-		}
169
-
170
-		if ( empty( $where ) ) {
171
-			$where = $this->primary_key;
172
-		}
173
-
174
-		// Initialise column format array
175
-		$column_formats = $this->get_columns();
176
-
177
-		// Force fields to lower case
178
-		$data = array_change_key_case( $data );
179
-
180
-		// White list columns
181
-		$data = array_intersect_key( $data, $column_formats );
182
-
183
-		// Reorder $column_formats to match the order of columns given in $data
184
-		$data_keys = array_keys( $data );
185
-		$column_formats = array_merge( array_flip( $data_keys ), $column_formats );
186
-
187
-		if ( false === $wpdb->update( $this->table_name, $data, array( $where => $row_id ), $column_formats ) ) {
188
-			return false;
189
-		}
190
-
191
-		return true;
192
-	}
193
-
194
-	/**
195
-	 * Delete a row identified by the primary key
196
-	 *
197
-	 * @access  public
198
-	 * @since   1.0.0
199
-	 * @return  bool
200
-	 */
201
-	public function delete( $row_id = 0 ) {
202
-
203
-		global $wpdb;
204
-
205
-		// Row ID must be positive integer
206
-		$row_id = absint( $row_id );
207
-
208
-		if ( empty( $row_id ) ) {
209
-			return false;
210
-		}
211
-
212
-		if ( false === $wpdb->query( $wpdb->prepare( "DELETE FROM $this->table_name WHERE $this->primary_key = %d", $row_id ) ) ) {
213
-			return false;
214
-		}
215
-
216
-		return true;
217
-	}
218
-
219
-	/**
220
-	 * Check if the given table exists
221
-	 *
222
-	 * @since  2.4
223
-	 * @param  string $table The table name
224
-	 * @return bool          If the table name exists
225
-	 */
226
-	public function table_exists( $table ) {
227
-		global $wpdb;
228
-		$table = sanitize_text_field( $table );
229
-
230
-		return $wpdb->get_var( $wpdb->prepare( "SHOW TABLES LIKE '%s'", $table ) ) === $table;
231
-	}
232
-
233
-	/**
234
-	 * Check if the table was ever installed
235
-	 *
236
-	 * @since  2.4
237
-	 * @return bool Returns if the customers table was installed and upgrade routine run
238
-	 */
239
-	public function installed() {
240
-		return $this->table_exists( $this->table_name );
241
-	}
10
+    /**
11
+     * The name of our database table
12
+     *
13
+     * @access  public
14
+     * @since   1.0.0
15
+     */
16
+    public $table_name;
17
+
18
+    /**
19
+     * The version of our database table
20
+     *
21
+     * @access  public
22
+     * @since   1.0.0
23
+     */
24
+    public $version;
25
+
26
+    /**
27
+     * The name of the primary column
28
+     *
29
+     * @access  public
30
+     * @since   1.0.0
31
+     */
32
+    public $primary_key;
33
+
34
+    /**
35
+     * Get things started
36
+     *
37
+     * @access  public
38
+     * @since   1.0.0
39
+     */
40
+    public function __construct() {}
41
+
42
+    /**
43
+     * Whitelist of columns
44
+     *
45
+     * @access  public
46
+     * @since   1.0.0
47
+     * @return  array
48
+     */
49
+    public function get_columns() {
50
+        return array();
51
+    }
52
+
53
+    /**
54
+     * Default column values
55
+     *
56
+     * @access  public
57
+     * @since   1.0.0
58
+     * @return  array
59
+     */
60
+    public function get_column_defaults() {
61
+        return array();
62
+    }
63
+
64
+    /**
65
+     * Retrieve a row by the primary key
66
+     *
67
+     * @access  public
68
+     * @since   1.0.0
69
+     * @return  object
70
+     */
71
+    public function get( $row_id ) {
72
+        global $wpdb;
73
+        return $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $this->table_name WHERE $this->primary_key = %s LIMIT 1;", $row_id ) );
74
+    }
75
+
76
+    /**
77
+     * Retrieve a row by a specific column / value
78
+     *
79
+     * @access  public
80
+     * @since   1.0.0
81
+     * @return  object
82
+     */
83
+    public function get_by( $column, $row_id ) {
84
+        global $wpdb;
85
+        $column = esc_sql( $column );
86
+        return $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $this->table_name WHERE $column = %s LIMIT 1;", $row_id ) );
87
+    }
88
+
89
+    /**
90
+     * Retrieve a specific column's value by the primary key
91
+     *
92
+     * @access  public
93
+     * @since   1.0.0
94
+     * @return  string
95
+     */
96
+    public function get_column( $column, $row_id ) {
97
+        global $wpdb;
98
+        $column = esc_sql( $column );
99
+        return $wpdb->get_var( $wpdb->prepare( "SELECT $column FROM $this->table_name WHERE $this->primary_key = %s LIMIT 1;", $row_id ) );
100
+    }
101
+
102
+    /**
103
+     * Retrieve a specific column's value by the the specified column / value
104
+     *
105
+     * @access  public
106
+     * @since   1.0.0
107
+     * @return  string
108
+     */
109
+    public function get_column_by( $column, $column_where, $column_value ) {
110
+        global $wpdb;
111
+        $column_where = esc_sql( $column_where );
112
+        $column       = esc_sql( $column );
113
+        return $wpdb->get_var( $wpdb->prepare( "SELECT $column FROM $this->table_name WHERE $column_where = %s LIMIT 1;", $column_value ) );
114
+    }
115
+
116
+    /**
117
+     * Insert a new row
118
+     *
119
+     * @access  public
120
+     * @since   1.0.0
121
+     * @return  int
122
+     */
123
+    public function insert( $data, $type = '' ) {
124
+        global $wpdb;
125
+
126
+        // Set default values
127
+        $data = wp_parse_args( $data, $this->get_column_defaults() );
128
+
129
+        do_action( 'wpinv_pre_insert_' . $type, $data );
130
+
131
+        // Initialise column format array
132
+        $column_formats = $this->get_columns();
133
+
134
+        // Force fields to lower case
135
+        $data = array_change_key_case( $data );
136
+
137
+        // White list columns
138
+        $data = array_intersect_key( $data, $column_formats );
139
+
140
+        // Reorder $column_formats to match the order of columns given in $data
141
+        $data_keys = array_keys( $data );
142
+        $column_formats = array_merge( array_flip( $data_keys ), $column_formats );
143
+
144
+        $wpdb->insert( $this->table_name, $data, $column_formats );
145
+        $wpdb_insert_id = $wpdb->insert_id;
146
+
147
+        do_action( 'wpinv_post_insert_' . $type, $wpdb_insert_id, $data );
148
+
149
+        return $wpdb_insert_id;
150
+    }
151
+
152
+    /**
153
+     * Update a row
154
+     *
155
+     * @access  public
156
+     * @since   1.0.0
157
+     * @return  bool
158
+     */
159
+    public function update( $row_id, $data = array(), $where = '' ) {
160
+
161
+        global $wpdb;
162
+
163
+        // Row ID must be positive integer
164
+        $row_id = absint( $row_id );
165
+
166
+        if ( empty( $row_id ) ) {
167
+            return false;
168
+        }
169
+
170
+        if ( empty( $where ) ) {
171
+            $where = $this->primary_key;
172
+        }
173
+
174
+        // Initialise column format array
175
+        $column_formats = $this->get_columns();
176
+
177
+        // Force fields to lower case
178
+        $data = array_change_key_case( $data );
179
+
180
+        // White list columns
181
+        $data = array_intersect_key( $data, $column_formats );
182
+
183
+        // Reorder $column_formats to match the order of columns given in $data
184
+        $data_keys = array_keys( $data );
185
+        $column_formats = array_merge( array_flip( $data_keys ), $column_formats );
186
+
187
+        if ( false === $wpdb->update( $this->table_name, $data, array( $where => $row_id ), $column_formats ) ) {
188
+            return false;
189
+        }
190
+
191
+        return true;
192
+    }
193
+
194
+    /**
195
+     * Delete a row identified by the primary key
196
+     *
197
+     * @access  public
198
+     * @since   1.0.0
199
+     * @return  bool
200
+     */
201
+    public function delete( $row_id = 0 ) {
202
+
203
+        global $wpdb;
204
+
205
+        // Row ID must be positive integer
206
+        $row_id = absint( $row_id );
207
+
208
+        if ( empty( $row_id ) ) {
209
+            return false;
210
+        }
211
+
212
+        if ( false === $wpdb->query( $wpdb->prepare( "DELETE FROM $this->table_name WHERE $this->primary_key = %d", $row_id ) ) ) {
213
+            return false;
214
+        }
215
+
216
+        return true;
217
+    }
218
+
219
+    /**
220
+     * Check if the given table exists
221
+     *
222
+     * @since  2.4
223
+     * @param  string $table The table name
224
+     * @return bool          If the table name exists
225
+     */
226
+    public function table_exists( $table ) {
227
+        global $wpdb;
228
+        $table = sanitize_text_field( $table );
229
+
230
+        return $wpdb->get_var( $wpdb->prepare( "SHOW TABLES LIKE '%s'", $table ) ) === $table;
231
+    }
232
+
233
+    /**
234
+     * Check if the table was ever installed
235
+     *
236
+     * @since  2.4
237
+     * @return bool Returns if the customers table was installed and upgrade routine run
238
+     */
239
+    public function installed() {
240
+        return $this->table_exists( $this->table_name );
241
+    }
242 242
 
243 243
 }
Please login to merge, or discard this patch.
includes/class-getpaid-daily-maintenance.php 1 patch
Indentation   +137 added lines, -137 removed lines patch added patch discarded remove patch
@@ -12,144 +12,144 @@
 block discarded – undo
12 12
  */
13 13
 class GetPaid_Daily_Maintenance {
14 14
 
15
-	/**
16
-	 * Class constructor.
17
-	 */
18
-	public function __construct() {
19
-
20
-		// Clear deprecated events.
21
-		add_action( 'wp', array( $this, 'maybe_clear_deprecated_events' ) );
22
-
23
-		// (Maybe) schedule a cron that runs daily.
24
-		add_action( 'wp', array( $this, 'maybe_create_scheduled_event' ) );
25
-
26
-		// Fired everyday at 7 a.m (this might vary for sites with few visitors)
27
-		add_action( 'getpaid_daily_maintenance', array( $this, 'log_cron_run' ) );
28
-		add_action( 'getpaid_daily_maintenance', array( $this, 'backwards_compat' ) );
29
-		add_action( 'getpaid_daily_maintenance', array( $this, 'maybe_expire_subscriptions' ) );
30
-		add_action( 'getpaid_daily_maintenance', array( $this, 'check_renewing_subscriptions' ) );
31
-		add_action( 'getpaid_daily_maintenance', array( $this, 'maybe_update_geoip_databases' ) );
32
-
33
-	}
34
-
35
-	/**
36
-	 * Schedules a cron to run every day at 7 a.m
37
-	 *
38
-	 */
39
-	public function maybe_create_scheduled_event() {
40
-
41
-		if ( ! wp_next_scheduled( 'getpaid_daily_maintenance' ) ) {
42
-			$timestamp = strtotime( 'tomorrow 07:00:00', current_time( 'timestamp' ) );
43
-			wp_schedule_event( $timestamp, 'daily', 'getpaid_daily_maintenance' );
44
-		}
45
-
46
-	}
47
-
48
-	/**
49
-	 * Clears deprecated events.
50
-	 *
51
-	 */
52
-	public function maybe_clear_deprecated_events() {
53
-
54
-		if ( ! get_option( 'wpinv_cleared_old_events' ) ) {
55
-			wp_clear_scheduled_hook( 'wpinv_register_schedule_event_twicedaily' );
56
-			wp_clear_scheduled_hook( 'wpinv_register_schedule_event_daily' );
57
-			update_option( 'wpinv_cleared_old_events', 1 );
58
-		}
59
-
60
-	}
61
-
62
-	/**
63
-	 * Fires the old hook for backwards compatibility.
64
-	 *
65
-	 */
66
-	public function backwards_compat() {
67
-		do_action( 'wpinv_register_schedule_event_daily' );
68
-	}
69
-
70
-	/**
71
-	 * Checks for subscriptions that are scheduled to renew.
72
-	 *
73
-	 */
74
-	public function check_renewing_subscriptions() {
75
-
76
-		// Fetch subscriptions that expire today.
77
-		$args  = array(
78
-			'number'             => -1,
79
-			'count_total'        => false,
80
-			'status'             => 'trialling active',
81
-			'date_expires_query' => array(
82
-				array(
83
-					'year'    => date( 'Y', current_time( 'timestamp' ) ),
84
-					'month'   => date( 'n', current_time( 'timestamp' ) ),
85
-					'day'     => date( 'j', current_time( 'timestamp' ) ),
86
-					'compare' => '=',
87
-				),
88
-			),
89
-		);
90
-
91
-		$subscriptions = new GetPaid_Subscriptions_Query( $args );
92
-
93
-		foreach ( $subscriptions->get_results() as $subscription ) {
94
-
95
-			/** @var WPInv_Subscription $subscription */
96
-			if ( $subscription->is_last_renewal() ) {
97
-				$subscription->complete();
98
-			} else {
99
-				do_action( 'getpaid_should_renew_subscription', $subscription );
100
-			}
15
+    /**
16
+     * Class constructor.
17
+     */
18
+    public function __construct() {
19
+
20
+        // Clear deprecated events.
21
+        add_action( 'wp', array( $this, 'maybe_clear_deprecated_events' ) );
22
+
23
+        // (Maybe) schedule a cron that runs daily.
24
+        add_action( 'wp', array( $this, 'maybe_create_scheduled_event' ) );
25
+
26
+        // Fired everyday at 7 a.m (this might vary for sites with few visitors)
27
+        add_action( 'getpaid_daily_maintenance', array( $this, 'log_cron_run' ) );
28
+        add_action( 'getpaid_daily_maintenance', array( $this, 'backwards_compat' ) );
29
+        add_action( 'getpaid_daily_maintenance', array( $this, 'maybe_expire_subscriptions' ) );
30
+        add_action( 'getpaid_daily_maintenance', array( $this, 'check_renewing_subscriptions' ) );
31
+        add_action( 'getpaid_daily_maintenance', array( $this, 'maybe_update_geoip_databases' ) );
32
+
33
+    }
34
+
35
+    /**
36
+     * Schedules a cron to run every day at 7 a.m
37
+     *
38
+     */
39
+    public function maybe_create_scheduled_event() {
40
+
41
+        if ( ! wp_next_scheduled( 'getpaid_daily_maintenance' ) ) {
42
+            $timestamp = strtotime( 'tomorrow 07:00:00', current_time( 'timestamp' ) );
43
+            wp_schedule_event( $timestamp, 'daily', 'getpaid_daily_maintenance' );
44
+        }
45
+
46
+    }
47
+
48
+    /**
49
+     * Clears deprecated events.
50
+     *
51
+     */
52
+    public function maybe_clear_deprecated_events() {
53
+
54
+        if ( ! get_option( 'wpinv_cleared_old_events' ) ) {
55
+            wp_clear_scheduled_hook( 'wpinv_register_schedule_event_twicedaily' );
56
+            wp_clear_scheduled_hook( 'wpinv_register_schedule_event_daily' );
57
+            update_option( 'wpinv_cleared_old_events', 1 );
58
+        }
59
+
60
+    }
61
+
62
+    /**
63
+     * Fires the old hook for backwards compatibility.
64
+     *
65
+     */
66
+    public function backwards_compat() {
67
+        do_action( 'wpinv_register_schedule_event_daily' );
68
+    }
69
+
70
+    /**
71
+     * Checks for subscriptions that are scheduled to renew.
72
+     *
73
+     */
74
+    public function check_renewing_subscriptions() {
75
+
76
+        // Fetch subscriptions that expire today.
77
+        $args  = array(
78
+            'number'             => -1,
79
+            'count_total'        => false,
80
+            'status'             => 'trialling active',
81
+            'date_expires_query' => array(
82
+                array(
83
+                    'year'    => date( 'Y', current_time( 'timestamp' ) ),
84
+                    'month'   => date( 'n', current_time( 'timestamp' ) ),
85
+                    'day'     => date( 'j', current_time( 'timestamp' ) ),
86
+                    'compare' => '=',
87
+                ),
88
+            ),
89
+        );
90
+
91
+        $subscriptions = new GetPaid_Subscriptions_Query( $args );
92
+
93
+        foreach ( $subscriptions->get_results() as $subscription ) {
94
+
95
+            /** @var WPInv_Subscription $subscription */
96
+            if ( $subscription->is_last_renewal() ) {
97
+                $subscription->complete();
98
+            } else {
99
+                do_action( 'getpaid_should_renew_subscription', $subscription );
100
+            }
101 101
 }
102 102
 
103
-	}
104
-
105
-	/**
106
-	 * Expires expired subscriptions.
107
-	 *
108
-	 */
109
-	public function maybe_expire_subscriptions() {
110
-
111
-		// Fetch expired subscriptions (skips those that expire today).
112
-		$args  = array(
113
-			'number'             => -1,
114
-			'count_total'        => false,
115
-			'status'             => 'trialling active failing cancelled',
116
-			'date_expires_query' => array(
117
-				'before'    => 'yesterday',
118
-				'inclusive' => false,
119
-			),
120
-		);
121
-
122
-		$subscriptions = new GetPaid_Subscriptions_Query( $args );
123
-
124
-		foreach ( $subscriptions->get_results() as $subscription ) {
125
-			if ( apply_filters( 'getpaid_daily_maintenance_should_expire_subscription', false, $subscription ) ) {
126
-				$subscription->set_status( 'expired' );
127
-				$subscription->save();
128
-			}
129
-		}
130
-
131
-	}
132
-
133
-	/**
134
-	 * Logs cron runs.
135
-	 *
136
-	 */
137
-	public function log_cron_run() {
138
-		wpinv_error_log( 'GetPaid Daily Cron', false );
139
-	}
140
-
141
-	/**
142
-	 * Updates GeoIP databases.
143
-	 *
144
-	 */
145
-	public function maybe_update_geoip_databases() {
146
-		$updated = get_transient( 'getpaid_updated_geoip_databases' );
147
-
148
-		if ( false === $updated ) {
149
-			set_transient( 'getpaid_updated_geoip_databases', 1, 15 * DAY_IN_SECONDS );
150
-			do_action( 'getpaid_update_geoip_databases' );
151
-		}
152
-
153
-	}
103
+    }
104
+
105
+    /**
106
+     * Expires expired subscriptions.
107
+     *
108
+     */
109
+    public function maybe_expire_subscriptions() {
110
+
111
+        // Fetch expired subscriptions (skips those that expire today).
112
+        $args  = array(
113
+            'number'             => -1,
114
+            'count_total'        => false,
115
+            'status'             => 'trialling active failing cancelled',
116
+            'date_expires_query' => array(
117
+                'before'    => 'yesterday',
118
+                'inclusive' => false,
119
+            ),
120
+        );
121
+
122
+        $subscriptions = new GetPaid_Subscriptions_Query( $args );
123
+
124
+        foreach ( $subscriptions->get_results() as $subscription ) {
125
+            if ( apply_filters( 'getpaid_daily_maintenance_should_expire_subscription', false, $subscription ) ) {
126
+                $subscription->set_status( 'expired' );
127
+                $subscription->save();
128
+            }
129
+        }
130
+
131
+    }
132
+
133
+    /**
134
+     * Logs cron runs.
135
+     *
136
+     */
137
+    public function log_cron_run() {
138
+        wpinv_error_log( 'GetPaid Daily Cron', false );
139
+    }
140
+
141
+    /**
142
+     * Updates GeoIP databases.
143
+     *
144
+     */
145
+    public function maybe_update_geoip_databases() {
146
+        $updated = get_transient( 'getpaid_updated_geoip_databases' );
147
+
148
+        if ( false === $updated ) {
149
+            set_transient( 'getpaid_updated_geoip_databases', 1, 15 * DAY_IN_SECONDS );
150
+            do_action( 'getpaid_update_geoip_databases' );
151
+        }
152
+
153
+    }
154 154
 
155 155
 }
Please login to merge, or discard this patch.
includes/invoice-functions.php 1 patch
Indentation   +37 added lines, -37 removed lines patch added patch discarded remove patch
@@ -67,7 +67,7 @@  discard block
 block discarded – undo
67 67
  * Checks if the current user cna view an invoice receipt.
68 68
  */
69 69
 function wpinv_can_view_receipt( $invoice ) {
70
-	return (bool) apply_filters( 'wpinv_can_view_receipt', wpinv_user_can_view_invoice( $invoice ), $invoice );
70
+    return (bool) apply_filters( 'wpinv_can_view_receipt', wpinv_user_can_view_invoice( $invoice ), $invoice );
71 71
 }
72 72
 
73 73
 /**
@@ -556,37 +556,37 @@  discard block
 block discarded – undo
556 556
     $label   = empty( $label ) ? __( 'Invoice', 'invoicing' ) : sanitize_text_field( $label );
557 557
     $columns = array(
558 558
 
559
-		'invoice-number'  => array(
560
-			'title' => $label,
561
-			'class' => 'text-left',
562
-		),
559
+        'invoice-number'  => array(
560
+            'title' => $label,
561
+            'class' => 'text-left',
562
+        ),
563 563
 
564
-		'created-date'    => array(
565
-			'title' => __( 'Created Date', 'invoicing' ),
566
-			'class' => 'text-left',
567
-		),
564
+        'created-date'    => array(
565
+            'title' => __( 'Created Date', 'invoicing' ),
566
+            'class' => 'text-left',
567
+        ),
568 568
 
569
-		'payment-date'    => array(
570
-			'title' => __( 'Payment Date', 'invoicing' ),
571
-			'class' => 'text-left',
572
-		),
569
+        'payment-date'    => array(
570
+            'title' => __( 'Payment Date', 'invoicing' ),
571
+            'class' => 'text-left',
572
+        ),
573 573
 
574
-		'invoice-status'  => array(
575
-			'title' => __( 'Status', 'invoicing' ),
576
-			'class' => 'text-center',
577
-		),
574
+        'invoice-status'  => array(
575
+            'title' => __( 'Status', 'invoicing' ),
576
+            'class' => 'text-center',
577
+        ),
578 578
 
579
-		'invoice-total'   => array(
580
-			'title' => __( 'Total', 'invoicing' ),
581
-			'class' => 'text-right',
582
-		),
579
+        'invoice-total'   => array(
580
+            'title' => __( 'Total', 'invoicing' ),
581
+            'class' => 'text-right',
582
+        ),
583 583
 
584
-		'invoice-actions' => array(
585
-			'title' => '&nbsp;',
586
-			'class' => 'text-center',
587
-		),
584
+        'invoice-actions' => array(
585
+            'title' => '&nbsp;',
586
+            'class' => 'text-center',
587
+        ),
588 588
 
589
-	);
589
+    );
590 590
 
591 591
     return apply_filters( 'wpinv_user_invoices_columns', $columns, $post_type );
592 592
 }
@@ -1274,22 +1274,22 @@  discard block
 block discarded – undo
1274 1274
  */
1275 1275
 function getpaid_get_invoice_status_classes() {
1276 1276
 
1277
-	return apply_filters(
1278
-		'getpaid_get_invoice_status_classes',
1279
-		array(
1277
+    return apply_filters(
1278
+        'getpaid_get_invoice_status_classes',
1279
+        array(
1280 1280
             'wpi-quote-declined' => 'badge-danger',
1281 1281
             'wpi-failed'         => 'badge-danger',
1282
-			'wpi-processing'     => 'badge-info',
1283
-			'wpi-onhold'         => 'badge-warning',
1284
-			'wpi-quote-accepted' => 'badge-success',
1285
-			'publish'            => 'badge-success',
1286
-			'wpi-renewal'        => 'badge-primary',
1282
+            'wpi-processing'     => 'badge-info',
1283
+            'wpi-onhold'         => 'badge-warning',
1284
+            'wpi-quote-accepted' => 'badge-success',
1285
+            'publish'            => 'badge-success',
1286
+            'wpi-renewal'        => 'badge-primary',
1287 1287
             'wpi-cancelled'      => 'badge-secondary',
1288 1288
             'wpi-pending'        => 'badge-dark',
1289 1289
             'wpi-quote-pending'  => 'badge-dark',
1290 1290
             'wpi-refunded'       => 'badge-secondary',
1291
-		)
1292
-	);
1291
+        )
1292
+    );
1293 1293
 
1294 1294
 }
1295 1295
 
@@ -1303,7 +1303,7 @@  discard block
 block discarded – undo
1303 1303
 function getpaid_get_invoice_tax_rate( $invoice, $item ) {
1304 1304
 
1305 1305
     $rates   = getpaid_get_item_tax_rates( $item, $invoice->get_country(), $invoice->get_state() );
1306
-	$rates   = getpaid_filter_item_tax_rates( $item, $rates );
1306
+    $rates   = getpaid_filter_item_tax_rates( $item, $rates );
1307 1307
     $rates   = wp_list_pluck( $rates, 'rate' );
1308 1308
 
1309 1309
     return array_sum( $rates );
Please login to merge, or discard this patch.
includes/wpinv-general-functions.php 1 patch
Indentation   +73 added lines, -73 removed lines patch added patch discarded remove patch
@@ -31,16 +31,16 @@  discard block
 block discarded – undo
31 31
 }
32 32
 
33 33
 function wpinv_can_checkout() {
34
-	$can_checkout = true; // Always true for now
34
+    $can_checkout = true; // Always true for now
35 35
 
36
-	return (bool) apply_filters( 'wpinv_can_checkout', $can_checkout );
36
+    return (bool) apply_filters( 'wpinv_can_checkout', $can_checkout );
37 37
 }
38 38
 
39 39
 function wpinv_get_success_page_uri() {
40
-	$page_id = wpinv_get_option( 'success_page', 0 );
41
-	$page_id = absint( $page_id );
40
+    $page_id = wpinv_get_option( 'success_page', 0 );
41
+    $page_id = absint( $page_id );
42 42
 
43
-	return apply_filters( 'wpinv_get_success_page_uri', get_permalink( $page_id ) );
43
+    return apply_filters( 'wpinv_get_success_page_uri', get_permalink( $page_id ) );
44 44
 }
45 45
 
46 46
 /**
@@ -51,22 +51,22 @@  discard block
 block discarded – undo
51 51
  */
52 52
 function wpinv_get_history_page_uri( $post_type = 'wpi_invoice' ) {
53 53
     $post_type = sanitize_key( str_replace( 'wpi_', '', $post_type ) );
54
-	$page_id   = wpinv_get_option( "{$post_type}_history_page", 0 );
55
-	$page_id   = absint( $page_id );
56
-	return apply_filters( 'wpinv_get_history_page_uri', get_permalink( $page_id ), $post_type );
54
+    $page_id   = wpinv_get_option( "{$post_type}_history_page", 0 );
55
+    $page_id   = absint( $page_id );
56
+    return apply_filters( 'wpinv_get_history_page_uri', get_permalink( $page_id ), $post_type );
57 57
 }
58 58
 
59 59
 function wpinv_is_success_page() {
60
-	$is_success_page = wpinv_get_option( 'success_page', false );
61
-	$is_success_page = ! empty( $is_success_page ) ? is_page( $is_success_page ) : false;
60
+    $is_success_page = wpinv_get_option( 'success_page', false );
61
+    $is_success_page = ! empty( $is_success_page ) ? is_page( $is_success_page ) : false;
62 62
 
63
-	return apply_filters( 'wpinv_is_success_page', $is_success_page );
63
+    return apply_filters( 'wpinv_is_success_page', $is_success_page );
64 64
 }
65 65
 
66 66
 function wpinv_is_invoice_history_page() {
67
-	$ret = wpinv_get_option( 'invoice_history_page', false );
68
-	$ret = $ret ? is_page( $ret ) : false;
69
-	return apply_filters( 'wpinv_is_invoice_history_page', $ret );
67
+    $ret = wpinv_get_option( 'invoice_history_page', false );
68
+    $ret = $ret ? is_page( $ret ) : false;
69
+    return apply_filters( 'wpinv_is_invoice_history_page', $ret );
70 70
 }
71 71
 
72 72
 function wpinv_is_subscriptions_history_page() {
@@ -92,7 +92,7 @@  discard block
 block discarded – undo
92 92
 }
93 93
 
94 94
 function wpinv_send_to_failed_page( $args = null ) {
95
-	$redirect = wpinv_get_failed_transaction_uri();
95
+    $redirect = wpinv_get_failed_transaction_uri();
96 96
 
97 97
     if ( ! empty( $args ) ) {
98 98
         // Check for backward compatibility
@@ -113,58 +113,58 @@  discard block
 block discarded – undo
113 113
 }
114 114
 
115 115
 function wpinv_get_checkout_uri( $args = array() ) {
116
-	$uri = wpinv_get_option( 'checkout_page', false );
117
-	$uri = isset( $uri ) ? get_permalink( $uri ) : null;
116
+    $uri = wpinv_get_option( 'checkout_page', false );
117
+    $uri = isset( $uri ) ? get_permalink( $uri ) : null;
118 118
 
119
-	if ( ! empty( $args ) ) {
120
-		// Check for backward compatibility
121
-		if ( is_string( $args ) ) {
122
-			$args = str_replace( '?', '', $args );
119
+    if ( ! empty( $args ) ) {
120
+        // Check for backward compatibility
121
+        if ( is_string( $args ) ) {
122
+            $args = str_replace( '?', '', $args );
123 123
         }
124 124
 
125
-		$args = wp_parse_args( $args );
125
+        $args = wp_parse_args( $args );
126 126
 
127
-		$uri = add_query_arg( $args, $uri );
128
-	}
127
+        $uri = add_query_arg( $args, $uri );
128
+    }
129 129
 
130
-	$scheme = defined( 'FORCE_SSL_ADMIN' ) && FORCE_SSL_ADMIN ? 'https' : 'admin';
130
+    $scheme = defined( 'FORCE_SSL_ADMIN' ) && FORCE_SSL_ADMIN ? 'https' : 'admin';
131 131
 
132
-	$ajax_url = admin_url( 'admin-ajax.php', $scheme );
132
+    $ajax_url = admin_url( 'admin-ajax.php', $scheme );
133 133
 
134
-	if ( ( ! preg_match( '/^https/', $uri ) && preg_match( '/^https/', $ajax_url ) ) || wpinv_is_ssl_enforced() ) {
135
-		$uri = preg_replace( '/^http:/', 'https:', $uri );
136
-	}
134
+    if ( ( ! preg_match( '/^https/', $uri ) && preg_match( '/^https/', $ajax_url ) ) || wpinv_is_ssl_enforced() ) {
135
+        $uri = preg_replace( '/^http:/', 'https:', $uri );
136
+    }
137 137
 
138
-	return apply_filters( 'wpinv_get_checkout_uri', $uri );
138
+    return apply_filters( 'wpinv_get_checkout_uri', $uri );
139 139
 }
140 140
 
141 141
 function wpinv_get_success_page_url( $query_string = null ) {
142
-	$success_page = wpinv_get_option( 'success_page', 0 );
143
-	$success_page = get_permalink( $success_page );
142
+    $success_page = wpinv_get_option( 'success_page', 0 );
143
+    $success_page = get_permalink( $success_page );
144 144
 
145
-	if ( $query_string ) {
146
-		$success_page .= $query_string;
145
+    if ( $query_string ) {
146
+        $success_page .= $query_string;
147 147
     }
148 148
 
149
-	return apply_filters( 'wpinv_success_page_url', $success_page );
149
+    return apply_filters( 'wpinv_success_page_url', $success_page );
150 150
 }
151 151
 
152 152
 function wpinv_get_failed_transaction_uri( $extras = false ) {
153
-	$uri = wpinv_get_option( 'failure_page', '' );
154
-	$uri = ! empty( $uri ) ? trailingslashit( get_permalink( $uri ) ) : home_url();
153
+    $uri = wpinv_get_option( 'failure_page', '' );
154
+    $uri = ! empty( $uri ) ? trailingslashit( get_permalink( $uri ) ) : home_url();
155 155
 
156
-	if ( $extras ) {
157
-		$uri .= $extras;
156
+    if ( $extras ) {
157
+        $uri .= $extras;
158 158
     }
159 159
 
160
-	return apply_filters( 'wpinv_get_failed_transaction_uri', $uri );
160
+    return apply_filters( 'wpinv_get_failed_transaction_uri', $uri );
161 161
 }
162 162
 
163 163
 function wpinv_is_failed_transaction_page() {
164
-	$ret = wpinv_get_option( 'failure_page', false );
165
-	$ret = isset( $ret ) ? is_page( $ret ) : false;
164
+    $ret = wpinv_get_option( 'failure_page', false );
165
+    $ret = isset( $ret ) ? is_page( $ret ) : false;
166 166
 
167
-	return apply_filters( 'wpinv_is_failure_page', $ret );
167
+    return apply_filters( 'wpinv_is_failure_page', $ret );
168 168
 }
169 169
 
170 170
 function wpinv_transaction_query( $type = 'start' ) {
@@ -244,36 +244,36 @@  discard block
 block discarded – undo
244 244
     $require_billing_details = apply_filters( 'wpinv_checkout_required_billing_details', wpinv_use_taxes() );
245 245
 
246 246
     if ( $require_billing_details ) {
247
-		if ( (bool)wpinv_get_option( 'fname_mandatory' ) ) {
248
-			$required_fields['first_name'] = array(
249
-				'error_id'      => 'invalid_first_name',
250
-				'error_message' => __( 'Please enter your first name', 'invoicing' ),
251
-			);
252
-		}
253
-		if ( (bool)wpinv_get_option( 'address_mandatory' ) ) {
254
-			$required_fields['address'] = array(
255
-				'error_id'      => 'invalid_address',
256
-				'error_message' => __( 'Please enter your address', 'invoicing' ),
257
-			);
258
-		}
259
-		if ( (bool)wpinv_get_option( 'city_mandatory' ) ) {
260
-			$required_fields['city'] = array(
261
-				'error_id'      => 'invalid_city',
262
-				'error_message' => __( 'Please enter your billing city', 'invoicing' ),
263
-			);
264
-		}
265
-		if ( (bool)wpinv_get_option( 'state_mandatory' ) ) {
266
-			$required_fields['state'] = array(
267
-				'error_id'      => 'invalid_state',
268
-				'error_message' => __( 'Please enter billing state / province', 'invoicing' ),
269
-			);
270
-		}
271
-		if ( (bool)wpinv_get_option( 'country_mandatory' ) ) {
272
-			$required_fields['country'] = array(
273
-				'error_id'      => 'invalid_country',
274
-				'error_message' => __( 'Please select your billing country', 'invoicing' ),
275
-			);
276
-		}
247
+        if ( (bool)wpinv_get_option( 'fname_mandatory' ) ) {
248
+            $required_fields['first_name'] = array(
249
+                'error_id'      => 'invalid_first_name',
250
+                'error_message' => __( 'Please enter your first name', 'invoicing' ),
251
+            );
252
+        }
253
+        if ( (bool)wpinv_get_option( 'address_mandatory' ) ) {
254
+            $required_fields['address'] = array(
255
+                'error_id'      => 'invalid_address',
256
+                'error_message' => __( 'Please enter your address', 'invoicing' ),
257
+            );
258
+        }
259
+        if ( (bool)wpinv_get_option( 'city_mandatory' ) ) {
260
+            $required_fields['city'] = array(
261
+                'error_id'      => 'invalid_city',
262
+                'error_message' => __( 'Please enter your billing city', 'invoicing' ),
263
+            );
264
+        }
265
+        if ( (bool)wpinv_get_option( 'state_mandatory' ) ) {
266
+            $required_fields['state'] = array(
267
+                'error_id'      => 'invalid_state',
268
+                'error_message' => __( 'Please enter billing state / province', 'invoicing' ),
269
+            );
270
+        }
271
+        if ( (bool)wpinv_get_option( 'country_mandatory' ) ) {
272
+            $required_fields['country'] = array(
273
+                'error_id'      => 'invalid_country',
274
+                'error_message' => __( 'Please select your billing country', 'invoicing' ),
275
+            );
276
+        }
277 277
     }
278 278
 
279 279
     return apply_filters( 'wpinv_checkout_required_fields', $required_fields );
Please login to merge, or discard this patch.