Passed
Push — master ( 55a972...5862ec )
by Brian
06:29
created
includes/payments/class-getpaid-payment-form-submission.php 1 patch
Indentation   +804 added lines, -804 removed lines patch added patch discarded remove patch
@@ -1,6 +1,6 @@  discard block
 block discarded – undo
1 1
 <?php
2 2
 if ( ! defined( 'ABSPATH' ) ) {
3
-	exit;
3
+    exit;
4 4
 }
5 5
 
6 6
 /**
@@ -10,198 +10,198 @@  discard block
 block discarded – undo
10 10
 class GetPaid_Payment_Form_Submission {
11 11
 
12 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
-	 */
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 60
     protected $payment_form = null;
61 61
 
62 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
-	 * The last error code.
128
-	 *
129
-	 * @var string
130
-	 */
131
-	public $last_error_code = null;
132
-
133
-    /**
134
-	 * Class constructor.
135
-	 *
136
-	 */
137
-	public function __construct() {
138
-
139
-		// Set the state and country to the default state and country.
140
-		$this->country = wpinv_default_billing_country();
141
-		$this->state   = wpinv_get_default_state();
142
-
143
-		// Do we have an actual submission?
144
-		if ( isset( $_POST['getpaid_payment_form_submission'] ) ) {
145
-			$this->load_data( $_POST );
146
-		}
147
-
148
-	}
149
-
150
-	/**
151
-	 * Loads submission data.
152
-	 *
153
-	 * @param array $data
154
-	 */
155
-	public function load_data( $data ) {
156
-
157
-		// Remove slashes from the submitted data...
158
-		$data       = wp_unslash( $data );
159
-
160
-		// Allow plugins to filter the data.
161
-		$data       = apply_filters( 'getpaid_submission_data', $data, $this );
162
-
163
-		// Cache it...
164
-		$this->data = $data;
165
-
166
-		// Then generate a unique id from the data.
167
-		$this->id   = md5( wp_json_encode( $data ) );
168
-
169
-		// Finally, process the submission.
170
-		try {
171
-
172
-			// Each process is passed an instance of the class (with reference)
173
-			// and should throw an Exception whenever it encounters one.
174
-			$processors = apply_filters(
175
-				'getpaid_payment_form_submission_processors',
176
-				array(
177
-					array( $this, 'process_payment_form' ),
178
-					array( $this, 'process_invoice' ),
179
-					array( $this, 'process_fees' ),
180
-					array( $this, 'process_items' ),
181
-					array( $this, 'process_discount' ),
182
-					array( $this, 'process_taxes' ),
183
-				),
184
-				$this		
185
-			);
186
-
187
-			foreach ( $processors as $processor ) {
188
-				call_user_func_array( $processor, array( &$this ) );
189
-			}
190
-
191
-		} catch( GetPaid_Payment_Exception $e ) {
192
-			$this->last_error      = $e->getMessage();
193
-			$this->last_error_code = $e->getErrorCode();
194
-		} catch ( Exception $e ) {
195
-			$this->last_error      = $e->getMessage();
196
-			$this->last_error_code = $e->getCode();
197
-		}
198
-
199
-		// Fired when we are done processing a submission.
200
-		do_action_ref_array( 'getpaid_process_submission', array( &$this ) );
201
-
202
-	}
203
-
204
-	/*
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
+     * The last error code.
128
+     *
129
+     * @var string
130
+     */
131
+    public $last_error_code = null;
132
+
133
+    /**
134
+     * Class constructor.
135
+     *
136
+     */
137
+    public function __construct() {
138
+
139
+        // Set the state and country to the default state and country.
140
+        $this->country = wpinv_default_billing_country();
141
+        $this->state   = wpinv_get_default_state();
142
+
143
+        // Do we have an actual submission?
144
+        if ( isset( $_POST['getpaid_payment_form_submission'] ) ) {
145
+            $this->load_data( $_POST );
146
+        }
147
+
148
+    }
149
+
150
+    /**
151
+     * Loads submission data.
152
+     *
153
+     * @param array $data
154
+     */
155
+    public function load_data( $data ) {
156
+
157
+        // Remove slashes from the submitted data...
158
+        $data       = wp_unslash( $data );
159
+
160
+        // Allow plugins to filter the data.
161
+        $data       = apply_filters( 'getpaid_submission_data', $data, $this );
162
+
163
+        // Cache it...
164
+        $this->data = $data;
165
+
166
+        // Then generate a unique id from the data.
167
+        $this->id   = md5( wp_json_encode( $data ) );
168
+
169
+        // Finally, process the submission.
170
+        try {
171
+
172
+            // Each process is passed an instance of the class (with reference)
173
+            // and should throw an Exception whenever it encounters one.
174
+            $processors = apply_filters(
175
+                'getpaid_payment_form_submission_processors',
176
+                array(
177
+                    array( $this, 'process_payment_form' ),
178
+                    array( $this, 'process_invoice' ),
179
+                    array( $this, 'process_fees' ),
180
+                    array( $this, 'process_items' ),
181
+                    array( $this, 'process_discount' ),
182
+                    array( $this, 'process_taxes' ),
183
+                ),
184
+                $this		
185
+            );
186
+
187
+            foreach ( $processors as $processor ) {
188
+                call_user_func_array( $processor, array( &$this ) );
189
+            }
190
+
191
+        } catch( GetPaid_Payment_Exception $e ) {
192
+            $this->last_error      = $e->getMessage();
193
+            $this->last_error_code = $e->getErrorCode();
194
+        } catch ( Exception $e ) {
195
+            $this->last_error      = $e->getMessage();
196
+            $this->last_error_code = $e->getCode();
197
+        }
198
+
199
+        // Fired when we are done processing a submission.
200
+        do_action_ref_array( 'getpaid_process_submission', array( &$this ) );
201
+
202
+    }
203
+
204
+    /*
205 205
 	|--------------------------------------------------------------------------
206 206
 	| Payment Forms.
207 207
 	|--------------------------------------------------------------------------
@@ -210,39 +210,39 @@  discard block
 block discarded – undo
210 210
 	| submission has an active payment form etc.
211 211
     */
212 212
 
213
-	/**
214
-	 * Prepares the submission's payment form.
215
-	 *
216
-	 * @since 1.0.19
217
-	 */
218
-	public function process_payment_form() {
213
+    /**
214
+     * Prepares the submission's payment form.
215
+     *
216
+     * @since 1.0.19
217
+     */
218
+    public function process_payment_form() {
219 219
 
220
-		// Every submission needs an active payment form.
221
-		if ( empty( $this->data['form_id'] ) ) {
222
-			throw new Exception( __( 'Missing payment form', 'invoicing' ) );
223
-		}
220
+        // Every submission needs an active payment form.
221
+        if ( empty( $this->data['form_id'] ) ) {
222
+            throw new Exception( __( 'Missing payment form', 'invoicing' ) );
223
+        }
224 224
 
225
-		// Fetch the payment form.
226
-		$this->payment_form = new GetPaid_Payment_Form( $this->data['form_id'] );
225
+        // Fetch the payment form.
226
+        $this->payment_form = new GetPaid_Payment_Form( $this->data['form_id'] );
227 227
 
228
-		if ( ! $this->payment_form->is_active() ) {
229
-			throw new Exception( __( 'Payment form not active', 'invoicing' ) );
230
-		}
228
+        if ( ! $this->payment_form->is_active() ) {
229
+            throw new Exception( __( 'Payment form not active', 'invoicing' ) );
230
+        }
231 231
 
232
-		do_action_ref_array( 'getpaid_submissions_process_payment_form', array( &$this ) );
233
-	}
232
+        do_action_ref_array( 'getpaid_submissions_process_payment_form', array( &$this ) );
233
+    }
234 234
 
235 235
     /**
236
-	 * Returns the payment form.
237
-	 *
238
-	 * @since 1.0.19
239
-	 * @return GetPaid_Payment_Form
240
-	 */
241
-	public function get_payment_form() {
242
-		return $this->payment_form;
243
-	}
236
+     * Returns the payment form.
237
+     *
238
+     * @since 1.0.19
239
+     * @return GetPaid_Payment_Form
240
+     */
241
+    public function get_payment_form() {
242
+        return $this->payment_form;
243
+    }
244 244
 
