Passed
Push — master ( e1a3e9...776791 )
by Brian
05:42
created

is_initial_fetch()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 2
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 1
c 0
b 0
f 0
nc 1
nop 0
dl 0
loc 2
rs 10
1
<?php
2
if ( ! defined( 'ABSPATH' ) ) {
3
	exit;
4
}
5
6
/**
7
 * Payment form submission class
8
 *
9
 */
10
class GetPaid_Payment_Form_Submission {
11
12
    /**
13
	 * Submission ID
14
	 *
15
	 * @var string
16
	 */
17
	public $id = null;
18
19
	/**
20
	 * The raw submission data.
21
	 *
22
	 * @var array
23
	 */
24
	protected $data = null;
25
26
	/**
27
	 * Submission totals
28
	 *
29
	 * @var array
30
	 */
31
	protected $totals = array(
32
33
		'subtotal'      => array(
34
			'initial'   => 0,
35
			'recurring' => 0,
36
		),
37
38
		'discount'      => array(
39
			'initial'   => 0,
40
			'recurring' => 0,
41
		),
42
43
		'fees'          => array(
44
			'initial'   => 0,
45
			'recurring' => 0,
46
		),
47
48
		'taxes'         => array(
49
			'initial'   => 0,
50
			'recurring' => 0,
51
		),
52
53
	);
54
55
	/**
56
	 * Sets the associated payment form.
57
	 *
58
	 * @var GetPaid_Payment_Form
59
	 */
60
    protected $payment_form = null;
61
62
    /**
63
	 * The country for the submission.
64
	 *
65
	 * @var string
66
	 */
67
	public $country = null;
68
69
    /**
70
	 * The state for the submission.
71
	 *
72
	 * @since 1.0.19
73
	 * @var string
74
	 */
75
	public $state = null;
76
77
	/**
78
	 * The invoice associated with the submission.
79
	 *
80
	 * @var WPInv_Invoice
81
	 */
82
	protected $invoice = null;
83
84
	/**
85
	 * The recurring item for the submission.
86
	 *
87
	 * @var int
88
	 */
89
	public $has_recurring = 0;
90
91
	/**
92
	 * An array of fees for the submission.
93
	 *
94
	 * @var array
95
	 */
96
	protected $fees = array();
97
98
	/**
99
	 * An array of discounts for the submission.
100
	 *
101
	 * @var array
102
	 */
103
	protected $discounts = array();
104
105
	/**
106
	 * An array of taxes for the submission.
107
	 *
108
	 * @var array
109
	 */
110
	protected $taxes = array();
111
112
	/**
113
	 * An array of items for the submission.
114
	 *
115
	 * @var GetPaid_Form_Item[]
116
	 */
117
	protected $items = array();
118
119
	/**
120
	 * The last error.
121
	 *
122
	 * @var string
123
	 */
124
	public $last_error = null;
125
126
    /**
127
	 * Class constructor.
128
	 *
129
	 */
130
	public function __construct() {
131
132
		// Set the state and country to the default state and country.
133
		$this->country = wpinv_default_billing_country();
134
		$this->state   = wpinv_get_default_state();
135
136
		// Do we have an actual submission?
137
		if ( isset( $_POST['getpaid_payment_form_submission'] ) ) {
138
			$this->load_data( $_POST );
139
		}
140
141
	}
142
143
	/**
144
	 * Loads submission data.
145
	 *
146
	 * @param array $data
147
	 */
148
	public function load_data( $data ) {
149
150
		// Remove slashes from the submitted data...
151
		$data       = wp_unslash( $data );
152
153
		// Allow plugins to filter the data.
154
		$data       = apply_filters( 'getpaid_submission_data', $data, $this );
155
156
		// Cache it...
157
		$this->data = $data;
0 ignored issues
show
Documentation Bug introduced by
It seems like $data can also be of type string. However, the property $data is declared as type array. 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...
158
159
		// Then generate a unique id from the data.
160
		$this->id   = md5( wp_json_encode( $data ) );
0 ignored issues
show
Bug introduced by
It seems like wp_json_encode($data) can also be of type false; however, parameter $string of md5() 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

160
		$this->id   = md5( /** @scrutinizer ignore-type */ wp_json_encode( $data ) );
Loading history...
161
162
		// Finally, process the submission.
163
		try {
164
165
			// Each process is passed an instance of the class (with reference)
166
			// and should throw an Exception whenever it encounters one.
167
			$processors = apply_filters(
168
				'getpaid_payment_form_submission_processors',
169
				array(
170
					array( $this, 'process_payment_form' ),
171
					array( $this, 'process_invoice' ),
172
					array( $this, 'process_fees' ),
173
					array( $this, 'process_items' ),
174
					array( $this, 'process_discount' ),
175
					array( $this, 'process_taxes' ),
176
				),
177
				$this		
178
			);
179
180
			foreach ( $processors as $processor ) {
181
				call_user_func_array( $processor, array( &$this ) );
182
			}
183
184
		} catch ( Exception $e ) {
185
			$this->last_error = $e->getMessage();
186
		}
187
188
		// Fired when we are done processing a submission.
189
		do_action_ref_array( 'getpaid_process_submission', array( &$this ) );
190
191
	}
192
193
	/*
194
	|--------------------------------------------------------------------------
195
	| Payment Forms.
196
	|--------------------------------------------------------------------------
197
	|
198
	| Functions for dealing with the submission's payment form. Ensure that the
199
	| submission has an active payment form etc.
200
    */
201
202
	/**
203
	 * Prepares the submission's payment form.
204
	 *
205
	 * @since 1.0.19
206
	 */
207
	public function process_payment_form() {
208
209
		// Every submission needs an active payment form.
210
		if ( empty( $this->data['form_id'] ) ) {
211
			throw new Exception( __( 'Missing payment form', 'invoicing' ) );
212
		}
213
214
		// Fetch the payment form.
215
		$this->payment_form = new GetPaid_Payment_Form( $this->data['form_id'] );
216
217
		if ( ! $this->payment_form->is_active() ) {
218
			throw new Exception( __( 'Payment form not active', 'invoicing' ) );
219
		}
220
221
		do_action_ref_array( 'getpaid_submissions_process_payment_form', array( &$this ) );
222
	}
223
224
    /**
225
	 * Returns the payment form.
226
	 *
227
	 * @since 1.0.19
228
	 * @return GetPaid_Payment_Form
229
	 */
230
	public function get_payment_form() {
231
		return $this->payment_form;
232
	}
233
234
	/*
235
	|--------------------------------------------------------------------------
236
	| Invoices.
237
	|--------------------------------------------------------------------------
238
	|
239
	| Functions for dealing with the submission's invoice. Some submissions
240
	| might be for an existing invoice.
241
	*/
242
243
	/**
244
	 * Prepares the submission's invoice.
245
	 *
246
	 * @since 1.0.19
247
	 */
248
	public function process_invoice() {
249
250
		// Abort if there is no invoice.
251
		if ( empty( $this->data['invoice_id'] ) ) {
252
			return;
253
		}
254
255
		// If the submission is for an existing invoice, ensure that it exists
256
		// and that it is not paid for.
257
		$invoice = wpinv_get_invoice( $this->data['invoice_id'] );
258
259
        if ( empty( $invoice ) ) {
260
			throw new Exception( __( 'Invalid invoice', 'invoicing' ) );
261
		}
262
263
		if ( $invoice->is_paid() ) {
264
			throw new Exception( __( 'This invoice is already paid for.', 'invoicing' ) );
265
		}
266
267
		$this->payment_form->set_items( $invoice->get_items() );
268
		$this->payment_form->invoice = $invoice;
269
270
		$this->country = $invoice->get_country();
271
		$this->state   = $invoice->get_state();
272
		$this->invoice = $invoice;
273
274
		do_action_ref_array( 'getpaid_submissions_process_invoice', array( &$this ) );
275
	}
276
277
	/**
278
	 * Returns the associated invoice.
279
	 *
280
	 * @since 1.0.19
281
	 * @return WPInv_Invoice
282
	 */
283
	public function get_invoice() {
284
		return $this->invoice;
285
	}
286
287
	/**
288
	 * Checks whether there is an invoice associated with this submission.
289
	 *
290
	 * @since 1.0.19
291
	 * @return bool
292
	 */
293
	public function has_invoice() {
294
		return ! empty( $this->invoice );
295
	}
296
297
	/*
298
	|--------------------------------------------------------------------------
299
	| Items.
300
	|--------------------------------------------------------------------------
301
	|
302
	| Functions for dealing with the submission's items. Submissions can only have one
303
	| recurring item. But can have an unlimited number of non-recurring items.
304
	*/
305
306
	/**
307
	 * Prepares the submission's items.
308
	 *
309
	 * @since 1.0.19
310
	 */
311
	public function process_items() {
312
313
		$processor = new GetPaid_Payment_Form_Submission_Items( $this );
314
315
		foreach ( $processor->items as $item ) {
316
			$this->add_item( $item );
317
		}
318
319
		do_action_ref_array( 'getpaid_submissions_process_items', array( &$this ) );
320
	}
321
322
	/**
323
	 * Adds an item to the submission.
324
	 *
325
	 * @since 1.0.19
326
	 * @param GetPaid_Form_Item $item
327
	 */
328
	public function add_item( $item ) {
329
330
		// Make sure that it is available for purchase.
331
		if ( ! $item->can_purchase() || isset( $this->items[ $item->get_id() ] ) ) {
332
			return;
333
		}
334
335
		// Each submission can only contain one recurring item.
336
		if ( $item->is_recurring() ) {
337
338
			if ( $this->has_recurring != 0 ) {
339
				throw new Exception( __( 'You can only buy one recurring item at a time.', 'invoicing' ) );
340
			}
341
342
			$this->has_recurring = $item->get_id();
343
344
		}
345
346
		// Update the items and totals.
347
		$this->items[ $item->get_id() ]         = $item;
348
		$this->totals['subtotal']['initial']   += $item->get_sub_total();
349
		$this->totals['subtotal']['recurring'] += $item->get_recurring_sub_total();
350
351
	}
352
353
	/**
354
	 * Removes a specific item.
355
	 * 
356
	 * You should not call this method after the discounts and taxes
357
	 * have been calculated.
358
	 *
359
	 * @since 1.0.19
360
	 */
361
	public function remove_item( $item_id ) {
362
363
		if ( isset( $this->items[ $item_id ] ) ) {
364
			$this->totals['subtotal']['initial']   -= $this->items[ $item_id ]->get_sub_total();
365
			$this->totals['subtotal']['recurring'] -= $this->items[ $item_id ]->get_recurring_sub_total();
366
367
			if ( $this->items[ $item_id ]->is_recurring() ) {
368
				$this->has_recurring = 0;
369
			}
370
371
			unset( $this->items[ $item_id ] );
372
		}
373
374
	}
375
376
	/**
377
	 * Returns the subtotal.
378
	 *
379
	 * @since 1.0.19
380
	 */
381
	public function get_subtotal() {
382
383
		if ( wpinv_prices_include_tax() ) {
384
			return $this->totals['subtotal']['initial'] - $this->totals['taxes']['initial'];
385
		}
386
387
		return $this->totals['subtotal']['initial'];
388
	}
389
390
	/**
391
	 * Returns the recurring subtotal.
392
	 *
393
	 * @since 1.0.19
394
	 */
395
	public function get_recurring_subtotal() {
396
397
		if ( wpinv_prices_include_tax() ) {
398
			return $this->totals['subtotal']['recurring'] - $this->totals['taxes']['recurring'];
399
		}
400
401
		return $this->totals['subtotal']['recurring'];
402
	}
403
404
	/**
405
	 * Returns all items.
406
	 *
407
	 * @since 1.0.19
408
	 * @return GetPaid_Form_Item[]
409
	 */
410
	public function get_items() {
411
		return $this->items;
412
	}
413
414
	/*
415
	|--------------------------------------------------------------------------
416
	| Taxes
417
	|--------------------------------------------------------------------------
418
	|
419
	| Functions for dealing with submission taxes. Taxes can be recurring
420
	| or only one-time.
421
    */
422
423
	/**
424
	 * Prepares the submission's taxes.
425
	 *
426
	 * @since 1.0.19
427
	 */
428
	public function process_taxes() {
429
430
		// Abort if we're not using taxes.
431
		if ( ! $this->use_taxes() ) {
432
			return;
433
		}
434
435
		// If a custom country && state has been passed in, use it to calculate taxes.
436
		$country = $this->get_field( 'wpinv_country', 'billing' );
0 ignored issues
show
Bug introduced by
Are you sure the assignment to $country is correct as $this->get_field('wpinv_country', 'billing') targeting GetPaid_Payment_Form_Submission::get_field() seems to always return null.

This check looks for function or method calls that always return null and whose return value is assigned to a variable.

class A
{
    function getObject()
    {
        return null;
    }

}

$a = new A();
$object = $a->getObject();

The method getObject() can return nothing but null, so it makes no sense to assign that value to a variable.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

Loading history...
437
		if ( ! empty( $country ) ) {
438
			$this->country = $country;
439
		}
440
441
		$state = $this->get_field( 'wpinv_state', 'billing' );
0 ignored issues
show
Bug introduced by
Are you sure the assignment to $state is correct as $this->get_field('wpinv_state', 'billing') targeting GetPaid_Payment_Form_Submission::get_field() seems to always return null.

This check looks for function or method calls that always return null and whose return value is assigned to a variable.

class A
{
    function getObject()
    {
        return null;
    }

}

$a = new A();
$object = $a->getObject();

The method getObject() can return nothing but null, so it makes no sense to assign that value to a variable.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

Loading history...
442
		if ( ! empty( $state ) ) {
443
			$this->state = $state;
444
		}
445
446
		// Confirm if the provided country and the ip country are similar.
447
		$address_confirmed = $this->get_field( 'confirm-address' );
0 ignored issues
show
Bug introduced by
Are you sure the assignment to $address_confirmed is correct as $this->get_field('confirm-address') targeting GetPaid_Payment_Form_Submission::get_field() seems to always return null.

This check looks for function or method calls that always return null and whose return value is assigned to a variable.

class A
{
    function getObject()
    {
        return null;
    }

}

$a = new A();
$object = $a->getObject();

The method getObject() can return nothing but null, so it makes no sense to assign that value to a variable.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

Loading history...
448
		if ( wpinv_should_validate_vat_number() && getpaid_get_ip_country() != $this->country && empty( $address_confirmed ) ) {
449
			throw new Exception( __( 'The country of your current location must be the same as the country of your billing location or you must confirm the billing address is your home country.', 'invoicing' ) );
450
		}
451
452
		// Abort if the country is not taxable.
453
		if ( ! wpinv_is_country_taxable( $this->country ) ) {
454
			return;
455
		}
456
457
		$processor = new GetPaid_Payment_Form_Submission_Taxes( $this );
458
459
		foreach ( $processor->taxes as $tax ) {
460
			$this->add_tax( $tax );
461
		}
462
463
		do_action_ref_array( 'getpaid_submissions_process_taxes', array( &$this ) );
464
	}
465
466
	/**
467
	 * Adds a tax to the submission.
468
	 *
469
	 * @param array $tax An array of tax details. name, initial_tax, and recurring_tax are required.
470
	 * @since 1.0.19
471
	 */
472
	public function add_tax( $tax ) {
473
474
		if ( wpinv_round_tax_per_tax_rate() ) {
475
			$tax['initial_tax']   = wpinv_round_amount( $tax['initial_tax'] );
476
			$tax['recurring_tax'] = wpinv_round_amount( $tax['recurring_tax'] );
477
		}
478
479
		$this->taxes[ $tax['name'] ]         = $tax;
480
		$this->totals['taxes']['initial']   += wpinv_sanitize_amount( $tax['initial_tax'] );
481
		$this->totals['taxes']['recurring'] += wpinv_sanitize_amount( $tax['recurring_tax'] );
482
483
	}
484
485
	/**
486
	 * Removes a specific tax.
487
	 *
488
	 * @since 1.0.19
489
	 */
490
	public function remove_tax( $tax_name ) {
491
492
		if ( isset( $this->taxes[ $tax_name ] ) ) {
493
			$this->totals['taxes']['initial']   -= $this->taxes[ $tax_name ]['initial_tax'];
494
			$this->totals['taxes']['recurring'] -= $this->taxes[ $tax_name ]['recurring_tax'];
495
			unset( $this->taxes[ $tax_name ] );
496
		}
497
498
	}
499
500
	/**
501
	 * Whether or not we'll use taxes for the submission.
502
	 *
503
	 * @since 1.0.19
504
	 */
505
	public function use_taxes() {
506
507
		$use_taxes = wpinv_use_taxes();
508
509
		if ( $this->has_invoice() && ! $this->invoice->is_taxable() ) {
510
			$use_taxes = false;
511
		}
512
513
		return apply_filters( 'getpaid_submission_use_taxes', $use_taxes, $this );
514
515
	}
516
517
	/**
518
	 * Returns the tax.
519
	 *
520
	 * @since 1.0.19
521
	 */
522
	public function get_tax() {
523
		return $this->totals['taxes']['initial'];
524
	}
525
526
	/**
527
	 * Returns the recurring tax.
528
	 *
529
	 * @since 1.0.19
530
	 */
531
	public function get_recurring_tax() {
532
		return $this->totals['taxes']['recurring'];
533
	}
534
535
	/**
536
	 * Returns all taxes.
537
	 *
538
	 * @since 1.0.19
539
	 */
540
	public function get_taxes() {
541
		return $this->taxes;
542
	}
543
544
	/*
545
	|--------------------------------------------------------------------------
546
	| Discounts
547
	|--------------------------------------------------------------------------
548
	|
549
	| Functions for dealing with submission discounts. Discounts can be recurring
550
	| or only one-time. They also do not have to come from a discount code.
551
    */
552
553
	/**
554
	 * Prepares the submission's discount.
555
	 *
556
	 * @since 1.0.19
557
	 */
558
	public function process_discount() {
559
560
		$initial_total    = $this->get_subtotal() + $this->get_fee() + $this->get_tax();
561
		$recurring_total  = $this->get_recurring_subtotal() + $this->get_recurring_fee() + $this->get_recurring_tax();
562
		$processor        = new GetPaid_Payment_Form_Submission_Discount( $this, $initial_total, $recurring_total );
563
564
		foreach ( $processor->discounts as $discount ) {
565
			$this->add_discount( $discount );
566
		}
567
568
		do_action_ref_array( 'getpaid_submissions_process_discounts', array( &$this ) );
569
	}
570
571
	/**
572
	 * Adds a discount to the submission.
573
	 *
574
	 * @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.
575
	 * @since 1.0.19
576
	 */
577
	public function add_discount( $discount ) {
578
		$this->discounts[ $discount['name'] ]   = $discount;
579
		$this->totals['discount']['initial']   += wpinv_sanitize_amount( $discount['initial_discount'] );
580
		$this->totals['discount']['recurring'] += wpinv_sanitize_amount( $discount['recurring_discount'] );
581
	}
582
583
	/**
584
	 * Removes a discount from the submission.
585
	 *
586
	 * @since 1.0.19
587
	 */
588
	public function remove_discount( $name ) {
589
590
		if ( isset( $this->discounts[ $name ] ) ) {
591
			$this->totals['discount']['initial']   -= $this->discounts[ $name ]['initial_discount'];
592
			$this->totals['discount']['recurring'] -= $this->discounts[ $name ]['recurring_discount'];
593
			unset( $this->discounts[ $name ] );
594
		}
595
596
	}
597
598
	/**
599
	 * Checks whether there is a discount code associated with this submission.
600
	 *
601
	 * @since 1.0.19
602
	 * @return bool
603
	 */
604
	public function has_discount_code() {
605
		return ! empty( $this->discounts['discount_code'] );
606
	}
607
608
	/**
609
	 * Returns the discount code.
610
	 *
611
	 * @since 1.0.19
612
	 * @return string
613
	 */
614
	public function get_discount_code() {
615
		return $this->has_discount_code() ? $this->discounts['discount_code']['discount_code'] : '';
616
	}
617
618
	/**
619
	 * Returns the discount.
620
	 *
621
	 * @since 1.0.19
622
	 */
623
	public function get_discount() {
624
		return $this->totals['discount']['initial'];
625
	}
626
627
	/**
628
	 * Returns the recurring discount.
629
	 *
630
	 * @since 1.0.19
631
	 */
632
	public function get_recurring_discount() {
633
		return $this->totals['discount']['recurring'];
634
	}
635
636
	/**
637
	 * Returns all discounts.
638
	 *
639
	 * @since 1.0.19
640
	 */
641
	public function get_discounts() {
642
		return $this->discounts;
643
	}
644
645
	/*
646
	|--------------------------------------------------------------------------
647
	| Fees
648
	|--------------------------------------------------------------------------
649
	|
650
	| Functions for dealing with submission fees. Fees can be recurring
651
	| or only one-time. Price input and Price select elements are treated as 
652
	| fees.
653
    */
654
655
	/**
656
	 * Prepares the submission's fees.
657
	 *
658
	 * @since 1.0.19
659
	 */
660
	public function process_fees() {
661
662
		$fees_processor = new GetPaid_Payment_Form_Submission_Fees( $this );
663
664
		foreach ( $fees_processor->fees as $fee ) {
665
			$this->add_fee( $fee );
666
		}
667
668
		do_action_ref_array( 'getpaid_submissions_process_fees', array( &$this ) );
669
	}
670
671
	/**
672
	 * Adds a fee to the submission.
673
	 *
674
	 * @param array $fee An array of fee details. name, initial_fee, and recurring_fee are required.
675
	 * @since 1.0.19
676
	 */
677
	public function add_fee( $fee ) {
678
679
		$this->fees[ $fee['name'] ]         = $fee;
680
		$this->totals['fees']['initial']   += wpinv_sanitize_amount( $fee['initial_fee'] );
681
		$this->totals['fees']['recurring'] += wpinv_sanitize_amount( $fee['recurring_fee'] );
682
683
	}
684
685
	/**
686
	 * Removes a fee from the submission.
687
	 *
688
	 * @since 1.0.19
689
	 */
690
	public function remove_fee( $name ) {
691
692
		if ( isset( $this->fees[ $name ] ) ) {
693
			$this->totals['fees']['initial']   -= $this->fees[ $name ]['initial_fee'];
694
			$this->totals['fees']['recurring'] -= $this->fees[ $name ]['recurring_fee'];
695
			unset( $this->fees[ $name ] );
696
		}
697
698
	}
699
700
	/**
701
	 * Returns the fees.
702
	 *
703
	 * @since 1.0.19
704
	 */
705
	public function get_fee() {
706
		return $this->totals['fees']['initial'];
707
	}
708
709
	/**
710
	 * Returns the recurring fees.
711
	 *
712
	 * @since 1.0.19
713
	 */
714
	public function get_recurring_fee() {
715
		return $this->totals['fees']['recurring'];
716
	}
717
718
	/**
719
	 * Returns all fees.
720
	 *
721
	 * @since 1.0.19
722
	 */
723
	public function get_fees() {
724
		return $this->fees;
725
	}
726
727
	/**
728
	 * Checks if there are any fees for the form.
729
	 *
730
	 * @return bool
731
	 * @since 1.0.19
732
	 */
733
	public function has_fees() {
734
		return count( $this->fees ) !== 0;
735
	}
736
737
	/*
738
	|--------------------------------------------------------------------------
739
	| MISC
740
	|--------------------------------------------------------------------------
741
	|
742
	| Extra submission functions.
743
    */
744
745
	/**
746
	 * Checks if this is the initial fetch.
747
	 *
748
	 * @return bool
749
	 * @since 1.0.19
750
	 */
751
	public function is_initial_fetch() {
752
		return empty( $this->data['initial_state'] );
753
	}
754
755
	/**
756
	 * Returns the total amount to collect for this submission.
757
	 *
758
	 * @since 1.0.19
759
	 */
760
	public function get_total() {
761
		$total = $this->get_subtotal() + $this->get_fee() + $this->get_tax() - $this->get_discount();
762
		return max( $total, 0 );
763
	}
764
765
	/**
766
	 * Returns the recurring total amount to collect for this submission.
767
	 *
768
	 * @since 1.0.19
769
	 */
770
	public function get_recurring_total() {
771
		$total = $this->get_recurring_subtotal() + $this->get_recurring_fee() + $this->get_recurring_tax() - $this->get_recurring_discount();
772
		return max( $total, 0 );
773
	}
774
775
	/**
776
	 * Whether payment details should be collected for this submission.
777
	 *
778
	 * @since 1.0.19
779
	 */
780
	public function should_collect_payment_details() {
781
		$initial   = $this->get_total();
782
		$recurring = $this->get_recurring_total();
783
784
		if ( $this->has_recurring == 0 ) {
785
			$recurring = 0;
786
		}
787
788
		$collect = $initial > 0 || $recurring > 0;
789
		return apply_filters( 'getpaid_submission_should_collect_payment_details', $collect, $this  );
790
	}
791
792
	/**
793
	 * Returns the billing email of the user.
794
	 *
795
	 * @since 1.0.19
796
	 */
797
	public function get_billing_email() {
798
		return apply_filters( 'getpaid_get_submission_billing_email', $this->get_field( 'billing_email' ), $this  );
0 ignored issues
show
Bug introduced by
Are you sure the usage of $this->get_field('billing_email') targeting GetPaid_Payment_Form_Submission::get_field() seems to always return null.

This check looks for function or method calls that always return null and whose return value is used.

class A
{
    function getObject()
    {
        return null;
    }

}

$a = new A();
if ($a->getObject()) {

The method getObject() can return nothing but null, so it makes no sense to use the return value.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

Loading history...
799
	}
800
801
	/**
802
	 * Checks if the submitter has a billing email.
803
	 *
804
	 * @since 1.0.19
805
	 */
806
	public function has_billing_email() {
807
		$billing_email = $this->get_billing_email();
808
		return ! empty( $billing_email ) && is_email( $billing_email );
809
	}
810
811
	/**
812
	 * Returns the appropriate currency for the submission.
813
	 *
814
	 * @since 1.0.19
815
	 * @return string
816
	 */
817
	public function get_currency() {
818
		return $this->has_invoice() ? $this->invoice->get_currency() : wpinv_get_currency();
819
    }
820
821
    /**
822
	 * Returns the raw submission data.
823
	 *
824
	 * @since 1.0.19
825
	 * @return array
826
	 */
827
	public function get_data() {
828
		return $this->data;
829
	}
830
831
	/**
832
	 * Returns a field from the submission data
833
	 *
834
	 * @param string $field
835
	 * @since 1.0.19
836
	 * @return mixed|null
837
	 */
838
	public function get_field( $field, $sub_array_key = null ) {
839
		return getpaid_get_array_field( $this->data, $field, $sub_array_key );
840
	}
841
842
	/**
843
	 * Checks if a required field is set.
844
	 *
845
	 * @since 1.0.19
846
	 */
847
	public function is_required_field_set( $field ) {
848
		return empty( $field['required'] ) || ! empty( $this->data[ $field['id'] ] );
849
	}
850
851
	/**
852
	 * Formats an amount
853
	 *
854
	 * @since 1.0.19
855
	 */
856
	public function format_amount( $amount ) {
857
		return wpinv_price( $amount, $this->get_currency() );
858
	}
859
860
}
861