Completed
Branch TASK-9118-extensions-page (04eaec)
by
unknown
38:06 queued 23:39
created

EE_Checkout::log()   D

Complexity

Conditions 10
Paths 57

Size

Total Lines 38
Code Lines 29

Duplication

Lines 0
Ratio 0 %
Metric Value
dl 0
loc 38
rs 4.8196
cc 10
eloc 29
nc 57
nop 5

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
			// advance to the next step
363
			$this->set_current_step( $this->next_step->slug() );
364
			$step_to_skip->set_is_current_step( false );
365
			$step_to_skip->set_completed();
366
			$this->set_reg_step_initiated( $this->current_step );
367
		}
368
	}
369
370
371
372
	/**
373
	 *    remove_reg_step
374
	 *
375
	 * @access    public
376
	 * @param string $reg_step_slug
377
	 * @param bool   $reset whether to reset reg steps after removal
378
	 * @throws EE_Error
379
	 */
380
	public function remove_reg_step( $reg_step_slug = '', $reset = true ) {
381
		unset( $this->reg_steps[ $reg_step_slug  ] );
382
		if ( $this->transaction instanceof EE_Transaction ) {
383
			/** @type EE_Transaction_Processor $transaction_processor */
384
			$transaction_processor = EE_Registry::instance()->load_class( 'Transaction_Processor' );
385
			// now remove reg step from TXN and save
386
			$transaction_processor->remove_reg_step( $this->transaction, $reg_step_slug );
387
			$this->transaction->save();
388
		}
389
		if ( $reset ) {
390
			$this->reset_reg_steps();
391
		}
392
	}
393
394
395
396
	/**
397
	 *    set_reg_step_order
398
	 *
399
	 * @access    public
400
	 * @param string $reg_step_slug
401
	 * @param int    $order
402
	 * @return    void
403
	 */
404
	public function set_reg_step_order( $reg_step_slug = '', $order = 100 ) {
405
		if ( isset( $this->reg_steps[ $reg_step_slug  ] )) {
406
			$this->reg_steps[ $reg_step_slug ]->set_order( $order );
407
		}
408
	}
409
410
411
412
	/**
413
	 *    set_current_step
414
	 *
415
	 * @access    public
416
	 * @param string $current_step
417
	 * @return    void
418
	 */
419
	public function set_current_step( $current_step ) {
420
		// grab what step we're on
421
		$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...
422
		// verify instance
423
		if ( $this->current_step instanceof EE_SPCO_Reg_Step ) {
424
			// we don't want to repeat completed steps if this is the first time through SPCO
425
			if ( $this->continue_reg && $this->current_step->completed() && ! $this->revisit ) {
426
				// so advance to the next step
427
				$this->set_next_step();
428
				if ( $this->next_step instanceof EE_SPCO_Reg_Step ) {
429
					// and attempt to set it as the current step
430
					$this->set_current_step( $this->next_step->slug() );
431
				}
432
				return;
433
			}
434
			$this->current_step->set_is_current_step( TRUE );
435
		} else {
436
			EE_Error::add_error(
437
				__( 'The current step could not be set.', 'event_espresso' ),
438
				__FILE__, __FUNCTION__, __LINE__
439
			);
440
		}
441
	}
442
443
444
445
	/**
446
	 * 	set_next_step
447
	 * advances the reg_steps array pointer and sets the next step, then reverses pointer back to the current step
448
	 *
449
	 *  @access 	public
450
	 *  @return 	void
451
	 */
452
	public function set_next_step() {
453
		// set pointer to start of array
454
		reset( $this->reg_steps );
455
		// if there is more than one step
456
		if ( count( $this->reg_steps ) > 1 ) {
457
			// advance to the current step and set pointer
458
			while ( key( $this->reg_steps ) != $this->current_step->slug() && key( $this->reg_steps ) != '' ) {
459
				next( $this->reg_steps );
460
			}
461
		}
462
		// advance one more spot ( if it exists )
463
		$this->next_step = next( $this->reg_steps );
464
		// verify instance
465
		$this->next_step = $this->next_step instanceof EE_SPCO_Reg_Step ? $this->next_step  : NULL;
466
		// then back to current step to reset
467
		prev( $this->reg_steps );
468
	}
