Completed
Push — master ( d6bbb0...d1764d )
by Brian
18s queued 15s
created
includes/class-wpinv-privacy.php 1 patch
Indentation   +19 added lines, -19 removed lines patch added patch discarded remove patch
@@ -31,25 +31,25 @@
 block discarded – undo
31 31
     public function get_privacy_message() {
32 32
 
33 33
         $content = '<div class="wp-suggested-text">' .
34
-                   '<h2>' . __( 'Invoices and checkout', 'invoicing' ) . '</h2>' .
35
-                   '<p class="privacy-policy-tutorial">' . __( 'Example privacy texts.', 'invoicing' ) . '</p>' .
36
-                   '<p>' . __( 'We collect information about you during the checkout process on our site. This information may include, but is not limited to, your name, email address, phone number, address, IP and any other details that might be requested from you for the purpose of processing your payment and retaining your invoice details for legal reasons.', 'invoicing' ) . '</p>' .
37
-                   '<p>' . __( 'Handling this data also allows us to:', 'invoicing' ) . '</p>' .
38
-                   '<ul>' .
39
-                   '<li>' . __( '- Send you important account/order/service information.', 'invoicing' ) . '</li>' .
40
-                   '<li>' . __( '- Estimate taxes based on your location.', 'invoicing' ) . '</li>' .
41
-                   '<li>' . __( '- Respond to your queries or complaints.', 'invoicing' ) . '</li>' .
42
-                   '<li>' . __( '- Process payments and to prevent fraudulent transactions. We do this on the basis of our legitimate business interests.', 'invoicing' ) . '</li>' .
43
-                   '<li>' . __( '- Retain historical payment and invoice history. We do this on the basis of legal obligations.', 'invoicing' ) . '</li>' .
44
-                   '<li>' . __( '- Set up and administer your account, provide technical and/or customer support, and to verify your identity. We do this on the basis of our legitimate business interests.', 'invoicing' ) . '</li>' .
45
-                   '</ul>' .
46
-                   '<p>' . __( 'In addition to collecting information at checkout we may also use and store your contact details when manually creating invoices for require payments relating to prior contractual agreements or agreed terms.', 'invoicing' ) . '</p>' .
47
-                   '<h2>' . __( 'What we share with others', 'invoicing' ) . '</h2>' .
48
-                   '<p>' . __( 'We share information with third parties who help us provide our payment and invoicing services to you; for example --', 'invoicing' ) . '</p>' .
49
-                   '<p class="privacy-policy-tutorial">' . __( 'In this subsection you should list which third party payment processors you’re using to take payments since these may handle customer data. We’ve included PayPal as an example, but you should remove this if you’re not using PayPal.', 'invoicing' ) . '</p>' .
50
-                   '<p>' . __( 'We accept payments through PayPal. When processing payments, some of your data will be passed to PayPal, including information required to process or support the payment, such as the purchase total and billing information.', 'invoicing' ) . '</p>' .
51
-                   '<p>' . __( 'Please see the <a href="https://www.paypal.com/us/webapps/mpp/ua/privacy-full">PayPal Privacy Policy</a> for more details.', 'invoicing' ) . '</p>' .
52
-                   '</div>';
34
+                    '<h2>' . __( 'Invoices and checkout', 'invoicing' ) . '</h2>' .
35
+                    '<p class="privacy-policy-tutorial">' . __( 'Example privacy texts.', 'invoicing' ) . '</p>' .
36
+                    '<p>' . __( 'We collect information about you during the checkout process on our site. This information may include, but is not limited to, your name, email address, phone number, address, IP and any other details that might be requested from you for the purpose of processing your payment and retaining your invoice details for legal reasons.', 'invoicing' ) . '</p>' .
37
+                    '<p>' . __( 'Handling this data also allows us to:', 'invoicing' ) . '</p>' .
38
+                    '<ul>' .
39
+                    '<li>' . __( '- Send you important account/order/service information.', 'invoicing' ) . '</li>' .
40
+                    '<li>' . __( '- Estimate taxes based on your location.', 'invoicing' ) . '</li>' .
41
+                    '<li>' . __( '- Respond to your queries or complaints.', 'invoicing' ) . '</li>' .
42
+                    '<li>' . __( '- Process payments and to prevent fraudulent transactions. We do this on the basis of our legitimate business interests.', 'invoicing' ) . '</li>' .
43
+                    '<li>' . __( '- Retain historical payment and invoice history. We do this on the basis of legal obligations.', 'invoicing' ) . '</li>' .
44
+                    '<li>' . __( '- Set up and administer your account, provide technical and/or customer support, and to verify your identity. We do this on the basis of our legitimate business interests.', 'invoicing' ) . '</li>' .
45
+                    '</ul>' .
46
+                    '<p>' . __( 'In addition to collecting information at checkout we may also use and store your contact details when manually creating invoices for require payments relating to prior contractual agreements or agreed terms.', 'invoicing' ) . '</p>' .
47
+                    '<h2>' . __( 'What we share with others', 'invoicing' ) . '</h2>' .
48
+                    '<p>' . __( 'We share information with third parties who help us provide our payment and invoicing services to you; for example --', 'invoicing' ) . '</p>' .
49
+                    '<p class="privacy-policy-tutorial">' . __( 'In this subsection you should list which third party payment processors you’re using to take payments since these may handle customer data. We’ve included PayPal as an example, but you should remove this if you’re not using PayPal.', 'invoicing' ) . '</p>' .
50
+                    '<p>' . __( 'We accept payments through PayPal. When processing payments, some of your data will be passed to PayPal, including information required to process or support the payment, such as the purchase total and billing information.', 'invoicing' ) . '</p>' .
51
+                    '<p>' . __( 'Please see the <a href="https://www.paypal.com/us/webapps/mpp/ua/privacy-full">PayPal Privacy Policy</a> for more details.', 'invoicing' ) . '</p>' .
52
+                    '</div>';
53 53
 
54 54
         return apply_filters( 'wpinv_privacy_policy_content', $content );
55 55
     }
Please login to merge, or discard this patch.
includes/wpinv-address-functions.php 1 patch
Indentation   +88 added lines, -88 removed lines patch added patch discarded remove patch
@@ -13,9 +13,9 @@  discard block
 block discarded – undo
13 13
 
14 14
 
15 15
 function wpinv_get_default_country() {
16
-	$country = wpinv_get_option( 'default_country', 'UK' );
16
+    $country = wpinv_get_option( 'default_country', 'UK' );
17 17
 
18
-	return apply_filters( 'wpinv_default_country', $country );
18
+    return apply_filters( 'wpinv_default_country', $country );
19 19
 }
20 20
 
21 21
 /**
@@ -26,7 +26,7 @@  discard block
 block discarded – undo
26 26
  */
27 27
 function wpinv_sanitize_country( $country ) {
28 28
 
29
-	// Enure the country is specified
29
+    // Enure the country is specified
30 30
     if ( empty( $country ) ) {
31 31
         $country = wpinv_get_default_country();
32 32
     }
@@ -56,9 +56,9 @@  discard block
 block discarded – undo
56 56
 }
57 57
 
58 58
 function wpinv_get_default_state() {
59
-	$state = wpinv_get_option( 'default_state', false );
59
+    $state = wpinv_get_option( 'default_state', false );
60 60
 
61
-	return apply_filters( 'wpinv_default_state', $state );
61
+    return apply_filters( 'wpinv_default_state', $state );
62 62
 }
63 63
 
64 64
 function wpinv_state_name( $state_code = '', $country_code = '' ) {
@@ -166,11 +166,11 @@  discard block
 block discarded – undo
166 166
 
167 167
     $country = wpinv_sanitize_country( $country );
168 168
     
169
-	foreach ( wpinv_get_continents( 'countries' ) as $continent_code => $countries ) {
170
-		if ( false !== array_search( $country, $countries, true ) ) {
171
-			return $continent_code;
172
-		}
173
-	}
169
+    foreach ( wpinv_get_continents( 'countries' ) as $continent_code => $countries ) {
170
+        if ( false !== array_search( $country, $countries, true ) ) {
171
+            return $continent_code;
172
+        }
173
+    }
174 174
 
175 175
     return '';
176 176
     
@@ -462,30 +462,30 @@  discard block
 block discarded – undo
462 462
 }
463 463
 
464 464
 function wpinv_get_states_field() {
465
-	if( empty( $_POST['country'] ) ) {
466
-		$_POST['country'] = wpinv_get_default_country();
467
-	}
468
-	$states = wpinv_get_country_states( sanitize_text_field( $_POST['country'] ) );
465
+    if( empty( $_POST['country'] ) ) {
466
+        $_POST['country'] = wpinv_get_default_country();
467
+    }
468
+    $states = wpinv_get_country_states( sanitize_text_field( $_POST['country'] ) );
469 469
 
470
-	if( !empty( $states ) ) {
471
-		$sanitized_field_name = sanitize_text_field( $_POST['field_name'] );
470
+    if( !empty( $states ) ) {
471
+        $sanitized_field_name = sanitize_text_field( $_POST['field_name'] );
472 472
         
473 473
         $args = array(
474
-			'name'    => $sanitized_field_name,
475
-			'id'      => $sanitized_field_name,
476
-			'class'   => $sanitized_field_name . ' wpinv-select wpi_select2',
477
-			'options' => array_merge( array( '' => '' ), $states ),
478
-			'show_option_all'  => false,
479
-			'show_option_none' => false
480
-		);
481
-
482
-		$response = wpinv_html_select( $args );
483
-
484
-	} else {
485
-		$response = 'nostates';
486
-	}
474
+            'name'    => $sanitized_field_name,
475
+            'id'      => $sanitized_field_name,
476
+            'class'   => $sanitized_field_name . ' wpinv-select wpi_select2',
477
+            'options' => array_merge( array( '' => '' ), $states ),
478
+            'show_option_all'  => false,
479
+            'show_option_none' => false
480
+        );
481
+
482
+        $response = wpinv_html_select( $args );
483
+
484
+    } else {
485
+        $response = 'nostates';
486
+    }
487 487
 
488
-	return $response;
488
+    return $response;
489 489
 }
490 490
 
491 491
 function wpinv_default_billing_country( $country = '', $user_id = 0 ) {
@@ -503,46 +503,46 @@  discard block
 block discarded – undo
503 503
  */
504 504
 function wpinv_get_address_formats() {
505 505
 
506
-		return apply_filters( 'wpinv_localisation_address_formats',
507
-			array(
508
-				'default' => "{{name}}\n{{company}}\n{{address}}\n{{city}}\n{{state}}\n{{zip}}\n{{country}}",
509
-				'AU'      => "{{name}}\n{{company}}\n{{address}}\n{{city}}\n{{state}} {{zip}}\n{{country}}",
510
-				'AT'      => "{{company}}\n{{name}}\n{{address}}\n{{zip}} {{city}}\n{{country}}",
511
-				'BE'      => "{{company}}\n{{name}}\n{{address}}\n{{zip}} {{city}}\n{{country}}",
512
-				'CA'      => "{{company}}\n{{name}}\n{{address}}\n{{city}} {{state_code}}&nbsp;&nbsp;{{zip}}\n{{country}}",
513
-				'CH'      => "{{company}}\n{{name}}\n{{address}}\n{{zip}} {{city}}\n{{country}}",
514
-				'CL'      => "{{company}}\n{{name}}\n{{address}}\n{{state}}\n{{zip}} {{city}}\n{{country}}",
515
-				'CN'      => "{{country}} {{zip}}\n{{state}}, {{city}}, {{address}}\n{{company}}\n{{name}}",
516
-				'CZ'      => "{{company}}\n{{name}}\n{{address}}\n{{zip}} {{city}}\n{{country}}",
517
-				'DE'      => "{{company}}\n{{name}}\n{{address}}\n{{zip}} {{city}}\n{{country}}",
518
-				'EE'      => "{{company}}\n{{name}}\n{{address}}\n{{zip}} {{city}}\n{{country}}",
519
-				'FI'      => "{{company}}\n{{name}}\n{{address}}\n{{zip}} {{city}}\n{{country}}",
520
-				'DK'      => "{{company}}\n{{name}}\n{{address}}\n{{zip}} {{city}}\n{{country}}",
521
-				'FR'      => "{{company}}\n{{name}}\n{{address}}\n{{zip}} {{city_upper}}\n{{country}}",
522
-				'HK'      => "{{company}}\n{{first_name}} {{last_name_upper}}\n{{address}}\n{{city_upper}}\n{{state_upper}}\n{{country}}",
523
-				'HU'      => "{{name}}\n{{company}}\n{{city}}\n{{address}}\n{{zip}}\n{{country}}",
524
-				'IN'      => "{{company}}\n{{name}}\n{{address}}\n{{city}} {{zip}}\n{{state}}, {{country}}",
525
-				'IS'      => "{{company}}\n{{name}}\n{{address}}\n{{zip}} {{city}}\n{{country}}",
526
-				'IT'      => "{{company}}\n{{name}}\n{{address}}\n{{zip}}\n{{city}}\n{{state_upper}}\n{{country}}",
527
-				'JP'      => "{{zip}}\n{{state}} {{city}} {{address}}\n{{company}}\n{{last_name}} {{first_name}}\n{{country}}",
528
-				'TW'      => "{{company}}\n{{last_name}} {{first_name}}\n{{address}}\n{{state}}, {{city}} {{zip}}\n{{country}}",
529
-				'LI'      => "{{company}}\n{{name}}\n{{address}}\n{{zip}} {{city}}\n{{country}}",
530
-				'NL'      => "{{company}}\n{{name}}\n{{address}}\n{{zip}} {{city}}\n{{country}}",
531
-				'NZ'      => "{{name}}\n{{company}}\n{{address}}\n{{city}} {{zip}}\n{{country}}",
532
-				'NO'      => "{{company}}\n{{name}}\n{{address}}\n{{zip}} {{city}}\n{{country}}",
533
-				'PL'      => "{{company}}\n{{name}}\n{{address}}\n{{zip}} {{city}}\n{{country}}",
534
-				'PT'      => "{{company}}\n{{name}}\n{{address}}\n{{zip}} {{city}}\n{{country}}",
535
-				'SK'      => "{{company}}\n{{name}}\n{{address}}\n{{zip}} {{city}}\n{{country}}",
536
-				'RS'      => "{{name}}\n{{company}}\n{{address}}\n{{zip}} {{city}}\n{{country}}",
537
-				'SI'      => "{{company}}\n{{name}}\n{{address}}\n{{zip}} {{city}}\n{{country}}",
538
-				'ES'      => "{{name}}\n{{company}}\n{{address}}\n{{zip}} {{city}}\n{{state}}\n{{country}}",
539
-				'SE'      => "{{company}}\n{{name}}\n{{address}}\n{{zip}} {{city}}\n{{country}}",
540
-				'TR'      => "{{name}}\n{{company}}\n{{address}}\n{{zip}} {{city}} {{state}}\n{{country}}",
541
-				'UG'      => "{{name}}\n{{company}}\n{{address}}\n{{city}}\n{{state}}, {{country}}",
542
-				'US'      => "{{name}}\n{{company}}\n{{address}}\n{{city}}, {{state_code}} {{zip}}\n{{country}}",
543
-				'VN'      => "{{name}}\n{{company}}\n{{address}}\n{{city}}\n{{country}}",
544
-			)
545
-		);
506
+        return apply_filters( 'wpinv_localisation_address_formats',
507
+            array(
508
+                'default' => "{{name}}\n{{company}}\n{{address}}\n{{city}}\n{{state}}\n{{zip}}\n{{country}}",
509
+                'AU'      => "{{name}}\n{{company}}\n{{address}}\n{{city}}\n{{state}} {{zip}}\n{{country}}",
510
+                'AT'      => "{{company}}\n{{name}}\n{{address}}\n{{zip}} {{city}}\n{{country}}",
511
+                'BE'      => "{{company}}\n{{name}}\n{{address}}\n{{zip}} {{city}}\n{{country}}",
512
+                'CA'      => "{{company}}\n{{name}}\n{{address}}\n{{city}} {{state_code}}&nbsp;&nbsp;{{zip}}\n{{country}}",
513
+                'CH'      => "{{company}}\n{{name}}\n{{address}}\n{{zip}} {{city}}\n{{country}}",
514
+                'CL'      => "{{company}}\n{{name}}\n{{address}}\n{{state}}\n{{zip}} {{city}}\n{{country}}",
515
+                'CN'      => "{{country}} {{zip}}\n{{state}}, {{city}}, {{address}}\n{{company}}\n{{name}}",
516
+                'CZ'      => "{{company}}\n{{name}}\n{{address}}\n{{zip}} {{city}}\n{{country}}",
517
+                'DE'      => "{{company}}\n{{name}}\n{{address}}\n{{zip}} {{city}}\n{{country}}",
518
+                'EE'      => "{{company}}\n{{name}}\n{{address}}\n{{zip}} {{city}}\n{{country}}",
519
+                'FI'      => "{{company}}\n{{name}}\n{{address}}\n{{zip}} {{city}}\n{{country}}",
520
+                'DK'      => "{{company}}\n{{name}}\n{{address}}\n{{zip}} {{city}}\n{{country}}",
521
+                'FR'      => "{{company}}\n{{name}}\n{{address}}\n{{zip}} {{city_upper}}\n{{country}}",
522
+                'HK'      => "{{company}}\n{{first_name}} {{last_name_upper}}\n{{address}}\n{{city_upper}}\n{{state_upper}}\n{{country}}",
523
+                'HU'      => "{{name}}\n{{company}}\n{{city}}\n{{address}}\n{{zip}}\n{{country}}",
524
+                'IN'      => "{{company}}\n{{name}}\n{{address}}\n{{city}} {{zip}}\n{{state}}, {{country}}",
525
+                'IS'      => "{{company}}\n{{name}}\n{{address}}\n{{zip}} {{city}}\n{{country}}",
526
+                'IT'      => "{{company}}\n{{name}}\n{{address}}\n{{zip}}\n{{city}}\n{{state_upper}}\n{{country}}",
527
+                'JP'      => "{{zip}}\n{{state}} {{city}} {{address}}\n{{company}}\n{{last_name}} {{first_name}}\n{{country}}",
528
+                'TW'      => "{{company}}\n{{last_name}} {{first_name}}\n{{address}}\n{{state}}, {{city}} {{zip}}\n{{country}}",
529
+                'LI'      => "{{company}}\n{{name}}\n{{address}}\n{{zip}} {{city}}\n{{country}}",
530
+                'NL'      => "{{company}}\n{{name}}\n{{address}}\n{{zip}} {{city}}\n{{country}}",
531
+                'NZ'      => "{{name}}\n{{company}}\n{{address}}\n{{city}} {{zip}}\n{{country}}",
532
+                'NO'      => "{{company}}\n{{name}}\n{{address}}\n{{zip}} {{city}}\n{{country}}",
533
+                'PL'      => "{{company}}\n{{name}}\n{{address}}\n{{zip}} {{city}}\n{{country}}",
534
+                'PT'      => "{{company}}\n{{name}}\n{{address}}\n{{zip}} {{city}}\n{{country}}",
535
+                'SK'      => "{{company}}\n{{name}}\n{{address}}\n{{zip}} {{city}}\n{{country}}",
536
+                'RS'      => "{{name}}\n{{company}}\n{{address}}\n{{zip}} {{city}}\n{{country}}",
537
+                'SI'      => "{{company}}\n{{name}}\n{{address}}\n{{zip}} {{city}}\n{{country}}",
538
+                'ES'      => "{{name}}\n{{company}}\n{{address}}\n{{zip}} {{city}}\n{{state}}\n{{country}}",
539
+                'SE'      => "{{company}}\n{{name}}\n{{address}}\n{{zip}} {{city}}\n{{country}}",
540
+                'TR'      => "{{name}}\n{{company}}\n{{address}}\n{{zip}} {{city}} {{state}}\n{{country}}",
541
+                'UG'      => "{{name}}\n{{company}}\n{{address}}\n{{city}}\n{{state}}, {{country}}",
542
+                'US'      => "{{name}}\n{{company}}\n{{address}}\n{{city}}, {{state_code}} {{zip}}\n{{country}}",
543
+                'VN'      => "{{name}}\n{{company}}\n{{address}}\n{{city}}\n{{country}}",
544
+            )
545
+        );
546 546
 }
547 547
 
548 548
 /**
@@ -559,21 +559,21 @@  discard block
 block discarded – undo
559 559
     }
560 560
 
561 561
     // Get all formats.
562
-	$formats = wpinv_get_address_formats();
562
+    $formats = wpinv_get_address_formats();
563 563
 
564
-	// Get format for the specified country.
565
-	$format = ( $country && isset( $formats[ $country ] ) ) ? $formats[ $country ] : $formats['default'];
564
+    // Get format for the specified country.
565
+    $format = ( $country && isset( $formats[ $country ] ) ) ? $formats[ $country ] : $formats['default'];
566 566
     
567 567
     /**
568
-	 * Filters the address format to use on Invoices.
568
+     * Filters the address format to use on Invoices.
569 569
      * 
570 570
      * New lines will be replaced by a `br` element. Double new lines will be replaced by a paragraph. HTML tags are allowed.
571
-	 *
572
-	 * @since 1.0.13
573
-	 *
574
-	 * @param string $format  The address format to use.
571
+     *
572
+     * @since 1.0.13
573
+     *
574
+     * @param string $format  The address format to use.
575 575
      * @param string $country The country who's address format is being retrieved.
576
-	 */
576
+     */
577 577
     return apply_filters( 'wpinv_get_full_address_format', $format, $country );
578 578
 }
579 579
 
@@ -594,8 +594,8 @@  discard block
 block discarded – undo
594 594
         'country'           => '',
595 595
         'zip'               => '',
596 596
         'first_name'        => '',
597
-		'last_name'         => '',
598
-		'company'           => '',
597
+        'last_name'         => '',
598
+        'company'           => '',
599 599
     );
600 600
 
601 601
     $args    = array_map( 'trim', wp_parse_args( $billing_details, $default_args ) );
@@ -616,14 +616,14 @@  discard block
 block discarded – undo
616 616
     $args['country_code']= $country;
617 617
 
618 618
     /**
619
-	 * Filters the address format replacements to use on Invoices.
619
+     * Filters the address format replacements to use on Invoices.
620 620
      * 
621
-	 *
622
-	 * @since 1.0.13
623
-	 *
624
-	 * @param array $replacements  The address replacements to use.
621
+     *
622
+     * @since 1.0.13
623
+     *
624
+     * @param array $replacements  The address replacements to use.
625 625
      * @param array $billing_details  The billing details to use.
626
-	 */
626
+     */
627 627
     $replacements = apply_filters( 'wpinv_get_invoice_address_replacements', $args, $billing_details );
628 628
 
629 629
     $return = array();
@@ -646,5 +646,5 @@  discard block
 block discarded – undo
646 646
  * @return string
647 647
  */
648 648
 function wpinv_trim_formatted_address_line( $line ) {
649
-	return trim( $line, ', ' );
649
+    return trim( $line, ', ' );
650 650
 }
651 651
\ No newline at end of file
Please login to merge, or discard this patch.
widgets/buy-item.php 1 patch
Indentation   +49 added lines, -49 removed lines patch added patch discarded remove patch
@@ -38,29 +38,29 @@  discard block
 block discarded – undo
38 38
                     'advanced'    => false
39 39
                 ),
40 40
                 'items'  => array(
41
-	                'title'       => __( 'Items to buy', 'invoicing' ),
42
-	                'desc'        => __( 'Enter comma separated list of invoicing item id and quantity (item_id|quantity). Ex. 101|2 ', 'invoicing' ),
43
-	                'type'        => 'text',
44
-	                'desc_tip'    => true,
45
-	                'default'     => '',
46
-	                'placeholder' => __('Items to buy','invoicing'),
47
-	                'advanced'    => false
41
+                    'title'       => __( 'Items to buy', 'invoicing' ),
42
+                    'desc'        => __( 'Enter comma separated list of invoicing item id and quantity (item_id|quantity). Ex. 101|2 ', 'invoicing' ),
43
+                    'type'        => 'text',
44
+                    'desc_tip'    => true,
45
+                    'default'     => '',
46
+                    'placeholder' => __('Items to buy','invoicing'),
47
+                    'advanced'    => false
48 48
                 ),
49 49
                 'label'  => array(
50
-	                'title'       => __( 'Button Label', 'invoicing' ),
51
-	                'desc'        => __( 'Enter button label. Default "Buy Now".', 'invoicing' ),
52
-	                'type'        => 'text',
53
-	                'desc_tip'    => true,
54
-	                'default'     => __( 'Buy Now', 'invoicing' ),
55
-	                'advanced'    => false
50
+                    'title'       => __( 'Button Label', 'invoicing' ),
51
+                    'desc'        => __( 'Enter button label. Default "Buy Now".', 'invoicing' ),
52
+                    'type'        => 'text',
53
+                    'desc_tip'    => true,
54
+                    'default'     => __( 'Buy Now', 'invoicing' ),
55
+                    'advanced'    => false
56 56
                 ),
57 57
                 'post_id'  => array(
58
-	                'title'       => __( 'Post ID', 'invoicing' ),
59
-	                'desc'        => __( 'Enter related post ID. This is for 3rd party add ons and not mandatory field.', 'invoicing' ),
60
-	                'type'        => 'number',
61
-	                'desc_tip'    => true,
62
-	                'default'     => '',
63
-	                'advanced'    => true
58
+                    'title'       => __( 'Post ID', 'invoicing' ),
59
+                    'desc'        => __( 'Enter related post ID. This is for 3rd party add ons and not mandatory field.', 'invoicing' ),
60
+                    'type'        => 'number',
61
+                    'desc_tip'    => true,
62
+                    'default'     => '',
63
+                    'advanced'    => true
64 64
                 ),
65 65
             )
66 66
 
@@ -70,43 +70,43 @@  discard block
 block discarded – undo
70 70
         parent::__construct( $options );
71 71
     }
72 72
 
73
-	/**
74
-	 * The Super block output function.
75
-	 *
76
-	 * @param array $args
77
-	 * @param array $widget_args
78
-	 * @param string $content
79
-	 *
80
-	 * @return string
81
-	 */
73
+    /**
74
+     * The Super block output function.
75
+     *
76
+     * @param array $args
77
+     * @param array $widget_args
78
+     * @param string $content
79
+     *
80
+     * @return string
81
+     */
82 82
     public function output( $args = array(), $widget_args = array(), $content = '' ) {
83 83
 
84
-	    $defaults = array(
85
-		    'items'     	=> '', // should be used like: item_id|quantity,item_id|quantity,item_id|quantity
86
-		    'label'  	    => __( 'Buy Now', 'invoicing' ), // the button title
87
-		    'post_id'   	=> '', // any related post_id
88
-	    );
84
+        $defaults = array(
85
+            'items'     	=> '', // should be used like: item_id|quantity,item_id|quantity,item_id|quantity
86
+            'label'  	    => __( 'Buy Now', 'invoicing' ), // the button title
87
+            'post_id'   	=> '', // any related post_id
88
+        );
89 89
 
90
-	    /**
91
-	     * Parse incoming $args into an array and merge it with $defaults
92
-	     */
93
-	    $args = wp_parse_args( $args, $defaults );
90
+        /**
91
+         * Parse incoming $args into an array and merge it with $defaults
92
+         */
93
+        $args = wp_parse_args( $args, $defaults );
94 94
 
95
-		$html = '<div class="wpi-buy-button-wrapper wpi-g">';
95
+        $html = '<div class="wpi-buy-button-wrapper wpi-g">';
96 96
 		
97
-		if ( empty( $args['items'] ) ) {
98
-			$html .= __( 'No items selected', 'invoicing' );
99
-		} else {
100
-			$post_id = isset( $args['post_id'] ) && is_numeric( $args['post_id'] ) ? sanitize_text_field( $args['post_id'] ) : 0;
101
-			$label   = isset( $args['label'] ) ? sanitize_text_field( $args['label'] ) : __( 'Buy Now', 'invoicing' );
102
-			$items   = esc_attr( $args['items'] );
103
-			$html   .= "<button class='button button-primary wpi-buy-button' type='button' onclick=\"wpi_buy(this, '$items','$post_id');\">$label</button>";
104
-		}
97
+        if ( empty( $args['items'] ) ) {
98
+            $html .= __( 'No items selected', 'invoicing' );
99
+        } else {
100
+            $post_id = isset( $args['post_id'] ) && is_numeric( $args['post_id'] ) ? sanitize_text_field( $args['post_id'] ) : 0;
101
+            $label   = isset( $args['label'] ) ? sanitize_text_field( $args['label'] ) : __( 'Buy Now', 'invoicing' );
102
+            $items   = esc_attr( $args['items'] );
103
+            $html   .= "<button class='button button-primary wpi-buy-button' type='button' onclick=\"wpi_buy(this, '$items','$post_id');\">$label</button>";
104
+        }
105 105
 	
106
-	    $html .= wp_nonce_field( 'wpinv_buy_items', 'wpinv_buy_nonce', true, false );
107
-	    $html .= '</div>';
106
+        $html .= wp_nonce_field( 'wpinv_buy_items', 'wpinv_buy_nonce', true, false );
107
+        $html .= '</div>';
108 108
 
109
-	    return $html;
109
+        return $html;
110 110
 
111 111
     }
112 112
 
Please login to merge, or discard this patch.
includes/api/class-wpinv-rest-invoice-controller.php 1 patch
Indentation   +1272 added lines, -1272 removed lines patch added patch discarded remove patch
@@ -20,31 +20,31 @@  discard block
 block discarded – undo
