Passed
Push — master ( c0eaca...2632ed )
by Brian
04:50
created

GetPaid_Payment_Form_Submission::process_invoice()   B

Complexity

Conditions 9
Paths 5

Size

Total Lines 50
Code Lines 26

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 9
eloc 26
nc 5
nop 0
dl 0
loc 50
rs 8.0555
c 0
b 0
f 0
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;
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->invoice = $invoice;
268
		if ( ! $this->payment_form->is_default() ) {
269
270
			$items    = array();
271
			$item_ids = array();
272
	
273
			foreach ( $invoice->get_items() as $item ) {
274
				if ( ! in_array( $item->get_id(), $item_ids ) ) {
275
					$item_ids[] = $item->get_id();
276
					$items[]    = $item;
277
				}
278
			}
279
	
280
			foreach ( $this->payment_form->get_items() as $item ) {
281
				if ( ! in_array( $item->get_id(), $item_ids ) ) {
282
					$item_ids[] = $item->get_id();
283
					$items[]    = $item;
284
				}
285
			}
286
	
287
			$this->payment_form->set_items( $items );
288
	
289
		} else {
290
			$this->payment_form->set_items( $invoice->get_items() );
291
		}
292
293
		$this->country = $invoice->get_country();
294
		$this->state   = $invoice->get_state();
295
		$this->invoice = $invoice;
296
297
		do_action_ref_array( 'getpaid_submissions_process_invoice', array( &$this ) );
298
	}
299
300
	/**
301
	 * Returns the associated invoice.
302
	 *
303
	 * @since 1.0.19
304
	 * @return WPInv_Invoice
305
	 */
306
	public function get_invoice() {
307
		return $this->invoice;
308
	}
309
310
	/**
311
	 * Checks whether there is an invoice associated with this submission.
312
	 *
313
	 * @since 1.0.19
314
	 * @return bool
315
	 */
316
	public function has_invoice() {
317
		return ! empty( $this->invoice );
318
	}
319
320
	/*
321
	|--------------------------------------------------------------------------
322
	| Items.
323
	|--------------------------------------------------------------------------
324
	|
325
	| Functions for dealing with the submission's items. Submissions can only have one
326
	| recurring item. But can have an unlimited number of non-recurring items.
327
	*/
328
329
	/**
330
	 * Prepares the submission's items.
331
	 *
332
	 * @since 1.0.19
333
	 */
334
	public function process_items() {
335
336
		$processor = new GetPaid_Payment_Form_Submission_Items( $this );
337
338
		foreach ( $processor->items as $item ) {
339
			$this->add_item( $item );
340
		}
341
342
		do_action_ref_array( 'getpaid_submissions_process_items', array( &$this ) );
343
	}
344
345
	/**
346
	 * Adds an item to the submission.
347
	 *
348
	 * @since 1.0.19
349
	 * @param GetPaid_Form_Item $item
350
	 */
351
	public function add_item( $item ) {
352
353
		// Make sure that it is available for purchase.
354
		if ( ! $item->can_purchase() || isset( $this->items[ $item->get_id() ] ) ) {
355
			return;
356
		}
357
358
		// Each submission can only contain one recurring item.
359
		if ( $item->is_recurring() ) {
360
361
			if ( $this->has_recurring != 0 ) {
362
				throw new Exception( __( 'You can only buy one recurring item at a time.', 'invoicing' ) );
363
			}
364
365
			$this->has_recurring = $item->get_id();
366
367
		}
368
369
		// Update the items and totals.
370
		$this->items[ $item->get_id() ]         = $item;
371
		$this->totals['subtotal']['initial']   += $item->get_sub_total();
372
		$this->totals['subtotal']['recurring'] += $item->get_recurring_sub_total();
373
374
	}
375
376
	/**
377
	 * Removes a specific item.
378
	 * 
379
	 * You should not call this method after the discounts and taxes
380
	 * have been calculated.
381
	 *
382
	 * @since 1.0.19
383
	 */