469
470
471
472
473
	/**
474
	 * 	get_next_reg_step
475
	 * 	this simply returns the next step from reg_steps array
476
	 *
477
	 *  @access 	public
478
	 *  @return 	EE_SPCO_Reg_Step | null
479
	 */
480
	public function get_next_reg_step() {
481
		$next = next( $this->reg_steps );
482
		prev( $this->reg_steps );
483
		return $next instanceof EE_SPCO_Reg_Step ? $next : null;
484
	}
485
486
487
488
489
	/**
490
	 * get_prev_reg_step
491
	 * 	this simply returns the previous step from reg_steps array
492
	 *
493
	 *  @access 	public
494
	 *  @return 	EE_SPCO_Reg_Step | null
495
	 */
496
	public function get_prev_reg_step() {
497
		$prev = prev( $this->reg_steps );
498
		next( $this->reg_steps );
499
		return $prev instanceof EE_SPCO_Reg_Step ? $prev : null;
500
	}
501
502
503
504
	/**
505
	 * sort_reg_steps
506
	 *
507
	 * @access public
508
	 * @return void
509
	 */
510
	public function sort_reg_steps() {
511
		$reg_step_sorting_callback = apply_filters( 'FHEE__EE_Checkout__sort_reg_steps__reg_step_sorting_callback', 'reg_step_sorting_callback' );
512
		uasort( $this->reg_steps, array( $this, $reg_step_sorting_callback ));
513
	}
514
515
516
517
	/**
518
	 * find_reg_step
519
	 * finds a reg step by the given slug
520
	 *
521
	 * @access    public
522
	 * @param string $reg_step_slug
523
	 * @return EE_SPCO_Reg_Step|null
524
	 */
525
	public function find_reg_step( $reg_step_slug = '' ) {
526
		if ( ! empty( $reg_step_slug ) ) {
527
			// copy reg step array
528
			$reg_steps = $this->reg_steps;
529
			// set pointer to start of array
530
			reset( $reg_steps );
531
			// if there is more than one step
532
			if ( count( $reg_steps ) > 1 ) {
533
				// advance to the current step and set pointer
534
				while ( key( $reg_steps ) != $reg_step_slug && key( $reg_steps ) != '' ) {
535
					next( $reg_steps );
536
				}
537
				return current( $reg_steps );
538
			}
539
		}
540
		return null;
541
	}
542
543
544
545
	/**
546
	 * reg_step_sorting_callback
547
	 *
548
	 * @access public
549
	 * @param EE_SPCO_Reg_Step $reg_step_A
550
	 * @param EE_SPCO_Reg_Step $reg_step_B
551
	 * @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...
552
	 */
553
	public function reg_step_sorting_callback( EE_SPCO_Reg_Step $reg_step_A, EE_SPCO_Reg_Step $reg_step_B ) {
554
		// send finalize_registration step to the end of the array
555
		if ( $reg_step_A->slug() == 'finalize_registration' ) {
556
			return 1;
557
		} else if ( $reg_step_B->slug() == 'finalize_registration' ) {
558
			return -1;
559
		}
560
		if ( $reg_step_A->order() == $reg_step_B->order() ) {
561
			return 0;
562
		}
563
		return ( $reg_step_A->order() > $reg_step_B->order() ) ? 1 : -1;
564
	}
565
566
567
568
	/**
569
	 * set_reg_step_initiated
570
	 *
571
	 * @access 	public
572
	 * @param 	EE_SPCO_Reg_Step $reg_step
573
	 */
574
	public function set_reg_step_initiated( EE_SPCO_Reg_Step $reg_step ) {
575
		// call set_reg_step_initiated ???
576
		if (
577
			// first time visiting SPCO ?
578
			! $this->revisit
579
			// and displaying the reg step form for the first time ?
580
			&& $this->action === 'display_spco_reg_step'
581
		) {
582
			/** @type EE_Transaction_Processor $transaction_processor */
583
			$transaction_processor = EE_Registry::instance()->load_class( 'Transaction_Processor' );
584
			// set the start time for this reg step
585
			if ( ! $transaction_processor->set_reg_step_initiated( $this->transaction, $reg_step->slug() ) ) {
586 View Code Duplication
				if ( WP_DEBUG ) {
587
					EE_Error::add_error(
588
						sprintf(
589
							__( 'The "%1$s" registration step was not initialized properly.', 'event_espresso' ),
590
							$reg_step->name()
591
						),
592
						__FILE__, __FUNCTION__, __LINE__
593
					);
594
				}
595
			};
596
		}
597
	}
