Passed
Push — master ( c751c0...3ed371 )
by Brian
05:35
created

WPInv_Invoice::recalculate_total_tax()   C

Complexity

Conditions 12
Paths 3

Size

Total Lines 56
Code Lines 32

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 1 Features 0
Metric Value
cc 12
eloc 32
c 2
b 1
f 0
nc 3
nop 0
dl 0
loc 56
rs 6.9666

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

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

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

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

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

3481
				$taxes    = getpaid_calculate_item_taxes( getpaid_get_taxable_amount( $item->get_id(), $item->get_sub_total(), $this->get_discount_code(), /** @scrutinizer ignore-type */ false ), $rates );
Loading history...
3482
				$r_taxes  = getpaid_calculate_item_taxes( getpaid_get_taxable_amount( $item->get_id(), $item->get_recurring_sub_total(), $this->get_discount_code(), 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

3482
				$r_taxes  = getpaid_calculate_item_taxes( getpaid_get_taxable_amount( $item->get_id(), $item->get_recurring_sub_total(), $this->get_discount_code(), /** @scrutinizer ignore-type */ true ), $rates );
Loading history...
3483
				foreach ( $taxes as $name => $amount ) {
3484
					$recurring = isset( $r_taxes[ $name ] ) ? $r_taxes[ $name ] : 0;
3485
					$tax       = getpaid_prepare_item_tax( $item, $name, $amount, $recurring );
3486
3487
					if ( ! isset( $item_taxes[ $name ] ) ) {
3488
						$item_taxes[ $name ] = $tax;
3489
						continue;
3490
					}
3491
3492
					$item_taxes[ $name ]['initial_tax']   += $tax['initial_tax'];
3493
					$item_taxes[ $name ]['recurring_tax'] += $tax['recurring_tax'];
3494
3495
				}
3496
3497
			}
3498
3499
			$item_taxes = array_replace( $this->get_taxes(), $item_taxes );
3500
			$this->set_taxes( $item_taxes );
3501
3502
			$initial_tax   = array_sum( wp_list_pluck( $item_taxes, 'initial_tax' ) );
3503
			$recurring_tax = array_sum( wp_list_pluck( $item_taxes, 'recurring_tax' ) );
3504
3505
			$current = $this->is_renewal() ? $recurring_tax : $initial_tax;
3506
3507
			$this->totals['tax'] = array(
3508
				'initial'   => $initial_tax,
3509
				'recurring' => $recurring_tax,
3510
			);
3511
3512
		}
3513
3514
		$this->set_total_tax( $current );
3515
3516
		return $current;
3517
3518
    }
3519
3520
    /**
3521
	 * Recalculates the invoice fees total.
3522
	 *
3523
	 * @since 1.0.19
3524
	 * @return float The recalculated fee
3525
	 */
3526
	public function recalculate_total_fees() {
3527
		$fees      = $this->get_fees();
3528
		$fee       = 0;
3529
		$recurring = 0;
3530
3531
        foreach ( $fees as $data ) {
3532
			$fee       += wpinv_sanitize_amount( $data['initial_fee'] );
3533
			$recurring += wpinv_sanitize_amount( $data['recurring_fee'] );
3534
		}
3535
3536
		$current = $this->is_renewal() ? $recurring : $fee;
3537
		$this->set_total_fees( $current );
3538
3539
		$this->totals['fee'] = array(
3540
			'initial'   => $fee,
3541
			'recurring' => $recurring,
3542
		);
3543
3544
        $this->set_total_fees( $fee );
3545
        return $current;
3546
    }
3547
3548
    /**
3549
	 * Recalculates the invoice total.
3550
	 *
3551
	 * @since 1.0.19
3552
     * @return float The invoice total
3553
	 */
3554
	public function recalculate_total() {
3555
        $this->recalculate_subtotal();
3556
        $this->recalculate_total_fees();
3557
        $this->recalculate_total_discount();
3558
		$this->recalculate_total_tax();
3559
		$this->set_total( $this->get_total_tax() + $this->get_total_fees() + $this->get_subtotal() - $this->get_total_discount() );
3560
		return $this->get_total();
3561
	}
3562
3563
	/**
3564
	 * @deprecated
3565
	 */
3566
    public function recalculate_totals() {
3567
        $this->recalculate_total();
3568
        $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

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