Passed
Push — master ( 7ebec5...2857a5 )
by Brian
12:31
created
includes/gateways/class-getpaid-authorize-net-gateway.php 1 patch
Indentation   +232 added lines, -232 removed lines patch added patch discarded remove patch
@@ -13,58 +13,58 @@  discard block
 block discarded – undo
13 13
 class GetPaid_Authorize_Net_Gateway extends GetPaid_Authorize_Net_Legacy_Gateway {
14 14
 
15 15
     /**
16
-	 * Payment method id.
17
-	 *
18
-	 * @var string
19
-	 */
16
+     * Payment method id.
17
+     *
18
+     * @var string
19
+     */
20 20
     public $id = 'authorizenet';
21 21
 
22 22
     /**
23
-	 * An array of features that this gateway supports.
24
-	 *
25
-	 * @var array
26
-	 */
23
+     * An array of features that this gateway supports.
24
+     *
25
+     * @var array
26
+     */
27 27
     protected $supports = array( 'subscription', 'sandbox', 'tokens', 'addons', 'single_subscription_group', 'multiple_subscription_groups' );
28 28
 
29 29
     /**
30
-	 * Payment method order.
31
-	 *
32
-	 * @var int
33
-	 */
30
+     * Payment method order.
31
+     *
32
+     * @var int
33
+     */
34 34
     public $order = 4;
35 35
 
36 36
     /**
37
-	 * Endpoint for requests from Authorize.net.
38
-	 *
39
-	 * @var string
40
-	 */
41
-	protected $notify_url;
42
-
43
-	/**
44
-	 * Endpoint for requests to Authorize.net.
45
-	 *
46
-	 * @var string
47
-	 */
37
+     * Endpoint for requests from Authorize.net.
38
+     *
39
+     * @var string
40
+     */
41
+    protected $notify_url;
42
+
43
+    /**
44
+     * Endpoint for requests to Authorize.net.
45
+     *
46
+     * @var string
47
+     */
48 48
     protected $endpoint;
49 49
 
50 50
     /**
51
-	 * Currencies this gateway is allowed for.
52
-	 *
53
-	 * @var array
54
-	 */
55
-	public $currencies = array( 'USD', 'CAD', 'GBP', 'DKK', 'NOK', 'PLN', 'SEK', 'AUD', 'EUR', 'NZD' );
51
+     * Currencies this gateway is allowed for.
52
+     *
53
+     * @var array
54
+     */
55
+    public $currencies = array( 'USD', 'CAD', 'GBP', 'DKK', 'NOK', 'PLN', 'SEK', 'AUD', 'EUR', 'NZD' );
56 56
 
57 57
     /**
58
-	 * URL to view a transaction.
59
-	 *
60
-	 * @var string
61
-	 */
58
+     * URL to view a transaction.
59
+     *
60
+     * @var string
61
+     */
62 62
     public $view_transaction_url = 'https://{sandbox}authorize.net/ui/themes/sandbox/Transaction/TransactionReceipt.aspx?transid=%s';
63 63
 
64 64
     /**
65
-	 * Class constructor.
66
-	 */
67
-	public function __construct() {
65
+     * Class constructor.
66
+     */
67
+    public function __construct() {
68 68
 
69 69
         $this->title                = __( 'Credit Card / Debit Card', 'invoicing' );
70 70
         $this->method_title         = __( 'Authorize.Net', 'invoicing' );
@@ -76,11 +76,11 @@  discard block
 block discarded – undo
76 76
     }
77 77
 
78 78
     /**
79
-	 * Displays the payment method select field.
80
-	 *
81
-	 * @param int $invoice_id 0 or invoice id.
82
-	 * @param GetPaid_Payment_Form $form Current payment form.
83
-	 */
79
+     * Displays the payment method select field.
80
+     *
81
+     * @param int $invoice_id 0 or invoice id.
82
+     * @param GetPaid_Payment_Form $form Current payment form.
83
+     */
84 84
     public function payment_fields( $invoice_id, $form ) {
85 85
 
86 86
         // Let the user select a payment method.
@@ -91,16 +91,16 @@  discard block
 block discarded – undo
91 91
     }
92 92
 
93 93
     /**
94
-	 * Creates a customer profile.
95
-	 *
96
-	 *
97
-	 * @param WPInv_Invoice $invoice Invoice.
94
+     * Creates a customer profile.
95
+     *
96
+     *
97
+     * @param WPInv_Invoice $invoice Invoice.
98 98
      * @param array $submission_data Posted checkout fields.
99 99
      * @param bool $save Whether or not to save the payment as a token.
100 100
      * @link https://developer.authorize.net/api/reference/index.html#customer-profiles-create-customer-profile
101
-	 * @return string|WP_Error Payment profile id.
102
-	 */
103
-	public function create_customer_profile( $invoice, $submission_data, $save = true ) {
101
+     * @return string|WP_Error Payment profile id.
102
+     */
103
+    public function create_customer_profile( $invoice, $submission_data, $save = true ) {
104 104
 
105 105
         // Remove non-digits from the number
106 106
         $submission_data['authorizenet']['cc_number'] = preg_replace( '/\D/', '', $submission_data['authorizenet']['cc_number'] );
@@ -182,14 +182,14 @@  discard block
 block discarded – undo
182 182
     }
183 183
 
184 184
     /**
185
-	 * Retrieves a customer profile.
186
-	 *
187
-	 *
188
-	 * @param string $profile_id profile id.
189
-	 * @return string|WP_Error Profile id.
185
+     * Retrieves a customer profile.
186
+     *
187
+     *
188
+     * @param string $profile_id profile id.
189
+     * @return string|WP_Error Profile id.
190 190
      * @link https://developer.authorize.net/api/reference/index.html#customer-profiles-get-customer-profile
191
-	 */
192
-	public function get_customer_profile( $profile_id ) {
191
+     */
192
+    public function get_customer_profile( $profile_id ) {
193 193
 
194 194
         // Generate args.
195 195
         $args = array(
@@ -204,17 +204,17 @@  discard block
 block discarded – undo
204 204
     }
205 205
 
206 206
     /**
207
-	 * Creates a customer profile.
208
-	 *
209
-	 *
207
+     * Creates a customer profile.
208
+     *
209
+     *
210 210
      * @param string $profile_id profile id.
211
-	 * @param WPInv_Invoice $invoice Invoice.
211
+     * @param WPInv_Invoice $invoice Invoice.
212 212
      * @param array $submission_data Posted checkout fields.
213 213
      * @param bool $save Whether or not to save the payment as a token.
214 214
      * @link https://developer.authorize.net/api/reference/index.html#customer-profiles-create-customer-profile
215
-	 * @return string|WP_Error Profile id.
216
-	 */
217
-	public function create_customer_payment_profile( $customer_profile, $invoice, $submission_data, $save ) {
215
+     * @return string|WP_Error Profile id.
216
+     */
217
+    public function create_customer_payment_profile( $customer_profile, $invoice, $submission_data, $save ) {
218 218
 
219 219
         // Remove non-digits from the number
220 220
         $submission_data['authorizenet']['cc_number'] = preg_replace( '/\D/', '', $submission_data['authorizenet']['cc_number'] );
@@ -302,13 +302,13 @@  discard block
 block discarded – undo
302 302
     }
303 303
 
304 304
     /**
305
-	 * Retrieves payment details from cache.
306
-	 *
307
-	 *
305
+     * Retrieves payment details from cache.
306
+     *
307
+     *
308 308
      * @param array $payment_details.
309
-	 * @return array|false Profile id.
310
-	 */
311
-	public function retrieve_payment_profile_from_cache( $payment_details, $customer_profile, $invoice ) {
309
+     * @return array|false Profile id.
310
+     */
311
+    public function retrieve_payment_profile_from_cache( $payment_details, $customer_profile, $invoice ) {
312 312
 
313 313
         $cached_information = get_option( 'getpaid_authorize_net_cached_profiles', array() );
314 314
         $payment_details    = hash_hmac( 'sha256', json_encode( $payment_details ), SECURE_AUTH_KEY );
@@ -333,13 +333,13 @@  discard block
 block discarded – undo
333 333
     }
334 334
 
335 335
     /**
336
-	 * Securely adds payment details to cache.
337
-	 *
338
-	 *
336
+     * Securely adds payment details to cache.
337
+     *
338
+     *
339 339
      * @param array $payment_details.
340 340
      * @param string $payment_profile_id.
341
-	 */
342
-	public function add_payment_profile_to_cache( $payment_details, $payment_profile_id ) {
341
+     */
342
+    public function add_payment_profile_to_cache( $payment_details, $payment_profile_id ) {
343 343
 
344 344
         $cached_information = get_option( 'getpaid_authorize_net_cached_profiles', array() );
345 345
         $cached_information = is_array( $cached_information ) ? $cached_information : array();
@@ -351,15 +351,15 @@  discard block
 block discarded – undo
351 351
     }
352 352
 
353 353
     /**
354
-	 * Retrieves a customer payment profile.
355
-	 *
356
-	 *
357
-	 * @param string $customer_profile_id customer profile id.
354
+     * Retrieves a customer payment profile.
355
+     *
356
+     *
357
+     * @param string $customer_profile_id customer profile id.
358 358
      * @param string $payment_profile_id payment profile id.
359
-	 * @return string|WP_Error Profile id.
359
+     * @return string|WP_Error Profile id.
360 360
      * @link https://developer.authorize.net/api/reference/index.html#customer-profiles-get-customer-payment-profile
361
-	 */
362
-	public function get_customer_payment_profile( $customer_profile_id, $payment_profile_id ) {
361
+     */
362
+    public function get_customer_payment_profile( $customer_profile_id, $payment_profile_id ) {
363 363
 
364 364
         // Generate args.
365 365
         $args = array(
@@ -375,15 +375,15 @@  discard block
 block discarded – undo
375 375
     }
376 376
 
377 377
     /**
378
-	 * Charges a customer payment profile.
379
-	 *
378
+     * Charges a customer payment profile.
379
+     *
380 380
      * @param string $customer_profile_id customer profile id.
381 381
      * @param string $payment_profile_id payment profile id.
382
-	 * @param WPInv_Invoice $invoice Invoice.
382
+     * @param WPInv_Invoice $invoice Invoice.
383 383
      * @link https://developer.authorize.net/api/reference/index.html#payment-transactions-charge-a-customer-profile
384
-	 * @return WP_Error|object
385
-	 */
386
-	public function charge_customer_payment_profile( $customer_profile_id, $payment_profile_id, $invoice ) {
384
+     * @return WP_Error|object
385
+     */
386
+    public function charge_customer_payment_profile( $customer_profile_id, $payment_profile_id, $invoice ) {
387 387
 
388 388
         // Generate args.
389 389
         $args = array(
@@ -429,41 +429,41 @@  discard block
 block discarded – undo
429 429
     }
430 430
 
431 431
     /**
432
-	 * Processes a customer charge.
433
-	 *
432
+     * Processes a customer charge.
433
+     *
434 434
      * @param stdClass $result Api response.
435
-	 * @param WPInv_Invoice $invoice Invoice.
436
-	 */
437
-	public function process_charge_response( $result, $invoice ) {
435
+     * @param WPInv_Invoice $invoice Invoice.
436
+     */
437
+    public function process_charge_response( $result, $invoice ) {
438 438
 
439 439
         wpinv_clear_errors();
440
-		$response_code = (int) $result->transactionResponse->responseCode;
440
+        $response_code = (int) $result->transactionResponse->responseCode;
441 441
 
442
-		// Succeeded.
443
-		if ( 1 == $response_code || 4 == $response_code ) {
442
+        // Succeeded.
443
+        if ( 1 == $response_code || 4 == $response_code ) {
444 444
 
445
-			// Maybe set a transaction id.
446
-			if ( ! empty( $result->transactionResponse->transId ) ) {
447
-				$invoice->set_transaction_id( $result->transactionResponse->transId );
448
-			}
445
+            // Maybe set a transaction id.
446
+            if ( ! empty( $result->transactionResponse->transId ) ) {
447
+                $invoice->set_transaction_id( $result->transactionResponse->transId );
448
+            }
449 449
 
450
-			$invoice->add_note( sprintf( __( 'Authentication code: %1$s (%2$s).', 'invoicing' ), $result->transactionResponse->authCode, $result->transactionResponse->accountNumber ), false, false, true );
450
+            $invoice->add_note( sprintf( __( 'Authentication code: %1$s (%2$s).', 'invoicing' ), $result->transactionResponse->authCode, $result->transactionResponse->accountNumber ), false, false, true );
451 451
 
452
-			if ( 1 == $response_code ) {
453
-				return $invoice->mark_paid();
454
-			}
452
+            if ( 1 == $response_code ) {
453
+                return $invoice->mark_paid();
454
+            }
455 455
 
456
-			$invoice->set_status( 'wpi-onhold' );
457
-        	$invoice->add_note(
456
+            $invoice->set_status( 'wpi-onhold' );
457
+            $invoice->add_note(
458 458
                 sprintf(
459 459
                     __( 'Held for review: %s', 'invoicing' ),
460 460
                     $result->transactionResponse->messages->message[0]->description
461 461
                 )
462
-			);
462
+            );
463 463
 
464
-			return $invoice->save();
464
+            return $invoice->save();
465 465
 
466
-		}
466
+        }
467 467
 
468 468
         wpinv_set_error( 'card_declined', __( 'Credit card declined.', 'invoicing' ) );
469 469
 
@@ -475,13 +475,13 @@  discard block
 block discarded – undo
475 475
     }
476 476
 
477 477
     /**
478
-	 * Returns payment information.
479
-	 *
480
-	 *
481
-	 * @param array $card Card details.
482
-	 * @return array
483
-	 */
484
-	public function get_payment_information( $card ) {
478
+     * Returns payment information.
479
+     *
480
+     *
481
+     * @param array $card Card details.
482
+     * @return array
483
+     */
484
+    public function get_payment_information( $card ) {
485 485
         return array(
486 486
 
487 487
             'creditCard' => array(
@@ -494,25 +494,25 @@  discard block
 block discarded – undo
494 494
     }
495 495
 
496 496
     /**
497
-	 * Returns the customer profile meta name.
498
-	 *
499
-	 *
500
-	 * @param WPInv_Invoice $invoice Invoice.
501
-	 * @return string
502
-	 */
503
-	public function get_customer_profile_meta_name( $invoice ) {
497
+     * Returns the customer profile meta name.
498
+     *
499
+     *
500
+     * @param WPInv_Invoice $invoice Invoice.
501
+     * @return string
502
+     */
503
+    public function get_customer_profile_meta_name( $invoice ) {
504 504
         return $this->is_sandbox( $invoice ) ? 'getpaid_authorizenet_sandbox_customer_profile_id' : 'getpaid_authorizenet_customer_profile_id';
505 505
     }
506 506
 
507 507
     /**
508
-	 * Validates the submitted data.
509
-	 *
510
-	 *
511
-	 * @param array $submission_data Posted checkout fields.
508
+     * Validates the submitted data.
509
+     *
510
+     *
511
+     * @param array $submission_data Posted checkout fields.
512 512
      * @param WPInv_Invoice $invoice
513
-	 * @return WP_Error|string The payment profile id
514
-	 */
515
-	public function validate_submission_data( $submission_data, $invoice ) {
513
+     * @return WP_Error|string The payment profile id
514
+     */
515
+    public function validate_submission_data( $submission_data, $invoice ) {
516 516
 
517 517
         // Validate authentication details.
518 518
         $auth = $this->get_auth_params();
@@ -544,13 +544,13 @@  discard block
 block discarded – undo
544 544
     }
545 545
 
546 546
     /**
547
-	 * Returns invoice line items.
548
-	 *
549
-	 *
550
-	 * @param WPInv_Invoice $invoice Invoice.
551
-	 * @return array
552
-	 */
553
-	public function get_line_items( $invoice ) {
547
+     * Returns invoice line items.
548
+     *
549
+     *
550
+     * @param WPInv_Invoice $invoice Invoice.
551
+     * @return array
552
+     */
553
+    public function get_line_items( $invoice ) {
554 554
         $items = array();
555 555
 
556 556
         foreach ( $invoice->get_items() as $item ) {
@@ -587,15 +587,15 @@  discard block
 block discarded – undo
587 587
     }
588 588
 
589 589
     /**
590
-	 * Process Payment.
591
-	 *
592
-	 *
593
-	 * @param WPInv_Invoice $invoice Invoice.
594
-	 * @param array $submission_data Posted checkout fields.
595
-	 * @param GetPaid_Payment_Form_Submission $submission Checkout submission.
596
-	 * @return array
597
-	 */
598
-	public function process_payment( $invoice, $submission_data, $submission ) {
590
+     * Process Payment.
591
+     *
592
+     *
593
+     * @param WPInv_Invoice $invoice Invoice.
594
+     * @param array $submission_data Posted checkout fields.
595
+     * @param GetPaid_Payment_Form_Submission $submission Checkout submission.
596
+     * @return array
597
+     */
598
+    public function process_payment( $invoice, $submission_data, $submission ) {
599 599
 
600 600
         // Validate the submitted data.
601 601
         $payment_profile_id = $this->validate_submission_data( $submission_data, $invoice );
@@ -628,45 +628,45 @@  discard block
 block discarded – undo
628 628
 
629 629
         exit;
630 630
 
631
-	}
631
+    }
632 632
 
633
-	/**
634
-	 * Processes the initial payment.
635
-	 *
633
+    /**
634
+     * Processes the initial payment.
635
+     *
636 636
      * @param WPInv_Invoice $invoice Invoice.
637
-	 */
638
-	protected function process_initial_payment( $invoice ) {
637
+     */
638
+    protected function process_initial_payment( $invoice ) {
639 639
 
640
-		$payment_profile_id = get_post_meta( $invoice->get_id(), 'getpaid_authorizenet_profile_id', true );
640
+        $payment_profile_id = get_post_meta( $invoice->get_id(), 'getpaid_authorizenet_profile_id', true );
641 641
         $customer_profile   = get_user_meta( $invoice->get_user_id(), $this->get_customer_profile_meta_name( $invoice ), true );
642
-		$result             = $this->charge_customer_payment_profile( $customer_profile, $payment_profile_id, $invoice );
642
+        $result             = $this->charge_customer_payment_profile( $customer_profile, $payment_profile_id, $invoice );
643 643
 
644
-		// Do we have an error?
645
-		if ( is_wp_error( $result ) ) {
646
-			wpinv_set_error( $result->get_error_code(), $result->get_error_message() );
647
-			wpinv_send_back_to_checkout( $invoice );
648
-		}
644
+        // Do we have an error?
645
+        if ( is_wp_error( $result ) ) {
646
+            wpinv_set_error( $result->get_error_code(), $result->get_error_message() );
647
+            wpinv_send_back_to_checkout( $invoice );
648
+        }
649 649
 
650
-		// Process the response.
651
-		$this->process_charge_response( $result, $invoice );
650
+        // Process the response.
651
+        $this->process_charge_response( $result, $invoice );
652 652
 
653
-		if ( wpinv_get_errors() ) {
654
-			wpinv_send_back_to_checkout( $invoice );
655
-		}
653
+        if ( wpinv_get_errors() ) {
654
+            wpinv_send_back_to_checkout( $invoice );
655
+        }
656 656
 
657
-	}
657
+    }
658 658
 
659 659
     /**
660
-	 * Processes recurring payments.
661
-	 *
660
+     * Processes recurring payments.
661
+     *
662 662
      * @param WPInv_Invoice $invoice Invoice.
663 663
      * @param WPInv_Subscription[]|WPInv_Subscription $subscriptions Subscriptions.
664
-	 */
665
-	public function process_subscription( $invoice, $subscriptions ) {
664
+     */
665
+    public function process_subscription( $invoice, $subscriptions ) {
666 666
 
667 667
         // Check if there is an initial amount to charge.
668 668
         if ( (float) $invoice->get_total() > 0 ) {
669
-			$this->process_initial_payment( $invoice );
669
+            $this->process_initial_payment( $invoice );
670 670
         }
671 671
 
672 672
         // Activate the subscriptions.
@@ -684,36 +684,36 @@  discard block
 block discarded – undo
684 684
             }
685 685
         }
686 686
 
687
-		// Redirect to the success page.
687
+        // Redirect to the success page.
688 688
         wpinv_send_to_success_page( array( 'invoice_key' => $invoice->get_key() ) );
689 689
 
690 690
     }
691 691
 
692
-	/**
693
-	 * (Maybe) renews an authorize.net subscription profile.
694
-	 *
695
-	 *
692
+    /**
693
+     * (Maybe) renews an authorize.net subscription profile.
694
+     *
695
+     *
696 696
      * @param WPInv_Subscription $subscription
697
-	 */
698
-	public function maybe_renew_subscription( $subscription ) {
697
+     */
698
+    public function maybe_renew_subscription( $subscription ) {
699 699
 
700 700
         // Ensure its our subscription && it's active.
701 701
         if ( $this->id === $subscription->get_gateway() && $subscription->has_status( 'active trialling' ) ) {
702 702
             $this->renew_subscription( $subscription );
703 703
         }
704 704
 
705
-	}
705
+    }
706 706
 
707 707
     /**
708
-	 * Renews a subscription.
709
-	 *
708
+     * Renews a subscription.
709
+     *
710 710
      * @param WPInv_Subscription $subscription
711
-	 */
712
-	public function renew_subscription( $subscription ) {
711
+     */
712
+    public function renew_subscription( $subscription ) {
713 713
 
714
-		// Generate the renewal invoice.
715
-		$new_invoice = $subscription->create_payment();
716
-		$old_invoice = $subscription->get_parent_payment();
714
+        // Generate the renewal invoice.
715
+        $new_invoice = $subscription->create_payment();
716
+        $old_invoice = $subscription->get_parent_payment();
717 717
 
718 718
         if ( empty( $new_invoice ) ) {
719 719
             $old_invoice->add_note( __( 'Error generating a renewal invoice.', 'invoicing' ), false, false, false );
@@ -722,37 +722,37 @@  discard block
 block discarded – undo
722 722
         }
723 723
 
724 724
         // Charge the payment method.
725
-		$payment_profile_id = get_post_meta( $old_invoice->get_id(), 'getpaid_authorizenet_profile_id', true );
726
-		$customer_profile   = get_user_meta( $old_invoice->get_user_id(), $this->get_customer_profile_meta_name( $old_invoice ), true );
727
-		$result             = $this->charge_customer_payment_profile( $customer_profile, $payment_profile_id, $new_invoice );
728
-
729
-		// Do we have an error?
730
-		if ( is_wp_error( $result ) ) {
731
-
732
-			$old_invoice->add_note(
733
-				sprintf( __( 'Error renewing subscription : ( %s ).', 'invoicing' ), $result->get_error_message() ),
734
-				true,
735
-				false,
736
-				true
737
-			);
738
-			$subscription->failing();
739
-			return;
740
-
741
-		}
742
-
743
-		// Process the response.
744
-		$this->process_charge_response( $result, $new_invoice );
745
-
746
-		if ( wpinv_get_errors() ) {
747
-
748
-			$old_invoice->add_note(
749
-				sprintf( __( 'Error renewing subscription : ( %s ).', 'invoicing' ), getpaid_get_errors_html() ),
750
-				true,
751
-				false,
752
-				true
753
-			);
754
-			$subscription->failing();
755
-			return;
725
+        $payment_profile_id = get_post_meta( $old_invoice->get_id(), 'getpaid_authorizenet_profile_id', true );
726
+        $customer_profile   = get_user_meta( $old_invoice->get_user_id(), $this->get_customer_profile_meta_name( $old_invoice ), true );
727
+        $result             = $this->charge_customer_payment_profile( $customer_profile, $payment_profile_id, $new_invoice );
728
+
729
+        // Do we have an error?
730
+        if ( is_wp_error( $result ) ) {
731
+
732
+            $old_invoice->add_note(
733
+                sprintf( __( 'Error renewing subscription : ( %s ).', 'invoicing' ), $result->get_error_message() ),
734
+                true,
735
+                false,
736
+                true
737
+            );
738
+            $subscription->failing();
739
+            return;
740
+
741
+        }
742
+
743
+        // Process the response.
744
+        $this->process_charge_response( $result, $new_invoice );
745
+
746
+        if ( wpinv_get_errors() ) {
747
+
748
+            $old_invoice->add_note(
749
+                sprintf( __( 'Error renewing subscription : ( %s ).', 'invoicing' ), getpaid_get_errors_html() ),
750
+                true,
751
+                false,
752
+                true
753
+            );
754
+            $subscription->failing();
755
+            return;
756 756
 
757 757
         }
758 758
 
@@ -761,13 +761,13 @@  discard block
 block discarded – undo
761 761
     }
762 762
 
763 763
     /**
764
-	 * Processes invoice addons.
765
-	 *
766
-	 * @param WPInv_Invoice $invoice
767
-	 * @param GetPaid_Form_Item[] $items
768
-	 * @return WPInv_Invoice
769
-	 */
770
-	public function process_addons( $invoice, $items ) {
764
+     * Processes invoice addons.
765
+     *
766
+     * @param WPInv_Invoice $invoice
767
+     * @param GetPaid_Form_Item[] $items
768
+     * @return WPInv_Invoice
769
+     */
770
+    public function process_addons( $invoice, $items ) {
771 771
 
772 772
         global $getpaid_authorize_addons;
773 773
 
@@ -786,7 +786,7 @@  discard block
 block discarded – undo
786 786
         $invoice->recalculate_total();
787 787
 
788 788
         $payment_profile_id = get_post_meta( $invoice->get_id(), 'getpaid_authorizenet_profile_id', true );
789
-		$customer_profile   = get_user_meta( $invoice->get_user_id(), $this->get_customer_profile_meta_name( $invoice ), true );
789
+        $customer_profile   = get_user_meta( $invoice->get_user_id(), $this->get_customer_profile_meta_name( $invoice ), true );
790 790
 
791 791
         add_filter( 'getpaid_authorizenet_charge_customer_payment_profile_args', array( $this, 'filter_addons_request' ), 10, 2 );
792 792
         $result = $this->charge_customer_payment_profile( $customer_profile, $payment_profile_id, $invoice );
@@ -801,11 +801,11 @@  discard block
 block discarded – undo
801 801
     }
802 802
 
803 803
     /**
804
-	 * Processes invoice addons.
805
-	 *
804
+     * Processes invoice addons.
805
+     *
806 806
      * @param array $args
807
-	 * @return array
808
-	 */
807
+     * @return array
808
+     */
809 809
     public function filter_addons_request( $args ) {
810 810
 
811 811
         global $getpaid_authorize_addons;
@@ -839,11 +839,11 @@  discard block
 block discarded – undo
839 839
     }
840 840
 
841 841
     /**
842
-	 * Filters the gateway settings.
843
-	 *
844
-	 * @param array $admin_settings
845
-	 */
846
-	public function admin_settings( $admin_settings ) {
842
+     * Filters the gateway settings.
843
+     *
844
+     * @param array $admin_settings
845
+     */
846
+    public function admin_settings( $admin_settings ) {
847 847
 
848 848
         $currencies = sprintf(
849 849
             __( 'Supported Currencies: %s', 'invoicing' ),
@@ -883,7 +883,7 @@  discard block
 block discarded – undo
883 883
             'readonly' => true,
884 884
         );
885 885
 
886
-		return $admin_settings;
887
-	}
886
+        return $admin_settings;
887
+    }
888 888
 
889 889
 }
Please login to merge, or discard this patch.
includes/gateways/class-getpaid-manual-gateway.php 1 patch
Indentation   +37 added lines, -37 removed lines patch added patch discarded remove patch
@@ -13,30 +13,30 @@  discard block
 block discarded – undo
13 13
 class GetPaid_Manual_Gateway extends GetPaid_Payment_Gateway {
14 14
 
15 15
     /**
16
-	 * Payment method id.
17
-	 *
18
-	 * @var string
19
-	 */
16
+     * Payment method id.
17
+     *
18
+     * @var string
19
+     */
20 20
     public $id = 'manual';
21 21
 
22 22
     /**
23
-	 * An array of features that this gateway supports.
24
-	 *
25
-	 * @var array
26
-	 */
23
+     * An array of features that this gateway supports.
24
+     *
25
+     * @var array
26
+     */
27 27
     protected $supports = array( 'subscription', 'addons', 'single_subscription_group', 'multiple_subscription_groups' );
28 28
 
29 29
     /**
30
-	 * Payment method order.
31
-	 *
32
-	 * @var int
33
-	 */
34
-	public $order = 11;
30
+     * Payment method order.
31
+     *
32
+     * @var int
33
+     */
34
+    public $order = 11;
35 35
 
36 36
     /**
37
-	 * Class constructor.
38
-	 */
39
-	public function __construct() {
37
+     * Class constructor.
38
+     */
39
+    public function __construct() {
40 40
         parent::__construct();
41 41
 
42 42
         $this->title        = __( 'Test Gateway', 'invoicing' );
@@ -46,15 +46,15 @@  discard block
 block discarded – undo
46 46
     }
47 47
 
48 48
     /**
49
-	 * Process Payment.
50
-	 *
51
-	 *
52
-	 * @param WPInv_Invoice $invoice Invoice.
53
-	 * @param array $submission_data Posted checkout fields.
54
-	 * @param GetPaid_Payment_Form_Submission $submission Checkout submission.
55
-	 * @return array
56
-	 */
57
-	public function process_payment( $invoice, $submission_data, $submission ) {
49
+     * Process Payment.
50
+     *
51
+     *
52
+     * @param WPInv_Invoice $invoice Invoice.
53
+     * @param array $submission_data Posted checkout fields.
54
+     * @param GetPaid_Payment_Form_Submission $submission Checkout submission.
55
+     * @return array
56
+     */
57
+    public function process_payment( $invoice, $submission_data, $submission ) {
58 58
 
59 59
         // Mark it as paid.
60 60
         $invoice->mark_paid();
@@ -84,12 +84,12 @@  discard block
 block discarded – undo
84 84
     }
85 85
 
86 86
     /**
87
-	 * (Maybe) renews a manual subscription profile.
88
-	 *
89
-	 *
87
+     * (Maybe) renews a manual subscription profile.
88
+     *
89
+     *
90 90
      * @param WPInv_Subscription $subscription
91
-	 */
92
-	public function maybe_renew_subscription( $subscription ) {
91
+     */
92
+    public function maybe_renew_subscription( $subscription ) {
93 93
 
94 94
         // Ensure its our subscription && it's active.
95 95
         if ( $this->id === $subscription->get_gateway() && $subscription->has_status( 'active trialling' ) ) {
@@ -109,13 +109,13 @@  discard block
 block discarded – undo
109 109
     }
110 110
 
111 111
     /**
112
-	 * Processes invoice addons.
113
-	 *
114
-	 * @param WPInv_Invoice $invoice
115
-	 * @param GetPaid_Form_Item[] $items
116
-	 * @return WPInv_Invoice
117
-	 */
118
-	public function process_addons( $invoice, $items ) {
112
+     * Processes invoice addons.
113
+     *
114
+     * @param WPInv_Invoice $invoice
115
+     * @param GetPaid_Form_Item[] $items
116
+     * @return WPInv_Invoice
117
+     */
118
+    public function process_addons( $invoice, $items ) {
119 119
 
120 120
         foreach ( $items as $item ) {
121 121
             $invoice->add_item( $item );
Please login to merge, or discard this patch.
includes/wpinv-subscription.php 1 patch
Indentation   +1023 added lines, -1023 removed lines patch added patch discarded remove patch
@@ -15,125 +15,125 @@  discard block
 block discarded – undo
15 15
  */
16 16
 class WPInv_Subscription extends GetPaid_Data {
17 17
 
18
-	/**
19
-	 * Which data store to load.
20
-	 *
21
-	 * @var string
22
-	 */
23
-	protected $data_store_name = 'subscription';
24
-
25
-	/**
26
-	 * This is the name of this object type.
27
-	 *
28
-	 * @var string
29
-	 */
30
-	protected $object_type = 'subscription';
31
-
32
-	/**
33
-	 * Item Data array. This is the core item data exposed in APIs.
34
-	 *
35
-	 * @since 1.0.19
36
-	 * @var array
37
-	 */
38
-	protected $data = array(
39
-		'customer_id'       => 0,
40
-		'frequency'         => 1,
41
-		'period'            => 'D',
42
-		'initial_amount'    => null,
43
-		'recurring_amount'  => null,
44
-		'bill_times'        => 0,
45
-		'transaction_id'    => '',
46
-		'parent_payment_id' => null,
47
-		'product_id'        => 0,
48
-		'created'           => '0000-00-00 00:00:00',
49
-		'expiration'        => '0000-00-00 00:00:00',
50
-		'trial_period'      => '',
51
-		'status'            => 'pending',
52
-		'profile_id'        => '',
53
-		'gateway'           => '',
54
-		'customer'          => '',
55
-	);
56
-
57
-	/**
58
-	 * Stores the status transition information.
59
-	 *
60
-	 * @since 1.0.19
61
-	 * @var bool
62
-	 */
63
-	protected $status_transition = false;
64
-
65
-	/**
66
-	 * Get the subscription if ID is passed, otherwise the subscription is new and empty.
67
-	 *
68
-	 * @param  int|string|object|WPInv_Subscription $subscription Subscription id, profile_id, or object to read.
69
-	 * @param  bool $deprecated
70
-	 */
71
-	function __construct( $subscription = 0, $deprecated = false ) {
72
-
73
-		parent::__construct( $subscription );
74
-
75
-		if ( ! $deprecated && ! empty( $subscription ) && is_numeric( $subscription ) ) {
76
-			$this->set_id( $subscription );
77
-		} elseif ( $subscription instanceof self ) {
78
-			$this->set_id( $subscription->get_id() );
79
-		} elseif ( $deprecated && $subscription_id = self::get_subscription_id_by_field( $subscription, 'profile_id' ) ) {
80
-			$this->set_id( $subscription_id );
81
-		} elseif ( ! empty( $subscription->id ) ) {
82
-			$this->set_id( $subscription->id );
83
-		} else {
84
-			$this->set_object_read( true );
85
-		}
86
-
87
-		// Load the datastore.
88
-		$this->data_store = GetPaid_Data_Store::load( $this->data_store_name );
89
-
90
-		if ( $this->get_id() > 0 ) {
91
-			$this->data_store->read( $this );
92
-		}
93
-
94
-	}
95
-
96
-	/**
97
-	 * Given an invoice id, profile id, transaction id, it returns the subscription's id.
98
-	 *
99
-	 *
100
-	 * @static
101
-	 * @param string $value
102
-	 * @param string $field Either invoice_id, transaction_id or profile_id.
103
-	 * @since 1.0.19
104
-	 * @return int
105
-	 */
106
-	public static function get_subscription_id_by_field( $value, $field = 'profile_id' ) {
18
+    /**
19
+     * Which data store to load.
20
+     *
21
+     * @var string
22
+     */
23
+    protected $data_store_name = 'subscription';
24
+
25
+    /**
26
+     * This is the name of this object type.
27
+     *
28
+     * @var string
29
+     */
30
+    protected $object_type = 'subscription';
31
+
32
+    /**
33
+     * Item Data array. This is the core item data exposed in APIs.
34
+     *
35
+     * @since 1.0.19
36
+     * @var array
37
+     */
38
+    protected $data = array(
39
+        'customer_id'       => 0,
40
+        'frequency'         => 1,
41
+        'period'            => 'D',
42
+        'initial_amount'    => null,
43
+        'recurring_amount'  => null,
44
+        'bill_times'        => 0,
45
+        'transaction_id'    => '',
46
+        'parent_payment_id' => null,
47
+        'product_id'        => 0,
48
+        'created'           => '0000-00-00 00:00:00',
49
+        'expiration'        => '0000-00-00 00:00:00',
50
+        'trial_period'      => '',
51
+        'status'            => 'pending',
52
+        'profile_id'        => '',
53
+        'gateway'           => '',
54
+        'customer'          => '',
55
+    );
56
+
57
+    /**
58
+     * Stores the status transition information.
59
+     *
60
+     * @since 1.0.19
61
+     * @var bool
62
+     */
63
+    protected $status_transition = false;
64
+
65
+    /**
66
+     * Get the subscription if ID is passed, otherwise the subscription is new and empty.
67
+     *
68
+     * @param  int|string|object|WPInv_Subscription $subscription Subscription id, profile_id, or object to read.
69
+     * @param  bool $deprecated
70
+     */
71
+    function __construct( $subscription = 0, $deprecated = false ) {
72
+
73
+        parent::__construct( $subscription );
74
+
75
+        if ( ! $deprecated && ! empty( $subscription ) && is_numeric( $subscription ) ) {
76
+            $this->set_id( $subscription );
77
+        } elseif ( $subscription instanceof self ) {
78
+            $this->set_id( $subscription->get_id() );
79
+        } elseif ( $deprecated && $subscription_id = self::get_subscription_id_by_field( $subscription, 'profile_id' ) ) {
80
+            $this->set_id( $subscription_id );
81
+        } elseif ( ! empty( $subscription->id ) ) {
82
+            $this->set_id( $subscription->id );
83
+        } else {
84
+            $this->set_object_read( true );
85
+        }
86
+
87
+        // Load the datastore.
88
+        $this->data_store = GetPaid_Data_Store::load( $this->data_store_name );
89
+
90
+        if ( $this->get_id() > 0 ) {
91
+            $this->data_store->read( $this );
92
+        }
93
+
94
+    }
95
+
96
+    /**
97
+     * Given an invoice id, profile id, transaction id, it returns the subscription's id.
98
+     *
99
+     *
100
+     * @static
101
+     * @param string $value
102
+     * @param string $field Either invoice_id, transaction_id or profile_id.
103
+     * @since 1.0.19
104
+     * @return int
105
+     */
106
+    public static function get_subscription_id_by_field( $value, $field = 'profile_id' ) {
107 107
         global $wpdb;
108 108
 
109
-		// Trim the value.
110
-		$value = trim( $value );
109
+        // Trim the value.
110
+        $value = trim( $value );
111 111
 
112
-		if ( empty( $value ) ) {
113
-			return 0;
114
-		}
112
+        if ( empty( $value ) ) {
113
+            return 0;
114
+        }
115 115
 
116
-		if ( 'invoice_id' == $field ) {
117
-			$field = 'parent_payment_id';
118
-		}
116
+        if ( 'invoice_id' == $field ) {
117
+            $field = 'parent_payment_id';
118
+        }
119 119
 
120 120
         // Valid fields.
121 121
         $fields = array(
122
-			'parent_payment_id',
123
-			'transaction_id',
124
-			'profile_id',
125
-		);
126
-
127
-		// Ensure a field has been passed.
128
-		if ( empty( $field ) || ! in_array( $field, $fields ) ) {
129
-			return 0;
130
-		}
131
-
132
-		// Maybe retrieve from the cache.
133
-		$subscription_id   = wp_cache_get( $value, "getpaid_subscription_{$field}s_to_subscription_ids" );
134
-		if ( ! empty( $subscription_id ) ) {
135
-			return $subscription_id;
136
-		}
122
+            'parent_payment_id',
123
+            'transaction_id',
124
+            'profile_id',
125
+        );
126
+
127
+        // Ensure a field has been passed.
128
+        if ( empty( $field ) || ! in_array( $field, $fields ) ) {
129
+            return 0;
130
+        }
131
+
132
+        // Maybe retrieve from the cache.
133
+        $subscription_id   = wp_cache_get( $value, "getpaid_subscription_{$field}s_to_subscription_ids" );
134
+        if ( ! empty( $subscription_id ) ) {
135
+            return $subscription_id;
136
+        }
137 137
 
138 138
         // Fetch from the db.
139 139
         $table            = $wpdb->prefix . 'wpinv_subscriptions';
@@ -141,34 +141,34 @@  discard block
 block discarded – undo
141 141
             $wpdb->prepare( "SELECT `id` FROM $table WHERE `$field`=%s LIMIT 1", $value )
142 142
         );
143 143
 
144
-		if ( empty( $subscription_id ) ) {
145
-			return 0;
146
-		}
144
+        if ( empty( $subscription_id ) ) {
145
+            return 0;
146
+        }
147 147
 
148
-		// Update the cache with our data.
149
-		wp_cache_set( $value, $subscription_id, "getpaid_subscription_{$field}s_to_subscription_ids" );
148
+        // Update the cache with our data.
149
+        wp_cache_set( $value, $subscription_id, "getpaid_subscription_{$field}s_to_subscription_ids" );
150 150
 
151
-		return $subscription_id;
152
-	}
151
+        return $subscription_id;
152
+    }
153 153
 
154
-	/**
154
+    /**
155 155
      * Clears the subscription's cache.
156 156
      */
157 157
     public function clear_cache() {
158
-		wp_cache_delete( $this->get_parent_payment_id(), 'getpaid_subscription_parent_payment_ids_to_subscription_ids' );
159
-		wp_cache_delete( $this->get_transaction_id(), 'getpaid_subscription_transaction_ids_to_subscription_ids' );
160
-		wp_cache_delete( $this->get_profile_id(), 'getpaid_subscription_profile_ids_to_subscription_ids' );
161
-		wp_cache_delete( $this->get_id(), 'getpaid_subscriptions' );
162
-	}
158
+        wp_cache_delete( $this->get_parent_payment_id(), 'getpaid_subscription_parent_payment_ids_to_subscription_ids' );
159
+        wp_cache_delete( $this->get_transaction_id(), 'getpaid_subscription_transaction_ids_to_subscription_ids' );
160
+        wp_cache_delete( $this->get_profile_id(), 'getpaid_subscription_profile_ids_to_subscription_ids' );
161
+        wp_cache_delete( $this->get_id(), 'getpaid_subscriptions' );
162
+    }
163 163
 
164
-	/**
164
+    /**
165 165
      * Checks if a subscription key is set.
166 166
      */
167 167
     public function _isset( $key ) {
168 168
         return isset( $this->data[ $key ] ) || method_exists( $this, "get_$key" );
169
-	}
169
+    }
170 170
 
171
-	/*
171
+    /*
172 172
 	|--------------------------------------------------------------------------
173 173
 	| CRUD methods
174 174
 	|--------------------------------------------------------------------------
@@ -177,57 +177,57 @@  discard block
 block discarded – undo
177 177
 	|
178 178
     */
179 179
 
180
-	/*
180
+    /*
181 181
 	|--------------------------------------------------------------------------
182 182
 	| Getters
183 183
 	|--------------------------------------------------------------------------
184 184
 	*/
185 185
 
186
-	/**
187
-	 * Get customer id.
188
-	 *
189
-	 * @since 1.0.19
190
-	 * @param  string $context View or edit context.
191
-	 * @return int
192
-	 */
193
-	public function get_customer_id( $context = 'view' ) {
194
-		return (int) $this->get_prop( 'customer_id', $context );
195
-	}
196
-
197
-	/**
198
-	 * Get customer information.
199
-	 *
200
-	 * @since 1.0.19
201
-	 * @param  string $context View or edit context.
202
-	 * @return WP_User|false WP_User object on success, false on failure.
203
-	 */
204
-	public function get_customer( $context = 'view' ) {
205
-		return get_userdata( $this->get_customer_id( $context ) );
206
-	}
207
-
208
-	/**
209
-	 * Get parent invoice id.
210
-	 *
211
-	 * @since 1.0.19
212
-	 * @param  string $context View or edit context.
213
-	 * @return int
214
-	 */
215
-	public function get_parent_invoice_id( $context = 'view' ) {
216
-		return (int) $this->get_prop( 'parent_payment_id', $context );
217
-	}
218
-
219
-	/**
220
-	 * Alias for self::get_parent_invoice_id().
221
-	 *
222
-	 * @since 1.0.19
223
-	 * @param  string $context View or edit context.
224
-	 * @return int
225
-	 */
186
+    /**
187
+     * Get customer id.
188
+     *
189
+     * @since 1.0.19
190
+     * @param  string $context View or edit context.
191
+     * @return int
192
+     */
193
+    public function get_customer_id( $context = 'view' ) {
194
+        return (int) $this->get_prop( 'customer_id', $context );
195
+    }
196
+
197
+    /**
198
+     * Get customer information.
199
+     *
200
+     * @since 1.0.19
201
+     * @param  string $context View or edit context.
202
+     * @return WP_User|false WP_User object on success, false on failure.
203
+     */
204
+    public function get_customer( $context = 'view' ) {
205
+        return get_userdata( $this->get_customer_id( $context ) );
206
+    }
207
+
208
+    /**
209
+     * Get parent invoice id.
210
+     *
211
+     * @since 1.0.19
212
+     * @param  string $context View or edit context.
213
+     * @return int
214
+     */
215
+    public function get_parent_invoice_id( $context = 'view' ) {
216
+        return (int) $this->get_prop( 'parent_payment_id', $context );
217
+    }
218
+
219
+    /**
220
+     * Alias for self::get_parent_invoice_id().
221
+     *
222
+     * @since 1.0.19
223
+     * @param  string $context View or edit context.
224
+     * @return int
225
+     */
226 226
     public function get_parent_payment_id( $context = 'view' ) {
227 227
         return $this->get_parent_invoice_id( $context );
228
-	}
228
+    }
229 229
 
230
-	/**
230
+    /**
231 231
      * Alias for self::get_parent_invoice_id().
232 232
      *
233 233
      * @since  1.0.0
@@ -237,484 +237,484 @@  discard block
 block discarded – undo
237 237
         return $this->get_parent_invoice_id( $context );
238 238
     }
239 239
 
240
-	/**
241
-	 * Get parent invoice.
242
-	 *
243
-	 * @since 1.0.19
244
-	 * @param  string $context View or edit context.
245
-	 * @return WPInv_Invoice
246
-	 */
247
-	public function get_parent_invoice( $context = 'view' ) {
248
-		return new WPInv_Invoice( $this->get_parent_invoice_id( $context ) );
249
-	}
250
-
251
-	/**
252
-	 * Alias for self::get_parent_invoice().
253
-	 *
254
-	 * @since 1.0.19
255
-	 * @param  string $context View or edit context.
256
-	 * @return WPInv_Invoice
257
-	 */
258
-    public function get_parent_payment( $context = 'view' ) {
259
-        return $this->get_parent_invoice( $context );
260
-	}
261
-
262
-	/**
263
-	 * Get subscription's product id.
264
-	 *
265
-	 * @since 1.0.19
266
-	 * @param  string $context View or edit context.
267
-	 * @return int
268
-	 */
269
-	public function get_product_id( $context = 'view' ) {
270
-		return (int) $this->get_prop( 'product_id', $context );
271
-	}
272
-
273
-	/**
274
-	 * Get the subscription product.
275
-	 *
276
-	 * @since 1.0.19
277
-	 * @param  string $context View or edit context.
278
-	 * @return WPInv_Item
279
-	 */
280
-	public function get_product( $context = 'view' ) {
281
-		return new WPInv_Item( $this->get_product_id( $context ) );
282
-	}
283
-
284
-	/**
285
-	 * Get parent invoice's gateway.
286
-	 *
287
-	 * Here for backwards compatibility.
288
-	 *
289
-	 * @since 1.0.19
290
-	 * @param  string $context View or edit context.
291
-	 * @return string
292
-	 */
293
-	public function get_gateway( $context = 'view' ) {
294
-		return $this->get_parent_invoice( $context )->get_gateway();
295
-	}
296
-
297
-	/**
298
-	 * Get the period of a renewal.
299
-	 *
300
-	 * @since 1.0.19
301
-	 * @param  string $context View or edit context.
302
-	 * @return string
303
-	 */
304
-	public function get_period( $context = 'view' ) {
305
-		return $this->get_prop( 'period', $context );
306
-	}
307
-
308
-	/**
309
-	 * Get number of periods each renewal is valid for.
310
-	 *
311
-	 * @since 1.0.19
312
-	 * @param  string $context View or edit context.
313
-	 * @return int
314
-	 */
315
-	public function get_frequency( $context = 'view' ) {
316
-		return (int) $this->get_prop( 'frequency', $context );
317
-	}
318
-
319
-	/**
320
-	 * Get the initial amount for the subscription.
321
-	 *
322
-	 * @since 1.0.19
323
-	 * @param  string $context View or edit context.
324
-	 * @return float
325
-	 */
326
-	public function get_initial_amount( $context = 'view' ) {
327
-		return (float) wpinv_sanitize_amount( $this->get_prop( 'initial_amount', $context ) );
328
-	}
329
-
330
-	/**
331
-	 * Get the recurring amount for the subscription.
332
-	 *
333
-	 * @since 1.0.19
334
-	 * @param  string $context View or edit context.
335
-	 * @return float
336
-	 */
337
-	public function get_recurring_amount( $context = 'view' ) {
338
-		return (float) wpinv_sanitize_amount( $this->get_prop( 'recurring_amount', $context ) );
339
-	}
340
-
341
-	/**
342
-	 * Get number of times that this subscription can be renewed.
343
-	 *
344
-	 * @since 1.0.19
345
-	 * @param  string $context View or edit context.
346
-	 * @return int
347
-	 */
348
-	public function get_bill_times( $context = 'view' ) {
349
-		return (int) $this->get_prop( 'bill_times', $context );
350
-	}
351
-
352
-	/**
353
-	 * Get transaction id of this subscription's parent invoice.
354
-	 *
355
-	 * @since 1.0.19
356
-	 * @param  string $context View or edit context.
357
-	 * @return string
358
-	 */
359
-	public function get_transaction_id( $context = 'view' ) {
360
-		return $this->get_prop( 'transaction_id', $context );
361
-	}
362
-
363
-	/**
364
-	 * Get the date that the subscription was created.
365
-	 *
366
-	 * @since 1.0.19
367
-	 * @param  string $context View or edit context.
368
-	 * @return string
369
-	 */
370
-	public function get_created( $context = 'view' ) {
371
-		return $this->get_prop( 'created', $context );
372
-	}
373
-
374
-	/**
375
-	 * Alias for self::get_created().
376
-	 *
377
-	 * @since 1.0.19
378
-	 * @param  string $context View or edit context.
379
-	 * @return string
380
-	 */
381
-	public function get_date_created( $context = 'view' ) {
382
-		return $this->get_created( $context );
383
-	}
384
-
385
-	/**
386
-	 * Retrieves the creation date in a timestamp
387
-	 *
388
-	 * @since  1.0.0
389
-	 * @return int
390
-	 */
391
-	public function get_time_created() {
392
-		$created = $this->get_date_created();
393
-		return empty( $created ) ? current_time( 'timestamp' ) : strtotime( $created, current_time( 'timestamp' ) );
394
-	}
395
-
396
-	/**
397
-	 * Get GMT date when the subscription was created.
398
-	 *
399
-	 * @since 1.0.19
400
-	 * @param  string $context View or edit context.
401
-	 * @return string
402
-	 */
403
-	public function get_date_created_gmt( $context = 'view' ) {
404
-        $date = $this->get_date_created( $context );
240
+    /**
241
+     * Get parent invoice.
242
+     *
243
+     * @since 1.0.19
244
+     * @param  string $context View or edit context.
245
+     * @return WPInv_Invoice
246
+     */
247
+    public function get_parent_invoice( $context = 'view' ) {
248
+        return new WPInv_Invoice( $this->get_parent_invoice_id( $context ) );
249
+    }
250
+
251
+    /**
252
+     * Alias for self::get_parent_invoice().
253
+     *
254
+     * @since 1.0.19
255
+     * @param  string $context View or edit context.
256
+     * @return WPInv_Invoice
257
+     */
258
+    public function get_parent_payment( $context = 'view' ) {
259
+        return $this->get_parent_invoice( $context );
260
+    }
261
+
262
+    /**
263
+     * Get subscription's product id.
264
+     *
265
+     * @since 1.0.19
266
+     * @param  string $context View or edit context.
267
+     * @return int
268
+     */
269
+    public function get_product_id( $context = 'view' ) {
270
+        return (int) $this->get_prop( 'product_id', $context );
271
+    }
272
+
273
+    /**
274
+     * Get the subscription product.
275
+     *
276
+     * @since 1.0.19
277
+     * @param  string $context View or edit context.
278
+     * @return WPInv_Item
279
+     */
280
+    public function get_product( $context = 'view' ) {
281
+        return new WPInv_Item( $this->get_product_id( $context ) );
282
+    }
283
+
284
+    /**
285
+     * Get parent invoice's gateway.
286
+     *
287
+     * Here for backwards compatibility.
288
+     *
289
+     * @since 1.0.19
290
+     * @param  string $context View or edit context.
291
+     * @return string
292
+     */
293
+    public function get_gateway( $context = 'view' ) {
294
+        return $this->get_parent_invoice( $context )->get_gateway();
295
+    }
296
+
297
+    /**
298
+     * Get the period of a renewal.
299
+     *
300
+     * @since 1.0.19
301
+     * @param  string $context View or edit context.
302
+     * @return string
303
+     */
304
+    public function get_period( $context = 'view' ) {
305
+        return $this->get_prop( 'period', $context );
306
+    }
307
+
308
+    /**
309
+     * Get number of periods each renewal is valid for.
310
+     *
311
+     * @since 1.0.19
312
+     * @param  string $context View or edit context.
313
+     * @return int
314
+     */
315
+    public function get_frequency( $context = 'view' ) {
316
+        return (int) $this->get_prop( 'frequency', $context );
317
+    }
318
+
319
+    /**
320
+     * Get the initial amount for the subscription.
321
+     *
322
+     * @since 1.0.19
323
+     * @param  string $context View or edit context.
324
+     * @return float
325
+     */
326
+    public function get_initial_amount( $context = 'view' ) {
327
+        return (float) wpinv_sanitize_amount( $this->get_prop( 'initial_amount', $context ) );
328
+    }
329
+
330
+    /**
331
+     * Get the recurring amount for the subscription.
332
+     *
333
+     * @since 1.0.19
334
+     * @param  string $context View or edit context.
335
+     * @return float
336
+     */
337
+    public function get_recurring_amount( $context = 'view' ) {
338
+        return (float) wpinv_sanitize_amount( $this->get_prop( 'recurring_amount', $context ) );
339
+    }
340
+
341
+    /**
342
+     * Get number of times that this subscription can be renewed.
343
+     *
344
+     * @since 1.0.19
345
+     * @param  string $context View or edit context.
346
+     * @return int
347
+     */
348
+    public function get_bill_times( $context = 'view' ) {
349
+        return (int) $this->get_prop( 'bill_times', $context );
350
+    }
351
+
352
+    /**
353
+     * Get transaction id of this subscription's parent invoice.
354
+     *
355
+     * @since 1.0.19
356
+     * @param  string $context View or edit context.
357
+     * @return string
358
+     */
359
+    public function get_transaction_id( $context = 'view' ) {
360
+        return $this->get_prop( 'transaction_id', $context );
361
+    }
362
+
363
+    /**
364
+     * Get the date that the subscription was created.
365
+     *
366
+     * @since 1.0.19
367
+     * @param  string $context View or edit context.
368
+     * @return string
369
+     */
370
+    public function get_created( $context = 'view' ) {
371
+        return $this->get_prop( 'created', $context );
372
+    }
373
+
374
+    /**
375
+     * Alias for self::get_created().
376
+     *
377
+     * @since 1.0.19
378
+     * @param  string $context View or edit context.
379
+     * @return string
380
+     */
381
+    public function get_date_created( $context = 'view' ) {
382
+        return $this->get_created( $context );
383
+    }
384
+
385
+    /**
386
+     * Retrieves the creation date in a timestamp
387
+     *
388
+     * @since  1.0.0
389
+     * @return int
390
+     */
391
+    public function get_time_created() {
392
+        $created = $this->get_date_created();
393
+        return empty( $created ) ? current_time( 'timestamp' ) : strtotime( $created, current_time( 'timestamp' ) );
394
+    }
395
+
396
+    /**
397
+     * Get GMT date when the subscription was created.
398
+     *
399
+     * @since 1.0.19
400
+     * @param  string $context View or edit context.
401
+     * @return string
402
+     */
403
+    public function get_date_created_gmt( $context = 'view' ) {
404
+        $date = $this->get_date_created( $context );
405
+
406
+        if ( $date ) {
407
+            $date = get_gmt_from_date( $date );
408
+        }
409
+        return $date;
410
+    }
411
+
412
+    /**
413
+     * Get the date that the subscription will renew.
414
+     *
415
+     * @since 1.0.19
416
+     * @param  string $context View or edit context.
417
+     * @return string
418
+     */
419
+    public function get_next_renewal_date( $context = 'view' ) {
420
+        return $this->get_prop( 'expiration', $context );
421
+    }
422
+
423
+    /**
424
+     * Alias for self::get_next_renewal_date().
425
+     *
426
+     * @since 1.0.19
427
+     * @param  string $context View or edit context.
428
+     * @return string
429
+     */
430
+    public function get_expiration( $context = 'view' ) {
431
+        return $this->get_next_renewal_date( $context );
432
+    }
433
+
434
+    /**
435
+     * Retrieves the expiration date in a timestamp
436
+     *
437
+     * @since  1.0.0
438
+     * @return int
439
+     */
440
+    public function get_expiration_time() {
441
+        $expiration = $this->get_expiration();
442
+
443
+        if ( empty( $expiration ) || '0000-00-00 00:00:00' == $expiration ) {
444
+            return current_time( 'timestamp' );
445
+        }
446
+
447
+        $expiration = strtotime( $expiration, current_time( 'timestamp' ) );
448
+        return $expiration < current_time( 'timestamp' ) ? current_time( 'timestamp' ) : $expiration;
449
+    }
450
+
451
+    /**
452
+     * Get GMT date when the subscription will renew.
453
+     *
454
+     * @since 1.0.19
455
+     * @param  string $context View or edit context.
456
+     * @return string
457
+     */
458
+    public function get_next_renewal_date_gmt( $context = 'view' ) {
459
+        $date = $this->get_next_renewal_date( $context );
460
+
461
+        if ( $date ) {
462
+            $date = get_gmt_from_date( $date );
463
+        }
464
+        return $date;
465
+    }
466
+
467
+    /**
468
+     * Get the subscription's trial period.
469
+     *
470
+     * @since 1.0.19
471
+     * @param  string $context View or edit context.
472
+     * @return string
473
+     */
474
+    public function get_trial_period( $context = 'view' ) {
475
+        return $this->get_prop( 'trial_period', $context );
476
+    }
477
+
478
+    /**
479
+     * Get the subscription's status.
480
+     *
481
+     * @since 1.0.19
482
+     * @param  string $context View or edit context.
483
+     * @return string
484
+     */
485
+    public function get_status( $context = 'view' ) {
486
+        return $this->get_prop( 'status', $context );
487
+    }
488
+
489
+    /**
490
+     * Get the subscription's profile id.
491
+     *
492
+     * @since 1.0.19
493
+     * @param  string $context View or edit context.
494
+     * @return string
495
+     */
496
+    public function get_profile_id( $context = 'view' ) {
497
+        return $this->get_prop( 'profile_id', $context );
498
+    }
499
+
500
+    /*
501
+	|--------------------------------------------------------------------------
502
+	| Setters
503
+	|--------------------------------------------------------------------------
504
+	*/
505
+
506
+    /**
507
+     * Set customer id.
508
+     *
509
+     * @since 1.0.19
510
+     * @param  int $value The customer's id.
511
+     */
512
+    public function set_customer_id( $value ) {
513
+        $this->set_prop( 'customer_id', (int) $value );
514
+    }
515
+
516
+    /**
517
+     * Set parent invoice id.
518
+     *
519
+     * @since 1.0.19
520
+     * @param  int $value The parent invoice id.
521
+     */
522
+    public function set_parent_invoice_id( $value ) {
523
+        $this->set_prop( 'parent_payment_id', (int) $value );
524
+    }
525
+
526
+    /**
527
+     * Alias for self::set_parent_invoice_id().
528
+     *
529
+     * @since 1.0.19
530
+     * @param  int $value The parent invoice id.
531
+     */
532
+    public function set_parent_payment_id( $value ) {
533
+        $this->set_parent_invoice_id( $value );
534
+    }
535
+
536
+    /**
537
+     * Alias for self::set_parent_invoice_id().
538
+     *
539
+     * @since 1.0.19
540
+     * @param  int $value The parent invoice id.
541
+     */
542
+    public function set_original_payment_id( $value ) {
543
+        $this->set_parent_invoice_id( $value );
544
+    }
545
+
546
+    /**
547
+     * Set subscription's product id.
548
+     *
549
+     * @since 1.0.19
550
+     * @param  int $value The subscription product id.
551
+     */
552
+    public function set_product_id( $value ) {
553
+        $this->set_prop( 'product_id', (int) $value );
554
+    }
555
+
556
+    /**
557
+     * Set the period of a renewal.
558
+     *
559
+     * @since 1.0.19
560
+     * @param  string $value The renewal period.
561
+     */
562
+    public function set_period( $value ) {
563
+        $this->set_prop( 'period', $value );
564
+    }
565
+
566
+    /**
567
+     * Set number of periods each renewal is valid for.
568
+     *
569
+     * @since 1.0.19
570
+     * @param  int $value The subscription frequency.
571
+     */
572
+    public function set_frequency( $value ) {
573
+        $value = empty( $value ) ? 1 : (int) $value;
574
+        $this->set_prop( 'frequency', absint( $value ) );
575
+    }
576
+
577
+    /**
578
+     * Set the initial amount for the subscription.
579
+     *
580
+     * @since 1.0.19
581
+     * @param  float $value The initial subcription amount.
582
+     */
583
+    public function set_initial_amount( $value ) {
584
+        $this->set_prop( 'initial_amount', wpinv_sanitize_amount( $value ) );
585
+    }
586
+
587
+    /**
588
+     * Set the recurring amount for the subscription.
589
+     *
590
+     * @since 1.0.19
591
+     * @param  float $value The recurring subcription amount.
592
+     */
593
+    public function set_recurring_amount( $value ) {
594
+        $this->set_prop( 'recurring_amount', wpinv_sanitize_amount( $value ) );
595
+    }
596
+
597
+    /**
598
+     * Set number of times that this subscription can be renewed.
599
+     *
600
+     * @since 1.0.19
601
+     * @param  int $value Bill times.
602
+     */
603
+    public function set_bill_times( $value ) {
604
+        $this->set_prop( 'bill_times', (int) $value );
605
+    }
606
+
607
+    /**
608
+     * Get transaction id of this subscription's parent invoice.
609
+     *
610
+     * @since 1.0.19
611
+     * @param string $value Bill times.
612
+     */
613
+    public function set_transaction_id( $value ) {
614
+        $this->set_prop( 'transaction_id', sanitize_text_field( $value ) );
615
+    }
616
+
617
+    /**
618
+     * Set date when this subscription started.
619
+     *
620
+     * @since 1.0.19
621
+     * @param string $value strtotime compliant date.
622
+     */
623
+    public function set_created( $value ) {
624
+        $date = strtotime( $value );
405 625
 
406
-        if ( $date ) {
407
-            $date = get_gmt_from_date( $date );
626
+        if ( $date && $value !== '0000-00-00 00:00:00' ) {
627
+            $this->set_prop( 'created', date( 'Y-m-d H:i:s', $date ) );
628
+            return;
408 629
         }
409
-		return $date;
410
-	}
411
-
412
-	/**
413
-	 * Get the date that the subscription will renew.
414
-	 *
415
-	 * @since 1.0.19
416
-	 * @param  string $context View or edit context.
417
-	 * @return string
418
-	 */
419
-	public function get_next_renewal_date( $context = 'view' ) {
420
-		return $this->get_prop( 'expiration', $context );
421
-	}
422
-
423
-	/**
424
-	 * Alias for self::get_next_renewal_date().
425
-	 *
426
-	 * @since 1.0.19
427
-	 * @param  string $context View or edit context.
428
-	 * @return string
429
-	 */
430
-	public function get_expiration( $context = 'view' ) {
431
-		return $this->get_next_renewal_date( $context );
432
-	}
433
-
434
-	/**
435
-	 * Retrieves the expiration date in a timestamp
436
-	 *
437
-	 * @since  1.0.0
438
-	 * @return int
439
-	 */
440
-	public function get_expiration_time() {
441
-		$expiration = $this->get_expiration();
442
-
443
-		if ( empty( $expiration ) || '0000-00-00 00:00:00' == $expiration ) {
444
-			return current_time( 'timestamp' );
445
-		}
446
-
447
-		$expiration = strtotime( $expiration, current_time( 'timestamp' ) );
448
-		return $expiration < current_time( 'timestamp' ) ? current_time( 'timestamp' ) : $expiration;
449
-	}
450
-
451
-	/**
452
-	 * Get GMT date when the subscription will renew.
453
-	 *
454
-	 * @since 1.0.19
455
-	 * @param  string $context View or edit context.
456
-	 * @return string
457
-	 */
458
-	public function get_next_renewal_date_gmt( $context = 'view' ) {
459
-        $date = $this->get_next_renewal_date( $context );
460 630
 
461
-        if ( $date ) {
462
-            $date = get_gmt_from_date( $date );
463
-        }
464
-		return $date;
465
-	}
466
-
467
-	/**
468
-	 * Get the subscription's trial period.
469
-	 *
470
-	 * @since 1.0.19
471
-	 * @param  string $context View or edit context.
472
-	 * @return string
473
-	 */
474
-	public function get_trial_period( $context = 'view' ) {
475
-		return $this->get_prop( 'trial_period', $context );
476
-	}
477
-
478
-	/**
479
-	 * Get the subscription's status.
480
-	 *
481
-	 * @since 1.0.19
482
-	 * @param  string $context View or edit context.
483
-	 * @return string
484
-	 */
485
-	public function get_status( $context = 'view' ) {
486
-		return $this->get_prop( 'status', $context );
487
-	}
488
-
489
-	/**
490
-	 * Get the subscription's profile id.
491
-	 *
492
-	 * @since 1.0.19
493
-	 * @param  string $context View or edit context.
494
-	 * @return string
495
-	 */
496
-	public function get_profile_id( $context = 'view' ) {
497
-		return $this->get_prop( 'profile_id', $context );
498
-	}
499
-
500
-	/*
501
-	|--------------------------------------------------------------------------
502
-	| Setters
503
-	|--------------------------------------------------------------------------
504
-	*/
631
+        $this->set_prop( 'created', '' );
505 632
 
506
-	/**
507
-	 * Set customer id.
508
-	 *
509
-	 * @since 1.0.19
510
-	 * @param  int $value The customer's id.
511
-	 */
512
-	public function set_customer_id( $value ) {
513
-		$this->set_prop( 'customer_id', (int) $value );
514
-	}
515
-
516
-	/**
517
-	 * Set parent invoice id.
518
-	 *
519
-	 * @since 1.0.19
520
-	 * @param  int $value The parent invoice id.
521
-	 */
522
-	public function set_parent_invoice_id( $value ) {
523
-		$this->set_prop( 'parent_payment_id', (int) $value );
524
-	}
525
-
526
-	/**
527
-	 * Alias for self::set_parent_invoice_id().
528
-	 *
529
-	 * @since 1.0.19
530
-	 * @param  int $value The parent invoice id.
531
-	 */
532
-    public function set_parent_payment_id( $value ) {
533
-        $this->set_parent_invoice_id( $value );
534
-	}
633
+    }
535 634
 
536
-	/**
537
-     * Alias for self::set_parent_invoice_id().
635
+    /**
636
+     * Alias for self::set_created().
538 637
      *
539 638
      * @since 1.0.19
540
-	 * @param  int $value The parent invoice id.
639
+     * @param string $value strtotime compliant date.
541 640
      */
542
-    public function set_original_payment_id( $value ) {
543
-        $this->set_parent_invoice_id( $value );
544
-	}
545
-
546
-	/**
547
-	 * Set subscription's product id.
548
-	 *
549
-	 * @since 1.0.19
550
-	 * @param  int $value The subscription product id.
551
-	 */
552
-	public function set_product_id( $value ) {
553
-		$this->set_prop( 'product_id', (int) $value );
554
-	}
555
-
556
-	/**
557
-	 * Set the period of a renewal.
558
-	 *
559
-	 * @since 1.0.19
560
-	 * @param  string $value The renewal period.
561
-	 */
562
-	public function set_period( $value ) {
563
-		$this->set_prop( 'period', $value );
564
-	}
565
-
566
-	/**
567
-	 * Set number of periods each renewal is valid for.
568
-	 *
569
-	 * @since 1.0.19
570
-	 * @param  int $value The subscription frequency.
571
-	 */
572
-	public function set_frequency( $value ) {
573
-		$value = empty( $value ) ? 1 : (int) $value;
574
-		$this->set_prop( 'frequency', absint( $value ) );
575
-	}
576
-
577
-	/**
578
-	 * Set the initial amount for the subscription.
579
-	 *
580
-	 * @since 1.0.19
581
-	 * @param  float $value The initial subcription amount.
582
-	 */
583
-	public function set_initial_amount( $value ) {
584
-		$this->set_prop( 'initial_amount', wpinv_sanitize_amount( $value ) );
585
-	}
586
-
587
-	/**
588
-	 * Set the recurring amount for the subscription.
589
-	 *
590
-	 * @since 1.0.19
591
-	 * @param  float $value The recurring subcription amount.
592
-	 */
593
-	public function set_recurring_amount( $value ) {
594
-		$this->set_prop( 'recurring_amount', wpinv_sanitize_amount( $value ) );
595
-	}
596
-
597
-	/**
598
-	 * Set number of times that this subscription can be renewed.
599
-	 *
600
-	 * @since 1.0.19
601
-	 * @param  int $value Bill times.
602
-	 */
603
-	public function set_bill_times( $value ) {
604
-		$this->set_prop( 'bill_times', (int) $value );
605
-	}
606
-
607
-	/**
608
-	 * Get transaction id of this subscription's parent invoice.
609
-	 *
610
-	 * @since 1.0.19
611
-	 * @param string $value Bill times.
612
-	 */
613
-	public function set_transaction_id( $value ) {
614
-		$this->set_prop( 'transaction_id', sanitize_text_field( $value ) );
615
-	}
616
-
617
-	/**
618
-	 * Set date when this subscription started.
619
-	 *
620
-	 * @since 1.0.19
621
-	 * @param string $value strtotime compliant date.
622
-	 */
623
-	public function set_created( $value ) {
641
+    public function set_date_created( $value ) {
642
+        $this->set_created( $value );
643
+    }
644
+
645
+    /**
646
+     * Set the date that the subscription will renew.
647
+     *
648
+     * @since 1.0.19
649
+     * @param string $value strtotime compliant date.
650
+     */
651
+    public function set_next_renewal_date( $value ) {
624 652
         $date = strtotime( $value );
625 653
 
626 654
         if ( $date && $value !== '0000-00-00 00:00:00' ) {
627
-            $this->set_prop( 'created', date( 'Y-m-d H:i:s', $date ) );
655
+            $this->set_prop( 'expiration', date( 'Y-m-d H:i:s', $date ) );
628 656
             return;
629 657
         }
630 658
 
631
-		$this->set_prop( 'created', '' );
659
+        $this->set_prop( 'expiration', '' );
632 660
 
633
-	}
661
+    }
634 662
 
635
-	/**
636
-	 * Alias for self::set_created().
637
-	 *
638
-	 * @since 1.0.19
639
-	 * @param string $value strtotime compliant date.
640
-	 */
641
-	public function set_date_created( $value ) {
642
-		$this->set_created( $value );
663
+    /**
664
+     * Alias for self::set_next_renewal_date().
665
+     *
666
+     * @since 1.0.19
667
+     * @param string $value strtotime compliant date.
668
+     */
669
+    public function set_expiration( $value ) {
670
+        $this->set_next_renewal_date( $value );
643 671
     }
644 672
 
645
-	/**
646
-	 * Set the date that the subscription will renew.
647
-	 *
648
-	 * @since 1.0.19
649
-	 * @param string $value strtotime compliant date.
650
-	 */
651
-	public function set_next_renewal_date( $value ) {
652
-		$date = strtotime( $value );
673
+    /**
674
+     * Set the subscription's trial period.
675
+     *
676
+     * @since 1.0.19
677
+     * @param string $value trial period e.g 1 year.
678
+     */
679
+    public function set_trial_period( $value ) {
680
+        $this->set_prop( 'trial_period', $value );
681
+    }
653 682
 
654
-        if ( $date && $value !== '0000-00-00 00:00:00' ) {
655
-            $this->set_prop( 'expiration', date( 'Y-m-d H:i:s', $date ) );
683
+    /**
684
+     * Set the subscription's status.
685
+     *
686
+     * @since 1.0.19
687
+     * @param string $new_status    New subscription status.
688
+     */
689
+    public function set_status( $new_status ) {
690
+
691
+        // Abort if this is not a valid status;
692
+        if ( ! array_key_exists( $new_status, getpaid_get_subscription_statuses() ) ) {
656 693
             return;
657
-		}
658
-
659
-		$this->set_prop( 'expiration', '' );
660
-
661
-	}
662
-
663
-	/**
664
-	 * Alias for self::set_next_renewal_date().
665
-	 *
666
-	 * @since 1.0.19
667
-	 * @param string $value strtotime compliant date.
668
-	 */
669
-	public function set_expiration( $value ) {
670
-		$this->set_next_renewal_date( $value );
671
-    }
672
-
673
-	/**
674
-	 * Set the subscription's trial period.
675
-	 *
676
-	 * @since 1.0.19
677
-	 * @param string $value trial period e.g 1 year.
678
-	 */
679
-	public function set_trial_period( $value ) {
680
-		$this->set_prop( 'trial_period', $value );
681
-	}
682
-
683
-	/**
684
-	 * Set the subscription's status.
685
-	 *
686
-	 * @since 1.0.19
687
-	 * @param string $new_status    New subscription status.
688
-	 */
689
-	public function set_status( $new_status ) {
690
-
691
-		// Abort if this is not a valid status;
692
-		if ( ! array_key_exists( $new_status, getpaid_get_subscription_statuses() ) ) {
693
-			return;
694
-		}
695
-
696
-		$old_status = ! empty( $this->status_transition['from'] ) ? $this->status_transition['from'] : $this->get_status();
697
-		if ( true === $this->object_read && $old_status !== $new_status ) {
698
-			$this->status_transition = array(
699
-				'from' => $old_status,
700
-				'to'   => $new_status,
701
-			);
702
-		}
703
-
704
-		$this->set_prop( 'status', $new_status );
705
-	}
706
-
707
-	/**
708
-	 * Set the subscription's (remote) profile id.
709
-	 *
710
-	 * @since 1.0.19
711
-	 * @param  string $value the remote profile id.
712
-	 */
713
-	public function set_profile_id( $value ) {
714
-		$this->set_prop( 'profile_id', sanitize_text_field( $value ) );
715
-	}
716
-
717
-	/*
694
+        }
695
+
696
+        $old_status = ! empty( $this->status_transition['from'] ) ? $this->status_transition['from'] : $this->get_status();
697
+        if ( true === $this->object_read && $old_status !== $new_status ) {
698
+            $this->status_transition = array(
699
+                'from' => $old_status,
700
+                'to'   => $new_status,
701
+            );
702
+        }
703
+
704
+        $this->set_prop( 'status', $new_status );
705
+    }
706
+
707
+    /**
708
+     * Set the subscription's (remote) profile id.
709
+     *
710
+     * @since 1.0.19
711
+     * @param  string $value the remote profile id.
712
+     */
713
+    public function set_profile_id( $value ) {
714
+        $this->set_prop( 'profile_id', sanitize_text_field( $value ) );
715
+    }
716
+
717
+    /*
718 718
 	|--------------------------------------------------------------------------
719 719
 	| Boolean methods
720 720
 	|--------------------------------------------------------------------------
@@ -723,55 +723,55 @@  discard block
 block discarded – undo
723 723
 	|
724 724
 	*/
725 725
 
726
-	/**
726
+    /**
727 727
      * Checks if the subscription has a given status.
728
-	 *
729
-	 * @param string|array String or array of strings to check for.
730
-	 * @return bool
728
+     *
729
+     * @param string|array String or array of strings to check for.
730
+     * @return bool
731 731
      */
732 732
     public function has_status( $status ) {
733 733
         return in_array( $this->get_status(), wpinv_clean( wpinv_parse_list( $status ) ) );
734
-	}
734
+    }
735 735
 
736
-	/**
736
+    /**
737 737
      * Checks if the subscription has a trial period.
738
-	 *
739
-	 * @return bool
738
+     *
739
+     * @return bool
740 740
      */
741 741
     public function has_trial_period() {
742
-		$period = $this->get_trial_period();
742
+        $period = $this->get_trial_period();
743 743
         return ! empty( $period );
744
-	}
745
-
746
-	/**
747
-	 * Is the subscription active?
748
-	 *
749
-	 * @return bool
750
-	 */
751
-	public function is_active() {
752
-		return $this->has_status( 'active trialling' ) && ! $this->is_expired();
753
-	}
754
-
755
-	/**
756
-	 * Is the subscription expired?
757
-	 *
758
-	 * @return bool
759
-	 */
760
-	public function is_expired() {
761
-		return $this->has_status( 'expired' ) || ( $this->has_status( 'active cancelled trialling' ) && $this->get_expiration_time() < current_time( 'timestamp' ) );
762
-	}
763
-
764
-	/**
765
-	 * Is this the last renewals?
766
-	 *
767
-	 * @return bool
768
-	 */
769
-	public function is_last_renewal() {
770
-		$max_bills = $this->get_bill_times();
771
-		return ! empty( $max_bills ) && $max_bills <= $this->get_times_billed();
772
-	}
773
-
774
-	/*
744
+    }
745
+
746
+    /**
747
+     * Is the subscription active?
748
+     *
749
+     * @return bool
750
+     */
751
+    public function is_active() {
752
+        return $this->has_status( 'active trialling' ) && ! $this->is_expired();
753
+    }
754
+
755
+    /**
756
+     * Is the subscription expired?
757
+     *
758
+     * @return bool
759
+     */
760
+    public function is_expired() {
761
+        return $this->has_status( 'expired' ) || ( $this->has_status( 'active cancelled trialling' ) && $this->get_expiration_time() < current_time( 'timestamp' ) );
762
+    }
763
+
764
+    /**
765
+     * Is this the last renewals?
766
+     *
767
+     * @return bool
768
+     */
769
+    public function is_last_renewal() {
770
+        $max_bills = $this->get_bill_times();
771
+        return ! empty( $max_bills ) && $max_bills <= $this->get_times_billed();
772
+    }
773
+
774
+    /*
775 775
 	|--------------------------------------------------------------------------
776 776
 	| Additional methods
777 777
 	|--------------------------------------------------------------------------
@@ -780,27 +780,27 @@  discard block
 block discarded – undo
780 780
 	|
781 781
 	*/
782 782
 
783
-	/**
784
-	 * Backwards compatibilty.
785
-	 */
786
-	public function create( $data = array() ) {
783
+    /**
784
+     * Backwards compatibilty.
785
+     */
786
+    public function create( $data = array() ) {
787 787
 
788
-		// Set the properties.
789
-		if ( is_array( $data ) ) {
790
-			$this->set_props( $data );
791
-		}
788
+        // Set the properties.
789
+        if ( is_array( $data ) ) {
790
+            $this->set_props( $data );
791
+        }
792 792
 
793
-		// Save the item.
794
-		return $this->save();
793
+        // Save the item.
794
+        return $this->save();
795 795
 
796
-	}
796
+    }
797 797
 
798
-	/**
799
-	 * Backwards compatibilty.
800
-	 */
801
-	public function update( $args = array() ) {
802
-		return $this->create( $args );
803
-	}
798
+    /**
799
+     * Backwards compatibilty.
800
+     */
801
+    public function update( $args = array() ) {
802
+        return $this->create( $args );
803
+    }
804 804
 
805 805
     /**
806 806
      * Retrieve renewal payments for a subscription
@@ -810,22 +810,22 @@  discard block
 block discarded – undo
810 810
      */
811 811
     public function get_child_payments( $hide_pending = true ) {
812 812
 
813
-		$statuses = array( 'publish', 'wpi-processing', 'wpi-renewal' );
813
+        $statuses = array( 'publish', 'wpi-processing', 'wpi-renewal' );
814 814
 
815
-		if ( ! $hide_pending ) {
816
-			$statuses = array_keys( wpinv_get_invoice_statuses() );
817
-		}
815
+        if ( ! $hide_pending ) {
816
+            $statuses = array_keys( wpinv_get_invoice_statuses() );
817
+        }
818 818
 
819 819
         return get_posts(
820
-			array(
821
-            	'post_parent' => $this->get_parent_payment_id(),
822
-            	'numberposts' => -1,
823
-            	'post_status' => $statuses,
824
-            	'orderby'     => 'ID',
825
-            	'order'       => 'ASC',
826
-            	'post_type'   => 'wpi_invoice',
827
-			)
828
-		);
820
+            array(
821
+                'post_parent' => $this->get_parent_payment_id(),
822
+                'numberposts' => -1,
823
+                'post_status' => $statuses,
824
+                'orderby'     => 'ID',
825
+                'order'       => 'ASC',
826
+                'post_type'   => 'wpi_invoice',
827
+            )
828
+        );
829 829
     }
830 830
 
831 831
     /**
@@ -835,7 +835,7 @@  discard block
 block discarded – undo
835 835
      * @return int
836 836
      */
837 837
     public function get_total_payments() {
838
-		return getpaid_count_subscription_invoices( $this->get_parent_invoice_id(), $this->get_id() );
838
+        return getpaid_count_subscription_invoices( $this->get_parent_invoice_id(), $this->get_id() );
839 839
     }
840 840
 
841 841
     /**
@@ -859,56 +859,56 @@  discard block
 block discarded – undo
859 859
      *
860 860
      * @since  2.4
861 861
      * @param  array $args Array of values for the payment, including amount and transaction ID
862
-	 * @param  WPInv_Invoice $invoice If adding an existing invoice.
862
+     * @param  WPInv_Invoice $invoice If adding an existing invoice.
863 863
      * @return bool
864 864
      */
865 865
     public function add_payment( $args = array(), $invoice = false ) {
866 866
 
867
-		// Process each payment once.
867
+        // Process each payment once.
868 868
         if ( ! empty( $args['transaction_id'] ) && $this->payment_exists( $args['transaction_id'] ) ) {
869 869
             return false;
870 870
         }
871 871
 
872
-		// Are we creating a new invoice?
873
-		if ( empty( $invoice ) ) {
874
-			$invoice = $this->create_payment();
872
+        // Are we creating a new invoice?
873
+        if ( empty( $invoice ) ) {
874
+            $invoice = $this->create_payment();
875 875
 
876
-			if ( empty( $invoice ) ) {
877
-				return false;
878
-			}
876
+            if ( empty( $invoice ) ) {
877
+                return false;
878
+            }
879 879
 }
880 880
 
881
-		$invoice->set_status( 'wpi-renewal' );
881
+        $invoice->set_status( 'wpi-renewal' );
882 882
 
883
-		// Maybe set a transaction id.
884
-		if ( ! empty( $args['transaction_id'] ) ) {
885
-			$invoice->set_transaction_id( $args['transaction_id'] );
886
-		}
883
+        // Maybe set a transaction id.
884
+        if ( ! empty( $args['transaction_id'] ) ) {
885
+            $invoice->set_transaction_id( $args['transaction_id'] );
886
+        }
887 887
 
888
-		// Set the completed date.
889
-		$invoice->set_completed_date( current_time( 'mysql' ) );
888
+        // Set the completed date.
889
+        $invoice->set_completed_date( current_time( 'mysql' ) );
890 890
 
891
-		// And the gateway.
892
-		if ( ! empty( $args['gateway'] ) ) {
893
-			$invoice->set_gateway( $args['gateway'] );
894
-		}
891
+        // And the gateway.
892
+        if ( ! empty( $args['gateway'] ) ) {
893
+            $invoice->set_gateway( $args['gateway'] );
894
+        }
895 895
 
896
-		$invoice->save();
896
+        $invoice->save();
897 897
 
898
-		if ( ! $invoice->exists() ) {
899
-			return false;
900
-		}
898
+        if ( ! $invoice->exists() ) {
899
+            return false;
900
+        }
901 901
 
902
-		do_action( 'getpaid_after_create_subscription_renewal_invoice', $invoice, $this );
903
-		do_action( 'wpinv_recurring_add_subscription_payment', $invoice, $this );
902
+        do_action( 'getpaid_after_create_subscription_renewal_invoice', $invoice, $this );
903
+        do_action( 'wpinv_recurring_add_subscription_payment', $invoice, $this );
904 904
         do_action( 'wpinv_recurring_record_payment', $invoice->get_id(), $this->get_parent_invoice_id(), $invoice->get_recurring_total(), $invoice->get_transaction_id() );
905 905
 
906 906
         update_post_meta( $invoice->get_id(), '_wpinv_subscription_id', $this->id );
907 907
 
908 908
         return $invoice->get_id();
909
-	}
909
+    }
910 910
 
911
-	/**
911
+    /**
912 912
      * Creates a new invoice and returns it.
913 913
      *
914 914
      * @since  1.0.19
@@ -916,124 +916,124 @@  discard block
 block discarded – undo
916 916
      */
917 917
     public function create_payment() {
918 918
 
919
-		$parent_invoice = $this->get_parent_payment();
920
-
921
-		if ( ! $parent_invoice->exists() ) {
922
-			return false;
923
-		}
924
-
925
-		// Duplicate the parent invoice.
926
-		$invoice = getpaid_duplicate_invoice( $parent_invoice );
927
-		$invoice->set_parent_id( $parent_invoice->get_id() );
928
-		$invoice->set_subscription_id( $this->get_id() );
929
-		$invoice->set_remote_subscription_id( $this->get_profile_id() );
930
-
931
-		// Set invoice items.
932
-		$subscription_group = getpaid_get_invoice_subscription_group( $parent_invoice->get_id(), $this->get_id() );
933
-		$allowed_items      = empty( $subscription_group ) ? array( $this->get_product_id() ) : array_keys( $subscription_group['items'] );
934
-		$invoice_items      = array();
935
-
936
-		foreach ( $invoice->get_items() as $item ) {
937
-			if ( in_array( $item->get_id(), $allowed_items ) ) {
938
-				$invoice_items[] = $item;
939
-			}
940
-		}
941
-
942
-		$invoice->set_items( $invoice_items );
943
-
944
-		if ( ! empty( $subscription_group['fees'] ) ) {
945
-			$invoice->set_fees( $subscription_group['fees'] );
946
-		}
947
-
948
-		// Maybe recalculate discount (Pre-GetPaid Fix).
949
-		$discount = new WPInv_Discount( $invoice->get_discount_code() );
950
-		if ( $discount->exists() && $discount->is_recurring() && 0 == $invoice->get_total_discount() ) {
951
-			$invoice->add_discount( getpaid_calculate_invoice_discount( $invoice, $discount ) );
952
-		}
953
-
954
-		$invoice->recalculate_total();
955
-		$invoice->set_status( 'wpi-pending' );
956
-		$invoice->save();
957
-
958
-		return $invoice->exists() ? $invoice : false;
959
-    }
960
-
961
-	/**
962
-	 * Renews or completes a subscription
963
-	 *
964
-	 * @since  1.0.0
965
-	 * @return int The subscription's id
966
-	 */
967
-	public function renew() {
968
-
969
-		// Complete subscription if applicable
970
-		if ( $this->is_last_renewal() ) {
971
-			return $this->complete();
972
-		}
973
-
974
-		// Calculate new expiration
975
-		$frequency      = $this->get_frequency();
976
-		$period         = $this->get_period();
977
-		$new_expiration = strtotime( "+ $frequency $period", $this->get_expiration_time() );
978
-
979
-		$this->set_expiration( date( 'Y-m-d H:i:s', $new_expiration ) );
980
-		$this->set_status( 'active' );
981
-		$this->save();
982
-
983
-		do_action( 'getpaid_subscription_renewed', $this );
984
-
985
-		return $this->get_id();
986
-	}
987
-
988
-	/**
989
-	 * Marks a subscription as completed
990
-	 *
991
-	 * Subscription is completed when the number of payments matches the billing_times field
992
-	 *
993
-	 * @since  1.0.0
994
-	 * @return int|bool Subscription id or false if the subscription is cancelled.
995
-	 */
996
-	public function complete() {
997
-
998
-		// Only mark a subscription as complete if it's not already cancelled.
999
-		if ( $this->has_status( 'cancelled' ) ) {
1000
-			return false;
1001
-		}
1002
-
1003
-		$this->set_status( 'completed' );
1004
-		return $this->save();
1005
-
1006
-	}
1007
-
1008
-	/**
1009
-	 * Marks a subscription as expired
1010
-	 *
1011
-	 * @since  1.0.0
1012
-	 * @param  bool $check_expiration
1013
-	 * @return int|bool Subscription id or false if $check_expiration is true and expiration date is in the future.
1014
-	 */
1015
-	public function expire( $check_expiration = false ) {
1016
-
1017
-		if ( $check_expiration && $this->get_expiration_time() > current_time( 'timestamp' ) ) {
1018
-			// Do not mark as expired since real expiration date is in the future
1019
-			return false;
1020
-		}
1021
-
1022
-		$this->set_status( 'expired' );
1023
-		return $this->save();
1024
-
1025
-	}
1026
-
1027
-	/**
1028
-	 * Marks a subscription as failing
1029
-	 *
1030
-	 * @since  2.4.2
1031
-	 * @return int Subscription id.
1032
-	 */
1033
-	public function failing() {
1034
-		$this->set_status( 'failing' );
1035
-		return $this->save();
1036
-	}
919
+        $parent_invoice = $this->get_parent_payment();
920
+
921
+        if ( ! $parent_invoice->exists() ) {
922
+            return false;
923
+        }
924
+
925
+        // Duplicate the parent invoice.
926
+        $invoice = getpaid_duplicate_invoice( $parent_invoice );
927
+        $invoice->set_parent_id( $parent_invoice->get_id() );
928
+        $invoice->set_subscription_id( $this->get_id() );
929
+        $invoice->set_remote_subscription_id( $this->get_profile_id() );
930
+
931
+        // Set invoice items.
932
+        $subscription_group = getpaid_get_invoice_subscription_group( $parent_invoice->get_id(), $this->get_id() );
933
+        $allowed_items      = empty( $subscription_group ) ? array( $this->get_product_id() ) : array_keys( $subscription_group['items'] );
934
+        $invoice_items      = array();
935
+
936
+        foreach ( $invoice->get_items() as $item ) {
937
+            if ( in_array( $item->get_id(), $allowed_items ) ) {
938
+                $invoice_items[] = $item;
939
+            }
940
+        }
941
+
942
+        $invoice->set_items( $invoice_items );
943
+
944
+        if ( ! empty( $subscription_group['fees'] ) ) {
945
+            $invoice->set_fees( $subscription_group['fees'] );
946
+        }
947
+
948
+        // Maybe recalculate discount (Pre-GetPaid Fix).
949
+        $discount = new WPInv_Discount( $invoice->get_discount_code() );
950
+        if ( $discount->exists() && $discount->is_recurring() && 0 == $invoice->get_total_discount() ) {
951
+            $invoice->add_discount( getpaid_calculate_invoice_discount( $invoice, $discount ) );
952
+        }
953
+
954
+        $invoice->recalculate_total();
955
+        $invoice->set_status( 'wpi-pending' );
956
+        $invoice->save();
957
+
958
+        return $invoice->exists() ? $invoice : false;
959
+    }
960
+
961
+    /**
962
+     * Renews or completes a subscription
963
+     *
964
+     * @since  1.0.0
965
+     * @return int The subscription's id
966
+     */
967
+    public function renew() {
968
+
969
+        // Complete subscription if applicable
970
+        if ( $this->is_last_renewal() ) {
971
+            return $this->complete();
972
+        }
973
+
974
+        // Calculate new expiration
975
+        $frequency      = $this->get_frequency();
976
+        $period         = $this->get_period();
977
+        $new_expiration = strtotime( "+ $frequency $period", $this->get_expiration_time() );
978
+
979
+        $this->set_expiration( date( 'Y-m-d H:i:s', $new_expiration ) );
980
+        $this->set_status( 'active' );
981
+        $this->save();
982
+
983
+        do_action( 'getpaid_subscription_renewed', $this );
984
+
985
+        return $this->get_id();
986
+    }
987
+
988
+    /**
989
+     * Marks a subscription as completed
990
+     *
991
+     * Subscription is completed when the number of payments matches the billing_times field
992
+     *
993
+     * @since  1.0.0
994
+     * @return int|bool Subscription id or false if the subscription is cancelled.
995
+     */
996
+    public function complete() {
997
+
998
+        // Only mark a subscription as complete if it's not already cancelled.
999
+        if ( $this->has_status( 'cancelled' ) ) {
1000
+            return false;
1001
+        }
1002
+
1003
+        $this->set_status( 'completed' );
1004
+        return $this->save();
1005
+
1006
+    }
1007
+
1008
+    /**
1009
+     * Marks a subscription as expired
1010
+     *
1011
+     * @since  1.0.0
1012
+     * @param  bool $check_expiration
1013
+     * @return int|bool Subscription id or false if $check_expiration is true and expiration date is in the future.
1014
+     */
1015
+    public function expire( $check_expiration = false ) {
1016
+
1017
+        if ( $check_expiration && $this->get_expiration_time() > current_time( 'timestamp' ) ) {
1018
+            // Do not mark as expired since real expiration date is in the future
1019
+            return false;
1020
+        }
1021
+
1022
+        $this->set_status( 'expired' );
1023
+        return $this->save();
1024
+
1025
+    }
1026
+
1027
+    /**
1028
+     * Marks a subscription as failing
1029
+     *
1030
+     * @since  2.4.2
1031
+     * @return int Subscription id.
1032
+     */
1033
+    public function failing() {
1034
+        $this->set_status( 'failing' );
1035
+        return $this->save();
1036
+    }
1037 1037
 
1038 1038
     /**
1039 1039
      * Marks a subscription as cancelled
@@ -1042,19 +1042,19 @@  discard block
 block discarded – undo
1042 1042
      * @return int Subscription id.
1043 1043
      */
1044 1044
     public function cancel() {
1045
-		$this->set_status( 'cancelled' );
1046
-		return $this->save();
1045
+        $this->set_status( 'cancelled' );
1046
+        return $this->save();
1047 1047
     }
1048 1048
 
1049
-	/**
1050
-	 * Determines if a subscription can be cancelled both locally and with a payment processor.
1051
-	 *
1052
-	 * @since  1.0.0
1053
-	 * @return bool
1054
-	 */
1055
-	public function can_cancel() {
1056
-		return apply_filters( 'wpinv_subscription_can_cancel', $this->has_status( $this->get_cancellable_statuses() ), $this );
1057
-	}
1049
+    /**
1050
+     * Determines if a subscription can be cancelled both locally and with a payment processor.
1051
+     *
1052
+     * @since  1.0.0
1053
+     * @return bool
1054
+     */
1055
+    public function can_cancel() {
1056
+        return apply_filters( 'wpinv_subscription_can_cancel', $this->has_status( $this->get_cancellable_statuses() ), $this );
1057
+    }
1058 1058
 
1059 1059
     /**
1060 1060
      * Returns an array of subscription statuses that can be cancelled
@@ -1067,109 +1067,109 @@  discard block
 block discarded – undo
1067 1067
         return apply_filters( 'wpinv_recurring_cancellable_statuses', array( 'active', 'trialling', 'failing' ) );
1068 1068
     }
1069 1069
 
1070
-	/**
1071
-	 * Retrieves the URL to cancel subscription
1072
-	 *
1073
-	 * @since  1.0.0
1074
-	 * @return string
1075
-	 */
1076
-	public function get_cancel_url() {
1077
-		$url = getpaid_get_authenticated_action_url( 'subscription_cancel', $this->get_view_url() );
1078
-		return apply_filters( 'wpinv_subscription_cancel_url', $url, $this );
1079
-	}
1080
-
1081
-	/**
1082
-	 * Retrieves the URL to view a subscription
1083
-	 *
1084
-	 * @since  1.0.19
1085
-	 * @return string
1086
-	 */
1087
-	public function get_view_url() {
1088
-
1089
-		$url = getpaid_get_tab_url( 'gp-subscriptions', get_permalink( (int) wpinv_get_option( 'invoice_subscription_page' ) ) );
1090
-		$url = add_query_arg( 'subscription', $this->get_id(), $url );
1091
-
1092
-		return apply_filters( 'getpaid_get_subscription_view_url', $url, $this );
1093
-	}
1094
-
1095
-	/**
1096
-	 * Determines if subscription can be manually renewed
1097
-	 *
1098
-	 * This method is filtered by payment gateways in order to return true on subscriptions
1099
-	 * that can be renewed manually
1100
-	 *
1101
-	 * @since  2.5
1102
-	 * @return bool
1103
-	 */
1104
-	public function can_renew() {
1105
-		return apply_filters( 'wpinv_subscription_can_renew', true, $this );
1106
-	}
1107
-
1108
-	/**
1109
-	 * Retrieves the URL to renew a subscription
1110
-	 *
1111
-	 * @since  2.5
1112
-	 * @return string
1113
-	 */
1114
-	public function get_renew_url() {
1115
-		$url = wp_nonce_url(
1070
+    /**
1071
+     * Retrieves the URL to cancel subscription
1072
+     *
1073
+     * @since  1.0.0
1074
+     * @return string
1075
+     */
1076
+    public function get_cancel_url() {
1077
+        $url = getpaid_get_authenticated_action_url( 'subscription_cancel', $this->get_view_url() );
1078
+        return apply_filters( 'wpinv_subscription_cancel_url', $url, $this );
1079
+    }
1080
+
1081
+    /**
1082
+     * Retrieves the URL to view a subscription
1083
+     *
1084
+     * @since  1.0.19
1085
+     * @return string
1086
+     */
1087
+    public function get_view_url() {
1088
+
1089
+        $url = getpaid_get_tab_url( 'gp-subscriptions', get_permalink( (int) wpinv_get_option( 'invoice_subscription_page' ) ) );
1090
+        $url = add_query_arg( 'subscription', $this->get_id(), $url );
1091
+
1092
+        return apply_filters( 'getpaid_get_subscription_view_url', $url, $this );
1093
+    }
1094
+
1095
+    /**
1096
+     * Determines if subscription can be manually renewed
1097
+     *
1098
+     * This method is filtered by payment gateways in order to return true on subscriptions
1099
+     * that can be renewed manually
1100
+     *
1101
+     * @since  2.5
1102
+     * @return bool
1103
+     */
1104
+    public function can_renew() {
1105
+        return apply_filters( 'wpinv_subscription_can_renew', true, $this );
1106
+    }
1107
+
1108
+    /**
1109
+     * Retrieves the URL to renew a subscription
1110
+     *
1111
+     * @since  2.5
1112
+     * @return string
1113
+     */
1114
+    public function get_renew_url() {
1115
+        $url = wp_nonce_url(
1116 1116
             add_query_arg(
1117 1117
                 array(
1118
-					'getpaid-action' => 'renew_subscription',
1119
-					'sub_id'         => $this->get_id,
1118
+                    'getpaid-action' => 'renew_subscription',
1119
+                    'sub_id'         => $this->get_id,
1120 1120
                 )
1121 1121
             ),
1122 1122
             'getpaid-nonce'
1123 1123
         );
1124
-		return apply_filters( 'wpinv_subscription_renew_url', $url, $this );
1125
-	}
1126
-
1127
-	/**
1128
-	 * Determines if subscription can have their payment method updated
1129
-	 *
1130
-	 * @since  1.0.0
1131
-	 * @return bool
1132
-	 */
1133
-	public function can_update() {
1134
-		return apply_filters( 'wpinv_subscription_can_update', false, $this );
1135
-	}
1136
-
1137
-	/**
1138
-	 * Retrieves the URL to update subscription
1139
-	 *
1140
-	 * @since  1.0.0
1141
-	 * @return string
1142
-	 */
1143
-	public function get_update_url() {
1144
-		$url = add_query_arg(
1124
+        return apply_filters( 'wpinv_subscription_renew_url', $url, $this );
1125
+    }
1126
+
1127
+    /**
1128
+     * Determines if subscription can have their payment method updated
1129
+     *
1130
+     * @since  1.0.0
1131
+     * @return bool
1132
+     */
1133
+    public function can_update() {
1134
+        return apply_filters( 'wpinv_subscription_can_update', false, $this );
1135
+    }
1136
+
1137
+    /**
1138
+     * Retrieves the URL to update subscription
1139
+     *
1140
+     * @since  1.0.0
1141
+     * @return string
1142
+     */
1143
+    public function get_update_url() {
1144
+        $url = add_query_arg(
1145 1145
             array(
1146
-				'action'          => 'update',
1147
-				'subscription_id' => $this->get_id(),
1146
+                'action'          => 'update',
1147
+                'subscription_id' => $this->get_id(),
1148 1148
             )
1149 1149
         );
1150
-		return apply_filters( 'wpinv_subscription_update_url', $url, $this );
1151
-	}
1152
-
1153
-	/**
1154
-	 * Retrieves the subscription status label
1155
-	 *
1156
-	 * @since  1.0.0
1157
-	 * @return string
1158
-	 */
1159
-	public function get_status_label() {
1160
-		return getpaid_get_subscription_status_label( $this->get_status() );
1161
-	}
1162
-
1163
-	/**
1164
-	 * Retrieves the subscription status class
1165
-	 *
1166
-	 * @since  1.0.19
1167
-	 * @return string
1168
-	 */
1169
-	public function get_status_class() {
1170
-		$statuses = getpaid_get_subscription_status_classes();
1171
-		return isset( $statuses[ $this->get_status() ] ) ? $statuses[ $this->get_status() ] : 'badge-dark';
1172
-	}
1150
+        return apply_filters( 'wpinv_subscription_update_url', $url, $this );
1151
+    }
1152
+
1153
+    /**
1154
+     * Retrieves the subscription status label
1155
+     *
1156
+     * @since  1.0.0
1157
+     * @return string
1158
+     */
1159
+    public function get_status_label() {
1160
+        return getpaid_get_subscription_status_label( $this->get_status() );
1161
+    }
1162
+
1163
+    /**
1164
+     * Retrieves the subscription status class
1165
+     *
1166
+     * @since  1.0.19
1167
+     * @return string
1168
+     */
1169
+    public function get_status_class() {
1170
+        $statuses = getpaid_get_subscription_status_classes();
1171
+        return isset( $statuses[ $this->get_status() ] ) ? $statuses[ $this->get_status() ] : 'badge-dark';
1172
+    }
1173 1173
 
1174 1174
     /**
1175 1175
      * Retrieves the subscription status label
@@ -1179,11 +1179,11 @@  discard block
 block discarded – undo
1179 1179
      */
1180 1180
     public function get_status_label_html() {
1181 1181
 
1182
-		$status_label = sanitize_text_field( $this->get_status_label() );
1183
-		$class        = esc_attr( $this->get_status_class() );
1184
-		$status       = sanitize_html_class( $this->get_status() );
1182
+        $status_label = sanitize_text_field( $this->get_status_label() );
1183
+        $class        = esc_attr( $this->get_status_class() );
1184
+        $status       = sanitize_html_class( $this->get_status() );
1185 1185
 
1186
-		return "<span class='bsui'><span class='badge $class $status'>$status_label</span></span>";
1186
+        return "<span class='bsui'><span class='badge $class $status'>$status_label</span></span>";
1187 1187
     }
1188 1188
 
1189 1189
     /**
@@ -1194,75 +1194,75 @@  discard block
 block discarded – undo
1194 1194
      * @return bool
1195 1195
      */
1196 1196
     public function payment_exists( $txn_id = '' ) {
1197
-		$invoice_id = WPInv_Invoice::get_invoice_id_by_field( $txn_id, 'transaction_id' );
1197
+        $invoice_id = WPInv_Invoice::get_invoice_id_by_field( $txn_id, 'transaction_id' );
1198 1198
         return ! empty( $invoice_id );
1199
-	}
1200
-
1201
-	/**
1202
-	 * Handle the status transition.
1203
-	 */
1204
-	protected function status_transition() {
1205
-		$status_transition = $this->status_transition;
1206
-
1207
-		// Reset status transition variable.
1208
-		$this->status_transition = false;
1209
-
1210
-		if ( $status_transition ) {
1211
-			try {
1212
-
1213
-				// Fire a hook for the status change.
1214
-				do_action( 'wpinv_subscription_' . $status_transition['to'], $this->get_id(), $this, $status_transition );
1215
-				do_action( 'getpaid_subscription_' . $status_transition['to'], $this, $status_transition );
1216
-
1217
-				if ( ! empty( $status_transition['from'] ) ) {
1218
-
1219
-					/* translators: 1: old subscription status 2: new subscription status */
1220
-					$transition_note = sprintf( __( 'Subscription status changed from %1$s to %2$s.', 'invoicing' ), getpaid_get_subscription_status_label( $status_transition['from'] ), getpaid_get_subscription_status_label( $status_transition['to'] ) );
1221
-
1222
-					// Note the transition occurred.
1223
-					$this->get_parent_payment()->add_note( $transition_note, false, false, true );
1224
-
1225
-					// Fire another hook.
1226
-					do_action( 'getpaid_subscription_status_' . $status_transition['from'] . '_to_' . $status_transition['to'], $this->get_id(), $this );
1227
-					do_action( 'getpaid_subscription_status_changed', $this, $status_transition['from'], $status_transition['to'] );
1228
-
1229
-				} else {
1230
-					/* translators: %s: new invoice status */
1231
-					$transition_note = sprintf( __( 'Subscription status set to %s.', 'invoicing' ), getpaid_get_subscription_status_label( $status_transition['to'] ) );
1232
-
1233
-					// Note the transition occurred.
1234
-					$this->get_parent_payment()->add_note( $transition_note, false, false, true );
1235
-
1236
-				}
1237
-			} catch ( Exception $e ) {
1238
-				$this->get_parent_payment()->add_note( __( 'Error during subscription status transition.', 'invoicing' ) . ' ' . $e->getMessage() );
1239
-			}
1240
-		}
1241
-
1242
-	}
1243
-
1244
-	/**
1245
-	 * Save data to the database.
1246
-	 *
1247
-	 * @since 1.0.19
1248
-	 * @return int subscription ID
1249
-	 */
1250
-	public function save() {
1251
-		parent::save();
1252
-		$this->status_transition();
1253
-		return $this->get_id();
1254
-	}
1255
-
1256
-	/**
1257
-	 * Activates a subscription.
1258
-	 *
1259
-	 * @since 1.0.19
1260
-	 * @return int subscription ID
1261
-	 */
1262
-	public function activate() {
1263
-		$status = 'trialling' === $this->get_status() ? 'trialling' : 'active';
1264
-		$this->set_status( $status );
1265
-		return $this->save();
1266
-	}
1199
+    }
1200
+
1201
+    /**
1202
+     * Handle the status transition.
1203
+     */
1204
+    protected function status_transition() {
1205
+        $status_transition = $this->status_transition;
1206
+
1207
+        // Reset status transition variable.
1208
+        $this->status_transition = false;
1209
+
1210
+        if ( $status_transition ) {
1211
+            try {
1212
+
1213
+                // Fire a hook for the status change.
1214
+                do_action( 'wpinv_subscription_' . $status_transition['to'], $this->get_id(), $this, $status_transition );
1215
+                do_action( 'getpaid_subscription_' . $status_transition['to'], $this, $status_transition );
1216
+
1217
+                if ( ! empty( $status_transition['from'] ) ) {
1218
+
1219
+                    /* translators: 1: old subscription status 2: new subscription status */
1220
+                    $transition_note = sprintf( __( 'Subscription status changed from %1$s to %2$s.', 'invoicing' ), getpaid_get_subscription_status_label( $status_transition['from'] ), getpaid_get_subscription_status_label( $status_transition['to'] ) );
1221
+
1222
+                    // Note the transition occurred.
1223
+                    $this->get_parent_payment()->add_note( $transition_note, false, false, true );
1224
+
1225
+                    // Fire another hook.
1226
+                    do_action( 'getpaid_subscription_status_' . $status_transition['from'] . '_to_' . $status_transition['to'], $this->get_id(), $this );
1227
+                    do_action( 'getpaid_subscription_status_changed', $this, $status_transition['from'], $status_transition['to'] );
1228
+
1229
+                } else {
1230
+                    /* translators: %s: new invoice status */
1231
+                    $transition_note = sprintf( __( 'Subscription status set to %s.', 'invoicing' ), getpaid_get_subscription_status_label( $status_transition['to'] ) );
1232
+
1233
+                    // Note the transition occurred.
1234
+                    $this->get_parent_payment()->add_note( $transition_note, false, false, true );
1235
+
1236
+                }
1237
+            } catch ( Exception $e ) {
1238
+                $this->get_parent_payment()->add_note( __( 'Error during subscription status transition.', 'invoicing' ) . ' ' . $e->getMessage() );
1239
+            }
1240
+        }
1241
+
1242
+    }
1243
+
1244
+    /**
1245
+     * Save data to the database.
1246
+     *
1247
+     * @since 1.0.19
1248
+     * @return int subscription ID
1249
+     */
1250
+    public function save() {
1251
+        parent::save();
1252
+        $this->status_transition();
1253
+        return $this->get_id();
1254
+    }
1255
+
1256
+    /**
1257
+     * Activates a subscription.
1258
+     *
1259
+     * @since 1.0.19
1260
+     * @return int subscription ID
1261
+     */
1262
+    public function activate() {
1263
+        $status = 'trialling' === $this->get_status() ? 'trialling' : 'active';
1264
+        $this->set_status( $status );
1265
+        return $this->save();
1266
+    }
1267 1267
 
1268 1268
 }
Please login to merge, or discard this patch.
includes/class-getpaid-subscription-notification-emails.php 1 patch
Indentation   +269 added lines, -269 removed lines patch added patch discarded remove patch
@@ -13,311 +13,311 @@
 block discarded – undo
13 13
 class GetPaid_Subscription_Notification_Emails {
14 14
 
15 15
     /**
16
-	 * The array of subscription email actions.
17
-	 *
18
-	 * @param array
19
-	 */
20
-	public $subscription_actions;
16
+     * The array of subscription email actions.
17
+     *
18
+     * @param array
19
+     */
20
+    public $subscription_actions;
21 21
 
22 22
     /**
23
-	 * Class constructor
23
+     * Class constructor
24 24
      *
25
-	 */
26
-	public function __construct() {
27
-
28
-		$this->subscription_actions = apply_filters(
29
-			'getpaid_notification_email_subscription_triggers',
30
-			array(
31
-				'getpaid_subscription_trialling' => 'subscription_trial',
32
-				'getpaid_subscription_cancelled' => 'subscription_cancelled',
33
-				'getpaid_subscription_expired'   => 'subscription_expired',
34
-				'getpaid_subscription_completed' => 'subscription_complete',
35
-				'getpaid_daily_maintenance'      => 'renewal_reminder',
36
-			)
37
-		);
38
-
39
-		$this->init_hooks();
25
+     */
26
+    public function __construct() {
27
+
28
+        $this->subscription_actions = apply_filters(
29
+            'getpaid_notification_email_subscription_triggers',
30
+            array(
31
+                'getpaid_subscription_trialling' => 'subscription_trial',
32
+                'getpaid_subscription_cancelled' => 'subscription_cancelled',
33
+                'getpaid_subscription_expired'   => 'subscription_expired',
34
+                'getpaid_subscription_completed' => 'subscription_complete',
35
+                'getpaid_daily_maintenance'      => 'renewal_reminder',
36
+            )
37
+        );
38
+
39
+        $this->init_hooks();
40 40
 
41 41
     }
42 42
 
43 43
     /**
44
-	 * Registers email hooks.
45
-	 */
46
-	public function init_hooks() {
47
-
48
-		add_filter( 'getpaid_get_email_merge_tags', array( $this, 'subscription_merge_tags' ), 10, 2 );
49
-		foreach ( $this->subscription_actions as $hook => $email_type ) {
50
-
51
-			$email = new GetPaid_Notification_Email( $email_type );
52
-
53
-			if ( ! $email->is_active() ) {
54
-				continue;
55
-			}
56
-
57
-			if ( method_exists( $this, $email_type ) ) {
58
-				add_action( $hook, array( $this, $email_type ), 100, 2 );
59
-				continue;
60
-			}
61
-
62
-			do_action( 'getpaid_subscription_notification_email_register_hook', $email_type, $hook );
63
-
64
-		}
65
-
66
-	}
67
-
68
-	/**
69
-	 * Filters subscription merge tags.
70
-	 *
71
-	 * @param array $merge_tags
72
-	 * @param mixed|WPInv_Invoice|WPInv_Subscription $object
73
-	 */
74
-	public function subscription_merge_tags( $merge_tags, $object ) {
75
-
76
-		if ( is_a( $object, 'WPInv_Subscription' ) ) {
77
-			$merge_tags = array_merge(
78
-				$merge_tags,
79
-				$this->get_subscription_merge_tags( $object )
80
-			);
81
-		}
82
-
83
-		return $merge_tags;
84
-
85
-	}
86
-
87
-	/**
88
-	 * Generates subscription merge tags.
89
-	 *
90
-	 * @param WPInv_Subscription $subscription
91
-	 * @return array
92
-	 */
93
-	public function get_subscription_merge_tags( $subscription ) {
94
-
95
-		// Abort if it does not exist.
96
-		if ( ! $subscription->get_id() ) {
97
-			return array();
98
-		}
99
-
100
-		$invoice    = $subscription->get_parent_invoice();
101
-		return array(
102
-			'{subscription_renewal_date}'     => getpaid_format_date_value( $subscription->get_next_renewal_date(), __( 'Never', 'invoicing' ) ),
103
-			'{subscription_created}'          => getpaid_format_date_value( $subscription->get_date_created() ),
104
-			'{subscription_status}'           => sanitize_text_field( $subscription->get_status_label() ),
105
-			'{subscription_profile_id}'       => sanitize_text_field( $subscription->get_profile_id() ),
106
-			'{subscription_id}'               => absint( $subscription->get_id() ),
107
-			'{subscription_recurring_amount}' => sanitize_text_field( wpinv_price( $subscription->get_recurring_amount(), $invoice->get_currency() ) ),
108
-			'{subscription_initial_amount}'   => sanitize_text_field( wpinv_price( $subscription->get_initial_amount(), $invoice->get_currency() ) ),
109
-			'{subscription_recurring_period}' => getpaid_get_subscription_period_label( $subscription->get_period(), $subscription->get_frequency(), '' ),
110
-			'{subscription_bill_times}'       => $subscription->get_bill_times(),
111
-			'{subscription_url}'              => esc_url( $subscription->get_view_url() ),
112
-		);
113
-
114
-	}
115
-
116
-	/**
117
-	 * Checks if we should send a notification for a subscription.
118
-	 *
119
-	 * @param WPInv_Invoice $invoice
120
-	 * @return bool
121
-	 */
122
-	public function should_send_notification( $invoice ) {
123
-		return 0 != $invoice->get_id();
124
-	}
125
-
126
-	/**
127
-	 * Returns notification recipients.
128
-	 *
129
-	 * @param WPInv_Invoice $invoice
130
-	 * @return array
131
-	 */
132
-	public function get_recipients( $invoice ) {
133
-		$recipients = array( $invoice->get_email() );
134
-
135
-		$cc = $invoice->get_email_cc();
136
-
137
-		if ( ! empty( $cc ) ) {
138
-			$cc = array_map( 'sanitize_email', wpinv_parse_list( $cc ) );
139
-			$recipients = array_filter( array_unique( array_merge( $recipients, $cc ) ) );
140
-		}
141
-
142
-		return $recipients;
143
-	}
144
-
145
-	/**
146
-	 * Helper function to send an email.
147
-	 *
148
-	 * @param WPInv_Subscription $subscription
149
-	 * @param GetPaid_Notification_Email $email
150
-	 * @param string $type
151
-	 * @param array $extra_args Extra template args.
152
-	 */
153
-	public function send_email( $subscription, $email, $type, $extra_args = array() ) {
154
-
155
-		if ( empty( $subscription ) ) {
156
-			return;
157
-		}
158
-
159
-		if ( is_array( $subscription ) ) {
160
-			$subscription = current( $subscription );
161
-		}
162
-
163
-		if ( ! $subscription instanceof WPInv_Subscription ) {
164
-			return;
165
-		}
166
-
167
-		// Abort in case the parent invoice does not exist.
168
-		$invoice = $subscription->get_parent_invoice();
169
-		if ( ! $this->should_send_notification( $invoice ) ) {
170
-			return;
171
-		}
172
-
173
-		if ( apply_filters( 'getpaid_skip_subscription_email', false, $type, $subscription ) ) {
174
-			return;
175
-		}
176
-
177
-		do_action( 'getpaid_before_send_subscription_notification', $type, $subscription, $email );
178
-
179
-		$recipients  = $this->get_recipients( $invoice );
180
-		$mailer      = new GetPaid_Notification_Email_Sender();
181
-		$merge_tags  = $email->get_merge_tags();
182
-		$content     = $email->get_content( $merge_tags, $extra_args );
183
-		$subject     = $email->add_merge_tags( $email->get_subject(), $merge_tags );
184
-		$attachments = $email->get_attachments();
185
-
186
-		$result = $mailer->send(
187
-			apply_filters( 'getpaid_subscription_email_recipients', wpinv_parse_list( $recipients ), $email ),
188
-			$subject,
189
-			$content,
190
-			$attachments
191
-		);
192
-
193
-		// Maybe send a copy to the admin.
194
-		if ( $email->include_admin_bcc() ) {
195
-			$mailer->send(
196
-				wpinv_get_admin_email(),
197
-				$subject . __( ' - ADMIN BCC COPY', 'invoicing' ),
198
-				$content,
199
-				$attachments
200
-			);
201
-		}
202
-
203
-		if ( $result ) {
204
-			$invoice->add_system_note(
205
-				sprintf(
206
-					__( 'Successfully sent %1$s notification email to %2$s.', 'invoicing' ),
207
-					sanitize_key( $type ),
208
-					$email->is_admin_email() ? __( 'admin' ) : __( 'the customer' )
209
-				)
210
-			);
211
-		} else {
212
-			$invoice->add_system_note(
213
-				sprintf(
214
-					__( 'Failed sending %1$s notification email to %2$s.', 'invoicing' ),
215
-					sanitize_key( $type ),
216
-					$email->is_admin_email() ? __( 'admin' ) : __( 'the customer' )
217
-				)
218
-			);
219
-		}
220
-
221
-		do_action( 'getpaid_after_send_subscription_notification', $type, $subscription, $email );
222
-
223
-	}
44
+     * Registers email hooks.
45
+     */
46
+    public function init_hooks() {
47
+
48
+        add_filter( 'getpaid_get_email_merge_tags', array( $this, 'subscription_merge_tags' ), 10, 2 );
49
+        foreach ( $this->subscription_actions as $hook => $email_type ) {
50
+
51
+            $email = new GetPaid_Notification_Email( $email_type );
52
+
53
+            if ( ! $email->is_active() ) {
54
+                continue;
55
+            }
56
+
57
+            if ( method_exists( $this, $email_type ) ) {
58
+                add_action( $hook, array( $this, $email_type ), 100, 2 );
59
+                continue;
60
+            }
61
+
62
+            do_action( 'getpaid_subscription_notification_email_register_hook', $email_type, $hook );
63
+
64
+        }
65
+
66
+    }
224 67
 
225 68
     /**
226
-	 * Sends a new trial notification.
227
-	 *
228
-	 * @param WPInv_Subscription $subscription
229
-	 */
230
-	public function subscription_trial( $subscription ) {
69
+     * Filters subscription merge tags.
70
+     *
71
+     * @param array $merge_tags
72
+     * @param mixed|WPInv_Invoice|WPInv_Subscription $object
73
+     */
74
+    public function subscription_merge_tags( $merge_tags, $object ) {
231 75
 
232
-		$email     = new GetPaid_Notification_Email( __FUNCTION__, $subscription );
233
-		$this->send_email( $subscription, $email, __FUNCTION__ );
76
+        if ( is_a( $object, 'WPInv_Subscription' ) ) {
77
+            $merge_tags = array_merge(
78
+                $merge_tags,
79
+                $this->get_subscription_merge_tags( $object )
80
+            );
81
+        }
234 82
 
235
-	}
83
+        return $merge_tags;
236 84
 
237
-	/**
238
-	 * Sends a cancelled subscription notification.
239
-	 *
240
-	 * @param WPInv_Subscription $subscription
241
-	 */
242
-	public function subscription_cancelled( $subscription ) {
85
+    }
243 86
 
244
-		$email     = new GetPaid_Notification_Email( __FUNCTION__, $subscription );
245
-		$this->send_email( $subscription, $email, __FUNCTION__ );
87
+    /**
88
+     * Generates subscription merge tags.
89
+     *
90
+     * @param WPInv_Subscription $subscription
91
+     * @return array
92
+     */
93
+    public function get_subscription_merge_tags( $subscription ) {
94
+
95
+        // Abort if it does not exist.
96
+        if ( ! $subscription->get_id() ) {
97
+            return array();
98
+        }
99
+
100
+        $invoice    = $subscription->get_parent_invoice();
101
+        return array(
102
+            '{subscription_renewal_date}'     => getpaid_format_date_value( $subscription->get_next_renewal_date(), __( 'Never', 'invoicing' ) ),
103
+            '{subscription_created}'          => getpaid_format_date_value( $subscription->get_date_created() ),
104
+            '{subscription_status}'           => sanitize_text_field( $subscription->get_status_label() ),
105
+            '{subscription_profile_id}'       => sanitize_text_field( $subscription->get_profile_id() ),
106
+            '{subscription_id}'               => absint( $subscription->get_id() ),
107
+            '{subscription_recurring_amount}' => sanitize_text_field( wpinv_price( $subscription->get_recurring_amount(), $invoice->get_currency() ) ),
108
+            '{subscription_initial_amount}'   => sanitize_text_field( wpinv_price( $subscription->get_initial_amount(), $invoice->get_currency() ) ),
109
+            '{subscription_recurring_period}' => getpaid_get_subscription_period_label( $subscription->get_period(), $subscription->get_frequency(), '' ),
110
+            '{subscription_bill_times}'       => $subscription->get_bill_times(),
111
+            '{subscription_url}'              => esc_url( $subscription->get_view_url() ),
112
+        );
246 113
 
247
-	}
114
+    }
248 115
 
249
-	/**
250
-	 * Sends a subscription expired notification.
251
-	 *
252
-	 * @param WPInv_Subscription $subscription
253
-	 */
254
-	public function subscription_expired( $subscription ) {
116
+    /**
117
+     * Checks if we should send a notification for a subscription.
118
+     *
119
+     * @param WPInv_Invoice $invoice
120
+     * @return bool
121
+     */
122
+    public function should_send_notification( $invoice ) {
123
+        return 0 != $invoice->get_id();
124
+    }
255 125
 
256
-		$email     = new GetPaid_Notification_Email( __FUNCTION__, $subscription );
257
-		$this->send_email( $subscription, $email, __FUNCTION__ );
126
+    /**
127
+     * Returns notification recipients.
128
+     *
129
+     * @param WPInv_Invoice $invoice
130
+     * @return array
131
+     */
132
+    public function get_recipients( $invoice ) {
133
+        $recipients = array( $invoice->get_email() );
258 134
 
259
-	}
135
+        $cc = $invoice->get_email_cc();
260 136
 
261
-	/**
262
-	 * Sends a completed subscription notification.
263
-	 *
264
-	 * @param WPInv_Subscription $subscription
265
-	 */
266
-	public function subscription_complete( $subscription ) {
137
+        if ( ! empty( $cc ) ) {
138
+            $cc = array_map( 'sanitize_email', wpinv_parse_list( $cc ) );
139
+            $recipients = array_filter( array_unique( array_merge( $recipients, $cc ) ) );
140
+        }
267 141
 
268
-		$email     = new GetPaid_Notification_Email( __FUNCTION__, $subscription );
269
-		$this->send_email( $subscription, $email, __FUNCTION__ );
142
+        return $recipients;
143
+    }
270 144
 
271
-	}
145
+    /**
146
+     * Helper function to send an email.
147
+     *
148
+     * @param WPInv_Subscription $subscription
149
+     * @param GetPaid_Notification_Email $email
150
+     * @param string $type
151
+     * @param array $extra_args Extra template args.
152
+     */
153
+    public function send_email( $subscription, $email, $type, $extra_args = array() ) {
154
+
155
+        if ( empty( $subscription ) ) {
156
+            return;
157
+        }
158
+
159
+        if ( is_array( $subscription ) ) {
160
+            $subscription = current( $subscription );
161
+        }
162
+
163
+        if ( ! $subscription instanceof WPInv_Subscription ) {
164
+            return;
165
+        }
166
+
167
+        // Abort in case the parent invoice does not exist.
168
+        $invoice = $subscription->get_parent_invoice();
169
+        if ( ! $this->should_send_notification( $invoice ) ) {
170
+            return;
171
+        }
172
+
173
+        if ( apply_filters( 'getpaid_skip_subscription_email', false, $type, $subscription ) ) {
174
+            return;
175
+        }
176
+
177
+        do_action( 'getpaid_before_send_subscription_notification', $type, $subscription, $email );
178
+
179
+        $recipients  = $this->get_recipients( $invoice );
180
+        $mailer      = new GetPaid_Notification_Email_Sender();
181
+        $merge_tags  = $email->get_merge_tags();
182
+        $content     = $email->get_content( $merge_tags, $extra_args );
183
+        $subject     = $email->add_merge_tags( $email->get_subject(), $merge_tags );
184
+        $attachments = $email->get_attachments();
185
+
186
+        $result = $mailer->send(
187
+            apply_filters( 'getpaid_subscription_email_recipients', wpinv_parse_list( $recipients ), $email ),
188
+            $subject,
189
+            $content,
190
+            $attachments
191
+        );
192
+
193
+        // Maybe send a copy to the admin.
194
+        if ( $email->include_admin_bcc() ) {
195
+            $mailer->send(
196
+                wpinv_get_admin_email(),
197
+                $subject . __( ' - ADMIN BCC COPY', 'invoicing' ),
198
+                $content,
199
+                $attachments
200
+            );
201
+        }
202
+
203
+        if ( $result ) {
204
+            $invoice->add_system_note(
205
+                sprintf(
206
+                    __( 'Successfully sent %1$s notification email to %2$s.', 'invoicing' ),
207
+                    sanitize_key( $type ),
208
+                    $email->is_admin_email() ? __( 'admin' ) : __( 'the customer' )
209
+                )
210
+            );
211
+        } else {
212
+            $invoice->add_system_note(
213
+                sprintf(
214
+                    __( 'Failed sending %1$s notification email to %2$s.', 'invoicing' ),
215
+                    sanitize_key( $type ),
216
+                    $email->is_admin_email() ? __( 'admin' ) : __( 'the customer' )
217
+                )
218
+            );
219
+        }
220
+
221
+        do_action( 'getpaid_after_send_subscription_notification', $type, $subscription, $email );
272 222
 
273
-	/**
274
-	 * Sends a subscription renewal reminder notification.
275
-	 *
276
-	 */
277
-	public function renewal_reminder() {
223
+    }
278 224
 
279
-		$email = new GetPaid_Notification_Email( __FUNCTION__ );
225
+    /**
226
+     * Sends a new trial notification.
227
+     *
228
+     * @param WPInv_Subscription $subscription
229
+     */
230
+    public function subscription_trial( $subscription ) {
280 231
 
281
-		// Fetch reminder days.
282
-		$reminder_days = array_unique( wp_parse_id_list( $email->get_option( 'days' ) ) );
232
+        $email     = new GetPaid_Notification_Email( __FUNCTION__, $subscription );
233
+        $this->send_email( $subscription, $email, __FUNCTION__ );
283 234
 
284
-		// Abort if non is set.
285
-		if ( empty( $reminder_days ) ) {
286
-			return;
287
-		}
235
+    }
288 236
 
289
-		// Fetch matching subscriptions.
237
+    /**
238
+     * Sends a cancelled subscription notification.
239
+     *
240
+     * @param WPInv_Subscription $subscription
241
+     */
242
+    public function subscription_cancelled( $subscription ) {
243
+
244
+        $email     = new GetPaid_Notification_Email( __FUNCTION__, $subscription );
245
+        $this->send_email( $subscription, $email, __FUNCTION__ );
246
+
247
+    }
248
+
249
+    /**
250
+     * Sends a subscription expired notification.
251
+     *
252
+     * @param WPInv_Subscription $subscription
253
+     */
254
+    public function subscription_expired( $subscription ) {
255
+
256
+        $email     = new GetPaid_Notification_Email( __FUNCTION__, $subscription );
257
+        $this->send_email( $subscription, $email, __FUNCTION__ );
258
+
259
+    }
260
+
261
+    /**
262
+     * Sends a completed subscription notification.
263
+     *
264
+     * @param WPInv_Subscription $subscription
265
+     */
266
+    public function subscription_complete( $subscription ) {
267
+
268
+        $email     = new GetPaid_Notification_Email( __FUNCTION__, $subscription );
269
+        $this->send_email( $subscription, $email, __FUNCTION__ );
270
+
271
+    }
272
+
273
+    /**
274
+     * Sends a subscription renewal reminder notification.
275
+     *
276
+     */
277
+    public function renewal_reminder() {
278
+
279
+        $email = new GetPaid_Notification_Email( __FUNCTION__ );
280
+
281
+        // Fetch reminder days.
282
+        $reminder_days = array_unique( wp_parse_id_list( $email->get_option( 'days' ) ) );
283
+
284
+        // Abort if non is set.
285
+        if ( empty( $reminder_days ) ) {
286
+            return;
287
+        }
288
+
289
+        // Fetch matching subscriptions.
290 290
         $args  = array(
291 291
             'number'             => -1,
292
-			'count_total'        => false,
293
-			'status'             => 'trialling active',
292
+            'count_total'        => false,
293
+            'status'             => 'trialling active',
294 294
             'date_expires_query' => array(
295
-				'relation' => 'OR',
295
+                'relation' => 'OR',
296 296
             ),
297
-		);
297
+        );
298 298
 
299
-		foreach ( $reminder_days as $days ) {
300
-			$date = date_parse( date( 'Y-m-d', strtotime( "+$days days", current_time( 'timestamp' ) ) ) );
299
+        foreach ( $reminder_days as $days ) {
300
+            $date = date_parse( date( 'Y-m-d', strtotime( "+$days days", current_time( 'timestamp' ) ) ) );
301 301
 
302
-			$args['date_expires_query'][] = array(
303
-				'year'  => $date['year'],
304
-				'month' => $date['month'],
305
-				'day'   => $date['day'],
306
-			);
302
+            $args['date_expires_query'][] = array(
303
+                'year'  => $date['year'],
304
+                'month' => $date['month'],
305
+                'day'   => $date['day'],
306
+            );
307 307
 
308
-		}
308
+        }
309 309
 
310
-		$subscriptions = new GetPaid_Subscriptions_Query( $args );
310
+        $subscriptions = new GetPaid_Subscriptions_Query( $args );
311 311
 
312 312
         foreach ( $subscriptions->get_results() as $subscription ) {
313 313
 
314
-			// Skip packages.
315
-			if ( apply_filters( 'getpaid_send_subscription_renewal_reminder_email', true ) ) {
316
-				$email->object = $subscription;
317
-            	$this->send_email( $subscription, $email, __FUNCTION__ );
318
-			}
319
-		}
314
+            // Skip packages.
315
+            if ( apply_filters( 'getpaid_send_subscription_renewal_reminder_email', true ) ) {
316
+                $email->object = $subscription;
317
+                $this->send_email( $subscription, $email, __FUNCTION__ );
318
+            }
319
+        }
320 320
 
321
-	}
321
+    }
322 322
 
323 323
 }
Please login to merge, or discard this patch.
templates/invoice/line-totals.php 1 patch
Indentation   +11 added lines, -11 removed lines patch added patch discarded remove patch
@@ -39,40 +39,40 @@
 block discarded – undo
39 39
                                 if ( 'tax' === $key ) {
40 40
                                     wpinv_the_price( $invoice->get_total_tax(), $invoice->get_currency() );
41 41
 
42
-								if ( wpinv_use_taxes() && ! $invoice->get_disable_taxes() ) {
42
+                                if ( wpinv_use_taxes() && ! $invoice->get_disable_taxes() ) {
43 43
 
44
-									$taxes = $invoice->get_total_tax();
45
-									if ( empty( $taxes ) && GetPaid_Payment_Form_Submission_Taxes::is_eu_transaction( $invoice->get_country() ) ) {
46
-										echo ' <em class="text-muted small">';
47
-										_x( '(Reverse charged)', 'This is a legal term for reverse charging tax in the EU', 'invoicing' );
48
-										echo '</em>';
44
+                                    $taxes = $invoice->get_total_tax();
45
+                                    if ( empty( $taxes ) && GetPaid_Payment_Form_Submission_Taxes::is_eu_transaction( $invoice->get_country() ) ) {
46
+                                        echo ' <em class="text-muted small">';
47
+                                        _x( '(Reverse charged)', 'This is a legal term for reverse charging tax in the EU', 'invoicing' );
48
+                                        echo '</em>';
49 49
                                     }
50 50
 }
51 51
 }
52 52
 
53 53
                                 // Total Fee.
54 54
                                 if ( 'fee' === $key ) {
55
-								wpinv_the_price( $invoice->get_total_fees(), $invoice->get_currency() );
55
+                                wpinv_the_price( $invoice->get_total_fees(), $invoice->get_currency() );
56 56
                                 }
57 57
 
58 58
                                 // Total discount.
59 59
                                 if ( 'discount' === $key ) {
60
-								wpinv_the_price( $invoice->get_total_discount(), $invoice->get_currency() );
60
+                                wpinv_the_price( $invoice->get_total_discount(), $invoice->get_currency() );
61 61
                                 }
62 62
 
63 63
                                 // Shipping.
64 64
                                 if ( 'shipping' === $key ) {
65
-								wpinv_the_price( $invoice->get_shipping(), $invoice->get_currency() );
65
+                                wpinv_the_price( $invoice->get_shipping(), $invoice->get_currency() );
66 66
                                 }
67 67
 
68 68
                                 // Sub total.
69 69
                                 if ( 'subtotal' === $key ) {
70
-								wpinv_the_price( $invoice->get_subtotal(), $invoice->get_currency() );
70
+                                wpinv_the_price( $invoice->get_subtotal(), $invoice->get_currency() );
71 71
                                 }
72 72
 
73 73
                                 // Total.
74 74
                                 if ( 'total' === $key ) {
75
-								wpinv_the_price( $invoice->get_total(), $invoice->get_currency() );
75
+                                wpinv_the_price( $invoice->get_total(), $invoice->get_currency() );
76 76
                                 }
77 77
 
78 78
                                 // Fires when printing a cart total.
Please login to merge, or discard this patch.
includes/admin/class-wpinv-customers-table.php 1 patch
Indentation   +368 added lines, -368 removed lines patch added patch discarded remove patch
@@ -11,7 +11,7 @@  discard block
 block discarded – undo
11 11
 
12 12
 // Load WP_List_Table if not loaded
13 13
 if ( ! class_exists( 'WP_List_Table' ) ) {
14
-	require_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php';
14
+    require_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php';
15 15
 }
16 16
 
17 17
 /**
@@ -23,375 +23,375 @@  discard block
 block discarded – undo
23 23
  */
24 24
 class WPInv_Customers_Table extends WP_List_Table {
25 25
 
26
-	/**
27
-	 * @var int Number of items per page
28
-	 * @since 1.0.19
29
-	 */
30
-	public $per_page = 10;
31
-
32
-	/**
33
-	 * @var int Number of items
34
-	 * @since 1.0.19
35
-	 */
36
-	public $total = 0;
37
-
38
-	/**
39
-	 * Get things started
40
-	 *
41
-	 * @since 1.0.19
42
-	 * @see WP_List_Table::__construct()
43
-	 */
44
-	public function __construct() {
45
-
46
-		// Set parent defaults
47
-		parent::__construct(
26
+    /**
27
+     * @var int Number of items per page
28
+     * @since 1.0.19
29
+     */
30
+    public $per_page = 10;
31
+
32
+    /**
33
+     * @var int Number of items
34
+     * @since 1.0.19
35
+     */
36
+    public $total = 0;
37
+
38
+    /**
39
+     * Get things started
40
+     *
41
+     * @since 1.0.19
42
+     * @see WP_List_Table::__construct()
43
+     */
44
+    public function __construct() {
45
+
46
+        // Set parent defaults
47
+        parent::__construct(
48 48
             array(
49
-				'singular' => 'id',
50
-				'plural'   => 'ids',
51
-				'ajax'     => false,
49
+                'singular' => 'id',
50
+                'plural'   => 'ids',
51
+                'ajax'     => false,
52 52
             )
53 53
         );
54 54
 
55
-	}
56
-
57
-	/**
58
-	 * Gets the name of the primary column.
59
-	 *
60
-	 * @since 1.0.19
61
-	 * @access protected
62
-	 *
63
-	 * @return string Name of the primary column.
64
-	 */
65
-	protected function get_primary_column_name() {
66
-		return 'name';
67
-	}
68
-
69
-	/**
70
-	 * This function renders most of the columns in the list table.
71
-	 *
72
-	 * @since 1.0.19
73
-	 *
74
-	 * @param WP_User $item
75
-	 * @param string $column_name The name of the column
76
-	 *
77
-	 * @return string Column Name
78
-	 */
79
-	public function column_default( $item, $column_name ) {
80
-		$value = esc_html( get_user_meta( $item->ID, '_wpinv_' . $column_name, true ) );
81
-		return apply_filters( 'wpinv_customers_table_column' . $column_name, $value, $item );
82
-	}
83
-
84
-	/**
85
-	 * Displays the country column.
86
-	 *
87
-	 * @since 1.0.19
88
-	 *
89
-	 * @param WP_User $user
90
-	 *
91
-	 * @return string Column Name
92
-	 */
93
-	public function column_country( $user ) {
94
-		$country = wpinv_sanitize_country( $user->_wpinv_country );
95
-		if ( $country ) {
96
-			$country = wpinv_country_name( $country );
97
-		}
98
-		return esc_html( $country );
99
-	}
100
-
101
-	/**
102
-	 * Displays the state column.
103
-	 *
104
-	 * @since 1.0.19
105
-	 *
106
-	 * @param WP_User $user
107
-	 *
108
-	 * @return string Column Name
109
-	 */
110
-	public function column_state( $user ) {
111
-		$country = wpinv_sanitize_country( $user->_wpinv_country );
112
-		$state   = $user->_wpinv_state;
113
-		if ( $state ) {
114
-			$state = wpinv_state_name( $state, $country );
115
-		}
116
-
117
-		return esc_html( $state );
118
-	}
119
-
120
-	/**
121
-	 * Displays the signup column.
122
-	 *
123
-	 * @since 1.0.19
124
-	 *
125
-	 * @param WP_User $user
126
-	 *
127
-	 * @return string Column Name
128
-	 */
129
-	public function column_signup( $user ) {
130
-		return getpaid_format_date_value( $user->user_registered );
131
-	}
132
-
133
-	/**
134
-	 * Displays the total spent column.
135
-	 *
136
-	 * @since 1.0.19
137
-	 *
138
-	 * @param WP_User $user
139
-	 *
140
-	 * @return string Column Name
141
-	 */
142
-	public function column_total( $user ) {
143
-		return wpinv_price( $this->column_total_raw( $user ) );
144
-	}
145
-
146
-	/**
147
-	 * Displays the total spent column.
148
-	 *
149
-	 * @since 1.0.19
150
-	 *
151
-	 * @param WP_User $user
152
-	 *
153
-	 * @return float
154
-	 */
155
-	public function column_total_raw( $user ) {
156
-
157
-		$args = array(
158
-			'data'           => array(
159
-
160
-				'total' => array(
161
-					'type'     => 'invoice_data',
162
-					'function' => 'SUM',
163
-					'name'     => 'total_sales',
164
-				),
165
-
166
-			),
167
-			'where'          => array(
168
-
169
-				'author' => array(
170
-					'type'     => 'post_data',
171
-					'value'    => absint( $user->ID ),
172
-					'key'      => 'posts.post_author',
173
-					'operator' => '=',
174
-				),
175
-
176
-			),
177
-			'query_type'     => 'get_var',
178
-			'invoice_status' => array( 'wpi-renewal', 'wpi-processing', 'publish' ),
179
-		);
180
-
181
-		return wpinv_round_amount( GetPaid_Reports_Helper::get_invoice_report_data( $args ) );
182
-
183
-	}
184
-
185
-	/**
186
-	 * Displays the total spent column.
187
-	 *
188
-	 * @since 1.0.19
189
-	 *
190
-	 * @param WP_User $user
191
-	 *
192
-	 * @return string Column Name
193
-	 */
194
-	public function column_invoices( $user ) {
195
-
196
-		$args = array(
197
-			'data'           => array(
198
-
199
-				'ID' => array(
200
-					'type'     => 'post_data',
201
-					'function' => 'COUNT',
202
-					'name'     => 'count',
203
-					'distinct' => true,
204
-				),
205
-
206
-			),
207
-			'where'          => array(
208
-
209
-				'author' => array(
210
-					'type'     => 'post_data',
211
-					'value'    => absint( $user->ID ),
212
-					'key'      => 'posts.post_author',
213
-					'operator' => '=',
214
-				),
215
-
216
-			),
217
-			'query_type'     => 'get_var',
218
-			'invoice_status' => array_keys( wpinv_get_invoice_statuses() ),
219
-		);
220
-
221
-		$value = absint( GetPaid_Reports_Helper::get_invoice_report_data( $args ) );
222
-		$url   = add_query_arg( array( 'post_type' => 'wpi_invoice', 'author' => $user->ID ), admin_url( 'edit.php' ) );
223
-		return empty( $value ) ? '0' : '<a href="' . esc_url( $url ) . '">' . absint( $value ) . '</a>';
224
-
225
-	}
226
-
227
-	/**
228
-	 * Generates content for a single row of the table
229
-	 * @since 1.0.19
230
-	 *
231
-	 * @param int $item The user id.
232
-	 */
233
-	public function single_row( $item ) {
234
-		$item = get_user_by( 'id', $item );
235
-
236
-		if ( empty( $item ) ) {
237
-			return;
238
-		}
239
-
240
-		echo '<tr>';
241
-		$this->single_row_columns( $item );
242
-		echo '</tr>';
243
-	}
244
-
245
-	/**
246
-	 * Displays the customers name
247
-	 *
248
-	 * @param  WP_User $customer customer.
249
-	 * @return string
250
-	 */
251
-	public function column_name( $customer ) {
252
-
253
-		// Customer view URL.
254
-		$view_url    = esc_url( add_query_arg( 'user_id', $customer->ID, admin_url( 'user-edit.php' ) ) );
255
-		$row_actions = $this->row_actions(
256
-			array(
257
-				'view' => '<a href="' . $view_url . '#getpaid-fieldset-billing">' . __( 'Edit Details', 'invoicing' ) . '</a>',
258
-			)
259
-		);
260
-
261
-		// Get user's address.
262
-		$address = wpinv_get_user_address( $customer->ID );
263
-
264
-		// Customer email address.
265
-		$email       = sanitize_email( $customer->user_email );
266
-
267
-		// Customer's avatar.
268
-		$avatar = esc_url( get_avatar_url( $email ) );
269
-		$avatar = "<img src='$avatar' height='32' width='32'/>";
270
-
271
-		// Customer's name.
272
-		$name   = esc_html( "{$address['first_name']} {$address['last_name']}" );
273
-
274
-		if ( empty( trim( $name ) ) ) {
275
-			$name = esc_html( $address['display_name'] );
276
-		}
277
-
278
-		if ( ! empty( $name ) ) {
279
-			$name = "<div style='overflow: hidden;height: 18px;'>$name</div>";
280
-		}
281
-
282
-		$email = "<div class='row-title'><a href='$view_url'>$email</a></div>";
283
-
284
-		return "<div style='display: flex;'><div>$avatar</div><div style='margin-left: 10px;'>$name<strong>$email</strong>$row_actions</div></div>";
285
-
286
-	}
287
-
288
-	/**
289
-	 * Retrieve the table columns
290
-	 *
291
-	 * @since 1.0.19
292
-	 * @return array $columns Array of all the list table columns
293
-	 */
294
-	public function get_columns() {
295
-
296
-		$columns = array(
297
-			'name'     => __( 'Name', 'invoicing' ),
298
-			'country'  => __( 'Country', 'invoicing' ),
299
-			'state'    => __( 'State', 'invoicing' ),
300
-			'city'     => __( 'City', 'invoicing' ),
301
-			'zip'      => __( 'ZIP', 'invoicing' ),
302
-			'address'  => __( 'Address', 'invoicing' ),
303
-			'phone'    => __( 'Phone', 'invoicing' ),
304
-			'company'  => __( 'Company', 'invoicing' ),
305
-			'invoices' => __( 'Invoices', 'invoicing' ),
306
-			'total'    => __( 'Total Spend', 'invoicing' ),
307
-			'signup'   => __( 'Date created', 'invoicing' ),
308
-		);
309
-		return apply_filters( 'wpinv_customers_table_columns', $columns );
310
-
311
-	}
312
-
313
-	/**
314
-	 * Retrieve the current page number
315
-	 *
316
-	 * @since 1.0.19
317
-	 * @return int Current page number
318
-	 */
319
-	public function get_paged() {
320
-		return isset( $_GET['paged'] ) ? absint( $_GET['paged'] ) : 1;
321
-	}
322
-
323
-	/**
324
-	 * Returns bulk actions.
325
-	 *
326
-	 * @since 1.0.19
327
-	 * @return void
328
-	 */
329
-	public function bulk_actions( $which = '' ) {
330
-		return array();
331
-	}
332
-
333
-	/**
334
-	 *  Prepares the display query
335
-	 */
336
-	public function prepare_query() {
337
-		global $wpdb;
338
-
339
-		$post_types = '';
340
-
341
-		foreach ( array_keys( getpaid_get_invoice_post_types() ) as $post_type ) {
342
-			$post_types .= $wpdb->prepare( 'post_type=%s OR ', $post_type );
343
-		}
344
-
345
-		$post_types = rtrim( $post_types, ' OR' );
346
-
347
-		// Maybe search.
348
-		if ( ! empty( $_POST['s'] ) ) {
349
-			$users = get_users(
350
-				array(
351
-					'search'         => '*' . sanitize_text_field( urldecode( $_POST['s'] ) ) . '*',
352
-					'search_columns' => array( 'user_login', 'user_email', 'display_name' ),
353
-					'fields'         => 'ID',
354
-				)
355
-			);
356
-
357
-			$users      = implode( ', ', $users );
358
-			$post_types = "($post_types) AND ( post_author IN ( $users ) )";
359
-		}
360
-
361
-		// Users with invoices.
362
-    	$customers = $wpdb->get_col(
363
-			$wpdb->prepare(
364
-				"SELECT DISTINCT( post_author ) FROM $wpdb->posts WHERE $post_types LIMIT %d,%d",
365
-				$this->get_paged() * 10 - 10,
366
-				$this->per_page
367
-			)
368
-		);
369
-
370
-		$this->items = $customers;
371
-		$this->total = (int) $wpdb->get_var( "SELECT COUNT( DISTINCT( post_author ) ) FROM $wpdb->posts WHERE $post_types" );
372
-
373
-	}
374
-
375
-	/**
376
-	 * Setup the final data for the table
377
-	 *
378
-	 * @since 1.0.19
379
-	 * @return void
380
-	 */
381
-	public function prepare_items() {
382
-		$columns               = $this->get_columns();
383
-		$hidden                = array(); // No hidden columns
384
-		$sortable              = $this->get_sortable_columns();
385
-		$this->_column_headers = array( $columns, $hidden, $sortable );
386
-		$this->prepare_query();
387
-
388
-		$this->set_pagination_args(
389
-			array(
390
-				'total_items' => $this->total,
391
-				'per_page'    => $this->per_page,
392
-				'total_pages' => ceil( $this->total / $this->per_page ),
393
-			)
394
-		);
395
-
396
-	}
55
+    }
56
+
57
+    /**
58
+     * Gets the name of the primary column.
59
+     *
60
+     * @since 1.0.19
61
+     * @access protected
62
+     *
63
+     * @return string Name of the primary column.
64
+     */
65
+    protected function get_primary_column_name() {
66
+        return 'name';
67
+    }
68
+
69
+    /**
70
+     * This function renders most of the columns in the list table.
71
+     *
72
+     * @since 1.0.19
73
+     *
74
+     * @param WP_User $item
75
+     * @param string $column_name The name of the column
76
+     *
77
+     * @return string Column Name
78
+     */
79
+    public function column_default( $item, $column_name ) {
80
+        $value = esc_html( get_user_meta( $item->ID, '_wpinv_' . $column_name, true ) );
81
+        return apply_filters( 'wpinv_customers_table_column' . $column_name, $value, $item );
82
+    }
83
+
84
+    /**
85
+     * Displays the country column.
86
+     *
87
+     * @since 1.0.19
88
+     *
89
+     * @param WP_User $user
90
+     *
91
+     * @return string Column Name
92
+     */
93
+    public function column_country( $user ) {
94
+        $country = wpinv_sanitize_country( $user->_wpinv_country );
95
+        if ( $country ) {
96
+            $country = wpinv_country_name( $country );
97
+        }
98
+        return esc_html( $country );
99
+    }
100
+
101
+    /**
102
+     * Displays the state column.
103
+     *
104
+     * @since 1.0.19
105
+     *
106
+     * @param WP_User $user
107
+     *
108
+     * @return string Column Name
109
+     */
110
+    public function column_state( $user ) {
111
+        $country = wpinv_sanitize_country( $user->_wpinv_country );
112
+        $state   = $user->_wpinv_state;
113
+        if ( $state ) {
114
+            $state = wpinv_state_name( $state, $country );
115
+        }
116
+
117
+        return esc_html( $state );
118
+    }
119
+
120
+    /**
121
+     * Displays the signup column.
122
+     *
123
+     * @since 1.0.19
124
+     *
125
+     * @param WP_User $user
126
+     *
127
+     * @return string Column Name
128
+     */
129
+    public function column_signup( $user ) {
130
+        return getpaid_format_date_value( $user->user_registered );
131
+    }
132
+
133
+    /**
134
+     * Displays the total spent column.
135
+     *
136
+     * @since 1.0.19
137
+     *
138
+     * @param WP_User $user
139
+     *
140
+     * @return string Column Name
141
+     */
142
+    public function column_total( $user ) {
143
+        return wpinv_price( $this->column_total_raw( $user ) );
144
+    }
145
+
146
+    /**
147
+     * Displays the total spent column.
148
+     *
149
+     * @since 1.0.19
150
+     *
151
+     * @param WP_User $user
152
+     *
153
+     * @return float
154
+     */
155
+    public function column_total_raw( $user ) {
156
+
157
+        $args = array(
158
+            'data'           => array(
159
+
160
+                'total' => array(
161
+                    'type'     => 'invoice_data',
162
+                    'function' => 'SUM',
163
+                    'name'     => 'total_sales',
164
+                ),
165
+
166
+            ),
167
+            'where'          => array(
168
+
169
+                'author' => array(
170
+                    'type'     => 'post_data',
171
+                    'value'    => absint( $user->ID ),
172
+                    'key'      => 'posts.post_author',
173
+                    'operator' => '=',
174
+                ),
175
+
176
+            ),
177
+            'query_type'     => 'get_var',
178
+            'invoice_status' => array( 'wpi-renewal', 'wpi-processing', 'publish' ),
179
+        );
180
+
181
+        return wpinv_round_amount( GetPaid_Reports_Helper::get_invoice_report_data( $args ) );
182
+
183
+    }
184
+
185
+    /**
186
+     * Displays the total spent column.
187
+     *
188
+     * @since 1.0.19
189
+     *
190
+     * @param WP_User $user
191
+     *
192
+     * @return string Column Name
193
+     */
194
+    public function column_invoices( $user ) {
195
+
196
+        $args = array(
197
+            'data'           => array(
198
+
199
+                'ID' => array(
200
+                    'type'     => 'post_data',
201
+                    'function' => 'COUNT',
202
+                    'name'     => 'count',
203
+                    'distinct' => true,
204
+                ),
205
+
206
+            ),
207
+            'where'          => array(
208
+
209
+                'author' => array(
210
+                    'type'     => 'post_data',
211
+                    'value'    => absint( $user->ID ),
212
+                    'key'      => 'posts.post_author',
213
+                    'operator' => '=',
214
+                ),
215
+
216
+            ),
217
+            'query_type'     => 'get_var',
218
+            'invoice_status' => array_keys( wpinv_get_invoice_statuses() ),
219
+        );
220
+
221
+        $value = absint( GetPaid_Reports_Helper::get_invoice_report_data( $args ) );
222
+        $url   = add_query_arg( array( 'post_type' => 'wpi_invoice', 'author' => $user->ID ), admin_url( 'edit.php' ) );
223
+        return empty( $value ) ? '0' : '<a href="' . esc_url( $url ) . '">' . absint( $value ) . '</a>';
224
+
225
+    }
226
+
227
+    /**
228
+     * Generates content for a single row of the table
229
+     * @since 1.0.19
230
+     *
231
+     * @param int $item The user id.
232
+     */
233
+    public function single_row( $item ) {
234
+        $item = get_user_by( 'id', $item );
235
+
236
+        if ( empty( $item ) ) {
237
+            return;
238
+        }
239
+
240
+        echo '<tr>';
241
+        $this->single_row_columns( $item );
242
+        echo '</tr>';
243
+    }
244
+
245
+    /**
246
+     * Displays the customers name
247
+     *
248
+     * @param  WP_User $customer customer.
249
+     * @return string
250
+     */
251
+    public function column_name( $customer ) {
252
+
253
+        // Customer view URL.
254
+        $view_url    = esc_url( add_query_arg( 'user_id', $customer->ID, admin_url( 'user-edit.php' ) ) );
255
+        $row_actions = $this->row_actions(
256
+            array(
257
+                'view' => '<a href="' . $view_url . '#getpaid-fieldset-billing">' . __( 'Edit Details', 'invoicing' ) . '</a>',
258
+            )
259
+        );
260
+
261
+        // Get user's address.
262
+        $address = wpinv_get_user_address( $customer->ID );
263
+
264
+        // Customer email address.
265
+        $email       = sanitize_email( $customer->user_email );
266
+
267
+        // Customer's avatar.
268
+        $avatar = esc_url( get_avatar_url( $email ) );
269
+        $avatar = "<img src='$avatar' height='32' width='32'/>";
270
+
271
+        // Customer's name.
272
+        $name   = esc_html( "{$address['first_name']} {$address['last_name']}" );
273
+
274
+        if ( empty( trim( $name ) ) ) {
275
+            $name = esc_html( $address['display_name'] );
276
+        }
277
+
278
+        if ( ! empty( $name ) ) {
279
+            $name = "<div style='overflow: hidden;height: 18px;'>$name</div>";
280
+        }
281
+
282
+        $email = "<div class='row-title'><a href='$view_url'>$email</a></div>";
283
+
284
+        return "<div style='display: flex;'><div>$avatar</div><div style='margin-left: 10px;'>$name<strong>$email</strong>$row_actions</div></div>";
285
+
286
+    }
287
+
288
+    /**
289
+     * Retrieve the table columns
290
+     *
291
+     * @since 1.0.19
292
+     * @return array $columns Array of all the list table columns
293
+     */
294
+    public function get_columns() {
295
+
296
+        $columns = array(
297
+            'name'     => __( 'Name', 'invoicing' ),
298
+            'country'  => __( 'Country', 'invoicing' ),
299
+            'state'    => __( 'State', 'invoicing' ),
300
+            'city'     => __( 'City', 'invoicing' ),
301
+            'zip'      => __( 'ZIP', 'invoicing' ),
302
+            'address'  => __( 'Address', 'invoicing' ),
303
+            'phone'    => __( 'Phone', 'invoicing' ),
304
+            'company'  => __( 'Company', 'invoicing' ),
305
+            'invoices' => __( 'Invoices', 'invoicing' ),
306
+            'total'    => __( 'Total Spend', 'invoicing' ),
307
+            'signup'   => __( 'Date created', 'invoicing' ),
308
+        );
309
+        return apply_filters( 'wpinv_customers_table_columns', $columns );
310
+
311
+    }
312
+
313
+    /**
314
+     * Retrieve the current page number
315
+     *
316
+     * @since 1.0.19
317
+     * @return int Current page number
318
+     */
319
+    public function get_paged() {
320
+        return isset( $_GET['paged'] ) ? absint( $_GET['paged'] ) : 1;
321
+    }
322
+
323
+    /**
324
+     * Returns bulk actions.
325
+     *
326
+     * @since 1.0.19
327
+     * @return void
328
+     */
329
+    public function bulk_actions( $which = '' ) {
330
+        return array();
331
+    }
332
+
333
+    /**
334
+     *  Prepares the display query
335
+     */
336
+    public function prepare_query() {
337
+        global $wpdb;
338
+
339
+        $post_types = '';
340
+
341
+        foreach ( array_keys( getpaid_get_invoice_post_types() ) as $post_type ) {
342
+            $post_types .= $wpdb->prepare( 'post_type=%s OR ', $post_type );
343
+        }
344
+
345
+        $post_types = rtrim( $post_types, ' OR' );
346
+
347
+        // Maybe search.
348
+        if ( ! empty( $_POST['s'] ) ) {
349
+            $users = get_users(
350
+                array(
351
+                    'search'         => '*' . sanitize_text_field( urldecode( $_POST['s'] ) ) . '*',
352
+                    'search_columns' => array( 'user_login', 'user_email', 'display_name' ),
353
+                    'fields'         => 'ID',
354
+                )
355
+            );
356
+
357
+            $users      = implode( ', ', $users );
358
+            $post_types = "($post_types) AND ( post_author IN ( $users ) )";
359
+        }
360
+
361
+        // Users with invoices.
362
+        $customers = $wpdb->get_col(
363
+            $wpdb->prepare(
364
+                "SELECT DISTINCT( post_author ) FROM $wpdb->posts WHERE $post_types LIMIT %d,%d",
365
+                $this->get_paged() * 10 - 10,
366
+                $this->per_page
367
+            )
368
+        );
369
+
370
+        $this->items = $customers;
371
+        $this->total = (int) $wpdb->get_var( "SELECT COUNT( DISTINCT( post_author ) ) FROM $wpdb->posts WHERE $post_types" );
372
+
373
+    }
374
+
375
+    /**
376
+     * Setup the final data for the table
377
+     *
378
+     * @since 1.0.19
379
+     * @return void
380
+     */
381
+    public function prepare_items() {
382
+        $columns               = $this->get_columns();
383
+        $hidden                = array(); // No hidden columns
384
+        $sortable              = $this->get_sortable_columns();
385
+        $this->_column_headers = array( $columns, $hidden, $sortable );
386
+        $this->prepare_query();
387
+
388
+        $this->set_pagination_args(
389
+            array(
390
+                'total_items' => $this->total,
391
+                'per_page'    => $this->per_page,
392
+                'total_pages' => ceil( $this->total / $this->per_page ),
393
+            )
394
+        );
395
+
396
+    }
397 397
 }
Please login to merge, or discard this patch.
templates/payment-forms/form.php 1 patch
Indentation   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -57,7 +57,7 @@  discard block
 block discarded – undo
57 57
 
58 58
         // And the optional invoice id.
59 59
         if ( ! empty( $form->invoice ) ) {
60
-		    getpaid_hidden_field( 'invoice_id', $form->invoice->get_id() );
60
+            getpaid_hidden_field( 'invoice_id', $form->invoice->get_id() );
61 61
         }
62 62
 
63 63
         // We also want to include the form id.
@@ -77,7 +77,7 @@  discard block
 block discarded – undo
77 77
 
78 78
                     foreach ( $form->get_elements() as $element ) {
79 79
 
80
-					    if ( isset( $element['type'] ) ) {
80
+                        if ( isset( $element['type'] ) ) {
81 81
                             $grid_class = getpaid_get_form_element_grid_class( $element );
82 82
                             echo "<div class='" . esc_attr( $grid_class ) . "'>";
83 83
                             do_action( 'getpaid_payment_form_element', $element, $form );
Please login to merge, or discard this patch.
includes/admin/meta-boxes/class-getpaid-meta-box-description.php 1 patch
Indentation   +19 added lines, -19 removed lines patch added patch discarded remove patch
@@ -13,25 +13,25 @@
 block discarded – undo
13 13
  */
14 14
 class GetPaid_Meta_Box_Description {
15 15
 
16
-	/**
17
-	 * Output the metabox.
18
-	 *
19
-	 * @param WP_Post $post Post object.
20
-	 */
21
-	public static function output( $post ) {
16
+    /**
17
+     * Output the metabox.
18
+     *
19
+     * @param WP_Post $post Post object.
20
+     */
21
+    public static function output( $post ) {
22 22
 
23
-		$settings = array(
24
-			'textarea_name' => 'excerpt',
25
-			'quicktags'     => array( 'buttons' => 'em,strong,link' ),
26
-			'teeny'         => true,
27
-			'media_buttons' => false,
28
-			'tinymce'       => array(
29
-				'theme_advanced_buttons1' => 'bold,italic,strikethrough,separator,justifyleft,justifycenter,justifyright,separator,link,unlink,separator,undo,redo,separator',
30
-				'theme_advanced_buttons2' => '',
31
-			),
32
-			'editor_css'    => '<style>#wp-excerpt-editor-container .wp-editor-area{height:175px; width:100%;}</style>',
33
-		);
23
+        $settings = array(
24
+            'textarea_name' => 'excerpt',
25
+            'quicktags'     => array( 'buttons' => 'em,strong,link' ),
26
+            'teeny'         => true,
27
+            'media_buttons' => false,
28
+            'tinymce'       => array(
29
+                'theme_advanced_buttons1' => 'bold,italic,strikethrough,separator,justifyleft,justifycenter,justifyright,separator,link,unlink,separator,undo,redo,separator',
30
+                'theme_advanced_buttons2' => '',
31
+            ),
32
+            'editor_css'    => '<style>#wp-excerpt-editor-container .wp-editor-area{height:175px; width:100%;}</style>',
33
+        );
34 34
 
35
-		wp_editor( htmlspecialchars_decode( $post->post_excerpt, ENT_QUOTES ), 'excerpt', apply_filters( 'getpaid_description_editor_settings', $settings ) );
36
-	}
35
+        wp_editor( htmlspecialchars_decode( $post->post_excerpt, ENT_QUOTES ), 'excerpt', apply_filters( 'getpaid_description_editor_settings', $settings ) );
36
+    }
37 37
 }
Please login to merge, or discard this patch.
includes/admin/class-getpaid-metaboxes.php 1 patch
Indentation   +243 added lines, -243 removed lines patch added patch discarded remove patch
@@ -12,280 +12,280 @@
 block discarded – undo
12 12
  */
13 13
 class GetPaid_Metaboxes {
14 14
 
15
-	/**
16
-	 * Only save metaboxes once.
17
-	 *
18
-	 * @var boolean
19
-	 */
20
-	private static $saved_meta_boxes = false;
15
+    /**
16
+     * Only save metaboxes once.
17
+     *
18
+     * @var boolean
19
+     */
20
+    private static $saved_meta_boxes = false;
21 21
 
22 22
     /**
23
-	 * Hook in methods.
24
-	 */
25
-	public static function init() {
23
+     * Hook in methods.
24
+     */
25
+    public static function init() {
26 26
 
27
-		// Register metaboxes.
28
-		add_action( 'add_meta_boxes', 'GetPaid_Metaboxes::add_meta_boxes', 50, 2 );
27
+        // Register metaboxes.
28
+        add_action( 'add_meta_boxes', 'GetPaid_Metaboxes::add_meta_boxes', 50, 2 );
29 29
 
30
-		// Remove metaboxes.
31
-		add_action( 'add_meta_boxes', 'GetPaid_Metaboxes::remove_meta_boxes', 30 );
30
+        // Remove metaboxes.
31
+        add_action( 'add_meta_boxes', 'GetPaid_Metaboxes::remove_meta_boxes', 30 );
32 32
 
33
-		// Rename metaboxes.
34
-		add_action( 'add_meta_boxes', 'GetPaid_Metaboxes::rename_meta_boxes', 45 );
33
+        // Rename metaboxes.
34
+        add_action( 'add_meta_boxes', 'GetPaid_Metaboxes::rename_meta_boxes', 45 );
35 35
 
36
-		// Save metaboxes.
37
-		add_action( 'save_post', 'GetPaid_Metaboxes::save_meta_boxes', 1, 2 );
38
-	}
36
+        // Save metaboxes.
37
+        add_action( 'save_post', 'GetPaid_Metaboxes::save_meta_boxes', 1, 2 );
38
+    }
39 39
 
40
-	/**
41
-	 * Register core metaboxes.
42
-	 */
43
-	public static function add_meta_boxes( $post_type, $post ) {
40
+    /**
41
+     * Register core metaboxes.
42
+     */
43
+    public static function add_meta_boxes( $post_type, $post ) {
44 44
 
45
-		// For invoices.
46
-		self::add_invoice_meta_boxes( $post_type, $post );
45
+        // For invoices.
46
+        self::add_invoice_meta_boxes( $post_type, $post );
47 47
 
48
-		// For payment forms.
49
-		self::add_payment_form_meta_boxes( $post_type, $post );
48
+        // For payment forms.
49
+        self::add_payment_form_meta_boxes( $post_type, $post );
50 50
 
51
-		// For invoice items.
52
-		self::add_item_meta_boxes( $post_type );
51
+        // For invoice items.
52
+        self::add_item_meta_boxes( $post_type );
53 53
 
54
-		// For invoice discounts.
55
-		if ( 'wpi_discount' === $post_type ) {
56
-			add_meta_box( 'wpinv_discount_details', __( 'Discount Details', 'invoicing' ), 'GetPaid_Meta_Box_Discount_Details::output', 'wpi_discount', 'normal', 'high' );
57
-		}
54
+        // For invoice discounts.
55
+        if ( 'wpi_discount' === $post_type ) {
56
+            add_meta_box( 'wpinv_discount_details', __( 'Discount Details', 'invoicing' ), 'GetPaid_Meta_Box_Discount_Details::output', 'wpi_discount', 'normal', 'high' );
57
+        }
58 58
 
59
-	}
59
+    }
60 60
 
61
-	/**
62
-	 * Register core metaboxes.
63
-	 */
64
-	protected static function add_payment_form_meta_boxes( $post_type, $post ) {
61
+    /**
62
+     * Register core metaboxes.
63
+     */
64
+    protected static function add_payment_form_meta_boxes( $post_type, $post ) {
65 65
 
66
-		// For payment forms.
67
-		if ( 'wpi_payment_form' === $post_type ) {
66
+        // For payment forms.
67
+        if ( 'wpi_payment_form' === $post_type ) {
68 68
 
69
-			// Design payment form.
70
-			add_meta_box( 'wpinv-payment-form-design', __( 'Payment Form', 'invoicing' ), 'GetPaid_Meta_Box_Payment_Form::output', 'wpi_payment_form', 'normal' );
69
+            // Design payment form.
70
+            add_meta_box( 'wpinv-payment-form-design', __( 'Payment Form', 'invoicing' ), 'GetPaid_Meta_Box_Payment_Form::output', 'wpi_payment_form', 'normal' );
71 71
 
72
-			// Payment form information.
73
-			if ( wpinv_get_default_payment_form() !== $post->ID ) {
74
-				add_meta_box( 'wpinv-payment-form-info', __( 'Details', 'invoicing' ), 'GetPaid_Meta_Box_Payment_Form_Info::output', 'wpi_payment_form', 'side' );
75
-			}
72
+            // Payment form information.
73
+            if ( wpinv_get_default_payment_form() !== $post->ID ) {
74
+                add_meta_box( 'wpinv-payment-form-info', __( 'Details', 'invoicing' ), 'GetPaid_Meta_Box_Payment_Form_Info::output', 'wpi_payment_form', 'side' );
75
+            }
76 76
 }
77 77
 
78
-	}
79
-
80
-	/**
81
-	 * Register core metaboxes.
82
-	 */
83
-	protected static function add_item_meta_boxes( $post_type ) {
78
+    }
84 79
 
85
-		if ( 'wpi_item' === $post_type ) {
86
-
87
-			// Item details.
88
-			add_meta_box( 'wpinv_item_details', __( 'Item Details', 'invoicing' ), 'GetPaid_Meta_Box_Item_Details::output', 'wpi_item', 'normal', 'high' );
89
-
90
-			// If taxes are enabled, register the tax metabox.
91
-			if ( wpinv_use_taxes() ) {
92
-				add_meta_box( 'wpinv_item_vat', __( 'Tax', 'invoicing' ), 'GetPaid_Meta_Box_Item_VAT::output', 'wpi_item', 'normal', 'high' );
93
-			}
80
+    /**
81
+     * Register core metaboxes.
82
+     */
83
+    protected static function add_item_meta_boxes( $post_type ) {
94 84
 
95
-			// Item info.
96
-			add_meta_box( 'wpinv_field_item_info', __( 'Item info', 'invoicing' ), 'GetPaid_Meta_Box_Item_Info::output', 'wpi_item', 'side', 'core' );
85
+        if ( 'wpi_item' === $post_type ) {
97 86
 
98
-			// Item description.
99
-			add_meta_box( 'postexcerpt', __( 'Item Description', 'invoicing' ), 'GetPaid_Meta_Box_Description::output', 'wpi_item', 'normal' );
100
-		}
87
+            // Item details.
88
+            add_meta_box( 'wpinv_item_details', __( 'Item Details', 'invoicing' ), 'GetPaid_Meta_Box_Item_Details::output', 'wpi_item', 'normal', 'high' );
101 89
 
102
-	}
90
+            // If taxes are enabled, register the tax metabox.
91
+            if ( wpinv_use_taxes() ) {
92
+                add_meta_box( 'wpinv_item_vat', __( 'Tax', 'invoicing' ), 'GetPaid_Meta_Box_Item_VAT::output', 'wpi_item', 'normal', 'high' );
93
+            }
103 94
 
104
-	/**
105
-	 * Register invoice metaboxes.
106
-	 */
107
-	protected static function add_invoice_meta_boxes( $post_type, $post ) {
95
+            // Item info.
96
+            add_meta_box( 'wpinv_field_item_info', __( 'Item info', 'invoicing' ), 'GetPaid_Meta_Box_Item_Info::output', 'wpi_item', 'side', 'core' );
108 97
 
109
-		// For invoices...
110
-		if ( getpaid_is_invoice_post_type( $post_type ) ) {
111
-			$invoice = new WPInv_Invoice( $post );
98
+            // Item description.
99
+            add_meta_box( 'postexcerpt', __( 'Item Description', 'invoicing' ), 'GetPaid_Meta_Box_Description::output', 'wpi_item', 'normal' );
100
+        }
112 101
 
113
-			// Resend invoice.
114
-			if ( ! $invoice->is_draft() ) {
102
+    }
115 103
 
116
-				add_meta_box(
117
-					'wpinv-mb-resend-invoice',
118
-					sprintf(
119
-						// translators: %s is the invoice type.
120
-						__( 'Resend %s', 'invoicing' ),
121
-						ucfirst( $invoice->get_invoice_quote_type() )
122
-					),
123
-					'GetPaid_Meta_Box_Resend_Invoice::output',
124
-					$post_type,
125
-					'side',
126
-					'low'
127
-				);
104
+    /**
105
+     * Register invoice metaboxes.
106
+     */
107
+    protected static function add_invoice_meta_boxes( $post_type, $post ) {
108
+
109
+        // For invoices...
110
+        if ( getpaid_is_invoice_post_type( $post_type ) ) {
111
+            $invoice = new WPInv_Invoice( $post );
112
+
113
+            // Resend invoice.
114
+            if ( ! $invoice->is_draft() ) {
115
+
116
+                add_meta_box(
117
+                    'wpinv-mb-resend-invoice',
118
+                    sprintf(
119
+                        // translators: %s is the invoice type.
120
+                        __( 'Resend %s', 'invoicing' ),
121
+                        ucfirst( $invoice->get_invoice_quote_type() )
122
+                    ),
123
+                    'GetPaid_Meta_Box_Resend_Invoice::output',
124
+                    $post_type,
125
+                    'side',
126
+                    'low'
127
+                );
128
+
129
+            }
130
+
131
+            // Subscriptions.
132
+            $subscriptions = getpaid_get_invoice_subscriptions( $invoice );
133
+            if ( ! empty( $subscriptions ) ) {
134
+
135
+                if ( is_array( $subscriptions ) ) {
136
+                    add_meta_box( 'wpinv-mb-subscriptions', __( 'Related Subscriptions', 'invoicing' ), 'GetPaid_Meta_Box_Invoice_Subscription::output_related', $post_type, 'advanced' );
137
+                } else {
138
+                    add_meta_box( 'wpinv-mb-subscriptions', __( 'Subscription Details', 'invoicing' ), 'GetPaid_Meta_Box_Invoice_Subscription::output', $post_type, 'advanced' );
139
+                }
140
+
141
+                if ( getpaid_count_subscription_invoices( $invoice->is_renewal() ? $invoice->get_parent_id() : $invoice->get_id() ) > 1 ) {
142
+                    add_meta_box( 'wpinv-mb-subscription-invoices', __( 'Related Payments', 'invoicing' ), 'GetPaid_Meta_Box_Invoice_Subscription::output_invoices', $post_type, 'advanced' );
143
+                }
144
+}
128 145
 
129
-			}
146
+            // Invoice details.
147
+            add_meta_box(
148
+                'wpinv-details',
149
+                sprintf(
150
+                    // translators: %s is the invoice type.
151
+                    __( '%s Details', 'invoicing' ),
152
+                    ucfirst( $invoice->get_invoice_quote_type() )
153
+                ),
154
+                'GetPaid_Meta_Box_Invoice_Details::output',
155
+                $post_type,
156
+                'side'
157
+            );
158
+
159
+            // Payment details.
160
+            add_meta_box( 'wpinv-payment-meta', __( 'Payment Meta', 'invoicing' ), 'GetPaid_Meta_Box_Invoice_Payment_Meta::output', $post_type, 'side', 'default' );
161
+
162
+            // Billing details.
163
+            add_meta_box( 'wpinv-address', __( 'Billing Details', 'invoicing' ), 'GetPaid_Meta_Box_Invoice_Address::output', $post_type, 'normal', 'high' );
164
+
165
+            // Invoice items.
166
+            add_meta_box(
167
+                'wpinv-items',
168
+                sprintf(
169
+                    // translators: %s is the invoice type.
170
+                    __( '%s Items', 'invoicing' ),
171
+                    ucfirst( $invoice->get_invoice_quote_type() )
172
+                ),
173
+                'GetPaid_Meta_Box_Invoice_Items::output',
174
+                $post_type,
175
+                'normal',
176
+                'high'
177
+            );
178
+
179
+            // Invoice notes.
180
+            add_meta_box(
181
+                'wpinv-notes',
182
+                sprintf(
183
+                    // translators: %s is the invoice type.
184
+                    __( '%s Notes', 'invoicing' ),
185
+                    ucfirst( $invoice->get_invoice_quote_type() )
186
+                ),
187
+                'WPInv_Meta_Box_Notes::output',
188
+                $post_type,
189
+                'side',
190
+                'low'
191
+            );
192
+
193
+            // Shipping Address.
194
+            if ( get_post_meta( $invoice->get_id(), 'shipping_address', true ) ) {
195
+                add_meta_box( 'wpinv-invoice-shipping-details', __( 'Shipping Address', 'invoicing' ), 'GetPaid_Meta_Box_Invoice_Shipping_Address::output', $post_type, 'side', 'high' );
196
+            }
197
+
198
+            // Payment form information.
199
+            if ( get_post_meta( $invoice->get_id(), 'payment_form_data', true ) ) {
200
+                add_meta_box( 'wpinv-invoice-payment-form-details', __( 'Payment Form Details', 'invoicing' ), 'WPInv_Meta_Box_Payment_Form::output_details', $post_type, 'side', 'high' );
201
+            }
202
+}
130 203
 
131
-			// Subscriptions.
132
-			$subscriptions = getpaid_get_invoice_subscriptions( $invoice );
133
-			if ( ! empty( $subscriptions ) ) {
204
+    }
134 205
 
135
-				if ( is_array( $subscriptions ) ) {
136
-					add_meta_box( 'wpinv-mb-subscriptions', __( 'Related Subscriptions', 'invoicing' ), 'GetPaid_Meta_Box_Invoice_Subscription::output_related', $post_type, 'advanced' );
137
-				} else {
138
-					add_meta_box( 'wpinv-mb-subscriptions', __( 'Subscription Details', 'invoicing' ), 'GetPaid_Meta_Box_Invoice_Subscription::output', $post_type, 'advanced' );
139
-				}
206
+    /**
207
+     * Remove some metaboxes.
208
+     */
209
+    public static function remove_meta_boxes() {
210
+        remove_meta_box( 'wpseo_meta', 'wpi_invoice', 'normal' );
211
+        remove_meta_box( 'postexcerpt', 'wpi_item', 'normal' );
212
+    }
140 213
 
141
-				if ( getpaid_count_subscription_invoices( $invoice->is_renewal() ? $invoice->get_parent_id() : $invoice->get_id() ) > 1 ) {
142
-					add_meta_box( 'wpinv-mb-subscription-invoices', __( 'Related Payments', 'invoicing' ), 'GetPaid_Meta_Box_Invoice_Subscription::output_invoices', $post_type, 'advanced' );
143
-				}
144
-}
214
+    /**
215
+     * Rename other metaboxes.
216
+     */
217
+    public static function rename_meta_boxes() {
145 218
 
146
-			// Invoice details.
147
-			add_meta_box(
148
-				'wpinv-details',
149
-				sprintf(
150
-					// translators: %s is the invoice type.
151
-					__( '%s Details', 'invoicing' ),
152
-					ucfirst( $invoice->get_invoice_quote_type() )
153
-				),
154
-				'GetPaid_Meta_Box_Invoice_Details::output',
155
-				$post_type,
156
-				'side'
157
-			);
158
-
159
-			// Payment details.
160
-			add_meta_box( 'wpinv-payment-meta', __( 'Payment Meta', 'invoicing' ), 'GetPaid_Meta_Box_Invoice_Payment_Meta::output', $post_type, 'side', 'default' );
161
-
162
-			// Billing details.
163
-			add_meta_box( 'wpinv-address', __( 'Billing Details', 'invoicing' ), 'GetPaid_Meta_Box_Invoice_Address::output', $post_type, 'normal', 'high' );
164
-
165
-			// Invoice items.
166
-			add_meta_box(
167
-				'wpinv-items',
168
-				sprintf(
169
-					// translators: %s is the invoice type.
170
-					__( '%s Items', 'invoicing' ),
171
-					ucfirst( $invoice->get_invoice_quote_type() )
172
-				),
173
-				'GetPaid_Meta_Box_Invoice_Items::output',
174
-				$post_type,
175
-				'normal',
176
-				'high'
177
-			);
178
-
179
-			// Invoice notes.
180
-			add_meta_box(
181
-				'wpinv-notes',
182
-				sprintf(
183
-					// translators: %s is the invoice type.
184
-					__( '%s Notes', 'invoicing' ),
185
-					ucfirst( $invoice->get_invoice_quote_type() )
186
-				),
187
-				'WPInv_Meta_Box_Notes::output',
188
-				$post_type,
189
-				'side',
190
-				'low'
191
-			);
192
-
193
-			// Shipping Address.
194
-			if ( get_post_meta( $invoice->get_id(), 'shipping_address', true ) ) {
195
-				add_meta_box( 'wpinv-invoice-shipping-details', __( 'Shipping Address', 'invoicing' ), 'GetPaid_Meta_Box_Invoice_Shipping_Address::output', $post_type, 'side', 'high' );
196
-			}
197
-
198
-			// Payment form information.
199
-			if ( get_post_meta( $invoice->get_id(), 'payment_form_data', true ) ) {
200
-				add_meta_box( 'wpinv-invoice-payment-form-details', __( 'Payment Form Details', 'invoicing' ), 'WPInv_Meta_Box_Payment_Form::output_details', $post_type, 'side', 'high' );
201
-			}
202
-}
219
+    }
203 220
 
204
-	}
205
-
206
-	/**
207
-	 * Remove some metaboxes.
208
-	 */
209
-	public static function remove_meta_boxes() {
210
-		remove_meta_box( 'wpseo_meta', 'wpi_invoice', 'normal' );
211
-		remove_meta_box( 'postexcerpt', 'wpi_item', 'normal' );
212
-	}
213
-
214
-	/**
215
-	 * Rename other metaboxes.
216
-	 */
217
-	public static function rename_meta_boxes() {
218
-
219
-	}
220
-
221
-	/**
222
-	 * Check if we're saving, then trigger an action based on the post type.
223
-	 *
224
-	 * @param  int    $post_id Post ID.
225
-	 * @param  object $post Post object.
226
-	 */
227
-	public static function save_meta_boxes( $post_id, $post ) {
228
-		$post_id = absint( $post_id );
229
-		$data    = wp_kses_post_deep( wp_unslash( $_POST ) );
230
-
231
-		// Do not save for ajax requests.
232
-		if ( ( defined( 'DOING_AJAX' ) && DOING_AJAX ) || isset( $_REQUEST['bulk_edit'] ) ) {
233
-			return;
234
-		}
235
-
236
-		// $post_id and $post are required
237
-		if ( empty( $post_id ) || empty( $post ) || self::$saved_meta_boxes ) {
238
-			return;
239
-		}
240
-
241
-		// Dont' save meta boxes for revisions or autosaves.
242
-		if ( ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) || is_int( wp_is_post_revision( $post ) ) || is_int( wp_is_post_autosave( $post ) ) ) {
243
-			return;
244
-		}
245
-
246
-		// Check the nonce.
247
-		if ( empty( $data['getpaid_meta_nonce'] ) || ! wp_verify_nonce( $data['getpaid_meta_nonce'], 'getpaid_meta_nonce' ) ) {
248
-			return;
249
-		}
250
-
251
-		// Check the post being saved == the $post_id to prevent triggering this call for other save_post events.
252
-		if ( empty( $data['post_ID'] ) || absint( $data['post_ID'] ) !== $post_id ) {
253
-			return;
254
-		}
255
-
256
-		// Check user has permission to edit.
257
-		if ( ! current_user_can( 'edit_post', $post_id ) ) {
258
-			return;
259
-		}
260
-
261
-		if ( getpaid_is_invoice_post_type( $post->post_type ) ) {
262
-
263
-			// We need this save event to run once to avoid potential endless loops.
264
-			self::$saved_meta_boxes = true;
265
-
266
-			return GetPaid_Meta_Box_Invoice_Address::save( $post_id );
267
-
268
-		}
269
-
270
-		// Ensure this is our post type.
271
-		$post_types_map = array(
272
-			'wpi_item'         => 'GetPaid_Meta_Box_Item_Details',
273
-			'wpi_payment_form' => 'GetPaid_Meta_Box_Payment_Form',
274
-			'wpi_discount'     => 'GetPaid_Meta_Box_Discount_Details',
275
-		);
276
-
277
-		// Is this our post type?
278
-		if ( ! isset( $post_types_map[ $post->post_type ] ) ) {
279
-			return;
280
-		}
281
-
282
-		// We need this save event to run once to avoid potential endless loops.
283
-		self::$saved_meta_boxes = true;
284
-
285
-		// Save the post.
286
-		$class = $post_types_map[ $post->post_type ];
287
-		$class::save( $post_id, wp_kses_post_deep( $_POST ), $post );
288
-
289
-	}
221
+    /**
222
+     * Check if we're saving, then trigger an action based on the post type.
223
+     *
224
+     * @param  int    $post_id Post ID.
225
+     * @param  object $post Post object.
226
+     */
227
+    public static function save_meta_boxes( $post_id, $post ) {
228
+        $post_id = absint( $post_id );
229
+        $data    = wp_kses_post_deep( wp_unslash( $_POST ) );
230
+
231
+        // Do not save for ajax requests.
232
+        if ( ( defined( 'DOING_AJAX' ) && DOING_AJAX ) || isset( $_REQUEST['bulk_edit'] ) ) {
233
+            return;
234
+        }
235
+
236
+        // $post_id and $post are required
237
+        if ( empty( $post_id ) || empty( $post ) || self::$saved_meta_boxes ) {
238
+            return;
239
+        }
240
+
241
+        // Dont' save meta boxes for revisions or autosaves.
242
+        if ( ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) || is_int( wp_is_post_revision( $post ) ) || is_int( wp_is_post_autosave( $post ) ) ) {
243
+            return;
244
+        }
245
+
246
+        // Check the nonce.
247
+        if ( empty( $data['getpaid_meta_nonce'] ) || ! wp_verify_nonce( $data['getpaid_meta_nonce'], 'getpaid_meta_nonce' ) ) {
248
+            return;
249
+        }
250
+
251
+        // Check the post being saved == the $post_id to prevent triggering this call for other save_post events.
252
+        if ( empty( $data['post_ID'] ) || absint( $data['post_ID'] ) !== $post_id ) {
253
+            return;
254
+        }
255
+
256
+        // Check user has permission to edit.
257
+        if ( ! current_user_can( 'edit_post', $post_id ) ) {
258
+            return;
259
+        }
260
+
261
+        if ( getpaid_is_invoice_post_type( $post->post_type ) ) {
262
+
263
+            // We need this save event to run once to avoid potential endless loops.
264
+            self::$saved_meta_boxes = true;
265
+
266
+            return GetPaid_Meta_Box_Invoice_Address::save( $post_id );
267
+
268
+        }
269
+
270
+        // Ensure this is our post type.
271
+        $post_types_map = array(
272
+            'wpi_item'         => 'GetPaid_Meta_Box_Item_Details',
273
+            'wpi_payment_form' => 'GetPaid_Meta_Box_Payment_Form',
274
+            'wpi_discount'     => 'GetPaid_Meta_Box_Discount_Details',
275
+        );
276
+
277
+        // Is this our post type?
278
+        if ( ! isset( $post_types_map[ $post->post_type ] ) ) {
279
+            return;
280
+        }
281
+
282
+        // We need this save event to run once to avoid potential endless loops.
283
+        self::$saved_meta_boxes = true;
284
+
285
+        // Save the post.
286
+        $class = $post_types_map[ $post->post_type ];
287
+        $class::save( $post_id, wp_kses_post_deep( $_POST ), $post );
288
+
289
+    }
290 290
 
291 291
 }
Please login to merge, or discard this patch.