598
599
600
601
	/**
602
	 * 	set_reg_step_JSON_info
603
	 *
604
	 * 	@access public
605
	 * 	@return 	void
606
	 */
607
	public function set_reg_step_JSON_info() {
608
		EE_Registry::$i18n_js_strings[ 'reg_steps' ] = array();
609
		// pass basic reg step data to JS
610
		foreach ( $this->reg_steps as $reg_step ) {
611
			EE_Registry::$i18n_js_strings[ 'reg_steps' ][] = $reg_step->slug();
612
		}
613
		// reset reg step html
614
//		$this->json_response->set_reg_step_html( '' );
615
	}
616
617
618
619
	/**
620
	 * 	reset_reg_steps
621
	 *
622
	 * 	@access public
623
	 * 	@return 	bool
624
	 */
625
	public function reset_reg_steps() {
626
		$this->sort_reg_steps();
627
		$this->set_current_step( EE_Registry::instance()->REQ->get( 'step' ));
628
		$this->set_next_step();
629
		// the text that appears on the reg step form submit button
630
		$this->current_step->set_submit_button_text();
631
		$this->set_reg_step_JSON_info();
632
	}
633
634
635
636
	/**
637
	 *    get_registration_time_limit
638
	 *
639
	 * @access    public
640
	 * @return        string
641
	 */
642
	public function get_registration_time_limit() {
643
644
		$registration_time_limit = (float)( EE_Registry::instance()	->SSN->expiration() - time() );
645
		$time_limit_format = $registration_time_limit > 60 * MINUTE_IN_SECONDS ? 'H:i:s' : 'i:s';
646
		$registration_time_limit = gmdate( $time_limit_format, $registration_time_limit );
647
		return apply_filters(
648
			'FHEE__EE_Checkout__get_registration_time_limit__registration_time_limit',
649
			$registration_time_limit
650
		);
651
	}
652
653
654
655
	/**
656
	 * payment_required
657
	 * @return boolean
658
	 */
659
	public function payment_required() {
660
		// if NOT:
661
		//		registration via admin
662
		//		completed TXN
663
		//		overpaid TXN
664
		//		free TXN ( total = 0.00 )
665
		// then payment required is TRUE
666
		return ! ( $this->admin_request || $this->transaction->is_completed() || $this->transaction->is_overpaid() || $this->transaction->is_free() ) ? TRUE : FALSE;
667
	}
668
669
670
671
	/**
672
	 * 	initialize_txn_reg_steps_array
673
	 *
674
	 * 	@access public
675
	 * 	@return 	array
676
	 */
677
	public function initialize_txn_reg_steps_array() {
678
		$txn_reg_steps_array = array();
679
		foreach ( $this->reg_steps as $reg_step ) {
680
			$txn_reg_steps_array[ $reg_step->slug() ] = FALSE;
681
		}
682
		return $txn_reg_steps_array;
683
	}
684
685
686
687
	/**
688
	 * 	update_txn_reg_steps_array
689
	 *
690
	 * 	@access public
691
	 * 	@return 	bool
692
	 */
693
	public function update_txn_reg_steps_array() {
694
		$updated = FALSE;
695
		/** @type EE_Transaction_Processor $transaction_processor */
696
		$transaction_processor = EE_Registry::instance()->load_class( 'Transaction_Processor' );
697
		foreach ( $this->reg_steps as $reg_step ) {
698
			if ( $reg_step->completed() ) {
699
				$updated = $transaction_processor->set_reg_step_completed( $this->transaction, $reg_step->slug() ) ? TRUE : $updated;
700
			}
701
		}
702
		if ( $updated ) {
703
			$this->transaction->save();
704
		}
705
		return $updated;
706
	}
707
708
709
710
	/**
711
	 * 	stash_transaction_and_checkout
712
	 *
713
	 * 	@access public
714
	 * 	@return 	void
715
	 */
716
	public function stash_transaction_and_checkout() {
717
		if ( ! $this->revisit ) {
718
			$this->update_txn_reg_steps_array();
719
		}
720
		$this->track_transaction_and_registration_status_updates();
721
		// save all data to the db, but suppress errors
722
		//$this->save_all_data( FALSE );
723
		// cache the checkout in the session
724
		EE_Registry::instance()->SSN->set_checkout( $this );
725
	}