245
-	/*
245
+    /*
246 246
 	|--------------------------------------------------------------------------
247 247
 	| Invoices.
248 248
 	|--------------------------------------------------------------------------
@@ -251,84 +251,84 @@  discard block
 block discarded – undo
251 251
 	| might be for an existing invoice.
252 252
 	*/
253 253
 
254
-	/**
255
-	 * Prepares the submission's invoice.
256
-	 *
257
-	 * @since 1.0.19
258
-	 */
259
-	public function process_invoice() {
254
+    /**
255
+     * Prepares the submission's invoice.
256
+     *
257
+     * @since 1.0.19
258
+     */
259
+    public function process_invoice() {
260 260
 
261
-		// Abort if there is no invoice.
262
-		if ( empty( $this->data['invoice_id'] ) ) {
263
-			return;
264
-		}
261
+        // Abort if there is no invoice.
262
+        if ( empty( $this->data['invoice_id'] ) ) {
263
+            return;
264
+        }
265 265
 
266
-		// If the submission is for an existing invoice, ensure that it exists
267
-		// and that it is not paid for.
268
-		$invoice = wpinv_get_invoice( $this->data['invoice_id'] );
266
+        // If the submission is for an existing invoice, ensure that it exists
267
+        // and that it is not paid for.
268
+        $invoice = wpinv_get_invoice( $this->data['invoice_id'] );
269 269
 
270 270
         if ( empty( $invoice ) ) {
271
-			throw new Exception( __( 'Invalid invoice', 'invoicing' ) );
272
-		}
271
+            throw new Exception( __( 'Invalid invoice', 'invoicing' ) );
272
+        }
273 273
 
274
-		if ( $invoice->is_paid() ) {
275
-			throw new Exception( __( 'This invoice is already paid for.', 'invoicing' ) );
276
-		}
274
+        if ( $invoice->is_paid() ) {
275
+            throw new Exception( __( 'This invoice is already paid for.', 'invoicing' ) );
276
+        }
277 277
 
278
-		$this->payment_form->invoice = $invoice;
279
-		if ( ! $this->payment_form->is_default() ) {
278
+        $this->payment_form->invoice = $invoice;
279
+        if ( ! $this->payment_form->is_default() ) {
280 280
 
281
-			$items    = array();
282
-			$item_ids = array();
281
+            $items    = array();
282
+            $item_ids = array();
283 283
 	
284
-			foreach ( $invoice->get_items() as $item ) {
285
-				if ( ! in_array( $item->get_id(), $item_ids ) ) {
286
-					$item_ids[] = $item->get_id();
287
-					$items[]    = $item;
288
-				}
289
-			}
284
+            foreach ( $invoice->get_items() as $item ) {
285
+                if ( ! in_array( $item->get_id(), $item_ids ) ) {
286
+                    $item_ids[] = $item->get_id();
287
+                    $items[]    = $item;
288
+                }
289
+            }
290 290
 	
291
-			foreach ( $this->payment_form->get_items() as $item ) {
292
-				if ( ! in_array( $item->get_id(), $item_ids ) ) {
293
-					$item_ids[] = $item->get_id();
294
-					$items[]    = $item;
295
-				}
296
-			}
291
+            foreach ( $this->payment_form->get_items() as $item ) {
292
+                if ( ! in_array( $item->get_id(), $item_ids ) ) {
293
+                    $item_ids[] = $item->get_id();
294
+                    $items[]    = $item;
295
+                }
296
+            }
297 297
 	
298
-			$this->payment_form->set_items( $items );
298
+            $this->payment_form->set_items( $items );
299 299
 	
300
-		} else {
301
-			$this->payment_form->set_items( $invoice->get_items() );
302
-		}
303
-
304
-		$this->country = $invoice->get_country();
305
-		$this->state   = $invoice->get_state();
306
-		$this->invoice = $invoice;
307
-
308
-		do_action_ref_array( 'getpaid_submissions_process_invoice', array( &$this ) );
309
-	}
310
-
311
-	/**
312
-	 * Returns the associated invoice.
313
-	 *
314
-	 * @since 1.0.19
315
-	 * @return WPInv_Invoice
316
-	 */
317
-	public function get_invoice() {
318
-		return $this->invoice;
319
-	}
320
-
321
-	/**
322
-	 * Checks whether there is an invoice associated with this submission.
323
-	 *
324
-	 * @since 1.0.19
325
-	 * @return bool
326
-	 */
327
-	public function has_invoice() {
328
-		return ! empty( $this->invoice );
329
-	}
330
-
331
-	/*
300
+        } else {
301
+            $this->payment_form->set_items( $invoice->get_items() );
302
+        }
303
+
304
+        $this->country = $invoice->get_country();
305
+        $this->state   = $invoice->get_state();
306
+        $this->invoice = $invoice;
307
+
308
+        do_action_ref_array( 'getpaid_submissions_process_invoice', array( &$this ) );
309
+    }
310
+
311
+    /**
312
+     * Returns the associated invoice.
313
+     *
314
+     * @since 1.0.19
315
+     * @return WPInv_Invoice
316
+     */
317
+    public function get_invoice() {
318
+        return $this->invoice;
319
+    }
320
+
321
+    /**
322
+     * Checks whether there is an invoice associated with this submission.
323
+     *
324
+     * @since 1.0.19
325
+     * @return bool
326
+     */
327
+    public function has_invoice() {
328
+        return ! empty( $this->invoice );
329
+    }
330
+
331
+    /*
332 332
 	|--------------------------------------------------------------------------
333 333
 	| Items.
334 334
 	|--------------------------------------------------------------------------
@@ -337,115 +337,115 @@  discard block
 block discarded – undo
337 337
 	| recurring item. But can have an unlimited number of non-recurring items.
338 338
 	*/
339 339
 
340
-	/**
341
-	 * Prepares the submission's items.
342
-	 *
343
-	 * @since 1.0.19
344
-	 */
345
-	public function process_items() {
346
-
347
-		$processor = new GetPaid_Payment_Form_Submission_Items( $this );
348
-
349
-		foreach ( $processor->items as $item ) {
350
-			$this->add_item( $item );
351
-		}
352
-
353
-		do_action_ref_array( 'getpaid_submissions_process_items', array( &$this ) );
354
-	}
355
-
356
-	/**
357
-	 * Adds an item to the submission.
358
-	 *
359
-	 * @since 1.0.19
360
-	 * @param GetPaid_Form_Item $item
361
-	 */
362
-	public function add_item( $item ) {
363
-
364
-		// Make sure that it is available for purchase.
365
-		if ( ! $item->can_purchase() || isset( $this->items[ $item->get_id() ] ) ) {
366
-			return;
367
-		}
368
-
369
-		// Each submission can only contain one recurring item.
370
-		if ( $item->is_recurring() ) {
371
-
372
-			if ( $this->has_recurring != 0 ) {
373
-				throw new Exception( __( 'You can only buy one recurring item at a time.', 'invoicing' ) );
374
-			}
375
-
376
-			$this->has_recurring = $item->get_id();
377
-
378
-		}
379
-
380
-		// Update the items and totals.
381
-		$this->items[ $item->get_id() ]         = $item;
382
-		$this->totals['subtotal']['initial']   += $item->get_sub_total();
383
-		$this->totals['subtotal']['recurring'] += $item->get_recurring_sub_total();
384
-
385
-	}
386
-
387
-	/**
388
-	 * Removes a specific item.
389
-	 * 
390
-	 * You should not call this method after the discounts and taxes
391
-	 * have been calculated.
392
-	 *
393
-	 * @since 1.0.19
394
-	 */
395
-	public function remove_item( $item_id ) {
396
-
397
-		if ( isset( $this->items[ $item_id ] ) ) {
398
-			$this->totals['subtotal']['initial']   -= $this->items[ $item_id ]->get_sub_total();
399
-			$this->totals['subtotal']['recurring'] -= $this->items[ $item_id ]->get_recurring_sub_total();
400
-
401
-			if ( $this->items[ $item_id ]->is_recurring() ) {
402
-				$this->has_recurring = 0;
403
-			}
404
-
405
-			unset( $this->items[ $item_id ] );
406
-		}
407
-
408
-	}
409
-
410
-	/**
411
-	 * Returns the subtotal.
412
-	 *
413
-	 * @since 1.0.19
414
-	 */
415
-	public function get_subtotal() {
416
-
417
-		if ( wpinv_prices_include_tax() ) {
418
-			return $this->totals['subtotal']['initial'] - $this->totals['taxes']['initial'];
419
-		}
420
-
421
-		return $this->totals['subtotal']['initial'];
422
-	}
423
-
424
-	/**
425
-	 * Returns the recurring subtotal.
426
-	 *
427
-	 * @since 1.0.19
428
-	 */
429
-	public function get_recurring_subtotal() {
430
-
431
-		if ( wpinv_prices_include_tax() ) {
432
-			return $this->totals['subtotal']['recurring'] - $this->totals['taxes']['recurring'];
433
-		}
434
-
435
-		return $this->totals['subtotal']['recurring'];
436
-	}
437
-
438
-	/**
439
-	 * Returns all items.
440
-	 *
441
-	 * @since 1.0.19
442
-	 * @return GetPaid_Form_Item[]
443
-	 */
444
-	public function get_items() {
445
-		return $this->items;
446
-	}
447
-
448
-	/*
340
+    /**
341
+     * Prepares the submission's items.
342
+     *
343
+     * @since 1.0.19
344
+     */
345
+    public function process_items() {
346
+
347
+        $processor = new GetPaid_Payment_Form_Submission_Items( $this );
348
+
349
+        foreach ( $processor->items as $item ) {
350
+            $this->add_item( $item );
351
+        }
352
+
353
+        do_action_ref_array( 'getpaid_submissions_process_items', array( &$this ) );
354
+    }
355
+
356
+    /**
357
+     * Adds an item to the submission.
358
+     *
359
+     * @since 1.0.19
360
+     * @param GetPaid_Form_Item $item
361
+     */
362
+    public function add_item( $item ) {
363
+
364
+        // Make sure that it is available for purchase.
365
+        if ( ! $item->can_purchase() || isset( $this->items[ $item->get_id() ] ) ) {
366
+            return;
367
+        }
368
+
369
+        // Each submission can only contain one recurring item.
370
+        if ( $item->is_recurring() ) {
371
+
372
+            if ( $this->has_recurring != 0 ) {
373
+                throw new Exception( __( 'You can only buy one recurring item at a time.', 'invoicing' ) );
374
+            }
375
+
376
+            $this->has_recurring = $item->get_id();
377
+
378
+        }
379
+
380
+        // Update the items and totals.
381
+        $this->items[ $item->get_id() ]         = $item;
382
+        $this->totals['subtotal']['initial']   += $item->get_sub_total();
383
+        $this->totals['subtotal']['recurring'] += $item->get_recurring_sub_total();
384
+
385
+    }
386
+
387
+    /**
388
+     * Removes a specific item.
389
+     * 
390
+     * You should not call this method after the discounts and taxes
391
+     * have been calculated.
392
+     *
393
+     * @since 1.0.19
394
+     */
395
+    public function remove_item( $item_id ) {
396
+
397
+        if ( isset( $this->items[ $item_id ] ) ) {
398
+            $this->totals['subtotal']['initial']   -= $this->items[ $item_id ]->get_sub_total();
399
+            $this->totals['subtotal']['recurring'] -= $this->items[ $item_id ]->get_recurring_sub_total();
400
+
401
+            if ( $this->items[ $item_id ]->is_recurring() ) {
402
+                $this->has_recurring = 0;
403
+            }
404
+
405
+            unset( $this->items[ $item_id ] );
406
+        }
407
+
408
+    }
409
+
410
+    /**
411
+     * Returns the subtotal.
412
+     *
413
+     * @since 1.0.19
414
+     */
415
+    public function get_subtotal() {
416
+
417
+        if ( wpinv_prices_include_tax() ) {
418
+            return $this->totals['subtotal']['initial'] - $this->totals['taxes']['initial'];
419
+        }
420
+
421
+        return $this->totals['subtotal']['initial'];
422
+    }
423
+
424
+    /**
425
+     * Returns the recurring subtotal.
426
+     *
427
+     * @since 1.0.19
428
+     */
429
+    public function get_recurring_subtotal() {
430
+
431
+        if ( wpinv_prices_include_tax() ) {
432
+            return $this->totals['subtotal']['recurring'] - $this->totals['taxes']['recurring'];
433
+        }
434
+
435
+        return $this->totals['subtotal']['recurring'];
436
+    }
437
+
438
+    /**
439
+     * Returns all items.
440
+     *
441
+     * @since 1.0.19
442
+     * @return GetPaid_Form_Item[]
443
+     */
444
+    public function get_items() {
445
+        return $this->items;
446
+    }
447
+
448
+    /*
449 449
 	|--------------------------------------------------------------------------
450 450
 	| Taxes
451 451
 	|--------------------------------------------------------------------------
@@ -454,128 +454,128 @@  discard block
 block discarded – undo
454 454
 	| or only one-time.
455 455
     */
456 456
 
457
-	/**
458
-	 * Prepares the submission's taxes.
459
-	 *
460
-	 * @since 1.0.19
461
-	 */
462
-	public function process_taxes() {
463
-
464
-		// Abort if we're not using taxes.
465
-		if ( ! $this->use_taxes() ) {
466
-			return;
467
-		}
468
-
469
-		// If a custom country && state has been passed in, use it to calculate taxes.
470
-		$country = $this->get_field( 'wpinv_country', 'billing' );
471
-		if ( ! empty( $country ) ) {
472
-			$this->country = $country;
473
-		}
474
-
475
-		$state = $this->get_field( 'wpinv_state', 'billing' );
476
-		if ( ! empty( $state ) ) {
477
-			$this->state = $state;
478
-		}
479
-
480
-		// Confirm if the provided country and the ip country are similar.
481
-		$address_confirmed = $this->get_field( 'confirm-address' );
482
-		if ( wpinv_should_validate_vat_number() && getpaid_get_ip_country() != $this->country && empty( $address_confirmed ) ) {
483
-			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' ) );
484
-		}
485
-
486
-		// Abort if the country is not taxable.
487
-		if ( ! wpinv_is_country_taxable( $this->country ) ) {
488
-			return;
489
-		}
490
-
491
-		$processor = new GetPaid_Payment_Form_Submission_Taxes( $this );
492
-
493
-		foreach ( $processor->taxes as $tax ) {
494
-			$this->add_tax( $tax );
495
-		}
496
-
497
-		do_action_ref_array( 'getpaid_submissions_process_taxes', array( &$this ) );
498
-	}
499
-
500
-	/**
501
-	 * Adds a tax to the submission.
502
-	 *
503
-	 * @param array $tax An array of tax details. name, initial_tax, and recurring_tax are required.
504
-	 * @since 1.0.19
505
-	 */
506
-	public function add_tax( $tax ) {
507
-
508
-		if ( wpinv_round_tax_per_tax_rate() ) {
509
-			$tax['initial_tax']   = wpinv_round_amount( $tax['initial_tax'] );
510
-			$tax['recurring_tax'] = wpinv_round_amount( $tax['recurring_tax'] );
511
-		}
512
-
513
-		$this->taxes[ $tax['name'] ]         = $tax;
514
-		$this->totals['taxes']['initial']   += wpinv_sanitize_amount( $tax['initial_tax'] );
515
-		$this->totals['taxes']['recurring'] += wpinv_sanitize_amount( $tax['recurring_tax'] );
516
-
517
-	}
518
-
519
-	/**
520
-	 * Removes a specific tax.
521
-	 *
522
-	 * @since 1.0.19
523
-	 */
524
-	public function remove_tax( $tax_name ) {
525
-
526
-		if ( isset( $this->taxes[ $tax_name ] ) ) {
527
-			$this->totals['taxes']['initial']   -= $this->taxes[ $tax_name ]['initial_tax'];
528
-			$this->totals['taxes']['recurring'] -= $this->taxes[ $tax_name ]['recurring_tax'];
529
-			unset( $this->taxes[ $tax_name ] );
530
-		}
531
-
532
-	}
533
-
534
-	/**
535
-	 * Whether or not we'll use taxes for the submission.
536
-	 *
537
-	 * @since 1.0.19
538
-	 */
539
-	public function use_taxes() {
540
-
541
-		$use_taxes = wpinv_use_taxes();
542
-
543
-		if ( $this->has_invoice() && ! $this->invoice->is_taxable() ) {
544
-			$use_taxes = false;
545
-		}
546
-
547
-		return apply_filters( 'getpaid_submission_use_taxes', $use_taxes, $this );
548
-
549
-	}
550
-
551
-	/**
552
-	 * Returns the tax.
553
-	 *
554
-	 * @since 1.0.19
555
-	 */
556
-	public function get_tax() {
557
-		return $this->totals['taxes']['initial'];
558
-	}
559
-
560
-	/**
561
-	 * Returns the recurring tax.
562
-	 *
563
-	 * @since 1.0.19
564
-	 */
565
-	public function get_recurring_tax() {
566
-		return $this->totals['taxes']['recurring'];
567
-	}
568
-
569
-	/**
570
-	 * Returns all taxes.
571
-	 *
572
-	 * @since 1.0.19
573
-	 */
574
-	public function get_taxes() {
575
-		return $this->taxes;
576
-	}
577
-
578
-	/*
457
+    /**
458
+     * Prepares the submission's taxes.
459
+     *
460
+     * @since 1.0.19
461
+     */
462
+    public function process_taxes() {
463
+
464
+        // Abort if we're not using taxes.
465
+        if ( ! $this->use_taxes() ) {
466
+            return;
467
+        }
468
+
469
+        // If a custom country && state has been passed in, use it to calculate taxes.
470
+        $country = $this->get_field( 'wpinv_country', 'billing' );
471
+        if ( ! empty( $country ) ) {
472
+            $this->country = $country;
473
+        }
474
+
475
+        $state = $this->get_field( 'wpinv_state', 'billing' );
476
+        if ( ! empty( $state ) ) {
477
+            $this->state = $state;
478
+        }
479
+
480
+        // Confirm if the provided country and the ip country are similar.
481
+        $address_confirmed = $this->get_field( 'confirm-address' );
482
+        if ( wpinv_should_validate_vat_number() && getpaid_get_ip_country() != $this->country && empty( $address_confirmed ) ) {
483
+            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' ) );
484
+        }
485
+
486
+        // Abort if the country is not taxable.
487
+        if ( ! wpinv_is_country_taxable( $this->country ) ) {
488
+            return;
489
+        }
490
+
491
+        $processor = new GetPaid_Payment_Form_Submission_Taxes( $this );
492
+
493
+        foreach ( $processor->taxes as $tax ) {
494
+            $this->add_tax( $tax );
495
+        }
496
+
497
+        do_action_ref_array( 'getpaid_submissions_process_taxes', array( &$this ) );
498
+    }
499
+
500
+    /**
501
+     * Adds a tax to the submission.
502
+     *
503
+     * @param array $tax An array of tax details. name, initial_tax, and recurring_tax are required.
504
+     * @since 1.0.19
505
+     */
506
+    public function add_tax( $tax ) {
507
+
508
+        if ( wpinv_round_tax_per_tax_rate() ) {
509
+            $tax['initial_tax']   = wpinv_round_amount( $tax['initial_tax'] );
510
+            $tax['recurring_tax'] = wpinv_round_amount( $tax['recurring_tax'] );
511
+        }
512
+
513
+        $this->taxes[ $tax['name'] ]         = $tax;
514
+        $this->totals['taxes']['initial']   += wpinv_sanitize_amount( $tax['initial_tax'] );
515
+        $this->totals['taxes']['recurring'] += wpinv_sanitize_amount( $tax['recurring_tax'] );
516
+
517
+    }
518
+
519
+    /**
520
+     * Removes a specific tax.
521
+     *
522
+     * @since 1.0.19
523
+     */
524
+    public function remove_tax( $tax_name ) {
525
+
526
+        if ( isset( $this->taxes[ $tax_name ] ) ) {
527
+            $this->totals['taxes']['initial']   -= $this->taxes[ $tax_name ]['initial_tax'];
528
+            $this->totals['taxes']['recurring'] -= $this->taxes[ $tax_name ]['recurring_tax'];
529
+            unset( $this->taxes[ $tax_name ] );
530
+        }
531
+
532
+    }
533
+
534
+    /**
535
+     * Whether or not we'll use taxes for the submission.
536
+     *
537
+     * @since 1.0.19
538
+     */
539
+    public function use_taxes() {
540
+
541
+        $use_taxes = wpinv_use_taxes();
542
+
543
+        if ( $this->has_invoice() && ! $this->invoice->is_taxable() ) {
544
+            $use_taxes = false;
545
+        }
546
+
547
+        return apply_filters( 'getpaid_submission_use_taxes', $use_taxes, $this );
548
+
549
+    }
550
+
551
+    /**
552
+     * Returns the tax.
553
+     *
554
+     * @since 1.0.19
555
+     */
556
+    public function get_tax() {
557
+        return $this->totals['taxes']['initial'];
558
+    }
559
+
560
+    /**
561
+     * Returns the recurring tax.
562
+     *
563
+     * @since 1.0.19
564
+     */
565
+    public function get_recurring_tax() {
566
+        return $this->totals['taxes']['recurring'];
567
+    }
568
+
569
+    /**
570
+     * Returns all taxes.
571
+     *
572
+     * @since 1.0.19
573
+     */
574
+    public function get_taxes() {
575
+        return $this->taxes;
576
+    }
577
+
578
+    /*
579 579
 	|--------------------------------------------------------------------------
580 580
 	| Discounts
581 581
 	|--------------------------------------------------------------------------
@@ -584,99 +584,99 @@  discard block
 block discarded – undo
584 584
 	| or only one-time. They also do not have to come from a discount code.
585 585
     */
586 586
 
587
-	/**
588
-	 * Prepares the submission's discount.
589
-	 *
590
-	 * @since 1.0.19
591
-	 */
592
-	public function process_discount() {
593
-
594
-		$initial_total    = $this->get_subtotal() + $this->get_fee() + $this->get_tax();
595
-		$recurring_total  = $this->get_recurring_subtotal() + $this->get_recurring_fee() + $this->get_recurring_tax();
596
-		$processor        = new GetPaid_Payment_Form_Submission_Discount( $this, $initial_total, $recurring_total );
597
-
598
-		foreach ( $processor->discounts as $discount ) {
599
-			$this->add_discount( $discount );
600
-		}
601
-
602
-		do_action_ref_array( 'getpaid_submissions_process_discounts', array( &$this ) );
603
-	}
604
-
605
-	/**
606
-	 * Adds a discount to the submission.
607
-	 *
608
-	 * @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.
609
-	 * @since 1.0.19
610
-	 */
611
-	public function add_discount( $discount ) {
612
-		$this->discounts[ $discount['name'] ]   = $discount;
613
-		$this->totals['discount']['initial']   += wpinv_sanitize_amount( $discount['initial_discount'] );
614
-		$this->totals['discount']['recurring'] += wpinv_sanitize_amount( $discount['recurring_discount'] );
615
-	}
616
-
617
-	/**
618
-	 * Removes a discount from the submission.
619
-	 *
620
-	 * @since 1.0.19
621
-	 */
622
-	public function remove_discount( $name ) {
623
-
624
-		if ( isset( $this->discounts[ $name ] ) ) {
625
-			$this->totals['discount']['initial']   -= $this->discounts[ $name ]['initial_discount'];
626
-			$this->totals['discount']['recurring'] -= $this->discounts[ $name ]['recurring_discount'];
627
-			unset( $this->discounts[ $name ] );
628
-		}
629
-
630
-	}
631
-
632
-	/**
633
-	 * Checks whether there is a discount code associated with this submission.
634
-	 *
635
-	 * @since 1.0.19
636
-	 * @return bool
637
-	 */
638
-	public function has_discount_code() {
639
-		return ! empty( $this->discounts['discount_code'] );
640
-	}
641
-
642
-	/**
643
-	 * Returns the discount code.
644
-	 *
645
-	 * @since 1.0.19
646
-	 * @return string
647
-	 */
648
-	public function get_discount_code() {
649
-		return $this->has_discount_code() ? $this->discounts['discount_code']['discount_code'] : '';
650
-	}
651
-
652
-	/**
653
-	 * Returns the discount.
654
-	 *
655
-	 * @since 1.0.19
656
-	 */
657
-	public function get_discount() {
658
-		return $this->totals['discount']['initial'];
659
-	}
660
-
661
-	/**
662
-	 * Returns the recurring discount.
663
-	 *
664
-	 * @since 1.0.19
665
-	 */
666
-	public function get_recurring_discount() {
667
-		return $this->totals['discount']['recurring'];
668
-	}
669
-
670
-	/**
671
-	 * Returns all discounts.
672
-	 *
673
-	 * @since 1.0.19
674
-	 */
675
-	public function get_discounts() {
676
-		return $this->discounts;
677
-	}
678
-
679
-	/*
587
+    /**
588
+     * Prepares the submission's discount.
589
+     *
590
+     * @since 1.0.19
591
+     */
592
+    public function process_discount() {
593
+
594
+        $initial_total    = $this->get_subtotal() + $this->get_fee() + $this->get_tax();
595
+        $recurring_total  = $this->get_recurring_subtotal() + $this->get_recurring_fee() + $this->get_recurring_tax();
596
+        $processor        = new GetPaid_Payment_Form_Submission_Discount( $this, $initial_total, $recurring_total );
597
+
598
+        foreach ( $processor->discounts as $discount ) {
599
+            $this->add_discount( $discount );
600
+        }
601
+
602
+        do_action_ref_array( 'getpaid_submissions_process_discounts', array( &$this ) );
603
+    }
604
+
605
+    /**
606
+     * Adds a discount to the submission.
607
+     *
608
+     * @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.
609
+     * @since 1.0.19
610
+     */
611
+    public function add_discount( $discount ) {
612
+        $this->discounts[ $discount['name'] ]   = $discount;
613
+        $this->totals['discount']['initial']   += wpinv_sanitize_amount( $discount['initial_discount'] );
614
+        $this->totals['discount']['recurring'] += wpinv_sanitize_amount( $discount['recurring_discount'] );
615
+    }
616
+
617
+    /**
618
+     * Removes a discount from the submission.
619
+     *
620
+     * @since 1.0.19
621
+     */
622
+    public function remove_discount( $name ) {
623
+
624
+        if ( isset( $this->discounts[ $name ] ) ) {
625
+            $this->totals['discount']['initial']   -= $this->discounts[ $name ]['initial_discount'];
626
+            $this->totals['discount']['recurring'] -= $this->discounts[ $name ]['recurring_discount'];
627
+            unset( $this->discounts[ $name ] );
628
+        }
629
+
630
+    }
631
+
632
+    /**
633
+     * Checks whether there is a discount code associated with this submission.
634
+     *
635
+     * @since 1.0.19
636
+     * @return bool
637
+     */
638
+    public function has_discount_code() {
639
+        return ! empty( $this->discounts['discount_code'] );
640
+    }
641
+
642
+    /**
643
+     * Returns the discount code.
644
+     *
645
+     * @since 1.0.19
646
+     * @return string
647
+     */
648
+    public function get_discount_code() {
649
+        return $this->has_discount_code() ? $this->discounts['discount_code']['discount_code'] : '';
650
+    }
651
+
652
+    /**
653
+     * Returns the discount.
654
+     *
655
+     * @since 1.0.19
656
+     */
657
+    public function get_discount() {
658
+        return $this->totals['discount']['initial'];
659
+    }
660
+
661
+    /**
662
+     * Returns the recurring discount.
663
+     *
664
+     * @since 1.0.19
665
+     */
666
+    public function get_recurring_discount() {
667
+        return $this->totals['discount']['recurring'];
668
+    }
669
+
670
+    /**
671
+     * Returns all discounts.
672
+     *
673
+     * @since 1.0.19
674
+     */
675
+    public function get_discounts() {
676
+        return $this->discounts;
677
+    }
678
+
679
+    /*
680 680
 	|--------------------------------------------------------------------------
681 681
 	| Fees
682 682
 	|--------------------------------------------------------------------------
@@ -686,89 +686,89 @@  discard block
 block discarded – undo
686 686
 	| fees.
687 687
     */
688 688
 
689
-	/**
690
-	 * Prepares the submission's fees.
691
-	 *
692
-	 * @since 1.0.19
693
-	 */
694
-	public function process_fees() {
695
-
696
-		$fees_processor = new GetPaid_Payment_Form_Submission_Fees( $this );
697
-
698
-		foreach ( $fees_processor->fees as $fee ) {
699
-			$this->add_fee( $fee );
700
-		}
701
-
702
-		do_action_ref_array( 'getpaid_submissions_process_fees', array( &$this ) );
703
-	}
704
-
705
-	/**
706
-	 * Adds a fee to the submission.
707
-	 *
708
-	 * @param array $fee An array of fee details. name, initial_fee, and recurring_fee are required.
709
-	 * @since 1.0.19
710
-	 */
711
-	public function add_fee( $fee ) {
712
-
713
-		$this->fees[ $fee['name'] ]         = $fee;
714
-		$this->totals['fees']['initial']   += wpinv_sanitize_amount( $fee['initial_fee'] );
715
-		$this->totals['fees']['recurring'] += wpinv_sanitize_amount( $fee['recurring_fee'] );
716
-
717
-	}
718
-
719
-	/**
720
-	 * Removes a fee from the submission.
721
-	 *
722
-	 * @since 1.0.19
723
-	 */
724
-	public function remove_fee( $name ) {
725
-
726
-		if ( isset( $this->fees[ $name ] ) ) {
727
-			$this->totals['fees']['initial']   -= $this->fees[ $name ]['initial_fee'];
728
-			$this->totals['fees']['recurring'] -= $this->fees[ $name ]['recurring_fee'];
729
-			unset( $this->fees[ $name ] );
730
-		}
731
-
732
-	}
733
-
734
-	/**
735
-	 * Returns the fees.
736
-	 *
737
-	 * @since 1.0.19
738
-	 */
739
-	public function get_fee() {
740
-		return $this->totals['fees']['initial'];
741
-	}
742
-
743
-	/**
744
-	 * Returns the recurring fees.
745
-	 *
746
-	 * @since 1.0.19
747
-	 */
748
-	public function get_recurring_fee() {
749
-		return $this->totals['fees']['recurring'];
750
-	}
751
-
752
-	/**
753
-	 * Returns all fees.
754
-	 *
755
-	 * @since 1.0.19
756
-	 */
757
-	public function get_fees() {
758
-		return $this->fees;
759
-	}
760
-
761
-	/**
762
-	 * Checks if there are any fees for the form.
763
-	 *
764
-	 * @return bool
765
-	 * @since 1.0.19
766
-	 */
767
-	public function has_fees() {
768
-		return count( $this->fees ) !== 0;
769
-	}
770
-
771
-	/*
689
+    /**
690
+     * Prepares the submission's fees.
691
+     *
692
+     * @since 1.0.19
693
+     */
694
+    public function process_fees() {
695
+
696
+        $fees_processor = new GetPaid_Payment_Form_Submission_Fees( $this );
697
+
698
+        foreach ( $fees_processor->fees as $fee ) {
699
+            $this->add_fee( $fee );
700
+        }
701
+
702
+        do_action_ref_array( 'getpaid_submissions_process_fees', array( &$this ) );
703
+    }
704
+
705
+    /**
706
+     * Adds a fee to the submission.
707
+     *
708
+     * @param array $fee An array of fee details. name, initial_fee, and recurring_fee are required.
709
+     * @since 1.0.19
710
+     */
711
+    public function add_fee( $fee ) {
712
+
713
+        $this->fees[ $fee['name'] ]         = $fee;
714
+        $this->totals['fees']['initial']   += wpinv_sanitize_amount( $fee['initial_fee'] );
715
+        $this->totals['fees']['recurring'] += wpinv_sanitize_amount( $fee['recurring_fee'] );
716
+
717
+    }
718
+
719
+    /**
720
+     * Removes a fee from the submission.
721
+     *
722
+     * @since 1.0.19
723
+     */
724
+    public function remove_fee( $name ) {
725
+
726
+        if ( isset( $this->fees[ $name ] ) ) {
727
+            $this->totals['fees']['initial']   -= $this->fees[ $name ]['initial_fee'];
728
+            $this->totals['fees']['recurring'] -= $this->fees[ $name ]['recurring_fee'];
729
+            unset( $this->fees[ $name ] );
730
+        }
731
+
732
+    }
733
+
734
+    /**
735
+     * Returns the fees.
736
+     *
737
+     * @since 1.0.19
738
+     */
739
+    public function get_fee() {
740
+        return $this->totals['fees']['initial'];
741
+    }
742
+
743
+    /**
744
+     * Returns the recurring fees.
745
+     *
746
+     * @since 1.0.19
747
+     */
748
+    public function get_recurring_fee() {
749
+        return $this->totals['fees']['recurring'];
750
+    }
751
+
752
+    /**
753
+     * Returns all fees.
754
+     *
755
+     * @since 1.0.19
756
+     */
757
+    public function get_fees() {
758
+        return $this->fees;
759
+    }
760
+
761
+    /**
762
+     * Checks if there are any fees for the form.
763
+     *
764
+     * @return bool
765
+     * @since 1.0.19
766
+     */
767
+    public function has_fees() {
768
+        return count( $this->fees ) !== 0;
769
+    }
770
+
771
+    /*
772 772
 	|--------------------------------------------------------------------------
773 773
 	| MISC
774 774
 	|--------------------------------------------------------------------------
@@ -776,119 +776,119 @@  discard block
 block discarded – undo
776 776
 	| Extra submission functions.
777 777
     */
778 778
 
779
-	/**
780
-	 * Checks if this is the initial fetch.
781
-	 *
782
-	 * @return bool
783
-	 * @since 1.0.19
784
-	 */
785
-	public function is_initial_fetch() {
786
-		return empty( $this->data['initial_state'] );
787
-	}
788
-
789
-	/**
790
-	 * Returns the total amount to collect for this submission.
791
-	 *
792
-	 * @since 1.0.19
793
-	 */
794
-	public function get_total() {
795
-		$total = $this->get_subtotal() + $this->get_fee() + $this->get_tax() - $this->get_discount();
796
-		return max( $total, 0 );
797
-	}
798
-
799
-	/**
800
-	 * Returns the recurring total amount to collect for this submission.
801
-	 *
802
-	 * @since 1.0.19
803
-	 */
804
-	public function get_recurring_total() {
805
-		$total = $this->get_recurring_subtotal() + $this->get_recurring_fee() + $this->get_recurring_tax() - $this->get_recurring_discount();
806
-		return max( $total, 0 );
807
-	}
808
-
809
-	/**
810
-	 * Whether payment details should be collected for this submission.
811
-	 *
812
-	 * @since 1.0.19
813
-	 */
814
-	public function should_collect_payment_details() {
815
-		$initial   = $this->get_total();
816
-		$recurring = $this->get_recurring_total();
817
-
818
-		if ( $this->has_recurring == 0 ) {
819
-			$recurring = 0;
820
-		}
821
-
822
-		$collect = $initial > 0 || $recurring > 0;
823
-		return apply_filters( 'getpaid_submission_should_collect_payment_details', $collect, $this  );
824
-	}
825
-
826
-	/**
827
-	 * Returns the billing email of the user.
828
-	 *
829
-	 * @since 1.0.19
830
-	 */
831
-	public function get_billing_email() {
832
-		return apply_filters( 'getpaid_get_submission_billing_email', $this->get_field( 'billing_email' ), $this  );
833
-	}
834
-
835
-	/**
836
-	 * Checks if the submitter has a billing email.
837
-	 *
838
-	 * @since 1.0.19
839
-	 */
840
-	public function has_billing_email() {
841
-		$billing_email = $this->get_billing_email();
842
-		return ! empty( $billing_email ) && is_email( $billing_email );
843
-	}
844
-
845
-	/**
846
-	 * Returns the appropriate currency for the submission.
847
-	 *
848
-	 * @since 1.0.19
849
-	 * @return string
850
-	 */
851
-	public function get_currency() {
852
-		return $this->has_invoice() ? $this->invoice->get_currency() : wpinv_get_currency();
853
-    }
854
-
855
-    /**
856
-	 * Returns the raw submission data.
857
-	 *
858
-	 * @since 1.0.19
859
-	 * @return array
860
-	 */
861
-	public function get_data() {
862
-		return $this->data;
863
-	}
864
-
865
-	/**
866
-	 * Returns a field from the submission data
867
-	 *
868
-	 * @param string $field
869
-	 * @since 1.0.19
870
-	 * @return mixed|null
871
-	 */
872
-	public function get_field( $field, $sub_array_key = null ) {
873
-		return getpaid_get_array_field( $this->data, $field, $sub_array_key );
874
-	}
875
-
876
-	/**
877
-	 * Checks if a required field is set.
878
-	 *
879
-	 * @since 1.0.19
880
-	 */
881
-	public function is_required_field_set( $field ) {
882
-		return empty( $field['required'] ) || ! empty( $this->data[ $field['id'] ] );
883
-	}
884
-
885
-	/**
886
-	 * Formats an amount
887
-	 *
888
-	 * @since 1.0.19
889
-	 */
890
-	public function format_amount( $amount ) {
891
-		return wpinv_price( $amount, $this->get_currency() );
892
-	}
779
+    /**
780
+     * Checks if this is the initial fetch.
781
+     *
782
+     * @return bool
783
+     * @since 1.0.19
784
+     */
785
+    public function is_initial_fetch() {
786
+        return empty( $this->data['initial_state'] );
787
+    }
788
+
789
+    /**
790
+     * Returns the total amount to collect for this submission.
791
+     *
792
+     * @since 1.0.19
793
+     */
794
+    public function get_total() {
795
+        $total = $this->get_subtotal() + $this->get_fee() + $this->get_tax() - $this->get_discount();
796
+        return max( $total, 0 );
797
+    }
798
+
799
+    /**
800
+     * Returns the recurring total amount to collect for this submission.
801
+     *
802
+     * @since 1.0.19
803
+     */
804
+    public function get_recurring_total() {
805
+        $total = $this->get_recurring_subtotal() + $this->get_recurring_fee() + $this->get_recurring_tax() - $this->get_recurring_discount();
806
+        return max( $total, 0 );
807
+    }
808
+
809
+    /**
810
+     * Whether payment details should be collected for this submission.
811
+     *
812
+     * @since 1.0.19
813
+     */
814
+    public function should_collect_payment_details() {
815
+        $initial   = $this->get_total();
816
+        $recurring = $this->get_recurring_total();
817
+
818
+        if ( $this->has_recurring == 0 ) {
819
+            $recurring = 0;
820
+        }
821
+
822
+        $collect = $initial > 0 || $recurring > 0;
823
+        return apply_filters( 'getpaid_submission_should_collect_payment_details', $collect, $this  );
824
+    }
825
+
826
+    /**
827
+     * Returns the billing email of the user.
828
+     *
829
+     * @since 1.0.19
830
+     */
831
+    public function get_billing_email() {
832
+        return apply_filters( 'getpaid_get_submission_billing_email', $this->get_field( 'billing_email' ), $this  );
833
+    }
834
+
835
+    /**
836
+     * Checks if the submitter has a billing email.
837
+     *
838
+     * @since 1.0.19
839
+     */
840
+    public function has_billing_email() {
841
+        $billing_email = $this->get_billing_email();
842
+        return ! empty( $billing_email ) && is_email( $billing_email );
843
+    }
844
+
845
+    /**
846
+     * Returns the appropriate currency for the submission.
847
+     *
848
+     * @since 1.0.19
849
+     * @return string
850
+     */
851
+    public function get_currency() {
852
+        return $this->has_invoice() ? $this->invoice->get_currency() : wpinv_get_currency();
853
+    }
854
+
855
+    /**
856
+     * Returns the raw submission data.
857
+     *
858
+     * @since 1.0.19
859
+     * @return array
860
+     */
861
+    public function get_data() {
862
+        return $this->data;
863
+    }
864
+
865
+    /**
866
+     * Returns a field from the submission data
867
+     *
868
+     * @param string $field
869
+     * @since 1.0.19
870
+     * @return mixed|null
871
+     */
872
+    public function get_field( $field, $sub_array_key = null ) {
873
+        return getpaid_get_array_field( $this->data, $field, $sub_array_key );
874
+    }
875
+
876
+    /**
877
+     * Checks if a required field is set.
878
+     *
879
+     * @since 1.0.19
880
+     */
881
+    public function is_required_field_set( $field ) {
882
+        return empty( $field['required'] ) || ! empty( $this->data[ $field['id'] ] );
883
+    }
884
+
885
+    /**
886
+     * Formats an amount
887
+     *
888
+     * @since 1.0.19
889
+     */
890
+    public function format_amount( $amount ) {
891
+        return wpinv_price( $amount, $this->get_currency() );
892
+    }
893 893
 
894 894
 }
