Completed
Branch BUG-9625-better-us-phone-valid... (e0ce21)
by
unknown
631:18 queued 616:37
created

EE_Checkout::log()   D

Complexity

Conditions 10
Paths 57

Size

Total Lines 38
Code Lines 29

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 10
eloc 29
nc 57
nop 5
dl 0
loc 38
rs 4.8196
c 0
b 0
f 0

How to fix   Complexity   

Long Method

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

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

Commonly applied refactorings include:

1
<?php if ( ! defined('EVENT_ESPRESSO_VERSION')) { exit('No direct script access allowed'); }
2
 /**
3
 *
4
 * Class EE_Checkout
5
 *
6
 * Description
7
 *
8
 * @package 			Event Espresso
9
 * @subpackage    core
10
 * @author				Brent Christensen
11
 * @since 				4.5.0
12
 *
13
 */
14
class EE_Checkout {
15
16
	/**
17
	 * 	whether current request originated from the EE admin
18
	 * @type bool
19
	 */
20
	public $admin_request = FALSE;
21
22
	/**
23
	 * whether returning to edit attendee information or to retry a payment
24
	 * @type bool
25
	 */
26
	public $revisit = FALSE;
27
28
	/**
29
	 * whether the primary registrant is returning to edit attendee information or to retry a payment
30
	 * @type bool
31
	 */
32
	public $primary_revisit = FALSE;
33
34
	/**
35
	 * is registration allowed to progress or halted for some reason such as failing to pass recaptcha?
36
	 * @type bool
37
	 */
38
	public $continue_reg = TRUE;
39
40
	/**
41
	 * redirect to thank you page ?
42
	 * @type bool
43
	 */
44
	public $redirect = FALSE;
45
46
	/**
47
	 * generate the reg form or not ?
48
	 * @type bool
49
	 */
50
	public $generate_reg_form = TRUE;
51
52
	/**
53
	 * process a reg form submission or not ?
54
	 * @type bool
55
	 */
56
	public $process_form_submission = FALSE;
57
58
	/**
59
	 * tracks whether the TXN status modified during this checkout
60
	 *
61
	 * @type bool
62
	 */
63
	public $txn_status_updated = FALSE;
64
65
	/**
66
	 * only triggered to true after absolutely everything has finished.
67
	 *
68
	 * @type bool
69
	 */
70
	protected $exit_spco = FALSE;
71
72
	/**
73
	 * tracks whether any of the TXN's Registrations statuses modified during this checkout
74
	 * indexed by registration ID
75
	 *
76
	 * @type array
77
	 */
78
	protected $reg_status_updated = array();
79
80
	/**
81
	 * total number of tickets that were in the cart
82
	 * @type int
83
	 */
84
	public $total_ticket_count = 0;
85
86
	/**
87
	 * corresponds loosely to EE_Transaction::remaining()
88
	 * but can be modified by SPCO
89
	 *
90
	 * @type float
91
	 */
92
	public $amount_owing = 0;
93
94
	/**
95
	 * the reg step slug from the incoming request
96
	 * @type string
97
	 */
98
	public $step = '';
99
100
	/**
101
	 * the reg step slug for a step being edited
102
	 * @type string
103
	 */
104
	public $edit_step = '';
105
106
	/**
107
	 * the action being performed on the current step
108
	 * @type string
109
	 */
110
	public $action = '';
111
112
	/**
113
	 * reg_url_link for a previously saved registration
114
	 * @type string
115
	 */
116
	public $reg_url_link = '';
117
118
	/**
119
	 * string slug for the payment method that was selected during the payment options step
120
	 * @type string
121
	 */
122
	public $selected_method_of_payment = '';
123
124
	/**
125
	 * base url for the site's registration checkout page - additional url params will be added to this
126
	 * @type string
127
	 */
128
	public $reg_page_base_url = '';
129
130
	/**
131
	 * base url for the site's registration cancelled page - additional url params will be added to this
132
	 * @type string
133
	 */
134
	public $cancel_page_url = '';
135
136
	/**
137
	 * base url for the site's thank you page - additional url params will be added to this
138
	 * @type string
139
	 */
140
	public $thank_you_page_url = '';
141
142
	/**
143
	 * base url for any redirects - additional url params will be added to this
144
	 * @type string
145
	 */
146
	public $redirect_url = '';
147
148
	/**
149
	 * form of POST data for use with off-site gateways
150
	 * @type string
151
	 */
152
	public $redirect_form = '';
153
154
	/**
155
	 * array of query where params to use when retrieving cached registrations from $this->checkout->transaction
156
	 * @type array
157
	 */
158
	public $reg_cache_where_params = array();
159
160
	/**
161
	 * a class for managing and creating the JSON encoded array of data that gets passed back to the client during AJAX requests
162
	 * @type EE_SPCO_JSON_Response
163
	 */
164
	public $json_response = NULL;
165
166
	/**
167
	 * where we are going next in the reg process
168
	 * @type EE_SPCO_Reg_Step
169
	 */
170
	public $next_step = NULL;
171
172
	/**
173
	 * where we are in the reg process
174
	 * @type EE_SPCO_Reg_Step
175
	 */
176
	public $current_step = NULL;
177
178
	/**
179
	 * 	$_cart - the current cart object
180
	 *	@var EE_CART
181
	 */
182
	public $cart = NULL;
183
184
	/**
185
	 * 	$_transaction - the current transaction object
186
	 *	@var EE_Transaction
187
	 */
188
	public $transaction = NULL;
189
190
	/**
191
	 * 	the related attendee object for the primary registrant
192
	 * @type EE_Attendee
193
	 */
194
	public $primary_attendee_obj = NULL;
195
196
	/**
197
	 *	$payment_method - the payment method object for the selected method of payment
198
	 *	@type EE_Payment_Method
199
	 */
200
	public $payment_method = NULL;
201
202
	/**
203
	 * 	$payment - if a payment was successfully made during the reg process,
204
	 * 	then here it is !!!
205
	 *	@type EE_Payment
206
	 */
207
	public $payment = NULL;
208
209
	/**
210
	 * 	if a payment method was selected that uses an on-site gateway, then this is the billing form
211
	 * @type EE_Billing_Info_Form | EE_Billing_Attendee_Info_Form
212
	 */
213
	public $billing_form = NULL;
214
215
	/**
216
	 * 	the entire registration form composed of ALL of the subsections generated by the various reg steps
217
	 * @type EE_Form_Section_Proper
218
	 */
219
	public $registration_form = NULL;
220
221
	/**
222
	 * array of EE_SPCO_Reg_Step objects
223
	 * @type EE_SPCO_Reg_Step[]
224
	 */
225
	public $reg_steps = array();
226
227
	/**
228
	 * array of EE_Payment_Method objects
229
	 * @type EE_Payment_Method[]
230
	 */
231
	public $available_payment_methods = array();
232
233
234
235
	/**
236
	 *    class constructor
237
	 *
238
	 * @access    public
239
	 * @return    \EE_Checkout
0 ignored issues
show
Comprehensibility Best Practice introduced by
Adding a @return annotation to constructors is generally not recommended as a constructor does not have a meaningful return value.

Adding a @return annotation to a constructor is not recommended, since a constructor does not have a meaningful return value.

Please refer to the PHP core documentation on constructors.

Loading history...
240
	 */
241
	public function __construct(  ) {
242
		$this->reg_page_base_url = EE_Registry::instance()->CFG->core->reg_page_url();
0 ignored issues
show
Documentation Bug introduced by
It seems like \EE_Registry::instance()...G->core->reg_page_url() can also be of type integer. However, the property $reg_page_base_url is declared as type string. 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...
243
		$this->thank_you_page_url = EE_Registry::instance()->CFG->core->thank_you_page_url();
244
		$this->cancel_page_url = EE_Registry::instance()->CFG->core->cancel_page_url();
245
		$this->continue_reg = apply_filters( 'FHEE__EE_Checkout___construct___continue_reg', TRUE );
246
		$this->admin_request = is_admin() && ! EE_Registry::instance()->REQ->ajax;
247
		$this->reg_cache_where_params = array( 'order_by' => array( 'REG_count' => 'ASC' ));
248
	}
249
250
251
252
	/**
253
	 * returns true if ANY reg status was updated during checkout
254
	 * @return array
255
	 */
256
	public function any_reg_status_updated() {
257
		foreach ( $this->reg_status_updated as $reg_status ) {
258
			if ( $reg_status ) {
259
				return true;
260
			}
261
		}
262
		return false;
263
	}
264
265
266
267
	/**
268
	 * @param $REG_ID
269
	 * @return array
270
	 */
271
	public function reg_status_updated( $REG_ID ) {
272
		return isset( $this->reg_status_updated[ $REG_ID ] ) ? $this->reg_status_updated[ $REG_ID ] : false;
273
	}
274
275
276
277
	/**
278
	 * @param $REG_ID
279
	 * @param $reg_status
280
	 */
281
	public function set_reg_status_updated( $REG_ID, $reg_status ) {
282
		$this->reg_status_updated[ $REG_ID ] = filter_var( $reg_status, FILTER_VALIDATE_BOOLEAN );
283
	}
284
285
286
287
	/**
288
	 * exit_spco
289
	 *
290
	 * @return bool
291
	 */
292
	public function exit_spco() {
293
		return $this->exit_spco;
294
	}
295
296
297
298
	/**
299
	 * set_exit_spco
300
	 * can ONLY be set by the  Finalize_Registration reg step
301
	 */
302
	public function set_exit_spco() {
303
		if ( $this->current_step instanceof EE_SPCO_Reg_Step_Finalize_Registration ) {
304
			$this->exit_spco = true;
305
		}
306
	}
307
308
309
310
311
312
	/**
313
	 *    reset_for_current_request
314
	 *
315
	 * @access    public
316
	 * @return    void
317
	 */
318
	public function reset_for_current_request() {
319
		$this->process_form_submission = FALSE;
320
		$this->continue_reg = apply_filters( 'FHEE__EE_Checkout___construct___continue_reg', true );
321
		$this->admin_request = is_admin() && ! EE_Registry::instance()->REQ->front_ajax;
322
		$this->continue_reg = true;
323
		$this->redirect = false;
324
		// don't reset the cached redirect form if we're about to be asked to display it !!!
325
		if ( EE_Registry::instance()->REQ->get( 'action', 'display_spco_reg_step' ) !== 'redirect_form' ) {
326
			$this->redirect_form = '';
327
		}
328
		$this->redirect_url = '';
329
		$this->json_response = new EE_SPCO_JSON_Response();
330
		EE_Form_Section_Proper::reset_js_localization();
331
	}
332
333
334
335
	/**
336
	 *    add_reg_step
337
	 *
338
	 * @access    public
339
	 * @param EE_SPCO_Reg_Step $reg_step_obj
340
	 * @return    void
341
	 */
342
	public function add_reg_step( EE_SPCO_Reg_Step $reg_step_obj ) {
343
		$this->reg_steps[ $reg_step_obj->slug()  ] = $reg_step_obj;
344
	}
345
346
347
348
	/**
349
	 * skip_reg_step
350
	 *
351
	 * if the current reg step does not need to run for some reason,
352
	 * then this will advance SPCO to the next reg step,
353
	 * and mark the skipped step as completed
354
	 *
355
	 * @access    public
356
	 * @param string $reg_step_slug
357
	 * @return    void
358
	 */
359
	public function skip_reg_step( $reg_step_slug = '' ) {
360
		$step_to_skip = $this->find_reg_step( $reg_step_slug );
361
		if ( $step_to_skip instanceof EE_SPCO_Reg_Step && $step_to_skip->is_current_step() ) {
362
			$step_to_skip->set_is_current_step( false );
363
			$step_to_skip->set_completed();
364
			// advance to the next step
365
			$this->set_current_step( $this->next_step->slug() );
366
			// also reset the step param in the request in case any other code references that directly
367
			EE_Registry::instance()->REQ->set( 'step', $this->current_step->slug() );
368
			// since we are skipping a step and setting the current step to be what was previously the next step,
369
			// we need to check that the next step is now correct, and not still set to the current step.
370
			if ( $this->current_step->slug() == $this->next_step->slug() ) {
371
				// correctly setup the next step
372
				$this->set_next_step();
373
			}
374
			$this->set_reg_step_initiated( $this->current_step );
375
		}
376
	}
377
378
379
380
	/**
381
	 *    remove_reg_step
382
	 *
383
	 * @access    public
384
	 * @param string $reg_step_slug
385
	 * @param bool   $reset whether to reset reg steps after removal
386
	 * @throws EE_Error
387
	 */
388
	public function remove_reg_step( $reg_step_slug = '', $reset = true ) {
389
		unset( $this->reg_steps[ $reg_step_slug  ] );
390
		if ( $this->transaction instanceof EE_Transaction ) {
391
			/** @type EE_Transaction_Processor $transaction_processor */
392
			$transaction_processor = EE_Registry::instance()->load_class( 'Transaction_Processor' );
393
			// now remove reg step from TXN and save
394
			$transaction_processor->remove_reg_step( $this->transaction, $reg_step_slug );
395
			$this->transaction->save();
396
		}
397
		if ( $reset ) {
398
			$this->reset_reg_steps();
399
		}
400
	}
401
402
403
404
	/**
405
	 *    set_reg_step_order
406
	 *
407
	 * @access    public
408
	 * @param string $reg_step_slug
409
	 * @param int    $order
410
	 * @return    void
411
	 */
412
	public function set_reg_step_order( $reg_step_slug = '', $order = 100 ) {
413
		if ( isset( $this->reg_steps[ $reg_step_slug  ] )) {
414
			$this->reg_steps[ $reg_step_slug ]->set_order( $order );
415
		}
416
	}
417
418
419
420
	/**
421
	 *    set_current_step
422
	 *
423
	 * @access    public
424
	 * @param string $current_step
425
	 * @return    void
426
	 */
427
	public function set_current_step( $current_step ) {
428
		// grab what step we're on
429
		$this->current_step = isset( $this->reg_steps[ $current_step ] ) ? $this->reg_steps[ $current_step ] : reset( $this->reg_steps );
0 ignored issues
show
Documentation Bug introduced by
It seems like isset($this->reg_steps[$...reset($this->reg_steps) can also be of type false. However, the property $current_step is declared as type object<EE_SPCO_Reg_Step>. 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...
430
		// verify instance
431
		if ( $this->current_step instanceof EE_SPCO_Reg_Step ) {
432
			// we don't want to repeat completed steps if this is the first time through SPCO
433
			if ( $this->continue_reg && $this->current_step->completed() && ! $this->revisit ) {
434
				// so advance to the next step
435
				$this->set_next_step();
436
				if ( $this->next_step instanceof EE_SPCO_Reg_Step ) {
437
					// and attempt to set it as the current step
438
					$this->set_current_step( $this->next_step->slug() );
439
				}
440
				return;
441
			}
442
			$this->current_step->set_is_current_step( TRUE );
443
		} else {
444
			EE_Error::add_error(
445
				__( 'The current step could not be set.', 'event_espresso' ),
446
				__FILE__, __FUNCTION__, __LINE__
447
			);
448
		}
449
	}
450
451
452
453
	/**
454
	 * 	set_next_step
455
	 * advances the reg_steps array pointer and sets the next step, then reverses pointer back to the current step
456
	 *
457
	 *  @access 	public
458
	 *  @return 	void
459
	 */
460
	public function set_next_step() {
461
		// set pointer to start of array
462
		reset( $this->reg_steps );
463
		// if there is more than one step
464
		if ( count( $this->reg_steps ) > 1 ) {
465
			// advance to the current step and set pointer
466
			while ( key( $this->reg_steps ) != $this->current_step->slug() && key( $this->reg_steps ) != '' ) {
467
				next( $this->reg_steps );
468
			}
469
		}
470
		// advance one more spot ( if it exists )
471
		$this->next_step = next( $this->reg_steps );
472
		// verify instance
473
		$this->next_step = $this->next_step instanceof EE_SPCO_Reg_Step ? $this->next_step  : NULL;
474
		// then back to current step to reset
475
		prev( $this->reg_steps );
476
	}
477
478
479
480
481
	/**
482
	 * 	get_next_reg_step
483
	 * 	this simply returns the next step from reg_steps array
484
	 *
485
	 *  @access 	public
486
	 *  @return 	EE_SPCO_Reg_Step | null
487
	 */
488
	public function get_next_reg_step() {
489
		$next = next( $this->reg_steps );
490
		prev( $this->reg_steps );
491
		return $next instanceof EE_SPCO_Reg_Step ? $next : null;
492
	}
493
494
495
496
497
	/**
498
	 * get_prev_reg_step
499
	 * 	this simply returns the previous step from reg_steps array
500
	 *
501
	 *  @access 	public
502
	 *  @return 	EE_SPCO_Reg_Step | null
503
	 */
504
	public function get_prev_reg_step() {
505
		$prev = prev( $this->reg_steps );
506
		next( $this->reg_steps );
507
		return $prev instanceof EE_SPCO_Reg_Step ? $prev : null;
508
	}
509
510
511
512
	/**
513
	 * sort_reg_steps
514
	 *
515
	 * @access public
516
	 * @return void
517
	 */
518
	public function sort_reg_steps() {
519
		$reg_step_sorting_callback = apply_filters( 'FHEE__EE_Checkout__sort_reg_steps__reg_step_sorting_callback', 'reg_step_sorting_callback' );
520
		uasort( $this->reg_steps, array( $this, $reg_step_sorting_callback ));
521
	}
522
523
524
525
	/**
526
	 * find_reg_step
527
	 * finds a reg step by the given slug
528
	 *
529
	 * @access    public
530
	 * @param string $reg_step_slug
531
	 * @return EE_SPCO_Reg_Step|null
532
	 */
533
	public function find_reg_step( $reg_step_slug = '' ) {
534
		if ( ! empty( $reg_step_slug ) ) {
535
			// copy reg step array
536
			$reg_steps = $this->reg_steps;
537
			// set pointer to start of array
538
			reset( $reg_steps );
539
			// if there is more than one step
540
			if ( count( $reg_steps ) > 1 ) {
541
				// advance to the current step and set pointer
542
				while ( key( $reg_steps ) != $reg_step_slug && key( $reg_steps ) != '' ) {
543
					next( $reg_steps );
544
				}
545
				return current( $reg_steps );
546
			}
547
		}
548
		return null;
549
	}
550
551
552
553
	/**
554
	 * reg_step_sorting_callback
555
	 *
556
	 * @access public
557
	 * @param EE_SPCO_Reg_Step $reg_step_A
558
	 * @param EE_SPCO_Reg_Step $reg_step_B
559
	 * @return array()
0 ignored issues
show
Documentation introduced by
The doc-type array() could not be parsed: Expected "|" or "end of type", but got "(" at position 5. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
560
	 */
561
	public function reg_step_sorting_callback( EE_SPCO_Reg_Step $reg_step_A, EE_SPCO_Reg_Step $reg_step_B ) {
562
		// send finalize_registration step to the end of the array
563
		if ( $reg_step_A->slug() == 'finalize_registration' ) {
564
			return 1;
565
		} else if ( $reg_step_B->slug() == 'finalize_registration' ) {
566
			return -1;
567
		}
568
		if ( $reg_step_A->order() == $reg_step_B->order() ) {
569
			return 0;
570
		}
571
		return ( $reg_step_A->order() > $reg_step_B->order() ) ? 1 : -1;
572
	}
573
574
575
576
	/**
577
	 * set_reg_step_initiated
578
	 *
579
	 * @access 	public
580
	 * @param 	EE_SPCO_Reg_Step $reg_step
581
	 */
582
	public function set_reg_step_initiated( EE_SPCO_Reg_Step $reg_step ) {
583
		// call set_reg_step_initiated ???
584
		if (
585
			// first time visiting SPCO ?
586
			! $this->revisit
587
			&& (
588
				// and displaying the reg step form for the first time ?
589
				$this->action === 'display_spco_reg_step'
590
				// or initializing the final step
591
				|| $reg_step instanceof EE_SPCO_Reg_Step_Finalize_Registration
592
			)
593
		) {
594
			/** @type EE_Transaction_Processor $transaction_processor */
595
			$transaction_processor = EE_Registry::instance()->load_class( 'Transaction_Processor' );
596
			// set the start time for this reg step
597
			if ( ! $transaction_processor->set_reg_step_initiated( $this->transaction, $reg_step->slug() ) ) {
598 View Code Duplication
				if ( WP_DEBUG ) {
599
					EE_Error::add_error(
600
						sprintf(
601
							__( 'The "%1$s" registration step was not initialized properly.', 'event_espresso' ),
602
							$reg_step->name()
603
						),
604
						__FILE__, __FUNCTION__, __LINE__
605
					);
606
				}
607
			};
608
		}
609
	}
610
611
612
613
	/**
614
	 * 	set_reg_step_JSON_info
615
	 *
616
	 * 	@access public
617
	 * 	@return 	void
618
	 */
619
	public function set_reg_step_JSON_info() {
620
		EE_Registry::$i18n_js_strings[ 'reg_steps' ] = array();
621
		// pass basic reg step data to JS
622
		foreach ( $this->reg_steps as $reg_step ) {
623
			EE_Registry::$i18n_js_strings[ 'reg_steps' ][] = $reg_step->slug();
624
		}
625
		// reset reg step html
626
//		$this->json_response->set_reg_step_html( '' );
627
	}
628
629
630
631
	/**
632
	 * 	reset_reg_steps
633
	 *
634
	 * 	@access public
635
	 * 	@return 	bool
636
	 */
637
	public function reset_reg_steps() {
638
		$this->sort_reg_steps();
639
		$this->set_current_step( EE_Registry::instance()->REQ->get( 'step' ));
640
		$this->set_next_step();
641
		// the text that appears on the reg step form submit button
642
		$this->current_step->set_submit_button_text();
643
		$this->set_reg_step_JSON_info();
644
	}
645
646
647
648
	/**
649
	 *    get_registration_time_limit
650
	 *
651
	 * @access    public
652
	 * @return        string
653
	 */
654
	public function get_registration_time_limit() {
655
656
		$registration_time_limit = (float)( EE_Registry::instance()	->SSN->expiration() - time() );
657
		$time_limit_format = $registration_time_limit > 60 * MINUTE_IN_SECONDS ? 'H:i:s' : 'i:s';
658
		$registration_time_limit = gmdate( $time_limit_format, $registration_time_limit );
659
		return apply_filters(
660
			'FHEE__EE_Checkout__get_registration_time_limit__registration_time_limit',
661
			$registration_time_limit
662
		);
663
	}
664
665
666
667
	/**
668
	 * payment_required
669
	 * @return boolean
670
	 */
671
	public function payment_required() {
672
		// if NOT:
673
		//		registration via admin
674
		//		completed TXN
675
		//		overpaid TXN
676
		//		free TXN ( total = 0.00 )
677
		// then payment required is TRUE
678
		return ! ( $this->admin_request || $this->transaction->is_completed() || $this->transaction->is_overpaid() || $this->transaction->is_free() ) ? TRUE : FALSE;
679
	}
680
681
682
683
	/**
684
	 * 	initialize_txn_reg_steps_array
685
	 *
686
	 * 	@access public
687
	 * 	@return 	array
688
	 */
689
	public function initialize_txn_reg_steps_array() {
690
		$txn_reg_steps_array = array();
691
		foreach ( $this->reg_steps as $reg_step ) {
692
			$txn_reg_steps_array[ $reg_step->slug() ] = FALSE;
693
		}
694
		return $txn_reg_steps_array;
695
	}
696
697
698
699
	/**
700
	 * 	update_txn_reg_steps_array
701
	 *
702
	 * 	@access public
703
	 * 	@return 	bool
704
	 */
705
	public function update_txn_reg_steps_array() {
706
		$updated = FALSE;
707
		/** @type EE_Transaction_Processor $transaction_processor */
708
		$transaction_processor = EE_Registry::instance()->load_class( 'Transaction_Processor' );
709
		foreach ( $this->reg_steps as $reg_step ) {
710
			if ( $reg_step->completed() ) {
711
				$updated = $transaction_processor->set_reg_step_completed( $this->transaction, $reg_step->slug() ) ? TRUE : $updated;
712
			}
713
		}
714
		if ( $updated ) {
715
			$this->transaction->save();
716
		}
717
		return $updated;
718
	}
719
720
721
722
	/**
723
	 * 	stash_transaction_and_checkout
724
	 *
725
	 * 	@access public
726
	 * 	@return 	void
727
	 */
728
	public function stash_transaction_and_checkout() {
729
		if ( ! $this->revisit ) {
730
			$this->update_txn_reg_steps_array();
731
		}
732
		$this->track_transaction_and_registration_status_updates();
733
		// save all data to the db, but suppress errors
734
		//$this->save_all_data( FALSE );
735
		// cache the checkout in the session
736
		EE_Registry::instance()->SSN->set_checkout( $this );
737
	}
738
739
740
741
742
	/**
743
	 *    track_transaction_and_registration_status_updates
744
	 *
745
	 * 	stores whether any updates were made to the TXN or it's related registrations
746
	 *
747
	 * 	@access public
748
	 * 	@return 	bool
749
	 */
750
	public function track_transaction_and_registration_status_updates() {
751
		// verify the transaction
752
		if ( $this->transaction instanceof EE_Transaction ) {
753
			/** @type EE_Transaction_Payments $transaction_payments */
754
			$transaction_payments = EE_Registry::instance()->load_class( 'Transaction_Payments' );
755
			/** @type EE_Transaction_Processor $transaction_processor */
756
			$transaction_processor = EE_Registry::instance()->load_class( 'Transaction_Processor' );
757
			// has there been a TXN status change during this checkout?
758
			if ( $transaction_payments->txn_status_updated() || $transaction_processor->txn_status_updated() ) {
759
				$this->txn_status_updated = true;
760
			}
761
			/** @type EE_Registration_Processor $registration_processor */
762
			$registration_processor = EE_Registry::instance()->load_class( 'Registration_Processor' );
763
			// grab the saved registrations from the transaction
764
			foreach ( $this->transaction->registrations( $this->reg_cache_where_params ) as $registration ) {
765
				if ( $registration_processor->reg_status_updated( $registration->ID() ) ) {
766
					$this->set_reg_status_updated( $registration->ID(), true );
767
				}
768
			}
769
		}
770
	}
771
772
773
774
775
	/**
776
	 * 	visit_allows_processing_of_this_registration
777
	 *
778
	 * 	determines if the current SPCO visit should allow the passed EE_Registration to be used in processing.
779
	 * 	one of the following conditions must be met:
780
	 * 		EITHER: 	A) first time thru SPCO -> process ALL registrations ( NOT a revisit )
781
	 * 		OR : 		B) primary registrant is editing info -> process ALL registrations ( primary_revisit )
782
	 * 		OR : 		C) another registrant is editing info -> ONLY process their registration ( revisit AND their reg_url_link matches )
783
	 *
784
	 * 	@access public
785
	 * @param 	EE_Registration 	$registration
786
	 * 	@return 	bool
787
	 */
788
	public function visit_allows_processing_of_this_registration( EE_Registration $registration ) {
789
		return ! $this->revisit || $this->primary_revisit || ( $this->revisit && $this->reg_url_link == $registration->reg_url_link() ) ? TRUE : FALSE;
790
	}
791
792
793
794
	/**
795
	 * 	_transaction_has_primary_registration
796
	 *
797
	 * 	@access 		private
798
	 * 	@return 		bool
799
	 */
800
	public function transaction_has_primary_registrant() {
801
		return $this->primary_attendee_obj instanceof EE_Attendee ? TRUE : FALSE;
802
	}
803
804
805
806
	/**
807
	 *    save_all_data
808
	 *    simply loops through the current transaction and saves all data for each registration
809
	 *
810
	 * @access public
811
	 * @param bool $show_errors
812
	 * @return bool
813
	 */
814
	public function save_all_data( $show_errors = TRUE ) {
815
		// verify the transaction
816
		if ( $this->transaction instanceof EE_Transaction ) {
817
			// save to ensure that TXN has ID
818
			$this->transaction->save();
819
			// grab the saved registrations from the transaction
820
			foreach ( $this->transaction->registrations( $this->reg_cache_where_params ) as  $registration ) {
821
				$this->_save_registration( $registration, $show_errors );
0 ignored issues
show
Compatibility introduced by
$registration of type object<EE_Base_Class> is not a sub-type of object<EE_Registration>. It seems like you assume a child class of the class EE_Base_Class to be always present.

This check looks for parameters that are defined as one type in their type hint or doc comment but seem to be used as a narrower type, i.e an implementation of an interface or a subclass.

Consider changing the type of the parameter or doing an instanceof check before assuming your parameter is of the expected type.

Loading history...
822
			}
823
		} else {
824
			if ( $show_errors ) {
825
				EE_Error::add_error( __( 'A valid Transaction was not found when attempting to save your registration information.', 'event_espresso' ), __FILE__, __FUNCTION__, __LINE__);
826
			}
827
			return FALSE;
828
		}
829
		return TRUE;
830
	}
831
832
833
	/**
834
	 * _save_registration_attendee
835
	 *
836
	 * @param 	EE_Registration 	$registration
837
	 * @param bool $show_errors
838
	 * @return void
839
	 */
840
	private function _save_registration( $registration, $show_errors = TRUE  ) {
841
		// verify object
842
		if ( $registration instanceof EE_Registration ) {
843
			// should this registration be processed during this visit ?
844
			if ( $this->visit_allows_processing_of_this_registration( $registration ) ) {
845
				//set TXN ID
846
				if ( ! $registration->transaction_ID() ) {
847
					$registration->set_transaction_id( $this->transaction->ID() );
848
				}
849
				// verify and save the attendee
850
				$this->_save_registration_attendee( $registration, $show_errors );
851
				// save answers to reg form questions
852
				$this->_save_registration_answers( $registration, $show_errors );
853
				// save changes
854
				$registration->save();
855
				// update txn cache
856 View Code Duplication
				if ( ! $this->transaction->update_cache_after_object_save( 'Registration', $registration )) {
857
					if ( $show_errors ) {
858
						EE_Error::add_error( __( 'The newly saved Registration object could not be cached on the Transaction.', 'event_espresso' ), __FILE__, __FUNCTION__, __LINE__);
859
					}
860
				}
861
			}
862
		} else {
863
			if ( $show_errors ) {
864
				EE_Error::add_error(
865
					__( 'An invalid Registration object was discovered when attempting to save your registration information.', 'event_espresso' ),
866
					__FILE__, __FUNCTION__, __LINE__
867
				);
868
			}
869
		}
870
	}
871
872
873
874
	/**
875
	 * _save_registration_attendee
876
	 *
877
	 * @param 	EE_Registration 	$registration
878
	 * @param bool $show_errors
879
	 * @return void
880
	 */
881
	private function _save_registration_attendee( $registration, $show_errors = TRUE ) {
882
		if ( $registration->attendee() instanceof EE_Attendee ) {
883
			// save so that ATT has ID
884
			$registration->attendee()->save();
885 View Code Duplication
			if ( ! $registration->update_cache_after_object_save( 'Attendee', $registration->attendee() )) {
886
				if ( $show_errors ) {
887
					EE_Error::add_error(
888
						__( 'The newly saved Attendee object could not be cached on the registration.', 'event_espresso' ),
889
						__FILE__, __FUNCTION__, __LINE__
890
					);
891
				}
892
			}
893
		} else {
894
			if ( $show_errors ) {
895
				ob_start();
896
				var_dump( $registration->attendee() );
0 ignored issues
show
Security Debugging Code introduced by
var_dump($registration->attendee()); looks like debug code. Are you sure you do not want to remove it? This might expose sensitive data.
Loading history...
897
				EE_Error::add_error(
898
					sprintf(
899
						'%1$s||%1$s $attendee = %2$s',
900
						__( 'Either no Attendee information was found, or an invalid Attendee object was discovered when attempting to save your registration information.', 'event_espresso' ),
901
						ob_get_clean()
902
					),
903
					__FILE__, __FUNCTION__, __LINE__
904
				);
905
			}
906
		}
907
	}
908
909
910
911
	/**
912
	 * _save_question_answers
913
	 *
914
	 * @param 	EE_Registration 	$registration
915
	 * @param bool $show_errors
916
	 * @return void
917
	 */
918
	private function _save_registration_answers( $registration, $show_errors = TRUE ) {
919
		// now save the answers
920
		foreach ( $registration->answers() as $cache_key => $answer ) {
921
			// verify object
922
			if ( $answer instanceof EE_Answer ) {
923
				$answer->set_registration( $registration->ID() );
924
				$answer->save();
925
				if ( ! $registration->update_cache_after_object_save( 'Answer', $answer, $cache_key )) {
926
					if ( $show_errors ) {
927
						EE_Error::add_error(
928
							__( 'The newly saved Answer object could not be cached on the registration.', 'event_espresso' ),
929
							__FILE__, __FUNCTION__, __LINE__
930
						);
931
					}
932
				}
933
			} else {
934
				if ( $show_errors ) {
935
					EE_Error::add_error(
936
						__( 'An invalid Answer object was discovered when attempting to save your registration information.', 'event_espresso' ),
937
						__FILE__, __FUNCTION__, __LINE__
938
					);
939
				}
940
			}
941
		}
942
	}
943
944
945
946
	/**
947
	 *    refresh_all_entities
948
	 *   will either refresh the entity map with objects form the db or from the checkout cache
949
	 *
950
	 * @access public
951
	 * @param bool $from_db
952
	 * @return bool
953
	 */
954
	public function refresh_all_entities( $from_db = false ) {
955
		$from_db = $this->current_step->is_final_step() || $this->action == 'process_gateway_response' ? true : $from_db;
956
		//$this->log(
957
		//	__CLASS__, __FUNCTION__, __LINE__,
958
		//	array( 'from_db' =>$from_db )
959
		//);
960
		return $from_db ? $this->refresh_from_db() : $this->refresh_entity_map();
961
	}
962
963
964
965
	/**
966
	 *  refresh_entity_map
967
	 *  simply loops through the current transaction and updates each
968
	 *  model's entity map using EEM_Base::refresh_entity_map_from_db()
969
	 *
970
	 * @access public
971
	 * @return bool
972
	 */
973
	protected function refresh_from_db() {
974
		// verify the transaction
975
		if ( $this->transaction instanceof EE_Transaction && $this->transaction->ID() ) {
976
			// pull fresh TXN data from the db
977
			$this->transaction = $this->transaction->get_model()->refresh_entity_map_from_db( $this->transaction->ID() );
0 ignored issues
show
Bug introduced by
The method refresh_entity_map_from_db cannot be called on $this->transaction->get_model() (of type boolean).

Methods can only be called on objects. This check looks for methods being called on variables that have been inferred to never be objects.

Loading history...
978
			// update EE_Checkout's cached primary_attendee object
979
			$this->primary_attendee_obj = $this->_refresh_primary_attendee_obj_from_db( $this->transaction );
980
			// update EE_Checkout's cached payment object
981
			$payment = $this->transaction->last_payment();
982
			$this->payment = $payment instanceof EE_Payment ? $payment : $this->payment;
983
			// update EE_Checkout's cached payment_method object
984
			$payment_method = $this->payment instanceof EE_Payment ? $this->payment->payment_method() : null;
985
			$this->payment_method = $payment_method instanceof EE_Payment_Method ? $payment_method : $this->payment_method;
986
			//now refresh the cart, based on the TXN
987
			$this->cart = EE_Cart::get_cart_from_txn( $this->transaction );
988
			// verify and update the cart because inaccurate totals are not so much fun
989
			if ( $this->cart instanceof EE_Cart ) {
990
				$this->cart->get_grand_total()->recalculate_total_including_taxes();
991
			} else {
992
				$this->cart = EE_Registry::instance()->load_core( 'Cart' );
0 ignored issues
show
Documentation Bug introduced by
It seems like \EE_Registry::instance()->load_core('Cart') of type boolean is incompatible with the declared type object<EE_Cart> of property $cart.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
993
			}
994
		} else {
995
			EE_Error::add_error( __( 'A valid Transaction was not found when attempting to update the model entity mapper.', 'event_espresso' ), __FILE__, __FUNCTION__, __LINE__);
996
			return FALSE;
997
		}
998
		return TRUE;
999
	}
1000
1001
1002
1003
	/**
1004
	 * _refresh_primary_attendee_obj_from_db
1005
	 *
1006
	 * @param   EE_Transaction $transaction
1007
	 * @return  EE_Attendee | null
1008
	 */
1009
	protected function _refresh_primary_attendee_obj_from_db( EE_Transaction $transaction ) {
1010
1011
		$primary_attendee_obj = null;
1012
		// grab the saved registrations from the transaction
1013
		foreach ( $transaction->registrations( $this->reg_cache_where_params, true ) as $registration ) {
1014
			// verify object
1015
			if ( $registration instanceof EE_Registration ) {
1016
				$attendee = $registration->attendee();
1017
				// verify object
1018
				if ( $attendee instanceof EE_Attendee  ) {
1019
					// maybe cache primary_attendee_obj ?
1020
					if ( $registration->is_primary_registrant() ) {
1021
						$primary_attendee_obj = $attendee;
1022
					}
1023
				}
1024
			} else {
1025
				EE_Error::add_error(
1026
						__( 'An invalid Registration object was discovered when attempting to update the model entity mapper.', 'event_espresso' ),
1027
						__FILE__, __FUNCTION__, __LINE__
1028
				);
1029
			}
1030
		}
1031
		return $primary_attendee_obj;
1032
	}
1033
1034
1035
1036
	/**
1037
	 *  refresh_entity_map
1038
	 *  simply loops through the current transaction and updates
1039
	 *  each model's entity map using EEM_Base::refresh_entity_map_with()
1040
	 *
1041
	 * @access public
1042
	 * @return bool
1043
	 */
1044
	protected function refresh_entity_map() {
1045
		// verify the transaction
1046
		if ( $this->transaction instanceof EE_Transaction && $this->transaction->ID() ) {
1047
			// never cache payment info
1048
			$this->transaction->clear_cache( 'Payment' );
1049
			/** @type EE_Transaction_Processor $transaction_processor */
1050
			$transaction_processor = EE_Registry::instance()->load_class( 'Transaction_Processor' );
1051
			// is the Payment Options Reg Step completed ?
1052
			if ( $transaction_processor->reg_step_completed( $this->transaction, 'payment_options' ) ) {
1053
				// then check for payments and update TXN accordingly
1054
				/** @type EE_Transaction_Payments $transaction_payments */
1055
				$transaction_payments = EE_Registry::instance()->load_class( 'Transaction_Payments' );
1056
				$transaction_payments->calculate_total_payments_and_update_status( $this->transaction );
1057
			}
1058
			// grab the saved registrations from the transaction
1059
			foreach ( $this->transaction->registrations( $this->reg_cache_where_params ) as $reg_cache_ID => $registration ) {
1060
				$this->_refresh_registration( $reg_cache_ID, $registration );
0 ignored issues
show
Compatibility introduced by
$registration of type object<EE_Base_Class> is not a sub-type of object<EE_Registration>. It seems like you assume a child class of the class EE_Base_Class to be always present.

This check looks for parameters that are defined as one type in their type hint or doc comment but seem to be used as a narrower type, i.e an implementation of an interface or a subclass.

Consider changing the type of the parameter or doing an instanceof check before assuming your parameter is of the expected type.

Loading history...
1061
			}
1062
			// make sure our cached TXN is added to the model entity mapper
1063
			$this->transaction = $this->transaction->get_model()->refresh_entity_map_with( $this->transaction->ID(), $this->transaction );
0 ignored issues
show
Bug introduced by
The method refresh_entity_map_with cannot be called on $this->transaction->get_model() (of type boolean).

Methods can only be called on objects. This check looks for methods being called on variables that have been inferred to never be objects.

Loading history...
1064
1065
		} else {
1066
			EE_Error::add_error( __( 'A valid Transaction was not found when attempting to update the model entity mapper.', 'event_espresso' ), __FILE__, __FUNCTION__, __LINE__);
1067
			return FALSE;
1068
		}
1069
		// verify and update the cart because inaccurate totals are not so much fun
1070
		if ( $this->cart instanceof EE_Cart ) {
1071
			$grand_total = $this->cart->get_grand_total();
1072
			if ( $grand_total instanceof EE_Line_Item && $grand_total->ID() ) {
1073
				$grand_total->recalculate_total_including_taxes();
1074
				$grand_total = $grand_total->get_model()->refresh_entity_map_with(
0 ignored issues
show
Bug introduced by
The method refresh_entity_map_with cannot be called on $grand_total->get_model() (of type boolean).

Methods can only be called on objects. This check looks for methods being called on variables that have been inferred to never be objects.

Loading history...
1075
					$this->cart->get_grand_total()->ID(),
1076
					$this->cart->get_grand_total()
1077
				);
1078
			}
1079 View Code Duplication
			if ( $grand_total instanceof EE_Line_Item ) {
1080
				$this->cart = EE_Cart::instance( $grand_total );
1081
			} else {
1082
				EE_Error::add_error( __( 'A valid Cart was not found when attempting to update the model entity mapper.', 'event_espresso' ), __FILE__, __FUNCTION__, __LINE__ );
1083
				return false;
1084
			}
1085
		}
1086
		return TRUE;
1087
	}
1088
1089
1090
1091
	/**
1092
	 * _refresh_registration
1093
	 *
1094
	 * @param 	string | int 	$reg_cache_ID
1095
	 * @param 	EE_Registration 	$registration
1096
	 * @return void
1097
	 */
1098
	protected function _refresh_registration( $reg_cache_ID, $registration ) {
1099
1100
		// verify object
1101 View Code Duplication
		if ( $registration instanceof EE_Registration ) {
1102
			// update the entity mapper attendee
1103
			$this->_refresh_registration_attendee( $registration );
1104
			// update the entity mapper answers for reg form questions
1105
			$this->_refresh_registration_answers( $registration );
1106
			// make sure the cached registration is added to the model entity mapper
1107
			$registration->get_model()->refresh_entity_map_with( $reg_cache_ID, $registration );
0 ignored issues
show
Bug introduced by
The method refresh_entity_map_with cannot be called on $registration->get_model() (of type boolean).

Methods can only be called on objects. This check looks for methods being called on variables that have been inferred to never be objects.

Loading history...
1108
		} else {
1109
			EE_Error::add_error(
1110
				__( 'An invalid Registration object was discovered when attempting to update the model entity mapper.', 'event_espresso' ),
1111
				__FILE__, __FUNCTION__, __LINE__
1112
			);
1113
		}
1114
	}
1115
1116
1117
1118
	/**
1119
	 * _save_registration_attendee
1120
	 *
1121
	 * @param 	EE_Registration 	$registration
1122
	 * @return void
1123
	 */
1124
	protected function _refresh_registration_attendee( $registration ) {
1125
1126
		$attendee = $registration->attendee();
1127
		// verify object
1128
		if ( $attendee instanceof EE_Attendee && $attendee->ID() ) {
1129
			// make sure the cached attendee is added to the model entity mapper
1130
			$registration->attendee()->get_model()->refresh_entity_map_with( $attendee->ID(), $attendee );
0 ignored issues
show
Bug introduced by
The method refresh_entity_map_with cannot be called on $registration->attendee()->get_model() (of type boolean).

Methods can only be called on objects. This check looks for methods being called on variables that have been inferred to never be objects.

Loading history...
1131
			// maybe cache primary_attendee_obj ?
1132
			if ( $registration->is_primary_registrant() ) {
1133
				$this->primary_attendee_obj = $attendee;
1134
			}
1135
		}
1136
	}
1137
1138
1139
1140
	/**
1141
	 * _refresh_registration_answers
1142
	 *
1143
	 * @param 	EE_Registration 	$registration
1144
	 * @return void
1145
	 */
1146
	protected function _refresh_registration_answers( $registration ) {
1147
1148
		// now update the answers
1149
		foreach ( $registration->answers() as $cache_key => $answer ) {
1150
			// verify object
1151 View Code Duplication
			if ( $answer instanceof EE_Answer ) {
1152
				if ( $answer->ID() ) {
1153
					// make sure the cached answer is added to the model entity mapper
1154
					$answer->get_model()->refresh_entity_map_with( $answer->ID(), $answer );
0 ignored issues
show
Bug introduced by
The method refresh_entity_map_with cannot be called on $answer->get_model() (of type boolean).

Methods can only be called on objects. This check looks for methods being called on variables that have been inferred to never be objects.

Loading history...
1155
				}
1156
			} else {
1157
				EE_Error::add_error(
1158
					__( 'An invalid Answer object was discovered when attempting to update the model entity mapper.', 'event_espresso' ),
1159
					__FILE__, __FUNCTION__, __LINE__
1160
				);
1161
			}
1162
		}
1163
	}
1164
1165
1166
1167
	/**
1168
	 * 	__wakeup
1169
	 * to conserve db space, we are removing the EE_Checkout object from EE_SPCO_Reg_Step objects upon serialization
1170
	 * this will reinstate the EE_Checkout object on each EE_SPCO_Reg_Step object
1171
	 */
1172
	function __wakeup() {
1173
		foreach ( $this->reg_steps as $reg_step ) {
1174
			$reg_step->checkout = $this;
1175
		}
1176
	}
1177
1178
1179
1180
	/**
1181
	 * debug
1182
	 *
1183
	 * @param string $class
1184
	 * @param string $func
1185
	 * @param string $line
1186
	 * @param array $info
1187
	 * @param bool $display_request
1188
	 */
1189
	function log( $class = '', $func = '', $line = '', $info = array(), $display_request = false ) {
1190
		if ( WP_DEBUG && false ) {
1191
			$debug_data = get_option( 'EE_DEBUG_SPCO_' . EE_Session::instance()->id(), array() );
1192
			$default_data = array(
1193
				$class 		=> $func . '() : ' . $line,
1194
				'request->step' 		=> $this->step,
1195
				'request->action' 	=> $this->action,
1196
				'current_step->slug' => $this->current_step instanceof EE_SPCO_Reg_Step ?
1197
					$this->current_step->slug() : '',
1198
				'current_step->completed' => $this->current_step instanceof EE_SPCO_Reg_Step ?
1199
					$this->current_step->completed() : '',
1200
				'txn_status_updated' => $this->txn_status_updated,
1201
				'reg_status_updated' => $this->reg_status_updated,
1202
				'reg_url_link' => $this->reg_url_link,
1203
				'REQ' => $display_request ? $_REQUEST : '',
1204
			);
1205
			if ( $this->transaction instanceof EE_Transaction ) {
1206
				$default_data[ 'TXN_status' ] 		= $this->transaction->status_ID();
1207
				$default_data[ 'TXN_reg_steps' ] 	= $this->transaction->reg_steps();
1208
				foreach ( $this->transaction->registrations( $this->reg_cache_where_params ) as $REG_ID => $registration ) {
1209
					$default_data[ 'registrations' ][ $REG_ID ] = $registration->status_ID();
0 ignored issues
show
Documentation Bug introduced by
The method status_ID does not exist on object<EE_Base_Class>? Since you implemented __call, maybe consider adding a @method annotation.

If you implement __call and you know which methods are available, you can improve IDE auto-completion and static analysis by adding a @method annotation to the class.

This is often the case, when __call is implemented by a parent class and only the child class knows which methods exist:

class ParentClass {
    private $data = array();

    public function __call($method, array $args) {
        if (0 === strpos($method, 'get')) {
            return $this->data[strtolower(substr($method, 3))];
        }

        throw new \LogicException(sprintf('Unsupported method: %s', $method));
    }
}

/**
 * If this class knows which fields exist, you can specify the methods here:
 *
 * @method string getName()
 */
class SomeClass extends ParentClass { }
Loading history...
1210
				}
1211
				if ( $this->transaction->ID() ) {
1212
					$TXN_ID = 'EE_Transaction: ' . $this->transaction->ID();
1213
					// don't serialize objects
1214
					$info = $this->_strip_objects( $info );
1215
					if ( ! isset( $debug_data[ $TXN_ID ] ) ) {
1216
						$debug_data[ $TXN_ID ] = array();
1217
					}
1218
					$debug_data[ $TXN_ID ][ microtime() ] = array_merge(
1219
						$default_data,
1220
						$info
1221
					);
1222
					update_option( 'EE_DEBUG_SPCO_' . EE_Session::instance()->id(), $debug_data );
1223
				}
1224
			}
1225
		}
1226
	}
1227
1228
1229
	/**
1230
	 * _strip_objects
1231
	 *
1232
	 * @param array $info
1233
	 * @return array
1234
	 */
1235
	function _strip_objects( $info = array() ) {
1236
		foreach ( $info as $key => $value ) {
1237 View Code Duplication
			if ( is_array( $value )) {
1238
				$info[ $key ] = $this->_strip_objects( $value );
1239
			} else if ( is_object( $value ) ) {
1240
				$object_class = get_class( $value );
1241
				$info[ $object_class ] = array();
1242
				$info[ $object_class ][ 'ID' ] = method_exists( $value, 'ID' ) ? $value->ID() : 0;
1243
				if ( method_exists( $value, 'status' ) ) {
1244
					$info[ $object_class ][ 'status' ] = $value->status();
1245
				} else if ( method_exists( $value, 'status_ID' ) ) {
1246
					$info[ $object_class ][ 'status' ] = $value->status_ID();
1247
				}
1248
				unset( $info[ $key ] );
1249
			}
1250
		}
1251
		return (array)$info;
1252
	}
1253
1254
1255
1256
1257
}
1258
// End of file EE_Checkout.class.php
1259
// Location: /EE_Checkout.class.php