726
727
728
729
730
	/**
731
	 *    track_transaction_and_registration_status_updates
732
	 *
733
	 * 	stores whether any updates were made to the TXN or it's related registrations
734
	 *
735
	 * 	@access public
736
	 * 	@return 	bool
737
	 */
738
	public function track_transaction_and_registration_status_updates() {
739
		// verify the transaction
740
		if ( $this->transaction instanceof EE_Transaction ) {
741
			/** @type EE_Transaction_Payments $transaction_payments */
742
			$transaction_payments = EE_Registry::instance()->load_class( 'Transaction_Payments' );
743
			/** @type EE_Transaction_Processor $transaction_processor */
744
			$transaction_processor = EE_Registry::instance()->load_class( 'Transaction_Processor' );
745
			// has there been a TXN status change during this checkout?
746
			if ( $transaction_payments->txn_status_updated() || $transaction_processor->txn_status_updated() ) {
747
				$this->txn_status_updated = true;
748
			}
749
			/** @type EE_Registration_Processor $registration_processor */
750
			$registration_processor = EE_Registry::instance()->load_class( 'Registration_Processor' );
751
			// grab the saved registrations from the transaction
752
			foreach ( $this->transaction->registrations( $this->reg_cache_where_params ) as $registration ) {
753
				if ( $registration_processor->reg_status_updated( $registration->ID() ) ) {
754
					$this->set_reg_status_updated( $registration->ID(), true );
755
				}
756
			}
757
		}
758
	}
759
760
761
762
763
	/**
764
	 * 	visit_allows_processing_of_this_registration
765
	 *
766
	 * 	determines if the current SPCO visit should allow the passed EE_Registration to be used in processing.
767
	 * 	one of the following conditions must be met:
768
	 * 		EITHER: 	A) first time thru SPCO -> process ALL registrations ( NOT a revisit )
769
	 * 		OR : 		B) primary registrant is editing info -> process ALL registrations ( primary_revisit )
770
	 * 		OR : 		C) another registrant is editing info -> ONLY process their registration ( revisit AND their reg_url_link matches )
771
	 *
772
	 * 	@access public
773
	 * @param 	EE_Registration 	$registration
774
	 * 	@return 	bool
775
	 */
776
	public function visit_allows_processing_of_this_registration( EE_Registration $registration ) {
777
		return ! $this->revisit || $this->primary_revisit || ( $this->revisit && $this->reg_url_link == $registration->reg_url_link() ) ? TRUE : FALSE;
778
	}
779
780
781
782
	/**
783
	 * 	_transaction_has_primary_registration
784
	 *
785
	 * 	@access 		private
786
	 * 	@return 		bool
787
	 */
788
	public function transaction_has_primary_registrant() {
789
		return $this->primary_attendee_obj instanceof EE_Attendee ? TRUE : FALSE;
790
	}
791
792
793
794
	/**
795
	 *    save_all_data
796
	 *    simply loops through the current transaction and saves all data for each registration
797
	 *
798
	 * @access public
799
	 * @param bool $show_errors
800
	 * @return bool
801
	 */
802
	public function save_all_data( $show_errors = TRUE ) {
803
		// verify the transaction
804
		if ( $this->transaction instanceof EE_Transaction ) {
805
			// save to ensure that TXN has ID
806
			$this->transaction->save();
807
			// grab the saved registrations from the transaction
808
			foreach ( $this->transaction->registrations( $this->reg_cache_where_params ) as  $registration ) {
809
				$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...
810
			}
811
		} else {
812
			if ( $show_errors ) {
813
				EE_Error::add_error( __( 'A valid Transaction was not found when attempting to save your registration information.', 'event_espresso' ), __FILE__, __FUNCTION__, __LINE__);
814
			}
815
			return FALSE;
816
		}
817
		return TRUE;
818
	}
819
820
821
	/**
822
	 * _save_registration_attendee
823
	 *
824
	 * @param 	EE_Registration 	$registration
825
	 * @param bool $show_errors
826
	 * @return void
827
	 */