20 20
 class WPInv_REST_Invoice_Controller extends WP_REST_Posts_Controller {
21 21
 
22 22
     /**
23
-	 * Post type.
24
-	 *
25
-	 * @var string
26
-	 */
27
-	protected $post_type = 'wpi_invoice';
23
+     * Post type.
24
+     *
25
+     * @var string
26
+     */
27
+    protected $post_type = 'wpi_invoice';
28 28
 	
29
-	/**
30
-	 * Cached results of get_item_schema.
31
-	 *
32
-	 * @since 1.0.13
33
-	 * @var array
34
-	 */
35
-	protected $schema;
29
+    /**
30
+     * Cached results of get_item_schema.
31
+     *
32
+     * @since 1.0.13
33
+     * @var array
34
+     */
35
+    protected $schema;
36 36
 
37 37
     /**
38
-	 * Constructor.
39
-	 *
40
-	 * @since 1.0.13
41
-	 *
42
-	 * @param string $namespace Api Namespace
43
-	 */
44
-	public function __construct( $namespace ) {
38
+     * Constructor.
39
+     *
40
+     * @since 1.0.13
41
+     *
42
+     * @param string $namespace Api Namespace
43
+     */
44
+    public function __construct( $namespace ) {
45 45
         
46 46
         // Set api namespace...
47
-		$this->namespace = $namespace;
47
+        $this->namespace = $namespace;
48 48
 
49 49
         // ... and the rest base
50 50
         $this->rest_base = 'invoices';
@@ -52,79 +52,79 @@  discard block
 block discarded – undo
52 52
     }
53 53
     
54 54
     /**
55
-	 * Checks if a given request has access to read invoices.
55
+     * Checks if a given request has access to read invoices.
56 56
      * 
57
-	 *
58
-	 * @since 1.0.13
59
-	 *
60
-	 * @param WP_REST_Request $request Full details about the request.
61
-	 * @return true|WP_Error True if the request has read access, WP_Error object otherwise.
62
-	 */
63
-	public function get_items_permissions_check( $request ) {
57
+     *
58
+     * @since 1.0.13
59
+     *
60
+     * @param WP_REST_Request $request Full details about the request.
61
+     * @return true|WP_Error True if the request has read access, WP_Error object otherwise.
62
+     */
63
+    public function get_items_permissions_check( $request ) {
64 64
 	
65 65
         $post_type = get_post_type_object( $this->post_type );
66 66
 
67
-		if ( 'edit' === $request['context'] && ! current_user_can( $post_type->cap->edit_posts ) ) {
68
-			return new WP_Error( 'rest_forbidden_context', __( 'Sorry, you are not allowed to edit items.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
69
-		}
67
+        if ( 'edit' === $request['context'] && ! current_user_can( $post_type->cap->edit_posts ) ) {
68
+            return new WP_Error( 'rest_forbidden_context', __( 'Sorry, you are not allowed to edit items.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
69
+        }
70 70
 
71
-		if ( ! is_user_logged_in() ) {
72
-			return new WP_Error( 'rest_forbidden', __( 'Sorry, you must be logged in to view items.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
73
-		}
71
+        if ( ! is_user_logged_in() ) {
72
+            return new WP_Error( 'rest_forbidden', __( 'Sorry, you must be logged in to view items.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
73
+        }
74 74
 
75
-		// Read checks will be evaluated on a per invoice basis
75
+        // Read checks will be evaluated on a per invoice basis
76 76
 
77
-		return true;
77
+        return true;
78 78
 
79 79
     }
80 80
     
81 81
     /**
82
-	 * Retrieves a collection of invoices.
83
-	 *
84
-	 * @since 1.0.13
85
-	 *
86
-	 * @param WP_REST_Request $request Full details about the request.
87
-	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
88
-	 */
89
-	public function get_items( $request ) {
82
+     * Retrieves a collection of invoices.
83
+     *
84
+     * @since 1.0.13
85
+     *
86
+     * @param WP_REST_Request $request Full details about the request.
87
+     * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
88
+     */
89
+    public function get_items( $request ) {
90 90
 		
91
-		// Retrieve request query parameters.
92
-		$args          = $this->get_request_collection_params( $request );
91
+        // Retrieve request query parameters.
92
+        $args          = $this->get_request_collection_params( $request );
93 93
 		
94
-		// WP_Query Args.
95
-		$wp_query_args = $this->get_collection_wp_query_params( $args, $request );
94
+        // WP_Query Args.
95
+        $wp_query_args = $this->get_collection_wp_query_params( $args, $request );
96 96
 		
97
-		// Get invoice ids...
98
-		$query         = new WP_Query( $wp_query_args );
99
-
100
-		// ... and map them into invoice objects.
101
-		$_invoices     = array_map( array( $this, 'get_post' ), $query->posts );
102
-
103
-		// Prepare the retrieved invoices
104
-		$invoices      = array();
105
-
106
-		foreach( $_invoices as $invoice ) {
107
-			if ( $this->check_read_permission( $invoice ) ) {
108
-				$invoices[] = $this->prepare_response_for_collection( $this->prepare_item_for_response( $invoice, $request ) );
109
-			}
110
-		}
111
-
112
-		// Prepare the response.
113
-		$response = rest_ensure_response( $invoices );
114
-		$response->header( 'X-WP-Total', (int) $query->found_posts );
115
-		$response->header( 'X-WP-TotalPages', (int) $query->max_num_pages );
116
-
117
-		/**
118
-		 * Filters the responses for invoices requests.
119
-		 *
120
-		 *
121
-		 * @since 1.0.13
122
-		 *
123
-		 *
124
-		 * @param arrWP_REST_Response $response    Response object.
125
-		 * @param WP_REST_Request     $request The request used.
97
+        // Get invoice ids...
98
+        $query         = new WP_Query( $wp_query_args );
99
+
100
+        // ... and map them into invoice objects.
101
+        $_invoices     = array_map( array( $this, 'get_post' ), $query->posts );
102
+
103
+        // Prepare the retrieved invoices
104
+        $invoices      = array();
105
+
106
+        foreach( $_invoices as $invoice ) {
107
+            if ( $this->check_read_permission( $invoice ) ) {
108
+                $invoices[] = $this->prepare_response_for_collection( $this->prepare_item_for_response( $invoice, $request ) );
109
+            }
110
+        }
111
+
112
+        // Prepare the response.
113
+        $response = rest_ensure_response( $invoices );
114
+        $response->header( 'X-WP-Total', (int) $query->found_posts );
115
+        $response->header( 'X-WP-TotalPages', (int) $query->max_num_pages );
116
+
117
+        /**
118
+         * Filters the responses for invoices requests.
119
+         *
120
+         *
121
+         * @since 1.0.13
122
+         *
123
+         *
124
+         * @param arrWP_REST_Response $response    Response object.
125
+         * @param WP_REST_Request     $request The request used.
126 126
          * @param array               $args Array of args used to retrieve the invoices
127
-		 */
127
+         */
128 128
         $response       = apply_filters( "wpinv_rest_invoices_response", $response, $request, $args );
129 129
 
130 130
         return rest_ensure_response( $response );
@@ -132,25 +132,25 @@  discard block
 block discarded – undo
132 132
     }
133 133
 
134 134
     /**
135
-	 * Get the post, if the ID is valid.
136
-	 *
137
-	 * @since 1.0.13
138
-	 *
139
-	 * @param int $invoice_id Supplied ID.
140
-	 * @return WPInv_Invoice|WP_Error Invoice object if ID is valid, WP_Error otherwise.
141
-	 */
142
-	protected function get_post( $invoice_id ) {
135
+     * Get the post, if the ID is valid.
136
+     *
137
+     * @since 1.0.13
138
+     *
139
+     * @param int $invoice_id Supplied ID.
140
+     * @return WPInv_Invoice|WP_Error Invoice object if ID is valid, WP_Error otherwise.
141
+     */
142
+    protected function get_post( $invoice_id ) {
143 143
 		
144
-		$error     = new WP_Error( 'rest_invoice_invalid_id', __( 'Invalid item ID.', 'invoicing' ), array( 'status' => 404 ) );
144
+        $error     = new WP_Error( 'rest_invoice_invalid_id', __( 'Invalid item ID.', 'invoicing' ), array( 'status' => 404 ) );
145 145
 
146 146
         // Ids start from 1
147 147
         if ( (int) $invoice_id <= 0 ) {
148
-			return $error;
149
-		}
148
+            return $error;
149
+        }
150 150
 
151
-		$invoice = wpinv_get_invoice( (int) $invoice_id );
152
-		if ( empty( $invoice ) || $this->post_type !== $invoice->post_type ) {
153
-			return $error;
151
+        $invoice = wpinv_get_invoice( (int) $invoice_id );
152
+        if ( empty( $invoice ) || $this->post_type !== $invoice->post_type ) {
153
+            return $error;
154 154
         }
155 155
 
156 156
         return $invoice;
@@ -158,77 +158,77 @@  discard block
 block discarded – undo
158 158
     }
159 159
 
160 160
     /**
161
-	 * Checks if a given request has access to read an invoice.
162
-	 *
163
-	 * @since 1.0.13
164
-	 *
165
-	 * @param WP_REST_Request $request Full details about the request.
166
-	 * @return bool|WP_Error True if the request has read access for the invoice, WP_Error object otherwise.
167
-	 */
168
-	public function get_item_permissions_check( $request ) {
161
+     * Checks if a given request has access to read an invoice.
162
+     *
163
+     * @since 1.0.13
164
+     *
165
+     * @param WP_REST_Request $request Full details about the request.
166
+     * @return bool|WP_Error True if the request has read access for the invoice, WP_Error object otherwise.
167
+     */
168
+    public function get_item_permissions_check( $request ) {
169 169
 
170 170
         // Retrieve the invoice object.
171 171
         $invoice = $this->get_post( $request['id'] );
172 172
         
173 173
         // Ensure it is valid.
174
-		if ( is_wp_error( $invoice ) ) {
175
-			return $invoice;
176
-		}
174
+        if ( is_wp_error( $invoice ) ) {
175
+            return $invoice;
176
+        }
177 177
 
178
-		if ( $invoice ) {
179
-			return $this->check_read_permission( $invoice );
180
-		}
178
+        if ( $invoice ) {
179
+            return $this->check_read_permission( $invoice );
180
+        }
181 181
 
182
-		return true;
182
+        return true;
183 183
     }
184 184
     
185 185
     /**
186
-	 * Checks if an invoice can be read.
187
-	 * 
188
-	 * An invoice can be read by site admins and owners of the invoice
189
-	 *
190
-	 *
191
-	 * @since 1.0.13
192
-	 *
193
-	 * @param WPInv_Invoice $invoice WPInv_Invoice object.
194
-	 * @return bool Whether the post can be read.
195
-	 */
196
-	public function check_read_permission( $invoice ) {
197
-		return wpinv_user_can_view_invoice( $invoice->ID );
186
+     * Checks if an invoice can be read.
187
+     * 
188
+     * An invoice can be read by site admins and owners of the invoice
189
+     *
190
+     *
191
+     * @since 1.0.13
192
+     *
193
+     * @param WPInv_Invoice $invoice WPInv_Invoice object.
194
+     * @return bool Whether the post can be read.
195
+     */
196
+    public function check_read_permission( $invoice ) {
197
+        return wpinv_user_can_view_invoice( $invoice->ID );
198 198
     }
199 199
     
200 200
     /**
201
-	 * Retrieves a single invoice.
202
-	 *
203
-	 * @since 1.0.13
204
-	 *
205
-	 * @param WP_REST_Request $request Full details about the request.
206
-	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
207
-	 */
208
-	public function get_item( $request ) {
201
+     * Retrieves a single invoice.
202
+     *
203
+     * @since 1.0.13
204
+     *
205
+     * @param WP_REST_Request $request Full details about the request.
206
+     * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
207
+     */
208
+    public function get_item( $request ) {
209 209
 
210 210
         // Fetch the invoice.
211 211
         $invoice = $this->get_post( $request['id'] );
212 212
         
213 213
         // Abort early if it does not exist
214
-		if ( is_wp_error( $invoice ) ) {
215
-			return $invoice;
216
-		}
217
-
218
-		// Prepare the response
219
-		$response = $this->prepare_item_for_response( $invoice, $request );
220
-		$response->link_header( 'alternate', esc_url( $invoice->get_view_url() ), array( 'type' => 'text/html' ) );
221
-
222
-		/**
223
-		 * Filters the responses for single invoice requests.
224
-		 *
225
-		 *
226
-		 * @since 1.0.13
227
-		 * @var WP_HTTP_Response
228
-		 *
229
-		 * @param WP_HTTP_Response $response Response.
230
-		 * @param WP_REST_Request  $request The request used.
231
-		 */
214
+        if ( is_wp_error( $invoice ) ) {
215
+            return $invoice;
216
+        }
217
+
218
+        // Prepare the response
219
+        $response = $this->prepare_item_for_response( $invoice, $request );
220
+        $response->link_header( 'alternate', esc_url( $invoice->get_view_url() ), array( 'type' => 'text/html' ) );
221
+
222
+        /**
223
+         * Filters the responses for single invoice requests.
224
+         *
225
+         *
226
+         * @since 1.0.13
227
+         * @var WP_HTTP_Response
228
+         *
229
+         * @param WP_HTTP_Response $response Response.
230
+         * @param WP_REST_Request  $request The request used.
231
+         */
232 232
         $response       = apply_filters( "wpinv_rest_get_invoice_response", $response, $request );
233 233
 
234 234
         return rest_ensure_response( $response );
@@ -236,23 +236,23 @@  discard block
 block discarded – undo
236 236
     }
237 237
     
238 238
     /**
239
-	 * Checks if a given request has access to create an invoice.
240
-	 *
241
-	 * @since 1.0.13
242
-	 *
243
-	 * @param WP_REST_Request $request Full details about the request.
244
-	 * @return true|WP_Error True if the request has access to create items, WP_Error object otherwise.
245
-	 */
246
-	public function create_item_permissions_check( $request ) {
239
+     * Checks if a given request has access to create an invoice.
240
+     *
241
+     * @since 1.0.13
242
+     *
243
+     * @param WP_REST_Request $request Full details about the request.
244
+     * @return true|WP_Error True if the request has access to create items, WP_Error object otherwise.
245
+     */
246
+    public function create_item_permissions_check( $request ) {
247 247
 	
248
-		if ( ! empty( $request['id'] ) ) {
249
-			return new WP_Error( 'rest_invoice_exists', __( 'Cannot create existing item.', 'invoicing' ), array( 'status' => 400 ) );
250
-		}
248
+        if ( ! empty( $request['id'] ) ) {
249
+            return new WP_Error( 'rest_invoice_exists', __( 'Cannot create existing item.', 'invoicing' ), array( 'status' => 400 ) );
250
+        }
251 251
 
252
-		$post_type = get_post_type_object( $this->post_type );
252
+        $post_type = get_post_type_object( $this->post_type );
253 253
 
254
-		if ( ! current_user_can( $post_type->cap->create_posts ) && ! wpinv_current_user_can_manage_invoicing() ) {
255
-			return new WP_Error( 
254
+        if ( ! current_user_can( $post_type->cap->create_posts ) && ! wpinv_current_user_can_manage_invoicing() ) {
255
+            return new WP_Error( 
256 256
                 'rest_cannot_create',
257 257
                 __( 'Sorry, you are not allowed to create items as this user.', 'invoicing' ), 
258 258
                 array( 
@@ -261,90 +261,90 @@  discard block
 block discarded – undo
261 261
             );
262 262
         }
263 263
 
264
-		return true;
264
+        return true;
265 265
     }
266 266
     
267 267
     /**
268
-	 * Creates a single invoice.
269
-	 *
270
-	 * @since 1.0.13
271
-	 *
272
-	 * @param WP_REST_Request $request Full details about the request.
273
-	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
274
-	 */
275
-	public function create_item( $request ) {
276
-
277
-		if ( ! empty( $request['id'] ) ) {
278
-			return new WP_Error( 'rest_invoice_exists', __( 'Cannot create existing item.', 'invoicing' ), array( 'status' => 400 ) );
279
-		}
280
-
281
-		$request->set_param( 'context', 'edit' );
282
-
283
-		// Prepare the updated data.
284
-		$invoice_data = $this->prepare_item_for_database( $request );
285
-
286
-		if ( is_wp_error( $invoice_data ) ) {
287
-			return $invoice_data;
288
-		}
289
-
290
-		// Try creating the invoice
291
-		$invoice_data['post_type']    = $this->post_type;
292
-		$invoice_data['private_note'] = __( 'Created via API.', 'invoicing' );
268
+     * Creates a single invoice.
269
+     *
270
+     * @since 1.0.13
271
+     *
272
+     * @param WP_REST_Request $request Full details about the request.
273
+     * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
274
+     */
275
+    public function create_item( $request ) {
276
+
277
+        if ( ! empty( $request['id'] ) ) {
278
+            return new WP_Error( 'rest_invoice_exists', __( 'Cannot create existing item.', 'invoicing' ), array( 'status' => 400 ) );
279
+        }
280
+
281
+        $request->set_param( 'context', 'edit' );
282
+
283
+        // Prepare the updated data.
284
+        $invoice_data = $this->prepare_item_for_database( $request );
285
+
286
+        if ( is_wp_error( $invoice_data ) ) {
287
+            return $invoice_data;
288
+        }
289
+
290
+        // Try creating the invoice
291
+        $invoice_data['post_type']    = $this->post_type;
292
+        $invoice_data['private_note'] = __( 'Created via API.', 'invoicing' );
293 293
         $invoice = wpinv_insert_invoice( $invoice_data, true );
294 294
 
295
-		if ( is_wp_error( $invoice ) ) {
295
+        if ( is_wp_error( $invoice ) ) {
296 296
             return $invoice;
297
-		}
298
-
299
-		// Prepare the response
300
-		$response = $this->prepare_item_for_response( $invoice, $request );
301
-
302
-		/**
303
-		 * Fires after a single invoice is created or updated via the REST API.
304
-		 *
305
-		 * @since 1.0.13
306
-		 *
307
-		 * @param WPinv_Invoice   $invoice  Inserted or updated invoice object.
308
-		 * @param WP_REST_Request $request  Request object.
309
-		 * @param bool            $creating True when creating a post, false when updating.
310
-		 */
311
-		do_action( "wpinv_rest_insert_invoice", $invoice, $request, true );
312
-
313
-		/**
314
-		 * Filters the responses for creating single invoice requests.
315
-		 *
316
-		 *
317
-		 * @since 1.0.13
318
-		 *
319
-		 *
320
-		 * @param array           $invoice_data Invoice properties.
321
-		 * @param WP_REST_Request $request The request used.
322
-		 */
297
+        }
298
+
299
+        // Prepare the response
300
+        $response = $this->prepare_item_for_response( $invoice, $request );
301
+
302
+        /**
303
+         * Fires after a single invoice is created or updated via the REST API.
304
+         *
305
+         * @since 1.0.13
306
+         *
307
+         * @param WPinv_Invoice   $invoice  Inserted or updated invoice object.
308
+         * @param WP_REST_Request $request  Request object.
309
+         * @param bool            $creating True when creating a post, false when updating.
310
+         */
311
+        do_action( "wpinv_rest_insert_invoice", $invoice, $request, true );
312
+
313
+        /**
314
+         * Filters the responses for creating single invoice requests.
315
+         *
316
+         *
317
+         * @since 1.0.13
318
+         *
319
+         *
320
+         * @param array           $invoice_data Invoice properties.
321
+         * @param WP_REST_Request $request The request used.
322
+         */
323 323
         $response       = apply_filters( "wpinv_rest_create_invoice_response", $response, $request );
324 324
 
325 325
         return rest_ensure_response( $response );
326
-	}
327
-
328
-	/**
329
-	 * Checks if a given request has access to update an invoice.
330
-	 *
331
-	 * @since 1.0.13
332
-	 *
333
-	 * @param WP_REST_Request $request Full details about the request.
334
-	 * @return true|WP_Error True if the request has access to update the item, WP_Error object otherwise.
335
-	 */
336
-	public function update_item_permissions_check( $request ) {
337
-
338
-		// Retrieve the invoice.
339
-		$invoice = $this->get_post( $request['id'] );
340
-		if ( is_wp_error( $invoice ) ) {
341
-			return $invoice;
342
-		}
343
-
344
-		$post_type = get_post_type_object( $this->post_type );
345
-
346
-		if ( ! current_user_can(  $post_type->cap->edit_post, $invoice->ID  ) ) {
347
-			return new WP_Error( 
326
+    }
327
+
328
+    /**
329
+     * Checks if a given request has access to update an invoice.
330
+     *
331
+     * @since 1.0.13
332
+     *
333
+     * @param WP_REST_Request $request Full details about the request.
334
+     * @return true|WP_Error True if the request has access to update the item, WP_Error object otherwise.
335
+     */
336
+    public function update_item_permissions_check( $request ) {
337
+
338
+        // Retrieve the invoice.
339
+        $invoice = $this->get_post( $request['id'] );
340
+        if ( is_wp_error( $invoice ) ) {
341
+            return $invoice;
342
+        }
343
+
344
+        $post_type = get_post_type_object( $this->post_type );
345
+
346
+        if ( ! current_user_can(  $post_type->cap->edit_post, $invoice->ID  ) ) {
347
+            return new WP_Error( 
348 348
                 'rest_cannot_edit', 
349 349
                 __( 'Sorry, you are not allowed to update this item.', 'invoicing' ), 
350 350
                 array( 
@@ -353,162 +353,162 @@  discard block
 block discarded – undo
353 353
             );
354 354
         }
355 355
 
356
-		return true;
357
-	}
358
-
359
-	/**
360
-	 * Updates a single invoice.
361
-	 *
362
-	 * @since 1.0.13
363
-	 *
364
-	 * @param WP_REST_Request $request Full details about the request.
365
-	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
366
-	 */
367
-	public function update_item( $request ) {
356
+        return true;
357
+    }
358
+
359
+    /**
360
+     * Updates a single invoice.
361
+     *
362
+     * @since 1.0.13
363
+     *
364
+     * @param WP_REST_Request $request Full details about the request.
365
+     * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
366
+     */
367
+    public function update_item( $request ) {
368 368
 		
369
-		// Ensure the invoice exists.
369
+        // Ensure the invoice exists.
370 370
         $valid_check = $this->get_post( $request['id'] );
371 371
         
372 372
         // Abort early if it does not exist
373
-		if ( is_wp_error( $valid_check ) ) {
374
-			return $valid_check;
375
-		}
373
+        if ( is_wp_error( $valid_check ) ) {
374
+            return $valid_check;
375
+        }
376 376
 
377
-		$request->set_param( 'context', 'edit' );
377
+        $request->set_param( 'context', 'edit' );
378 378
 
379
-		// Prepare the updated data.
380
-		$data_to_update = $this->prepare_item_for_database( $request );
379
+        // Prepare the updated data.
380
+        $data_to_update = $this->prepare_item_for_database( $request );
381 381
 
382
-		if ( is_wp_error( $data_to_update ) ) {
383
-			return $data_to_update;
384
-		}
382
+        if ( is_wp_error( $data_to_update ) ) {
383
+            return $data_to_update;
384
+        }
385 385
 
386
-		// Abort if no invoice data is provided
386
+        // Abort if no invoice data is provided
387 387
         if( empty( $data_to_update ) ) {
388 388
             return new WP_Error( 'missing_data', __( 'An update request cannot be empty.', 'invoicing' ) );
389 389
         }
390 390
 
391
-		// Include the invoice ID
392
-		$data_to_update['ID'] = $request['id'];
393
-
394
-		// Update the invoice
395
-		$updated_invoice = wpinv_update_invoice( $data_to_update, true );
396
-
397
-		// Incase the update operation failed...
398
-		if ( is_wp_error( $updated_invoice ) ) {
399
-			return $updated_invoice;
400
-		}
401
-
402
-		// Prepare the response
403
-		$response = $this->prepare_item_for_response( $updated_invoice, $request );
404
-
405
-		/** This action is documented in includes/class-wpinv-rest-invoice-controller.php */
406
-		do_action( "wpinv_rest_insert_invoice", $updated_invoice, $request, false );
407
-
408
-		/**
409
-		 * Filters the responses for updating single invoice requests.
410
-		 *
411
-		 *
412
-		 * @since 1.0.13
413
-		 *
414
-		 *
415
-		 * @param array           $invoice_data Invoice properties.
416
-		 * @param WP_REST_Request $request The request used.
417
-		 */
391
+        // Include the invoice ID
392
+        $data_to_update['ID'] = $request['id'];
393
+
394
+        // Update the invoice
395
+        $updated_invoice = wpinv_update_invoice( $data_to_update, true );
396
+
397
+        // Incase the update operation failed...
398
+        if ( is_wp_error( $updated_invoice ) ) {
399
+            return $updated_invoice;
400
+        }
401
+
402
+        // Prepare the response
403
+        $response = $this->prepare_item_for_response( $updated_invoice, $request );
404
+
405
+        /** This action is documented in includes/class-wpinv-rest-invoice-controller.php */
406
+        do_action( "wpinv_rest_insert_invoice", $updated_invoice, $request, false );
407
+
408
+        /**
409
+         * Filters the responses for updating single invoice requests.
410
+         *
411
+         *
412
+         * @since 1.0.13
413
+         *
414
+         *
415
+         * @param array           $invoice_data Invoice properties.
416
+         * @param WP_REST_Request $request The request used.
417
+         */
418 418
         $response       = apply_filters( "wpinv_rest_update_invoice_response", $response, $request );
419 419
 
420 420
         return rest_ensure_response( $response );
421
-	}
422
-
423
-	/**
424
-	 * Checks if a given request has access to delete an invoice.
425
-	 *
426
-	 * @since 1.0.13
427
-	 *
428
-	 * @param WP_REST_Request $request Full details about the request.
429
-	 * @return true|WP_Error True if the request has access to delete the invoice, WP_Error object otherwise.
430
-	 */
431
-	public function delete_item_permissions_check( $request ) {
432
-
433
-		// Retrieve the invoice.
434
-		$invoice = $this->get_post( $request['id'] );
435
-		if ( is_wp_error( $invoice ) ) {
436
-			return $invoice;
437
-		}
438
-
439
-		// Ensure the current user can delete invoices
440
-		if ( wpinv_current_user_can_manage_invoicing() ||  current_user_can( 'delete_invoices', $request['id'] ) ) {
441
-			return true;
442
-		}
443
-
444
-		return new WP_Error( 
445
-			'rest_cannot_delete', 
446
-			__( 'Sorry, you are not allowed to delete this item.', 'invoicing' ), 
447
-			array( 
448
-				'status' => rest_authorization_required_code(),
449
-			)
450
-		);
451
-	}
452
-
453
-	/**
454
-	 * Deletes a single invoice.
455
-	 *
456
-	 * @since 1.0.13
457
-	 *
458
-	 * @param WP_REST_Request $request Full details about the request.
459
-	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
460
-	 */
461
-	public function delete_item( $request ) {
421
+    }
422
+
423
+    /**
424
+     * Checks if a given request has access to delete an invoice.
425
+     *
426
+     * @since 1.0.13
427
+     *
428
+     * @param WP_REST_Request $request Full details about the request.
429
+     * @return true|WP_Error True if the request has access to delete the invoice, WP_Error object otherwise.
430
+     */
431
+    public function delete_item_permissions_check( $request ) {
432
+
433
+        // Retrieve the invoice.
434
+        $invoice = $this->get_post( $request['id'] );
435
+        if ( is_wp_error( $invoice ) ) {
436
+            return $invoice;
437
+        }
438
+
439
+        // Ensure the current user can delete invoices
440
+        if ( wpinv_current_user_can_manage_invoicing() ||  current_user_can( 'delete_invoices', $request['id'] ) ) {
441
+            return true;
442
+        }
443
+
444
+        return new WP_Error( 
445
+            'rest_cannot_delete', 
446
+            __( 'Sorry, you are not allowed to delete this item.', 'invoicing' ), 
447
+            array( 
448
+                'status' => rest_authorization_required_code(),
449
+            )
450
+        );
451
+    }
452
+
453
+    /**
454
+     * Deletes a single invoice.
455
+     *
456
+     * @since 1.0.13
457
+     *
458
+     * @param WP_REST_Request $request Full details about the request.
459
+     * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
460
+     */
461
+    public function delete_item( $request ) {
462 462
 		
463
-		// Retrieve the invoice.
464
-		$invoice = $this->get_post( $request['id'] );
465
-		if ( is_wp_error( $invoice ) ) {
466
-			return $invoice;
467
-		}
463
+        // Retrieve the invoice.
464
+        $invoice = $this->get_post( $request['id'] );
465
+        if ( is_wp_error( $invoice ) ) {
466
+            return $invoice;
467
+        }
468 468
 
469
-		$request->set_param( 'context', 'edit' );
469
+        $request->set_param( 'context', 'edit' );
470 470
 
471
-		// Prepare the invoice id
472
-		$id    = $invoice->ID;
471
+        // Prepare the invoice id
472
+        $id    = $invoice->ID;
473 473
 
474
-		// Prepare the response
475
-		$response = $this->prepare_item_for_response( $invoice, $request );
474
+        // Prepare the response
475
+        $response = $this->prepare_item_for_response( $invoice, $request );
476 476
 
477
-		// Check if the user wants to bypass the trash...
478
-		$force_delete = (bool) $request['force'];
477
+        // Check if the user wants to bypass the trash...
478
+        $force_delete = (bool) $request['force'];
479 479
 
480
-		// Try deleting the invoice.
481
-		$deleted = wp_delete_post( $id, $force_delete );
480
+        // Try deleting the invoice.
481
+        $deleted = wp_delete_post( $id, $force_delete );
482 482
 
483
-		// Abort early if we can't delete the invoice.
484
-		if ( ! $deleted ) {
485
-			return new WP_Error( 'rest_cannot_delete', __( 'The item cannot be deleted.', 'invoicing' ), array( 'status' => 500 ) );
486
-		}
483
+        // Abort early if we can't delete the invoice.
484
+        if ( ! $deleted ) {
485
+            return new WP_Error( 'rest_cannot_delete', __( 'The item cannot be deleted.', 'invoicing' ), array( 'status' => 500 ) );
486
+        }
487 487
 
488
-		/**
489
-		 * Fires immediately after a single invoice is deleted or trashed via the REST API.
490
-		 *
491
-		 *
492
-		 * @since 1.0.13
493
-		 *
494
-		 * @param WPInv_Invoice    $invoice  The deleted or trashed invoice.
495
-		 * @param WP_REST_Request  $request  The request sent to the API.
496
-		 */
497
-		do_action( "wpinv_rest_delete_invoice", $invoice, $request );
488
+        /**
489
+         * Fires immediately after a single invoice is deleted or trashed via the REST API.
490
+         *
491
+         *
492
+         * @since 1.0.13
493
+         *
494
+         * @param WPInv_Invoice    $invoice  The deleted or trashed invoice.
495
+         * @param WP_REST_Request  $request  The request sent to the API.
496
+         */
497
+        do_action( "wpinv_rest_delete_invoice", $invoice, $request );
498 498
 
499
-		return $response;
499
+        return $response;
500 500
 
501
-	}
501
+    }
502 502
     
503 503
     
504 504
     /**
505
-	 * Retrieves the query params for the invoices collection.
506
-	 *
507
-	 * @since 1.0.13
508
-	 *
509
-	 * @return array Collection parameters.
510
-	 */
511
-	public function get_collection_params() {
505
+     * Retrieves the query params for the invoices collection.
506
+     *
507
+     * @since 1.0.13
508
+     *
509
+     * @return array Collection parameters.
510
+     */
511
+    public function get_collection_params() {
512 512
         
513 513
         $query_params               = array(
514 514
 
@@ -526,11 +526,11 @@  discard block
 block discarded – undo
526 526
 
527 527
             // User.
528 528
             'user'                  => array(
529
-				'description'       => __( 'Limit result set to items for a specif user. Accepts a user ID, or comma-separated list of IDs', 'invoicing' ),
530
-				'type'              => 'string',
531
-			),
529
+                'description'       => __( 'Limit result set to items for a specif user. Accepts a user ID, or comma-separated list of IDs', 'invoicing' ),
530
+                'type'              => 'string',
531
+            ),
532 532
 
533
-			// Exclude certain users
533
+            // Exclude certain users
534 534
             'exclude_users'  	    => array(
535 535
                 'description' 		=> __( 'Exclude items from specific users.', 'invoicing' ),
536 536
                 'type'        		=> 'array',
@@ -540,59 +540,59 @@  discard block
 block discarded – undo
540 540
                 'default'     		=> array(),
541 541
             ),
542 542
 			
543
-			// Items before.
543
+            // Items before.
544 544
             'before_date'           => array(
545
-				'description'       => __( 'Limit result set to items created before a specific date. Accepts strtotime()-compatible string.', 'invoicing' ),
546
-				'type'              => 'string',
547
-			),
545
+                'description'       => __( 'Limit result set to items created before a specific date. Accepts strtotime()-compatible string.', 'invoicing' ),
546
+                'type'              => 'string',
547
+            ),
548 548
 
549 549
             'meta_key'           => array(
550
-				'description'       => __( 'Filter items by custom field key.', 'invoicing' ),
551
-				'type'              => 'string',
552
-			),
550
+                'description'       => __( 'Filter items by custom field key.', 'invoicing' ),
551
+                'type'              => 'string',
552
+            ),
553 553
 
554 554
             'meta_compare_key'           => array(
555
-				'description'       => __( 'Comparison operator to test the `meta_key`.', 'invoicing' ),
556
-				'type'              => 'string',
557
-				'default'              => '=',
558
-				'enum'        		=> array_map( 'trim', explode( ',', '=, !=, >, >=, <, <=, LIKE NOT, LIKE, IN, NOT IN, BETWEEN, NOT BETWEEN, NOT EXISTS, REGEXP, NOT REGEXP, RLIKE' ) ),
559
-			),
555
+                'description'       => __( 'Comparison operator to test the `meta_key`.', 'invoicing' ),
556
+                'type'              => 'string',
557
+                'default'              => '=',
558
+                'enum'        		=> array_map( 'trim', explode( ',', '=, !=, >, >=, <, <=, LIKE NOT, LIKE, IN, NOT IN, BETWEEN, NOT BETWEEN, NOT EXISTS, REGEXP, NOT REGEXP, RLIKE' ) ),
559
+            ),
560 560
 
561 561
             'meta_value'           => array(
562
-				'description'       => __( 'Filter items by custom field value.', 'invoicing' ),
563
-				'type'              => 'string',
564
-			),
562
+                'description'       => __( 'Filter items by custom field value.', 'invoicing' ),
563
+                'type'              => 'string',
564
+            ),
565 565
 
566 566
             'meta_compare'           => array(
567
-				'description'       => __( 'Comparison operator to test the `meta_value`.', 'invoicing' ),
568
-				'type'              => 'string',
569
-				'default'              => '=',
570
-				'enum'        		=> array_map( 'trim', explode( ',', '=, !=, >, >=, <, <=, LIKE NOT, LIKE, IN, NOT IN, BETWEEN, NOT BETWEEN, NOT EXISTS, REGEXP, NOT REGEXP, RLIKE' ) ),
571
-			),
572
-
573
-			'meta_value_num'           => array(
574
-				'description'       => __( 'Filter items by a numeric custom field value.', 'invoicing' ),
575
-				'type'              => 'integer',
576
-			),
577
-
578
-			// items after.
567
+                'description'       => __( 'Comparison operator to test the `meta_value`.', 'invoicing' ),
568
+                'type'              => 'string',
569
+                'default'              => '=',
570
+                'enum'        		=> array_map( 'trim', explode( ',', '=, !=, >, >=, <, <=, LIKE NOT, LIKE, IN, NOT IN, BETWEEN, NOT BETWEEN, NOT EXISTS, REGEXP, NOT REGEXP, RLIKE' ) ),
571
+            ),
572
+
573
+            'meta_value_num'           => array(
574
+                'description'       => __( 'Filter items by a numeric custom field value.', 'invoicing' ),
575
+                'type'              => 'integer',
576
+            ),
577
+
578
+            // items after.
579 579
             'after_date'            => array(
580
-				'description'       => __( 'Limit result set to items created after a specific date. Accepts strtotime()-compatible string.', 'invoicing' ),
581
-				'type'              => 'string',
580
+                'description'       => __( 'Limit result set to items created after a specific date. Accepts strtotime()-compatible string.', 'invoicing' ),
581
+                'type'              => 'string',
582 582
             ),
583 583
             
584 584
             // Number of results per page
585 585
             'limit'                 => array(
586
-				'description'       => __( 'Number of items to fetch.', 'invoicing' ),
587
-				'type'              => 'integer',
588
-				'default'           => (int) get_option( 'posts_per_page' ),
586
+                'description'       => __( 'Number of items to fetch.', 'invoicing' ),
587
+                'type'              => 'integer',
588
+                'default'           => (int) get_option( 'posts_per_page' ),
589 589
             ),
590 590
 
591 591
             // Pagination
592 592
             'page'     => array(
593
-				'description'       => __( 'Current page to fetch.', 'invoicing' ),
594
-				'type'              => 'integer',
595
-				'default'           => 1,
593
+                'description'       => __( 'Current page to fetch.', 'invoicing' ),
594
+                'type'              => 'integer',
595
+                'default'           => 1,
596 596
             ),
597 597
 
598 598
             // limit to certain items
@@ -603,9 +603,9 @@  discard block
 block discarded – undo
603 603
                     'type' => 'integer',
604 604
                 ),
605 605
                 'default'     => array(),
606
-			),
606
+            ),
607 607
 			
608
-			// Exclude certain items
608
+            // Exclude certain items
609 609
             'exclude'  => array(
610 610
                 'description' => __( 'Ensure result set excludes specific IDs.', 'invoicing' ),
611 611
                 'type'        => 'array',
@@ -624,9 +624,9 @@  discard block
 block discarded – undo
624 624
                     'date',
625 625
                     'id',
626 626
                     'modified',
627
-					'title',
628
-					'meta_value',
629
-					'meta_value_num'
627
+                    'title',
628
+                    'meta_value',
629
+                    'meta_value_num'
630 630
                 ),
631 631
             ),
632 632
 
@@ -639,932 +639,932 @@  discard block
 block discarded – undo
639 639
             ),
640 640
         );
641 641
 
642
-		/**
643
-		 * Filter collection parameters for the invoices controller.
644
-		 *
645
-		 *
646
-		 * @since 1.0.13
647
-		 *
648
-		 * @param array        $query_params JSON Schema-formatted collection parameters.
649
-		 */
650
-		return apply_filters( "wpinv_rest_invoices_collection_params", $query_params );
651
-	}
642
+        /**
643
+         * Filter collection parameters for the invoices controller.
644
+         *
645
+         *
646
+         * @since 1.0.13
647
+         *
648
+         * @param array        $query_params JSON Schema-formatted collection parameters.
649
+         */
650
+        return apply_filters( "wpinv_rest_invoices_collection_params", $query_params );
651
+    }
652 652
 	
653
-	/**
654
-	 * Retrieves the request query params for the invoices collection.
655
-	 *
656
-	 * @since 1.0.15
657
-	 * @param WP_REST_Request $request Full details about the request.
658
-	 * @return array Request collection parameters.
659
-	 */
660
-	public function get_request_collection_params( $request ) {
653
+    /**
654
+     * Retrieves the request query params for the invoices collection.
655
+     *
656
+     * @since 1.0.15
657
+     * @param WP_REST_Request $request Full details about the request.
658
+     * @return array Request collection parameters.
659
+     */
660
+    public function get_request_collection_params( $request ) {
661 661
 		
662
-		// Retrieve the list of registered invoice query parameters.
663
-		$registered = $this->get_collection_params();
662
+        // Retrieve the list of registered invoice query parameters.
663
+        $registered = $this->get_collection_params();
664 664
 
665
-		// Default args
666
-		$args       = array(
665
+        // Default args
666
+        $args       = array(
667 667
             'status'                => $this->get_post_statuses(),
668 668
             'user'                  => null,
669 669
             'exclude_users'  	    => array(),
670
-			'before_date'           => null,
670
+            'before_date'           => null,
671 671
             'meta_key'              => null,
672 672
             'meta_compare_key'      => '=',
673 673
             'meta_value'            => null,
674 674
             'meta_compare'          => '=',
675
-			'meta_value_num'        => null,
675
+            'meta_value_num'        => null,
676 676
             'after_date'            => null,
677 677
             'limit'                 => (int) get_option( 'posts_per_page' ),
678
-			'page'     				=> 1,
679
-			'include'				=> array(),
678
+            'page'     				=> 1,
679
+            'include'				=> array(),
680 680
             'exclude'  				=> array(),
681 681
             'orderby'  		  		=> 'date',
682 682
             'order'    				=> 'DESC',
683
-		);
683
+        );
684 684
 
685
-		// Add any params from the requests.
686
-		foreach ( array_keys( $registered ) as $key ) {
685
+        // Add any params from the requests.
686
+        foreach ( array_keys( $registered ) as $key ) {
687 687
             if ( isset( $request[ $key] ) ) {
688 688
                 $args[ $key ] = $request[ $key];
689 689
             }
690 690
         }
691 691
 		
692
-		/**
693
-		 * Filters the requests collection parameters for the invoices controller.
694
-		 *
695
-		 *
696
-		 * @since 1.0.15
697
-		 *
698
-		 * @param array           $args    Request query args.
699
-		 * @param WP_REST_Request $request Full details about the request.
700
-		 */
701
-		return apply_filters( "wpinv_rest_invoices_collection_request_params", $args, $request );
702
-	}
692
+        /**
693
+         * Filters the requests collection parameters for the invoices controller.
694
+         *
695
+         *
696
+         * @since 1.0.15
697
+         *
698
+         * @param array           $args    Request query args.
699
+         * @param WP_REST_Request $request Full details about the request.
700
+         */
701
+        return apply_filters( "wpinv_rest_invoices_collection_request_params", $args, $request );
702
+    }
703 703
 	
704
-	/**
705
-	 * Retrieves the WP_Query params for the invoices collection.
706
-	 *
707
-	 * @since 1.0.15
708
-	 * @param array           $args Request args.
709
-	 * @param WP_REST_Request $request Full details about the request.
710
-	 * @return array WP_Query parameters.
711
-	 */
712
-	public function get_collection_wp_query_params( $args, $request ) {
704
+    /**
705
+     * Retrieves the WP_Query params for the invoices collection.
706
+     *
707
+     * @since 1.0.15
708
+     * @param array           $args Request args.
709
+     * @param WP_REST_Request $request Full details about the request.
710
+     * @return array WP_Query parameters.
711
+     */
712
+    public function get_collection_wp_query_params( $args, $request ) {
713 713
 		
714
-		// Prepare the parameters.
715
-		$wp_query_args = array(
716
-			'post_type'        => $this->post_type,
717
-			'post_status'      => $args['status'],
718
-			'author'           => $args['user'],
719
-			'author__not_in'   => $args['exclude_users'],
720
-			'posts_per_page'   => $args['limit'],
721
-			'paged'            => $args['page'],
722
-			'meta_key'         => $args['meta_key'],
723
-			'meta_compare_key' => $args['meta_compare_key'],
724
-			'meta_value'       => $args['meta_value'],
725
-			'meta_compare'     => $args['meta_compare'],
726
-			'meta_value_num'   => $args['meta_value_num'],
727
-			'post__in'         => $args['include'],
728
-			'post__in'         => $args['exclude'],
729
-			'date_query'       => array( array() ),
730
-			'fields'           => 'ids',
731
-			'orderby'          => $args['orderby'],
732
-			'order'            => $args['order'],
733
-		);
734
-
735
-		// Only admins can view other user's invoices.
736
-		if ( ! wpinv_current_user_can_manage_invoicing() ) {
737
-			$wp_query_args['author'] = get_current_user_id();
738
-		}
739
-
740
-		// No date specific params provided.
741
-		if ( empty( $args['before_date'] ) && empty( $args['after_date'] ) ) {
742
-			unset( $wp_query_args['date_query'] );
743
-		}
744
-
745
-		if ( ! empty( $args['before_date'] ) ) {
746
-			$wp_query_args['date_query'][0]['before'] = $args['before_date'];
747
-		}
748
-
749
-		if ( ! empty( $args['after_date'] ) ) {
750
-			$wp_query_args['date_query'][0]['after'] = $args['after_date'];
751
-		}
752
-
753
-		// Remove empty variables.
754
-		$wp_query_args = array_filter( $wp_query_args );
755
-
756
-		// This can be zero.
757
-		if ( ! is_null( $args['meta_value_num'] ) ) {
758
-			$wp_query_args['meta_value_num'] = $args['meta_value_num'];
759
-		}
714
+        // Prepare the parameters.
715
+        $wp_query_args = array(
716
+            'post_type'        => $this->post_type,
717
+            'post_status'      => $args['status'],
718
+            'author'           => $args['user'],
719
+            'author__not_in'   => $args['exclude_users'],
720
+            'posts_per_page'   => $args['limit'],
721
+            'paged'            => $args['page'],
722
+            'meta_key'         => $args['meta_key'],
723
+            'meta_compare_key' => $args['meta_compare_key'],
724
+            'meta_value'       => $args['meta_value'],
725
+            'meta_compare'     => $args['meta_compare'],
726
+            'meta_value_num'   => $args['meta_value_num'],
727
+            'post__in'         => $args['include'],
728
+            'post__in'         => $args['exclude'],
729
+            'date_query'       => array( array() ),
730
+            'fields'           => 'ids',
731
+            'orderby'          => $args['orderby'],
732
+            'order'            => $args['order'],
733
+        );
734
+
735
+        // Only admins can view other user's invoices.
736
+        if ( ! wpinv_current_user_can_manage_invoicing() ) {
737
+            $wp_query_args['author'] = get_current_user_id();
738
+        }
739
+
740
+        // No date specific params provided.
741
+        if ( empty( $args['before_date'] ) && empty( $args['after_date'] ) ) {
742
+            unset( $wp_query_args['date_query'] );
743
+        }
744
+
745
+        if ( ! empty( $args['before_date'] ) ) {
746
+            $wp_query_args['date_query'][0]['before'] = $args['before_date'];
747
+        }
748
+
749
+        if ( ! empty( $args['after_date'] ) ) {
750
+            $wp_query_args['date_query'][0]['after'] = $args['after_date'];
751
+        }
752
+
753
+        // Remove empty variables.
754
+        $wp_query_args = array_filter( $wp_query_args );
755
+
756
+        // This can be zero.
757
+        if ( ! is_null( $args['meta_value_num'] ) ) {
758
+            $wp_query_args['meta_value_num'] = $args['meta_value_num'];
759
+        }
760 760
 		
761
-		/**
762
-		 * Filters the invoices collection WP_Query parameters for the invoices controller.
763
-		 *
764
-		 *
765
-		 * @since 1.0.15
766
-		 *
767
-		 * @param array           $args          Request args.
768
-		 * @param array           $wp_query_args Generated WP_Query args args.
769
-		 * @param WP_REST_Request $request       Full details about the request.
770
-		 */
771
-		return apply_filters( "wpinv_rest_invoices_collection_wp_query_params", $wp_query_args, $args, $request );
761
+        /**
762
+         * Filters the invoices collection WP_Query parameters for the invoices controller.
763
+         *
764
+         *
765
+         * @since 1.0.15
766
+         *
767
+         * @param array           $args          Request args.
768
+         * @param array           $wp_query_args Generated WP_Query args args.
769
+         * @param WP_REST_Request $request       Full details about the request.
770
+         */
771
+        return apply_filters( "wpinv_rest_invoices_collection_wp_query_params", $wp_query_args, $args, $request );
772 772
     }
773 773
     
774 774
     /**
775
-	 * Checks if a given post type can be viewed or managed.
776
-	 *
777
-	 * @since 1.0.13
778
-	 *
779
-	 * @param object|string $post_type Post type name or object.
780
-	 * @return bool Whether the post type is allowed in REST.
781
-	 */
782
-	protected function check_is_post_type_allowed( $post_type ) {
783
-		return true;
784
-	}
785
-
786
-	/**
787
-	 * Prepares a single invoice for create or update.
788
-	 *
789
-	 * @since 1.0.13
790
-	 *
791
-	 * @param WP_REST_Request $request Request object.
792
-	 * @return array|WP_Error Invoice Properties or WP_Error.
793
-	 */
794
-	protected function prepare_item_for_database( $request ) {
795
-		$prepared_invoice = new stdClass();
796
-
797
-		// Post ID.
798
-		if ( isset( $request['id'] ) ) {
799
-			$existing_invoice = $this->get_post( $request['id'] );
800
-			if ( is_wp_error( $existing_invoice ) ) {
801
-				return $existing_invoice;
802
-			}
803
-
804
-			$prepared_invoice->ID 		  = $existing_invoice->ID;
805
-			$prepared_invoice->invoice_id = $existing_invoice->ID;
806
-		}
807
-
808
-		$schema = $this->get_item_schema();
809
-
810
-		// Invoice owner.
811
-		if ( ! empty( $schema['properties']['user_id'] ) && isset( $request['user_id'] ) ) {
812
-			$prepared_invoice->user_id = (int) $request['user_id'];
813
-		}
814
-
815
-		// Cart details.
816
-		if ( ! empty( $schema['properties']['cart_details'] ) && isset( $request['cart_details'] ) ) {
817
-			$prepared_invoice->cart_details = (array) $request['cart_details'];
818
-		}
819
-
820
-		// Invoice status.
821
-		if ( ! empty( $schema['properties']['status'] ) && isset( $request['status'] ) ) {
822
-
823
-			if ( in_array( $request['status'], $this->get_post_statuses(), true ) ) {
824
-				$prepared_invoice->status = $request['status'];
825
-			}
826
-
827
-		}
828
-
829
-		// User info
830
-		if ( ! empty( $schema['properties']['user_info'] ) && isset( $request['user_info'] ) ) {
831
-			$prepared_invoice->user_info = array();
832
-			$user_info = (array) $request['user_info'];
833
-
834
-			foreach( $user_info as $prop => $value ) {
835
-
836
-				if ( ! empty( $schema['properties']['user_info']['properties'][$prop] ) ) {
837
-
838
-					$prepared_invoice->user_info[$prop] = $value;
775
+     * Checks if a given post type can be viewed or managed.
776
+     *
777
+     * @since 1.0.13
778
+     *
779
+     * @param object|string $post_type Post type name or object.
780
+     * @return bool Whether the post type is allowed in REST.
781
+     */
782
+    protected function check_is_post_type_allowed( $post_type ) {
783
+        return true;
784
+    }
785
+
786
+    /**
787
+     * Prepares a single invoice for create or update.
788
+     *
789
+     * @since 1.0.13
790
+     *
791
+     * @param WP_REST_Request $request Request object.
792
+     * @return array|WP_Error Invoice Properties or WP_Error.
793
+     */
794
+    protected function prepare_item_for_database( $request ) {
795
+        $prepared_invoice = new stdClass();
796
+
797
+        // Post ID.
798
+        if ( isset( $request['id'] ) ) {
799
+            $existing_invoice = $this->get_post( $request['id'] );
800
+            if ( is_wp_error( $existing_invoice ) ) {
801
+                return $existing_invoice;
802
+            }
803
+
804
+            $prepared_invoice->ID 		  = $existing_invoice->ID;
805
+            $prepared_invoice->invoice_id = $existing_invoice->ID;
806
+        }
807
+
808
+        $schema = $this->get_item_schema();
809
+
810
+        // Invoice owner.
811
+        if ( ! empty( $schema['properties']['user_id'] ) && isset( $request['user_id'] ) ) {
812
+            $prepared_invoice->user_id = (int) $request['user_id'];
813
+        }
814
+
815
+        // Cart details.
816
+        if ( ! empty( $schema['properties']['cart_details'] ) && isset( $request['cart_details'] ) ) {
817
+            $prepared_invoice->cart_details = (array) $request['cart_details'];
818
+        }
819
+
820
+        // Invoice status.
821
+        if ( ! empty( $schema['properties']['status'] ) && isset( $request['status'] ) ) {
822
+
823
+            if ( in_array( $request['status'], $this->get_post_statuses(), true ) ) {
824
+                $prepared_invoice->status = $request['status'];
825
+            }
826
+
827
+        }
828
+
829
+        // User info
830
+        if ( ! empty( $schema['properties']['user_info'] ) && isset( $request['user_info'] ) ) {
831
+            $prepared_invoice->user_info = array();
832
+            $user_info = (array) $request['user_info'];
833
+
834
+            foreach( $user_info as $prop => $value ) {
835
+
836
+                if ( ! empty( $schema['properties']['user_info']['properties'][$prop] ) ) {
837
+
838
+                    $prepared_invoice->user_info[$prop] = $value;
839 839
 		
840
-				}
840
+                }
841 841
 
842
-			}
842
+            }
843 843
 
844
-		}
844
+        }
845 845
 
846
-		// IP
847
-		if ( ! empty( $schema['properties']['ip'] ) && isset( $request['ip'] ) ) {
848
-			$prepared_invoice->ip = $request['ip'];
849
-		}
846
+        // IP
847
+        if ( ! empty( $schema['properties']['ip'] ) && isset( $request['ip'] ) ) {
848
+            $prepared_invoice->ip = $request['ip'];
849
+        }
850 850
 
851
-		// Payment details
852
-		$prepared_invoice->payment_details = array();
851
+        // Payment details
852
+        $prepared_invoice->payment_details = array();
853 853
 
854
-		if ( ! empty( $schema['properties']['gateway'] ) && isset( $request['gateway'] ) ) {
855
-			$prepared_invoice->payment_details['gateway'] = $request['gateway'];
856
-		}
854
+        if ( ! empty( $schema['properties']['gateway'] ) && isset( $request['gateway'] ) ) {
855
+            $prepared_invoice->payment_details['gateway'] = $request['gateway'];
856
+        }
857 857
 
858
-		if ( ! empty( $schema['properties']['gateway_title'] ) && isset( $request['gateway_title'] ) ) {
859
-			$prepared_invoice->payment_details['gateway_title'] = $request['gateway_title'];
860
-		}
858
+        if ( ! empty( $schema['properties']['gateway_title'] ) && isset( $request['gateway_title'] ) ) {
859
+            $prepared_invoice->payment_details['gateway_title'] = $request['gateway_title'];
860
+        }
861 861
 
862
-		if ( ! empty( $schema['properties']['currency'] ) && isset( $request['currency'] ) ) {
863
-			$prepared_invoice->payment_details['currency'] = $request['currency'];
864
-		}
862
+        if ( ! empty( $schema['properties']['currency'] ) && isset( $request['currency'] ) ) {
863
+            $prepared_invoice->payment_details['currency'] = $request['currency'];
864
+        }
865 865
 
866
-		if ( ! empty( $schema['properties']['transaction_id'] ) && isset( $request['transaction_id'] ) ) {
867
-			$prepared_invoice->payment_details['transaction_id'] = $request['transaction_id'];
868
-		}
866
+        if ( ! empty( $schema['properties']['transaction_id'] ) && isset( $request['transaction_id'] ) ) {
867
+            $prepared_invoice->payment_details['transaction_id'] = $request['transaction_id'];
868
+        }
869 869
 
870
-		// Dates
871
-		if ( ! empty( $schema['properties']['date'] ) && isset( $request['date'] ) ) {
872
-			$post_date = rest_get_date_with_gmt( $request['date'] );
870
+        // Dates
871
+        if ( ! empty( $schema['properties']['date'] ) && isset( $request['date'] ) ) {
872
+            $post_date = rest_get_date_with_gmt( $request['date'] );
873 873
 
874
-			if ( ! empty( $post_date ) ) {
875
-				$prepared_invoice->post_date = $post_date[0];
876
-			}
874
+            if ( ! empty( $post_date ) ) {
875
+                $prepared_invoice->post_date = $post_date[0];
876
+            }
877 877
 			
878
-		}
878
+        }
879 879
 
880
-		if ( ! empty( $schema['properties']['due_date'] ) && isset( $request['due_date'] ) ) {
881
-			$due_date = rest_get_date_with_gmt( $request['due_date'] );
880
+        if ( ! empty( $schema['properties']['due_date'] ) && isset( $request['due_date'] ) ) {
881
+            $due_date = rest_get_date_with_gmt( $request['due_date'] );
882 882
 
883
-			if ( ! empty( $due_date ) ) {
884
-				$prepared_invoice->due_date = $due_date[0];
885
-			}
883
+            if ( ! empty( $due_date ) ) {
884
+                $prepared_invoice->due_date = $due_date[0];
885
+            }
886 886
 
887
-		}
887
+        }
888 888
 
889
-		if ( ! empty( $schema['properties']['valid_until'] ) && isset( $request['valid_until'] ) ) {
889
+        if ( ! empty( $schema['properties']['valid_until'] ) && isset( $request['valid_until'] ) ) {
890 890
 
891
-			if ( ! empty( $request['valid_until'] ) ) {
892
-				$prepared_invoice->valid_until = gmdate( 'Y-m-d', strtotime( $request['valid_until'] ) );
893
-			} else {
894
-				$prepared_invoice->valid_until = '';
895
-			}
891
+            if ( ! empty( $request['valid_until'] ) ) {
892
+                $prepared_invoice->valid_until = gmdate( 'Y-m-d', strtotime( $request['valid_until'] ) );
893
+            } else {
894
+                $prepared_invoice->valid_until = '';
895
+            }
896 896
 
897
-		}
897
+        }
898 898
 
899
-		$invoice_data = (array) wp_unslash( $prepared_invoice );
899
+        $invoice_data = (array) wp_unslash( $prepared_invoice );
900 900
 
901
-		/**
902
-		 * Filters an invoice before it is inserted via the REST API.
903
-		 *
904
-		 * @since 1.0.13
905
-		 *
906
-		 * @param array        $invoice_data An array of invoice data
907
-		 * @param WP_REST_Request $request       Request object.
908
-		 */
909
-		return apply_filters( "wpinv_rest_pre_insert_invoice", $invoice_data, $request );
901
+        /**
902
+         * Filters an invoice before it is inserted via the REST API.
903
+         *
904
+         * @since 1.0.13
905
+         *
906
+         * @param array        $invoice_data An array of invoice data
907
+         * @param WP_REST_Request $request       Request object.
908
+         */
909
+        return apply_filters( "wpinv_rest_pre_insert_invoice", $invoice_data, $request );
910 910
 
911
-	}
911
+    }
912 912
 
913
-	/**
914
-	 * Prepares a single invoice output for response.
915
-	 *
916
-	 * @since 1.0.13
917
-	 *
918
-	 * @param WPInv_Invoice   $invoice    Invoice object.
919
-	 * @param WP_REST_Request $request Request object.
920
-	 * @return WP_REST_Response Response object.
921
-	 */
922
-	public function prepare_item_for_response( $invoice, $request ) {
913
+    /**
914
+     * Prepares a single invoice output for response.
915
+     *
916
+     * @since 1.0.13
917
+     *
918
+     * @param WPInv_Invoice   $invoice    Invoice object.
919
+     * @param WP_REST_Request $request Request object.
920
+     * @return WP_REST_Response Response object.
921
+     */
922
+    public function prepare_item_for_response( $invoice, $request ) {
923 923
 
924
-		$GLOBALS['post'] = get_post( $invoice->ID );
924
+        $GLOBALS['post'] = get_post( $invoice->ID );
925 925
 
926
-		setup_postdata( $invoice->ID );
926
+        setup_postdata( $invoice->ID );
927 927
 
928
-		// Fetch the fields to include in this response.
929
-		$fields = $this->get_fields_for_response( $request );
928
+        // Fetch the fields to include in this response.
929
+        $fields = $this->get_fields_for_response( $request );
930 930
 
931
-		// Base fields for every invoice.
932
-		$data = array();
931
+        // Base fields for every invoice.
932
+        $data = array();
933 933
 
934
-		// Set up ID
935
-		if ( rest_is_field_included( 'id', $fields ) ) {
936
-			$data['id'] = $invoice->ID;
937
-		}
934
+        // Set up ID
935
+        if ( rest_is_field_included( 'id', $fields ) ) {
936
+            $data['id'] = $invoice->ID;
937
+        }
938 938
 
939 939
 
940
-		// Basic properties
941
-		$invoice_properties = array(
942
-			'title', 'email', 'ip', 
943
-			'key', 'number', 'transaction_id', 'mode',
944
-			'gateway', 'gateway_title',
945
-			'total', 'discount', 'discount_code', 
946
-			'tax', 'fees_total', 'subtotal', 'currency',
947
-			'status', 'status_nicename', 'post_type'
948
-		);
949
-
950
-		foreach( $invoice_properties as $property ) {
940
+        // Basic properties
941
+        $invoice_properties = array(
942
+            'title', 'email', 'ip', 
943
+            'key', 'number', 'transaction_id', 'mode',
944
+            'gateway', 'gateway_title',
945
+            'total', 'discount', 'discount_code', 
946
+            'tax', 'fees_total', 'subtotal', 'currency',
947
+            'status', 'status_nicename', 'post_type'
948
+        );
951 949
 
952
-			if ( rest_is_field_included( $property, $fields ) ) {
953
-				$data[$property] = $invoice->get( $property );
954
-			}
955
-
956
-		}
957
-
958
-		// Valid until
959
-		if ( rest_is_field_included( 'valid_until', $fields ) && $this->post_type === 'wpi_quote' ) {
960
-			$data['valid_until'] = get_post_meta( $invoice->ID, 'wpinv_quote_valid_until', true );
961
-		}
962
-
963
-		// Cart details
964
-		if ( rest_is_field_included( 'cart_details', $fields ) ) {
965
-			$data['cart_details'] = $invoice->get( 'cart_details' );
966
-		}
967
-
968
-		//Dates
969
-		$invoice_properties = array( 'date', 'due_date', 'completed_date' );
970
-
971
-		foreach( $invoice_properties as $property ) {
972
-
973
-			if ( rest_is_field_included( $property, $fields ) ) {
974
-				$data[$property] = $this->prepare_date_response( '0000-00-00 00:00:00', $invoice->get( $property ) );
975
-			}
976
-
977
-		}
978
-
979
-		// User id
980
-		if ( rest_is_field_included( 'user_id', $fields ) ) {
981
-			$data['user_id'] = (int) $invoice->get( 'user_id' );
982
-		}
983
-
984
-		// User info
985
-		$user_info = array( 'first_name', 'last_name', 'company', 'vat_number', 'vat_rate', 'address', 'city', 'country', 'state', 'zip', 'phone' );
986
-
987
-		foreach( $user_info as $property ) {
988
-
989
-			if ( rest_is_field_included( "user_info.$property", $fields ) ) {
990
-				$data['user_info'][$property] = $invoice->get( $property );
991
-			}
992
-
993
-		}
994
-
995
-		// Slug
996
-		if ( rest_is_field_included( 'slug', $fields ) ) {
997
-			$data['slug'] = $invoice->get( 'post_name' );
998
-		}
999
-
1000
-		// View invoice link
1001
-		if ( rest_is_field_included( 'link', $fields ) ) {
1002
-			$data['link'] = esc_url( $invoice->get_view_url() );
1003
-		}
1004
-
1005
-
1006
-		$context = ! empty( $request['context'] ) ? $request['context'] : 'view';
1007
-		$data    = $this->add_additional_fields_to_object( $data, $request );
1008
-		$data    = $this->filter_response_by_context( $data, $context );
1009
-
1010
-		// Wrap the data in a response object.
1011
-		$response = rest_ensure_response( $data );
1012
-
1013
-		$links = $this->prepare_links( $invoice );
1014
-		$response->add_links( $links );
1015
-
1016
-		if ( ! empty( $links['self']['href'] ) ) {
1017
-			$actions = $this->get_available_actions( $invoice, $request );
1018
-
1019
-			$self = $links['self']['href'];
1020
-
1021
-			foreach ( $actions as $rel ) {
1022
-				$response->add_link( $rel, $self );
1023
-			}
1024
-		}
1025
-
1026
-		/**
1027
-		 * Filters the invoice data for a response.
1028
-		 *
1029
-		 * @since 1.0.13
1030
-		 *
1031
-		 * @param WP_REST_Response $response The response object.
1032
-		 * @param WPInv_Invoice    $invoice  The invoice object.
1033
-		 * @param WP_REST_Request  $request  Request object.
1034
-		 */
1035
-		return apply_filters( "wpinv_rest_prepare_invoice", $response, $invoice, $request );
1036
-	}
1037
-
1038
-	/**
1039
-	 * Gets an array of fields to be included on the response.
1040
-	 *
1041
-	 * Included fields are based on item schema and `_fields=` request argument.
1042
-	 *
1043
-	 * @since 1.0.13
1044
-	 *
1045
-	 * @param WP_REST_Request $request Full details about the request.
1046
-	 * @return array Fields to be included in the response.
1047
-	 */
1048
-	public function get_fields_for_response( $request ) {
1049
-		$schema     = $this->get_item_schema();
1050
-		$properties = isset( $schema['properties'] ) ? $schema['properties'] : array();
1051
-
1052
-		$additional_fields = $this->get_additional_fields();
1053
-		foreach ( $additional_fields as $field_name => $field_options ) {
1054
-			// For back-compat, include any field with an empty schema
1055
-			// because it won't be present in $this->get_item_schema().
1056
-			if ( is_null( $field_options['schema'] ) ) {
1057
-				$properties[ $field_name ] = $field_options;
1058
-			}
1059
-		}
1060
-
1061
-		// Exclude fields that specify a different context than the request context.
1062
-		$context = $request['context'];
1063
-		if ( $context ) {
1064
-			foreach ( $properties as $name => $options ) {
1065
-				if ( ! empty( $options['context'] ) && ! in_array( $context, $options['context'], true ) ) {
1066
-					unset( $properties[ $name ] );
1067
-				}
1068
-			}
1069
-		}
1070
-
1071
-		$fields = array_keys( $properties );
1072
-
1073
-		if ( ! isset( $request['_fields'] ) ) {
1074
-			return $fields;
1075
-		}
1076
-		$requested_fields = wpinv_parse_list( $request['_fields'] );
1077
-		if ( 0 === count( $requested_fields ) ) {
1078
-			return $fields;
1079
-		}
1080
-		// Trim off outside whitespace from the comma delimited list.
1081
-		$requested_fields = array_map( 'trim', $requested_fields );
1082
-		// Always persist 'id', because it can be needed for add_additional_fields_to_object().
1083
-		if ( in_array( 'id', $fields, true ) ) {
1084
-			$requested_fields[] = 'id';
1085
-		}
1086
-		// Return the list of all requested fields which appear in the schema.
1087
-		return array_reduce(
1088
-			$requested_fields,
1089
-			function( $response_fields, $field ) use ( $fields ) {
1090
-				if ( in_array( $field, $fields, true ) ) {
1091
-					$response_fields[] = $field;
1092
-					return $response_fields;
1093
-				}
1094
-				// Check for nested fields if $field is not a direct match.
1095
-				$nested_fields = explode( '.', $field );
1096
-				// A nested field is included so long as its top-level property is
1097
-				// present in the schema.
1098
-				if ( in_array( $nested_fields[0], $fields, true ) ) {
1099
-					$response_fields[] = $field;
1100
-				}
1101
-				return $response_fields;
1102
-			},
1103
-			array()
1104
-		);
1105
-	}
1106
-
1107
-	/**
1108
-	 * Retrieves the invoice's schema, conforming to JSON Schema.
1109
-	 *
1110
-	 * @since 1.0.13
1111
-	 *
1112
-	 * @return array Invoice schema data.
1113
-	 */
1114
-	public function get_item_schema() {
1115
-
1116
-		// Maybe retrieve the schema from cache.
1117
-		if ( $this->schema ) {
1118
-			return $this->add_additional_fields_schema( $this->schema );
1119
-		}
1120
-
1121
-		$schema = array(
1122
-			'$schema'    => 'http://json-schema.org/draft-04/schema#',
1123
-			'title'      => $this->post_type,
1124
-			'type'       => 'object',
1125
-
1126
-			// Base properties for every Invoice.
1127
-			'properties' 		  => array(
1128
-
1129
-				'title'			  => array(
1130
-					'description' => __( 'The title for the invoice.', 'invoicing' ),
1131
-					'type'        => 'string',
1132
-					'context'     => array( 'view', 'edit', 'embed' ),
1133
-					'readonly'    => true,
1134
-				),
1135
-
1136
-				'user_id'		  => array(
1137
-					'description' => __( 'The ID of the owner of the invoice.', 'invoicing' ),
1138
-					'type'        => 'integer',
1139
-					'context'     => array( 'view', 'edit', 'embed' ),
1140
-				),
1141
-
1142
-				'email'		  	  => array(
1143
-					'description' => __( 'The email of the owner of the invoice.', 'invoicing' ),
1144
-					'type'        => 'string',
1145
-					'context'     => array( 'view', 'edit', 'embed' ),
1146
-					'readonly'    => true,
1147
-				),
1148
-
1149
-				'ip'			  => array(
1150
-					'description' => __( 'The IP of the owner of the invoice.', 'invoicing' ),
1151
-					'type'        => 'string',
1152
-					'context'     => array( 'view', 'edit', 'embed' ),
1153
-				),
1154
-
1155
-				'user_info'       => array(
1156
-					'description' => __( 'Information about the owner of the invoice.', 'invoicing' ),
1157
-					'type'        => 'object',
1158
-					'context'     => array( 'view', 'edit', 'embed' ),
1159
-					'properties'  => array(
1160
-
1161
-						'first_name'      => array(
1162
-							'description' => __( 'The first name of the owner of the invoice.', 'invoicing' ),
1163
-							'type'        => 'string',
1164
-							'context'     => array( 'view', 'edit', 'embed' ),
1165
-						),
1166
-
1167
-						'last_name'       => array(
1168
-							'description' => __( 'The last name of the owner of the invoice.', 'invoicing' ),
1169
-							'type'        => 'string',
1170
-							'context'     => array( 'view', 'edit', 'embed' ),
1171
-						),
1172
-
1173
-						'company'         => array(
1174
-							'description' => __( 'The company of the owner of the invoice.', 'invoicing' ),
1175
-							'type'        => 'string',
1176
-							'context'     => array( 'view', 'edit', 'embed' ),
1177
-						),
1178
-
1179
-						'vat_number'      => array(
1180
-							'description' => __( 'The VAT number of the owner of the invoice.', 'invoicing' ),
1181
-							'type'        => 'string',
1182
-							'context'     => array( 'view', 'edit', 'embed' ),
1183
-						),
1184
-
1185
-						'vat_rate'        => array(
1186
-							'description' => __( 'The VAT rate applied on the invoice.', 'invoicing' ),
1187
-							'type'        => 'string',
1188
-							'context'     => array( 'view', 'edit', 'embed' ),
1189
-						),
1190
-
1191
-						'address'        => array(
1192
-							'description' => __( 'The address of the invoice owner.', 'invoicing' ),
1193
-							'type'        => 'string',
1194
-							'context'     => array( 'view', 'edit', 'embed' ),
1195
-						),
1196
-
1197
-						'city'            => array(
1198
-							'description' => __( 'The city of the invoice owner.', 'invoicing' ),
1199
-							'type'        => 'string',
1200
-							'context'     => array( 'view', 'edit', 'embed' ),
1201
-						),
1202
-
1203
-						'country'         => array(
1204
-							'description' => __( 'The country of the invoice owner.', 'invoicing' ),
1205
-							'type'        => 'string',
1206
-							'context'     => array( 'view', 'edit', 'embed' ),
1207
-						),
1208
-
1209
-						'state'           => array(
1210
-							'description' => __( 'The state of the invoice owner.', 'invoicing' ),
1211
-							'type'        => 'string',
1212
-							'context'     => array( 'view', 'edit', 'embed' ),
1213
-						),
1214
-
1215
-						'zip'             => array(
1216
-							'description' => __( 'The zip code of the invoice owner.', 'invoicing' ),
1217
-							'type'        => 'string',
1218
-							'context'     => array( 'view', 'edit', 'embed' ),
1219
-						),
1220
-
1221
-						'phone'             => array(
1222
-							'description' => __( 'The phone number of the invoice owner.', 'invoicing' ),
1223
-							'type'        => 'string',
1224
-							'context'     => array( 'view', 'edit', 'embed' ),
1225
-						),
1226
-					),
1227
-				),
1228
-
1229
-				'id'           => array(
1230
-					'description' => __( 'Unique identifier for the invoice.', 'invoicing' ),
1231
-					'type'        => 'integer',
1232
-					'context'     => array( 'view', 'edit', 'embed' ),
1233
-					'readonly'    => true,
1234
-				),
1235
-
1236
-				'key'			  => array(
1237
-					'description' => __( 'A unique key for the invoice.', 'invoicing' ),
1238
-					'type'        => 'string',
1239
-					'context'     => array( 'view', 'edit', 'embed' ),
1240
-					'readonly'    => true,
1241
-				),
1242
-
1243
-				'number'		  => array(
1244
-					'description' => __( 'The invoice number.', 'invoicing' ),
1245
-					'type'        => 'string',
1246
-					'context'     => array( 'view', 'edit', 'embed' ),
1247
-					'readonly'    => true,
1248
-				),
1249
-
1250
-				'transaction_id'  => array(
1251
-					'description' => __( 'The transaction id of the invoice.', 'invoicing' ),
1252
-					'type'        => 'string',
1253
-					'context'     => array( 'view', 'edit', 'embed' ),
1254
-				),
1255
-
1256
-				'gateway'		  => array(
1257
-					'description' => __( 'The gateway used to process the invoice.', 'invoicing' ),
1258
-					'type'        => 'string',
1259
-					'context'     => array( 'view', 'edit', 'embed' ),
1260
-				),
1261
-
1262
-				'gateway_title'	  => array(
1263
-					'description' => __( 'The title of the gateway used to process the invoice.', 'invoicing' ),
1264
-					'type'        => 'string',
1265
-					'context'     => array( 'view', 'edit', 'embed' ),
1266
-				),
1267
-
1268
-				'total'	  		  => array(
1269
-					'description' => __( 'The total amount of the invoice.', 'invoicing' ),
1270
-					'type'        => 'number',
1271
-					'context'     => array( 'view', 'edit', 'embed' ),
1272
-					'readonly'    => true,
1273
-				),
1274
-
1275
-				'discount'		  => array(
1276
-					'description' => __( 'The discount applied to the invoice.', 'invoicing' ),
1277
-					'type'        => 'number',
1278
-					'context'     => array( 'view', 'edit', 'embed' ),
1279
-					'readonly'    => true,
1280
-				),
1281
-
1282
-				'discount_code'	  => array(
1283
-					'description' => __( 'The discount code applied to the invoice.', 'invoicing' ),
1284
-					'type'        => 'string',
1285
-					'context'     => array( 'view', 'edit', 'embed' ),
1286
-					'readonly'    => true,
1287
-				),
1288
-
1289
-				'tax'	  		  => array(
1290
-					'description' => __( 'The tax applied to the invoice.', 'invoicing' ),
1291
-					'type'        => 'number',
1292
-					'context'     => array( 'view', 'edit', 'embed' ),
1293
-					'readonly'    => true,
1294
-				),
1295
-
1296
-				'fees_total'	  => array(
1297
-					'description' => __( 'The total fees applied to the invoice.', 'invoicing' ),
1298
-					'type'        => 'number',
1299
-					'context'     => array( 'view', 'edit', 'embed' ),
1300
-					'readonly'    => true,
1301
-				),
1302
-
1303
-				'subtotal'	  	  => array(
1304
-					'description' => __( 'The sub-total for the invoice.', 'invoicing' ),
1305
-					'type'        => 'number',
1306
-					'context'     => array( 'view', 'edit', 'embed' ),
1307
-					'readonly'    => true,
1308
-				),
1309
-
1310
-				'currency'	  	  => array(
1311
-					'description' => __( 'The currency used to process the invoice.', 'invoicing' ),
1312
-					'type'        => 'string',
1313
-					'context'     => array( 'view', 'edit', 'embed' ),
1314
-				),
1315
-
1316
-				'cart_details'	  => array(
1317
-					'description' => __( 'The cart details for invoice.', 'invoicing' ),
1318
-					'type'        => 'array',
1319
-					'context'     => array( 'view', 'edit', 'embed' ),
1320
-					'required'	  => true,
1321
-				),
1322
-
1323
-				'date'         => array(
1324
-					'description' => __( "The date the invoice was published, in the site's timezone.", 'invoicing' ),
1325
-					'type'        => array( 'string', 'null' ),
1326
-					'format'      => 'date-time',
1327
-					'context'     => array( 'view', 'edit', 'embed' ),
1328
-				),
1329
-
1330
-				'due_date'     => array(
1331
-					'description' => __( 'The due date for the invoice.', 'invoicing' ),
1332
-					'type'        => array( 'string', 'null' ),
1333
-					'format'      => 'date-time',
1334
-					'context'     => array( 'view', 'edit', 'embed' ),
1335
-				),
1336
-
1337
-				'completed_date'  => array(
1338
-					'description' => __( 'The completed date for the invoice.', 'invoicing' ),
1339
-					'type'        => array( 'string', 'null' ),
1340
-					'format'      => 'date-time',
1341
-					'context'     => array( 'view', 'edit', 'embed' ),
1342
-					'readonly'    => true,
1343
-				),
950
+        foreach( $invoice_properties as $property ) {
951
+
952
+            if ( rest_is_field_included( $property, $fields ) ) {
953
+                $data[$property] = $invoice->get( $property );
954
+            }
955
+
956
+        }
957
+
958
+        // Valid until
959
+        if ( rest_is_field_included( 'valid_until', $fields ) && $this->post_type === 'wpi_quote' ) {
960
+            $data['valid_until'] = get_post_meta( $invoice->ID, 'wpinv_quote_valid_until', true );
961
+        }
962
+
963
+        // Cart details
964
+        if ( rest_is_field_included( 'cart_details', $fields ) ) {
965
+            $data['cart_details'] = $invoice->get( 'cart_details' );
966
+        }
967
+
968
+        //Dates
969
+        $invoice_properties = array( 'date', 'due_date', 'completed_date' );
970
+
971
+        foreach( $invoice_properties as $property ) {
972
+
973
+            if ( rest_is_field_included( $property, $fields ) ) {
974
+                $data[$property] = $this->prepare_date_response( '0000-00-00 00:00:00', $invoice->get( $property ) );
975
+            }
976
+
977
+        }
978
+
979
+        // User id
980
+        if ( rest_is_field_included( 'user_id', $fields ) ) {
981
+            $data['user_id'] = (int) $invoice->get( 'user_id' );
982
+        }
983
+
984
+        // User info
985
+        $user_info = array( 'first_name', 'last_name', 'company', 'vat_number', 'vat_rate', 'address', 'city', 'country', 'state', 'zip', 'phone' );
986
+
987
+        foreach( $user_info as $property ) {
988
+
989
+            if ( rest_is_field_included( "user_info.$property", $fields ) ) {
990
+                $data['user_info'][$property] = $invoice->get( $property );
991
+            }
992
+
993
+        }
994
+
995
+        // Slug
996
+        if ( rest_is_field_included( 'slug', $fields ) ) {
997
+            $data['slug'] = $invoice->get( 'post_name' );
998
+        }
999
+
1000
+        // View invoice link
1001
+        if ( rest_is_field_included( 'link', $fields ) ) {
1002
+            $data['link'] = esc_url( $invoice->get_view_url() );
1003
+        }
1004
+
1005
+
1006
+        $context = ! empty( $request['context'] ) ? $request['context'] : 'view';
1007
+        $data    = $this->add_additional_fields_to_object( $data, $request );
1008
+        $data    = $this->filter_response_by_context( $data, $context );
1009
+
1010
+        // Wrap the data in a response object.
1011
+        $response = rest_ensure_response( $data );
1012
+
1013
+        $links = $this->prepare_links( $invoice );
1014
+        $response->add_links( $links );
1015
+
1016
+        if ( ! empty( $links['self']['href'] ) ) {
1017
+            $actions = $this->get_available_actions( $invoice, $request );
1018
+
1019
+            $self = $links['self']['href'];
1020
+
1021
+            foreach ( $actions as $rel ) {
1022
+                $response->add_link( $rel, $self );
1023
+            }
1024
+        }
1025
+
1026
+        /**
1027
+         * Filters the invoice data for a response.
1028
+         *
1029
+         * @since 1.0.13
1030
+         *
1031
+         * @param WP_REST_Response $response The response object.
1032
+         * @param WPInv_Invoice    $invoice  The invoice object.
1033
+         * @param WP_REST_Request  $request  Request object.
1034
+         */
1035
+        return apply_filters( "wpinv_rest_prepare_invoice", $response, $invoice, $request );
1036
+    }
1037
+
1038
+    /**
1039
+     * Gets an array of fields to be included on the response.
1040
+     *
1041
+     * Included fields are based on item schema and `_fields=` request argument.
1042
+     *
1043
+     * @since 1.0.13
1044
+     *
1045
+     * @param WP_REST_Request $request Full details about the request.
1046
+     * @return array Fields to be included in the response.
1047
+     */
1048
+    public function get_fields_for_response( $request ) {
1049
+        $schema     = $this->get_item_schema();
1050
+        $properties = isset( $schema['properties'] ) ? $schema['properties'] : array();
1051
+
1052
+        $additional_fields = $this->get_additional_fields();
1053
+        foreach ( $additional_fields as $field_name => $field_options ) {
1054
+            // For back-compat, include any field with an empty schema
1055
+            // because it won't be present in $this->get_item_schema().
1056
+            if ( is_null( $field_options['schema'] ) ) {
1057
+                $properties[ $field_name ] = $field_options;
1058
+            }
1059
+        }
1060
+
1061
+        // Exclude fields that specify a different context than the request context.
1062
+        $context = $request['context'];
1063
+        if ( $context ) {
1064
+            foreach ( $properties as $name => $options ) {
1065
+                if ( ! empty( $options['context'] ) && ! in_array( $context, $options['context'], true ) ) {
1066
+                    unset( $properties[ $name ] );
1067
+                }
1068
+            }
1069
+        }
1070
+
1071
+        $fields = array_keys( $properties );
1072
+
1073
+        if ( ! isset( $request['_fields'] ) ) {
1074
+            return $fields;
1075
+        }
1076
+        $requested_fields = wpinv_parse_list( $request['_fields'] );
1077
+        if ( 0 === count( $requested_fields ) ) {
1078
+            return $fields;
1079
+        }
1080
+        // Trim off outside whitespace from the comma delimited list.
1081
+        $requested_fields = array_map( 'trim', $requested_fields );
1082
+        // Always persist 'id', because it can be needed for add_additional_fields_to_object().
1083
+        if ( in_array( 'id', $fields, true ) ) {
1084
+            $requested_fields[] = 'id';
1085
+        }
1086
+        // Return the list of all requested fields which appear in the schema.
1087
+        return array_reduce(
1088
+            $requested_fields,
1089
+            function( $response_fields, $field ) use ( $fields ) {
1090
+                if ( in_array( $field, $fields, true ) ) {
1091
+                    $response_fields[] = $field;
1092
+                    return $response_fields;
1093
+                }
1094
+                // Check for nested fields if $field is not a direct match.
1095
+                $nested_fields = explode( '.', $field );
1096
+                // A nested field is included so long as its top-level property is
1097
+                // present in the schema.
1098
+                if ( in_array( $nested_fields[0], $fields, true ) ) {
1099
+                    $response_fields[] = $field;
1100
+                }
1101
+                return $response_fields;
1102
+            },
1103
+            array()
1104
+        );
1105
+    }
1106
+
1107
+    /**
1108
+     * Retrieves the invoice's schema, conforming to JSON Schema.
1109
+     *
1110
+     * @since 1.0.13
1111
+     *
1112
+     * @return array Invoice schema data.
1113
+     */
1114
+    public function get_item_schema() {
1115
+
1116
+        // Maybe retrieve the schema from cache.
1117
+        if ( $this->schema ) {
1118
+            return $this->add_additional_fields_schema( $this->schema );
1119
+        }
1120
+
1121
+        $schema = array(
1122
+            '$schema'    => 'http://json-schema.org/draft-04/schema#',
1123
+            'title'      => $this->post_type,
1124
+            'type'       => 'object',
1125
+
1126
+            // Base properties for every Invoice.
1127
+            'properties' 		  => array(
1128
+
1129
+                'title'			  => array(
1130
+                    'description' => __( 'The title for the invoice.', 'invoicing' ),
1131
+                    'type'        => 'string',
1132
+                    'context'     => array( 'view', 'edit', 'embed' ),
1133
+                    'readonly'    => true,
1134
+                ),
1135
+
1136
+                'user_id'		  => array(
1137
+                    'description' => __( 'The ID of the owner of the invoice.', 'invoicing' ),
1138
+                    'type'        => 'integer',
1139
+                    'context'     => array( 'view', 'edit', 'embed' ),
1140
+                ),
1141
+
1142
+                'email'		  	  => array(
1143
+                    'description' => __( 'The email of the owner of the invoice.', 'invoicing' ),
1144
+                    'type'        => 'string',
1145
+                    'context'     => array( 'view', 'edit', 'embed' ),
1146
+                    'readonly'    => true,
1147
+                ),
1148
+
1149
+                'ip'			  => array(
1150
+                    'description' => __( 'The IP of the owner of the invoice.', 'invoicing' ),
1151
+                    'type'        => 'string',
1152
+                    'context'     => array( 'view', 'edit', 'embed' ),
1153
+                ),
1154
+
1155
+                'user_info'       => array(
1156
+                    'description' => __( 'Information about the owner of the invoice.', 'invoicing' ),
1157
+                    'type'        => 'object',
1158
+                    'context'     => array( 'view', 'edit', 'embed' ),
1159
+                    'properties'  => array(
1160
+
1161
+                        'first_name'      => array(
1162
+                            'description' => __( 'The first name of the owner of the invoice.', 'invoicing' ),
1163
+                            'type'        => 'string',
1164
+                            'context'     => array( 'view', 'edit', 'embed' ),
1165
+                        ),
1166
+
1167
+                        'last_name'       => array(
1168
+                            'description' => __( 'The last name of the owner of the invoice.', 'invoicing' ),
1169
+                            'type'        => 'string',
1170
+                            'context'     => array( 'view', 'edit', 'embed' ),
1171
+                        ),
1172
+
1173
+                        'company'         => array(
1174
+                            'description' => __( 'The company of the owner of the invoice.', 'invoicing' ),
1175
+                            'type'        => 'string',
1176
+                            'context'     => array( 'view', 'edit', 'embed' ),
1177
+                        ),
1178
+
1179
+                        'vat_number'      => array(
1180
+                            'description' => __( 'The VAT number of the owner of the invoice.', 'invoicing' ),
1181
+                            'type'        => 'string',
1182
+                            'context'     => array( 'view', 'edit', 'embed' ),
1183
+                        ),
1184
+
1185
+                        'vat_rate'        => array(
1186
+                            'description' => __( 'The VAT rate applied on the invoice.', 'invoicing' ),
1187
+                            'type'        => 'string',
1188
+                            'context'     => array( 'view', 'edit', 'embed' ),
1189
+                        ),
1190
+
1191
+                        'address'        => array(
1192
+                            'description' => __( 'The address of the invoice owner.', 'invoicing' ),
1193
+                            'type'        => 'string',
1194
+                            'context'     => array( 'view', 'edit', 'embed' ),
1195
+                        ),
1196
+
1197
+                        'city'            => array(
1198
+                            'description' => __( 'The city of the invoice owner.', 'invoicing' ),
1199
+                            'type'        => 'string',
1200
+                            'context'     => array( 'view', 'edit', 'embed' ),
1201
+                        ),
1202
+
1203
+                        'country'         => array(
1204
+                            'description' => __( 'The country of the invoice owner.', 'invoicing' ),
1205
+                            'type'        => 'string',
1206
+                            'context'     => array( 'view', 'edit', 'embed' ),
1207
+                        ),
1208
+
1209
+                        'state'           => array(
1210
+                            'description' => __( 'The state of the invoice owner.', 'invoicing' ),
1211
+                            'type'        => 'string',
1212
+                            'context'     => array( 'view', 'edit', 'embed' ),
1213
+                        ),
1214
+
1215
+                        'zip'             => array(
1216
+                            'description' => __( 'The zip code of the invoice owner.', 'invoicing' ),
1217
+                            'type'        => 'string',
1218
+                            'context'     => array( 'view', 'edit', 'embed' ),
1219
+                        ),
1220
+
1221
+                        'phone'             => array(
1222
+                            'description' => __( 'The phone number of the invoice owner.', 'invoicing' ),
1223
+                            'type'        => 'string',
1224
+                            'context'     => array( 'view', 'edit', 'embed' ),
1225
+                        ),
1226
+                    ),
1227
+                ),
1228
+
1229
+                'id'           => array(
1230
+                    'description' => __( 'Unique identifier for the invoice.', 'invoicing' ),
1231
+                    'type'        => 'integer',
1232
+                    'context'     => array( 'view', 'edit', 'embed' ),
1233
+                    'readonly'    => true,
1234
+                ),
1235
+
1236
+                'key'			  => array(
1237
+                    'description' => __( 'A unique key for the invoice.', 'invoicing' ),
1238
+                    'type'        => 'string',
1239
+                    'context'     => array( 'view', 'edit', 'embed' ),
1240
+                    'readonly'    => true,
1241
+                ),
1242
+
1243
+                'number'		  => array(
1244
+                    'description' => __( 'The invoice number.', 'invoicing' ),
1245
+                    'type'        => 'string',
1246
+                    'context'     => array( 'view', 'edit', 'embed' ),
1247
+                    'readonly'    => true,
1248
+                ),
1249
+
1250
+                'transaction_id'  => array(
1251
+                    'description' => __( 'The transaction id of the invoice.', 'invoicing' ),
1252
+                    'type'        => 'string',
1253
+                    'context'     => array( 'view', 'edit', 'embed' ),
1254
+                ),
1255
+
1256
+                'gateway'		  => array(
1257
+                    'description' => __( 'The gateway used to process the invoice.', 'invoicing' ),
1258
+                    'type'        => 'string',
1259
+                    'context'     => array( 'view', 'edit', 'embed' ),
1260
+                ),
1261
+
1262
+                'gateway_title'	  => array(
1263
+                    'description' => __( 'The title of the gateway used to process the invoice.', 'invoicing' ),
1264
+                    'type'        => 'string',
1265
+                    'context'     => array( 'view', 'edit', 'embed' ),
1266
+                ),
1267
+
1268
+                'total'	  		  => array(
1269
+                    'description' => __( 'The total amount of the invoice.', 'invoicing' ),
1270
+                    'type'        => 'number',
1271
+                    'context'     => array( 'view', 'edit', 'embed' ),
1272
+                    'readonly'    => true,
1273
+                ),
1274
+
1275
+                'discount'		  => array(
1276
+                    'description' => __( 'The discount applied to the invoice.', 'invoicing' ),
1277
+                    'type'        => 'number',
1278
+                    'context'     => array( 'view', 'edit', 'embed' ),
1279
+                    'readonly'    => true,
1280
+                ),
1281
+
1282
+                'discount_code'	  => array(
1283
+                    'description' => __( 'The discount code applied to the invoice.', 'invoicing' ),
1284
+                    'type'        => 'string',
1285
+                    'context'     => array( 'view', 'edit', 'embed' ),
1286
+                    'readonly'    => true,
1287
+                ),
1288
+
1289
+                'tax'	  		  => array(
1290
+                    'description' => __( 'The tax applied to the invoice.', 'invoicing' ),
1291
+                    'type'        => 'number',
1292
+                    'context'     => array( 'view', 'edit', 'embed' ),
1293
+                    'readonly'    => true,
1294
+                ),
1295
+
1296
+                'fees_total'	  => array(
1297
+                    'description' => __( 'The total fees applied to the invoice.', 'invoicing' ),
1298
+                    'type'        => 'number',
1299
+                    'context'     => array( 'view', 'edit', 'embed' ),
1300
+                    'readonly'    => true,
1301
+                ),
1302
+
1303
+                'subtotal'	  	  => array(
1304
+                    'description' => __( 'The sub-total for the invoice.', 'invoicing' ),
1305
+                    'type'        => 'number',
1306
+                    'context'     => array( 'view', 'edit', 'embed' ),
1307
+                    'readonly'    => true,
1308
+                ),
1309
+
1310
+                'currency'	  	  => array(
1311
+                    'description' => __( 'The currency used to process the invoice.', 'invoicing' ),
1312
+                    'type'        => 'string',
1313
+                    'context'     => array( 'view', 'edit', 'embed' ),
1314
+                ),
1315
+
1316
+                'cart_details'	  => array(
1317
+                    'description' => __( 'The cart details for invoice.', 'invoicing' ),
1318
+                    'type'        => 'array',
1319
+                    'context'     => array( 'view', 'edit', 'embed' ),
1320
+                    'required'	  => true,
1321
+                ),
1322
+
1323
+                'date'         => array(
1324
+                    'description' => __( "The date the invoice was published, in the site's timezone.", 'invoicing' ),
1325
+                    'type'        => array( 'string', 'null' ),
1326
+                    'format'      => 'date-time',
1327
+                    'context'     => array( 'view', 'edit', 'embed' ),
1328
+                ),
1329
+
1330
+                'due_date'     => array(
1331
+                    'description' => __( 'The due date for the invoice.', 'invoicing' ),
1332
+                    'type'        => array( 'string', 'null' ),
1333
+                    'format'      => 'date-time',
1334
+                    'context'     => array( 'view', 'edit', 'embed' ),
1335
+                ),
1336
+
1337
+                'completed_date'  => array(
1338
+                    'description' => __( 'The completed date for the invoice.', 'invoicing' ),
1339
+                    'type'        => array( 'string', 'null' ),
1340
+                    'format'      => 'date-time',
1341
+                    'context'     => array( 'view', 'edit', 'embed' ),
1342
+                    'readonly'    => true,
1343
+                ),
1344 1344
 				
1345
-				'link'         => array(
1346
-					'description' => __( 'URL to the invoice.', 'invoicing' ),
1347
-					'type'        => 'string',
1348
-					'format'      => 'uri',
1349
-					'context'     => array( 'view', 'edit', 'embed' ),
1350
-					'readonly'    => true,
1351
-				),
1352
-
1353
-				'mode'       	  => array(
1354
-					'description' => __( 'The mode used to process the invoice.', 'invoicing' ),
1355
-					'type'        => 'string',
1356
-					'enum'        => array( 'live', 'test' ),
1357
-					'context'     => array( 'view', 'edit', 'embed' ),
1358
-					'readonly'    => true,
1359
-				),
1360
-
1361
-				'slug'       	  => array(
1362
-					'description' => __( 'An alphanumeric identifier for the invoice.', 'invoicing' ),
1363
-					'type'        => 'string',
1364
-					'context'     => array( 'view', 'edit', 'embed' ),
1365
-					'arg_options' => array(
1366
-						'sanitize_callback' => array( $this, 'sanitize_slug' ),
1367
-					),
1368
-					'readonly'    => true,
1369
-				),
1370
-
1371
-				'status'       	  => array(
1372
-					'description' => __( 'A named status for the invoice.', 'invoicing' ),
1373
-					'type'        => 'string',
1374
-					'enum'        => $this->get_post_statuses(),
1375
-					'context'     => array( 'view', 'edit' ),
1376
-					'default'	  => 'wpi-pending',
1377
-				),
1378
-
1379
-				'status_nicename' => array(
1380
-					'description' => __( 'A human-readable status name for the invoice.', 'invoicing' ),
1381
-					'type'        => 'string',
1382
-					'context'     => array( 'view', 'embed' ),
1383
-					'readonly'    => true,
1384
-				),
1385
-
1386
-				'post_type'       => array(
1387
-					'description' => __( 'The post type for the invoice.', 'invoicing' ),
1388
-					'type'        => 'string',
1389
-					'context'     => array( 'view' ),
1390
-					'readonly'    => true,
1391
-				),
1392
-			),
1393
-		);
1394
-
1395
-		// Add helpful links to the invoice schem.
1396
-		$schema['links'] = $this->get_schema_links();
1397
-
1398
-		/**
1399
-		 * Filters the invoice schema for the REST API.
1400
-		 *
1401
-		 * Enables adding extra properties to invoices.
1402
-		 *
1403
-		 * @since 1.0.13
1404
-		 *
1405
-		 * @param array   $schema    The invoice schema.
1406
-		 */
1345
+                'link'         => array(
1346
+                    'description' => __( 'URL to the invoice.', 'invoicing' ),
1347
+                    'type'        => 'string',
1348
+                    'format'      => 'uri',
1349
+                    'context'     => array( 'view', 'edit', 'embed' ),
1350
+                    'readonly'    => true,
1351
+                ),
1352
+
1353
+                'mode'       	  => array(
1354
+                    'description' => __( 'The mode used to process the invoice.', 'invoicing' ),
1355
+                    'type'        => 'string',
1356
+                    'enum'        => array( 'live', 'test' ),
1357
+                    'context'     => array( 'view', 'edit', 'embed' ),
1358
+                    'readonly'    => true,
1359
+                ),
1360
+
1361
+                'slug'       	  => array(
1362
+                    'description' => __( 'An alphanumeric identifier for the invoice.', 'invoicing' ),
1363
+                    'type'        => 'string',
1364
+                    'context'     => array( 'view', 'edit', 'embed' ),
1365
+                    'arg_options' => array(
1366
+                        'sanitize_callback' => array( $this, 'sanitize_slug' ),
1367
+                    ),
1368
+                    'readonly'    => true,
1369
+                ),
1370
+
1371
+                'status'       	  => array(
1372
+                    'description' => __( 'A named status for the invoice.', 'invoicing' ),
1373
+                    'type'        => 'string',
1374
+                    'enum'        => $this->get_post_statuses(),
1375
+                    'context'     => array( 'view', 'edit' ),
1376
+                    'default'	  => 'wpi-pending',
1377
+                ),
1378
+
1379
+                'status_nicename' => array(
1380
+                    'description' => __( 'A human-readable status name for the invoice.', 'invoicing' ),
1381
+                    'type'        => 'string',
1382
+                    'context'     => array( 'view', 'embed' ),
1383
+                    'readonly'    => true,
1384
+                ),
1385
+
1386
+                'post_type'       => array(
1387
+                    'description' => __( 'The post type for the invoice.', 'invoicing' ),
1388
+                    'type'        => 'string',
1389
+                    'context'     => array( 'view' ),
1390
+                    'readonly'    => true,
1391
+                ),
1392
+            ),
1393
+        );
1394
+
1395
+        // Add helpful links to the invoice schem.
1396
+        $schema['links'] = $this->get_schema_links();
1397
+
1398
+        /**
1399
+         * Filters the invoice schema for the REST API.
1400
+         *
1401
+         * Enables adding extra properties to invoices.
1402
+         *
1403
+         * @since 1.0.13
1404
+         *
1405
+         * @param array   $schema    The invoice schema.
1406
+         */
1407 1407
         $schema = apply_filters( "wpinv_rest_invoice_schema", $schema );
1408 1408
 
1409
-		// Cache the invoice schema.
1410
-		$this->schema = $schema;
1409
+        // Cache the invoice schema.
1410
+        $this->schema = $schema;
1411 1411
 		
1412
-		return $this->add_additional_fields_schema( $this->schema );
1413
-	}
1414
-
1415
-	/**
1416
-	 * Retrieve Link Description Objects that should be added to the Schema for the invoices collection.
1417
-	 *
1418
-	 * @since 1.0.13
1419
-	 *
1420
-	 * @return array
1421
-	 */
1422
-	protected function get_schema_links() {
1423
-
1424
-		$href = rest_url( "{$this->namespace}/{$this->rest_base}/{id}" );
1425
-
1426
-		$links = array();
1427
-
1428
-		$links[] = array(
1429
-			'rel'          => 'https://api.w.org/action-publish',
1430
-			'title'        => __( 'The current user can mark this invoice as completed.', 'invoicing' ),
1431
-			'href'         => $href,
1432
-			'targetSchema' => array(
1433
-				'type'       => 'object',
1434
-				'properties' => array(
1435
-					'status' => array(
1436
-						'type' => 'string',
1437
-						'enum' => array( 'publish', 'wpi-renewal' ),
1438
-					),
1439
-				),
1440
-			),
1441
-		);
1442
-
1443
-		$links[] = array(
1444
-			'rel'          => 'https://api.w.org/action-assign-author',
1445
-			'title'        => __( 'The current user can change the owner of this invoice.', 'invoicing' ),
1446
-			'href'         => $href,
1447
-			'targetSchema' => array(
1448
-				'type'       => 'object',
1449
-				'properties'   => array(
1450
-					'user_id'  => array(
1451
-						'type' => 'integer',
1452
-					),
1453
-				),
1454
-			),
1455
-		);
1456
-
1457
-		return $links;
1458
-	}
1459
-
1460
-	/**
1461
-	 * Prepares links for the request.
1462
-	 *
1463
-	 * @since 1.0.13
1464
-	 *
1465
-	 * @param WPInv_Invoice $invoice Invoice Object.
1466
-	 * @return array Links for the given invoice.
1467
-	 */
1468
-	protected function prepare_links( $invoice ) {
1469
-
1470
-		// Prepare the base REST API endpoint for invoices.
1471
-		$base = sprintf( '%s/%s', $this->namespace, $this->rest_base );
1472
-
1473
-		// Entity meta.
1474
-		$links = array(
1475
-			'self'       => array(
1476
-				'href' => rest_url( trailingslashit( $base ) . $invoice->ID ),
1477
-			),
1478
-			'collection' => array(
1479
-				'href' => rest_url( $base ),
1480
-			),
1481
-		);
1482
-
1483
-		if ( ! empty( $invoice->user_id ) ) {
1484
-			$links['user'] = array(
1485
-				'href'       => rest_url( 'wp/v2/users/' . $invoice->user_id ),
1486
-				'embeddable' => true,
1487
-			);
1488
-		}
1489
-
1490
-		/**
1491
-		 * Filters the returned invoice links for the REST API.
1492
-		 *
1493
-		 * Enables adding extra links to invoice API responses.
1494
-		 *
1495
-		 * @since 1.0.13
1496
-		 *
1497
-		 * @param array   $links    Rest links.
1498
-		 */
1499
-		return apply_filters( "wpinv_rest_invoice_links", $links );
1500
-
1501
-	}
1502
-
1503
-	/**
1504
-	 * Get the link relations available for the post and current user.
1505
-	 *
1506
-	 * @since 1.0.13
1507
-	 *
1508
-	 * @param WPInv_Invoice   $invoice    Invoice object.
1509
-	 * @param WP_REST_Request $request Request object.
1510
-	 * @return array List of link relations.
1511
-	 */
1512
-	protected function get_available_actions( $invoice, $request ) {
1513
-
1514
-		if ( 'edit' !== $request['context'] ) {
1515
-			return array();
1516
-		}
1517
-
1518
-		$rels = array();
1519
-
1520
-		// Retrieve the post type object.
1521
-		$post_type = get_post_type_object( $invoice->post_type );
1522
-
1523
-		// Mark invoice as completed.
1524
-		if ( current_user_can( $post_type->cap->publish_posts ) ) {
1525
-			$rels[] = 'https://api.w.org/action-publish';
1526
-		}
1527
-
1528
-		// Change the owner of the invoice.
1529
-		if ( current_user_can( $post_type->cap->edit_others_posts ) ) {
1530
-			$rels[] = 'https://api.w.org/action-assign-author';
1531
-		}
1532
-
1533
-		/**
1534
-		 * Filters the available invoice link relations for the REST API.
1535
-		 *
1536
-		 * Enables adding extra link relation for the current user and request to invoice responses.
1537
-		 *
1538
-		 * @since 1.0.13
1539
-		 *
1540
-		 * @param array   $rels    Available link relations.
1541
-		 */
1542
-		return apply_filters( "wpinv_rest_invoice_link_relations", $rels );
1543
-	}
1544
-
1545
-	/**
1546
-	 * Sanitizes and validates the list of post statuses.
1547
-	 *
1548
-	 * @since 1.0.13
1549
-	 *
1550
-	 * @param string|array    $statuses  One or more post statuses.
1551
-	 * @param WP_REST_Request $request   Full details about the request.
1552
-	 * @param string          $parameter Additional parameter to pass to validation.
1553
-	 * @return array|WP_Error A list of valid statuses, otherwise WP_Error object.
1554
-	 */
1555
-	public function sanitize_post_statuses( $statuses, $request, $parameter ) {
1556
-		return array_intersect( wp_parse_slug_list( $statuses ), $this->get_post_statuses() );
1557
-	}
1558
-
1559
-	/**
1560
-	 * Retrieves a valid list of post statuses.
1561
-	 *
1562
-	 * @since 1.0.15
1563
-	 *
1564
-	 * @return array A list of registered item statuses.
1565
-	 */
1566
-	public function get_post_statuses() {
1567
-		return array_keys( wpinv_get_invoice_statuses( true, true ) );
1568
-	}
1412
+        return $this->add_additional_fields_schema( $this->schema );
1413
+    }
1414
+
1415
+    /**
1416
+     * Retrieve Link Description Objects that should be added to the Schema for the invoices collection.
1417
+     *
1418
+     * @since 1.0.13
1419
+     *
1420
+     * @return array
1421
+     */
1422
+    protected function get_schema_links() {
1423
+
1424
+        $href = rest_url( "{$this->namespace}/{$this->rest_base}/{id}" );
1425
+
1426
+        $links = array();
1427
+
1428
+        $links[] = array(
1429
+            'rel'          => 'https://api.w.org/action-publish',
1430
+            'title'        => __( 'The current user can mark this invoice as completed.', 'invoicing' ),
1431
+            'href'         => $href,
1432
+            'targetSchema' => array(
1433
+                'type'       => 'object',
1434
+                'properties' => array(
1435
+                    'status' => array(
1436
+                        'type' => 'string',
1437
+                        'enum' => array( 'publish', 'wpi-renewal' ),
1438
+                    ),
1439
+                ),
1440
+            ),
1441
+        );
1442
+
1443
+        $links[] = array(
1444
+            'rel'          => 'https://api.w.org/action-assign-author',
1445
+            'title'        => __( 'The current user can change the owner of this invoice.', 'invoicing' ),
1446
+            'href'         => $href,
1447
+            'targetSchema' => array(
1448
+                'type'       => 'object',
1449
+                'properties'   => array(
1450
+                    'user_id'  => array(
1451
+                        'type' => 'integer',
1452
+                    ),
1453
+                ),
1454
+            ),
1455
+        );
1456
+
1457
+        return $links;
1458
+    }
1459
+
1460
+    /**
1461
+     * Prepares links for the request.
1462
+     *
1463
+     * @since 1.0.13
1464
+     *
1465
+     * @param WPInv_Invoice $invoice Invoice Object.
1466
+     * @return array Links for the given invoice.
1467
+     */
1468
+    protected function prepare_links( $invoice ) {
1469
+
1470
+        // Prepare the base REST API endpoint for invoices.
1471
+        $base = sprintf( '%s/%s', $this->namespace, $this->rest_base );
1472
+
1473
+        // Entity meta.
1474
+        $links = array(
1475
+            'self'       => array(
1476
+                'href' => rest_url( trailingslashit( $base ) . $invoice->ID ),
1477
+            ),
1478
+            'collection' => array(
1479
+                'href' => rest_url( $base ),
1480
+            ),
1481
+        );
1482
+
1483
+        if ( ! empty( $invoice->user_id ) ) {
1484
+            $links['user'] = array(
1485
+                'href'       => rest_url( 'wp/v2/users/' . $invoice->user_id ),
1486
+                'embeddable' => true,
1487
+            );
1488
+        }
1489
+
1490
+        /**
1491
+         * Filters the returned invoice links for the REST API.
1492
+         *
1493
+         * Enables adding extra links to invoice API responses.
1494
+         *
1495
+         * @since 1.0.13
1496
+         *
1497
+         * @param array   $links    Rest links.
1498
+         */
1499
+        return apply_filters( "wpinv_rest_invoice_links", $links );
1500
+
1501
+    }
1502
+
1503
+    /**
1504
+     * Get the link relations available for the post and current user.
1505
+     *
1506
+     * @since 1.0.13
1507
+     *
1508
+     * @param WPInv_Invoice   $invoice    Invoice object.
1509
+     * @param WP_REST_Request $request Request object.
1510
+     * @return array List of link relations.
1511
+     */
1512
+    protected function get_available_actions( $invoice, $request ) {
1513
+
1514
+        if ( 'edit' !== $request['context'] ) {
1515
+            return array();
1516
+        }
1517
+
1518
+        $rels = array();
1519
+
1520
+        // Retrieve the post type object.
1521
+        $post_type = get_post_type_object( $invoice->post_type );
1522
+
1523
+        // Mark invoice as completed.
1524
+        if ( current_user_can( $post_type->cap->publish_posts ) ) {
1525
+            $rels[] = 'https://api.w.org/action-publish';
1526
+        }
1527
+
1528
+        // Change the owner of the invoice.
1529
+        if ( current_user_can( $post_type->cap->edit_others_posts ) ) {
1530
+            $rels[] = 'https://api.w.org/action-assign-author';
1531
+        }
1532
+
1533
+        /**
1534
+         * Filters the available invoice link relations for the REST API.
1535
+         *
1536
+         * Enables adding extra link relation for the current user and request to invoice responses.
1537
+         *
1538
+         * @since 1.0.13
1539
+         *
1540
+         * @param array   $rels    Available link relations.
1541
+         */
1542
+        return apply_filters( "wpinv_rest_invoice_link_relations", $rels );
1543
+    }
1544
+
1545
+    /**
1546
+     * Sanitizes and validates the list of post statuses.
1547
+     *
1548
+     * @since 1.0.13
1549
+     *
1550
+     * @param string|array    $statuses  One or more post statuses.
1551
+     * @param WP_REST_Request $request   Full details about the request.
1552
+     * @param string          $parameter Additional parameter to pass to validation.
1553
+     * @return array|WP_Error A list of valid statuses, otherwise WP_Error object.
1554
+     */
1555
+    public function sanitize_post_statuses( $statuses, $request, $parameter ) {
1556
+        return array_intersect( wp_parse_slug_list( $statuses ), $this->get_post_statuses() );
1557
+    }
1558
+
1559
+    /**
1560
+     * Retrieves a valid list of post statuses.
1561
+     *
1562
+     * @since 1.0.15
1563
+     *
1564
+     * @return array A list of registered item statuses.
1565
+     */
1566
+    public function get_post_statuses() {
1567
+        return array_keys( wpinv_get_invoice_statuses( true, true ) );
1568
+    }
1569 1569
     
1570 1570
 }
1571 1571
\ No newline at end of file
Please login to merge, or discard this patch.
includes/class-wpinv-api.php 1 patch
Indentation   +15 added lines, -15 removed lines patch added patch discarded remove patch
@@ -58,14 +58,14 @@  discard block
 block discarded – undo
58 58
     }
59 59
 
60 60
 
61
-	/**
62
-	 * Registers routes
63
-	 *
61
+    /**
62
+     * Registers routes
63
+     *
64 64
      * @since 1.0.13
65
-	 */
66
-	public function register_rest_routes() {
65
+     */
66
+    public function register_rest_routes() {
67 67
 
68
-		// Invoices.
68
+        // Invoices.
69 69
         $this->invoices_controller->register_routes();
70 70
         
71 71
         // Items.
@@ -75,15 +75,15 @@  discard block
 block discarded – undo
75 75
         $this->discounts_controller->register_routes();
76 76
 
77 77
         /**
78
-		 * Fires when registering Invoicing REST routes.
79
-		 *
80
-		 *
81
-		 * @since 1.0.15
82
-		 *
83
-		 *
84
-		 * @param array           $invoice_data Invoice properties.
85
-		 * @param WP_REST_Request $request The request used.
86
-		 */
78
+         * Fires when registering Invoicing REST routes.
79
+         *
80
+         *
81
+         * @since 1.0.15
82
+         *
83
+         *
84
+         * @param array           $invoice_data Invoice properties.
85
+         * @param WP_REST_Request $request The request used.
86
+         */
87 87
         do_action( "wpinv_register_rest_routes", $this );
88 88
         
89 89
     }
Please login to merge, or discard this patch.
includes/wpinv-subscription.php 1 patch
Indentation   +456 added lines, -456 removed lines patch added patch discarded remove patch
@@ -2,7 +2,7 @@  discard block
 block discarded – undo
2 2
 
3 3
 // Exit if accessed directly
4 4
 if ( ! defined( 'ABSPATH' ) ) {
5
-	exit;
5
+    exit;
6 6
 }
7 7
 
8 8
 
@@ -13,183 +13,183 @@  discard block
 block discarded – undo
13 13
  */
14 14
 class WPInv_Subscription {
15 15
 
16
-	private $subs_db;
16
+    private $subs_db;
17
+
18
+    public $id                = 0;
19
+    public $customer_id       = 0;
20
+    public $period            = '';
21
+    public $initial_amount    = '';
22
+    public $recurring_amount  = '';
23
+    public $bill_times        = 0;
24
+    public $transaction_id    = '';
25
+    public $parent_payment_id = 0;
26
+    public $product_id        = 0;
27
+    public $created           = '0000-00-00 00:00:00';
28
+    public $expiration        = '0000-00-00 00:00:00';
29
+    public $trial_period      = '';
30
+    public $status            = 'pending';
31
+    public $profile_id        = '';
32
+    public $gateway           = '';
33
+    public $customer;
17 34
 
18
-	public $id                = 0;
19
-	public $customer_id       = 0;
20
-	public $period            = '';
21
-	public $initial_amount    = '';
22
-	public $recurring_amount  = '';
23
-	public $bill_times        = 0;
24
-	public $transaction_id    = '';
25
-	public $parent_payment_id = 0;
26
-	public $product_id        = 0;
27
-	public $created           = '0000-00-00 00:00:00';
28
-	public $expiration        = '0000-00-00 00:00:00';
29
-	public $trial_period      = '';
30
-	public $status            = 'pending';
31
-	public $profile_id        = '';
32
-	public $gateway           = '';
33
-	public $customer;
34
-
35
-	/**
36
-	 * Get us started
37
-	 *
38
-	 * @since  1.0.0
39
-	 * @return void
40
-	 */
41
-	function __construct( $_id_or_object = 0, $_by_profile_id = false ) {
35
+    /**
36
+     * Get us started
37
+     *
38
+     * @since  1.0.0
39
+     * @return void
40
+     */
41
+    function __construct( $_id_or_object = 0, $_by_profile_id = false ) {
42 42
 
43
-		$this->subs_db = new WPInv_Subscriptions_DB;
43
+        $this->subs_db = new WPInv_Subscriptions_DB;
44 44
 
45
-		if( $_by_profile_id ) {
45
+        if( $_by_profile_id ) {
46 46
 
47
-			$_sub = $this->subs_db->get_by( 'profile_id', $_id_or_object );
47
+            $_sub = $this->subs_db->get_by( 'profile_id', $_id_or_object );
48 48
 
49
-			if( empty( $_sub ) ) {
50
-				return false;
51
-			}
49
+            if( empty( $_sub ) ) {
50
+                return false;
51
+            }
52 52
 
53
-			$_id_or_object = $_sub;
53
+            $_id_or_object = $_sub;
54 54
 
55
-		}
55
+        }
56 56
 
57
-		return $this->setup_subscription( $_id_or_object );
58
-	}
57
+        return $this->setup_subscription( $_id_or_object );
58
+    }
59 59
 
60
-	/**
61
-	 * Setup the subscription object
62
-	 *
63
-	 * @since  1.0.0
64
-	 * @return void
65
-	 */
66
-	private function setup_subscription( $id_or_object = 0 ) {
60
+    /**
61
+     * Setup the subscription object
62
+     *
63
+     * @since  1.0.0
64
+     * @return void
65
+     */
66
+    private function setup_subscription( $id_or_object = 0 ) {
67 67
 
68
-		if( empty( $id_or_object ) ) {
69
-			return false;
70
-		}
68
+        if( empty( $id_or_object ) ) {
69
+            return false;
70
+        }
71 71
 
72
-		if( is_numeric( $id_or_object ) ) {
72
+        if( is_numeric( $id_or_object ) ) {
73 73
 
74
-			$sub = $this->subs_db->get( $id_or_object );
74
+            $sub = $this->subs_db->get( $id_or_object );
75 75
 
76
-		} elseif( is_object( $id_or_object ) ) {
76
+        } elseif( is_object( $id_or_object ) ) {
77 77
 
78
-			$sub = $id_or_object;
78
+            $sub = $id_or_object;
79 79
 
80
-		}
80
+        }
81 81
 
82
-		if( empty( $sub ) ) {
83
-			return false;
84
-		}
82
+        if( empty( $sub ) ) {
83
+            return false;
84
+        }
85 85
 
86
-		foreach( $sub as $key => $value ) {
87
-			$this->$key = $value;
88
-		}
86
+        foreach( $sub as $key => $value ) {
87
+            $this->$key = $value;
88
+        }
89 89
 
90
-		$this->customer = get_userdata( $this->customer_id );
91
-		$this->gateway  = wpinv_get_payment_gateway( $this->parent_payment_id );
90
+        $this->customer = get_userdata( $this->customer_id );
91
+        $this->gateway  = wpinv_get_payment_gateway( $this->parent_payment_id );
92 92
 
93
-		do_action( 'wpinv_recurring_setup_subscription', $this );
93
+        do_action( 'wpinv_recurring_setup_subscription', $this );
94 94
 
95
-		return $this;
96
-	}
95
+        return $this;
96
+    }
97 97
 
98
-	/**
99
-	 * Magic __get function to dispatch a call to retrieve a private property
100
-	 *
101
-	 * @since 1.0.0
102
-	 */
103
-	public function __get( $key ) {
98
+    /**
99
+     * Magic __get function to dispatch a call to retrieve a private property
100
+     *
101
+     * @since 1.0.0
102
+     */
103
+    public function __get( $key ) {
104 104
 
105
-		if( method_exists( $this, 'get_' . $key ) ) {
105
+        if( method_exists( $this, 'get_' . $key ) ) {
106 106
 
107
-			return call_user_func( array( $this, 'get_' . $key ) );
107
+            return call_user_func( array( $this, 'get_' . $key ) );
108 108
 
109
-		} else {
109
+        } else {
110 110
 
111
-			return new WP_Error( 'wpinv-subscription-invalid-property', sprintf( __( 'Can\'t get property %s', 'invoicing' ), $key ) );
111
+            return new WP_Error( 'wpinv-subscription-invalid-property', sprintf( __( 'Can\'t get property %s', 'invoicing' ), $key ) );
112 112
 
113
-		}
113
+        }
114 114
 
115
-	}
115
+    }
116 116
 
117
-	/**
118
-	 * Creates a subscription
119
-	 *
120
-	 * @since  1.0.0
121
-	 * @param  array  $data Array of attributes for a subscription
122
-	 * @return mixed  false if data isn't passed and class not instantiated for creation
123
-	 */
124
-	public function create( $data = array() ) {
117
+    /**
118
+     * Creates a subscription
119
+     *
120
+     * @since  1.0.0
121
+     * @param  array  $data Array of attributes for a subscription
122
+     * @return mixed  false if data isn't passed and class not instantiated for creation
123
+     */
124
+    public function create( $data = array() ) {
125 125
 
126
-		if ( $this->id != 0 ) {
127
-			return false;
128
-		}
126
+        if ( $this->id != 0 ) {
127
+            return false;
128
+        }
129 129
 
130
-		$defaults = array(
131
-			'customer_id'       => 0,
132
-			'frequency'         => '',
133
-			'period'            => '',
134
-			'initial_amount'    => '',
135
-			'recurring_amount'  => '',
136
-			'bill_times'        => 0,
137
-			'parent_payment_id' => 0,
138
-			'product_id'        => 0,
139
-			'created'           => '',
140
-			'expiration'        => '',
141
-			'status'            => '',
142
-			'profile_id'        => '',
143
-		);
130
+        $defaults = array(
131
+            'customer_id'       => 0,
132
+            'frequency'         => '',
133
+            'period'            => '',
134
+            'initial_amount'    => '',
135
+            'recurring_amount'  => '',
136
+            'bill_times'        => 0,
137
+            'parent_payment_id' => 0,
138
+            'product_id'        => 0,
139
+            'created'           => '',
140
+            'expiration'        => '',
141
+            'status'            => '',
142
+            'profile_id'        => '',
143
+        );
144 144
 
145
-		$args = wp_parse_args( $data, $defaults );
145
+        $args = wp_parse_args( $data, $defaults );
146 146
 
147
-		if( $args['expiration'] && strtotime( 'NOW', current_time( 'timestamp' ) ) > strtotime( $args['expiration'], current_time( 'timestamp' ) ) ) {
147
+        if( $args['expiration'] && strtotime( 'NOW', current_time( 'timestamp' ) ) > strtotime( $args['expiration'], current_time( 'timestamp' ) ) ) {
148 148
 
149
-			if( 'active' == $args['status'] || 'trialling' == $args['status'] ) {
149
+            if( 'active' == $args['status'] || 'trialling' == $args['status'] ) {
150 150
 
151
-				// Force an active subscription to expired if expiration date is in the past
152
-				$args['status'] = 'expired';
151
+                // Force an active subscription to expired if expiration date is in the past
152
+                $args['status'] = 'expired';
153 153
 
154
-			}
155
-		}
154
+            }
155
+        }
156 156
 
157
-		do_action( 'wpinv_subscription_pre_create', $args );
157
+        do_action( 'wpinv_subscription_pre_create', $args );
158 158
 
159
-		$id = $this->subs_db->insert( $args, 'subscription' );
159
+        $id = $this->subs_db->insert( $args, 'subscription' );
160 160
 
161
-		do_action( 'wpinv_subscription_post_create', $id, $args );
161
+        do_action( 'wpinv_subscription_post_create', $id, $args );
162 162
 
163
-		return $this->setup_subscription( $id );
163
+        return $this->setup_subscription( $id );
164 164
 
165
-	}
165
+    }
166 166
 
167
-	/**
168
-	 * Updates a subscription
169
-	 *
170
-	 * @since  1.0.0
171
-	 * @param  array $args Array of fields to update
172
-	 * @return bool
173
-	 */
174
-	public function update( $args = array() ) {
167
+    /**
168
+     * Updates a subscription
169
+     *
170
+     * @since  1.0.0
171
+     * @param  array $args Array of fields to update
172
+     * @return bool
173
+     */
174
+    public function update( $args = array() ) {
175 175
 
176
-		$ret = $this->subs_db->update( $this->id, $args );
176
+        $ret = $this->subs_db->update( $this->id, $args );
177 177
 
178
-		do_action( 'wpinv_recurring_update_subscription', $this->id, $args, $this );
178
+        do_action( 'wpinv_recurring_update_subscription', $this->id, $args, $this );
179 179
 
180
-		return $ret;
180
+        return $ret;
181 181
 
182
-	}
182
+    }
183 183
 
184
-	/**
185
-	 * Delete the subscription
186
-	 *
187
-	 * @since  1.0.0
188
-	 * @return bool
189
-	 */
190
-	public function delete() {
191
-		return $this->subs_db->delete( $this->id );
192
-	}
184
+    /**
185
+     * Delete the subscription
186
+     *
187
+     * @since  1.0.0
188
+     * @return bool
189
+     */
190
+    public function delete() {
191
+        return $this->subs_db->delete( $this->id );
192
+    }
193 193
 
194 194
     /**
195 195
      * Retrieves the parent payment ID
@@ -357,8 +357,8 @@  discard block
 block discarded – undo
357 357
             
358 358
             $invoice = wpinv_get_invoice( $invoice->ID );
359 359
 
360
-			// Send email notifications.
361
-			wpinv_completed_invoice_notification( $invoice->ID );
360
+            // Send email notifications.
361
+            wpinv_completed_invoice_notification( $invoice->ID );
362 362
 
363 363
             do_action( 'wpinv_recurring_add_subscription_payment', $invoice, $this );
364 364
             do_action( 'wpinv_recurring_record_payment', $invoice->ID, $this->parent_payment_id, $args['amount'], $args['transaction_id'] );
@@ -369,185 +369,185 @@  discard block
 block discarded – undo
369 369
         return false;
370 370
     }
371 371
 
372
-	/**
373
-	 * Retrieves the transaction ID from the subscription
374
-	 *
375
-	 * @since  1.0.0
376
-	 * @return bool
377
-	 */
378
-	public function get_transaction_id() {
372
+    /**
373
+     * Retrieves the transaction ID from the subscription
374
+     *
375
+     * @since  1.0.0
376
+     * @return bool
377
+     */
378
+    public function get_transaction_id() {
379 379
 
380
-		if( empty( $this->transaction_id ) ) {
380
+        if( empty( $this->transaction_id ) ) {
381 381
 
382
-			$txn_id = wpinv_get_payment_transaction_id( $this->parent_payment_id );
382
+            $txn_id = wpinv_get_payment_transaction_id( $this->parent_payment_id );
383 383
 
384
-			if( ! empty( $txn_id ) && (int) $this->parent_payment_id !== (int) $txn_id ) {
385
-				$this->set_transaction_id( $txn_id );
386
-			}
384
+            if( ! empty( $txn_id ) && (int) $this->parent_payment_id !== (int) $txn_id ) {
385
+                $this->set_transaction_id( $txn_id );
386
+            }
387 387
 
388
-		}
388
+        }
389 389
 
390
-		return $this->transaction_id;
390
+        return $this->transaction_id;
391 391
 
392
-	}
392
+    }
393 393
 
394
-	/**
395
-	 * Stores the transaction ID for the subscription purchase
396
-	 *
397
-	 * @since  1.0.0.4
398
-	 * @return bool
399
-	 */
400
-	public function set_transaction_id( $txn_id = '' ) {
401
-		$this->update( array( 'transaction_id' => $txn_id ) );
402
-		$this->transaction_id = $txn_id;
403
-	}
394
+    /**
395
+     * Stores the transaction ID for the subscription purchase
396
+     *
397
+     * @since  1.0.0.4
398
+     * @return bool
399
+     */
400
+    public function set_transaction_id( $txn_id = '' ) {
401
+        $this->update( array( 'transaction_id' => $txn_id ) );
402
+        $this->transaction_id = $txn_id;
403
+    }
404 404
 
405
-	/**
406
-	 * Renews a subscription
407
-	 *
408
-	 * @since  1.0.0
409
-	 * @return bool
410
-	 */
411
-	public function renew() {
405
+    /**
406
+     * Renews a subscription
407
+     *
408
+     * @since  1.0.0
409
+     * @return bool
410
+     */
411
+    public function renew() {
412 412
 
413
-		$expires = $this->get_expiration_time();
413
+        $expires = $this->get_expiration_time();
414 414
 
415 415
 
416
-		// Determine what date to use as the start for the new expiration calculation
417
-		if( $expires > current_time( 'timestamp' ) && $this->is_active() ) {
416
+        // Determine what date to use as the start for the new expiration calculation
417
+        if( $expires > current_time( 'timestamp' ) && $this->is_active() ) {
418 418
 
419
-			$base_date  = $expires;
419
+            $base_date  = $expires;
420 420
 
421
-		} else {
421
+        } else {
422 422
 
423
-			$base_date  = current_time( 'timestamp' );
423
+            $base_date  = current_time( 'timestamp' );
424 424
 
425
-		}
425
+        }
426 426
 
427
-		$last_day = wpinv_cal_days_in_month( CAL_GREGORIAN, date( 'n', $base_date ), date( 'Y', $base_date ) );
427
+        $last_day = wpinv_cal_days_in_month( CAL_GREGORIAN, date( 'n', $base_date ), date( 'Y', $base_date ) );
428 428
 
429 429
 
430
-		$frequency = isset($this->frequency) ? $this->frequency : 1;
431
-		$expiration = date( 'Y-m-d H:i:s', strtotime( '+' . $frequency . ' ' . $this->period  . ' 23:59:59', $base_date ) );
430
+        $frequency = isset($this->frequency) ? $this->frequency : 1;
431
+        $expiration = date( 'Y-m-d H:i:s', strtotime( '+' . $frequency . ' ' . $this->period  . ' 23:59:59', $base_date ) );
432 432
 
433
-		if( date( 'j', $base_date ) == $last_day && 'day' != $this->period ) {
434
-			$expiration = date( 'Y-m-d H:i:s', strtotime( $expiration . ' +2 days' ) );
435
-		}
433
+        if( date( 'j', $base_date ) == $last_day && 'day' != $this->period ) {
434
+            $expiration = date( 'Y-m-d H:i:s', strtotime( $expiration . ' +2 days' ) );
435
+        }
436 436
 
437
-		$expiration  = apply_filters( 'wpinv_subscription_renewal_expiration', $expiration, $this->id, $this );
437
+        $expiration  = apply_filters( 'wpinv_subscription_renewal_expiration', $expiration, $this->id, $this );
438 438
 
439
-		do_action( 'wpinv_subscription_pre_renew', $this->id, $expiration, $this );
439
+        do_action( 'wpinv_subscription_pre_renew', $this->id, $expiration, $this );
440 440
 
441
-		$this->status = 'active';
442
-		$times_billed = $this->get_times_billed();
441
+        $this->status = 'active';
442
+        $times_billed = $this->get_times_billed();
443 443
 
444
-		// Complete subscription if applicable
445
-		if ( $this->bill_times > 0 && $times_billed >= $this->bill_times ) {
446
-			$this->complete();
447
-			$this->status = 'completed';
448
-		}
444
+        // Complete subscription if applicable
445
+        if ( $this->bill_times > 0 && $times_billed >= $this->bill_times ) {
446
+            $this->complete();
447
+            $this->status = 'completed';
448
+        }
449 449
 
450
-		$args = array(
451
-			'expiration' => $expiration,
452
-			'status'     => $this->status,
453
-		);
450
+        $args = array(
451
+            'expiration' => $expiration,
452
+            'status'     => $this->status,
453
+        );
454 454
 
455 455
         $this->subs_db->update( $this->id, $args );
456 456
 
457
-		do_action( 'wpinv_subscription_post_renew', $this->id, $expiration, $this );
458
-		do_action( 'wpinv_recurring_set_subscription_status', $this->id, $this->status, $this );
457
+        do_action( 'wpinv_subscription_post_renew', $this->id, $expiration, $this );
458
+        do_action( 'wpinv_recurring_set_subscription_status', $this->id, $this->status, $this );
459 459
 
460
-	}
460
+    }
461 461
 
462
-	/**
463
-	 * Marks a subscription as completed
464
-	 *
465
-	 * Subscription is completed when the number of payments matches the billing_times field
466
-	 *
467
-	 * @since  1.0.0
468
-	 * @return void
469
-	 */
470
-	public function complete() {
462
+    /**
463
+     * Marks a subscription as completed
464
+     *
465
+     * Subscription is completed when the number of payments matches the billing_times field
466
+     *
467
+     * @since  1.0.0
468
+     * @return void
469
+     */
470
+    public function complete() {
471 471
 
472
-		// Only mark a subscription as complete if it's not already cancelled.
473
-		if ( 'cancelled' === $this->status ) {
474
-			return;
475
-		}
472
+        // Only mark a subscription as complete if it's not already cancelled.
473
+        if ( 'cancelled' === $this->status ) {
474
+            return;
475
+        }
476 476
 
477
-		$args = array(
478
-			'status' => 'completed'
479
-		);
477
+        $args = array(
478
+            'status' => 'completed'
479
+        );
480 480
 
481
-		if( $this->subs_db->update( $this->id, $args ) ) {
481
+        if( $this->subs_db->update( $this->id, $args ) ) {
482 482
 
483
-			$this->status = 'completed';
483
+            $this->status = 'completed';
484 484
 
485
-			do_action( 'wpinv_subscription_completed', $this->id, $this );
485
+            do_action( 'wpinv_subscription_completed', $this->id, $this );
486 486
 
487
-		}
487
+        }
488 488
 
489
-	}
489
+    }
490 490
 
491
-	/**
492
-	 * Marks a subscription as expired
493
-	 *
494
-	 * Subscription is completed when the billing times is reached
495
-	 *
496
-	 * @since  1.0.0
497
-	 * @param  $check_expiration bool True if expiration date should be checked with merchant processor before expiring
498
-	 * @return void
499
-	 */
500
-	public function expire( $check_expiration = false ) {
491
+    /**
492
+     * Marks a subscription as expired
493
+     *
494
+     * Subscription is completed when the billing times is reached
495
+     *
496
+     * @since  1.0.0
497
+     * @param  $check_expiration bool True if expiration date should be checked with merchant processor before expiring
498
+     * @return void
499
+     */
500
+    public function expire( $check_expiration = false ) {
501 501
 
502
-		$expiration = $this->expiration;
502
+        $expiration = $this->expiration;
503 503
 
504
-		if( $check_expiration ) {
504
+        if( $check_expiration ) {
505 505
 
506
-			// check_expiration() updates $this->expiration so compare to $expiration above
506
+            // check_expiration() updates $this->expiration so compare to $expiration above
507 507
 
508
-			if( $expiration < $this->get_expiration() && current_time( 'timestamp' ) < $this->get_expiration_time() ) {
508
+            if( $expiration < $this->get_expiration() && current_time( 'timestamp' ) < $this->get_expiration_time() ) {
509 509
 
510
-				return false; // Do not mark as expired since real expiration date is in the future
511
-			}
510
+                return false; // Do not mark as expired since real expiration date is in the future
511
+            }
512 512
 
513
-		}
513
+        }
514 514
 
515
-		$args = array(
516
-			'status' => 'expired'
517
-		);
515
+        $args = array(
516
+            'status' => 'expired'
517
+        );
518 518
 
519
-		if( $this->subs_db->update( $this->id, $args ) ) {
519
+        if( $this->subs_db->update( $this->id, $args ) ) {
520 520
 
521
-			$this->status = 'expired';
521
+            $this->status = 'expired';
522 522
 
523
-			do_action( 'wpinv_subscription_expired', $this->id, $this );
523
+            do_action( 'wpinv_subscription_expired', $this->id, $this );
524 524
 
525
-		}
525
+        }
526 526
 
527
-	}
527
+    }
528 528
 
529
-	/**
530
-	 * Marks a subscription as failing
531
-	 *
532
-	 * @since  2.4.2
533
-	 * @return void
534
-	 */
535
-	public function failing() {
529
+    /**
530
+     * Marks a subscription as failing
531
+     *
532
+     * @since  2.4.2
533
+     * @return void
534
+     */
535
+    public function failing() {
536 536
 
537
-		$args = array(
538
-			'status' => 'failing'
539
-		);
537
+        $args = array(
538
+            'status' => 'failing'
539
+        );
540 540
 
541
-		if( $this->subs_db->update( $this->id, $args ) ) {
541
+        if( $this->subs_db->update( $this->id, $args ) ) {
542 542
 
543
-			$this->status = 'failing';
543
+            $this->status = 'failing';
544 544
 
545
-			do_action( 'wpinv_subscription_failing', $this->id, $this );
545
+            do_action( 'wpinv_subscription_failing', $this->id, $this );
546 546
 
547 547
 
548
-		}
548
+        }
549 549
 
550
-	}
550
+    }
551 551
 
552 552
     /**
553 553
      * Marks a subscription as cancelled
@@ -581,22 +581,22 @@  discard block
 block discarded – undo
581 581
         }
582 582
     }
583 583
 
584
-	/**
585
-	 * Determines if subscription can be cancelled
586
-	 *
587
-	 * This method is filtered by payment gateways in order to return true on subscriptions
588
-	 * that can be cancelled with a profile ID through the merchant processor
589
-	 *
590
-	 * @since  1.0.0
591
-	 * @return bool
592
-	 */
593
-	public function can_cancel() {
584
+    /**
585
+     * Determines if subscription can be cancelled
586
+     *
587
+     * This method is filtered by payment gateways in order to return true on subscriptions
588
+     * that can be cancelled with a profile ID through the merchant processor
589
+     *
590
+     * @since  1.0.0
591
+     * @return bool
592
+     */
593
+    public function can_cancel() {
594 594
         $ret = false;
595
-	    if( $this->gateway === 'manual' || in_array( $this->status, $this->get_cancellable_statuses() ) ) {
595
+        if( $this->gateway === 'manual' || in_array( $this->status, $this->get_cancellable_statuses() ) ) {
596 596
             $ret = true;
597 597
         }
598
-		return apply_filters( 'wpinv_subscription_can_cancel', $ret, $this );
599
-	}
598
+        return apply_filters( 'wpinv_subscription_can_cancel', $ret, $this );
599
+    }
600 600
 
601 601
     /**
602 602
      * Returns an array of subscription statuses that can be cancelled
@@ -609,197 +609,197 @@  discard block
 block discarded – undo
609 609
         return apply_filters( 'wpinv_recurring_cancellable_statuses', array( 'active', 'trialling', 'failing' ) );
610 610
     }
611 611
 
612
-	/**
613
-	 * Retrieves the URL to cancel subscription
614
-	 *
615
-	 * @since  1.0.0
616
-	 * @return string
617
-	 */
618
-	public function get_cancel_url() {
612
+    /**
613
+     * Retrieves the URL to cancel subscription
614
+     *
615
+     * @since  1.0.0
616
+     * @return string
617
+     */
618
+    public function get_cancel_url() {
619 619
 
620
-		$url = wp_nonce_url( add_query_arg( array( 'wpinv_action' => 'cancel_subscription', 'sub_id' => $this->id ) ), 'wpinv-recurring-cancel' );
620
+        $url = wp_nonce_url( add_query_arg( array( 'wpinv_action' => 'cancel_subscription', 'sub_id' => $this->id ) ), 'wpinv-recurring-cancel' );
621 621
 
622
-		return apply_filters( 'wpinv_subscription_cancel_url', $url, $this );
623
-	}
622
+        return apply_filters( 'wpinv_subscription_cancel_url', $url, $this );
623
+    }
624 624
 
625
-	/**
626
-	 * Determines if subscription can be manually renewed
627
-	 *
628
-	 * This method is filtered by payment gateways in order to return true on subscriptions
629
-	 * that can be renewed manually
630
-	 *
631
-	 * @since  2.5
632
-	 * @return bool
633
-	 */
634
-	public function can_renew() {
625
+    /**
626
+     * Determines if subscription can be manually renewed
627
+     *
628
+     * This method is filtered by payment gateways in order to return true on subscriptions
629
+     * that can be renewed manually
630
+     *
631
+     * @since  2.5
632
+     * @return bool
633
+     */
634
+    public function can_renew() {
635 635
 
636
-		return apply_filters( 'wpinv_subscription_can_renew', true, $this );
637
-	}
638
-
639
-	/**
640
-	 * Retrieves the URL to renew a subscription
641
-	 *
642
-	 * @since  2.5
643
-	 * @return string
644
-	 */
645
-	public function get_renew_url() {
646
-
647
-		$url = wp_nonce_url( add_query_arg( array( 'wpinv_action' => 'renew_subscription', 'sub_id' => $this->id ) ), 'wpinv-recurring-renew' );
648
-
649
-		return apply_filters( 'wpinv_subscription_renew_url', $url, $this );
650
-	}
651
-
652
-	/**
653
-	 * Determines if subscription can have their payment method updated
654
-	 *
655
-	 * @since  1.0.0
656
-	 * @return bool
657
-	 */
658
-	public function can_update() {
659
-		return apply_filters( 'wpinv_subscription_can_update', false, $this );
660
-	}
661
-
662
-	/**
663
-	 * Retrieves the URL to update subscription
664
-	 *
665
-	 * @since  1.0.0
666
-	 * @return void
667
-	 */
668
-	public function get_update_url() {
669
-
670
-		$url = add_query_arg( array( 'action' => 'update', 'subscription_id' => $this->id ) );
671
-
672
-		return apply_filters( 'wpinv_subscription_update_url', $url, $this );
673
-	}
674
-
675
-	/**
676
-	 * Determines if subscription is active
677
-	 *
678
-	 * @since  1.0.0
679
-	 * @return void
680
-	 */
681
-	public function is_active() {
682
-
683
-		$ret = false;
684
-
685
-		if( ! $this->is_expired() && ( $this->status == 'active' || $this->status == 'cancelled' || $this->status == 'trialling' ) ) {
686
-			$ret = true;
687
-		}
688
-
689
-		return apply_filters( 'wpinv_subscription_is_active', $ret, $this->id, $this );
690
-
691
-	}
692
-
693
-	/**
694
-	 * Determines if subscription is expired
695
-	 *
696
-	 * @since  1.0.0
697
-	 * @return void
698
-	 */
699
-	public function is_expired() {
700
-
701
-		$ret = false;
702
-
703
-		if ( $this->status == 'expired' ) {
704
-
705
-			$ret = true;
706
-
707
-		} elseif( 'active' === $this->status || 'cancelled' === $this->status || $this->status == 'trialling'  ) {
708
-
709
-			$ret        = false;
710
-			$expiration = $this->get_expiration_time();
711
-
712
-			if( $expiration && strtotime( 'NOW', current_time( 'timestamp' ) ) > $expiration ) {
713
-				$ret = true;
714
-
715
-				if ( 'active' === $this->status || $this->status == 'trialling'  ) {
716
-					$this->expire();
717
-				}
718
-			}
719
-
720
-		}
721
-
722
-		return apply_filters( 'wpinv_subscription_is_expired', $ret, $this->id, $this );
723
-
724
-	}
725
-
726
-	/**
727
-	 * Retrieves the expiration date
728
-	 *
729
-	 * @since  1.0.0
730
-	 * @return string
731
-	 */
732
-	public function get_expiration() {
733
-		return $this->expiration;
734
-	}
735
-
736
-	/**
737
-	 * Retrieves the expiration date in a timestamp
738
-	 *
739
-	 * @since  1.0.0
740
-	 * @return int
741
-	 */
742
-	public function get_expiration_time() {
743
-		return strtotime( $this->expiration, current_time( 'timestamp' ) );
744
-	}
745
-
746
-	/**
747
-	 * Retrieves the subscription status
748
-	 *
749
-	 * @since  1.0.0
750
-	 * @return int
751
-	 */
752
-	public function get_status() {
753
-
754
-		// Monitor for page load delays on pages with large subscription lists (IE: Subscriptions table in admin)
755
-		$this->is_expired();
756
-		return $this->status;
757
-	}
758
-
759
-	/**
760
-	 * Retrieves the subscription status label
761
-	 *
762
-	 * @since  1.0.0
763
-	 * @return int
764
-	 */
765
-	public function get_status_label() {
766
-
767
-		switch( $this->get_status() ) {
768
-			case 'active' :
769
-				$status = __( 'Active', 'invoicing' );
770
-				break;
771
-
772
-			case 'cancelled' :
773
-				$status = __( 'Cancelled', 'invoicing' );
774
-				break;
775
-
776
-			case 'expired' :
777
-				$status = __( 'Expired', 'invoicing' );
778
-				break;
779
-
780
-			case 'pending' :
781
-				$status = __( 'Pending', 'invoicing' );
782
-				break;
783
-
784
-			case 'failing' :
785
-				$status = __( 'Failing', 'invoicing' );
786
-				break;
787
-
788
-			case 'trialling' :
789
-				$status = __( 'Trialling', 'invoicing' );
790
-				break;
791
-
792
-			case 'completed' :
793
-				$status = __( 'Completed', 'invoicing' );
794
-				break;
795
-
796
-			default:
797
-				$status = ucfirst( $this->get_status() );
798
-				break;
799
-		}
800
-
801
-		return $status;
802
-	}
636
+        return apply_filters( 'wpinv_subscription_can_renew', true, $this );
637
+    }
638
+
639
+    /**
640
+     * Retrieves the URL to renew a subscription
641
+     *
642
+     * @since  2.5
643
+     * @return string
644
+     */
645
+    public function get_renew_url() {
646
+
647
+        $url = wp_nonce_url( add_query_arg( array( 'wpinv_action' => 'renew_subscription', 'sub_id' => $this->id ) ), 'wpinv-recurring-renew' );
648
+
649
+        return apply_filters( 'wpinv_subscription_renew_url', $url, $this );
650
+    }
651
+
652
+    /**
653
+     * Determines if subscription can have their payment method updated
654
+     *
655
+     * @since  1.0.0
656
+     * @return bool
657
+     */
658
+    public function can_update() {
659
+        return apply_filters( 'wpinv_subscription_can_update', false, $this );
660
+    }
661
+
662
+    /**
663
+     * Retrieves the URL to update subscription
664
+     *
665
+     * @since  1.0.0
666
+     * @return void
667
+     */
668
+    public function get_update_url() {
669
+
670
+        $url = add_query_arg( array( 'action' => 'update', 'subscription_id' => $this->id ) );
671
+
672
+        return apply_filters( 'wpinv_subscription_update_url', $url, $this );
673
+    }
674
+
675
+    /**
676
+     * Determines if subscription is active
677
+     *
678
+     * @since  1.0.0
679
+     * @return void
680
+     */
681
+    public function is_active() {
682
+
683
+        $ret = false;
684
+
685
+        if( ! $this->is_expired() && ( $this->status == 'active' || $this->status == 'cancelled' || $this->status == 'trialling' ) ) {
686
+            $ret = true;
687
+        }
688
+
689
+        return apply_filters( 'wpinv_subscription_is_active', $ret, $this->id, $this );
690
+
691
+    }
692
+
693
+    /**
694
+     * Determines if subscription is expired
695
+     *
696
+     * @since  1.0.0
697
+     * @return void
698
+     */
699
+    public function is_expired() {
700
+
701
+        $ret = false;
702
+
703
+        if ( $this->status == 'expired' ) {
704
+
705
+            $ret = true;
706
+
707
+        } elseif( 'active' === $this->status || 'cancelled' === $this->status || $this->status == 'trialling'  ) {
708
+
709
+            $ret        = false;
710
+            $expiration = $this->get_expiration_time();
711
+
712
+            if( $expiration && strtotime( 'NOW', current_time( 'timestamp' ) ) > $expiration ) {
713
+                $ret = true;
714
+
715
+                if ( 'active' === $this->status || $this->status == 'trialling'  ) {
716
+                    $this->expire();
717
+                }
718
+            }
719
+
720
+        }
721
+
722
+        return apply_filters( 'wpinv_subscription_is_expired', $ret, $this->id, $this );
723
+
724
+    }
725
+
726
+    /**
727
+     * Retrieves the expiration date
728
+     *
729
+     * @since  1.0.0
730
+     * @return string
731
+     */
732
+    public function get_expiration() {
733
+        return $this->expiration;
734
+    }
735
+
736
+    /**
737
+     * Retrieves the expiration date in a timestamp
738
+     *
739
+     * @since  1.0.0
740
+     * @return int
741
+     */
742
+    public function get_expiration_time() {
743
+        return strtotime( $this->expiration, current_time( 'timestamp' ) );
744
+    }
745
+
746
+    /**
747
+     * Retrieves the subscription status
748
+     *
749
+     * @since  1.0.0
750
+     * @return int
751
+     */
752
+    public function get_status() {
753
+
754
+        // Monitor for page load delays on pages with large subscription lists (IE: Subscriptions table in admin)
755
+        $this->is_expired();
756
+        return $this->status;
757
+    }
758
+
759
+    /**
760
+     * Retrieves the subscription status label
761
+     *
762
+     * @since  1.0.0
763
+     * @return int
764
+     */
765
+    public function get_status_label() {
766
+
767
+        switch( $this->get_status() ) {
768
+            case 'active' :
769
+                $status = __( 'Active', 'invoicing' );
770
+                break;
771
+
772
+            case 'cancelled' :
773
+                $status = __( 'Cancelled', 'invoicing' );
774
+                break;
775
+
776
+            case 'expired' :
777
+                $status = __( 'Expired', 'invoicing' );
778
+                break;
779
+
780
+            case 'pending' :
781
+                $status = __( 'Pending', 'invoicing' );
782
+                break;
783
+
784
+            case 'failing' :
785
+                $status = __( 'Failing', 'invoicing' );
786
+                break;
787
+
788
+            case 'trialling' :
789
+                $status = __( 'Trialling', 'invoicing' );
790
+                break;
791
+
792
+            case 'completed' :
793
+                $status = __( 'Completed', 'invoicing' );
794
+                break;
795
+
796
+            default:
797
+                $status = ucfirst( $this->get_status() );
798
+                break;
799
+        }
800
+
801
+        return $status;
802
+    }
803 803
 
804 804
     /**
805 805
      * Retrieves the subscription status label
Please login to merge, or discard this patch.
includes/class-wpinv-discount.php 1 patch
Indentation   +668 added lines, -668 removed lines patch added patch discarded remove patch
@@ -33,173 +33,173 @@  discard block
 block discarded – undo
33 33
  */
34 34
 class WPInv_Discount {
35 35
 	
36
-	/**
37
-	 * Discount ID.
38
-	 *
39
-	 * @since 1.0.15
40
-	 * @var integer|null
41
-	 */
42
-	public $ID = null;
43
-
44
-	/**
45
-	 * Old discount status.
46
-	 *
47
-	 * @since 1.0.15
48
-	 * @var string
49
-	 */
50
-	public $old_status = 'draft';
36
+    /**
37
+     * Discount ID.
38
+     *
39
+     * @since 1.0.15
40
+     * @var integer|null
41
+     */
42
+    public $ID = null;
43
+
44
+    /**
45
+     * Old discount status.
46
+     *
47
+     * @since 1.0.15
48
+     * @var string
49
+     */
50
+    public $old_status = 'draft';
51 51
 	
52
-	/**
53
-	 * Data array.
54
-	 *
55
-	 * @since 1.0.15
56
-	 * @var array
57
-	 */
58
-	protected $data = array();
59
-
60
-	/**
61
-	 * Discount constructor.
62
-	 *
63
-	 * @param int|array|string|WPInv_Discount $discount discount data, object, ID or code.
64
-	 * @since 1.0.15
65
-	 */
66
-	public function __construct( $discount = array() ) {
52
+    /**
53
+     * Data array.
54
+     *
55
+     * @since 1.0.15
56
+     * @var array
57
+     */
58
+    protected $data = array();
59
+
60
+    /**
61
+     * Discount constructor.
62
+     *
63
+     * @param int|array|string|WPInv_Discount $discount discount data, object, ID or code.
64
+     * @since 1.0.15
65
+     */
66
+    public function __construct( $discount = array() ) {
67 67
         
68 68
         // If the discount is an instance of this class...
69
-		if ( $discount instanceof WPInv_Discount ) {
70
-			$this->init( $discount->data );
71
-			return;
69
+        if ( $discount instanceof WPInv_Discount ) {
70
+            $this->init( $discount->data );
71
+            return;
72 72
         }
73 73
         
74 74
         // If the discount is an array of discount details...
75 75
         if ( is_array( $discount ) ) {
76
-			$this->init( $discount );
77
-			return;
78
-		}
76
+            $this->init( $discount );
77
+            return;
78
+        }
79 79
 		
80
-		// Try fetching the discount by its post id.
81
-		$data = false;
80
+        // Try fetching the discount by its post id.
81
+        $data = false;
82 82
 		
83
-		if ( ! empty( $discount ) && is_numeric( $discount ) ) {
84
-			$discount = absint( $discount );
85
-			$data = self::get_data_by( 'id', $discount );
86
-		}
87
-
88
-		if ( is_array( $data ) ) {
89
-			$this->init( $data );
90
-			return;
91
-		}
83
+        if ( ! empty( $discount ) && is_numeric( $discount ) ) {
84
+            $discount = absint( $discount );
85
+            $data = self::get_data_by( 'id', $discount );
86
+        }
87
+
88
+        if ( is_array( $data ) ) {
89
+            $this->init( $data );
90
+            return;
91
+        }
92 92
 		
93
-		// Try fetching the discount by its discount code.
94
-		if ( ! empty( $discount ) && is_string( $discount ) ) {
95
-			$data = self::get_data_by( 'discount_code', $discount );
96
-		}
97
-
98
-		if ( is_array( $data ) ) {
99
-			$this->init( $data );
100
-			return;
101
-		} 
93
+        // Try fetching the discount by its discount code.
94
+        if ( ! empty( $discount ) && is_string( $discount ) ) {
95
+            $data = self::get_data_by( 'discount_code', $discount );
96
+        }
97
+
98
+        if ( is_array( $data ) ) {
99
+            $this->init( $data );
100
+            return;
101
+        } 
102 102
 		
103
-		// If we are here then the discount does not exist.
104
-		$this->init( array() );
105
-	}
103
+        // If we are here then the discount does not exist.
104
+        $this->init( array() );
105
+    }
106 106
 	
107
-	/**
108
-	 * Sets up object properties
109
-	 *
110
-	 * @since 1.0.15
111
-	 * @param array $data An array containing the discount's data
112
-	 */
113
-	public function init( $data ) {
114
-		$data       	  = self::sanitize_discount_data( $data );
115
-		$this->data 	  = $data;
116
-		$this->old_status = $data['status'];
117
-		$this->ID   	  = $data['ID'];
118
-	}
107
+    /**
108
+     * Sets up object properties
109
+     *
110
+     * @since 1.0.15
111
+     * @param array $data An array containing the discount's data
112
+     */
113
+    public function init( $data ) {
114
+        $data       	  = self::sanitize_discount_data( $data );
115
+        $this->data 	  = $data;
116
+        $this->old_status = $data['status'];
117
+        $this->ID   	  = $data['ID'];
118
+    }
119 119
 	
120
-	/**
121
-	 * Fetch a discount from the db/cache
122
-	 *
123
-	 *
124
-	 * @static
125
-	 * @param string $field The field to query against: 'ID', 'discount_code'
126
-	 * @param string|int $value The field value
127
-	 * @since 1.0.15
128
-	 * @return array|bool array of discount details on success. False otherwise.
129
-	 */
130
-	public static function get_data_by( $field, $value ) {
131
-
132
-		if ( 'id' == strtolower( $field ) ) {
133
-			// Make sure the value is numeric to avoid casting objects, for example,
134
-			// to int 1.
135
-			if ( ! is_numeric( $value ) )
136
-				return false;
137
-			$value = intval( $value );
138
-			if ( $value < 1 )
139
-				return false;
140
-		}
141
-
142
-		if ( ! $value || ! is_string( $field ) ) {
143
-			return false;
144
-		}
120
+    /**
121
+     * Fetch a discount from the db/cache
122
+     *
123
+     *
124
+     * @static
125
+     * @param string $field The field to query against: 'ID', 'discount_code'
126
+     * @param string|int $value The field value
127
+     * @since 1.0.15
128
+     * @return array|bool array of discount details on success. False otherwise.
129
+     */
130
+    public static function get_data_by( $field, $value ) {
131
+
132
+        if ( 'id' == strtolower( $field ) ) {
133
+            // Make sure the value is numeric to avoid casting objects, for example,
134
+            // to int 1.
135
+            if ( ! is_numeric( $value ) )
136
+                return false;
137
+            $value = intval( $value );
138
+            if ( $value < 1 )
139
+                return false;
140
+        }
141
+
142
+        if ( ! $value || ! is_string( $field ) ) {
143
+            return false;
144
+        }
145 145
 		
146
-		$field = trim( $field );
147
-
148
-		// prepare query args
149
-		switch ( strtolower( $field ) ) {
150
-			case 'id':
151
-				$discount_id = $value;
152
-				$args		 = array( 'include' => array( $value ) );
153
-				break;
154
-			case 'discount_code':
155
-			case 'code':
156
-				$value       = trim( $value );
157
-				$discount_id = wp_cache_get( $value, 'WPInv_Discount_Codes' );
158
-				$args		 = array( 'meta_key' => '_wpi_discount_code', 'meta_value' => $value );
159
-				break;
160
-			case 'name':
161
-				$discount_id = 0;
162
-				$args		 = array( 'name' => trim( $value ) );
163
-				break;
164
-			default:
165
-				$args		 = apply_filters( "wpinv_discount_get_data_by_{$field}_args", null, $value );
166
-				if ( ! is_array( $args ) ) {
167
-					return apply_filters( "wpinv_discount_get_data_by_$field", false, $value );
168
-				}
169
-
170
-		}
171
-
172
-		// Check if there is a cached value.
173
-		if ( ! empty( $discount_id ) && $discount = wp_cache_get( (int) $discount_id, 'WPInv_Discounts' ) ) {
174
-			return $discount;
175
-		}
176
-
177
-		$args = array_merge(
178
-			$args,
179
-			array(
180
-				'post_type'      => 'wpi_discount',
181
-				'posts_per_page' => 1,
182
-				'post_status'    => array( 'publish', 'pending', 'draft', 'expired' )
183
-			)
184
-		);
185
-
186
-		$discount = get_posts( $args );
146
+        $field = trim( $field );
147
+
148
+        // prepare query args
149
+        switch ( strtolower( $field ) ) {
150
+            case 'id':
151
+                $discount_id = $value;
152
+                $args		 = array( 'include' => array( $value ) );
153
+                break;
154
+            case 'discount_code':
155
+            case 'code':
156
+                $value       = trim( $value );
157
+                $discount_id = wp_cache_get( $value, 'WPInv_Discount_Codes' );
158
+                $args		 = array( 'meta_key' => '_wpi_discount_code', 'meta_value' => $value );
159
+                break;
160
+            case 'name':
161
+                $discount_id = 0;
162
+                $args		 = array( 'name' => trim( $value ) );
163
+                break;
164
+            default:
165
+                $args		 = apply_filters( "wpinv_discount_get_data_by_{$field}_args", null, $value );
166
+                if ( ! is_array( $args ) ) {
167
+                    return apply_filters( "wpinv_discount_get_data_by_$field", false, $value );
168
+                }
169
+
170
+        }
171
+
172
+        // Check if there is a cached value.
173
+        if ( ! empty( $discount_id ) && $discount = wp_cache_get( (int) $discount_id, 'WPInv_Discounts' ) ) {
174
+            return $discount;
175
+        }
176
+
177
+        $args = array_merge(
178
+            $args,
179
+            array(
180
+                'post_type'      => 'wpi_discount',
181
+                'posts_per_page' => 1,
182
+                'post_status'    => array( 'publish', 'pending', 'draft', 'expired' )
183
+            )
184
+        );
185
+
186
+        $discount = get_posts( $args );
187 187
 				
188
-		if( empty( $discount ) ) {
189
-			return false;
190
-		}
188
+        if( empty( $discount ) ) {
189
+            return false;
190
+        }
191 191
 
192
-		$discount = $discount[0];
192
+        $discount = $discount[0];
193 193
 		
194
-		// Prepare the return data.
195
-		$return = array(
194
+        // Prepare the return data.
195
+        $return = array(
196 196
             'ID'                          => $discount->ID,
197 197
             'code'                        => get_post_meta( $discount->ID, '_wpi_discount_code', true ),
198 198
             'amount'                      => get_post_meta( $discount->ID, '_wpi_discount_amount', true ),
199 199
             'date_created'                => $discount->post_date,
200
-			'date_modified'               => $discount->post_modified,
201
-			'status'               		  => $discount->post_status,
202
-			'start'                  	  => get_post_meta( $discount->ID, '_wpi_discount_start', true ),
200
+            'date_modified'               => $discount->post_modified,
201
+            'status'               		  => $discount->post_status,
202
+            'start'                  	  => get_post_meta( $discount->ID, '_wpi_discount_start', true ),
203 203
             'expiration'                  => get_post_meta( $discount->ID, '_wpi_discount_expiration', true ),
204 204
             'type'               		  => get_post_meta( $discount->ID, '_wpi_discount_type', true ),
205 205
             'description'                 => $discount->post_excerpt,
@@ -213,38 +213,38 @@  discard block
 block discarded – undo
213 213
             'max_total'                   => get_post_meta( $discount->ID, '_wpi_discount_max_total', true ),
214 214
         );
215 215
 		
216
-		$return = self::sanitize_discount_data( $return );
217
-		$return = apply_filters( 'wpinv_discount_properties', $return );
216
+        $return = self::sanitize_discount_data( $return );
217
+        $return = apply_filters( 'wpinv_discount_properties', $return );
218 218
 
219
-		// Update the cache with our data
220
-		wp_cache_add( $discount->ID, $return, 'WPInv_Discounts' );
221
-		wp_cache_add( $return['code'], $discount->ID, 'WPInv_Discount_Codes' );
219
+        // Update the cache with our data
220
+        wp_cache_add( $discount->ID, $return, 'WPInv_Discounts' );
221
+        wp_cache_add( $return['code'], $discount->ID, 'WPInv_Discount_Codes' );
222 222
 
223
-		return $return;
224
-	}
223
+        return $return;
224
+    }
225 225
 	
226
-	/**
227
-	 * Sanitizes discount data
228
-	 *
229
-	 * @static
230
-	 * @since 1.0.15
231
-	 * @access public
232
-	 *
233
-	 * @return array the sanitized data
234
-	 */
235
-	public static function sanitize_discount_data( $data ) {
226
+    /**
227
+     * Sanitizes discount data
228
+     *
229
+     * @static
230
+     * @since 1.0.15
231
+     * @access public
232
+     *
233
+     * @return array the sanitized data
234
+     */
235
+    public static function sanitize_discount_data( $data ) {
236 236
 		
237
-		$allowed_discount_types = array_keys( wpinv_get_discount_types() );
237
+        $allowed_discount_types = array_keys( wpinv_get_discount_types() );
238 238
 		
239
-		$return = array(
239
+        $return = array(
240 240
             'ID'                          => null,
241 241
             'code'                        => '',
242 242
             'amount'                      => 0,
243 243
             'date_created'                => current_time('mysql'),
244 244
             'date_modified'               => current_time('mysql'),
245
-			'expiration'                  => null,
246
-			'start'                  	  => current_time('mysql'),
247
-			'status'                  	  => 'draft',
245
+            'expiration'                  => null,
246
+            'start'                  	  => current_time('mysql'),
247
+            'status'                  	  => 'draft',
248 248
             'type'               		  => 'percent',
249 249
             'description'                 => '',
250 250
             'uses'                        => 0,
@@ -254,426 +254,426 @@  discard block
 block discarded – undo
254 254
             'max_uses'                    => 0,
255 255
             'is_recurring'                => false,
256 256
             'min_total'                   => '',
257
-			'max_total'              	  => '',
258
-		);
257
+            'max_total'              	  => '',
258
+        );
259 259
 		
260 260
 				
261
-		// Arrays only please.
262
-		if ( ! is_array( $data ) ) {
261
+        // Arrays only please.
262
+        if ( ! is_array( $data ) ) {
263 263
             return $return;
264 264
         }
265 265
 
266
-		// If an id is provided, ensure it is a valid discount.
266
+        // If an id is provided, ensure it is a valid discount.
267 267
         if ( ! empty( $data['ID'] ) && ( ! is_numeric( $data['ID'] ) || 'wpi_discount' !== get_post_type( $data['ID'] ) ) ) {
268 268
             return $return;
269
-		}
269
+        }
270 270
 
271 271
         $return = array_merge( $return, $data );
272 272
 
273 273
         // Sanitize some keys.
274 274
         $return['amount']         = wpinv_sanitize_amount( $return['amount'] );
275
-		$return['is_single_use']  = (bool) $return['is_single_use'];
276
-		$return['is_recurring']   = (bool) $return['is_recurring'];
277
-		$return['uses']	          = (int) $return['uses'];
278
-		$return['max_uses']	      = (int) $return['max_uses'];
279
-		$return['min_total'] 	  = wpinv_sanitize_amount( $return['min_total'] );
275
+        $return['is_single_use']  = (bool) $return['is_single_use'];
276
+        $return['is_recurring']   = (bool) $return['is_recurring'];
277
+        $return['uses']	          = (int) $return['uses'];
278
+        $return['max_uses']	      = (int) $return['max_uses'];
279
+        $return['min_total'] 	  = wpinv_sanitize_amount( $return['min_total'] );
280 280
         $return['max_total'] 	  = wpinv_sanitize_amount( $return['max_total'] );
281 281
 
282
-		// Trim all values.
283
-		$return = wpinv_clean( $return );
282
+        // Trim all values.
283
+        $return = wpinv_clean( $return );
284 284
 		
285
-		// Ensure the discount type is supported.
285
+        // Ensure the discount type is supported.
286 286
         if ( ! in_array( $return['type'], $allowed_discount_types, true ) ) {
287 287
             $return['type'] = 'percent';
288
-		}
289
-		$return['type_name'] = wpinv_get_discount_type_name( $return['type'] );
288
+        }
289
+        $return['type_name'] = wpinv_get_discount_type_name( $return['type'] );
290 290
 		
291
-		// Do not offer more than a 100% discount.
292
-		if ( $return['type'] == 'percent' && (float) $return['amount'] > 100 ) {
293
-			$return['amount'] = 100;
294
-		}
295
-
296
-		// Format dates.
297
-		foreach( wpinv_parse_list( 'date_created date_modified expiration start') as $prop ) {
298
-			if( ! empty( $return[$prop] ) ) {
299
-				$return[$prop]      = date_i18n( 'Y-m-d H:i:s', strtotime( $return[$prop] ) );
300
-			}
301
-		}
302
-
303
-		// Formart items.
304
-		foreach( array( 'excluded_items', 'items' ) as $prop ) {
305
-
306
-			if( ! empty( $return[$prop] ) ) {
307
-				// Ensure that the property is an array of non-empty integers.
308
-				$return[$prop]      = array_filter( array_map( 'intval', wpinv_parse_list( $return[$prop] ) ) );
309
-			} else {
310
-				$return[$prop]      = array();
311
-			}
312
-
313
-		}
291
+        // Do not offer more than a 100% discount.
292
+        if ( $return['type'] == 'percent' && (float) $return['amount'] > 100 ) {
293
+            $return['amount'] = 100;
294
+        }
295
+
296
+        // Format dates.
297
+        foreach( wpinv_parse_list( 'date_created date_modified expiration start') as $prop ) {
298
+            if( ! empty( $return[$prop] ) ) {
299
+                $return[$prop]      = date_i18n( 'Y-m-d H:i:s', strtotime( $return[$prop] ) );
300
+            }
301
+        }
302
+
303
+        // Formart items.
304
+        foreach( array( 'excluded_items', 'items' ) as $prop ) {
305
+
306
+            if( ! empty( $return[$prop] ) ) {
307
+                // Ensure that the property is an array of non-empty integers.
308
+                $return[$prop]      = array_filter( array_map( 'intval', wpinv_parse_list( $return[$prop] ) ) );
309
+            } else {
310
+                $return[$prop]      = array();
311
+            }
312
+
313
+        }
314 314
 		
315
-		return apply_filters( 'wpinv_sanitize_discount_data', $return, $data );
316
-	}
315
+        return apply_filters( 'wpinv_sanitize_discount_data', $return, $data );
316
+    }
317 317
 	
318
-	/**
319
-	 * Magic method for checking the existence of a certain custom field.
320
-	 *
321
-	 * @since 1.0.15
322
-	 * @access public
323
-	 *
324
-	 * @return bool Whether the given discount field is set.
325
-	 */
326
-	public function __isset( $key ){
327
-		return isset( $this->data[$key] ) || method_exists( $this, "get_$key");
328
-	}
318
+    /**
319
+     * Magic method for checking the existence of a certain custom field.
320
+     *
321
+     * @since 1.0.15
322
+     * @access public
323
+     *
324
+     * @return bool Whether the given discount field is set.
325
+     */
326
+    public function __isset( $key ){
327
+        return isset( $this->data[$key] ) || method_exists( $this, "get_$key");
328
+    }
329 329
 	
330
-	/**
331
-	 * Magic method for accessing discount properties.
332
-	 *
333
-	 * @since 1.0.15
334
-	 * @access public
335
-	 *
336
-	 * @param string $key Discount data to retrieve
337
-	 * @return mixed Value of the given discount property (if set).
338
-	 */
339
-	public function __get( $key ) {
340
-		return $this->get( $key );
341
-	}
342
-
343
-	/**
344
-	 * Magic method for accessing discount properties.
345
-	 *
346
-	 * @since 1.0.15
347
-	 * @access public
348
-	 *
349
-	 * @param string $key Discount data to retrieve
350
-	 * @return mixed Value of the given discount property (if set).
351
-	 */
352
-	public function get( $key ) {
330
+    /**
331
+     * Magic method for accessing discount properties.
332
+     *
333
+     * @since 1.0.15
334
+     * @access public
335
+     *
336
+     * @param string $key Discount data to retrieve
337
+     * @return mixed Value of the given discount property (if set).
338
+     */
339
+    public function __get( $key ) {
340
+        return $this->get( $key );
341
+    }
342
+
343
+    /**
344
+     * Magic method for accessing discount properties.
345
+     *
346
+     * @since 1.0.15
347
+     * @access public
348
+     *
349
+     * @param string $key Discount data to retrieve
350
+     * @return mixed Value of the given discount property (if set).
351
+     */
352
+    public function get( $key ) {
353 353
 		
354
-		if ( $key == 'id' ) {
355
-			$key = 'ID';
356
-		}
354
+        if ( $key == 'id' ) {
355
+            $key = 'ID';
356
+        }
357 357
 		
358
-		if( method_exists( $this, "get_$key") ) {
359
-			$value 	= call_user_func( array( $this, "get_$key" ) );
360
-		} else if( isset( $this->data[$key] ) ) {
361
-			$value 	= $this->data[$key];
362
-		} else {
363
-			$value = null;
364
-		}
358
+        if( method_exists( $this, "get_$key") ) {
359
+            $value 	= call_user_func( array( $this, "get_$key" ) );
360
+        } else if( isset( $this->data[$key] ) ) {
361
+            $value 	= $this->data[$key];
362
+        } else {
363
+            $value = null;
364
+        }
365 365
 		
366
-		/**
367
-		 * Filters a discount's property value.
368
-		 * 
369
-		 * The dynamic part ($key) can be any property name e.g items, code, type etc.
370
-		 * 
371
-		 * @param mixed          $value    The property's value.
372
-		 * @param int            $ID       The discount's ID.
373
-		 * @param WPInv_Discount $discount The discount object.
374
-		 * @param string         $code     The discount's discount code.
375
-		 * @param array          $data     The discount's data array.
376
-		 */
377
-		return apply_filters( "wpinv_get_discount_{$key}", $value, $this->ID, $this, $this->data['code'], $this->data );
378
-
379
-	}
366
+        /**
367
+         * Filters a discount's property value.
368
+         * 
369
+         * The dynamic part ($key) can be any property name e.g items, code, type etc.
370
+         * 
371
+         * @param mixed          $value    The property's value.
372
+         * @param int            $ID       The discount's ID.
373
+         * @param WPInv_Discount $discount The discount object.
374
+         * @param string         $code     The discount's discount code.
375
+         * @param array          $data     The discount's data array.
376
+         */
377
+        return apply_filters( "wpinv_get_discount_{$key}", $value, $this->ID, $this, $this->data['code'], $this->data );
378
+
379
+    }
380 380
 	
381
-	/**
382
-	 * Magic method for setting discount fields.
383
-	 *
384
-	 * This method does not update custom fields in the database.
385
-	 *
386
-	 * @since 1.0.15
387
-	 * @access public
388
-	 *
389
-	 */
390
-	public function __set( $key, $value ) {
381
+    /**
382
+     * Magic method for setting discount fields.
383
+     *
384
+     * This method does not update custom fields in the database.
385
+     *
386
+     * @since 1.0.15
387
+     * @access public
388
+     *
389
+     */
390
+    public function __set( $key, $value ) {
391 391
 		
392
-		if ( 'id' == strtolower( $key ) ) {
392
+        if ( 'id' == strtolower( $key ) ) {
393 393
 			
394
-			$this->ID = $value;
395
-			$this->data['ID'] = $value;
396
-			return;
394
+            $this->ID = $value;
395
+            $this->data['ID'] = $value;
396
+            return;
397 397
 			
398
-		}
398
+        }
399 399
 		
400
-		/**
401
-		 * Filters a discount's property value before it is saved.
402
-		 * 
403
-		 * 
404
-		 * 
405
-		 * The dynamic part ($key) can be any property name e.g items, code, type etc.
406
-		 * 
407
-		 * @param mixed          $value    The property's value.
408
-		 * @param int            $ID       The discount's ID.
409
-		 * @param WPInv_Discount $discount The discount object.
410
-		 * @param string         $code     The discount's discount code.
411
-		 * @param array          $data     The discount's data array.
412
-		 */
413
-		$value = apply_filters( "wpinv_set_discount_{$key}", $value, $this->ID, $this, $this->code, $this->data );
414
-
415
-		if( method_exists( $this, "set_$key") ) {
416
-			call_user_func( array( $this, "set_$key" ), $value );
417
-		} else {
418
-			$this->data[$key] = $value;
419
-		}
400
+        /**
401
+         * Filters a discount's property value before it is saved.
402
+         * 
403
+         * 
404
+         * 
405
+         * The dynamic part ($key) can be any property name e.g items, code, type etc.
406
+         * 
407
+         * @param mixed          $value    The property's value.
408
+         * @param int            $ID       The discount's ID.
409
+         * @param WPInv_Discount $discount The discount object.
410
+         * @param string         $code     The discount's discount code.
411
+         * @param array          $data     The discount's data array.
412
+         */
413
+        $value = apply_filters( "wpinv_set_discount_{$key}", $value, $this->ID, $this, $this->code, $this->data );
414
+
415
+        if( method_exists( $this, "set_$key") ) {
416
+            call_user_func( array( $this, "set_$key" ), $value );
417
+        } else {
418
+            $this->data[$key] = $value;
419
+        }
420 420
 		
421
-	}
421
+    }
422 422
 	
423
-	/**
424
-	 * Saves (or updates) a discount to the database
425
-	 *
426
-	 * @since 1.0.15
427
-	 * @access public
428
-	 * @return bool
429
-	 *
430
-	 */
431
-	public function save(){
423
+    /**
424
+     * Saves (or updates) a discount to the database
425
+     *
426
+     * @since 1.0.15
427
+     * @access public
428
+     * @return bool
429
+     *
430
+     */
431
+    public function save(){
432 432
 		
433
-		$data = self::sanitize_discount_data( $this->data );
433
+        $data = self::sanitize_discount_data( $this->data );
434 434
 
435
-		// Should we create a new post?
436
-		if( ! $data[ 'ID' ] ) {
435
+        // Should we create a new post?
436
+        if( ! $data[ 'ID' ] ) {
437 437
 
438
-			$id = wp_insert_post( array(
439
-				'post_status'           => $data['status'],
440
-				'post_type'             => 'wpi_discount',
441
-				'post_excerpt'          => $data['description'],
442
-			) );
438
+            $id = wp_insert_post( array(
439
+                'post_status'           => $data['status'],
440
+                'post_type'             => 'wpi_discount',
441
+                'post_excerpt'          => $data['description'],
442
+            ) );
443 443
 
444
-			if( empty( $id ) ) {
445
-				return false;
446
-			}
444
+            if( empty( $id ) ) {
445
+                return false;
446
+            }
447 447
 
448
-			$data[ 'ID' ] = (int) $id;
449
-			$this->ID = $data[ 'ID' ];
450
-			$this->data['ID'] = $data[ 'ID' ];
448
+            $data[ 'ID' ] = (int) $id;
449
+            $this->ID = $data[ 'ID' ];
450
+            $this->data['ID'] = $data[ 'ID' ];
451 451
 
452
-		} else {
453
-			$this->update_status( $data['status'] );
454
-		}
452
+        } else {
453
+            $this->update_status( $data['status'] );
454
+        }
455 455
 
456
-		$meta = apply_filters( 'wpinv_update_discount', $data, $this->ID, $this );
456
+        $meta = apply_filters( 'wpinv_update_discount', $data, $this->ID, $this );
457 457
 
458
-		do_action( 'wpinv_pre_update_discount', $meta, $this->ID, $this );
458
+        do_action( 'wpinv_pre_update_discount', $meta, $this->ID, $this );
459 459
 
460
-		foreach( wpinv_parse_list( 'ID date_created date_modified status description type_name' ) as $prop ) {
461
-			if ( isset( $meta[$prop] ) ) {
462
-				unset( $meta[$prop] );
463
-			}
464
-		}
460
+        foreach( wpinv_parse_list( 'ID date_created date_modified status description type_name' ) as $prop ) {
461
+            if ( isset( $meta[$prop] ) ) {
462
+                unset( $meta[$prop] );
463
+            }
464
+        }
465 465
 
466
-		if( isset( $meta['uses'] ) && empty( $meta['uses'] ) ) {
467
-			unset( $meta['uses'] );
468
-		}
466
+        if( isset( $meta['uses'] ) && empty( $meta['uses'] ) ) {
467
+            unset( $meta['uses'] );
468
+        }
469 469
 
470
-		// Save the metadata.
471
-		foreach( $meta as $key => $value ) {
472
-			update_post_meta( $this->ID, "_wpi_discount_$key", $value );
473
-		}
470
+        // Save the metadata.
471
+        foreach( $meta as $key => $value ) {
472
+            update_post_meta( $this->ID, "_wpi_discount_$key", $value );
473
+        }
474 474
 
475
-		$this->refresh();
475
+        $this->refresh();
476 476
 
477
-		do_action( 'wpinv_post_update_discount', $meta, $this->ID );
477
+        do_action( 'wpinv_post_update_discount', $meta, $this->ID );
478 478
 
479
-		return true;		
480
-	}
479
+        return true;		
480
+    }
481 481
 
482
-	/**
483
-	 * Refreshes the discount data.
484
-	 *
485
-	 * @since 1.0.15
486
-	 * @access public
487
-	 * @return bool
488
-	 *
489
-	 */
490
-	public function refresh(){
482
+    /**
483
+     * Refreshes the discount data.
484
+     *
485
+     * @since 1.0.15
486
+     * @access public
487
+     * @return bool
488
+     *
489
+     */
490
+    public function refresh(){
491 491
 
492
-		// Empty the cache for this discount.
493
-		wp_cache_delete( $this->ID, 'WPInv_Discounts' );
494
-		wp_cache_delete( $this->get( 'code' ), 'WPInv_Discount_Codes' );
492
+        // Empty the cache for this discount.
493
+        wp_cache_delete( $this->ID, 'WPInv_Discounts' );
494
+        wp_cache_delete( $this->get( 'code' ), 'WPInv_Discount_Codes' );
495 495
 
496
-		$data = self::get_data_by( 'id', $this->ID );
497
-		if( is_array( $data ) ) {
498
-			$this->init( $data );
499
-		} else {
500
-			$this->init( array() );
501
-		}
496
+        $data = self::get_data_by( 'id', $this->ID );
497
+        if( is_array( $data ) ) {
498
+            $this->init( $data );
499
+        } else {
500
+            $this->init( array() );
501
+        }
502 502
 
503
-	}
503
+    }
504 504
 
505
-	/**
506
-	 * Saves (or updates) a discount to the database
507
-	 *
508
-	 * @since 1.0.15
509
-	 * @access public
510
-	 * @return bool
511
-	 *
512
-	 */
513
-	public function update_status( $status = 'publish' ){
505
+    /**
506
+     * Saves (or updates) a discount to the database
507
+     *
508
+     * @since 1.0.15
509
+     * @access public
510
+     * @return bool
511
+     *
512
+     */
513
+    public function update_status( $status = 'publish' ){
514 514
 
515 515
 
516
-		if ( $this->exists() && $this->old_status != $status ) {
516
+        if ( $this->exists() && $this->old_status != $status ) {
517 517
 
518
-			do_action( 'wpinv_pre_update_discount_status', $this->ID, $this->old_status, $status );
519
-        	$updated = wp_update_post( array( 'ID' => $this->ID, 'post_status' => $status ) );
520
-			do_action( 'wpinv_post_update_discount_status', $this->ID, $this->old_status, $status );
518
+            do_action( 'wpinv_pre_update_discount_status', $this->ID, $this->old_status, $status );
519
+            $updated = wp_update_post( array( 'ID' => $this->ID, 'post_status' => $status ) );
520
+            do_action( 'wpinv_post_update_discount_status', $this->ID, $this->old_status, $status );
521 521
 
522
-			$this->refresh();
522
+            $this->refresh();
523 523
 
524
-			return $updated !== 0;
524
+            return $updated !== 0;
525 525
 			
526
-		}
526
+        }
527 527
 
528
-		return false;		
529
-	}
528
+        return false;		
529
+    }
530 530
 	
531 531
 	
532
-	/**
533
-	 * Checks whether a discount exists in the database or not
534
-	 * 
535
-	 * @since 1.0.15
536
-	 */
537
-	public function exists(){
538
-		return ! empty( $this->ID );
539
-	}
532
+    /**
533
+     * Checks whether a discount exists in the database or not
534
+     * 
535
+     * @since 1.0.15
536
+     */
537
+    public function exists(){
538
+        return ! empty( $this->ID );
539
+    }
540 540
 	
541
-	// Boolean methods
541
+    // Boolean methods
542 542
 	
543
-	/**
544
-	 * Checks the discount type.
545
-	 * 
546
-	 * 
547
-	 * @param  string $type the discount type to check against
548
-	 * @since 1.0.15
549
-	 * @return bool
550
-	 */
551
-	public function is_type( $type ) {
552
-		return $this->type == $type;
553
-	}
543
+    /**
544
+     * Checks the discount type.
545
+     * 
546
+     * 
547
+     * @param  string $type the discount type to check against
548
+     * @since 1.0.15
549
+     * @return bool
550
+     */
551
+    public function is_type( $type ) {
552
+        return $this->type == $type;
553
+    }
554 554
 	
555
-	/**
556
-	 * Checks whether the discount is published or not
557
-	 * 
558
-	 * @since 1.0.15
559
-	 * @return bool
560
-	 */
561
-	public function is_active() {
562
-		return $this->status == 'publish';
563
-	}
555
+    /**
556
+     * Checks whether the discount is published or not
557
+     * 
558
+     * @since 1.0.15
559
+     * @return bool
560
+     */
561
+    public function is_active() {
562
+        return $this->status == 'publish';
563
+    }
564 564
 	
565
-	/**
566
-	 * Checks whether the discount is has exided the usage limit or not
567
-	 * 
568
-	 * @since 1.0.15
569
-	 * @return bool
570
-	 */
571
-	public function has_exceeded_limit() {
572
-		if( empty( $this->max_uses ) || empty( $this->uses ) ) { 
573
-			return false ;
574
-		}
565
+    /**
566
+     * Checks whether the discount is has exided the usage limit or not
567
+     * 
568
+     * @since 1.0.15
569
+     * @return bool
570
+     */
571
+    public function has_exceeded_limit() {
572
+        if( empty( $this->max_uses ) || empty( $this->uses ) ) { 
573
+            return false ;
574
+        }
575 575
 		
576
-		$exceeded =  $this->uses >= $this->max_uses;
577
-		return apply_filters( 'wpinv_is_discount_maxed_out', $exceeded, $this->ID, $this, $this->code );
578
-	}
576
+        $exceeded =  $this->uses >= $this->max_uses;
577
+        return apply_filters( 'wpinv_is_discount_maxed_out', $exceeded, $this->ID, $this, $this->code );
578
+    }
579 579
 	
580
-	/**
581
-	 * Checks if the discount is expired
582
-	 * 
583
-	 * @since 1.0.15
584
-	 * @return bool
585
-	 */
586
-	public function is_expired() {
587
-		$expired = empty ( $this->expiration ) ? false : current_time( 'timestamp' ) > strtotime( $this->expiration );
588
-		return apply_filters( 'wpinv_is_discount_expired', $expired, $this->ID, $this, $this->code );
589
-	}
590
-
591
-	/**
592
-	 * Checks the discount start date.
593
-	 * 
594
-	 * @since 1.0.15
595
-	 * @return bool
596
-	 */
597
-	public function has_started() {
598
-		$started = empty ( $this->start ) ? true : current_time( 'timestamp' ) > strtotime( $this->start );
599
-		return apply_filters( 'wpinv_is_discount_started', $started, $this->ID, $this, $this->code );		
600
-	}
580
+    /**
581
+     * Checks if the discount is expired
582
+     * 
583
+     * @since 1.0.15
584
+     * @return bool
585
+     */
586
+    public function is_expired() {
587
+        $expired = empty ( $this->expiration ) ? false : current_time( 'timestamp' ) > strtotime( $this->expiration );
588
+        return apply_filters( 'wpinv_is_discount_expired', $expired, $this->ID, $this, $this->code );
589
+    }
590
+
591
+    /**
592
+     * Checks the discount start date.
593
+     * 
594
+     * @since 1.0.15
595
+     * @return bool
596
+     */
597
+    public function has_started() {
598
+        $started = empty ( $this->start ) ? true : current_time( 'timestamp' ) > strtotime( $this->start );
599
+        return apply_filters( 'wpinv_is_discount_started', $started, $this->ID, $this, $this->code );		
600
+    }
601 601
 	
602
-	/**
603
-	 * Check if a discount is valid for a given item id.
604
-	 *
605
-	 * @param  int|int[]  $item_ids
606
-	 * @since 1.0.15
607
-	 * @return boolean
608
-	 */
609
-	public function is_valid_for_items( $item_ids ) {
602
+    /**
603
+     * Check if a discount is valid for a given item id.
604
+     *
605
+     * @param  int|int[]  $item_ids
606
+     * @since 1.0.15
607
+     * @return boolean
608
+     */
609
+    public function is_valid_for_items( $item_ids ) {
610 610
 		 
611
-		$item_ids = array_map( 'intval',  wpinv_parse_list( $item_ids ) );
612
-		$included = array_intersect( $item_ids, $this->items );
613
-		$excluded = array_intersect( $item_ids, $this->excluded_items );
614
-
615
-		if( ! empty( $this->excluded_items ) && ! empty( $excluded ) ) {
616
-			return false;
617
-		}
618
-
619
-		if( ! empty( $this->items ) && empty( $included ) ) {
620
-			return false;
621
-		}
622
-		return true;
623
-	}
611
+        $item_ids = array_map( 'intval',  wpinv_parse_list( $item_ids ) );
612
+        $included = array_intersect( $item_ids, $this->items );
613
+        $excluded = array_intersect( $item_ids, $this->excluded_items );
614
+
615
+        if( ! empty( $this->excluded_items ) && ! empty( $excluded ) ) {
616
+            return false;
617
+        }
618
+
619
+        if( ! empty( $this->items ) && empty( $included ) ) {
620
+            return false;
621
+        }
622
+        return true;
623
+    }
624 624
 	
625
-	/**
626
-	 * Check if a discount is valid for the given amount
627
-	 *
628
-	 * @param  float  $amount The amount to check against
629
-	 * @since 1.0.15
630
-	 * @return boolean
631
-	 */
632
-	public function is_valid_for_amount( $amount ) {
633
-		return $this->is_minimum_amount_met( $amount ) && $this->is_maximum_amount_met( $amount );
634
-	}
635
-
636
-	/**
637
-	 * Checks if the minimum amount is met
638
-	 *
639
-	 * @param  float  $amount The amount to check against
640
-	 * @since 1.0.15
641
-	 * @return boolean
642
-	 */
643
-	public function is_minimum_amount_met( $amount ) {
644
-		$amount = floatval( $amount );
645
-		$min_met= ! ( $this->min_total > 0 && $amount < $this->min_total );
646
-		return apply_filters( 'wpinv_is_discount_min_met', $min_met, $this->ID, $this, $this->code, $amount );
647
-	}
648
-
649
-	/**
650
-	 * Checks if the maximum amount is met
651
-	 *
652
-	 * @param  float  $amount The amount to check against
653
-	 * @since 1.0.15
654
-	 * @return boolean
655
-	 */
656
-	public function is_maximum_amount_met( $amount ) {
657
-		$amount = floatval( $amount );
658
-		$max_met= ! ( $this->max_total > 0 && $amount > $this->max_total );
659
-		return apply_filters( 'wpinv_is_discount_max_met', $max_met, $this->ID, $this, $this->code, $amount );
660
-	}
661
-
662
-	/**
663
-	 * Check if a discount is valid for the given user
664
-	 *
665
-	 * @param  int|string  $user
666
-	 * @since 1.0.15
667
-	 * @return boolean
668
-	 */
669
-	public function is_valid_for_user( $user ) {
670
-		global $wpi_checkout_id;
671
-
672
-		if( empty( $user ) || empty( $this->is_single_use ) ) {
673
-			return true;
674
-		}
675
-
676
-		$user_id = 0;
625
+    /**
626
+     * Check if a discount is valid for the given amount
627
+     *
628
+     * @param  float  $amount The amount to check against
629
+     * @since 1.0.15
630
+     * @return boolean
631
+     */
632
+    public function is_valid_for_amount( $amount ) {
633
+        return $this->is_minimum_amount_met( $amount ) && $this->is_maximum_amount_met( $amount );
634
+    }
635
+
636
+    /**
637
+     * Checks if the minimum amount is met
638
+     *
639
+     * @param  float  $amount The amount to check against
640
+     * @since 1.0.15
641
+     * @return boolean
642
+     */
643
+    public function is_minimum_amount_met( $amount ) {
644
+        $amount = floatval( $amount );
645
+        $min_met= ! ( $this->min_total > 0 && $amount < $this->min_total );
646
+        return apply_filters( 'wpinv_is_discount_min_met', $min_met, $this->ID, $this, $this->code, $amount );
647
+    }
648
+
649
+    /**
650
+     * Checks if the maximum amount is met
651
+     *
652
+     * @param  float  $amount The amount to check against
653
+     * @since 1.0.15
654
+     * @return boolean
655
+     */
656
+    public function is_maximum_amount_met( $amount ) {
657
+        $amount = floatval( $amount );
658
+        $max_met= ! ( $this->max_total > 0 && $amount > $this->max_total );
659
+        return apply_filters( 'wpinv_is_discount_max_met', $max_met, $this->ID, $this, $this->code, $amount );
660
+    }
661
+
662
+    /**
663
+     * Check if a discount is valid for the given user
664
+     *
665
+     * @param  int|string  $user
666
+     * @since 1.0.15
667
+     * @return boolean
668
+     */
669
+    public function is_valid_for_user( $user ) {
670
+        global $wpi_checkout_id;
671
+
672
+        if( empty( $user ) || empty( $this->is_single_use ) ) {
673
+            return true;
674
+        }
675
+
676
+        $user_id = 0;
677 677
         if ( is_int( $user ) ) {
678 678
             $user_id = absint( $user );
679 679
         } else if ( is_email( $user ) && $user_data = get_user_by( 'email', $user ) ) {
@@ -682,164 +682,164 @@  discard block
 block discarded – undo
682 682
             $user_id = $user_data->ID;
683 683
         } else if ( absint( $user ) > 0 ) {
684 684
             $user_id = absint( $user );
685
-		}
685
+        }
686 686
 
687
-		if ( empty( $user_id ) ) {
688
-			return true;
689
-		}
687
+        if ( empty( $user_id ) ) {
688
+            return true;
689
+        }
690 690
 		
691
-		// Get all payments with matching user id
691
+        // Get all payments with matching user id
692 692
         $payments = wpinv_get_invoices( array( 'user' => $user_id, 'limit' => false ) ); 
693
-		$code     = strtolower( $this->code );
693
+        $code     = strtolower( $this->code );
694 694
 
695
-		foreach ( $payments as $payment ) {
695
+        foreach ( $payments as $payment ) {
696 696
 
697
-			// Don't count discount used for current invoice checkout.
698
-			if ( ! empty( $wpi_checkout_id ) && $wpi_checkout_id == $payment->ID ) {
699
-				continue;
700
-			}
697
+            // Don't count discount used for current invoice checkout.
698
+            if ( ! empty( $wpi_checkout_id ) && $wpi_checkout_id == $payment->ID ) {
699
+                continue;
700
+            }
701 701
 			
702
-			if ( $payment->has_status( array( 'wpi-cancelled', 'wpi-failed' ) ) ) {
703
-				continue;
704
-			}
705
-
706
-			$discounts = $payment->get_discounts( true );
707
-			if ( empty( $discounts ) ) {
708
-				continue;
709
-			}
710
-
711
-			$discounts = array_map( 'strtolower', wpinv_parse_list( $discounts ) );
712
-			if ( ! empty( $discounts ) && in_array( $code, $discounts ) ) {
713
-				return false;
714
-			}
715
-		}
716
-
717
-		return true;
718
-	}
719
-
720
-	/**
721
-	 * Deletes the discount from the database
722
-	 *
723
-	 * @since 1.0.15
724
-	 * @return boolean
725
-	 */
726
-	public function remove() {
727
-
728
-		if ( empty( $this->ID ) ) {
729
-			return true;
730
-		}
731
-
732
-		do_action( 'wpinv_pre_delete_discount', $this->ID, $this->data );
733
-		wp_cache_delete( $this->ID, 'WPInv_Discounts' );
734
-    	wp_delete_post( $this->ID, true );
735
-		wp_cache_delete( $this->code, 'WPInv_Discount_Codes' );
736
-    	do_action( 'wpinv_post_delete_discount', $this->ID, $this->data );
737
-
738
-		$this->ID = null;
739
-		$this->data['id'] = null;
740
-		return true;
741
-	}
742
-
743
-	/**
744
-	 * Increases a discount's usage.
745
-	 *
746
-	 * @since 1.0.15
747
-	 * @param int $by The number of usages to increas by.
748
-	 * @return int
749
-	 */
750
-	public function increase_usage( $by = 1 ) {
751
-
752
-		$this->uses = $this->uses + $by;
753
-
754
-		if( $this->uses  < 0 ) {
755
-			$this->uses = 0;
756
-			update_post_meta( $this->ID, "_wpi_discount_uses", 0 );
757
-		}
758
-
759
-		$this->save();
760
-
761
-		if( $by > 0 ) {
762
-			do_action( 'wpinv_discount_increase_use_count', $this->uses, $this->ID, $this->code, $by );
763
-		} else {
764
-			do_action( 'wpinv_discount_decrease_use_count', $this->uses, $this->ID, $this->code, absint( $by ) );
765
-		}
702
+            if ( $payment->has_status( array( 'wpi-cancelled', 'wpi-failed' ) ) ) {
703
+                continue;
704
+            }
705
+
706
+            $discounts = $payment->get_discounts( true );
707
+            if ( empty( $discounts ) ) {
708
+                continue;
709
+            }
710
+
711
+            $discounts = array_map( 'strtolower', wpinv_parse_list( $discounts ) );
712
+            if ( ! empty( $discounts ) && in_array( $code, $discounts ) ) {
713
+                return false;
714
+            }
715
+        }
716
+
717
+        return true;
718
+    }
719
+
720
+    /**
721
+     * Deletes the discount from the database
722
+     *
723
+     * @since 1.0.15
724
+     * @return boolean
725
+     */
726
+    public function remove() {
727
+
728
+        if ( empty( $this->ID ) ) {
729
+            return true;
730
+        }
731
+
732
+        do_action( 'wpinv_pre_delete_discount', $this->ID, $this->data );
733
+        wp_cache_delete( $this->ID, 'WPInv_Discounts' );
734
+        wp_delete_post( $this->ID, true );
735
+        wp_cache_delete( $this->code, 'WPInv_Discount_Codes' );
736
+        do_action( 'wpinv_post_delete_discount', $this->ID, $this->data );
737
+
738
+        $this->ID = null;
739
+        $this->data['id'] = null;
740
+        return true;
741
+    }
742
+
743
+    /**
744
+     * Increases a discount's usage.
745
+     *
746
+     * @since 1.0.15
747
+     * @param int $by The number of usages to increas by.
748
+     * @return int
749
+     */
750
+    public function increase_usage( $by = 1 ) {
751
+
752
+        $this->uses = $this->uses + $by;
753
+
754
+        if( $this->uses  < 0 ) {
755
+            $this->uses = 0;
756
+            update_post_meta( $this->ID, "_wpi_discount_uses", 0 );
757
+        }
758
+
759
+        $this->save();
760
+
761
+        if( $by > 0 ) {
762
+            do_action( 'wpinv_discount_increase_use_count', $this->uses, $this->ID, $this->code, $by );
763
+        } else {
764
+            do_action( 'wpinv_discount_decrease_use_count', $this->uses, $this->ID, $this->code, absint( $by ) );
765
+        }
766 766
 		
767
-		return $this->uses;
768
-	}
769
-
770
-	/**
771
-	 * Retrieves discount data
772
-	 *
773
-	 * @since 1.0.15
774
-	 * @return array
775
-	 */
776
-	public function get_data() {
777
-		$return = array();
778
-		foreach( array_keys( $this->data ) as $key ) {
779
-			$return[ $key ] = $this->get( $key );
780
-		}
781
-		return $return;
782
-	}
783
-
784
-	/**
785
-	 * Retrieves discount data as json
786
-	 *
787
-	 * @since 1.0.15
788
-	 * @return string|false
789
-	 */
790
-	public function get_data_as_json() {
791
-		return wp_json_encode( $this->get_data() );
792
-	}
793
-
794
-	/**
795
-	 * Checks if a discount can only be used once per user.
796
-	 *
797
-	 * @since 1.0.15
798
-	 * @return bool
799
-	 */
800
-	public function get_is_single_use() {
801
-		return (bool) apply_filters( 'wpinv_is_discount_single_use', $this->data['is_single_use'], $this->ID, $this, $this->code );
802
-	}
803
-
804
-	/**
805
-	 * Checks if a discount is recurring.
806
-	 *
807
-	 * @since 1.0.15
808
-	 * @return bool
809
-	 */
810
-	public function get_is_recurring() {
811
-		return (bool) apply_filters( 'wpinv_is_discount_recurring', $this->data['is_recurring'], $this->ID, $this->code, $this );
812
-	}
813
-
814
-	/**
815
-	 * Returns a discount's included items.
816
-	 *
817
-	 * @since 1.0.15
818
-	 * @return array
819
-	 */
820
-	public function get_items() {
821
-		return wpinv_parse_list( apply_filters( 'wpinv_get_discount_item_reqs', $this->data['items'], $this->ID, $this, $this->code ) );
822
-	}
823
-
824
-	/**
825
-	 * Returns a discount's discounted amount.
826
-	 *
827
-	 * @since 1.0.15
828
-	 * @return float
829
-	 */
830
-	public function get_discounted_amount( $amount ) {
831
-
832
-		if ( $this->type == 'flat' ) {
767
+        return $this->uses;
768
+    }
769
+
770
+    /**
771
+     * Retrieves discount data
772
+     *
773
+     * @since 1.0.15
774
+     * @return array
775
+     */
776
+    public function get_data() {
777
+        $return = array();
778
+        foreach( array_keys( $this->data ) as $key ) {
779
+            $return[ $key ] = $this->get( $key );
780
+        }
781
+        return $return;
782
+    }
783
+
784
+    /**
785
+     * Retrieves discount data as json
786
+     *
787
+     * @since 1.0.15
788
+     * @return string|false
789
+     */
790
+    public function get_data_as_json() {
791
+        return wp_json_encode( $this->get_data() );
792
+    }
793
+
794
+    /**
795
+     * Checks if a discount can only be used once per user.
796
+     *
797
+     * @since 1.0.15
798
+     * @return bool
799
+     */
800
+    public function get_is_single_use() {
801
+        return (bool) apply_filters( 'wpinv_is_discount_single_use', $this->data['is_single_use'], $this->ID, $this, $this->code );
802
+    }
803
+
804
+    /**
805
+     * Checks if a discount is recurring.
806
+     *
807
+     * @since 1.0.15
808
+     * @return bool
809
+     */
810
+    public function get_is_recurring() {
811
+        return (bool) apply_filters( 'wpinv_is_discount_recurring', $this->data['is_recurring'], $this->ID, $this->code, $this );
812
+    }
813
+
814
+    /**
815
+     * Returns a discount's included items.
816
+     *
817
+     * @since 1.0.15
818
+     * @return array
819
+     */
820
+    public function get_items() {
821
+        return wpinv_parse_list( apply_filters( 'wpinv_get_discount_item_reqs', $this->data['items'], $this->ID, $this, $this->code ) );
822
+    }
823
+
824
+    /**
825
+     * Returns a discount's discounted amount.
826
+     *
827
+     * @since 1.0.15
828
+     * @return float
829
+     */
830
+    public function get_discounted_amount( $amount ) {
831
+
832
+        if ( $this->type == 'flat' ) {
833 833
             $amount = $amount - $this->amount;
834
-		} else {
834
+        } else {
835 835
             $amount = $amount - ( $amount * ( $this->amount / 100 ) );
836
-		}
836
+        }
837 837
 
838
-		if ( $amount < 0 ) {
839
-			$amount = 0;
840
-		}
838
+        if ( $amount < 0 ) {
839
+            $amount = 0;
840
+        }
841 841
 
842
-		return apply_filters( 'wpinv_discounted_amount', $amount, $this->ID, $this, $this->code, $this->amount );
843
-	}
842
+        return apply_filters( 'wpinv_discounted_amount', $amount, $this->ID, $this, $this->code, $this->amount );
843
+    }
844 844
 	
845 845
 }
Please login to merge, or discard this patch.
includes/wpinv-helper-functions.php 1 patch
Indentation   +13 added lines, -13 removed lines patch added patch discarded remove patch
@@ -700,7 +700,7 @@  discard block
 block discarded – undo
700 700
 }
701 701
 
702 702
 function wpinv_get_php_arg_separator_output() {
703
-	return ini_get( 'arg_separator.output' );
703
+    return ini_get( 'arg_separator.output' );
704 704
 }
705 705
 
706 706
 function wpinv_rgb_from_hex( $color ) {
@@ -1038,11 +1038,11 @@  discard block
 block discarded – undo
1038 1038
  * @return array Sanitized array of values.
1039 1039
  */
1040 1040
 function wpinv_parse_list( $list ) {
1041
-	if ( ! is_array( $list ) ) {
1042
-		return preg_split( '/[\s,]+/', $list, -1, PREG_SPLIT_NO_EMPTY );
1043
-	}
1041
+    if ( ! is_array( $list ) ) {
1042
+        return preg_split( '/[\s,]+/', $list, -1, PREG_SPLIT_NO_EMPTY );
1043
+    }
1044 1044
 
1045
-	return $list;
1045
+    return $list;
1046 1046
 }
1047 1047
 
1048 1048
 /**
@@ -1062,9 +1062,9 @@  discard block
 block discarded – undo
1062 1062
     }
1063 1063
 
1064 1064
     $data = apply_filters( "wpinv_get_$key", include WPINV_PLUGIN_DIR . "includes/data/$key.php" );
1065
-	wp_cache_set( "wpinv-$key", $data, 'wpinv' );
1065
+    wp_cache_set( "wpinv-$key", $data, 'wpinv' );
1066 1066
 
1067
-	return $data;
1067
+    return $data;
1068 1068
 }
1069 1069
 
1070 1070
 /**
@@ -1093,17 +1093,17 @@  discard block
 block discarded – undo
1093 1093
  */
1094 1094
 function wpinv_clean( $var ) {
1095 1095
 
1096
-	if ( is_array( $var ) ) {
1097
-		return array_map( 'wpinv_clean', $var );
1096
+    if ( is_array( $var ) ) {
1097
+        return array_map( 'wpinv_clean', $var );
1098 1098
     }
1099 1099
 
1100 1100
     if ( is_object( $var ) ) {
1101
-		$object_vars = get_object_vars( $var );
1102
-		foreach ( $object_vars as $property_name => $property_value ) {
1103
-			$var->$property_name = wpinv_clean( $property_value );
1101
+        $object_vars = get_object_vars( $var );
1102
+        foreach ( $object_vars as $property_name => $property_value ) {
1103
+            $var->$property_name = wpinv_clean( $property_value );
1104 1104
         }
1105 1105
         return $var;
1106
-	}
1106
+    }
1107 1107
     
1108 1108
     return is_string( $var ) ? sanitize_text_field( $var ) : $var;
1109 1109
 }
1110 1110
\ No newline at end of file
Please login to merge, or discard this patch.
vendor/ayecode/ayecode-connect-helper/ayecode-connect-helper.php 1 patch
Indentation   +310 added lines, -310 removed lines patch added patch discarded remove patch
@@ -1,271 +1,271 @@  discard block
 block discarded – undo
1 1
 <?php
2 2
 
3 3
 if ( ! defined( 'ABSPATH' ) ) {
4
-	exit;
4
+    exit;
5 5
 }
6 6
 
7 7
 if ( ! class_exists( "AyeCode_Connect_Helper" ) ) {
8
-	/**
9
-	 * Allow the quick setup and connection of our AyeCode Connect plugin.
10
-	 *
11
-	 * Class AyeCode_Connect_Helper
12
-	 */
13
-	class AyeCode_Connect_Helper {
14
-
15
-		// Hold the version number
16
-		var $version = "1.0.3";
17
-
18
-		// Hold the default strings.
19
-		var $strings = array();
20
-
21
-		// Hold the default pages.
22
-		var $pages = array();
23
-
24
-		/**
25
-		 * The constructor.
26
-		 *
27
-		 * AyeCode_Connect_Helper constructor.
28
-		 *
29
-		 * @param array $strings
30
-		 * @param array $pages
31
-		 */
32
-		public function __construct( $strings = array(), $pages = array() ) {
33
-
34
-			// Only fire if not localhost and the current user has the right permissions.
35
-			if ( ! $this->is_localhost() && current_user_can( 'manage_options' ) ) {
36
-
37
-
38
-				// set default strings
39
-				$default_strings = array(
40
-					'connect_title'     => __( "Thanks for choosing an AyeCode Product!" ),
41
-					'connect_external'  => __( "Please confirm you wish to connect your site?" ),
42
-					'connect'           => sprintf( __( "<strong>Have a license?</strong> Forget about entering license keys or downloading zip files, connect your site for instant access. %slearn more%s" ), "<a href='https://ayecode.io/introducing-ayecode-connect/' target='_blank'>", "</a>" ),
43
-					'connect_button'    => __( "Connect Site" ),
44
-					'connecting_button' => __( "Connecting..." ),
45
-					'error_localhost'   => __( "This service will only work with a live domain, not a localhost." ),
46
-					'error'             => __( "Something went wrong, please refresh and try again." ),
47
-				);
48
-				$this->strings   = array_merge( $default_strings, $strings );
49
-
50
-
51
-				// set default pages
52
-				$default_pages = array();
53
-				$this->pages   = array_merge( $default_pages, $pages );
54
-
55
-				// maybe show connect site notice
56
-				add_action( 'admin_notices', array( $this, 'ayecode_connect_install_notice' ) );
57
-
58
-				// add ajax action if not already added
59
-				if ( ! has_action( 'wp_ajax_ayecode_connect_helper' ) ) {
60
-					add_action( 'wp_ajax_ayecode_connect_helper', array( $this, 'ayecode_connect_install' ) );
61
-				}
62
-			}
63
-
64
-			// add ajax action if not already added
65
-			if ( ! has_action( 'wp_ajax_nopriv_ayecode_connect_helper_installed' ) ) {
66
-				add_action( 'wp_ajax_nopriv_ayecode_connect_helper_installed', array( $this, 'ayecode_connect_helper_installed' ) );
67
-			}
68
-
69
-		}
70
-
71
-		/**
72
-		 * Give a way to check we can connect via a external redirect.
73
-		 */
74
-		public function ayecode_connect_helper_installed(){
75
-			$active = array(
76
-				'gd'    =>  defined('GEODIRECTORY_VERSION') && version_compare(GEODIRECTORY_VERSION,'2.0.0.79','>') ? 1 : 0,
77
-				'uwp'    =>  defined('USERSWP_VERSION') && version_compare(USERSWP_VERSION,'1.2.1.5','>') ? 1 : 0,
78
-				'wpi'    =>  defined('WPINV_VERSION') && version_compare(WPINV_VERSION,'1.0.14','>') ? 1 : 0,
79
-			);
80
-			wp_send_json_success( $active );
81
-			wp_die();
82
-		}
83
-
84
-		/**
85
-		 * Get slug from path
86
-		 *
87
-		 * @param  string $key
88
-		 *
89
-		 * @return string
90
-		 */
91
-		private function format_plugin_slug( $key ) {
92
-			$slug = explode( '/', $key );
93
-			$slug = explode( '.', end( $slug ) );
94
-
95
-			return $slug[0];
96
-		}
97
-
98
-		/**
99
-		 * Install and activate the AyeCode Connect Plugin
100
-		 */
101
-		public function ayecode_connect_install() {
102
-
103
-			// bail if localhost
104
-			if ( $this->is_localhost() ) {
105
-				wp_send_json_error( $this->strings['error_localhost'] );
106
-			}
107
-
108
-			// Explicitly clear the event.
109
-			wp_clear_scheduled_hook( 'geodir_plugin_background_installer', func_get_args() );
110
-
111
-			$success     = true;
112
-			$plugin_slug = "ayecode-connect";
113
-			if ( ! empty( $plugin_slug ) ) {
114
-				require_once( ABSPATH . 'wp-admin/includes/file.php' );
115
-				require_once( ABSPATH . 'wp-admin/includes/plugin-install.php' );
116
-				require_once( ABSPATH . 'wp-admin/includes/class-wp-upgrader.php' );
117
-				require_once( ABSPATH . 'wp-admin/includes/plugin.php' );
118
-
119
-				WP_Filesystem();
120
-
121
-				$skin              = new Automatic_Upgrader_Skin;
122
-				$upgrader          = new WP_Upgrader( $skin );
123
-				$installed_plugins = array_map( array( $this, 'format_plugin_slug' ), array_keys( get_plugins() ) );
124
-				$plugin_slug       = $plugin_slug;
125
-				$plugin            = $plugin_slug . '/' . $plugin_slug . '.php';
126
-				$installed         = false;
127
-				$activate          = false;
128
-
129
-				// See if the plugin is installed already
130
-				if ( in_array( $plugin_slug, $installed_plugins ) ) {
131
-					$installed = true;
132
-					$activate  = ! is_plugin_active( $plugin );
133
-				}
134
-
135
-				// Install this thing!
136
-				if ( ! $installed ) {
137
-
138
-					// Suppress feedback
139
-					ob_start();
140
-
141
-					try {
142
-						$plugin_information = plugins_api( 'plugin_information', array(
143
-							'slug'   => $plugin_slug,
144
-							'fields' => array(
145
-								'short_description' => false,
146
-								'sections'          => false,
147
-								'requires'          => false,
148
-								'rating'            => false,
149
-								'ratings'           => false,
150
-								'downloaded'        => false,
151
-								'last_updated'      => false,
152
-								'added'             => false,
153
-								'tags'              => false,
154
-								'homepage'          => false,
155
-								'donate_link'       => false,
156
-								'author_profile'    => false,
157
-								'author'            => false,
158
-							),
159
-						) );
160
-
161
-						if ( is_wp_error( $plugin_information ) ) {
162
-							throw new Exception( $plugin_information->get_error_message() );
163
-						}
164
-
165
-						$package  = $plugin_information->download_link;
166
-						$download = $upgrader->download_package( $package );
167
-
168
-						if ( is_wp_error( $download ) ) {
169
-							throw new Exception( $download->get_error_message() );
170
-						}
171
-
172
-						$working_dir = $upgrader->unpack_package( $download, true );
173
-
174
-						if ( is_wp_error( $working_dir ) ) {
175
-							throw new Exception( $working_dir->get_error_message() );
176
-						}
177
-
178
-						$result = $upgrader->install_package( array(
179
-							'source'                      => $working_dir,
180
-							'destination'                 => WP_PLUGIN_DIR,
181
-							'clear_destination'           => false,
182
-							'abort_if_destination_exists' => false,
183
-							'clear_working'               => true,
184
-							'hook_extra'                  => array(
185
-								'type'   => 'plugin',
186
-								'action' => 'install',
187
-							),
188
-						) );
189
-
190
-						if ( is_wp_error( $result ) ) {
191
-							throw new Exception( $result->get_error_message() );
192
-						}
193
-
194
-						$activate = true;
195
-
196
-					} catch ( Exception $e ) {
197
-						$success = false;
198
-					}
199
-
200
-					// Discard feedback
201
-					ob_end_clean();
202
-				}
203
-
204
-				wp_clean_plugins_cache();
205
-
206
-				// Activate this thing
207
-				if ( $activate ) {
208
-					try {
209
-						$result = activate_plugin( $plugin );
210
-
211
-						if ( is_wp_error( $result ) ) {
212
-							$success = false;
213
-						} else {
214
-							$success = true;
215
-						}
216
-					} catch ( Exception $e ) {
217
-						$success = false;
218
-					}
219
-				}
220
-			}
221
-
222
-			if ( $success && function_exists( 'ayecode_connect_args' ) ) {
223
-				ayecode_connect();// init
224
-				$args        = ayecode_connect_args();
225
-				$client      = new AyeCode_Connect( $args );
226
-				$redirect_to = ! empty( $_POST['redirect_to'] ) ? esc_url_raw( $_POST['redirect_to'] ) : '';
227
-				$redirect    = $client->build_connect_url( $redirect_to );
228
-				wp_send_json_success( array( 'connect_url' => $redirect ) );
229
-			} else {
230
-				wp_send_json_error( $this->strings['error_localhost'] );
231
-			}
232
-			wp_die();
233
-		}
234
-
235
-		/**
236
-		 * Check if maybe localhost.
237
-		 *
238
-		 * @return bool
239
-		 */
240
-		public function is_localhost() {
241
-			$localhost = false;
242
-
243
-			$host              = isset( $_SERVER['HTTP_HOST'] ) ? $_SERVER['HTTP_HOST'] : '';
244
-			$localhost_domains = array(
245
-				'localhost',
246
-				'localhost.localdomain',
247
-				'127.0.0.1',
248
-				'::1'
249
-			);
250
-
251
-			if ( in_array( $host, $localhost_domains ) ) {
252
-				$localhost = true;
253
-			}
254
-
255
-			return $localhost;
256
-		}
257
-
258
-		/**
259
-		 * Show notice to connect site.
260
-		 */
261
-		public function ayecode_connect_install_notice() {
262
-			if ( $this->maybe_show() ) {
263
-				$connect_title_string     = $this->strings['connect_title'];
264
-				$connect_external_string  = $this->strings['connect_external'];
265
-				$connect_string           = $this->strings['connect'];
266
-				$connect_button_string    = $this->strings['connect_button'];
267
-				$connecting_button_string = $this->strings['connecting_button'];
268
-				?>
8
+    /**
9
+     * Allow the quick setup and connection of our AyeCode Connect plugin.
10
+     *
11
+     * Class AyeCode_Connect_Helper
12
+     */
13
+    class AyeCode_Connect_Helper {
14
+
15
+        // Hold the version number
16
+        var $version = "1.0.3";
17
+
18
+        // Hold the default strings.
19
+        var $strings = array();
20
+
21
+        // Hold the default pages.
22
+        var $pages = array();
23
+
24
+        /**
25
+         * The constructor.
26
+         *
27
+         * AyeCode_Connect_Helper constructor.
28
+         *
29
+         * @param array $strings
30
+         * @param array $pages
31
+         */
32
+        public function __construct( $strings = array(), $pages = array() ) {
33
+
34
+            // Only fire if not localhost and the current user has the right permissions.
35
+            if ( ! $this->is_localhost() && current_user_can( 'manage_options' ) ) {
36
+
37
+
38
+                // set default strings
39
+                $default_strings = array(
40
+                    'connect_title'     => __( "Thanks for choosing an AyeCode Product!" ),
41
+                    'connect_external'  => __( "Please confirm you wish to connect your site?" ),
42
+                    'connect'           => sprintf( __( "<strong>Have a license?</strong> Forget about entering license keys or downloading zip files, connect your site for instant access. %slearn more%s" ), "<a href='https://ayecode.io/introducing-ayecode-connect/' target='_blank'>", "</a>" ),
43
+                    'connect_button'    => __( "Connect Site" ),
44
+                    'connecting_button' => __( "Connecting..." ),
45
+                    'error_localhost'   => __( "This service will only work with a live domain, not a localhost." ),
46
+                    'error'             => __( "Something went wrong, please refresh and try again." ),
47
+                );
48
+                $this->strings   = array_merge( $default_strings, $strings );
49
+
50
+
51
+                // set default pages
52
+                $default_pages = array();
53
+                $this->pages   = array_merge( $default_pages, $pages );
54
+
55
+                // maybe show connect site notice
56
+                add_action( 'admin_notices', array( $this, 'ayecode_connect_install_notice' ) );
57
+
58
+                // add ajax action if not already added
59
+                if ( ! has_action( 'wp_ajax_ayecode_connect_helper' ) ) {
60
+                    add_action( 'wp_ajax_ayecode_connect_helper', array( $this, 'ayecode_connect_install' ) );
61
+                }
62
+            }
63
+
64
+            // add ajax action if not already added
65
+            if ( ! has_action( 'wp_ajax_nopriv_ayecode_connect_helper_installed' ) ) {
66
+                add_action( 'wp_ajax_nopriv_ayecode_connect_helper_installed', array( $this, 'ayecode_connect_helper_installed' ) );
67
+            }
68
+
69
+        }
70
+
71
+        /**
72
+         * Give a way to check we can connect via a external redirect.
73
+         */
74
+        public function ayecode_connect_helper_installed(){
75
+            $active = array(
76
+                'gd'    =>  defined('GEODIRECTORY_VERSION') && version_compare(GEODIRECTORY_VERSION,'2.0.0.79','>') ? 1 : 0,
77
+                'uwp'    =>  defined('USERSWP_VERSION') && version_compare(USERSWP_VERSION,'1.2.1.5','>') ? 1 : 0,
78
+                'wpi'    =>  defined('WPINV_VERSION') && version_compare(WPINV_VERSION,'1.0.14','>') ? 1 : 0,
79
+            );
80
+            wp_send_json_success( $active );
81
+            wp_die();
82
+        }
83
+
84
+        /**
85
+         * Get slug from path
86
+         *
87
+         * @param  string $key
88
+         *
89
+         * @return string
90
+         */
91
+        private function format_plugin_slug( $key ) {
92
+            $slug = explode( '/', $key );
93
+            $slug = explode( '.', end( $slug ) );
94
+
95
+            return $slug[0];
96
+        }
97
+
98
+        /**
99
+         * Install and activate the AyeCode Connect Plugin
100
+         */
101
+        public function ayecode_connect_install() {
102
+
103
+            // bail if localhost
104
+            if ( $this->is_localhost() ) {
105
+                wp_send_json_error( $this->strings['error_localhost'] );
106
+            }
107
+
108
+            // Explicitly clear the event.
109
+            wp_clear_scheduled_hook( 'geodir_plugin_background_installer', func_get_args() );
110
+
111
+            $success     = true;
112
+            $plugin_slug = "ayecode-connect";
113
+            if ( ! empty( $plugin_slug ) ) {
114
+                require_once( ABSPATH . 'wp-admin/includes/file.php' );
115
+                require_once( ABSPATH . 'wp-admin/includes/plugin-install.php' );
116
+                require_once( ABSPATH . 'wp-admin/includes/class-wp-upgrader.php' );
117
+                require_once( ABSPATH . 'wp-admin/includes/plugin.php' );
118
+
119
+                WP_Filesystem();
120
+
121
+                $skin              = new Automatic_Upgrader_Skin;
122
+                $upgrader          = new WP_Upgrader( $skin );
123
+                $installed_plugins = array_map( array( $this, 'format_plugin_slug' ), array_keys( get_plugins() ) );
124
+                $plugin_slug       = $plugin_slug;
125
+                $plugin            = $plugin_slug . '/' . $plugin_slug . '.php';
126
+                $installed         = false;
127
+                $activate          = false;
128
+
129
+                // See if the plugin is installed already
130
+                if ( in_array( $plugin_slug, $installed_plugins ) ) {
131
+                    $installed = true;
132
+                    $activate  = ! is_plugin_active( $plugin );
133
+                }
134
+
135
+                // Install this thing!
136
+                if ( ! $installed ) {
137
+
138
+                    // Suppress feedback
139
+                    ob_start();
140
+
141
+                    try {
142
+                        $plugin_information = plugins_api( 'plugin_information', array(
143
+                            'slug'   => $plugin_slug,
144
+                            'fields' => array(
145
+                                'short_description' => false,
146
+                                'sections'          => false,
147
+                                'requires'          => false,
148
+                                'rating'            => false,
149
+                                'ratings'           => false,
150
+                                'downloaded'        => false,
151
+                                'last_updated'      => false,
152
+                                'added'             => false,
153
+                                'tags'              => false,
154
+                                'homepage'          => false,
155
+                                'donate_link'       => false,
156
+                                'author_profile'    => false,
157
+                                'author'            => false,
158
+                            ),
159
+                        ) );
160
+
161
+                        if ( is_wp_error( $plugin_information ) ) {
162
+                            throw new Exception( $plugin_information->get_error_message() );
163
+                        }
164
+
165
+                        $package  = $plugin_information->download_link;
166
+                        $download = $upgrader->download_package( $package );
167
+
168
+                        if ( is_wp_error( $download ) ) {
169
+                            throw new Exception( $download->get_error_message() );
170
+                        }
171
+
172
+                        $working_dir = $upgrader->unpack_package( $download, true );
173
+
174
+                        if ( is_wp_error( $working_dir ) ) {
175
+                            throw new Exception( $working_dir->get_error_message() );
176
+                        }
177
+
178
+                        $result = $upgrader->install_package( array(
179
+                            'source'                      => $working_dir,
180
+                            'destination'                 => WP_PLUGIN_DIR,
181
+                            'clear_destination'           => false,
182
+                            'abort_if_destination_exists' => false,
183
+                            'clear_working'               => true,
184
+                            'hook_extra'                  => array(
185
+                                'type'   => 'plugin',
186
+                                'action' => 'install',
187
+                            ),
188
+                        ) );
189
+
190
+                        if ( is_wp_error( $result ) ) {
191
+                            throw new Exception( $result->get_error_message() );
192
+                        }
193
+
194
+                        $activate = true;
195
+
196
+                    } catch ( Exception $e ) {
197
+                        $success = false;
198
+                    }
199
+
200
+                    // Discard feedback
201
+                    ob_end_clean();
202
+                }
203
+
204
+                wp_clean_plugins_cache();
205
+
206
+                // Activate this thing
207
+                if ( $activate ) {
208
+                    try {
209
+                        $result = activate_plugin( $plugin );
210
+
211
+                        if ( is_wp_error( $result ) ) {
212
+                            $success = false;
213
+                        } else {
214
+                            $success = true;
215
+                        }
216
+                    } catch ( Exception $e ) {
217
+                        $success = false;
218
+                    }
219
+                }
220
+            }
221
+
222
+            if ( $success && function_exists( 'ayecode_connect_args' ) ) {
223
+                ayecode_connect();// init
224
+                $args        = ayecode_connect_args();
225
+                $client      = new AyeCode_Connect( $args );
226
+                $redirect_to = ! empty( $_POST['redirect_to'] ) ? esc_url_raw( $_POST['redirect_to'] ) : '';
227
+                $redirect    = $client->build_connect_url( $redirect_to );
228
+                wp_send_json_success( array( 'connect_url' => $redirect ) );
229
+            } else {
230
+                wp_send_json_error( $this->strings['error_localhost'] );
231
+            }
232
+            wp_die();
233
+        }
234
+
235
+        /**
236
+         * Check if maybe localhost.
237
+         *
238
+         * @return bool
239
+         */
240
+        public function is_localhost() {
241
+            $localhost = false;
242
+
243
+            $host              = isset( $_SERVER['HTTP_HOST'] ) ? $_SERVER['HTTP_HOST'] : '';
244
+            $localhost_domains = array(
245
+                'localhost',
246
+                'localhost.localdomain',
247
+                '127.0.0.1',
248
+                '::1'
249
+            );
250
+
251
+            if ( in_array( $host, $localhost_domains ) ) {
252
+                $localhost = true;
253
+            }
254
+
255
+            return $localhost;
256
+        }
257
+
258
+        /**
259
+         * Show notice to connect site.
260
+         */
261
+        public function ayecode_connect_install_notice() {
262
+            if ( $this->maybe_show() ) {
263
+                $connect_title_string     = $this->strings['connect_title'];
264
+                $connect_external_string  = $this->strings['connect_external'];
265
+                $connect_string           = $this->strings['connect'];
266
+                $connect_button_string    = $this->strings['connect_button'];
267
+                $connecting_button_string = $this->strings['connecting_button'];
268
+                ?>
269 269
 				<div class="notice notice-info acch-notice">
270 270
 					<span class="acch-float-left">
271 271
 						<svg width="61px" height="61px" viewBox="0 0 61 61" version="1.1"
@@ -304,8 +304,8 @@  discard block
 block discarded – undo
304 304
 						<h3 class="acch-title"><?php echo esc_attr( $connect_title_string ); ?></h3>
305 305
 					<p>
306 306
 						<?php
307
-						echo $connect_string;
308
-						?>
307
+                        echo $connect_string;
308
+                        ?>
309 309
 					</p>
310 310
 					</span>
311 311
 
@@ -318,9 +318,9 @@  discard block
 block discarded – undo
318 318
 				</div>
319 319
 
320 320
 				<?php
321
-				// only include the popup HTML if needed.
322
-				if ( ! empty( $_REQUEST['external-connect-request'] ) ) {
323
-					?>
321
+                // only include the popup HTML if needed.
322
+                if ( ! empty( $_REQUEST['external-connect-request'] ) ) {
323
+                    ?>
324 324
 					<div id="ayecode-connect-helper-external-confirm" style="display:none;">
325 325
 						<div class="noticex notice-info acch-notice" style="border: none;">
326 326
 					<span class="acch-float-left">
@@ -369,23 +369,23 @@  discard block
 block discarded – undo
369 369
 						</div>
370 370
 					</div>
371 371
 					<?php
372
-				}
373
-
374
-				// add required scripts
375
-				$this->script();
376
-			}
377
-		}
378
-
379
-		/**
380
-		 * Get the JS Script.
381
-		 */
382
-		public function script() {
383
-
384
-			// add thickbox if external request is requested
385
-			if ( ! empty( $_REQUEST['external-connect-request'] ) ) {
386
-				add_thickbox();
387
-			}
388
-			?>
372
+                }
373
+
374
+                // add required scripts
375
+                $this->script();
376
+            }
377
+        }
378
+
379
+        /**
380
+         * Get the JS Script.
381
+         */
382
+        public function script() {
383
+
384
+            // add thickbox if external request is requested
385
+            if ( ! empty( $_REQUEST['external-connect-request'] ) ) {
386
+                add_thickbox();
387
+            }
388
+            ?>
389 389
 			<style>
390 390
 				.acch-title {
391 391
 					margin: 0;
@@ -454,43 +454,43 @@  discard block
 block discarded – undo
454 454
 
455 455
 
456 456
 				<?php
457
-				// add thickbox if external request is requested
458
-				if(! empty( $_REQUEST['external-connect-request'] )) {
459
-				?>
457
+                // add thickbox if external request is requested
458
+                if(! empty( $_REQUEST['external-connect-request'] )) {
459
+                ?>
460 460
 				jQuery(function () {
461 461
 					setTimeout(function () {
462 462
 						tb_show("AyeCode Connect", "?TB_inline?width=300&height=80&inlineId=ayecode-connect-helper-external-confirm");
463 463
 					}, 200);
464 464
 				});
465 465
 				<?php
466
-				}
467
-				?>
466
+                }
467
+                ?>
468 468
 
469 469
 			</script>
470 470
 			<?php
471
-		}
472
-
473
-		/**
474
-		 * Decide what pages to show on.
475
-		 *
476
-		 * @return bool
477
-		 */
478
-		public function maybe_show() {
479
-			$show = false;
480
-
481
-			// check if on a page set to show
482
-			if ( isset( $_REQUEST['page'] ) && in_array( $_REQUEST['page'], $this->pages ) ) {
483
-
484
-				// check if not active and connected
485
-				if ( ! defined( 'AYECODE_CONNECT_VERSION' ) || ! get_option( 'ayecode_connect_blog_token' ) ) {
486
-					$show = true;
487
-				}
471
+        }
472
+
473
+        /**
474
+         * Decide what pages to show on.
475
+         *
476
+         * @return bool
477
+         */
478
+        public function maybe_show() {
479
+            $show = false;
480
+
481
+            // check if on a page set to show
482
+            if ( isset( $_REQUEST['page'] ) && in_array( $_REQUEST['page'], $this->pages ) ) {
483
+
484
+                // check if not active and connected
485
+                if ( ! defined( 'AYECODE_CONNECT_VERSION' ) || ! get_option( 'ayecode_connect_blog_token' ) ) {
486
+                    $show = true;
487
+                }
488 488
 
489
-			}
489
+            }
490 490
 
491
-			return $show;
492
-		}
491
+            return $show;
492
+        }
493 493
 
494
-	}
494
+    }
495 495
 
496 496
 }
Please login to merge, or discard this patch.