384
	public function remove_item( $item_id ) {
385
386
		if ( isset( $this->items[ $item_id ] ) ) {
387
			$this->totals['subtotal']['initial']   -= $this->items[ $item_id ]->get_sub_total();
388
			$this->totals['subtotal']['recurring'] -= $this->items[ $item_id ]->get_recurring_sub_total();
389
390
			if ( $this->items[ $item_id ]->is_recurring() ) {
391
				$this->has_recurring = 0;
392
			}
393
394
			unset( $this->items[ $item_id ] );
395
		}
396
397
	}
398
399
	/**
400
	 * Returns the subtotal.
401
	 *
402
	 * @since 1.0.19
403
	 */
404
	public function get_subtotal() {
405
406
		if ( wpinv_prices_include_tax() ) {
407
			return $this->totals['subtotal']['initial'] - $this->totals['taxes']['initial'];
408
		}
409
410
		return $this->totals['subtotal']['initial'];
411
	}
412
413
	/**
414
	 * Returns the recurring subtotal.
415
	 *
416
	 * @since 1.0.19
417
	 */
418
	public function get_recurring_subtotal() {
419
420
		if ( wpinv_prices_include_tax() ) {
421
			return $this->totals['subtotal']['recurring'] - $this->totals['taxes']['recurring'];
422
		}
423
424
		return $this->totals['subtotal']['recurring'];
425
	}
426
427
	/**
428
	 * Returns all items.
429
	 *
430
	 * @since 1.0.19
431
	 * @return GetPaid_Form_Item[]
432
	 */
433
	public function get_items() {
434
		return $this->items;
435
	}
436
437
	/*
438
	|--------------------------------------------------------------------------
439
	| Taxes
440
	|--------------------------------------------------------------------------
441
	|
442
	| Functions for dealing with submission taxes. Taxes can be recurring
443
	| or only one-time.
444
    */
445
446
	/**
447
	 * Prepares the submission's taxes.
448
	 *
449
	 * @since 1.0.19
450
	 */
451
	public function process_taxes() {
452
453
		// Abort if we're not using taxes.
454
		if ( ! $this->use_taxes() ) {
455
			return;
456
		}
457
458
		// If a custom country && state has been passed in, use it to calculate taxes.
459
		$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...
460
		if ( ! empty( $country ) ) {
461
			$this->country = $country;
462
		}
463
464
		$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...
465
		if ( ! empty( $state ) ) {
466
			$this->state = $state;
467
		}
468
469
		// Confirm if the provided country and the ip country are similar.
470
		$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...
471
		if ( wpinv_should_validate_vat_number() && getpaid_get_ip_country() != $this->country && empty( $address_confirmed ) ) {
472
			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' ) );
473
		}
474
475
		// Abort if the country is not taxable.
476
		if ( ! wpinv_is_country_taxable( $this->country ) ) {
477
			return;
478
		}
479
480
		$processor = new GetPaid_Payment_Form_Submission_Taxes( $this );
481
482
		foreach ( $processor->taxes as $tax ) {
483
			$this->add_tax( $tax );
484
		}
485
486
		do_action_ref_array( 'getpaid_submissions_process_taxes', array( &$this ) );
487
	}
488
489
	/**
490
	 * Adds a tax to the submission.
491
	 *
492
	 * @param array $tax An array of tax details. name, initial_tax, and recurring_tax are required.
493
	 * @since 1.0.19
494
	 */
495
	public function add_tax( $tax ) {
496
497
		if ( wpinv_round_tax_per_tax_rate() ) {
498
			$tax['initial_tax']   = wpinv_round_amount( $tax['initial_tax'] );
499
			$tax['recurring_tax'] = wpinv_round_amount( $tax['recurring_tax'] );
500
		}
501
502
		$this->taxes[ $tax['name'] ]         = $tax;
503
		$this->totals['taxes']['initial']   += wpinv_sanitize_amount( $tax['initial_tax'] );
504
		$this->totals['taxes']['recurring'] += wpinv_sanitize_amount( $tax['recurring_tax'] );
505
506
	}