828
	private function _save_registration( $registration, $show_errors = TRUE  ) {
829
		// verify object
830
		if ( $registration instanceof EE_Registration ) {
831
			// should this registration be processed during this visit ?
832
			if ( $this->visit_allows_processing_of_this_registration( $registration ) ) {
833
				//set TXN ID
834
				if ( ! $registration->transaction_ID() ) {
835
					$registration->set_transaction_id( $this->transaction->ID() );
836
				}
837
				// verify and save the attendee
838
				$this->_save_registration_attendee( $registration, $show_errors );
839
				// save answers to reg form questions
840
				$this->_save_registration_answers( $registration, $show_errors );
841
				// save changes
842
				$registration->save();
843
				// update txn cache
844 View Code Duplication
				if ( ! $this->transaction->update_cache_after_object_save( 'Registration', $registration )) {
845
					if ( $show_errors ) {
846
						EE_Error::add_error( __( 'The newly saved Registration object could not be cached on the Transaction.', 'event_espresso' ), __FILE__, __FUNCTION__, __LINE__);
847
					}
848
				}
849
			}
850
		} else {
851
			if ( $show_errors ) {
852
				EE_Error::add_error(
853
					__( 'An invalid Registration object was discovered when attempting to save your registration information.', 'event_espresso' ),
854
					__FILE__, __FUNCTION__, __LINE__
855
				);
856
			}
857
		}
858
	}
859
860
861
862
	/**
863
	 * _save_registration_attendee
864
	 *
865
	 * @param 	EE_Registration 	$registration
866
	 * @param bool $show_errors
867
	 * @return void
868
	 */
869
	private function _save_registration_attendee( $registration, $show_errors = TRUE ) {
870
		if ( $registration->attendee() instanceof EE_Attendee ) {
871
			// save so that ATT has ID
872
			$registration->attendee()->save();
873 View Code Duplication
			if ( ! $registration->update_cache_after_object_save( 'Attendee', $registration->attendee() )) {
874
				if ( $show_errors ) {
875
					EE_Error::add_error(
876
						__( 'The newly saved Attendee object could not be cached on the registration.', 'event_espresso' ),
877
						__FILE__, __FUNCTION__, __LINE__
878
					);
879
				}
880
			}
881
		} else {
882
			if ( $show_errors ) {
883
				ob_start();
884
				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...
885
				EE_Error::add_error(
886
					sprintf(
887
						'%1$s||%1$s $attendee = %2$s',
888
						__( 'Either no Attendee information was found, or an invalid Attendee object was discovered when attempting to save your registration information.', 'event_espresso' ),
889
						ob_get_clean()
890
					),
891
					__FILE__, __FUNCTION__, __LINE__
892
				);
893
			}
894
		}
895
	}
896
897
898
899
	/**
900
	 * _save_question_answers
901
	 *
902
	 * @param 	EE_Registration 	$registration
903
	 * @param bool $show_errors
904
	 * @return void
905
	 */
906
	private function _save_registration_answers( $registration, $show_errors = TRUE ) {
907
		// now save the answers
908
		foreach ( $registration->answers() as $cache_key => $answer ) {
909
			// verify object
910
			if ( $answer instanceof EE_Answer ) {
911
				$answer->set_registration( $registration->ID() );
912
				$answer->save();
913
				if ( ! $registration->update_cache_after_object_save( 'Answer', $answer, $cache_key )) {
914
					if ( $show_errors ) {
915
						EE_Error::add_error(
916
							__( 'The newly saved Answer object could not be cached on the registration.', 'event_espresso' ),
917
							__FILE__, __FUNCTION__, __LINE__
918
						);
919
					}
920
				}
921
			} else {
922
				if ( $show_errors ) {
923
					EE_Error::add_error(
924
						__( 'An invalid Answer object was discovered when attempting to save your registration information.', 'event_espresso' ),
925
						__FILE__, __FUNCTION__, __LINE__
926
					);
927
				}
928
			}
929
		}
930
	}
931
932
933
934
	/**
935
	 *    refresh_all_entities
936
	 *   will either refresh the entity map with objects form the db or from the checkout cache
937
	 *
938
	 * @access public
939
	 * @param bool $from_db
940
	 * @return bool
941
	 */
