Passed
Push — master ( 1d577c...45fbdf )
by Brian
07:57 queued 03:15
created

WPInv_Invoice::get_customer_company()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 2
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 1
c 0
b 0
f 0
dl 0
loc 2
rs 10
cc 1
nc 1
nop 1
1
<?php
2
/**
3
 * Contains the invoice class.
4
 *
5
 * @since 1.0.19
6
 * @package Invoicing
7
 */
8
9
defined( 'ABSPATH' ) || exit;
10
11
/**
12
 * Invoice class.
13
 */
14
class WPInv_Invoice extends GetPaid_Data {
15
16
    /**
17
	 * Which data store to load.
18
	 *
19
	 * @var string
20
	 */
21
    protected $data_store_name = 'invoice';
22
23
    /**
24
	 * This is the name of this object type.
25
	 *
26
	 * @var string
27
	 */
28
    protected $object_type = 'invoice';
29
30
    /**
31
	 * Item Data array. This is the core item data exposed in APIs.
32
	 *
33
	 * @since 1.0.19
34
	 * @var array
35
	 */
36
	protected $data = array(
37
		'parent_id'            => 0,
38
		'status'               => 'wpi-pending',
39
		'version'              => '',
40
		'date_created'         => null,
41
        'date_modified'        => null,
42
        'due_date'             => null,
43
        'completed_date'       => null,
44
        'number'               => '',
45
        'title'                => '',
46
        'path'                 => '',
47
        'key'                  => '',
48
        'description'          => '',
49
        'author'               => 1,
50
        'type'                 => 'invoice',
51
        'post_type'            => 'wpi_invoice',
52
        'mode'                 => 'live',
53
        'user_ip'              => null,
54
        'first_name'           => null,
55
        'last_name'            => null,
56
        'phone'                => null,
57
        'email'                => null,
58
        'country'              => null,
59
        'city'                 => null,
60
        'state'                => null,
61
        'zip'                  => null,
62
        'company'              => null,
63
        'vat_number'           => null,
64
        'vat_rate'             => null,
65
        'address'              => null,
66
        'address_confirmed'    => false,
67
        'subtotal'             => 0,
68
        'total_discount'       => 0,
69
        'total_tax'            => 0,
70
		'total_fees'           => 0,
71
		'total'                => 0,
72
        'fees'                 => array(),
73
        'discounts'            => array(),
74
        'taxes'                => array(),
75
        'items'                => array(),
76
        'payment_form'         => 1,
77
        'submission_id'        => null,
78
        'discount_code'        => null,
79
        'gateway'              => 'none',
80
        'transaction_id'       => '',
81
        'currency'             => '',
82
        'disable_taxes'        => false,
83
		'subscription_id'      => null,
84
		'remote_subscription_id' => null,
85
		'is_viewed'            => false,
86
		'email_cc'             => '',
87
		'template'             => 'quantity', // hours, amount only
88
		'created_via'          => null,
89
    );
90
91
    /**
92
	 * Stores meta in cache for future reads.
93
	 *
94
	 * A group must be set to to enable caching.
95
	 *
96
	 * @var string
97
	 */
98
	protected $cache_group = 'getpaid_invoices';
99
100
    /**
101
     * Stores a reference to the original WP_Post object
102
     *
103
     * @var WP_Post
104
     */
105
    protected $post = null;
106
107
    /**
108
     * Stores a reference to the recurring item id instead of looping through the items.
109
     *
110
     * @var int
111
     */
112
	protected $recurring_item = null;
113
114
	/**
115
     * Stores an array of item totals.
116
	 *
117
	 * e.g $totals['discount'] = array(
118
	 * 		'initial'   => 10,
119
	 * 		'recurring' => 10,
120
	 * )
121
     *
122
     * @var array
123
     */
124
	protected $totals = array();
125
126
	/**
127
     * Tax rate.
128
	 *
129
     * @var float
130
     */
131
	protected $tax_rate = 0;
132
133
	/**
134
	 * Stores the status transition information.
135
	 *
136
	 * @since 1.0.19
137
	 * @var bool|array
138
	 */
139
	protected $status_transition = false;
140
141
    /**
142
	 * Get the invoice if ID is passed, otherwise the invoice is new and empty.
143
	 *
144
	 * @param  int|string|object|WPInv_Invoice|WPInv_Legacy_Invoice|WP_Post $invoice Invoice id, key, transaction id, number or object to read.
145
	 */
146
    public function __construct( $invoice = 0 ) {
147
148
        parent::__construct( $invoice );
149
150
		if ( ! empty( $invoice ) && is_numeric( $invoice ) && getpaid_is_invoice_post_type( get_post_type( (int) $invoice ) ) ) {
0 ignored issues
show
Bug introduced by
It seems like get_post_type((int)$invoice) can also be of type false; however, parameter $post_type of getpaid_is_invoice_post_type() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

150
		if ( ! empty( $invoice ) && is_numeric( $invoice ) && getpaid_is_invoice_post_type( /** @scrutinizer ignore-type */ get_post_type( (int) $invoice ) ) ) {
Loading history...
151
			$this->set_id( (int) $invoice );
152
		} elseif ( $invoice instanceof self ) {
153
			$this->set_id( $invoice->get_id() );
154
		} elseif ( ! empty( $invoice->ID ) ) {
155
			$this->set_id( $invoice->ID );
156
		} elseif ( is_array( $invoice ) ) {
157
			$this->set_props( $invoice );
158
159
			if ( isset( $invoice['ID'] ) ) {
160
				$this->set_id( $invoice['ID'] );
161
			}
162
163
		} elseif ( is_string( $invoice ) && $invoice_id = self::get_invoice_id_by_field( $invoice, 'key' ) ) {
164
			$this->set_id( $invoice_id );
165
		} elseif ( is_string( $invoice ) && $invoice_id = self::get_invoice_id_by_field( $invoice, 'number' ) ) {
166
			$this->set_id( $invoice_id );
167
		} elseif ( is_string( $invoice ) && $invoice_id = self::get_invoice_id_by_field( $invoice, 'transaction_id' ) ) {
168
			$this->set_id( $invoice_id );
169
		} else {
170
			$this->set_object_read( true );
171
		}
172
173
        // Load the datastore.
174
		$this->data_store = GetPaid_Data_Store::load( $this->data_store_name );
175
176
		if ( $this->get_id() > 0 ) {
177
            $this->post = get_post( $this->get_id() );
0 ignored issues
show
Documentation Bug introduced by
It seems like get_post($this->get_id()) can also be of type array. However, the property $post is declared as type WP_Post. Maybe add an additional type check?

Our type inference engine has found a suspicous assignment of a value to a property. This check raises an issue when a value that can be of a mixed type is assigned to a property that is type hinted more strictly.

For example, imagine you have a variable $accountId that can either hold an Id object or false (if there is no account id yet). Your code now assigns that value to the id property of an instance of the Account class. This class holds a proper account, so the id value must no longer be false.

Either this assignment is in error or a type check should be added for that assignment.

class Id
{
    public $id;

    public function __construct($id)
    {
        $this->id = $id;
    }

}

class Account
{
    /** @var  Id $id */
    public $id;
}

$account_id = false;

if (starsAreRight()) {
    $account_id = new Id(42);
}

$account = new Account();
if ($account instanceof Id)
{
    $account->id = $account_id;
}
Loading history...
178
            $this->ID   = $this->get_id();
0 ignored issues
show
Bug Best Practice introduced by
The property ID does not exist. Although not strictly required by PHP, it is generally a best practice to declare properties explicitly.
Loading history...
179
			$this->data_store->read( $this );
180
        }
181
182
    }
183
184
    /**
185
	 * Given an invoice key/number, it returns its id.
186
	 *
187
	 *
188
	 * @static
189
	 * @param string $value The invoice key or number
190
	 * @param string $field Either key, transaction_id or number.
191
	 * @since 1.0.15
192
	 * @return int
193
	 */
194
	public static function get_invoice_id_by_field( $value, $field = 'key' ) {
195
        global $wpdb;
196
197
		// Trim the value.
198
		$value = trim( $value );
199
200
		if ( empty( $value ) ) {
201
			return 0;
202
		}
203
204
        // Valid fields.
205
        $fields = array( 'key', 'number', 'transaction_id' );
206
207
		// Ensure a field has been passed.
208
		if ( empty( $field ) || ! in_array( $field, $fields ) ) {
209
			return 0;
210
		}
211
212
		// Maybe retrieve from the cache.
213
		$invoice_id   = wp_cache_get( $value, "getpaid_invoice_{$field}s_to_invoice_ids" );
214
		if ( false !== $invoice_id ) {
215
			return $invoice_id;
216
		}
217
218
        // Fetch from the db.
219
        $table       = $wpdb->prefix . 'getpaid_invoices';
220
        $invoice_id  = (int) $wpdb->get_var(
221
            $wpdb->prepare( "SELECT `post_id` FROM $table WHERE `$field`=%s LIMIT 1", $value )
222
        );
223
224
		// Update the cache with our data
225
		wp_cache_set( $value, $invoice_id, "getpaid_invoice_{$field}s_to_invoice_ids" );
226
227
		return $invoice_id;
228
    }
229
230
    /**
231
     * Checks if an invoice key is set.
232
     */
233
    public function _isset( $key ) {
234
        return isset( $this->data[$key] ) || method_exists( $this, "get_$key" );
235
    }
236
237
    /*
238
	|--------------------------------------------------------------------------
239
	| CRUD methods
240
	|--------------------------------------------------------------------------
241
	|
242
	| Methods which create, read, update and delete items from the database.
243
	|
244
    */
245
246
    /*
247
	|--------------------------------------------------------------------------
248
	| Getters
249
	|--------------------------------------------------------------------------
250
    */
251
252
    /**
253
	 * Get parent invoice ID.
254
	 *
255
	 * @since 1.0.19
256
	 * @param  string $context View or edit context.
257
	 * @return int
258
	 */
259
	public function get_parent_id( $context = 'view' ) {
260
		return (int) $this->get_prop( 'parent_id', $context );
261
    }
262
263
    /**
264
	 * Get parent invoice.
265
	 *
266
	 * @since 1.0.19
267
	 * @return WPInv_Invoice
268
	 */
269
    public function get_parent_payment() {
270
        return new WPInv_Invoice( $this->get_parent_id() );
271
    }
272
273
    /**
274
	 * Alias for self::get_parent_payment().
275
	 *
276
	 * @since 1.0.19
277
	 * @return WPInv_Invoice
278
	 */
279
    public function get_parent() {
280
        return $this->get_parent_payment();
281
    }
282
283
    /**
284
	 * Get invoice status.
285
	 *
286
	 * @since 1.0.19
287
	 * @param  string $context View or edit context.
288
	 * @return string
289
	 */
290
	public function get_status( $context = 'view' ) {
291
		return $this->get_prop( 'status', $context );
292
	}
293
	
294
	/**
295
	 * Retrieves an array of possible invoice statuses.
296
	 *
297
	 * @since 1.0.19
298
	 * @return array
299
	 */
300
	public function get_all_statuses() {
301
		return wpinv_get_invoice_statuses( true, true, $this );
302
    }
303
304
    /**
305
	 * Get invoice status nice name.
306
	 *
307
	 * @since 1.0.19
308
	 * @return string
309
	 */
310
    public function get_status_nicename() {
311
		$statuses = $this->get_all_statuses();
312
313
        $status = isset( $statuses[ $this->get_status() ] ) ? $statuses[ $this->get_status() ] : $this->get_status();
314
315
        return apply_filters( 'wpinv_get_invoice_status_nicename', $status, $this );
316
    }
317
318
	/**
319
	 * Retrieves the invoice status class
320
	 *
321
	 * @since  1.0.19
322
	 * @return string
323
	 */
324
	public function get_status_class() {
325
		$statuses = getpaid_get_invoice_status_classes();
326
		return isset( $statuses[ $this->get_status() ] ) ? $statuses[ $this->get_status() ] : 'badge-dark';
327
	}
328
329
	/**
330
     * Retrieves the invoice status label html
331
     *
332
     * @since  1.0.0
333
     * @return string
334
     */
335
    public function get_status_label_html() {
336
337
		$status_label = sanitize_text_field( $this->get_status_nicename() );
338
		$status       = sanitize_html_class( $this->get_status() );
339
		$class        = esc_attr( $this->get_status_class() );
340
341
		return "<span class='bsui'><span class='badge $class $status'>$status_label</span></span>";
342
	}
343
344
    /**
345
	 * Get plugin version when the invoice was created.
346
	 *
347
	 * @since 1.0.19
348
	 * @param  string $context View or edit context.
349
	 * @return string
350
	 */
351
	public function get_version( $context = 'view' ) {
352
		return $this->get_prop( 'version', $context );
353
	}
354
355
	/**
356
	 * @deprecated
357
	 */
358
	public function get_invoice_date( $format = true ) {
359
		$date      = getpaid_format_date( $this->get_date_completed() );
360
		$date      = empty( $date ) ? $this->get_date_created() : $this->get_date_completed();
361
		$formatted = getpaid_format_date( $date );
362
363
		if ( $format ) {
364
			return $formatted;
365
		}
366
367
		return empty( $formatted ) ? '' : $date;
368
369
    }
370
371
    /**
372
	 * Get date when the invoice was created.
373
	 *
374
	 * @since 1.0.19
375
	 * @param  string $context View or edit context.
376
	 * @return string
377
	 */
378
	public function get_date_created( $context = 'view' ) {
379
		return $this->get_prop( 'date_created', $context );
380
	}
381
	
382
	/**
383
	 * Alias for self::get_date_created().
384
	 *
385
	 * @since 1.0.19
386
	 * @param  string $context View or edit context.
387
	 * @return string
388
	 */
389
	public function get_created_date( $context = 'view' ) {
390
		return $this->get_date_created( $context );
391
    }
392
393
    /**
394
	 * Get GMT date when the invoice was created.
395
	 *
396
	 * @since 1.0.19
397
	 * @param  string $context View or edit context.
398
	 * @return string
399
	 */
400
	public function get_date_created_gmt( $context = 'view' ) {
401
        $date = $this->get_date_created( $context );
402
403
        if ( $date ) {
404
            $date = get_gmt_from_date( $date );
405
        }
406
		return $date;
407
    }
408
409
    /**
410
	 * Get date when the invoice was last modified.
411
	 *
412
	 * @since 1.0.19
413
	 * @param  string $context View or edit context.
414
	 * @return string
415
	 */
416
	public function get_date_modified( $context = 'view' ) {
417
		return $this->get_prop( 'date_modified', $context );
418
	}
419
420
	/**
421
	 * Alias for self::get_date_modified().
422
	 *
423
	 * @since 1.0.19
424
	 * @param  string $context View or edit context.
425
	 * @return string
426
	 */
427
	public function get_modified_date( $context = 'view' ) {
428
		return $this->get_date_modified( $context );
429
    }
430
431
    /**
432
	 * Get GMT date when the invoice was last modified.
433
	 *
434
	 * @since 1.0.19
435
	 * @param  string $context View or edit context.
436
	 * @return string
437
	 */
438
	public function get_date_modified_gmt( $context = 'view' ) {
439
        $date = $this->get_date_modified( $context );
440
441
        if ( $date ) {
442
            $date = get_gmt_from_date( $date );
443
        }
444
		return $date;
445
    }
446
447
    /**
448
	 * Get the invoice due date.
449
	 *
450
	 * @since 1.0.19
451
	 * @param  string $context View or edit context.
452
	 * @return string
453
	 */
454
	public function get_due_date( $context = 'view' ) {
455
		return $this->get_prop( 'due_date', $context );
456
    }
457
458
    /**
459
	 * Alias for self::get_due_date().
460
	 *
461
	 * @since 1.0.19
462
	 * @param  string $context View or edit context.
463
	 * @return string
464
	 */
465
	public function get_date_due( $context = 'view' ) {
466
		return $this->get_due_date( $context );
467
    }
468
469
    /**
470
	 * Get the invoice GMT due date.
471
	 *
472
	 * @since 1.0.19
473
	 * @param  string $context View or edit context.
474
	 * @return string
475
	 */
476
	public function get_due_date_gmt( $context = 'view' ) {
477
        $date = $this->get_due_date( $context );
478
479
        if ( $date ) {
480
            $date = get_gmt_from_date( $date );
481
        }
482
		return $date;
483
    }
484
485
    /**
486
	 * Alias for self::get_due_date_gmt().
487
	 *
488
	 * @since 1.0.19
489
	 * @param  string $context View or edit context.
490
	 * @return string
491
	 */
492
	public function get_gmt_date_due( $context = 'view' ) {
493
		return $this->get_due_date_gmt( $context );
494
    }
495
496
    /**
497
	 * Get date when the invoice was completed.
498
	 *
499
	 * @since 1.0.19
500
	 * @param  string $context View or edit context.
501
	 * @return string
502
	 */
503
	public function get_completed_date( $context = 'view' ) {
504
		return $this->get_prop( 'completed_date', $context );
505
    }
506
507
    /**
508
	 * Alias for self::get_completed_date().
509
	 *
510
	 * @since 1.0.19
511
	 * @param  string $context View or edit context.
512
	 * @return string
513
	 */
514
	public function get_date_completed( $context = 'view' ) {
515
		return $this->get_completed_date( $context );
516
    }
517
518
    /**
519
	 * Get GMT date when the invoice was was completed.
520
	 *
521
	 * @since 1.0.19
522
	 * @param  string $context View or edit context.
523
	 * @return string
524
	 */
525
	public function get_completed_date_gmt( $context = 'view' ) {
526
        $date = $this->get_completed_date( $context );
527
528
        if ( $date ) {
529
            $date = get_gmt_from_date( $date );
530
        }
531
		return $date;
532
    }
533
534
    /**
535
	 * Alias for self::get_completed_date_gmt().
536
	 *
537
	 * @since 1.0.19
538
	 * @param  string $context View or edit context.
539
	 * @return string
540
	 */
541
	public function get_gmt_completed_date( $context = 'view' ) {
542
		return $this->get_completed_date_gmt( $context );
543
    }
544
545
    /**
546
	 * Get the invoice number.
547
	 *
548
	 * @since 1.0.19
549
	 * @param  string $context View or edit context.
550
	 * @return string
551
	 */
552
	public function get_number( $context = 'view' ) {
553
		$number = $this->get_prop( 'number', $context );
554
555
		if ( empty( $number ) ) {
556
			$number = $this->generate_number();
557
			$this->set_number( $this->generate_number() );
558
		}
559
560
		return $number;
561
    }
562
563
	/**
564
	 * Set the invoice number.
565
	 *
566
	 * @since 1.0.19
567
	 */
568
	public function maybe_set_number() {
569
        $number = $this->get_number();
570
571
        if ( empty( $number ) || $this->get_id() == $number ) {
572
			$this->set_number( $this->generate_number() );
573
        }
574
575
	}
576
577
    /**
578
	 * Get the invoice key.
579
	 *
580
	 * @since 1.0.19
581
	 * @param  string $context View or edit context.
582
	 * @return string
583
	 */
584
	public function get_key( $context = 'view' ) {
585
        return $this->get_prop( 'key', $context );
586
	}
587
588
	/**
589
	 * Set the invoice key.
590
	 *
591
	 * @since 1.0.19
592
	 */
593
	public function maybe_set_key() {
594
        $key = $this->get_key();
595
596
        if ( empty( $key ) ) {
597
            $key = $this->generate_key( $this->get_type() . '_' );
598
            $this->set_key( $key );
599
        }
600
601
    }
602
603
    /**
604
	 * Get the invoice type.
605
	 *
606
	 * @since 1.0.19
607
	 * @param  string $context View or edit context.
608
	 * @return string
609
	 */
610
	public function get_type( $context = 'view' ) {
611
        return $this->get_prop( 'type', $context );
612
	}
613
614
	/**
615
	 * Returns the post type name.
616
	 *
617
	 * @since 1.0.19
618
	 * @return string
619
	 */
620
	public function get_invoice_quote_type() {
621
        return getpaid_get_post_type_label( $this->get_post_type(), false );
622
    }
623
624
    /**
625
	 * Get the invoice post type label.
626
	 *
627
	 * @since 1.0.19
628
	 * @param  string $context View or edit context.
629
	 * @return string
630
	 */
631
	public function get_label( $context = 'view' ) {
632
        return getpaid_get_post_type_label( $this->get_post_type( $context ), false );
633
	}
634
635
	/**
636
	 * Get the invoice post type.
637
	 *
638
	 * @since 1.0.19
639
	 * @param  string $context View or edit context.
640
	 * @return string
641
	 */
642
	public function get_post_type( $context = 'view' ) {
643
        return $this->get_prop( 'post_type', $context );
644
    }
645
646
    /**
647
	 * Get the invoice mode.
648
	 *
649
	 * @since 1.0.19
650
	 * @param  string $context View or edit context.
651
	 * @return string
652
	 */
653
	public function get_mode( $context = 'view' ) {
654
        return $this->get_prop( 'mode', $context );
655
    }
656
657
    /**
658
	 * Get the invoice path.
659
	 *
660
	 * @since 1.0.19
661
	 * @param  string $context View or edit context.
662
	 * @return string
663
	 */
664
	public function get_path( $context = 'view' ) {
665
        $path   = $this->get_prop( 'path', $context );
666
		$prefix = $this->get_type();
667
668
		if ( 0 !== strpos( $path, $prefix ) ) {
669
			$path = sanitize_title(  $prefix . '-' . $this->get_id()  );
670
			$this->set_path( $path );
671
		}
672
673
		return $path;
674
    }
675
676
    /**
677
	 * Get the invoice name/title.
678
	 *
679
	 * @since 1.0.19
680
	 * @param  string $context View or edit context.
681
	 * @return string
682
	 */
683
	public function get_name( $context = 'view' ) {
684
        return $this->get_prop( 'title', $context );
685
    }
686
687
    /**
688
	 * Alias of self::get_name().
689
	 *
690
	 * @since 1.0.19
691
	 * @param  string $context View or edit context.
692
	 * @return string
693
	 */
694
	public function get_title( $context = 'view' ) {
695
		return $this->get_name( $context );
696
    }
697
698
    /**
699
	 * Get the invoice description.
700
	 *
701
	 * @since 1.0.19
702
	 * @param  string $context View or edit context.
703
	 * @return string
704
	 */
705
	public function get_description( $context = 'view' ) {
706
		return $this->get_prop( 'description', $context );
707
    }
708
709
    /**
710
	 * Alias of self::get_description().
711
	 *
712
	 * @since 1.0.19
713
	 * @param  string $context View or edit context.
714
	 * @return string
715
	 */
716
	public function get_excerpt( $context = 'view' ) {
717
		return $this->get_description( $context );
718
    }
719
720
    /**
721
	 * Alias of self::get_description().
722
	 *
723
	 * @since 1.0.19
724
	 * @param  string $context View or edit context.
725
	 * @return string
726
	 */
727
	public function get_summary( $context = 'view' ) {
728
		return $this->get_description( $context );
729
    }
730
731
    /**
732
	 * Returns the user info.
733
	 *
734
	 * @since 1.0.19
735
     * @param  string $context View or edit context.
736
	 * @return array
737
	 */
738
    public function get_user_info( $context = 'view' ) {
739
740
        $user_info = array(
741
            'user_id'    => $this->get_user_id( $context ),
742
            'email'      => $this->get_email( $context ),
743
            'first_name' => $this->get_first_name( $context ),
744
            'last_name'  => $this->get_last_name( $context ),
745
            'address'    => $this->get_address( $context ),
746
            'phone'      => $this->get_phone( $context ),
747
            'city'       => $this->get_city( $context ),
748
            'country'    => $this->get_country( $context ),
749
            'state'      => $this->get_state( $context ),
750
            'zip'        => $this->get_zip( $context ),
751
            'company'    => $this->get_company( $context ),
752
            'vat_number' => $this->get_vat_number( $context ),
753
            'discount'   => $this->get_discount_code( $context ),
754
		);
755
756
		return apply_filters( 'wpinv_user_info', $user_info, $this->get_id(), $this );
757
758
    }
759
760
    /**
761
	 * Get the customer id.
762
	 *
763
	 * @since 1.0.19
764
	 * @param  string $context View or edit context.
765
	 * @return int
766
	 */
767
	public function get_author( $context = 'view' ) {
768
		return (int) $this->get_prop( 'author', $context );
769
    }
770
771
    /**
772
	 * Alias of self::get_author().
773
	 *
774
	 * @since 1.0.19
775
	 * @param  string $context View or edit context.
776
	 * @return int
777
	 */
778
	public function get_user_id( $context = 'view' ) {
779
		return $this->get_author( $context );
780
    }
781
782
     /**
783
	 * Alias of self::get_author().
784
	 *
785
	 * @since 1.0.19
786
	 * @param  string $context View or edit context.
787
	 * @return int
788
	 */
789
	public function get_customer_id( $context = 'view' ) {
790
		return $this->get_author( $context );
791
    }
792
793
    /**
794
	 * Get the customer's ip.
795
	 *
796
	 * @since 1.0.19
797
	 * @param  string $context View or edit context.
798
	 * @return string
799
	 */
800
	public function get_ip( $context = 'view' ) {
801
		return $this->get_prop( 'user_ip', $context );
802
    }
803
804
    /**
805
	 * Alias of self::get_ip().
806
	 *
807
	 * @since 1.0.19
808
	 * @param  string $context View or edit context.
809
	 * @return string
810
	 */
811
	public function get_user_ip( $context = 'view' ) {
812
		return $this->get_ip( $context );
813
    }
814
815
     /**
816
	 * Alias of self::get_ip().
817
	 *
818
	 * @since 1.0.19
819
	 * @param  string $context View or edit context.
820
	 * @return string
821
	 */
822
	public function get_customer_ip( $context = 'view' ) {
823
		return $this->get_ip( $context );
824
    }
825
826
    /**
827
	 * Get the customer's first name.
828
	 *
829
	 * @since 1.0.19
830
	 * @param  string $context View or edit context.
831
	 * @return string
832
	 */
833
	public function get_first_name( $context = 'view' ) {
834
		return $this->get_prop( 'first_name', $context );
835
    }
836
837
    /**
838
	 * Alias of self::get_first_name().
839
	 *
840
	 * @since 1.0.19
841
	 * @param  string $context View or edit context.
842
	 * @return string
843
	 */
844
	public function get_user_first_name( $context = 'view' ) {
845
		return $this->get_first_name( $context );
846
    }
847
848
     /**
849
	 * Alias of self::get_first_name().
850
	 *
851
	 * @since 1.0.19
852
	 * @param  string $context View or edit context.
853
	 * @return string
854
	 */
855
	public function get_customer_first_name( $context = 'view' ) {
856
		return $this->get_first_name( $context );
857
    }
858
859
    /**
860
	 * Get the customer's last name.
861
	 *
862
	 * @since 1.0.19
863
	 * @param  string $context View or edit context.
864
	 * @return string
865
	 */
866
	public function get_last_name( $context = 'view' ) {
867
		return $this->get_prop( 'last_name', $context );
868
    }
869
870
    /**
871
	 * Alias of self::get_last_name().
872
	 *
873
	 * @since 1.0.19
874
	 * @param  string $context View or edit context.
875
	 * @return string
876
	 */
877
	public function get_user_last_name( $context = 'view' ) {
878
		return $this->get_last_name( $context );
879
    }
880
881
    /**
882
	 * Alias of self::get_last_name().
883
	 *
884
	 * @since 1.0.19
885
	 * @param  string $context View or edit context.
886
	 * @return string
887
	 */
888
	public function get_customer_last_name( $context = 'view' ) {
889
		return $this->get_last_name( $context );
890
    }
891
892
    /**
893
	 * Get the customer's full name.
894
	 *
895
	 * @since 1.0.19
896
	 * @param  string $context View or edit context.
897
	 * @return string
898
	 */
899
	public function get_full_name( $context = 'view' ) {
900
		return trim( $this->get_first_name( $context ) . ' ' . $this->get_last_name( $context ) );
901
    }
902
903
    /**
904
	 * Alias of self::get_full_name().
905
	 *
906
	 * @since 1.0.19
907
	 * @param  string $context View or edit context.
908
	 * @return string
909
	 */
910
	public function get_user_full_name( $context = 'view' ) {
911
		return $this->get_full_name( $context );
912
    }
913
914
    /**
915
	 * Alias of self::get_full_name().
916
	 *
917
	 * @since 1.0.19
918
	 * @param  string $context View or edit context.
919
	 * @return string
920
	 */
921
	public function get_customer_full_name( $context = 'view' ) {
922
		return $this->get_full_name( $context );
923
    }
924
925
    /**
926
	 * Get the customer's phone number.
927
	 *
928
	 * @since 1.0.19
929
	 * @param  string $context View or edit context.
930
	 * @return string
931
	 */
932
	public function get_phone( $context = 'view' ) {
933
		return $this->get_prop( 'phone', $context );
934
    }
935
936
    /**
937
	 * Alias of self::get_phone().
938
	 *
939
	 * @since 1.0.19
940
	 * @param  string $context View or edit context.
941
	 * @return string
942
	 */
943
	public function get_phone_number( $context = 'view' ) {
944
		return $this->get_phone( $context );
945
    }
946
947
    /**
948
	 * Alias of self::get_phone().
949
	 *
950
	 * @since 1.0.19
951
	 * @param  string $context View or edit context.
952
	 * @return string
953
	 */
954
	public function get_user_phone( $context = 'view' ) {
955
		return $this->get_phone( $context );
956
    }
957
958
    /**
959
	 * Alias of self::get_phone().
960
	 *
961
	 * @since 1.0.19
962
	 * @param  string $context View or edit context.
963
	 * @return string
964
	 */
965
	public function get_customer_phone( $context = 'view' ) {
966
		return $this->get_phone( $context );
967
    }
968
969
    /**
970
	 * Get the customer's email address.
971
	 *
972
	 * @since 1.0.19
973
	 * @param  string $context View or edit context.
974
	 * @return string
975
	 */
976
	public function get_email( $context = 'view' ) {
977
		return $this->get_prop( 'email', $context );
978
    }
979
980
    /**
981
	 * Alias of self::get_email().
982
	 *
983
	 * @since 1.0.19
984
	 * @param  string $context View or edit context.
985
	 * @return string
986
	 */
987
	public function get_email_address( $context = 'view' ) {
988
		return $this->get_email( $context );
989
    }
990
991
    /**
992
	 * Alias of self::get_email().
993
	 *
994
	 * @since 1.0.19
995
	 * @param  string $context View or edit context.
996
	 * @return string
997
	 */
998
	public function get_user_email( $context = 'view' ) {
999
		return $this->get_email( $context );
1000
    }
1001
1002
    /**
1003
	 * Alias of self::get_email().
1004
	 *
1005
	 * @since 1.0.19
1006
	 * @param  string $context View or edit context.
1007
	 * @return string
1008
	 */
1009
	public function get_customer_email( $context = 'view' ) {
1010
		return $this->get_email( $context );
1011
    }
1012
1013
    /**
1014
	 * Get the customer's country.
1015
	 *
1016
	 * @since 1.0.19
1017
	 * @param  string $context View or edit context.
1018
	 * @return string
1019
	 */
1020
	public function get_country( $context = 'view' ) {
1021
		$country = $this->get_prop( 'country', $context );
1022
		return empty( $country ) ? wpinv_get_default_country() : $country;
1023
    }
1024
1025
    /**
1026
	 * Alias of self::get_country().
1027
	 *
1028
	 * @since 1.0.19
1029
	 * @param  string $context View or edit context.
1030
	 * @return string
1031
	 */
1032
	public function get_user_country( $context = 'view' ) {
1033
		return $this->get_country( $context );
1034
    }
1035
1036
    /**
1037
	 * Alias of self::get_country().
1038
	 *
1039
	 * @since 1.0.19
1040
	 * @param  string $context View or edit context.
1041
	 * @return string
1042
	 */
1043
	public function get_customer_country( $context = 'view' ) {
1044
		return $this->get_country( $context );
1045
    }
1046
1047
    /**
1048
	 * Get the customer's state.
1049
	 *
1050
	 * @since 1.0.19
1051
	 * @param  string $context View or edit context.
1052
	 * @return string
1053
	 */
1054
	public function get_state( $context = 'view' ) {
1055
		$state = $this->get_prop( 'state', $context );
1056
		return empty( $state ) ? wpinv_get_default_state() : $state;
1057
    }
1058
1059
    /**
1060
	 * Alias of self::get_state().
1061
	 *
1062
	 * @since 1.0.19
1063
	 * @param  string $context View or edit context.
1064
	 * @return string
1065
	 */
1066
	public function get_user_state( $context = 'view' ) {
1067
		return $this->get_state( $context );
1068
    }
1069
1070
    /**
1071
	 * Alias of self::get_state().
1072
	 *
1073
	 * @since 1.0.19
1074
	 * @param  string $context View or edit context.
1075
	 * @return string
1076
	 */
1077
	public function get_customer_state( $context = 'view' ) {
1078
		return $this->get_state( $context );
1079
    }
1080
1081
    /**
1082
	 * Get the customer's city.
1083
	 *
1084
	 * @since 1.0.19
1085
	 * @param  string $context View or edit context.
1086
	 * @return string
1087
	 */
1088
	public function get_city( $context = 'view' ) {
1089
		return $this->get_prop( 'city', $context );
1090
    }
1091
1092
    /**
1093
	 * Alias of self::get_city().
1094
	 *
1095
	 * @since 1.0.19
1096
	 * @param  string $context View or edit context.
1097
	 * @return string
1098
	 */
1099
	public function get_user_city( $context = 'view' ) {
1100
		return $this->get_city( $context );
1101
    }
1102
1103
    /**
1104
	 * Alias of self::get_city().
1105
	 *
1106
	 * @since 1.0.19
1107
	 * @param  string $context View or edit context.
1108
	 * @return string
1109
	 */
1110
	public function get_customer_city( $context = 'view' ) {
1111
		return $this->get_city( $context );
1112
    }
1113
1114
    /**
1115
	 * Get the customer's zip.
1116
	 *
1117
	 * @since 1.0.19
1118
	 * @param  string $context View or edit context.
1119
	 * @return string
1120
	 */
1121
	public function get_zip( $context = 'view' ) {
1122
		return $this->get_prop( 'zip', $context );
1123
    }
1124
1125
    /**
1126
	 * Alias of self::get_zip().
1127
	 *
1128
	 * @since 1.0.19
1129
	 * @param  string $context View or edit context.
1130
	 * @return string
1131
	 */
1132
	public function get_user_zip( $context = 'view' ) {
1133
		return $this->get_zip( $context );
1134
    }
1135
1136
    /**
1137
	 * Alias of self::get_zip().
1138
	 *
1139
	 * @since 1.0.19
1140
	 * @param  string $context View or edit context.
1141
	 * @return string
1142
	 */
1143
	public function get_customer_zip( $context = 'view' ) {
1144
		return $this->get_zip( $context );
1145
    }
1146
1147
    /**
1148
	 * Get the customer's company.
1149
	 *
1150
	 * @since 1.0.19
1151
	 * @param  string $context View or edit context.
1152
	 * @return string
1153
	 */
1154
	public function get_company( $context = 'view' ) {
1155
		return $this->get_prop( 'company', $context );
1156
    }
1157
1158
    /**
1159
	 * Alias of self::get_company().
1160
	 *
1161
	 * @since 1.0.19
1162
	 * @param  string $context View or edit context.
1163
	 * @return string
1164
	 */
1165
	public function get_user_company( $context = 'view' ) {
1166
		return $this->get_company( $context );
1167
    }
1168
1169
    /**
1170
	 * Alias of self::get_company().
1171
	 *
1172
	 * @since 1.0.19
1173
	 * @param  string $context View or edit context.
1174
	 * @return string
1175
	 */
1176
	public function get_customer_company( $context = 'view' ) {
1177
		return $this->get_company( $context );
1178
    }
1179
1180
    /**
1181
	 * Get the customer's vat number.
1182
	 *
1183
	 * @since 1.0.19
1184
	 * @param  string $context View or edit context.
1185
	 * @return string
1186
	 */
1187
	public function get_vat_number( $context = 'view' ) {
1188
		return $this->get_prop( 'vat_number', $context );
1189
    }
1190
1191
    /**
1192
	 * Alias of self::get_vat_number().
1193
	 *
1194
	 * @since 1.0.19
1195
	 * @param  string $context View or edit context.
1196
	 * @return string
1197
	 */
1198
	public function get_user_vat_number( $context = 'view' ) {
1199
		return $this->get_vat_number( $context );
1200
    }
1201
1202
    /**
1203
	 * Alias of self::get_vat_number().
1204
	 *
1205
	 * @since 1.0.19
1206
	 * @param  string $context View or edit context.
1207
	 * @return string
1208
	 */
1209
	public function get_customer_vat_number( $context = 'view' ) {
1210
		return $this->get_vat_number( $context );
1211
    }
1212
1213
    /**
1214
	 * Get the customer's vat rate.
1215
	 *
1216
	 * @since 1.0.19
1217
	 * @param  string $context View or edit context.
1218
	 * @return string
1219
	 */
1220
	public function get_vat_rate( $context = 'view' ) {
1221
		return $this->get_prop( 'vat_rate', $context );
1222
    }
1223
1224
    /**
1225
	 * Alias of self::get_vat_rate().
1226
	 *
1227
	 * @since 1.0.19
1228
	 * @param  string $context View or edit context.
1229
	 * @return string
1230
	 */
1231
	public function get_user_vat_rate( $context = 'view' ) {
1232
		return $this->get_vat_rate( $context );
1233
    }
1234
1235
    /**
1236
	 * Alias of self::get_vat_rate().
1237
	 *
1238
	 * @since 1.0.19
1239
	 * @param  string $context View or edit context.
1240
	 * @return string
1241
	 */
1242
	public function get_customer_vat_rate( $context = 'view' ) {
1243
		return $this->get_vat_rate( $context );
1244
    }
1245
1246
    /**
1247
	 * Get the customer's address.
1248
	 *
1249
	 * @since 1.0.19
1250
	 * @param  string $context View or edit context.
1251
	 * @return string
1252
	 */
1253
	public function get_address( $context = 'view' ) {
1254
		return $this->get_prop( 'address', $context );
1255
    }
1256
1257
    /**
1258
	 * Alias of self::get_address().
1259
	 *
1260
	 * @since 1.0.19
1261
	 * @param  string $context View or edit context.
1262
	 * @return string
1263
	 */
1264
	public function get_user_address( $context = 'view' ) {
1265
		return $this->get_address( $context );
1266
    }
1267
1268
    /**
1269
	 * Alias of self::get_address().
1270
	 *
1271
	 * @since 1.0.19
1272
	 * @param  string $context View or edit context.
1273
	 * @return string
1274
	 */
1275
	public function get_customer_address( $context = 'view' ) {
1276
		return $this->get_address( $context );
1277
    }
1278
1279
    /**
1280
	 * Get whether the customer has viewed the invoice or not.
1281
	 *
1282
	 * @since 1.0.19
1283
	 * @param  string $context View or edit context.
1284
	 * @return bool
1285
	 */
1286
	public function get_is_viewed( $context = 'view' ) {
1287
		return (bool) $this->get_prop( 'is_viewed', $context );
1288
	}
1289
1290
	/**
1291
	 * Get other recipients for invoice communications.
1292
	 *
1293
	 * @since 1.0.19
1294
	 * @param  string $context View or edit context.
1295
	 * @return bool
1296
	 */
1297
	public function get_email_cc( $context = 'view' ) {
1298
		return $this->get_prop( 'email_cc', $context );
1299
	}
1300
1301
	/**
1302
	 * Get invoice template.
1303
	 *
1304
	 * @since 1.0.19
1305
	 * @param  string $context View or edit context.
1306
	 * @return bool
1307
	 */
1308
	public function get_template( $context = 'view' ) {
1309
		return $this->get_prop( 'template', $context );
1310
	}
1311
1312
	/**
1313
	 * Get invoice source.
1314
	 *
1315
	 * @since 1.0.19
1316
	 * @param  string $context View or edit context.
1317
	 * @return bool
1318
	 */
1319
	public function get_created_via( $context = 'view' ) {
1320
		return $this->get_prop( 'created_via', $context );
1321
	}
1322
1323
	/**
1324
	 * Get whether the customer has confirmed their address.
1325
	 *
1326
	 * @since 1.0.19
1327
	 * @param  string $context View or edit context.
1328
	 * @return bool
1329
	 */
1330
	public function get_address_confirmed( $context = 'view' ) {
1331
		return (bool) $this->get_prop( 'address_confirmed', $context );
1332
    }
1333
1334
    /**
1335
	 * Alias of self::get_address_confirmed().
1336
	 *
1337
	 * @since 1.0.19
1338
	 * @param  string $context View or edit context.
1339
	 * @return bool
1340
	 */
1341
	public function get_user_address_confirmed( $context = 'view' ) {
1342
		return $this->get_address_confirmed( $context );
1343
    }
1344
1345
    /**
1346
	 * Alias of self::get_address().
1347
	 *
1348
	 * @since 1.0.19
1349
	 * @param  string $context View or edit context.
1350
	 * @return bool
1351
	 */
1352
	public function get_customer_address_confirmed( $context = 'view' ) {
1353
		return $this->get_address_confirmed( $context );
1354
    }
1355
1356
    /**
1357
	 * Get the invoice subtotal.
1358
	 *
1359
	 * @since 1.0.19
1360
	 * @param  string $context View or edit context.
1361
	 * @return float
1362
	 */
1363
	public function get_subtotal( $context = 'view' ) {
1364
        $subtotal = (float) $this->get_prop( 'subtotal', $context );
1365
1366
        // Backwards compatibility.
1367
        if ( is_bool( $context ) && $context ) {
0 ignored issues
show
introduced by
The condition is_bool($context) is always false.
Loading history...
1368
            return wpinv_price( $subtotal, $this->get_currency() );
1369
        }
1370
1371
        return $subtotal;
1372
    }
1373
1374
    /**
1375
	 * Get the invoice discount total.
1376
	 *
1377
	 * @since 1.0.19
1378
	 * @param  string $context View or edit context.
1379
	 * @return float
1380
	 */
1381
	public function get_total_discount( $context = 'view' ) {
1382
		return wpinv_round_amount( wpinv_sanitize_amount( $this->get_prop( 'total_discount', $context ) ) );
1383
    }
1384
1385
    /**
1386
	 * Get the invoice tax total.
1387
	 *
1388
	 * @since 1.0.19
1389
	 * @param  string $context View or edit context.
1390
	 * @return float
1391
	 */
1392
	public function get_total_tax( $context = 'view' ) {
1393
		return wpinv_round_amount( wpinv_sanitize_amount( $this->get_prop( 'total_tax', $context ) ) );
1394
	}
1395
1396
	/**
1397
	 * @deprecated
1398
	 */
1399
	public function get_final_tax( $currency = false ) {
1400
		$tax = $this->get_total_tax();
1401
1402
        if ( $currency ) {
1403
			return wpinv_price( $tax, $this->get_currency() );
1404
        }
1405
1406
        return $tax;
1407
    }
1408
1409
    /**
1410
	 * Get the invoice fees total.
1411
	 *
1412
	 * @since 1.0.19
1413
	 * @param  string $context View or edit context.
1414
	 * @return float
1415
	 */
1416
	public function get_total_fees( $context = 'view' ) {
1417
		return wpinv_round_amount( wpinv_sanitize_amount( $this->get_prop( 'total_fees', $context ) ) );
1418
    }
1419
1420
    /**
1421
	 * Alias for self::get_total_fees().
1422
	 *
1423
	 * @since 1.0.19
1424
	 * @param  string $context View or edit context.
1425
	 * @return float
1426
	 */
1427
	public function get_fees_total( $context = 'view' ) {
1428
		return $this->get_total_fees( $context );
1429
    }
1430
1431
    /**
1432
	 * Get the invoice total.
1433
	 *
1434
	 * @since 1.0.19
1435
     * @return float
1436
	 */
1437
	public function get_total( $context = 'view' ) {
1438
		return wpinv_round_amount( wpinv_sanitize_amount( $this->get_prop( 'total', $context ) ) );
1439
	}
1440
1441
	/**
1442
	 * Get the invoice totals.
1443
	 *
1444
	 * @since 1.0.19
1445
     * @return array
1446
	 */
1447
	public function get_totals() {
1448
		return $this->totals;
1449
    }
1450
1451
    /**
1452
	 * Get the initial invoice total.
1453
	 *
1454
	 * @since 1.0.19
1455
     * @param  string $context View or edit context.
1456
     * @return float
1457
	 */
1458
    public function get_initial_total() {
1459
1460
		if ( empty( $this->totals ) ) {
1461
			$this->recalculate_total();
1462
		}
1463
1464
		$tax      = $this->totals['tax']['initial'];
1465
		$fee      = $this->totals['fee']['initial'];
1466
		$discount = $this->totals['discount']['initial'];
1467
		$subtotal = $this->totals['subtotal']['initial'];
1468
		$total    = $tax + $fee - $discount + $subtotal;
1469
1470
		if ( 0 > $total ) {
1471
			$total = 0;
1472
		}
1473
1474
		$total = wpinv_round_amount( wpinv_sanitize_amount( $total ) );
1475
        return apply_filters( 'wpinv_get_initial_invoice_total', $total, $this );
1476
	}
1477
1478
	/**
1479
	 * Get the recurring invoice total.
1480
	 *
1481
	 * @since 1.0.19
1482
     * @param  string $context View or edit context.
1483
     * @return float
1484
	 */
1485
    public function get_recurring_total() {
1486
1487
		if ( empty( $this->totals ) ) {
1488
			$this->recalculate_total();
1489
		}
1490
1491
		$tax      = $this->totals['tax']['recurring'];
1492
		$fee      = $this->totals['fee']['recurring'];
1493
		$discount = $this->totals['discount']['recurring'];
1494
		$subtotal = $this->totals['subtotal']['recurring'];
1495
		$total    = $tax + $fee - $discount + $subtotal;
1496
1497
		if ( 0 > $total ) {
1498
			$total = 0;
1499
		}
1500
1501
		$total = wpinv_round_amount( wpinv_sanitize_amount( $total ) );
1502
        return apply_filters( 'wpinv_get_recurring_invoice_total', $total, $this );
1503
	}
1504
1505
	/**
1506
	 * Returns recurring payment details.
1507
	 *
1508
	 * @since 1.0.19
1509
     * @param  string $field Optionally provide a field to return.
1510
	 * @param string $currency Whether to include the currency.
1511
     * @return float|string
1512
	 */
1513
    public function get_recurring_details( $field = '', $currency = false ) {
1514
1515
		// Maybe recalculate totals.
1516
		if ( empty( $this->totals ) ) {
1517
			$this->recalculate_total();
1518
		}
1519
1520
		// Prepare recurring totals.
1521
        $data = apply_filters(
1522
			'wpinv_get_invoice_recurring_details',
1523
			array(
1524
				'cart_details' => $this->get_cart_details(),
1525
				'subtotal'     => $this->totals['subtotal']['recurring'],
1526
				'discount'     => $this->totals['discount']['recurring'],
1527
				'tax'          => $this->totals['tax']['recurring'],
1528
				'fee'          => $this->totals['fee']['recurring'],
1529
				'total'        => $this->get_recurring_total(),
1530
			),
1531
			$this,
1532
			$field,
1533
			$currency
1534
		);
1535
1536
        if ( isset( $data[$field] ) ) {
1537
            return ( $currency ? wpinv_price( $data[$field], $this->get_currency() ) : $data[$field] );
1538
        }
1539
1540
        return $data;
1541
    }
1542
1543
    /**
1544
	 * Get the invoice fees.
1545
	 *
1546
	 * @since 1.0.19
1547
	 * @param  string $context View or edit context.
1548
	 * @return array
1549
	 */
1550
	public function get_fees( $context = 'view' ) {
1551
		return wpinv_parse_list( $this->get_prop( 'fees', $context ) );
1552
    }
1553
1554
    /**
1555
	 * Get the invoice discounts.
1556
	 *
1557
	 * @since 1.0.19
1558
	 * @param  string $context View or edit context.
1559
	 * @return array
1560
	 */
1561
	public function get_discounts( $context = 'view' ) {
1562
		return wpinv_parse_list( $this->get_prop( 'discounts', $context ) );
1563
    }
1564
1565
    /**
1566
	 * Get the invoice taxes.
1567
	 *
1568
	 * @since 1.0.19
1569
	 * @param  string $context View or edit context.
1570
	 * @return array
1571
	 */
1572
	public function get_taxes( $context = 'view' ) {
1573
		return wpinv_parse_list( $this->get_prop( 'taxes', $context ) );
1574
    }
1575
1576
    /**
1577
	 * Get the invoice items.
1578
	 *
1579
	 * @since 1.0.19
1580
	 * @param  string $context View or edit context.
1581
	 * @return GetPaid_Form_Item[]
1582
	 */
1583
	public function get_items( $context = 'view' ) {
1584
        return $this->get_prop( 'items', $context );
1585
	}
1586
1587
	/**
1588
	 * Get the invoice item ids.
1589
	 *
1590
	 * @since 1.0.19
1591
	 * @return string
1592
	 */
1593
	public function get_item_ids() {
1594
		return implode( ', ', wp_list_pluck( $this->get_cart_details(), 'item_id' ) );
1595
    }
1596
1597
    /**
1598
	 * Get the invoice's payment form.
1599
	 *
1600
	 * @since 1.0.19
1601
	 * @param  string $context View or edit context.
1602
	 * @return int
1603
	 */
1604
	public function get_payment_form( $context = 'view' ) {
1605
		return intval( $this->get_prop( 'payment_form', $context ) );
1606
    }
1607
1608
    /**
1609
	 * Get the invoice's submission id.
1610
	 *
1611
	 * @since 1.0.19
1612
	 * @param  string $context View or edit context.
1613
	 * @return string
1614
	 */
1615
	public function get_submission_id( $context = 'view' ) {
1616
		return $this->get_prop( 'submission_id', $context );
1617
    }
1618
1619
    /**
1620
	 * Get the invoice's discount code.
1621
	 *
1622
	 * @since 1.0.19
1623
	 * @param  string $context View or edit context.
1624
	 * @return string
1625
	 */
1626
	public function get_discount_code( $context = 'view' ) {
1627
		return $this->get_prop( 'discount_code', $context );
1628
    }
1629
1630
    /**
1631
	 * Get the invoice's gateway.
1632
	 *
1633
	 * @since 1.0.19
1634
	 * @param  string $context View or edit context.
1635
	 * @return string
1636
	 */
1637
	public function get_gateway( $context = 'view' ) {
1638
		return $this->get_prop( 'gateway', $context );
1639
    }
1640
1641
    /**
1642
	 * Get the invoice's gateway display title.
1643
	 *
1644
	 * @since 1.0.19
1645
	 * @return string
1646
	 */
1647
    public function get_gateway_title() {
1648
        $title =  wpinv_get_gateway_checkout_label( $this->get_gateway() );
1649
        return apply_filters( 'wpinv_gateway_title', $title, $this->get_id(), $this );
1650
    }
1651
1652
    /**
1653
	 * Get the invoice's transaction id.
1654
	 *
1655
	 * @since 1.0.19
1656
	 * @param  string $context View or edit context.
1657
	 * @return string
1658
	 */
1659
	public function get_transaction_id( $context = 'view' ) {
1660
		return $this->get_prop( 'transaction_id', $context );
1661
    }
1662
1663
    /**
1664
	 * Get the invoice's currency.
1665
	 *
1666
	 * @since 1.0.19
1667
	 * @param  string $context View or edit context.
1668
	 * @return string
1669
	 */
1670
	public function get_currency( $context = 'view' ) {
1671
        $currency = $this->get_prop( 'currency', $context );
1672
        return empty( $currency ) ? wpinv_get_currency() : $currency;
1673
    }
1674
1675
    /**
1676
	 * Checks if we are charging taxes for this invoice.
1677
	 *
1678
	 * @since 1.0.19
1679
	 * @param  string $context View or edit context.
1680
	 * @return bool
1681
	 */
1682
	public function get_disable_taxes( $context = 'view' ) {
1683
        return (bool) $this->get_prop( 'disable_taxes', $context );
1684
    }
1685
1686
    /**
1687
	 * Retrieves the subscription id for an invoice.
1688
	 *
1689
	 * @since 1.0.19
1690
	 * @param  string $context View or edit context.
1691
	 * @return int
1692
	 */
1693
    public function get_subscription_id( $context = 'view' ) {
1694
		return $this->is_renewal() ? $this->get_parent()->get_subscription_id( $context ) : $this->get_prop( 'subscription_id', $context );
1695
	}
1696
1697
	/**
1698
	 * Retrieves the remote subscription id for an invoice.
1699
	 *
1700
	 * @since 1.0.19
1701
	 * @param  string $context View or edit context.
1702
	 * @return int
1703
	 */
1704
    public function get_remote_subscription_id( $context = 'view' ) {
1705
        $subscription_id = $this->get_prop( 'remote_subscription_id', $context );
1706
1707
        if ( empty( $subscription_id ) && $this->is_renewal() ) {
1708
            $parent = $this->get_parent();
1709
            return $parent->get_remote_subscription_id( $context );
1710
        }
1711
1712
        return $subscription_id;
1713
    }
1714
1715
    /**
1716
	 * Retrieves the payment meta for an invoice.
1717
	 *
1718
	 * @since 1.0.19
1719
	 * @param  string $context View or edit context.
1720
	 * @return array
1721
	 */
1722
    public function get_payment_meta( $context = 'view' ) {
1723
1724
        return array(
1725
            'price'        => $this->get_total( $context ),
1726
            'date'         => $this->get_date_created( $context ),
1727
            'user_email'   => $this->get_email( $context ),
1728
            'invoice_key'  => $this->get_key( $context ),
1729
            'currency'     => $this->get_currency( $context ),
1730
            'items'        => $this->get_items( $context ),
1731
            'user_info'    => $this->get_user_info( $context ),
1732
            'cart_details' => $this->get_cart_details(),
1733
            'status'       => $this->get_status( $context ),
1734
            'fees'         => $this->get_fees( $context ),
1735
            'taxes'        => $this->get_taxes( $context ),
1736
        );
1737
1738
    }
1739
1740
    /**
1741
	 * Retrieves the cart details for an invoice.
1742
	 *
1743
	 * @since 1.0.19
1744
	 * @return array
1745
	 */
1746
    public function get_cart_details() {
1747
        $items        = $this->get_items();
1748
        $cart_details = array();
1749
1750
        foreach ( $items as $item ) {
1751
			$item->invoice_id = $this->get_id();
1752
            $cart_details[]   = $item->prepare_data_for_saving();
1753
        }
1754
1755
        return $cart_details;
1756
	}
1757
1758
	/**
1759
	 * Retrieves the recurring item.
1760
	 *
1761
	 * @return null|GetPaid_Form_Item|int
1762
	 */
1763
	public function get_recurring( $object = false ) {
1764
1765
		// Are we returning an object?
1766
        if ( $object ) {
1767
            return $this->get_item( $this->recurring_item );
1768
        }
1769
1770
        return $this->recurring_item;
1771
    }
1772
1773
	/**
1774
	 * Retrieves the subscription name.
1775
	 *
1776
	 * @since 1.0.19
1777
	 * @return string
1778
	 */
1779
	public function get_subscription_name() {
1780
1781
		// Retrieve the recurring name
1782
        $item = $this->get_recurring( true );
1783
1784
		// Abort if it does not exist.
1785
        if ( empty( $item ) ) {
1786
            return '';
1787
        }
1788
1789
		// Return the item name.
1790
        return apply_filters( 'wpinv_invoice_get_subscription_name', $item->get_name(), $this );
1791
	}
1792
1793
	/**
1794
	 * Retrieves the view url.
1795
	 *
1796
	 * @since 1.0.19
1797
	 * @return string
1798
	 */
1799
	public function get_view_url() {
1800
        $invoice_url = get_permalink( $this->get_id() );
1801
		$invoice_url = add_query_arg( 'invoice_key', $this->get_key(), $invoice_url );
1802
        return apply_filters( 'wpinv_get_view_url', $invoice_url, $this );
1803
	}
1804
1805
	/**
1806
	 * Retrieves the payment url.
1807
	 *
1808
	 * @since 1.0.19
1809
	 * @return string
1810
	 */
1811
	public function get_checkout_payment_url( $deprecated = false, $secret = false ) {
1812
1813
		// Retrieve the checkout url.
1814
        $pay_url = wpinv_get_checkout_uri();
1815
1816
		// Maybe force ssl.
1817
        if ( is_ssl() ) {
1818
            $pay_url = str_replace( 'http:', 'https:', $pay_url );
1819
        }
1820
1821
		// Add the invoice key.
1822
		$pay_url = add_query_arg( 'invoice_key', $this->get_key(), $pay_url );
1823
1824
		// (Maybe?) add a secret
1825
        if ( $secret ) {
1826
            $pay_url = add_query_arg( array( '_wpipay' => md5( $this->get_user_id() . '::' . $this->get_email() . '::' . $this->get_key() ) ), $pay_url );
1827
        }
1828
1829
        return apply_filters( 'wpinv_get_checkout_payment_url', $pay_url, $this, $deprecated, $secret );
1830
	}
1831
	
1832
	/**
1833
	 * Retrieves the receipt url.
1834
	 *
1835
	 * @since 1.0.19
1836
	 * @return string
1837
	 */
1838
	public function get_receipt_url() {
1839
1840
		// Retrieve the checkout url.
1841
        $receipt_url = wpinv_get_success_page_uri();
1842
1843
		// Maybe force ssl.
1844
        if ( is_ssl() ) {
1845
            $receipt_url = str_replace( 'http:', 'https:', $receipt_url );
1846
        }
1847
1848
		// Add the invoice key.
1849
		$receipt_url = add_query_arg( 'invoice_key', $this->get_key(), $receipt_url );
1850
1851
        return apply_filters( 'getpaid_get_invoice_receipt_url', $receipt_url, $this );
1852
	}
1853
	
1854
	/**
1855
	 * Retrieves the default status.
1856
	 *
1857
	 * @since 1.0.19
1858
	 * @return string
1859
	 */
1860
	public function get_default_status() {
1861
1862
		$type   = $this->get_type();
1863
		$status = "wpi-$type-pending";
1864
		return str_replace( '-invoice', '', $status );
1865
1866
	}
1867
1868
    /**
1869
	 * Magic method for accessing invoice properties.
1870
	 *
1871
	 * @since 1.0.15
1872
	 * @access public
1873
	 *
1874
	 * @param string $key Discount data to retrieve
1875
	 * @param  string $context View or edit context.
1876
	 * @return mixed Value of the given invoice property (if set).
1877
	 */
1878
	public function get( $key, $context = 'view' ) {
1879
        return $this->get_prop( $key, $context );
1880
	}
1881
1882
    /*
1883
	|--------------------------------------------------------------------------
1884
	| Setters
1885
	|--------------------------------------------------------------------------
1886
	|
1887
	| Functions for setting item data. These should not update anything in the
1888
	| database itself and should only change what is stored in the class
1889
	| object.
1890
    */
1891
1892
    /**
1893
	 * Magic method for setting invoice properties.
1894
	 *
1895
	 * @since 1.0.19
1896
	 * @access public
1897
	 *
1898
	 * @param string $key Discount data to retrieve
1899
	 * @param  mixed $value new value.
1900
	 * @return mixed Value of the given invoice property (if set).
1901
	 */
1902
	public function set( $key, $value ) {
1903
1904
        $setter = "set_$key";
1905
        if ( is_callable( array( $this, $setter ) ) ) {
1906
            $this->{$setter}( $value );
1907
        }
1908
1909
	}
1910
1911
	/**
1912
	 * Sets item status.
1913
	 *
1914
	 * @since 1.0.19
1915
	 * @param string $new_status    New status.
1916
	 * @param string $note          Optional note to add.
1917
	 * @param bool   $manual_update Is this a manual status change?.
1918
	 * @return array details of change.
1919
	 */
1920
	public function set_status( $new_status, $note = '', $manual_update = false ) {
1921
		$old_status = $this->get_status();
1922
1923
		$statuses = $this->get_all_statuses();
1924
1925
		if ( isset( $statuses[ 'draft' ] ) ) {
1926
			unset( $statuses[ 'draft' ] );
1927
		}
1928
1929
		$this->set_prop( 'status', $new_status );
1930
1931
		// If setting the status, ensure it's set to a valid status.
1932
		if ( true === $this->object_read ) {
1933
1934
			// Only allow valid new status.
1935
			if ( ! array_key_exists( $new_status, $statuses ) ) {
1936
				$new_status = $this->get_default_status();
1937
			}
1938
1939
			// If the old status is set but unknown (e.g. draft) assume its pending for action usage.
1940
			if ( $old_status && ! array_key_exists( $new_status, $statuses ) ) {
1941
				$old_status = $this->get_default_status();
1942
			}
1943
1944
			// Paid - Renewal (i.e when duplicating a parent invoice )
1945
			if ( $new_status == 'wpi-pending' && $old_status == 'publish' && ! $this->get_id() ) {
1946
				$old_status = 'wpi-pending';
1947
			}
1948
1949
			if ( $old_status !== $new_status ) {
1950
				$this->status_transition = array(
1951
					'from'   => ! empty( $this->status_transition['from'] ) ? $this->status_transition['from'] : $old_status,
1952
					'to'     => $new_status,
1953
					'note'   => $note,
1954
					'manual' => (bool) $manual_update,
1955
				);
1956
1957
				if ( $manual_update ) {
1958
					do_action( 'getpaid_' . $this->object_type .'_edit_status', $this->get_id(), $new_status );
1959
				}
1960
1961
				$this->maybe_set_date_paid();
1962
1963
			}
1964
1965
		}
1966
1967
		return array(
1968
			'from' => $old_status,
1969
			'to'   => $new_status,
1970
		);
1971
	}
1972
1973
	/**
1974
	 * Maybe set date paid.
1975
	 *
1976
	 * Sets the date paid variable when transitioning to the payment complete
1977
	 * order status.
1978
	 *
1979
	 * @since 1.0.19
1980
	 */
1981
	public function maybe_set_date_paid() {
1982
1983
		if ( ! $this->get_date_completed( 'edit' ) && $this->is_paid() ) {
1984
			$this->set_date_completed( current_time( 'mysql' ) );
1985
		}
1986
	}
1987
1988
    /**
1989
	 * Set parent invoice ID.
1990
	 *
1991
	 * @since 1.0.19
1992
	 */
1993
	public function set_parent_id( $value ) {
1994
		if ( $value && ( $value === $this->get_id() ) ) {
1995
			return;
1996
		}
1997
		$this->set_prop( 'parent_id', absint( $value ) );
1998
    }
1999
2000
    /**
2001
	 * Set plugin version when the invoice was created.
2002
	 *
2003
	 * @since 1.0.19
2004
	 */
2005
	public function set_version( $value ) {
2006
		$this->set_prop( 'version', $value );
2007
    }
2008
2009
    /**
2010
	 * Set date when the invoice was created.
2011
	 *
2012
	 * @since 1.0.19
2013
	 * @param string $value Value to set.
2014
     * @return bool Whether or not the date was set.
2015
	 */
2016
	public function set_date_created( $value ) {
2017
        $date = strtotime( $value );
2018
2019
        if ( $date && $value !== '0000-00-00 00:00:00' ) {
2020
            $this->set_prop( 'date_created', date( 'Y-m-d H:i:s', $date ) );
2021
            return true;
2022
        }
2023
2024
		$this->set_prop( 'date_created', '' );
2025
		return false;
2026
2027
    }
2028
2029
    /**
2030
	 * Set date invoice due date.
2031
	 *
2032
	 * @since 1.0.19
2033
	 * @param string $value Value to set.
2034
     * @return bool Whether or not the date was set.
2035
	 */
2036
	public function set_due_date( $value ) {
2037
        $date = strtotime( $value );
2038
2039
        if ( $date && $value !== '0000-00-00 00:00:00' ) {
2040
            $this->set_prop( 'due_date', date( 'Y-m-d H:i:s', $date ) );
2041
            return true;
2042
        }
2043
2044
		$this->set_prop( 'due_date', '' );
2045
        return false;
2046
2047
    }
2048
2049
    /**
2050
	 * Alias of self::set_due_date().
2051
	 *
2052
	 * @since 1.0.19
2053
	 * @param  string $value New name.
2054
	 */
2055
	public function set_date_due( $value ) {
2056
		$this->set_due_date( $value );
2057
    }
2058
2059
    /**
2060
	 * Set date invoice was completed.
2061
	 *
2062
	 * @since 1.0.19
2063
	 * @param string $value Value to set.
2064
     * @return bool Whether or not the date was set.
2065
	 */
2066
	public function set_completed_date( $value ) {
2067
        $date = strtotime( $value );
2068
2069
        if ( $date && $value !== '0000-00-00 00:00:00'  ) {
2070
            $this->set_prop( 'completed_date', date( 'Y-m-d H:i:s', $date ) );
2071
            return true;
2072
        }
2073
2074
		$this->set_prop( 'completed_date', '' );
2075
        return false;
2076
2077
    }
2078
2079
    /**
2080
	 * Alias of self::set_completed_date().
2081
	 *
2082
	 * @since 1.0.19
2083
	 * @param  string $value New name.
2084
	 */
2085
	public function set_date_completed( $value ) {
2086
		$this->set_completed_date( $value );
2087
    }
2088
2089
    /**
2090
	 * Set date when the invoice was last modified.
2091
	 *
2092
	 * @since 1.0.19
2093
	 * @param string $value Value to set.
2094
     * @return bool Whether or not the date was set.
2095
	 */
2096
	public function set_date_modified( $value ) {
2097
        $date = strtotime( $value );
2098
2099
        if ( $date && $value !== '0000-00-00 00:00:00' ) {
2100
            $this->set_prop( 'date_modified', date( 'Y-m-d H:i:s', $date ) );
2101
            return true;
2102
        }
2103
2104
		$this->set_prop( 'date_modified', '' );
2105
        return false;
2106
2107
    }
2108
2109
    /**
2110
	 * Set the invoice number.
2111
	 *
2112
	 * @since 1.0.19
2113
	 * @param  string $value New number.
2114
	 */
2115
	public function set_number( $value ) {
2116
        $number = sanitize_text_field( $value );
2117
		$this->set_prop( 'number', $number );
2118
    }
2119
2120
    /**
2121
	 * Set the invoice type.
2122
	 *
2123
	 * @since 1.0.19
2124
	 * @param  string $value Type.
2125
	 */
2126
	public function set_type( $value ) {
2127
        $type = sanitize_text_field( str_replace( 'wpi_', '', $value ) );
2128
		$this->set_prop( 'type', $type );
2129
	}
2130
2131
    /**
2132
	 * Set the invoice post type.
2133
	 *
2134
	 * @since 1.0.19
2135
	 * @param  string $value Post type.
2136
	 */
2137
	public function set_post_type( $value ) {
2138
        if ( getpaid_is_invoice_post_type( $value ) ) {
2139
			$this->set_type( $value );
2140
            $this->set_prop( 'post_type', $value );
2141
        }
2142
    }
2143
2144
    /**
2145
	 * Set the invoice key.
2146
	 *
2147
	 * @since 1.0.19
2148
	 * @param  string $value New key.
2149
	 */
2150
	public function set_key( $value ) {
2151
        $key = sanitize_text_field( $value );
2152
		$this->set_prop( 'key', $key );
2153
    }
2154
2155
    /**
2156
	 * Set the invoice mode.
2157
	 *
2158
	 * @since 1.0.19
2159
	 * @param  string $value mode.
2160
	 */
2161
	public function set_mode( $value ) {
2162
        if ( in_array( $value, array( 'live', 'test' ) ) ) {
2163
            $this->set_prop( 'mode', $value );
2164
        }
2165
    }
2166
2167
    /**
2168
	 * Set the invoice path.
2169
	 *
2170
	 * @since 1.0.19
2171
	 * @param  string $value path.
2172
	 */
2173
	public function set_path( $value ) {
2174
        $this->set_prop( 'path', $value );
2175
    }
2176
2177
    /**
2178
	 * Set the invoice name.
2179
	 *
2180
	 * @since 1.0.19
2181
	 * @param  string $value New name.
2182
	 */
2183
	public function set_name( $value ) {
2184
        $name = sanitize_text_field( $value );
2185
		$this->set_prop( 'name', $name );
2186
    }
2187
2188
    /**
2189
	 * Alias of self::set_name().
2190
	 *
2191
	 * @since 1.0.19
2192
	 * @param  string $value New name.
2193
	 */
2194
	public function set_title( $value ) {
2195
		$this->set_name( $value );
2196
    }
2197
2198
    /**
2199
	 * Set the invoice description.
2200
	 *
2201
	 * @since 1.0.19
2202
	 * @param  string $value New description.
2203
	 */
2204
	public function set_description( $value ) {
2205
        $description = wp_kses_post( $value );
2206
		$this->set_prop( 'description', $description );
2207
    }
2208
2209
    /**
2210
	 * Alias of self::set_description().
2211
	 *
2212
	 * @since 1.0.19
2213
	 * @param  string $value New description.
2214
	 */
2215
	public function set_excerpt( $value ) {
2216
		$this->set_description( $value );
2217
    }
2218
2219
    /**
2220
	 * Alias of self::set_description().
2221
	 *
2222
	 * @since 1.0.19
2223
	 * @param  string $value New description.
2224
	 */
2225
	public function set_summary( $value ) {
2226
		$this->set_description( $value );
2227
    }
2228
2229
    /**
2230
	 * Set the receiver of the invoice.
2231
	 *
2232
	 * @since 1.0.19
2233
	 * @param  int $value New author.
2234
	 */
2235
	public function set_author( $value ) {
2236
		$user = get_user_by( 'id', (int) $value );
2237
2238
		if ( $user && $user->ID ) {
2239
			$this->set_prop( 'author', $user->ID );
2240
			$this->set_prop( 'email', $user->user_email );
2241
		}
2242
2243
    }
2244
2245
    /**
2246
	 * Alias of self::set_author().
2247
	 *
2248
	 * @since 1.0.19
2249
	 * @param  int $value New user id.
2250
	 */
2251
	public function set_user_id( $value ) {
2252
		$this->set_author( $value );
2253
    }
2254
2255
    /**
2256
	 * Alias of self::set_author().
2257
	 *
2258
	 * @since 1.0.19
2259
	 * @param  int $value New user id.
2260
	 */
2261
	public function set_customer_id( $value ) {
2262
		$this->set_author( $value );
2263
    }
2264
2265
    /**
2266
	 * Set the customer's ip.
2267
	 *
2268
	 * @since 1.0.19
2269
	 * @param  string $value ip address.
2270
	 */
2271
	public function set_ip( $value ) {
2272
		$this->set_prop( 'ip', $value );
2273
    }
2274
2275
    /**
2276
	 * Alias of self::set_ip().
2277
	 *
2278
	 * @since 1.0.19
2279
	 * @param  string $value ip address.
2280
	 */
2281
	public function set_user_ip( $value ) {
2282
		$this->set_ip( $value );
2283
    }
2284
2285
    /**
2286
	 * Set the customer's first name.
2287
	 *
2288
	 * @since 1.0.19
2289
	 * @param  string $value first name.
2290
	 */
2291
	public function set_first_name( $value ) {
2292
		$this->set_prop( 'first_name', $value );
2293
    }
2294
2295
    /**
2296
	 * Alias of self::set_first_name().
2297
	 *
2298
	 * @since 1.0.19
2299
	 * @param  string $value first name.
2300
	 */
2301
	public function set_user_first_name( $value ) {
2302
		$this->set_first_name( $value );
2303
    }
2304
2305
    /**
2306
	 * Alias of self::set_first_name().
2307
	 *
2308
	 * @since 1.0.19
2309
	 * @param  string $value first name.
2310
	 */
2311
	public function set_customer_first_name( $value ) {
2312
		$this->set_first_name( $value );
2313
    }
2314
2315
    /**
2316
	 * Set the customer's last name.
2317
	 *
2318
	 * @since 1.0.19
2319
	 * @param  string $value last name.
2320
	 */
2321
	public function set_last_name( $value ) {
2322
		$this->set_prop( 'last_name', $value );
2323
    }
2324
2325
    /**
2326
	 * Alias of self::set_last_name().
2327
	 *
2328
	 * @since 1.0.19
2329
	 * @param  string $value last name.
2330
	 */
2331
	public function set_user_last_name( $value ) {
2332
		$this->set_last_name( $value );
2333
    }
2334
2335
    /**
2336
	 * Alias of self::set_last_name().
2337
	 *
2338
	 * @since 1.0.19
2339
	 * @param  string $value last name.
2340
	 */
2341
	public function set_customer_last_name( $value ) {
2342
		$this->set_last_name( $value );
2343
    }
2344
2345
    /**
2346
	 * Set the customer's phone number.
2347
	 *
2348
	 * @since 1.0.19
2349
	 * @param  string $value phone.
2350
	 */
2351
	public function set_phone( $value ) {
2352
		$this->set_prop( 'phone', $value );
2353
    }
2354
2355
    /**
2356
	 * Alias of self::set_phone().
2357
	 *
2358
	 * @since 1.0.19
2359
	 * @param  string $value phone.
2360
	 */
2361
	public function set_user_phone( $value ) {
2362
		$this->set_phone( $value );
2363
    }
2364
2365
    /**
2366
	 * Alias of self::set_phone().
2367
	 *
2368
	 * @since 1.0.19
2369
	 * @param  string $value phone.
2370
	 */
2371
	public function set_customer_phone( $value ) {
2372
		$this->set_phone( $value );
2373
    }
2374
2375
    /**
2376
	 * Alias of self::set_phone().
2377
	 *
2378
	 * @since 1.0.19
2379
	 * @param  string $value phone.
2380
	 */
2381
	public function set_phone_number( $value ) {
2382
		$this->set_phone( $value );
2383
    }
2384
2385
    /**
2386
	 * Set the customer's email address.
2387
	 *
2388
	 * @since 1.0.19
2389
	 * @param  string $value email address.
2390
	 */
2391
	public function set_email( $value ) {
2392
		$this->set_prop( 'email', $value );
2393
    }
2394
2395
    /**
2396
	 * Alias of self::set_email().
2397
	 *
2398
	 * @since 1.0.19
2399
	 * @param  string $value email address.
2400
	 */
2401
	public function set_user_email( $value ) {
2402
		$this->set_email( $value );
2403
    }
2404
2405
    /**
2406
	 * Alias of self::set_email().
2407
	 *
2408
	 * @since 1.0.19
2409
	 * @param  string $value email address.
2410
	 */
2411
	public function set_email_address( $value ) {
2412
		$this->set_email( $value );
2413
    }
2414
2415
    /**
2416
	 * Alias of self::set_email().
2417
	 *
2418
	 * @since 1.0.19
2419
	 * @param  string $value email address.
2420
	 */
2421
	public function set_customer_email( $value ) {
2422
		$this->set_email( $value );
2423
    }
2424
2425
    /**
2426
	 * Set the customer's country.
2427
	 *
2428
	 * @since 1.0.19
2429
	 * @param  string $value country.
2430
	 */
2431
	public function set_country( $value ) {
2432
		$this->set_prop( 'country', $value );
2433
    }
2434
2435
    /**
2436
	 * Alias of self::set_country().
2437
	 *
2438
	 * @since 1.0.19
2439
	 * @param  string $value country.
2440
	 */
2441
	public function set_user_country( $value ) {
2442
		$this->set_country( $value );
2443
    }
2444
2445
    /**
2446
	 * Alias of self::set_country().
2447
	 *
2448
	 * @since 1.0.19
2449
	 * @param  string $value country.
2450
	 */
2451
	public function set_customer_country( $value ) {
2452
		$this->set_country( $value );
2453
    }
2454
2455
    /**
2456
	 * Set the customer's state.
2457
	 *
2458
	 * @since 1.0.19
2459
	 * @param  string $value state.
2460
	 */
2461
	public function set_state( $value ) {
2462
		$this->set_prop( 'state', $value );
2463
    }
2464
2465
    /**
2466
	 * Alias of self::set_state().
2467
	 *
2468
	 * @since 1.0.19
2469
	 * @param  string $value state.
2470
	 */
2471
	public function set_user_state( $value ) {
2472
		$this->set_state( $value );
2473
    }
2474
2475
    /**
2476
	 * Alias of self::set_state().
2477
	 *
2478
	 * @since 1.0.19
2479
	 * @param  string $value state.
2480
	 */
2481
	public function set_customer_state( $value ) {
2482
		$this->set_state( $value );
2483
    }
2484
2485
    /**
2486
	 * Set the customer's city.
2487
	 *
2488
	 * @since 1.0.19
2489
	 * @param  string $value city.
2490
	 */
2491
	public function set_city( $value ) {
2492
		$this->set_prop( 'city', $value );
2493
    }
2494
2495
    /**
2496
	 * Alias of self::set_city().
2497
	 *
2498
	 * @since 1.0.19
2499
	 * @param  string $value city.
2500
	 */
2501
	public function set_user_city( $value ) {
2502
		$this->set_city( $value );
2503
    }
2504
2505
    /**
2506
	 * Alias of self::set_city().
2507
	 *
2508
	 * @since 1.0.19
2509
	 * @param  string $value city.
2510
	 */
2511
	public function set_customer_city( $value ) {
2512
		$this->set_city( $value );
2513
    }
2514
2515
    /**
2516
	 * Set the customer's zip code.
2517
	 *
2518
	 * @since 1.0.19
2519
	 * @param  string $value zip.
2520
	 */
2521
	public function set_zip( $value ) {
2522
		$this->set_prop( 'zip', $value );
2523
    }
2524
2525
    /**
2526
	 * Alias of self::set_zip().
2527
	 *
2528
	 * @since 1.0.19
2529
	 * @param  string $value zip.
2530
	 */
2531
	public function set_user_zip( $value ) {
2532
		$this->set_zip( $value );
2533
    }
2534
2535
    /**
2536
	 * Alias of self::set_zip().
2537
	 *
2538
	 * @since 1.0.19
2539
	 * @param  string $value zip.
2540
	 */
2541
	public function set_customer_zip( $value ) {
2542
		$this->set_zip( $value );
2543
    }
2544
2545
    /**
2546
	 * Set the customer's company.
2547
	 *
2548
	 * @since 1.0.19
2549
	 * @param  string $value company.
2550
	 */
2551
	public function set_company( $value ) {
2552
		$this->set_prop( 'company', $value );
2553
    }
2554
2555
    /**
2556
	 * Alias of self::set_company().
2557
	 *
2558
	 * @since 1.0.19
2559
	 * @param  string $value company.
2560
	 */
2561
	public function set_user_company( $value ) {
2562
		$this->set_company( $value );
2563
    }
2564
2565
    /**
2566
	 * Alias of self::set_company().
2567
	 *
2568
	 * @since 1.0.19
2569
	 * @param  string $value company.
2570
	 */
2571
	public function set_customer_company( $value ) {
2572
		$this->set_company( $value );
2573
    }
2574
2575
    /**
2576
	 * Set the customer's var number.
2577
	 *
2578
	 * @since 1.0.19
2579
	 * @param  string $value var number.
2580
	 */
2581
	public function set_vat_number( $value ) {
2582
		$this->set_prop( 'vat_number', $value );
2583
    }
2584
2585
    /**
2586
	 * Alias of self::set_vat_number().
2587
	 *
2588
	 * @since 1.0.19
2589
	 * @param  string $value var number.
2590
	 */
2591
	public function set_user_vat_number( $value ) {
2592
		$this->set_vat_number( $value );
2593
    }
2594
2595
    /**
2596
	 * Alias of self::set_vat_number().
2597
	 *
2598
	 * @since 1.0.19
2599
	 * @param  string $value var number.
2600
	 */
2601
	public function set_customer_vat_number( $value ) {
2602
		$this->set_vat_number( $value );
2603
    }
2604
2605
    /**
2606
	 * Set the customer's vat rate.
2607
	 *
2608
	 * @since 1.0.19
2609
	 * @param  string $value var rate.
2610
	 */
2611
	public function set_vat_rate( $value ) {
2612
		$this->set_prop( 'vat_rate', $value );
2613
    }
2614
2615
    /**
2616
	 * Alias of self::set_vat_rate().
2617
	 *
2618
	 * @since 1.0.19
2619
	 * @param  string $value var number.
2620
	 */
2621
	public function set_user_vat_rate( $value ) {
2622
		$this->set_vat_rate( $value );
2623
    }
2624
2625
    /**
2626
	 * Alias of self::set_vat_rate().
2627
	 *
2628
	 * @since 1.0.19
2629
	 * @param  string $value var number.
2630
	 */
2631
	public function set_customer_vat_rate( $value ) {
2632
		$this->set_vat_rate( $value );
2633
    }
2634
2635
    /**
2636
	 * Set the customer's address.
2637
	 *
2638
	 * @since 1.0.19
2639
	 * @param  string $value address.
2640
	 */
2641
	public function set_address( $value ) {
2642
		$this->set_prop( 'address', $value );
2643
    }
2644
2645
    /**
2646
	 * Alias of self::set_address().
2647
	 *
2648
	 * @since 1.0.19
2649
	 * @param  string $value address.
2650
	 */
2651
	public function set_user_address( $value ) {
2652
		$this->set_address( $value );
2653
    }
2654
2655
    /**
2656
	 * Alias of self::set_address().
2657
	 *
2658
	 * @since 1.0.19
2659
	 * @param  string $value address.
2660
	 */
2661
	public function set_customer_address( $value ) {
2662
		$this->set_address( $value );
2663
    }
2664
2665
    /**
2666
	 * Set whether the customer has viewed the invoice or not.
2667
	 *
2668
	 * @since 1.0.19
2669
	 * @param  int|bool $value confirmed.
2670
	 */
2671
	public function set_is_viewed( $value ) {
2672
		$this->set_prop( 'is_viewed', $value );
2673
	}
2674
2675
	/**
2676
	 * Set extra email recipients.
2677
	 *
2678
	 * @since 1.0.19
2679
	 * @param  string $value email recipients.
2680
	 */
2681
	public function set_email_cc( $value ) {
2682
		$this->set_prop( 'email_cc', $value );
2683
	}
2684
2685
	/**
2686
	 * Set the invoice template.
2687
	 *
2688
	 * @since 1.0.19
2689
	 * @param  string $value template.
2690
	 */
2691
	public function set_template( $value ) {
2692
		if ( in_array( $value, array( 'quantity', 'hours', 'amount' ) ) ) {
2693
			$this->set_prop( 'template', $value );
2694
		}
2695
	}
2696
2697
	/**
2698
	 * Set the invoice source.
2699
	 *
2700
	 * @since 1.0.19
2701
	 * @param  string $value source.
2702
	 * @deprecated
2703
	 */
2704
	public function created_via( $value ) {
2705
		$this->set_created_via( sanitize_text_field( $value ) );
2706
	}
2707
2708
	/**
2709
	 * Set the invoice source.
2710
	 *
2711
	 * @since 1.0.19
2712
	 * @param  string $value source.
2713
	 */
2714
	public function set_created_via( $value ) {
2715
		$this->set_prop( 'created_via', sanitize_text_field( $value ) );
2716
	}
2717
2718
	/**
2719
	 * Set the customer's address confirmed status.
2720
	 *
2721
	 * @since 1.0.19
2722
	 * @param  int|bool $value confirmed.
2723
	 */
2724
	public function set_address_confirmed( $value ) {
2725
		$this->set_prop( 'address_confirmed', $value );
2726
    }
2727
2728
    /**
2729
	 * Alias of self::set_address_confirmed().
2730
	 *
2731
	 * @since 1.0.19
2732
	 * @param  int|bool $value confirmed.
2733
	 */
2734
	public function set_user_address_confirmed( $value ) {
2735
		$this->set_address_confirmed( $value );
2736
    }
2737
2738
    /**
2739
	 * Alias of self::set_address_confirmed().
2740
	 *
2741
	 * @since 1.0.19
2742
	 * @param  int|bool $value confirmed.
2743
	 */
2744
	public function set_customer_address_confirmed( $value ) {
2745
		$this->set_address_confirmed( $value );
2746
    }
2747
2748
    /**
2749
	 * Set the invoice sub total.
2750
	 *
2751
	 * @since 1.0.19
2752
	 * @param  float $value sub total.
2753
	 */
2754
	public function set_subtotal( $value ) {
2755
		$this->set_prop( 'subtotal', max( 0, $value ) );
2756
	}
2757
2758
	/**
2759
	 * Set the invoice total.
2760
	 *
2761
	 * @since 1.0.19
2762
	 * @param  float $value sub total.
2763
	 */
2764
	public function set_total( $value ) {
2765
		$this->set_prop( 'total', max( 0, $value ) );
2766
    }
2767
2768
    /**
2769
	 * Set the invoice discount amount.
2770
	 *
2771
	 * @since 1.0.19
2772
	 * @param  float $value discount total.
2773
	 */
2774
	public function set_total_discount( $value ) {
2775
		$this->set_prop( 'total_discount', max( 0, $value ) );
2776
    }
2777
2778
    /**
2779
	 * Alias of self::set_total_discount().
2780
	 *
2781
	 * @since 1.0.19
2782
	 * @param  float $value discount total.
2783
	 */
2784
	public function set_discount( $value ) {
2785
		$this->set_total_discount( $value );
2786
    }
2787
2788
    /**
2789
	 * Set the invoice tax amount.
2790
	 *
2791
	 * @since 1.0.19
2792
	 * @param  float $value tax total.
2793
	 */
2794
	public function set_total_tax( $value ) {
2795
		$this->set_prop( 'total_tax', max( 0, $value ) );
2796
    }
2797
2798
    /**
2799
	 * Alias of self::set_total_tax().
2800
	 *
2801
	 * @since 1.0.19
2802
	 * @param  float $value tax total.
2803
	 */
2804
	public function set_tax_total( $value ) {
2805
		$this->set_total_tax( $value );
2806
    }
2807
2808
    /**
2809
	 * Set the invoice fees amount.
2810
	 *
2811
	 * @since 1.0.19
2812
	 * @param  float $value fees total.
2813
	 */
2814
	public function set_total_fees( $value ) {
2815
		$this->set_prop( 'total_fees', max( 0, $value ) );
2816
    }
2817
2818
    /**
2819
	 * Alias of self::set_total_fees().
2820
	 *
2821
	 * @since 1.0.19
2822
	 * @param  float $value fees total.
2823
	 */
2824
	public function set_fees_total( $value ) {
2825
		$this->set_total_fees( $value );
2826
    }
2827
2828
    /**
2829
	 * Set the invoice fees.
2830
	 *
2831
	 * @since 1.0.19
2832
	 * @param  array $value fees.
2833
	 */
2834
	public function set_fees( $value ) {
2835
2836
		if ( ! is_array( $value ) ) {
0 ignored issues
show
introduced by
The condition is_array($value) is always true.
Loading history...
2837
			$value = array();
2838
		}
2839
2840
		$this->set_prop( 'fees', $value );
2841
2842
    }
2843
2844
    /**
2845
	 * Set the invoice taxes.
2846
	 *
2847
	 * @since 1.0.19
2848
	 * @param  array $value taxes.
2849
	 */
2850
	public function set_taxes( $value ) {
2851
2852
		if ( ! is_array( $value ) ) {
0 ignored issues
show
introduced by
The condition is_array($value) is always true.
Loading history...
2853
			$value = array();
2854
		}
2855
2856
		$this->set_prop( 'taxes', $value );
2857
2858
    }
2859
2860
    /**
2861
	 * Set the invoice discounts.
2862
	 *
2863
	 * @since 1.0.19
2864
	 * @param  array $value discounts.
2865
	 */
2866
	public function set_discounts( $value ) {
2867
2868
		if ( ! is_array( $value ) ) {
0 ignored issues
show
introduced by
The condition is_array($value) is always true.
Loading history...
2869
			$value = array();
2870
		}
2871
2872
		$this->set_prop( 'discounts', $value );
2873
    }
2874
2875
    /**
2876
	 * Set the invoice items.
2877
	 *
2878
	 * @since 1.0.19
2879
	 * @param  GetPaid_Form_Item[] $value items.
2880
	 */
2881
	public function set_items( $value ) {
2882
2883
        // Remove existing items.
2884
        $this->set_prop( 'items', array() );
2885
		$this->recurring_item = null;
2886
2887
        // Ensure that we have an array.
2888
        if ( ! is_array( $value ) ) {
0 ignored issues
show
introduced by
The condition is_array($value) is always true.
Loading history...
2889
            return;
2890
        }
2891
2892
        foreach ( $value as $item ) {
2893
            $this->add_item( $item );
2894
        }
2895
2896
    }
2897
2898
    /**
2899
	 * Set the payment form.
2900
	 *
2901
	 * @since 1.0.19
2902
	 * @param  int $value payment form.
2903
	 */
2904
	public function set_payment_form( $value ) {
2905
		$this->set_prop( 'payment_form', $value );
2906
    }
2907
2908
    /**
2909
	 * Set the submission id.
2910
	 *
2911
	 * @since 1.0.19
2912
	 * @param  string $value submission id.
2913
	 */
2914
	public function set_submission_id( $value ) {
2915
		$this->set_prop( 'submission_id', $value );
2916
    }
2917
2918
    /**
2919
	 * Set the discount code.
2920
	 *
2921
	 * @since 1.0.19
2922
	 * @param  string $value discount code.
2923
	 */
2924
	public function set_discount_code( $value ) {
2925
		$this->set_prop( 'discount_code', sanitize_text_field( $value ) );
2926
    }
2927
2928
    /**
2929
	 * Set the gateway.
2930
	 *
2931
	 * @since 1.0.19
2932
	 * @param  string $value gateway.
2933
	 */
2934
	public function set_gateway( $value ) {
2935
		$this->set_prop( 'gateway', $value );
2936
    }
2937
2938
    /**
2939
	 * Set the transaction id.
2940
	 *
2941
	 * @since 1.0.19
2942
	 * @param  string $value transaction id.
2943
	 */
2944
	public function set_transaction_id( $value ) {
2945
		if ( ! empty( $value ) ) {
2946
			$this->set_prop( 'transaction_id', $value );
2947
		}
2948
    }
2949
2950
    /**
2951
	 * Set the currency id.
2952
	 *
2953
	 * @since 1.0.19
2954
	 * @param  string $value currency id.
2955
	 */
2956
	public function set_currency( $value ) {
2957
		$this->set_prop( 'currency', $value );
2958
    }
2959
2960
	/**
2961
	 * Set whether to disable taxes.
2962
	 *
2963
	 * @since 1.0.19
2964
	 * @param  bool $value value.
2965
	 */
2966
	public function set_disable_taxes( $value ) {
2967
		$this->set_prop( 'disable_taxes', (bool) $value );
2968
	}
2969
2970
    /**
2971
	 * Set the subscription id.
2972
	 *
2973
	 * @since 1.0.19
2974
	 * @param  string $value subscription id.
2975
	 */
2976
	public function set_subscription_id( $value ) {
2977
		$this->set_prop( 'subscription_id', $value );
2978
	}
2979
	
2980
	/**
2981
	 * Set the remote subscription id.
2982
	 *
2983
	 * @since 1.0.19
2984
	 * @param  string $value subscription id.
2985
	 */
2986
	public function set_remote_subscription_id( $value ) {
2987
		$this->set_prop( 'remote_subscription_id', $value );
2988
    }
2989
2990
    /*
2991
	|--------------------------------------------------------------------------
2992
	| Boolean methods
2993
	|--------------------------------------------------------------------------
2994
	|
2995
	| Return true or false.
2996
	|
2997
    */
2998
2999
    /**
3000
     * Checks if this is a parent invoice.
3001
     */
3002
    public function is_parent() {
3003
        $parent = $this->get_parent_id();
3004
        return apply_filters( 'wpinv_invoice_is_parent', empty( $parent ), $this );
3005
    }
3006
3007
    /**
3008
     * Checks if this is a renewal invoice.
3009
     */
3010
    public function is_renewal() {
3011
        return ! $this->is_parent();
3012
    }
3013
3014
    /**
3015
     * Checks if this is a recurring invoice.
3016
     */
3017
    public function is_recurring() {
3018
        return $this->is_renewal() || ! empty( $this->recurring_item );
3019
    }
3020
3021
    /**
3022
     * Checks if this is a taxable invoice.
3023
     */
3024
    public function is_taxable() {
3025
        return ! $this->get_disable_taxes();
3026
	}
3027
3028
	/**
3029
	 * @deprecated
3030
	 */
3031
	public function has_vat() {
3032
        return $this->is_taxable();
3033
	}
3034
3035
	/**
3036
	 * Checks to see if the invoice requires payment.
3037
	 */
3038
	public function is_free() {
3039
        $is_free = ( (float) wpinv_round_amount( $this->get_initial_total() ) == 0 );
3040
3041
		if ( $this->is_recurring() && $this->get_recurring_total() > 0 ) {
3042
			$is_free = false;
3043
		}
3044
3045
        return apply_filters( 'wpinv_invoice_is_free', $is_free, $this );
3046
    }
3047
3048
    /**
3049
     * Checks if the invoice is paid.
3050
     */
3051
    public function is_paid() {
3052
        $is_paid = $this->has_status( array( 'publish', 'wpi-processing', 'wpi-renewal' ) );
3053
        return apply_filters( 'wpinv_invoice_is_paid', $is_paid, $this );
3054
	}
3055
3056
	/**
3057
     * Checks if the invoice needs payment.
3058
     */
3059
	public function needs_payment() {
3060
		$needs_payment = ! $this->is_paid() && ! $this->is_refunded() && ! $this->is_free();
3061
        return apply_filters( 'wpinv_needs_payment', $needs_payment, $this );
3062
    }
3063
  
3064
	/**
3065
     * Checks if the invoice is refunded.
3066
     */
3067
	public function is_refunded() {
3068
        $is_refunded = $this->has_status( 'wpi-refunded' );
3069
        return apply_filters( 'wpinv_invoice_is_refunded', $is_refunded, $this );
3070
	}
3071
3072
	/**
3073
     * Checks if the invoice is held.
3074
     */
3075
	public function is_held() {
3076
        $is_held = $this->has_status( 'wpi-onhold' );
3077
        return apply_filters( 'wpinv_invoice_is_held', $is_held, $this );
3078
	}
3079
3080
	/**
3081
     * Checks if the invoice is due.
3082
     */
3083
	public function is_due() {
3084
		$due_date = $this->get_due_date();
3085
		return empty( $due_date ) ? false : current_time( 'timestamp' ) > strtotime( $due_date );
3086
	}
3087
3088
	/**
3089
     * Checks if the invoice is draft.
3090
     */
3091
	public function is_draft() {
3092
        return $this->has_status( 'draft, auto-draft' );
3093
	}
3094
3095
    /**
3096
     * Checks if the invoice has a given status.
3097
     */
3098
    public function has_status( $status ) {
3099
        $status = wpinv_parse_list( $status );
3100
        return apply_filters( 'wpinv_has_status', in_array( $this->get_status(), $status ), $status );
3101
	}
3102
3103
	/**
3104
     * Checks if the invoice is of a given type.
3105
     */
3106
    public function is_type( $type ) {
3107
        $type = wpinv_parse_list( $type );
3108
        return in_array( $this->get_type(), $type );
3109
    }
3110
3111
    /**
3112
     * Checks if this is a quote object.
3113
     *
3114
     * @since 1.0.15
3115
     */
3116
    public function is_quote() {
3117
        return 'wpi_quote' == $this->get_post_type();
3118
    }
3119
3120
    /**
3121
     * Check if the invoice (or it's parent has a free trial).
3122
     *
3123
     */
3124
    public function has_free_trial() {
3125
        return $this->is_recurring() && 0 == $this->get_initial_total();
3126
	}
3127
3128
	/**
3129
     * @deprecated
3130
     */
3131
    public function is_free_trial() {
3132
        $this->has_free_trial();
3133
    }
3134
3135
	/**
3136
     * Check if the initial payment if 0.
3137
     *
3138
     */
3139
	public function is_initial_free() {
3140
        $is_initial_free = ! ( (float) wpinv_round_amount( $this->get_initial_total() ) > 0 );
3141
        return apply_filters( 'wpinv_invoice_is_initial_free', $is_initial_free, $this->get_cart_details(), $this );
3142
    }
3143
	
3144
	/**
3145
     * Check if the recurring item has a free trial.
3146
     *
3147
     */
3148
    public function item_has_free_trial() {
3149
3150
        // Ensure we have a recurring item.
3151
        if ( ! $this->is_recurring() ) {
3152
            return false;
3153
        }
3154
3155
        $item = $this->get_recurring( true );
3156
        return $item->has_free_trial();
3157
	}
3158
3159
	/**
3160
     * Check if the free trial is a result of a discount.
3161
     */
3162
    public function is_free_trial_from_discount() {
3163
		return $this->has_free_trial() && ! $this->item_has_free_trial();
3164
	}
3165
	
3166
	/**
3167
     * @deprecated
3168
     */
3169
    public function discount_first_payment_only() {
3170
3171
		$discount = wpinv_get_discount_obj( $this->get_discount_code() );
3172
        if ( ! $discount->exists() || ! $this->is_recurring() ) {
3173
            return true;
3174
        }
3175
3176
        return ! $discount->get_is_recurring();
3177
    }
3178
3179
    /*
3180
	|--------------------------------------------------------------------------
3181
	| Cart related methods
3182
	|--------------------------------------------------------------------------
3183
	|
3184
	| Do not forget to recalculate totals after calling the following methods.
3185
	|
3186
    */
3187
3188
    /**
3189
     * Adds an item to the invoice.
3190
     *
3191
     * @param GetPaid_Form_Item|array $item
3192
     * @return WP_Error|Bool
3193
     */
3194
    public function add_item( $item ) {
3195
3196
		if ( is_array( $item ) ) {
3197
			$item = $this->process_array_item( $item );
3198
		}
3199
3200
		if ( is_numeric( $item ) ) {
0 ignored issues
show
introduced by
The condition is_numeric($item) is always false.
Loading history...
3201
			$item = new GetPaid_Form_Item( $item );
3202
		}
3203
3204
        // Make sure that it is available for purchase.
3205
		if ( $item->get_id() > 0 && ! $item->can_purchase() ) {
3206
			return new WP_Error( 'invalid_item', __( 'This item is not available for purchase', 'invoicing' ) );
3207
        }
3208
3209
        // Do we have a recurring item?
3210
		if ( $item->is_recurring() ) {
3211
			$this->recurring_item = $item->get_id();
3212
        }
3213
3214
        // Invoice id.
3215
        $item->invoice_id = (int) $this->get_id();
3216
3217
		// Remove duplicates.
3218
		$this->remove_item( $item->get_id() );
3219
3220
		// Retrieve all items.
3221
        $items   = $this->get_items();
3222
3223
		// Add new item.
3224
        $items[] = $item;
3225
3226
        $this->set_prop( 'items', $items );
3227
3228
		return true;
3229
	}
3230
3231
	/**
3232
	 * Converts an array to an item.
3233
	 *
3234
	 * @since 1.0.19
3235
	 * @return GetPaid_Form_Item
3236
	 */
3237
	protected function process_array_item( $array ) {
3238
3239
		$item_id = isset( $array['item_id'] ) ? $array['item_id'] : 0;
3240
		$item    = new GetPaid_Form_Item( $item_id );
3241
3242
		// Set item data.
3243
		foreach ( array( 'name', 'price', 'description' ) as $key ) {
3244
			if ( isset( $array[ "item_$key" ] ) ) {
3245
				$method = "set_$key";
3246
				$item->$method( $array[ "item_$key" ] );
3247
			}
3248
		}
3249
3250
		if ( isset( $array['quantity'] ) ) {
3251
			$item->set_quantity( $array['quantity'] );
3252
		}
3253
3254
		// Set item meta.
3255
		if ( isset( $array['meta'] ) && is_array( $array['meta'] ) ) {
3256
			$item->set_item_meta( $array['meta'] );
3257
		}
3258
3259
		return $item;
3260
3261
	}
3262
3263
    /**
3264
	 * Retrieves a specific item.
3265
	 *
3266
	 * @since 1.0.19
3267
	 * @return GetPaid_Form_Item|null
3268
	 */
3269
	public function get_item( $item_id ) {
3270
3271
		foreach ( $this->get_items() as $item ) {
3272
			if ( (int) $item_id == $item->get_id() ) {
3273
				return $item;
3274
			}
3275
		}
3276
3277
		return null;
3278
    }
3279
3280
    /**
3281
	 * Removes a specific item.
3282
	 *
3283
	 * @since 1.0.19
3284
	 */
3285
	public function remove_item( $item_id ) {
3286
		$items   = $this->get_items();
3287
		$item_id = (int) $item_id;
3288
3289
		foreach ( $items as $index => $item ) {
3290
			if ( (int) $item_id == $item->get_id() ) {
3291
				unset( $items[ $index ] );
3292
				$this->set_prop( 'items', $items );
3293
3294
				if ( $item_id == $this->recurring_item ) {
3295
					$this->recurring_item = null;
3296
				}
3297
3298
			}
3299
		}
3300
3301
    }
3302
3303
    /**
3304
	 * Adds a fee to the invoice.
3305
	 *
3306
	 * @param array $fee An array of fee details. name, initial_fee, and recurring_fee are required.
3307
	 * @since 1.0.19
3308
	 */
3309
    public function add_fee( $fee ) {
3310
3311
		$fees                 = $this->get_fees();
3312
		$fees[ $fee['name'] ] = $fee;
3313
		$this->set_prop( 'fees', $fees );
3314
3315
    }
3316
3317
    /**
3318
	 * Retrieves a specific fee.
3319
	 *
3320
	 * @since 1.0.19
3321
	 */
3322
	public function get_fee( $fee ) {
3323
        $fees = $this->get_fees();
3324
		return isset( $fees[ $fee ] ) ? $fees[ $fee ] : null;
3325
    }
3326
3327
    /**
3328
	 * Removes a specific fee.
3329
	 *
3330
	 * @since 1.0.19
3331
	 */
3332
	public function remove_fee( $fee ) {
3333
        $fees = $this->get_fees();
3334
        if ( isset( $fees[ $fee ] ) ) {
3335
            unset( $fees[ $fee ] );
3336
            $this->set_prop( 'fees', $fees );
3337
        }
3338
    }
3339
3340
	/**
3341
	 * Adds a discount to the invoice.
3342
	 *
3343
	 * @param array $discount An array of discount details. name, initial_discount, and recurring_discount are required. Include discount_code if the discount is from a discount code.
3344
	 * @since 1.0.19
3345
	 */
3346
	public function add_discount( $discount ) {
3347
3348
		$discounts = $this->get_discounts();
3349
		$discounts[ $discount['name'] ] = $discount;
3350
		$this->set_prop( 'discounts', $discounts );
3351
3352
	}
3353
3354
    /**
3355
	 * Retrieves a specific discount.
3356
	 *
3357
	 * @since 1.0.19
3358
	 * @return float
3359
	 */
3360
	public function get_discount( $discount = false ) {
3361
3362
		// Backwards compatibilty.
3363
		if ( empty( $discount ) ) {
3364
			return $this->get_total_discount();
3365
		}
3366
3367
        $discounts = $this->get_discounts();
3368
		return isset( $discounts[ $discount ] ) ? $discounts[ $discount ] : null;
3369
    }
3370
3371
    /**
3372
	 * Removes a specific discount.
3373
	 *
3374
	 * @since 1.0.19
3375
	 */
3376
	public function remove_discount( $discount ) {
3377
        $discounts = $this->get_discounts();
3378
        if ( isset( $discounts[ $discount ] ) ) {
3379
            unset( $discounts[ $discount ] );
3380
            $this->set_prop( 'discounts', $discounts );
3381
        }
3382
3383
		if ( 'discount_code' == $discount ) {
3384
			foreach ( $this->get_items() as $item ) {
3385
				$item->item_discount           = 0;
3386
				$item->recurring_item_discount = 0;
3387
			}
3388
		}
3389
3390
    }
3391
3392
    /**
3393
     * Adds a tax to the invoice.
3394
     *
3395
     * @param array $tax An array of tax details. name, initial_tax, and recurring_tax are required.
3396
     */
3397
    public function add_tax( $tax ) {
3398
        if ( $this->is_taxable() ) {
3399
3400
            $taxes                 = $this->get_taxes();
3401
			$taxes[ $tax['name'] ] = $tax;
3402
			$this->set_prop( 'taxes', $tax );
3403
3404
        }
3405
    }
3406
3407
    /**
3408
	 * Retrieves a specific tax.
3409
	 *
3410
	 * @since 1.0.19
3411
	 */
3412
	public function get_tax( $tax = null ) {
3413
3414
		// Backwards compatility.
3415
		if ( empty( $tax ) ) {
3416
			return $this->get_total_tax();
3417
		}
3418
3419
        $taxes = $this->get_taxes();
3420
		return isset( $taxes[ $tax ] ) ? $taxes[ $tax ] : null;
3421
    }
3422
3423
    /**
3424
	 * Removes a specific tax.
3425
	 *
3426
	 * @since 1.0.19
3427
	 */
3428
	public function remove_tax( $tax ) {
3429
        $taxes = $this->get_taxes();
3430
        if ( isset( $taxes[ $tax ] ) ) {
3431
            unset( $taxes[ $tax ] );
3432
            $this->set_prop( 'taxes', $taxes );
3433
        }
3434
    }
3435
3436
    /**
3437
	 * Recalculates the invoice subtotal.
3438
	 *
3439
	 * @since 1.0.19
3440
	 * @return float The recalculated subtotal
3441
	 */
3442
	public function recalculate_subtotal() {
3443
        $items     = $this->get_items();
3444
		$subtotal  = 0;
3445
		$recurring = 0;
3446
3447
        foreach ( $items as $item ) {
3448
			$subtotal  += $item->get_sub_total();
3449
			$recurring += $item->get_recurring_sub_total();
3450
        }
3451
3452
		if ( wpinv_prices_include_tax() ) {
3453
			$subtotal  = max( 0, $subtotal - $this->totals['tax']['initial'] );
3454
			$recurring = max( 0, $recurring - $this->totals['tax']['recurring'] );
3455
		}
3456
3457
		$current = $this->is_renewal() ? $recurring : $subtotal;
3458
		$this->set_subtotal( $current );
3459
3460
		$this->totals['subtotal'] = array(
3461
			'initial'   => $subtotal,
3462
			'recurring' => $recurring,
3463
		);
3464
3465
        return $current;
3466
    }
3467
3468
    /**
3469
	 * Recalculates the invoice discount total.
3470
	 *
3471
	 * @since 1.0.19
3472
	 * @return float The recalculated discount
3473
	 */
3474
	public function recalculate_total_discount() {
3475
        $discounts = $this->get_discounts();
3476
		$discount  = 0;
3477
		$recurring = 0;
3478
3479
        foreach ( $discounts as $data ) {
3480
			$discount  += wpinv_sanitize_amount( $data['initial_discount'] );
3481
			$recurring += wpinv_sanitize_amount( $data['recurring_discount'] );
3482
		}
3483
3484
		$current = $this->is_renewal() ? $recurring : $discount;
3485
3486
		$this->set_total_discount( $current );
3487
3488
		$this->totals['discount'] = array(
3489
			'initial'   => $discount,
3490
			'recurring' => $recurring,
3491
		);
3492
3493
		return $current;
3494
3495
    }
3496
3497
    /**
3498
	 * Recalculates the invoice tax total.
3499
	 *
3500
	 * @since 1.0.19
3501
	 * @return float The recalculated tax
3502
	 */
3503
	public function recalculate_total_tax() {
3504
3505
		// Maybe disable taxes.
3506
		$vat_number = $this->get_vat_number();
3507
		$skip_tax   = GetPaid_Payment_Form_Submission_Taxes::is_eu_transaction( $this->get_country() ) && ! empty( $vat_number );
3508
3509
		if ( wpinv_is_base_country( $this->get_country() ) && 'vat_too' == wpinv_get_option( 'vat_same_country_rule', 'vat_too' ) ) {
3510
			$skip_tax = false;
3511
		}
3512
3513
		if ( ! wpinv_use_taxes() || $this->get_disable_taxes() || ! wpinv_is_country_taxable( $this->get_country() ) || $skip_tax   ) {
3514
3515
			$this->totals['tax'] = array(
3516
				'initial'   => 0,
3517
				'recurring' => 0,
3518
			);
3519
3520
			$this->tax_rate = 0;
3521
3522
			$this->set_taxes( array() );
3523
			$current = 0;
3524
		} else {
3525
3526
			$item_taxes = array();
3527
3528
			foreach ( $this->get_items() as $item ) {
3529
				$rates    = getpaid_get_item_tax_rates( $item, $this->get_country(), $this->get_state() );
3530
				$rates    = getpaid_filter_item_tax_rates( $item, $rates );
3531
				$taxes    = getpaid_calculate_item_taxes( getpaid_get_taxable_amount( $item, false ), $rates );
0 ignored issues
show
Bug introduced by
getpaid_get_taxable_amount($item, false) of type string is incompatible with the type double expected by parameter $amount of getpaid_calculate_item_taxes(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

3531
				$taxes    = getpaid_calculate_item_taxes( /** @scrutinizer ignore-type */ getpaid_get_taxable_amount( $item, false ), $rates );
Loading history...
Bug introduced by
false of type false is incompatible with the type string expected by parameter $recurring of getpaid_get_taxable_amount(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

3531
				$taxes    = getpaid_calculate_item_taxes( getpaid_get_taxable_amount( $item, /** @scrutinizer ignore-type */ false ), $rates );
Loading history...
3532
				$r_taxes  = getpaid_calculate_item_taxes( getpaid_get_taxable_amount( $item, true ), $rates );
0 ignored issues
show
Bug introduced by
true of type true is incompatible with the type string expected by parameter $recurring of getpaid_get_taxable_amount(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

3532
				$r_taxes  = getpaid_calculate_item_taxes( getpaid_get_taxable_amount( $item, /** @scrutinizer ignore-type */ true ), $rates );
Loading history...
3533
				foreach ( $taxes as $name => $amount ) {
3534
					$recurring = isset( $r_taxes[ $name ] ) ? $r_taxes[ $name ] : 0;
3535
					$tax       = getpaid_prepare_item_tax( $item, $name, $amount, $recurring );
3536
3537
					if ( ! isset( $item_taxes[ $name ] ) ) {
3538
						$item_taxes[ $name ] = $tax;
3539
						continue;
3540
					}
3541
3542
					$item_taxes[ $name ]['initial_tax']   += $tax['initial_tax'];
3543
					$item_taxes[ $name ]['recurring_tax'] += $tax['recurring_tax'];
3544
3545
				}
3546
3547
			}
3548
3549
			$item_taxes = array_replace( $this->get_taxes(), $item_taxes );
3550
			$this->set_taxes( $item_taxes );
3551
3552
			$initial_tax   = array_sum( wp_list_pluck( $item_taxes, 'initial_tax' ) );
3553
			$recurring_tax = array_sum( wp_list_pluck( $item_taxes, 'recurring_tax' ) );
3554
3555
			$current = $this->is_renewal() ? $recurring_tax : $initial_tax;
3556
3557
			$this->totals['tax'] = array(
3558
				'initial'   => $initial_tax,
3559
				'recurring' => $recurring_tax,
3560
			);
3561
3562
		}
3563
3564
		$this->set_total_tax( $current );
3565
3566
		return $current;
3567
3568
    }
3569
3570
    /**
3571
	 * Recalculates the invoice fees total.
3572
	 *
3573
	 * @since 1.0.19
3574
	 * @return float The recalculated fee
3575
	 */
3576
	public function recalculate_total_fees() {
3577
		$fees      = $this->get_fees();
3578
		$fee       = 0;
3579
		$recurring = 0;
3580
3581
        foreach ( $fees as $data ) {
3582
			$fee       += wpinv_sanitize_amount( $data['initial_fee'] );
3583
			$recurring += wpinv_sanitize_amount( $data['recurring_fee'] );
3584
		}
3585
3586
		$current = $this->is_renewal() ? $recurring : $fee;
3587
		$this->set_total_fees( $current );
3588
3589
		$this->totals['fee'] = array(
3590
			'initial'   => $fee,
3591
			'recurring' => $recurring,
3592
		);
3593
3594
        $this->set_total_fees( $fee );
3595
        return $current;
3596
    }
3597
3598
    /**
3599
	 * Recalculates the invoice total.
3600
	 *
3601
	 * @since 1.0.19
3602
     * @return float The invoice total
3603
	 */
3604
	public function recalculate_total() {
3605
        $this->recalculate_total_fees();
3606
        $this->recalculate_total_discount();
3607
		$this->recalculate_total_tax();
3608
		$this->recalculate_subtotal();
3609
		$this->set_total( $this->get_total_tax() + $this->get_total_fees() + $this->get_subtotal() - $this->get_total_discount() );
3610
		return $this->get_total();
3611
	}
3612
3613
	/**
3614
	 * @deprecated
3615
	 */
3616
    public function recalculate_totals() {
3617
        $this->recalculate_total();
3618
        $this->save( true );
0 ignored issues
show
Unused Code introduced by
The call to WPInv_Invoice::save() has too many arguments starting with true. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

3618
        $this->/** @scrutinizer ignore-call */ 
3619
               save( true );

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress. Please note the @ignore annotation hint above.

Loading history...
3619
        return $this;
3620
    }
3621
3622
    /**
3623
     * Convert this to an array.
3624
     */
3625
    public function array_convert() {
3626
        return $this->get_data();
3627
    }
3628
3629
    /**
3630
     * Adds a note to an invoice.
3631
     *
3632
     * @param string $note The note being added.
3633
	 * @return int|false The new note's ID on success, false on failure.
3634
     *
3635
     */
3636
    public function add_note( $note = '', $customer_type = false, $added_by_user = false, $system = false ) {
3637
3638
        // Bail if no note specified or this invoice is not yet saved.
3639
        if ( ! $note || $this->get_id() == 0 || ( ! is_user_logged_in() && ! $system ) ) {
3640
            return false;
3641
        }
3642
3643
		$author       = 'System';
3644
		$author_email = '[email protected]';
3645
3646
		// If this is an admin comment or it has been added by the user.
3647
		if ( is_user_logged_in() && ( ! $system || $added_by_user ) ) {
3648
			$user         = get_user_by( 'id', get_current_user_id() );
3649
            $author       = $user->display_name;
3650
            $author_email = $user->user_email;
3651
		}
3652
3653
		return getpaid_notes()->add_invoice_note( $this, $note, $author, $author_email, $customer_type );
3654
3655
	}
3656
3657
	/**
3658
     * Generates a unique key for the invoice.
3659
     */
3660
    public function generate_key( $string = '' ) {
3661
        $auth_key  = defined( 'AUTH_KEY' ) ? AUTH_KEY : '';
3662
        return strtolower(
3663
            $string . md5( $this->get_id() . date( 'Y-m-d H:i:s' ) . $auth_key . uniqid( 'wpinv', true ) )
3664
        );
3665
    }
3666
3667
    /**
3668
     * Generates a new number for the invoice.
3669
     */
3670
    public function generate_number() {
3671
        $number = $this->get_id();
3672
3673
        if ( wpinv_sequential_number_active( $this->get_post_type() ) ) {
3674
            $number = wpinv_get_next_invoice_number( $this->get_post_type() );
3675
        }
3676
3677
		return wpinv_format_invoice_number( $number, $this->get_post_type() );
3678
3679
	}
3680
3681
	/**
3682
	 * Handle the status transition.
3683
	 */
3684
	protected function status_transition() {
3685
		$status_transition = $this->status_transition;
3686
3687
		// Reset status transition variable.
3688
		$this->status_transition = false;
3689
3690
		if ( $status_transition ) {
3691
			try {
3692
3693
				// Fire a hook for the status change.
3694
				do_action( 'getpaid_invoice_status_' . $status_transition['to'], $this, $status_transition );
3695
3696
				// @deprecated this is deprecated and will be removed in the future.
3697
				do_action( 'wpinv_status_' . $status_transition['to'], $this->get_id(), $status_transition['from'] );
3698
3699
				if ( ! empty( $status_transition['from'] ) ) {
3700
3701
					/* translators: 1: old invoice status 2: new invoice status */
3702
					$transition_note = sprintf( __( 'Status changed from %1$s to %2$s.', 'invoicing' ), wpinv_status_nicename( $status_transition['from'], $this ), wpinv_status_nicename( $status_transition['to'], $this  ) );
3703
3704
					// Fire another hook.
3705
					do_action( 'getpaid_invoice_status_' . $status_transition['from'] . '_to_' . $status_transition['to'], $this );
3706
					do_action( 'getpaid_invoice_status_changed', $this, $status_transition['from'], $status_transition['to'] );
3707
3708
					// @deprecated this is deprecated and will be removed in the future.
3709
					do_action( 'wpinv_status_' . $status_transition['from'] . '_to_' . $status_transition['to'], $this->get_id(), $status_transition['from'] );
3710
3711
					// Note the transition occurred.
3712
					$this->add_note( trim( $status_transition['note'] . ' ' . $transition_note ), false, $status_transition['manual'] );
3713
3714
					// Work out if this was for a payment, and trigger a payment_status hook instead.
3715
					if (
3716
						in_array( $status_transition['from'], array( 'wpi-cancelled', 'wpi-pending', 'wpi-failed', 'wpi-refunded', 'wpi-onhold' ), true )
3717
						&& in_array( $status_transition['to'], array( 'publish', 'wpi-processing', 'wpi-renewal' ), true )
3718
					) {
3719
						do_action( 'getpaid_invoice_payment_status_changed', $this, $status_transition );
3720
					}
3721
3722
					// Work out if this was for a payment reversal, and trigger a payment_status_reversed hook instead.
3723
					if (
3724
						in_array( $status_transition['from'], array( 'publish', 'wpi-processing', 'wpi-renewal' ), true )
3725
						&& in_array( $status_transition['to'], array( 'wpi-cancelled', 'wpi-pending', 'wpi-failed', 'wpi-refunded', 'wpi-onhold' ), true )
3726
					) {
3727
						do_action( 'getpaid_invoice_payment_status_reversed', $this, $status_transition );
3728
					}
3729
				} else {
3730
					/* translators: %s: new invoice status */
3731
					$transition_note = sprintf( __( 'Status set to %s.', 'invoicing' ), wpinv_status_nicename( $status_transition['to'], $this  ) );
3732
3733
					// Note the transition occurred.
3734
					$this->add_note( trim( $status_transition['note'] . ' ' . $transition_note ), 0, $status_transition['manual'] );
3735
3736
				}
3737
			} catch ( Exception $e ) {
3738
				$this->add_note( __( 'Error during status transition.', 'invoicing' ) . ' ' . $e->getMessage() );
3739
			}
3740
		}
3741
	}
3742
3743
	/**
3744
	 * Updates an invoice status.
3745
	 */
3746
	public function update_status( $new_status = false, $note = '', $manual = false ) {
3747
3748
		// Fires before updating a status.
3749
		do_action( 'wpinv_before_invoice_status_change', $this->get_id(), $new_status, $this->get_status( 'edit' ) );
3750
3751
		// Update the status.
3752
		$this->set_status( $new_status, $note, $manual );
3753
3754
		// Save the order.
3755
		return $this->save();
3756
3757
	}
3758
3759
	/**
3760
	 * @deprecated
3761
	 */
3762
	public function refresh_item_ids() {
3763
        $item_ids = implode( ',', array_unique( wp_list_pluck( $this->get_cart_details(), 'item_id' ) ) );
3764
        update_post_meta( $this->get_id(), '_wpinv_item_ids', $item_ids );
3765
	}
3766
3767
	/**
3768
	 * @deprecated
3769
	 */
3770
	public function update_items( $temp = false ) {
3771
3772
		$this->set_items( $this->get_items() );
3773
3774
		if ( ! $temp ) {
3775
			$this->save();
3776
		}
3777
3778
        return $this;
3779
	}
3780
3781
	/**
3782
	 * @deprecated
3783
	 */
3784
    public function validate_discount() {
3785
3786
        $discount_code = $this->get_discount_code();
3787
3788
        if ( empty( $discount_code ) ) {
3789
            return false;
3790
        }
3791
3792
        $discount = wpinv_get_discount_obj( $discount_code );
3793
3794
        // Ensure it is active.
3795
        return $discount->exists();
3796
3797
    }
3798
3799
	/**
3800
	 * Refunds an invoice.
3801
	 */
3802
    public function refund() {
3803
		$this->set_status( 'wpi-refunded' );
3804
        $this->save();
3805
	}
3806
3807
	/**
3808
	 * Marks an invoice as paid.
3809
	 * 
3810
	 * @param string $transaction_id
3811
	 */
3812
    public function mark_paid( $transaction_id = null, $note = '' ) {
3813
3814
		// Set the transaction id.
3815
		if ( empty( $transaction_id ) ) {
3816
			$transaction_id = $this->generate_key('trans_');
3817
		}
3818
3819
		if ( ! $this->get_transaction_id() ) {
3820
			$this->set_transaction_id( $transaction_id );
3821
		}
3822
3823
		if ( $this->is_paid() && 'wpi-processing' != $this->get_status() ) {
3824
			return $this->save();
3825
		}
3826
3827
		// Set the completed date.
3828
		$this->set_date_completed( current_time( 'mysql' ) );
3829
3830
		// Set the new status.
3831
		$gateway = sanitize_text_field( $this->get_gateway_title() );
3832
		if ( $this->is_renewal() ) {
3833
3834
			$_note = wp_sprintf( __( 'Renewed via %s', 'invoicing' ), $gateway );
3835
			$_note = $_note . empty( $note ) ? '' : " ($note)";
3836
3837
			if ( 'none' == $this->get_gateway() ) {
3838
				$_note = $note;
3839
			}
3840
3841
			$this->set_status( 'wpi-renewal', $_note );
3842
3843
		} else {
3844
3845
			$_note = wp_sprintf( __( 'Paid via %s', 'invoicing' ), $gateway );
3846
			$_note = $_note . empty( $note ) ? '' : " ($note)";
3847
3848
			if ( 'none' == $this->get_gateway() ) {
3849
				$_note = $note;
3850
			}
3851
3852
			$this->set_status( 'publish', $_note );
3853
3854
		}
3855
3856
		// Set checkout mode.
3857
		$mode = wpinv_is_test_mode( $this->get_gateway() ) ? 'test' : 'live';
3858
		$this->set_mode( $mode );
3859
3860
		// Save the invoice.
3861
        $this->save();
3862
	}
3863
3864
	/**
3865
	 * Save data to the database.
3866
	 *
3867
	 * @since 1.0.19
3868
	 * @return int invoice ID
3869
	 */
3870
	public function save() {
3871
		$this->maybe_set_date_paid();
3872
		$this->maybe_set_key();
3873
		parent::save();
3874
		$this->clear_cache();
3875
		$this->status_transition();
3876
		return $this->get_id();
3877
	}
3878
3879
	/**
3880
     * Clears the subscription's cache.
3881
     */
3882
    public function clear_cache() {
3883
		wp_cache_delete( $this->get_key(), 'getpaid_invoice_keys_to_invoice_ids' );
3884
		wp_cache_delete( $this->get_number(), 'getpaid_invoice_numbers_to_invoice_ids' );
3885
		wp_cache_delete( $this->get_transaction_id(), 'getpaid_invoice_transaction_ids_to_invoice_ids' );
3886
	}
3887
3888
}
3889