Please login to merge, or discard this patch.
includes/payments/class-getpaid-payment-exception.php 1 patch
Indentation   +41 added lines, -41 removed lines patch added patch discarded remove patch
@@ -14,51 +14,51 @@
 block discarded – undo
14 14
  */
15 15
 class GetPaid_Payment_Exception extends Exception {
16 16
 
17
-	/**
18
-	 * Sanitized error code.
19
-	 *
20
-	 * @var string
21
-	 */
22
-	protected $error_code;
17
+    /**
18
+     * Sanitized error code.
19
+     *
20
+     * @var string
21
+     */
22
+    protected $error_code;
23 23
 
24
-	/**
25
-	 * Error extra data.
26
-	 *
27
-	 * @var array
28
-	 */
29
-	protected $error_data;
24
+    /**
25
+     * Error extra data.
26
+     *
27
+     * @var array
28
+     */
29
+    protected $error_data;
30 30
 
31
-	/**
32
-	 * Setup exception.
33
-	 *
34
-	 * @param string $code             Machine-readable error code, e.g `getpaid-discount-error`.
35
-	 * @param string $message          User-friendly translated error message, e.g. 'Discount is invalid'.
36
-	 * @param int    $http_status_code Proper HTTP status code to respond with, e.g. 400.
37
-	 * @param array  $data             Extra error data.
38
-	 */
39
-	public function __construct( $code, $message, $http_status_code = 400, $data = array() ) {
40
-		$this->error_code = $code;
41
-		$this->error_data = array_merge( array( 'status' => $http_status_code ), $data );
31
+    /**
32
+     * Setup exception.
33
+     *
34
+     * @param string $code             Machine-readable error code, e.g `getpaid-discount-error`.
35
+     * @param string $message          User-friendly translated error message, e.g. 'Discount is invalid'.
36
+     * @param int    $http_status_code Proper HTTP status code to respond with, e.g. 400.
37
+     * @param array  $data             Extra error data.
38
+     */
39
+    public function __construct( $code, $message, $http_status_code = 400, $data = array() ) {
40
+        $this->error_code = $code;
41
+        $this->error_data = array_merge( array( 'status' => $http_status_code ), $data );
42 42
 
43
-		parent::__construct( $message, $http_status_code );
44
-	}
43
+        parent::__construct( $message, $http_status_code );
44
+    }
45 45
 
46
-	/**
47
-	 * Returns the error code.
48
-	 *
49
-	 * @return string
50
-	 */
51
-	public function getErrorCode() {
52
-		return $this->error_code;
53
-	}
46
+    /**
47
+     * Returns the error code.
48
+     *
49
+     * @return string
50
+     */
51
+    public function getErrorCode() {
52
+        return $this->error_code;
53
+    }
54 54
 
55
-	/**
56
-	 * Returns error data.
57
-	 *
58
-	 * @return array
59
-	 */
60
-	public function getErrorData() {
61
-		return $this->error_data;
62
-	}
55
+    /**
56
+     * Returns error data.
57
+     *
58
+     * @return array
59
+     */
60
+    public function getErrorData() {
61
+        return $this->error_data;
62
+    }
63 63
 
64 64
 }