942
	public function refresh_all_entities( $from_db = false ) {
943
		$from_db = $this->current_step->is_final_step() || $this->action == 'process_gateway_response' ? true : $from_db;
944
		//$this->log(
945
		//	__CLASS__, __FUNCTION__, __LINE__,
946
		//	array( 'from_db' =>$from_db )
947
		//);
948
		return $from_db ? $this->refresh_from_db() : $this->refresh_entity_map();
949
	}
950
951
952
953
	/**
954
	 *  refresh_entity_map
955
	 *  simply loops through the current transaction and updates each
956
	 *  model's entity map using EEM_Base::refresh_entity_map_from_db()
957
	 *
958
	 * @access public
959
	 * @return bool
960
	 */
961
	protected function refresh_from_db() {
962
		// verify the transaction
963
		if ( $this->transaction instanceof EE_Transaction && $this->transaction->ID() ) {
964
			// pull fresh TXN data from the db
965
			$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...
966
			// update EE_Checkout's cached primary_attendee object
967
			$this->primary_attendee_obj = $this->_refresh_primary_attendee_obj_from_db( $this->transaction );
968
			// update EE_Checkout's cached payment object
969
			$payment = $this->transaction->last_payment();
970
			$this->payment = $payment instanceof EE_Payment ? $payment : $this->payment;
971
			// update EE_Checkout's cached payment_method object
972
			$payment_method = $this->payment instanceof EE_Payment ? $this->payment->payment_method() : null;
973
			$this->payment_method = $payment_method instanceof EE_Payment_Method ? $payment_method : $this->payment_method;
974
			//now refresh the cart, based on the TXN
975
			$this->cart = EE_Cart::get_cart_from_txn( $this->transaction );
976
			// verify and update the cart because inaccurate totals are not so much fun
977
			if ( $this->cart instanceof EE_Cart ) {
978
				$this->cart->get_grand_total()->recalculate_total_including_taxes();
979
			} else {
980
				$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...
981
			}
982
		} else {
983
			EE_Error::add_error( __( 'A valid Transaction was not found when attempting to update the model entity mapper.', 'event_espresso' ), __FILE__, __FUNCTION__, __LINE__);
984
			return FALSE;
985
		}
986
		return TRUE;
987
	}
988
989
990
991
	/**
992
	 * _refresh_primary_attendee_obj_from_db
993
	 *
994
	 * @param   EE_Transaction $transaction
995
	 * @return  EE_Attendee | null
996
	 */
997
	protected function _refresh_primary_attendee_obj_from_db( EE_Transaction $transaction ) {
998
999
		$primary_attendee_obj = null;
1000
		// grab the saved registrations from the transaction
1001
		foreach ( $transaction->registrations( $this->reg_cache_where_params, true ) as $registration ) {
1002
			// verify object
1003
			if ( $registration instanceof EE_Registration ) {
1004
				$attendee = $registration->attendee();
1005
				// verify object
1006
				if ( $attendee instanceof EE_Attendee  ) {
1007
					// maybe cache primary_attendee_obj ?
1008
					if ( $registration->is_primary_registrant() ) {
1009
						$primary_attendee_obj = $attendee;
1010
					}
1011
				}
1012
			} else {
1013
				EE_Error::add_error(
1014
						__( 'An invalid Registration object was discovered when attempting to update the model entity mapper.', 'event_espresso' ),
1015
						__FILE__, __FUNCTION__, __LINE__
1016
				);
1017
			}
1018
		}
1019
		return $primary_attendee_obj;
1020
	}
1021
1022
1023
1024
	/**
1025
	 *  refresh_entity_map
1026
	 *  simply loops through the current transaction and updates
1027
	 *  each model's entity map using EEM_Base::refresh_entity_map_with()
1028
	 *
1029
	 * @access public
1030
	 * @return bool
1031
	 */
