Passed
Push — master ( 7abbad...7a9f16 )
by Brian
11:26
created

WPInv_Invoice::get_shipping()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 7
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 3
c 0
b 0
f 0
nc 2
nop 1
dl 0
loc 7
rs 10
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
		'company_id'           => null,
64
        'vat_number'           => null,
65
        'vat_rate'             => null,
66
        'address'              => null,
67
        'address_confirmed'    => false,
68
        'shipping'             => null,
69
		'subtotal'             => 0,
70
        'total_discount'       => 0,
71
        'total_tax'            => 0,
72
		'total_fees'           => 0,
73
		'total'                => 0,
74
        'fees'                 => array(),
75
        'discounts'            => array(),
76
        'taxes'                => array(),
77
        'items'                => array(),
78
        'payment_form'         => 1,
79
        'submission_id'        => null,
80
        'discount_code'        => null,
81
        'gateway'              => 'none',
82
        'transaction_id'       => '',
83
        'currency'             => '',
84
        'disable_taxes'        => false,
85
		'subscription_id'      => null,
86
		'remote_subscription_id' => null,
87
		'is_viewed'            => false,
88
		'email_cc'             => '',
89
		'template'             => 'quantity', // hours, amount only
90
		'created_via'          => null,
91
    );
92
93
    /**
94
	 * Stores meta in cache for future reads.
95
	 *
96
	 * A group must be set to to enable caching.
97
	 *
98
	 * @var string
99
	 */
100
	protected $cache_group = 'getpaid_invoices';
101
102
    /**
103
     * Stores a reference to the original WP_Post object
104
     *
105
     * @var WP_Post
106
     */
107
    protected $post = null;
108
109
    /**
110
     * Stores a reference to the recurring item id instead of looping through the items.
111
     *
112
     * @var int
113
     */
114
	protected $recurring_item = null;
115
116
	/**
117
     * Stores an array of item totals.
118
	 *
119
	 * e.g $totals['discount'] = array(
120
	 * 		'initial'   => 10,
121
	 * 		'recurring' => 10,
122
	 * )
123
     *
124
     * @var array
125
     */
126
	protected $totals = array();
127
128
	/**
129
     * Tax rate.
130
	 *
131
     * @var float
132
     */
133
	protected $tax_rate = 0;
134
135
	/**
136
	 * Stores the status transition information.
137
	 *
138
	 * @since 1.0.19
139
	 * @var bool|array
140
	 */
141
	protected $status_transition = false;
142
143
    /**
144
	 * Get the invoice if ID is passed, otherwise the invoice is new and empty.
145
	 *
146
	 * @param  int|string|object|WPInv_Invoice|WPInv_Legacy_Invoice|WP_Post $invoice Invoice id, key, transaction id, number or object to read.
147
	 */
148
    public function __construct( $invoice = 0 ) {
149
150
        parent::__construct( $invoice );
151
152
		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

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

3626
				$taxes    = getpaid_calculate_item_taxes( getpaid_get_taxable_amount( $item, /** @scrutinizer ignore-type */ false ), $rates );
Loading history...
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

3626
				$taxes    = getpaid_calculate_item_taxes( /** @scrutinizer ignore-type */ getpaid_get_taxable_amount( $item, false ), $rates );
Loading history...
3627
				$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

3627
				$r_taxes  = getpaid_calculate_item_taxes( getpaid_get_taxable_amount( $item, /** @scrutinizer ignore-type */ true ), $rates );
Loading history...
3628
				foreach ( $taxes as $name => $amount ) {
3629
					$recurring = isset( $r_taxes[ $name ] ) ? $r_taxes[ $name ] : 0;
3630
					$tax       = getpaid_prepare_item_tax( $item, $name, $amount, $recurring );
3631
3632
					if ( ! isset( $item_taxes[ $name ] ) ) {
3633
						$item_taxes[ $name ] = $tax;
3634
						continue;
3635
					}
3636
3637
					$item_taxes[ $name ]['initial_tax']   += $tax['initial_tax'];
3638
					$item_taxes[ $name ]['recurring_tax'] += $tax['recurring_tax'];
3639
3640
				}
3641
3642
			}
3643
3644
			$item_taxes = array_replace( $this->get_taxes(), $item_taxes );
3645
			$this->set_taxes( $item_taxes );
3646
3647
			$initial_tax   = array_sum( wp_list_pluck( $item_taxes, 'initial_tax' ) );