Please login to merge, or discard this patch.
includes/payments/class-getpaid-payment-form-submission-discount.php 1 patch
Indentation   +154 added lines, -154 removed lines patch added patch discarded remove patch
@@ -12,162 +12,162 @@
 block discarded – undo
12 12
  */
13 13
 class GetPaid_Payment_Form_Submission_Discount {
14 14
 
15
-	/**
16
-	 * Submission discounts.
17
-	 * @var array
18
-	 */
19
-	public $discounts = array();
15
+    /**
16
+     * Submission discounts.
17
+     * @var array
18
+     */
19
+    public $discounts = array();
20
+
21
+    /**
22
+     * Class constructor
23
+     *
24
+     * @param GetPaid_Payment_Form_Submission $submission
25
+     * @param float                           $initial_total
26
+     * @param float                           $recurring_total
27
+     */
28
+    public function __construct( $submission, $initial_total, $recurring_total ) {
29
+
30
+        // Process any existing invoice discounts.
31
+        if ( $submission->has_invoice() ) {
32
+            $this->discounts = $submission->get_invoice()->get_discounts();
33
+        }
34
+
35
+        // Do we have a discount?
36
+        $discount = $submission->get_field( 'discount' );
37
+
38
+        if ( empty( $discount ) ) {
39
+
40
+            if ( isset( $this->discounts['discount_code'] ) ) {
41
+                unset( $this->discounts['discount_code'] );
42
+            }
43
+
44
+            return;
45
+        }
46
+
47
+        // Processes the discount code.
48
+        $amount = max( $initial_total, $recurring_total );
49
+        $this->process_discount( $submission, $discount, $amount );
50
+
51
+    }
20 52
 
21 53
     /**
22
-	 * Class constructor
23
-	 *
24
-	 * @param GetPaid_Payment_Form_Submission $submission
25
-	 * @param float                           $initial_total
26
-	 * @param float                           $recurring_total
27
-	 */
28
-	public function __construct( $submission, $initial_total, $recurring_total ) {
29
-
30
-		// Process any existing invoice discounts.
31
-		if ( $submission->has_invoice() ) {
32
-			$this->discounts = $submission->get_invoice()->get_discounts();
33
-		}
34
-
35
-		// Do we have a discount?
36
-		$discount = $submission->get_field( 'discount' );
37
-
38
-		if ( empty( $discount ) ) {
39
-
40
-			if ( isset( $this->discounts['discount_code'] ) ) {
41
-				unset( $this->discounts['discount_code'] );
42
-			}
43
-
44
-			return;
45
-		}
46
-
47
-		// Processes the discount code.
48
-		$amount = max( $initial_total, $recurring_total );
49
-		$this->process_discount( $submission, $discount, $amount );
50
-
51
-	}
52
-
53
-	/**
54
-	 * Processes a submission discount.
55
-	 *
56
-	 * @param GetPaid_Payment_Form_Submission $submission
57
-	 * @param string                          $discount
58
-	 * @param float                           $amount
59
-	 */
60
-	public function process_discount( $submission, $discount, $amount ) {
61
-
62
-		// Fetch the discount.
63
-		$discount = new WPInv_Discount( $discount );
64
-
65
-		// Ensure it is active.
54
+     * Processes a submission discount.
55
+     *
56
+     * @param GetPaid_Payment_Form_Submission $submission
57
+     * @param string                          $discount
58
+     * @param float                           $amount
59
+     */
60
+    public function process_discount( $submission, $discount, $amount ) {
61
+
62
+        // Fetch the discount.
63
+        $discount = new WPInv_Discount( $discount );
64
+
65
+        // Ensure it is active.
66 66
         if ( ! $this->is_discount_active( $discount ) ) {
67
-			throw new GetPaid_Payment_Exception( '.getpaid-discount-field .getpaid-custom-payment-form-errors', __( 'Invalid or expired discount code', 'invoicing' ) );
68
-		}
69
-
70
-		// Exceeded limit.
71
-		if ( $discount->has_exceeded_limit() ) {
72
-			throw new Exception( __( 'This discount code has been used up', 'invoicing' ) );
73
-		}
74
-
75
-		// Validate usages.
76
-		$this->validate_single_use_discount( $submission, $discount );
77
-
78
-		// Validate amount.
79
-		$this->validate_discount_amount( $submission, $discount, $amount );
80
-
81
-		// Save the discount.
82
-		$this->discounts['discount_code'] = $this->calculate_discount( $submission, $discount );
83
-	}
84
-
85
-	/**
86
-	 * Validates a single use discount.
87
-	 *
88
-	 * @param WPInv_Discount                  $discount
89
-	 * @return bool
90
-	 */
91
-	public function is_discount_active(  $discount ) {
92
-		return $discount->exists() && $discount->is_active() && $discount->has_started() && ! $discount->is_expired();
93
-	}
94
-
95
-	/**
96
-	 * Returns a user's id or email.
97
-	 *
98
-	 * @param string $email
99
-	 * @return int|string|false
100
-	 */
101
-	public function get_user_id_or_email( $email ) {
102
-
103
-		if ( is_user_logged_in() ) {
104
-			return get_current_user_id();
105
-		}
106
-
107
-		return empty( $email ) ? false : sanitize_email( $email );
108
-	}
109
-
110
-	/**
111
-	 * Validates a single use discount.
112
-	 *
113
-	 * @param GetPaid_Payment_Form_Submission $submission
114
-	 * @param WPInv_Discount                  $discount
115
-	 */
116
-	public function validate_single_use_discount( $submission, $discount ) {
117
-
118
-		// Abort if it is not a single use discount.
119
-		if ( ! $discount->is_single_use() ) {
120
-			return;
121
-		}
122
-
123
-		// Ensure there is a valid billing email.
124
-		$user = $this->get_user_id_or_email( $submission->get_billing_email() );
125
-
126
-		if ( empty( $user ) ) {
127
-			throw new Exception( __( 'You need to either log in or enter your billing email before applying this discount', 'invoicing' ) );
128
-		}
129
-
130
-		// Has the user used this discount code before?
131
-		if ( ! $discount->is_valid_for_user( $user ) ) {
132
-			throw new Exception( __( 'You have already used this discount', 'invoicing' ) );
133
-		}
134
-
135
-	}
136
-
137
-	/**
138
-	 * Validates the discount's amount.
139
-	 *
140
-	 * @param GetPaid_Payment_Form_Submission $submission
141
-	 * @param WPInv_Discount         $discount
142
-	 * @param float                  $amount
143
-	 */
144
-	public function validate_discount_amount( $submission, $discount, $amount ) {
145
-
146
-		// Validate minimum amount.
147
-		if ( ! $discount->is_minimum_amount_met( $amount ) ) {
148
-			$min = wpinv_price( $discount->get_minimum_total(), $submission->get_currency() );
149
-			throw new Exception( sprintf( __( 'The minimum total for using this discount is %s', 'invoicing' ), $min ) );
150
-		}
151
-
152
-		// Validate the maximum amount.
153
-		if ( ! $discount->is_maximum_amount_met( $amount ) ) {
154
-			$max = wpinv_price( $discount->get_maximum_total(), $submission->get_currency() );
155
-			throw new Exception( sprintf( __( 'The maximum total for using this discount is %s', 'invoicing' ), $max ) );
156
-		}
157
-
158
-	}
159
-
160
-	/**
161
-	 * Calculates the discount code's amount.
162
-	 *
163
-	 * Ensure that the discount exists and has been validated before calling this method.
164
-	 *
165
-	 * @param GetPaid_Payment_Form_Submission $submission
166
-	 * @param WPInv_Discount                  $discount
167
-	 * @return array
168
-	 */
169
-	public function calculate_discount( $submission, $discount ) {
170
-		return getpaid_calculate_invoice_discount( $submission, $discount );
171
-	}
67
+            throw new GetPaid_Payment_Exception( '.getpaid-discount-field .getpaid-custom-payment-form-errors', __( 'Invalid or expired discount code', 'invoicing' ) );
68
+        }
69
+
70
+        // Exceeded limit.
71
+        if ( $discount->has_exceeded_limit() ) {
72
+            throw new Exception( __( 'This discount code has been used up', 'invoicing' ) );
73
+        }
74
+
75
+        // Validate usages.
76
+        $this->validate_single_use_discount( $submission, $discount );
77
+
78
+        // Validate amount.
79
+        $this->validate_discount_amount( $submission, $discount, $amount );
80
+
81
+        // Save the discount.
82
+        $this->discounts['discount_code'] = $this->calculate_discount( $submission, $discount );
83
+    }
84
+
85
+    /**
86
+     * Validates a single use discount.
87
+     *
88
+     * @param WPInv_Discount                  $discount
89
+     * @return bool
90
+     */
91
+    public function is_discount_active(  $discount ) {
92
+        return $discount->exists() && $discount->is_active() && $discount->has_started() && ! $discount->is_expired();
93
+    }
94
+
95
+    /**
96
+     * Returns a user's id or email.
97
+     *
98
+     * @param string $email
99
+     * @return int|string|false
100
+     */
101
+    public function get_user_id_or_email( $email ) {
102
+
103
+        if ( is_user_logged_in() ) {
104
+            return get_current_user_id();
105
+        }
106
+
107
+        return empty( $email ) ? false : sanitize_email( $email );
108
+    }
109
+
110
+    /**
111
+     * Validates a single use discount.
112
+     *
113
+     * @param GetPaid_Payment_Form_Submission $submission
114
+     * @param WPInv_Discount                  $discount
115
+     */
116
+    public function validate_single_use_discount( $submission, $discount ) {
117
+
118
+        // Abort if it is not a single use discount.
119
+        if ( ! $discount->is_single_use() ) {
120
+            return;
121
+        }
122
+
123
+        // Ensure there is a valid billing email.
124
+        $user = $this->get_user_id_or_email( $submission->get_billing_email() );
125
+
126
+        if ( empty( $user ) ) {
127
+            throw new Exception( __( 'You need to either log in or enter your billing email before applying this discount', 'invoicing' ) );
128
+        }
129
+
130
+        // Has the user used this discount code before?
131
+        if ( ! $discount->is_valid_for_user( $user ) ) {
132
+            throw new Exception( __( 'You have already used this discount', 'invoicing' ) );
133
+        }
134
+
135
+    }
136
+
137
+    /**
138
+     * Validates the discount's amount.
139
+     *
140
+     * @param GetPaid_Payment_Form_Submission $submission
141
+     * @param WPInv_Discount         $discount
142
+     * @param float                  $amount
143
+     */
144
+    public function validate_discount_amount( $submission, $discount, $amount ) {
145
+
146
+        // Validate minimum amount.
147
+        if ( ! $discount->is_minimum_amount_met( $amount ) ) {
148
+            $min = wpinv_price( $discount->get_minimum_total(), $submission->get_currency() );
149
+            throw new Exception( sprintf( __( 'The minimum total for using this discount is %s', 'invoicing' ), $min ) );
150
+        }
151
+
152
+        // Validate the maximum amount.
153
+        if ( ! $discount->is_maximum_amount_met( $amount ) ) {
154
+            $max = wpinv_price( $discount->get_maximum_total(), $submission->get_currency() );
155
+            throw new Exception( sprintf( __( 'The maximum total for using this discount is %s', 'invoicing' ), $max ) );
156
+        }
157
+
158
+    }
159
+
160
+    /**
161
+     * Calculates the discount code's amount.
162
+     *
163
+     * Ensure that the discount exists and has been validated before calling this method.
164
+     *
165
+     * @param GetPaid_Payment_Form_Submission $submission
166
+     * @param WPInv_Discount                  $discount
167
+     * @return array
168
+     */
169
+    public function calculate_discount( $submission, $discount ) {
170
+        return getpaid_calculate_invoice_discount( $submission, $discount );
171
+    }
172 172
 
173 173
 }
Please login to merge, or discard this patch.