1032
	protected function refresh_entity_map() {
1033
		// verify the transaction
1034
		if ( $this->transaction instanceof EE_Transaction && $this->transaction->ID() ) {
1035
			// never cache payment info
1036
			$this->transaction->clear_cache( 'Payment' );
1037
			/** @type EE_Transaction_Processor $transaction_processor */
1038
			$transaction_processor = EE_Registry::instance()->load_class( 'Transaction_Processor' );
1039
			// is the Payment Options Reg Step completed ?
1040
			if ( $transaction_processor->reg_step_completed( $this->transaction, 'payment_options' ) ) {
1041
				// then check for payments and update TXN accordingly
1042
				/** @type EE_Transaction_Payments $transaction_payments */
1043
				$transaction_payments = EE_Registry::instance()->load_class( 'Transaction_Payments' );
1044
				$transaction_payments->calculate_total_payments_and_update_status( $this->transaction );
1045
			}
1046
			// grab the saved registrations from the transaction
1047
			foreach ( $this->transaction->registrations( $this->reg_cache_where_params ) as $reg_cache_ID => $registration ) {
1048
				$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...
1049
			}
1050
			// make sure our cached TXN is added to the model entity mapper
1051
			$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...
1052
1053
		} else {
1054
			EE_Error::add_error( __( 'A valid Transaction was not found when attempting to update the model entity mapper.', 'event_espresso' ), __FILE__, __FUNCTION__, __LINE__);
1055
			return FALSE;
1056
		}
1057
		// verify and update the cart because inaccurate totals are not so much fun
1058
		if ( $this->cart instanceof EE_Cart ) {
1059
			$grand_total = $this->cart->get_grand_total();
1060
			if ( $grand_total instanceof EE_Line_Item && $grand_total->ID() ) {
1061
				$grand_total->recalculate_total_including_taxes();
1062
				$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...
1063
					$this->cart->get_grand_total()->ID(),
1064
					$this->cart->get_grand_total()
1065
				);
1066
			}
1067 View Code Duplication
			if ( $grand_total instanceof EE_Line_Item ) {
1068
				$this->cart = EE_Cart::instance( $grand_total );
1069
			} else {
1070
				EE_Error::add_error( __( 'A valid Cart was not found when attempting to update the model entity mapper.', 'event_espresso' ), __FILE__, __FUNCTION__, __LINE__ );
1071
				return false;
1072
			}
1073
		}
1074
		return TRUE;
1075
	}
1076
1077
1078
1079
	/**
1080
	 * _refresh_registration
1081
	 *
1082
	 * @param 	string | int 	$reg_cache_ID
1083
	 * @param 	EE_Registration 	$registration
1084
	 * @return void
1085
	 */
1086
	protected function _refresh_registration( $reg_cache_ID, $registration ) {
1087
1088
		// verify object
1089 View Code Duplication
		if ( $registration instanceof EE_Registration ) {
1090
			// update the entity mapper attendee
1091
			$this->_refresh_registration_attendee( $registration );
1092
			// update the entity mapper answers for reg form questions
1093
			$this->_refresh_registration_answers( $registration );
1094
			// make sure the cached registration is added to the model entity mapper
1095
			$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...
1096
		} else {
1097
			EE_Error::add_error(
1098
				__( 'An invalid Registration object was discovered when attempting to update the model entity mapper.', 'event_espresso' ),
1099
				__FILE__, __FUNCTION__, __LINE__
1100
			);
1101
		}
1102
	}
1103
1104
1105
1106
	/**
1107
	 * _save_registration_attendee
1108
	 *
1109
	 * @param 	EE_Registration 	$registration
1110
	 * @return void
1111
	 */
1112
	protected function _refresh_registration_attendee( $registration ) {
1113
1114
		$attendee = $registration->attendee();
1115
		// verify object
1116
		if ( $attendee instanceof EE_Attendee && $attendee->ID() ) {
1117
			// make sure the cached attendee is added to the model entity mapper
1118
			$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...
1119
			// maybe cache primary_attendee_obj ?
1120
			if ( $registration->is_primary_registrant() ) {
1121
				$this->primary_attendee_obj = $attendee;
1122
			}
1123
		}
1124
	}
1125
1126
1127
1128
	/**
1129
	 * _refresh_registration_answers
1130
	 *
1131
	 * @param 	EE_Registration 	$registration
1132
	 * @return void
1133
	 */
1134
	protected function _refresh_registration_answers( $registration ) {
1135
1136
		// now update the answers
1137
		foreach ( $registration->answers() as $cache_key => $answer ) {
1138
			// verify object
1139 View Code Duplication
			if ( $answer instanceof EE_Answer ) {
1140
				if ( $answer->ID() ) {
1141
					// make sure the cached answer is added to the model entity mapper
1142
					$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...
1143
				}
1144
			} else {
1145
				EE_Error::add_error(
1146
					__( 'An invalid Answer object was discovered when attempting to update the model entity mapper.', 'event_espresso' ),
1147
					__FILE__, __FUNCTION__, __LINE__
1148
				);
1149
			}
1150
		}
1151
	}