3648
			$recurring_tax = array_sum( wp_list_pluck( $item_taxes, 'recurring_tax' ) );
3649
3650
			$current = $this->is_renewal() ? $recurring_tax : $initial_tax;
3651
3652
			$this->totals['tax'] = array(
3653
				'initial'   => $initial_tax,
3654
				'recurring' => $recurring_tax,
3655
			);
3656
3657
		}
3658
3659
		$this->set_total_tax( $current );
3660
3661
		return $current;
3662
3663
    }
3664
3665
    /**
3666
	 * Recalculates the invoice fees total.
3667
	 *
3668
	 * @since 1.0.19
3669
	 * @return float The recalculated fee
3670
	 */
3671
	public function recalculate_total_fees() {
3672
		$fees      = $this->get_fees();
3673
		$fee       = 0;
3674
		$recurring = 0;
3675
3676
        foreach ( $fees as $data ) {
3677
			$fee       += wpinv_sanitize_amount( $data['initial_fee'] );
3678
			$recurring += wpinv_sanitize_amount( $data['recurring_fee'] );
3679
		}
3680
3681
		$current = $this->is_renewal() ? $recurring : $fee;
3682
		$this->set_total_fees( $current );
3683
3684
		$this->totals['fee'] = array(
3685
			'initial'   => $fee,
3686
			'recurring' => $recurring,
3687
		);
3688
3689
        $this->set_total_fees( $fee );
3690
        return $current;
3691
    }
3692
3693
    /**
3694
	 * Recalculates the invoice total.
3695
	 *
3696
	 * @since 1.0.19
3697
     * @return float The invoice total
3698
	 */
3699
	public function recalculate_total() {
3700
        $this->recalculate_total_fees();
3701
        $this->recalculate_total_discount();
3702
		$this->recalculate_total_tax();
3703
		$this->recalculate_subtotal();
3704
		$this->set_total( $this->get_total_tax( 'edit' ) + $this->get_total_fees( 'edit' ) + $this->get_subtotal( 'edit' ) - $this->get_total_discount( 'edit' ) );
3705
		return $this->get_total();
3706
	}
3707
3708
	/**
3709
	 * @deprecated
3710
	 */
3711
    public function recalculate_totals() {
3712
        $this->recalculate_total();
3713
        $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

3713
        $this->/** @scrutinizer ignore-call */ 
3714
               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...
3714
        return $this;
3715
    }
3716
3717
    /**
3718
     * Convert this to an array.
3719
     */
3720
    public function array_convert() {
3721
        return $this->get_data();
3722
    }
3723
3724
	/**
3725
     * Adds a system note to an invoice.
3726
     *
3727
     * @param string $note The note being added.
3728
	 * @return int|false The new note's ID on success, false on failure.
3729
     *
3730
     */
3731
    public function add_system_note( $note ) {
3732
		return $this->add_note( $note, false, false, true );
3733
	}
3734
3735
    /**
3736
     * Adds a note to an invoice.
3737
     *
3738
     * @param string $note The note being added.
3739
	 * @return int|false The new note's ID on success, false on failure.
3740
     *
3741
     */
3742
    public function add_note( $note = '', $customer_type = false, $added_by_user = false, $system = false ) {
3743
3744
        // Bail if no note specified or this invoice is not yet saved.
3745
        if ( ! $note || $this->get_id() == 0 || ( ! is_user_logged_in() && ! $system ) ) {
3746
            return false;
3747
        }
3748
3749
		$author       = 'System';
3750
		$author_email = '[email protected]';
3751
3752
		// If this is an admin comment or it has been added by the user.
3753
		if ( is_user_logged_in() && ( ! $system || $added_by_user ) ) {
3754
			$user         = get_user_by( 'id', get_current_user_id() );
3755
            $author       = $user->display_name;
3756
            $author_email = $user->user_email;
3757
		}
3758
3759
		return getpaid_notes()->add_invoice_note( $this, $note, $author, $author_email, $customer_type );
3760
3761
	}
3762
3763
	/**
3764
     * Generates a unique key for the invoice.
3765
     */
3766
    public function generate_key( $string = '' ) {
3767
        $auth_key  = defined( 'AUTH_KEY' ) ? AUTH_KEY : '';
3768
        return strtolower(
3769
            $string . md5( $this->get_id() . date( 'Y-m-d H:i:s' ) . $auth_key . uniqid( 'wpinv', true ) )
3770
        );
3771
    }