507
508
	/**
509
	 * Removes a specific tax.
510
	 *
511
	 * @since 1.0.19
512
	 */
513
	public function remove_tax( $tax_name ) {
514
515
		if ( isset( $this->taxes[ $tax_name ] ) ) {
516
			$this->totals['taxes']['initial']   -= $this->taxes[ $tax_name ]['initial_tax'];
517
			$this->totals['taxes']['recurring'] -= $this->taxes[ $tax_name ]['recurring_tax'];
518
			unset( $this->taxes[ $tax_name ] );
519
		}
520
521
	}
522
523
	/**
524
	 * Whether or not we'll use taxes for the submission.
525
	 *
526
	 * @since 1.0.19
527
	 */
528
	public function use_taxes() {
529
530
		$use_taxes = wpinv_use_taxes();
531
532
		if ( $this->has_invoice() && ! $this->invoice->is_taxable() ) {
533
			$use_taxes = false;
534
		}
535
536
		return apply_filters( 'getpaid_submission_use_taxes', $use_taxes, $this );
537
538
	}
539
540
	/**
541
	 * Returns the tax.
542
	 *
543
	 * @since 1.0.19
544
	 */
545
	public function get_tax() {
546
		return $this->totals['taxes']['initial'];
547
	}
548
549
	/**
550
	 * Returns the recurring tax.
551
	 *
552
	 * @since 1.0.19
553
	 */
554
	public function get_recurring_tax() {
555
		return $this->totals['taxes']['recurring'];
556
	}
557
558
	/**
559
	 * Returns all taxes.
560
	 *
561
	 * @since 1.0.19
562
	 */
563
	public function get_taxes() {
564
		return $this->taxes;
565
	}
566
567
	/*
568
	|--------------------------------------------------------------------------
569
	| Discounts
570
	|--------------------------------------------------------------------------
571
	|
572
	| Functions for dealing with submission discounts. Discounts can be recurring
573
	| or only one-time. They also do not have to come from a discount code.
574
    */
575
576
	/**
577
	 * Prepares the submission's discount.
578
	 *
579
	 * @since 1.0.19
580
	 */
581
	public function process_discount() {
582
583
		$initial_total    = $this->get_subtotal() + $this->get_fee() + $this->get_tax();
584
		$recurring_total  = $this->get_recurring_subtotal() + $this->get_recurring_fee() + $this->get_recurring_tax();
585
		$processor        = new GetPaid_Payment_Form_Submission_Discount( $this, $initial_total, $recurring_total );
586
587
		foreach ( $processor->discounts as $discount ) {
588
			$this->add_discount( $discount );
589
		}
590
591
		do_action_ref_array( 'getpaid_submissions_process_discounts', array( &$this ) );
592
	}
593
594
	/**
595
	 * Adds a discount to the submission.
596
	 *
597
	 * @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.
598
	 * @since 1.0.19
599
	 */
600
	public function add_discount( $discount ) {
601
		$this->discounts[ $discount['name'] ]   = $discount;
602
		$this->totals['discount']['initial']   += wpinv_sanitize_amount( $discount['initial_discount'] );
603
		$this->totals['discount']['recurring'] += wpinv_sanitize_amount( $discount['recurring_discount'] );
604
	}
605
606
	/**
607
	 * Removes a discount from the submission.
608
	 *
609
	 * @since 1.0.19
610
	 */
611
	public function remove_discount( $name ) {
612
613
		if ( isset( $this->discounts[ $name ] ) ) {
614
			$this->totals['discount']['initial']   -= $this->discounts[ $name ]['initial_discount'];
615
			$this->totals['discount']['recurring'] -= $this->discounts[ $name ]['recurring_discount'];
616
			unset( $this->discounts[ $name ] );
617
		}
618
619
	}