1152
1153
1154
1155
	/**
1156
	 * 	__wakeup
1157
	 * to conserve db space, we are removing the EE_Checkout object from EE_SPCO_Reg_Step objects upon serialization
1158
	 * this will reinstate the EE_Checkout object on each EE_SPCO_Reg_Step object
1159
	 */
1160
	function __wakeup() {
1161
		foreach ( $this->reg_steps as $reg_step ) {
1162
			$reg_step->checkout = $this;
1163
		}
1164
	}
1165
1166
1167
1168
	/**
1169
	 * debug
1170
	 *
1171
	 * @param string $class
1172
	 * @param string $func
1173
	 * @param string $line
1174
	 * @param array $info
1175
	 * @param bool $display_request
1176
	 */
1177
	function log( $class = '', $func = '', $line = '', $info = array(), $display_request = false ) {
1178
		if ( WP_DEBUG && false ) {
1179
			$debug_data = get_option( 'EE_DEBUG_SPCO_' . EE_Session::instance()->id(), array() );
1180
			$default_data = array(
1181
				$class 		=> $func . '() : ' . $line,
1182
				'request->step' 		=> $this->step,
1183
				'request->action' 	=> $this->action,
1184
				'current_step->slug' => $this->current_step instanceof EE_SPCO_Reg_Step ?
1185
					$this->current_step->slug() : '',
1186
				'current_step->completed' => $this->current_step instanceof EE_SPCO_Reg_Step ?
1187
					$this->current_step->completed() : '',
1188
				'txn_status_updated' => $this->txn_status_updated,
1189
				'reg_status_updated' => $this->reg_status_updated,
1190
				'reg_url_link' => $this->reg_url_link,
1191
				'REQ' => $display_request ? $_REQUEST : '',
1192
			);
1193
			if ( $this->transaction instanceof EE_Transaction ) {
1194
				$default_data[ 'TXN_status' ] 		= $this->transaction->status_ID();
1195
				$default_data[ 'TXN_reg_steps' ] 	= $this->transaction->reg_steps();
1196
				foreach ( $this->transaction->registrations( $this->reg_cache_where_params ) as $REG_ID => $registration ) {
1197
					$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...
1198
				}
1199
				if ( $this->transaction->ID() ) {
1200
					$TXN_ID = 'EE_Transaction: ' . $this->transaction->ID();
1201
					// don't serialize objects
1202
					$info = $this->_strip_objects( $info );
1203
					if ( ! isset( $debug_data[ $TXN_ID ] ) ) {
1204
						$debug_data[ $TXN_ID ] = array();
1205
					}
1206
					$debug_data[ $TXN_ID ][ microtime() ] = array_merge(
1207
						$default_data,
1208
						$info
1209
					);
1210
					update_option( 'EE_DEBUG_SPCO_' . EE_Session::instance()->id(), $debug_data );
1211
				}
1212
			}
1213
		}
1214
	}
1215
1216
1217
	/**
1218
	 * _strip_objects
1219
	 *
1220
	 * @param array $info
1221
	 * @return array
1222
	 */
1223
	function _strip_objects( $info = array() ) {
1224
		foreach ( $info as $key => $value ) {
1225 View Code Duplication
			if ( is_array( $value )) {
1226
				$info[ $key ] = $this->_strip_objects( $value );
1227
			} else if ( is_object( $value ) ) {
1228
				$object_class = get_class( $value );
1229
				$info[ $object_class ] = array();
1230
				$info[ $object_class ][ 'ID' ] = method_exists( $value, 'ID' ) ? $value->ID() : 0;
1231
				if ( method_exists( $value, 'status' ) ) {
1232
					$info[ $object_class ][ 'status' ] = $value->status();
1233
				} else if ( method_exists( $value, 'status_ID' ) ) {
1234
					$info[ $object_class ][ 'status' ] = $value->status_ID();
1235
				}
1236
				unset( $info[ $key ] );
1237
			}
1238
		}
1239
		return (array)$info;
1240
	}
1241
1242
1243
1244
1245
}
1246
// End of file EE_Checkout.class.php
1247
// Location: /EE_Checkout.class.php