3772
3773
    /**
3774
     * Generates a new number for the invoice.
3775
     */
3776
    public function generate_number() {
3777
        $number = $this->get_id();
3778
3779
        if ( wpinv_sequential_number_active( $this->get_post_type() ) ) {
3780
            $number = wpinv_get_next_invoice_number( $this->get_post_type() );
3781
        }
3782
3783
		return wpinv_format_invoice_number( $number, $this->get_post_type() );
3784
3785
	}
3786
3787
	/**
3788
	 * Handle the status transition.
3789
	 */
3790
	protected function status_transition() {
3791
		$status_transition = $this->status_transition;
3792
3793
		// Reset status transition variable.
3794
		$this->status_transition = false;
3795
3796
		if ( $status_transition ) {
3797
			try {
3798
3799
				// Fire a hook for the status change.
3800
				do_action( 'getpaid_invoice_status_' . $status_transition['to'], $this, $status_transition );
3801
3802
				// @deprecated this is deprecated and will be removed in the future.
3803
				do_action( 'wpinv_status_' . $status_transition['to'], $this->get_id(), $status_transition['from'] );
3804
3805
				if ( ! empty( $status_transition['from'] ) ) {
3806
3807
					/* translators: 1: old invoice status 2: new invoice status */
3808
					$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  ) );
3809
3810
					// Fire another hook.
3811
					do_action( 'getpaid_invoice_status_' . $status_transition['from'] . '_to_' . $status_transition['to'], $this );
3812
					do_action( 'getpaid_invoice_status_changed', $this, $status_transition['from'], $status_transition['to'] );
3813
3814
					// @deprecated this is deprecated and will be removed in the future.
3815
					do_action( 'wpinv_status_' . $status_transition['from'] . '_to_' . $status_transition['to'], $this->get_id(), $status_transition['from'] );
3816
3817
					// Note the transition occurred.
3818
					$this->add_note( trim( $status_transition['note'] . ' ' . $transition_note ), false, $status_transition['manual'] );
3819
3820
					// Work out if this was for a payment, and trigger a payment_status hook instead.
3821
					if (
3822
						in_array( $status_transition['from'], array( 'wpi-cancelled', 'wpi-pending', 'wpi-failed', 'wpi-refunded', 'wpi-onhold' ), true )
3823
						&& in_array( $status_transition['to'], array( 'publish', 'wpi-processing', 'wpi-renewal' ), true )
3824
					) {
3825
						do_action( 'getpaid_invoice_payment_status_changed', $this, $status_transition );
3826
					}
3827
3828
					// Work out if this was for a payment reversal, and trigger a payment_status_reversed hook instead.
3829
					if (
3830
						in_array( $status_transition['from'], array( 'publish', 'wpi-processing', 'wpi-renewal' ), true )
3831
						&& in_array( $status_transition['to'], array( 'wpi-cancelled', 'wpi-pending', 'wpi-failed', 'wpi-refunded', 'wpi-onhold' ), true )
3832
					) {
3833
						do_action( 'getpaid_invoice_payment_status_reversed', $this, $status_transition );
3834
					}
3835
				} else {
3836
					/* translators: %s: new invoice status */
3837
					$transition_note = sprintf( __( 'Status set to %s.', 'invoicing' ), wpinv_status_nicename( $status_transition['to'], $this  ) );
3838
3839
					// Note the transition occurred.
3840
					$this->add_note( trim( $status_transition['note'] . ' ' . $transition_note ), 0, $status_transition['manual'] );
3841
3842
				}
3843
			} catch ( Exception $e ) {
3844
				$this->add_note( __( 'Error during status transition.', 'invoicing' ) . ' ' . $e->getMessage() );
3845
			}
3846
		}
3847
	}
3848
3849
	/**
3850
	 * Updates an invoice status.
3851
	 */
3852
	public function update_status( $new_status = false, $note = '', $manual = false ) {
3853
3854
		// Fires before updating a status.
3855
		do_action( 'wpinv_before_invoice_status_change', $this->get_id(), $new_status, $this->get_status( 'edit' ) );
3856
3857
		// Update the status.
3858
		$this->set_status( $new_status, $note, $manual );
3859
3860
		// Save the order.
3861
		return $this->save();
3862
3863
	}