620
621
	/**
622
	 * Checks whether there is a discount code associated with this submission.
623
	 *
624
	 * @since 1.0.19
625
	 * @return bool
626
	 */
627
	public function has_discount_code() {
628
		return ! empty( $this->discounts['discount_code'] );
629
	}
630
631
	/**
632
	 * Returns the discount code.
633
	 *
634
	 * @since 1.0.19
635
	 * @return string
636
	 */
637
	public function get_discount_code() {
638
		return $this->has_discount_code() ? $this->discounts['discount_code']['discount_code'] : '';
639
	}
640
641
	/**
642
	 * Returns the discount.
643
	 *
644
	 * @since 1.0.19
645
	 */
646
	public function get_discount() {
647
		return $this->totals['discount']['initial'];
648
	}
649
650
	/**
651
	 * Returns the recurring discount.
652
	 *
653
	 * @since 1.0.19
654
	 */
655
	public function get_recurring_discount() {
656
		return $this->totals['discount']['recurring'];
657
	}
658
659
	/**
660
	 * Returns all discounts.
661
	 *
662
	 * @since 1.0.19
663
	 */
664
	public function get_discounts() {
665
		return $this->discounts;
666
	}
667
668
	/*
669
	|--------------------------------------------------------------------------
670
	| Fees
671
	|--------------------------------------------------------------------------
672
	|
673
	| Functions for dealing with submission fees. Fees can be recurring
674
	| or only one-time. Price input and Price select elements are treated as 
675
	| fees.
676
    */
677
678
	/**
679
	 * Prepares the submission's fees.
680
	 *
681
	 * @since 1.0.19
682
	 */
683
	public function process_fees() {
684
685
		$fees_processor = new GetPaid_Payment_Form_Submission_Fees( $this );
686
687
		foreach ( $fees_processor->fees as $fee ) {
688
			$this->add_fee( $fee );
689
		}
690
691
		do_action_ref_array( 'getpaid_submissions_process_fees', array( &$this ) );
692
	}
693
694
	/**
695
	 * Adds a fee to the submission.
696
	 *
697
	 * @param array $fee An array of fee details. name, initial_fee, and recurring_fee are required.
698
	 * @since 1.0.19
699
	 */
700
	public function add_fee( $fee ) {
701
702
		$this->fees[ $fee['name'] ]         = $fee;
703
		$this->totals['fees']['initial']   += wpinv_sanitize_amount( $fee['initial_fee'] );
704
		$this->totals['fees']['recurring'] += wpinv_sanitize_amount( $fee['recurring_fee'] );
705
706
	}
707
708
	/**
709
	 * Removes a fee from the submission.
710
	 *
711
	 * @since 1.0.19
712
	 */
713
	public function remove_fee( $name ) {
714
715
		if ( isset( $this->fees[ $name ] ) ) {
716
			$this->totals['fees']['initial']   -= $this->fees[ $name ]['initial_fee'];
717
			$this->totals['fees']['recurring'] -= $this->fees[ $name ]['recurring_fee'];
718
			unset( $this->fees[ $name ] );
719
		}
720
721
	}
722
723
	/**
724
	 * Returns the fees.
725
	 *
726
	 * @since 1.0.19
727
	 */
728
	public function get_fee() {
729
		return $this->totals['fees']['initial'];
730
	}
731
732
	/**
733
	 * Returns the recurring fees.
734
	 *
735
	 * @since 1.0.19
736
	 */
737
	public function get_recurring_fee() {
738
		return $this->totals['fees']['recurring'];
739
	}
740
741
	/**
742
	 * Returns all fees.
743
	 *
744
	 * @since 1.0.19
745
	 */
746
	public function get_fees() {
747
		return $this->fees;
748
	}
