Passed
Push — master ( bad3c1...1d1d3a )
by Kiran
12:03 queued 05:36
created
includes/api/class-getpaid-rest-report-sales-controller.php 2 patches
Indentation   +679 added lines, -679 removed lines patch added patch discarded remove patch
@@ -18,688 +18,688 @@
 block discarded – undo
18 18
  */
19 19
 class GetPaid_REST_Report_Sales_Controller extends GetPaid_REST_Date_Based_Controller {
20 20
 
21
-	/**
22
-	 * Route base.
23
-	 *
24
-	 * @var string
25
-	 */
26
-	protected $rest_base = 'reports/sales';
27
-
28
-	/**
29
-	 * The report data.
30
-	 *
31
-	 * @var stdClass
32
-	 */
33
-	public $report_data;
34
-
35
-	/**
36
-	 * The report range.
37
-	 *
38
-	 * @var array
39
-	 */
40
-	public $report_range;
41
-
42
-	/**
43
-	 * Registers the routes for the objects of the controller.
44
-	 *
45
-	 * @since 2.0.0
46
-	 *
47
-	 * @see register_rest_route()
48
-	 */
49
-	public function register_namespace_routes( $namespace ) {
50
-
51
-		// Get sales report.
52
-		register_rest_route(
53
-			$namespace,
54
-			$this->rest_base,
55
-			array(
56
-				array(
57
-					'methods'             => WP_REST_Server::READABLE,
58
-					'callback'            => array( $this, 'get_items' ),
59
-					'permission_callback' => array( $this, 'get_items_permissions_check' ),
60
-					'args'                => $this->get_collection_params(),
61
-				),
62
-				'schema' => array( $this, 'get_public_item_schema' ),
63
-			)
64
-		);
65
-
66
-	}
67
-
68
-	/**
69
-	 * Makes sure the current user has access to READ the report APIs.
70
-	 *
71
-	 * @since  2.0.0
72
-	 * @param WP_REST_Request $request Full data about the request.
73
-	 * @return WP_Error|boolean
74
-	 */
75
-	public function get_items_permissions_check( $request ) {
76
-
77
-		if ( ! wpinv_current_user_can_manage_invoicing() ) {
78
-			return new WP_Error( 'rest_cannot_view', __( 'Sorry, you cannot list resources.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
79
-		}
80
-
81
-		return true;
82
-	}
83
-
84
-	/**
85
-	 * Get sales reports.
86
-	 *
87
-	 * @param WP_REST_Request $request
88
-	 * @return array|WP_Error
89
-	 */
90
-	public function get_items( $request ) {
91
-		$data   = array();
92
-		$item   = $this->prepare_item_for_response( null, $request );
93
-		$data[] = $this->prepare_response_for_collection( $item );
94
-
95
-		return rest_ensure_response( $data );
96
-	}
97
-
98
-	/**
99
-	 * Prepare a report sales object for serialization.
100
-	 *
101
-	 * @param null $_
102
-	 * @param WP_REST_Request $request Request object.
103
-	 * @return WP_REST_Response $response Response data.
104
-	 */
105
-	public function prepare_item_for_response( $_, $request ) {
106
-
107
-		// Set report range.
108
-		$this->report_range = $this->get_date_range( $request );
109
-
110
-		$report_data     = $this->get_report_data();
111
-		$period_totals   = array();
112
-
113
-		// Setup period totals by ensuring each period in the interval has data.
114
-		$start_date      = strtotime( $this->report_range['after'] );
115
-
116
-		if ( 'month' === $this->groupby ) {
117
-			$start_date      = strtotime( gmdate( 'Y-m-01', $start_date ) );
118
-		}
119
-
120
-		for ( $i = 0; $i < $this->interval; $i++ ) {
121
-
122
-			switch ( $this->groupby ) {
123
-				case 'day':
124
-					$time = gmdate( 'Y-m-d', strtotime( "+{$i} DAY", $start_date ) );
125
-					break;
126
-				default:
127
-					$time = gmdate( 'Y-m', strtotime( "+{$i} MONTH", $start_date ) );
128
-					break;
129
-			}
130
-
131
-			// Set the defaults for each period.
132
-			$period_totals[ $time ] = array(
133
-				'invoices'          => 0,
134
-				'items'             => 0,
135
-				'refunded_items'    => 0,
136
-				'refunded_tax'      => wpinv_round_amount( 0.00 ),
137
-				'subtotal'          => wpinv_round_amount( 0.00 ),
138
-				'refunded_subtotal' => wpinv_round_amount( 0.00 ),
139
-				'refunded_fees'     => wpinv_round_amount( 0.00 ),
140
-				'discount'          => wpinv_round_amount( 0.00 ),
141
-			);
142
-
143
-			foreach ( array_keys( wpinv_get_report_graphs() ) as $key ) {
144
-				if ( ! isset( $period_totals[ $time ][ $key ] ) ) {
145
-					$period_totals[ $time ][ $key ] = wpinv_round_amount( 0.00 );
146
-				}
147
-			}
148
-		}
149
-
150
-		// add total sales, total invoice count, total tax for each period
151
-		$date_format = ( 'day' === $this->groupby ) ? 'Y-m-d' : 'Y-m';
152
-		foreach ( $report_data->invoices as $invoice ) {
153
-			$time = gmdate( $date_format, strtotime( $invoice->post_date ) );
154
-
155
-			if ( ! isset( $period_totals[ $time ] ) ) {
156
-				continue;
157
-			}
158
-
159
-			$period_totals[ $time ]['sales']    = wpinv_round_amount( $invoice->total_sales );
160
-			$period_totals[ $time ]['tax']      = wpinv_round_amount( $invoice->total_tax );
161
-			$period_totals[ $time ]['subtotal'] = wpinv_round_amount( $invoice->subtotal );
162
-			$period_totals[ $time ]['fees']     = wpinv_round_amount( $invoice->total_fees );
163
-
164
-		}
165
-
166
-		foreach ( $report_data->refunds as $invoice ) {
167
-			$time = gmdate( $date_format, strtotime( $invoice->post_date ) );
168
-
169
-			if ( ! isset( $period_totals[ $time ] ) ) {
170
-				continue;
171
-			}
172
-
173
-			$period_totals[ $time ]['refunds']           = wpinv_round_amount( $invoice->total_sales );
174
-			$period_totals[ $time ]['refunded_tax']      = wpinv_round_amount( $invoice->total_tax );
175
-			$period_totals[ $time ]['refunded_subtotal'] = wpinv_round_amount( $invoice->subtotal );
176
-			$period_totals[ $time ]['refunded_fees']     = wpinv_round_amount( $invoice->total_fees );
177
-
178
-		}
179
-
180
-		foreach ( $report_data->invoice_counts as $invoice ) {
181
-			$time = gmdate( $date_format, strtotime( $invoice->post_date ) );
182
-
183
-			if ( isset( $period_totals[ $time ] ) ) {
184
-				$period_totals[ $time ]['invoices']   = (int) $invoice->count;
185
-			}
186
-		}
187
-
188
-		// Add total invoice items for each period.
189
-		foreach ( $report_data->invoice_items as $invoice_item ) {
190
-			$time = ( 'day' === $this->groupby ) ? gmdate( 'Y-m-d', strtotime( $invoice_item->post_date ) ) : gmdate( 'Y-m', strtotime( $invoice_item->post_date ) );
191
-
192
-			if ( isset( $period_totals[ $time ] ) ) {
193
-				$period_totals[ $time ]['items'] = (int) $invoice_item->invoice_item_count;
194
-			}
195
-		}
196
-
197
-		// Add total discount for each period.
198
-		foreach ( $report_data->coupons as $discount ) {
199
-			$time = ( 'day' === $this->groupby ) ? gmdate( 'Y-m-d', strtotime( $discount->post_date ) ) : gmdate( 'Y-m', strtotime( $discount->post_date ) );
200
-
201
-			if ( isset( $period_totals[ $time ] ) ) {
202
-				$period_totals[ $time ]['discount'] = wpinv_round_amount( $discount->discount_amount );
203
-			}
204
-		}
205
-
206
-		// Extra fields.
207
-		foreach ( array_keys( wpinv_get_report_graphs() ) as $key ) {
208
-
209
-			// Abort unprepared.
210
-			if ( ! isset( $report_data->$key ) ) {
211
-				continue;
212
-			} 
213
-
214
-			// Abort defaults.
215
-			if ( in_array( $key, array( 'sales', 'refunds', 'tax', 'fees', 'discount', 'invoices', 'items' ) ) ) {
216
-				continue;
217
-			}
218
-
219
-			// Set values.
220
-			foreach ( $report_data->$key as $item ) {
221
-				$time = ( 'day' === $this->groupby ) ? gmdate( 'Y-m-d', strtotime( $item->date ) ) : gmdate( 'Y-m', strtotime( $item->date ) );
222
-
223
-				if ( isset( $period_totals[ $time ] ) ) {
224
-					$period_totals[ $time ][ $key ] = wpinv_round_amount( $item->val );
225
-				}
226
-			}
227
-
228
-			unset( $report_data->$key );
229
-		}
230
-
231
-		$report_data->totals            = $period_totals;
232
-		$report_data->grouped_by        = $this->groupby;
233
-		$report_data->interval          = max( $this->interval, 1 );
234
-		$report_data->currency          = wpinv_get_currency();
235
-		$report_data->currency_symbol   = wpinv_currency_symbol();
236
-		$report_data->currency_position = wpinv_currency_position();
237
-		$report_data->decimal_places    = wpinv_decimals();
238
-		$report_data->thousands_sep     = wpinv_thousands_separator();
239
-		$report_data->decimals_sep      = wpinv_decimal_separator();
240
-		$report_data->start_date        = gmdate( 'Y-m-d', strtotime( $this->report_range['after'] ) );
241
-		$report_data->end_date          = gmdate( 'Y-m-d', strtotime( $this->report_range['before'] ) );
242
-		$report_data->start_date_locale = getpaid_format_date( gmdate( 'Y-m-d', strtotime( $this->report_range['after'] ) ) );
243
-		$report_data->end_date_locale   = getpaid_format_date( gmdate( 'Y-m-d', strtotime( $this->report_range['before'] ) ) );
244
-		$report_data->decimals_sep      = wpinv_decimal_separator();
245
-
246
-		$context = ! empty( $request['context'] ) ? $request['context'] : 'view';
247
-		$data    = $report_data;
248
-		unset( $data->invoice_counts, $data->invoices, $data->coupons, $data->refunds, $data->invoice_items );
249
-		$data    = $this->add_additional_fields_to_object( (array) $data, $request );
250
-		$data    = $this->filter_response_by_context( $data, $context );
251
-
252
-		// Wrap the data in a response object.
253
-		$response = rest_ensure_response( $data );
254
-		$response->add_links(
21
+    /**
22
+     * Route base.
23
+     *
24
+     * @var string
25
+     */
26
+    protected $rest_base = 'reports/sales';
27
+
28
+    /**
29
+     * The report data.
30
+     *
31
+     * @var stdClass
32
+     */
33
+    public $report_data;
34
+
35
+    /**
36
+     * The report range.
37
+     *
38
+     * @var array
39
+     */
40
+    public $report_range;
41
+
42
+    /**
43
+     * Registers the routes for the objects of the controller.
44
+     *
45
+     * @since 2.0.0
46
+     *
47
+     * @see register_rest_route()
48
+     */
49
+    public function register_namespace_routes( $namespace ) {
50
+
51
+        // Get sales report.
52
+        register_rest_route(
53
+            $namespace,
54
+            $this->rest_base,
255 55
             array(
256
-				'about' => array(
257
-					'href' => rest_url( sprintf( '%s/reports', $this->namespace ) ),
258
-				),
56
+                array(
57
+                    'methods'             => WP_REST_Server::READABLE,
58
+                    'callback'            => array( $this, 'get_items' ),
59
+                    'permission_callback' => array( $this, 'get_items_permissions_check' ),
60
+                    'args'                => $this->get_collection_params(),
61
+                ),
62
+                'schema' => array( $this, 'get_public_item_schema' ),
259 63
             )
260 64
         );
261 65
 
262
-		return apply_filters( 'getpaid_rest_prepare_report_sales', $response, $report_data, $request );
263
-	}
264
-
265
-	/**
266
-	 * Get report data.
267
-	 *
268
-	 * @return stdClass
269
-	 */
270
-	public function get_report_data() {
271
-		if ( empty( $this->report_data ) ) {
272
-			$this->query_report_data();
273
-		}
274
-		return $this->report_data;
275
-	}
276
-
277
-	/**
278
-	 * Get all data needed for this report and store in the class.
279
-	 */
280
-	protected function query_report_data() {
281
-
282
-		// Prepare reports.
283
-		$this->report_data = (object) array(
284
-			'invoice_counts' => $this->query_invoice_counts(), //count, post_date
285
-			'coupons'        => $this->query_coupon_counts(), // discount_amount, post_date
286
-			'invoice_items'  => $this->query_item_counts(), // invoice_item_count, post_date
287
-			'refunded_items' => $this->count_refunded_items(), // invoice_item_count, post_date
288
-			'invoices'       => $this->query_invoice_totals(), // total_sales, total_tax, total_discount, total_fees, subtotal, post_date
289
-			'refunds'        => $this->query_refunded_totals(), // total_sales, total_tax, total_discount, total_fees, subtotal, post_date
290
-			'previous_range' => $this->previous_range,
291
-		);
292
-
293
-		// Calculated totals.
294
-		$this->report_data->total_tax          = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->invoices, 'total_tax' ) ) );
295
-		$this->report_data->total_sales        = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->invoices, 'total_sales' ) ) );
296
-		$this->report_data->total_discount     = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->invoices, 'total_discount' ) ) );
297
-		$this->report_data->total_fees         = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->invoices, 'total_fees' ) ) );
298
-		$this->report_data->subtotal           = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->invoices, 'subtotal' ) ) );
299
-		$this->report_data->net_sales          = wpinv_round_amount( $this->report_data->total_sales - max( 0, $this->report_data->total_tax ) );
300
-		$this->report_data->total_refunded_tax = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->refunds, 'total_tax' ) ) );
301
-		$this->report_data->total_refunds      = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->refunds, 'total_sales' ) ) );
302
-		$this->report_data->refunded_discount  = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->refunds, 'total_discount' ) ) );
303
-		$this->report_data->refunded_fees      = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->refunds, 'total_fees' ) ) );
304
-		$this->report_data->refunded_subtotal  = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->refunds, 'subtotal' ) ) );
305
-		$this->report_data->net_refunds        = wpinv_round_amount( $this->report_data->total_refunds + max( 0, $this->report_data->total_refunded_tax ) );
306
-
307
-		// Calculate average based on net.
308
-		$this->report_data->average_sales       = wpinv_round_amount( $this->report_data->net_sales / max( $this->interval, 1 ), 2 );
309
-		$this->report_data->average_total_sales = wpinv_round_amount( $this->report_data->total_sales / max( $this->interval, 1 ), 2 );
310
-
311
-		// Total invoices in this period, even if refunded.
312
-		$this->report_data->total_invoices = absint( array_sum( wp_list_pluck( $this->report_data->invoice_counts, 'count' ) ) );
313
-
314
-		// Items invoiced in this period, even if refunded.
315
-		$this->report_data->total_items = absint( array_sum( wp_list_pluck( $this->report_data->invoice_items, 'invoice_item_count' ) ) );
316
-
317
-		// 3rd party filtering of report data
318
-		$this->report_data = apply_filters( 'getpaid_rest_api_filter_report_data', $this->report_data, $this );
319
-	}
320
-
321
-	/**
322
-	 * Prepares invoice counts.
323
-	 *
324
-	 * @return array.
325
-	 */
326
-	protected function query_invoice_counts() {
327
-
328
-		return (array) GetPaid_Reports_Helper::get_invoice_report_data(
329
-			array(
330
-				'data'           => array(
331
-					'ID'        => array(
332
-						'type'     => 'post_data',
333
-						'function' => 'COUNT',
334
-						'name'     => 'count',
335
-						'distinct' => true,
336
-					),
337
-					'post_date' => array(
338
-						'type'     => 'post_data',
339
-						'function' => 'MIN',
340
-						'name'     => 'post_date',
341
-					),
342
-				),
343
-				'group_by'       => $this->get_group_by_sql( 'posts.post_date' ),
344
-				'order_by'       => 'post_date ASC',
345
-				'query_type'     => 'get_results',
346
-				'filter_range'   => $this->report_range,
347
-				'invoice_status' => array( 'publish', 'wpi-processing', 'wpi-onhold', 'wpi-refunded', 'wpi-renewal' ),
348
-			)
349
-		);
350
-
351
-	}
352
-
353
-	/**
354
-	 * Prepares coupon counts.
355
-	 *
356
-	 * @return array.
357
-	 */
358
-	protected function query_coupon_counts() {
359
-
360
-		return (array) GetPaid_Reports_Helper::get_invoice_report_data(
361
-			array(
362
-				'data'           => array(
363
-					'discount'  => array(
364
-						'type'     => 'invoice_data',
365
-						'function' => 'SUM',
366
-						'name'     => 'discount_amount',
367
-					),
368
-					'post_date' => array(
369
-						'type'     => 'post_data',
370
-						'function' => 'MIN',
371
-						'name'     => 'post_date',
372
-					),
373
-				),
374
-				'group_by'       => $this->get_group_by_sql( 'posts.post_date' ),
375
-				'order_by'       => 'post_date ASC',
376
-				'query_type'     => 'get_results',
377
-				'filter_range'   => $this->report_range,
378
-				'invoice_status' => array( 'publish', 'wpi-processing', 'wpi-onhold', 'wpi-refunded', 'wpi-renewal' ),
379
-			)
380
-		);
381
-
382
-	}
383
-
384
-	/**
385
-	 * Prepares item counts.
386
-	 *
387
-	 * @return array.
388
-	 */
389
-	protected function query_item_counts() {
390
-
391
-		return (array) GetPaid_Reports_Helper::get_invoice_report_data(
392
-			array(
393
-				'data'           => array(
394
-					'quantity'  => array(
395
-						'type'     => 'invoice_item',
396
-						'function' => 'SUM',
397
-						'name'     => 'invoice_item_count',
398
-					),
399
-					'post_date' => array(
400
-						'type'     => 'post_data',
401
-						'function' => 'MIN',
402
-						'name'     => 'post_date',
403
-					),
404
-				),
405
-				'group_by'       => $this->get_group_by_sql( 'posts.post_date' ),
406
-				'order_by'       => 'post_date ASC',
407
-				'query_type'     => 'get_results',
408
-				'filter_range'   => $this->report_range,
409
-				'invoice_status' => array( 'publish', 'wpi-processing', 'wpi-onhold', 'wpi-refunded', 'wpi-renewal' ),
410
-			)
411
-		);
412
-
413
-	}
414
-
415
-	/**
416
-	 * Prepares refunded item counts.
417
-	 *
418
-	 * @return array.
419
-	 */
420
-	protected function count_refunded_items() {
421
-
422
-		return (int) GetPaid_Reports_Helper::get_invoice_report_data(
423
-			array(
424
-				'data'           => array(
425
-					'quantity' => array(
426
-						'type'     => 'invoice_item',
427
-						'function' => 'SUM',
428
-						'name'     => 'invoice_item_count',
429
-					),
430
-				),
431
-				'query_type'     => 'get_var',
432
-				'filter_range'   => $this->report_range,
433
-				'invoice_status' => array( 'wpi-refunded' ),
434
-			)
435
-		);
436
-
437
-	}
438
-
439
-	/**
440
-	 * Prepares daily invoice totals.
441
-	 *
442
-	 * @return array.
443
-	 */
444
-	protected function query_invoice_totals() {
445
-
446
-		return (array) GetPaid_Reports_Helper::get_invoice_report_data(
447
-			array(
448
-				'data'           => array(
449
-					'total'      => array(
450
-						'type'     => 'invoice_data',
451
-						'function' => 'SUM',
452
-						'name'     => 'total_sales',
453
-					),
454
-					'tax'        => array(
455
-						'type'     => 'invoice_data',
456
-						'function' => 'SUM',
457
-						'name'     => 'total_tax',
458
-					),
459
-					'discount'   => array(
460
-						'type'     => 'invoice_data',
461
-						'function' => 'SUM',
462
-						'name'     => 'total_discount',
463
-					),
464
-					'fees_total' => array(
465
-						'type'     => 'invoice_data',
466
-						'function' => 'SUM',
467
-						'name'     => 'total_fees',
468
-					),
469
-					'subtotal'   => array(
470
-						'type'     => 'invoice_data',
471
-						'function' => 'SUM',
472
-						'name'     => 'subtotal',
473
-					),
474
-					'post_date'  => array(
475
-						'type'     => 'post_data',
476
-						'function' => '',
477
-						'name'     => 'post_date',
478
-					),
479
-				),
480
-				'group_by'       => $this->get_group_by_sql( 'posts.post_date' ),
481
-				'order_by'       => 'post_date ASC',
482
-				'query_type'     => 'get_results',
483
-				'filter_range'   => $this->report_range,
484
-				'invoice_status' => array( 'publish', 'wpi-processing', 'wpi-onhold', 'wpi-renewal' ),
485
-			)
486
-		);
487
-
488
-	}
489
-
490
-	/**
491
-	 * Prepares daily invoice totals.
492
-	 *
493
-	 * @return array.
494
-	 */
495
-	protected function query_refunded_totals() {
496
-
497
-		return (array) GetPaid_Reports_Helper::get_invoice_report_data(
498
-			array(
499
-				'data'           => array(
500
-					'total'      => array(
501
-						'type'     => 'invoice_data',
502
-						'function' => 'SUM',
503
-						'name'     => 'total_sales',
504
-					),
505
-					'tax'        => array(
506
-						'type'     => 'invoice_data',
507
-						'function' => 'SUM',
508
-						'name'     => 'total_tax',
509
-					),
510
-					'discount'   => array(
511
-						'type'     => 'invoice_data',
512
-						'function' => 'SUM',
513
-						'name'     => 'total_discount',
514
-					),
515
-					'fees_total' => array(
516
-						'type'     => 'invoice_data',
517
-						'function' => 'SUM',
518
-						'name'     => 'total_fees',
519
-					),
520
-					'subtotal'   => array(
521
-						'type'     => 'invoice_data',
522
-						'function' => 'SUM',
523
-						'name'     => 'subtotal',
524
-					),
525
-					'post_date'  => array(
526
-						'type'     => 'post_data',
527
-						'function' => '',
528
-						'name'     => 'post_date',
529
-					),
530
-				),
531
-				'group_by'       => $this->get_group_by_sql( 'posts.post_date' ),
532
-				'order_by'       => 'post_date ASC',
533
-				'query_type'     => 'get_results',
534
-				'filter_range'   => $this->report_range,
535
-				'invoice_status' => array( 'wpi-refunded' ),
536
-			)
537
-		);
538
-
539
-	}
540
-
541
-	/**
542
-	 * Get the Report's schema, conforming to JSON Schema.
543
-	 *
544
-	 * @return array
545
-	 */
546
-	public function get_item_schema() {
547
-
548
-		$schema = array(
549
-			'$schema'    => 'http://json-schema.org/draft-04/schema#',
550
-			'title'      => 'sales_report',
551
-			'type'       => 'object',
552
-			'properties' => array(
553
-				'total_sales'         => array(
554
-					'description' => __( 'Gross sales in the period.', 'invoicing' ),
555
-					'type'        => 'string',
556
-					'context'     => array( 'view' ),
557
-					'readonly'    => true,
558
-				),
559
-				'net_sales'           => array(
560
-					'description' => __( 'Net sales in the period.', 'invoicing' ),
561
-					'type'        => 'string',
562
-					'context'     => array( 'view' ),
563
-					'readonly'    => true,
564
-				),
565
-				'average_sales'       => array(
566
-					'description' => __( 'Average net daily sales.', 'invoicing' ),
567
-					'type'        => 'string',
568
-					'context'     => array( 'view' ),
569
-					'readonly'    => true,
570
-				),
571
-				'average_total_sales' => array(
572
-					'description' => __( 'Average gross daily sales.', 'invoicing' ),
573
-					'type'        => 'string',
574
-					'context'     => array( 'view' ),
575
-					'readonly'    => true,
576
-				),
577
-				'total_invoices'      => array(
578
-					'description' => __( 'Number of paid invoices.', 'invoicing' ),
579
-					'type'        => 'integer',
580
-					'context'     => array( 'view' ),
581
-					'readonly'    => true,
582
-				),
583
-				'total_items'         => array(
584
-					'description' => __( 'Number of items purchased.', 'invoicing' ),
585
-					'type'        => 'integer',
586
-					'context'     => array( 'view' ),
587
-					'readonly'    => true,
588
-				),
589
-				'refunded_items'      => array(
590
-					'description' => __( 'Number of items refunded.', 'invoicing' ),
591
-					'type'        => 'integer',
592
-					'context'     => array( 'view' ),
593
-					'readonly'    => true,
594
-				),
595
-				'total_tax'           => array(
596
-					'description' => __( 'Total charged for taxes.', 'invoicing' ),
597
-					'type'        => 'string',
598
-					'context'     => array( 'view' ),
599
-					'readonly'    => true,
600
-				),
601
-				'total_refunded_tax'  => array(
602
-					'description' => __( 'Total refunded for taxes.', 'invoicing' ),
603
-					'type'        => 'string',
604
-					'context'     => array( 'view' ),
605
-					'readonly'    => true,
606
-				),
607
-				'total_fees'          => array(
608
-					'description' => __( 'Total fees charged.', 'invoicing' ),
609
-					'type'        => 'string',
610
-					'context'     => array( 'view' ),
611
-					'readonly'    => true,
612
-				),
613
-				'total_refunds'       => array(
614
-					'description' => __( 'Total of refunded invoices.', 'invoicing' ),
615
-					'type'        => 'integer',
616
-					'context'     => array( 'view' ),
617
-					'readonly'    => true,
618
-				),
619
-				'net_refunds'         => array(
620
-					'description' => __( 'Net of refunded invoices.', 'invoicing' ),
621
-					'type'        => 'integer',
622
-					'context'     => array( 'view' ),
623
-					'readonly'    => true,
624
-				),
625
-				'total_discount'      => array(
626
-					'description' => __( 'Total of discounts used.', 'invoicing' ),
627
-					'type'        => 'integer',
628
-					'context'     => array( 'view' ),
629
-					'readonly'    => true,
630
-				),
631
-				'totals'              => array(
632
-					'description' => __( 'Totals.', 'invoicing' ),
633
-					'type'        => 'array',
634
-					'items'       => array(
635
-						'type' => 'array',
636
-					),
637
-					'context'     => array( 'view' ),
638
-					'readonly'    => true,
639
-				),
640
-				'interval'            => array(
641
-					'description' => __( 'Number of months/days in the report period.', 'invoicing' ),
642
-					'type'        => 'integer',
643
-					'context'     => array( 'view' ),
644
-					'readonly'    => true,
645
-				),
646
-				'previous_range'      => array(
647
-					'description' => __( 'The previous report period.', 'invoicing' ),
648
-					'type'        => 'array',
649
-					'items'       => array(
650
-						'type' => 'string',
651
-					),
652
-					'context'     => array( 'view' ),
653
-					'readonly'    => true,
654
-				),
655
-				'grouped_by'          => array(
656
-					'description' => __( 'The period used to group the totals.', 'invoicing' ),
657
-					'type'        => 'string',
658
-					'context'     => array( 'view' ),
659
-					'enum'        => array( 'day', 'month' ),
660
-					'readonly'    => true,
661
-				),
662
-				'currency'            => array(
663
-					'description' => __( 'The default store currency.', 'invoicing' ),
664
-					'type'        => 'string',
665
-					'context'     => array( 'view' ),
666
-					'readonly'    => true,
667
-				),
668
-				'currency_symbol'     => array(
669
-					'description' => __( 'The default store currency symbol.', 'invoicing' ),
670
-					'type'        => 'string',
671
-					'context'     => array( 'view' ),
672
-					'readonly'    => true,
673
-				),
674
-				'currency_position'   => array(
675
-					'description' => __( 'The default store currency position.', 'invoicing' ),
676
-					'type'        => 'string',
677
-					'context'     => array( 'view' ),
678
-					'readonly'    => true,
679
-				),
680
-				'decimal_places'      => array(
681
-					'description' => __( 'The default store decimal places.', 'invoicing' ),
682
-					'type'        => 'string',
683
-					'context'     => array( 'view' ),
684
-					'readonly'    => true,
685
-				),
686
-				'thousands_sep'       => array(
687
-					'description' => __( 'The default store thousands separator.', 'invoicing' ),
688
-					'type'        => 'string',
689
-					'context'     => array( 'view' ),
690
-					'readonly'    => true,
691
-				),
692
-				'decimals_sep'        => array(
693
-					'description' => __( 'The default store decimals separator.', 'invoicing' ),
694
-					'type'        => 'string',
695
-					'context'     => array( 'view' ),
696
-					'readonly'    => true,
697
-				),
698
-			),
699
-		);
700
-
701
-		return $this->add_additional_fields_schema( $schema );
702
-
703
-	}
66
+    }
67
+
68
+    /**
69
+     * Makes sure the current user has access to READ the report APIs.
70
+     *
71
+     * @since  2.0.0
72
+     * @param WP_REST_Request $request Full data about the request.
73
+     * @return WP_Error|boolean
74
+     */
75
+    public function get_items_permissions_check( $request ) {
76
+
77
+        if ( ! wpinv_current_user_can_manage_invoicing() ) {
78
+            return new WP_Error( 'rest_cannot_view', __( 'Sorry, you cannot list resources.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
79
+        }
80
+
81
+        return true;
82
+    }
83
+
84
+    /**
85
+     * Get sales reports.
86
+     *
87
+     * @param WP_REST_Request $request
88
+     * @return array|WP_Error
89
+     */
90
+    public function get_items( $request ) {
91
+        $data   = array();
92
+        $item   = $this->prepare_item_for_response( null, $request );
93
+        $data[] = $this->prepare_response_for_collection( $item );
94
+
95
+        return rest_ensure_response( $data );
96
+    }
97
+
98
+    /**
99
+     * Prepare a report sales object for serialization.
100
+     *
101
+     * @param null $_
102
+     * @param WP_REST_Request $request Request object.
103
+     * @return WP_REST_Response $response Response data.
104
+     */
105
+    public function prepare_item_for_response( $_, $request ) {
106
+
107
+        // Set report range.
108
+        $this->report_range = $this->get_date_range( $request );
109
+
110
+        $report_data     = $this->get_report_data();
111
+        $period_totals   = array();
112
+
113
+        // Setup period totals by ensuring each period in the interval has data.
114
+        $start_date      = strtotime( $this->report_range['after'] );
115
+
116
+        if ( 'month' === $this->groupby ) {
117
+            $start_date      = strtotime( gmdate( 'Y-m-01', $start_date ) );
118
+        }
119
+
120
+        for ( $i = 0; $i < $this->interval; $i++ ) {
121
+
122
+            switch ( $this->groupby ) {
123
+                case 'day':
124
+                    $time = gmdate( 'Y-m-d', strtotime( "+{$i} DAY", $start_date ) );
125
+                    break;
126
+                default:
127
+                    $time = gmdate( 'Y-m', strtotime( "+{$i} MONTH", $start_date ) );
128
+                    break;
129
+            }
130
+
131
+            // Set the defaults for each period.
132
+            $period_totals[ $time ] = array(
133
+                'invoices'          => 0,
134
+                'items'             => 0,
135
+                'refunded_items'    => 0,
136
+                'refunded_tax'      => wpinv_round_amount( 0.00 ),
137
+                'subtotal'          => wpinv_round_amount( 0.00 ),
138
+                'refunded_subtotal' => wpinv_round_amount( 0.00 ),
139
+                'refunded_fees'     => wpinv_round_amount( 0.00 ),
140
+                'discount'          => wpinv_round_amount( 0.00 ),
141
+            );
142
+
143
+            foreach ( array_keys( wpinv_get_report_graphs() ) as $key ) {
144
+                if ( ! isset( $period_totals[ $time ][ $key ] ) ) {
145
+                    $period_totals[ $time ][ $key ] = wpinv_round_amount( 0.00 );
146
+                }
147
+            }
148
+        }
149
+
150
+        // add total sales, total invoice count, total tax for each period
151
+        $date_format = ( 'day' === $this->groupby ) ? 'Y-m-d' : 'Y-m';
152
+        foreach ( $report_data->invoices as $invoice ) {
153
+            $time = gmdate( $date_format, strtotime( $invoice->post_date ) );
154
+
155
+            if ( ! isset( $period_totals[ $time ] ) ) {
156
+                continue;
157
+            }
158
+
159
+            $period_totals[ $time ]['sales']    = wpinv_round_amount( $invoice->total_sales );
160
+            $period_totals[ $time ]['tax']      = wpinv_round_amount( $invoice->total_tax );
161
+            $period_totals[ $time ]['subtotal'] = wpinv_round_amount( $invoice->subtotal );
162
+            $period_totals[ $time ]['fees']     = wpinv_round_amount( $invoice->total_fees );
163
+
164
+        }
165
+
166
+        foreach ( $report_data->refunds as $invoice ) {
167
+            $time = gmdate( $date_format, strtotime( $invoice->post_date ) );
168
+
169
+            if ( ! isset( $period_totals[ $time ] ) ) {
170
+                continue;
171
+            }
172
+
173
+            $period_totals[ $time ]['refunds']           = wpinv_round_amount( $invoice->total_sales );
174
+            $period_totals[ $time ]['refunded_tax']      = wpinv_round_amount( $invoice->total_tax );
175
+            $period_totals[ $time ]['refunded_subtotal'] = wpinv_round_amount( $invoice->subtotal );
176
+            $period_totals[ $time ]['refunded_fees']     = wpinv_round_amount( $invoice->total_fees );
177
+
178
+        }
179
+
180
+        foreach ( $report_data->invoice_counts as $invoice ) {
181
+            $time = gmdate( $date_format, strtotime( $invoice->post_date ) );
182
+
183
+            if ( isset( $period_totals[ $time ] ) ) {
184
+                $period_totals[ $time ]['invoices']   = (int) $invoice->count;
185
+            }
186
+        }
187
+
188
+        // Add total invoice items for each period.
189
+        foreach ( $report_data->invoice_items as $invoice_item ) {
190
+            $time = ( 'day' === $this->groupby ) ? gmdate( 'Y-m-d', strtotime( $invoice_item->post_date ) ) : gmdate( 'Y-m', strtotime( $invoice_item->post_date ) );
191
+
192
+            if ( isset( $period_totals[ $time ] ) ) {
193
+                $period_totals[ $time ]['items'] = (int) $invoice_item->invoice_item_count;
194
+            }
195
+        }
196
+
197
+        // Add total discount for each period.
198
+        foreach ( $report_data->coupons as $discount ) {
199
+            $time = ( 'day' === $this->groupby ) ? gmdate( 'Y-m-d', strtotime( $discount->post_date ) ) : gmdate( 'Y-m', strtotime( $discount->post_date ) );
200
+
201
+            if ( isset( $period_totals[ $time ] ) ) {
202
+                $period_totals[ $time ]['discount'] = wpinv_round_amount( $discount->discount_amount );
203
+            }
204
+        }
205
+
206
+        // Extra fields.
207
+        foreach ( array_keys( wpinv_get_report_graphs() ) as $key ) {
208
+
209
+            // Abort unprepared.
210
+            if ( ! isset( $report_data->$key ) ) {
211
+                continue;
212
+            } 
213
+
214
+            // Abort defaults.
215
+            if ( in_array( $key, array( 'sales', 'refunds', 'tax', 'fees', 'discount', 'invoices', 'items' ) ) ) {
216
+                continue;
217
+            }
218
+
219
+            // Set values.
220
+            foreach ( $report_data->$key as $item ) {
221
+                $time = ( 'day' === $this->groupby ) ? gmdate( 'Y-m-d', strtotime( $item->date ) ) : gmdate( 'Y-m', strtotime( $item->date ) );
222
+
223
+                if ( isset( $period_totals[ $time ] ) ) {
224
+                    $period_totals[ $time ][ $key ] = wpinv_round_amount( $item->val );
225
+                }
226
+            }
227
+
228
+            unset( $report_data->$key );
229
+        }
230
+
231
+        $report_data->totals            = $period_totals;
232
+        $report_data->grouped_by        = $this->groupby;
233
+        $report_data->interval          = max( $this->interval, 1 );
234
+        $report_data->currency          = wpinv_get_currency();
235
+        $report_data->currency_symbol   = wpinv_currency_symbol();
236
+        $report_data->currency_position = wpinv_currency_position();
237
+        $report_data->decimal_places    = wpinv_decimals();
238
+        $report_data->thousands_sep     = wpinv_thousands_separator();
239
+        $report_data->decimals_sep      = wpinv_decimal_separator();
240
+        $report_data->start_date        = gmdate( 'Y-m-d', strtotime( $this->report_range['after'] ) );
241
+        $report_data->end_date          = gmdate( 'Y-m-d', strtotime( $this->report_range['before'] ) );
242
+        $report_data->start_date_locale = getpaid_format_date( gmdate( 'Y-m-d', strtotime( $this->report_range['after'] ) ) );
243
+        $report_data->end_date_locale   = getpaid_format_date( gmdate( 'Y-m-d', strtotime( $this->report_range['before'] ) ) );
244
+        $report_data->decimals_sep      = wpinv_decimal_separator();
245
+
246
+        $context = ! empty( $request['context'] ) ? $request['context'] : 'view';
247
+        $data    = $report_data;
248
+        unset( $data->invoice_counts, $data->invoices, $data->coupons, $data->refunds, $data->invoice_items );
249
+        $data    = $this->add_additional_fields_to_object( (array) $data, $request );
250
+        $data    = $this->filter_response_by_context( $data, $context );
251
+
252
+        // Wrap the data in a response object.
253
+        $response = rest_ensure_response( $data );
254
+        $response->add_links(
255
+            array(
256
+                'about' => array(
257
+                    'href' => rest_url( sprintf( '%s/reports', $this->namespace ) ),
258
+                ),
259
+            )
260
+        );
261
+
262
+        return apply_filters( 'getpaid_rest_prepare_report_sales', $response, $report_data, $request );
263
+    }
264
+
265
+    /**
266
+     * Get report data.
267
+     *
268
+     * @return stdClass
269
+     */
270
+    public function get_report_data() {
271
+        if ( empty( $this->report_data ) ) {
272
+            $this->query_report_data();
273
+        }
274
+        return $this->report_data;
275
+    }
276
+
277
+    /**
278
+     * Get all data needed for this report and store in the class.
279
+     */
280
+    protected function query_report_data() {
281
+
282
+        // Prepare reports.
283
+        $this->report_data = (object) array(
284
+            'invoice_counts' => $this->query_invoice_counts(), //count, post_date
285
+            'coupons'        => $this->query_coupon_counts(), // discount_amount, post_date
286
+            'invoice_items'  => $this->query_item_counts(), // invoice_item_count, post_date
287
+            'refunded_items' => $this->count_refunded_items(), // invoice_item_count, post_date
288
+            'invoices'       => $this->query_invoice_totals(), // total_sales, total_tax, total_discount, total_fees, subtotal, post_date
289
+            'refunds'        => $this->query_refunded_totals(), // total_sales, total_tax, total_discount, total_fees, subtotal, post_date
290
+            'previous_range' => $this->previous_range,
291
+        );
292
+
293
+        // Calculated totals.
294
+        $this->report_data->total_tax          = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->invoices, 'total_tax' ) ) );
295
+        $this->report_data->total_sales        = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->invoices, 'total_sales' ) ) );
296
+        $this->report_data->total_discount     = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->invoices, 'total_discount' ) ) );
297
+        $this->report_data->total_fees         = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->invoices, 'total_fees' ) ) );
298
+        $this->report_data->subtotal           = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->invoices, 'subtotal' ) ) );
299
+        $this->report_data->net_sales          = wpinv_round_amount( $this->report_data->total_sales - max( 0, $this->report_data->total_tax ) );
300
+        $this->report_data->total_refunded_tax = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->refunds, 'total_tax' ) ) );
301
+        $this->report_data->total_refunds      = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->refunds, 'total_sales' ) ) );
302
+        $this->report_data->refunded_discount  = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->refunds, 'total_discount' ) ) );
303
+        $this->report_data->refunded_fees      = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->refunds, 'total_fees' ) ) );
304
+        $this->report_data->refunded_subtotal  = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->refunds, 'subtotal' ) ) );
305
+        $this->report_data->net_refunds        = wpinv_round_amount( $this->report_data->total_refunds + max( 0, $this->report_data->total_refunded_tax ) );
306
+
307
+        // Calculate average based on net.
308
+        $this->report_data->average_sales       = wpinv_round_amount( $this->report_data->net_sales / max( $this->interval, 1 ), 2 );
309
+        $this->report_data->average_total_sales = wpinv_round_amount( $this->report_data->total_sales / max( $this->interval, 1 ), 2 );
310
+
311
+        // Total invoices in this period, even if refunded.
312
+        $this->report_data->total_invoices = absint( array_sum( wp_list_pluck( $this->report_data->invoice_counts, 'count' ) ) );
313
+
314
+        // Items invoiced in this period, even if refunded.
315
+        $this->report_data->total_items = absint( array_sum( wp_list_pluck( $this->report_data->invoice_items, 'invoice_item_count' ) ) );
316
+
317
+        // 3rd party filtering of report data
318
+        $this->report_data = apply_filters( 'getpaid_rest_api_filter_report_data', $this->report_data, $this );
319
+    }
320
+
321
+    /**
322
+     * Prepares invoice counts.
323
+     *
324
+     * @return array.
325
+     */
326
+    protected function query_invoice_counts() {
327
+
328
+        return (array) GetPaid_Reports_Helper::get_invoice_report_data(
329
+            array(
330
+                'data'           => array(
331
+                    'ID'        => array(
332
+                        'type'     => 'post_data',
333
+                        'function' => 'COUNT',
334
+                        'name'     => 'count',
335
+                        'distinct' => true,
336
+                    ),
337
+                    'post_date' => array(
338
+                        'type'     => 'post_data',
339
+                        'function' => 'MIN',
340
+                        'name'     => 'post_date',
341
+                    ),
342
+                ),
343
+                'group_by'       => $this->get_group_by_sql( 'posts.post_date' ),
344
+                'order_by'       => 'post_date ASC',
345
+                'query_type'     => 'get_results',
346
+                'filter_range'   => $this->report_range,
347
+                'invoice_status' => array( 'publish', 'wpi-processing', 'wpi-onhold', 'wpi-refunded', 'wpi-renewal' ),
348
+            )
349
+        );
350
+
351
+    }
352
+
353
+    /**
354
+     * Prepares coupon counts.
355
+     *
356
+     * @return array.
357
+     */
358
+    protected function query_coupon_counts() {
359
+
360
+        return (array) GetPaid_Reports_Helper::get_invoice_report_data(
361
+            array(
362
+                'data'           => array(
363
+                    'discount'  => array(
364
+                        'type'     => 'invoice_data',
365
+                        'function' => 'SUM',
366
+                        'name'     => 'discount_amount',
367
+                    ),
368
+                    'post_date' => array(
369
+                        'type'     => 'post_data',
370
+                        'function' => 'MIN',
371
+                        'name'     => 'post_date',
372
+                    ),
373
+                ),
374
+                'group_by'       => $this->get_group_by_sql( 'posts.post_date' ),
375
+                'order_by'       => 'post_date ASC',
376
+                'query_type'     => 'get_results',
377
+                'filter_range'   => $this->report_range,
378
+                'invoice_status' => array( 'publish', 'wpi-processing', 'wpi-onhold', 'wpi-refunded', 'wpi-renewal' ),
379
+            )
380
+        );
381
+
382
+    }
383
+
384
+    /**
385
+     * Prepares item counts.
386
+     *
387
+     * @return array.
388
+     */
389
+    protected function query_item_counts() {
390
+
391
+        return (array) GetPaid_Reports_Helper::get_invoice_report_data(
392
+            array(
393
+                'data'           => array(
394
+                    'quantity'  => array(
395
+                        'type'     => 'invoice_item',
396
+                        'function' => 'SUM',
397
+                        'name'     => 'invoice_item_count',
398
+                    ),
399
+                    'post_date' => array(
400
+                        'type'     => 'post_data',
401
+                        'function' => 'MIN',
402
+                        'name'     => 'post_date',
403
+                    ),
404
+                ),
405
+                'group_by'       => $this->get_group_by_sql( 'posts.post_date' ),
406
+                'order_by'       => 'post_date ASC',
407
+                'query_type'     => 'get_results',
408
+                'filter_range'   => $this->report_range,
409
+                'invoice_status' => array( 'publish', 'wpi-processing', 'wpi-onhold', 'wpi-refunded', 'wpi-renewal' ),
410
+            )
411
+        );
412
+
413
+    }
414
+
415
+    /**
416
+     * Prepares refunded item counts.
417
+     *
418
+     * @return array.
419
+     */
420
+    protected function count_refunded_items() {
421
+
422
+        return (int) GetPaid_Reports_Helper::get_invoice_report_data(
423
+            array(
424
+                'data'           => array(
425
+                    'quantity' => array(
426
+                        'type'     => 'invoice_item',
427
+                        'function' => 'SUM',
428
+                        'name'     => 'invoice_item_count',
429
+                    ),
430
+                ),
431
+                'query_type'     => 'get_var',
432
+                'filter_range'   => $this->report_range,
433
+                'invoice_status' => array( 'wpi-refunded' ),
434
+            )
435
+        );
436
+
437
+    }
438
+
439
+    /**
440
+     * Prepares daily invoice totals.
441
+     *
442
+     * @return array.
443
+     */
444
+    protected function query_invoice_totals() {
445
+
446
+        return (array) GetPaid_Reports_Helper::get_invoice_report_data(
447
+            array(
448
+                'data'           => array(
449
+                    'total'      => array(
450
+                        'type'     => 'invoice_data',
451
+                        'function' => 'SUM',
452
+                        'name'     => 'total_sales',
453
+                    ),
454
+                    'tax'        => array(
455
+                        'type'     => 'invoice_data',
456
+                        'function' => 'SUM',
457
+                        'name'     => 'total_tax',
458
+                    ),
459
+                    'discount'   => array(
460
+                        'type'     => 'invoice_data',
461
+                        'function' => 'SUM',
462
+                        'name'     => 'total_discount',
463
+                    ),
464
+                    'fees_total' => array(
465
+                        'type'     => 'invoice_data',
466
+                        'function' => 'SUM',
467
+                        'name'     => 'total_fees',
468
+                    ),
469
+                    'subtotal'   => array(
470
+                        'type'     => 'invoice_data',
471
+                        'function' => 'SUM',
472
+                        'name'     => 'subtotal',
473
+                    ),
474
+                    'post_date'  => array(
475
+                        'type'     => 'post_data',
476
+                        'function' => '',
477
+                        'name'     => 'post_date',
478
+                    ),
479
+                ),
480
+                'group_by'       => $this->get_group_by_sql( 'posts.post_date' ),
481
+                'order_by'       => 'post_date ASC',
482
+                'query_type'     => 'get_results',
483
+                'filter_range'   => $this->report_range,
484
+                'invoice_status' => array( 'publish', 'wpi-processing', 'wpi-onhold', 'wpi-renewal' ),
485
+            )
486
+        );
487
+
488
+    }
489
+
490
+    /**
491
+     * Prepares daily invoice totals.
492
+     *
493
+     * @return array.
494
+     */
495
+    protected function query_refunded_totals() {
496
+
497
+        return (array) GetPaid_Reports_Helper::get_invoice_report_data(
498
+            array(
499
+                'data'           => array(
500
+                    'total'      => array(
501
+                        'type'     => 'invoice_data',
502
+                        'function' => 'SUM',
503
+                        'name'     => 'total_sales',
504
+                    ),
505
+                    'tax'        => array(
506
+                        'type'     => 'invoice_data',
507
+                        'function' => 'SUM',
508
+                        'name'     => 'total_tax',
509
+                    ),
510
+                    'discount'   => array(
511
+                        'type'     => 'invoice_data',
512
+                        'function' => 'SUM',
513
+                        'name'     => 'total_discount',
514
+                    ),
515
+                    'fees_total' => array(
516
+                        'type'     => 'invoice_data',
517
+                        'function' => 'SUM',
518
+                        'name'     => 'total_fees',
519
+                    ),
520
+                    'subtotal'   => array(
521
+                        'type'     => 'invoice_data',
522
+                        'function' => 'SUM',
523
+                        'name'     => 'subtotal',
524
+                    ),
525
+                    'post_date'  => array(
526
+                        'type'     => 'post_data',
527
+                        'function' => '',
528
+                        'name'     => 'post_date',
529
+                    ),
530
+                ),
531
+                'group_by'       => $this->get_group_by_sql( 'posts.post_date' ),
532
+                'order_by'       => 'post_date ASC',
533
+                'query_type'     => 'get_results',
534
+                'filter_range'   => $this->report_range,
535
+                'invoice_status' => array( 'wpi-refunded' ),
536
+            )
537
+        );
538
+
539
+    }
540
+
541
+    /**
542
+     * Get the Report's schema, conforming to JSON Schema.
543
+     *
544
+     * @return array
545
+     */
546
+    public function get_item_schema() {
547
+
548
+        $schema = array(
549
+            '$schema'    => 'http://json-schema.org/draft-04/schema#',
550
+            'title'      => 'sales_report',
551
+            'type'       => 'object',
552
+            'properties' => array(
553
+                'total_sales'         => array(
554
+                    'description' => __( 'Gross sales in the period.', 'invoicing' ),
555
+                    'type'        => 'string',
556
+                    'context'     => array( 'view' ),
557
+                    'readonly'    => true,
558
+                ),
559
+                'net_sales'           => array(
560
+                    'description' => __( 'Net sales in the period.', 'invoicing' ),
561
+                    'type'        => 'string',
562
+                    'context'     => array( 'view' ),
563
+                    'readonly'    => true,
564
+                ),
565
+                'average_sales'       => array(
566
+                    'description' => __( 'Average net daily sales.', 'invoicing' ),
567
+                    'type'        => 'string',
568
+                    'context'     => array( 'view' ),
569
+                    'readonly'    => true,
570
+                ),
571
+                'average_total_sales' => array(
572
+                    'description' => __( 'Average gross daily sales.', 'invoicing' ),
573
+                    'type'        => 'string',
574
+                    'context'     => array( 'view' ),
575
+                    'readonly'    => true,
576
+                ),
577
+                'total_invoices'      => array(
578
+                    'description' => __( 'Number of paid invoices.', 'invoicing' ),
579
+                    'type'        => 'integer',
580
+                    'context'     => array( 'view' ),
581
+                    'readonly'    => true,
582
+                ),
583
+                'total_items'         => array(
584
+                    'description' => __( 'Number of items purchased.', 'invoicing' ),
585
+                    'type'        => 'integer',
586
+                    'context'     => array( 'view' ),
587
+                    'readonly'    => true,
588
+                ),
589
+                'refunded_items'      => array(
590
+                    'description' => __( 'Number of items refunded.', 'invoicing' ),
591
+                    'type'        => 'integer',
592
+                    'context'     => array( 'view' ),
593
+                    'readonly'    => true,
594
+                ),
595
+                'total_tax'           => array(
596
+                    'description' => __( 'Total charged for taxes.', 'invoicing' ),
597
+                    'type'        => 'string',
598
+                    'context'     => array( 'view' ),
599
+                    'readonly'    => true,
600
+                ),
601
+                'total_refunded_tax'  => array(
602
+                    'description' => __( 'Total refunded for taxes.', 'invoicing' ),
603
+                    'type'        => 'string',
604
+                    'context'     => array( 'view' ),
605
+                    'readonly'    => true,
606
+                ),
607
+                'total_fees'          => array(
608
+                    'description' => __( 'Total fees charged.', 'invoicing' ),
609
+                    'type'        => 'string',
610
+                    'context'     => array( 'view' ),
611
+                    'readonly'    => true,
612
+                ),
613
+                'total_refunds'       => array(
614
+                    'description' => __( 'Total of refunded invoices.', 'invoicing' ),
615
+                    'type'        => 'integer',
616
+                    'context'     => array( 'view' ),
617
+                    'readonly'    => true,
618
+                ),
619
+                'net_refunds'         => array(
620
+                    'description' => __( 'Net of refunded invoices.', 'invoicing' ),
621
+                    'type'        => 'integer',
622
+                    'context'     => array( 'view' ),
623
+                    'readonly'    => true,
624
+                ),
625
+                'total_discount'      => array(
626
+                    'description' => __( 'Total of discounts used.', 'invoicing' ),
627
+                    'type'        => 'integer',
628
+                    'context'     => array( 'view' ),
629
+                    'readonly'    => true,
630
+                ),
631
+                'totals'              => array(
632
+                    'description' => __( 'Totals.', 'invoicing' ),
633
+                    'type'        => 'array',
634
+                    'items'       => array(
635
+                        'type' => 'array',
636
+                    ),
637
+                    'context'     => array( 'view' ),
638
+                    'readonly'    => true,
639
+                ),
640
+                'interval'            => array(
641
+                    'description' => __( 'Number of months/days in the report period.', 'invoicing' ),
642
+                    'type'        => 'integer',
643
+                    'context'     => array( 'view' ),
644
+                    'readonly'    => true,
645
+                ),
646
+                'previous_range'      => array(
647
+                    'description' => __( 'The previous report period.', 'invoicing' ),
648
+                    'type'        => 'array',
649
+                    'items'       => array(
650
+                        'type' => 'string',
651
+                    ),
652
+                    'context'     => array( 'view' ),
653
+                    'readonly'    => true,
654
+                ),
655
+                'grouped_by'          => array(
656
+                    'description' => __( 'The period used to group the totals.', 'invoicing' ),
657
+                    'type'        => 'string',
658
+                    'context'     => array( 'view' ),
659
+                    'enum'        => array( 'day', 'month' ),
660
+                    'readonly'    => true,
661
+                ),
662
+                'currency'            => array(
663
+                    'description' => __( 'The default store currency.', 'invoicing' ),
664
+                    'type'        => 'string',
665
+                    'context'     => array( 'view' ),
666
+                    'readonly'    => true,
667
+                ),
668
+                'currency_symbol'     => array(
669
+                    'description' => __( 'The default store currency symbol.', 'invoicing' ),
670
+                    'type'        => 'string',
671
+                    'context'     => array( 'view' ),
672
+                    'readonly'    => true,
673
+                ),
674
+                'currency_position'   => array(
675
+                    'description' => __( 'The default store currency position.', 'invoicing' ),
676
+                    'type'        => 'string',
677
+                    'context'     => array( 'view' ),
678
+                    'readonly'    => true,
679
+                ),
680
+                'decimal_places'      => array(
681
+                    'description' => __( 'The default store decimal places.', 'invoicing' ),
682
+                    'type'        => 'string',
683
+                    'context'     => array( 'view' ),
684
+                    'readonly'    => true,
685
+                ),
686
+                'thousands_sep'       => array(
687
+                    'description' => __( 'The default store thousands separator.', 'invoicing' ),
688
+                    'type'        => 'string',
689
+                    'context'     => array( 'view' ),
690
+                    'readonly'    => true,
691
+                ),
692
+                'decimals_sep'        => array(
693
+                    'description' => __( 'The default store decimals separator.', 'invoicing' ),
694
+                    'type'        => 'string',
695
+                    'context'     => array( 'view' ),
696
+                    'readonly'    => true,
697
+                ),
698
+            ),
699
+        );
700
+
701
+        return $this->add_additional_fields_schema( $schema );
702
+
703
+    }
704 704
 
705 705
 }
Please login to merge, or discard this patch.
Spacing   +154 added lines, -154 removed lines patch added patch discarded remove patch
@@ -9,7 +9,7 @@  discard block
 block discarded – undo
9 9
  * @since   2.0.0
10 10
  */
11 11
 
12
-defined( 'ABSPATH' ) || exit;
12
+defined('ABSPATH') || exit;
13 13
 
14 14
 /**
15 15
  * GetPaid REST reports controller class.
@@ -46,7 +46,7 @@  discard block
 block discarded – undo
46 46
 	 *
47 47
 	 * @see register_rest_route()
48 48
 	 */
49
-	public function register_namespace_routes( $namespace ) {
49
+	public function register_namespace_routes($namespace) {
50 50
 
51 51
 		// Get sales report.
52 52
 		register_rest_route(
@@ -55,11 +55,11 @@  discard block
 block discarded – undo
55 55
 			array(
56 56
 				array(
57 57
 					'methods'             => WP_REST_Server::READABLE,
58
-					'callback'            => array( $this, 'get_items' ),
59
-					'permission_callback' => array( $this, 'get_items_permissions_check' ),
58
+					'callback'            => array($this, 'get_items'),
59
+					'permission_callback' => array($this, 'get_items_permissions_check'),
60 60
 					'args'                => $this->get_collection_params(),
61 61
 				),
62
-				'schema' => array( $this, 'get_public_item_schema' ),
62
+				'schema' => array($this, 'get_public_item_schema'),
63 63
 			)
64 64
 		);
65 65
 
@@ -72,10 +72,10 @@  discard block
 block discarded – undo
72 72
 	 * @param WP_REST_Request $request Full data about the request.
73 73
 	 * @return WP_Error|boolean
74 74
 	 */
75
-	public function get_items_permissions_check( $request ) {
75
+	public function get_items_permissions_check($request) {
76 76
 
77
-		if ( ! wpinv_current_user_can_manage_invoicing() ) {
78
-			return new WP_Error( 'rest_cannot_view', __( 'Sorry, you cannot list resources.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
77
+		if (!wpinv_current_user_can_manage_invoicing()) {
78
+			return new WP_Error('rest_cannot_view', __('Sorry, you cannot list resources.', 'invoicing'), array('status' => rest_authorization_required_code()));
79 79
 		}
80 80
 
81 81
 		return true;
@@ -87,12 +87,12 @@  discard block
 block discarded – undo
87 87
 	 * @param WP_REST_Request $request
88 88
 	 * @return array|WP_Error
89 89
 	 */
90
-	public function get_items( $request ) {
90
+	public function get_items($request) {
91 91
 		$data   = array();
92
-		$item   = $this->prepare_item_for_response( null, $request );
93
-		$data[] = $this->prepare_response_for_collection( $item );
92
+		$item   = $this->prepare_item_for_response(null, $request);
93
+		$data[] = $this->prepare_response_for_collection($item);
94 94
 
95
-		return rest_ensure_response( $data );
95
+		return rest_ensure_response($data);
96 96
 	}
97 97
 
98 98
 	/**
@@ -102,164 +102,164 @@  discard block
 block discarded – undo
102 102
 	 * @param WP_REST_Request $request Request object.
103 103
 	 * @return WP_REST_Response $response Response data.
104 104
 	 */
105
-	public function prepare_item_for_response( $_, $request ) {
105
+	public function prepare_item_for_response($_, $request) {
106 106
 
107 107
 		// Set report range.
108
-		$this->report_range = $this->get_date_range( $request );
108
+		$this->report_range = $this->get_date_range($request);
109 109
 
110 110
 		$report_data     = $this->get_report_data();
111 111
 		$period_totals   = array();
112 112
 
113 113
 		// Setup period totals by ensuring each period in the interval has data.
114
-		$start_date      = strtotime( $this->report_range['after'] );
114
+		$start_date      = strtotime($this->report_range['after']);
115 115
 
116
-		if ( 'month' === $this->groupby ) {
117
-			$start_date      = strtotime( gmdate( 'Y-m-01', $start_date ) );
116
+		if ('month' === $this->groupby) {
117
+			$start_date = strtotime(gmdate('Y-m-01', $start_date));
118 118
 		}
119 119
 
120
-		for ( $i = 0; $i < $this->interval; $i++ ) {
120
+		for ($i = 0; $i < $this->interval; $i++) {
121 121
 
122
-			switch ( $this->groupby ) {
122
+			switch ($this->groupby) {
123 123
 				case 'day':
124
-					$time = gmdate( 'Y-m-d', strtotime( "+{$i} DAY", $start_date ) );
124
+					$time = gmdate('Y-m-d', strtotime("+{$i} DAY", $start_date));
125 125
 					break;
126 126
 				default:
127
-					$time = gmdate( 'Y-m', strtotime( "+{$i} MONTH", $start_date ) );
127
+					$time = gmdate('Y-m', strtotime("+{$i} MONTH", $start_date));
128 128
 					break;
129 129
 			}
130 130
 
131 131
 			// Set the defaults for each period.
132
-			$period_totals[ $time ] = array(
132
+			$period_totals[$time] = array(
133 133
 				'invoices'          => 0,
134 134
 				'items'             => 0,
135 135
 				'refunded_items'    => 0,
136
-				'refunded_tax'      => wpinv_round_amount( 0.00 ),
137
-				'subtotal'          => wpinv_round_amount( 0.00 ),
138
-				'refunded_subtotal' => wpinv_round_amount( 0.00 ),
139
-				'refunded_fees'     => wpinv_round_amount( 0.00 ),
140
-				'discount'          => wpinv_round_amount( 0.00 ),
136
+				'refunded_tax'      => wpinv_round_amount(0.00),
137
+				'subtotal'          => wpinv_round_amount(0.00),
138
+				'refunded_subtotal' => wpinv_round_amount(0.00),
139
+				'refunded_fees'     => wpinv_round_amount(0.00),
140
+				'discount'          => wpinv_round_amount(0.00),
141 141
 			);
142 142
 
143
-			foreach ( array_keys( wpinv_get_report_graphs() ) as $key ) {
144
-				if ( ! isset( $period_totals[ $time ][ $key ] ) ) {
145
-					$period_totals[ $time ][ $key ] = wpinv_round_amount( 0.00 );
143
+			foreach (array_keys(wpinv_get_report_graphs()) as $key) {
144
+				if (!isset($period_totals[$time][$key])) {
145
+					$period_totals[$time][$key] = wpinv_round_amount(0.00);
146 146
 				}
147 147
 			}
148 148
 		}
149 149
 
150 150
 		// add total sales, total invoice count, total tax for each period
151
-		$date_format = ( 'day' === $this->groupby ) ? 'Y-m-d' : 'Y-m';
152
-		foreach ( $report_data->invoices as $invoice ) {
153
-			$time = gmdate( $date_format, strtotime( $invoice->post_date ) );
151
+		$date_format = ('day' === $this->groupby) ? 'Y-m-d' : 'Y-m';
152
+		foreach ($report_data->invoices as $invoice) {
153
+			$time = gmdate($date_format, strtotime($invoice->post_date));
154 154
 
155
-			if ( ! isset( $period_totals[ $time ] ) ) {
155
+			if (!isset($period_totals[$time])) {
156 156
 				continue;
157 157
 			}
158 158
 
159
-			$period_totals[ $time ]['sales']    = wpinv_round_amount( $invoice->total_sales );
160
-			$period_totals[ $time ]['tax']      = wpinv_round_amount( $invoice->total_tax );
161
-			$period_totals[ $time ]['subtotal'] = wpinv_round_amount( $invoice->subtotal );
162
-			$period_totals[ $time ]['fees']     = wpinv_round_amount( $invoice->total_fees );
159
+			$period_totals[$time]['sales']    = wpinv_round_amount($invoice->total_sales);
160
+			$period_totals[$time]['tax']      = wpinv_round_amount($invoice->total_tax);
161
+			$period_totals[$time]['subtotal'] = wpinv_round_amount($invoice->subtotal);
162
+			$period_totals[$time]['fees']     = wpinv_round_amount($invoice->total_fees);
163 163
 
164 164
 		}
165 165
 
166
-		foreach ( $report_data->refunds as $invoice ) {
167
-			$time = gmdate( $date_format, strtotime( $invoice->post_date ) );
166
+		foreach ($report_data->refunds as $invoice) {
167
+			$time = gmdate($date_format, strtotime($invoice->post_date));
168 168
 
169
-			if ( ! isset( $period_totals[ $time ] ) ) {
169
+			if (!isset($period_totals[$time])) {
170 170
 				continue;
171 171
 			}
172 172
 
173
-			$period_totals[ $time ]['refunds']           = wpinv_round_amount( $invoice->total_sales );
174
-			$period_totals[ $time ]['refunded_tax']      = wpinv_round_amount( $invoice->total_tax );
175
-			$period_totals[ $time ]['refunded_subtotal'] = wpinv_round_amount( $invoice->subtotal );
176
-			$period_totals[ $time ]['refunded_fees']     = wpinv_round_amount( $invoice->total_fees );
173
+			$period_totals[$time]['refunds']           = wpinv_round_amount($invoice->total_sales);
174
+			$period_totals[$time]['refunded_tax']      = wpinv_round_amount($invoice->total_tax);
175
+			$period_totals[$time]['refunded_subtotal'] = wpinv_round_amount($invoice->subtotal);
176
+			$period_totals[$time]['refunded_fees']     = wpinv_round_amount($invoice->total_fees);
177 177
 
178 178
 		}
179 179
 
180
-		foreach ( $report_data->invoice_counts as $invoice ) {
181
-			$time = gmdate( $date_format, strtotime( $invoice->post_date ) );
180
+		foreach ($report_data->invoice_counts as $invoice) {
181
+			$time = gmdate($date_format, strtotime($invoice->post_date));
182 182
 
183
-			if ( isset( $period_totals[ $time ] ) ) {
184
-				$period_totals[ $time ]['invoices']   = (int) $invoice->count;
183
+			if (isset($period_totals[$time])) {
184
+				$period_totals[$time]['invoices'] = (int) $invoice->count;
185 185
 			}
186 186
 		}
187 187
 
188 188
 		// Add total invoice items for each period.
189
-		foreach ( $report_data->invoice_items as $invoice_item ) {
190
-			$time = ( 'day' === $this->groupby ) ? gmdate( 'Y-m-d', strtotime( $invoice_item->post_date ) ) : gmdate( 'Y-m', strtotime( $invoice_item->post_date ) );
189
+		foreach ($report_data->invoice_items as $invoice_item) {
190
+			$time = ('day' === $this->groupby) ? gmdate('Y-m-d', strtotime($invoice_item->post_date)) : gmdate('Y-m', strtotime($invoice_item->post_date));
191 191
 
192
-			if ( isset( $period_totals[ $time ] ) ) {
193
-				$period_totals[ $time ]['items'] = (int) $invoice_item->invoice_item_count;
192
+			if (isset($period_totals[$time])) {
193
+				$period_totals[$time]['items'] = (int) $invoice_item->invoice_item_count;
194 194
 			}
195 195
 		}
196 196
 
197 197
 		// Add total discount for each period.
198
-		foreach ( $report_data->coupons as $discount ) {
199
-			$time = ( 'day' === $this->groupby ) ? gmdate( 'Y-m-d', strtotime( $discount->post_date ) ) : gmdate( 'Y-m', strtotime( $discount->post_date ) );
198
+		foreach ($report_data->coupons as $discount) {
199
+			$time = ('day' === $this->groupby) ? gmdate('Y-m-d', strtotime($discount->post_date)) : gmdate('Y-m', strtotime($discount->post_date));
200 200
 
201
-			if ( isset( $period_totals[ $time ] ) ) {
202
-				$period_totals[ $time ]['discount'] = wpinv_round_amount( $discount->discount_amount );
201
+			if (isset($period_totals[$time])) {
202
+				$period_totals[$time]['discount'] = wpinv_round_amount($discount->discount_amount);
203 203
 			}
204 204
 		}
205 205
 
206 206
 		// Extra fields.
207
-		foreach ( array_keys( wpinv_get_report_graphs() ) as $key ) {
207
+		foreach (array_keys(wpinv_get_report_graphs()) as $key) {
208 208
 
209 209
 			// Abort unprepared.
210
-			if ( ! isset( $report_data->$key ) ) {
210
+			if (!isset($report_data->$key)) {
211 211
 				continue;
212 212
 			} 
213 213
 
214 214
 			// Abort defaults.
215
-			if ( in_array( $key, array( 'sales', 'refunds', 'tax', 'fees', 'discount', 'invoices', 'items' ) ) ) {
215
+			if (in_array($key, array('sales', 'refunds', 'tax', 'fees', 'discount', 'invoices', 'items'))) {
216 216
 				continue;
217 217
 			}
218 218
 
219 219
 			// Set values.
220
-			foreach ( $report_data->$key as $item ) {
221
-				$time = ( 'day' === $this->groupby ) ? gmdate( 'Y-m-d', strtotime( $item->date ) ) : gmdate( 'Y-m', strtotime( $item->date ) );
220
+			foreach ($report_data->$key as $item) {
221
+				$time = ('day' === $this->groupby) ? gmdate('Y-m-d', strtotime($item->date)) : gmdate('Y-m', strtotime($item->date));
222 222
 
223
-				if ( isset( $period_totals[ $time ] ) ) {
224
-					$period_totals[ $time ][ $key ] = wpinv_round_amount( $item->val );
223
+				if (isset($period_totals[$time])) {
224
+					$period_totals[$time][$key] = wpinv_round_amount($item->val);
225 225
 				}
226 226
 			}
227 227
 
228
-			unset( $report_data->$key );
228
+			unset($report_data->$key);
229 229
 		}
230 230
 
231 231
 		$report_data->totals            = $period_totals;
232 232
 		$report_data->grouped_by        = $this->groupby;
233
-		$report_data->interval          = max( $this->interval, 1 );
233
+		$report_data->interval          = max($this->interval, 1);
234 234
 		$report_data->currency          = wpinv_get_currency();
235 235
 		$report_data->currency_symbol   = wpinv_currency_symbol();
236 236
 		$report_data->currency_position = wpinv_currency_position();
237 237
 		$report_data->decimal_places    = wpinv_decimals();
238 238
 		$report_data->thousands_sep     = wpinv_thousands_separator();
239 239
 		$report_data->decimals_sep      = wpinv_decimal_separator();
240
-		$report_data->start_date        = gmdate( 'Y-m-d', strtotime( $this->report_range['after'] ) );
241
-		$report_data->end_date          = gmdate( 'Y-m-d', strtotime( $this->report_range['before'] ) );
242
-		$report_data->start_date_locale = getpaid_format_date( gmdate( 'Y-m-d', strtotime( $this->report_range['after'] ) ) );
243
-		$report_data->end_date_locale   = getpaid_format_date( gmdate( 'Y-m-d', strtotime( $this->report_range['before'] ) ) );
240
+		$report_data->start_date        = gmdate('Y-m-d', strtotime($this->report_range['after']));
241
+		$report_data->end_date          = gmdate('Y-m-d', strtotime($this->report_range['before']));
242
+		$report_data->start_date_locale = getpaid_format_date(gmdate('Y-m-d', strtotime($this->report_range['after'])));
243
+		$report_data->end_date_locale   = getpaid_format_date(gmdate('Y-m-d', strtotime($this->report_range['before'])));
244 244
 		$report_data->decimals_sep      = wpinv_decimal_separator();
245 245
 
246
-		$context = ! empty( $request['context'] ) ? $request['context'] : 'view';
246
+		$context = !empty($request['context']) ? $request['context'] : 'view';
247 247
 		$data    = $report_data;
248
-		unset( $data->invoice_counts, $data->invoices, $data->coupons, $data->refunds, $data->invoice_items );
249
-		$data    = $this->add_additional_fields_to_object( (array) $data, $request );
250
-		$data    = $this->filter_response_by_context( $data, $context );
248
+		unset($data->invoice_counts, $data->invoices, $data->coupons, $data->refunds, $data->invoice_items);
249
+		$data    = $this->add_additional_fields_to_object((array) $data, $request);
250
+		$data    = $this->filter_response_by_context($data, $context);
251 251
 
252 252
 		// Wrap the data in a response object.
253
-		$response = rest_ensure_response( $data );
253
+		$response = rest_ensure_response($data);
254 254
 		$response->add_links(
255 255
             array(
256 256
 				'about' => array(
257
-					'href' => rest_url( sprintf( '%s/reports', $this->namespace ) ),
257
+					'href' => rest_url(sprintf('%s/reports', $this->namespace)),
258 258
 				),
259 259
             )
260 260
         );
261 261
 
262
-		return apply_filters( 'getpaid_rest_prepare_report_sales', $response, $report_data, $request );
262
+		return apply_filters('getpaid_rest_prepare_report_sales', $response, $report_data, $request);
263 263
 	}
264 264
 
265 265
 	/**
@@ -268,7 +268,7 @@  discard block
 block discarded – undo
268 268
 	 * @return stdClass
269 269
 	 */
270 270
 	public function get_report_data() {
271
-		if ( empty( $this->report_data ) ) {
271
+		if (empty($this->report_data)) {
272 272
 			$this->query_report_data();
273 273
 		}
274 274
 		return $this->report_data;
@@ -291,31 +291,31 @@  discard block
 block discarded – undo
291 291
 		);
292 292
 
293 293
 		// Calculated totals.
294
-		$this->report_data->total_tax          = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->invoices, 'total_tax' ) ) );
295
-		$this->report_data->total_sales        = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->invoices, 'total_sales' ) ) );
296
-		$this->report_data->total_discount     = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->invoices, 'total_discount' ) ) );
297
-		$this->report_data->total_fees         = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->invoices, 'total_fees' ) ) );
298
-		$this->report_data->subtotal           = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->invoices, 'subtotal' ) ) );
299
-		$this->report_data->net_sales          = wpinv_round_amount( $this->report_data->total_sales - max( 0, $this->report_data->total_tax ) );
300
-		$this->report_data->total_refunded_tax = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->refunds, 'total_tax' ) ) );
301
-		$this->report_data->total_refunds      = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->refunds, 'total_sales' ) ) );
302
-		$this->report_data->refunded_discount  = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->refunds, 'total_discount' ) ) );
303
-		$this->report_data->refunded_fees      = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->refunds, 'total_fees' ) ) );
304
-		$this->report_data->refunded_subtotal  = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->refunds, 'subtotal' ) ) );
305
-		$this->report_data->net_refunds        = wpinv_round_amount( $this->report_data->total_refunds + max( 0, $this->report_data->total_refunded_tax ) );
294
+		$this->report_data->total_tax          = wpinv_round_amount(array_sum(wp_list_pluck($this->report_data->invoices, 'total_tax')));
295
+		$this->report_data->total_sales        = wpinv_round_amount(array_sum(wp_list_pluck($this->report_data->invoices, 'total_sales')));
296
+		$this->report_data->total_discount     = wpinv_round_amount(array_sum(wp_list_pluck($this->report_data->invoices, 'total_discount')));
297
+		$this->report_data->total_fees         = wpinv_round_amount(array_sum(wp_list_pluck($this->report_data->invoices, 'total_fees')));
298
+		$this->report_data->subtotal           = wpinv_round_amount(array_sum(wp_list_pluck($this->report_data->invoices, 'subtotal')));
299
+		$this->report_data->net_sales          = wpinv_round_amount($this->report_data->total_sales - max(0, $this->report_data->total_tax));
300
+		$this->report_data->total_refunded_tax = wpinv_round_amount(array_sum(wp_list_pluck($this->report_data->refunds, 'total_tax')));
301
+		$this->report_data->total_refunds      = wpinv_round_amount(array_sum(wp_list_pluck($this->report_data->refunds, 'total_sales')));
302
+		$this->report_data->refunded_discount  = wpinv_round_amount(array_sum(wp_list_pluck($this->report_data->refunds, 'total_discount')));
303
+		$this->report_data->refunded_fees      = wpinv_round_amount(array_sum(wp_list_pluck($this->report_data->refunds, 'total_fees')));
304
+		$this->report_data->refunded_subtotal  = wpinv_round_amount(array_sum(wp_list_pluck($this->report_data->refunds, 'subtotal')));
305
+		$this->report_data->net_refunds        = wpinv_round_amount($this->report_data->total_refunds + max(0, $this->report_data->total_refunded_tax));
306 306
 
307 307
 		// Calculate average based on net.
308
-		$this->report_data->average_sales       = wpinv_round_amount( $this->report_data->net_sales / max( $this->interval, 1 ), 2 );
309
-		$this->report_data->average_total_sales = wpinv_round_amount( $this->report_data->total_sales / max( $this->interval, 1 ), 2 );
308
+		$this->report_data->average_sales       = wpinv_round_amount($this->report_data->net_sales / max($this->interval, 1), 2);
309
+		$this->report_data->average_total_sales = wpinv_round_amount($this->report_data->total_sales / max($this->interval, 1), 2);
310 310
 
311 311
 		// Total invoices in this period, even if refunded.
312
-		$this->report_data->total_invoices = absint( array_sum( wp_list_pluck( $this->report_data->invoice_counts, 'count' ) ) );
312
+		$this->report_data->total_invoices = absint(array_sum(wp_list_pluck($this->report_data->invoice_counts, 'count')));
313 313
 
314 314
 		// Items invoiced in this period, even if refunded.
315
-		$this->report_data->total_items = absint( array_sum( wp_list_pluck( $this->report_data->invoice_items, 'invoice_item_count' ) ) );
315
+		$this->report_data->total_items = absint(array_sum(wp_list_pluck($this->report_data->invoice_items, 'invoice_item_count')));
316 316
 
317 317
 		// 3rd party filtering of report data
318
-		$this->report_data = apply_filters( 'getpaid_rest_api_filter_report_data', $this->report_data, $this );
318
+		$this->report_data = apply_filters('getpaid_rest_api_filter_report_data', $this->report_data, $this);
319 319
 	}
320 320
 
321 321
 	/**
@@ -340,11 +340,11 @@  discard block
 block discarded – undo
340 340
 						'name'     => 'post_date',
341 341
 					),
342 342
 				),
343
-				'group_by'       => $this->get_group_by_sql( 'posts.post_date' ),
343
+				'group_by'       => $this->get_group_by_sql('posts.post_date'),
344 344
 				'order_by'       => 'post_date ASC',
345 345
 				'query_type'     => 'get_results',
346 346
 				'filter_range'   => $this->report_range,
347
-				'invoice_status' => array( 'publish', 'wpi-processing', 'wpi-onhold', 'wpi-refunded', 'wpi-renewal' ),
347
+				'invoice_status' => array('publish', 'wpi-processing', 'wpi-onhold', 'wpi-refunded', 'wpi-renewal'),
348 348
 			)
349 349
 		);
350 350
 
@@ -371,11 +371,11 @@  discard block
 block discarded – undo
371 371
 						'name'     => 'post_date',
372 372
 					),
373 373
 				),
374
-				'group_by'       => $this->get_group_by_sql( 'posts.post_date' ),
374
+				'group_by'       => $this->get_group_by_sql('posts.post_date'),
375 375
 				'order_by'       => 'post_date ASC',
376 376
 				'query_type'     => 'get_results',
377 377
 				'filter_range'   => $this->report_range,
378
-				'invoice_status' => array( 'publish', 'wpi-processing', 'wpi-onhold', 'wpi-refunded', 'wpi-renewal' ),
378
+				'invoice_status' => array('publish', 'wpi-processing', 'wpi-onhold', 'wpi-refunded', 'wpi-renewal'),
379 379
 			)
380 380
 		);
381 381
 
@@ -402,11 +402,11 @@  discard block
 block discarded – undo
402 402
 						'name'     => 'post_date',
403 403
 					),
404 404
 				),
405
-				'group_by'       => $this->get_group_by_sql( 'posts.post_date' ),
405
+				'group_by'       => $this->get_group_by_sql('posts.post_date'),
406 406
 				'order_by'       => 'post_date ASC',
407 407
 				'query_type'     => 'get_results',
408 408
 				'filter_range'   => $this->report_range,
409
-				'invoice_status' => array( 'publish', 'wpi-processing', 'wpi-onhold', 'wpi-refunded', 'wpi-renewal' ),
409
+				'invoice_status' => array('publish', 'wpi-processing', 'wpi-onhold', 'wpi-refunded', 'wpi-renewal'),
410 410
 			)
411 411
 		);
412 412
 
@@ -430,7 +430,7 @@  discard block
 block discarded – undo
430 430
 				),
431 431
 				'query_type'     => 'get_var',
432 432
 				'filter_range'   => $this->report_range,
433
-				'invoice_status' => array( 'wpi-refunded' ),
433
+				'invoice_status' => array('wpi-refunded'),
434 434
 			)
435 435
 		);
436 436
 
@@ -477,11 +477,11 @@  discard block
 block discarded – undo
477 477
 						'name'     => 'post_date',
478 478
 					),
479 479
 				),
480
-				'group_by'       => $this->get_group_by_sql( 'posts.post_date' ),
480
+				'group_by'       => $this->get_group_by_sql('posts.post_date'),
481 481
 				'order_by'       => 'post_date ASC',
482 482
 				'query_type'     => 'get_results',
483 483
 				'filter_range'   => $this->report_range,
484
-				'invoice_status' => array( 'publish', 'wpi-processing', 'wpi-onhold', 'wpi-renewal' ),
484
+				'invoice_status' => array('publish', 'wpi-processing', 'wpi-onhold', 'wpi-renewal'),
485 485
 			)
486 486
 		);
487 487
 
@@ -528,11 +528,11 @@  discard block
 block discarded – undo
528 528
 						'name'     => 'post_date',
529 529
 					),
530 530
 				),
531
-				'group_by'       => $this->get_group_by_sql( 'posts.post_date' ),
531
+				'group_by'       => $this->get_group_by_sql('posts.post_date'),
532 532
 				'order_by'       => 'post_date ASC',
533 533
 				'query_type'     => 'get_results',
534 534
 				'filter_range'   => $this->report_range,
535
-				'invoice_status' => array( 'wpi-refunded' ),
535
+				'invoice_status' => array('wpi-refunded'),
536 536
 			)
537 537
 		);
538 538
 
@@ -551,154 +551,154 @@  discard block
 block discarded – undo
551 551
 			'type'       => 'object',
552 552
 			'properties' => array(
553 553
 				'total_sales'         => array(
554
-					'description' => __( 'Gross sales in the period.', 'invoicing' ),
554
+					'description' => __('Gross sales in the period.', 'invoicing'),
555 555
 					'type'        => 'string',
556
-					'context'     => array( 'view' ),
556
+					'context'     => array('view'),
557 557
 					'readonly'    => true,
558 558
 				),
559 559
 				'net_sales'           => array(
560
-					'description' => __( 'Net sales in the period.', 'invoicing' ),
560
+					'description' => __('Net sales in the period.', 'invoicing'),
561 561
 					'type'        => 'string',
562
-					'context'     => array( 'view' ),
562
+					'context'     => array('view'),
563 563
 					'readonly'    => true,
564 564
 				),
565 565
 				'average_sales'       => array(
566
-					'description' => __( 'Average net daily sales.', 'invoicing' ),
566
+					'description' => __('Average net daily sales.', 'invoicing'),
567 567
 					'type'        => 'string',
568
-					'context'     => array( 'view' ),
568
+					'context'     => array('view'),
569 569
 					'readonly'    => true,
570 570
 				),
571 571
 				'average_total_sales' => array(
572
-					'description' => __( 'Average gross daily sales.', 'invoicing' ),
572
+					'description' => __('Average gross daily sales.', 'invoicing'),
573 573
 					'type'        => 'string',
574
-					'context'     => array( 'view' ),
574
+					'context'     => array('view'),
575 575
 					'readonly'    => true,
576 576
 				),
577 577
 				'total_invoices'      => array(
578
-					'description' => __( 'Number of paid invoices.', 'invoicing' ),
578
+					'description' => __('Number of paid invoices.', 'invoicing'),
579 579
 					'type'        => 'integer',
580
-					'context'     => array( 'view' ),
580
+					'context'     => array('view'),
581 581
 					'readonly'    => true,
582 582
 				),
583 583
 				'total_items'         => array(
584
-					'description' => __( 'Number of items purchased.', 'invoicing' ),
584
+					'description' => __('Number of items purchased.', 'invoicing'),
585 585
 					'type'        => 'integer',
586
-					'context'     => array( 'view' ),
586
+					'context'     => array('view'),
587 587
 					'readonly'    => true,
588 588
 				),
589 589
 				'refunded_items'      => array(
590
-					'description' => __( 'Number of items refunded.', 'invoicing' ),
590
+					'description' => __('Number of items refunded.', 'invoicing'),
591 591
 					'type'        => 'integer',
592
-					'context'     => array( 'view' ),
592
+					'context'     => array('view'),
593 593
 					'readonly'    => true,
594 594
 				),
595 595
 				'total_tax'           => array(
596
-					'description' => __( 'Total charged for taxes.', 'invoicing' ),
596
+					'description' => __('Total charged for taxes.', 'invoicing'),
597 597
 					'type'        => 'string',
598
-					'context'     => array( 'view' ),
598
+					'context'     => array('view'),
599 599
 					'readonly'    => true,
600 600
 				),
601 601
 				'total_refunded_tax'  => array(
602
-					'description' => __( 'Total refunded for taxes.', 'invoicing' ),
602
+					'description' => __('Total refunded for taxes.', 'invoicing'),
603 603
 					'type'        => 'string',
604
-					'context'     => array( 'view' ),
604
+					'context'     => array('view'),
605 605
 					'readonly'    => true,
606 606
 				),
607 607
 				'total_fees'          => array(
608
-					'description' => __( 'Total fees charged.', 'invoicing' ),
608
+					'description' => __('Total fees charged.', 'invoicing'),
609 609
 					'type'        => 'string',
610
-					'context'     => array( 'view' ),
610
+					'context'     => array('view'),
611 611
 					'readonly'    => true,
612 612
 				),
613 613
 				'total_refunds'       => array(
614
-					'description' => __( 'Total of refunded invoices.', 'invoicing' ),
614
+					'description' => __('Total of refunded invoices.', 'invoicing'),
615 615
 					'type'        => 'integer',
616
-					'context'     => array( 'view' ),
616
+					'context'     => array('view'),
617 617
 					'readonly'    => true,
618 618
 				),
619 619
 				'net_refunds'         => array(
620
-					'description' => __( 'Net of refunded invoices.', 'invoicing' ),
620
+					'description' => __('Net of refunded invoices.', 'invoicing'),
621 621
 					'type'        => 'integer',
622
-					'context'     => array( 'view' ),
622
+					'context'     => array('view'),
623 623
 					'readonly'    => true,
624 624
 				),
625 625
 				'total_discount'      => array(
626
-					'description' => __( 'Total of discounts used.', 'invoicing' ),
626
+					'description' => __('Total of discounts used.', 'invoicing'),
627 627
 					'type'        => 'integer',
628
-					'context'     => array( 'view' ),
628
+					'context'     => array('view'),
629 629
 					'readonly'    => true,
630 630
 				),
631 631
 				'totals'              => array(
632
-					'description' => __( 'Totals.', 'invoicing' ),
632
+					'description' => __('Totals.', 'invoicing'),
633 633
 					'type'        => 'array',
634 634
 					'items'       => array(
635 635
 						'type' => 'array',
636 636
 					),
637
-					'context'     => array( 'view' ),
637
+					'context'     => array('view'),
638 638
 					'readonly'    => true,
639 639
 				),
640 640
 				'interval'            => array(
641
-					'description' => __( 'Number of months/days in the report period.', 'invoicing' ),
641
+					'description' => __('Number of months/days in the report period.', 'invoicing'),
642 642
 					'type'        => 'integer',
643
-					'context'     => array( 'view' ),
643
+					'context'     => array('view'),
644 644
 					'readonly'    => true,
645 645
 				),
646 646
 				'previous_range'      => array(
647
-					'description' => __( 'The previous report period.', 'invoicing' ),
647
+					'description' => __('The previous report period.', 'invoicing'),
648 648
 					'type'        => 'array',
649 649
 					'items'       => array(
650 650
 						'type' => 'string',
651 651
 					),
652
-					'context'     => array( 'view' ),
652
+					'context'     => array('view'),
653 653
 					'readonly'    => true,
654 654
 				),
655 655
 				'grouped_by'          => array(
656
-					'description' => __( 'The period used to group the totals.', 'invoicing' ),
656
+					'description' => __('The period used to group the totals.', 'invoicing'),
657 657
 					'type'        => 'string',
658
-					'context'     => array( 'view' ),
659
-					'enum'        => array( 'day', 'month' ),
658
+					'context'     => array('view'),
659
+					'enum'        => array('day', 'month'),
660 660
 					'readonly'    => true,
661 661
 				),
662 662
 				'currency'            => array(
663
-					'description' => __( 'The default store currency.', 'invoicing' ),
663
+					'description' => __('The default store currency.', 'invoicing'),
664 664
 					'type'        => 'string',
665
-					'context'     => array( 'view' ),
665
+					'context'     => array('view'),
666 666
 					'readonly'    => true,
667 667
 				),
668 668
 				'currency_symbol'     => array(
669
-					'description' => __( 'The default store currency symbol.', 'invoicing' ),
669
+					'description' => __('The default store currency symbol.', 'invoicing'),
670 670
 					'type'        => 'string',
671
-					'context'     => array( 'view' ),
671
+					'context'     => array('view'),
672 672
 					'readonly'    => true,
673 673
 				),
674 674
 				'currency_position'   => array(
675
-					'description' => __( 'The default store currency position.', 'invoicing' ),
675
+					'description' => __('The default store currency position.', 'invoicing'),
676 676
 					'type'        => 'string',
677
-					'context'     => array( 'view' ),
677
+					'context'     => array('view'),
678 678
 					'readonly'    => true,
679 679
 				),
680 680
 				'decimal_places'      => array(
681
-					'description' => __( 'The default store decimal places.', 'invoicing' ),
681
+					'description' => __('The default store decimal places.', 'invoicing'),
682 682
 					'type'        => 'string',
683
-					'context'     => array( 'view' ),
683
+					'context'     => array('view'),
684 684
 					'readonly'    => true,
685 685
 				),
686 686
 				'thousands_sep'       => array(
687
-					'description' => __( 'The default store thousands separator.', 'invoicing' ),
687
+					'description' => __('The default store thousands separator.', 'invoicing'),
688 688
 					'type'        => 'string',
689
-					'context'     => array( 'view' ),
689
+					'context'     => array('view'),
690 690
 					'readonly'    => true,
691 691
 				),
692 692
 				'decimals_sep'        => array(
693
-					'description' => __( 'The default store decimals separator.', 'invoicing' ),
693
+					'description' => __('The default store decimals separator.', 'invoicing'),
694 694
 					'type'        => 'string',
695
-					'context'     => array( 'view' ),
695
+					'context'     => array('view'),
696 696
 					'readonly'    => true,
697 697
 				),
698 698
 			),
699 699
 		);
700 700
 
701
-		return $this->add_additional_fields_schema( $schema );
701
+		return $this->add_additional_fields_schema($schema);
702 702
 
703 703
 	}
704 704
 
Please login to merge, or discard this patch.
includes/api/class-getpaid-rest-settings-controller.php 2 patches
Indentation   +743 added lines, -743 removed lines patch added patch discarded remove patch
@@ -18,756 +18,756 @@
 block discarded – undo
18 18
  */
19 19
 class GetPaid_REST_Settings_Controller extends GetPaid_REST_Controller {
20 20
 
21
-	/**
22
-	 * An array of available settings.
23
-	 *
24
-	 * @var string
25
-	 */
26
-	protected $settings;
27
-
28
-	/**
29
-	 * Route base.
30
-	 *
31
-	 * @var string
32
-	 */
33
-	protected $rest_base = 'settings';
34
-
35
-	/**
36
-	 * Registers the routes for the objects of the controller.
37
-	 *
38
-	 * @since 2.0.0
39
-	 *
40
-	 * @see register_rest_route()
41
-	 */
42
-	public function register_namespace_routes( $namespace ) {
43
-
44
-		// List all registered tabs.
45
-		register_rest_route(
46
-			$namespace,
47
-			$this->rest_base,
48
-			array(
49
-				array(
50
-					'methods'             => WP_REST_Server::READABLE,
51
-					'callback'            => array( $this, 'get_tabs' ),
52
-					'permission_callback' => array( $this, 'get_items_permissions_check' ),
53
-				),
54
-				'schema' => '__return_empty_array',
55
-			)
56
-		);
57
-
58
-		// View/Update a single setting.
59
-		register_rest_route(
60
-			$namespace,
61
-			$this->rest_base . '/setting/(?P<id>[\w-]+)',
62
-			array(
63
-				'args'   => array(
64
-					'id' => array(
65
-						'description' => __( 'Unique identifier for the setting.', 'invoicing' ),
66
-						'type'        => 'string',
67
-						'required'    => true,
68
-					),
69
-				),
70
-				array(
71
-					'methods'             => WP_REST_Server::READABLE,
72
-					'callback'            => array( $this, 'get_item' ),
73
-					'permission_callback' => array( $this, 'get_items_permissions_check' ),
74
-				),
75
-				array(
76
-					'methods'             => WP_REST_Server::EDITABLE,
77
-					'callback'            => array( $this, 'update_item' ),
78
-					'permission_callback' => array( $this, 'update_items_permissions_check' ),
79
-					'args'                => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
80
-				),
81
-				'schema' => array( $this, 'get_public_item_schema' ),
82
-			)
83
-		);
84
-
85
-		// List registered sections for a given tab.
86
-		register_rest_route(
87
-			$namespace,
88
-			$this->rest_base . '/(?P<tab>[\w-]+)',
89
-			array(
90
-				'args'   => array(
91
-					'tab' => array(
92
-						'description' => __( 'Unique identifier for the tab whose sections should be retrieved.', 'invoicing' ),
93
-						'type'        => 'string',
94
-						'required'    => true,
95
-						'enum'        => array_keys( wpinv_get_settings_tabs() ),
96
-					),
97
-				),
98
-				array(
99
-					'methods'             => WP_REST_Server::READABLE,
100
-					'callback'            => array( $this, 'get_sections' ),
101
-					'permission_callback' => array( $this, 'get_items_permissions_check' ),
102
-				),
103
-				'schema' => '__return_empty_array',
104
-			)
105
-		);
106
-
107
-		// List all registered settings for a given tab.
108
-		register_rest_route(
109
-			$namespace,
110
-			$this->rest_base . '/(?P<tab>[\w-]+)/(?P<section>[\w-]+)',
111
-			array(
112
-				'args'   => array(
113
-					'tab'     => array(
114
-						'description' => __( 'Unique identifier for the tab whose settings should be retrieved.', 'invoicing' ),
115
-						'type'        => 'string',
116
-						'required'    => true,
117
-						'enum'        => array_keys( wpinv_get_settings_tabs() ),
118
-					),
119
-					'section' => array(
120
-						'description' => __( 'The section in the tab whose settings should be retrieved.', 'invoicing' ),
121
-						'type'        => 'string',
122
-						'required'    => true,
123
-					),
124
-				),
125
-				array(
126
-					'methods'             => WP_REST_Server::READABLE,
127
-					'callback'            => array( $this, 'get_items' ),
128
-					'permission_callback' => array( $this, 'get_items_permissions_check' ),
129
-				),
130
-				'schema' => array( $this, 'get_public_item_schema' ),
131
-			)
132
-		); 
133
-
134
-		register_rest_route(
135
-			$namespace,
136
-			'/' . $this->rest_base . '/batch',
137
-			array(
138
-				'args'   => array(
139
-					'id' => array(
140
-						'description' => __( 'Setting ID.', 'invoicing' ),
141
-						'type'        => 'string',
142
-					),
143
-				),
144
-				array(
145
-					'methods'             => WP_REST_Server::EDITABLE,
146
-					'callback'            => array( $this, 'batch_items' ),
147
-					'permission_callback' => array( $this, 'batch_items_permissions_check' ),
148
-					'args'                => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
149
-				),
150
-				'schema' => array( $this, 'get_public_batch_schema' ),
151
-			)
152
-		);
153
-
154
-	}
155
-
156
-	/**
157
-	 * Return all settings.
158
-	 *
159
-	 * @since  2.0.0
160
-	 * @param  WP_REST_Request $request Request data.
161
-	 * @return WP_Error|WP_REST_Response
162
-	 */
163
-	public function get_items( $request ) {
164
-
165
-		$settings = $this->get_settings();
166
-
167
-		if ( ! isset( $settings[ $request['tab'] ] ) ) {
168
-			return new WP_Error( 'rest_invalid_tab', __( 'Invalid tab.', 'invoicing' ), array( 'status' => 400 ) );
169
-		}
170
-
171
-		if ( ! isset( $settings[ $request['tab'] ][ $request['section'] ] ) ) {
172
-			return new WP_Error( 'rest_invalid_section', __( 'Invalid section.', 'invoicing' ), array( 'status' => 400 ) );
173
-		}
174
-
175
-		$settings = $settings[ $request['tab'] ][ $request['section'] ];
176
-		$prepared = array();
177
-
178
-		foreach ( $settings as $setting ) {
179
-
180
-			$setting      = $this->sanitize_setting( $setting );
181
-			$setting_data = $this->prepare_item_for_response( $setting, $request );
182
-			$setting_data = $this->prepare_response_for_collection( $setting_data );
183
-
184
-			if ( $this->is_setting_type_valid( $setting['type'] ) ) {
185
-				$prepared[]   = $setting_data;
186
-			}
21
+    /**
22
+     * An array of available settings.
23
+     *
24
+     * @var string
25
+     */
26
+    protected $settings;
27
+
28
+    /**
29
+     * Route base.
30
+     *
31
+     * @var string
32
+     */
33
+    protected $rest_base = 'settings';
34
+
35
+    /**
36
+     * Registers the routes for the objects of the controller.
37
+     *
38
+     * @since 2.0.0
39
+     *
40
+     * @see register_rest_route()
41
+     */
42
+    public function register_namespace_routes( $namespace ) {
43
+
44
+        // List all registered tabs.
45
+        register_rest_route(
46
+            $namespace,
47
+            $this->rest_base,
48
+            array(
49
+                array(
50
+                    'methods'             => WP_REST_Server::READABLE,
51
+                    'callback'            => array( $this, 'get_tabs' ),
52
+                    'permission_callback' => array( $this, 'get_items_permissions_check' ),
53
+                ),
54
+                'schema' => '__return_empty_array',
55
+            )
56
+        );
57
+
58
+        // View/Update a single setting.
59
+        register_rest_route(
60
+            $namespace,
61
+            $this->rest_base . '/setting/(?P<id>[\w-]+)',
62
+            array(
63
+                'args'   => array(
64
+                    'id' => array(
65
+                        'description' => __( 'Unique identifier for the setting.', 'invoicing' ),
66
+                        'type'        => 'string',
67
+                        'required'    => true,
68
+                    ),
69
+                ),
70
+                array(
71
+                    'methods'             => WP_REST_Server::READABLE,
72
+                    'callback'            => array( $this, 'get_item' ),
73
+                    'permission_callback' => array( $this, 'get_items_permissions_check' ),
74
+                ),
75
+                array(
76
+                    'methods'             => WP_REST_Server::EDITABLE,
77
+                    'callback'            => array( $this, 'update_item' ),
78
+                    'permission_callback' => array( $this, 'update_items_permissions_check' ),
79
+                    'args'                => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
80
+                ),
81
+                'schema' => array( $this, 'get_public_item_schema' ),
82
+            )
83
+        );
84
+
85
+        // List registered sections for a given tab.
86
+        register_rest_route(
87
+            $namespace,
88
+            $this->rest_base . '/(?P<tab>[\w-]+)',
89
+            array(
90
+                'args'   => array(
91
+                    'tab' => array(
92
+                        'description' => __( 'Unique identifier for the tab whose sections should be retrieved.', 'invoicing' ),
93
+                        'type'        => 'string',
94
+                        'required'    => true,
95
+                        'enum'        => array_keys( wpinv_get_settings_tabs() ),
96
+                    ),
97
+                ),
98
+                array(
99
+                    'methods'             => WP_REST_Server::READABLE,
100
+                    'callback'            => array( $this, 'get_sections' ),
101
+                    'permission_callback' => array( $this, 'get_items_permissions_check' ),
102
+                ),
103
+                'schema' => '__return_empty_array',
104
+            )
105
+        );
106
+
107
+        // List all registered settings for a given tab.
108
+        register_rest_route(
109
+            $namespace,
110
+            $this->rest_base . '/(?P<tab>[\w-]+)/(?P<section>[\w-]+)',
111
+            array(
112
+                'args'   => array(
113
+                    'tab'     => array(
114
+                        'description' => __( 'Unique identifier for the tab whose settings should be retrieved.', 'invoicing' ),
115
+                        'type'        => 'string',
116
+                        'required'    => true,
117
+                        'enum'        => array_keys( wpinv_get_settings_tabs() ),
118
+                    ),
119
+                    'section' => array(
120
+                        'description' => __( 'The section in the tab whose settings should be retrieved.', 'invoicing' ),
121
+                        'type'        => 'string',
122
+                        'required'    => true,
123
+                    ),
124
+                ),
125
+                array(
126
+                    'methods'             => WP_REST_Server::READABLE,
127
+                    'callback'            => array( $this, 'get_items' ),
128
+                    'permission_callback' => array( $this, 'get_items_permissions_check' ),
129
+                ),
130
+                'schema' => array( $this, 'get_public_item_schema' ),
131
+            )
132
+        ); 
133
+
134
+        register_rest_route(
135
+            $namespace,
136
+            '/' . $this->rest_base . '/batch',
137
+            array(
138
+                'args'   => array(
139
+                    'id' => array(
140
+                        'description' => __( 'Setting ID.', 'invoicing' ),
141
+                        'type'        => 'string',
142
+                    ),
143
+                ),
144
+                array(
145
+                    'methods'             => WP_REST_Server::EDITABLE,
146
+                    'callback'            => array( $this, 'batch_items' ),
147
+                    'permission_callback' => array( $this, 'batch_items_permissions_check' ),
148
+                    'args'                => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
149
+                ),
150
+                'schema' => array( $this, 'get_public_batch_schema' ),
151
+            )
152
+        );
153
+
154
+    }
155
+
156
+    /**
157
+     * Return all settings.
158
+     *
159
+     * @since  2.0.0
160
+     * @param  WP_REST_Request $request Request data.
161
+     * @return WP_Error|WP_REST_Response
162
+     */
163
+    public function get_items( $request ) {
164
+
165
+        $settings = $this->get_settings();
166
+
167
+        if ( ! isset( $settings[ $request['tab'] ] ) ) {
168
+            return new WP_Error( 'rest_invalid_tab', __( 'Invalid tab.', 'invoicing' ), array( 'status' => 400 ) );
169
+        }
170
+
171
+        if ( ! isset( $settings[ $request['tab'] ][ $request['section'] ] ) ) {
172
+            return new WP_Error( 'rest_invalid_section', __( 'Invalid section.', 'invoicing' ), array( 'status' => 400 ) );
173
+        }
174
+
175
+        $settings = $settings[ $request['tab'] ][ $request['section'] ];
176
+        $prepared = array();
177
+
178
+        foreach ( $settings as $setting ) {
179
+
180
+            $setting      = $this->sanitize_setting( $setting );
181
+            $setting_data = $this->prepare_item_for_response( $setting, $request );
182
+            $setting_data = $this->prepare_response_for_collection( $setting_data );
183
+
184
+            if ( $this->is_setting_type_valid( $setting['type'] ) ) {
185
+                $prepared[]   = $setting_data;
186
+            }
187 187
 }
188 188
 
189
-		return rest_ensure_response( $prepared );
190
-	}
191
-
192
-	/**
193
-	 * Return a single setting.
194
-	 *
195
-	 * @since  2.0.0
196
-	 * @param  WP_REST_Request $request Request data.
197
-	 * @return WP_Error|WP_REST_Response
198
-	 */
199
-	public function get_item( $request ) {
200
-		$setting  = $this->get_setting( $request['id'] );
201
-
202
-		if ( is_wp_error( $setting ) ) {
203
-			return $setting;
204
-		}
205
-
206
-		$setting  = $this->sanitize_setting( $setting );
207
-		$response = $this->prepare_item_for_response( $setting, $request );
208
-		return rest_ensure_response( $response );
209
-	}
210
-
211
-	/**
212
-	 * Update a single setting.
213
-	 *
214
-	 * @since  2.0.0
215
-	 * @param  WP_REST_Request $request Request data.
216
-	 * @return WP_Error|WP_REST_Response
217
-	 */
218
-	public function update_item( $request ) {
219
-		$setting = $this->get_setting( $request['id'] );
220
-
221
-		if ( is_wp_error( $setting ) ) {
222
-			return $setting;
223
-		}
224
-
225
-		if ( is_callable( array( $this, 'validate_setting_' . $setting['type'] . '_field' ) ) ) {
226
-			$value = $this->{'validate_setting_' . $setting['type'] . '_field'}( $request['value'], $setting );
227
-		} else {
228
-			$value = $this->validate_setting_text_field( $request['value'], $setting );
229
-		}
230
-
231
-		if ( is_wp_error( $value ) ) {
232
-			return $value;
233
-		}
234
-
235
-		wpinv_update_option( $request['id'], $value );
236
-		$setting['value'] = $value;
237
-		$setting          = $this->sanitize_setting( $setting );
238
-		$response         = $this->prepare_item_for_response( $setting, $request );
239
-
240
-		return rest_ensure_response( $response );
241
-	}
242
-
243
-	/**
244
-	 * Makes sure the current user has access to READ the settings APIs.
245
-	 *
246
-	 * @since  2.0.0
247
-	 * @param WP_REST_Request $request Full data about the request.
248
-	 * @return WP_Error|boolean
249
-	 */
250
-	public function get_items_permissions_check( $request ) {
251
-		if ( ! wpinv_current_user_can_manage_invoicing() ) {
252
-			return new WP_Error( 'rest_cannot_view', __( 'Sorry, you cannot list resources.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
253
-		}
254
-
255
-		return true;
256
-	}
257
-
258
-	/**
259
-	 * Makes sure the current user has access to WRITE the settings APIs.
260
-	 *
261
-	 * @since  2.0.0
262
-	 * @param WP_REST_Request $request Full data about the request.
263
-	 * @return WP_Error|boolean
264
-	 */
265
-	public function update_items_permissions_check( $request ) {
266
-		if ( ! wpinv_current_user_can_manage_invoicing() ) {
267
-			return new WP_Error( 'rest_cannot_edit', __( 'Sorry, you cannot edit this resource.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
268
-		}
269
-
270
-		return true;
271
-	}
272
-
273
-	/**
274
-	 * Check if a given request has access batch create, update and delete items.
275
-	 *
276
-	 * @param  WP_REST_Request $request Full details about the request.
277
-	 *
278
-	 * @return boolean|WP_Error
279
-	 */
280
-	public function batch_items_permissions_check( $request ) {
281
-		return wpinv_current_user_can_manage_invoicing() ? true : new WP_Error( 'rest_cannot_batch', __( 'Sorry, you are not allowed to batch manipulate this resource.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
282
-	}
283
-
284
-	/**
285
-	 * Prepare links for the request.
286
-	 *
287
-	 * @param string $setting_id Setting ID.
288
-	 * @return array Links for the given setting.
289
-	 */
290
-	protected function prepare_links( $setting_id ) {
291
-
292
-		$links = array(
293
-			'self'       => array(
294
-				'href' => rest_url( sprintf( '/%s/%s/setting/%s', $this->namespace, $this->rest_base, $setting_id ) ),
295
-			),
296
-			'collection' => array(
297
-				'href' => rest_url( sprintf( '/%s/%s', $this->namespace, $this->rest_base ) ),
298
-			),
299
-		);
300
-
301
-		return $links;
302
-	}
303
-
304
-	/**
305
-	 * Prepare a settings object for serialization.
306
-	 *
307
-	 * @since  2.0.0
308
-	 * @param array           $item Setting object.
309
-	 * @param WP_REST_Request $request Request object.
310
-	 * @return WP_REST_Response $response Response data.
311
-	 */
312
-	public function prepare_item_for_response( $item, $request ) {
313
-		$context = empty( $request['context'] ) ? 'view' : $request['context'];
314
-		$data    = $this->add_additional_fields_to_object( $item, $request );
315
-		$data    = $this->filter_response_by_context( $data, $context );
316
-
317
-		$response = rest_ensure_response( $data );
318
-
319
-		$response->add_links( $this->prepare_links( $item['id'] ) );
320
-
321
-		return $response;
322
-	}
323
-
324
-	/**
325
-	 * Filters out bad values from the settings array/filter so we
326
-	 * only return known values via the API.
327
-	 *
328
-	 * @since 2.0.0
329
-	 * @param  array $setting Setting.
330
-	 * @return array
331
-	 */
332
-	public function filter_setting( $setting ) {
333
-		return array_intersect_key(
334
-			$setting,
335
-			array_flip( array_filter( array_keys( $setting ), array( $this, 'allowed_setting_keys' ) ) )
336
-		);
337
-	}
338
-
339
-	/**
340
-	 * Callback for allowed keys for each setting response.
341
-	 *
342
-	 * @param  string $key Key to check.
343
-	 * @return boolean
344
-	 */
345
-	public function allowed_setting_keys( $key ) {
346
-		return in_array( $key, array_keys( $this->setting_defaults() ), true );
347
-	}
348
-
349
-	/**
350
-	 * Returns default options for a setting. null means the field is required.
351
-	 *
352
-	 * @since  2.0.0
353
-	 * @return array
354
-	 */
355
-	protected function setting_defaults() {
356
-		return array(
357
-			'id'          => null,
358
-			'name'        => null,
359
-			'desc'        => '',
360
-			'options'     => array(),
361
-			'std'         => false,
362
-			'value'       => false,
363
-			'placeholder' => '',
364
-			'readonly'    => false,
365
-			'faux'        => false,
366
-			'section'     => 'main',
367
-			'tab'         => 'general',
368
-			'type'        => 'text',
369
-		);
370
-	}
371
-
372
-	/**
373
-	 * Sanitizes a setting's field.
374
-	 *
375
-	 * @param  array $setting The setting to sanitize.
376
-	 * @return array
377
-	 */
378
-	public function sanitize_setting( $setting ) {
379
-
380
-		$setting          = wp_parse_args( $setting, $this->setting_defaults() );
381
-		$setting['value'] = wpinv_get_option( $setting['id'], $setting['std'] );
382
-		return $this->filter_setting( $setting );
383
-
384
-	}
385
-
386
-	/**
387
-	 * Get setting data.
388
-	 *
389
-	 * @since  2.0.0
390
-	 * @param string $setting_id Setting ID.
391
-	 * @return array|WP_Error
392
-	 */
393
-	public function get_setting( $setting_id ) {
394
-
395
-		if ( empty( $setting_id ) ) {
396
-			return new WP_Error( 'rest_setting_setting_invalid', __( 'Invalid setting.', 'invoicing' ), array( 'status' => 404 ) );
397
-		}
398
-
399
-		$settings  = $this->get_settings();
400
-
401
-		foreach ( $settings as $tabs ) {
402
-
403
-			foreach ( $tabs as $sections ) {
404
-
405
-				if ( isset( $sections[ $setting_id ] ) ) {
406
-					if ( ! $this->is_setting_type_valid( $sections[ $setting_id ]['type'] ) ) {
407
-						return new WP_Error( 'rest_setting_setting_type_invalid', __( 'Invalid setting type.', 'invoicing' ), array( 'status' => 404 ) );
408
-					}
409
-
410
-					return $sections[ $setting_id ];
411
-				}
189
+        return rest_ensure_response( $prepared );
190
+    }
191
+
192
+    /**
193
+     * Return a single setting.
194
+     *
195
+     * @since  2.0.0
196
+     * @param  WP_REST_Request $request Request data.
197
+     * @return WP_Error|WP_REST_Response
198
+     */
199
+    public function get_item( $request ) {
200
+        $setting  = $this->get_setting( $request['id'] );
201
+
202
+        if ( is_wp_error( $setting ) ) {
203
+            return $setting;
204
+        }
205
+
206
+        $setting  = $this->sanitize_setting( $setting );
207
+        $response = $this->prepare_item_for_response( $setting, $request );
208
+        return rest_ensure_response( $response );
209
+    }
210
+
211
+    /**
212
+     * Update a single setting.
213
+     *
214
+     * @since  2.0.0
215
+     * @param  WP_REST_Request $request Request data.
216
+     * @return WP_Error|WP_REST_Response
217
+     */
218
+    public function update_item( $request ) {
219
+        $setting = $this->get_setting( $request['id'] );
220
+
221
+        if ( is_wp_error( $setting ) ) {
222
+            return $setting;
223
+        }
224
+
225
+        if ( is_callable( array( $this, 'validate_setting_' . $setting['type'] . '_field' ) ) ) {
226
+            $value = $this->{'validate_setting_' . $setting['type'] . '_field'}( $request['value'], $setting );
227
+        } else {
228
+            $value = $this->validate_setting_text_field( $request['value'], $setting );
229
+        }
230
+
231
+        if ( is_wp_error( $value ) ) {
232
+            return $value;
233
+        }
234
+
235
+        wpinv_update_option( $request['id'], $value );
236
+        $setting['value'] = $value;
237
+        $setting          = $this->sanitize_setting( $setting );
238
+        $response         = $this->prepare_item_for_response( $setting, $request );
239
+
240
+        return rest_ensure_response( $response );
241
+    }
242
+
243
+    /**
244
+     * Makes sure the current user has access to READ the settings APIs.
245
+     *
246
+     * @since  2.0.0
247
+     * @param WP_REST_Request $request Full data about the request.
248
+     * @return WP_Error|boolean
249
+     */
250
+    public function get_items_permissions_check( $request ) {
251
+        if ( ! wpinv_current_user_can_manage_invoicing() ) {
252
+            return new WP_Error( 'rest_cannot_view', __( 'Sorry, you cannot list resources.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
253
+        }
254
+
255
+        return true;
256
+    }
257
+
258
+    /**
259
+     * Makes sure the current user has access to WRITE the settings APIs.
260
+     *
261
+     * @since  2.0.0
262
+     * @param WP_REST_Request $request Full data about the request.
263
+     * @return WP_Error|boolean
264
+     */
265
+    public function update_items_permissions_check( $request ) {
266
+        if ( ! wpinv_current_user_can_manage_invoicing() ) {
267
+            return new WP_Error( 'rest_cannot_edit', __( 'Sorry, you cannot edit this resource.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
268
+        }
269
+
270
+        return true;
271
+    }
272
+
273
+    /**
274
+     * Check if a given request has access batch create, update and delete items.
275
+     *
276
+     * @param  WP_REST_Request $request Full details about the request.
277
+     *
278
+     * @return boolean|WP_Error
279
+     */
280
+    public function batch_items_permissions_check( $request ) {
281
+        return wpinv_current_user_can_manage_invoicing() ? true : new WP_Error( 'rest_cannot_batch', __( 'Sorry, you are not allowed to batch manipulate this resource.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
282
+    }
283
+
284
+    /**
285
+     * Prepare links for the request.
286
+     *
287
+     * @param string $setting_id Setting ID.
288
+     * @return array Links for the given setting.
289
+     */
290
+    protected function prepare_links( $setting_id ) {
291
+
292
+        $links = array(
293
+            'self'       => array(
294
+                'href' => rest_url( sprintf( '/%s/%s/setting/%s', $this->namespace, $this->rest_base, $setting_id ) ),
295
+            ),
296
+            'collection' => array(
297
+                'href' => rest_url( sprintf( '/%s/%s', $this->namespace, $this->rest_base ) ),
298
+            ),
299
+        );
300
+
301
+        return $links;
302
+    }
303
+
304
+    /**
305
+     * Prepare a settings object for serialization.
306
+     *
307
+     * @since  2.0.0
308
+     * @param array           $item Setting object.
309
+     * @param WP_REST_Request $request Request object.
310
+     * @return WP_REST_Response $response Response data.
311
+     */
312
+    public function prepare_item_for_response( $item, $request ) {
313
+        $context = empty( $request['context'] ) ? 'view' : $request['context'];
314
+        $data    = $this->add_additional_fields_to_object( $item, $request );
315
+        $data    = $this->filter_response_by_context( $data, $context );
316
+
317
+        $response = rest_ensure_response( $data );
318
+
319
+        $response->add_links( $this->prepare_links( $item['id'] ) );
320
+
321
+        return $response;
322
+    }
323
+
324
+    /**
325
+     * Filters out bad values from the settings array/filter so we
326
+     * only return known values via the API.
327
+     *
328
+     * @since 2.0.0
329
+     * @param  array $setting Setting.
330
+     * @return array
331
+     */
332
+    public function filter_setting( $setting ) {
333
+        return array_intersect_key(
334
+            $setting,
335
+            array_flip( array_filter( array_keys( $setting ), array( $this, 'allowed_setting_keys' ) ) )
336
+        );
337
+    }
338
+
339
+    /**
340
+     * Callback for allowed keys for each setting response.
341
+     *
342
+     * @param  string $key Key to check.
343
+     * @return boolean
344
+     */
345
+    public function allowed_setting_keys( $key ) {
346
+        return in_array( $key, array_keys( $this->setting_defaults() ), true );
347
+    }
348
+
349
+    /**
350
+     * Returns default options for a setting. null means the field is required.
351
+     *
352
+     * @since  2.0.0
353
+     * @return array
354
+     */
355
+    protected function setting_defaults() {
356
+        return array(
357
+            'id'          => null,
358
+            'name'        => null,
359
+            'desc'        => '',
360
+            'options'     => array(),
361
+            'std'         => false,
362
+            'value'       => false,
363
+            'placeholder' => '',
364
+            'readonly'    => false,
365
+            'faux'        => false,
366
+            'section'     => 'main',
367
+            'tab'         => 'general',
368
+            'type'        => 'text',
369
+        );
370
+    }
371
+
372
+    /**
373
+     * Sanitizes a setting's field.
374
+     *
375
+     * @param  array $setting The setting to sanitize.
376
+     * @return array
377
+     */
378
+    public function sanitize_setting( $setting ) {
379
+
380
+        $setting          = wp_parse_args( $setting, $this->setting_defaults() );
381
+        $setting['value'] = wpinv_get_option( $setting['id'], $setting['std'] );
382
+        return $this->filter_setting( $setting );
383
+
384
+    }
385
+
386
+    /**
387
+     * Get setting data.
388
+     *
389
+     * @since  2.0.0
390
+     * @param string $setting_id Setting ID.
391
+     * @return array|WP_Error
392
+     */
393
+    public function get_setting( $setting_id ) {
394
+
395
+        if ( empty( $setting_id ) ) {
396
+            return new WP_Error( 'rest_setting_setting_invalid', __( 'Invalid setting.', 'invoicing' ), array( 'status' => 404 ) );
397
+        }
398
+
399
+        $settings  = $this->get_settings();
400
+
401
+        foreach ( $settings as $tabs ) {
402
+
403
+            foreach ( $tabs as $sections ) {
404
+
405
+                if ( isset( $sections[ $setting_id ] ) ) {
406
+                    if ( ! $this->is_setting_type_valid( $sections[ $setting_id ]['type'] ) ) {
407
+                        return new WP_Error( 'rest_setting_setting_type_invalid', __( 'Invalid setting type.', 'invoicing' ), array( 'status' => 404 ) );
408
+                    }
409
+
410
+                    return $sections[ $setting_id ];
411
+                }
412 412
 }
413 413
 }
414 414
 
415
-		return new WP_Error( 'rest_setting_setting_invalid', __( 'Invalid setting.', 'invoicing' ), array( 'status' => 404 ) );
416
-	}
417
-
418
-	/**
419
-	 * Get all tabs.
420
-	 *
421
-	 * @param  WP_REST_Request $request Request data.
422
-	 * @return array
423
-	 */
424
-	public function get_tabs( $request ) {
425
-		$tabs     = wpinv_get_settings_tabs();
426
-		$prepared = array();
427
-
428
-		foreach ( $tabs as $id => $tab ) {
429
-
430
-			$_request        = $request;
431
-			$_request['tab'] = sanitize_title( $id );
432
-			$data            = array(
433
-				'id'       => sanitize_title( $id ),
434
-				'label'    => sanitize_text_field( $tab ),
435
-				'sections' => $this->get_sections( $_request ),
436
-			);
437
-
438
-			$data     = $this->add_additional_fields_to_object( $data, $request );
439
-			$response = rest_ensure_response( $data );
440
-
441
-			if ( ! is_wp_error( $response ) ) {
442
-				$links = array(
443
-					'sections'   => array(
444
-						'href' => rest_url( sprintf( '/%s/%s/%s', $this->namespace, $this->rest_base, $id ) ),
445
-					),
446
-					'collection' => array(
447
-						'href' => rest_url( sprintf( '/%s/%s', $this->namespace, $this->rest_base ) ),
448
-					),
449
-				);
450
-				$response->add_links( $links );
451
-				$response = $this->prepare_response_for_collection( $response );
452
-			}
453
-
454
-			$prepared[] = $response;
455
-
456
-		}
457
-
458
-		return rest_ensure_response( $prepared );
459
-	}
460
-
461
-	/**
462
-	 * Get all sections.
463
-	 *
464
-	 * @param  WP_REST_Request $request Request data.
465
-	 * @return array
466
-	 */
467
-	public function get_sections( $request ) {
468
-
469
-		$tab      = sanitize_title( $request['tab'] );
470
-		$sections = wpinv_get_settings_tab_sections( $tab );
471
-		$prepared = array();
472
-
473
-		foreach ( $sections as $id => $section ) {
474
-
475
-			$data            = array(
476
-				'id'    => sanitize_title( $id ),
477
-				'label' => sanitize_text_field( $section ),
478
-			);
479
-
480
-			$data     = $this->add_additional_fields_to_object( $data, $request );
481
-			$response = rest_ensure_response( $data );
482
-
483
-			if ( ! is_wp_error( $response ) ) {
484
-				$links = array(
485
-					'settings'   => array(
486
-						'href' => rest_url( sprintf( '/%s/%s/%s/%s', $this->namespace, $this->rest_base, $tab, $id ) ),
487
-					),
488
-					'collection' => array(
489
-						'href' => rest_url( sprintf( '/%s/%s/%s', $this->namespace, $this->rest_base, $tab ) ),
490
-					),
491
-					'tabs'       => array(
492
-						'href' => rest_url( sprintf( '/%s/%s', $this->namespace, $this->rest_base ) ),
493
-					),
494
-				);
495
-				$response->add_links( $links );
496
-				$response = $this->prepare_response_for_collection( $response );
497
-			}
498
-
499
-			$prepared[] = $response;
500
-
501
-		}
502
-
503
-		return rest_ensure_response( $prepared );
504
-	}
505
-
506
-	/**
507
-	 * Get all settings.
508
-	 *
509
-	 * @return array
510
-	 */
511
-	public function get_settings() {
512
-
513
-		if ( empty( $this->settings ) ) {
514
-			$this->settings = wpinv_get_registered_settings();
515
-		}
516
-
517
-		return $this->settings;
518
-
519
-	}
520
-
521
-	/**
522
-	 * Boolean for if a setting type is a valid supported setting type.
523
-	 *
524
-	 * @since  2.0.0
525
-	 * @param  string $type Type.
526
-	 * @return bool
527
-	 */
528
-	public function is_setting_type_valid( $type ) {
529
-
530
-		return in_array(
531
-			$type,
415
+        return new WP_Error( 'rest_setting_setting_invalid', __( 'Invalid setting.', 'invoicing' ), array( 'status' => 404 ) );
416
+    }
417
+
418
+    /**
419
+     * Get all tabs.
420
+     *
421
+     * @param  WP_REST_Request $request Request data.
422
+     * @return array
423
+     */
424
+    public function get_tabs( $request ) {
425
+        $tabs     = wpinv_get_settings_tabs();
426
+        $prepared = array();
427
+
428
+        foreach ( $tabs as $id => $tab ) {
429
+
430
+            $_request        = $request;
431
+            $_request['tab'] = sanitize_title( $id );
432
+            $data            = array(
433
+                'id'       => sanitize_title( $id ),
434
+                'label'    => sanitize_text_field( $tab ),
435
+                'sections' => $this->get_sections( $_request ),
436
+            );
437
+
438
+            $data     = $this->add_additional_fields_to_object( $data, $request );
439
+            $response = rest_ensure_response( $data );
440
+
441
+            if ( ! is_wp_error( $response ) ) {
442
+                $links = array(
443
+                    'sections'   => array(
444
+                        'href' => rest_url( sprintf( '/%s/%s/%s', $this->namespace, $this->rest_base, $id ) ),
445
+                    ),
446
+                    'collection' => array(
447
+                        'href' => rest_url( sprintf( '/%s/%s', $this->namespace, $this->rest_base ) ),
448
+                    ),
449
+                );
450
+                $response->add_links( $links );
451
+                $response = $this->prepare_response_for_collection( $response );
452
+            }
453
+
454
+            $prepared[] = $response;
455
+
456
+        }
457
+
458
+        return rest_ensure_response( $prepared );
459
+    }
460
+
461
+    /**
462
+     * Get all sections.
463
+     *
464
+     * @param  WP_REST_Request $request Request data.
465
+     * @return array
466
+     */
467
+    public function get_sections( $request ) {
468
+
469
+        $tab      = sanitize_title( $request['tab'] );
470
+        $sections = wpinv_get_settings_tab_sections( $tab );
471
+        $prepared = array();
472
+
473
+        foreach ( $sections as $id => $section ) {
474
+
475
+            $data            = array(
476
+                'id'    => sanitize_title( $id ),
477
+                'label' => sanitize_text_field( $section ),
478
+            );
479
+
480
+            $data     = $this->add_additional_fields_to_object( $data, $request );
481
+            $response = rest_ensure_response( $data );
482
+
483
+            if ( ! is_wp_error( $response ) ) {
484
+                $links = array(
485
+                    'settings'   => array(
486
+                        'href' => rest_url( sprintf( '/%s/%s/%s/%s', $this->namespace, $this->rest_base, $tab, $id ) ),
487
+                    ),
488
+                    'collection' => array(
489
+                        'href' => rest_url( sprintf( '/%s/%s/%s', $this->namespace, $this->rest_base, $tab ) ),
490
+                    ),
491
+                    'tabs'       => array(
492
+                        'href' => rest_url( sprintf( '/%s/%s', $this->namespace, $this->rest_base ) ),
493
+                    ),
494
+                );
495
+                $response->add_links( $links );
496
+                $response = $this->prepare_response_for_collection( $response );
497
+            }
498
+
499
+            $prepared[] = $response;
500
+
501
+        }
502
+
503
+        return rest_ensure_response( $prepared );
504
+    }
505
+
506
+    /**
507
+     * Get all settings.
508
+     *
509
+     * @return array
510
+     */
511
+    public function get_settings() {
512
+
513
+        if ( empty( $this->settings ) ) {
514
+            $this->settings = wpinv_get_registered_settings();
515
+        }
516
+
517
+        return $this->settings;
518
+
519
+    }
520
+
521
+    /**
522
+     * Boolean for if a setting type is a valid supported setting type.
523
+     *
524
+     * @since  2.0.0
525
+     * @param  string $type Type.
526
+     * @return bool
527
+     */
528
+    public function is_setting_type_valid( $type ) {
529
+
530
+        return in_array(
531
+            $type,
532 532
             array(
533
-				'text',         // Validates with validate_setting_text_field.
534
-				'email',        // Validates with validate_setting_text_field.
535
-				'number',       // Validates with validate_setting_text_field.
536
-				'color',        // Validates with validate_setting_text_field.
537
-				'password',     // Validates with validate_setting_text_field.
538
-				'textarea',     // Validates with validate_setting_textarea_field.
539
-				'select',       // Validates with validate_setting_select_field.
540
-				'multiselect',  // Validates with validate_setting_multiselect_field.
541
-				'radio',        // Validates with validate_setting_radio_field (-> validate_setting_select_field).
542
-				'checkbox',     // Validates with validate_setting_checkbox_field.
543
-				'header',       // Validates with validate_setting_text_field.
544
-			)
545
-		);
546
-
547
-	}
548
-
549
-	/**
550
-	 * Get the settings schema, conforming to JSON Schema.
551
-	 *
552
-	 * @return array
553
-	 */
554
-	public function get_item_schema() {
555
-
556
-		// Maybe retrieve the schema from cache.
557
-		if ( ! empty( $this->schema ) ) {
558
-			return $this->add_additional_fields_schema( $this->schema );
559
-		}
560
-
561
-		$schema = array(
562
-			'$schema'    => 'http://json-schema.org/draft-04/schema#',
563
-			'title'      => 'setting',
564
-			'type'       => 'object',
565
-			'properties' => array(
566
-				'id'          => array(
567
-					'description' => __( 'A unique identifier for the setting.', 'invoicing' ),
568
-					'type'        => 'string',
569
-					'arg_options' => array(
570
-						'sanitize_callback' => 'sanitize_title',
571
-					),
572
-					'context'     => array( 'view', 'edit' ),
573
-					'readonly'    => true,
574
-				),
575
-				'tab'         => array(
576
-					'description' => __( 'An identifier for the tab this setting belongs to.', 'invoicing' ),
577
-					'type'        => 'string',
578
-					'arg_options' => array(
579
-						'sanitize_callback' => 'sanitize_title',
580
-					),
581
-					'context'     => array( 'view', 'edit' ),
582
-					'readonly'    => true,
583
-				),
584
-				'section'     => array(
585
-					'description' => __( 'An identifier for the section this setting belongs to.', 'invoicing' ),
586
-					'type'        => 'string',
587
-					'arg_options' => array(
588
-						'sanitize_callback' => 'sanitize_title',
589
-					),
590
-					'context'     => array( 'view', 'edit' ),
591
-					'readonly'    => true,
592
-				),
593
-				'name'        => array(
594
-					'description' => __( 'A human readable label for the setting used in interfaces.', 'invoicing' ),
595
-					'type'        => 'string',
596
-					'arg_options' => array(
597
-						'sanitize_callback' => 'sanitize_text_field',
598
-					),
599
-					'context'     => array( 'view', 'edit' ),
600
-					'readonly'    => true,
601
-				),
602
-				'desc'        => array(
603
-					'description' => __( 'A human readable description for the setting used in interfaces.', 'invoicing' ),
604
-					'type'        => 'string',
605
-					'context'     => array( 'view', 'edit' ),
606
-					'readonly'    => true,
607
-				),
608
-				'value'       => array(
609
-					'description' => __( 'The current value of this setting.', 'invoicing' ),
610
-					'type'        => 'mixed',
611
-					'context'     => array( 'view', 'edit' ),
612
-				),
613
-				'default'     => array(
614
-					'description' => __( 'Default value for the setting.', 'invoicing' ),
615
-					'type'        => 'mixed',
616
-					'context'     => array( 'view', 'edit' ),
617
-					'readonly'    => true,
618
-				),
619
-				'placeholder' => array(
620
-					'description' => __( 'Placeholder text to be displayed in text inputs.', 'invoicing' ),
621
-					'type'        => 'string',
622
-					'arg_options' => array(
623
-						'sanitize_callback' => 'sanitize_text_field',
624
-					),
625
-					'context'     => array( 'view', 'edit' ),
626
-					'readonly'    => true,
627
-				),
628
-				'type'        => array(
629
-					'description' => __( 'Type of setting.', 'invoicing' ),
630
-					'type'        => 'string',
631
-					'arg_options' => array(
632
-						'sanitize_callback' => 'sanitize_text_field',
633
-					),
634
-					'context'     => array( 'view', 'edit' ),
635
-					'enum'        => array( 'text', 'email', 'number', 'color', 'password', 'textarea', 'select', 'multiselect', 'radio', 'image_width', 'checkbox', 'raw_html' ),
636
-					'readonly'    => true,
637
-				),
638
-				'options'     => array(
639
-					'description' => __( 'Array of options (key value pairs) for inputs such as select, multiselect, and radio buttons.', 'invoicing' ),
640
-					'type'        => 'object',
641
-					'context'     => array( 'view', 'edit' ),
642
-					'readonly'    => true,
643
-				),
644
-				'readonly'    => array(
645
-					'description' => __( 'Whether or not this setting is readonly', 'invoicing' ),
646
-					'type'        => 'string',
647
-					'context'     => array( 'view' ),
648
-					'readonly'    => true,
649
-				),
650
-				'faux'        => array(
651
-					'description' => __( 'Whether or not this setting is readonly/faux', 'invoicing' ),
652
-					'type'        => 'string',
653
-					'context'     => array( 'view' ),
654
-					'readonly'    => true,
655
-				),
656
-			),
657
-		);
658
-
659
-		// Filters the settings schema for the REST API.
533
+                'text',         // Validates with validate_setting_text_field.
534
+                'email',        // Validates with validate_setting_text_field.
535
+                'number',       // Validates with validate_setting_text_field.
536
+                'color',        // Validates with validate_setting_text_field.
537
+                'password',     // Validates with validate_setting_text_field.
538
+                'textarea',     // Validates with validate_setting_textarea_field.
539
+                'select',       // Validates with validate_setting_select_field.
540
+                'multiselect',  // Validates with validate_setting_multiselect_field.
541
+                'radio',        // Validates with validate_setting_radio_field (-> validate_setting_select_field).
542
+                'checkbox',     // Validates with validate_setting_checkbox_field.
543
+                'header',       // Validates with validate_setting_text_field.
544
+            )
545
+        );
546
+
547
+    }
548
+
549
+    /**
550
+     * Get the settings schema, conforming to JSON Schema.
551
+     *
552
+     * @return array
553
+     */
554
+    public function get_item_schema() {
555
+
556
+        // Maybe retrieve the schema from cache.
557
+        if ( ! empty( $this->schema ) ) {
558
+            return $this->add_additional_fields_schema( $this->schema );
559
+        }
560
+
561
+        $schema = array(
562
+            '$schema'    => 'http://json-schema.org/draft-04/schema#',
563
+            'title'      => 'setting',
564
+            'type'       => 'object',
565
+            'properties' => array(
566
+                'id'          => array(
567
+                    'description' => __( 'A unique identifier for the setting.', 'invoicing' ),
568
+                    'type'        => 'string',
569
+                    'arg_options' => array(
570
+                        'sanitize_callback' => 'sanitize_title',
571
+                    ),
572
+                    'context'     => array( 'view', 'edit' ),
573
+                    'readonly'    => true,
574
+                ),
575
+                'tab'         => array(
576
+                    'description' => __( 'An identifier for the tab this setting belongs to.', 'invoicing' ),
577
+                    'type'        => 'string',
578
+                    'arg_options' => array(
579
+                        'sanitize_callback' => 'sanitize_title',
580
+                    ),
581
+                    'context'     => array( 'view', 'edit' ),
582
+                    'readonly'    => true,
583
+                ),
584
+                'section'     => array(
585
+                    'description' => __( 'An identifier for the section this setting belongs to.', 'invoicing' ),
586
+                    'type'        => 'string',
587
+                    'arg_options' => array(
588
+                        'sanitize_callback' => 'sanitize_title',
589
+                    ),
590
+                    'context'     => array( 'view', 'edit' ),
591
+                    'readonly'    => true,
592
+                ),
593
+                'name'        => array(
594
+                    'description' => __( 'A human readable label for the setting used in interfaces.', 'invoicing' ),
595
+                    'type'        => 'string',
596
+                    'arg_options' => array(
597
+                        'sanitize_callback' => 'sanitize_text_field',
598
+                    ),
599
+                    'context'     => array( 'view', 'edit' ),
600
+                    'readonly'    => true,
601
+                ),
602
+                'desc'        => array(
603
+                    'description' => __( 'A human readable description for the setting used in interfaces.', 'invoicing' ),
604
+                    'type'        => 'string',
605
+                    'context'     => array( 'view', 'edit' ),
606
+                    'readonly'    => true,
607
+                ),
608
+                'value'       => array(
609
+                    'description' => __( 'The current value of this setting.', 'invoicing' ),
610
+                    'type'        => 'mixed',
611
+                    'context'     => array( 'view', 'edit' ),
612
+                ),
613
+                'default'     => array(
614
+                    'description' => __( 'Default value for the setting.', 'invoicing' ),
615
+                    'type'        => 'mixed',
616
+                    'context'     => array( 'view', 'edit' ),
617
+                    'readonly'    => true,
618
+                ),
619
+                'placeholder' => array(
620
+                    'description' => __( 'Placeholder text to be displayed in text inputs.', 'invoicing' ),
621
+                    'type'        => 'string',
622
+                    'arg_options' => array(
623
+                        'sanitize_callback' => 'sanitize_text_field',
624
+                    ),
625
+                    'context'     => array( 'view', 'edit' ),
626
+                    'readonly'    => true,
627
+                ),
628
+                'type'        => array(
629
+                    'description' => __( 'Type of setting.', 'invoicing' ),
630
+                    'type'        => 'string',
631
+                    'arg_options' => array(
632
+                        'sanitize_callback' => 'sanitize_text_field',
633
+                    ),
634
+                    'context'     => array( 'view', 'edit' ),
635
+                    'enum'        => array( 'text', 'email', 'number', 'color', 'password', 'textarea', 'select', 'multiselect', 'radio', 'image_width', 'checkbox', 'raw_html' ),
636
+                    'readonly'    => true,
637
+                ),
638
+                'options'     => array(
639
+                    'description' => __( 'Array of options (key value pairs) for inputs such as select, multiselect, and radio buttons.', 'invoicing' ),
640
+                    'type'        => 'object',
641
+                    'context'     => array( 'view', 'edit' ),
642
+                    'readonly'    => true,
643
+                ),
644
+                'readonly'    => array(
645
+                    'description' => __( 'Whether or not this setting is readonly', 'invoicing' ),
646
+                    'type'        => 'string',
647
+                    'context'     => array( 'view' ),
648
+                    'readonly'    => true,
649
+                ),
650
+                'faux'        => array(
651
+                    'description' => __( 'Whether or not this setting is readonly/faux', 'invoicing' ),
652
+                    'type'        => 'string',
653
+                    'context'     => array( 'view' ),
654
+                    'readonly'    => true,
655
+                ),
656
+            ),
657
+        );
658
+
659
+        // Filters the settings schema for the REST API.
660 660
         $schema = apply_filters( 'getpaid_rest_settings_schema', $schema );
661 661
 
662
-		// Cache the settings schema.
663
-		$this->schema = $schema;
664
-
665
-		return $this->add_additional_fields_schema( $this->schema );
666
-
667
-	}
668
-
669
-	/**
670
-	 * Validate a text value for a text based setting.
671
-	 *
672
-	 * @since 2.0.0
673
-	 * @param string $value Value.
674
-	 * @param array  $setting Setting.
675
-	 * @return string
676
-	 */
677
-	public function validate_setting_text_field( $value ) {
678
-		$value = is_null( $value ) ? '' : $value;
679
-		return wp_kses_post( trim( stripslashes( $value ) ) );
680
-	}
681
-
682
-	/**
683
-	 * Validate select based settings.
684
-	 *
685
-	 * @since 2.0.0
686
-	 * @param string $value Value.
687
-	 * @param array  $setting Setting.
688
-	 * @return string|WP_Error
689
-	 */
690
-	public function validate_setting_select_field( $value, $setting ) {
691
-		if ( array_key_exists( $value, $setting['options'] ) ) {
692
-			return $value;
693
-		} else {
694
-			return new WP_Error( 'rest_setting_value_invalid', __( 'An invalid setting value was passed.', 'invoicing' ), array( 'status' => 400 ) );
695
-		}
696
-	}
697
-
698
-	/**
699
-	 * Validate multiselect based settings.
700
-	 *
701
-	 * @since 2.0.0
702
-	 * @param array $values Values.
703
-	 * @param array $setting Setting.
704
-	 * @return array|WP_Error
705
-	 */
706
-	public function validate_setting_multiselect_field( $values, $setting ) {
707
-		if ( empty( $values ) ) {
708
-			return array();
709
-		}
710
-
711
-		if ( ! is_array( $values ) ) {
712
-			return new WP_Error( 'rest_setting_value_invalid', __( 'An invalid setting value was passed.', 'invoicing' ), array( 'status' => 400 ) );
713
-		}
714
-
715
-		$final_values = array();
716
-		foreach ( $values as $value ) {
717
-			if ( array_key_exists( $value, $setting['options'] ) ) {
718
-				$final_values[] = $value;
719
-			}
720
-		}
721
-
722
-		return $final_values;
723
-	}
724
-
725
-	/**
726
-	 * Validate radio based settings.
727
-	 *
728
-	 * @since 2.0.0
729
-	 * @param string $value Value.
730
-	 * @param array  $setting Setting.
731
-	 * @return string|WP_Error
732
-	 */
733
-	public function validate_setting_radio_field( $value, $setting ) {
734
-		return $this->validate_setting_select_field( $value, $setting );
735
-	}
736
-
737
-	/**
738
-	 * Validate checkbox based settings.
739
-	 *
740
-	 * @since 2.0.0
741
-	 * @param string $value Value.
742
-	 * @return int
743
-	 */
744
-	public function validate_setting_checkbox_field( $value ) {
745
-		return (int) ! empty( $value );
746
-	}
747
-
748
-	/**
749
-	 * Validate textarea based settings.
750
-	 *
751
-	 * @since 2.0.0
752
-	 * @param string $value Value.
753
-	 * @return string
754
-	 */
755
-	public function validate_setting_textarea_field( $value ) {
756
-		$value = is_null( $value ) ? '' : $value;
757
-		return wp_kses(
758
-			trim( stripslashes( $value ) ),
759
-			array_merge(
760
-				array(
761
-					'iframe' => array(
762
-						'src'   => true,
763
-						'style' => true,
764
-						'id'    => true,
765
-						'class' => true,
766
-					),
767
-				),
768
-				wp_kses_allowed_html( 'post' )
769
-			)
770
-		);
771
-	}
662
+        // Cache the settings schema.
663
+        $this->schema = $schema;
664
+
665
+        return $this->add_additional_fields_schema( $this->schema );
666
+
667
+    }
668
+
669
+    /**
670
+     * Validate a text value for a text based setting.
671
+     *
672
+     * @since 2.0.0
673
+     * @param string $value Value.
674
+     * @param array  $setting Setting.
675
+     * @return string
676
+     */
677
+    public function validate_setting_text_field( $value ) {
678
+        $value = is_null( $value ) ? '' : $value;
679
+        return wp_kses_post( trim( stripslashes( $value ) ) );
680
+    }
681
+
682
+    /**
683
+     * Validate select based settings.
684
+     *
685
+     * @since 2.0.0
686
+     * @param string $value Value.
687
+     * @param array  $setting Setting.
688
+     * @return string|WP_Error
689
+     */
690
+    public function validate_setting_select_field( $value, $setting ) {
691
+        if ( array_key_exists( $value, $setting['options'] ) ) {
692
+            return $value;
693
+        } else {
694
+            return new WP_Error( 'rest_setting_value_invalid', __( 'An invalid setting value was passed.', 'invoicing' ), array( 'status' => 400 ) );
695
+        }
696
+    }
697
+
698
+    /**
699
+     * Validate multiselect based settings.
700
+     *
701
+     * @since 2.0.0
702
+     * @param array $values Values.
703
+     * @param array $setting Setting.
704
+     * @return array|WP_Error
705
+     */
706
+    public function validate_setting_multiselect_field( $values, $setting ) {
707
+        if ( empty( $values ) ) {
708
+            return array();
709
+        }
710
+
711
+        if ( ! is_array( $values ) ) {
712
+            return new WP_Error( 'rest_setting_value_invalid', __( 'An invalid setting value was passed.', 'invoicing' ), array( 'status' => 400 ) );
713
+        }
714
+
715
+        $final_values = array();
716
+        foreach ( $values as $value ) {
717
+            if ( array_key_exists( $value, $setting['options'] ) ) {
718
+                $final_values[] = $value;
719
+            }
720
+        }
721
+
722
+        return $final_values;
723
+    }
724
+
725
+    /**
726
+     * Validate radio based settings.
727
+     *
728
+     * @since 2.0.0
729
+     * @param string $value Value.
730
+     * @param array  $setting Setting.
731
+     * @return string|WP_Error
732
+     */
733
+    public function validate_setting_radio_field( $value, $setting ) {
734
+        return $this->validate_setting_select_field( $value, $setting );
735
+    }
736
+
737
+    /**
738
+     * Validate checkbox based settings.
739
+     *
740
+     * @since 2.0.0
741
+     * @param string $value Value.
742
+     * @return int
743
+     */
744
+    public function validate_setting_checkbox_field( $value ) {
745
+        return (int) ! empty( $value );
746
+    }
747
+
748
+    /**
749
+     * Validate textarea based settings.
750
+     *
751
+     * @since 2.0.0
752
+     * @param string $value Value.
753
+     * @return string
754
+     */
755
+    public function validate_setting_textarea_field( $value ) {
756
+        $value = is_null( $value ) ? '' : $value;
757
+        return wp_kses(
758
+            trim( stripslashes( $value ) ),
759
+            array_merge(
760
+                array(
761
+                    'iframe' => array(
762
+                        'src'   => true,
763
+                        'style' => true,
764
+                        'id'    => true,
765
+                        'class' => true,
766
+                    ),
767
+                ),
768
+                wp_kses_allowed_html( 'post' )
769
+            )
770
+        );
771
+    }
772 772
 
773 773
 }
Please login to merge, or discard this patch.
Spacing   +184 added lines, -184 removed lines patch added patch discarded remove patch
@@ -9,7 +9,7 @@  discard block
 block discarded – undo
9 9
  * @since   2.0.0
10 10
  */
11 11
 
12
-defined( 'ABSPATH' ) || exit;
12
+defined('ABSPATH') || exit;
13 13
 
14 14
 /**
15 15
  * GetPaid REST Setting controller class.
@@ -39,7 +39,7 @@  discard block
 block discarded – undo
39 39
 	 *
40 40
 	 * @see register_rest_route()
41 41
 	 */
42
-	public function register_namespace_routes( $namespace ) {
42
+	public function register_namespace_routes($namespace) {
43 43
 
44 44
 		// List all registered tabs.
45 45
 		register_rest_route(
@@ -48,8 +48,8 @@  discard block
 block discarded – undo
48 48
 			array(
49 49
 				array(
50 50
 					'methods'             => WP_REST_Server::READABLE,
51
-					'callback'            => array( $this, 'get_tabs' ),
52
-					'permission_callback' => array( $this, 'get_items_permissions_check' ),
51
+					'callback'            => array($this, 'get_tabs'),
52
+					'permission_callback' => array($this, 'get_items_permissions_check'),
53 53
 				),
54 54
 				'schema' => '__return_empty_array',
55 55
 			)
@@ -62,23 +62,23 @@  discard block
 block discarded – undo
62 62
 			array(
63 63
 				'args'   => array(
64 64
 					'id' => array(
65
-						'description' => __( 'Unique identifier for the setting.', 'invoicing' ),
65
+						'description' => __('Unique identifier for the setting.', 'invoicing'),
66 66
 						'type'        => 'string',
67 67
 						'required'    => true,
68 68
 					),
69 69
 				),
70 70
 				array(
71 71
 					'methods'             => WP_REST_Server::READABLE,
72
-					'callback'            => array( $this, 'get_item' ),
73
-					'permission_callback' => array( $this, 'get_items_permissions_check' ),
72
+					'callback'            => array($this, 'get_item'),
73
+					'permission_callback' => array($this, 'get_items_permissions_check'),
74 74
 				),
75 75
 				array(
76 76
 					'methods'             => WP_REST_Server::EDITABLE,
77
-					'callback'            => array( $this, 'update_item' ),
78
-					'permission_callback' => array( $this, 'update_items_permissions_check' ),
79
-					'args'                => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
77
+					'callback'            => array($this, 'update_item'),
78
+					'permission_callback' => array($this, 'update_items_permissions_check'),
79
+					'args'                => $this->get_endpoint_args_for_item_schema(WP_REST_Server::EDITABLE),
80 80
 				),
81
-				'schema' => array( $this, 'get_public_item_schema' ),
81
+				'schema' => array($this, 'get_public_item_schema'),
82 82
 			)
83 83
 		);
84 84
 
@@ -89,16 +89,16 @@  discard block
 block discarded – undo
89 89
 			array(
90 90
 				'args'   => array(
91 91
 					'tab' => array(
92
-						'description' => __( 'Unique identifier for the tab whose sections should be retrieved.', 'invoicing' ),
92
+						'description' => __('Unique identifier for the tab whose sections should be retrieved.', 'invoicing'),
93 93
 						'type'        => 'string',
94 94
 						'required'    => true,
95
-						'enum'        => array_keys( wpinv_get_settings_tabs() ),
95
+						'enum'        => array_keys(wpinv_get_settings_tabs()),
96 96
 					),
97 97
 				),
98 98
 				array(
99 99
 					'methods'             => WP_REST_Server::READABLE,
100
-					'callback'            => array( $this, 'get_sections' ),
101
-					'permission_callback' => array( $this, 'get_items_permissions_check' ),
100
+					'callback'            => array($this, 'get_sections'),
101
+					'permission_callback' => array($this, 'get_items_permissions_check'),
102 102
 				),
103 103
 				'schema' => '__return_empty_array',
104 104
 			)
@@ -111,23 +111,23 @@  discard block
 block discarded – undo
111 111
 			array(
112 112
 				'args'   => array(
113 113
 					'tab'     => array(
114
-						'description' => __( 'Unique identifier for the tab whose settings should be retrieved.', 'invoicing' ),
114
+						'description' => __('Unique identifier for the tab whose settings should be retrieved.', 'invoicing'),
115 115
 						'type'        => 'string',
116 116
 						'required'    => true,
117
-						'enum'        => array_keys( wpinv_get_settings_tabs() ),
117
+						'enum'        => array_keys(wpinv_get_settings_tabs()),
118 118
 					),
119 119
 					'section' => array(
120
-						'description' => __( 'The section in the tab whose settings should be retrieved.', 'invoicing' ),
120
+						'description' => __('The section in the tab whose settings should be retrieved.', 'invoicing'),
121 121
 						'type'        => 'string',
122 122
 						'required'    => true,
123 123
 					),
124 124
 				),
125 125
 				array(
126 126
 					'methods'             => WP_REST_Server::READABLE,
127
-					'callback'            => array( $this, 'get_items' ),
128
-					'permission_callback' => array( $this, 'get_items_permissions_check' ),
127
+					'callback'            => array($this, 'get_items'),
128
+					'permission_callback' => array($this, 'get_items_permissions_check'),
129 129
 				),
130
-				'schema' => array( $this, 'get_public_item_schema' ),
130
+				'schema' => array($this, 'get_public_item_schema'),
131 131
 			)
132 132
 		); 
133 133
 
@@ -137,17 +137,17 @@  discard block
 block discarded – undo
137 137
 			array(
138 138
 				'args'   => array(
139 139
 					'id' => array(
140
-						'description' => __( 'Setting ID.', 'invoicing' ),
140
+						'description' => __('Setting ID.', 'invoicing'),
141 141
 						'type'        => 'string',
142 142
 					),
143 143
 				),
144 144
 				array(
145 145
 					'methods'             => WP_REST_Server::EDITABLE,
146
-					'callback'            => array( $this, 'batch_items' ),
147
-					'permission_callback' => array( $this, 'batch_items_permissions_check' ),
148
-					'args'                => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
146
+					'callback'            => array($this, 'batch_items'),
147
+					'permission_callback' => array($this, 'batch_items_permissions_check'),
148
+					'args'                => $this->get_endpoint_args_for_item_schema(WP_REST_Server::EDITABLE),
149 149
 				),
150
-				'schema' => array( $this, 'get_public_batch_schema' ),
150
+				'schema' => array($this, 'get_public_batch_schema'),
151 151
 			)
152 152
 		);
153 153
 
@@ -160,33 +160,33 @@  discard block
 block discarded – undo
160 160
 	 * @param  WP_REST_Request $request Request data.
161 161
 	 * @return WP_Error|WP_REST_Response
162 162
 	 */
163
-	public function get_items( $request ) {
163
+	public function get_items($request) {
164 164
 
165 165
 		$settings = $this->get_settings();
166 166
 
167
-		if ( ! isset( $settings[ $request['tab'] ] ) ) {
168
-			return new WP_Error( 'rest_invalid_tab', __( 'Invalid tab.', 'invoicing' ), array( 'status' => 400 ) );
167
+		if (!isset($settings[$request['tab']])) {
168
+			return new WP_Error('rest_invalid_tab', __('Invalid tab.', 'invoicing'), array('status' => 400));
169 169
 		}
170 170
 
171
-		if ( ! isset( $settings[ $request['tab'] ][ $request['section'] ] ) ) {
172
-			return new WP_Error( 'rest_invalid_section', __( 'Invalid section.', 'invoicing' ), array( 'status' => 400 ) );
171
+		if (!isset($settings[$request['tab']][$request['section']])) {
172
+			return new WP_Error('rest_invalid_section', __('Invalid section.', 'invoicing'), array('status' => 400));
173 173
 		}
174 174
 
175
-		$settings = $settings[ $request['tab'] ][ $request['section'] ];
175
+		$settings = $settings[$request['tab']][$request['section']];
176 176
 		$prepared = array();
177 177
 
178
-		foreach ( $settings as $setting ) {
178
+		foreach ($settings as $setting) {
179 179
 
180
-			$setting      = $this->sanitize_setting( $setting );
181
-			$setting_data = $this->prepare_item_for_response( $setting, $request );
182
-			$setting_data = $this->prepare_response_for_collection( $setting_data );
180
+			$setting      = $this->sanitize_setting($setting);
181
+			$setting_data = $this->prepare_item_for_response($setting, $request);
182
+			$setting_data = $this->prepare_response_for_collection($setting_data);
183 183
 
184
-			if ( $this->is_setting_type_valid( $setting['type'] ) ) {
185
-				$prepared[]   = $setting_data;
184
+			if ($this->is_setting_type_valid($setting['type'])) {
185
+				$prepared[] = $setting_data;
186 186
 			}
187 187
 }
188 188
 
189
-		return rest_ensure_response( $prepared );
189
+		return rest_ensure_response($prepared);
190 190
 	}
191 191
 
192 192
 	/**
@@ -196,16 +196,16 @@  discard block
 block discarded – undo
196 196
 	 * @param  WP_REST_Request $request Request data.
197 197
 	 * @return WP_Error|WP_REST_Response
198 198
 	 */
199
-	public function get_item( $request ) {
200
-		$setting  = $this->get_setting( $request['id'] );
199
+	public function get_item($request) {
200
+		$setting = $this->get_setting($request['id']);
201 201
 
202
-		if ( is_wp_error( $setting ) ) {
202
+		if (is_wp_error($setting)) {
203 203
 			return $setting;
204 204
 		}
205 205
 
206
-		$setting  = $this->sanitize_setting( $setting );
207
-		$response = $this->prepare_item_for_response( $setting, $request );
208
-		return rest_ensure_response( $response );
206
+		$setting  = $this->sanitize_setting($setting);
207
+		$response = $this->prepare_item_for_response($setting, $request);
208
+		return rest_ensure_response($response);
209 209
 	}
210 210
 
211 211
 	/**
@@ -215,29 +215,29 @@  discard block
 block discarded – undo
215 215
 	 * @param  WP_REST_Request $request Request data.
216 216
 	 * @return WP_Error|WP_REST_Response
217 217
 	 */
218
-	public function update_item( $request ) {
219
-		$setting = $this->get_setting( $request['id'] );
218
+	public function update_item($request) {
219
+		$setting = $this->get_setting($request['id']);
220 220
 
221
-		if ( is_wp_error( $setting ) ) {
221
+		if (is_wp_error($setting)) {
222 222
 			return $setting;
223 223
 		}
224 224
 
225
-		if ( is_callable( array( $this, 'validate_setting_' . $setting['type'] . '_field' ) ) ) {
226
-			$value = $this->{'validate_setting_' . $setting['type'] . '_field'}( $request['value'], $setting );
225
+		if (is_callable(array($this, 'validate_setting_' . $setting['type'] . '_field'))) {
226
+			$value = $this->{'validate_setting_' . $setting['type'] . '_field'}($request['value'], $setting);
227 227
 		} else {
228
-			$value = $this->validate_setting_text_field( $request['value'], $setting );
228
+			$value = $this->validate_setting_text_field($request['value'], $setting);
229 229
 		}
230 230
 
231
-		if ( is_wp_error( $value ) ) {
231
+		if (is_wp_error($value)) {
232 232
 			return $value;
233 233
 		}
234 234
 
235
-		wpinv_update_option( $request['id'], $value );
235
+		wpinv_update_option($request['id'], $value);
236 236
 		$setting['value'] = $value;
237
-		$setting          = $this->sanitize_setting( $setting );
238
-		$response         = $this->prepare_item_for_response( $setting, $request );
237
+		$setting          = $this->sanitize_setting($setting);
238
+		$response         = $this->prepare_item_for_response($setting, $request);
239 239
 
240
-		return rest_ensure_response( $response );
240
+		return rest_ensure_response($response);
241 241
 	}
242 242
 
243 243
 	/**
@@ -247,9 +247,9 @@  discard block
 block discarded – undo
247 247
 	 * @param WP_REST_Request $request Full data about the request.
248 248
 	 * @return WP_Error|boolean
249 249
 	 */
250
-	public function get_items_permissions_check( $request ) {
251
-		if ( ! wpinv_current_user_can_manage_invoicing() ) {
252
-			return new WP_Error( 'rest_cannot_view', __( 'Sorry, you cannot list resources.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
250
+	public function get_items_permissions_check($request) {
251
+		if (!wpinv_current_user_can_manage_invoicing()) {
252
+			return new WP_Error('rest_cannot_view', __('Sorry, you cannot list resources.', 'invoicing'), array('status' => rest_authorization_required_code()));
253 253
 		}
254 254
 
255 255
 		return true;
@@ -262,9 +262,9 @@  discard block
 block discarded – undo
262 262
 	 * @param WP_REST_Request $request Full data about the request.
263 263
 	 * @return WP_Error|boolean
264 264
 	 */
265
-	public function update_items_permissions_check( $request ) {
266
-		if ( ! wpinv_current_user_can_manage_invoicing() ) {
267
-			return new WP_Error( 'rest_cannot_edit', __( 'Sorry, you cannot edit this resource.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
265
+	public function update_items_permissions_check($request) {
266
+		if (!wpinv_current_user_can_manage_invoicing()) {
267
+			return new WP_Error('rest_cannot_edit', __('Sorry, you cannot edit this resource.', 'invoicing'), array('status' => rest_authorization_required_code()));
268 268
 		}
269 269
 
270 270
 		return true;
@@ -277,8 +277,8 @@  discard block
 block discarded – undo
277 277
 	 *
278 278
 	 * @return boolean|WP_Error
279 279
 	 */
280
-	public function batch_items_permissions_check( $request ) {
281
-		return wpinv_current_user_can_manage_invoicing() ? true : new WP_Error( 'rest_cannot_batch', __( 'Sorry, you are not allowed to batch manipulate this resource.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
280
+	public function batch_items_permissions_check($request) {
281
+		return wpinv_current_user_can_manage_invoicing() ? true : new WP_Error('rest_cannot_batch', __('Sorry, you are not allowed to batch manipulate this resource.', 'invoicing'), array('status' => rest_authorization_required_code()));
282 282
 	}
283 283
 
284 284
 	/**
@@ -287,14 +287,14 @@  discard block
 block discarded – undo
287 287
 	 * @param string $setting_id Setting ID.
288 288
 	 * @return array Links for the given setting.
289 289
 	 */
290
-	protected function prepare_links( $setting_id ) {
290
+	protected function prepare_links($setting_id) {
291 291
 
292 292
 		$links = array(
293 293
 			'self'       => array(
294
-				'href' => rest_url( sprintf( '/%s/%s/setting/%s', $this->namespace, $this->rest_base, $setting_id ) ),
294
+				'href' => rest_url(sprintf('/%s/%s/setting/%s', $this->namespace, $this->rest_base, $setting_id)),
295 295
 			),
296 296
 			'collection' => array(
297
-				'href' => rest_url( sprintf( '/%s/%s', $this->namespace, $this->rest_base ) ),
297
+				'href' => rest_url(sprintf('/%s/%s', $this->namespace, $this->rest_base)),
298 298
 			),
299 299
 		);
300 300
 
@@ -309,14 +309,14 @@  discard block
 block discarded – undo
309 309
 	 * @param WP_REST_Request $request Request object.
310 310
 	 * @return WP_REST_Response $response Response data.
311 311
 	 */
312
-	public function prepare_item_for_response( $item, $request ) {
313
-		$context = empty( $request['context'] ) ? 'view' : $request['context'];
314
-		$data    = $this->add_additional_fields_to_object( $item, $request );
315
-		$data    = $this->filter_response_by_context( $data, $context );
312
+	public function prepare_item_for_response($item, $request) {
313
+		$context = empty($request['context']) ? 'view' : $request['context'];
314
+		$data    = $this->add_additional_fields_to_object($item, $request);
315
+		$data    = $this->filter_response_by_context($data, $context);
316 316
 
317
-		$response = rest_ensure_response( $data );
317
+		$response = rest_ensure_response($data);
318 318
 
319
-		$response->add_links( $this->prepare_links( $item['id'] ) );
319
+		$response->add_links($this->prepare_links($item['id']));
320 320
 
321 321
 		return $response;
322 322
 	}
@@ -329,10 +329,10 @@  discard block
 block discarded – undo
329 329
 	 * @param  array $setting Setting.
330 330
 	 * @return array
331 331
 	 */
332
-	public function filter_setting( $setting ) {
332
+	public function filter_setting($setting) {
333 333
 		return array_intersect_key(
334 334
 			$setting,
335
-			array_flip( array_filter( array_keys( $setting ), array( $this, 'allowed_setting_keys' ) ) )
335
+			array_flip(array_filter(array_keys($setting), array($this, 'allowed_setting_keys')))
336 336
 		);
337 337
 	}
338 338
 
@@ -342,8 +342,8 @@  discard block
 block discarded – undo
342 342
 	 * @param  string $key Key to check.
343 343
 	 * @return boolean
344 344
 	 */
345
-	public function allowed_setting_keys( $key ) {
346
-		return in_array( $key, array_keys( $this->setting_defaults() ), true );
345
+	public function allowed_setting_keys($key) {
346
+		return in_array($key, array_keys($this->setting_defaults()), true);
347 347
 	}
348 348
 
349 349
 	/**
@@ -375,11 +375,11 @@  discard block
 block discarded – undo
375 375
 	 * @param  array $setting The setting to sanitize.
376 376
 	 * @return array
377 377
 	 */
378
-	public function sanitize_setting( $setting ) {
378
+	public function sanitize_setting($setting) {
379 379
 
380
-		$setting          = wp_parse_args( $setting, $this->setting_defaults() );
381
-		$setting['value'] = wpinv_get_option( $setting['id'], $setting['std'] );
382
-		return $this->filter_setting( $setting );
380
+		$setting          = wp_parse_args($setting, $this->setting_defaults());
381
+		$setting['value'] = wpinv_get_option($setting['id'], $setting['std']);
382
+		return $this->filter_setting($setting);
383 383
 
384 384
 	}
385 385
 
@@ -390,29 +390,29 @@  discard block
 block discarded – undo
390 390
 	 * @param string $setting_id Setting ID.
391 391
 	 * @return array|WP_Error
392 392
 	 */
393
-	public function get_setting( $setting_id ) {
393
+	public function get_setting($setting_id) {
394 394
 
395
-		if ( empty( $setting_id ) ) {
396
-			return new WP_Error( 'rest_setting_setting_invalid', __( 'Invalid setting.', 'invoicing' ), array( 'status' => 404 ) );
395
+		if (empty($setting_id)) {
396
+			return new WP_Error('rest_setting_setting_invalid', __('Invalid setting.', 'invoicing'), array('status' => 404));
397 397
 		}
398 398
 
399
-		$settings  = $this->get_settings();
399
+		$settings = $this->get_settings();
400 400
 
401
-		foreach ( $settings as $tabs ) {
401
+		foreach ($settings as $tabs) {
402 402
 
403
-			foreach ( $tabs as $sections ) {
403
+			foreach ($tabs as $sections) {
404 404
 
405
-				if ( isset( $sections[ $setting_id ] ) ) {
406
-					if ( ! $this->is_setting_type_valid( $sections[ $setting_id ]['type'] ) ) {
407
-						return new WP_Error( 'rest_setting_setting_type_invalid', __( 'Invalid setting type.', 'invoicing' ), array( 'status' => 404 ) );
405
+				if (isset($sections[$setting_id])) {
406
+					if (!$this->is_setting_type_valid($sections[$setting_id]['type'])) {
407
+						return new WP_Error('rest_setting_setting_type_invalid', __('Invalid setting type.', 'invoicing'), array('status' => 404));
408 408
 					}
409 409
 
410
-					return $sections[ $setting_id ];
410
+					return $sections[$setting_id];
411 411
 				}
412 412
 }
413 413
 }
414 414
 
415
-		return new WP_Error( 'rest_setting_setting_invalid', __( 'Invalid setting.', 'invoicing' ), array( 'status' => 404 ) );
415
+		return new WP_Error('rest_setting_setting_invalid', __('Invalid setting.', 'invoicing'), array('status' => 404));
416 416
 	}
417 417
 
418 418
 	/**
@@ -421,41 +421,41 @@  discard block
 block discarded – undo
421 421
 	 * @param  WP_REST_Request $request Request data.
422 422
 	 * @return array
423 423
 	 */
424
-	public function get_tabs( $request ) {
424
+	public function get_tabs($request) {
425 425
 		$tabs     = wpinv_get_settings_tabs();
426 426
 		$prepared = array();
427 427
 
428
-		foreach ( $tabs as $id => $tab ) {
428
+		foreach ($tabs as $id => $tab) {
429 429
 
430 430
 			$_request        = $request;
431
-			$_request['tab'] = sanitize_title( $id );
431
+			$_request['tab'] = sanitize_title($id);
432 432
 			$data            = array(
433
-				'id'       => sanitize_title( $id ),
434
-				'label'    => sanitize_text_field( $tab ),
435
-				'sections' => $this->get_sections( $_request ),
433
+				'id'       => sanitize_title($id),
434
+				'label'    => sanitize_text_field($tab),
435
+				'sections' => $this->get_sections($_request),
436 436
 			);
437 437
 
438
-			$data     = $this->add_additional_fields_to_object( $data, $request );
439
-			$response = rest_ensure_response( $data );
438
+			$data     = $this->add_additional_fields_to_object($data, $request);
439
+			$response = rest_ensure_response($data);
440 440
 
441
-			if ( ! is_wp_error( $response ) ) {
441
+			if (!is_wp_error($response)) {
442 442
 				$links = array(
443 443
 					'sections'   => array(
444
-						'href' => rest_url( sprintf( '/%s/%s/%s', $this->namespace, $this->rest_base, $id ) ),
444
+						'href' => rest_url(sprintf('/%s/%s/%s', $this->namespace, $this->rest_base, $id)),
445 445
 					),
446 446
 					'collection' => array(
447
-						'href' => rest_url( sprintf( '/%s/%s', $this->namespace, $this->rest_base ) ),
447
+						'href' => rest_url(sprintf('/%s/%s', $this->namespace, $this->rest_base)),
448 448
 					),
449 449
 				);
450
-				$response->add_links( $links );
451
-				$response = $this->prepare_response_for_collection( $response );
450
+				$response->add_links($links);
451
+				$response = $this->prepare_response_for_collection($response);
452 452
 			}
453 453
 
454 454
 			$prepared[] = $response;
455 455
 
456 456
 		}
457 457
 
458
-		return rest_ensure_response( $prepared );
458
+		return rest_ensure_response($prepared);
459 459
 	}
460 460
 
461 461
 	/**
@@ -464,43 +464,43 @@  discard block
 block discarded – undo
464 464
 	 * @param  WP_REST_Request $request Request data.
465 465
 	 * @return array
466 466
 	 */
467
-	public function get_sections( $request ) {
467
+	public function get_sections($request) {
468 468
 
469
-		$tab      = sanitize_title( $request['tab'] );
470
-		$sections = wpinv_get_settings_tab_sections( $tab );
469
+		$tab      = sanitize_title($request['tab']);
470
+		$sections = wpinv_get_settings_tab_sections($tab);
471 471
 		$prepared = array();
472 472
 
473
-		foreach ( $sections as $id => $section ) {
473
+		foreach ($sections as $id => $section) {
474 474
 
475
-			$data            = array(
476
-				'id'    => sanitize_title( $id ),
477
-				'label' => sanitize_text_field( $section ),
475
+			$data = array(
476
+				'id'    => sanitize_title($id),
477
+				'label' => sanitize_text_field($section),
478 478
 			);
479 479
 
480
-			$data     = $this->add_additional_fields_to_object( $data, $request );
481
-			$response = rest_ensure_response( $data );
480
+			$data     = $this->add_additional_fields_to_object($data, $request);
481
+			$response = rest_ensure_response($data);
482 482
 
483
-			if ( ! is_wp_error( $response ) ) {
483
+			if (!is_wp_error($response)) {
484 484
 				$links = array(
485 485
 					'settings'   => array(
486
-						'href' => rest_url( sprintf( '/%s/%s/%s/%s', $this->namespace, $this->rest_base, $tab, $id ) ),
486
+						'href' => rest_url(sprintf('/%s/%s/%s/%s', $this->namespace, $this->rest_base, $tab, $id)),
487 487
 					),
488 488
 					'collection' => array(
489
-						'href' => rest_url( sprintf( '/%s/%s/%s', $this->namespace, $this->rest_base, $tab ) ),
489
+						'href' => rest_url(sprintf('/%s/%s/%s', $this->namespace, $this->rest_base, $tab)),
490 490
 					),
491 491
 					'tabs'       => array(
492
-						'href' => rest_url( sprintf( '/%s/%s', $this->namespace, $this->rest_base ) ),
492
+						'href' => rest_url(sprintf('/%s/%s', $this->namespace, $this->rest_base)),
493 493
 					),
494 494
 				);
495
-				$response->add_links( $links );
496
-				$response = $this->prepare_response_for_collection( $response );
495
+				$response->add_links($links);
496
+				$response = $this->prepare_response_for_collection($response);
497 497
 			}
498 498
 
499 499
 			$prepared[] = $response;
500 500
 
501 501
 		}
502 502
 
503
-		return rest_ensure_response( $prepared );
503
+		return rest_ensure_response($prepared);
504 504
 	}
505 505
 
506 506
 	/**
@@ -510,7 +510,7 @@  discard block
 block discarded – undo
510 510
 	 */
511 511
 	public function get_settings() {
512 512
 
513
-		if ( empty( $this->settings ) ) {
513
+		if (empty($this->settings)) {
514 514
 			$this->settings = wpinv_get_registered_settings();
515 515
 		}
516 516
 
@@ -525,22 +525,22 @@  discard block
 block discarded – undo
525 525
 	 * @param  string $type Type.
526 526
 	 * @return bool
527 527
 	 */
528
-	public function is_setting_type_valid( $type ) {
528
+	public function is_setting_type_valid($type) {
529 529
 
530 530
 		return in_array(
531 531
 			$type,
532 532
             array(
533
-				'text',         // Validates with validate_setting_text_field.
534
-				'email',        // Validates with validate_setting_text_field.
535
-				'number',       // Validates with validate_setting_text_field.
536
-				'color',        // Validates with validate_setting_text_field.
537
-				'password',     // Validates with validate_setting_text_field.
538
-				'textarea',     // Validates with validate_setting_textarea_field.
539
-				'select',       // Validates with validate_setting_select_field.
540
-				'multiselect',  // Validates with validate_setting_multiselect_field.
541
-				'radio',        // Validates with validate_setting_radio_field (-> validate_setting_select_field).
542
-				'checkbox',     // Validates with validate_setting_checkbox_field.
543
-				'header',       // Validates with validate_setting_text_field.
533
+				'text', // Validates with validate_setting_text_field.
534
+				'email', // Validates with validate_setting_text_field.
535
+				'number', // Validates with validate_setting_text_field.
536
+				'color', // Validates with validate_setting_text_field.
537
+				'password', // Validates with validate_setting_text_field.
538
+				'textarea', // Validates with validate_setting_textarea_field.
539
+				'select', // Validates with validate_setting_select_field.
540
+				'multiselect', // Validates with validate_setting_multiselect_field.
541
+				'radio', // Validates with validate_setting_radio_field (-> validate_setting_select_field).
542
+				'checkbox', // Validates with validate_setting_checkbox_field.
543
+				'header', // Validates with validate_setting_text_field.
544 544
 			)
545 545
 		);
546 546
 
@@ -554,8 +554,8 @@  discard block
 block discarded – undo
554 554
 	public function get_item_schema() {
555 555
 
556 556
 		// Maybe retrieve the schema from cache.
557
-		if ( ! empty( $this->schema ) ) {
558
-			return $this->add_additional_fields_schema( $this->schema );
557
+		if (!empty($this->schema)) {
558
+			return $this->add_additional_fields_schema($this->schema);
559 559
 		}
560 560
 
561 561
 		$schema = array(
@@ -564,105 +564,105 @@  discard block
 block discarded – undo
564 564
 			'type'       => 'object',
565 565
 			'properties' => array(
566 566
 				'id'          => array(
567
-					'description' => __( 'A unique identifier for the setting.', 'invoicing' ),
567
+					'description' => __('A unique identifier for the setting.', 'invoicing'),
568 568
 					'type'        => 'string',
569 569
 					'arg_options' => array(
570 570
 						'sanitize_callback' => 'sanitize_title',
571 571
 					),
572
-					'context'     => array( 'view', 'edit' ),
572
+					'context'     => array('view', 'edit'),
573 573
 					'readonly'    => true,
574 574
 				),
575 575
 				'tab'         => array(
576
-					'description' => __( 'An identifier for the tab this setting belongs to.', 'invoicing' ),
576
+					'description' => __('An identifier for the tab this setting belongs to.', 'invoicing'),
577 577
 					'type'        => 'string',
578 578
 					'arg_options' => array(
579 579
 						'sanitize_callback' => 'sanitize_title',
580 580
 					),
581
-					'context'     => array( 'view', 'edit' ),
581
+					'context'     => array('view', 'edit'),
582 582
 					'readonly'    => true,
583 583
 				),
584 584
 				'section'     => array(
585
-					'description' => __( 'An identifier for the section this setting belongs to.', 'invoicing' ),
585
+					'description' => __('An identifier for the section this setting belongs to.', 'invoicing'),
586 586
 					'type'        => 'string',
587 587
 					'arg_options' => array(
588 588
 						'sanitize_callback' => 'sanitize_title',
589 589
 					),
590
-					'context'     => array( 'view', 'edit' ),
590
+					'context'     => array('view', 'edit'),
591 591
 					'readonly'    => true,
592 592
 				),
593 593
 				'name'        => array(
594
-					'description' => __( 'A human readable label for the setting used in interfaces.', 'invoicing' ),
594
+					'description' => __('A human readable label for the setting used in interfaces.', 'invoicing'),
595 595
 					'type'        => 'string',
596 596
 					'arg_options' => array(
597 597
 						'sanitize_callback' => 'sanitize_text_field',
598 598
 					),
599
-					'context'     => array( 'view', 'edit' ),
599
+					'context'     => array('view', 'edit'),
600 600
 					'readonly'    => true,
601 601
 				),
602 602
 				'desc'        => array(
603
-					'description' => __( 'A human readable description for the setting used in interfaces.', 'invoicing' ),
603
+					'description' => __('A human readable description for the setting used in interfaces.', 'invoicing'),
604 604
 					'type'        => 'string',
605
-					'context'     => array( 'view', 'edit' ),
605
+					'context'     => array('view', 'edit'),
606 606
 					'readonly'    => true,
607 607
 				),
608 608
 				'value'       => array(
609
-					'description' => __( 'The current value of this setting.', 'invoicing' ),
609
+					'description' => __('The current value of this setting.', 'invoicing'),
610 610
 					'type'        => 'mixed',
611
-					'context'     => array( 'view', 'edit' ),
611
+					'context'     => array('view', 'edit'),
612 612
 				),
613 613
 				'default'     => array(
614
-					'description' => __( 'Default value for the setting.', 'invoicing' ),
614
+					'description' => __('Default value for the setting.', 'invoicing'),
615 615
 					'type'        => 'mixed',
616
-					'context'     => array( 'view', 'edit' ),
616
+					'context'     => array('view', 'edit'),
617 617
 					'readonly'    => true,
618 618
 				),
619 619
 				'placeholder' => array(
620
-					'description' => __( 'Placeholder text to be displayed in text inputs.', 'invoicing' ),
620
+					'description' => __('Placeholder text to be displayed in text inputs.', 'invoicing'),
621 621
 					'type'        => 'string',
622 622
 					'arg_options' => array(
623 623
 						'sanitize_callback' => 'sanitize_text_field',
624 624
 					),
625
-					'context'     => array( 'view', 'edit' ),
625
+					'context'     => array('view', 'edit'),
626 626
 					'readonly'    => true,
627 627
 				),
628 628
 				'type'        => array(
629
-					'description' => __( 'Type of setting.', 'invoicing' ),
629
+					'description' => __('Type of setting.', 'invoicing'),
630 630
 					'type'        => 'string',
631 631
 					'arg_options' => array(
632 632
 						'sanitize_callback' => 'sanitize_text_field',
633 633
 					),
634
-					'context'     => array( 'view', 'edit' ),
635
-					'enum'        => array( 'text', 'email', 'number', 'color', 'password', 'textarea', 'select', 'multiselect', 'radio', 'image_width', 'checkbox', 'raw_html' ),
634
+					'context'     => array('view', 'edit'),
635
+					'enum'        => array('text', 'email', 'number', 'color', 'password', 'textarea', 'select', 'multiselect', 'radio', 'image_width', 'checkbox', 'raw_html'),
636 636
 					'readonly'    => true,
637 637
 				),
638 638
 				'options'     => array(
639
-					'description' => __( 'Array of options (key value pairs) for inputs such as select, multiselect, and radio buttons.', 'invoicing' ),
639
+					'description' => __('Array of options (key value pairs) for inputs such as select, multiselect, and radio buttons.', 'invoicing'),
640 640
 					'type'        => 'object',
641
-					'context'     => array( 'view', 'edit' ),
641
+					'context'     => array('view', 'edit'),
642 642
 					'readonly'    => true,
643 643
 				),
644 644
 				'readonly'    => array(
645
-					'description' => __( 'Whether or not this setting is readonly', 'invoicing' ),
645
+					'description' => __('Whether or not this setting is readonly', 'invoicing'),
646 646
 					'type'        => 'string',
647
-					'context'     => array( 'view' ),
647
+					'context'     => array('view'),
648 648
 					'readonly'    => true,
649 649
 				),
650 650
 				'faux'        => array(
651
-					'description' => __( 'Whether or not this setting is readonly/faux', 'invoicing' ),
651
+					'description' => __('Whether or not this setting is readonly/faux', 'invoicing'),
652 652
 					'type'        => 'string',
653
-					'context'     => array( 'view' ),
653
+					'context'     => array('view'),
654 654
 					'readonly'    => true,
655 655
 				),
656 656
 			),
657 657
 		);
658 658
 
659 659
 		// Filters the settings schema for the REST API.
660
-        $schema = apply_filters( 'getpaid_rest_settings_schema', $schema );
660
+        $schema = apply_filters('getpaid_rest_settings_schema', $schema);
661 661
 
662 662
 		// Cache the settings schema.
663 663
 		$this->schema = $schema;
664 664
 
665
-		return $this->add_additional_fields_schema( $this->schema );
665
+		return $this->add_additional_fields_schema($this->schema);
666 666
 
667 667
 	}
668 668
 
@@ -674,9 +674,9 @@  discard block
 block discarded – undo
674 674
 	 * @param array  $setting Setting.
675 675
 	 * @return string
676 676
 	 */
677
-	public function validate_setting_text_field( $value ) {
678
-		$value = is_null( $value ) ? '' : $value;
679
-		return wp_kses_post( trim( stripslashes( $value ) ) );
677
+	public function validate_setting_text_field($value) {
678
+		$value = is_null($value) ? '' : $value;
679
+		return wp_kses_post(trim(stripslashes($value)));
680 680
 	}
681 681
 
682 682
 	/**
@@ -687,11 +687,11 @@  discard block
 block discarded – undo
687 687
 	 * @param array  $setting Setting.
688 688
 	 * @return string|WP_Error
689 689
 	 */
690
-	public function validate_setting_select_field( $value, $setting ) {
691
-		if ( array_key_exists( $value, $setting['options'] ) ) {
690
+	public function validate_setting_select_field($value, $setting) {
691
+		if (array_key_exists($value, $setting['options'])) {
692 692
 			return $value;
693 693
 		} else {
694
-			return new WP_Error( 'rest_setting_value_invalid', __( 'An invalid setting value was passed.', 'invoicing' ), array( 'status' => 400 ) );
694
+			return new WP_Error('rest_setting_value_invalid', __('An invalid setting value was passed.', 'invoicing'), array('status' => 400));
695 695
 		}
696 696
 	}
697 697
 
@@ -703,18 +703,18 @@  discard block
 block discarded – undo
703 703
 	 * @param array $setting Setting.
704 704
 	 * @return array|WP_Error
705 705
 	 */
706
-	public function validate_setting_multiselect_field( $values, $setting ) {
707
-		if ( empty( $values ) ) {
706
+	public function validate_setting_multiselect_field($values, $setting) {
707
+		if (empty($values)) {
708 708
 			return array();
709 709
 		}
710 710
 
711
-		if ( ! is_array( $values ) ) {
712
-			return new WP_Error( 'rest_setting_value_invalid', __( 'An invalid setting value was passed.', 'invoicing' ), array( 'status' => 400 ) );
711
+		if (!is_array($values)) {
712
+			return new WP_Error('rest_setting_value_invalid', __('An invalid setting value was passed.', 'invoicing'), array('status' => 400));
713 713
 		}
714 714
 
715 715
 		$final_values = array();
716
-		foreach ( $values as $value ) {
717
-			if ( array_key_exists( $value, $setting['options'] ) ) {
716
+		foreach ($values as $value) {
717
+			if (array_key_exists($value, $setting['options'])) {
718 718
 				$final_values[] = $value;
719 719
 			}
720 720
 		}
@@ -730,8 +730,8 @@  discard block
 block discarded – undo
730 730
 	 * @param array  $setting Setting.
731 731
 	 * @return string|WP_Error
732 732
 	 */
733
-	public function validate_setting_radio_field( $value, $setting ) {
734
-		return $this->validate_setting_select_field( $value, $setting );
733
+	public function validate_setting_radio_field($value, $setting) {
734
+		return $this->validate_setting_select_field($value, $setting);
735 735
 	}
736 736
 
737 737
 	/**
@@ -741,8 +741,8 @@  discard block
 block discarded – undo
741 741
 	 * @param string $value Value.
742 742
 	 * @return int
743 743
 	 */
744
-	public function validate_setting_checkbox_field( $value ) {
745
-		return (int) ! empty( $value );
744
+	public function validate_setting_checkbox_field($value) {
745
+		return (int) !empty($value);
746 746
 	}
747 747
 
748 748
 	/**
@@ -752,10 +752,10 @@  discard block
 block discarded – undo
752 752
 	 * @param string $value Value.
753 753
 	 * @return string
754 754
 	 */
755
-	public function validate_setting_textarea_field( $value ) {
756
-		$value = is_null( $value ) ? '' : $value;
755
+	public function validate_setting_textarea_field($value) {
756
+		$value = is_null($value) ? '' : $value;
757 757
 		return wp_kses(
758
-			trim( stripslashes( $value ) ),
758
+			trim(stripslashes($value)),
759 759
 			array_merge(
760 760
 				array(
761 761
 					'iframe' => array(
@@ -765,7 +765,7 @@  discard block
 block discarded – undo
765 765
 						'class' => true,
766 766
 					),
767 767
 				),
768
-				wp_kses_allowed_html( 'post' )
768
+				wp_kses_allowed_html('post')
769 769
 			)
770 770
 		);
771 771
 	}
Please login to merge, or discard this patch.
templates/frontend-footer.php 1 patch
Spacing   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -7,7 +7,7 @@  discard block
 block discarded – undo
7 7
  * @version 1.0.19
8 8
  */
9 9
 
10
-defined( 'ABSPATH' ) || exit;
10
+defined('ABSPATH') || exit;
11 11
 
12 12
 global $aui_bs5;
13 13
 ?>
@@ -17,8 +17,8 @@  discard block
 block discarded – undo
17 17
 		<div class="modal-dialog modal-dialog-centered modal-lg" role="checkout" style="max-width: 650px;">
18 18
 			<div class="modal-content">
19 19
 				<div class="modal-body">
20
-					<button type="button" class=" btn-close p-2 getpaid-payment-modal-close d-sm-none" data-<?php echo $aui_bs5 ? 'bs-' : ''; ?>dismiss="modal" aria-label="<?php esc_attr__( 'Close', 'invoicing' ); ?>">
21
-						<?php if ( empty( $aui_bs5 ) ) : ?>
20
+					<button type="button" class=" btn-close p-2 getpaid-payment-modal-close d-sm-none" data-<?php echo $aui_bs5 ? 'bs-' : ''; ?>dismiss="modal" aria-label="<?php esc_attr__('Close', 'invoicing'); ?>">
21
+						<?php if (empty($aui_bs5)) : ?>
22 22
                             <span aria-hidden="true">×</span>
23 23
                         <?php endif; ?>
24 24
 					</button>
Please login to merge, or discard this patch.
includes/libraries/class-emogrifier.php 2 patches
Indentation   +779 added lines, -779 removed lines patch added patch discarded remove patch
@@ -9,346 +9,346 @@  discard block
 block discarded – undo
9 9
  * @author Roman Ožana <[email protected]>
10 10
  */
11 11
 class Emogrifier {
12
-	/**
13
-	 * @var string
14
-	 */
15
-	const ENCODING = 'UTF-8';
16
-
17
-	/**
18
-	 * @var integer
19
-	 */
20
-	const CACHE_KEY_CSS = 0;
21
-
22
-	/**
23
-	 * @var integer
24
-	 */
25
-	const CACHE_KEY_SELECTOR = 1;
26
-
27
-	/**
28
-	 * @var integer
29
-	 */
30
-	const CACHE_KEY_XPATH = 2;
31
-
32
-	/**
33
-	 * @var integer
34
-	 */
35
-	const CACHE_KEY_CSS_DECLARATION_BLOCK = 3;
36
-
37
-	/**
38
-	 * for calculating nth-of-type and nth-child selectors.
39
-	 *
40
-	 * @var integer
41
-	 */
42
-	const INDEX = 0;
43
-
44
-	/**
45
-	 * for calculating nth-of-type and nth-child selectors.
46
-	 *
47
-	 * @var integer
48
-	 */
49
-	const MULTIPLIER = 1;
50
-
51
-	/**
52
-	 * @var string
53
-	 */
54
-	const ID_ATTRIBUTE_MATCHER = '/(\\w+)?\\#([\\w\\-]+)/';
55
-
56
-	/**
57
-	 * @var string
58
-	 */
59
-	const CLASS_ATTRIBUTE_MATCHER = '/(\\w+|[\\*\\]])?((\\.[\\w\\-]+)+)/';
60
-
61
-	/**
62
-	 * @var string
63
-	 */
64
-	private $html = '';
65
-
66
-	/**
67
-	 * @var string
68
-	 */
69
-	private $css = '';
70
-
71
-	/**
72
-	 * @var array<string>
73
-	 */
74
-	private $unprocessableHtmlTags = array('wbr');
75
-
76
-	/**
77
-	 * @var array<array>
78
-	 */
79
-	private $caches = array(
80
-		self::CACHE_KEY_CSS => array(),
81
-		self::CACHE_KEY_SELECTOR => array(),
82
-		self::CACHE_KEY_XPATH => array(),
83
-		self::CACHE_KEY_CSS_DECLARATION_BLOCK => array(),
84
-	);
85
-
86
-	/**
87
-	 * the visited nodes with the XPath paths as array keys.
88
-	 *
89
-	 * @var array<\DOMNode>
90
-	 */
91
-	private $visitedNodes = array();
92
-
93
-	/**
94
-	 * the styles to apply to the nodes with the XPath paths as array keys for the outer array and the attribute names/values.
95
-	 * as key/value pairs for the inner array.
96
-	 *
97
-	 * @var array<array><string>
98
-	 */
99
-	private $styleAttributesForNodes = array();
100
-
101
-	/**
102
-	 * This attribute applies to the case where you want to preserve your original text encoding.
103
-	 *
104
-	 * By default, emogrifier translates your text into HTML entities for two reasons:
105
-	 *
106
-	 * 1. Because of client incompatibilities, it is better practice to send out HTML entities rather than unicode over email.
107
-	 *
108
-	 * 2. It translates any illegal XML characters that DOMDocument cannot work with.
109
-	 *
110
-	 * If you would like to preserve your original encoding, set this attribute to TRUE.
111
-	 *
112
-	 * @var boolean
113
-	 */
114
-	public $preserveEncoding = false;
115
-
116
-	public static $_media = '';
117
-
118
-	/**
119
-	 * The constructor.
120
-	 *
121
-	 * @param string $html the HTML to emogrify, must be UTF-8-encoded
122
-	 * @param string $css the CSS to merge, must be UTF-8-encoded
123
-	 */
124
-	public function __construct($html = '', $css = '') {
125
-		$this->setHtml($html);
126
-		$this->setCss($css);
127
-	}
128
-
129
-	/**
130
-	 * The destructor.
131
-	 */
132
-	public function __destruct() {
133
-		$this->purgeVisitedNodes();
134
-	}
135
-
136
-	/**
137
-	 * Sets the HTML to emogrify.
138
-	 *
139
-	 * @param string $html the HTML to emogrify, must be UTF-8-encoded
140
-	 */
141
-	public function setHtml($html = '') {
142
-		$this->html = $html;
143
-	}
144
-
145
-	/**
146
-	 * Sets the CSS to merge with the HTML.
147
-	 *
148
-	 * @param string $css the CSS to merge, must be UTF-8-encoded
149
-	 */
150
-	public function setCss($css = '') {
151
-		$this->css = $css;
152
-	}
153
-
154
-	/**
155
-	 * Clears all caches.
156
-	 */
157
-	private function clearAllCaches() {
158
-		$this->clearCache(self::CACHE_KEY_CSS);
159
-		$this->clearCache(self::CACHE_KEY_SELECTOR);
160
-		$this->clearCache(self::CACHE_KEY_XPATH);
161
-		$this->clearCache(self::CACHE_KEY_CSS_DECLARATION_BLOCK);
162
-	}
163
-
164
-	/**
165
-	 * Clears a single cache by key.
166
-	 *
167
-	 * @param integer $key the cache key, must be CACHE_KEY_CSS, CACHE_KEY_SELECTOR, CACHE_KEY_XPATH or CACHE_KEY_CSS_DECLARATION_BLOCK
168
-	 *
169
-	 * @throws InvalidArgumentException
170
-	 */
171
-	private function clearCache($key) {
172
-		$allowedCacheKeys = array(self::CACHE_KEY_CSS, self::CACHE_KEY_SELECTOR, self::CACHE_KEY_XPATH, self::CACHE_KEY_CSS_DECLARATION_BLOCK);
173
-		if (!in_array($key, $allowedCacheKeys, true)) {
174
-			throw new InvalidArgumentException('Invalid cache key: ' . $key, 1391822035);
175
-		}
176
-
177
-		$this->caches[$key] = array();
178
-	}
179
-
180
-	/**
181
-	 * Purges the visited nodes.
182
-	 */
183
-	private function purgeVisitedNodes() {
184
-		$this->visitedNodes = array();
185
-		$this->styleAttributesForNodes = array();
186
-	}
187
-
188
-	/**
189
-	 * Marks a tag for removal.
190
-	 *
191
-	 * There are some HTML tags that DOMDocument cannot process, and it will throw an error if it encounters them.
192
-	 * In particular, DOMDocument will complain if you try to use HTML5 tags in an XHTML document.
193
-	 *
194
-	 * Note: The tags will not be removed if they have any content.
195
-	 *
196
-	 * @param string $tagName the tag name, e.g., "p"
197
-	 */
198
-	public function addUnprocessableHtmlTag($tagName) {
199
-		$this->unprocessableHtmlTags[] = $tagName;
200
-	}
201
-
202
-	/**
203
-	 * Drops a tag from the removal list.
204
-	 *
205
-	 * @param string $tagName the tag name, e.g., "p"
206
-	 */
207
-	public function removeUnprocessableHtmlTag($tagName) {
208
-		$key = array_search($tagName, $this->unprocessableHtmlTags, true);
209
-		if ($key !== false) {
210
-			unset($this->unprocessableHtmlTags[$key]);
211
-		}
212
-	}
213
-
214
-	/**
215
-	 * Applies the CSS you submit to the HTML you submit.
216
-	 *
217
-	 * This method places the CSS inline.
218
-	 *
219
-	 * @return string
220
-	 *
221
-	 * @throws BadMethodCallException
222
-	 */
223
-	public function emogrify() {
224
-		if ($this->html === '') {
225
-			throw new BadMethodCallException('Please set some HTML first before calling emogrify.', 1390393096);
226
-		}
227
-
228
-		$xmlDocument = $this->createXmlDocument();
229
-		$xpath = new DOMXPath($xmlDocument);
230
-		$this->clearAllCaches();
231
-
232
-		// before be begin processing the CSS file, parse the document and normalize all existing CSS attributes (changes 'DISPLAY: none' to 'display: none');
233
-		// we wouldn't have to do this if DOMXPath supported XPath 2.0.
234
-		// also store a reference of nodes with existing inline styles so we don't overwrite them
235
-		$this->purgeVisitedNodes();
236
-
237
-		$nodesWithStyleAttributes = $xpath->query('//*[@style]');
238
-		if ($nodesWithStyleAttributes !== false) {
239
-			/** @var $nodeWithStyleAttribute DOMNode */
240
-			foreach ($nodesWithStyleAttributes as $node) {
241
-				$normalizedOriginalStyle = preg_replace_callback( '/[A-z\\-]+(?=\\:)/S', array( $this, 'strtolower' ), $node->getAttribute('style') );
242
-
243
-				// in order to not overwrite existing style attributes in the HTML, we have to save the original HTML styles
244
-				$nodePath = $node->getNodePath();
245
-				if (!isset($this->styleAttributesForNodes[$nodePath])) {
246
-					$this->styleAttributesForNodes[$nodePath] = $this->parseCssDeclarationBlock($normalizedOriginalStyle);
247
-					$this->visitedNodes[$nodePath] = $node;
248
-				}
249
-
250
-				$node->setAttribute('style', $normalizedOriginalStyle);
251
-			}
252
-		}
253
-
254
-		// grab any existing style blocks from the html and append them to the existing CSS
255
-		// (these blocks should be appended so as to have precedence over conflicting styles in the existing CSS)
256
-		$allCss = $this->css;
257
-
258
-		$allCss .= $this->getCssFromAllStyleNodes($xpath);
259
-
260
-		$cssParts = $this->splitCssAndMediaQuery($allCss);
261
-		self::$_media = ''; // reset
262
-
263
-		$cssKey = md5($cssParts['css']);
264
-		if (!isset($this->caches[self::CACHE_KEY_CSS][$cssKey])) {
265
-			// process the CSS file for selectors and definitions
266
-			preg_match_all('/(?:^|[\\s^{}]*)([^{]+){([^}]*)}/mis', $cssParts['css'], $matches, PREG_SET_ORDER);
267
-
268
-			$allSelectors = array();
269
-			foreach ($matches as $key => $selectorString) {
270
-				// if there is a blank definition, skip
271
-				if (!strlen(trim($selectorString[2]))) {
272
-					continue;
273
-				}
274
-
275
-				// else split by commas and duplicate attributes so we can sort by selector precedence
276
-				$selectors = explode(',', $selectorString[1]);
277
-				foreach ($selectors as $selector) {
278
-					// don't process pseudo-elements and behavioral (dynamic) pseudo-classes; ONLY allow structural pseudo-classes
279
-					if (strpos($selector, ':') !== false && !preg_match('/:\\S+\\-(child|type)\\(/i', $selector)) {
280
-						continue;
281
-					}
282
-
283
-					$allSelectors[] = array('selector' => trim($selector),
284
-											 'attributes' => trim($selectorString[2]),
285
-											 // keep track of where it appears in the file, since order is important
286
-											 'line' => $key,
287
-					);
288
-				}
289
-			}
290
-
291
-			// now sort the selectors by precedence
292
-			usort($allSelectors, array($this,'sortBySelectorPrecedence'));
293
-
294
-			$this->caches[self::CACHE_KEY_CSS][$cssKey] = $allSelectors;
295
-		}
296
-
297
-		foreach ($this->caches[self::CACHE_KEY_CSS][$cssKey] as $value) {
298
-			// query the body for the xpath selector
299
-			$nodesMatchingCssSelectors = $xpath->query($this->translateCssToXpath($value['selector']));
300
-
301
-			/** @var $node \DOMNode */
302
-			foreach ($nodesMatchingCssSelectors as $node) {
303
-				// if it has a style attribute, get it, process it, and append (overwrite) new stuff
304
-				if ($node->hasAttribute('style')) {
305
-					// break it up into an associative array
306
-					$oldStyleDeclarations = $this->parseCssDeclarationBlock($node->getAttribute('style'));
307
-				} else {
308
-					$oldStyleDeclarations = array();
309
-				}
310
-				$newStyleDeclarations = $this->parseCssDeclarationBlock($value['attributes']);
311
-				$node->setAttribute('style', $this->generateStyleStringFromDeclarationsArrays($oldStyleDeclarations, $newStyleDeclarations));
312
-			}
313
-		}
314
-
315
-		// now iterate through the nodes that contained inline styles in the original HTML
316
-		foreach ($this->styleAttributesForNodes as $nodePath => $styleAttributesForNode) {
317
-			$node = $this->visitedNodes[$nodePath];
318
-			$currentStyleAttributes = $this->parseCssDeclarationBlock($node->getAttribute('style'));
319
-			$node->setAttribute('style', $this->generateStyleStringFromDeclarationsArrays($currentStyleAttributes, $styleAttributesForNode));
320
-		}
321
-
322
-		// This removes styles from your email that contain display:none.
323
-		// We need to look for display:none, but we need to do a case-insensitive search. Since DOMDocument only supports XPath 1.0,
324
-		// lower-case() isn't available to us. We've thus far only set attributes to lowercase, not attribute values. Consequently, we need
325
-		// to translate() the letters that would be in 'NONE' ("NOE") to lowercase.
326
-		$nodesWithStyleDisplayNone = $xpath->query('//*[contains(translate(translate(@style," ",""),"NOE","noe"),"display:none")]');
327
-		// The checks on parentNode and is_callable below ensure that if we've deleted the parent node,
328
-		// we don't try to call removeChild on a nonexistent child node
329
-		if ($nodesWithStyleDisplayNone->length > 0) {
330
-			/** @var $node \DOMNode */
331
-			foreach ($nodesWithStyleDisplayNone as $node) {
332
-				if ($node->parentNode && is_callable(array($node->parentNode,'removeChild'))) {
333
-					$node->parentNode->removeChild($node);
334
-				}
335
-			}
336
-		}
337
-
338
-		$this->copyCssWithMediaToStyleNode($cssParts, $xmlDocument);
339
-
340
-		if ($this->preserveEncoding) {
341
-			// Deprecated since PHP 8.2
342
-			if ( version_compare( PHP_VERSION, '8.2', '<' ) && function_exists( 'mb_convert_encoding' ) ) {
343
-				return mb_convert_encoding( $xmlDocument->saveHTML(), self::ENCODING, 'HTML-ENTITIES' );
344
-			} else {
345
-				return mb_encode_numericentity( $xmlDocument->saveHTML(), [0x80, 0x10FFFF, 0, ~0], self::ENCODING );
346
-				//return htmlspecialchars_decode( utf8_encode( html_entity_decode( $xmlDocument->saveHTML(), ENT_COMPAT, self::ENCODING ) ) );
347
-			}
348
-		} else {
349
-			return $xmlDocument->saveHTML();
350
-		}
351
-	}
12
+    /**
13
+     * @var string
14
+     */
15
+    const ENCODING = 'UTF-8';
16
+
17
+    /**
18
+     * @var integer
19
+     */
20
+    const CACHE_KEY_CSS = 0;
21
+
22
+    /**
23
+     * @var integer
24
+     */
25
+    const CACHE_KEY_SELECTOR = 1;
26
+
27
+    /**
28
+     * @var integer
29
+     */
30
+    const CACHE_KEY_XPATH = 2;
31
+
32
+    /**
33
+     * @var integer
34
+     */
35
+    const CACHE_KEY_CSS_DECLARATION_BLOCK = 3;
36
+
37
+    /**
38
+     * for calculating nth-of-type and nth-child selectors.
39
+     *
40
+     * @var integer
41
+     */
42
+    const INDEX = 0;
43
+
44
+    /**
45
+     * for calculating nth-of-type and nth-child selectors.
46
+     *
47
+     * @var integer
48
+     */
49
+    const MULTIPLIER = 1;
50
+
51
+    /**
52
+     * @var string
53
+     */
54
+    const ID_ATTRIBUTE_MATCHER = '/(\\w+)?\\#([\\w\\-]+)/';
55
+
56
+    /**
57
+     * @var string
58
+     */
59
+    const CLASS_ATTRIBUTE_MATCHER = '/(\\w+|[\\*\\]])?((\\.[\\w\\-]+)+)/';
60
+
61
+    /**
62
+     * @var string
63
+     */
64
+    private $html = '';
65
+
66
+    /**
67
+     * @var string
68
+     */
69
+    private $css = '';
70
+
71
+    /**
72
+     * @var array<string>
73
+     */
74
+    private $unprocessableHtmlTags = array('wbr');
75
+
76
+    /**
77
+     * @var array<array>
78
+     */
79
+    private $caches = array(
80
+        self::CACHE_KEY_CSS => array(),
81
+        self::CACHE_KEY_SELECTOR => array(),
82
+        self::CACHE_KEY_XPATH => array(),
83
+        self::CACHE_KEY_CSS_DECLARATION_BLOCK => array(),
84
+    );
85
+
86
+    /**
87
+     * the visited nodes with the XPath paths as array keys.
88
+     *
89
+     * @var array<\DOMNode>
90
+     */
91
+    private $visitedNodes = array();
92
+
93
+    /**
94
+     * the styles to apply to the nodes with the XPath paths as array keys for the outer array and the attribute names/values.
95
+     * as key/value pairs for the inner array.
96
+     *
97
+     * @var array<array><string>
98
+     */
99
+    private $styleAttributesForNodes = array();
100
+
101
+    /**
102
+     * This attribute applies to the case where you want to preserve your original text encoding.
103
+     *
104
+     * By default, emogrifier translates your text into HTML entities for two reasons:
105
+     *
106
+     * 1. Because of client incompatibilities, it is better practice to send out HTML entities rather than unicode over email.
107
+     *
108
+     * 2. It translates any illegal XML characters that DOMDocument cannot work with.
109
+     *
110
+     * If you would like to preserve your original encoding, set this attribute to TRUE.
111
+     *
112
+     * @var boolean
113
+     */
114
+    public $preserveEncoding = false;
115
+
116
+    public static $_media = '';
117
+
118
+    /**
119
+     * The constructor.
120
+     *
121
+     * @param string $html the HTML to emogrify, must be UTF-8-encoded
122
+     * @param string $css the CSS to merge, must be UTF-8-encoded
123
+     */
124
+    public function __construct($html = '', $css = '') {
125
+        $this->setHtml($html);
126
+        $this->setCss($css);
127
+    }
128
+
129
+    /**
130
+     * The destructor.
131
+     */
132
+    public function __destruct() {
133
+        $this->purgeVisitedNodes();
134
+    }
135
+
136
+    /**
137
+     * Sets the HTML to emogrify.
138
+     *
139
+     * @param string $html the HTML to emogrify, must be UTF-8-encoded
140
+     */
141
+    public function setHtml($html = '') {
142
+        $this->html = $html;
143
+    }
144
+
145
+    /**
146
+     * Sets the CSS to merge with the HTML.
147
+     *
148
+     * @param string $css the CSS to merge, must be UTF-8-encoded
149
+     */
150
+    public function setCss($css = '') {
151
+        $this->css = $css;
152
+    }
153
+
154
+    /**
155
+     * Clears all caches.
156
+     */
157
+    private function clearAllCaches() {
158
+        $this->clearCache(self::CACHE_KEY_CSS);
159
+        $this->clearCache(self::CACHE_KEY_SELECTOR);
160
+        $this->clearCache(self::CACHE_KEY_XPATH);
161
+        $this->clearCache(self::CACHE_KEY_CSS_DECLARATION_BLOCK);
162
+    }
163
+
164
+    /**
165
+     * Clears a single cache by key.
166
+     *
167
+     * @param integer $key the cache key, must be CACHE_KEY_CSS, CACHE_KEY_SELECTOR, CACHE_KEY_XPATH or CACHE_KEY_CSS_DECLARATION_BLOCK
168
+     *
169
+     * @throws InvalidArgumentException
170
+     */
171
+    private function clearCache($key) {
172
+        $allowedCacheKeys = array(self::CACHE_KEY_CSS, self::CACHE_KEY_SELECTOR, self::CACHE_KEY_XPATH, self::CACHE_KEY_CSS_DECLARATION_BLOCK);
173
+        if (!in_array($key, $allowedCacheKeys, true)) {
174
+            throw new InvalidArgumentException('Invalid cache key: ' . $key, 1391822035);
175
+        }
176
+
177
+        $this->caches[$key] = array();
178
+    }
179
+
180
+    /**
181
+     * Purges the visited nodes.
182
+     */
183
+    private function purgeVisitedNodes() {
184
+        $this->visitedNodes = array();
185
+        $this->styleAttributesForNodes = array();
186
+    }
187
+
188
+    /**
189
+     * Marks a tag for removal.
190
+     *
191
+     * There are some HTML tags that DOMDocument cannot process, and it will throw an error if it encounters them.
192
+     * In particular, DOMDocument will complain if you try to use HTML5 tags in an XHTML document.
193
+     *
194
+     * Note: The tags will not be removed if they have any content.
195
+     *
196
+     * @param string $tagName the tag name, e.g., "p"
197
+     */
198
+    public function addUnprocessableHtmlTag($tagName) {
199
+        $this->unprocessableHtmlTags[] = $tagName;
200
+    }
201
+
202
+    /**
203
+     * Drops a tag from the removal list.
204
+     *
205
+     * @param string $tagName the tag name, e.g., "p"
206
+     */
207
+    public function removeUnprocessableHtmlTag($tagName) {
208
+        $key = array_search($tagName, $this->unprocessableHtmlTags, true);
209
+        if ($key !== false) {
210
+            unset($this->unprocessableHtmlTags[$key]);
211
+        }
212
+    }
213
+
214
+    /**
215
+     * Applies the CSS you submit to the HTML you submit.
216
+     *
217
+     * This method places the CSS inline.
218
+     *
219
+     * @return string
220
+     *
221
+     * @throws BadMethodCallException
222
+     */
223
+    public function emogrify() {
224
+        if ($this->html === '') {
225
+            throw new BadMethodCallException('Please set some HTML first before calling emogrify.', 1390393096);
226
+        }
227
+
228
+        $xmlDocument = $this->createXmlDocument();
229
+        $xpath = new DOMXPath($xmlDocument);
230
+        $this->clearAllCaches();
231
+
232
+        // before be begin processing the CSS file, parse the document and normalize all existing CSS attributes (changes 'DISPLAY: none' to 'display: none');
233
+        // we wouldn't have to do this if DOMXPath supported XPath 2.0.
234
+        // also store a reference of nodes with existing inline styles so we don't overwrite them
235
+        $this->purgeVisitedNodes();
236
+
237
+        $nodesWithStyleAttributes = $xpath->query('//*[@style]');
238
+        if ($nodesWithStyleAttributes !== false) {
239
+            /** @var $nodeWithStyleAttribute DOMNode */
240
+            foreach ($nodesWithStyleAttributes as $node) {
241
+                $normalizedOriginalStyle = preg_replace_callback( '/[A-z\\-]+(?=\\:)/S', array( $this, 'strtolower' ), $node->getAttribute('style') );
242
+
243
+                // in order to not overwrite existing style attributes in the HTML, we have to save the original HTML styles
244
+                $nodePath = $node->getNodePath();
245
+                if (!isset($this->styleAttributesForNodes[$nodePath])) {
246
+                    $this->styleAttributesForNodes[$nodePath] = $this->parseCssDeclarationBlock($normalizedOriginalStyle);
247
+                    $this->visitedNodes[$nodePath] = $node;
248
+                }
249
+
250
+                $node->setAttribute('style', $normalizedOriginalStyle);
251
+            }
252
+        }
253
+
254
+        // grab any existing style blocks from the html and append them to the existing CSS
255
+        // (these blocks should be appended so as to have precedence over conflicting styles in the existing CSS)
256
+        $allCss = $this->css;
257
+
258
+        $allCss .= $this->getCssFromAllStyleNodes($xpath);
259
+
260
+        $cssParts = $this->splitCssAndMediaQuery($allCss);
261
+        self::$_media = ''; // reset
262
+
263
+        $cssKey = md5($cssParts['css']);
264
+        if (!isset($this->caches[self::CACHE_KEY_CSS][$cssKey])) {
265
+            // process the CSS file for selectors and definitions
266
+            preg_match_all('/(?:^|[\\s^{}]*)([^{]+){([^}]*)}/mis', $cssParts['css'], $matches, PREG_SET_ORDER);
267
+
268
+            $allSelectors = array();
269
+            foreach ($matches as $key => $selectorString) {
270
+                // if there is a blank definition, skip
271
+                if (!strlen(trim($selectorString[2]))) {
272
+                    continue;
273
+                }
274
+
275
+                // else split by commas and duplicate attributes so we can sort by selector precedence
276
+                $selectors = explode(',', $selectorString[1]);
277
+                foreach ($selectors as $selector) {
278
+                    // don't process pseudo-elements and behavioral (dynamic) pseudo-classes; ONLY allow structural pseudo-classes
279
+                    if (strpos($selector, ':') !== false && !preg_match('/:\\S+\\-(child|type)\\(/i', $selector)) {
280
+                        continue;
281
+                    }
282
+
283
+                    $allSelectors[] = array('selector' => trim($selector),
284
+                                                'attributes' => trim($selectorString[2]),
285
+                                                // keep track of where it appears in the file, since order is important
286
+                                                'line' => $key,
287
+                    );
288
+                }
289
+            }
290
+
291
+            // now sort the selectors by precedence
292
+            usort($allSelectors, array($this,'sortBySelectorPrecedence'));
293
+
294
+            $this->caches[self::CACHE_KEY_CSS][$cssKey] = $allSelectors;
295
+        }
296
+
297
+        foreach ($this->caches[self::CACHE_KEY_CSS][$cssKey] as $value) {
298
+            // query the body for the xpath selector
299
+            $nodesMatchingCssSelectors = $xpath->query($this->translateCssToXpath($value['selector']));
300
+
301
+            /** @var $node \DOMNode */
302
+            foreach ($nodesMatchingCssSelectors as $node) {
303
+                // if it has a style attribute, get it, process it, and append (overwrite) new stuff
304
+                if ($node->hasAttribute('style')) {
305
+                    // break it up into an associative array
306
+                    $oldStyleDeclarations = $this->parseCssDeclarationBlock($node->getAttribute('style'));
307
+                } else {
308
+                    $oldStyleDeclarations = array();
309
+                }
310
+                $newStyleDeclarations = $this->parseCssDeclarationBlock($value['attributes']);
311
+                $node->setAttribute('style', $this->generateStyleStringFromDeclarationsArrays($oldStyleDeclarations, $newStyleDeclarations));
312
+            }
313
+        }
314
+
315
+        // now iterate through the nodes that contained inline styles in the original HTML
316
+        foreach ($this->styleAttributesForNodes as $nodePath => $styleAttributesForNode) {
317
+            $node = $this->visitedNodes[$nodePath];
318
+            $currentStyleAttributes = $this->parseCssDeclarationBlock($node->getAttribute('style'));
319
+            $node->setAttribute('style', $this->generateStyleStringFromDeclarationsArrays($currentStyleAttributes, $styleAttributesForNode));
320
+        }
321
+
322
+        // This removes styles from your email that contain display:none.
323
+        // We need to look for display:none, but we need to do a case-insensitive search. Since DOMDocument only supports XPath 1.0,
324
+        // lower-case() isn't available to us. We've thus far only set attributes to lowercase, not attribute values. Consequently, we need
325
+        // to translate() the letters that would be in 'NONE' ("NOE") to lowercase.
326
+        $nodesWithStyleDisplayNone = $xpath->query('//*[contains(translate(translate(@style," ",""),"NOE","noe"),"display:none")]');
327
+        // The checks on parentNode and is_callable below ensure that if we've deleted the parent node,
328
+        // we don't try to call removeChild on a nonexistent child node
329
+        if ($nodesWithStyleDisplayNone->length > 0) {
330
+            /** @var $node \DOMNode */
331
+            foreach ($nodesWithStyleDisplayNone as $node) {
332
+                if ($node->parentNode && is_callable(array($node->parentNode,'removeChild'))) {
333
+                    $node->parentNode->removeChild($node);
334
+                }
335
+            }
336
+        }
337
+
338
+        $this->copyCssWithMediaToStyleNode($cssParts, $xmlDocument);
339
+
340
+        if ($this->preserveEncoding) {
341
+            // Deprecated since PHP 8.2
342
+            if ( version_compare( PHP_VERSION, '8.2', '<' ) && function_exists( 'mb_convert_encoding' ) ) {
343
+                return mb_convert_encoding( $xmlDocument->saveHTML(), self::ENCODING, 'HTML-ENTITIES' );
344
+            } else {
345
+                return mb_encode_numericentity( $xmlDocument->saveHTML(), [0x80, 0x10FFFF, 0, ~0], self::ENCODING );
346
+                //return htmlspecialchars_decode( utf8_encode( html_entity_decode( $xmlDocument->saveHTML(), ENT_COMPAT, self::ENCODING ) ) );
347
+            }
348
+        } else {
349
+            return $xmlDocument->saveHTML();
350
+        }
351
+    }
352 352
 
353 353
     /**
354 354
      * String to lower.
@@ -358,143 +358,143 @@  discard block
 block discarded – undo
358 358
      * @param array $m
359 359
      * @return string
360 360
      */
361
-	public function strtolower(array $m) {
362
-		return strtolower($m[0]);
363
-	}
364
-
365
-
366
-	/**
367
-	 * This method merges old or existing name/value array with new name/value array.
368
-	 * and then generates a string of the combined style suitable for placing inline.
369
-	 * This becomes the single point for CSS string generation allowing for consistent.
370
-	 * CSS output no matter where the CSS originally came from.
371
-	 * @param array $oldStyles
372
-	 * @param array $newStyles
373
-	 * @return string
374
-	 */
375
-	private function generateStyleStringFromDeclarationsArrays(array $oldStyles, array $newStyles) {
376
-		$combinedStyles = array_merge($oldStyles, $newStyles);
377
-		$style = '';
378
-		foreach ($combinedStyles as $attributeName => $attributeValue) {
379
-			$style .= (strtolower(trim($attributeName)) . ': ' . trim($attributeValue) . '; ');
380
-		}
381
-		return trim($style);
382
-	}
383
-
384
-
385
-	/**
386
-	 * Copies the media part from CSS array parts to $xmlDocument.
387
-	 *
388
-	 * @param array $cssParts
389
-	 * @param DOMDocument $xmlDocument
390
-	 */
391
-	public function copyCssWithMediaToStyleNode(array $cssParts, DOMDocument $xmlDocument) {
392
-		if (isset($cssParts['media']) && $cssParts['media'] !== '') {
393
-			$this->addStyleElementToDocument($xmlDocument, $cssParts['media']);
394
-		}
395
-	}
396
-
397
-	/**
398
-	 * Returns CSS content.
399
-	 *
400
-	 * @param DOMXPath $xpath
401
-	 * @return string
402
-	 */
403
-	private function getCssFromAllStyleNodes(DOMXPath $xpath) {
404
-		$styleNodes = $xpath->query('//style');
405
-
406
-		if ($styleNodes === false) {
407
-			return '';
408
-		}
409
-
410
-		$css = '';
411
-		/** @var $styleNode DOMNode */
412
-		foreach ($styleNodes as $styleNode) {
413
-			$css .= "\n\n" . $styleNode->nodeValue;
414
-			$styleNode->parentNode->removeChild($styleNode);
415
-		}
416
-
417
-		return $css;
418
-	}
419
-
420
-	/**
421
-	 * Adds a style element with $css to $document.
422
-	 *
423
-	 * @param DOMDocument $document
424
-	 * @param string $css
425
-	 */
426
-	private function addStyleElementToDocument(DOMDocument $document, $css) {
427
-		$styleElement = $document->createElement('style', $css);
428
-		$styleAttribute = $document->createAttribute('type');
429
-		$styleAttribute->value = 'text/css';
430
-		$styleElement->appendChild($styleAttribute);
431
-
432
-		$head = $this->getOrCreateHeadElement($document);
433
-		$head->appendChild($styleElement);
434
-	}
435
-
436
-	/**
437
-	 * Returns the existing or creates a new head element in $document.
438
-	 *
439
-	 * @param DOMDocument $document
440
-	 * @return DOMNode the head element
441
-	 */
442
-	private function getOrCreateHeadElement(DOMDocument $document) {
443
-		$head = $document->getElementsByTagName('head')->item(0);
444
-
445
-		if ($head === null) {
446
-			$head = $document->createElement('head');
447
-			$html = $document->getElementsByTagName('html')->item(0);
448
-			$html->insertBefore($head, $document->getElementsByTagName('body')->item(0));
449
-		}
450
-
451
-		return $head;
452
-	}
453
-
454
-	/**
455
-	 * Splits input CSS code to an array where:
456
-	 *
457
-	 * - key "css" will be contains clean CSS code.
458
-	 * - key "media" will be contains all valuable media queries.
459
-	 *
460
-	 * Example:
461
-	 *
462
-	 * The CSS code.
463
-	 *
464
-	 *   "@import "file.css"; h1 { color:red; } @media { h1 {}} @media tv { h1 {}}"
465
-	 *
466
-	 * will be parsed into the following array:
467
-	 *
468
-	 *   "css" => "h1 { color:red; }"
469
-	 *   "media" => "@media { h1 {}}"
470
-	 *
471
-	 * @param string $css
472
-	 * @return array
473
-	 */
474
-	private function splitCssAndMediaQuery($css) {
475
-		$css = preg_replace_callback( '#@media\\s+(?:only\\s)?(?:[\\s{\(]|screen|all)\\s?[^{]+{.*}\\s*}\\s*#misU', array( $this, '_media_concat' ), $css );
476
-
477
-		// filter the CSS
478
-		$search = array(
479
-			// get rid of css comment code
480
-			'/\\/\\*.*\\*\\//sU',
481
-			// strip out any import directives
482
-			'/^\\s*@import\\s[^;]+;/misU',
483
-			// strip remains media enclosures
484
-			'/^\\s*@media\\s[^{]+{(.*)}\\s*}\\s/misU',
485
-		);
486
-
487
-		$replace = array(
488
-			'',
489
-			'',
490
-			'',
491
-		);
492
-
493
-		// clean CSS before output
494
-		$css = preg_replace($search, $replace, $css);
495
-
496
-		return array('css' => $css, 'media' => self::$_media);
497
-	}
361
+    public function strtolower(array $m) {
362
+        return strtolower($m[0]);
363
+    }
364
+
365
+
366
+    /**
367
+     * This method merges old or existing name/value array with new name/value array.
368
+     * and then generates a string of the combined style suitable for placing inline.
369
+     * This becomes the single point for CSS string generation allowing for consistent.
370
+     * CSS output no matter where the CSS originally came from.
371
+     * @param array $oldStyles
372
+     * @param array $newStyles
373
+     * @return string
374
+     */
375
+    private function generateStyleStringFromDeclarationsArrays(array $oldStyles, array $newStyles) {
376
+        $combinedStyles = array_merge($oldStyles, $newStyles);
377
+        $style = '';
378
+        foreach ($combinedStyles as $attributeName => $attributeValue) {
379
+            $style .= (strtolower(trim($attributeName)) . ': ' . trim($attributeValue) . '; ');
380
+        }
381
+        return trim($style);
382
+    }
383
+
384
+
385
+    /**
386
+     * Copies the media part from CSS array parts to $xmlDocument.
387
+     *
388
+     * @param array $cssParts
389
+     * @param DOMDocument $xmlDocument
390
+     */
391
+    public function copyCssWithMediaToStyleNode(array $cssParts, DOMDocument $xmlDocument) {
392
+        if (isset($cssParts['media']) && $cssParts['media'] !== '') {
393
+            $this->addStyleElementToDocument($xmlDocument, $cssParts['media']);
394
+        }
395
+    }
396
+
397
+    /**
398
+     * Returns CSS content.
399
+     *
400
+     * @param DOMXPath $xpath
401
+     * @return string
402
+     */
403
+    private function getCssFromAllStyleNodes(DOMXPath $xpath) {
404
+        $styleNodes = $xpath->query('//style');
405
+
406
+        if ($styleNodes === false) {
407
+            return '';
408
+        }
409
+
410
+        $css = '';
411
+        /** @var $styleNode DOMNode */
412
+        foreach ($styleNodes as $styleNode) {
413
+            $css .= "\n\n" . $styleNode->nodeValue;
414
+            $styleNode->parentNode->removeChild($styleNode);
415
+        }
416
+
417
+        return $css;
418
+    }
419
+
420
+    /**
421
+     * Adds a style element with $css to $document.
422
+     *
423
+     * @param DOMDocument $document
424
+     * @param string $css
425
+     */
426
+    private function addStyleElementToDocument(DOMDocument $document, $css) {
427
+        $styleElement = $document->createElement('style', $css);
428
+        $styleAttribute = $document->createAttribute('type');
429
+        $styleAttribute->value = 'text/css';
430
+        $styleElement->appendChild($styleAttribute);
431
+
432
+        $head = $this->getOrCreateHeadElement($document);
433
+        $head->appendChild($styleElement);
434
+    }
435
+
436
+    /**
437
+     * Returns the existing or creates a new head element in $document.
438
+     *
439
+     * @param DOMDocument $document
440
+     * @return DOMNode the head element
441
+     */
442
+    private function getOrCreateHeadElement(DOMDocument $document) {
443
+        $head = $document->getElementsByTagName('head')->item(0);
444
+
445
+        if ($head === null) {
446
+            $head = $document->createElement('head');
447
+            $html = $document->getElementsByTagName('html')->item(0);
448
+            $html->insertBefore($head, $document->getElementsByTagName('body')->item(0));
449
+        }
450
+
451
+        return $head;
452
+    }
453
+
454
+    /**
455
+     * Splits input CSS code to an array where:
456
+     *
457
+     * - key "css" will be contains clean CSS code.
458
+     * - key "media" will be contains all valuable media queries.
459
+     *
460
+     * Example:
461
+     *
462
+     * The CSS code.
463
+     *
464
+     *   "@import "file.css"; h1 { color:red; } @media { h1 {}} @media tv { h1 {}}"
465
+     *
466
+     * will be parsed into the following array:
467
+     *
468
+     *   "css" => "h1 { color:red; }"
469
+     *   "media" => "@media { h1 {}}"
470
+     *
471
+     * @param string $css
472
+     * @return array
473
+     */
474
+    private function splitCssAndMediaQuery($css) {
475
+        $css = preg_replace_callback( '#@media\\s+(?:only\\s)?(?:[\\s{\(]|screen|all)\\s?[^{]+{.*}\\s*}\\s*#misU', array( $this, '_media_concat' ), $css );
476
+
477
+        // filter the CSS
478
+        $search = array(
479
+            // get rid of css comment code
480
+            '/\\/\\*.*\\*\\//sU',
481
+            // strip out any import directives
482
+            '/^\\s*@import\\s[^;]+;/misU',
483
+            // strip remains media enclosures
484
+            '/^\\s*@media\\s[^{]+{(.*)}\\s*}\\s/misU',
485
+        );
486
+
487
+        $replace = array(
488
+            '',
489
+            '',
490
+            '',
491
+        );
492
+
493
+        // clean CSS before output
494
+        $css = preg_replace($search, $replace, $css);
495
+
496
+        return array('css' => $css, 'media' => self::$_media);
497
+    }
498 498
 
499 499
     /**
500 500
      * Media concat.
@@ -503,306 +503,306 @@  discard block
 block discarded – undo
503 503
      *
504 504
      * @param array $matches Matches result array.
505 505
      */
506
-	private function _media_concat( $matches ) {
507
-		self::$_media .= $matches[0];
508
-	}
509
-
510
-	/**
511
-	 * Creates a DOMDocument instance with the current HTML.
512
-	 *
513
-	 * @return DOMDocument
514
-	 */
515
-	private function createXmlDocument() {
516
-		$xmlDocument = new DOMDocument;
517
-		$xmlDocument->encoding = self::ENCODING;
518
-		$xmlDocument->strictErrorChecking = false;
519
-		$xmlDocument->formatOutput = true;
520
-		$libXmlState = libxml_use_internal_errors(true);
521
-		// phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged
522
-		/** @scrutinizer ignore-unhandled */ @$xmlDocument->loadHTML($this->getUnifiedHtml());
523
-		libxml_clear_errors();
524
-		libxml_use_internal_errors($libXmlState);
525
-		$xmlDocument->normalizeDocument();
526
-
527
-		return $xmlDocument;
528
-	}
529
-
530
-	/**
531
-	 * Returns the HTML with the non-ASCII characters converts into HTML entities and the unprocessable HTML tags removed.
532
-	 *
533
-	 * @return string the unified HTML
534
-	 *
535
-	 * @throws BadMethodCallException
536
-	 */
537
-	private function getUnifiedHtml() {
538
-		if (!empty($this->unprocessableHtmlTags)) {
539
-			$unprocessableHtmlTags = implode('|', $this->unprocessableHtmlTags);
540
-			$bodyWithoutUnprocessableTags = preg_replace('/<\\/?(' . $unprocessableHtmlTags . ')[^>]*>/i', '', $this->html);
541
-		} else {
542
-			$bodyWithoutUnprocessableTags = $this->html;
543
-		}
544
-
545
-		// Deprecated since PHP 8.2
546
-		if ( version_compare( PHP_VERSION, '8.2', '<' ) && function_exists( 'mb_convert_encoding' ) ) {
547
-			return mb_convert_encoding( $bodyWithoutUnprocessableTags, 'HTML-ENTITIES', self::ENCODING );
548
-		} else {
549
-			return mb_encode_numericentity( $bodyWithoutUnprocessableTags, [0x80, 0x10FFFF, 0, ~0], self::ENCODING );
550
-			//return htmlspecialchars_decode( utf8_decode( htmlentities( $bodyWithoutUnprocessableTags, ENT_COMPAT, self::ENCODING, false ) ) );
551
-		}
552
-	}
553
-
554
-	/**
555
-	 * @param array $a
556
-	 * @param array $b
557
-	 *
558
-	 * @return integer
559
-	 */
560
-	private function sortBySelectorPrecedence(array $a, array $b) {
561
-		$precedenceA = $this->getCssSelectorPrecedence($a['selector']);
562
-		$precedenceB = $this->getCssSelectorPrecedence($b['selector']);
563
-
564
-		// We want these sorted in ascending order so selectors with lesser precedence get processed first and
565
-		// selectors with greater precedence get sorted last.
566
-		// The parenthesis around the -1 are necessary to avoid a PHP_CodeSniffer warning about missing spaces around
567
-		// arithmetic operators.
568
-		// @see http://forge.typo3.org/issues/55605
569
-		$precedenceForEquals = ($a['line'] < $b['line'] ? (-1) : 1);
570
-		$precedenceForNotEquals = ($precedenceA < $precedenceB ? (-1) : 1);
571
-		return ($precedenceA === $precedenceB) ? $precedenceForEquals : $precedenceForNotEquals;
572
-	}
573
-
574
-	/**
575
-	 * @param string $selector
576
-	 *
577
-	 * @return integer
578
-	 */
579
-	private function getCssSelectorPrecedence($selector) {
580
-		$selectorKey = md5($selector);
581
-		if (!isset($this->caches[self::CACHE_KEY_SELECTOR][$selectorKey])) {
582
-			$precedence = 0;
583
-			$value = 100;
584
-			// ids: worth 100, classes: worth 10, elements: worth 1
585
-			$search = array('\\#','\\.','');
586
-
587
-			foreach ($search as $s) {
588
-				if (trim($selector == '')) {
589
-					break;
590
-				}
591
-				$number = 0;
592
-				$selector = preg_replace('/' . $s . '\\w+/', '', $selector, -1, $number);
593
-				$precedence += ($value * $number);
594
-				$value /= 10;
595
-			}
596
-			$this->caches[self::CACHE_KEY_SELECTOR][$selectorKey] = $precedence;
597
-		}
598
-
599
-		return $this->caches[self::CACHE_KEY_SELECTOR][$selectorKey];
600
-	}
601
-
602
-	/**
603
-	 * Right now, we support all CSS 1 selectors and most CSS2/3 selectors.
604
-	 *
605
-	 * @see http://plasmasturm.org/log/444/
606
-	 *
607
-	 * @param string $paramCssSelector
608
-	 *
609
-	 * @return string
610
-	 */
611
-	private function translateCssToXpath($paramCssSelector) {
612
-		$cssSelector = ' ' . $paramCssSelector . ' ';
613
-		$cssSelector = preg_replace_callback( '/\s+\w+\s+/', array( $this, 'strtolower' ), $cssSelector );
614
-		$cssSelector = trim($cssSelector);
615
-		$xpathKey = md5($cssSelector);
616
-		if (!isset($this->caches[self::CACHE_KEY_XPATH][$xpathKey])) {
617
-			// returns an Xpath selector
618
-			$search = array(
619
-				// Matches any element that is a child of parent.
620
-				'/\\s+>\\s+/',
621
-				// Matches any element that is an adjacent sibling.
622
-				'/\\s+\\+\\s+/',
623
-				// Matches any element that is a descendant of an parent element element.
624
-				'/\\s+/',
625
-				// first-child pseudo-selector
626
-				'/([^\\/]+):first-child/i',
627
-				// last-child pseudo-selector
628
-				'/([^\\/]+):last-child/i',
629
-				// Matches attribute only selector
630
-				'/^\\[(\\w+)\\]/',
631
-				// Matches element with attribute
632
-				'/(\\w)\\[(\\w+)\\]/',
633
-				// Matches element with EXACT attribute
634
-				'/(\\w)\\[(\\w+)\\=[\'"]?(\\w+)[\'"]?\\]/',
635
-			);
636
-			$replace = array(
637
-				'/',
638
-				'/following-sibling::*[1]/self::',
639
-				'//',
640
-				'*[1]/self::\\1',
641
-				'*[last()]/self::\\1',
642
-				'*[@\\1]',
643
-				'\\1[@\\2]',
644
-				'\\1[@\\2="\\3"]',
645
-			);
646
-
647
-			$cssSelector = '//' . preg_replace($search, $replace, $cssSelector);
648
-
649
-			$cssSelector = preg_replace_callback(self::ID_ATTRIBUTE_MATCHER, array($this, 'matchIdAttributes'), $cssSelector);
650
-			$cssSelector = preg_replace_callback(self::CLASS_ATTRIBUTE_MATCHER, array($this, 'matchClassAttributes'), $cssSelector);
651
-
652
-			// Advanced selectors are going to require a bit more advanced emogrification.
653
-			// When we required PHP 5.3, we could do this with closures.
654
-			$cssSelector = preg_replace_callback(
655
-				'/([^\\/]+):nth-child\\(\s*(odd|even|[+\-]?\\d|[+\\-]?\\d?n(\\s*[+\\-]\\s*\\d)?)\\s*\\)/i',
656
-				array($this, 'translateNthChild'), $cssSelector
657
-			);
658
-			$cssSelector = preg_replace_callback(
659
-				'/([^\\/]+):nth-of-type\\(\s*(odd|even|[+\-]?\\d|[+\\-]?\\d?n(\\s*[+\\-]\\s*\\d)?)\\s*\\)/i',
660
-				array($this, 'translateNthOfType'), $cssSelector
661
-			);
662
-
663
-			$this->caches[self::CACHE_KEY_SELECTOR][$xpathKey] = $cssSelector;
664
-		}
665
-		return $this->caches[self::CACHE_KEY_SELECTOR][$xpathKey];
666
-	}
667
-
668
-	/**
669
-	 * @param array $match
670
-	 *
671
-	 * @return string
672
-	 */
673
-	private function matchIdAttributes(array $match) {
674
-		return (strlen($match[1]) ? $match[1] : '*') . '[@id="' . $match[2] . '"]';
675
-	}
676
-
677
-	/**
678
-	 * @param array $match
679
-	 *
680
-	 * @return string
681
-	 */
682
-	private function matchClassAttributes(array $match) {
683
-		return (strlen($match[1]) ? $match[1] : '*') . '[contains(concat(" ",@class," "),concat(" ","' .
684
-			implode(
685
-				'"," "))][contains(concat(" ",@class," "),concat(" ","',
686
-				explode('.', substr($match[2], 1))
687
-			) . '"," "))]';
688
-	}
689
-
690
-	/**
691
-	 * @param array $match
692
-	 *
693
-	 * @return string
694
-	 */
695
-	private function translateNthChild(array $match) {
696
-		$result = $this->parseNth($match);
697
-
698
-		if (isset($result[self::MULTIPLIER])) {
699
-			if ($result[self::MULTIPLIER] < 0) {
700
-				$result[self::MULTIPLIER] = abs($result[self::MULTIPLIER]);
701
-				return sprintf('*[(last() - position()) mod %u = %u]/self::%s', $result[self::MULTIPLIER], $result[self::INDEX], $match[1]);
702
-			} else {
703
-				return sprintf('*[position() mod %u = %u]/self::%s', $result[self::MULTIPLIER], $result[self::INDEX], $match[1]);
704
-			}
705
-		} else {
706
-			return sprintf('*[%u]/self::%s', $result[self::INDEX], $match[1]);
707
-		}
708
-	}
709
-
710
-	/**
711
-	 * @param array $match
712
-	 *
713
-	 * @return string
714
-	 */
715
-	private function translateNthOfType(array $match) {
716
-		$result = $this->parseNth($match);
717
-
718
-		if (isset($result[self::MULTIPLIER])) {
719
-			if ($result[self::MULTIPLIER] < 0) {
720
-				$result[self::MULTIPLIER] = abs($result[self::MULTIPLIER]);
721
-				return sprintf('%s[(last() - position()) mod %u = %u]', $match[1], $result[self::MULTIPLIER], $result[self::INDEX]);
722
-			} else {
723
-				return sprintf('%s[position() mod %u = %u]', $match[1], $result[self::MULTIPLIER], $result[self::INDEX]);
724
-			}
725
-		} else {
726
-			return sprintf('%s[%u]', $match[1], $result[self::INDEX]);
727
-		}
728
-	}
729
-
730
-	/**
731
-	 * @param array $match
732
-	 *
733
-	 * @return array
734
-	 */
735
-	private function parseNth(array $match) {
736
-		if (in_array(strtolower($match[2]), array('even','odd'))) {
737
-			$index = strtolower($match[2]) == 'even' ? 0 : 1;
738
-			return array(self::MULTIPLIER => 2, self::INDEX => $index);
739
-		} elseif (stripos($match[2], 'n') === false) {
740
-			// if there is a multiplier
741
-			$index = intval(str_replace(' ', '', $match[2]));
742
-			return array(self::INDEX => $index);
743
-		} else {
744
-			if (isset($match[3])) {
745
-				$multipleTerm = str_replace($match[3], '', $match[2]);
746
-				$index = intval(str_replace(' ', '', $match[3]));
747
-			} else {
748
-				$multipleTerm = $match[2];
749
-				$index = 0;
750
-			}
751
-
752
-			$multiplier = str_ireplace('n', '', $multipleTerm);
753
-
754
-			if (!strlen($multiplier)) {
755
-				$multiplier = 1;
756
-			} elseif ($multiplier == 0) {
757
-				return array(self::INDEX => $index);
758
-			} else {
759
-				$multiplier = intval($multiplier);
760
-			}
761
-
762
-			while ($index < 0) {
763
-				$index += abs($multiplier);
764
-			}
765
-
766
-			return array(self::MULTIPLIER => $multiplier, self::INDEX => $index);
767
-		}
768
-	}
769
-
770
-	/**
771
-	 * Parses a CSS declaration block into property name/value pairs.
772
-	 *
773
-	 * Example:
774
-	 *
775
-	 * The declaration block.
776
-	 *
777
-	 *   "color: #000; font-weight: bold;".
778
-	 *
779
-	 * will be parsed into the following array:
780
-	 *
781
-	 *   "color" => "#000"
782
-	 *   "font-weight" => "bold"
783
-	 *
784
-	 * @param string $cssDeclarationBlock the CSS declaration block without the curly braces, may be empty
785
-	 *
786
-	 * @return array the CSS declarations with the property names as array keys and the property values as array values
787
-	 */
788
-	private function parseCssDeclarationBlock($cssDeclarationBlock) {
789
-		if (isset($this->caches[self::CACHE_KEY_CSS_DECLARATION_BLOCK][$cssDeclarationBlock])) {
790
-			return $this->caches[self::CACHE_KEY_CSS_DECLARATION_BLOCK][$cssDeclarationBlock];
791
-		}
792
-
793
-		$properties = array();
794
-		$declarations = explode(';', $cssDeclarationBlock);
795
-		foreach ($declarations as $declaration) {
796
-			$matches = array();
797
-			if (!preg_match('/ *([A-Za-z\\-]+) *: *([^;]+) */', $declaration, $matches)) {
798
-				continue;
799
-			}
800
-			$propertyName = strtolower($matches[1]);
801
-			$propertyValue = $matches[2];
802
-			$properties[$propertyName] = $propertyValue;
803
-		}
804
-		$this->caches[self::CACHE_KEY_CSS_DECLARATION_BLOCK][$cssDeclarationBlock] = $properties;
805
-
806
-		return $properties;
807
-	}
506
+    private function _media_concat( $matches ) {
507
+        self::$_media .= $matches[0];
508
+    }
509
+
510
+    /**
511
+     * Creates a DOMDocument instance with the current HTML.
512
+     *
513
+     * @return DOMDocument
514
+     */
515
+    private function createXmlDocument() {
516
+        $xmlDocument = new DOMDocument;
517
+        $xmlDocument->encoding = self::ENCODING;
518
+        $xmlDocument->strictErrorChecking = false;
519
+        $xmlDocument->formatOutput = true;
520
+        $libXmlState = libxml_use_internal_errors(true);
521
+        // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged
522
+        /** @scrutinizer ignore-unhandled */ @$xmlDocument->loadHTML($this->getUnifiedHtml());
523
+        libxml_clear_errors();
524
+        libxml_use_internal_errors($libXmlState);
525
+        $xmlDocument->normalizeDocument();
526
+
527
+        return $xmlDocument;
528
+    }
529
+
530
+    /**
531
+     * Returns the HTML with the non-ASCII characters converts into HTML entities and the unprocessable HTML tags removed.
532
+     *
533
+     * @return string the unified HTML
534
+     *
535
+     * @throws BadMethodCallException
536
+     */
537
+    private function getUnifiedHtml() {
538
+        if (!empty($this->unprocessableHtmlTags)) {
539
+            $unprocessableHtmlTags = implode('|', $this->unprocessableHtmlTags);
540
+            $bodyWithoutUnprocessableTags = preg_replace('/<\\/?(' . $unprocessableHtmlTags . ')[^>]*>/i', '', $this->html);
541
+        } else {
542
+            $bodyWithoutUnprocessableTags = $this->html;
543
+        }
544
+
545
+        // Deprecated since PHP 8.2
546
+        if ( version_compare( PHP_VERSION, '8.2', '<' ) && function_exists( 'mb_convert_encoding' ) ) {
547
+            return mb_convert_encoding( $bodyWithoutUnprocessableTags, 'HTML-ENTITIES', self::ENCODING );
548
+        } else {
549
+            return mb_encode_numericentity( $bodyWithoutUnprocessableTags, [0x80, 0x10FFFF, 0, ~0], self::ENCODING );
550
+            //return htmlspecialchars_decode( utf8_decode( htmlentities( $bodyWithoutUnprocessableTags, ENT_COMPAT, self::ENCODING, false ) ) );
551
+        }
552
+    }
553
+
554
+    /**
555
+     * @param array $a
556
+     * @param array $b
557
+     *
558
+     * @return integer
559
+     */
560
+    private function sortBySelectorPrecedence(array $a, array $b) {
561
+        $precedenceA = $this->getCssSelectorPrecedence($a['selector']);
562
+        $precedenceB = $this->getCssSelectorPrecedence($b['selector']);
563
+
564
+        // We want these sorted in ascending order so selectors with lesser precedence get processed first and
565
+        // selectors with greater precedence get sorted last.
566
+        // The parenthesis around the -1 are necessary to avoid a PHP_CodeSniffer warning about missing spaces around
567
+        // arithmetic operators.
568
+        // @see http://forge.typo3.org/issues/55605
569
+        $precedenceForEquals = ($a['line'] < $b['line'] ? (-1) : 1);
570
+        $precedenceForNotEquals = ($precedenceA < $precedenceB ? (-1) : 1);
571
+        return ($precedenceA === $precedenceB) ? $precedenceForEquals : $precedenceForNotEquals;
572
+    }
573
+
574
+    /**
575
+     * @param string $selector
576
+     *
577
+     * @return integer
578
+     */
579
+    private function getCssSelectorPrecedence($selector) {
580
+        $selectorKey = md5($selector);
581
+        if (!isset($this->caches[self::CACHE_KEY_SELECTOR][$selectorKey])) {
582
+            $precedence = 0;
583
+            $value = 100;
584
+            // ids: worth 100, classes: worth 10, elements: worth 1
585
+            $search = array('\\#','\\.','');
586
+
587
+            foreach ($search as $s) {
588
+                if (trim($selector == '')) {
589
+                    break;
590
+                }
591
+                $number = 0;
592
+                $selector = preg_replace('/' . $s . '\\w+/', '', $selector, -1, $number);
593
+                $precedence += ($value * $number);
594
+                $value /= 10;
595
+            }
596
+            $this->caches[self::CACHE_KEY_SELECTOR][$selectorKey] = $precedence;
597
+        }
598
+
599
+        return $this->caches[self::CACHE_KEY_SELECTOR][$selectorKey];
600
+    }
601
+
602
+    /**
603
+     * Right now, we support all CSS 1 selectors and most CSS2/3 selectors.
604
+     *
605
+     * @see http://plasmasturm.org/log/444/
606
+     *
607
+     * @param string $paramCssSelector
608
+     *
609
+     * @return string
610
+     */
611
+    private function translateCssToXpath($paramCssSelector) {
612
+        $cssSelector = ' ' . $paramCssSelector . ' ';
613
+        $cssSelector = preg_replace_callback( '/\s+\w+\s+/', array( $this, 'strtolower' ), $cssSelector );
614
+        $cssSelector = trim($cssSelector);
615
+        $xpathKey = md5($cssSelector);
616
+        if (!isset($this->caches[self::CACHE_KEY_XPATH][$xpathKey])) {
617
+            // returns an Xpath selector
618
+            $search = array(
619
+                // Matches any element that is a child of parent.
620
+                '/\\s+>\\s+/',
621
+                // Matches any element that is an adjacent sibling.
622
+                '/\\s+\\+\\s+/',
623
+                // Matches any element that is a descendant of an parent element element.
624
+                '/\\s+/',
625
+                // first-child pseudo-selector
626
+                '/([^\\/]+):first-child/i',
627
+                // last-child pseudo-selector
628
+                '/([^\\/]+):last-child/i',
629
+                // Matches attribute only selector
630
+                '/^\\[(\\w+)\\]/',
631
+                // Matches element with attribute
632
+                '/(\\w)\\[(\\w+)\\]/',
633
+                // Matches element with EXACT attribute
634
+                '/(\\w)\\[(\\w+)\\=[\'"]?(\\w+)[\'"]?\\]/',
635
+            );
636
+            $replace = array(
637
+                '/',
638
+                '/following-sibling::*[1]/self::',
639
+                '//',
640
+                '*[1]/self::\\1',
641
+                '*[last()]/self::\\1',
642
+                '*[@\\1]',
643
+                '\\1[@\\2]',
644
+                '\\1[@\\2="\\3"]',
645
+            );
646
+
647
+            $cssSelector = '//' . preg_replace($search, $replace, $cssSelector);
648
+
649
+            $cssSelector = preg_replace_callback(self::ID_ATTRIBUTE_MATCHER, array($this, 'matchIdAttributes'), $cssSelector);
650
+            $cssSelector = preg_replace_callback(self::CLASS_ATTRIBUTE_MATCHER, array($this, 'matchClassAttributes'), $cssSelector);
651
+
652
+            // Advanced selectors are going to require a bit more advanced emogrification.
653
+            // When we required PHP 5.3, we could do this with closures.
654
+            $cssSelector = preg_replace_callback(
655
+                '/([^\\/]+):nth-child\\(\s*(odd|even|[+\-]?\\d|[+\\-]?\\d?n(\\s*[+\\-]\\s*\\d)?)\\s*\\)/i',
656
+                array($this, 'translateNthChild'), $cssSelector
657
+            );
658
+            $cssSelector = preg_replace_callback(
659
+                '/([^\\/]+):nth-of-type\\(\s*(odd|even|[+\-]?\\d|[+\\-]?\\d?n(\\s*[+\\-]\\s*\\d)?)\\s*\\)/i',
660
+                array($this, 'translateNthOfType'), $cssSelector
661
+            );
662
+
663
+            $this->caches[self::CACHE_KEY_SELECTOR][$xpathKey] = $cssSelector;
664
+        }
665
+        return $this->caches[self::CACHE_KEY_SELECTOR][$xpathKey];
666
+    }
667
+
668
+    /**
669
+     * @param array $match
670
+     *
671
+     * @return string
672
+     */
673
+    private function matchIdAttributes(array $match) {
674
+        return (strlen($match[1]) ? $match[1] : '*') . '[@id="' . $match[2] . '"]';
675
+    }
676
+
677
+    /**
678
+     * @param array $match
679
+     *
680
+     * @return string
681
+     */
682
+    private function matchClassAttributes(array $match) {
683
+        return (strlen($match[1]) ? $match[1] : '*') . '[contains(concat(" ",@class," "),concat(" ","' .
684
+            implode(
685
+                '"," "))][contains(concat(" ",@class," "),concat(" ","',
686
+                explode('.', substr($match[2], 1))
687
+            ) . '"," "))]';
688
+    }
689
+
690
+    /**
691
+     * @param array $match
692
+     *
693
+     * @return string
694
+     */
695
+    private function translateNthChild(array $match) {
696
+        $result = $this->parseNth($match);
697
+
698
+        if (isset($result[self::MULTIPLIER])) {
699
+            if ($result[self::MULTIPLIER] < 0) {
700
+                $result[self::MULTIPLIER] = abs($result[self::MULTIPLIER]);
701
+                return sprintf('*[(last() - position()) mod %u = %u]/self::%s', $result[self::MULTIPLIER], $result[self::INDEX], $match[1]);
702
+            } else {
703
+                return sprintf('*[position() mod %u = %u]/self::%s', $result[self::MULTIPLIER], $result[self::INDEX], $match[1]);
704
+            }
705
+        } else {
706
+            return sprintf('*[%u]/self::%s', $result[self::INDEX], $match[1]);
707
+        }
708
+    }
709
+
710
+    /**
711
+     * @param array $match
712
+     *
713
+     * @return string
714
+     */
715
+    private function translateNthOfType(array $match) {
716
+        $result = $this->parseNth($match);
717
+
718
+        if (isset($result[self::MULTIPLIER])) {
719
+            if ($result[self::MULTIPLIER] < 0) {
720
+                $result[self::MULTIPLIER] = abs($result[self::MULTIPLIER]);
721
+                return sprintf('%s[(last() - position()) mod %u = %u]', $match[1], $result[self::MULTIPLIER], $result[self::INDEX]);
722
+            } else {
723
+                return sprintf('%s[position() mod %u = %u]', $match[1], $result[self::MULTIPLIER], $result[self::INDEX]);
724
+            }
725
+        } else {
726
+            return sprintf('%s[%u]', $match[1], $result[self::INDEX]);
727
+        }
728
+    }
729
+
730
+    /**
731
+     * @param array $match
732
+     *
733
+     * @return array
734
+     */
735
+    private function parseNth(array $match) {
736
+        if (in_array(strtolower($match[2]), array('even','odd'))) {
737
+            $index = strtolower($match[2]) == 'even' ? 0 : 1;
738
+            return array(self::MULTIPLIER => 2, self::INDEX => $index);
739
+        } elseif (stripos($match[2], 'n') === false) {
740
+            // if there is a multiplier
741
+            $index = intval(str_replace(' ', '', $match[2]));
742
+            return array(self::INDEX => $index);
743
+        } else {
744
+            if (isset($match[3])) {
745
+                $multipleTerm = str_replace($match[3], '', $match[2]);
746
+                $index = intval(str_replace(' ', '', $match[3]));
747
+            } else {
748
+                $multipleTerm = $match[2];
749
+                $index = 0;
750
+            }
751
+
752
+            $multiplier = str_ireplace('n', '', $multipleTerm);
753
+
754
+            if (!strlen($multiplier)) {
755
+                $multiplier = 1;
756
+            } elseif ($multiplier == 0) {
757
+                return array(self::INDEX => $index);
758
+            } else {
759
+                $multiplier = intval($multiplier);
760
+            }
761
+
762
+            while ($index < 0) {
763
+                $index += abs($multiplier);
764
+            }
765
+
766
+            return array(self::MULTIPLIER => $multiplier, self::INDEX => $index);
767
+        }
768
+    }
769
+
770
+    /**
771
+     * Parses a CSS declaration block into property name/value pairs.
772
+     *
773
+     * Example:
774
+     *
775
+     * The declaration block.
776
+     *
777
+     *   "color: #000; font-weight: bold;".
778
+     *
779
+     * will be parsed into the following array:
780
+     *
781
+     *   "color" => "#000"
782
+     *   "font-weight" => "bold"
783
+     *
784
+     * @param string $cssDeclarationBlock the CSS declaration block without the curly braces, may be empty
785
+     *
786
+     * @return array the CSS declarations with the property names as array keys and the property values as array values
787
+     */
788
+    private function parseCssDeclarationBlock($cssDeclarationBlock) {
789
+        if (isset($this->caches[self::CACHE_KEY_CSS_DECLARATION_BLOCK][$cssDeclarationBlock])) {
790
+            return $this->caches[self::CACHE_KEY_CSS_DECLARATION_BLOCK][$cssDeclarationBlock];
791
+        }
792
+
793
+        $properties = array();
794
+        $declarations = explode(';', $cssDeclarationBlock);
795
+        foreach ($declarations as $declaration) {
796
+            $matches = array();
797
+            if (!preg_match('/ *([A-Za-z\\-]+) *: *([^;]+) */', $declaration, $matches)) {
798
+                continue;
799
+            }
800
+            $propertyName = strtolower($matches[1]);
801
+            $propertyValue = $matches[2];
802
+            $properties[$propertyName] = $propertyValue;
803
+        }
804
+        $this->caches[self::CACHE_KEY_CSS_DECLARATION_BLOCK][$cssDeclarationBlock] = $properties;
805
+
806
+        return $properties;
807
+    }
808 808
 }
Please login to merge, or discard this patch.
Spacing   +14 added lines, -14 removed lines patch added patch discarded remove patch
@@ -238,7 +238,7 @@  discard block
 block discarded – undo
238 238
 		if ($nodesWithStyleAttributes !== false) {
239 239
 			/** @var $nodeWithStyleAttribute DOMNode */
240 240
 			foreach ($nodesWithStyleAttributes as $node) {
241
-				$normalizedOriginalStyle = preg_replace_callback( '/[A-z\\-]+(?=\\:)/S', array( $this, 'strtolower' ), $node->getAttribute('style') );
241
+				$normalizedOriginalStyle = preg_replace_callback('/[A-z\\-]+(?=\\:)/S', array($this, 'strtolower'), $node->getAttribute('style'));
242 242
 
243 243
 				// in order to not overwrite existing style attributes in the HTML, we have to save the original HTML styles
244 244
 				$nodePath = $node->getNodePath();
@@ -289,7 +289,7 @@  discard block
 block discarded – undo
289 289
 			}
290 290
 
291 291
 			// now sort the selectors by precedence
292
-			usort($allSelectors, array($this,'sortBySelectorPrecedence'));
292
+			usort($allSelectors, array($this, 'sortBySelectorPrecedence'));
293 293
 
294 294
 			$this->caches[self::CACHE_KEY_CSS][$cssKey] = $allSelectors;
295 295
 		}
@@ -329,7 +329,7 @@  discard block
 block discarded – undo
329 329
 		if ($nodesWithStyleDisplayNone->length > 0) {
330 330
 			/** @var $node \DOMNode */
331 331
 			foreach ($nodesWithStyleDisplayNone as $node) {
332
-				if ($node->parentNode && is_callable(array($node->parentNode,'removeChild'))) {
332
+				if ($node->parentNode && is_callable(array($node->parentNode, 'removeChild'))) {
333 333
 					$node->parentNode->removeChild($node);
334 334
 				}
335 335
 			}
@@ -339,10 +339,10 @@  discard block
 block discarded – undo
339 339
 
340 340
 		if ($this->preserveEncoding) {
341 341
 			// Deprecated since PHP 8.2
342
-			if ( version_compare( PHP_VERSION, '8.2', '<' ) && function_exists( 'mb_convert_encoding' ) ) {
343
-				return mb_convert_encoding( $xmlDocument->saveHTML(), self::ENCODING, 'HTML-ENTITIES' );
342
+			if (version_compare(PHP_VERSION, '8.2', '<') && function_exists('mb_convert_encoding')) {
343
+				return mb_convert_encoding($xmlDocument->saveHTML(), self::ENCODING, 'HTML-ENTITIES');
344 344
 			} else {
345
-				return mb_encode_numericentity( $xmlDocument->saveHTML(), [0x80, 0x10FFFF, 0, ~0], self::ENCODING );
345
+				return mb_encode_numericentity($xmlDocument->saveHTML(), [0x80, 0x10FFFF, 0, ~0], self::ENCODING);
346 346
 				//return htmlspecialchars_decode( utf8_encode( html_entity_decode( $xmlDocument->saveHTML(), ENT_COMPAT, self::ENCODING ) ) );
347 347
 			}
348 348
 		} else {
@@ -472,7 +472,7 @@  discard block
 block discarded – undo
472 472
 	 * @return array
473 473
 	 */
474 474
 	private function splitCssAndMediaQuery($css) {
475
-		$css = preg_replace_callback( '#@media\\s+(?:only\\s)?(?:[\\s{\(]|screen|all)\\s?[^{]+{.*}\\s*}\\s*#misU', array( $this, '_media_concat' ), $css );
475
+		$css = preg_replace_callback('#@media\\s+(?:only\\s)?(?:[\\s{\(]|screen|all)\\s?[^{]+{.*}\\s*}\\s*#misU', array($this, '_media_concat'), $css);
476 476
 
477 477
 		// filter the CSS
478 478
 		$search = array(
@@ -503,7 +503,7 @@  discard block
 block discarded – undo
503 503
      *
504 504
      * @param array $matches Matches result array.
505 505
      */
506
-	private function _media_concat( $matches ) {
506
+	private function _media_concat($matches) {
507 507
 		self::$_media .= $matches[0];
508 508
 	}
509 509
 
@@ -543,10 +543,10 @@  discard block
 block discarded – undo
543 543
 		}
544 544
 
545 545
 		// Deprecated since PHP 8.2
546
-		if ( version_compare( PHP_VERSION, '8.2', '<' ) && function_exists( 'mb_convert_encoding' ) ) {
547
-			return mb_convert_encoding( $bodyWithoutUnprocessableTags, 'HTML-ENTITIES', self::ENCODING );
546
+		if (version_compare(PHP_VERSION, '8.2', '<') && function_exists('mb_convert_encoding')) {
547
+			return mb_convert_encoding($bodyWithoutUnprocessableTags, 'HTML-ENTITIES', self::ENCODING);
548 548
 		} else {
549
-			return mb_encode_numericentity( $bodyWithoutUnprocessableTags, [0x80, 0x10FFFF, 0, ~0], self::ENCODING );
549
+			return mb_encode_numericentity($bodyWithoutUnprocessableTags, [0x80, 0x10FFFF, 0, ~0], self::ENCODING);
550 550
 			//return htmlspecialchars_decode( utf8_decode( htmlentities( $bodyWithoutUnprocessableTags, ENT_COMPAT, self::ENCODING, false ) ) );
551 551
 		}
552 552
 	}
@@ -582,7 +582,7 @@  discard block
 block discarded – undo
582 582
 			$precedence = 0;
583 583
 			$value = 100;
584 584
 			// ids: worth 100, classes: worth 10, elements: worth 1
585
-			$search = array('\\#','\\.','');
585
+			$search = array('\\#', '\\.', '');
586 586
 
587 587
 			foreach ($search as $s) {
588 588
 				if (trim($selector == '')) {
@@ -610,7 +610,7 @@  discard block
 block discarded – undo
610 610
 	 */
611 611
 	private function translateCssToXpath($paramCssSelector) {
612 612
 		$cssSelector = ' ' . $paramCssSelector . ' ';
613
-		$cssSelector = preg_replace_callback( '/\s+\w+\s+/', array( $this, 'strtolower' ), $cssSelector );
613
+		$cssSelector = preg_replace_callback('/\s+\w+\s+/', array($this, 'strtolower'), $cssSelector);
614 614
 		$cssSelector = trim($cssSelector);
615 615
 		$xpathKey = md5($cssSelector);
616 616
 		if (!isset($this->caches[self::CACHE_KEY_XPATH][$xpathKey])) {
@@ -733,7 +733,7 @@  discard block
 block discarded – undo
733 733
 	 * @return array
734 734
 	 */
735 735
 	private function parseNth(array $match) {
736
-		if (in_array(strtolower($match[2]), array('even','odd'))) {
736
+		if (in_array(strtolower($match[2]), array('even', 'odd'))) {
737 737
 			$index = strtolower($match[2]) == 'even' ? 0 : 1;
738 738
 			return array(self::MULTIPLIER => 2, self::INDEX => $index);
739 739
 		} elseif (stripos($match[2], 'n') === false) {
Please login to merge, or discard this patch.
includes/wpinv-payment-functions.php 2 patches
Indentation   +286 added lines, -286 removed lines patch added patch discarded remove patch
@@ -1,196 +1,196 @@  discard block
 block discarded – undo
1 1
 <?php
2 2
 function wpinv_is_subscription_payment( $invoice = '' ) {
3
-	if ( empty( $invoice ) ) {
4
-		return false;
5
-	}
3
+    if ( empty( $invoice ) ) {
4
+        return false;
5
+    }
6 6
 
7
-	if ( ! is_object( $invoice ) && is_scalar( $invoice ) ) {
8
-		$invoice = wpinv_get_invoice( $invoice );
9
-	}
7
+    if ( ! is_object( $invoice ) && is_scalar( $invoice ) ) {
8
+        $invoice = wpinv_get_invoice( $invoice );
9
+    }
10 10
 
11
-	if ( empty( $invoice ) ) {
12
-		return false;
13
-	}
11
+    if ( empty( $invoice ) ) {
12
+        return false;
13
+    }
14 14
 
15
-	if ( $invoice->is_renewal() ) {
16
-		return true;
17
-	}
15
+    if ( $invoice->is_renewal() ) {
16
+        return true;
17
+    }
18 18
 
19
-	return false;
19
+    return false;
20 20
 }
21 21
 
22 22
 function wpinv_payment_link_transaction_id( $invoice = '' ) {
23
-	if ( empty( $invoice ) ) {
24
-		return false;
25
-	}
23
+    if ( empty( $invoice ) ) {
24
+        return false;
25
+    }
26 26
 
27
-	if ( ! is_object( $invoice ) && is_scalar( $invoice ) ) {
28
-		$invoice = wpinv_get_invoice( $invoice );
29
-	}
27
+    if ( ! is_object( $invoice ) && is_scalar( $invoice ) ) {
28
+        $invoice = wpinv_get_invoice( $invoice );
29
+    }
30 30
 
31
-	if ( empty( $invoice ) ) {
32
-		return false;
33
-	}
31
+    if ( empty( $invoice ) ) {
32
+        return false;
33
+    }
34 34
 
35
-	return apply_filters( 'wpinv_payment_details_transaction_id-' . $invoice->gateway, $invoice->get_transaction_id(), $invoice->ID, $invoice );
35
+    return apply_filters( 'wpinv_payment_details_transaction_id-' . $invoice->gateway, $invoice->get_transaction_id(), $invoice->ID, $invoice );
36 36
 }
37 37
 
38 38
 function wpinv_subscription_initial_payment_desc( $amount, $period, $interval, $trial_period = '', $trial_interval = 0 ) {
39
-	$interval   = (int)$interval > 0 ? (int)$interval : 1;
40
-
41
-	if ( $trial_interval > 0 && ! empty( $trial_period ) ) {
42
-		$amount = __( 'Free', 'invoicing' );
43
-		$interval = $trial_interval;
44
-		$period = $trial_period;
45
-	}
46
-
47
-	$description = '';
48
-	switch ( $period ) {
49
-		case 'D':
50
-		case 'day':
51
-			$description = wp_sprintf( _n( '%s for the first day.', '%1$s for the first %2$d days.', $interval, 'invoicing' ), $amount, $interval );
52
-			break;
53
-		case 'W':
54
-		case 'week':
55
-			$description = wp_sprintf( _n( '%s for the first week.', '%1$s for the first %2$d weeks.', $interval, 'invoicing' ), $amount, $interval );
56
-			break;
57
-		case 'M':
58
-		case 'month':
59
-			$description = wp_sprintf( _n( '%s for the first month.', '%1$s for the first %2$d months.', $interval, 'invoicing' ), $amount, $interval );
60
-			break;
61
-		case 'Y':
62
-		case 'year':
63
-			$description = wp_sprintf( _n( '%s for the first year.', '%1$s for the first %2$d years.', $interval, 'invoicing' ), $amount, $interval );
64
-			break;
65
-	}
66
-
67
-	return apply_filters( 'wpinv_subscription_initial_payment_desc', $description, $amount, $period, $interval, $trial_period, $trial_interval );
39
+    $interval   = (int)$interval > 0 ? (int)$interval : 1;
40
+
41
+    if ( $trial_interval > 0 && ! empty( $trial_period ) ) {
42
+        $amount = __( 'Free', 'invoicing' );
43
+        $interval = $trial_interval;
44
+        $period = $trial_period;
45
+    }
46
+
47
+    $description = '';
48
+    switch ( $period ) {
49
+        case 'D':
50
+        case 'day':
51
+            $description = wp_sprintf( _n( '%s for the first day.', '%1$s for the first %2$d days.', $interval, 'invoicing' ), $amount, $interval );
52
+            break;
53
+        case 'W':
54
+        case 'week':
55
+            $description = wp_sprintf( _n( '%s for the first week.', '%1$s for the first %2$d weeks.', $interval, 'invoicing' ), $amount, $interval );
56
+            break;
57
+        case 'M':
58
+        case 'month':
59
+            $description = wp_sprintf( _n( '%s for the first month.', '%1$s for the first %2$d months.', $interval, 'invoicing' ), $amount, $interval );
60
+            break;
61
+        case 'Y':
62
+        case 'year':
63
+            $description = wp_sprintf( _n( '%s for the first year.', '%1$s for the first %2$d years.', $interval, 'invoicing' ), $amount, $interval );
64
+            break;
65
+    }
66
+
67
+    return apply_filters( 'wpinv_subscription_initial_payment_desc', $description, $amount, $period, $interval, $trial_period, $trial_interval );
68 68
 }
69 69
 
70 70
 function wpinv_subscription_recurring_payment_desc( $amount, $period, $interval, $bill_times = 0, $trial_period = '', $trial_interval = 0 ) {
71
-	$interval   = (int)$interval > 0 ? (int)$interval : 1;
72
-	$bill_times = (int)$bill_times > 0 ? (int)$bill_times : 0;
73
-
74
-	$description = '';
75
-	switch ( $period ) {
76
-		case 'D':
77
-		case 'day':
78
-			if ( (int)$bill_times > 0 ) {
79
-				if ( $interval > 1 ) {
80
-					if ( $bill_times > 1 ) {
81
-						$description = wp_sprintf( __( '%1$s for each %2$d days, for %3$d installments.', 'invoicing' ), $amount, $interval, $bill_times );
82
-					} else {
83
-						$description = wp_sprintf( __( '%1$s for %2$d days.', 'invoicing' ), $amount, $interval );
84
-					}
85
-				} else {
86
-					$description = wp_sprintf( _n( '%s for one day.', '%1$s for each day, for %2$d installments.', $bill_times, 'invoicing' ), $amount, $bill_times );
87
-				}
88
-			} else {
89
-				$description = wp_sprintf( _n( '%s for each day.', '%1$s for each %2$d days.', $interval, 'invoicing' ), $amount, $interval );
90
-			}
91
-			break;
92
-		case 'W':
93
-		case 'week':
94
-			if ( (int)$bill_times > 0 ) {
95
-				if ( $interval > 1 ) {
96
-					if ( $bill_times > 1 ) {
97
-						$description = wp_sprintf( __( '%1$s for each %2$d weeks, for %3$d installments.', 'invoicing' ), $amount, $interval, $bill_times );
98
-					} else {
99
-						$description = wp_sprintf( __( '%1$s for %2$d weeks.', 'invoicing' ), $amount, $interval );
100
-					}
101
-				} else {
102
-					$description = wp_sprintf( _n( '%s for one week.', '%1$s for each week, for %2$d installments.', $bill_times, 'invoicing' ), $amount, $bill_times );
103
-				}
104
-			} else {
105
-				$description = wp_sprintf( _n( '%s for each week.', '%1$s for each %2$d weeks.', $interval, 'invoicing' ), $amount, $interval );
106
-			}
107
-			break;
108
-		case 'M':
109
-		case 'month':
110
-			if ( (int)$bill_times > 0 ) {
111
-				if ( $interval > 1 ) {
112
-					if ( $bill_times > 1 ) {
113
-						$description = wp_sprintf( __( '%1$s for each %2$d months, for %3$d installments.', 'invoicing' ), $amount, $interval, $bill_times );
114
-					} else {
115
-						$description = wp_sprintf( __( '%1$s for %2$d months.', 'invoicing' ), $amount, $interval );
116
-					}
117
-				} else {
118
-					$description = wp_sprintf( _n( '%s for one month.', '%1$s for each month, for %2$d installments.', $bill_times, 'invoicing' ), $amount, $bill_times );
119
-				}
120
-			} else {
121
-				$description = wp_sprintf( _n( '%s for each month.', '%1$s for each %2$d months.', $interval, 'invoicing' ), $amount, $interval );
122
-			}
123
-			break;
124
-		case 'Y':
125
-		case 'year':
126
-			if ( (int)$bill_times > 0 ) {
127
-				if ( $interval > 1 ) {
128
-					if ( $bill_times > 1 ) {
129
-						$description = wp_sprintf( __( '%1$s for each %2$d years, for %3$d installments.', 'invoicing' ), $amount, $interval, $bill_times );
130
-					} else {
131
-						$description = wp_sprintf( __( '%1$s for %2$d years.', 'invoicing' ), $amount, $interval );
132
-					}
133
-				} else {
134
-					$description = wp_sprintf( _n( '%s for one year.', '%1$s for each year, for %2$d installments.', $bill_times, 'invoicing' ), $amount, $bill_times );
135
-				}
136
-			} else {
137
-				$description = wp_sprintf( _n( '%s for each year.', '%1$s for each %2$d years.', $interval, 'invoicing' ), $amount, $interval );
138
-			}
139
-			break;
140
-	}
141
-
142
-	return apply_filters( 'wpinv_subscription_recurring_payment_desc', $description, $amount, $period, $interval, $bill_times, $trial_period, $trial_interval );
71
+    $interval   = (int)$interval > 0 ? (int)$interval : 1;
72
+    $bill_times = (int)$bill_times > 0 ? (int)$bill_times : 0;
73
+
74
+    $description = '';
75
+    switch ( $period ) {
76
+        case 'D':
77
+        case 'day':
78
+            if ( (int)$bill_times > 0 ) {
79
+                if ( $interval > 1 ) {
80
+                    if ( $bill_times > 1 ) {
81
+                        $description = wp_sprintf( __( '%1$s for each %2$d days, for %3$d installments.', 'invoicing' ), $amount, $interval, $bill_times );
82
+                    } else {
83
+                        $description = wp_sprintf( __( '%1$s for %2$d days.', 'invoicing' ), $amount, $interval );
84
+                    }
85
+                } else {
86
+                    $description = wp_sprintf( _n( '%s for one day.', '%1$s for each day, for %2$d installments.', $bill_times, 'invoicing' ), $amount, $bill_times );
87
+                }
88
+            } else {
89
+                $description = wp_sprintf( _n( '%s for each day.', '%1$s for each %2$d days.', $interval, 'invoicing' ), $amount, $interval );
90
+            }
91
+            break;
92
+        case 'W':
93
+        case 'week':
94
+            if ( (int)$bill_times > 0 ) {
95
+                if ( $interval > 1 ) {
96
+                    if ( $bill_times > 1 ) {
97
+                        $description = wp_sprintf( __( '%1$s for each %2$d weeks, for %3$d installments.', 'invoicing' ), $amount, $interval, $bill_times );
98
+                    } else {
99
+                        $description = wp_sprintf( __( '%1$s for %2$d weeks.', 'invoicing' ), $amount, $interval );
100
+                    }
101
+                } else {
102
+                    $description = wp_sprintf( _n( '%s for one week.', '%1$s for each week, for %2$d installments.', $bill_times, 'invoicing' ), $amount, $bill_times );
103
+                }
104
+            } else {
105
+                $description = wp_sprintf( _n( '%s for each week.', '%1$s for each %2$d weeks.', $interval, 'invoicing' ), $amount, $interval );
106
+            }
107
+            break;
108
+        case 'M':
109
+        case 'month':
110
+            if ( (int)$bill_times > 0 ) {
111
+                if ( $interval > 1 ) {
112
+                    if ( $bill_times > 1 ) {
113
+                        $description = wp_sprintf( __( '%1$s for each %2$d months, for %3$d installments.', 'invoicing' ), $amount, $interval, $bill_times );
114
+                    } else {
115
+                        $description = wp_sprintf( __( '%1$s for %2$d months.', 'invoicing' ), $amount, $interval );
116
+                    }
117
+                } else {
118
+                    $description = wp_sprintf( _n( '%s for one month.', '%1$s for each month, for %2$d installments.', $bill_times, 'invoicing' ), $amount, $bill_times );
119
+                }
120
+            } else {
121
+                $description = wp_sprintf( _n( '%s for each month.', '%1$s for each %2$d months.', $interval, 'invoicing' ), $amount, $interval );
122
+            }
123
+            break;
124
+        case 'Y':
125
+        case 'year':
126
+            if ( (int)$bill_times > 0 ) {
127
+                if ( $interval > 1 ) {
128
+                    if ( $bill_times > 1 ) {
129
+                        $description = wp_sprintf( __( '%1$s for each %2$d years, for %3$d installments.', 'invoicing' ), $amount, $interval, $bill_times );
130
+                    } else {
131
+                        $description = wp_sprintf( __( '%1$s for %2$d years.', 'invoicing' ), $amount, $interval );
132
+                    }
133
+                } else {
134
+                    $description = wp_sprintf( _n( '%s for one year.', '%1$s for each year, for %2$d installments.', $bill_times, 'invoicing' ), $amount, $bill_times );
135
+                }
136
+            } else {
137
+                $description = wp_sprintf( _n( '%s for each year.', '%1$s for each %2$d years.', $interval, 'invoicing' ), $amount, $interval );
138
+            }
139
+            break;
140
+    }
141
+
142
+    return apply_filters( 'wpinv_subscription_recurring_payment_desc', $description, $amount, $period, $interval, $bill_times, $trial_period, $trial_interval );
143 143
 }
144 144
 
145 145
 function wpinv_subscription_payment_desc( $invoice ) {
146
-	if ( empty( $invoice ) ) {
147
-		return null;
148
-	}
149
-
150
-	$description = '';
151
-	if ( $invoice->is_parent() && $item = $invoice->get_recurring( true ) ) {
152
-		if ( $item->has_free_trial() ) {
153
-			$trial_period = $item->get_trial_period();
154
-			$trial_interval = $item->get_trial_interval();
155
-		} else {
156
-			$trial_period = '';
157
-			$trial_interval = 0;
158
-		}
159
-
160
-		$description = wpinv_get_billing_cycle( $invoice->get_total(), $invoice->get_recurring_details( 'total' ), $item->get_recurring_period(), $item->get_recurring_interval(), $item->get_recurring_limit(), $trial_period, $trial_interval, $invoice->get_currency() );
161
-	}
162
-
163
-	return apply_filters( 'wpinv_subscription_payment_desc', $description, $invoice );
146
+    if ( empty( $invoice ) ) {
147
+        return null;
148
+    }
149
+
150
+    $description = '';
151
+    if ( $invoice->is_parent() && $item = $invoice->get_recurring( true ) ) {
152
+        if ( $item->has_free_trial() ) {
153
+            $trial_period = $item->get_trial_period();
154
+            $trial_interval = $item->get_trial_interval();
155
+        } else {
156
+            $trial_period = '';
157
+            $trial_interval = 0;
158
+        }
159
+
160
+        $description = wpinv_get_billing_cycle( $invoice->get_total(), $invoice->get_recurring_details( 'total' ), $item->get_recurring_period(), $item->get_recurring_interval(), $item->get_recurring_limit(), $trial_period, $trial_interval, $invoice->get_currency() );
161
+    }
162
+
163
+    return apply_filters( 'wpinv_subscription_payment_desc', $description, $invoice );
164 164
 }
165 165
 
166 166
 function wpinv_get_billing_cycle( $initial, $recurring, $period, $interval, $bill_times, $trial_period = '', $trial_interval = 0, $currency = '' ) {
167
-	$initial_total      = wpinv_round_amount( $initial );
168
-	$recurring_total    = wpinv_round_amount( $recurring );
167
+    $initial_total      = wpinv_round_amount( $initial );
168
+    $recurring_total    = wpinv_round_amount( $recurring );
169 169
 
170
-	if ( $trial_interval > 0 && ! empty( $trial_period ) ) {
171
-		// Free trial
172
-	} else {
173
-		if ( $bill_times == 1 ) {
174
-			$recurring_total = $initial_total;
175
-		} elseif ( $bill_times > 1 && $initial_total != $recurring_total ) {
176
-			$bill_times--;
177
-		}
178
-	}
170
+    if ( $trial_interval > 0 && ! empty( $trial_period ) ) {
171
+        // Free trial
172
+    } else {
173
+        if ( $bill_times == 1 ) {
174
+            $recurring_total = $initial_total;
175
+        } elseif ( $bill_times > 1 && $initial_total != $recurring_total ) {
176
+            $bill_times--;
177
+        }
178
+    }
179 179
 
180
-	$initial_amount     = wpinv_price( $initial_total, $currency );
181
-	$recurring_amount   = wpinv_price( $recurring_total, $currency );
180
+    $initial_amount     = wpinv_price( $initial_total, $currency );
181
+    $recurring_amount   = wpinv_price( $recurring_total, $currency );
182 182
 
183
-	$recurring          = wpinv_subscription_recurring_payment_desc( $recurring_amount, $period, $interval, $bill_times, $trial_period, $trial_interval );
183
+    $recurring          = wpinv_subscription_recurring_payment_desc( $recurring_amount, $period, $interval, $bill_times, $trial_period, $trial_interval );
184 184
 
185
-	if ( $initial_total != $recurring_total ) {
186
-		$initial        = wpinv_subscription_initial_payment_desc( $initial_amount, $period, $interval, $trial_period, $trial_interval );
185
+    if ( $initial_total != $recurring_total ) {
186
+        $initial        = wpinv_subscription_initial_payment_desc( $initial_amount, $period, $interval, $trial_period, $trial_interval );
187 187
 
188
-		$description    = wp_sprintf( __( '%1$s Then %2$s', 'invoicing' ), $initial, $recurring );
189
-	} else {
190
-		$description    = $recurring;
191
-	}
188
+        $description    = wp_sprintf( __( '%1$s Then %2$s', 'invoicing' ), $initial, $recurring );
189
+    } else {
190
+        $description    = $recurring;
191
+    }
192 192
 
193
-	return apply_filters( 'wpinv_get_billing_cycle', $description, $initial, $recurring, $period, $interval, $bill_times, $trial_period, $trial_interval, $currency );
193
+    return apply_filters( 'wpinv_get_billing_cycle', $description, $initial, $recurring, $period, $interval, $bill_times, $trial_period, $trial_interval, $currency );
194 194
 }
195 195
 
196 196
 /**
@@ -202,25 +202,25 @@  discard block
 block discarded – undo
202 202
  */
203 203
 function getpaid_get_card_name( $card_number ) {
204 204
 
205
-	// Known regexes.
206
-	$regexes = array(
207
-		'/^4/'                     => __( 'Visa', 'invoicing' ),
208
-		'/^5[1-5]/'                => __( 'Mastercard', 'invoicing' ),
209
-		'/^3[47]/'                 => __( 'Amex', 'invoicing' ),
210
-		'/^3(?:0[0-5]|[68])/'      => __( 'Diners Club', 'invoicing' ),
211
-		'/^6(?:011|5)/'            => __( 'Discover', 'invoicing' ),
212
-		'/^(?:2131|1800|35\d{3})/' => __( 'JCB', 'invoicing' ),
213
-	);
214
-
215
-	// Confirm if one matches.
216
-	foreach ( $regexes as $regex => $card ) {
217
-		if ( preg_match( $regex, $card_number ) >= 1 ) {
218
-			return $card;
219
-		}
220
-	}
221
-
222
-	// None matched.
223
-	return __( 'Card', 'invoicing' );
205
+    // Known regexes.
206
+    $regexes = array(
207
+        '/^4/'                     => __( 'Visa', 'invoicing' ),
208
+        '/^5[1-5]/'                => __( 'Mastercard', 'invoicing' ),
209
+        '/^3[47]/'                 => __( 'Amex', 'invoicing' ),
210
+        '/^3(?:0[0-5]|[68])/'      => __( 'Diners Club', 'invoicing' ),
211
+        '/^6(?:011|5)/'            => __( 'Discover', 'invoicing' ),
212
+        '/^(?:2131|1800|35\d{3})/' => __( 'JCB', 'invoicing' ),
213
+    );
214
+
215
+    // Confirm if one matches.
216
+    foreach ( $regexes as $regex => $card ) {
217
+        if ( preg_match( $regex, $card_number ) >= 1 ) {
218
+            return $card;
219
+        }
220
+    }
221
+
222
+    // None matched.
223
+    return __( 'Card', 'invoicing' );
224 224
 
225 225
 }
226 226
 
@@ -230,24 +230,24 @@  discard block
 block discarded – undo
230 230
  * @param WPInv_Invoice|int|null $invoice
231 231
  */
232 232
 function wpinv_send_back_to_checkout( $invoice = null ) {
233
-	$response = array( 'success' => false );
234
-	$invoice  = wpinv_get_invoice( $invoice );
235
-
236
-	// Was an invoice created?
237
-	if ( ! empty( $invoice ) ) {
238
-		$invoice             = is_scalar( $invoice ) ? new WPInv_Invoice( $invoice ) : $invoice;
239
-		$response['invoice'] = $invoice->get_id();
240
-		do_action( 'getpaid_checkout_invoice_exception', $invoice );
241
-	}
242
-
243
-	// Do we have any errors?
244
-	if ( wpinv_get_errors() ) {
245
-		$response['data'] = getpaid_get_errors_html( true, false );
246
-	} else {
247
-		$response['data'] = __( 'An error occured while processing your payment. Please try again.', 'invoicing' );
248
-	}
249
-
250
-	wp_send_json( $response );
233
+    $response = array( 'success' => false );
234
+    $invoice  = wpinv_get_invoice( $invoice );
235
+
236
+    // Was an invoice created?
237
+    if ( ! empty( $invoice ) ) {
238
+        $invoice             = is_scalar( $invoice ) ? new WPInv_Invoice( $invoice ) : $invoice;
239
+        $response['invoice'] = $invoice->get_id();
240
+        do_action( 'getpaid_checkout_invoice_exception', $invoice );
241
+    }
242
+
243
+    // Do we have any errors?
244
+    if ( wpinv_get_errors() ) {
245
+        $response['data'] = getpaid_get_errors_html( true, false );
246
+    } else {
247
+        $response['data'] = __( 'An error occured while processing your payment. Please try again.', 'invoicing' );
248
+    }
249
+
250
+    wp_send_json( $response );
251 251
 }
252 252
 
253 253
 /**
@@ -256,7 +256,7 @@  discard block
 block discarded – undo
256 256
  * @return string
257 257
  */
258 258
 function getpaid_get_recaptcha_site_key() {
259
-	return apply_filters( 'getpaid_recaptcha_site_key', wpinv_get_option( 'recaptcha_site_key', '' ) );
259
+    return apply_filters( 'getpaid_recaptcha_site_key', wpinv_get_option( 'recaptcha_site_key', '' ) );
260 260
 }
261 261
 
262 262
 /**
@@ -265,7 +265,7 @@  discard block
 block discarded – undo
265 265
  * @return string
266 266
  */
267 267
 function getpaid_get_recaptcha_secret_key() {
268
-	return apply_filters( 'getpaid_recaptcha_secret_key', wpinv_get_option( 'recaptcha_secret_key', '' ) );
268
+    return apply_filters( 'getpaid_recaptcha_secret_key', wpinv_get_option( 'recaptcha_secret_key', '' ) );
269 269
 }
270 270
 
271 271
 /**
@@ -274,7 +274,7 @@  discard block
 block discarded – undo
274 274
  * @return bool
275 275
  */
276 276
 function getpaid_is_recaptcha_enabled() {
277
-	return wpinv_get_option( 'enable_recaptcha', false ) && getpaid_get_recaptcha_site_key() && getpaid_get_recaptcha_secret_key();
277
+    return wpinv_get_option( 'enable_recaptcha', false ) && getpaid_get_recaptcha_site_key() && getpaid_get_recaptcha_secret_key();
278 278
 }
279 279
 
280 280
 /**
@@ -283,27 +283,27 @@  discard block
 block discarded – undo
283 283
  * @return string
284 284
  */
285 285
 function getpaid_get_recaptcha_version() {
286
-	return apply_filters( 'getpaid_recaptcha_version', wpinv_get_option( 'recaptcha_version', 'v2' ) );
286
+    return apply_filters( 'getpaid_recaptcha_version', wpinv_get_option( 'recaptcha_version', 'v2' ) );
287 287
 }
288 288
 
289 289
 function getpaid_recaptcha_api_url() {
290
-	// Prevent conflicts with Ninja Forms recaptcha.
291
-	if ( ! empty( $_REQUEST['action'] ) && $_REQUEST['action'] == 'geodir_ninja_forms' ) {
292
-		$url = '';
293
-	} else {
294
-		$url = getpaid_recaptcha_get_api_url();
295
-	}
296
-
297
-	return apply_filters( 'getpaid_recaptcha_api_url', $url );
290
+    // Prevent conflicts with Ninja Forms recaptcha.
291
+    if ( ! empty( $_REQUEST['action'] ) && $_REQUEST['action'] == 'geodir_ninja_forms' ) {
292
+        $url = '';
293
+    } else {
294
+        $url = getpaid_recaptcha_get_api_url();
295
+    }
296
+
297
+    return apply_filters( 'getpaid_recaptcha_api_url', $url );
298 298
 }
299 299
 
300 300
 function getpaid_recaptcha_get_api_url() {
301
-	return add_query_arg(
302
-		array(
303
-			'render' => 'v2' === getpaid_get_recaptcha_version() ? 'explicit' : getpaid_get_recaptcha_site_key(),
304
-		),
305
-		'https://www.google.com/recaptcha/api.js'
306
-	);
301
+    return add_query_arg(
302
+        array(
303
+            'render' => 'v2' === getpaid_get_recaptcha_version() ? 'explicit' : getpaid_get_recaptcha_site_key(),
304
+        ),
305
+        'https://www.google.com/recaptcha/api.js'
306
+    );
307 307
 }
308 308
 
309 309
 /**
@@ -312,42 +312,42 @@  discard block
 block discarded – undo
312 312
  * @return array
313 313
  */
314 314
 function getpaid_get_recaptcha_settings() {
315
-	$settings = array(
316
-		'enabled' => getpaid_is_recaptcha_enabled(),
317
-		'version' => getpaid_get_recaptcha_version(),
318
-	);
319
-
320
-	if ( ! getpaid_is_recaptcha_enabled() ) {
321
-		return $settings;
322
-	}
323
-
324
-	$settings['sitekey'] = getpaid_get_recaptcha_site_key();
325
-
326
-	// Version 2 render params.
327
-	if ( 'v2' === getpaid_get_recaptcha_version() ) {
328
-		$settings['render_params'] = array(
329
-			'sitekey'  => getpaid_get_recaptcha_site_key(),
330
-			'theme'    => 'light',
331
-			'size'     => 'normal',
332
-			'tabindex' => 0,
333
-		);
334
-	}
335
-
336
-	return apply_filters( 'getpaid_recaptcha_settings', $settings );
315
+    $settings = array(
316
+        'enabled' => getpaid_is_recaptcha_enabled(),
317
+        'version' => getpaid_get_recaptcha_version(),
318
+    );
319
+
320
+    if ( ! getpaid_is_recaptcha_enabled() ) {
321
+        return $settings;
322
+    }
323
+
324
+    $settings['sitekey'] = getpaid_get_recaptcha_site_key();
325
+
326
+    // Version 2 render params.
327
+    if ( 'v2' === getpaid_get_recaptcha_version() ) {
328
+        $settings['render_params'] = array(
329
+            'sitekey'  => getpaid_get_recaptcha_site_key(),
330
+            'theme'    => 'light',
331
+            'size'     => 'normal',
332
+            'tabindex' => 0,
333
+        );
334
+    }
335
+
336
+    return apply_filters( 'getpaid_recaptcha_settings', $settings );
337 337
 }
338 338
 
339 339
 /**
340 340
  * Displays reCAPTCHA before payment button.
341 341
  */
342 342
 function getpaid_display_recaptcha_before_payment_button() {
343
-	if ( ! getpaid_is_recaptcha_enabled() || 'v2' !== getpaid_get_recaptcha_version() ) {
344
-		return;
345
-	}
346
-
347
-	printf(
348
-		'<div class="getpaid-recaptcha-wrapper"><div class="g-recaptcha mw-100 overflow-hidden my-2" id="getpaid-recaptcha-%s"></div></div>',
349
-		esc_attr( wp_unique_id() )
350
-	);
343
+    if ( ! getpaid_is_recaptcha_enabled() || 'v2' !== getpaid_get_recaptcha_version() ) {
344
+        return;
345
+    }
346
+
347
+    printf(
348
+        '<div class="getpaid-recaptcha-wrapper"><div class="g-recaptcha mw-100 overflow-hidden my-2" id="getpaid-recaptcha-%s"></div></div>',
349
+        esc_attr( wp_unique_id() )
350
+    );
351 351
 }
352 352
 add_action( 'getpaid_before_payment_form_pay_button', 'getpaid_display_recaptcha_before_payment_button' );
353 353
 
@@ -358,43 +358,43 @@  discard block
 block discarded – undo
358 358
  */
359 359
 function getpaid_validate_recaptcha_response( $submission ) {
360 360
 
361
-	// Check if reCAPTCHA is enabled.
362
-	if ( ! getpaid_is_recaptcha_enabled() ) {
363
-		return;
364
-	}
365
-
366
-	$token = $submission->get_field( 'g-recaptcha-response' );
367
-
368
-	// Abort if no token was provided.
369
-	if ( empty( $token ) ) {
370
-		wp_send_json_error( 'v2' === getpaid_get_recaptcha_version() ? __( 'Please confirm that you are not a robot.', 'invoicing' ) : __( "Unable to verify that you're not a robot. Please try again.", 'invoicing' ) );
371
-	}
372
-
373
-	$result = wp_remote_post(
374
-		'https://www.google.com/recaptcha/api/siteverify',
375
-		array(
376
-			'body' => array(
377
-				'secret'   => getpaid_get_recaptcha_secret_key(),
378
-				'response' => $token,
379
-			),
380
-		)
381
-	);
382
-
383
-	// Site not reachable, give benefit of doubt.
384
-	if ( is_wp_error( $result ) ) {
385
-		return;
386
-	}
387
-
388
-	$result = json_decode( wp_remote_retrieve_body( $result ), true );
389
-
390
-	if ( empty( $result['success'] ) && ! in_array( 'missing-input-secret', $result['error-codes'], true ) && ! in_array( 'invalid-input-secret', $result['error-codes'], true ) ) {
391
-		wp_send_json_error( __( "Unable to verify that you're not a robot. Please try again.", 'invoicing' ) );
392
-	}
393
-
394
-	// For v3, check the score.
395
-	$minimum_score = apply_filters( 'getpaid_recaptcha_minimum_score', 0.4 );
396
-	if ( 'v3' === getpaid_get_recaptcha_version() && ( empty( $result['score'] ) || $result['score'] < $minimum_score ) ) {
397
-		wp_send_json_error( __( "Unable to verify that you're not a robot. Please try again.", 'invoicing' ) );
398
-	}
361
+    // Check if reCAPTCHA is enabled.
362
+    if ( ! getpaid_is_recaptcha_enabled() ) {
363
+        return;
364
+    }
365
+
366
+    $token = $submission->get_field( 'g-recaptcha-response' );
367
+
368
+    // Abort if no token was provided.
369
+    if ( empty( $token ) ) {
370
+        wp_send_json_error( 'v2' === getpaid_get_recaptcha_version() ? __( 'Please confirm that you are not a robot.', 'invoicing' ) : __( "Unable to verify that you're not a robot. Please try again.", 'invoicing' ) );
371
+    }
372
+
373
+    $result = wp_remote_post(
374
+        'https://www.google.com/recaptcha/api/siteverify',
375
+        array(
376
+            'body' => array(
377
+                'secret'   => getpaid_get_recaptcha_secret_key(),
378
+                'response' => $token,
379
+            ),
380
+        )
381
+    );
382
+
383
+    // Site not reachable, give benefit of doubt.
384
+    if ( is_wp_error( $result ) ) {
385
+        return;
386
+    }
387
+
388
+    $result = json_decode( wp_remote_retrieve_body( $result ), true );
389
+
390
+    if ( empty( $result['success'] ) && ! in_array( 'missing-input-secret', $result['error-codes'], true ) && ! in_array( 'invalid-input-secret', $result['error-codes'], true ) ) {
391
+        wp_send_json_error( __( "Unable to verify that you're not a robot. Please try again.", 'invoicing' ) );
392
+    }
393
+
394
+    // For v3, check the score.
395
+    $minimum_score = apply_filters( 'getpaid_recaptcha_minimum_score', 0.4 );
396
+    if ( 'v3' === getpaid_get_recaptcha_version() && ( empty( $result['score'] ) || $result['score'] < $minimum_score ) ) {
397
+        wp_send_json_error( __( "Unable to verify that you're not a robot. Please try again.", 'invoicing' ) );
398
+    }
399 399
 }
400 400
 add_action( 'getpaid_checkout_error_checks', 'getpaid_validate_recaptcha_response' );
Please login to merge, or discard this patch.
Spacing   +119 added lines, -119 removed lines patch added patch discarded remove patch
@@ -1,155 +1,155 @@  discard block
 block discarded – undo
1 1
 <?php
2
-function wpinv_is_subscription_payment( $invoice = '' ) {
3
-	if ( empty( $invoice ) ) {
2
+function wpinv_is_subscription_payment($invoice = '') {
3
+	if (empty($invoice)) {
4 4
 		return false;
5 5
 	}
6 6
 
7
-	if ( ! is_object( $invoice ) && is_scalar( $invoice ) ) {
8
-		$invoice = wpinv_get_invoice( $invoice );
7
+	if (!is_object($invoice) && is_scalar($invoice)) {
8
+		$invoice = wpinv_get_invoice($invoice);
9 9
 	}
10 10
 
11
-	if ( empty( $invoice ) ) {
11
+	if (empty($invoice)) {
12 12
 		return false;
13 13
 	}
14 14
 
15
-	if ( $invoice->is_renewal() ) {
15
+	if ($invoice->is_renewal()) {
16 16
 		return true;
17 17
 	}
18 18
 
19 19
 	return false;
20 20
 }
21 21
 
22
-function wpinv_payment_link_transaction_id( $invoice = '' ) {
23
-	if ( empty( $invoice ) ) {
22
+function wpinv_payment_link_transaction_id($invoice = '') {
23
+	if (empty($invoice)) {
24 24
 		return false;
25 25
 	}
26 26
 
27
-	if ( ! is_object( $invoice ) && is_scalar( $invoice ) ) {
28
-		$invoice = wpinv_get_invoice( $invoice );
27
+	if (!is_object($invoice) && is_scalar($invoice)) {
28
+		$invoice = wpinv_get_invoice($invoice);
29 29
 	}
30 30
 
31
-	if ( empty( $invoice ) ) {
31
+	if (empty($invoice)) {
32 32
 		return false;
33 33
 	}
34 34
 
35
-	return apply_filters( 'wpinv_payment_details_transaction_id-' . $invoice->gateway, $invoice->get_transaction_id(), $invoice->ID, $invoice );
35
+	return apply_filters('wpinv_payment_details_transaction_id-' . $invoice->gateway, $invoice->get_transaction_id(), $invoice->ID, $invoice);
36 36
 }
37 37
 
38
-function wpinv_subscription_initial_payment_desc( $amount, $period, $interval, $trial_period = '', $trial_interval = 0 ) {
39
-	$interval   = (int)$interval > 0 ? (int)$interval : 1;
38
+function wpinv_subscription_initial_payment_desc($amount, $period, $interval, $trial_period = '', $trial_interval = 0) {
39
+	$interval = (int) $interval > 0 ? (int) $interval : 1;
40 40
 
41
-	if ( $trial_interval > 0 && ! empty( $trial_period ) ) {
42
-		$amount = __( 'Free', 'invoicing' );
41
+	if ($trial_interval > 0 && !empty($trial_period)) {
42
+		$amount = __('Free', 'invoicing');
43 43
 		$interval = $trial_interval;
44 44
 		$period = $trial_period;
45 45
 	}
46 46
 
47 47
 	$description = '';
48
-	switch ( $period ) {
48
+	switch ($period) {
49 49
 		case 'D':
50 50
 		case 'day':
51
-			$description = wp_sprintf( _n( '%s for the first day.', '%1$s for the first %2$d days.', $interval, 'invoicing' ), $amount, $interval );
51
+			$description = wp_sprintf(_n('%s for the first day.', '%1$s for the first %2$d days.', $interval, 'invoicing'), $amount, $interval);
52 52
 			break;
53 53
 		case 'W':
54 54
 		case 'week':
55
-			$description = wp_sprintf( _n( '%s for the first week.', '%1$s for the first %2$d weeks.', $interval, 'invoicing' ), $amount, $interval );
55
+			$description = wp_sprintf(_n('%s for the first week.', '%1$s for the first %2$d weeks.', $interval, 'invoicing'), $amount, $interval);
56 56
 			break;
57 57
 		case 'M':
58 58
 		case 'month':
59
-			$description = wp_sprintf( _n( '%s for the first month.', '%1$s for the first %2$d months.', $interval, 'invoicing' ), $amount, $interval );
59
+			$description = wp_sprintf(_n('%s for the first month.', '%1$s for the first %2$d months.', $interval, 'invoicing'), $amount, $interval);
60 60
 			break;
61 61
 		case 'Y':
62 62
 		case 'year':
63
-			$description = wp_sprintf( _n( '%s for the first year.', '%1$s for the first %2$d years.', $interval, 'invoicing' ), $amount, $interval );
63
+			$description = wp_sprintf(_n('%s for the first year.', '%1$s for the first %2$d years.', $interval, 'invoicing'), $amount, $interval);
64 64
 			break;
65 65
 	}
66 66
 
67
-	return apply_filters( 'wpinv_subscription_initial_payment_desc', $description, $amount, $period, $interval, $trial_period, $trial_interval );
67
+	return apply_filters('wpinv_subscription_initial_payment_desc', $description, $amount, $period, $interval, $trial_period, $trial_interval);
68 68
 }
69 69
 
70
-function wpinv_subscription_recurring_payment_desc( $amount, $period, $interval, $bill_times = 0, $trial_period = '', $trial_interval = 0 ) {
71
-	$interval   = (int)$interval > 0 ? (int)$interval : 1;
72
-	$bill_times = (int)$bill_times > 0 ? (int)$bill_times : 0;
70
+function wpinv_subscription_recurring_payment_desc($amount, $period, $interval, $bill_times = 0, $trial_period = '', $trial_interval = 0) {
71
+	$interval   = (int) $interval > 0 ? (int) $interval : 1;
72
+	$bill_times = (int) $bill_times > 0 ? (int) $bill_times : 0;
73 73
 
74 74
 	$description = '';
75
-	switch ( $period ) {
75
+	switch ($period) {
76 76
 		case 'D':
77 77
 		case 'day':
78
-			if ( (int)$bill_times > 0 ) {
79
-				if ( $interval > 1 ) {
80
-					if ( $bill_times > 1 ) {
81
-						$description = wp_sprintf( __( '%1$s for each %2$d days, for %3$d installments.', 'invoicing' ), $amount, $interval, $bill_times );
78
+			if ((int) $bill_times > 0) {
79
+				if ($interval > 1) {
80
+					if ($bill_times > 1) {
81
+						$description = wp_sprintf(__('%1$s for each %2$d days, for %3$d installments.', 'invoicing'), $amount, $interval, $bill_times);
82 82
 					} else {
83
-						$description = wp_sprintf( __( '%1$s for %2$d days.', 'invoicing' ), $amount, $interval );
83
+						$description = wp_sprintf(__('%1$s for %2$d days.', 'invoicing'), $amount, $interval);
84 84
 					}
85 85
 				} else {
86
-					$description = wp_sprintf( _n( '%s for one day.', '%1$s for each day, for %2$d installments.', $bill_times, 'invoicing' ), $amount, $bill_times );
86
+					$description = wp_sprintf(_n('%s for one day.', '%1$s for each day, for %2$d installments.', $bill_times, 'invoicing'), $amount, $bill_times);
87 87
 				}
88 88
 			} else {
89
-				$description = wp_sprintf( _n( '%s for each day.', '%1$s for each %2$d days.', $interval, 'invoicing' ), $amount, $interval );
89
+				$description = wp_sprintf(_n('%s for each day.', '%1$s for each %2$d days.', $interval, 'invoicing'), $amount, $interval);
90 90
 			}
91 91
 			break;
92 92
 		case 'W':
93 93
 		case 'week':
94
-			if ( (int)$bill_times > 0 ) {
95
-				if ( $interval > 1 ) {
96
-					if ( $bill_times > 1 ) {
97
-						$description = wp_sprintf( __( '%1$s for each %2$d weeks, for %3$d installments.', 'invoicing' ), $amount, $interval, $bill_times );
94
+			if ((int) $bill_times > 0) {
95
+				if ($interval > 1) {
96
+					if ($bill_times > 1) {
97
+						$description = wp_sprintf(__('%1$s for each %2$d weeks, for %3$d installments.', 'invoicing'), $amount, $interval, $bill_times);
98 98
 					} else {
99
-						$description = wp_sprintf( __( '%1$s for %2$d weeks.', 'invoicing' ), $amount, $interval );
99
+						$description = wp_sprintf(__('%1$s for %2$d weeks.', 'invoicing'), $amount, $interval);
100 100
 					}
101 101
 				} else {
102
-					$description = wp_sprintf( _n( '%s for one week.', '%1$s for each week, for %2$d installments.', $bill_times, 'invoicing' ), $amount, $bill_times );
102
+					$description = wp_sprintf(_n('%s for one week.', '%1$s for each week, for %2$d installments.', $bill_times, 'invoicing'), $amount, $bill_times);
103 103
 				}
104 104
 			} else {
105
-				$description = wp_sprintf( _n( '%s for each week.', '%1$s for each %2$d weeks.', $interval, 'invoicing' ), $amount, $interval );
105
+				$description = wp_sprintf(_n('%s for each week.', '%1$s for each %2$d weeks.', $interval, 'invoicing'), $amount, $interval);
106 106
 			}
107 107
 			break;
108 108
 		case 'M':
109 109
 		case 'month':
110
-			if ( (int)$bill_times > 0 ) {
111
-				if ( $interval > 1 ) {
112
-					if ( $bill_times > 1 ) {
113
-						$description = wp_sprintf( __( '%1$s for each %2$d months, for %3$d installments.', 'invoicing' ), $amount, $interval, $bill_times );
110
+			if ((int) $bill_times > 0) {
111
+				if ($interval > 1) {
112
+					if ($bill_times > 1) {
113
+						$description = wp_sprintf(__('%1$s for each %2$d months, for %3$d installments.', 'invoicing'), $amount, $interval, $bill_times);
114 114
 					} else {
115
-						$description = wp_sprintf( __( '%1$s for %2$d months.', 'invoicing' ), $amount, $interval );
115
+						$description = wp_sprintf(__('%1$s for %2$d months.', 'invoicing'), $amount, $interval);
116 116
 					}
117 117
 				} else {
118
-					$description = wp_sprintf( _n( '%s for one month.', '%1$s for each month, for %2$d installments.', $bill_times, 'invoicing' ), $amount, $bill_times );
118
+					$description = wp_sprintf(_n('%s for one month.', '%1$s for each month, for %2$d installments.', $bill_times, 'invoicing'), $amount, $bill_times);
119 119
 				}
120 120
 			} else {
121
-				$description = wp_sprintf( _n( '%s for each month.', '%1$s for each %2$d months.', $interval, 'invoicing' ), $amount, $interval );
121
+				$description = wp_sprintf(_n('%s for each month.', '%1$s for each %2$d months.', $interval, 'invoicing'), $amount, $interval);
122 122
 			}
123 123
 			break;
124 124
 		case 'Y':
125 125
 		case 'year':
126
-			if ( (int)$bill_times > 0 ) {
127
-				if ( $interval > 1 ) {
128
-					if ( $bill_times > 1 ) {
129
-						$description = wp_sprintf( __( '%1$s for each %2$d years, for %3$d installments.', 'invoicing' ), $amount, $interval, $bill_times );
126
+			if ((int) $bill_times > 0) {
127
+				if ($interval > 1) {
128
+					if ($bill_times > 1) {
129
+						$description = wp_sprintf(__('%1$s for each %2$d years, for %3$d installments.', 'invoicing'), $amount, $interval, $bill_times);
130 130
 					} else {
131
-						$description = wp_sprintf( __( '%1$s for %2$d years.', 'invoicing' ), $amount, $interval );
131
+						$description = wp_sprintf(__('%1$s for %2$d years.', 'invoicing'), $amount, $interval);
132 132
 					}
133 133
 				} else {
134
-					$description = wp_sprintf( _n( '%s for one year.', '%1$s for each year, for %2$d installments.', $bill_times, 'invoicing' ), $amount, $bill_times );
134
+					$description = wp_sprintf(_n('%s for one year.', '%1$s for each year, for %2$d installments.', $bill_times, 'invoicing'), $amount, $bill_times);
135 135
 				}
136 136
 			} else {
137
-				$description = wp_sprintf( _n( '%s for each year.', '%1$s for each %2$d years.', $interval, 'invoicing' ), $amount, $interval );
137
+				$description = wp_sprintf(_n('%s for each year.', '%1$s for each %2$d years.', $interval, 'invoicing'), $amount, $interval);
138 138
 			}
139 139
 			break;
140 140
 	}
141 141
 
142
-	return apply_filters( 'wpinv_subscription_recurring_payment_desc', $description, $amount, $period, $interval, $bill_times, $trial_period, $trial_interval );
142
+	return apply_filters('wpinv_subscription_recurring_payment_desc', $description, $amount, $period, $interval, $bill_times, $trial_period, $trial_interval);
143 143
 }
144 144
 
145
-function wpinv_subscription_payment_desc( $invoice ) {
146
-	if ( empty( $invoice ) ) {
145
+function wpinv_subscription_payment_desc($invoice) {
146
+	if (empty($invoice)) {
147 147
 		return null;
148 148
 	}
149 149
 
150 150
 	$description = '';
151
-	if ( $invoice->is_parent() && $item = $invoice->get_recurring( true ) ) {
152
-		if ( $item->has_free_trial() ) {
151
+	if ($invoice->is_parent() && $item = $invoice->get_recurring(true)) {
152
+		if ($item->has_free_trial()) {
153 153
 			$trial_period = $item->get_trial_period();
154 154
 			$trial_interval = $item->get_trial_interval();
155 155
 		} else {
@@ -157,40 +157,40 @@  discard block
 block discarded – undo
157 157
 			$trial_interval = 0;
158 158
 		}
159 159
 
160
-		$description = wpinv_get_billing_cycle( $invoice->get_total(), $invoice->get_recurring_details( 'total' ), $item->get_recurring_period(), $item->get_recurring_interval(), $item->get_recurring_limit(), $trial_period, $trial_interval, $invoice->get_currency() );
160
+		$description = wpinv_get_billing_cycle($invoice->get_total(), $invoice->get_recurring_details('total'), $item->get_recurring_period(), $item->get_recurring_interval(), $item->get_recurring_limit(), $trial_period, $trial_interval, $invoice->get_currency());
161 161
 	}
162 162
 
163
-	return apply_filters( 'wpinv_subscription_payment_desc', $description, $invoice );
163
+	return apply_filters('wpinv_subscription_payment_desc', $description, $invoice);
164 164
 }
165 165
 
166
-function wpinv_get_billing_cycle( $initial, $recurring, $period, $interval, $bill_times, $trial_period = '', $trial_interval = 0, $currency = '' ) {
167
-	$initial_total      = wpinv_round_amount( $initial );
168
-	$recurring_total    = wpinv_round_amount( $recurring );
166
+function wpinv_get_billing_cycle($initial, $recurring, $period, $interval, $bill_times, $trial_period = '', $trial_interval = 0, $currency = '') {
167
+	$initial_total      = wpinv_round_amount($initial);
168
+	$recurring_total    = wpinv_round_amount($recurring);
169 169
 
170
-	if ( $trial_interval > 0 && ! empty( $trial_period ) ) {
170
+	if ($trial_interval > 0 && !empty($trial_period)) {
171 171
 		// Free trial
172 172
 	} else {
173
-		if ( $bill_times == 1 ) {
173
+		if ($bill_times == 1) {
174 174
 			$recurring_total = $initial_total;
175
-		} elseif ( $bill_times > 1 && $initial_total != $recurring_total ) {
175
+		} elseif ($bill_times > 1 && $initial_total != $recurring_total) {
176 176
 			$bill_times--;
177 177
 		}
178 178
 	}
179 179
 
180
-	$initial_amount     = wpinv_price( $initial_total, $currency );
181
-	$recurring_amount   = wpinv_price( $recurring_total, $currency );
180
+	$initial_amount     = wpinv_price($initial_total, $currency);
181
+	$recurring_amount   = wpinv_price($recurring_total, $currency);
182 182
 
183
-	$recurring          = wpinv_subscription_recurring_payment_desc( $recurring_amount, $period, $interval, $bill_times, $trial_period, $trial_interval );
183
+	$recurring          = wpinv_subscription_recurring_payment_desc($recurring_amount, $period, $interval, $bill_times, $trial_period, $trial_interval);
184 184
 
185
-	if ( $initial_total != $recurring_total ) {
186
-		$initial        = wpinv_subscription_initial_payment_desc( $initial_amount, $period, $interval, $trial_period, $trial_interval );
185
+	if ($initial_total != $recurring_total) {
186
+		$initial        = wpinv_subscription_initial_payment_desc($initial_amount, $period, $interval, $trial_period, $trial_interval);
187 187
 
188
-		$description    = wp_sprintf( __( '%1$s Then %2$s', 'invoicing' ), $initial, $recurring );
188
+		$description    = wp_sprintf(__('%1$s Then %2$s', 'invoicing'), $initial, $recurring);
189 189
 	} else {
190 190
 		$description    = $recurring;
191 191
 	}
192 192
 
193
-	return apply_filters( 'wpinv_get_billing_cycle', $description, $initial, $recurring, $period, $interval, $bill_times, $trial_period, $trial_interval, $currency );
193
+	return apply_filters('wpinv_get_billing_cycle', $description, $initial, $recurring, $period, $interval, $bill_times, $trial_period, $trial_interval, $currency);
194 194
 }
195 195
 
196 196
 /**
@@ -200,27 +200,27 @@  discard block
 block discarded – undo
200 200
  * @param string $card_number Card number.
201 201
  * @return string
202 202
  */
203
-function getpaid_get_card_name( $card_number ) {
203
+function getpaid_get_card_name($card_number) {
204 204
 
205 205
 	// Known regexes.
206 206
 	$regexes = array(
207
-		'/^4/'                     => __( 'Visa', 'invoicing' ),
208
-		'/^5[1-5]/'                => __( 'Mastercard', 'invoicing' ),
209
-		'/^3[47]/'                 => __( 'Amex', 'invoicing' ),
210
-		'/^3(?:0[0-5]|[68])/'      => __( 'Diners Club', 'invoicing' ),
211
-		'/^6(?:011|5)/'            => __( 'Discover', 'invoicing' ),
212
-		'/^(?:2131|1800|35\d{3})/' => __( 'JCB', 'invoicing' ),
207
+		'/^4/'                     => __('Visa', 'invoicing'),
208
+		'/^5[1-5]/'                => __('Mastercard', 'invoicing'),
209
+		'/^3[47]/'                 => __('Amex', 'invoicing'),
210
+		'/^3(?:0[0-5]|[68])/'      => __('Diners Club', 'invoicing'),
211
+		'/^6(?:011|5)/'            => __('Discover', 'invoicing'),
212
+		'/^(?:2131|1800|35\d{3})/' => __('JCB', 'invoicing'),
213 213
 	);
214 214
 
215 215
 	// Confirm if one matches.
216
-	foreach ( $regexes as $regex => $card ) {
217
-		if ( preg_match( $regex, $card_number ) >= 1 ) {
216
+	foreach ($regexes as $regex => $card) {
217
+		if (preg_match($regex, $card_number) >= 1) {
218 218
 			return $card;
219 219
 		}
220 220
 	}
221 221
 
222 222
 	// None matched.
223
-	return __( 'Card', 'invoicing' );
223
+	return __('Card', 'invoicing');
224 224
 
225 225
 }
226 226
 
@@ -229,25 +229,25 @@  discard block
 block discarded – undo
229 229
  *
230 230
  * @param WPInv_Invoice|int|null $invoice
231 231
  */
232
-function wpinv_send_back_to_checkout( $invoice = null ) {
233
-	$response = array( 'success' => false );
234
-	$invoice  = wpinv_get_invoice( $invoice );
232
+function wpinv_send_back_to_checkout($invoice = null) {
233
+	$response = array('success' => false);
234
+	$invoice  = wpinv_get_invoice($invoice);
235 235
 
236 236
 	// Was an invoice created?
237
-	if ( ! empty( $invoice ) ) {
238
-		$invoice             = is_scalar( $invoice ) ? new WPInv_Invoice( $invoice ) : $invoice;
237
+	if (!empty($invoice)) {
238
+		$invoice             = is_scalar($invoice) ? new WPInv_Invoice($invoice) : $invoice;
239 239
 		$response['invoice'] = $invoice->get_id();
240
-		do_action( 'getpaid_checkout_invoice_exception', $invoice );
240
+		do_action('getpaid_checkout_invoice_exception', $invoice);
241 241
 	}
242 242
 
243 243
 	// Do we have any errors?
244
-	if ( wpinv_get_errors() ) {
245
-		$response['data'] = getpaid_get_errors_html( true, false );
244
+	if (wpinv_get_errors()) {
245
+		$response['data'] = getpaid_get_errors_html(true, false);
246 246
 	} else {
247
-		$response['data'] = __( 'An error occured while processing your payment. Please try again.', 'invoicing' );
247
+		$response['data'] = __('An error occured while processing your payment. Please try again.', 'invoicing');
248 248
 	}
249 249
 
250
-	wp_send_json( $response );
250
+	wp_send_json($response);
251 251
 }
252 252
 
253 253
 /**
@@ -256,7 +256,7 @@  discard block
 block discarded – undo
256 256
  * @return string
257 257
  */
258 258
 function getpaid_get_recaptcha_site_key() {
259
-	return apply_filters( 'getpaid_recaptcha_site_key', wpinv_get_option( 'recaptcha_site_key', '' ) );
259
+	return apply_filters('getpaid_recaptcha_site_key', wpinv_get_option('recaptcha_site_key', ''));
260 260
 }
261 261
 
262 262
 /**
@@ -265,7 +265,7 @@  discard block
 block discarded – undo
265 265
  * @return string
266 266
  */
267 267
 function getpaid_get_recaptcha_secret_key() {
268
-	return apply_filters( 'getpaid_recaptcha_secret_key', wpinv_get_option( 'recaptcha_secret_key', '' ) );
268
+	return apply_filters('getpaid_recaptcha_secret_key', wpinv_get_option('recaptcha_secret_key', ''));
269 269
 }
270 270
 
271 271
 /**
@@ -274,7 +274,7 @@  discard block
 block discarded – undo
274 274
  * @return bool
275 275
  */
276 276
 function getpaid_is_recaptcha_enabled() {
277
-	return wpinv_get_option( 'enable_recaptcha', false ) && getpaid_get_recaptcha_site_key() && getpaid_get_recaptcha_secret_key();
277
+	return wpinv_get_option('enable_recaptcha', false) && getpaid_get_recaptcha_site_key() && getpaid_get_recaptcha_secret_key();
278 278
 }
279 279
 
280 280
 /**
@@ -283,18 +283,18 @@  discard block
 block discarded – undo
283 283
  * @return string
284 284
  */
285 285
 function getpaid_get_recaptcha_version() {
286
-	return apply_filters( 'getpaid_recaptcha_version', wpinv_get_option( 'recaptcha_version', 'v2' ) );
286
+	return apply_filters('getpaid_recaptcha_version', wpinv_get_option('recaptcha_version', 'v2'));
287 287
 }
288 288
 
289 289
 function getpaid_recaptcha_api_url() {
290 290
 	// Prevent conflicts with Ninja Forms recaptcha.
291
-	if ( ! empty( $_REQUEST['action'] ) && $_REQUEST['action'] == 'geodir_ninja_forms' ) {
291
+	if (!empty($_REQUEST['action']) && $_REQUEST['action'] == 'geodir_ninja_forms') {
292 292
 		$url = '';
293 293
 	} else {
294 294
 		$url = getpaid_recaptcha_get_api_url();
295 295
 	}
296 296
 
297
-	return apply_filters( 'getpaid_recaptcha_api_url', $url );
297
+	return apply_filters('getpaid_recaptcha_api_url', $url);
298 298
 }
299 299
 
300 300
 function getpaid_recaptcha_get_api_url() {
@@ -317,14 +317,14 @@  discard block
 block discarded – undo
317 317
 		'version' => getpaid_get_recaptcha_version(),
318 318
 	);
319 319
 
320
-	if ( ! getpaid_is_recaptcha_enabled() ) {
320
+	if (!getpaid_is_recaptcha_enabled()) {
321 321
 		return $settings;
322 322
 	}
323 323
 
324 324
 	$settings['sitekey'] = getpaid_get_recaptcha_site_key();
325 325
 
326 326
 	// Version 2 render params.
327
-	if ( 'v2' === getpaid_get_recaptcha_version() ) {
327
+	if ('v2' === getpaid_get_recaptcha_version()) {
328 328
 		$settings['render_params'] = array(
329 329
 			'sitekey'  => getpaid_get_recaptcha_site_key(),
330 330
 			'theme'    => 'light',
@@ -333,41 +333,41 @@  discard block
 block discarded – undo
333 333
 		);
334 334
 	}
335 335
 
336
-	return apply_filters( 'getpaid_recaptcha_settings', $settings );
336
+	return apply_filters('getpaid_recaptcha_settings', $settings);
337 337
 }
338 338
 
339 339
 /**
340 340
  * Displays reCAPTCHA before payment button.
341 341
  */
342 342
 function getpaid_display_recaptcha_before_payment_button() {
343
-	if ( ! getpaid_is_recaptcha_enabled() || 'v2' !== getpaid_get_recaptcha_version() ) {
343
+	if (!getpaid_is_recaptcha_enabled() || 'v2' !== getpaid_get_recaptcha_version()) {
344 344
 		return;
345 345
 	}
346 346
 
347 347
 	printf(
348 348
 		'<div class="getpaid-recaptcha-wrapper"><div class="g-recaptcha mw-100 overflow-hidden my-2" id="getpaid-recaptcha-%s"></div></div>',
349
-		esc_attr( wp_unique_id() )
349
+		esc_attr(wp_unique_id())
350 350
 	);
351 351
 }
352
-add_action( 'getpaid_before_payment_form_pay_button', 'getpaid_display_recaptcha_before_payment_button' );
352
+add_action('getpaid_before_payment_form_pay_button', 'getpaid_display_recaptcha_before_payment_button');
353 353
 
354 354
 /**
355 355
  * Validates the reCAPTCHA response.
356 356
  *
357 357
  * @param GetPaid_Payment_Form_Submission $submission
358 358
  */
359
-function getpaid_validate_recaptcha_response( $submission ) {
359
+function getpaid_validate_recaptcha_response($submission) {
360 360
 
361 361
 	// Check if reCAPTCHA is enabled.
362
-	if ( ! getpaid_is_recaptcha_enabled() ) {
362
+	if (!getpaid_is_recaptcha_enabled()) {
363 363
 		return;
364 364
 	}
365 365
 
366
-	$token = $submission->get_field( 'g-recaptcha-response' );
366
+	$token = $submission->get_field('g-recaptcha-response');
367 367
 
368 368
 	// Abort if no token was provided.
369
-	if ( empty( $token ) ) {
370
-		wp_send_json_error( 'v2' === getpaid_get_recaptcha_version() ? __( 'Please confirm that you are not a robot.', 'invoicing' ) : __( "Unable to verify that you're not a robot. Please try again.", 'invoicing' ) );
369
+	if (empty($token)) {
370
+		wp_send_json_error('v2' === getpaid_get_recaptcha_version() ? __('Please confirm that you are not a robot.', 'invoicing') : __("Unable to verify that you're not a robot. Please try again.", 'invoicing'));
371 371
 	}
372 372
 
373 373
 	$result = wp_remote_post(
@@ -381,20 +381,20 @@  discard block
 block discarded – undo
381 381
 	);
382 382
 
383 383
 	// Site not reachable, give benefit of doubt.
384
-	if ( is_wp_error( $result ) ) {
384
+	if (is_wp_error($result)) {
385 385
 		return;
386 386
 	}
387 387
 
388
-	$result = json_decode( wp_remote_retrieve_body( $result ), true );
388
+	$result = json_decode(wp_remote_retrieve_body($result), true);
389 389
 
390
-	if ( empty( $result['success'] ) && ! in_array( 'missing-input-secret', $result['error-codes'], true ) && ! in_array( 'invalid-input-secret', $result['error-codes'], true ) ) {
391
-		wp_send_json_error( __( "Unable to verify that you're not a robot. Please try again.", 'invoicing' ) );
390
+	if (empty($result['success']) && !in_array('missing-input-secret', $result['error-codes'], true) && !in_array('invalid-input-secret', $result['error-codes'], true)) {
391
+		wp_send_json_error(__("Unable to verify that you're not a robot. Please try again.", 'invoicing'));
392 392
 	}
393 393
 
394 394
 	// For v3, check the score.
395
-	$minimum_score = apply_filters( 'getpaid_recaptcha_minimum_score', 0.4 );
396
-	if ( 'v3' === getpaid_get_recaptcha_version() && ( empty( $result['score'] ) || $result['score'] < $minimum_score ) ) {
397
-		wp_send_json_error( __( "Unable to verify that you're not a robot. Please try again.", 'invoicing' ) );
395
+	$minimum_score = apply_filters('getpaid_recaptcha_minimum_score', 0.4);
396
+	if ('v3' === getpaid_get_recaptcha_version() && (empty($result['score']) || $result['score'] < $minimum_score)) {
397
+		wp_send_json_error(__("Unable to verify that you're not a robot. Please try again.", 'invoicing'));
398 398
 	}
399 399
 }
400
-add_action( 'getpaid_checkout_error_checks', 'getpaid_validate_recaptcha_response' );
400
+add_action('getpaid_checkout_error_checks', 'getpaid_validate_recaptcha_response');
Please login to merge, or discard this patch.
includes/gateways/class-getpaid-paypal-gateway-ipn-handler.php 2 patches
Indentation   +405 added lines, -405 removed lines patch added patch discarded remove patch
@@ -12,482 +12,482 @@
 block discarded – undo
12 12
  */
13 13
 class GetPaid_Paypal_Gateway_IPN_Handler {
14 14
 
15
-	/**
16
-	 * Payment method id.
17
-	 *
18
-	 * @var string
19
-	 */
20
-	protected $id = 'paypal';
21
-
22
-	/**
23
-	 * Payment method object.
24
-	 *
25
-	 * @var GetPaid_Paypal_Gateway
26
-	 */
27
-	protected $gateway;
28
-
29
-	/**
30
-	 * Class constructor.
31
-	 *
32
-	 * @param GetPaid_Paypal_Gateway $gateway
33
-	 */
34
-	public function __construct( $gateway ) {
35
-		$this->gateway = $gateway;
36
-		$this->verify_ipn();
37
-	}
38
-
39
-	/**
40
-	 * Processes ipns and marks payments as complete.
41
-	 *
42
-	 * @return void
43
-	 */
44
-	public function verify_ipn() {
45
-
46
-		wpinv_error_log( 'GetPaid PayPal IPN Handler', false );
47
-
48
-		// Validate the IPN.
49
-		if ( empty( $_POST ) || ! $this->validate_ipn() ) {
50
-			wp_die( 'PayPal IPN Request Failure', 500 );
51
-		}
52
-
53
-		// Process the IPN.
54
-		$posted  = wp_unslash( $_POST );
55
-		$invoice = $this->get_ipn_invoice( $posted );
56
-
57
-		// Abort if it was not paid by our gateway.
58
-		if ( $this->id != $invoice->get_gateway() ) {
59
-			wpinv_error_log( 'Aborting, Invoice was not paid via PayPal', false );
60
-			wp_die( 'Invoice not paid via PayPal', 200 );
61
-		}
62
-
63
-		$posted['payment_status'] = isset( $posted['payment_status'] ) ? sanitize_key( strtolower( $posted['payment_status'] ) ) : '';
64
-		$posted['txn_type']       = sanitize_key( strtolower( $posted['txn_type'] ) );
65
-
66
-		wpinv_error_log( 'Payment status:' . $posted['payment_status'], false );
67
-		wpinv_error_log( 'IPN Type:' . $posted['txn_type'], false );
68
-
69
-		if ( method_exists( $this, 'ipn_txn_' . $posted['txn_type'] ) ) {
70
-			call_user_func( array( $this, 'ipn_txn_' . $posted['txn_type'] ), $invoice, $posted );
71
-			wpinv_error_log( 'Done processing IPN', false );
72
-			wp_die( 'Processed', 200 );
73
-		}
74
-
75
-		wpinv_error_log( 'Aborting, Unsupported IPN type:' . $posted['txn_type'], false );
76
-		wp_die( 'Unsupported IPN type', 200 );
77
-
78
-	}
79
-
80
-	/**
81
-	 * Retrieves IPN Invoice.
82
-	 *
83
-	 * @param array $posted
84
-	 * @return WPInv_Invoice
85
-	 */
86
-	protected function get_ipn_invoice( $posted ) {
87
-
88
-		wpinv_error_log( 'Retrieving PayPal IPN Response Invoice', false );
89
-
90
-		if ( ! empty( $posted['custom'] ) ) {
91
-			$invoice = new WPInv_Invoice( $posted['custom'] );
92
-
93
-			if ( $invoice->exists() ) {
94
-				wpinv_error_log( 'Found invoice #' . $invoice->get_number(), false );
95
-				return $invoice;
96
-			}
97
-		}
98
-
99
-		wpinv_error_log( 'Could not retrieve the associated invoice.', false );
100
-		wp_die( 'Could not retrieve the associated invoice.', 200 );
101
-	}
102
-
103
-	/**
104
-	 * Check PayPal IPN validity.
105
-	 */
106
-	protected function validate_ipn() {
107
-
108
-		wpinv_error_log( 'Validating PayPal IPN response', false );
109
-
110
-		// Retrieve the associated invoice.
111
-		$posted  = wp_unslash( $_POST );
112
-		$invoice = $this->get_ipn_invoice( $posted );
113
-
114
-		if ( $this->gateway->is_sandbox( $invoice ) ) {
115
-			wpinv_error_log( $posted, 'Invoice was processed in sandbox hence logging the posted data', false );
116
-		}
117
-
118
-		// Validate the IPN.
119
-		$posted['cmd'] = '_notify-validate';
120
-
121
-		// Send back post vars to paypal.
122
-		$params = array(
123
-			'body'        => $posted,
124
-			'timeout'     => 60,
125
-			'httpversion' => '1.1',
126
-			'compress'    => false,
127
-			'decompress'  => false,
128
-			'user-agent'  => 'GetPaid/' . WPINV_VERSION,
129
-		);
130
-
131
-		// Post back to get a response.
132
-		$response = wp_safe_remote_post( $this->gateway->is_sandbox( $invoice ) ? 'https://www.sandbox.paypal.com/cgi-bin/webscr' : 'https://www.paypal.com/cgi-bin/webscr', $params );
133
-
134
-		// Check to see if the request was valid.
135
-		if ( ! is_wp_error( $response ) && $response['response']['code'] < 300 && strstr( $response['body'], 'VERIFIED' ) ) {
136
-			$invoice->add_note( 'Received valid response from PayPal IPN: ' . $response['body'], false, false, true );
137
-			wpinv_error_log( 'Received valid response from PayPal IPN: ' . $response['body'], false );
138
-			return true;
139
-		}
140
-
141
-		$invoice->add_note( 'IPN message:' . wp_json_encode( $posted ), false, false, true );
142
-
143
-		if ( is_wp_error( $response ) ) {
144
-			$invoice->add_note( 'Received invalid response from PayPal IPN: ' . $response->get_error_message(), false, false, true );
145
-			wpinv_error_log( $response->get_error_message(), 'Received invalid response from PayPal IPN' );
146
-			return false;
147
-		}
148
-
149
-		$invoice->add_note( 'Received invalid response from PayPal IPN: ' . $response['body'], false, false, true );
150
-		wpinv_error_log( $response['body'], 'Received invalid response from PayPal IPN' );
151
-		return false;
152
-
153
-	}
154
-
155
-	/**
156
-	 * Check currency from IPN matches the invoice.
157
-	 *
158
-	 * @param WPInv_Invoice $invoice          Invoice object.
159
-	 * @param string   $currency currency to validate.
160
-	 */
161
-	protected function validate_ipn_currency( $invoice, $currency ) {
15
+    /**
16
+     * Payment method id.
17
+     *
18
+     * @var string
19
+     */
20
+    protected $id = 'paypal';
21
+
22
+    /**
23
+     * Payment method object.
24
+     *
25
+     * @var GetPaid_Paypal_Gateway
26
+     */
27
+    protected $gateway;
28
+
29
+    /**
30
+     * Class constructor.
31
+     *
32
+     * @param GetPaid_Paypal_Gateway $gateway
33
+     */
34
+    public function __construct( $gateway ) {
35
+        $this->gateway = $gateway;
36
+        $this->verify_ipn();
37
+    }
38
+
39
+    /**
40
+     * Processes ipns and marks payments as complete.
41
+     *
42
+     * @return void
43
+     */
44
+    public function verify_ipn() {
45
+
46
+        wpinv_error_log( 'GetPaid PayPal IPN Handler', false );
47
+
48
+        // Validate the IPN.
49
+        if ( empty( $_POST ) || ! $this->validate_ipn() ) {
50
+            wp_die( 'PayPal IPN Request Failure', 500 );
51
+        }
52
+
53
+        // Process the IPN.
54
+        $posted  = wp_unslash( $_POST );
55
+        $invoice = $this->get_ipn_invoice( $posted );
56
+
57
+        // Abort if it was not paid by our gateway.
58
+        if ( $this->id != $invoice->get_gateway() ) {
59
+            wpinv_error_log( 'Aborting, Invoice was not paid via PayPal', false );
60
+            wp_die( 'Invoice not paid via PayPal', 200 );
61
+        }
62
+
63
+        $posted['payment_status'] = isset( $posted['payment_status'] ) ? sanitize_key( strtolower( $posted['payment_status'] ) ) : '';
64
+        $posted['txn_type']       = sanitize_key( strtolower( $posted['txn_type'] ) );
65
+
66
+        wpinv_error_log( 'Payment status:' . $posted['payment_status'], false );
67
+        wpinv_error_log( 'IPN Type:' . $posted['txn_type'], false );
68
+
69
+        if ( method_exists( $this, 'ipn_txn_' . $posted['txn_type'] ) ) {
70
+            call_user_func( array( $this, 'ipn_txn_' . $posted['txn_type'] ), $invoice, $posted );
71
+            wpinv_error_log( 'Done processing IPN', false );
72
+            wp_die( 'Processed', 200 );
73
+        }
74
+
75
+        wpinv_error_log( 'Aborting, Unsupported IPN type:' . $posted['txn_type'], false );
76
+        wp_die( 'Unsupported IPN type', 200 );
77
+
78
+    }
79
+
80
+    /**
81
+     * Retrieves IPN Invoice.
82
+     *
83
+     * @param array $posted
84
+     * @return WPInv_Invoice
85
+     */
86
+    protected function get_ipn_invoice( $posted ) {
87
+
88
+        wpinv_error_log( 'Retrieving PayPal IPN Response Invoice', false );
89
+
90
+        if ( ! empty( $posted['custom'] ) ) {
91
+            $invoice = new WPInv_Invoice( $posted['custom'] );
92
+
93
+            if ( $invoice->exists() ) {
94
+                wpinv_error_log( 'Found invoice #' . $invoice->get_number(), false );
95
+                return $invoice;
96
+            }
97
+        }
98
+
99
+        wpinv_error_log( 'Could not retrieve the associated invoice.', false );
100
+        wp_die( 'Could not retrieve the associated invoice.', 200 );
101
+    }
102
+
103
+    /**
104
+     * Check PayPal IPN validity.
105
+     */
106
+    protected function validate_ipn() {
107
+
108
+        wpinv_error_log( 'Validating PayPal IPN response', false );
109
+
110
+        // Retrieve the associated invoice.
111
+        $posted  = wp_unslash( $_POST );
112
+        $invoice = $this->get_ipn_invoice( $posted );
113
+
114
+        if ( $this->gateway->is_sandbox( $invoice ) ) {
115
+            wpinv_error_log( $posted, 'Invoice was processed in sandbox hence logging the posted data', false );
116
+        }
117
+
118
+        // Validate the IPN.
119
+        $posted['cmd'] = '_notify-validate';
120
+
121
+        // Send back post vars to paypal.
122
+        $params = array(
123
+            'body'        => $posted,
124
+            'timeout'     => 60,
125
+            'httpversion' => '1.1',
126
+            'compress'    => false,
127
+            'decompress'  => false,
128
+            'user-agent'  => 'GetPaid/' . WPINV_VERSION,
129
+        );
130
+
131
+        // Post back to get a response.
132
+        $response = wp_safe_remote_post( $this->gateway->is_sandbox( $invoice ) ? 'https://www.sandbox.paypal.com/cgi-bin/webscr' : 'https://www.paypal.com/cgi-bin/webscr', $params );
133
+
134
+        // Check to see if the request was valid.
135
+        if ( ! is_wp_error( $response ) && $response['response']['code'] < 300 && strstr( $response['body'], 'VERIFIED' ) ) {
136
+            $invoice->add_note( 'Received valid response from PayPal IPN: ' . $response['body'], false, false, true );
137
+            wpinv_error_log( 'Received valid response from PayPal IPN: ' . $response['body'], false );
138
+            return true;
139
+        }
140
+
141
+        $invoice->add_note( 'IPN message:' . wp_json_encode( $posted ), false, false, true );
142
+
143
+        if ( is_wp_error( $response ) ) {
144
+            $invoice->add_note( 'Received invalid response from PayPal IPN: ' . $response->get_error_message(), false, false, true );
145
+            wpinv_error_log( $response->get_error_message(), 'Received invalid response from PayPal IPN' );
146
+            return false;
147
+        }
148
+
149
+        $invoice->add_note( 'Received invalid response from PayPal IPN: ' . $response['body'], false, false, true );
150
+        wpinv_error_log( $response['body'], 'Received invalid response from PayPal IPN' );
151
+        return false;
152
+
153
+    }
154
+
155
+    /**
156
+     * Check currency from IPN matches the invoice.
157
+     *
158
+     * @param WPInv_Invoice $invoice          Invoice object.
159
+     * @param string   $currency currency to validate.
160
+     */
161
+    protected function validate_ipn_currency( $invoice, $currency ) {
162 162
 
163
-		if ( strtolower( $invoice->get_currency() ) !== strtolower( $currency ) ) {
164
-
165
-			/* translators: %s: currency code. */
166
-			$invoice->update_status( 'wpi-processing', wp_sprintf( __( 'Validation error: PayPal currencies do not match (code %s).', 'invoicing' ), $currency ) );
167
-			$invoice->add_note( wp_sprintf( __( 'Validation error: PayPal currencies do not match (code %s).', 'invoicing' ), $currency ), false, false, true );
168
-
169
-			wpinv_error_log( "Currencies do not match: {$currency} instead of {$invoice->get_currency()}", 'IPN Error', __FILE__, __LINE__, true );
170
-		}
171
-
172
-		wpinv_error_log( $currency, 'Validated IPN Currency', false );
173
-	}
163
+        if ( strtolower( $invoice->get_currency() ) !== strtolower( $currency ) ) {
164
+
165
+            /* translators: %s: currency code. */
166
+            $invoice->update_status( 'wpi-processing', wp_sprintf( __( 'Validation error: PayPal currencies do not match (code %s).', 'invoicing' ), $currency ) );
167
+            $invoice->add_note( wp_sprintf( __( 'Validation error: PayPal currencies do not match (code %s).', 'invoicing' ), $currency ), false, false, true );
168
+
169
+            wpinv_error_log( "Currencies do not match: {$currency} instead of {$invoice->get_currency()}", 'IPN Error', __FILE__, __LINE__, true );
170
+        }
171
+
172
+        wpinv_error_log( $currency, 'Validated IPN Currency', false );
173
+    }
174 174
 
175
-	/**
176
-	 * Check payment amount from IPN matches the invoice.
177
-	 *
178
-	 * @param WPInv_Invoice $invoice          Invoice object.
179
-	 * @param float   $amount amount to validate.
180
-	 */
181
-	protected function validate_ipn_amount( $invoice, $amount ) {
182
-		if ( number_format( $invoice->get_total(), 2, '.', '' ) !== number_format( $amount, 2, '.', '' ) ) {
175
+    /**
176
+     * Check payment amount from IPN matches the invoice.
177
+     *
178
+     * @param WPInv_Invoice $invoice          Invoice object.
179
+     * @param float   $amount amount to validate.
180
+     */
181
+    protected function validate_ipn_amount( $invoice, $amount ) {
182
+        if ( number_format( $invoice->get_total(), 2, '.', '' ) !== number_format( $amount, 2, '.', '' ) ) {
183 183
 
184
-			/* translators: %s: Amount. */
185
-			$invoice->update_status( 'wpi-processing', wp_sprintf( __( 'Validation error: PayPal amounts do not match (gross %s).', 'invoicing' ), $amount ) );
186
-			$invoice->add_note( wp_sprintf( __( 'Validation error: PayPal amounts do not match (gross %s).', 'invoicing' ), $amount ), false, false, true );
184
+            /* translators: %s: Amount. */
185
+            $invoice->update_status( 'wpi-processing', wp_sprintf( __( 'Validation error: PayPal amounts do not match (gross %s).', 'invoicing' ), $amount ) );
186
+            $invoice->add_note( wp_sprintf( __( 'Validation error: PayPal amounts do not match (gross %s).', 'invoicing' ), $amount ), false, false, true );
187 187
 
188
-			wpinv_error_log( "Amounts do not match: {$amount} instead of {$invoice->get_total()}", 'IPN Error', __FILE__, __LINE__, true );
189
-		}
188
+            wpinv_error_log( "Amounts do not match: {$amount} instead of {$invoice->get_total()}", 'IPN Error', __FILE__, __LINE__, true );
189
+        }
190 190
 
191
-		wpinv_error_log( $amount, 'Validated IPN Amount', false );
192
-	}
191
+        wpinv_error_log( $amount, 'Validated IPN Amount', false );
192
+    }
193 193
 
194
-	/**
195
-	 * Verify receiver email from PayPal.
196
-	 *
197
-	 * @param WPInv_Invoice $invoice          Invoice object.
198
-	 * @param string   $receiver_email Email to validate.
199
-	 */
200
-	protected function validate_ipn_receiver_email( $invoice, $receiver_email ) {
201
-		$paypal_email = $this->gateway->is_sandbox( $invoice ) ? wpinv_get_option( 'paypal_sandbox_email', wpinv_get_option( 'paypal_email', '' ) ) : wpinv_get_option( 'paypal_email', '' );
194
+    /**
195
+     * Verify receiver email from PayPal.
196
+     *
197
+     * @param WPInv_Invoice $invoice          Invoice object.
198
+     * @param string   $receiver_email Email to validate.
199
+     */
200
+    protected function validate_ipn_receiver_email( $invoice, $receiver_email ) {
201
+        $paypal_email = $this->gateway->is_sandbox( $invoice ) ? wpinv_get_option( 'paypal_sandbox_email', wpinv_get_option( 'paypal_email', '' ) ) : wpinv_get_option( 'paypal_email', '' );
202 202
 
203
-		if ( $receiver_email && strcasecmp( trim( $receiver_email ), trim( $paypal_email ) ) !== 0 ) {
204
-			wpinv_record_gateway_error( 'IPN Error', "IPN Response is for another account: {$receiver_email}. Your PayPal email is {$paypal_email}." );
205
-
206
-			/* translators: %s: email address . */
207
-			$invoice->update_status( 'wpi-processing', wp_sprintf( __( 'Validation error: PayPal IPN response from a different email address (%s). Your PayPal email is %s.', 'invoicing' ), $receiver_email, $paypal_email ) );
208
-			$invoice->add_note( wp_sprintf( __( 'Validation error: PayPal IPN response from a different email address (%s). Your PayPal email is %s.', 'invoicing' ), $receiver_email, $paypal_email ), false, false, true );
203
+        if ( $receiver_email && strcasecmp( trim( $receiver_email ), trim( $paypal_email ) ) !== 0 ) {
204
+            wpinv_record_gateway_error( 'IPN Error', "IPN Response is for another account: {$receiver_email}. Your PayPal email is {$paypal_email}." );
205
+
206
+            /* translators: %s: email address . */
207
+            $invoice->update_status( 'wpi-processing', wp_sprintf( __( 'Validation error: PayPal IPN response from a different email address (%s). Your PayPal email is %s.', 'invoicing' ), $receiver_email, $paypal_email ) );
208
+            $invoice->add_note( wp_sprintf( __( 'Validation error: PayPal IPN response from a different email address (%s). Your PayPal email is %s.', 'invoicing' ), $receiver_email, $paypal_email ), false, false, true );
209 209
 
210
-			return wpinv_error_log( "IPN Response is for another account: {$receiver_email}. Your email PayPal is {$paypal_email}.", 'IPN Error', __FILE__, __LINE__, true );
211
-		}
210
+            return wpinv_error_log( "IPN Response is for another account: {$receiver_email}. Your email PayPal is {$paypal_email}.", 'IPN Error', __FILE__, __LINE__, true );
211
+        }
212 212
 
213
-		wpinv_error_log( 'Validated PayPal Email', false );
214
-	}
215
-
216
-	/**
217
-	 * Handles one time payments.
218
-	 *
219
-	 * @param WPInv_Invoice $invoice  Invoice object.
220
-	 * @param array    $posted Posted data.
221
-	 */
222
-	protected function ipn_txn_web_accept( $invoice, $posted ) {
213
+        wpinv_error_log( 'Validated PayPal Email', false );
214
+    }
215
+
216
+    /**
217
+     * Handles one time payments.
218
+     *
219
+     * @param WPInv_Invoice $invoice  Invoice object.
220
+     * @param array    $posted Posted data.
221
+     */
222
+    protected function ipn_txn_web_accept( $invoice, $posted ) {
223 223
 
224
-		// Collect payment details
225
-		$payment_status = strtolower( $posted['payment_status'] );
226
-		$business_email = isset( $posted['business'] ) && is_email( $posted['business'] ) ? trim( $posted['business'] ) : trim( $posted['receiver_email'] );
224
+        // Collect payment details
225
+        $payment_status = strtolower( $posted['payment_status'] );
226
+        $business_email = isset( $posted['business'] ) && is_email( $posted['business'] ) ? trim( $posted['business'] ) : trim( $posted['receiver_email'] );
227 227
 
228
-		$this->validate_ipn_receiver_email( $invoice, $business_email );
229
-		$this->validate_ipn_currency( $invoice, $posted['mc_currency'] );
228
+        $this->validate_ipn_receiver_email( $invoice, $business_email );
229
+        $this->validate_ipn_currency( $invoice, $posted['mc_currency'] );
230 230
 
231
-		// Update the transaction id.
232
-		if ( ! empty( $posted['txn_id'] ) ) {
233
-			$invoice->set_transaction_id( wpinv_clean( $posted['txn_id'] ) );
234
-			$invoice->save();
235
-		}
231
+        // Update the transaction id.
232
+        if ( ! empty( $posted['txn_id'] ) ) {
233
+            $invoice->set_transaction_id( wpinv_clean( $posted['txn_id'] ) );
234
+            $invoice->save();
235
+        }
236 236
 
237
-		$invoice->add_system_note( __( 'Processing invoice IPN', 'invoicing' ) );
237
+        $invoice->add_system_note( __( 'Processing invoice IPN', 'invoicing' ) );
238 238
 
239
-		// Process a refund.
240
-		if ( 'refunded' === $payment_status || 'reversed' === $payment_status ) {
239
+        // Process a refund.
240
+        if ( 'refunded' === $payment_status || 'reversed' === $payment_status ) {
241 241
 
242
-			update_post_meta( $invoice->get_id(), 'refunded_remotely', 1 );
242
+            update_post_meta( $invoice->get_id(), 'refunded_remotely', 1 );
243 243
 
244
-			if ( ! $invoice->is_refunded() ) {
245
-				$invoice->update_status( 'wpi-refunded', $posted['reason_code'] );
246
-			}
244
+            if ( ! $invoice->is_refunded() ) {
245
+                $invoice->update_status( 'wpi-refunded', $posted['reason_code'] );
246
+            }
247 247
 
248
-			return wpinv_error_log( $posted['reason_code'], false );
249
-		}
248
+            return wpinv_error_log( $posted['reason_code'], false );
249
+        }
250 250
 
251
-		// Process payments.
252
-		if ( 'completed' === $payment_status ) {
251
+        // Process payments.
252
+        if ( 'completed' === $payment_status ) {
253 253
 
254
-			if ( $invoice->is_paid() && 'wpi_processing' != $invoice->get_status() ) {
255
-				return wpinv_error_log( 'Aborting, Invoice #' . $invoice->get_number() . ' is already paid.', false );
256
-			}
254
+            if ( $invoice->is_paid() && 'wpi_processing' != $invoice->get_status() ) {
255
+                return wpinv_error_log( 'Aborting, Invoice #' . $invoice->get_number() . ' is already paid.', false );
256
+            }
257 257
 
258
-			$this->validate_ipn_amount( $invoice, $posted['mc_gross'] );
258
+            $this->validate_ipn_amount( $invoice, $posted['mc_gross'] );
259 259
 
260
-			$note = '';
260
+            $note = '';
261 261
 
262
-			if ( ! empty( $posted['mc_fee'] ) ) {
263
-				$note = sprintf( __( 'PayPal Transaction Fee %s.', 'invoicing' ), sanitize_text_field( $posted['mc_fee'] ) );
264
-			}
262
+            if ( ! empty( $posted['mc_fee'] ) ) {
263
+                $note = sprintf( __( 'PayPal Transaction Fee %s.', 'invoicing' ), sanitize_text_field( $posted['mc_fee'] ) );
264
+            }
265 265
 
266
-			if ( ! empty( $posted['payer_status'] ) ) {
267
-				$note = ' ' . sprintf( __( 'Buyer status %s.', 'invoicing' ), sanitize_text_field( $posted['payer_status'] ) );
268
-			}
266
+            if ( ! empty( $posted['payer_status'] ) ) {
267
+                $note = ' ' . sprintf( __( 'Buyer status %s.', 'invoicing' ), sanitize_text_field( $posted['payer_status'] ) );
268
+            }
269 269
 
270
-			$invoice->mark_paid( ( ! empty( $posted['txn_id'] ) ? sanitize_text_field( $posted['txn_id'] ) : '' ), trim( $note ) );
271
-			return wpinv_error_log( 'Invoice marked as paid.', false );
270
+            $invoice->mark_paid( ( ! empty( $posted['txn_id'] ) ? sanitize_text_field( $posted['txn_id'] ) : '' ), trim( $note ) );
271
+            return wpinv_error_log( 'Invoice marked as paid.', false );
272 272
 
273
-		}
273
+        }
274 274
 
275
-		// Pending payments.
276
-		if ( 'pending' === $payment_status ) {
275
+        // Pending payments.
276
+        if ( 'pending' === $payment_status ) {
277 277
 
278
-			/* translators: %s: pending reason. */
279
-			$invoice->update_status( 'wpi-onhold', wp_sprintf( __( 'Payment pending (%s).', 'invoicing' ), $posted['pending_reason'] ) );
280
-			$invoice->add_note( wp_sprintf( __( 'Payment pending (%s).', 'invoicing' ), $posted['pending_reason'] ), false, false, true );
278
+            /* translators: %s: pending reason. */
279
+            $invoice->update_status( 'wpi-onhold', wp_sprintf( __( 'Payment pending (%s).', 'invoicing' ), $posted['pending_reason'] ) );
280
+            $invoice->add_note( wp_sprintf( __( 'Payment pending (%s).', 'invoicing' ), $posted['pending_reason'] ), false, false, true );
281 281
 
282
-			return wpinv_error_log( 'Invoice marked as "payment held".', false );
283
-		}
282
+            return wpinv_error_log( 'Invoice marked as "payment held".', false );
283
+        }
284 284
 
285
-		/* translators: %s: payment status. */
286
-		$invoice->update_status( 'wpi-failed', sprintf( __( 'Payment %s via IPN.', 'invoicing' ), sanitize_text_field( $posted['payment_status'] ) ) );
285
+        /* translators: %s: payment status. */
286
+        $invoice->update_status( 'wpi-failed', sprintf( __( 'Payment %s via IPN.', 'invoicing' ), sanitize_text_field( $posted['payment_status'] ) ) );
287 287
 
288
-	}
288
+    }
289 289
 
290
-	/**
291
-	 * Handles one time payments.
292
-	 *
293
-	 * @param WPInv_Invoice $invoice  Invoice object.
294
-	 * @param array    $posted Posted data.
295
-	 */
296
-	protected function ipn_txn_cart( $invoice, $posted ) {
297
-		$this->ipn_txn_web_accept( $invoice, $posted );
298
-	}
290
+    /**
291
+     * Handles one time payments.
292
+     *
293
+     * @param WPInv_Invoice $invoice  Invoice object.
294
+     * @param array    $posted Posted data.
295
+     */
296
+    protected function ipn_txn_cart( $invoice, $posted ) {
297
+        $this->ipn_txn_web_accept( $invoice, $posted );
298
+    }
299 299
 
300
-	/**
301
-	 * Handles subscription sign ups.
302
-	 *
303
-	 * @param WPInv_Invoice $invoice  Invoice object.
304
-	 * @param array    $posted Posted data.
305
-	 */
306
-	protected function ipn_txn_subscr_signup( $invoice, $posted ) {
300
+    /**
301
+     * Handles subscription sign ups.
302
+     *
303
+     * @param WPInv_Invoice $invoice  Invoice object.
304
+     * @param array    $posted Posted data.
305
+     */
306
+    protected function ipn_txn_subscr_signup( $invoice, $posted ) {
307 307
 
308
-		wpinv_error_log( 'Processing subscription signup', false );
308
+        wpinv_error_log( 'Processing subscription signup', false );
309 309
 
310
-		// Make sure the invoice has a subscription.
311
-		$subscription = getpaid_get_invoice_subscription( $invoice );
310
+        // Make sure the invoice has a subscription.
311
+        $subscription = getpaid_get_invoice_subscription( $invoice );
312 312
 
313
-		if ( empty( $subscription ) ) {
314
-			return wpinv_error_log( 'Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false );
315
-		}
313
+        if ( empty( $subscription ) ) {
314
+            return wpinv_error_log( 'Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false );
315
+        }
316 316
 
317
-		wpinv_error_log( 'Found subscription #' . $subscription->get_id(), false );
317
+        wpinv_error_log( 'Found subscription #' . $subscription->get_id(), false );
318 318
 
319
-		// Validate the IPN.
320
-		$business_email = isset( $posted['business'] ) && is_email( $posted['business'] ) ? trim( $posted['business'] ) : trim( $posted['receiver_email'] );
321
-		$this->validate_ipn_receiver_email( $invoice, $business_email );
322
-		$this->validate_ipn_currency( $invoice, $posted['mc_currency'] );
319
+        // Validate the IPN.
320
+        $business_email = isset( $posted['business'] ) && is_email( $posted['business'] ) ? trim( $posted['business'] ) : trim( $posted['receiver_email'] );
321
+        $this->validate_ipn_receiver_email( $invoice, $business_email );
322
+        $this->validate_ipn_currency( $invoice, $posted['mc_currency'] );
323 323
 
324
-		// Activate the subscription.
325
-		$duration = strtotime( $subscription->get_expiration() ) - strtotime( $subscription->get_date_created() );
326
-		$subscription->set_date_created( current_time( 'mysql' ) );
327
-		$subscription->set_expiration( date( 'Y-m-d H:i:s', ( current_time( 'timestamp' ) + $duration ) ) );
328
-		$subscription->set_profile_id( sanitize_text_field( $posted['subscr_id'] ) );
329
-		$subscription->activate();
324
+        // Activate the subscription.
325
+        $duration = strtotime( $subscription->get_expiration() ) - strtotime( $subscription->get_date_created() );
326
+        $subscription->set_date_created( current_time( 'mysql' ) );
327
+        $subscription->set_expiration( date( 'Y-m-d H:i:s', ( current_time( 'timestamp' ) + $duration ) ) );
328
+        $subscription->set_profile_id( sanitize_text_field( $posted['subscr_id'] ) );
329
+        $subscription->activate();
330 330
 
331
-		// Set the transaction id.
332
-		if ( ! empty( $posted['txn_id'] ) ) {
333
-			$invoice->add_note( sprintf( __( 'PayPal Transaction ID: %s', 'invoicing' ), $posted['txn_id'] ), false, false, true );
334
-			$invoice->set_transaction_id( $posted['txn_id'] );
335
-		}
331
+        // Set the transaction id.
332
+        if ( ! empty( $posted['txn_id'] ) ) {
333
+            $invoice->add_note( sprintf( __( 'PayPal Transaction ID: %s', 'invoicing' ), $posted['txn_id'] ), false, false, true );
334
+            $invoice->set_transaction_id( $posted['txn_id'] );
335
+        }
336 336
 
337
-		// Update the payment status.
338
-		$invoice->mark_paid();
337
+        // Update the payment status.
338
+        $invoice->mark_paid();
339 339
 
340
-		$invoice->add_note( sprintf( __( 'PayPal Subscription ID: %s', 'invoicing' ), $posted['subscr_id'] ), false, false, true );
340
+        $invoice->add_note( sprintf( __( 'PayPal Subscription ID: %s', 'invoicing' ), $posted['subscr_id'] ), false, false, true );
341 341
 
342
-		wpinv_error_log( 'Subscription started.', false );
343
-	}
342
+        wpinv_error_log( 'Subscription started.', false );
343
+    }
344 344
 
345
-	/**
346
-	 * Handles subscription renewals.
347
-	 *
348
-	 * @param WPInv_Invoice $invoice  Invoice object.
349
-	 * @param array    $posted Posted data.
350
-	 */
351
-	protected function ipn_txn_subscr_payment( $invoice, $posted ) {
345
+    /**
346
+     * Handles subscription renewals.
347
+     *
348
+     * @param WPInv_Invoice $invoice  Invoice object.
349
+     * @param array    $posted Posted data.
350
+     */
351
+    protected function ipn_txn_subscr_payment( $invoice, $posted ) {
352 352
 
353
-		// Make sure the invoice has a subscription.
354
-		$subscription = getpaid_subscriptions()->get_invoice_subscription( $invoice );
353
+        // Make sure the invoice has a subscription.
354
+        $subscription = getpaid_subscriptions()->get_invoice_subscription( $invoice );
355 355
 
356
-		if ( empty( $subscription ) ) {
357
-			return wpinv_error_log( 'Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false );
358
-		}
356
+        if ( empty( $subscription ) ) {
357
+            return wpinv_error_log( 'Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false );
358
+        }
359 359
 
360
-		wpinv_error_log( 'Found subscription #' . $subscription->get_id(), false );
360
+        wpinv_error_log( 'Found subscription #' . $subscription->get_id(), false );
361 361
 
362
-		// PayPal sends a subscr_payment for the first payment too.
363
-		$date_completed = getpaid_format_date( $invoice->get_date_completed() );
364
-		$date_created   = getpaid_format_date( $invoice->get_date_created() );
365
-		$today_date     = getpaid_format_date( current_time( 'mysql' ) );
366
-		$payment_date   = getpaid_format_date( $posted['payment_date'] );
367
-		$subscribe_date = getpaid_format_date( $subscription->get_date_created() );
368
-		$dates          = array_filter( compact( 'date_completed', 'date_created', 'subscribe_date' ) );
362
+        // PayPal sends a subscr_payment for the first payment too.
363
+        $date_completed = getpaid_format_date( $invoice->get_date_completed() );
364
+        $date_created   = getpaid_format_date( $invoice->get_date_created() );
365
+        $today_date     = getpaid_format_date( current_time( 'mysql' ) );
366
+        $payment_date   = getpaid_format_date( $posted['payment_date'] );
367
+        $subscribe_date = getpaid_format_date( $subscription->get_date_created() );
368
+        $dates          = array_filter( compact( 'date_completed', 'date_created', 'subscribe_date' ) );
369 369
 
370
-		foreach ( $dates as $date ) {
370
+        foreach ( $dates as $date ) {
371 371
 
372
-			if ( $date !== $today_date && $date !== $payment_date ) {
373
-				continue;
374
-			}
372
+            if ( $date !== $today_date && $date !== $payment_date ) {
373
+                continue;
374
+            }
375 375
 
376
-			if ( ! empty( $posted['txn_id'] ) ) {
377
-				$invoice->set_transaction_id( sanitize_text_field( $posted['txn_id'] ) );
378
-				$invoice->add_note( wp_sprintf( __( 'PayPal Transaction ID: %s', 'invoicing' ), sanitize_text_field( $posted['txn_id'] ) ), false, false, true );
379
-			}
376
+            if ( ! empty( $posted['txn_id'] ) ) {
377
+                $invoice->set_transaction_id( sanitize_text_field( $posted['txn_id'] ) );
378
+                $invoice->add_note( wp_sprintf( __( 'PayPal Transaction ID: %s', 'invoicing' ), sanitize_text_field( $posted['txn_id'] ) ), false, false, true );
379
+            }
380 380
 
381
-			return $invoice->mark_paid();
382
-
383
-		}
381
+            return $invoice->mark_paid();
382
+
383
+        }
384 384
 
385
-		wpinv_error_log( 'Processing subscription renewal payment for the invoice ' . $invoice->get_id(), false );
386
-
387
-		// Abort if the payment is already recorded.
388
-		if ( wpinv_get_id_by_transaction_id( $posted['txn_id'] ) ) {
389
-			return wpinv_error_log( 'Aborting, Transaction ' . $posted['txn_id'] . ' has already been processed', false );
390
-		}
391
-
392
-		$args = array(
393
-			'transaction_id' => $posted['txn_id'],
394
-			'gateway'        => $this->id,
395
-		);
396
-
397
-		$invoice = wpinv_get_invoice( $subscription->add_payment( $args ) );
385
+        wpinv_error_log( 'Processing subscription renewal payment for the invoice ' . $invoice->get_id(), false );
386
+
387
+        // Abort if the payment is already recorded.
388
+        if ( wpinv_get_id_by_transaction_id( $posted['txn_id'] ) ) {
389
+            return wpinv_error_log( 'Aborting, Transaction ' . $posted['txn_id'] . ' has already been processed', false );
390
+        }
391
+
392
+        $args = array(
393
+            'transaction_id' => $posted['txn_id'],
394
+            'gateway'        => $this->id,
395
+        );
396
+
397
+        $invoice = wpinv_get_invoice( $subscription->add_payment( $args ) );
398 398
 
399
-		if ( empty( $invoice ) ) {
400
-			return;
401
-		}
399
+        if ( empty( $invoice ) ) {
400
+            return;
401
+        }
402 402
 
403
-		$invoice->add_note( wp_sprintf( __( 'PayPal Transaction ID: %s', 'invoicing' ), $posted['txn_id'] ), false, false, true );
404
-		$invoice->add_note( wp_sprintf( __( 'PayPal Subscription ID: %s', 'invoicing' ), $posted['subscr_id'] ), false, false, true );
403
+        $invoice->add_note( wp_sprintf( __( 'PayPal Transaction ID: %s', 'invoicing' ), $posted['txn_id'] ), false, false, true );
404
+        $invoice->add_note( wp_sprintf( __( 'PayPal Subscription ID: %s', 'invoicing' ), $posted['subscr_id'] ), false, false, true );
405 405
 
406
-		$subscription->renew();
407
-		wpinv_error_log( 'Subscription renewed.', false );
406
+        $subscription->renew();
407
+        wpinv_error_log( 'Subscription renewed.', false );
408 408
 
409
-	}
409
+    }
410 410
 
411
-	/**
412
-	 * Handles subscription cancelations.
413
-	 *
414
-	 * @param WPInv_Invoice $invoice  Invoice object.
415
-	 */
416
-	protected function ipn_txn_subscr_cancel( $invoice ) {
411
+    /**
412
+     * Handles subscription cancelations.
413
+     *
414
+     * @param WPInv_Invoice $invoice  Invoice object.
415
+     */
416
+    protected function ipn_txn_subscr_cancel( $invoice ) {
417 417
 
418
-		// Make sure the invoice has a subscription.
419
-		$subscription = getpaid_subscriptions()->get_invoice_subscription( $invoice );
420
-
421
-		if ( empty( $subscription ) ) {
422
-			return wpinv_error_log( 'Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false );
423
-		}
424
-
425
-		wpinv_error_log( 'Processing subscription cancellation for the invoice ' . $invoice->get_id(), false );
426
-		$subscription->cancel();
427
-		wpinv_error_log( 'Subscription cancelled.', false );
418
+        // Make sure the invoice has a subscription.
419
+        $subscription = getpaid_subscriptions()->get_invoice_subscription( $invoice );
420
+
421
+        if ( empty( $subscription ) ) {
422
+            return wpinv_error_log( 'Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false );
423
+        }
424
+
425
+        wpinv_error_log( 'Processing subscription cancellation for the invoice ' . $invoice->get_id(), false );
426
+        $subscription->cancel();
427
+        wpinv_error_log( 'Subscription cancelled.', false );
428 428
 
429
-	}
429
+    }
430 430
 
431
-	/**
432
-	 * Handles subscription completions.
433
-	 *
434
-	 * @param WPInv_Invoice $invoice  Invoice object.
435
-	 * @param array    $posted Posted data.
436
-	 */
437
-	protected function ipn_txn_subscr_eot( $invoice ) {
431
+    /**
432
+     * Handles subscription completions.
433
+     *
434
+     * @param WPInv_Invoice $invoice  Invoice object.
435
+     * @param array    $posted Posted data.
436
+     */
437
+    protected function ipn_txn_subscr_eot( $invoice ) {
438 438
 
439
-		// Make sure the invoice has a subscription.
440
-		$subscription = getpaid_subscriptions()->get_invoice_subscription( $invoice );
439
+        // Make sure the invoice has a subscription.
440
+        $subscription = getpaid_subscriptions()->get_invoice_subscription( $invoice );
441 441
 
442
-		if ( empty( $subscription ) ) {
443
-			return wpinv_error_log( 'Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false );
444
-		}
442
+        if ( empty( $subscription ) ) {
443
+            return wpinv_error_log( 'Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false );
444
+        }
445 445
 
446
-		wpinv_error_log( 'Processing subscription end of life for the invoice ' . $invoice->get_id(), false );
447
-		$subscription->complete();
448
-		wpinv_error_log( 'Subscription completed.', false );
446
+        wpinv_error_log( 'Processing subscription end of life for the invoice ' . $invoice->get_id(), false );
447
+        $subscription->complete();
448
+        wpinv_error_log( 'Subscription completed.', false );
449 449
 
450
-	}
450
+    }
451 451
 
452
-	/**
453
-	 * Handles subscription fails.
454
-	 *
455
-	 * @param WPInv_Invoice $invoice  Invoice object.
456
-	 * @param array    $posted Posted data.
457
-	 */
458
-	protected function ipn_txn_subscr_failed( $invoice ) {
452
+    /**
453
+     * Handles subscription fails.
454
+     *
455
+     * @param WPInv_Invoice $invoice  Invoice object.
456
+     * @param array    $posted Posted data.
457
+     */
458
+    protected function ipn_txn_subscr_failed( $invoice ) {
459 459
 
460
-		// Make sure the invoice has a subscription.
461
-		$subscription = getpaid_subscriptions()->get_invoice_subscription( $invoice );
460
+        // Make sure the invoice has a subscription.
461
+        $subscription = getpaid_subscriptions()->get_invoice_subscription( $invoice );
462 462
 
463
-		if ( empty( $subscription ) ) {
464
-			return wpinv_error_log( 'Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false );
465
-		}
463
+        if ( empty( $subscription ) ) {
464
+            return wpinv_error_log( 'Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false );
465
+        }
466 466
 
467
-		wpinv_error_log( 'Processing subscription payment failure for the invoice ' . $invoice->get_id(), false );
468
-		$subscription->failing();
469
-		wpinv_error_log( 'Subscription marked as failing.', false );
467
+        wpinv_error_log( 'Processing subscription payment failure for the invoice ' . $invoice->get_id(), false );
468
+        $subscription->failing();
469
+        wpinv_error_log( 'Subscription marked as failing.', false );
470 470
 
471
-	}
471
+    }
472 472
 
473
-	/**
474
-	 * Handles subscription suspensions.
475
-	 *
476
-	 * @param WPInv_Invoice $invoice  Invoice object.
477
-	 * @param array    $posted Posted data.
478
-	 */
479
-	protected function ipn_txn_recurring_payment_suspended_due_to_max_failed_payment( $invoice ) {
473
+    /**
474
+     * Handles subscription suspensions.
475
+     *
476
+     * @param WPInv_Invoice $invoice  Invoice object.
477
+     * @param array    $posted Posted data.
478
+     */
479
+    protected function ipn_txn_recurring_payment_suspended_due_to_max_failed_payment( $invoice ) {
480 480
 
481
-		// Make sure the invoice has a subscription.
482
-		$subscription = getpaid_subscriptions()->get_invoice_subscription( $invoice );
481
+        // Make sure the invoice has a subscription.
482
+        $subscription = getpaid_subscriptions()->get_invoice_subscription( $invoice );
483 483
 
484
-		if ( empty( $subscription ) ) {
485
-			return wpinv_error_log( 'Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false );
486
-		}
487
-
488
-		wpinv_error_log( 'Processing subscription cancellation due to max failed payment for the invoice ' . $invoice->get_id(), false );
489
-		$subscription->cancel();
490
-		wpinv_error_log( 'Subscription cancelled.', false );
491
-	}
484
+        if ( empty( $subscription ) ) {
485
+            return wpinv_error_log( 'Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false );
486
+        }
487
+
488
+        wpinv_error_log( 'Processing subscription cancellation due to max failed payment for the invoice ' . $invoice->get_id(), false );
489
+        $subscription->cancel();
490
+        wpinv_error_log( 'Subscription cancelled.', false );
491
+    }
492 492
 
493 493
 }
Please login to merge, or discard this patch.
Spacing   +159 added lines, -159 removed lines patch added patch discarded remove patch
@@ -4,7 +4,7 @@  discard block
 block discarded – undo
4 4
  *
5 5
  */
6 6
 
7
-defined( 'ABSPATH' ) || exit;
7
+defined('ABSPATH') || exit;
8 8
 
9 9
 /**
10 10
  * Paypal Payment Gateway IPN handler class.
@@ -31,7 +31,7 @@  discard block
 block discarded – undo
31 31
 	 *
32 32
 	 * @param GetPaid_Paypal_Gateway $gateway
33 33
 	 */
34
-	public function __construct( $gateway ) {
34
+	public function __construct($gateway) {
35 35
 		$this->gateway = $gateway;
36 36
 		$this->verify_ipn();
37 37
 	}
@@ -43,37 +43,37 @@  discard block
 block discarded – undo
43 43
 	 */
44 44
 	public function verify_ipn() {
45 45
 
46
-		wpinv_error_log( 'GetPaid PayPal IPN Handler', false );
46
+		wpinv_error_log('GetPaid PayPal IPN Handler', false);
47 47
 
48 48
 		// Validate the IPN.
49
-		if ( empty( $_POST ) || ! $this->validate_ipn() ) {
50
-			wp_die( 'PayPal IPN Request Failure', 500 );
49
+		if (empty($_POST) || !$this->validate_ipn()) {
50
+			wp_die('PayPal IPN Request Failure', 500);
51 51
 		}
52 52
 
53 53
 		// Process the IPN.
54
-		$posted  = wp_unslash( $_POST );
55
-		$invoice = $this->get_ipn_invoice( $posted );
54
+		$posted  = wp_unslash($_POST);
55
+		$invoice = $this->get_ipn_invoice($posted);
56 56
 
57 57
 		// Abort if it was not paid by our gateway.
58
-		if ( $this->id != $invoice->get_gateway() ) {
59
-			wpinv_error_log( 'Aborting, Invoice was not paid via PayPal', false );
60
-			wp_die( 'Invoice not paid via PayPal', 200 );
58
+		if ($this->id != $invoice->get_gateway()) {
59
+			wpinv_error_log('Aborting, Invoice was not paid via PayPal', false);
60
+			wp_die('Invoice not paid via PayPal', 200);
61 61
 		}
62 62
 
63
-		$posted['payment_status'] = isset( $posted['payment_status'] ) ? sanitize_key( strtolower( $posted['payment_status'] ) ) : '';
64
-		$posted['txn_type']       = sanitize_key( strtolower( $posted['txn_type'] ) );
63
+		$posted['payment_status'] = isset($posted['payment_status']) ? sanitize_key(strtolower($posted['payment_status'])) : '';
64
+		$posted['txn_type']       = sanitize_key(strtolower($posted['txn_type']));
65 65
 
66
-		wpinv_error_log( 'Payment status:' . $posted['payment_status'], false );
67
-		wpinv_error_log( 'IPN Type:' . $posted['txn_type'], false );
66
+		wpinv_error_log('Payment status:' . $posted['payment_status'], false);
67
+		wpinv_error_log('IPN Type:' . $posted['txn_type'], false);
68 68
 
69
-		if ( method_exists( $this, 'ipn_txn_' . $posted['txn_type'] ) ) {
70
-			call_user_func( array( $this, 'ipn_txn_' . $posted['txn_type'] ), $invoice, $posted );
71
-			wpinv_error_log( 'Done processing IPN', false );
72
-			wp_die( 'Processed', 200 );
69
+		if (method_exists($this, 'ipn_txn_' . $posted['txn_type'])) {
70
+			call_user_func(array($this, 'ipn_txn_' . $posted['txn_type']), $invoice, $posted);
71
+			wpinv_error_log('Done processing IPN', false);
72
+			wp_die('Processed', 200);
73 73
 		}
74 74
 
75
-		wpinv_error_log( 'Aborting, Unsupported IPN type:' . $posted['txn_type'], false );
76
-		wp_die( 'Unsupported IPN type', 200 );
75
+		wpinv_error_log('Aborting, Unsupported IPN type:' . $posted['txn_type'], false);
76
+		wp_die('Unsupported IPN type', 200);
77 77
 
78 78
 	}
79 79
 
@@ -83,21 +83,21 @@  discard block
 block discarded – undo
83 83
 	 * @param array $posted
84 84
 	 * @return WPInv_Invoice
85 85
 	 */
86
-	protected function get_ipn_invoice( $posted ) {
86
+	protected function get_ipn_invoice($posted) {
87 87
 
88
-		wpinv_error_log( 'Retrieving PayPal IPN Response Invoice', false );
88
+		wpinv_error_log('Retrieving PayPal IPN Response Invoice', false);
89 89
 
90
-		if ( ! empty( $posted['custom'] ) ) {
91
-			$invoice = new WPInv_Invoice( $posted['custom'] );
90
+		if (!empty($posted['custom'])) {
91
+			$invoice = new WPInv_Invoice($posted['custom']);
92 92
 
93
-			if ( $invoice->exists() ) {
94
-				wpinv_error_log( 'Found invoice #' . $invoice->get_number(), false );
93
+			if ($invoice->exists()) {
94
+				wpinv_error_log('Found invoice #' . $invoice->get_number(), false);
95 95
 				return $invoice;
96 96
 			}
97 97
 		}
98 98
 
99
-		wpinv_error_log( 'Could not retrieve the associated invoice.', false );
100
-		wp_die( 'Could not retrieve the associated invoice.', 200 );
99
+		wpinv_error_log('Could not retrieve the associated invoice.', false);
100
+		wp_die('Could not retrieve the associated invoice.', 200);
101 101
 	}
102 102
 
103 103
 	/**
@@ -105,14 +105,14 @@  discard block
 block discarded – undo
105 105
 	 */
106 106
 	protected function validate_ipn() {
107 107
 
108
-		wpinv_error_log( 'Validating PayPal IPN response', false );
108
+		wpinv_error_log('Validating PayPal IPN response', false);
109 109
 
110 110
 		// Retrieve the associated invoice.
111
-		$posted  = wp_unslash( $_POST );
112
-		$invoice = $this->get_ipn_invoice( $posted );
111
+		$posted  = wp_unslash($_POST);
112
+		$invoice = $this->get_ipn_invoice($posted);
113 113
 
114
-		if ( $this->gateway->is_sandbox( $invoice ) ) {
115
-			wpinv_error_log( $posted, 'Invoice was processed in sandbox hence logging the posted data', false );
114
+		if ($this->gateway->is_sandbox($invoice)) {
115
+			wpinv_error_log($posted, 'Invoice was processed in sandbox hence logging the posted data', false);
116 116
 		}
117 117
 
118 118
 		// Validate the IPN.
@@ -129,25 +129,25 @@  discard block
 block discarded – undo
129 129
 		);
130 130
 
131 131
 		// Post back to get a response.
132
-		$response = wp_safe_remote_post( $this->gateway->is_sandbox( $invoice ) ? 'https://www.sandbox.paypal.com/cgi-bin/webscr' : 'https://www.paypal.com/cgi-bin/webscr', $params );
132
+		$response = wp_safe_remote_post($this->gateway->is_sandbox($invoice) ? 'https://www.sandbox.paypal.com/cgi-bin/webscr' : 'https://www.paypal.com/cgi-bin/webscr', $params);
133 133
 
134 134
 		// Check to see if the request was valid.
135
-		if ( ! is_wp_error( $response ) && $response['response']['code'] < 300 && strstr( $response['body'], 'VERIFIED' ) ) {
136
-			$invoice->add_note( 'Received valid response from PayPal IPN: ' . $response['body'], false, false, true );
137
-			wpinv_error_log( 'Received valid response from PayPal IPN: ' . $response['body'], false );
135
+		if (!is_wp_error($response) && $response['response']['code'] < 300 && strstr($response['body'], 'VERIFIED')) {
136
+			$invoice->add_note('Received valid response from PayPal IPN: ' . $response['body'], false, false, true);
137
+			wpinv_error_log('Received valid response from PayPal IPN: ' . $response['body'], false);
138 138
 			return true;
139 139
 		}
140 140
 
141
-		$invoice->add_note( 'IPN message:' . wp_json_encode( $posted ), false, false, true );
141
+		$invoice->add_note('IPN message:' . wp_json_encode($posted), false, false, true);
142 142
 
143
-		if ( is_wp_error( $response ) ) {
144
-			$invoice->add_note( 'Received invalid response from PayPal IPN: ' . $response->get_error_message(), false, false, true );
145
-			wpinv_error_log( $response->get_error_message(), 'Received invalid response from PayPal IPN' );
143
+		if (is_wp_error($response)) {
144
+			$invoice->add_note('Received invalid response from PayPal IPN: ' . $response->get_error_message(), false, false, true);
145
+			wpinv_error_log($response->get_error_message(), 'Received invalid response from PayPal IPN');
146 146
 			return false;
147 147
 		}
148 148
 
149
-		$invoice->add_note( 'Received invalid response from PayPal IPN: ' . $response['body'], false, false, true );
150
-		wpinv_error_log( $response['body'], 'Received invalid response from PayPal IPN' );
149
+		$invoice->add_note('Received invalid response from PayPal IPN: ' . $response['body'], false, false, true);
150
+		wpinv_error_log($response['body'], 'Received invalid response from PayPal IPN');
151 151
 		return false;
152 152
 
153 153
 	}
@@ -158,18 +158,18 @@  discard block
 block discarded – undo
158 158
 	 * @param WPInv_Invoice $invoice          Invoice object.
159 159
 	 * @param string   $currency currency to validate.
160 160
 	 */
161
-	protected function validate_ipn_currency( $invoice, $currency ) {
161
+	protected function validate_ipn_currency($invoice, $currency) {
162 162
 
163
-		if ( strtolower( $invoice->get_currency() ) !== strtolower( $currency ) ) {
163
+		if (strtolower($invoice->get_currency()) !== strtolower($currency)) {
164 164
 
165 165
 			/* translators: %s: currency code. */
166
-			$invoice->update_status( 'wpi-processing', wp_sprintf( __( 'Validation error: PayPal currencies do not match (code %s).', 'invoicing' ), $currency ) );
167
-			$invoice->add_note( wp_sprintf( __( 'Validation error: PayPal currencies do not match (code %s).', 'invoicing' ), $currency ), false, false, true );
166
+			$invoice->update_status('wpi-processing', wp_sprintf(__('Validation error: PayPal currencies do not match (code %s).', 'invoicing'), $currency));
167
+			$invoice->add_note(wp_sprintf(__('Validation error: PayPal currencies do not match (code %s).', 'invoicing'), $currency), false, false, true);
168 168
 
169
-			wpinv_error_log( "Currencies do not match: {$currency} instead of {$invoice->get_currency()}", 'IPN Error', __FILE__, __LINE__, true );
169
+			wpinv_error_log("Currencies do not match: {$currency} instead of {$invoice->get_currency()}", 'IPN Error', __FILE__, __LINE__, true);
170 170
 		}
171 171
 
172
-		wpinv_error_log( $currency, 'Validated IPN Currency', false );
172
+		wpinv_error_log($currency, 'Validated IPN Currency', false);
173 173
 	}
174 174
 
175 175
 	/**
@@ -178,17 +178,17 @@  discard block
 block discarded – undo
178 178
 	 * @param WPInv_Invoice $invoice          Invoice object.
179 179
 	 * @param float   $amount amount to validate.
180 180
 	 */
181
-	protected function validate_ipn_amount( $invoice, $amount ) {
182
-		if ( number_format( $invoice->get_total(), 2, '.', '' ) !== number_format( $amount, 2, '.', '' ) ) {
181
+	protected function validate_ipn_amount($invoice, $amount) {
182
+		if (number_format($invoice->get_total(), 2, '.', '') !== number_format($amount, 2, '.', '')) {
183 183
 
184 184
 			/* translators: %s: Amount. */
185
-			$invoice->update_status( 'wpi-processing', wp_sprintf( __( 'Validation error: PayPal amounts do not match (gross %s).', 'invoicing' ), $amount ) );
186
-			$invoice->add_note( wp_sprintf( __( 'Validation error: PayPal amounts do not match (gross %s).', 'invoicing' ), $amount ), false, false, true );
185
+			$invoice->update_status('wpi-processing', wp_sprintf(__('Validation error: PayPal amounts do not match (gross %s).', 'invoicing'), $amount));
186
+			$invoice->add_note(wp_sprintf(__('Validation error: PayPal amounts do not match (gross %s).', 'invoicing'), $amount), false, false, true);
187 187
 
188
-			wpinv_error_log( "Amounts do not match: {$amount} instead of {$invoice->get_total()}", 'IPN Error', __FILE__, __LINE__, true );
188
+			wpinv_error_log("Amounts do not match: {$amount} instead of {$invoice->get_total()}", 'IPN Error', __FILE__, __LINE__, true);
189 189
 		}
190 190
 
191
-		wpinv_error_log( $amount, 'Validated IPN Amount', false );
191
+		wpinv_error_log($amount, 'Validated IPN Amount', false);
192 192
 	}
193 193
 
194 194
 	/**
@@ -197,20 +197,20 @@  discard block
 block discarded – undo
197 197
 	 * @param WPInv_Invoice $invoice          Invoice object.
198 198
 	 * @param string   $receiver_email Email to validate.
199 199
 	 */
200
-	protected function validate_ipn_receiver_email( $invoice, $receiver_email ) {
201
-		$paypal_email = $this->gateway->is_sandbox( $invoice ) ? wpinv_get_option( 'paypal_sandbox_email', wpinv_get_option( 'paypal_email', '' ) ) : wpinv_get_option( 'paypal_email', '' );
200
+	protected function validate_ipn_receiver_email($invoice, $receiver_email) {
201
+		$paypal_email = $this->gateway->is_sandbox($invoice) ? wpinv_get_option('paypal_sandbox_email', wpinv_get_option('paypal_email', '')) : wpinv_get_option('paypal_email', '');
202 202
 
203
-		if ( $receiver_email && strcasecmp( trim( $receiver_email ), trim( $paypal_email ) ) !== 0 ) {
204
-			wpinv_record_gateway_error( 'IPN Error', "IPN Response is for another account: {$receiver_email}. Your PayPal email is {$paypal_email}." );
203
+		if ($receiver_email && strcasecmp(trim($receiver_email), trim($paypal_email)) !== 0) {
204
+			wpinv_record_gateway_error('IPN Error', "IPN Response is for another account: {$receiver_email}. Your PayPal email is {$paypal_email}.");
205 205
 
206 206
 			/* translators: %s: email address . */
207
-			$invoice->update_status( 'wpi-processing', wp_sprintf( __( 'Validation error: PayPal IPN response from a different email address (%s). Your PayPal email is %s.', 'invoicing' ), $receiver_email, $paypal_email ) );
208
-			$invoice->add_note( wp_sprintf( __( 'Validation error: PayPal IPN response from a different email address (%s). Your PayPal email is %s.', 'invoicing' ), $receiver_email, $paypal_email ), false, false, true );
207
+			$invoice->update_status('wpi-processing', wp_sprintf(__('Validation error: PayPal IPN response from a different email address (%s). Your PayPal email is %s.', 'invoicing'), $receiver_email, $paypal_email));
208
+			$invoice->add_note(wp_sprintf(__('Validation error: PayPal IPN response from a different email address (%s). Your PayPal email is %s.', 'invoicing'), $receiver_email, $paypal_email), false, false, true);
209 209
 
210
-			return wpinv_error_log( "IPN Response is for another account: {$receiver_email}. Your email PayPal is {$paypal_email}.", 'IPN Error', __FILE__, __LINE__, true );
210
+			return wpinv_error_log("IPN Response is for another account: {$receiver_email}. Your email PayPal is {$paypal_email}.", 'IPN Error', __FILE__, __LINE__, true);
211 211
 		}
212 212
 
213
-		wpinv_error_log( 'Validated PayPal Email', false );
213
+		wpinv_error_log('Validated PayPal Email', false);
214 214
 	}
215 215
 
216 216
 	/**
@@ -219,71 +219,71 @@  discard block
 block discarded – undo
219 219
 	 * @param WPInv_Invoice $invoice  Invoice object.
220 220
 	 * @param array    $posted Posted data.
221 221
 	 */
222
-	protected function ipn_txn_web_accept( $invoice, $posted ) {
222
+	protected function ipn_txn_web_accept($invoice, $posted) {
223 223
 
224 224
 		// Collect payment details
225
-		$payment_status = strtolower( $posted['payment_status'] );
226
-		$business_email = isset( $posted['business'] ) && is_email( $posted['business'] ) ? trim( $posted['business'] ) : trim( $posted['receiver_email'] );
225
+		$payment_status = strtolower($posted['payment_status']);
226
+		$business_email = isset($posted['business']) && is_email($posted['business']) ? trim($posted['business']) : trim($posted['receiver_email']);
227 227
 
228
-		$this->validate_ipn_receiver_email( $invoice, $business_email );
229
-		$this->validate_ipn_currency( $invoice, $posted['mc_currency'] );
228
+		$this->validate_ipn_receiver_email($invoice, $business_email);
229
+		$this->validate_ipn_currency($invoice, $posted['mc_currency']);
230 230
 
231 231
 		// Update the transaction id.
232
-		if ( ! empty( $posted['txn_id'] ) ) {
233
-			$invoice->set_transaction_id( wpinv_clean( $posted['txn_id'] ) );
232
+		if (!empty($posted['txn_id'])) {
233
+			$invoice->set_transaction_id(wpinv_clean($posted['txn_id']));
234 234
 			$invoice->save();
235 235
 		}
236 236
 
237
-		$invoice->add_system_note( __( 'Processing invoice IPN', 'invoicing' ) );
237
+		$invoice->add_system_note(__('Processing invoice IPN', 'invoicing'));
238 238
 
239 239
 		// Process a refund.
240
-		if ( 'refunded' === $payment_status || 'reversed' === $payment_status ) {
240
+		if ('refunded' === $payment_status || 'reversed' === $payment_status) {
241 241
 
242
-			update_post_meta( $invoice->get_id(), 'refunded_remotely', 1 );
242
+			update_post_meta($invoice->get_id(), 'refunded_remotely', 1);
243 243
 
244
-			if ( ! $invoice->is_refunded() ) {
245
-				$invoice->update_status( 'wpi-refunded', $posted['reason_code'] );
244
+			if (!$invoice->is_refunded()) {
245
+				$invoice->update_status('wpi-refunded', $posted['reason_code']);
246 246
 			}
247 247
 
248
-			return wpinv_error_log( $posted['reason_code'], false );
248
+			return wpinv_error_log($posted['reason_code'], false);
249 249
 		}
250 250
 
251 251
 		// Process payments.
252
-		if ( 'completed' === $payment_status ) {
252
+		if ('completed' === $payment_status) {
253 253
 
254
-			if ( $invoice->is_paid() && 'wpi_processing' != $invoice->get_status() ) {
255
-				return wpinv_error_log( 'Aborting, Invoice #' . $invoice->get_number() . ' is already paid.', false );
254
+			if ($invoice->is_paid() && 'wpi_processing' != $invoice->get_status()) {
255
+				return wpinv_error_log('Aborting, Invoice #' . $invoice->get_number() . ' is already paid.', false);
256 256
 			}
257 257
 
258
-			$this->validate_ipn_amount( $invoice, $posted['mc_gross'] );
258
+			$this->validate_ipn_amount($invoice, $posted['mc_gross']);
259 259
 
260 260
 			$note = '';
261 261
 
262
-			if ( ! empty( $posted['mc_fee'] ) ) {
263
-				$note = sprintf( __( 'PayPal Transaction Fee %s.', 'invoicing' ), sanitize_text_field( $posted['mc_fee'] ) );
262
+			if (!empty($posted['mc_fee'])) {
263
+				$note = sprintf(__('PayPal Transaction Fee %s.', 'invoicing'), sanitize_text_field($posted['mc_fee']));
264 264
 			}
265 265
 
266
-			if ( ! empty( $posted['payer_status'] ) ) {
267
-				$note = ' ' . sprintf( __( 'Buyer status %s.', 'invoicing' ), sanitize_text_field( $posted['payer_status'] ) );
266
+			if (!empty($posted['payer_status'])) {
267
+				$note = ' ' . sprintf(__('Buyer status %s.', 'invoicing'), sanitize_text_field($posted['payer_status']));
268 268
 			}
269 269
 
270
-			$invoice->mark_paid( ( ! empty( $posted['txn_id'] ) ? sanitize_text_field( $posted['txn_id'] ) : '' ), trim( $note ) );
271
-			return wpinv_error_log( 'Invoice marked as paid.', false );
270
+			$invoice->mark_paid((!empty($posted['txn_id']) ? sanitize_text_field($posted['txn_id']) : ''), trim($note));
271
+			return wpinv_error_log('Invoice marked as paid.', false);
272 272
 
273 273
 		}
274 274
 
275 275
 		// Pending payments.
276
-		if ( 'pending' === $payment_status ) {
276
+		if ('pending' === $payment_status) {
277 277
 
278 278
 			/* translators: %s: pending reason. */
279
-			$invoice->update_status( 'wpi-onhold', wp_sprintf( __( 'Payment pending (%s).', 'invoicing' ), $posted['pending_reason'] ) );
280
-			$invoice->add_note( wp_sprintf( __( 'Payment pending (%s).', 'invoicing' ), $posted['pending_reason'] ), false, false, true );
279
+			$invoice->update_status('wpi-onhold', wp_sprintf(__('Payment pending (%s).', 'invoicing'), $posted['pending_reason']));
280
+			$invoice->add_note(wp_sprintf(__('Payment pending (%s).', 'invoicing'), $posted['pending_reason']), false, false, true);
281 281
 
282
-			return wpinv_error_log( 'Invoice marked as "payment held".', false );
282
+			return wpinv_error_log('Invoice marked as "payment held".', false);
283 283
 		}
284 284
 
285 285
 		/* translators: %s: payment status. */
286
-		$invoice->update_status( 'wpi-failed', sprintf( __( 'Payment %s via IPN.', 'invoicing' ), sanitize_text_field( $posted['payment_status'] ) ) );
286
+		$invoice->update_status('wpi-failed', sprintf(__('Payment %s via IPN.', 'invoicing'), sanitize_text_field($posted['payment_status'])));
287 287
 
288 288
 	}
289 289
 
@@ -293,8 +293,8 @@  discard block
 block discarded – undo
293 293
 	 * @param WPInv_Invoice $invoice  Invoice object.
294 294
 	 * @param array    $posted Posted data.
295 295
 	 */
296
-	protected function ipn_txn_cart( $invoice, $posted ) {
297
-		$this->ipn_txn_web_accept( $invoice, $posted );
296
+	protected function ipn_txn_cart($invoice, $posted) {
297
+		$this->ipn_txn_web_accept($invoice, $posted);
298 298
 	}
299 299
 
300 300
 	/**
@@ -303,43 +303,43 @@  discard block
 block discarded – undo
303 303
 	 * @param WPInv_Invoice $invoice  Invoice object.
304 304
 	 * @param array    $posted Posted data.
305 305
 	 */
306
-	protected function ipn_txn_subscr_signup( $invoice, $posted ) {
306
+	protected function ipn_txn_subscr_signup($invoice, $posted) {
307 307
 
308
-		wpinv_error_log( 'Processing subscription signup', false );
308
+		wpinv_error_log('Processing subscription signup', false);
309 309
 
310 310
 		// Make sure the invoice has a subscription.
311
-		$subscription = getpaid_get_invoice_subscription( $invoice );
311
+		$subscription = getpaid_get_invoice_subscription($invoice);
312 312
 
313
-		if ( empty( $subscription ) ) {
314
-			return wpinv_error_log( 'Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false );
313
+		if (empty($subscription)) {
314
+			return wpinv_error_log('Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false);
315 315
 		}
316 316
 
317
-		wpinv_error_log( 'Found subscription #' . $subscription->get_id(), false );
317
+		wpinv_error_log('Found subscription #' . $subscription->get_id(), false);
318 318
 
319 319
 		// Validate the IPN.
320
-		$business_email = isset( $posted['business'] ) && is_email( $posted['business'] ) ? trim( $posted['business'] ) : trim( $posted['receiver_email'] );
321
-		$this->validate_ipn_receiver_email( $invoice, $business_email );
322
-		$this->validate_ipn_currency( $invoice, $posted['mc_currency'] );
320
+		$business_email = isset($posted['business']) && is_email($posted['business']) ? trim($posted['business']) : trim($posted['receiver_email']);
321
+		$this->validate_ipn_receiver_email($invoice, $business_email);
322
+		$this->validate_ipn_currency($invoice, $posted['mc_currency']);
323 323
 
324 324
 		// Activate the subscription.
325
-		$duration = strtotime( $subscription->get_expiration() ) - strtotime( $subscription->get_date_created() );
326
-		$subscription->set_date_created( current_time( 'mysql' ) );
327
-		$subscription->set_expiration( date( 'Y-m-d H:i:s', ( current_time( 'timestamp' ) + $duration ) ) );
328
-		$subscription->set_profile_id( sanitize_text_field( $posted['subscr_id'] ) );
325
+		$duration = strtotime($subscription->get_expiration()) - strtotime($subscription->get_date_created());
326
+		$subscription->set_date_created(current_time('mysql'));
327
+		$subscription->set_expiration(date('Y-m-d H:i:s', (current_time('timestamp') + $duration)));
328
+		$subscription->set_profile_id(sanitize_text_field($posted['subscr_id']));
329 329
 		$subscription->activate();
330 330
 
331 331
 		// Set the transaction id.
332
-		if ( ! empty( $posted['txn_id'] ) ) {
333
-			$invoice->add_note( sprintf( __( 'PayPal Transaction ID: %s', 'invoicing' ), $posted['txn_id'] ), false, false, true );
334
-			$invoice->set_transaction_id( $posted['txn_id'] );
332
+		if (!empty($posted['txn_id'])) {
333
+			$invoice->add_note(sprintf(__('PayPal Transaction ID: %s', 'invoicing'), $posted['txn_id']), false, false, true);
334
+			$invoice->set_transaction_id($posted['txn_id']);
335 335
 		}
336 336
 
337 337
 		// Update the payment status.
338 338
 		$invoice->mark_paid();
339 339
 
340
-		$invoice->add_note( sprintf( __( 'PayPal Subscription ID: %s', 'invoicing' ), $posted['subscr_id'] ), false, false, true );
340
+		$invoice->add_note(sprintf(__('PayPal Subscription ID: %s', 'invoicing'), $posted['subscr_id']), false, false, true);
341 341
 
342
-		wpinv_error_log( 'Subscription started.', false );
342
+		wpinv_error_log('Subscription started.', false);
343 343
 	}
344 344
 
345 345
 	/**
@@ -348,45 +348,45 @@  discard block
 block discarded – undo
348 348
 	 * @param WPInv_Invoice $invoice  Invoice object.
349 349
 	 * @param array    $posted Posted data.
350 350
 	 */
351
-	protected function ipn_txn_subscr_payment( $invoice, $posted ) {
351
+	protected function ipn_txn_subscr_payment($invoice, $posted) {
352 352
 
353 353
 		// Make sure the invoice has a subscription.
354
-		$subscription = getpaid_subscriptions()->get_invoice_subscription( $invoice );
354
+		$subscription = getpaid_subscriptions()->get_invoice_subscription($invoice);
355 355
 
356
-		if ( empty( $subscription ) ) {
357
-			return wpinv_error_log( 'Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false );
356
+		if (empty($subscription)) {
357
+			return wpinv_error_log('Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false);
358 358
 		}
359 359
 
360
-		wpinv_error_log( 'Found subscription #' . $subscription->get_id(), false );
360
+		wpinv_error_log('Found subscription #' . $subscription->get_id(), false);
361 361
 
362 362
 		// PayPal sends a subscr_payment for the first payment too.
363
-		$date_completed = getpaid_format_date( $invoice->get_date_completed() );
364
-		$date_created   = getpaid_format_date( $invoice->get_date_created() );
365
-		$today_date     = getpaid_format_date( current_time( 'mysql' ) );
366
-		$payment_date   = getpaid_format_date( $posted['payment_date'] );
367
-		$subscribe_date = getpaid_format_date( $subscription->get_date_created() );
368
-		$dates          = array_filter( compact( 'date_completed', 'date_created', 'subscribe_date' ) );
363
+		$date_completed = getpaid_format_date($invoice->get_date_completed());
364
+		$date_created   = getpaid_format_date($invoice->get_date_created());
365
+		$today_date     = getpaid_format_date(current_time('mysql'));
366
+		$payment_date   = getpaid_format_date($posted['payment_date']);
367
+		$subscribe_date = getpaid_format_date($subscription->get_date_created());
368
+		$dates          = array_filter(compact('date_completed', 'date_created', 'subscribe_date'));
369 369
 
370
-		foreach ( $dates as $date ) {
370
+		foreach ($dates as $date) {
371 371
 
372
-			if ( $date !== $today_date && $date !== $payment_date ) {
372
+			if ($date !== $today_date && $date !== $payment_date) {
373 373
 				continue;
374 374
 			}
375 375
 
376
-			if ( ! empty( $posted['txn_id'] ) ) {
377
-				$invoice->set_transaction_id( sanitize_text_field( $posted['txn_id'] ) );
378
-				$invoice->add_note( wp_sprintf( __( 'PayPal Transaction ID: %s', 'invoicing' ), sanitize_text_field( $posted['txn_id'] ) ), false, false, true );
376
+			if (!empty($posted['txn_id'])) {
377
+				$invoice->set_transaction_id(sanitize_text_field($posted['txn_id']));
378
+				$invoice->add_note(wp_sprintf(__('PayPal Transaction ID: %s', 'invoicing'), sanitize_text_field($posted['txn_id'])), false, false, true);
379 379
 			}
380 380
 
381 381
 			return $invoice->mark_paid();
382 382
 
383 383
 		}
384 384
 
385
-		wpinv_error_log( 'Processing subscription renewal payment for the invoice ' . $invoice->get_id(), false );
385
+		wpinv_error_log('Processing subscription renewal payment for the invoice ' . $invoice->get_id(), false);
386 386
 
387 387
 		// Abort if the payment is already recorded.
388
-		if ( wpinv_get_id_by_transaction_id( $posted['txn_id'] ) ) {
389
-			return wpinv_error_log( 'Aborting, Transaction ' . $posted['txn_id'] . ' has already been processed', false );
388
+		if (wpinv_get_id_by_transaction_id($posted['txn_id'])) {
389
+			return wpinv_error_log('Aborting, Transaction ' . $posted['txn_id'] . ' has already been processed', false);
390 390
 		}
391 391
 
392 392
 		$args = array(
@@ -394,17 +394,17 @@  discard block
 block discarded – undo
394 394
 			'gateway'        => $this->id,
395 395
 		);
396 396
 
397
-		$invoice = wpinv_get_invoice( $subscription->add_payment( $args ) );
397
+		$invoice = wpinv_get_invoice($subscription->add_payment($args));
398 398
 
399
-		if ( empty( $invoice ) ) {
399
+		if (empty($invoice)) {
400 400
 			return;
401 401
 		}
402 402
 
403
-		$invoice->add_note( wp_sprintf( __( 'PayPal Transaction ID: %s', 'invoicing' ), $posted['txn_id'] ), false, false, true );
404
-		$invoice->add_note( wp_sprintf( __( 'PayPal Subscription ID: %s', 'invoicing' ), $posted['subscr_id'] ), false, false, true );
403
+		$invoice->add_note(wp_sprintf(__('PayPal Transaction ID: %s', 'invoicing'), $posted['txn_id']), false, false, true);
404
+		$invoice->add_note(wp_sprintf(__('PayPal Subscription ID: %s', 'invoicing'), $posted['subscr_id']), false, false, true);
405 405
 
406 406
 		$subscription->renew();
407
-		wpinv_error_log( 'Subscription renewed.', false );
407
+		wpinv_error_log('Subscription renewed.', false);
408 408
 
409 409
 	}
410 410
 
@@ -413,18 +413,18 @@  discard block
 block discarded – undo
413 413
 	 *
414 414
 	 * @param WPInv_Invoice $invoice  Invoice object.
415 415
 	 */
416
-	protected function ipn_txn_subscr_cancel( $invoice ) {
416
+	protected function ipn_txn_subscr_cancel($invoice) {
417 417
 
418 418
 		// Make sure the invoice has a subscription.
419
-		$subscription = getpaid_subscriptions()->get_invoice_subscription( $invoice );
419
+		$subscription = getpaid_subscriptions()->get_invoice_subscription($invoice);
420 420
 
421
-		if ( empty( $subscription ) ) {
422
-			return wpinv_error_log( 'Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false );
421
+		if (empty($subscription)) {
422
+			return wpinv_error_log('Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false);
423 423
 		}
424 424
 
425
-		wpinv_error_log( 'Processing subscription cancellation for the invoice ' . $invoice->get_id(), false );
425
+		wpinv_error_log('Processing subscription cancellation for the invoice ' . $invoice->get_id(), false);
426 426
 		$subscription->cancel();
427
-		wpinv_error_log( 'Subscription cancelled.', false );
427
+		wpinv_error_log('Subscription cancelled.', false);
428 428
 
429 429
 	}
430 430
 
@@ -434,18 +434,18 @@  discard block
 block discarded – undo
434 434
 	 * @param WPInv_Invoice $invoice  Invoice object.
435 435
 	 * @param array    $posted Posted data.
436 436
 	 */
437
-	protected function ipn_txn_subscr_eot( $invoice ) {
437
+	protected function ipn_txn_subscr_eot($invoice) {
438 438
 
439 439
 		// Make sure the invoice has a subscription.
440
-		$subscription = getpaid_subscriptions()->get_invoice_subscription( $invoice );
440
+		$subscription = getpaid_subscriptions()->get_invoice_subscription($invoice);
441 441
 
442
-		if ( empty( $subscription ) ) {
443
-			return wpinv_error_log( 'Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false );
442
+		if (empty($subscription)) {
443
+			return wpinv_error_log('Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false);
444 444
 		}
445 445
 
446
-		wpinv_error_log( 'Processing subscription end of life for the invoice ' . $invoice->get_id(), false );
446
+		wpinv_error_log('Processing subscription end of life for the invoice ' . $invoice->get_id(), false);
447 447
 		$subscription->complete();
448
-		wpinv_error_log( 'Subscription completed.', false );
448
+		wpinv_error_log('Subscription completed.', false);
449 449
 
450 450
 	}
451 451
 
@@ -455,18 +455,18 @@  discard block
 block discarded – undo
455 455
 	 * @param WPInv_Invoice $invoice  Invoice object.
456 456
 	 * @param array    $posted Posted data.
457 457
 	 */
458
-	protected function ipn_txn_subscr_failed( $invoice ) {
458
+	protected function ipn_txn_subscr_failed($invoice) {
459 459
 
460 460
 		// Make sure the invoice has a subscription.
461
-		$subscription = getpaid_subscriptions()->get_invoice_subscription( $invoice );
461
+		$subscription = getpaid_subscriptions()->get_invoice_subscription($invoice);
462 462
 
463
-		if ( empty( $subscription ) ) {
464
-			return wpinv_error_log( 'Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false );
463
+		if (empty($subscription)) {
464
+			return wpinv_error_log('Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false);
465 465
 		}
466 466
 
467
-		wpinv_error_log( 'Processing subscription payment failure for the invoice ' . $invoice->get_id(), false );
467
+		wpinv_error_log('Processing subscription payment failure for the invoice ' . $invoice->get_id(), false);
468 468
 		$subscription->failing();
469
-		wpinv_error_log( 'Subscription marked as failing.', false );
469
+		wpinv_error_log('Subscription marked as failing.', false);
470 470
 
471 471
 	}
472 472
 
@@ -476,18 +476,18 @@  discard block
 block discarded – undo
476 476
 	 * @param WPInv_Invoice $invoice  Invoice object.
477 477
 	 * @param array    $posted Posted data.
478 478
 	 */
479
-	protected function ipn_txn_recurring_payment_suspended_due_to_max_failed_payment( $invoice ) {
479
+	protected function ipn_txn_recurring_payment_suspended_due_to_max_failed_payment($invoice) {
480 480
 
481 481
 		// Make sure the invoice has a subscription.
482
-		$subscription = getpaid_subscriptions()->get_invoice_subscription( $invoice );
482
+		$subscription = getpaid_subscriptions()->get_invoice_subscription($invoice);
483 483
 
484
-		if ( empty( $subscription ) ) {
485
-			return wpinv_error_log( 'Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false );
484
+		if (empty($subscription)) {
485
+			return wpinv_error_log('Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false);
486 486
 		}
487 487
 
488
-		wpinv_error_log( 'Processing subscription cancellation due to max failed payment for the invoice ' . $invoice->get_id(), false );
488
+		wpinv_error_log('Processing subscription cancellation due to max failed payment for the invoice ' . $invoice->get_id(), false);
489 489
 		$subscription->cancel();
490
-		wpinv_error_log( 'Subscription cancelled.', false );
490
+		wpinv_error_log('Subscription cancelled.', false);
491 491
 	}
492 492
 
493 493
 }
Please login to merge, or discard this patch.
includes/gateways/class-getpaid-paypal-gateway.php 2 patches
Indentation   +404 added lines, -404 removed lines patch added patch discarded remove patch
@@ -13,97 +13,97 @@  discard block
 block discarded – undo
13 13
 class GetPaid_Paypal_Gateway extends GetPaid_Payment_Gateway {
14 14
 
15 15
     /**
16
-	 * Payment method id.
17
-	 *
18
-	 * @var string
19
-	 */
16
+     * Payment method id.
17
+     *
18
+     * @var string
19
+     */
20 20
     public $id = 'paypal';
21 21
 
22 22
     /**
23
-	 * An array of features that this gateway supports.
24
-	 *
25
-	 * @var array
26
-	 */
23
+     * An array of features that this gateway supports.
24
+     *
25
+     * @var array
26
+     */
27 27
     protected $supports = array( 'subscription', 'sandbox', 'single_subscription_group' );
28 28
 
29 29
     /**
30
-	 * Payment method order.
31
-	 *
32
-	 * @var int
33
-	 */
30
+     * Payment method order.
31
+     *
32
+     * @var int
33
+     */
34 34
     public $order = 1;
35 35
 
36 36
     /**
37
-	 * Stores line items to send to PayPal.
38
-	 *
39
-	 * @var array
40
-	 */
37
+     * Stores line items to send to PayPal.
38
+     *
39
+     * @var array
40
+     */
41 41
     protected $line_items = array();
42 42
 
43 43
     /**
44
-	 * Endpoint for requests from PayPal.
45
-	 *
46
-	 * @var string
47
-	 */
48
-	protected $notify_url;
49
-
50
-	/**
51
-	 * Endpoint for requests to PayPal.
52
-	 *
53
-	 * @var string
54
-	 */
44
+     * Endpoint for requests from PayPal.
45
+     *
46
+     * @var string
47
+     */
48
+    protected $notify_url;
49
+
50
+    /**
51
+     * Endpoint for requests to PayPal.
52
+     *
53
+     * @var string
54
+     */
55 55
     protected $endpoint;
56 56
 
57 57
     /**
58
-	 * Currencies this gateway is allowed for.
59
-	 *
60
-	 * @var array
61
-	 */
62
-	public $currencies = array( 'AUD', 'BRL', 'CAD', 'MXN', 'NZD', 'HKD', 'SGD', 'USD', 'EUR', 'JPY', 'TRY', 'NOK', 'CZK', 'DKK', 'HUF', 'ILS', 'MYR', 'PHP', 'PLN', 'SEK', 'CHF', 'TWD', 'THB', 'GBP', 'RMB', 'RUB', 'INR' );
58
+     * Currencies this gateway is allowed for.
59
+     *
60
+     * @var array
61
+     */
62
+    public $currencies = array( 'AUD', 'BRL', 'CAD', 'MXN', 'NZD', 'HKD', 'SGD', 'USD', 'EUR', 'JPY', 'TRY', 'NOK', 'CZK', 'DKK', 'HUF', 'ILS', 'MYR', 'PHP', 'PLN', 'SEK', 'CHF', 'TWD', 'THB', 'GBP', 'RMB', 'RUB', 'INR' );
63 63
 
64 64
     /**
65
-	 * URL to view a transaction.
66
-	 *
67
-	 * @var string
68
-	 */
65
+     * URL to view a transaction.
66
+     *
67
+     * @var string
68
+     */
69 69
     public $view_transaction_url = 'https://www.{sandbox}paypal.com/activity/payment/%s';
70 70
 
71 71
     /**
72
-	 * URL to view a subscription.
73
-	 *
74
-	 * @var string
75
-	 */
76
-	public $view_subscription_url = 'https://www.{sandbox}paypal.com/cgi-bin/webscr?cmd=_profile-recurring-payments&encrypted_profile_id=%s';
72
+     * URL to view a subscription.
73
+     *
74
+     * @var string
75
+     */
76
+    public $view_subscription_url = 'https://www.{sandbox}paypal.com/cgi-bin/webscr?cmd=_profile-recurring-payments&encrypted_profile_id=%s';
77 77
 
78 78
     /**
79
-	 * Class constructor.
80
-	 */
81
-	public function __construct() {
79
+     * Class constructor.
80
+     */
81
+    public function __construct() {
82 82
 
83 83
         $this->title                = __( 'PayPal Standard', 'invoicing' );
84 84
         $this->method_title         = __( 'PayPal Standard', 'invoicing' );
85 85
         $this->checkout_button_text = __( 'Proceed to PayPal', 'invoicing' );
86 86
         $this->notify_url           = wpinv_get_ipn_url( $this->id );
87 87
 
88
-		add_filter( 'wpinv_subscription_cancel_url', array( $this, 'filter_cancel_subscription_url' ), 10, 2 );
89
-		add_filter( 'getpaid_paypal_args', array( $this, 'process_subscription' ), 10, 2 );
88
+        add_filter( 'wpinv_subscription_cancel_url', array( $this, 'filter_cancel_subscription_url' ), 10, 2 );
89
+        add_filter( 'getpaid_paypal_args', array( $this, 'process_subscription' ), 10, 2 );
90 90
         add_filter( 'getpaid_paypal_sandbox_notice', array( $this, 'sandbox_notice' ) );
91
-		add_filter( 'getpaid_get_paypal_connect_url', array( $this, 'maybe_get_connect_url' ), 10, 2 );
92
-		add_action( 'getpaid_authenticated_admin_action_connect_paypal', array( $this, 'connect_paypal' ) );
93
-		add_action( 'wpinv_paypal_connect', array( $this, 'display_connect_buttons' ) );
94
-		parent::__construct();
91
+        add_filter( 'getpaid_get_paypal_connect_url', array( $this, 'maybe_get_connect_url' ), 10, 2 );
92
+        add_action( 'getpaid_authenticated_admin_action_connect_paypal', array( $this, 'connect_paypal' ) );
93
+        add_action( 'wpinv_paypal_connect', array( $this, 'display_connect_buttons' ) );
94
+        parent::__construct();
95 95
     }
96 96
 
97 97
     /**
98
-	 * Process Payment.
99
-	 *
100
-	 *
101
-	 * @param WPInv_Invoice $invoice Invoice.
102
-	 * @param array $submission_data Posted checkout fields.
103
-	 * @param GetPaid_Payment_Form_Submission $submission Checkout submission.
104
-	 * @return array
105
-	 */
106
-	public function process_payment( $invoice, $submission_data, $submission ) {
98
+     * Process Payment.
99
+     *
100
+     *
101
+     * @param WPInv_Invoice $invoice Invoice.
102
+     * @param array $submission_data Posted checkout fields.
103
+     * @param GetPaid_Payment_Form_Submission $submission Checkout submission.
104
+     * @return array
105
+     */
106
+    public function process_payment( $invoice, $submission_data, $submission ) {
107 107
 
108 108
         // Get redirect url.
109 109
         $paypal_redirect = $this->get_request_url( $invoice );
@@ -126,15 +126,15 @@  discard block
 block discarded – undo
126 126
     }
127 127
 
128 128
     /**
129
-	 * Get the PayPal request URL for an invoice.
130
-	 *
131
-	 * @param  WPInv_Invoice $invoice Invoice object.
132
-	 * @return string
133
-	 */
134
-	public function get_request_url( $invoice ) {
129
+     * Get the PayPal request URL for an invoice.
130
+     *
131
+     * @param  WPInv_Invoice $invoice Invoice object.
132
+     * @return string
133
+     */
134
+    public function get_request_url( $invoice ) {
135 135
 
136 136
         // Endpoint for this request
137
-		$this->endpoint    = $this->is_sandbox( $invoice ) ? 'https://www.sandbox.paypal.com/cgi-bin/webscr?test_ipn=1&' : 'https://www.paypal.com/cgi-bin/webscr?';
137
+        $this->endpoint    = $this->is_sandbox( $invoice ) ? 'https://www.sandbox.paypal.com/cgi-bin/webscr?test_ipn=1&' : 'https://www.paypal.com/cgi-bin/webscr?';
138 138
 
139 139
         // Retrieve paypal args.
140 140
         $paypal_args       = map_deep( $this->get_paypal_args( $invoice ), 'urlencode' );
@@ -147,45 +147,45 @@  discard block
 block discarded – undo
147 147
 
148 148
         return add_query_arg( $paypal_args, $this->endpoint );
149 149
 
150
-	}
150
+    }
151 151
 
152 152
     /**
153
-	 * Get PayPal Args for passing to PP.
154
-	 *
155
-	 * @param  WPInv_Invoice $invoice Invoice object.
156
-	 * @return array
157
-	 */
158
-	protected function get_paypal_args( $invoice ) {
153
+     * Get PayPal Args for passing to PP.
154
+     *
155
+     * @param  WPInv_Invoice $invoice Invoice object.
156
+     * @return array
157
+     */
158
+    protected function get_paypal_args( $invoice ) {
159 159
 
160 160
         // Whether or not to send the line items as one item.
161
-		$force_one_line_item = apply_filters( 'getpaid_paypal_force_one_line_item', true, $invoice );
162
-
163
-		if ( $invoice->is_recurring() || ( wpinv_use_taxes() && wpinv_prices_include_tax() ) ) {
164
-			$force_one_line_item = true;
165
-		}
166
-
167
-		$paypal_args = apply_filters(
168
-			'getpaid_paypal_args',
169
-			array_merge(
170
-				$this->get_transaction_args( $invoice ),
171
-				$this->get_line_item_args( $invoice, $force_one_line_item )
172
-			),
173
-			$invoice
174
-		);
175
-
176
-		return $this->fix_request_length( $invoice, $paypal_args );
161
+        $force_one_line_item = apply_filters( 'getpaid_paypal_force_one_line_item', true, $invoice );
162
+
163
+        if ( $invoice->is_recurring() || ( wpinv_use_taxes() && wpinv_prices_include_tax() ) ) {
164
+            $force_one_line_item = true;
165
+        }
166
+
167
+        $paypal_args = apply_filters(
168
+            'getpaid_paypal_args',
169
+            array_merge(
170
+                $this->get_transaction_args( $invoice ),
171
+                $this->get_line_item_args( $invoice, $force_one_line_item )
172
+            ),
173
+            $invoice
174
+        );
175
+
176
+        return $this->fix_request_length( $invoice, $paypal_args );
177 177
     }
178 178
 
179 179
     /**
180
-	 * Get transaction args for paypal request.
181
-	 *
182
-	 * @param WPInv_Invoice $invoice Invoice object.
183
-	 * @return array
184
-	 */
185
-	protected function get_transaction_args( $invoice ) {
186
-
187
-		$email = $this->is_sandbox( $invoice ) ? wpinv_get_option( 'paypal_sandbox_email', wpinv_get_option( 'paypal_email', '' ) ) : wpinv_get_option( 'paypal_email', '' );
188
-		return array(
180
+     * Get transaction args for paypal request.
181
+     *
182
+     * @param WPInv_Invoice $invoice Invoice object.
183
+     * @return array
184
+     */
185
+    protected function get_transaction_args( $invoice ) {
186
+
187
+        $email = $this->is_sandbox( $invoice ) ? wpinv_get_option( 'paypal_sandbox_email', wpinv_get_option( 'paypal_email', '' ) ) : wpinv_get_option( 'paypal_email', '' );
188
+        return array(
189 189
             'cmd'           => '_cart',
190 190
             'business'      => $email,
191 191
             'no_shipping'   => '1',
@@ -210,16 +210,16 @@  discard block
 block discarded – undo
210 210
     }
211 211
 
212 212
     /**
213
-	 * Get line item args for paypal request.
214
-	 *
215
-	 * @param  WPInv_Invoice $invoice Invoice object.
216
-	 * @param  bool     $force_one_line_item Create only one item for this invoice.
217
-	 * @return array
218
-	 */
219
-	protected function get_line_item_args( $invoice, $force_one_line_item = false ) {
213
+     * Get line item args for paypal request.
214
+     *
215
+     * @param  WPInv_Invoice $invoice Invoice object.
216
+     * @param  bool     $force_one_line_item Create only one item for this invoice.
217
+     * @return array
218
+     */
219
+    protected function get_line_item_args( $invoice, $force_one_line_item = false ) {
220 220
 
221 221
         // Maybe send invoice as a single item.
222
-		if ( $force_one_line_item ) {
222
+        if ( $force_one_line_item ) {
223 223
             return $this->get_line_item_args_single_item( $invoice );
224 224
         }
225 225
 
@@ -239,134 +239,134 @@  discard block
 block discarded – undo
239 239
             $line_item_args['discount_amount_cart'] = wpinv_sanitize_amount( (float) $invoice->get_total_discount(), 2 );
240 240
         }
241 241
 
242
-		return array_merge( $line_item_args, $this->get_line_items() );
242
+        return array_merge( $line_item_args, $this->get_line_items() );
243 243
 
244 244
     }
245 245
 
246 246
     /**
247
-	 * Get line item args for paypal request as a single line item.
248
-	 *
249
-	 * @param  WPInv_Invoice $invoice Invoice object.
250
-	 * @return array
251
-	 */
252
-	protected function get_line_item_args_single_item( $invoice ) {
253
-		$this->delete_line_items();
247
+     * Get line item args for paypal request as a single line item.
248
+     *
249
+     * @param  WPInv_Invoice $invoice Invoice object.
250
+     * @return array
251
+     */
252
+    protected function get_line_item_args_single_item( $invoice ) {
253
+        $this->delete_line_items();
254 254
 
255 255
         $item_name = wp_sprintf( __( 'Invoice %s', 'invoicing' ), $invoice->get_number() );
256
-		$this->add_line_item( $item_name, 1, wpinv_round_amount( (float) $invoice->get_total(), 2, true ), $invoice->get_id() );
256
+        $this->add_line_item( $item_name, 1, wpinv_round_amount( (float) $invoice->get_total(), 2, true ), $invoice->get_id() );
257 257
 
258
-		return $this->get_line_items();
258
+        return $this->get_line_items();
259 259
     }
260 260
 
261 261
     /**
262
-	 * Return all line items.
263
-	 */
264
-	protected function get_line_items() {
265
-		return $this->line_items;
266
-	}
262
+     * Return all line items.
263
+     */
264
+    protected function get_line_items() {
265
+        return $this->line_items;
266
+    }
267 267
 
268 268
     /**
269
-	 * Remove all line items.
270
-	 */
271
-	protected function delete_line_items() {
272
-		$this->line_items = array();
269
+     * Remove all line items.
270
+     */
271
+    protected function delete_line_items() {
272
+        $this->line_items = array();
273 273
     }
274 274
 
275 275
     /**
276
-	 * Prepare line items to send to paypal.
277
-	 *
278
-	 * @param  WPInv_Invoice $invoice Invoice object.
279
-	 */
280
-	protected function prepare_line_items( $invoice ) {
281
-		$this->delete_line_items();
282
-
283
-		// Items.
284
-		foreach ( $invoice->get_items() as $item ) {
285
-			$amount   = $item->get_price();
286
-			$quantity = $invoice->get_template() == 'amount' ? 1 : $item->get_quantity();
287
-			$this->add_line_item( $item->get_raw_name(), $quantity, $amount, $item->get_id() );
276
+     * Prepare line items to send to paypal.
277
+     *
278
+     * @param  WPInv_Invoice $invoice Invoice object.
279
+     */
280
+    protected function prepare_line_items( $invoice ) {
281
+        $this->delete_line_items();
282
+
283
+        // Items.
284
+        foreach ( $invoice->get_items() as $item ) {
285
+            $amount   = $item->get_price();
286
+            $quantity = $invoice->get_template() == 'amount' ? 1 : $item->get_quantity();
287
+            $this->add_line_item( $item->get_raw_name(), $quantity, $amount, $item->get_id() );
288 288
         }
289 289
 
290 290
         // Fees.
291
-		foreach ( $invoice->get_fees() as $fee => $data ) {
291
+        foreach ( $invoice->get_fees() as $fee => $data ) {
292 292
             $this->add_line_item( $fee, 1, wpinv_sanitize_amount( $data['initial_fee'] ) );
293 293
         }
294 294
 
295 295
     }
296 296
 
297 297
     /**
298
-	 * Add PayPal Line Item.
299
-	 *
300
-	 * @param  string $item_name Item name.
301
-	 * @param  float    $quantity Item quantity.
302
-	 * @param  float  $amount Amount.
303
-	 * @param  string $item_number Item number.
304
-	 */
305
-	protected function add_line_item( $item_name, $quantity = 1, $amount = 0.0, $item_number = '' ) {
306
-		$index = ( count( $this->line_items ) / 4 ) + 1;
307
-
308
-		/**
309
-		 * Prevent error "Things don't appear to be working at the moment. (https://www.sandbox.paypal.com/webapps/hermes/error)"
310
-		 */
311
-		$item_name = str_replace( "#", "", $item_name );
312
-
313
-		$item = apply_filters(
314
-			'getpaid_paypal_line_item',
315
-			array(
316
-				'item_name'   => html_entity_decode( getpaid_limit_length( $item_name ? wp_strip_all_tags( $item_name ) : __( 'Item', 'invoicing' ), 127 ), ENT_NOQUOTES, 'UTF-8' ),
317
-				'quantity'    => (float) $quantity,
318
-				'amount'      => wpinv_sanitize_amount( (float) $amount, 2 ),
319
-				'item_number' => $item_number,
320
-			),
321
-			$item_name,
322
-			$quantity,
323
-			$amount,
324
-			$item_number
325
-		);
326
-
327
-		$this->line_items[ 'item_name_' . $index ]   = getpaid_limit_length( $item['item_name'], 127 );
298
+     * Add PayPal Line Item.
299
+     *
300
+     * @param  string $item_name Item name.
301
+     * @param  float    $quantity Item quantity.
302
+     * @param  float  $amount Amount.
303
+     * @param  string $item_number Item number.
304
+     */
305
+    protected function add_line_item( $item_name, $quantity = 1, $amount = 0.0, $item_number = '' ) {
306
+        $index = ( count( $this->line_items ) / 4 ) + 1;
307
+
308
+        /**
309
+         * Prevent error "Things don't appear to be working at the moment. (https://www.sandbox.paypal.com/webapps/hermes/error)"
310
+         */
311
+        $item_name = str_replace( "#", "", $item_name );
312
+
313
+        $item = apply_filters(
314
+            'getpaid_paypal_line_item',
315
+            array(
316
+                'item_name'   => html_entity_decode( getpaid_limit_length( $item_name ? wp_strip_all_tags( $item_name ) : __( 'Item', 'invoicing' ), 127 ), ENT_NOQUOTES, 'UTF-8' ),
317
+                'quantity'    => (float) $quantity,
318
+                'amount'      => wpinv_sanitize_amount( (float) $amount, 2 ),
319
+                'item_number' => $item_number,
320
+            ),
321
+            $item_name,
322
+            $quantity,
323
+            $amount,
324
+            $item_number
325
+        );
326
+
327
+        $this->line_items[ 'item_name_' . $index ]   = getpaid_limit_length( $item['item_name'], 127 );
328 328
         $this->line_items[ 'quantity_' . $index ]    = $item['quantity'];
329 329
 
330 330
         // The price or amount of the product, service, or contribution, not including shipping, handling, or tax.
331
-		$this->line_items[ 'amount_' . $index ]      = $item['amount'] * $item['quantity'];
332
-		$this->line_items[ 'item_number_' . $index ] = getpaid_limit_length( $item['item_number'], 127 );
331
+        $this->line_items[ 'amount_' . $index ]      = $item['amount'] * $item['quantity'];
332
+        $this->line_items[ 'item_number_' . $index ] = getpaid_limit_length( $item['item_number'], 127 );
333 333
     }
334 334
 
335 335
     /**
336
-	 * If the default request with line items is too long, generate a new one with only one line item.
337
-	 *
338
-	 * https://support.microsoft.com/en-us/help/208427/maximum-url-length-is-2-083-characters-in-internet-explorer.
339
-	 *
340
-	 * @param WPInv_Invoice $invoice Invoice to be sent to Paypal.
341
-	 * @param array    $paypal_args Arguments sent to Paypal in the request.
342
-	 * @return array
343
-	 */
344
-	protected function fix_request_length( $invoice, $paypal_args ) {
345
-		$max_paypal_length = 2083;
346
-		$query_candidate   = http_build_query( $paypal_args, '', '&' );
347
-
348
-		if ( strlen( $this->endpoint . $query_candidate ) <= $max_paypal_length ) {
349
-			return $paypal_args;
350
-		}
351
-
352
-		return apply_filters(
353
-			'getpaid_paypal_args',
354
-			array_merge(
355
-				$this->get_transaction_args( $invoice ),
356
-				$this->get_line_item_args( $invoice, true )
357
-			),
358
-			$invoice
359
-		);
336
+     * If the default request with line items is too long, generate a new one with only one line item.
337
+     *
338
+     * https://support.microsoft.com/en-us/help/208427/maximum-url-length-is-2-083-characters-in-internet-explorer.
339
+     *
340
+     * @param WPInv_Invoice $invoice Invoice to be sent to Paypal.
341
+     * @param array    $paypal_args Arguments sent to Paypal in the request.
342
+     * @return array
343
+     */
344
+    protected function fix_request_length( $invoice, $paypal_args ) {
345
+        $max_paypal_length = 2083;
346
+        $query_candidate   = http_build_query( $paypal_args, '', '&' );
347
+
348
+        if ( strlen( $this->endpoint . $query_candidate ) <= $max_paypal_length ) {
349
+            return $paypal_args;
350
+        }
351
+
352
+        return apply_filters(
353
+            'getpaid_paypal_args',
354
+            array_merge(
355
+                $this->get_transaction_args( $invoice ),
356
+                $this->get_line_item_args( $invoice, true )
357
+            ),
358
+            $invoice
359
+        );
360 360
 
361 361
     }
362 362
 
363 363
     /**
364
-	 * Processes recurring invoices.
365
-	 *
366
-	 * @param  array $paypal_args PayPal args.
367
-	 * @param  WPInv_Invoice    $invoice Invoice object.
368
-	 */
369
-	public function process_subscription( $paypal_args, $invoice ) {
364
+     * Processes recurring invoices.
365
+     *
366
+     * @param  array $paypal_args PayPal args.
367
+     * @param  WPInv_Invoice    $invoice Invoice object.
368
+     */
369
+    public function process_subscription( $paypal_args, $invoice ) {
370 370
 
371 371
         // Make sure this is a subscription.
372 372
         if ( ! $invoice->is_recurring() || ! $subscription = getpaid_get_invoice_subscription( $invoice ) ) {
@@ -387,21 +387,21 @@  discard block
 block discarded – undo
387 387
         $recurring_amount       = (float) wpinv_sanitize_amount( $invoice->get_recurring_total(), 2 );
388 388
         $subscription_item      = $invoice->get_recurring( true );
389 389
 
390
-		// Convert 365 days to 1 year.
391
-		if ( 'D' == $period && 365 == $interval ) {
392
-			$period = 'Y';
393
-			$interval = 1;
394
-		}
390
+        // Convert 365 days to 1 year.
391
+        if ( 'D' == $period && 365 == $interval ) {
392
+            $period = 'Y';
393
+            $interval = 1;
394
+        }
395 395
 
396 396
         if ( $subscription_item->has_free_trial() ) {
397 397
 
398 398
             $paypal_args['a1'] = 0 == $initial_amount ? 0 : $initial_amount;
399 399
 
400
-			// Trial period length.
401
-			$paypal_args['p1'] = $subscription_item->get_trial_interval();
400
+            // Trial period length.
401
+            $paypal_args['p1'] = $subscription_item->get_trial_interval();
402 402
 
403
-			// Trial period.
404
-			$paypal_args['t1'] = $subscription_item->get_trial_period();
403
+            // Trial period.
404
+            $paypal_args['t1'] = $subscription_item->get_trial_period();
405 405
 
406 406
         } elseif ( $initial_amount != $recurring_amount ) {
407 407
 
@@ -424,40 +424,40 @@  discard block
 block discarded – undo
424 424
         }
425 425
 
426 426
         // We have a recurring payment
427
-		if ( ! isset( $param_number ) || 1 == $param_number ) {
427
+        if ( ! isset( $param_number ) || 1 == $param_number ) {
428 428
 
429
-			// Subscription price
430
-			$paypal_args['a3'] = $recurring_amount;
429
+            // Subscription price
430
+            $paypal_args['a3'] = $recurring_amount;
431 431
 
432
-			// Subscription duration
433
-			$paypal_args['p3'] = $interval;
432
+            // Subscription duration
433
+            $paypal_args['p3'] = $interval;
434 434
 
435
-			// Subscription period
436
-			$paypal_args['t3'] = $period;
435
+            // Subscription period
436
+            $paypal_args['t3'] = $period;
437 437
 
438 438
         }
439 439
 
440 440
         // Recurring payments
441
-		if ( 1 == $bill_times || ( $initial_amount != $recurring_amount && ! $subscription_item->has_free_trial() && 2 == $bill_times ) ) {
441
+        if ( 1 == $bill_times || ( $initial_amount != $recurring_amount && ! $subscription_item->has_free_trial() && 2 == $bill_times ) ) {
442 442
 
443
-			// Non-recurring payments
444
-			$paypal_args['src'] = 0;
443
+            // Non-recurring payments
444
+            $paypal_args['src'] = 0;
445 445
 
446
-		} else {
446
+        } else {
447 447
 
448
-			$paypal_args['src'] = 1;
448
+            $paypal_args['src'] = 1;
449 449
 
450
-			if ( $bill_times > 0 ) {
450
+            if ( $bill_times > 0 ) {
451 451
 
452
-				// An initial period is being used to charge a sign-up fee
453
-				if ( $initial_amount != $recurring_amount && ! $subscription_item->has_free_trial() ) {
454
-					$bill_times--;
455
-				}
452
+                // An initial period is being used to charge a sign-up fee
453
+                if ( $initial_amount != $recurring_amount && ! $subscription_item->has_free_trial() ) {
454
+                    $bill_times--;
455
+                }
456 456
 
457 457
                 // Make sure it's not over the max of 52
458 458
                 $paypal_args['srt'] = ( $bill_times <= 52 ? absint( $bill_times ) : 52 );
459 459
 
460
-			}
460
+            }
461 461
         }
462 462
 
463 463
         // Force return URL so that order description & instructions display
@@ -472,19 +472,19 @@  discard block
 block discarded – undo
472 472
 }
473 473
 
474 474
         return apply_filters(
475
-			'getpaid_paypal_subscription_args',
476
-			$paypal_args,
477
-			$invoice
475
+            'getpaid_paypal_subscription_args',
476
+            $paypal_args,
477
+            $invoice
478 478
         );
479 479
 
480 480
     }
481 481
 
482 482
     /**
483
-	 * Processes ipns and marks payments as complete.
484
-	 *
485
-	 * @return void
486
-	 */
487
-	public function verify_ipn() {
483
+     * Processes ipns and marks payments as complete.
484
+     *
485
+     * @return void
486
+     */
487
+    public function verify_ipn() {
488 488
         new GetPaid_Paypal_Gateway_IPN_Handler( $this );
489 489
     }
490 490
 
@@ -494,19 +494,19 @@  discard block
 block discarded – undo
494 494
     public function sandbox_notice() {
495 495
 
496 496
         return sprintf(
497
-			__( 'SANDBOX ENABLED. You can use sandbox testing accounts only. See the %1$sPayPal Sandbox Testing Guide%2$s for more details.', 'invoicing' ),
498
-			'<a href="https://developer.paypal.com/docs/classic/lifecycle/ug_sandbox/">',
499
-			'</a>'
500
-		);
497
+            __( 'SANDBOX ENABLED. You can use sandbox testing accounts only. See the %1$sPayPal Sandbox Testing Guide%2$s for more details.', 'invoicing' ),
498
+            '<a href="https://developer.paypal.com/docs/classic/lifecycle/ug_sandbox/">',
499
+            '</a>'
500
+        );
501 501
 
502 502
     }
503 503
 
504
-	/**
505
-	 * Filters the gateway settings.
506
-	 *
507
-	 * @param array $admin_settings
508
-	 */
509
-	public function admin_settings( $admin_settings ) {
504
+    /**
505
+     * Filters the gateway settings.
506
+     *
507
+     * @param array $admin_settings
508
+     */
509
+    public function admin_settings( $admin_settings ) {
510 510
 
511 511
         $currencies = sprintf(
512 512
             __( 'Supported Currencies: %s', 'invoicing' ),
@@ -516,66 +516,66 @@  discard block
 block discarded – undo
516 516
         $admin_settings['paypal_active']['desc'] .= " ($currencies)";
517 517
         $admin_settings['paypal_desc']['std']     = __( 'Pay via PayPal: you can pay with your credit card if you don\'t have a PayPal account.', 'invoicing' );
518 518
 
519
-		// Access tokens.
520
-		$live_email      = wpinv_get_option( 'paypal_email' );
521
-		$sandbox_email   = wpinv_get_option( 'paypal_sandbox_email' );
519
+        // Access tokens.
520
+        $live_email      = wpinv_get_option( 'paypal_email' );
521
+        $sandbox_email   = wpinv_get_option( 'paypal_sandbox_email' );
522 522
 
523
-		$admin_settings['paypal_connect'] = array(
524
-			'type' => 'hook',
525
-			'id'   => 'paypal_connect',
526
-			'name' => __( 'Connect to PayPal', 'invoicing' ),
527
-		);
523
+        $admin_settings['paypal_connect'] = array(
524
+            'type' => 'hook',
525
+            'id'   => 'paypal_connect',
526
+            'name' => __( 'Connect to PayPal', 'invoicing' ),
527
+        );
528 528
 
529 529
         $admin_settings['paypal_email'] = array(
530 530
             'type'  => 'text',
531
-			'class' => 'live-auth-data',
531
+            'class' => 'live-auth-data',
532 532
             'id'    => 'paypal_email',
533 533
             'name'  => __( 'Live Email Address', 'invoicing' ),
534 534
             'desc'  => __( 'The email address of your PayPal account.', 'invoicing' ),
535 535
         );
536 536
 
537
-		$admin_settings['paypal_sandbox_email'] = array(
537
+        $admin_settings['paypal_sandbox_email'] = array(
538 538
             'type'  => 'text',
539
-			'class' => 'sandbox-auth-data',
539
+            'class' => 'sandbox-auth-data',
540 540
             'id'    => 'paypal_sandbox_email',
541 541
             'name'  => __( 'Sandbox Email Address', 'invoicing' ),
542 542
             'desc'  => __( 'The email address of your sandbox PayPal account.', 'invoicing' ),
543
-			'std'   => wpinv_get_option( 'paypal_email', '' ),
543
+            'std'   => wpinv_get_option( 'paypal_email', '' ),
544
+        );
545
+
546
+        // Client ID and secret.
547
+        $admin_settings['paypal_client_id'] = array(
548
+            'type'  => 'text',
549
+            'class' => 'live-auth-data',
550
+            'id'    => 'paypal_client_id',
551
+            'name'  => __( 'Live Client ID', 'invoicing' ),
552
+            'desc'  => __( 'The client ID of your PayPal account. You can retrieve this from your PayPal developer account.', 'invoicing' ),
553
+        );
554
+
555
+        $admin_settings['paypal_sandbox_client_id'] = array(
556
+            'type'  => 'text',
557
+            'class' => 'sandbox-auth-data',
558
+            'id'    => 'paypal_sandbox_client_id',
559
+            'name'  => __( 'Sandbox Client ID', 'invoicing' ),
560
+            'desc'  => __( 'The client ID of your sandbox PayPal account. You can retrieve this from your PayPal developer account.', 'invoicing' ),
561
+            'std'   => wpinv_get_option( 'paypal_client_id', '' ),
544 562
         );
545 563
 
546
-		// Client ID and secret.
547
-		$admin_settings['paypal_client_id'] = array(
548
-			'type'  => 'text',
549
-			'class' => 'live-auth-data',
550
-			'id'    => 'paypal_client_id',
551
-			'name'  => __( 'Live Client ID', 'invoicing' ),
552
-			'desc'  => __( 'The client ID of your PayPal account. You can retrieve this from your PayPal developer account.', 'invoicing' ),
553
-		);
554
-
555
-		$admin_settings['paypal_sandbox_client_id'] = array(
556
-			'type'  => 'text',
557
-			'class' => 'sandbox-auth-data',
558
-			'id'    => 'paypal_sandbox_client_id',
559
-			'name'  => __( 'Sandbox Client ID', 'invoicing' ),
560
-			'desc'  => __( 'The client ID of your sandbox PayPal account. You can retrieve this from your PayPal developer account.', 'invoicing' ),
561
-			'std'   => wpinv_get_option( 'paypal_client_id', '' ),
562
-		);
563
-
564
-		$admin_settings['paypal_secret'] = array(
565
-			'type'  => 'text',
566
-			'class' => 'live-auth-data',
567
-			'id'    => 'paypal_secret',
568
-			'name'  => __( 'Live Secret', 'invoicing' ),
569
-			'desc'  => __( 'The secret of your PayPal account. You can retrieve this from your PayPal developer account.', 'invoicing' ),
570
-		);
571
-
572
-		$admin_settings['paypal_sandbox_secret'] = array(
573
-			'type'  => 'text',
574
-			'class' => 'sandbox-auth-data',
575
-			'id'    => 'paypal_sandbox_secret',
576
-			'name'  => __( 'Sandbox Secret', 'invoicing' ),
577
-			'desc'  => __( 'The secret of your sandbox PayPal account. You can retrieve this from your PayPal developer account.', 'invoicing' ),
578
-		);
564
+        $admin_settings['paypal_secret'] = array(
565
+            'type'  => 'text',
566
+            'class' => 'live-auth-data',
567
+            'id'    => 'paypal_secret',
568
+            'name'  => __( 'Live Secret', 'invoicing' ),
569
+            'desc'  => __( 'The secret of your PayPal account. You can retrieve this from your PayPal developer account.', 'invoicing' ),
570
+        );
571
+
572
+        $admin_settings['paypal_sandbox_secret'] = array(
573
+            'type'  => 'text',
574
+            'class' => 'sandbox-auth-data',
575
+            'id'    => 'paypal_sandbox_secret',
576
+            'name'  => __( 'Sandbox Secret', 'invoicing' ),
577
+            'desc'  => __( 'The secret of your sandbox PayPal account. You can retrieve this from your PayPal developer account.', 'invoicing' ),
578
+        );
579 579
 
580 580
         $admin_settings['paypal_ipn_url'] = array(
581 581
             'type'     => 'ipn_url',
@@ -586,57 +586,57 @@  discard block
 block discarded – undo
586 586
             'readonly' => true,
587 587
         );
588 588
 
589
-		return $admin_settings;
590
-	}
591
-
592
-	/**
593
-	 * Retrieves the URL to cancel a subscription.
594
-	 *
595
-	 * @param string $url
596
-	 * @param WPInv_Subscription $subscription
597
-	 */
598
-	public function filter_cancel_subscription_url( $url, $subscription ) {
599
-
600
-		if ( $this->id !== $subscription->get_gateway() ) {
601
-			return $url;
602
-		}
603
-
604
-		// Get the PayPal profile ID.
605
-		$profile_id = $subscription->get_profile_id();
606
-
607
-		// Bail if no profile ID.
608
-		if ( empty( $profile_id ) ) {
609
-			return $url;
610
-		}
611
-
612
-		$cancel_url = 'https://www.paypal.com/myaccount/autopay/connect/%s/cancel';
613
-		if ( $this->is_sandbox( $subscription->get_parent_payment() ) ) {
614
-			$cancel_url = 'https://www.sandbox.paypal.com/myaccount/autopay/connect/%s/cancel';
615
-		}
616
-
617
-		return sprintf( $cancel_url, $profile_id );
618
-	}
619
-
620
-	/**
621
-	 * Retrieves the PayPal connect URL when using the setup wizzard.
622
-	 *
623
-	 *
589
+        return $admin_settings;
590
+    }
591
+
592
+    /**
593
+     * Retrieves the URL to cancel a subscription.
594
+     *
595
+     * @param string $url
596
+     * @param WPInv_Subscription $subscription
597
+     */
598
+    public function filter_cancel_subscription_url( $url, $subscription ) {
599
+
600
+        if ( $this->id !== $subscription->get_gateway() ) {
601
+            return $url;
602
+        }
603
+
604
+        // Get the PayPal profile ID.
605
+        $profile_id = $subscription->get_profile_id();
606
+
607
+        // Bail if no profile ID.
608
+        if ( empty( $profile_id ) ) {
609
+            return $url;
610
+        }
611
+
612
+        $cancel_url = 'https://www.paypal.com/myaccount/autopay/connect/%s/cancel';
613
+        if ( $this->is_sandbox( $subscription->get_parent_payment() ) ) {
614
+            $cancel_url = 'https://www.sandbox.paypal.com/myaccount/autopay/connect/%s/cancel';
615
+        }
616
+
617
+        return sprintf( $cancel_url, $profile_id );
618
+    }
619
+
620
+    /**
621
+     * Retrieves the PayPal connect URL when using the setup wizzard.
622
+     *
623
+     *
624 624
      * @param array $data
625 625
      * @return string
626
-	 */
627
-	public static function maybe_get_connect_url( $url = '', $data = array() ) {
628
-		return self::get_connect_url( false, urldecode( $data['redirect'] ) );
629
-	}
630
-
631
-	/**
632
-	 * Retrieves the PayPal connect URL.
633
-	 *
634
-	 *
626
+     */
627
+    public static function maybe_get_connect_url( $url = '', $data = array() ) {
628
+        return self::get_connect_url( false, urldecode( $data['redirect'] ) );
629
+    }
630
+
631
+    /**
632
+     * Retrieves the PayPal connect URL.
633
+     *
634
+     *
635 635
      * @param bool $is_sandbox
636
-	 * @param string $redirect
636
+     * @param string $redirect
637 637
      * @return string
638
-	 */
639
-	public static function get_connect_url( $is_sandbox, $redirect = '' ) {
638
+     */
639
+    public static function get_connect_url( $is_sandbox, $redirect = '' ) {
640 640
 
641 641
         $redirect_url = add_query_arg(
642 642
             array(
@@ -646,7 +646,7 @@  discard block
 block discarded – undo
646 646
                 'tab'                  => 'gateways',
647 647
                 'section'              => 'paypal',
648 648
                 'getpaid-nonce'        => wp_create_nonce( 'getpaid-nonce' ),
649
-				'redirect'             => urlencode( $redirect ),
649
+                'redirect'             => urlencode( $redirect ),
650 650
             ),
651 651
             admin_url( 'admin.php' )
652 652
         );
@@ -661,12 +661,12 @@  discard block
 block discarded – undo
661 661
 
662 662
     }
663 663
 
664
-	/**
665
-	 * Generates settings page js.
666
-	 *
664
+    /**
665
+     * Generates settings page js.
666
+     *
667 667
      * @return void
668
-	 */
669
-	public static function display_connect_buttons() {
668
+     */
669
+    public static function display_connect_buttons() {
670 670
 
671 671
         ?>
672 672
 			<div class="wpinv-paypal-connect-live">
@@ -708,70 +708,70 @@  discard block
 block discarded – undo
708 708
         <?php
709 709
     }
710 710
 
711
-	/**
712
-	 * Connects to PayPal.
713
-	 *
714
-	 * @param array $data Connection data.
715
-	 * @return void
716
-	 */
717
-	public function connect_paypal( $data ) {
718
-
719
-		$sandbox      = $this->is_sandbox();
720
-		$data         = wp_unslash( $data );
721
-		$access_token = empty( $data['access_token'] ) ? '' : sanitize_text_field( $data['access_token'] );
722
-
723
-		if ( isset( $data['live_mode'] ) ) {
724
-			$sandbox = empty( $data['live_mode'] );
725
-		}
726
-
727
-		wpinv_update_option( 'paypal_sandbox', (int) $sandbox );
728
-		wpinv_update_option( 'paypal_active', 1 );
729
-
730
-		if ( ! empty( $data['error_description'] ) ) {
731
-			getpaid_admin()->show_error( wp_kses_post( urldecode( $data['error_description'] ) ) );
732
-		} else {
733
-
734
-			// Retrieve the user info.
735
-			$user_info = wp_remote_get(
736
-				! $sandbox ? 'https://api-m.paypal.com/v1/identity/oauth2/userinfo?schema=paypalv1.1' : 'https://api-m.sandbox.paypal.com/v1/identity/oauth2/userinfo?schema=paypalv1.1',
737
-				array(
738
-
739
-					'headers' => array(
740
-						'Authorization' => 'Bearer ' . $access_token,
741
-						'Content-type'  => 'application/json',
742
-					),
743
-
744
-				)
745
-			);
746
-
747
-			if ( is_wp_error( $user_info ) ) {
748
-				getpaid_admin()->show_error( wp_kses_post( $user_info->get_error_message() ) );
749
-			} else {
750
-
751
-				// Create application.
752
-				$user_info = json_decode( wp_remote_retrieve_body( $user_info ) );
753
-
754
-				if ( $sandbox ) {
755
-					wpinv_update_option( 'paypal_sandbox_email', sanitize_email( $user_info->emails[0]->value ) );
756
-					wpinv_update_option( 'paypal_sandbox_refresh_token', sanitize_text_field( urldecode( $data['refresh_token'] ) ) );
757
-					set_transient( 'getpaid_paypal_sandbox_access_token', sanitize_text_field( urldecode( $data['access_token'] ) ), (int) $data['expires_in'] );
758
-					getpaid_admin()->show_success( __( 'Successfully connected your PayPal sandbox account', 'invoicing' ) );
759
-				} else {
760
-					wpinv_update_option( 'paypal_email', sanitize_email( $user_info->emails[0]->value ) );
761
-					wpinv_update_option( 'paypal_refresh_token', sanitize_text_field( urldecode( $data['refresh_token'] ) ) );
762
-					set_transient( 'getpaid_paypal_access_token', sanitize_text_field( urldecode( $data['access_token'] ) ), (int) $data['expires_in'] );
763
-					getpaid_admin()->show_success( __( 'Successfully connected your PayPal account', 'invoicing' ) );
764
-				}
711
+    /**
712
+     * Connects to PayPal.
713
+     *
714
+     * @param array $data Connection data.
715
+     * @return void
716
+     */
717
+    public function connect_paypal( $data ) {
718
+
719
+        $sandbox      = $this->is_sandbox();
720
+        $data         = wp_unslash( $data );
721
+        $access_token = empty( $data['access_token'] ) ? '' : sanitize_text_field( $data['access_token'] );
722
+
723
+        if ( isset( $data['live_mode'] ) ) {
724
+            $sandbox = empty( $data['live_mode'] );
725
+        }
726
+
727
+        wpinv_update_option( 'paypal_sandbox', (int) $sandbox );
728
+        wpinv_update_option( 'paypal_active', 1 );
729
+
730
+        if ( ! empty( $data['error_description'] ) ) {
731
+            getpaid_admin()->show_error( wp_kses_post( urldecode( $data['error_description'] ) ) );
732
+        } else {
733
+
734
+            // Retrieve the user info.
735
+            $user_info = wp_remote_get(
736
+                ! $sandbox ? 'https://api-m.paypal.com/v1/identity/oauth2/userinfo?schema=paypalv1.1' : 'https://api-m.sandbox.paypal.com/v1/identity/oauth2/userinfo?schema=paypalv1.1',
737
+                array(
738
+
739
+                    'headers' => array(
740
+                        'Authorization' => 'Bearer ' . $access_token,
741
+                        'Content-type'  => 'application/json',
742
+                    ),
743
+
744
+                )
745
+            );
746
+
747
+            if ( is_wp_error( $user_info ) ) {
748
+                getpaid_admin()->show_error( wp_kses_post( $user_info->get_error_message() ) );
749
+            } else {
750
+
751
+                // Create application.
752
+                $user_info = json_decode( wp_remote_retrieve_body( $user_info ) );
753
+
754
+                if ( $sandbox ) {
755
+                    wpinv_update_option( 'paypal_sandbox_email', sanitize_email( $user_info->emails[0]->value ) );
756
+                    wpinv_update_option( 'paypal_sandbox_refresh_token', sanitize_text_field( urldecode( $data['refresh_token'] ) ) );
757
+                    set_transient( 'getpaid_paypal_sandbox_access_token', sanitize_text_field( urldecode( $data['access_token'] ) ), (int) $data['expires_in'] );
758
+                    getpaid_admin()->show_success( __( 'Successfully connected your PayPal sandbox account', 'invoicing' ) );
759
+                } else {
760
+                    wpinv_update_option( 'paypal_email', sanitize_email( $user_info->emails[0]->value ) );
761
+                    wpinv_update_option( 'paypal_refresh_token', sanitize_text_field( urldecode( $data['refresh_token'] ) ) );
762
+                    set_transient( 'getpaid_paypal_access_token', sanitize_text_field( urldecode( $data['access_token'] ) ), (int) $data['expires_in'] );
763
+                    getpaid_admin()->show_success( __( 'Successfully connected your PayPal account', 'invoicing' ) );
764
+                }
765 765
 }
766 766
 }
767 767
 
768
-		$redirect = empty( $data['redirect'] ) ? admin_url( 'admin.php?page=wpinv-settings&tab=gateways&section=paypal' ) : urldecode( $data['redirect'] );
768
+        $redirect = empty( $data['redirect'] ) ? admin_url( 'admin.php?page=wpinv-settings&tab=gateways&section=paypal' ) : urldecode( $data['redirect'] );
769 769
 
770
-		if ( isset( $data['step'] ) ) {
771
-			$redirect = add_query_arg( 'step', $data['step'], $redirect );
772
-		}
773
-		wp_redirect( $redirect );
774
-		exit;
775
-	}
770
+        if ( isset( $data['step'] ) ) {
771
+            $redirect = add_query_arg( 'step', $data['step'], $redirect );
772
+        }
773
+        wp_redirect( $redirect );
774
+        exit;
775
+    }
776 776
 
777 777
 }
Please login to merge, or discard this patch.
Spacing   +161 added lines, -161 removed lines patch added patch discarded remove patch
@@ -4,7 +4,7 @@  discard block
 block discarded – undo
4 4
  *
5 5
  */
6 6
 
7
-defined( 'ABSPATH' ) || exit;
7
+defined('ABSPATH') || exit;
8 8
 
9 9
 /**
10 10
  * Paypal Payment Gateway class.
@@ -24,7 +24,7 @@  discard block
 block discarded – undo
24 24
 	 *
25 25
 	 * @var array
26 26
 	 */
27
-    protected $supports = array( 'subscription', 'sandbox', 'single_subscription_group' );
27
+    protected $supports = array('subscription', 'sandbox', 'single_subscription_group');
28 28
 
29 29
     /**
30 30
 	 * Payment method order.
@@ -59,7 +59,7 @@  discard block
 block discarded – undo
59 59
 	 *
60 60
 	 * @var array
61 61
 	 */
62
-	public $currencies = array( 'AUD', 'BRL', 'CAD', 'MXN', 'NZD', 'HKD', 'SGD', 'USD', 'EUR', 'JPY', 'TRY', 'NOK', 'CZK', 'DKK', 'HUF', 'ILS', 'MYR', 'PHP', 'PLN', 'SEK', 'CHF', 'TWD', 'THB', 'GBP', 'RMB', 'RUB', 'INR' );
62
+	public $currencies = array('AUD', 'BRL', 'CAD', 'MXN', 'NZD', 'HKD', 'SGD', 'USD', 'EUR', 'JPY', 'TRY', 'NOK', 'CZK', 'DKK', 'HUF', 'ILS', 'MYR', 'PHP', 'PLN', 'SEK', 'CHF', 'TWD', 'THB', 'GBP', 'RMB', 'RUB', 'INR');
63 63
 
64 64
     /**
65 65
 	 * URL to view a transaction.
@@ -80,17 +80,17 @@  discard block
 block discarded – undo
80 80
 	 */
81 81
 	public function __construct() {
82 82
 
83
-        $this->title                = __( 'PayPal Standard', 'invoicing' );
84
-        $this->method_title         = __( 'PayPal Standard', 'invoicing' );
85
-        $this->checkout_button_text = __( 'Proceed to PayPal', 'invoicing' );
86
-        $this->notify_url           = wpinv_get_ipn_url( $this->id );
87
-
88
-		add_filter( 'wpinv_subscription_cancel_url', array( $this, 'filter_cancel_subscription_url' ), 10, 2 );
89
-		add_filter( 'getpaid_paypal_args', array( $this, 'process_subscription' ), 10, 2 );
90
-        add_filter( 'getpaid_paypal_sandbox_notice', array( $this, 'sandbox_notice' ) );
91
-		add_filter( 'getpaid_get_paypal_connect_url', array( $this, 'maybe_get_connect_url' ), 10, 2 );
92
-		add_action( 'getpaid_authenticated_admin_action_connect_paypal', array( $this, 'connect_paypal' ) );
93
-		add_action( 'wpinv_paypal_connect', array( $this, 'display_connect_buttons' ) );
83
+        $this->title                = __('PayPal Standard', 'invoicing');
84
+        $this->method_title         = __('PayPal Standard', 'invoicing');
85
+        $this->checkout_button_text = __('Proceed to PayPal', 'invoicing');
86
+        $this->notify_url           = wpinv_get_ipn_url($this->id);
87
+
88
+		add_filter('wpinv_subscription_cancel_url', array($this, 'filter_cancel_subscription_url'), 10, 2);
89
+		add_filter('getpaid_paypal_args', array($this, 'process_subscription'), 10, 2);
90
+        add_filter('getpaid_paypal_sandbox_notice', array($this, 'sandbox_notice'));
91
+		add_filter('getpaid_get_paypal_connect_url', array($this, 'maybe_get_connect_url'), 10, 2);
92
+		add_action('getpaid_authenticated_admin_action_connect_paypal', array($this, 'connect_paypal'));
93
+		add_action('wpinv_paypal_connect', array($this, 'display_connect_buttons'));
94 94
 		parent::__construct();
95 95
     }
96 96
 
@@ -103,16 +103,16 @@  discard block
 block discarded – undo
103 103
 	 * @param GetPaid_Payment_Form_Submission $submission Checkout submission.
104 104
 	 * @return array
105 105
 	 */
106
-	public function process_payment( $invoice, $submission_data, $submission ) {
106
+	public function process_payment($invoice, $submission_data, $submission) {
107 107
 
108 108
         // Get redirect url.
109
-        $paypal_redirect = $this->get_request_url( $invoice );
109
+        $paypal_redirect = $this->get_request_url($invoice);
110 110
 
111 111
         // Add a note about the request url.
112 112
         $invoice->add_note(
113 113
             sprintf(
114
-                __( 'Redirecting to PayPal: %s', 'invoicing' ),
115
-                esc_url( $paypal_redirect )
114
+                __('Redirecting to PayPal: %s', 'invoicing'),
115
+                esc_url($paypal_redirect)
116 116
             ),
117 117
             false,
118 118
             false,
@@ -120,7 +120,7 @@  discard block
 block discarded – undo
120 120
         );
121 121
 
122 122
         // Redirect to PayPal
123
-        wp_redirect( $paypal_redirect );
123
+        wp_redirect($paypal_redirect);
124 124
         exit;
125 125
 
126 126
     }
@@ -131,21 +131,21 @@  discard block
 block discarded – undo
131 131
 	 * @param  WPInv_Invoice $invoice Invoice object.
132 132
 	 * @return string
133 133
 	 */
134
-	public function get_request_url( $invoice ) {
134
+	public function get_request_url($invoice) {
135 135
 
136 136
         // Endpoint for this request
137
-		$this->endpoint    = $this->is_sandbox( $invoice ) ? 'https://www.sandbox.paypal.com/cgi-bin/webscr?test_ipn=1&' : 'https://www.paypal.com/cgi-bin/webscr?';
137
+		$this->endpoint = $this->is_sandbox($invoice) ? 'https://www.sandbox.paypal.com/cgi-bin/webscr?test_ipn=1&' : 'https://www.paypal.com/cgi-bin/webscr?';
138 138
 
139 139
         // Retrieve paypal args.
140
-        $paypal_args       = map_deep( $this->get_paypal_args( $invoice ), 'urlencode' );
140
+        $paypal_args = map_deep($this->get_paypal_args($invoice), 'urlencode');
141 141
 
142
-        if ( $invoice->is_recurring() ) {
142
+        if ($invoice->is_recurring()) {
143 143
             $paypal_args['bn'] = 'GetPaid_Subscribe_WPS_US';
144 144
         } else {
145 145
             $paypal_args['bn'] = 'GetPaid_ShoppingCart_WPS_US';
146 146
         }
147 147
 
148
-        return add_query_arg( $paypal_args, $this->endpoint );
148
+        return add_query_arg($paypal_args, $this->endpoint);
149 149
 
150 150
 	}
151 151
 
@@ -155,25 +155,25 @@  discard block
 block discarded – undo
155 155
 	 * @param  WPInv_Invoice $invoice Invoice object.
156 156
 	 * @return array
157 157
 	 */
158
-	protected function get_paypal_args( $invoice ) {
158
+	protected function get_paypal_args($invoice) {
159 159
 
160 160
         // Whether or not to send the line items as one item.
161
-		$force_one_line_item = apply_filters( 'getpaid_paypal_force_one_line_item', true, $invoice );
161
+		$force_one_line_item = apply_filters('getpaid_paypal_force_one_line_item', true, $invoice);
162 162
 
163
-		if ( $invoice->is_recurring() || ( wpinv_use_taxes() && wpinv_prices_include_tax() ) ) {
163
+		if ($invoice->is_recurring() || (wpinv_use_taxes() && wpinv_prices_include_tax())) {
164 164
 			$force_one_line_item = true;
165 165
 		}
166 166
 
167 167
 		$paypal_args = apply_filters(
168 168
 			'getpaid_paypal_args',
169 169
 			array_merge(
170
-				$this->get_transaction_args( $invoice ),
171
-				$this->get_line_item_args( $invoice, $force_one_line_item )
170
+				$this->get_transaction_args($invoice),
171
+				$this->get_line_item_args($invoice, $force_one_line_item)
172 172
 			),
173 173
 			$invoice
174 174
 		);
175 175
 
176
-		return $this->fix_request_length( $invoice, $paypal_args );
176
+		return $this->fix_request_length($invoice, $paypal_args);
177 177
     }
178 178
 
179 179
     /**
@@ -182,9 +182,9 @@  discard block
 block discarded – undo
182 182
 	 * @param WPInv_Invoice $invoice Invoice object.
183 183
 	 * @return array
184 184
 	 */
185
-	protected function get_transaction_args( $invoice ) {
185
+	protected function get_transaction_args($invoice) {
186 186
 
187
-		$email = $this->is_sandbox( $invoice ) ? wpinv_get_option( 'paypal_sandbox_email', wpinv_get_option( 'paypal_email', '' ) ) : wpinv_get_option( 'paypal_email', '' );
187
+		$email = $this->is_sandbox($invoice) ? wpinv_get_option('paypal_sandbox_email', wpinv_get_option('paypal_email', '')) : wpinv_get_option('paypal_email', '');
188 188
 		return array(
189 189
             'cmd'           => '_cart',
190 190
             'business'      => $email,
@@ -195,16 +195,16 @@  discard block
 block discarded – undo
195 195
             'rm'            => is_ssl() ? 2 : 1,
196 196
             'upload'        => 1,
197 197
             'currency_code' => $invoice->get_currency(), // https://developer.paypal.com/docs/nvp-soap-api/currency-codes/#paypal
198
-            'return'        => esc_url_raw( $this->get_return_url( $invoice ) ),
199
-            'cancel_return' => esc_url_raw( $invoice->get_checkout_payment_url() ),
200
-            'notify_url'    => getpaid_limit_length( $this->notify_url, 255 ),
201
-            'invoice'       => getpaid_limit_length( $invoice->get_number(), 127 ),
198
+            'return'        => esc_url_raw($this->get_return_url($invoice)),
199
+            'cancel_return' => esc_url_raw($invoice->get_checkout_payment_url()),
200
+            'notify_url'    => getpaid_limit_length($this->notify_url, 255),
201
+            'invoice'       => getpaid_limit_length($invoice->get_number(), 127),
202 202
             'custom'        => $invoice->get_id(),
203
-            'first_name'    => getpaid_limit_length( $invoice->get_first_name(), 32 ),
204
-            'last_name'     => getpaid_limit_length( $invoice->get_last_name(), 64 ),
205
-            'country'       => getpaid_limit_length( $invoice->get_country(), 2 ),
206
-            'email'         => getpaid_limit_length( $invoice->get_email(), 127 ),
207
-            'cbt'           => get_bloginfo( 'name' ),
203
+            'first_name'    => getpaid_limit_length($invoice->get_first_name(), 32),
204
+            'last_name'     => getpaid_limit_length($invoice->get_last_name(), 64),
205
+            'country'       => getpaid_limit_length($invoice->get_country(), 2),
206
+            'email'         => getpaid_limit_length($invoice->get_email(), 127),
207
+            'cbt'           => get_bloginfo('name'),
208 208
         );
209 209
 
210 210
     }
@@ -216,30 +216,30 @@  discard block
 block discarded – undo
216 216
 	 * @param  bool     $force_one_line_item Create only one item for this invoice.
217 217
 	 * @return array
218 218
 	 */
219
-	protected function get_line_item_args( $invoice, $force_one_line_item = false ) {
219
+	protected function get_line_item_args($invoice, $force_one_line_item = false) {
220 220
 
221 221
         // Maybe send invoice as a single item.
222
-		if ( $force_one_line_item ) {
223
-            return $this->get_line_item_args_single_item( $invoice );
222
+		if ($force_one_line_item) {
223
+            return $this->get_line_item_args_single_item($invoice);
224 224
         }
225 225
 
226 226
         // Send each line item individually.
227 227
         $line_item_args = array();
228 228
 
229 229
         // Prepare line items.
230
-        $this->prepare_line_items( $invoice );
230
+        $this->prepare_line_items($invoice);
231 231
 
232 232
         // Add taxes to the cart
233
-        if ( wpinv_use_taxes() && $invoice->is_taxable() ) {
234
-            $line_item_args['tax_cart'] = wpinv_sanitize_amount( (float) $invoice->get_total_tax(), 2 );
233
+        if (wpinv_use_taxes() && $invoice->is_taxable()) {
234
+            $line_item_args['tax_cart'] = wpinv_sanitize_amount((float) $invoice->get_total_tax(), 2);
235 235
         }
236 236
 
237 237
         // Add discount.
238
-        if ( $invoice->get_total_discount() > 0 ) {
239
-            $line_item_args['discount_amount_cart'] = wpinv_sanitize_amount( (float) $invoice->get_total_discount(), 2 );
238
+        if ($invoice->get_total_discount() > 0) {
239
+            $line_item_args['discount_amount_cart'] = wpinv_sanitize_amount((float) $invoice->get_total_discount(), 2);
240 240
         }
241 241
 
242
-		return array_merge( $line_item_args, $this->get_line_items() );
242
+		return array_merge($line_item_args, $this->get_line_items());
243 243
 
244 244
     }
245 245
 
@@ -249,11 +249,11 @@  discard block
 block discarded – undo
249 249
 	 * @param  WPInv_Invoice $invoice Invoice object.
250 250
 	 * @return array
251 251
 	 */
252
-	protected function get_line_item_args_single_item( $invoice ) {
252
+	protected function get_line_item_args_single_item($invoice) {
253 253
 		$this->delete_line_items();
254 254
 
255
-        $item_name = wp_sprintf( __( 'Invoice %s', 'invoicing' ), $invoice->get_number() );
256
-		$this->add_line_item( $item_name, 1, wpinv_round_amount( (float) $invoice->get_total(), 2, true ), $invoice->get_id() );
255
+        $item_name = wp_sprintf(__('Invoice %s', 'invoicing'), $invoice->get_number());
256
+		$this->add_line_item($item_name, 1, wpinv_round_amount((float) $invoice->get_total(), 2, true), $invoice->get_id());
257 257
 
258 258
 		return $this->get_line_items();
259 259
     }
@@ -277,19 +277,19 @@  discard block
 block discarded – undo
277 277
 	 *
278 278
 	 * @param  WPInv_Invoice $invoice Invoice object.
279 279
 	 */
280
-	protected function prepare_line_items( $invoice ) {
280
+	protected function prepare_line_items($invoice) {
281 281
 		$this->delete_line_items();
282 282
 
283 283
 		// Items.
284
-		foreach ( $invoice->get_items() as $item ) {
284
+		foreach ($invoice->get_items() as $item) {
285 285
 			$amount   = $item->get_price();
286 286
 			$quantity = $invoice->get_template() == 'amount' ? 1 : $item->get_quantity();
287
-			$this->add_line_item( $item->get_raw_name(), $quantity, $amount, $item->get_id() );
287
+			$this->add_line_item($item->get_raw_name(), $quantity, $amount, $item->get_id());
288 288
         }
289 289
 
290 290
         // Fees.
291
-		foreach ( $invoice->get_fees() as $fee => $data ) {
292
-            $this->add_line_item( $fee, 1, wpinv_sanitize_amount( $data['initial_fee'] ) );
291
+		foreach ($invoice->get_fees() as $fee => $data) {
292
+            $this->add_line_item($fee, 1, wpinv_sanitize_amount($data['initial_fee']));
293 293
         }
294 294
 
295 295
     }
@@ -302,20 +302,20 @@  discard block
 block discarded – undo
302 302
 	 * @param  float  $amount Amount.
303 303
 	 * @param  string $item_number Item number.
304 304
 	 */
305
-	protected function add_line_item( $item_name, $quantity = 1, $amount = 0.0, $item_number = '' ) {
306
-		$index = ( count( $this->line_items ) / 4 ) + 1;
305
+	protected function add_line_item($item_name, $quantity = 1, $amount = 0.0, $item_number = '') {
306
+		$index = (count($this->line_items) / 4) + 1;
307 307
 
308 308
 		/**
309 309
 		 * Prevent error "Things don't appear to be working at the moment. (https://www.sandbox.paypal.com/webapps/hermes/error)"
310 310
 		 */
311
-		$item_name = str_replace( "#", "", $item_name );
311
+		$item_name = str_replace("#", "", $item_name);
312 312
 
313 313
 		$item = apply_filters(
314 314
 			'getpaid_paypal_line_item',
315 315
 			array(
316
-				'item_name'   => html_entity_decode( getpaid_limit_length( $item_name ? wp_strip_all_tags( $item_name ) : __( 'Item', 'invoicing' ), 127 ), ENT_NOQUOTES, 'UTF-8' ),
316
+				'item_name'   => html_entity_decode(getpaid_limit_length($item_name ? wp_strip_all_tags($item_name) : __('Item', 'invoicing'), 127), ENT_NOQUOTES, 'UTF-8'),
317 317
 				'quantity'    => (float) $quantity,
318
-				'amount'      => wpinv_sanitize_amount( (float) $amount, 2 ),
318
+				'amount'      => wpinv_sanitize_amount((float) $amount, 2),
319 319
 				'item_number' => $item_number,
320 320
 			),
321 321
 			$item_name,
@@ -324,12 +324,12 @@  discard block
 block discarded – undo
324 324
 			$item_number
325 325
 		);
326 326
 
327
-		$this->line_items[ 'item_name_' . $index ]   = getpaid_limit_length( $item['item_name'], 127 );
328
-        $this->line_items[ 'quantity_' . $index ]    = $item['quantity'];
327
+		$this->line_items['item_name_' . $index] = getpaid_limit_length($item['item_name'], 127);
328
+        $this->line_items['quantity_' . $index] = $item['quantity'];
329 329
 
330 330
         // The price or amount of the product, service, or contribution, not including shipping, handling, or tax.
331
-		$this->line_items[ 'amount_' . $index ]      = $item['amount'] * $item['quantity'];
332
-		$this->line_items[ 'item_number_' . $index ] = getpaid_limit_length( $item['item_number'], 127 );
331
+		$this->line_items['amount_' . $index]      = $item['amount'] * $item['quantity'];
332
+		$this->line_items['item_number_' . $index] = getpaid_limit_length($item['item_number'], 127);
333 333
     }
334 334
 
335 335
     /**
@@ -341,19 +341,19 @@  discard block
 block discarded – undo
341 341
 	 * @param array    $paypal_args Arguments sent to Paypal in the request.
342 342
 	 * @return array
343 343
 	 */
344
-	protected function fix_request_length( $invoice, $paypal_args ) {
344
+	protected function fix_request_length($invoice, $paypal_args) {
345 345
 		$max_paypal_length = 2083;
346
-		$query_candidate   = http_build_query( $paypal_args, '', '&' );
346
+		$query_candidate   = http_build_query($paypal_args, '', '&');
347 347
 
348
-		if ( strlen( $this->endpoint . $query_candidate ) <= $max_paypal_length ) {
348
+		if (strlen($this->endpoint . $query_candidate) <= $max_paypal_length) {
349 349
 			return $paypal_args;
350 350
 		}
351 351
 
352 352
 		return apply_filters(
353 353
 			'getpaid_paypal_args',
354 354
 			array_merge(
355
-				$this->get_transaction_args( $invoice ),
356
-				$this->get_line_item_args( $invoice, true )
355
+				$this->get_transaction_args($invoice),
356
+				$this->get_line_item_args($invoice, true)
357 357
 			),
358 358
 			$invoice
359 359
 		);
@@ -366,10 +366,10 @@  discard block
 block discarded – undo
366 366
 	 * @param  array $paypal_args PayPal args.
367 367
 	 * @param  WPInv_Invoice    $invoice Invoice object.
368 368
 	 */
369
-	public function process_subscription( $paypal_args, $invoice ) {
369
+	public function process_subscription($paypal_args, $invoice) {
370 370
 
371 371
         // Make sure this is a subscription.
372
-        if ( ! $invoice->is_recurring() || ! $subscription = getpaid_get_invoice_subscription( $invoice ) ) {
372
+        if (!$invoice->is_recurring() || !$subscription = getpaid_get_invoice_subscription($invoice)) {
373 373
             return $paypal_args;
374 374
         }
375 375
 
@@ -377,23 +377,23 @@  discard block
 block discarded – undo
377 377
         $paypal_args['cmd'] = '_xclick-subscriptions';
378 378
 
379 379
         // Subscription name.
380
-        $paypal_args['item_name'] = wp_sprintf( __( 'Invoice %s', 'invoicing' ), $invoice->get_number() );
380
+        $paypal_args['item_name'] = wp_sprintf(__('Invoice %s', 'invoicing'), $invoice->get_number());
381 381
 
382 382
         // Get subscription args.
383
-        $period                 = strtoupper( substr( $subscription->get_period(), 0, 1 ) );
383
+        $period                 = strtoupper(substr($subscription->get_period(), 0, 1));
384 384
         $interval               = (int) $subscription->get_frequency();
385 385
         $bill_times             = (int) $subscription->get_bill_times();
386
-        $initial_amount         = (float) wpinv_sanitize_amount( $invoice->get_initial_total(), 2 );
387
-        $recurring_amount       = (float) wpinv_sanitize_amount( $invoice->get_recurring_total(), 2 );
388
-        $subscription_item      = $invoice->get_recurring( true );
386
+        $initial_amount         = (float) wpinv_sanitize_amount($invoice->get_initial_total(), 2);
387
+        $recurring_amount       = (float) wpinv_sanitize_amount($invoice->get_recurring_total(), 2);
388
+        $subscription_item      = $invoice->get_recurring(true);
389 389
 
390 390
 		// Convert 365 days to 1 year.
391
-		if ( 'D' == $period && 365 == $interval ) {
391
+		if ('D' == $period && 365 == $interval) {
392 392
 			$period = 'Y';
393 393
 			$interval = 1;
394 394
 		}
395 395
 
396
-        if ( $subscription_item->has_free_trial() ) {
396
+        if ($subscription_item->has_free_trial()) {
397 397
 
398 398
             $paypal_args['a1'] = 0 == $initial_amount ? 0 : $initial_amount;
399 399
 
@@ -403,28 +403,28 @@  discard block
 block discarded – undo
403 403
 			// Trial period.
404 404
 			$paypal_args['t1'] = $subscription_item->get_trial_period();
405 405
 
406
-        } elseif ( $initial_amount != $recurring_amount ) {
406
+        } elseif ($initial_amount != $recurring_amount) {
407 407
 
408 408
             // No trial period, but initial amount includes a sign-up fee and/or other items, so charge it as a separate period.
409 409
 
410
-            if ( 1 == $bill_times ) {
410
+            if (1 == $bill_times) {
411 411
                 $param_number = 3;
412 412
             } else {
413 413
                 $param_number = 1;
414 414
             }
415 415
 
416
-            $paypal_args[ 'a' . $param_number ] = $initial_amount ? $initial_amount : 0;
416
+            $paypal_args['a' . $param_number] = $initial_amount ? $initial_amount : 0;
417 417
 
418 418
             // Sign Up interval
419
-            $paypal_args[ 'p' . $param_number ] = $interval;
419
+            $paypal_args['p' . $param_number] = $interval;
420 420
 
421 421
             // Sign Up unit of duration
422
-            $paypal_args[ 't' . $param_number ] = $period;
422
+            $paypal_args['t' . $param_number] = $period;
423 423
 
424 424
         }
425 425
 
426 426
         // We have a recurring payment
427
-		if ( ! isset( $param_number ) || 1 == $param_number ) {
427
+		if (!isset($param_number) || 1 == $param_number) {
428 428
 
429 429
 			// Subscription price
430 430
 			$paypal_args['a3'] = $recurring_amount;
@@ -438,7 +438,7 @@  discard block
 block discarded – undo
438 438
         }
439 439
 
440 440
         // Recurring payments
441
-		if ( 1 == $bill_times || ( $initial_amount != $recurring_amount && ! $subscription_item->has_free_trial() && 2 == $bill_times ) ) {
441
+		if (1 == $bill_times || ($initial_amount != $recurring_amount && !$subscription_item->has_free_trial() && 2 == $bill_times)) {
442 442
 
443 443
 			// Non-recurring payments
444 444
 			$paypal_args['src'] = 0;
@@ -447,15 +447,15 @@  discard block
 block discarded – undo
447 447
 
448 448
 			$paypal_args['src'] = 1;
449 449
 
450
-			if ( $bill_times > 0 ) {
450
+			if ($bill_times > 0) {
451 451
 
452 452
 				// An initial period is being used to charge a sign-up fee
453
-				if ( $initial_amount != $recurring_amount && ! $subscription_item->has_free_trial() ) {
453
+				if ($initial_amount != $recurring_amount && !$subscription_item->has_free_trial()) {
454 454
 					$bill_times--;
455 455
 				}
456 456
 
457 457
                 // Make sure it's not over the max of 52
458
-                $paypal_args['srt'] = ( $bill_times <= 52 ? absint( $bill_times ) : 52 );
458
+                $paypal_args['srt'] = ($bill_times <= 52 ? absint($bill_times) : 52);
459 459
 
460 460
 			}
461 461
         }
@@ -464,10 +464,10 @@  discard block
 block discarded – undo
464 464
         $paypal_args['rm'] = 2;
465 465
 
466 466
         // Get rid of redudant items.
467
-        foreach ( array( 'item_name_1', 'quantity_1', 'amount_1', 'item_number_1' ) as $arg ) {
467
+        foreach (array('item_name_1', 'quantity_1', 'amount_1', 'item_number_1') as $arg) {
468 468
 
469
-            if ( isset( $paypal_args[ $arg ] ) ) {
470
-                unset( $paypal_args[ $arg ] );
469
+            if (isset($paypal_args[$arg])) {
470
+                unset($paypal_args[$arg]);
471 471
             }
472 472
 }
473 473
 
@@ -485,7 +485,7 @@  discard block
 block discarded – undo
485 485
 	 * @return void
486 486
 	 */
487 487
 	public function verify_ipn() {
488
-        new GetPaid_Paypal_Gateway_IPN_Handler( $this );
488
+        new GetPaid_Paypal_Gateway_IPN_Handler($this);
489 489
     }
490 490
 
491 491
     /**
@@ -494,7 +494,7 @@  discard block
 block discarded – undo
494 494
     public function sandbox_notice() {
495 495
 
496 496
         return sprintf(
497
-			__( 'SANDBOX ENABLED. You can use sandbox testing accounts only. See the %1$sPayPal Sandbox Testing Guide%2$s for more details.', 'invoicing' ),
497
+			__('SANDBOX ENABLED. You can use sandbox testing accounts only. See the %1$sPayPal Sandbox Testing Guide%2$s for more details.', 'invoicing'),
498 498
 			'<a href="https://developer.paypal.com/docs/classic/lifecycle/ug_sandbox/">',
499 499
 			'</a>'
500 500
 		);
@@ -506,41 +506,41 @@  discard block
 block discarded – undo
506 506
 	 *
507 507
 	 * @param array $admin_settings
508 508
 	 */
509
-	public function admin_settings( $admin_settings ) {
509
+	public function admin_settings($admin_settings) {
510 510
 
511 511
         $currencies = sprintf(
512
-            __( 'Supported Currencies: %s', 'invoicing' ),
513
-            implode( ', ', $this->currencies )
512
+            __('Supported Currencies: %s', 'invoicing'),
513
+            implode(', ', $this->currencies)
514 514
         );
515 515
 
516 516
         $admin_settings['paypal_active']['desc'] .= " ($currencies)";
517
-        $admin_settings['paypal_desc']['std']     = __( 'Pay via PayPal: you can pay with your credit card if you don\'t have a PayPal account.', 'invoicing' );
517
+        $admin_settings['paypal_desc']['std']     = __('Pay via PayPal: you can pay with your credit card if you don\'t have a PayPal account.', 'invoicing');
518 518
 
519 519
 		// Access tokens.
520
-		$live_email      = wpinv_get_option( 'paypal_email' );
521
-		$sandbox_email   = wpinv_get_option( 'paypal_sandbox_email' );
520
+		$live_email      = wpinv_get_option('paypal_email');
521
+		$sandbox_email   = wpinv_get_option('paypal_sandbox_email');
522 522
 
523 523
 		$admin_settings['paypal_connect'] = array(
524 524
 			'type' => 'hook',
525 525
 			'id'   => 'paypal_connect',
526
-			'name' => __( 'Connect to PayPal', 'invoicing' ),
526
+			'name' => __('Connect to PayPal', 'invoicing'),
527 527
 		);
528 528
 
529 529
         $admin_settings['paypal_email'] = array(
530 530
             'type'  => 'text',
531 531
 			'class' => 'live-auth-data',
532 532
             'id'    => 'paypal_email',
533
-            'name'  => __( 'Live Email Address', 'invoicing' ),
534
-            'desc'  => __( 'The email address of your PayPal account.', 'invoicing' ),
533
+            'name'  => __('Live Email Address', 'invoicing'),
534
+            'desc'  => __('The email address of your PayPal account.', 'invoicing'),
535 535
         );
536 536
 
537 537
 		$admin_settings['paypal_sandbox_email'] = array(
538 538
             'type'  => 'text',
539 539
 			'class' => 'sandbox-auth-data',
540 540
             'id'    => 'paypal_sandbox_email',
541
-            'name'  => __( 'Sandbox Email Address', 'invoicing' ),
542
-            'desc'  => __( 'The email address of your sandbox PayPal account.', 'invoicing' ),
543
-			'std'   => wpinv_get_option( 'paypal_email', '' ),
541
+            'name'  => __('Sandbox Email Address', 'invoicing'),
542
+            'desc'  => __('The email address of your sandbox PayPal account.', 'invoicing'),
543
+			'std'   => wpinv_get_option('paypal_email', ''),
544 544
         );
545 545
 
546 546
 		// Client ID and secret.
@@ -548,41 +548,41 @@  discard block
 block discarded – undo
548 548
 			'type'  => 'text',
549 549
 			'class' => 'live-auth-data',
550 550
 			'id'    => 'paypal_client_id',
551
-			'name'  => __( 'Live Client ID', 'invoicing' ),
552
-			'desc'  => __( 'The client ID of your PayPal account. You can retrieve this from your PayPal developer account.', 'invoicing' ),
551
+			'name'  => __('Live Client ID', 'invoicing'),
552
+			'desc'  => __('The client ID of your PayPal account. You can retrieve this from your PayPal developer account.', 'invoicing'),
553 553
 		);
554 554
 
555 555
 		$admin_settings['paypal_sandbox_client_id'] = array(
556 556
 			'type'  => 'text',
557 557
 			'class' => 'sandbox-auth-data',
558 558
 			'id'    => 'paypal_sandbox_client_id',
559
-			'name'  => __( 'Sandbox Client ID', 'invoicing' ),
560
-			'desc'  => __( 'The client ID of your sandbox PayPal account. You can retrieve this from your PayPal developer account.', 'invoicing' ),
561
-			'std'   => wpinv_get_option( 'paypal_client_id', '' ),
559
+			'name'  => __('Sandbox Client ID', 'invoicing'),
560
+			'desc'  => __('The client ID of your sandbox PayPal account. You can retrieve this from your PayPal developer account.', 'invoicing'),
561
+			'std'   => wpinv_get_option('paypal_client_id', ''),
562 562
 		);
563 563
 
564 564
 		$admin_settings['paypal_secret'] = array(
565 565
 			'type'  => 'text',
566 566
 			'class' => 'live-auth-data',
567 567
 			'id'    => 'paypal_secret',
568
-			'name'  => __( 'Live Secret', 'invoicing' ),
569
-			'desc'  => __( 'The secret of your PayPal account. You can retrieve this from your PayPal developer account.', 'invoicing' ),
568
+			'name'  => __('Live Secret', 'invoicing'),
569
+			'desc'  => __('The secret of your PayPal account. You can retrieve this from your PayPal developer account.', 'invoicing'),
570 570
 		);
571 571
 
572 572
 		$admin_settings['paypal_sandbox_secret'] = array(
573 573
 			'type'  => 'text',
574 574
 			'class' => 'sandbox-auth-data',
575 575
 			'id'    => 'paypal_sandbox_secret',
576
-			'name'  => __( 'Sandbox Secret', 'invoicing' ),
577
-			'desc'  => __( 'The secret of your sandbox PayPal account. You can retrieve this from your PayPal developer account.', 'invoicing' ),
576
+			'name'  => __('Sandbox Secret', 'invoicing'),
577
+			'desc'  => __('The secret of your sandbox PayPal account. You can retrieve this from your PayPal developer account.', 'invoicing'),
578 578
 		);
579 579
 
580 580
         $admin_settings['paypal_ipn_url'] = array(
581 581
             'type'     => 'ipn_url',
582 582
             'id'       => 'paypal_ipn_url',
583
-            'name'     => __( 'IPN Url', 'invoicing' ),
583
+            'name'     => __('IPN Url', 'invoicing'),
584 584
             'std'      => $this->notify_url,
585
-            'desc'     => __( "If you've not enabled IPNs in your paypal account, use the above URL to enable them.", 'invoicing' ) . ' <a href="https://developer.paypal.com/docs/api-basics/notifications/ipn/"><em>' . __( 'Learn more.', 'invoicing' ) . '</em></a>',
585
+            'desc'     => __("If you've not enabled IPNs in your paypal account, use the above URL to enable them.", 'invoicing') . ' <a href="https://developer.paypal.com/docs/api-basics/notifications/ipn/"><em>' . __('Learn more.', 'invoicing') . '</em></a>',
586 586
             'readonly' => true,
587 587
         );
588 588
 
@@ -595,9 +595,9 @@  discard block
 block discarded – undo
595 595
 	 * @param string $url
596 596
 	 * @param WPInv_Subscription $subscription
597 597
 	 */
598
-	public function filter_cancel_subscription_url( $url, $subscription ) {
598
+	public function filter_cancel_subscription_url($url, $subscription) {
599 599
 
600
-		if ( $this->id !== $subscription->get_gateway() ) {
600
+		if ($this->id !== $subscription->get_gateway()) {
601 601
 			return $url;
602 602
 		}
603 603
 
@@ -605,16 +605,16 @@  discard block
 block discarded – undo
605 605
 		$profile_id = $subscription->get_profile_id();
606 606
 
607 607
 		// Bail if no profile ID.
608
-		if ( empty( $profile_id ) ) {
608
+		if (empty($profile_id)) {
609 609
 			return $url;
610 610
 		}
611 611
 
612 612
 		$cancel_url = 'https://www.paypal.com/myaccount/autopay/connect/%s/cancel';
613
-		if ( $this->is_sandbox( $subscription->get_parent_payment() ) ) {
613
+		if ($this->is_sandbox($subscription->get_parent_payment())) {
614 614
 			$cancel_url = 'https://www.sandbox.paypal.com/myaccount/autopay/connect/%s/cancel';
615 615
 		}
616 616
 
617
-		return sprintf( $cancel_url, $profile_id );
617
+		return sprintf($cancel_url, $profile_id);
618 618
 	}
619 619
 
620 620
 	/**
@@ -624,8 +624,8 @@  discard block
 block discarded – undo
624 624
      * @param array $data
625 625
      * @return string
626 626
 	 */
627
-	public static function maybe_get_connect_url( $url = '', $data = array() ) {
628
-		return self::get_connect_url( false, urldecode( $data['redirect'] ) );
627
+	public static function maybe_get_connect_url($url = '', $data = array()) {
628
+		return self::get_connect_url(false, urldecode($data['redirect']));
629 629
 	}
630 630
 
631 631
 	/**
@@ -636,25 +636,25 @@  discard block
 block discarded – undo
636 636
 	 * @param string $redirect
637 637
      * @return string
638 638
 	 */
639
-	public static function get_connect_url( $is_sandbox, $redirect = '' ) {
639
+	public static function get_connect_url($is_sandbox, $redirect = '') {
640 640
 
641 641
         $redirect_url = add_query_arg(
642 642
             array(
643 643
                 'getpaid-admin-action' => 'connect_paypal',
644 644
                 'page'                 => 'wpinv-settings',
645
-                'live_mode'            => (int) empty( $is_sandbox ),
645
+                'live_mode'            => (int) empty($is_sandbox),
646 646
                 'tab'                  => 'gateways',
647 647
                 'section'              => 'paypal',
648
-                'getpaid-nonce'        => wp_create_nonce( 'getpaid-nonce' ),
649
-				'redirect'             => urlencode( $redirect ),
648
+                'getpaid-nonce'        => wp_create_nonce('getpaid-nonce'),
649
+				'redirect'             => urlencode($redirect),
650 650
             ),
651
-            admin_url( 'admin.php' )
651
+            admin_url('admin.php')
652 652
         );
653 653
 
654 654
         return add_query_arg(
655 655
             array(
656
-                'live_mode'    => (int) empty( $is_sandbox ),
657
-                'redirect_url' => urlencode( str_replace( '&amp;', '&', $redirect_url ) ),
656
+                'live_mode'    => (int) empty($is_sandbox),
657
+                'redirect_url' => urlencode(str_replace('&amp;', '&', $redirect_url)),
658 658
             ),
659 659
             'https://ayecode.io/oauth/paypal'
660 660
         );
@@ -670,10 +670,10 @@  discard block
 block discarded – undo
670 670
 
671 671
         ?>
672 672
 			<div class="wpinv-paypal-connect-live">
673
-				<a class="button button-primary" href="<?php echo esc_url( self::get_connect_url( false ) ); ?>"><?php esc_html_e( 'Connect to PayPal', 'invoicing' ); ?></a>
673
+				<a class="button button-primary" href="<?php echo esc_url(self::get_connect_url(false)); ?>"><?php esc_html_e('Connect to PayPal', 'invoicing'); ?></a>
674 674
 			</div>
675 675
 			<div class="wpinv-paypal-connect-sandbox">
676
-				<a class="button button-primary" href="<?php echo esc_url( self::get_connect_url( true ) ); ?>"><?php esc_html_e( 'Connect to PayPal Sandbox', 'invoicing' ); ?></a>
676
+				<a class="button button-primary" href="<?php echo esc_url(self::get_connect_url(true)); ?>"><?php esc_html_e('Connect to PayPal Sandbox', 'invoicing'); ?></a>
677 677
 			</div>
678 678
 
679 679
             <script>
@@ -714,26 +714,26 @@  discard block
 block discarded – undo
714 714
 	 * @param array $data Connection data.
715 715
 	 * @return void
716 716
 	 */
717
-	public function connect_paypal( $data ) {
717
+	public function connect_paypal($data) {
718 718
 
719 719
 		$sandbox      = $this->is_sandbox();
720
-		$data         = wp_unslash( $data );
721
-		$access_token = empty( $data['access_token'] ) ? '' : sanitize_text_field( $data['access_token'] );
720
+		$data         = wp_unslash($data);
721
+		$access_token = empty($data['access_token']) ? '' : sanitize_text_field($data['access_token']);
722 722
 
723
-		if ( isset( $data['live_mode'] ) ) {
724
-			$sandbox = empty( $data['live_mode'] );
723
+		if (isset($data['live_mode'])) {
724
+			$sandbox = empty($data['live_mode']);
725 725
 		}
726 726
 
727
-		wpinv_update_option( 'paypal_sandbox', (int) $sandbox );
728
-		wpinv_update_option( 'paypal_active', 1 );
727
+		wpinv_update_option('paypal_sandbox', (int) $sandbox);
728
+		wpinv_update_option('paypal_active', 1);
729 729
 
730
-		if ( ! empty( $data['error_description'] ) ) {
731
-			getpaid_admin()->show_error( wp_kses_post( urldecode( $data['error_description'] ) ) );
730
+		if (!empty($data['error_description'])) {
731
+			getpaid_admin()->show_error(wp_kses_post(urldecode($data['error_description'])));
732 732
 		} else {
733 733
 
734 734
 			// Retrieve the user info.
735 735
 			$user_info = wp_remote_get(
736
-				! $sandbox ? 'https://api-m.paypal.com/v1/identity/oauth2/userinfo?schema=paypalv1.1' : 'https://api-m.sandbox.paypal.com/v1/identity/oauth2/userinfo?schema=paypalv1.1',
736
+				!$sandbox ? 'https://api-m.paypal.com/v1/identity/oauth2/userinfo?schema=paypalv1.1' : 'https://api-m.sandbox.paypal.com/v1/identity/oauth2/userinfo?schema=paypalv1.1',
737 737
 				array(
738 738
 
739 739
 					'headers' => array(
@@ -744,33 +744,33 @@  discard block
 block discarded – undo
744 744
 				)
745 745
 			);
746 746
 
747
-			if ( is_wp_error( $user_info ) ) {
748
-				getpaid_admin()->show_error( wp_kses_post( $user_info->get_error_message() ) );
747
+			if (is_wp_error($user_info)) {
748
+				getpaid_admin()->show_error(wp_kses_post($user_info->get_error_message()));
749 749
 			} else {
750 750
 
751 751
 				// Create application.
752
-				$user_info = json_decode( wp_remote_retrieve_body( $user_info ) );
752
+				$user_info = json_decode(wp_remote_retrieve_body($user_info));
753 753
 
754
-				if ( $sandbox ) {
755
-					wpinv_update_option( 'paypal_sandbox_email', sanitize_email( $user_info->emails[0]->value ) );
756
-					wpinv_update_option( 'paypal_sandbox_refresh_token', sanitize_text_field( urldecode( $data['refresh_token'] ) ) );
757
-					set_transient( 'getpaid_paypal_sandbox_access_token', sanitize_text_field( urldecode( $data['access_token'] ) ), (int) $data['expires_in'] );
758
-					getpaid_admin()->show_success( __( 'Successfully connected your PayPal sandbox account', 'invoicing' ) );
754
+				if ($sandbox) {
755
+					wpinv_update_option('paypal_sandbox_email', sanitize_email($user_info->emails[0]->value));
756
+					wpinv_update_option('paypal_sandbox_refresh_token', sanitize_text_field(urldecode($data['refresh_token'])));
757
+					set_transient('getpaid_paypal_sandbox_access_token', sanitize_text_field(urldecode($data['access_token'])), (int) $data['expires_in']);
758
+					getpaid_admin()->show_success(__('Successfully connected your PayPal sandbox account', 'invoicing'));
759 759
 				} else {
760
-					wpinv_update_option( 'paypal_email', sanitize_email( $user_info->emails[0]->value ) );
761
-					wpinv_update_option( 'paypal_refresh_token', sanitize_text_field( urldecode( $data['refresh_token'] ) ) );
762
-					set_transient( 'getpaid_paypal_access_token', sanitize_text_field( urldecode( $data['access_token'] ) ), (int) $data['expires_in'] );
763
-					getpaid_admin()->show_success( __( 'Successfully connected your PayPal account', 'invoicing' ) );
760
+					wpinv_update_option('paypal_email', sanitize_email($user_info->emails[0]->value));
761
+					wpinv_update_option('paypal_refresh_token', sanitize_text_field(urldecode($data['refresh_token'])));
762
+					set_transient('getpaid_paypal_access_token', sanitize_text_field(urldecode($data['access_token'])), (int) $data['expires_in']);
763
+					getpaid_admin()->show_success(__('Successfully connected your PayPal account', 'invoicing'));
764 764
 				}
765 765
 }
766 766
 }
767 767
 
768
-		$redirect = empty( $data['redirect'] ) ? admin_url( 'admin.php?page=wpinv-settings&tab=gateways&section=paypal' ) : urldecode( $data['redirect'] );
768
+		$redirect = empty($data['redirect']) ? admin_url('admin.php?page=wpinv-settings&tab=gateways&section=paypal') : urldecode($data['redirect']);
769 769
 
770
-		if ( isset( $data['step'] ) ) {
771
-			$redirect = add_query_arg( 'step', $data['step'], $redirect );
770
+		if (isset($data['step'])) {
771
+			$redirect = add_query_arg('step', $data['step'], $redirect);
772 772
 		}
773
-		wp_redirect( $redirect );
773
+		wp_redirect($redirect);
774 774
 		exit;
775 775
 	}
776 776
 
Please login to merge, or discard this patch.
includes/admin/html-admin-page-addons.php 3 patches
Indentation   +75 added lines, -75 removed lines patch added patch discarded remove patch
@@ -4,7 +4,7 @@  discard block
 block discarded – undo
4 4
  *
5 5
  */
6 6
 if ( ! defined( 'ABSPATH' ) ) {
7
-	exit;
7
+    exit;
8 8
 }
9 9
 add_ThickBox();
10 10
 ?>
@@ -14,18 +14,18 @@  discard block
 block discarded – undo
14 14
 	<?php if ( $tabs ) { ?>
15 15
 		<nav class="nav-tab-wrapper wpi-nav-tab-wrapper">
16 16
 			<?php
17
-			foreach ( $tabs as $name => $label ) {
18
-				echo '<a href="' . esc_url( admin_url( 'admin.php?page=wpi-addons&tab=' . $name ) ) . '" class="nav-tab ' . ( $current_tab == $name ? 'nav-tab-active' : '' ) . '">' . esc_html( $label ) . '</a>';
19
-			}
20
-			do_action( 'wpi_addons_tabs' );
21
-			?>
17
+            foreach ( $tabs as $name => $label ) {
18
+                echo '<a href="' . esc_url( admin_url( 'admin.php?page=wpi-addons&tab=' . $name ) ) . '" class="nav-tab ' . ( $current_tab == $name ? 'nav-tab-active' : '' ) . '">' . esc_html( $label ) . '</a>';
19
+            }
20
+            do_action( 'wpi_addons_tabs' );
21
+            ?>
22 22
 		</nav>
23 23
 
24 24
 		<?php
25 25
 
26
-		if ( $current_tab == 'membership' ) {
26
+        if ( $current_tab == 'membership' ) {
27 27
 
28
-			?>
28
+            ?>
29 29
 
30 30
 			<div class="wpi-membership-tab-conatiner">
31 31
 				<div class="membership-content">
@@ -36,9 +36,9 @@  discard block
 block discarded – undo
36 36
 					<h2><?php esc_html_e( 'Have a membership key?', 'invoicing' ); ?></h2>
37 37
 					<p>
38 38
 						<?php
39
-						$wpeu_admin = new External_Updates_Admin( 'wpinvoicing.com', '1' );
40
-						echo $wpeu_admin->render_licence_actions( 'wpinvoicing.com', 'membership', array( 95, 106, 108, 12351 ) );
41
-						?>
39
+                        $wpeu_admin = new External_Updates_Admin( 'wpinvoicing.com', '1' );
40
+                        echo $wpeu_admin->render_licence_actions( 'wpinvoicing.com', 'membership', array( 95, 106, 108, 12351 ) );
41
+                        ?>
42 42
 					</p>
43 43
 				<?php } ?>
44 44
 
@@ -48,13 +48,13 @@  discard block
 block discarded – undo
48 48
 							<div class="feature-list">
49 49
 								<ul>
50 50
 									<?php
51
-									$addon_obj = new WPInv_Admin_Addons();
52
-									if ( $addons = $addon_obj->get_section_data( 'addons' ) ) {
53
-										foreach ( $addons as $addon ) {
54
-											echo '<li><i class="far fa-check-circle fa-sm"></i> ' . esc_html( $addon->info->title ) . '</li>';
55
-										}
56
-									}
57
-									?>
51
+                                    $addon_obj = new WPInv_Admin_Addons();
52
+                                    if ( $addons = $addon_obj->get_section_data( 'addons' ) ) {
53
+                                        foreach ( $addons as $addon ) {
54
+                                            echo '<li><i class="far fa-check-circle fa-sm"></i> ' . esc_html( $addon->info->title ) . '</li>';
55
+                                        }
56
+                                    }
57
+                                    ?>
58 58
 									</ul>
59 59
 
60 60
 									<div class="feature-cta">
@@ -65,12 +65,12 @@  discard block
 block discarded – undo
65 65
 									<h3><?php esc_html_e( 'Included Gateways:', 'invoicing' ); ?></h3>
66 66
 									<ul>
67 67
 										<?php
68
-										if ( $addons = $addon_obj->get_section_data( 'gateways' ) ) {
69
-											foreach ( $addons as $addon ) {
70
-												echo '<li><i class="far fa-check-circle fa-sm"></i> ' . esc_html( $addon->info->title ) . '</li>';
71
-											}
72
-										}
73
-										?>
68
+                                        if ( $addons = $addon_obj->get_section_data( 'gateways' ) ) {
69
+                                            foreach ( $addons as $addon ) {
70
+                                                echo '<li><i class="far fa-check-circle fa-sm"></i> ' . esc_html( $addon->info->title ) . '</li>';
71
+                                            }
72
+                                        }
73
+                                        ?>
74 74
 								</ul>
75 75
 							</div>
76 76
 
@@ -81,8 +81,8 @@  discard block
 block discarded – undo
81 81
 						<div class="testimonial-content">
82 82
 							<div class="t-image">
83 83
 								<?php
84
-									echo '<img src="' . esc_url( plugins_url( 'images/t-image2.png', dirname( __FILE__ ) ) ) . '" > ';
85
-								?>
84
+                                    echo '<img src="' . esc_url( plugins_url( 'images/t-image2.png', dirname( __FILE__ ) ) ) . '" > ';
85
+                                ?>
86 86
 							</div>
87 87
 							<div class="t-content">
88 88
 								<p>
@@ -101,8 +101,8 @@  discard block
 block discarded – undo
101 101
 						<div class="testimonial-content">
102 102
 							<div class="t-image">
103 103
 								<?php
104
-									echo '<img src="' . esc_url( plugins_url( 'images/t-image1.png', dirname( __FILE__ ) ) ) . '" > ';
105
-								?>
104
+                                    echo '<img src="' . esc_url( plugins_url( 'images/t-image1.png', dirname( __FILE__ ) ) ) . '" > ';
105
+                                ?>
106 106
 							</div>
107 107
 							<div class="t-content">
108 108
 								<p>
@@ -126,26 +126,26 @@  discard block
 block discarded – undo
126 126
 			</div>
127 127
 		</div>
128 128
 			<?php
129
-		} else {
130
-			$installed_plugins = get_plugins();
129
+        } else {
130
+            $installed_plugins = get_plugins();
131 131
             $addon_obj = new WPInv_Admin_Addons();
132
-			if ( $addons = $addon_obj->get_section_data( $current_tab ) ) :
133
-				//print_r($addons);
134
-				?>
132
+            if ( $addons = $addon_obj->get_section_data( $current_tab ) ) :
133
+                //print_r($addons);
134
+                ?>
135 135
 				<ul class="wpi-products">
136 136
                 <?php
137 137
                 foreach ( $addons as $addon ) :
138 138
                         if ( 965 == $addon->info->id ) {
139 139
 continue;}// don't show quote add on
140
-						?>
140
+                        ?>
141 141
                         <li class="wpi-product">
142 142
 								<div class="wpi-product-title">
143 143
 									<h3>
144 144
                                     <?php
145
-										if ( ! empty( $addon->info->excerpt ) ) {
146
-										wpi_help_tip( $addon->info->excerpt, false, false, true );
147
-										}
148
-										echo esc_html( $addon->info->title );
145
+                                        if ( ! empty( $addon->info->excerpt ) ) {
146
+                                        wpi_help_tip( $addon->info->excerpt, false, false, true );
147
+                                        }
148
+                                        echo esc_html( $addon->info->title );
149 149
                                         ?>
150 150
                                         </h3>
151 151
 								</div>
@@ -156,40 +156,40 @@  discard block
 block discarded – undo
156 156
 									<?php
157 157
                                     endif;
158 158
 
159
-									if ( 'stripe-payment-gateway' == $addon->info->slug ) {
160
-										$addon->info->slug = 'getpaid-stripe-payments';
161
-										$addon->info->link = 'https://wordpress.org/plugins/getpaid-stripe-payments/';
162
-									}
159
+                                    if ( 'stripe-payment-gateway' == $addon->info->slug ) {
160
+                                        $addon->info->slug = 'getpaid-stripe-payments';
161
+                                        $addon->info->link = 'https://wordpress.org/plugins/getpaid-stripe-payments/';
162
+                                    }
163 163
                                     elseif( 'wallet' == $addon->info->slug ){
164
-										$addon->info->slug = 'getpaid-wallet';
165
-										$addon->info->link = 'https://wordpress.org/plugins/getpaid-wallet/';
166
-									}
164
+                                        $addon->info->slug = 'getpaid-wallet';
165
+                                        $addon->info->link = 'https://wordpress.org/plugins/getpaid-wallet/';
166
+                                    }
167 167
                                     elseif( 'item-inventory' == $addon->info->slug ){
168
-										$addon->info->slug = 'getpaid-item-inventory';
169
-										$addon->info->link = 'https://wordpress.org/plugins/getpaid-item-inventory/';
170
-									}
171
-
172
-									if ( isset( $addon->info->link ) && substr( $addon->info->link, 0, 21 ) === 'https://wordpress.org' ) {
173
-										echo '<a href="' . esc_url( admin_url( '/plugin-install.php?tab=plugin-information&plugin=' . $addon->info->slug ) ) . '&width=770&height=660&TB_iframe=true" class="thickbox" >';
174
-										echo '<span class="wpi-product-info">' . esc_html__( 'More info', 'invoicing' ) . '</span>';
175
-										echo '</a>';
176
-									} elseif ( isset( $addon->info->link ) && ( substr( $addon->info->link, 0, 23 ) === 'https://wpinvoicing.com' || substr( $addon->info->link, 0, 21 ) === 'https://wpgetpaid.com' ) ) {
177
-										if ( defined( 'WP_EASY_UPDATES_ACTIVE' ) ) {
178
-											$url = admin_url( '/plugin-install.php?tab=plugin-information&plugin=' . $addon->info->slug . '&width=770&height=660&item_id=' . $addon->info->id . '&update_url=https://wpgetpaid.com&TB_iframe=true' );
179
-										} else {
180
-											// if installed show activation link
181
-											if ( isset( $installed_plugins['wp-easy-updates/external-updates.php'] ) ) {
182
-												$url = '#TB_inline?width=600&height=50&inlineId=wpi-wpeu-required-activation';
183
-											} else {
184
-												$url = '#TB_inline?width=600&height=50&inlineId=wpi-wpeu-required-for-external';
185
-											}
186
-										}
187
-										echo '<a href="' . esc_url( $url ) . '" class="thickbox">';
188
-										echo '<span class="wpi-product-info">' . esc_html__( 'More info', 'invoicing' ) . '</span>';
189
-										echo '</a>';
190
-									}
191
-
192
-									?>
168
+                                        $addon->info->slug = 'getpaid-item-inventory';
169
+                                        $addon->info->link = 'https://wordpress.org/plugins/getpaid-item-inventory/';
170
+                                    }
171
+
172
+                                    if ( isset( $addon->info->link ) && substr( $addon->info->link, 0, 21 ) === 'https://wordpress.org' ) {
173
+                                        echo '<a href="' . esc_url( admin_url( '/plugin-install.php?tab=plugin-information&plugin=' . $addon->info->slug ) ) . '&width=770&height=660&TB_iframe=true" class="thickbox" >';
174
+                                        echo '<span class="wpi-product-info">' . esc_html__( 'More info', 'invoicing' ) . '</span>';
175
+                                        echo '</a>';
176
+                                    } elseif ( isset( $addon->info->link ) && ( substr( $addon->info->link, 0, 23 ) === 'https://wpinvoicing.com' || substr( $addon->info->link, 0, 21 ) === 'https://wpgetpaid.com' ) ) {
177
+                                        if ( defined( 'WP_EASY_UPDATES_ACTIVE' ) ) {
178
+                                            $url = admin_url( '/plugin-install.php?tab=plugin-information&plugin=' . $addon->info->slug . '&width=770&height=660&item_id=' . $addon->info->id . '&update_url=https://wpgetpaid.com&TB_iframe=true' );
179
+                                        } else {
180
+                                            // if installed show activation link
181
+                                            if ( isset( $installed_plugins['wp-easy-updates/external-updates.php'] ) ) {
182
+                                                $url = '#TB_inline?width=600&height=50&inlineId=wpi-wpeu-required-activation';
183
+                                            } else {
184
+                                                $url = '#TB_inline?width=600&height=50&inlineId=wpi-wpeu-required-for-external';
185
+                                            }
186
+                                        }
187
+                                        echo '<a href="' . esc_url( $url ) . '" class="thickbox">';
188
+                                        echo '<span class="wpi-product-info">' . esc_html__( 'More info', 'invoicing' ) . '</span>';
189
+                                        echo '</a>';
190
+                                    }
191
+
192
+                                    ?>
193 193
 
194 194
 								</span>
195 195
 
@@ -197,15 +197,15 @@  discard block
 block discarded – undo
197 197
 								<span class="wpi-product-button">
198 198
 									<?php
199 199
                                     $addon_obj->output_button( $addon );
200
-									?>
200
+                                    ?>
201 201
 								</span>
202 202
 
203 203
 								<span class="wpi-price"><?php //print_r($addon); //echo wp_kses_post( $addon->price ); ?></span></li><?php endforeach; ?></ul>
204 204
 			<?php
205 205
             endif;
206
-		}
206
+        }
207 207
 }
208
-	?>
208
+    ?>
209 209
 
210 210
 
211 211
 	<div class="clearfix" ></div>
@@ -224,8 +224,8 @@  discard block
 block discarded – undo
224 224
 			<input class="wpeu-licence-key" type="text" placeholder="<?php esc_attr_e( 'Enter your licence key', 'invoicing' ); ?>"> <button class="button-primary wpeu-licence-popup-button" ><?php esc_html_e( 'Install', 'invoicing' ); ?></button>
225 225
 			<br>
226 226
 			<?php
227
-			printf( esc_html__( '%1$sFind your licence key here%2$s OR %3$sBuy one here%4$s', 'invoicing' ), '<a href="https://wpinvoicing.com/your-account/" target="_blank">', '</a>', '<a class="wpeu-licence-link" href="https://wpinvoicing.com/downloads/category/addons/" target="_blank">', '</a>' );
228
-			?>
227
+            printf( esc_html__( '%1$sFind your licence key here%2$s OR %3$sBuy one here%4$s', 'invoicing' ), '<a href="https://wpinvoicing.com/your-account/" target="_blank">', '</a>', '<a class="wpeu-licence-link" href="https://wpinvoicing.com/downloads/category/addons/" target="_blank">', '</a>' );
228
+            ?>
229 229
 		</span>
230 230
 	</div>
231 231
 
Please login to merge, or discard this patch.
Spacing   +56 added lines, -56 removed lines patch added patch discarded remove patch
@@ -3,27 +3,27 @@  discard block
 block discarded – undo
3 3
  * Admin View: Page - Addons
4 4
  *
5 5
  */
6
-if ( ! defined( 'ABSPATH' ) ) {
6
+if (!defined('ABSPATH')) {
7 7
 	exit;
8 8
 }
9 9
 add_ThickBox();
10 10
 ?>
11 11
 <div class="wrap wpi_addons_wrap">
12
-	<h1><?php echo esc_html( get_admin_page_title() ); ?></h1>
12
+	<h1><?php echo esc_html(get_admin_page_title()); ?></h1>
13 13
 
14
-	<?php if ( $tabs ) { ?>
14
+	<?php if ($tabs) { ?>
15 15
 		<nav class="nav-tab-wrapper wpi-nav-tab-wrapper">
16 16
 			<?php
17
-			foreach ( $tabs as $name => $label ) {
18
-				echo '<a href="' . esc_url( admin_url( 'admin.php?page=wpi-addons&tab=' . $name ) ) . '" class="nav-tab ' . ( $current_tab == $name ? 'nav-tab-active' : '' ) . '">' . esc_html( $label ) . '</a>';
17
+			foreach ($tabs as $name => $label) {
18
+				echo '<a href="' . esc_url(admin_url('admin.php?page=wpi-addons&tab=' . $name)) . '" class="nav-tab ' . ($current_tab == $name ? 'nav-tab-active' : '') . '">' . esc_html($label) . '</a>';
19 19
 			}
20
-			do_action( 'wpi_addons_tabs' );
20
+			do_action('wpi_addons_tabs');
21 21
 			?>
22 22
 		</nav>
23 23
 
24 24
 		<?php
25 25
 
26
-		if ( $current_tab == 'membership' ) {
26
+		if ($current_tab == 'membership') {
27 27
 
28 28
 			?>
29 29
 
@@ -32,42 +32,42 @@  discard block
 block discarded – undo
32 32
 <!--
33 33
 				<h2>With our WPInvoicing Membership you get access to all our products!</h2>
34 34
 				<p><a class="button button-primary" href="https://wpinvoicing.com/downloads/membership/">View Memberships</a></p>-->
35
-				<?php if ( defined( 'WP_EASY_UPDATES_ACTIVE' ) ) { ?>
36
-					<h2><?php esc_html_e( 'Have a membership key?', 'invoicing' ); ?></h2>
35
+				<?php if (defined('WP_EASY_UPDATES_ACTIVE')) { ?>
36
+					<h2><?php esc_html_e('Have a membership key?', 'invoicing'); ?></h2>
37 37
 					<p>
38 38
 						<?php
39
-						$wpeu_admin = new External_Updates_Admin( 'wpinvoicing.com', '1' );
40
-						echo $wpeu_admin->render_licence_actions( 'wpinvoicing.com', 'membership', array( 95, 106, 108, 12351 ) );
39
+						$wpeu_admin = new External_Updates_Admin('wpinvoicing.com', '1');
40
+						echo $wpeu_admin->render_licence_actions('wpinvoicing.com', 'membership', array(95, 106, 108, 12351));
41 41
 						?>
42 42
 					</p>
43 43
 				<?php } ?>
44 44
 
45 45
 				<div class="membership-cta-contet">
46 46
 					<div class="main-cta">
47
-							<h2><?php esc_html_e( 'Membership benefits Include:', 'invoicing' ); ?></h2>
47
+							<h2><?php esc_html_e('Membership benefits Include:', 'invoicing'); ?></h2>
48 48
 							<div class="feature-list">
49 49
 								<ul>
50 50
 									<?php
51 51
 									$addon_obj = new WPInv_Admin_Addons();
52
-									if ( $addons = $addon_obj->get_section_data( 'addons' ) ) {
53
-										foreach ( $addons as $addon ) {
54
-											echo '<li><i class="far fa-check-circle fa-sm"></i> ' . esc_html( $addon->info->title ) . '</li>';
52
+									if ($addons = $addon_obj->get_section_data('addons')) {
53
+										foreach ($addons as $addon) {
54
+											echo '<li><i class="far fa-check-circle fa-sm"></i> ' . esc_html($addon->info->title) . '</li>';
55 55
 										}
56 56
 									}
57 57
 									?>
58 58
 									</ul>
59 59
 
60 60
 									<div class="feature-cta">
61
-										<h3><?php esc_html_e( 'Membership Starts from', 'invoicing' ); ?></h3>
61
+										<h3><?php esc_html_e('Membership Starts from', 'invoicing'); ?></h3>
62 62
 										<h4>$99</h4>
63
-										<a href="https://wpinvoicing.com/downloads/membership/" target="_blank"><?php esc_attr_e( 'Buy Membership', 'invoicing' ); ?></a>
63
+										<a href="https://wpinvoicing.com/downloads/membership/" target="_blank"><?php esc_attr_e('Buy Membership', 'invoicing'); ?></a>
64 64
 									</div>
65
-									<h3><?php esc_html_e( 'Included Gateways:', 'invoicing' ); ?></h3>
65
+									<h3><?php esc_html_e('Included Gateways:', 'invoicing'); ?></h3>
66 66
 									<ul>
67 67
 										<?php
68
-										if ( $addons = $addon_obj->get_section_data( 'gateways' ) ) {
69
-											foreach ( $addons as $addon ) {
70
-												echo '<li><i class="far fa-check-circle fa-sm"></i> ' . esc_html( $addon->info->title ) . '</li>';
68
+										if ($addons = $addon_obj->get_section_data('gateways')) {
69
+											foreach ($addons as $addon) {
70
+												echo '<li><i class="far fa-check-circle fa-sm"></i> ' . esc_html($addon->info->title) . '</li>';
71 71
 											}
72 72
 										}
73 73
 										?>
@@ -81,7 +81,7 @@  discard block
 block discarded – undo
81 81
 						<div class="testimonial-content">
82 82
 							<div class="t-image">
83 83
 								<?php
84
-									echo '<img src="' . esc_url( plugins_url( 'images/t-image2.png', dirname( __FILE__ ) ) ) . '" > ';
84
+									echo '<img src="' . esc_url(plugins_url('images/t-image2.png', dirname(__FILE__))) . '" > ';
85 85
 								?>
86 86
 							</div>
87 87
 							<div class="t-content">
@@ -101,7 +101,7 @@  discard block
 block discarded – undo
101 101
 						<div class="testimonial-content">
102 102
 							<div class="t-image">
103 103
 								<?php
104
-									echo '<img src="' . esc_url( plugins_url( 'images/t-image1.png', dirname( __FILE__ ) ) ) . '" > ';
104
+									echo '<img src="' . esc_url(plugins_url('images/t-image1.png', dirname(__FILE__))) . '" > ';
105 105
 								?>
106 106
 							</div>
107 107
 							<div class="t-content">
@@ -117,8 +117,8 @@  discard block
 block discarded – undo
117 117
 						</div>
118 118
 					</div>
119 119
 					<div class="member-footer">
120
-						<a class="footer-btn" href="https://wpinvoicing.com/downloads/membership/" target="_blank"><?php esc_html_e( 'Buy Membership', 'invoicing' ); ?></a>
121
-						<a class="footer-link" href="post-new.php?post_type=wpi_invoice"><?php esc_html_e( 'Create Invoice', 'invoicing' ); ?></a>
120
+						<a class="footer-btn" href="https://wpinvoicing.com/downloads/membership/" target="_blank"><?php esc_html_e('Buy Membership', 'invoicing'); ?></a>
121
+						<a class="footer-link" href="post-new.php?post_type=wpi_invoice"><?php esc_html_e('Create Invoice', 'invoicing'); ?></a>
122 122
 					</div>
123 123
 				</div>
124 124
 
@@ -129,63 +129,63 @@  discard block
 block discarded – undo
129 129
 		} else {
130 130
 			$installed_plugins = get_plugins();
131 131
             $addon_obj = new WPInv_Admin_Addons();
132
-			if ( $addons = $addon_obj->get_section_data( $current_tab ) ) :
132
+			if ($addons = $addon_obj->get_section_data($current_tab)) :
133 133
 				//print_r($addons);
134 134
 				?>
135 135
 				<ul class="wpi-products">
136 136
                 <?php
137
-                foreach ( $addons as $addon ) :
138
-                        if ( 965 == $addon->info->id ) {
139
-continue;}// don't show quote add on
137
+                foreach ($addons as $addon) :
138
+                        if (965 == $addon->info->id) {
139
+continue; }// don't show quote add on
140 140
 						?>
141 141
                         <li class="wpi-product">
142 142
 								<div class="wpi-product-title">
143 143
 									<h3>
144 144
                                     <?php
145
-										if ( ! empty( $addon->info->excerpt ) ) {
146
-										wpi_help_tip( $addon->info->excerpt, false, false, true );
145
+										if (!empty($addon->info->excerpt)) {
146
+										wpi_help_tip($addon->info->excerpt, false, false, true);
147 147
 										}
148
-										echo esc_html( $addon->info->title );
148
+										echo esc_html($addon->info->title);
149 149
                                         ?>
150 150
                                         </h3>
151 151
 								</div>
152 152
 
153 153
 								<span class="wpi-product-image">
154
-									<?php if ( ! empty( $addon->info->thumbnail ) ) : ?>
155
-										<img src="<?php echo esc_attr( $addon->info->thumbnail ); ?>"/>
154
+									<?php if (!empty($addon->info->thumbnail)) : ?>
155
+										<img src="<?php echo esc_attr($addon->info->thumbnail); ?>"/>
156 156
 									<?php
157 157
                                     endif;
158 158
 
159
-									if ( 'stripe-payment-gateway' == $addon->info->slug ) {
159
+									if ('stripe-payment-gateway' == $addon->info->slug) {
160 160
 										$addon->info->slug = 'getpaid-stripe-payments';
161 161
 										$addon->info->link = 'https://wordpress.org/plugins/getpaid-stripe-payments/';
162 162
 									}
163
-                                    elseif( 'wallet' == $addon->info->slug ){
163
+                                    elseif ('wallet' == $addon->info->slug) {
164 164
 										$addon->info->slug = 'getpaid-wallet';
165 165
 										$addon->info->link = 'https://wordpress.org/plugins/getpaid-wallet/';
166 166
 									}
167
-                                    elseif( 'item-inventory' == $addon->info->slug ){
167
+                                    elseif ('item-inventory' == $addon->info->slug) {
168 168
 										$addon->info->slug = 'getpaid-item-inventory';
169 169
 										$addon->info->link = 'https://wordpress.org/plugins/getpaid-item-inventory/';
170 170
 									}
171 171
 
172
-									if ( isset( $addon->info->link ) && substr( $addon->info->link, 0, 21 ) === 'https://wordpress.org' ) {
173
-										echo '<a href="' . esc_url( admin_url( '/plugin-install.php?tab=plugin-information&plugin=' . $addon->info->slug ) ) . '&width=770&height=660&TB_iframe=true" class="thickbox" >';
174
-										echo '<span class="wpi-product-info">' . esc_html__( 'More info', 'invoicing' ) . '</span>';
172
+									if (isset($addon->info->link) && substr($addon->info->link, 0, 21) === 'https://wordpress.org') {
173
+										echo '<a href="' . esc_url(admin_url('/plugin-install.php?tab=plugin-information&plugin=' . $addon->info->slug)) . '&width=770&height=660&TB_iframe=true" class="thickbox" >';
174
+										echo '<span class="wpi-product-info">' . esc_html__('More info', 'invoicing') . '</span>';
175 175
 										echo '</a>';
176
-									} elseif ( isset( $addon->info->link ) && ( substr( $addon->info->link, 0, 23 ) === 'https://wpinvoicing.com' || substr( $addon->info->link, 0, 21 ) === 'https://wpgetpaid.com' ) ) {
177
-										if ( defined( 'WP_EASY_UPDATES_ACTIVE' ) ) {
178
-											$url = admin_url( '/plugin-install.php?tab=plugin-information&plugin=' . $addon->info->slug . '&width=770&height=660&item_id=' . $addon->info->id . '&update_url=https://wpgetpaid.com&TB_iframe=true' );
176
+									} elseif (isset($addon->info->link) && (substr($addon->info->link, 0, 23) === 'https://wpinvoicing.com' || substr($addon->info->link, 0, 21) === 'https://wpgetpaid.com')) {
177
+										if (defined('WP_EASY_UPDATES_ACTIVE')) {
178
+											$url = admin_url('/plugin-install.php?tab=plugin-information&plugin=' . $addon->info->slug . '&width=770&height=660&item_id=' . $addon->info->id . '&update_url=https://wpgetpaid.com&TB_iframe=true');
179 179
 										} else {
180 180
 											// if installed show activation link
181
-											if ( isset( $installed_plugins['wp-easy-updates/external-updates.php'] ) ) {
181
+											if (isset($installed_plugins['wp-easy-updates/external-updates.php'])) {
182 182
 												$url = '#TB_inline?width=600&height=50&inlineId=wpi-wpeu-required-activation';
183 183
 											} else {
184 184
 												$url = '#TB_inline?width=600&height=50&inlineId=wpi-wpeu-required-for-external';
185 185
 											}
186 186
 										}
187
-										echo '<a href="' . esc_url( $url ) . '" class="thickbox">';
188
-										echo '<span class="wpi-product-info">' . esc_html__( 'More info', 'invoicing' ) . '</span>';
187
+										echo '<a href="' . esc_url($url) . '" class="thickbox">';
188
+										echo '<span class="wpi-product-info">' . esc_html__('More info', 'invoicing') . '</span>';
189 189
 										echo '</a>';
190 190
 									}
191 191
 
@@ -196,7 +196,7 @@  discard block
 block discarded – undo
196 196
 
197 197
 								<span class="wpi-product-button">
198 198
 									<?php
199
-                                    $addon_obj->output_button( $addon );
199
+                                    $addon_obj->output_button($addon);
200 200
 									?>
201 201
 								</span>
202 202
 
@@ -210,21 +210,21 @@  discard block
 block discarded – undo
210 210
 
211 211
 	<div class="clearfix" ></div>
212 212
 
213
-	<?php if ( $current_tab == 'addons' ) { ?>
214
-	<p><?php printf(  esc_attr__( 'All of our Addons can be found on wpGetPaid.com here: %sInvoicing Addons%s', 'invoicing' ), '<a href="https://wpinvoicing.com/downloads/category/addons/">','</a>' ); ?></p>
215
-	<?php } if ( $current_tab == 'gateways' ) { ?>
216
-    <p><?php printf( esc_attr__( 'All of our Payment Gateways can be found on wpGetPaid.com here: %sGetPaid Payment Gateways %s', 'invoicing' ), '<a href="https://wpinvoicing.com/downloads/category/gateways/">','</a>'  ); ?></p>
213
+	<?php if ($current_tab == 'addons') { ?>
214
+	<p><?php printf(esc_attr__('All of our Addons can be found on wpGetPaid.com here: %sInvoicing Addons%s', 'invoicing'), '<a href="https://wpinvoicing.com/downloads/category/addons/">', '</a>'); ?></p>
215
+	<?php } if ($current_tab == 'gateways') { ?>
216
+    <p><?php printf(esc_attr__('All of our Payment Gateways can be found on wpGetPaid.com here: %sGetPaid Payment Gateways %s', 'invoicing'), '<a href="https://wpinvoicing.com/downloads/category/gateways/">', '</a>'); ?></p>
217 217
     <?php } ?>
218 218
 
219
-	<div id="wpi-wpeu-required-activation" style="display:none;"><span class="wpi-notification "><?php echo wp_kses_post(  sprintf( __( "The plugin <a href='https://wpeasyupdates.com/' target='_blank'>WP Easy Updates</a> is required to check for and update some installed plugins/themes, please <a href='%s'>activate</a> it now.", 'invoicing' ), wp_nonce_url( admin_url( 'plugins.php?action=activate&plugin=wp-easy-updates/external-updates.php' ), 'activate-plugin_wp-easy-updates/external-updates.php' ) ) ); ?></span></div>
220
-	<div id="wpi-wpeu-required-for-external" style="display:none;"><span class="wpi-notification "><?php echo wp_kses_post( sprintf( __( "The plugin <a href='https://wpeasyupdates.com/' target='_blank'>WP Easy Updates</a> is required to check for and update some installed plugins/themes, please <a href='%s' onclick='window.open(\"https://wpeasyupdates.com/wp-easy-updates.zip\", \"_blank\");' >download</a> and install it now.", 'invoicing' ), admin_url( 'plugin-install.php?tab=upload&wpeu-install=true' ) ) ); ?></span></div>
219
+	<div id="wpi-wpeu-required-activation" style="display:none;"><span class="wpi-notification "><?php echo wp_kses_post(sprintf(__("The plugin <a href='https://wpeasyupdates.com/' target='_blank'>WP Easy Updates</a> is required to check for and update some installed plugins/themes, please <a href='%s'>activate</a> it now.", 'invoicing'), wp_nonce_url(admin_url('plugins.php?action=activate&plugin=wp-easy-updates/external-updates.php'), 'activate-plugin_wp-easy-updates/external-updates.php'))); ?></span></div>
220
+	<div id="wpi-wpeu-required-for-external" style="display:none;"><span class="wpi-notification "><?php echo wp_kses_post(sprintf(__("The plugin <a href='https://wpeasyupdates.com/' target='_blank'>WP Easy Updates</a> is required to check for and update some installed plugins/themes, please <a href='%s' onclick='window.open(\"https://wpeasyupdates.com/wp-easy-updates.zip\", \"_blank\");' >download</a> and install it now.", 'invoicing'), admin_url('plugin-install.php?tab=upload&wpeu-install=true'))); ?></span></div>
221 221
 	<div id="wpeu-licence-popup" style="display:none;">
222 222
 		<span class="wpi-notification noti-white">
223
-			<h3 class="wpeu-licence-title"><?php esc_html_e( 'Licence key', 'invoicing' ); ?></h3>
224
-			<input class="wpeu-licence-key" type="text" placeholder="<?php esc_attr_e( 'Enter your licence key', 'invoicing' ); ?>"> <button class="button-primary wpeu-licence-popup-button" ><?php esc_html_e( 'Install', 'invoicing' ); ?></button>
223
+			<h3 class="wpeu-licence-title"><?php esc_html_e('Licence key', 'invoicing'); ?></h3>
224
+			<input class="wpeu-licence-key" type="text" placeholder="<?php esc_attr_e('Enter your licence key', 'invoicing'); ?>"> <button class="button-primary wpeu-licence-popup-button" ><?php esc_html_e('Install', 'invoicing'); ?></button>
225 225
 			<br>
226 226
 			<?php
227
-			printf( esc_html__( '%1$sFind your licence key here%2$s OR %3$sBuy one here%4$s', 'invoicing' ), '<a href="https://wpinvoicing.com/your-account/" target="_blank">', '</a>', '<a class="wpeu-licence-link" href="https://wpinvoicing.com/downloads/category/addons/" target="_blank">', '</a>' );
227
+			printf(esc_html__('%1$sFind your licence key here%2$s OR %3$sBuy one here%4$s', 'invoicing'), '<a href="https://wpinvoicing.com/your-account/" target="_blank">', '</a>', '<a class="wpeu-licence-link" href="https://wpinvoicing.com/downloads/category/addons/" target="_blank">', '</a>');
228 228
 			?>
229 229
 		</span>
230 230
 	</div>
Please login to merge, or discard this patch.
Braces   +2 added lines, -4 removed lines patch added patch discarded remove patch
@@ -159,12 +159,10 @@
 block discarded – undo
159 159
 									if ( 'stripe-payment-gateway' == $addon->info->slug ) {
160 160
 										$addon->info->slug = 'getpaid-stripe-payments';
161 161
 										$addon->info->link = 'https://wordpress.org/plugins/getpaid-stripe-payments/';
162
-									}
163
-                                    elseif( 'wallet' == $addon->info->slug ){
162
+									} elseif( 'wallet' == $addon->info->slug ){
164 163
 										$addon->info->slug = 'getpaid-wallet';
165 164
 										$addon->info->link = 'https://wordpress.org/plugins/getpaid-wallet/';
166
-									}
167
-                                    elseif( 'item-inventory' == $addon->info->slug ){
165
+									} elseif( 'item-inventory' == $addon->info->slug ){
168 166
 										$addon->info->slug = 'getpaid-item-inventory';
169 167
 										$addon->info->link = 'https://wordpress.org/plugins/getpaid-item-inventory/';
170 168
 									}
Please login to merge, or discard this patch.
includes/class-wpinv-addons.php 2 patches
Indentation   +210 added lines, -210 removed lines patch added patch discarded remove patch
@@ -6,7 +6,7 @@  discard block
 block discarded – undo
6 6
  *
7 7
  */
8 8
 if ( ! defined( 'ABSPATH' ) ) {
9
-	exit;
9
+    exit;
10 10
 }
11 11
 
12 12
 /**
@@ -15,94 +15,94 @@  discard block
 block discarded – undo
15 15
 class WPInv_Admin_Addons extends Ayecode_Addons {
16 16
 
17 17
 
18
-	/**
19
-	 * Get the extensions page tabs.
20
-	 *
21
-	 * @return array of tabs.
22
-	 */
23
-	public function get_tabs() {
24
-		$tabs = array(
25
-			'addons'              => __( 'Addons', 'invoicing' ),
18
+    /**
19
+     * Get the extensions page tabs.
20
+     *
21
+     * @return array of tabs.
22
+     */
23
+    public function get_tabs() {
24
+        $tabs = array(
25
+            'addons'              => __( 'Addons', 'invoicing' ),
26 26
             'gateways'            => __( 'Payment Gateways', 'invoicing' ),
27 27
             'recommended_plugins' => __( 'Recommended plugins', 'invoicing' ),
28 28
             'membership'          => __( 'Membership', 'invoicing' ),
29
-		);
30
-
31
-		return $tabs;
32
-	}
33
-
34
-	/**
35
-	 * Get section content for the addons screen.
36
-	 *
37
-	 * @param  string $section_id
38
-	 *
39
-	 * @return array
40
-	 */
41
-	public function get_section_data( $section_id ) {
42
-		$section      = self::get_tab( $section_id );
43
-		$api_url = 'https://wpinvoicing.com/edd-api/v2/products/';
44
-		$section_data = new stdClass();
45
-
46
-		if ( $section_id == 'recommended_plugins' ) {
47
-			$section_data->products = self::get_recommend_wp_plugins_edd_formatted();
48
-		} elseif ( ! empty( $section ) ) {
49
-			if ( false === ( $section_data = get_transient( 'wpi_addons_section_' . $section_id ) ) ) { //@todo restore after testing
50
-			//if ( 1==1) {
51
-
52
-				$query_args = array(
53
-					'category' => $section_id,
54
-					'number'   => 100,
55
-				);
56
-				$query_args = apply_filters( 'wpeu_edd_api_query_args', $query_args, $api_url, $section_id );
57
-
58
-				$raw_section = wp_safe_remote_get(
29
+        );
30
+
31
+        return $tabs;
32
+    }
33
+
34
+    /**
35
+     * Get section content for the addons screen.
36
+     *
37
+     * @param  string $section_id
38
+     *
39
+     * @return array
40
+     */
41
+    public function get_section_data( $section_id ) {
42
+        $section      = self::get_tab( $section_id );
43
+        $api_url = 'https://wpinvoicing.com/edd-api/v2/products/';
44
+        $section_data = new stdClass();
45
+
46
+        if ( $section_id == 'recommended_plugins' ) {
47
+            $section_data->products = self::get_recommend_wp_plugins_edd_formatted();
48
+        } elseif ( ! empty( $section ) ) {
49
+            if ( false === ( $section_data = get_transient( 'wpi_addons_section_' . $section_id ) ) ) { //@todo restore after testing
50
+            //if ( 1==1) {
51
+
52
+                $query_args = array(
53
+                    'category' => $section_id,
54
+                    'number'   => 100,
55
+                );
56
+                $query_args = apply_filters( 'wpeu_edd_api_query_args', $query_args, $api_url, $section_id );
57
+
58
+                $raw_section = wp_safe_remote_get(
59 59
                     esc_url_raw( add_query_arg( $query_args, $api_url ) ),
60 60
                     array(
61
-						'user-agent' => 'Invoicing Addons Page',
62
-						'timeout'    => 15,
61
+                        'user-agent' => 'Invoicing Addons Page',
62
+                        'timeout'    => 15,
63 63
                     )
64 64
                 );
65 65
 
66
-				if ( ! is_wp_error( $raw_section ) ) {
67
-					$section_data = json_decode( wp_remote_retrieve_body( $raw_section ) );
66
+                if ( ! is_wp_error( $raw_section ) ) {
67
+                    $section_data = json_decode( wp_remote_retrieve_body( $raw_section ) );
68 68
 
69
-					if ( ! empty( $section_data->products ) ) {
70
-						set_transient( 'wpi_addons_section_' . $section_id, $section_data, DAY_IN_SECONDS );
71
-					}
72
-				}
73
-			}
69
+                    if ( ! empty( $section_data->products ) ) {
70
+                        set_transient( 'wpi_addons_section_' . $section_id, $section_data, DAY_IN_SECONDS );
71
+                    }
72
+                }
73
+            }
74 74
 }
75 75
 
76
-		$products = isset( $section_data->products ) ? $section_data->products : array();
77
-		if ( 'addons' == $section_id ) {
78
-
79
-			$quotes = new stdClass();
80
-			$quotes->info = new stdClass();
81
-			$quotes->info->id = '';
82
-			$quotes->info->slug = 'invoicing-quotes';
83
-			$quotes->info->title = __( 'Quotes', 'invoicing' );
84
-			$quotes->info->excerpt = __( 'Create quotes and estimates', 'invoicing' );
85
-			$quotes->info->link = 'https://wordpress.org/plugins/invoicing-quotes/';
86
-			$quotes->info->thumbnail = WPINV_PLUGIN_URL . 'assets/images/Quotes-1-768x384.png';
87
-
88
-			$products[] = $quotes;
89
-		}
90
-
91
-		return apply_filters( 'wpi_addons_section_data', $products, $section_id );
92
-	}
93
-
94
-	/**
95
-	 * Outputs a button.
96
-	 *ccc
97
-	 * @param string $url
98
-	 * @param string $text
99
-	 * @param string $theme
100
-	 * @param string $plugin
101
-	 */
102
-	public function output_button( $addon ) {
76
+        $products = isset( $section_data->products ) ? $section_data->products : array();
77
+        if ( 'addons' == $section_id ) {
78
+
79
+            $quotes = new stdClass();
80
+            $quotes->info = new stdClass();
81
+            $quotes->info->id = '';
82
+            $quotes->info->slug = 'invoicing-quotes';
83
+            $quotes->info->title = __( 'Quotes', 'invoicing' );
84
+            $quotes->info->excerpt = __( 'Create quotes and estimates', 'invoicing' );
85
+            $quotes->info->link = 'https://wordpress.org/plugins/invoicing-quotes/';
86
+            $quotes->info->thumbnail = WPINV_PLUGIN_URL . 'assets/images/Quotes-1-768x384.png';
87
+
88
+            $products[] = $quotes;
89
+        }
90
+
91
+        return apply_filters( 'wpi_addons_section_data', $products, $section_id );
92
+    }
93
+
94
+    /**
95
+     * Outputs a button.
96
+     *ccc
97
+     * @param string $url
98
+     * @param string $text
99
+     * @param string $theme
100
+     * @param string $plugin
101
+     */
102
+    public function output_button( $addon ) {
103 103
 
104 104
 //        print_r($addon);
105
-		$current_tab     = empty( $_GET['tab'] ) ? 'addons' : sanitize_title( $_GET['tab'] );
105
+        $current_tab     = empty( $_GET['tab'] ) ? 'addons' : sanitize_title( $_GET['tab'] );
106 106
 //		$button_text = __('Free','invoicing');
107 107
 //		$licensing = false;
108 108
 //		$installed = false;
@@ -114,128 +114,128 @@  discard block
 block discarded – undo
114 114
 //		$install_status = 'get';
115 115
 //		$onclick = '';
116 116
 
117
-		$wp_org_themes = array( 'supreme-directory', 'directory-starter' );
118
-
119
-		$button_args = array(
120
-			'type'           => ($current_tab == 'addons' || $current_tab == 'gateways') ? 'addons' : $current_tab,
121
-			'id'             => isset( $addon->info->id ) ? absint( $addon->info->id ) : '',
122
-			'title'          => isset( $addon->info->title ) ? $addon->info->title : '',
123
-			'button_text'    => __( 'Free', 'invoicing' ),
124
-			'price_text'     => __( 'Free', 'invoicing' ),
125
-			'link'           => isset( $addon->info->link ) ? $addon->info->link : '', // link to product
126
-			'url'            => isset( $addon->info->link ) ? $addon->info->link : '', // button url
127
-			'class'          => 'button-primary',
128
-			'install_status' => 'get',
129
-			'installed'      => false,
130
-			'price'          => '',
131
-			'licensing'      => isset( $addon->licensing->enabled ) && $addon->licensing->enabled ? true : false,
132
-			'license'        => isset( $addon->licensing->license ) && $addon->licensing->license ? $addon->licensing->license : '',
133
-			'onclick'        => '',
134
-			'slug'           => isset( $addon->info->slug ) ? $addon->info->slug : '',
135
-			'active'         => false,
136
-			'file'           => '',
137
-			'update_url'     => '',
138
-		);
139
-
140
-		if ( 'invoicing-quotes' == $addon->info->slug || 'getpaid-stripe-payments' == $addon->info->slug || ( $current_tab == 'recommended_plugins' && isset( $addon->info->slug ) && $addon->info->slug ) ) {
141
-			include_once ABSPATH . 'wp-admin/includes/plugin-install.php'; //for plugins_api..
142
-			$status = install_plugin_install_status(
117
+        $wp_org_themes = array( 'supreme-directory', 'directory-starter' );
118
+
119
+        $button_args = array(
120
+            'type'           => ($current_tab == 'addons' || $current_tab == 'gateways') ? 'addons' : $current_tab,
121
+            'id'             => isset( $addon->info->id ) ? absint( $addon->info->id ) : '',
122
+            'title'          => isset( $addon->info->title ) ? $addon->info->title : '',
123
+            'button_text'    => __( 'Free', 'invoicing' ),
124
+            'price_text'     => __( 'Free', 'invoicing' ),
125
+            'link'           => isset( $addon->info->link ) ? $addon->info->link : '', // link to product
126
+            'url'            => isset( $addon->info->link ) ? $addon->info->link : '', // button url
127
+            'class'          => 'button-primary',
128
+            'install_status' => 'get',
129
+            'installed'      => false,
130
+            'price'          => '',
131
+            'licensing'      => isset( $addon->licensing->enabled ) && $addon->licensing->enabled ? true : false,
132
+            'license'        => isset( $addon->licensing->license ) && $addon->licensing->license ? $addon->licensing->license : '',
133
+            'onclick'        => '',
134
+            'slug'           => isset( $addon->info->slug ) ? $addon->info->slug : '',
135
+            'active'         => false,
136
+            'file'           => '',
137
+            'update_url'     => '',
138
+        );
139
+
140
+        if ( 'invoicing-quotes' == $addon->info->slug || 'getpaid-stripe-payments' == $addon->info->slug || ( $current_tab == 'recommended_plugins' && isset( $addon->info->slug ) && $addon->info->slug ) ) {
141
+            include_once ABSPATH . 'wp-admin/includes/plugin-install.php'; //for plugins_api..
142
+            $status = install_plugin_install_status(
143 143
                 array(
144
-					'slug'    => $button_args['slug'],
145
-					'version' => '',
144
+                    'slug'    => $button_args['slug'],
145
+                    'version' => '',
146 146
                 )
147 147
             );
148
-			$button_args['install_status'] = isset( $status['status'] ) ? $status['status'] : 'install';
149
-			$button_args['file'] = isset( $status['file'] ) ? $status['file'] : '';
150
-		} elseif ( ($current_tab == 'addons' || $current_tab == 'gateways') && isset( $addon->info->id ) && $addon->info->id ) {
151
-			include_once ABSPATH . 'wp-admin/includes/plugin-install.php'; //for plugins_api..
152
-			if ( ! empty( $addon->licensing->edd_slug ) ) {
148
+            $button_args['install_status'] = isset( $status['status'] ) ? $status['status'] : 'install';
149
+            $button_args['file'] = isset( $status['file'] ) ? $status['file'] : '';
150
+        } elseif ( ($current_tab == 'addons' || $current_tab == 'gateways') && isset( $addon->info->id ) && $addon->info->id ) {
151
+            include_once ABSPATH . 'wp-admin/includes/plugin-install.php'; //for plugins_api..
152
+            if ( ! empty( $addon->licensing->edd_slug ) ) {
153 153
 $button_args['slug'] = $addon->licensing->edd_slug;}
154
-			$status = self::install_plugin_install_status( $addon );
155
-			$button_args['file'] = isset( $status['file'] ) ? $status['file'] : '';
156
-			if ( isset( $status['status'] ) ) {
154
+            $status = self::install_plugin_install_status( $addon );
155
+            $button_args['file'] = isset( $status['file'] ) ? $status['file'] : '';
156
+            if ( isset( $status['status'] ) ) {
157 157
 $button_args['install_status'] = $status['status'];}
158
-			$button_args['update_url'] = 'https://wpinvoicing.com';
159
-		} elseif ( $current_tab == 'themes' && isset( $addon->info->id ) && $addon->info->id ) {
160
-			if ( ! empty( $addon->licensing->edd_slug ) ) {
158
+            $button_args['update_url'] = 'https://wpinvoicing.com';
159
+        } elseif ( $current_tab == 'themes' && isset( $addon->info->id ) && $addon->info->id ) {
160
+            if ( ! empty( $addon->licensing->edd_slug ) ) {
161 161
 $button_args['slug'] = $addon->licensing->edd_slug;}
162
-			$button_args['installed'] = self::is_theme_installed( $addon );
163
-			if ( ! in_array( $button_args['slug'], $wp_org_themes ) ) {
164
-				$button_args['update_url'] = 'https://wpinvoicing.com';
165
-			}
166
-		}
167
-
168
-		// set price
169
-		if ( isset( $addon->pricing ) && ! empty( $addon->pricing ) ) {
170
-			if ( is_object( $addon->pricing ) ) {
171
-				$prices = (array)$addon->pricing;
172
-				$button_args['price'] = reset( $prices );
173
-			} elseif ( isset( $addon->pricing ) ) {
174
-				$button_args['price'] = $addon->pricing;
175
-			}
176
-		}
177
-
178
-		// set price text
179
-		if ( $button_args['price'] && $button_args['price'] != '0.00' ) {
180
-			$button_args['price_text'] = sprintf( __( 'From: $%d', 'invoicing' ), $button_args['price'] );
181
-		}
182
-
183
-		// set if installed
184
-		if ( in_array( $button_args['install_status'], array( 'installed', 'latest_installed', 'update_available', 'newer_installed' ) ) ) {
185
-			$button_args['installed'] = true;
186
-		}
162
+            $button_args['installed'] = self::is_theme_installed( $addon );
163
+            if ( ! in_array( $button_args['slug'], $wp_org_themes ) ) {
164
+                $button_args['update_url'] = 'https://wpinvoicing.com';
165
+            }
166
+        }
167
+
168
+        // set price
169
+        if ( isset( $addon->pricing ) && ! empty( $addon->pricing ) ) {
170
+            if ( is_object( $addon->pricing ) ) {
171
+                $prices = (array)$addon->pricing;
172
+                $button_args['price'] = reset( $prices );
173
+            } elseif ( isset( $addon->pricing ) ) {
174
+                $button_args['price'] = $addon->pricing;
175
+            }
176
+        }
177
+
178
+        // set price text
179
+        if ( $button_args['price'] && $button_args['price'] != '0.00' ) {
180
+            $button_args['price_text'] = sprintf( __( 'From: $%d', 'invoicing' ), $button_args['price'] );
181
+        }
182
+
183
+        // set if installed
184
+        if ( in_array( $button_args['install_status'], array( 'installed', 'latest_installed', 'update_available', 'newer_installed' ) ) ) {
185
+            $button_args['installed'] = true;
186
+        }
187 187
 
188 188
 //		print_r($button_args);
189
-		// set if active
190
-		if ( $button_args['installed'] && ($button_args['file'] || $button_args['type'] == 'themes') ) {
191
-			if ( $button_args['type'] != 'themes' ) {
192
-				$button_args['active'] = is_plugin_active( $button_args['file'] );
193
-			} else {
194
-				$button_args['active'] = self::is_theme_active( $addon );
195
-			}
196
-		}
197
-
198
-		// set button text and class
199
-		if ( $button_args['active'] ) {
200
-			$button_args['button_text'] = __( 'Active', 'invoicing' );
201
-			$button_args['class'] = ' button-secondary disabled ';
202
-		} elseif ( $button_args['installed'] ) {
203
-			$button_args['button_text'] = __( 'Activate', 'invoicing' );
204
-
205
-			if ( $button_args['type'] != 'themes' ) {
206
-				if ( current_user_can( 'manage_options' ) ) {
207
-					$button_args['url'] = wp_nonce_url( admin_url( 'plugins.php?action=activate&plugin=' . $button_args['file'] ), 'activate-plugin_' . $button_args['file'] );
208
-				} else {
209
-					$button_args['url'] = '#';
210
-				}
211
-			} else {
212
-				if ( current_user_can( 'switch_themes' ) ) {
213
-					$button_args['url'] = self::get_theme_activation_url( $addon );
214
-				} else {
215
-					$button_args['url'] = '#';
216
-				}
217
-			}
189
+        // set if active
190
+        if ( $button_args['installed'] && ($button_args['file'] || $button_args['type'] == 'themes') ) {
191
+            if ( $button_args['type'] != 'themes' ) {
192
+                $button_args['active'] = is_plugin_active( $button_args['file'] );
193
+            } else {
194
+                $button_args['active'] = self::is_theme_active( $addon );
195
+            }
196
+        }
197
+
198
+        // set button text and class
199
+        if ( $button_args['active'] ) {
200
+            $button_args['button_text'] = __( 'Active', 'invoicing' );
201
+            $button_args['class'] = ' button-secondary disabled ';
202
+        } elseif ( $button_args['installed'] ) {
203
+            $button_args['button_text'] = __( 'Activate', 'invoicing' );
204
+
205
+            if ( $button_args['type'] != 'themes' ) {
206
+                if ( current_user_can( 'manage_options' ) ) {
207
+                    $button_args['url'] = wp_nonce_url( admin_url( 'plugins.php?action=activate&plugin=' . $button_args['file'] ), 'activate-plugin_' . $button_args['file'] );
208
+                } else {
209
+                    $button_args['url'] = '#';
210
+                }
211
+            } else {
212
+                if ( current_user_can( 'switch_themes' ) ) {
213
+                    $button_args['url'] = self::get_theme_activation_url( $addon );
214
+                } else {
215
+                    $button_args['url'] = '#';
216
+                }
217
+            }
218 218
         } else {
219
-			if ( $button_args['type'] == 'recommended_plugins' ) {
220
-				$button_args['button_text'] = __( 'Install', 'invoicing' );
221
-					} else {
222
-				$button_args['button_text'] = __( 'Get it', 'invoicing' );
219
+            if ( $button_args['type'] == 'recommended_plugins' ) {
220
+                $button_args['button_text'] = __( 'Install', 'invoicing' );
221
+                    } else {
222
+                $button_args['button_text'] = __( 'Get it', 'invoicing' );
223 223
 
224
-				/*if($button_args['type'] == 'themes' && in_array($button_args['slug'],$wp_org_themes) ){
224
+                /*if($button_args['type'] == 'themes' && in_array($button_args['slug'],$wp_org_themes) ){
225 225
 			$button_args['button_text'] = __('Install','invoicing');
226 226
 			$button_args['url'] = self::get_theme_install_url($button_args['slug']);
227 227
 			$button_args['onclick'] = 'gd_set_button_installing(this);';
228 228
 				}*/
229 229
 
230
-					}
231
-		}
230
+                    }
231
+        }
232 232
 
233
-		// filter the button arguments
234
-		$button_args = apply_filters( 'edd_api_button_args', $button_args );
233
+        // filter the button arguments
234
+        $button_args = apply_filters( 'edd_api_button_args', $button_args );
235 235
 //		print_r($button_args);
236
-		// set price text
237
-		if ( isset( $button_args['price_text'] ) ) {
238
-			?>
236
+        // set price text
237
+        if ( isset( $button_args['price_text'] ) ) {
238
+            ?>
239 239
 			<a
240 240
 				target="_blank"
241 241
 				class="addons-price-text"
@@ -243,9 +243,9 @@  discard block
 block discarded – undo
243 243
 				<?php echo esc_html( $button_args['price_text'] ); ?>
244 244
 			</a>
245 245
 			<?php
246
-		}
246
+        }
247 247
 
248
-		?>
248
+        ?>
249 249
 		<a
250 250
 			data-licence="<?php echo esc_attr( $button_args['license'] ); ?>"
251 251
 			data-licensing="<?php echo $button_args['licensing'] ? 1 : 0; ?>"
@@ -269,33 +269,33 @@  discard block
 block discarded – undo
269 269
 		</a>
270 270
 		<?php
271 271
 
272
-	}
273
-
274
-
275
-	/**
276
-	 * Handles output of the addons page in admin.
277
-	 */
278
-	public function output() {
279
-		$tabs            = self::get_tabs();
280
-		$sections        = self::get_sections();
281
-		$theme           = wp_get_theme();
282
-		$section_keys    = array_keys( $sections );
283
-		$current_section = isset( $_GET['section'] ) ? sanitize_text_field( $_GET['section'] ) : current( $section_keys );
284
-		$current_tab     = empty( $_GET['tab'] ) ? 'addons' : sanitize_title( $_GET['tab'] );
285
-		include_once WPINV_PLUGIN_DIR . '/includes/admin/html-admin-page-addons.php';
286
-	}
287
-
288
-	/**
289
-	 * A list of recommended wp.org plugins.
290
-	 * @return array
291
-	 */
292
-	public function get_recommend_wp_plugins() {
293
-		$plugins = array(
272
+    }
273
+
274
+
275
+    /**
276
+     * Handles output of the addons page in admin.
277
+     */
278
+    public function output() {
279
+        $tabs            = self::get_tabs();
280
+        $sections        = self::get_sections();
281
+        $theme           = wp_get_theme();
282
+        $section_keys    = array_keys( $sections );
283
+        $current_section = isset( $_GET['section'] ) ? sanitize_text_field( $_GET['section'] ) : current( $section_keys );
284
+        $current_tab     = empty( $_GET['tab'] ) ? 'addons' : sanitize_title( $_GET['tab'] );
285
+        include_once WPINV_PLUGIN_DIR . '/includes/admin/html-admin-page-addons.php';
286
+    }
287
+
288
+    /**
289
+     * A list of recommended wp.org plugins.
290
+     * @return array
291
+     */
292
+    public function get_recommend_wp_plugins() {
293
+        $plugins = array(
294 294
             'invoicing-quotes' => array(
295 295
                 'url'       => 'https://wordpress.org/plugins/invoicing-quotes/',
296 296
                 'slug'      => 'invoicing-quotes',
297
-				'name'      => 'Quotes',
298
-				'thumbnail' => 'https://ps.w.org/invoicing-quotes/assets/banner-772x250.png',
297
+                'name'      => 'Quotes',
298
+                'thumbnail' => 'https://ps.w.org/invoicing-quotes/assets/banner-772x250.png',
299 299
                 'desc'      => __( 'Allows you to create quotes, send them to clients and convert them to Invoices when accepted by the customer.', 'invoicing' ),
300 300
             ),
301 301
             'geodirectory'     => array(
@@ -310,8 +310,8 @@  discard block
 block discarded – undo
310 310
                 'name' => 'UsersWP',
311 311
                 'desc' => __( 'Allow frontend user login and registration as well as have slick profile pages.', 'invoicing' ),
312 312
             ),
313
-		);
313
+        );
314 314
 
315
-		return $plugins;
316
-	}
315
+        return $plugins;
316
+    }
317 317
 }
Please login to merge, or discard this patch.
Spacing   +98 added lines, -98 removed lines patch added patch discarded remove patch
@@ -5,7 +5,7 @@  discard block
 block discarded – undo
5 5
  * All Invoicing extensions screen related functions can be found here.
6 6
  *
7 7
  */
8
-if ( ! defined( 'ABSPATH' ) ) {
8
+if (!defined('ABSPATH')) {
9 9
 	exit;
10 10
 }
11 11
 
@@ -22,10 +22,10 @@  discard block
 block discarded – undo
22 22
 	 */
23 23
 	public function get_tabs() {
24 24
 		$tabs = array(
25
-			'addons'              => __( 'Addons', 'invoicing' ),
26
-            'gateways'            => __( 'Payment Gateways', 'invoicing' ),
27
-            'recommended_plugins' => __( 'Recommended plugins', 'invoicing' ),
28
-            'membership'          => __( 'Membership', 'invoicing' ),
25
+			'addons'              => __('Addons', 'invoicing'),
26
+            'gateways'            => __('Payment Gateways', 'invoicing'),
27
+            'recommended_plugins' => __('Recommended plugins', 'invoicing'),
28
+            'membership'          => __('Membership', 'invoicing'),
29 29
 		);
30 30
 
31 31
 		return $tabs;
@@ -38,57 +38,57 @@  discard block
 block discarded – undo
38 38
 	 *
39 39
 	 * @return array
40 40
 	 */
41
-	public function get_section_data( $section_id ) {
42
-		$section      = self::get_tab( $section_id );
41
+	public function get_section_data($section_id) {
42
+		$section      = self::get_tab($section_id);
43 43
 		$api_url = 'https://wpinvoicing.com/edd-api/v2/products/';
44 44
 		$section_data = new stdClass();
45 45
 
46
-		if ( $section_id == 'recommended_plugins' ) {
46
+		if ($section_id == 'recommended_plugins') {
47 47
 			$section_data->products = self::get_recommend_wp_plugins_edd_formatted();
48
-		} elseif ( ! empty( $section ) ) {
49
-			if ( false === ( $section_data = get_transient( 'wpi_addons_section_' . $section_id ) ) ) { //@todo restore after testing
48
+		} elseif (!empty($section)) {
49
+			if (false === ($section_data = get_transient('wpi_addons_section_' . $section_id))) { //@todo restore after testing
50 50
 			//if ( 1==1) {
51 51
 
52 52
 				$query_args = array(
53 53
 					'category' => $section_id,
54 54
 					'number'   => 100,
55 55
 				);
56
-				$query_args = apply_filters( 'wpeu_edd_api_query_args', $query_args, $api_url, $section_id );
56
+				$query_args = apply_filters('wpeu_edd_api_query_args', $query_args, $api_url, $section_id);
57 57
 
58 58
 				$raw_section = wp_safe_remote_get(
59
-                    esc_url_raw( add_query_arg( $query_args, $api_url ) ),
59
+                    esc_url_raw(add_query_arg($query_args, $api_url)),
60 60
                     array(
61 61
 						'user-agent' => 'Invoicing Addons Page',
62 62
 						'timeout'    => 15,
63 63
                     )
64 64
                 );
65 65
 
66
-				if ( ! is_wp_error( $raw_section ) ) {
67
-					$section_data = json_decode( wp_remote_retrieve_body( $raw_section ) );
66
+				if (!is_wp_error($raw_section)) {
67
+					$section_data = json_decode(wp_remote_retrieve_body($raw_section));
68 68
 
69
-					if ( ! empty( $section_data->products ) ) {
70
-						set_transient( 'wpi_addons_section_' . $section_id, $section_data, DAY_IN_SECONDS );
69
+					if (!empty($section_data->products)) {
70
+						set_transient('wpi_addons_section_' . $section_id, $section_data, DAY_IN_SECONDS);
71 71
 					}
72 72
 				}
73 73
 			}
74 74
 }
75 75
 
76
-		$products = isset( $section_data->products ) ? $section_data->products : array();
77
-		if ( 'addons' == $section_id ) {
76
+		$products = isset($section_data->products) ? $section_data->products : array();
77
+		if ('addons' == $section_id) {
78 78
 
79 79
 			$quotes = new stdClass();
80 80
 			$quotes->info = new stdClass();
81 81
 			$quotes->info->id = '';
82 82
 			$quotes->info->slug = 'invoicing-quotes';
83
-			$quotes->info->title = __( 'Quotes', 'invoicing' );
84
-			$quotes->info->excerpt = __( 'Create quotes and estimates', 'invoicing' );
83
+			$quotes->info->title = __('Quotes', 'invoicing');
84
+			$quotes->info->excerpt = __('Create quotes and estimates', 'invoicing');
85 85
 			$quotes->info->link = 'https://wordpress.org/plugins/invoicing-quotes/';
86 86
 			$quotes->info->thumbnail = WPINV_PLUGIN_URL . 'assets/images/Quotes-1-768x384.png';
87 87
 
88 88
 			$products[] = $quotes;
89 89
 		}
90 90
 
91
-		return apply_filters( 'wpi_addons_section_data', $products, $section_id );
91
+		return apply_filters('wpi_addons_section_data', $products, $section_id);
92 92
 	}
93 93
 
94 94
 	/**
@@ -99,10 +99,10 @@  discard block
 block discarded – undo
99 99
 	 * @param string $theme
100 100
 	 * @param string $plugin
101 101
 	 */
102
-	public function output_button( $addon ) {
102
+	public function output_button($addon) {
103 103
 
104 104
 //        print_r($addon);
105
-		$current_tab     = empty( $_GET['tab'] ) ? 'addons' : sanitize_title( $_GET['tab'] );
105
+		$current_tab = empty($_GET['tab']) ? 'addons' : sanitize_title($_GET['tab']);
106 106
 //		$button_text = __('Free','invoicing');
107 107
 //		$licensing = false;
108 108
 //		$installed = false;
@@ -114,30 +114,30 @@  discard block
 block discarded – undo
114 114
 //		$install_status = 'get';
115 115
 //		$onclick = '';
116 116
 
117
-		$wp_org_themes = array( 'supreme-directory', 'directory-starter' );
117
+		$wp_org_themes = array('supreme-directory', 'directory-starter');
118 118
 
119 119
 		$button_args = array(
120 120
 			'type'           => ($current_tab == 'addons' || $current_tab == 'gateways') ? 'addons' : $current_tab,
121
-			'id'             => isset( $addon->info->id ) ? absint( $addon->info->id ) : '',
122
-			'title'          => isset( $addon->info->title ) ? $addon->info->title : '',
123
-			'button_text'    => __( 'Free', 'invoicing' ),
124
-			'price_text'     => __( 'Free', 'invoicing' ),
125
-			'link'           => isset( $addon->info->link ) ? $addon->info->link : '', // link to product
126
-			'url'            => isset( $addon->info->link ) ? $addon->info->link : '', // button url
121
+			'id'             => isset($addon->info->id) ? absint($addon->info->id) : '',
122
+			'title'          => isset($addon->info->title) ? $addon->info->title : '',
123
+			'button_text'    => __('Free', 'invoicing'),
124
+			'price_text'     => __('Free', 'invoicing'),
125
+			'link'           => isset($addon->info->link) ? $addon->info->link : '', // link to product
126
+			'url'            => isset($addon->info->link) ? $addon->info->link : '', // button url
127 127
 			'class'          => 'button-primary',
128 128
 			'install_status' => 'get',
129 129
 			'installed'      => false,
130 130
 			'price'          => '',
131
-			'licensing'      => isset( $addon->licensing->enabled ) && $addon->licensing->enabled ? true : false,
132
-			'license'        => isset( $addon->licensing->license ) && $addon->licensing->license ? $addon->licensing->license : '',
131
+			'licensing'      => isset($addon->licensing->enabled) && $addon->licensing->enabled ? true : false,
132
+			'license'        => isset($addon->licensing->license) && $addon->licensing->license ? $addon->licensing->license : '',
133 133
 			'onclick'        => '',
134
-			'slug'           => isset( $addon->info->slug ) ? $addon->info->slug : '',
134
+			'slug'           => isset($addon->info->slug) ? $addon->info->slug : '',
135 135
 			'active'         => false,
136 136
 			'file'           => '',
137 137
 			'update_url'     => '',
138 138
 		);
139 139
 
140
-		if ( 'invoicing-quotes' == $addon->info->slug || 'getpaid-stripe-payments' == $addon->info->slug || ( $current_tab == 'recommended_plugins' && isset( $addon->info->slug ) && $addon->info->slug ) ) {
140
+		if ('invoicing-quotes' == $addon->info->slug || 'getpaid-stripe-payments' == $addon->info->slug || ($current_tab == 'recommended_plugins' && isset($addon->info->slug) && $addon->info->slug)) {
141 141
 			include_once ABSPATH . 'wp-admin/includes/plugin-install.php'; //for plugins_api..
142 142
 			$status = install_plugin_install_status(
143 143
                 array(
@@ -145,81 +145,81 @@  discard block
 block discarded – undo
145 145
 					'version' => '',
146 146
                 )
147 147
             );
148
-			$button_args['install_status'] = isset( $status['status'] ) ? $status['status'] : 'install';
149
-			$button_args['file'] = isset( $status['file'] ) ? $status['file'] : '';
150
-		} elseif ( ($current_tab == 'addons' || $current_tab == 'gateways') && isset( $addon->info->id ) && $addon->info->id ) {
148
+			$button_args['install_status'] = isset($status['status']) ? $status['status'] : 'install';
149
+			$button_args['file'] = isset($status['file']) ? $status['file'] : '';
150
+		} elseif (($current_tab == 'addons' || $current_tab == 'gateways') && isset($addon->info->id) && $addon->info->id) {
151 151
 			include_once ABSPATH . 'wp-admin/includes/plugin-install.php'; //for plugins_api..
152
-			if ( ! empty( $addon->licensing->edd_slug ) ) {
153
-$button_args['slug'] = $addon->licensing->edd_slug;}
154
-			$status = self::install_plugin_install_status( $addon );
155
-			$button_args['file'] = isset( $status['file'] ) ? $status['file'] : '';
156
-			if ( isset( $status['status'] ) ) {
157
-$button_args['install_status'] = $status['status'];}
152
+			if (!empty($addon->licensing->edd_slug)) {
153
+$button_args['slug'] = $addon->licensing->edd_slug; }
154
+			$status = self::install_plugin_install_status($addon);
155
+			$button_args['file'] = isset($status['file']) ? $status['file'] : '';
156
+			if (isset($status['status'])) {
157
+$button_args['install_status'] = $status['status']; }
158 158
 			$button_args['update_url'] = 'https://wpinvoicing.com';
159
-		} elseif ( $current_tab == 'themes' && isset( $addon->info->id ) && $addon->info->id ) {
160
-			if ( ! empty( $addon->licensing->edd_slug ) ) {
161
-$button_args['slug'] = $addon->licensing->edd_slug;}
162
-			$button_args['installed'] = self::is_theme_installed( $addon );
163
-			if ( ! in_array( $button_args['slug'], $wp_org_themes ) ) {
159
+		} elseif ($current_tab == 'themes' && isset($addon->info->id) && $addon->info->id) {
160
+			if (!empty($addon->licensing->edd_slug)) {
161
+$button_args['slug'] = $addon->licensing->edd_slug; }
162
+			$button_args['installed'] = self::is_theme_installed($addon);
163
+			if (!in_array($button_args['slug'], $wp_org_themes)) {
164 164
 				$button_args['update_url'] = 'https://wpinvoicing.com';
165 165
 			}
166 166
 		}
167 167
 
168 168
 		// set price
169
-		if ( isset( $addon->pricing ) && ! empty( $addon->pricing ) ) {
170
-			if ( is_object( $addon->pricing ) ) {
171
-				$prices = (array)$addon->pricing;
172
-				$button_args['price'] = reset( $prices );
173
-			} elseif ( isset( $addon->pricing ) ) {
169
+		if (isset($addon->pricing) && !empty($addon->pricing)) {
170
+			if (is_object($addon->pricing)) {
171
+				$prices = (array) $addon->pricing;
172
+				$button_args['price'] = reset($prices);
173
+			} elseif (isset($addon->pricing)) {
174 174
 				$button_args['price'] = $addon->pricing;
175 175
 			}
176 176
 		}
177 177
 
178 178
 		// set price text
179
-		if ( $button_args['price'] && $button_args['price'] != '0.00' ) {
180
-			$button_args['price_text'] = sprintf( __( 'From: $%d', 'invoicing' ), $button_args['price'] );
179
+		if ($button_args['price'] && $button_args['price'] != '0.00') {
180
+			$button_args['price_text'] = sprintf(__('From: $%d', 'invoicing'), $button_args['price']);
181 181
 		}
182 182
 
183 183
 		// set if installed
184
-		if ( in_array( $button_args['install_status'], array( 'installed', 'latest_installed', 'update_available', 'newer_installed' ) ) ) {
184
+		if (in_array($button_args['install_status'], array('installed', 'latest_installed', 'update_available', 'newer_installed'))) {
185 185
 			$button_args['installed'] = true;
186 186
 		}
187 187
 
188 188
 //		print_r($button_args);
189 189
 		// set if active
190
-		if ( $button_args['installed'] && ($button_args['file'] || $button_args['type'] == 'themes') ) {
191
-			if ( $button_args['type'] != 'themes' ) {
192
-				$button_args['active'] = is_plugin_active( $button_args['file'] );
190
+		if ($button_args['installed'] && ($button_args['file'] || $button_args['type'] == 'themes')) {
191
+			if ($button_args['type'] != 'themes') {
192
+				$button_args['active'] = is_plugin_active($button_args['file']);
193 193
 			} else {
194
-				$button_args['active'] = self::is_theme_active( $addon );
194
+				$button_args['active'] = self::is_theme_active($addon);
195 195
 			}
196 196
 		}
197 197
 
198 198
 		// set button text and class
199
-		if ( $button_args['active'] ) {
200
-			$button_args['button_text'] = __( 'Active', 'invoicing' );
199
+		if ($button_args['active']) {
200
+			$button_args['button_text'] = __('Active', 'invoicing');
201 201
 			$button_args['class'] = ' button-secondary disabled ';
202
-		} elseif ( $button_args['installed'] ) {
203
-			$button_args['button_text'] = __( 'Activate', 'invoicing' );
202
+		} elseif ($button_args['installed']) {
203
+			$button_args['button_text'] = __('Activate', 'invoicing');
204 204
 
205
-			if ( $button_args['type'] != 'themes' ) {
206
-				if ( current_user_can( 'manage_options' ) ) {
207
-					$button_args['url'] = wp_nonce_url( admin_url( 'plugins.php?action=activate&plugin=' . $button_args['file'] ), 'activate-plugin_' . $button_args['file'] );
205
+			if ($button_args['type'] != 'themes') {
206
+				if (current_user_can('manage_options')) {
207
+					$button_args['url'] = wp_nonce_url(admin_url('plugins.php?action=activate&plugin=' . $button_args['file']), 'activate-plugin_' . $button_args['file']);
208 208
 				} else {
209 209
 					$button_args['url'] = '#';
210 210
 				}
211 211
 			} else {
212
-				if ( current_user_can( 'switch_themes' ) ) {
213
-					$button_args['url'] = self::get_theme_activation_url( $addon );
212
+				if (current_user_can('switch_themes')) {
213
+					$button_args['url'] = self::get_theme_activation_url($addon);
214 214
 				} else {
215 215
 					$button_args['url'] = '#';
216 216
 				}
217 217
 			}
218 218
         } else {
219
-			if ( $button_args['type'] == 'recommended_plugins' ) {
220
-				$button_args['button_text'] = __( 'Install', 'invoicing' );
219
+			if ($button_args['type'] == 'recommended_plugins') {
220
+				$button_args['button_text'] = __('Install', 'invoicing');
221 221
 					} else {
222
-				$button_args['button_text'] = __( 'Get it', 'invoicing' );
222
+				$button_args['button_text'] = __('Get it', 'invoicing');
223 223
 
224 224
 				/*if($button_args['type'] == 'themes' && in_array($button_args['slug'],$wp_org_themes) ){
225 225
 			$button_args['button_text'] = __('Install','invoicing');
@@ -231,41 +231,41 @@  discard block
 block discarded – undo
231 231
 		}
232 232
 
233 233
 		// filter the button arguments
234
-		$button_args = apply_filters( 'edd_api_button_args', $button_args );
234
+		$button_args = apply_filters('edd_api_button_args', $button_args);
235 235
 //		print_r($button_args);
236 236
 		// set price text
237
-		if ( isset( $button_args['price_text'] ) ) {
237
+		if (isset($button_args['price_text'])) {
238 238
 			?>
239 239
 			<a
240 240
 				target="_blank"
241 241
 				class="addons-price-text"
242
-				href="<?php echo esc_url( $button_args['link'] ); ?>">
243
-				<?php echo esc_html( $button_args['price_text'] ); ?>
242
+				href="<?php echo esc_url($button_args['link']); ?>">
243
+				<?php echo esc_html($button_args['price_text']); ?>
244 244
 			</a>
245 245
 			<?php
246 246
 		}
247 247
 
248 248
 		?>
249 249
 		<a
250
-			data-licence="<?php echo esc_attr( $button_args['license'] ); ?>"
250
+			data-licence="<?php echo esc_attr($button_args['license']); ?>"
251 251
 			data-licensing="<?php echo $button_args['licensing'] ? 1 : 0; ?>"
252
-			data-title="<?php echo esc_attr( $button_args['title'] ); ?>"
253
-			data-type="<?php echo esc_attr( $button_args['type'] ); ?>"
254
-			data-text-error-message="<?php esc_attr_e( 'Something went wrong!', 'invoicing' ); ?>"
255
-			data-text-activate="<?php esc_attr_e( 'Activate', 'invoicing' ); ?>"
256
-			data-text-activating="<?php esc_attr_e( 'Activating', 'invoicing' ); ?>"
257
-			data-text-deactivate="<?php esc_attr_e( 'Deactivate', 'invoicing' ); ?>"
258
-			data-text-installed="<?php esc_attr_e( 'Installed', 'invoicing' ); ?>"
259
-			data-text-install="<?php esc_attr_e( 'Install', 'invoicing' ); ?>"
260
-			data-text-installing="<?php esc_attr_e( 'Installing', 'invoicing' ); ?>"
261
-			data-text-error="<?php esc_attr_e( 'Error', 'invoicing' ); ?>"
252
+			data-title="<?php echo esc_attr($button_args['title']); ?>"
253
+			data-type="<?php echo esc_attr($button_args['type']); ?>"
254
+			data-text-error-message="<?php esc_attr_e('Something went wrong!', 'invoicing'); ?>"
255
+			data-text-activate="<?php esc_attr_e('Activate', 'invoicing'); ?>"
256
+			data-text-activating="<?php esc_attr_e('Activating', 'invoicing'); ?>"
257
+			data-text-deactivate="<?php esc_attr_e('Deactivate', 'invoicing'); ?>"
258
+			data-text-installed="<?php esc_attr_e('Installed', 'invoicing'); ?>"
259
+			data-text-install="<?php esc_attr_e('Install', 'invoicing'); ?>"
260
+			data-text-installing="<?php esc_attr_e('Installing', 'invoicing'); ?>"
261
+			data-text-error="<?php esc_attr_e('Error', 'invoicing'); ?>"
262 262
 			<?php
263
-            if ( ! empty( $button_args['onclick'] ) ) {
264
-echo " onclick='" . esc_attr( $button_args['onclick'] ) . "' ";}
263
+            if (!empty($button_args['onclick'])) {
264
+echo " onclick='" . esc_attr($button_args['onclick']) . "' "; }
265 265
 ?>
266
-			class="addons-button  <?php echo esc_attr( $button_args['class'] ); ?>"
267
-			href="<?php echo esc_url( $button_args['url'] ); ?>">
268
-			<?php echo esc_html( $button_args['button_text'] ); ?>
266
+			class="addons-button  <?php echo esc_attr($button_args['class']); ?>"
267
+			href="<?php echo esc_url($button_args['url']); ?>">
268
+			<?php echo esc_html($button_args['button_text']); ?>
269 269
 		</a>
270 270
 		<?php
271 271
 
@@ -279,9 +279,9 @@  discard block
 block discarded – undo
279 279
 		$tabs            = self::get_tabs();
280 280
 		$sections        = self::get_sections();
281 281
 		$theme           = wp_get_theme();
282
-		$section_keys    = array_keys( $sections );
283
-		$current_section = isset( $_GET['section'] ) ? sanitize_text_field( $_GET['section'] ) : current( $section_keys );
284
-		$current_tab     = empty( $_GET['tab'] ) ? 'addons' : sanitize_title( $_GET['tab'] );
282
+		$section_keys    = array_keys($sections);
283
+		$current_section = isset($_GET['section']) ? sanitize_text_field($_GET['section']) : current($section_keys);
284
+		$current_tab     = empty($_GET['tab']) ? 'addons' : sanitize_title($_GET['tab']);
285 285
 		include_once WPINV_PLUGIN_DIR . '/includes/admin/html-admin-page-addons.php';
286 286
 	}
287 287
 
@@ -296,19 +296,19 @@  discard block
 block discarded – undo
296 296
                 'slug'      => 'invoicing-quotes',
297 297
 				'name'      => 'Quotes',
298 298
 				'thumbnail' => 'https://ps.w.org/invoicing-quotes/assets/banner-772x250.png',
299
-                'desc'      => __( 'Allows you to create quotes, send them to clients and convert them to Invoices when accepted by the customer.', 'invoicing' ),
299
+                'desc'      => __('Allows you to create quotes, send them to clients and convert them to Invoices when accepted by the customer.', 'invoicing'),
300 300
             ),
301 301
             'geodirectory'     => array(
302 302
                 'url'  => 'https://wordpress.org/plugins/geodirectory/',
303 303
                 'slug' => 'geodirectory',
304 304
                 'name' => 'GeoDirectory',
305
-                'desc' => __( 'Turn any WordPress theme into a global business directory portal.', 'invoicing' ),
305
+                'desc' => __('Turn any WordPress theme into a global business directory portal.', 'invoicing'),
306 306
             ),
307 307
             'userswp'          => array(
308 308
                 'url'  => 'https://wordpress.org/plugins/userswp/',
309 309
                 'slug' => 'userswp',
310 310
                 'name' => 'UsersWP',
311
-                'desc' => __( 'Allow frontend user login and registration as well as have slick profile pages.', 'invoicing' ),
311
+                'desc' => __('Allow frontend user login and registration as well as have slick profile pages.', 'invoicing'),
312 312
             ),
313 313
 		);
314 314
 
Please login to merge, or discard this patch.