3864
3865
	/**
3866
	 * @deprecated
3867
	 */
3868
	public function refresh_item_ids() {
3869
        $item_ids = implode( ',', array_unique( wp_list_pluck( $this->get_cart_details(), 'item_id' ) ) );
3870
        update_post_meta( $this->get_id(), '_wpinv_item_ids', $item_ids );
3871
	}
3872
3873
	/**
3874
	 * @deprecated
3875
	 */
3876
	public function update_items( $temp = false ) {
3877
3878
		$this->set_items( $this->get_items() );
3879
3880
		if ( ! $temp ) {
3881
			$this->save();
3882
		}
3883
3884
        return $this;
3885
	}
3886
3887
	/**
3888
	 * @deprecated
3889
	 */
3890
    public function validate_discount() {
3891
3892
        $discount_code = $this->get_discount_code();
3893
3894
        if ( empty( $discount_code ) ) {
3895
            return false;
3896
        }
3897
3898
        $discount = wpinv_get_discount_obj( $discount_code );
3899
3900
        // Ensure it is active.
3901
        return $discount->exists();
3902
3903
    }
3904
3905
	/**
3906
	 * Refunds an invoice.
3907
	 */
3908
    public function refund() {
3909
		$this->set_status( 'wpi-refunded' );
3910
        $this->save();
3911
	}
3912
3913
	/**
3914
	 * Marks an invoice as paid.
3915
	 * 
3916
	 * @param string $transaction_id
3917
	 */
3918
    public function mark_paid( $transaction_id = null, $note = '' ) {
3919
3920
		// Set the transaction id.
3921
		if ( empty( $transaction_id ) ) {
3922
			$transaction_id = $this->generate_key('trans_');
3923
		}
3924
3925
		if ( ! $this->get_transaction_id() ) {
3926
			$this->set_transaction_id( $transaction_id );
3927
		}
3928
3929
		if ( $this->is_paid() && 'wpi-processing' != $this->get_status() ) {
3930
			return $this->save();
3931
		}
3932
3933
		// Set the completed date.
3934
		$this->set_date_completed( current_time( 'mysql' ) );
3935
3936
		// Set the new status.
3937
		$gateway = sanitize_text_field( $this->get_gateway_title() );
3938
		if ( $this->is_renewal() || ! $this->is_parent() ) {
3939
3940
			$_note = wp_sprintf( __( 'Renewed via %s', 'invoicing' ), $gateway );
3941
			$_note = $_note . empty( $note ) ? '' : " ($note)";
3942
3943
			if ( 'none' == $this->get_gateway() ) {
3944
				$_note = $note;
3945
			}
3946
3947
			$this->set_status( 'wpi-renewal', $_note );
3948
3949
		} else {
3950
3951
			$_note = wp_sprintf( __( 'Paid via %s', 'invoicing' ), $gateway );
3952
			$_note = $_note . empty( $note ) ? '' : " ($note)";
3953
3954
			if ( 'none' == $this->get_gateway() ) {
3955
				$_note = $note;
3956
			}
3957
3958
			$this->set_status( 'publish', $_note );
3959
3960
		}
3961
3962
		// Set checkout mode.
3963
		$mode = wpinv_is_test_mode( $this->get_gateway() ) ? 'test' : 'live';
3964
		$this->set_mode( $mode );
3965
3966
		// Save the invoice.
3967
        $this->save();
3968
	}
3969
3970
	/**
3971
	 * Save data to the database.
3972
	 *
3973
	 * @since 1.0.19
3974
	 * @return int invoice ID
3975
	 */
3976
	public function save() {
3977
		$this->maybe_set_date_paid();
3978
		$this->maybe_set_key();
3979
		parent::save();
3980
		$this->clear_cache();
3981
		$this->status_transition();
3982
		return $this->get_id();
3983
	}
3984
3985
	/**
3986
     * Clears the subscription's cache.
3987
     */
3988
    public function clear_cache() {
3989
		wp_cache_delete( $this->get_key(), 'getpaid_invoice_keys_to_invoice_ids' );
3990
		wp_cache_delete( $this->get_number(), 'getpaid_invoice_numbers_to_invoice_ids' );
3991
		wp_cache_delete( $this->get_transaction_id(), 'getpaid_invoice_transaction_ids_to_invoice_ids' );
3992
	}
3993
3994
}
3995