749
750
	/**
751
	 * Checks if there are any fees for the form.
752
	 *
753
	 * @return bool
754
	 * @since 1.0.19
755
	 */
756
	public function has_fees() {
757
		return count( $this->fees ) !== 0;
758
	}
759
760
	/*
761
	|--------------------------------------------------------------------------
762
	| MISC
763
	|--------------------------------------------------------------------------
764
	|
765
	| Extra submission functions.
766
    */
767
768
	/**
769
	 * Checks if this is the initial fetch.
770
	 *
771
	 * @return bool
772
	 * @since 1.0.19
773
	 */
774
	public function is_initial_fetch() {
775
		return empty( $this->data['initial_state'] );
776
	}
777
778
	/**
779
	 * Returns the total amount to collect for this submission.
780
	 *
781
	 * @since 1.0.19
782
	 */
783
	public function get_total() {
784
		$total = $this->get_subtotal() + $this->get_fee() + $this->get_tax() - $this->get_discount();
785
		return max( $total, 0 );
786
	}
787
788
	/**
789
	 * Returns the recurring total amount to collect for this submission.
790
	 *
791
	 * @since 1.0.19
792
	 */
793
	public function get_recurring_total() {
794
		$total = $this->get_recurring_subtotal() + $this->get_recurring_fee() + $this->get_recurring_tax() - $this->get_recurring_discount();
795
		return max( $total, 0 );
796
	}
797
798
	/**
799
	 * Whether payment details should be collected for this submission.
800
	 *
801
	 * @since 1.0.19
802
	 */
803
	public function should_collect_payment_details() {
804
		$initial   = $this->get_total();
805
		$recurring = $this->get_recurring_total();
806
807
		if ( $this->has_recurring == 0 ) {
808
			$recurring = 0;
809
		}
810
811
		$collect = $initial > 0 || $recurring > 0;
812
		return apply_filters( 'getpaid_submission_should_collect_payment_details', $collect, $this  );
813
	}
814
815
	/**
816
	 * Returns the billing email of the user.
817
	 *
818
	 * @since 1.0.19
819
	 */
820
	public function get_billing_email() {
821
		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...
822
	}
823
824
	/**
825
	 * Checks if the submitter has a billing email.
826
	 *
827
	 * @since 1.0.19
828
	 */
829
	public function has_billing_email() {
830
		$billing_email = $this->get_billing_email();
831
		return ! empty( $billing_email ) && is_email( $billing_email );
832
	}
833
834
	/**
835
	 * Returns the appropriate currency for the submission.
836
	 *
837
	 * @since 1.0.19
838
	 * @return string
839
	 */
840
	public function get_currency() {
841
		return $this->has_invoice() ? $this->invoice->get_currency() : wpinv_get_currency();
842
    }
843
844
    /**
845
	 * Returns the raw submission data.
846
	 *
847
	 * @since 1.0.19
848
	 * @return array
849
	 */
850
	public function get_data() {
851
		return $this->data;
852
	}
853
854
	/**
855
	 * Returns a field from the submission data
856
	 *
857
	 * @param string $field
858
	 * @since 1.0.19
859
	 * @return mixed|null
860
	 */
861
	public function get_field( $field, $sub_array_key = null ) {
862
		return getpaid_get_array_field( $this->data, $field, $sub_array_key );
863
	}
864
865
	/**
866
	 * Checks if a required field is set.
867
	 *
868
	 * @since 1.0.19
869
	 */
870
	public function is_required_field_set( $field ) {
871
		return empty( $field['required'] ) || ! empty( $this->data[ $field['id'] ] );
872
	}
873
874
	/**
875
	 * Formats an amount
876
	 *
877
	 * @since 1.0.19
878
	 */
879
	public function format_amount( $amount ) {
880
		return wpinv_price( $amount, $this->get_currency() );
881
	}
882
883
}
884