Completed
Branch FET/extra-logging-when-trashin... (2b1ce3)
by
unknown
06:42 queued 04:47
created
core/business/EE_Registration_Processor.class.php 2 patches
Indentation   +763 added lines, -763 removed lines patch added patch discarded remove patch
@@ -24,767 +24,767 @@
 block discarded – undo
24 24
 class EE_Registration_Processor extends EE_Processor_Base
25 25
 {
26 26
 
27
-    /**
28
-     * @var EE_Registration_Processor $_instance
29
-     * @access    private
30
-     */
31
-    private static $_instance;
32
-
33
-    /**
34
-     * initial reg status at the beginning of this request.
35
-     * indexed by registration ID
36
-     *
37
-     * @var array
38
-     */
39
-    protected $_old_reg_status = array();
40
-
41
-    /**
42
-     * reg status at the end of the request after all processing.
43
-     * indexed by registration ID
44
-     *
45
-     * @var array
46
-     */
47
-    protected $_new_reg_status = array();
48
-
49
-    /**
50
-     * amounts paid at the end of the request after all processing.
51
-     * indexed by registration ID
52
-     *
53
-     * @var array
54
-     */
55
-    protected static $_amount_paid = array();
56
-
57
-    /**
58
-     * Cache of the reg final price for registrations corresponding to a ticket line item
59
-     *
60
-     * @deprecated
61
-     * @var array @see EEH_Line_Item::calculate_reg_final_prices_per_line_item()'s return value
62
-     */
63
-    protected $_reg_final_price_per_tkt_line_item;
64
-
65
-    /**
66
-     * @var EE_Request $request
67
-     */
68
-    protected $request;
69
-
70
-
71
-    /**
72
-     * @singleton method used to instantiate class object
73
-     * @param EE_Request|null $request
74
-     * @return EE_Registration_Processor instance
75
-     * @throws \InvalidArgumentException
76
-     * @throws \EventEspresso\core\exceptions\InvalidInterfaceException
77
-     * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
78
-     */
79
-    public static function instance(EE_Request $request = null)
80
-    {
81
-        // check if class object is instantiated
82
-        if (! self::$_instance instanceof EE_Registration_Processor) {
83
-            if (! $request instanceof EE_Request) {
84
-                $request = LoaderFactory::getLoader()->getShared('EE_Request');
85
-            }
86
-            self::$_instance = new self($request);
87
-        }
88
-        return self::$_instance;
89
-    }
90
-
91
-
92
-    /**
93
-     * EE_Registration_Processor constructor.
94
-     *
95
-     * @param EE_Request $request
96
-     */
97
-    public function __construct(EE_Request $request)
98
-    {
99
-        $this->request = $request;
100
-    }
101
-
102
-
103
-    /**
104
-     * @param int $REG_ID
105
-     * @return string
106
-     */
107
-    public function old_reg_status($REG_ID)
108
-    {
109
-        return isset($this->_old_reg_status[ $REG_ID ]) ? $this->_old_reg_status[ $REG_ID ] : null;
110
-    }
111
-
112
-
113
-    /**
114
-     * @param int    $REG_ID
115
-     * @param string $old_reg_status
116
-     */
117
-    public function set_old_reg_status($REG_ID, $old_reg_status)
118
-    {
119
-        // only set the first time
120
-        if (! isset($this->_old_reg_status[ $REG_ID ])) {
121
-            $this->_old_reg_status[ $REG_ID ] = $old_reg_status;
122
-        }
123
-    }
124
-
125
-
126
-    /**
127
-     * @param int $REG_ID
128
-     * @return string
129
-     */
130
-    public function new_reg_status($REG_ID)
131
-    {
132
-        return isset($this->_new_reg_status[ $REG_ID ]) ? $this->_new_reg_status[ $REG_ID ] : null;
133
-    }
134
-
135
-
136
-    /**
137
-     * @param int    $REG_ID
138
-     * @param string $new_reg_status
139
-     */
140
-    public function set_new_reg_status($REG_ID, $new_reg_status)
141
-    {
142
-        $this->_new_reg_status[ $REG_ID ] = $new_reg_status;
143
-    }
144
-
145
-
146
-    /**
147
-     * reg_status_updated
148
-     *
149
-     * @param int $REG_ID
150
-     * @return bool
151
-     */
152
-    public function reg_status_updated($REG_ID)
153
-    {
154
-        return $this->new_reg_status($REG_ID) !== $this->old_reg_status($REG_ID);
155
-    }
156
-
157
-
158
-    /**
159
-     * @param EE_Registration $registration
160
-     * @throws EE_Error
161
-     * @throws EntityNotFoundException
162
-     * @throws InvalidArgumentException
163
-     * @throws InvalidDataTypeException
164
-     * @throws InvalidInterfaceException
165
-     * @throws ReflectionException
166
-     * @throws RuntimeException
167
-     */
168
-    public function update_registration_status_and_trigger_notifications(EE_Registration $registration)
169
-    {
170
-        $this->toggle_incomplete_registration_status_to_default($registration, false);
171
-        $this->toggle_registration_status_for_default_approved_events($registration, false);
172
-        $this->toggle_registration_status_if_no_monies_owing($registration, false);
173
-        $registration->save();
174
-        // trigger notifications
175
-        $this->trigger_registration_update_notifications($registration);
176
-    }
177
-
178
-
179
-    /**
180
-     *    manually_update_registration_status
181
-     *
182
-     * @access public
183
-     * @param EE_Registration $registration
184
-     * @param string          $new_reg_status
185
-     * @param bool            $save TRUE will save the registration if the status is updated, FALSE will leave that up
186
-     *                              to client code
187
-     * @return bool
188
-     * @throws EE_Error
189
-     * @throws EntityNotFoundException
190
-     * @throws InvalidArgumentException
191
-     * @throws InvalidDataTypeException
192
-     * @throws InvalidInterfaceException
193
-     * @throws ReflectionException
194
-     * @throws RuntimeException
195
-     */
196
-    public function manually_update_registration_status(
197
-        EE_Registration $registration,
198
-        $new_reg_status = '',
199
-        $save = true
200
-    ) {
201
-        // set initial REG_Status
202
-        $this->set_old_reg_status($registration->ID(), $registration->status_ID());
203
-        // set incoming REG_Status
204
-        $this->set_new_reg_status($registration->ID(), $new_reg_status);
205
-        // toggle reg status but only if it has changed and the user can do so
206
-        if ($this->reg_status_updated($registration->ID())
207
-            && (
208
-                (! $this->request->isAdmin() || $this->request->isFrontAjax())
209
-                || EE_Registry::instance()->CAP->current_user_can(
210
-                    'ee_edit_registration',
211
-                    'toggle_registration_status',
212
-                    $registration->ID()
213
-                )
214
-            )
215
-        ) {
216
-            // change status to new value
217
-            $updated = $registration->set_status($this->new_reg_status($registration->ID()));
218
-            if ($updated && $save) {
219
-                $registration->save();
220
-            }
221
-            return true;
222
-        }
223
-        return false;
224
-    }
225
-
226
-
227
-    /**
228
-     *    toggle_incomplete_registration_status_to_default
229
-     *        changes any incomplete registrations to either the event or global default registration status
230
-     *
231
-     * @access public
232
-     * @param EE_Registration       $registration
233
-     * @param bool                  $save TRUE will save the registration if the status is updated, FALSE will leave
234
-     *                                    that up to client code
235
-     * @param ContextInterface|null $context
236
-     * @return void
237
-     * @throws EE_Error
238
-     * @throws InvalidArgumentException
239
-     * @throws ReflectionException
240
-     * @throws RuntimeException
241
-     * @throws EntityNotFoundException
242
-     * @throws InvalidDataTypeException
243
-     * @throws InvalidInterfaceException
244
-     */
245
-    public function toggle_incomplete_registration_status_to_default(
246
-        EE_Registration $registration,
247
-        $save = true,
248
-        ContextInterface $context = null
249
-    ) {
250
-        $existing_reg_status = $registration->status_ID();
251
-        // set initial REG_Status
252
-        $this->set_old_reg_status($registration->ID(), $existing_reg_status);
253
-        // is the registration currently incomplete ?
254
-        if ($registration->status_ID() === EEM_Registration::status_id_incomplete) {
255
-            // grab default reg status for the event, if set
256
-            $event_default_registration_status = $registration->event()->default_registration_status();
257
-            // if no default reg status is set for the event, then use the global value
258
-            $STS_ID = ! empty($event_default_registration_status)
259
-                ? $event_default_registration_status
260
-                : EE_Registry::instance()->CFG->registration->default_STS_ID;
261
-            // if the event default reg status is approved, then downgrade temporarily to payment pending to ensure that payments are triggered
262
-            $STS_ID = $STS_ID === EEM_Registration::status_id_approved ? EEM_Registration::status_id_pending_payment
263
-                : $STS_ID;
264
-            // set incoming REG_Status
265
-            $this->set_new_reg_status($registration->ID(), $STS_ID);
266
-            $registration->set_status($STS_ID, false, $context);
267
-            if ($save) {
268
-                $registration->save();
269
-            }
270
-            // don't trigger notifications during IPNs because they will get triggered by EE_Payment_Processor
271
-            if (! EE_Processor_Base::$IPN) {
272
-                // otherwise, send out notifications
273
-                add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10);
274
-            }
275
-            // DEBUG LOG
276
-            // $this->log(
277
-            //     __CLASS__,
278
-            //     __FUNCTION__,
279
-            //     __LINE__,
280
-            //     $registration->transaction(),
281
-            //     array(
282
-            //         'IPN' => EE_Processor_Base::$IPN,
283
-            //         'deliver_notifications' => has_filter(
284
-            //             'FHEE__EED_Messages___maybe_registration__deliver_notifications'
285
-            //         ),
286
-            //     )
287
-            // );
288
-        }
289
-    }
290
-
291
-
292
-    /**
293
-     *    toggle_registration_status_for_default_approved_events
294
-     *
295
-     * @access public
296
-     * @param EE_Registration $registration
297
-     * @param bool            $save TRUE will save the registration if the status is updated, FALSE will leave that up
298
-     *                              to client code
299
-     * @return bool
300
-     * @throws EE_Error
301
-     * @throws EntityNotFoundException
302
-     * @throws InvalidArgumentException
303
-     * @throws InvalidDataTypeException
304
-     * @throws InvalidInterfaceException
305
-     * @throws ReflectionException
306
-     * @throws RuntimeException
307
-     */
308
-    public function toggle_registration_status_for_default_approved_events(EE_Registration $registration, $save = true)
309
-    {
310
-        $reg_status = $registration->status_ID();
311
-        // set initial REG_Status
312
-        $this->set_old_reg_status($registration->ID(), $reg_status);
313
-        // if not already, toggle reg status to approved IF the event default reg status is approved
314
-        // ( as long as the registration wasn't cancelled or declined at some point )
315
-        if ($reg_status !== EEM_Registration::status_id_cancelled
316
-            && $reg_status
317
-               !== EEM_Registration::status_id_declined
318
-            && $reg_status !== EEM_Registration::status_id_approved
319
-            && $registration->event()->default_registration_status() === EEM_Registration::status_id_approved
320
-        ) {
321
-            // set incoming REG_Status
322
-            $this->set_new_reg_status($registration->ID(), EEM_Registration::status_id_approved);
323
-            // toggle status to approved
324
-            $registration->set_status(EEM_Registration::status_id_approved);
325
-            if ($save) {
326
-                $registration->save();
327
-            }
328
-            // don't trigger notifications during IPNs because they will get triggered by EE_Payment_Processor
329
-            if (! EE_Processor_Base::$IPN) {
330
-                // otherwise, send out notifications
331
-                add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10);
332
-            }
333
-            // DEBUG LOG
334
-            // $this->log(
335
-            //     __CLASS__,
336
-            //     __FUNCTION__,
337
-            //     __LINE__,
338
-            //     $registration->transaction(),
339
-            //     array(
340
-            //         'IPN' => EE_Processor_Base::$IPN,
341
-            //         'deliver_notifications' => has_filter(
342
-            //             'FHEE__EED_Messages___maybe_registration__deliver_notifications'
343
-            //         ),
344
-            //     )
345
-            // );
346
-            return true;
347
-        }
348
-        return false;
349
-    }
350
-
351
-
352
-    /**
353
-     *    toggle_registration_statuses_if_no_monies_owing
354
-     *
355
-     * @access public
356
-     * @param EE_Registration $registration
357
-     * @param bool            $save TRUE will save the registration if the status is updated, FALSE will leave that up
358
-     *                              to client code
359
-     * @param array           $additional_details
360
-     * @return bool
361
-     * @throws EE_Error
362
-     * @throws EntityNotFoundException
363
-     * @throws InvalidArgumentException
364
-     * @throws InvalidDataTypeException
365
-     * @throws InvalidInterfaceException
366
-     * @throws ReflectionException
367
-     * @throws RuntimeException
368
-     */
369
-    public function toggle_registration_status_if_no_monies_owing(
370
-        EE_Registration $registration,
371
-        $save = true,
372
-        array $additional_details = array()
373
-    ) {
374
-        // set initial REG_Status
375
-        $this->set_old_reg_status($registration->ID(), $registration->status_ID());
376
-        // was a payment just made ?
377
-        $payment = isset($additional_details['payment_updates'], $additional_details['last_payment'])
378
-                   && $additional_details['payment_updates']
379
-                   && $additional_details['last_payment'] instanceof EE_Payment
380
-            ? $additional_details['last_payment']
381
-            : null;
382
-        $total_paid = array_sum(self::$_amount_paid);
383
-        // toggle reg status to approved IF
384
-        if (// REG status is pending payment
385
-            $registration->status_ID() === EEM_Registration::status_id_pending_payment
386
-            // AND no monies are owing
387
-            && (
388
-                (
389
-                    $registration->transaction()->is_completed()
390
-                    || $registration->transaction()->is_overpaid()
391
-                    || $registration->transaction()->is_free()
392
-                    || apply_filters(
393
-                        'FHEE__EE_Registration_Processor__toggle_registration_status_if_no_monies_owing',
394
-                        false,
395
-                        $registration
396
-                    )
397
-                )
398
-                || (
399
-                    $payment instanceof EE_Payment && $payment->is_approved()
400
-                    && // this specific registration has not yet been paid for
401
-                    ! isset(self::$_amount_paid[ $registration->ID() ])
402
-                    && // payment amount, less what we have already attributed to other registrations, is greater than this reg's final price
403
-                    $payment->amount() - $total_paid >= $registration->final_price()
404
-                )
405
-            )
406
-        ) {
407
-            // mark as paid
408
-            self::$_amount_paid[ $registration->ID() ] = $registration->final_price();
409
-            // track new REG_Status
410
-            $this->set_new_reg_status($registration->ID(), EEM_Registration::status_id_approved);
411
-            // toggle status to approved
412
-            $registration->set_status(EEM_Registration::status_id_approved);
413
-            if ($save) {
414
-                $registration->save();
415
-            }
416
-            // don't trigger notifications during IPNs because they will get triggered by EE_Payment_Processor
417
-            if (! EE_Processor_Base::$IPN) {
418
-                // otherwise, send out notifications
419
-                add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10);
420
-            }
421
-            // DEBUG LOG
422
-            // $this->log(
423
-            //     __CLASS__,
424
-            //     __FUNCTION__,
425
-            //     __LINE__,
426
-            //     $registration->transaction(),
427
-            //     array(
428
-            //         'IPN' => EE_Processor_Base::$IPN,
429
-            //         'deliver_notifications' => has_filter(
430
-            //             'FHEE__EED_Messages___maybe_registration__deliver_notifications'
431
-            //         ),
432
-            //     )
433
-            // );
434
-            return true;
435
-        }
436
-        return false;
437
-    }
438
-
439
-
440
-    /**
441
-     *    registration_status_changed
442
-     *
443
-     * @access public
444
-     * @param EE_Registration $registration
445
-     * @param array           $additional_details
446
-     * @return void
447
-     */
448
-    public function trigger_registration_update_notifications($registration, array $additional_details = array())
449
-    {
450
-        try {
451
-            if (! $registration instanceof EE_Registration) {
452
-                throw new EE_Error(
453
-                    esc_html__('An invalid registration was received.', 'event_espresso')
454
-                );
455
-            }
456
-            // EE_Registry::instance()->load_helper('Debug_Tools');
457
-            // EEH_Debug_Tools::log(
458
-            //     __CLASS__,
459
-            //     __FUNCTION__,
460
-            //     __LINE__,
461
-            //     array($registration->transaction(), $additional_details),
462
-            //     false,
463
-            //     'EE_Transaction: ' . $registration->transaction()->ID()
464
-            // );
465
-            if (! $registration->is_primary_registrant()) {
466
-                return;
467
-            }
468
-            do_action(
469
-                'AHEE__EE_Registration_Processor__trigger_registration_update_notifications',
470
-                $registration,
471
-                $additional_details
472
-            );
473
-        } catch (Exception $e) {
474
-            EE_Error::add_error($e->getMessage(), $e->getFile(), 'unknown_function_from_exception', $e->getLine());
475
-        }
476
-    }
477
-
478
-
479
-    /**
480
-     * sets reg status based either on passed param or on transaction status and event pre-approval setting
481
-     *
482
-     * @param EE_Registration $registration
483
-     * @param array           $additional_details
484
-     * @return bool
485
-     * @throws EE_Error
486
-     * @throws EntityNotFoundException
487
-     * @throws InvalidArgumentException
488
-     * @throws InvalidDataTypeException
489
-     * @throws InvalidInterfaceException
490
-     * @throws ReflectionException
491
-     * @throws RuntimeException
492
-     */
493
-    public function update_registration_after_checkout_or_payment(
494
-        EE_Registration $registration,
495
-        array $additional_details = array()
496
-    ) {
497
-        // set initial REG_Status
498
-        $this->set_old_reg_status($registration->ID(), $registration->status_ID());
499
-        // if the registration status gets updated, then save the registration
500
-        if ($this->toggle_registration_status_for_default_approved_events($registration, false)
501
-            || $this->toggle_registration_status_if_no_monies_owing(
502
-                $registration,
503
-                false,
504
-                $additional_details
505
-            )
506
-        ) {
507
-            $registration->save();
508
-        }
509
-        // set new  REG_Status
510
-        $this->set_new_reg_status($registration->ID(), $registration->status_ID());
511
-        return $this->reg_status_updated($registration->ID())
512
-               && $this->new_reg_status($registration->ID()) === EEM_Registration::status_id_approved;
513
-    }
514
-
515
-
516
-    /**
517
-     * Updates the registration' final prices based on the current line item tree (taking into account
518
-     * discounts, taxes, and other line items unrelated to tickets.)
519
-     *
520
-     * @param EE_Transaction $transaction
521
-     * @param boolean        $save_regs whether to immediately save registrations in this function or not
522
-     * @return void
523
-     * @throws EE_Error
524
-     * @throws InvalidArgumentException
525
-     * @throws InvalidDataTypeException
526
-     * @throws InvalidInterfaceException
527
-     * @throws RuntimeException
528
-     */
529
-    public function update_registration_final_prices($transaction, $save_regs = true)
530
-    {
531
-        $reg_final_price_per_ticket_line_item = EEH_Line_Item::calculate_reg_final_prices_per_line_item(
532
-            $transaction->total_line_item()
533
-        );
534
-        foreach ($transaction->registrations() as $registration) {
535
-            /** @var EE_Line_Item $line_item */
536
-            $line_item = EEM_Line_Item::instance()->get_line_item_for_registration($registration);
537
-            if (isset($reg_final_price_per_ticket_line_item[ $line_item->ID() ])) {
538
-                $registration->set_final_price($reg_final_price_per_ticket_line_item[ $line_item->ID() ]);
539
-                if ($save_regs) {
540
-                    $registration->save();
541
-                }
542
-            }
543
-        }
544
-        // and make sure there's no rounding problem
545
-        $this->fix_reg_final_price_rounding_issue($transaction);
546
-    }
547
-
548
-
549
-    /**
550
-     * Makes sure there is no rounding errors for the REG_final_prices.
551
-     * Eg, if we have 3 registrations for $1, and there is a $0.01 discount between the three of them,
552
-     * they will each be for $0.99333333, which gets rounded to $1 again.
553
-     * So the transaction total will be $2.99, but each registration will be for $1,
554
-     * so if each registrant paid individually they will have overpaid by $0.01.
555
-     * So in order to overcome this, we check for any difference, and if there is a difference
556
-     * we just grab one registrant at random and make them responsible for it.
557
-     * This should be used after setting REG_final_prices (it's done automatically as part of
558
-     * EE_Registration_Processor::update_registration_final_prices())
559
-     *
560
-     * @param EE_Transaction $transaction
561
-     * @return bool success verifying that there is NO difference after this method is done
562
-     * @throws EE_Error
563
-     * @throws InvalidArgumentException
564
-     * @throws InvalidDataTypeException
565
-     * @throws InvalidInterfaceException
566
-     */
567
-    public function fix_reg_final_price_rounding_issue($transaction)
568
-    {
569
-        $reg_final_price_sum = EEM_Registration::instance()->sum(
570
-            array(
571
-                array(
572
-                    'TXN_ID' => $transaction->ID(),
573
-                ),
574
-            ),
575
-            'REG_final_price'
576
-        );
577
-        $diff = $transaction->total() - $reg_final_price_sum;
578
-        // ok then, just grab one of the registrations
579
-        if ($diff !== 0) {
580
-            $a_reg = EEM_Registration::instance()->get_one(
581
-                array(
582
-                    array(
583
-                        'TXN_ID' => $transaction->ID(),
584
-                    ),
585
-                )
586
-            );
587
-            return $a_reg instanceof EE_Registration
588
-                ? (bool) $a_reg->save(array('REG_final_price' => $a_reg->final_price() + $diff))
589
-                : false;
590
-        }
591
-        return true;
592
-    }
593
-
594
-
595
-    /**
596
-     * update_registration_after_being_canceled_or_declined
597
-     *
598
-     * @param EE_Registration $registration
599
-     * @param array           $closed_reg_statuses
600
-     * @param bool            $update_reg
601
-     * @return bool
602
-     * @throws EE_Error
603
-     * @throws RuntimeException
604
-     */
605
-    public function update_registration_after_being_canceled_or_declined(
606
-        EE_Registration $registration,
607
-        array $closed_reg_statuses = array(),
608
-        $update_reg = true
609
-    ) {
610
-        // these reg statuses should not be considered in any calculations involving monies owing
611
-        $closed_reg_statuses = ! empty($closed_reg_statuses)
612
-            ? $closed_reg_statuses
613
-            : EEM_Registration::closed_reg_statuses();
614
-        if (! in_array($registration->status_ID(), $closed_reg_statuses, true)) {
615
-            return false;
616
-        }
617
-        // release a reserved ticket by decrementing ticket and datetime reserved values
618
-        $registration->release_reserved_ticket(true, 'RegProcessor:' . __LINE__);
619
-        $registration->set_final_price(0);
620
-        if ($update_reg) {
621
-            $registration->save();
622
-        }
623
-        return true;
624
-    }
625
-
626
-
627
-    /**
628
-     * update_canceled_or_declined_registration_after_being_reinstated
629
-     *
630
-     * @param EE_Registration $registration
631
-     * @param array           $closed_reg_statuses
632
-     * @param bool            $update_reg
633
-     * @return bool
634
-     * @throws EE_Error
635
-     * @throws RuntimeException
636
-     */
637
-    public function update_canceled_or_declined_registration_after_being_reinstated(
638
-        EE_Registration $registration,
639
-        array $closed_reg_statuses = array(),
640
-        $update_reg = true
641
-    ) {
642
-        // these reg statuses should not be considered in any calculations involving monies owing
643
-        $closed_reg_statuses = ! empty($closed_reg_statuses) ? $closed_reg_statuses
644
-            : EEM_Registration::closed_reg_statuses();
645
-        if (in_array($registration->status_ID(), $closed_reg_statuses, true)) {
646
-            return false;
647
-        }
648
-        $ticket = $registration->ticket();
649
-        if (! $ticket instanceof EE_Ticket) {
650
-            throw new EE_Error(
651
-                sprintf(
652
-                    esc_html__(
653
-                        'The Ticket for Registration %1$d was not found or is invalid.',
654
-                        'event_espresso'
655
-                    ),
656
-                    $registration->ticket_ID()
657
-                )
658
-            );
659
-        }
660
-        $registration->set_final_price($ticket->price());
661
-        if ($update_reg) {
662
-            $registration->save();
663
-        }
664
-        return true;
665
-    }
666
-
667
-
668
-    /**
669
-     * generate_ONE_registration_from_line_item
670
-     * Although a ticket line item may have a quantity greater than 1,
671
-     * this method will ONLY CREATE ONE REGISTRATION !!!
672
-     * Regardless of the ticket line item quantity.
673
-     * This means that any code calling this method is responsible for ensuring
674
-     * that the final registration count matches the ticket line item quantity.
675
-     * This was done to make it easier to match the number of registrations
676
-     * to the number of tickets in the cart, when the cart has been edited
677
-     * after SPCO has already been initialized. So if an additional ticket was added to the cart, you can simply pass
678
-     * the line item to this method to add a second ticket, and in this case, you would not want to add 2 tickets.
679
-     *
680
-     * @deprecated
681
-     * @since 4.9.1
682
-     * @param EE_Line_Item    $line_item
683
-     * @param \EE_Transaction $transaction
684
-     * @param int             $att_nmbr
685
-     * @param int             $total_ticket_count
686
-     * @return EE_Registration | null
687
-     * @throws \OutOfRangeException
688
-     * @throws \EventEspresso\core\exceptions\UnexpectedEntityException
689
-     * @throws \EE_Error
690
-     */
691
-    public function generate_ONE_registration_from_line_item(
692
-        EE_Line_Item $line_item,
693
-        EE_Transaction $transaction,
694
-        $att_nmbr = 1,
695
-        $total_ticket_count = 1
696
-    ) {
697
-        EE_Error::doing_it_wrong(
698
-            __CLASS__ . '::' . __FUNCTION__,
699
-            sprintf(
700
-                esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'),
701
-                '\EventEspresso\core\domain\services\registration\CreateRegistrationService::create()'
702
-            ),
703
-            '4.9.1',
704
-            '5.0.0'
705
-        );
706
-        // grab the related ticket object for this line_item
707
-        $ticket = $line_item->ticket();
708
-        if (! $ticket instanceof EE_Ticket) {
709
-            EE_Error::add_error(
710
-                sprintf(
711
-                    esc_html__('Line item %s did not contain a valid ticket', 'event_espresso'),
712
-                    $line_item->ID()
713
-                ),
714
-                __FILE__,
715
-                __FUNCTION__,
716
-                __LINE__
717
-            );
718
-            return null;
719
-        }
720
-        $registration_service = new CreateRegistrationService();
721
-        // then generate a new registration from that
722
-        return $registration_service->create(
723
-            $ticket->get_related_event(),
724
-            $transaction,
725
-            $ticket,
726
-            $line_item,
727
-            $att_nmbr,
728
-            $total_ticket_count
729
-        );
730
-    }
731
-
732
-
733
-    /**
734
-     * generates reg_url_link
735
-     *
736
-     * @deprecated
737
-     * @since 4.9.1
738
-     * @param int                   $att_nmbr
739
-     * @param EE_Line_Item | string $item
740
-     * @return string
741
-     * @throws InvalidArgumentException
742
-     */
743
-    public function generate_reg_url_link($att_nmbr, $item)
744
-    {
745
-        EE_Error::doing_it_wrong(
746
-            __CLASS__ . '::' . __FUNCTION__,
747
-            sprintf(
748
-                esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'),
749
-                'EventEspresso\core\domain\entities\RegUrlLink'
750
-            ),
751
-            '4.9.1',
752
-            '5.0.0'
753
-        );
754
-        return new RegUrlLink($att_nmbr, $item);
755
-    }
756
-
757
-
758
-    /**
759
-     * generates reg code
760
-     *
761
-     * @deprecated
762
-     * @since 4.9.1
763
-     * @param EE_Registration $registration
764
-     * @return string
765
-     * @throws EE_Error
766
-     * @throws EntityNotFoundException
767
-     * @throws InvalidArgumentException
768
-     */
769
-    public function generate_reg_code(EE_Registration $registration)
770
-    {
771
-        EE_Error::doing_it_wrong(
772
-            __CLASS__ . '::' . __FUNCTION__,
773
-            sprintf(
774
-                esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'),
775
-                'EventEspresso\core\domain\entities\RegCode'
776
-            ),
777
-            '4.9.1',
778
-            '5.0.0'
779
-        );
780
-        return apply_filters(
781
-            'FHEE__EE_Registration_Processor___generate_reg_code__new_reg_code',
782
-            new RegCode(
783
-                RegUrlLink::fromRegistration($registration),
784
-                $registration->transaction(),
785
-                $registration->ticket()
786
-            ),
787
-            $registration
788
-        );
789
-    }
27
+	/**
28
+	 * @var EE_Registration_Processor $_instance
29
+	 * @access    private
30
+	 */
31
+	private static $_instance;
32
+
33
+	/**
34
+	 * initial reg status at the beginning of this request.
35
+	 * indexed by registration ID
36
+	 *
37
+	 * @var array
38
+	 */
39
+	protected $_old_reg_status = array();
40
+
41
+	/**
42
+	 * reg status at the end of the request after all processing.
43
+	 * indexed by registration ID
44
+	 *
45
+	 * @var array
46
+	 */
47
+	protected $_new_reg_status = array();
48
+
49
+	/**
50
+	 * amounts paid at the end of the request after all processing.
51
+	 * indexed by registration ID
52
+	 *
53
+	 * @var array
54
+	 */
55
+	protected static $_amount_paid = array();
56
+
57
+	/**
58
+	 * Cache of the reg final price for registrations corresponding to a ticket line item
59
+	 *
60
+	 * @deprecated
61
+	 * @var array @see EEH_Line_Item::calculate_reg_final_prices_per_line_item()'s return value
62
+	 */
63
+	protected $_reg_final_price_per_tkt_line_item;
64
+
65
+	/**
66
+	 * @var EE_Request $request
67
+	 */
68
+	protected $request;
69
+
70
+
71
+	/**
72
+	 * @singleton method used to instantiate class object
73
+	 * @param EE_Request|null $request
74
+	 * @return EE_Registration_Processor instance
75
+	 * @throws \InvalidArgumentException
76
+	 * @throws \EventEspresso\core\exceptions\InvalidInterfaceException
77
+	 * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
78
+	 */
79
+	public static function instance(EE_Request $request = null)
80
+	{
81
+		// check if class object is instantiated
82
+		if (! self::$_instance instanceof EE_Registration_Processor) {
83
+			if (! $request instanceof EE_Request) {
84
+				$request = LoaderFactory::getLoader()->getShared('EE_Request');
85
+			}
86
+			self::$_instance = new self($request);
87
+		}
88
+		return self::$_instance;
89
+	}
90
+
91
+
92
+	/**
93
+	 * EE_Registration_Processor constructor.
94
+	 *
95
+	 * @param EE_Request $request
96
+	 */
97
+	public function __construct(EE_Request $request)
98
+	{
99
+		$this->request = $request;
100
+	}
101
+
102
+
103
+	/**
104
+	 * @param int $REG_ID
105
+	 * @return string
106
+	 */
107
+	public function old_reg_status($REG_ID)
108
+	{
109
+		return isset($this->_old_reg_status[ $REG_ID ]) ? $this->_old_reg_status[ $REG_ID ] : null;
110
+	}
111
+
112
+
113
+	/**
114
+	 * @param int    $REG_ID
115
+	 * @param string $old_reg_status
116
+	 */
117
+	public function set_old_reg_status($REG_ID, $old_reg_status)
118
+	{
119
+		// only set the first time
120
+		if (! isset($this->_old_reg_status[ $REG_ID ])) {
121
+			$this->_old_reg_status[ $REG_ID ] = $old_reg_status;
122
+		}
123
+	}
124
+
125
+
126
+	/**
127
+	 * @param int $REG_ID
128
+	 * @return string
129
+	 */
130
+	public function new_reg_status($REG_ID)
131
+	{
132
+		return isset($this->_new_reg_status[ $REG_ID ]) ? $this->_new_reg_status[ $REG_ID ] : null;
133
+	}
134
+
135
+
136
+	/**
137
+	 * @param int    $REG_ID
138
+	 * @param string $new_reg_status
139
+	 */
140
+	public function set_new_reg_status($REG_ID, $new_reg_status)
141
+	{
142
+		$this->_new_reg_status[ $REG_ID ] = $new_reg_status;
143
+	}
144
+
145
+
146
+	/**
147
+	 * reg_status_updated
148
+	 *
149
+	 * @param int $REG_ID
150
+	 * @return bool
151
+	 */
152
+	public function reg_status_updated($REG_ID)
153
+	{
154
+		return $this->new_reg_status($REG_ID) !== $this->old_reg_status($REG_ID);
155
+	}
156
+
157
+
158
+	/**
159
+	 * @param EE_Registration $registration
160
+	 * @throws EE_Error
161
+	 * @throws EntityNotFoundException
162
+	 * @throws InvalidArgumentException
163
+	 * @throws InvalidDataTypeException
164
+	 * @throws InvalidInterfaceException
165
+	 * @throws ReflectionException
166
+	 * @throws RuntimeException
167
+	 */
168
+	public function update_registration_status_and_trigger_notifications(EE_Registration $registration)
169
+	{
170
+		$this->toggle_incomplete_registration_status_to_default($registration, false);
171
+		$this->toggle_registration_status_for_default_approved_events($registration, false);
172
+		$this->toggle_registration_status_if_no_monies_owing($registration, false);
173
+		$registration->save();
174
+		// trigger notifications
175
+		$this->trigger_registration_update_notifications($registration);
176
+	}
177
+
178
+
179
+	/**
180
+	 *    manually_update_registration_status
181
+	 *
182
+	 * @access public
183
+	 * @param EE_Registration $registration
184
+	 * @param string          $new_reg_status
185
+	 * @param bool            $save TRUE will save the registration if the status is updated, FALSE will leave that up
186
+	 *                              to client code
187
+	 * @return bool
188
+	 * @throws EE_Error
189
+	 * @throws EntityNotFoundException
190
+	 * @throws InvalidArgumentException
191
+	 * @throws InvalidDataTypeException
192
+	 * @throws InvalidInterfaceException
193
+	 * @throws ReflectionException
194
+	 * @throws RuntimeException
195
+	 */
196
+	public function manually_update_registration_status(
197
+		EE_Registration $registration,
198
+		$new_reg_status = '',
199
+		$save = true
200
+	) {
201
+		// set initial REG_Status
202
+		$this->set_old_reg_status($registration->ID(), $registration->status_ID());
203
+		// set incoming REG_Status
204
+		$this->set_new_reg_status($registration->ID(), $new_reg_status);
205
+		// toggle reg status but only if it has changed and the user can do so
206
+		if ($this->reg_status_updated($registration->ID())
207
+			&& (
208
+				(! $this->request->isAdmin() || $this->request->isFrontAjax())
209
+				|| EE_Registry::instance()->CAP->current_user_can(
210
+					'ee_edit_registration',
211
+					'toggle_registration_status',
212
+					$registration->ID()
213
+				)
214
+			)
215
+		) {
216
+			// change status to new value
217
+			$updated = $registration->set_status($this->new_reg_status($registration->ID()));
218
+			if ($updated && $save) {
219
+				$registration->save();
220
+			}
221
+			return true;
222
+		}
223
+		return false;
224
+	}
225
+
226
+
227
+	/**
228
+	 *    toggle_incomplete_registration_status_to_default
229
+	 *        changes any incomplete registrations to either the event or global default registration status
230
+	 *
231
+	 * @access public
232
+	 * @param EE_Registration       $registration
233
+	 * @param bool                  $save TRUE will save the registration if the status is updated, FALSE will leave
234
+	 *                                    that up to client code
235
+	 * @param ContextInterface|null $context
236
+	 * @return void
237
+	 * @throws EE_Error
238
+	 * @throws InvalidArgumentException
239
+	 * @throws ReflectionException
240
+	 * @throws RuntimeException
241
+	 * @throws EntityNotFoundException
242
+	 * @throws InvalidDataTypeException
243
+	 * @throws InvalidInterfaceException
244
+	 */
245
+	public function toggle_incomplete_registration_status_to_default(
246
+		EE_Registration $registration,
247
+		$save = true,
248
+		ContextInterface $context = null
249
+	) {
250
+		$existing_reg_status = $registration->status_ID();
251
+		// set initial REG_Status
252
+		$this->set_old_reg_status($registration->ID(), $existing_reg_status);
253
+		// is the registration currently incomplete ?
254
+		if ($registration->status_ID() === EEM_Registration::status_id_incomplete) {
255
+			// grab default reg status for the event, if set
256
+			$event_default_registration_status = $registration->event()->default_registration_status();
257
+			// if no default reg status is set for the event, then use the global value
258
+			$STS_ID = ! empty($event_default_registration_status)
259
+				? $event_default_registration_status
260
+				: EE_Registry::instance()->CFG->registration->default_STS_ID;
261
+			// if the event default reg status is approved, then downgrade temporarily to payment pending to ensure that payments are triggered
262
+			$STS_ID = $STS_ID === EEM_Registration::status_id_approved ? EEM_Registration::status_id_pending_payment
263
+				: $STS_ID;
264
+			// set incoming REG_Status
265
+			$this->set_new_reg_status($registration->ID(), $STS_ID);
266
+			$registration->set_status($STS_ID, false, $context);
267
+			if ($save) {
268
+				$registration->save();
269
+			}
270
+			// don't trigger notifications during IPNs because they will get triggered by EE_Payment_Processor
271
+			if (! EE_Processor_Base::$IPN) {
272
+				// otherwise, send out notifications
273
+				add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10);
274
+			}
275
+			// DEBUG LOG
276
+			// $this->log(
277
+			//     __CLASS__,
278
+			//     __FUNCTION__,
279
+			//     __LINE__,
280
+			//     $registration->transaction(),
281
+			//     array(
282
+			//         'IPN' => EE_Processor_Base::$IPN,
283
+			//         'deliver_notifications' => has_filter(
284
+			//             'FHEE__EED_Messages___maybe_registration__deliver_notifications'
285
+			//         ),
286
+			//     )
287
+			// );
288
+		}
289
+	}
290
+
291
+
292
+	/**
293
+	 *    toggle_registration_status_for_default_approved_events
294
+	 *
295
+	 * @access public
296
+	 * @param EE_Registration $registration
297
+	 * @param bool            $save TRUE will save the registration if the status is updated, FALSE will leave that up
298
+	 *                              to client code
299
+	 * @return bool
300
+	 * @throws EE_Error
301
+	 * @throws EntityNotFoundException
302
+	 * @throws InvalidArgumentException
303
+	 * @throws InvalidDataTypeException
304
+	 * @throws InvalidInterfaceException
305
+	 * @throws ReflectionException
306
+	 * @throws RuntimeException
307
+	 */
308
+	public function toggle_registration_status_for_default_approved_events(EE_Registration $registration, $save = true)
309
+	{
310
+		$reg_status = $registration->status_ID();
311
+		// set initial REG_Status
312
+		$this->set_old_reg_status($registration->ID(), $reg_status);
313
+		// if not already, toggle reg status to approved IF the event default reg status is approved
314
+		// ( as long as the registration wasn't cancelled or declined at some point )
315
+		if ($reg_status !== EEM_Registration::status_id_cancelled
316
+			&& $reg_status
317
+			   !== EEM_Registration::status_id_declined
318
+			&& $reg_status !== EEM_Registration::status_id_approved
319
+			&& $registration->event()->default_registration_status() === EEM_Registration::status_id_approved
320
+		) {
321
+			// set incoming REG_Status
322
+			$this->set_new_reg_status($registration->ID(), EEM_Registration::status_id_approved);
323
+			// toggle status to approved
324
+			$registration->set_status(EEM_Registration::status_id_approved);
325
+			if ($save) {
326
+				$registration->save();
327
+			}
328
+			// don't trigger notifications during IPNs because they will get triggered by EE_Payment_Processor
329
+			if (! EE_Processor_Base::$IPN) {
330
+				// otherwise, send out notifications
331
+				add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10);
332
+			}
333
+			// DEBUG LOG
334
+			// $this->log(
335
+			//     __CLASS__,
336
+			//     __FUNCTION__,
337
+			//     __LINE__,
338
+			//     $registration->transaction(),
339
+			//     array(
340
+			//         'IPN' => EE_Processor_Base::$IPN,
341
+			//         'deliver_notifications' => has_filter(
342
+			//             'FHEE__EED_Messages___maybe_registration__deliver_notifications'
343
+			//         ),
344
+			//     )
345
+			// );
346
+			return true;
347
+		}
348
+		return false;
349
+	}
350
+
351
+
352
+	/**
353
+	 *    toggle_registration_statuses_if_no_monies_owing
354
+	 *
355
+	 * @access public
356
+	 * @param EE_Registration $registration
357
+	 * @param bool            $save TRUE will save the registration if the status is updated, FALSE will leave that up
358
+	 *                              to client code
359
+	 * @param array           $additional_details
360
+	 * @return bool
361
+	 * @throws EE_Error
362
+	 * @throws EntityNotFoundException
363
+	 * @throws InvalidArgumentException
364
+	 * @throws InvalidDataTypeException
365
+	 * @throws InvalidInterfaceException
366
+	 * @throws ReflectionException
367
+	 * @throws RuntimeException
368
+	 */
369
+	public function toggle_registration_status_if_no_monies_owing(
370
+		EE_Registration $registration,
371
+		$save = true,
372
+		array $additional_details = array()
373
+	) {
374
+		// set initial REG_Status
375
+		$this->set_old_reg_status($registration->ID(), $registration->status_ID());
376
+		// was a payment just made ?
377
+		$payment = isset($additional_details['payment_updates'], $additional_details['last_payment'])
378
+				   && $additional_details['payment_updates']
379
+				   && $additional_details['last_payment'] instanceof EE_Payment
380
+			? $additional_details['last_payment']
381
+			: null;
382
+		$total_paid = array_sum(self::$_amount_paid);
383
+		// toggle reg status to approved IF
384
+		if (// REG status is pending payment
385
+			$registration->status_ID() === EEM_Registration::status_id_pending_payment
386
+			// AND no monies are owing
387
+			&& (
388
+				(
389
+					$registration->transaction()->is_completed()
390
+					|| $registration->transaction()->is_overpaid()
391
+					|| $registration->transaction()->is_free()
392
+					|| apply_filters(
393
+						'FHEE__EE_Registration_Processor__toggle_registration_status_if_no_monies_owing',
394
+						false,
395
+						$registration
396
+					)
397
+				)
398
+				|| (
399
+					$payment instanceof EE_Payment && $payment->is_approved()
400
+					&& // this specific registration has not yet been paid for
401
+					! isset(self::$_amount_paid[ $registration->ID() ])
402
+					&& // payment amount, less what we have already attributed to other registrations, is greater than this reg's final price
403
+					$payment->amount() - $total_paid >= $registration->final_price()
404
+				)
405
+			)
406
+		) {
407
+			// mark as paid
408
+			self::$_amount_paid[ $registration->ID() ] = $registration->final_price();
409
+			// track new REG_Status
410
+			$this->set_new_reg_status($registration->ID(), EEM_Registration::status_id_approved);
411
+			// toggle status to approved
412
+			$registration->set_status(EEM_Registration::status_id_approved);
413
+			if ($save) {
414
+				$registration->save();
415
+			}
416
+			// don't trigger notifications during IPNs because they will get triggered by EE_Payment_Processor
417
+			if (! EE_Processor_Base::$IPN) {
418
+				// otherwise, send out notifications
419
+				add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10);
420
+			}
421
+			// DEBUG LOG
422
+			// $this->log(
423
+			//     __CLASS__,
424
+			//     __FUNCTION__,
425
+			//     __LINE__,
426
+			//     $registration->transaction(),
427
+			//     array(
428
+			//         'IPN' => EE_Processor_Base::$IPN,
429
+			//         'deliver_notifications' => has_filter(
430
+			//             'FHEE__EED_Messages___maybe_registration__deliver_notifications'
431
+			//         ),
432
+			//     )
433
+			// );
434
+			return true;
435
+		}
436
+		return false;
437
+	}
438
+
439
+
440
+	/**
441
+	 *    registration_status_changed
442
+	 *
443
+	 * @access public
444
+	 * @param EE_Registration $registration
445
+	 * @param array           $additional_details
446
+	 * @return void
447
+	 */
448
+	public function trigger_registration_update_notifications($registration, array $additional_details = array())
449
+	{
450
+		try {
451
+			if (! $registration instanceof EE_Registration) {
452
+				throw new EE_Error(
453
+					esc_html__('An invalid registration was received.', 'event_espresso')
454
+				);
455
+			}
456
+			// EE_Registry::instance()->load_helper('Debug_Tools');
457
+			// EEH_Debug_Tools::log(
458
+			//     __CLASS__,
459
+			//     __FUNCTION__,
460
+			//     __LINE__,
461
+			//     array($registration->transaction(), $additional_details),
462
+			//     false,
463
+			//     'EE_Transaction: ' . $registration->transaction()->ID()
464
+			// );
465
+			if (! $registration->is_primary_registrant()) {
466
+				return;
467
+			}
468
+			do_action(
469
+				'AHEE__EE_Registration_Processor__trigger_registration_update_notifications',
470
+				$registration,
471
+				$additional_details
472
+			);
473
+		} catch (Exception $e) {
474
+			EE_Error::add_error($e->getMessage(), $e->getFile(), 'unknown_function_from_exception', $e->getLine());
475
+		}
476
+	}
477
+
478
+
479
+	/**
480
+	 * sets reg status based either on passed param or on transaction status and event pre-approval setting
481
+	 *
482
+	 * @param EE_Registration $registration
483
+	 * @param array           $additional_details
484
+	 * @return bool
485
+	 * @throws EE_Error
486
+	 * @throws EntityNotFoundException
487
+	 * @throws InvalidArgumentException
488
+	 * @throws InvalidDataTypeException
489
+	 * @throws InvalidInterfaceException
490
+	 * @throws ReflectionException
491
+	 * @throws RuntimeException
492
+	 */
493
+	public function update_registration_after_checkout_or_payment(
494
+		EE_Registration $registration,
495
+		array $additional_details = array()
496
+	) {
497
+		// set initial REG_Status
498
+		$this->set_old_reg_status($registration->ID(), $registration->status_ID());
499
+		// if the registration status gets updated, then save the registration
500
+		if ($this->toggle_registration_status_for_default_approved_events($registration, false)
501
+			|| $this->toggle_registration_status_if_no_monies_owing(
502
+				$registration,
503
+				false,
504
+				$additional_details
505
+			)
506
+		) {
507
+			$registration->save();
508
+		}
509
+		// set new  REG_Status
510
+		$this->set_new_reg_status($registration->ID(), $registration->status_ID());
511
+		return $this->reg_status_updated($registration->ID())
512
+			   && $this->new_reg_status($registration->ID()) === EEM_Registration::status_id_approved;
513
+	}
514
+
515
+
516
+	/**
517
+	 * Updates the registration' final prices based on the current line item tree (taking into account
518
+	 * discounts, taxes, and other line items unrelated to tickets.)
519
+	 *
520
+	 * @param EE_Transaction $transaction
521
+	 * @param boolean        $save_regs whether to immediately save registrations in this function or not
522
+	 * @return void
523
+	 * @throws EE_Error
524
+	 * @throws InvalidArgumentException
525
+	 * @throws InvalidDataTypeException
526
+	 * @throws InvalidInterfaceException
527
+	 * @throws RuntimeException
528
+	 */
529
+	public function update_registration_final_prices($transaction, $save_regs = true)
530
+	{
531
+		$reg_final_price_per_ticket_line_item = EEH_Line_Item::calculate_reg_final_prices_per_line_item(
532
+			$transaction->total_line_item()
533
+		);
534
+		foreach ($transaction->registrations() as $registration) {
535
+			/** @var EE_Line_Item $line_item */
536
+			$line_item = EEM_Line_Item::instance()->get_line_item_for_registration($registration);
537
+			if (isset($reg_final_price_per_ticket_line_item[ $line_item->ID() ])) {
538
+				$registration->set_final_price($reg_final_price_per_ticket_line_item[ $line_item->ID() ]);
539
+				if ($save_regs) {
540
+					$registration->save();
541
+				}
542
+			}
543
+		}
544
+		// and make sure there's no rounding problem
545
+		$this->fix_reg_final_price_rounding_issue($transaction);
546
+	}
547
+
548
+
549
+	/**
550
+	 * Makes sure there is no rounding errors for the REG_final_prices.
551
+	 * Eg, if we have 3 registrations for $1, and there is a $0.01 discount between the three of them,
552
+	 * they will each be for $0.99333333, which gets rounded to $1 again.
553
+	 * So the transaction total will be $2.99, but each registration will be for $1,
554
+	 * so if each registrant paid individually they will have overpaid by $0.01.
555
+	 * So in order to overcome this, we check for any difference, and if there is a difference
556
+	 * we just grab one registrant at random and make them responsible for it.
557
+	 * This should be used after setting REG_final_prices (it's done automatically as part of
558
+	 * EE_Registration_Processor::update_registration_final_prices())
559
+	 *
560
+	 * @param EE_Transaction $transaction
561
+	 * @return bool success verifying that there is NO difference after this method is done
562
+	 * @throws EE_Error
563
+	 * @throws InvalidArgumentException
564
+	 * @throws InvalidDataTypeException
565
+	 * @throws InvalidInterfaceException
566
+	 */
567
+	public function fix_reg_final_price_rounding_issue($transaction)
568
+	{
569
+		$reg_final_price_sum = EEM_Registration::instance()->sum(
570
+			array(
571
+				array(
572
+					'TXN_ID' => $transaction->ID(),
573
+				),
574
+			),
575
+			'REG_final_price'
576
+		);
577
+		$diff = $transaction->total() - $reg_final_price_sum;
578
+		// ok then, just grab one of the registrations
579
+		if ($diff !== 0) {
580
+			$a_reg = EEM_Registration::instance()->get_one(
581
+				array(
582
+					array(
583
+						'TXN_ID' => $transaction->ID(),
584
+					),
585
+				)
586
+			);
587
+			return $a_reg instanceof EE_Registration
588
+				? (bool) $a_reg->save(array('REG_final_price' => $a_reg->final_price() + $diff))
589
+				: false;
590
+		}
591
+		return true;
592
+	}
593
+
594
+
595
+	/**
596
+	 * update_registration_after_being_canceled_or_declined
597
+	 *
598
+	 * @param EE_Registration $registration
599
+	 * @param array           $closed_reg_statuses
600
+	 * @param bool            $update_reg
601
+	 * @return bool
602
+	 * @throws EE_Error
603
+	 * @throws RuntimeException
604
+	 */
605
+	public function update_registration_after_being_canceled_or_declined(
606
+		EE_Registration $registration,
607
+		array $closed_reg_statuses = array(),
608
+		$update_reg = true
609
+	) {
610
+		// these reg statuses should not be considered in any calculations involving monies owing
611
+		$closed_reg_statuses = ! empty($closed_reg_statuses)
612
+			? $closed_reg_statuses
613
+			: EEM_Registration::closed_reg_statuses();
614
+		if (! in_array($registration->status_ID(), $closed_reg_statuses, true)) {
615
+			return false;
616
+		}
617
+		// release a reserved ticket by decrementing ticket and datetime reserved values
618
+		$registration->release_reserved_ticket(true, 'RegProcessor:' . __LINE__);
619
+		$registration->set_final_price(0);
620
+		if ($update_reg) {
621
+			$registration->save();
622
+		}
623
+		return true;
624
+	}
625
+
626
+
627
+	/**
628
+	 * update_canceled_or_declined_registration_after_being_reinstated
629
+	 *
630
+	 * @param EE_Registration $registration
631
+	 * @param array           $closed_reg_statuses
632
+	 * @param bool            $update_reg
633
+	 * @return bool
634
+	 * @throws EE_Error
635
+	 * @throws RuntimeException
636
+	 */
637
+	public function update_canceled_or_declined_registration_after_being_reinstated(
638
+		EE_Registration $registration,
639
+		array $closed_reg_statuses = array(),
640
+		$update_reg = true
641
+	) {
642
+		// these reg statuses should not be considered in any calculations involving monies owing
643
+		$closed_reg_statuses = ! empty($closed_reg_statuses) ? $closed_reg_statuses
644
+			: EEM_Registration::closed_reg_statuses();
645
+		if (in_array($registration->status_ID(), $closed_reg_statuses, true)) {
646
+			return false;
647
+		}
648
+		$ticket = $registration->ticket();
649
+		if (! $ticket instanceof EE_Ticket) {
650
+			throw new EE_Error(
651
+				sprintf(
652
+					esc_html__(
653
+						'The Ticket for Registration %1$d was not found or is invalid.',
654
+						'event_espresso'
655
+					),
656
+					$registration->ticket_ID()
657
+				)
658
+			);
659
+		}
660
+		$registration->set_final_price($ticket->price());
661
+		if ($update_reg) {
662
+			$registration->save();
663
+		}
664
+		return true;
665
+	}
666
+
667
+
668
+	/**
669
+	 * generate_ONE_registration_from_line_item
670
+	 * Although a ticket line item may have a quantity greater than 1,
671
+	 * this method will ONLY CREATE ONE REGISTRATION !!!
672
+	 * Regardless of the ticket line item quantity.
673
+	 * This means that any code calling this method is responsible for ensuring
674
+	 * that the final registration count matches the ticket line item quantity.
675
+	 * This was done to make it easier to match the number of registrations
676
+	 * to the number of tickets in the cart, when the cart has been edited
677
+	 * after SPCO has already been initialized. So if an additional ticket was added to the cart, you can simply pass
678
+	 * the line item to this method to add a second ticket, and in this case, you would not want to add 2 tickets.
679
+	 *
680
+	 * @deprecated
681
+	 * @since 4.9.1
682
+	 * @param EE_Line_Item    $line_item
683
+	 * @param \EE_Transaction $transaction
684
+	 * @param int             $att_nmbr
685
+	 * @param int             $total_ticket_count
686
+	 * @return EE_Registration | null
687
+	 * @throws \OutOfRangeException
688
+	 * @throws \EventEspresso\core\exceptions\UnexpectedEntityException
689
+	 * @throws \EE_Error
690
+	 */
691
+	public function generate_ONE_registration_from_line_item(
692
+		EE_Line_Item $line_item,
693
+		EE_Transaction $transaction,
694
+		$att_nmbr = 1,
695
+		$total_ticket_count = 1
696
+	) {
697
+		EE_Error::doing_it_wrong(
698
+			__CLASS__ . '::' . __FUNCTION__,
699
+			sprintf(
700
+				esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'),
701
+				'\EventEspresso\core\domain\services\registration\CreateRegistrationService::create()'
702
+			),
703
+			'4.9.1',
704
+			'5.0.0'
705
+		);
706
+		// grab the related ticket object for this line_item
707
+		$ticket = $line_item->ticket();
708
+		if (! $ticket instanceof EE_Ticket) {
709
+			EE_Error::add_error(
710
+				sprintf(
711
+					esc_html__('Line item %s did not contain a valid ticket', 'event_espresso'),
712
+					$line_item->ID()
713
+				),
714
+				__FILE__,
715
+				__FUNCTION__,
716
+				__LINE__
717
+			);
718
+			return null;
719
+		}
720
+		$registration_service = new CreateRegistrationService();
721
+		// then generate a new registration from that
722
+		return $registration_service->create(
723
+			$ticket->get_related_event(),
724
+			$transaction,
725
+			$ticket,
726
+			$line_item,
727
+			$att_nmbr,
728
+			$total_ticket_count
729
+		);
730
+	}
731
+
732
+
733
+	/**
734
+	 * generates reg_url_link
735
+	 *
736
+	 * @deprecated
737
+	 * @since 4.9.1
738
+	 * @param int                   $att_nmbr
739
+	 * @param EE_Line_Item | string $item
740
+	 * @return string
741
+	 * @throws InvalidArgumentException
742
+	 */
743
+	public function generate_reg_url_link($att_nmbr, $item)
744
+	{
745
+		EE_Error::doing_it_wrong(
746
+			__CLASS__ . '::' . __FUNCTION__,
747
+			sprintf(
748
+				esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'),
749
+				'EventEspresso\core\domain\entities\RegUrlLink'
750
+			),
751
+			'4.9.1',
752
+			'5.0.0'
753
+		);
754
+		return new RegUrlLink($att_nmbr, $item);
755
+	}
756
+
757
+
758
+	/**
759
+	 * generates reg code
760
+	 *
761
+	 * @deprecated
762
+	 * @since 4.9.1
763
+	 * @param EE_Registration $registration
764
+	 * @return string
765
+	 * @throws EE_Error
766
+	 * @throws EntityNotFoundException
767
+	 * @throws InvalidArgumentException
768
+	 */
769
+	public function generate_reg_code(EE_Registration $registration)
770
+	{
771
+		EE_Error::doing_it_wrong(
772
+			__CLASS__ . '::' . __FUNCTION__,
773
+			sprintf(
774
+				esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'),
775
+				'EventEspresso\core\domain\entities\RegCode'
776
+			),
777
+			'4.9.1',
778
+			'5.0.0'
779
+		);
780
+		return apply_filters(
781
+			'FHEE__EE_Registration_Processor___generate_reg_code__new_reg_code',
782
+			new RegCode(
783
+				RegUrlLink::fromRegistration($registration),
784
+				$registration->transaction(),
785
+				$registration->ticket()
786
+			),
787
+			$registration
788
+		);
789
+	}
790 790
 }
Please login to merge, or discard this patch.
Spacing   +24 added lines, -24 removed lines patch added patch discarded remove patch
@@ -79,8 +79,8 @@  discard block
 block discarded – undo
79 79
     public static function instance(EE_Request $request = null)
80 80
     {
81 81
         // check if class object is instantiated
82
-        if (! self::$_instance instanceof EE_Registration_Processor) {
83
-            if (! $request instanceof EE_Request) {
82
+        if ( ! self::$_instance instanceof EE_Registration_Processor) {
83
+            if ( ! $request instanceof EE_Request) {
84 84
                 $request = LoaderFactory::getLoader()->getShared('EE_Request');
85 85
             }
86 86
             self::$_instance = new self($request);
@@ -106,7 +106,7 @@  discard block
 block discarded – undo
106 106
      */
107 107
     public function old_reg_status($REG_ID)
108 108
     {
109
-        return isset($this->_old_reg_status[ $REG_ID ]) ? $this->_old_reg_status[ $REG_ID ] : null;
109
+        return isset($this->_old_reg_status[$REG_ID]) ? $this->_old_reg_status[$REG_ID] : null;
110 110
     }
111 111
 
112 112
 
@@ -117,8 +117,8 @@  discard block
 block discarded – undo
117 117
     public function set_old_reg_status($REG_ID, $old_reg_status)
118 118
     {
119 119
         // only set the first time
120
-        if (! isset($this->_old_reg_status[ $REG_ID ])) {
121
-            $this->_old_reg_status[ $REG_ID ] = $old_reg_status;
120
+        if ( ! isset($this->_old_reg_status[$REG_ID])) {
121
+            $this->_old_reg_status[$REG_ID] = $old_reg_status;
122 122
         }
123 123
     }
124 124
 
@@ -129,7 +129,7 @@  discard block
 block discarded – undo
129 129
      */
130 130
     public function new_reg_status($REG_ID)
131 131
     {
132
-        return isset($this->_new_reg_status[ $REG_ID ]) ? $this->_new_reg_status[ $REG_ID ] : null;
132
+        return isset($this->_new_reg_status[$REG_ID]) ? $this->_new_reg_status[$REG_ID] : null;
133 133
     }
134 134
 
135 135
 
@@ -139,7 +139,7 @@  discard block
 block discarded – undo
139 139
      */
140 140
     public function set_new_reg_status($REG_ID, $new_reg_status)
141 141
     {
142
-        $this->_new_reg_status[ $REG_ID ] = $new_reg_status;
142
+        $this->_new_reg_status[$REG_ID] = $new_reg_status;
143 143
     }
144 144
 
145 145
 
@@ -205,7 +205,7 @@  discard block
 block discarded – undo
205 205
         // toggle reg status but only if it has changed and the user can do so
206 206
         if ($this->reg_status_updated($registration->ID())
207 207
             && (
208
-                (! $this->request->isAdmin() || $this->request->isFrontAjax())
208
+                ( ! $this->request->isAdmin() || $this->request->isFrontAjax())
209 209
                 || EE_Registry::instance()->CAP->current_user_can(
210 210
                     'ee_edit_registration',
211 211
                     'toggle_registration_status',
@@ -268,7 +268,7 @@  discard block
 block discarded – undo
268 268
                 $registration->save();
269 269
             }
270 270
             // don't trigger notifications during IPNs because they will get triggered by EE_Payment_Processor
271
-            if (! EE_Processor_Base::$IPN) {
271
+            if ( ! EE_Processor_Base::$IPN) {
272 272
                 // otherwise, send out notifications
273 273
                 add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10);
274 274
             }
@@ -326,7 +326,7 @@  discard block
 block discarded – undo
326 326
                 $registration->save();
327 327
             }
328 328
             // don't trigger notifications during IPNs because they will get triggered by EE_Payment_Processor
329
-            if (! EE_Processor_Base::$IPN) {
329
+            if ( ! EE_Processor_Base::$IPN) {
330 330
                 // otherwise, send out notifications
331 331
                 add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10);
332 332
             }
@@ -398,14 +398,14 @@  discard block
 block discarded – undo
398 398
                 || (
399 399
                     $payment instanceof EE_Payment && $payment->is_approved()
400 400
                     && // this specific registration has not yet been paid for
401
-                    ! isset(self::$_amount_paid[ $registration->ID() ])
401
+                    ! isset(self::$_amount_paid[$registration->ID()])
402 402
                     && // payment amount, less what we have already attributed to other registrations, is greater than this reg's final price
403 403
                     $payment->amount() - $total_paid >= $registration->final_price()
404 404
                 )
405 405
             )
406 406
         ) {
407 407
             // mark as paid
408
-            self::$_amount_paid[ $registration->ID() ] = $registration->final_price();
408
+            self::$_amount_paid[$registration->ID()] = $registration->final_price();
409 409
             // track new REG_Status
410 410
             $this->set_new_reg_status($registration->ID(), EEM_Registration::status_id_approved);
411 411
             // toggle status to approved
@@ -414,7 +414,7 @@  discard block
 block discarded – undo
414 414
                 $registration->save();
415 415
             }
416 416
             // don't trigger notifications during IPNs because they will get triggered by EE_Payment_Processor
417
-            if (! EE_Processor_Base::$IPN) {
417
+            if ( ! EE_Processor_Base::$IPN) {
418 418
                 // otherwise, send out notifications
419 419
                 add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10);
420 420
             }
@@ -448,7 +448,7 @@  discard block
 block discarded – undo
448 448
     public function trigger_registration_update_notifications($registration, array $additional_details = array())
449 449
     {
450 450
         try {
451
-            if (! $registration instanceof EE_Registration) {
451
+            if ( ! $registration instanceof EE_Registration) {
452 452
                 throw new EE_Error(
453 453
                     esc_html__('An invalid registration was received.', 'event_espresso')
454 454
                 );
@@ -462,7 +462,7 @@  discard block
 block discarded – undo
462 462
             //     false,
463 463
             //     'EE_Transaction: ' . $registration->transaction()->ID()
464 464
             // );
465
-            if (! $registration->is_primary_registrant()) {
465
+            if ( ! $registration->is_primary_registrant()) {
466 466
                 return;
467 467
             }
468 468
             do_action(
@@ -534,8 +534,8 @@  discard block
 block discarded – undo
534 534
         foreach ($transaction->registrations() as $registration) {
535 535
             /** @var EE_Line_Item $line_item */
536 536
             $line_item = EEM_Line_Item::instance()->get_line_item_for_registration($registration);
537
-            if (isset($reg_final_price_per_ticket_line_item[ $line_item->ID() ])) {
538
-                $registration->set_final_price($reg_final_price_per_ticket_line_item[ $line_item->ID() ]);
537
+            if (isset($reg_final_price_per_ticket_line_item[$line_item->ID()])) {
538
+                $registration->set_final_price($reg_final_price_per_ticket_line_item[$line_item->ID()]);
539 539
                 if ($save_regs) {
540 540
                     $registration->save();
541 541
                 }
@@ -611,11 +611,11 @@  discard block
 block discarded – undo
611 611
         $closed_reg_statuses = ! empty($closed_reg_statuses)
612 612
             ? $closed_reg_statuses
613 613
             : EEM_Registration::closed_reg_statuses();
614
-        if (! in_array($registration->status_ID(), $closed_reg_statuses, true)) {
614
+        if ( ! in_array($registration->status_ID(), $closed_reg_statuses, true)) {
615 615
             return false;
616 616
         }
617 617
         // release a reserved ticket by decrementing ticket and datetime reserved values
618
-        $registration->release_reserved_ticket(true, 'RegProcessor:' . __LINE__);
618
+        $registration->release_reserved_ticket(true, 'RegProcessor:'.__LINE__);
619 619
         $registration->set_final_price(0);
620 620
         if ($update_reg) {
621 621
             $registration->save();
@@ -646,7 +646,7 @@  discard block
 block discarded – undo
646 646
             return false;
647 647
         }
648 648
         $ticket = $registration->ticket();
649
-        if (! $ticket instanceof EE_Ticket) {
649
+        if ( ! $ticket instanceof EE_Ticket) {
650 650
             throw new EE_Error(
651 651
                 sprintf(
652 652
                     esc_html__(
@@ -695,7 +695,7 @@  discard block
 block discarded – undo
695 695
         $total_ticket_count = 1
696 696
     ) {
697 697
         EE_Error::doing_it_wrong(
698
-            __CLASS__ . '::' . __FUNCTION__,
698
+            __CLASS__.'::'.__FUNCTION__,
699 699
             sprintf(
700 700
                 esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'),
701 701
                 '\EventEspresso\core\domain\services\registration\CreateRegistrationService::create()'
@@ -705,7 +705,7 @@  discard block
 block discarded – undo
705 705
         );
706 706
         // grab the related ticket object for this line_item
707 707
         $ticket = $line_item->ticket();
708
-        if (! $ticket instanceof EE_Ticket) {
708
+        if ( ! $ticket instanceof EE_Ticket) {
709 709
             EE_Error::add_error(
710 710
                 sprintf(
711 711
                     esc_html__('Line item %s did not contain a valid ticket', 'event_espresso'),
@@ -743,7 +743,7 @@  discard block
 block discarded – undo
743 743
     public function generate_reg_url_link($att_nmbr, $item)
744 744
     {
745 745
         EE_Error::doing_it_wrong(
746
-            __CLASS__ . '::' . __FUNCTION__,
746
+            __CLASS__.'::'.__FUNCTION__,
747 747
             sprintf(
748 748
                 esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'),
749 749
                 'EventEspresso\core\domain\entities\RegUrlLink'
@@ -769,7 +769,7 @@  discard block
 block discarded – undo
769 769
     public function generate_reg_code(EE_Registration $registration)
770 770
     {
771 771
         EE_Error::doing_it_wrong(
772
-            __CLASS__ . '::' . __FUNCTION__,
772
+            __CLASS__.'::'.__FUNCTION__,
773 773
             sprintf(
774 774
                 esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'),
775 775
                 'EventEspresso\core\domain\entities\RegCode'
Please login to merge, or discard this patch.
core/business/EE_Processor_Base.class.php 2 patches
Indentation   +60 added lines, -60 removed lines patch added patch discarded remove patch
@@ -14,71 +14,71 @@
 block discarded – undo
14 14
 class EE_Processor_Base
15 15
 {
16 16
 
17
-    /**
18
-     * Used to indicate whether current request is for an IPN or not.
19
-     *
20
-     * @var bool
21
-     */
22
-    protected static $IPN = false;
17
+	/**
18
+	 * Used to indicate whether current request is for an IPN or not.
19
+	 *
20
+	 * @var bool
21
+	 */
22
+	protected static $IPN = false;
23 23
 
24
-    /**
25
-     * Used to indicate whether SPCO is being revisited by registrant or not.
26
-     *
27
-     * @var bool
28
-     */
29
-    protected $_revisit = false;
24
+	/**
25
+	 * Used to indicate whether SPCO is being revisited by registrant or not.
26
+	 *
27
+	 * @var bool
28
+	 */
29
+	protected $_revisit = false;
30 30
 
31 31
 
32
-    /**
33
-     * @param boolean $IPN
34
-     */
35
-    public static function set_IPN($IPN)
36
-    {
37
-        self::$IPN = filter_var($IPN, FILTER_VALIDATE_BOOLEAN);
38
-    }
32
+	/**
33
+	 * @param boolean $IPN
34
+	 */
35
+	public static function set_IPN($IPN)
36
+	{
37
+		self::$IPN = filter_var($IPN, FILTER_VALIDATE_BOOLEAN);
38
+	}
39 39
 
40 40
 
41
-    /**
42
-     * Allows external class (usually checkout) to set whether SPCO is being revisited by registrant or not.
43
-     *
44
-     * @param bool $revisit
45
-     * @return void
46
-     */
47
-    public function set_revisit($revisit = false)
48
-    {
49
-        $this->_revisit = filter_var($revisit, FILTER_VALIDATE_BOOLEAN);
50
-    }
41
+	/**
42
+	 * Allows external class (usually checkout) to set whether SPCO is being revisited by registrant or not.
43
+	 *
44
+	 * @param bool $revisit
45
+	 * @return void
46
+	 */
47
+	public function set_revisit($revisit = false)
48
+	{
49
+		$this->_revisit = filter_var($revisit, FILTER_VALIDATE_BOOLEAN);
50
+	}
51 51
 
52 52
 
53
-    /**
54
-     * debug
55
-     *
56
-     * @param string          $class
57
-     * @param string          $func
58
-     * @param string          $line
59
-     * @param \EE_Transaction $transaction
60
-     * @param array           $info
61
-     * @param bool            $display_request
62
-     */
63
-    protected function log(
64
-        $class = '',
65
-        $func = '',
66
-        $line = '',
67
-        EE_Transaction $transaction,
68
-        $info = array(),
69
-        $display_request = false
70
-    ) {
71
-        if (WP_DEBUG && false) {
72
-            if ($transaction instanceof EE_Transaction) {
73
-                // don't serialize objects
74
-                $info = EEH_Debug_Tools::strip_objects($info);
75
-                if ($transaction->ID()) {
76
-                    $info['TXN_status'] = $transaction->status_ID();
77
-                    $info['TXN_reg_steps'] = $transaction->reg_steps();
78
-                    $index = 'EE_Transaction: ' . $transaction->ID();
79
-                    EEH_Debug_Tools::log($class, $func, $line, $info, $display_request, $index);
80
-                }
81
-            }
82
-        }
83
-    }
53
+	/**
54
+	 * debug
55
+	 *
56
+	 * @param string          $class
57
+	 * @param string          $func
58
+	 * @param string          $line
59
+	 * @param \EE_Transaction $transaction
60
+	 * @param array           $info
61
+	 * @param bool            $display_request
62
+	 */
63
+	protected function log(
64
+		$class = '',
65
+		$func = '',
66
+		$line = '',
67
+		EE_Transaction $transaction,
68
+		$info = array(),
69
+		$display_request = false
70
+	) {
71
+		if (WP_DEBUG && false) {
72
+			if ($transaction instanceof EE_Transaction) {
73
+				// don't serialize objects
74
+				$info = EEH_Debug_Tools::strip_objects($info);
75
+				if ($transaction->ID()) {
76
+					$info['TXN_status'] = $transaction->status_ID();
77
+					$info['TXN_reg_steps'] = $transaction->reg_steps();
78
+					$index = 'EE_Transaction: ' . $transaction->ID();
79
+					EEH_Debug_Tools::log($class, $func, $line, $info, $display_request, $index);
80
+				}
81
+			}
82
+		}
83
+	}
84 84
 }
Please login to merge, or discard this patch.
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -75,7 +75,7 @@
 block discarded – undo
75 75
                 if ($transaction->ID()) {
76 76
                     $info['TXN_status'] = $transaction->status_ID();
77 77
                     $info['TXN_reg_steps'] = $transaction->reg_steps();
78
-                    $index = 'EE_Transaction: ' . $transaction->ID();
78
+                    $index = 'EE_Transaction: '.$transaction->ID();
79 79
                     EEH_Debug_Tools::log($class, $func, $line, $info, $display_request, $index);
80 80
                 }
81 81
             }
Please login to merge, or discard this patch.
core/business/EE_Transaction_Payments.class.php 2 patches
Indentation   +419 added lines, -419 removed lines patch added patch discarded remove patch
@@ -16,423 +16,423 @@
 block discarded – undo
16 16
 class EE_Transaction_Payments
17 17
 {
18 18
 
19
-    /**
20
-     * @var EE_Transaction_Payments $_instance
21
-     * @access    private
22
-     */
23
-    private static $_instance;
24
-
25
-    /**
26
-     * @deprecated
27
-     * @var string
28
-     */
29
-    protected $_old_txn_status;
30
-
31
-    /**
32
-     * @deprecated
33
-     * @var string
34
-     */
35
-    protected $_new_txn_status;
36
-
37
-
38
-    /**
39
-     * @singleton method used to instantiate class object
40
-     * @access    public
41
-     * @return EE_Transaction_Payments instance
42
-     */
43
-    public static function instance()
44
-    {
45
-        // check if class object is instantiated
46
-        if (! self::$_instance instanceof EE_Transaction_Payments) {
47
-            self::$_instance = new self();
48
-        }
49
-        return self::$_instance;
50
-    }
51
-
52
-
53
-    /**
54
-     * recalculate_transaction_total
55
-     *
56
-     * @access private
57
-     * @param EE_Transaction $transaction
58
-     * @param bool           $update_txn
59
-     * @return bool true if TXN total was updated, false if not
60
-     * @throws \EE_Error
61
-     */
62
-    public function recalculate_transaction_total(EE_Transaction $transaction, $update_txn = true)
63
-    {
64
-        $total_line_item = $transaction->total_line_item();
65
-        if (! $total_line_item instanceof EE_Line_Item) {
66
-            EE_Error::add_error(
67
-                sprintf(
68
-                    __('The Total Line Item for Transaction %1$d\'s was not found or is invalid.', 'event_espresso'),
69
-                    $transaction->ID()
70
-                ),
71
-                __FILE__,
72
-                __FUNCTION__,
73
-                __LINE__
74
-            );
75
-            return false;
76
-        }
77
-        $new_total = $total_line_item->recalculate_total_including_taxes();
78
-        $transaction->set_total($new_total);
79
-        if ($update_txn) {
80
-            return $transaction->save() ? true : false;
81
-        }
82
-        return false;
83
-    }
84
-
85
-
86
-    /**
87
-     * Updates the provided EE_Transaction with all the applicable payments
88
-     * returns a boolean for whether the TXN was saved to the db
89
-     * (meaning a status change occurred)
90
-     * or not saved (which could **still** mean that
91
-     * the TXN status changed, but just was not yet saved).
92
-     * So if passing a value of false for the $update_txn param,
93
-     * then client code needs to take responsibility for saving the TXN
94
-     * regardless of what happens within EE_Transaction_Payments;
95
-     *
96
-     * @param            EE_Transaction /int $transaction_obj_or_id EE_Transaction or its ID
97
-     * @param    boolean $update_txn whether to save the TXN
98
-     * @return    boolean        whether the TXN was saved
99
-     * @throws \EE_Error
100
-     */
101
-    public function calculate_total_payments_and_update_status(EE_Transaction $transaction, $update_txn = true)
102
-    {
103
-        // verify transaction
104
-        if (! $transaction instanceof EE_Transaction) {
105
-            EE_Error::add_error(
106
-                __('Please provide a valid EE_Transaction object.', 'event_espresso'),
107
-                __FILE__,
108
-                __FUNCTION__,
109
-                __LINE__
110
-            );
111
-            return false;
112
-        }
113
-        // calculate total paid
114
-        $total_paid = $this->recalculate_total_payments_for_transaction($transaction);
115
-        // if total paid has changed
116
-        if ($total_paid !== false && (float) $total_paid !== $transaction->paid()) {
117
-            $transaction->set_paid($total_paid);
118
-            // maybe update status, and make sure to save transaction if not done already
119
-            if (! $transaction->update_status_based_on_total_paid($update_txn)) {
120
-                if ($update_txn) {
121
-                    return $transaction->save() ? true : false;
122
-                }
123
-            } else {
124
-                // the status got updated and was saved by
125
-                // update_transaction_status_based_on_total_paid()
126
-                return true;
127
-            }
128
-        }
129
-        return false;
130
-    }
131
-
132
-
133
-    /**
134
-     * recalculate_total_payments_for_transaction
135
-     *
136
-     * @access public
137
-     * @param EE_Transaction $transaction
138
-     * @param string         $payment_status One of EEM_Payment's statuses, like 'PAP' (Approved).
139
-     *                                       By default, searches for approved payments
140
-     * @return float|false   float on success, false on fail
141
-     * @throws \EE_Error
142
-     */
143
-    public function recalculate_total_payments_for_transaction(
144
-        EE_Transaction $transaction,
145
-        $payment_status = EEM_Payment::status_id_approved
146
-    ) {
147
-        // verify transaction
148
-        if (! $transaction instanceof EE_Transaction) {
149
-            EE_Error::add_error(
150
-                __('Please provide a valid EE_Transaction object.', 'event_espresso'),
151
-                __FILE__,
152
-                __FUNCTION__,
153
-                __LINE__
154
-            );
155
-            return false;
156
-        }
157
-        // ensure Payment model is loaded
158
-        EE_Registry::instance()->load_model('Payment');
159
-        // calls EEM_Base::sum()
160
-        return EEM_Payment::instance()->sum(
161
-            // query params
162
-            array(array('TXN_ID' => $transaction->ID(), 'STS_ID' => $payment_status)),
163
-            // field to sum
164
-            'PAY_amount'
165
-        );
166
-    }
167
-
168
-
169
-    /**
170
-     * delete_payment_and_update_transaction
171
-     * Before deleting the selected payment, we fetch it's transaction,
172
-     * then delete the payment, and update the transactions' amount paid.
173
-     *
174
-     * @param EE_Payment $payment
175
-     * @return boolean
176
-     * @throws \EE_Error
177
-     */
178
-    public function delete_payment_and_update_transaction(EE_Payment $payment)
179
-    {
180
-        // verify payment
181
-        if (! $payment instanceof EE_Payment) {
182
-            EE_Error::add_error(
183
-                __('A valid Payment object was not received.', 'event_espresso'),
184
-                __FILE__,
185
-                __FUNCTION__,
186
-                __LINE__
187
-            );
188
-            return false;
189
-        }
190
-        if (! $this->delete_registration_payments_and_update_registrations($payment)) {
191
-            return false;
192
-        }
193
-        if (! $payment->delete()) {
194
-            EE_Error::add_error(
195
-                __('The payment could not be deleted.', 'event_espresso'),
196
-                __FILE__,
197
-                __FUNCTION__,
198
-                __LINE__
199
-            );
200
-            return false;
201
-        }
202
-
203
-        $transaction = $payment->transaction();
204
-        $TXN_status = $transaction->status_ID();
205
-        if ($TXN_status === EEM_Transaction::abandoned_status_code
206
-            || $TXN_status === EEM_Transaction::failed_status_code
207
-            || $payment->amount() === 0
208
-        ) {
209
-            EE_Error::add_success(__('The Payment was successfully deleted.', 'event_espresso'));
210
-            return true;
211
-        }
212
-
213
-
214
-        // if this fails, that just means that the transaction didn't get its status changed and/or updated.
215
-        // however the payment was still deleted.
216
-        if (! $this->calculate_total_payments_and_update_status($transaction)) {
217
-            EE_Error::add_attention(
218
-                __(
219
-                    'It appears that the Payment was deleted but no change was recorded for the Transaction for an unknown reason. Please verify that all data for this Transaction looks correct..',
220
-                    'event_espresso'
221
-                ),
222
-                __FILE__,
223
-                __FUNCTION__,
224
-                __LINE__
225
-            );
226
-            return true;
227
-        }
228
-
229
-        EE_Error::add_success(
230
-            __(
231
-                'The Payment was successfully deleted, and the Transaction has been updated accordingly.',
232
-                'event_espresso'
233
-            )
234
-        );
235
-        return true;
236
-    }
237
-
238
-
239
-    /**
240
-     * delete_registration_payments_and_update_registrations
241
-     *
242
-     * removes all registration payment records associated with a payment
243
-     * and subtracts their amounts from the corresponding registrations REG_paid field
244
-     *
245
-     * @param EE_Payment $payment
246
-     * @param array      $reg_payment_query_params
247
-     * @return bool
248
-     * @throws \EE_Error
249
-     */
250
-    public function delete_registration_payments_and_update_registrations(
251
-        EE_Payment $payment,
252
-        $reg_payment_query_params = array()
253
-    ) {
254
-        $save_payment = false;
255
-        $reg_payment_query_params = ! empty($reg_payment_query_params) ? $reg_payment_query_params
256
-            : array(array('PAY_ID' => $payment->ID()));
257
-        $registration_payments = EEM_Registration_Payment::instance()->get_all($reg_payment_query_params);
258
-        if (! empty($registration_payments)) {
259
-            foreach ($registration_payments as $registration_payment) {
260
-                if ($registration_payment instanceof EE_Registration_Payment) {
261
-                    $amount_paid = $registration_payment->amount();
262
-                    $registration = $registration_payment->registration();
263
-                    if ($registration instanceof EE_Registration) {
264
-                        $registration->set_paid($registration->paid() - $amount_paid);
265
-                        if ($registration->save() !== false) {
266
-                            $registration_payment->delete_permanently();
267
-                            $save_payment = true;
268
-                        }
269
-                    } else {
270
-                        EE_Error::add_error(
271
-                            sprintf(
272
-                                __(
273
-                                    'An invalid Registration object was associated with Registration Payment ID# %1$d.',
274
-                                    'event_espresso'
275
-                                ),
276
-                                $registration_payment->ID()
277
-                            ),
278
-                            __FILE__,
279
-                            __FUNCTION__,
280
-                            __LINE__
281
-                        );
282
-                        return false;
283
-                    }
284
-                } else {
285
-                    EE_Error::add_error(
286
-                        sprintf(
287
-                            __(
288
-                                'An invalid Registration Payment object was associated with payment ID# %1$d.',
289
-                                'event_espresso'
290
-                            ),
291
-                            $payment->ID()
292
-                        ),
293
-                        __FILE__,
294
-                        __FUNCTION__,
295
-                        __LINE__
296
-                    );
297
-                    return false;
298
-                }
299
-            }
300
-        }
301
-        if ($save_payment) {
302
-            $payment->save();
303
-        }
304
-        return true;
305
-    }
306
-
307
-
308
-
309
-    /********************************** DEPRECATED METHODS **********************************/
310
-
311
-
312
-    /**
313
-     * possibly toggles TXN status
314
-     *
315
-     * @deprecated 4.9.1
316
-     * @param EE_Transaction $transaction
317
-     * @param    boolean     $update_txn whether to save the TXN
318
-     * @return    boolean        whether the TXN was saved
319
-     * @throws \EE_Error
320
-     */
321
-    public function update_transaction_status_based_on_total_paid(EE_Transaction $transaction, $update_txn = true)
322
-    {
323
-        EE_Error::doing_it_wrong(
324
-            __CLASS__ . '::' . __FUNCTION__,
325
-            sprintf(
326
-                __('This method is deprecated. Please use "%s" instead', 'event_espresso'),
327
-                'EE_Transaction::update_status_based_on_total_paid()'
328
-            ),
329
-            '4.9.1',
330
-            '5.0.0'
331
-        );
332
-        // verify transaction
333
-        if (! $transaction instanceof EE_Transaction) {
334
-            EE_Error::add_error(
335
-                __('Please provide a valid EE_Transaction object.', 'event_espresso'),
336
-                __FILE__,
337
-                __FUNCTION__,
338
-                __LINE__
339
-            );
340
-            return false;
341
-        }
342
-        // set transaction status based on comparison of TXN_paid vs TXN_total
343
-        return $transaction->update_status_based_on_total_paid($update_txn);
344
-    }
345
-
346
-
347
-    /**
348
-     * @deprecated 4.9.12
349
-     * @return string
350
-     */
351
-    public function old_txn_status()
352
-    {
353
-        EE_Error::doing_it_wrong(
354
-            __METHOD__,
355
-            esc_html__(
356
-                'This logic has been moved into \EE_Transaction::old_txn_status(), please use that method instead.',
357
-                'event_espresso'
358
-            ),
359
-            '4.9.12'
360
-        );
361
-        return $this->_old_txn_status;
362
-    }
363
-
364
-
365
-    /**
366
-     * @deprecated 4.9.12
367
-     * @param string $old_txn_status
368
-     */
369
-    public function set_old_txn_status($old_txn_status)
370
-    {
371
-        EE_Error::doing_it_wrong(
372
-            __METHOD__,
373
-            esc_html__(
374
-                'This logic has been moved into \EE_Transaction::set_old_txn_status(), please use that method instead.',
375
-                'event_espresso'
376
-            ),
377
-            '4.9.12'
378
-        );
379
-        // only set the first time
380
-        if ($this->_old_txn_status === null) {
381
-            $this->_old_txn_status = $old_txn_status;
382
-        }
383
-    }
384
-
385
-
386
-    /**
387
-     * @deprecated 4.9.12
388
-     * @return string
389
-     */
390
-    public function new_txn_status()
391
-    {
392
-        EE_Error::doing_it_wrong(
393
-            __METHOD__,
394
-            esc_html__(
395
-                'This logic has been removed. Please just use \EE_Transaction::status_ID() instead.',
396
-                'event_espresso'
397
-            ),
398
-            '4.9.12'
399
-        );
400
-        return $this->_new_txn_status;
401
-    }
402
-
403
-
404
-    /**
405
-     * @deprecated 4.9.12
406
-     * @param string $new_txn_status
407
-     */
408
-    public function set_new_txn_status($new_txn_status)
409
-    {
410
-        EE_Error::doing_it_wrong(
411
-            __METHOD__,
412
-            esc_html__(
413
-                'This logic has been removed. Please just use \EE_Transaction::set_status() instead.',
414
-                'event_espresso'
415
-            ),
416
-            '4.9.12'
417
-        );
418
-        $this->_new_txn_status = $new_txn_status;
419
-    }
420
-
421
-
422
-    /**
423
-     * @deprecated 4.9.12
424
-     * @return bool
425
-     */
426
-    public function txn_status_updated()
427
-    {
428
-        EE_Error::doing_it_wrong(
429
-            __METHOD__,
430
-            esc_html__(
431
-                'This logic has been moved into \EE_Transaction::txn_status_updated(), please use that method instead.',
432
-                'event_espresso'
433
-            ),
434
-            '4.9.12'
435
-        );
436
-        return $this->_new_txn_status !== $this->_old_txn_status && $this->_old_txn_status !== null ? true : false;
437
-    }
19
+	/**
20
+	 * @var EE_Transaction_Payments $_instance
21
+	 * @access    private
22
+	 */
23
+	private static $_instance;
24
+
25
+	/**
26
+	 * @deprecated
27
+	 * @var string
28
+	 */
29
+	protected $_old_txn_status;
30
+
31
+	/**
32
+	 * @deprecated
33
+	 * @var string
34
+	 */
35
+	protected $_new_txn_status;
36
+
37
+
38
+	/**
39
+	 * @singleton method used to instantiate class object
40
+	 * @access    public
41
+	 * @return EE_Transaction_Payments instance
42
+	 */
43
+	public static function instance()
44
+	{
45
+		// check if class object is instantiated
46
+		if (! self::$_instance instanceof EE_Transaction_Payments) {
47
+			self::$_instance = new self();
48
+		}
49
+		return self::$_instance;
50
+	}
51
+
52
+
53
+	/**
54
+	 * recalculate_transaction_total
55
+	 *
56
+	 * @access private
57
+	 * @param EE_Transaction $transaction
58
+	 * @param bool           $update_txn
59
+	 * @return bool true if TXN total was updated, false if not
60
+	 * @throws \EE_Error
61
+	 */
62
+	public function recalculate_transaction_total(EE_Transaction $transaction, $update_txn = true)
63
+	{
64
+		$total_line_item = $transaction->total_line_item();
65
+		if (! $total_line_item instanceof EE_Line_Item) {
66
+			EE_Error::add_error(
67
+				sprintf(
68
+					__('The Total Line Item for Transaction %1$d\'s was not found or is invalid.', 'event_espresso'),
69
+					$transaction->ID()
70
+				),
71
+				__FILE__,
72
+				__FUNCTION__,
73
+				__LINE__
74
+			);
75
+			return false;
76
+		}
77
+		$new_total = $total_line_item->recalculate_total_including_taxes();
78
+		$transaction->set_total($new_total);
79
+		if ($update_txn) {
80
+			return $transaction->save() ? true : false;
81
+		}
82
+		return false;
83
+	}
84
+
85
+
86
+	/**
87
+	 * Updates the provided EE_Transaction with all the applicable payments
88
+	 * returns a boolean for whether the TXN was saved to the db
89
+	 * (meaning a status change occurred)
90
+	 * or not saved (which could **still** mean that
91
+	 * the TXN status changed, but just was not yet saved).
92
+	 * So if passing a value of false for the $update_txn param,
93
+	 * then client code needs to take responsibility for saving the TXN
94
+	 * regardless of what happens within EE_Transaction_Payments;
95
+	 *
96
+	 * @param            EE_Transaction /int $transaction_obj_or_id EE_Transaction or its ID
97
+	 * @param    boolean $update_txn whether to save the TXN
98
+	 * @return    boolean        whether the TXN was saved
99
+	 * @throws \EE_Error
100
+	 */
101
+	public function calculate_total_payments_and_update_status(EE_Transaction $transaction, $update_txn = true)
102
+	{
103
+		// verify transaction
104
+		if (! $transaction instanceof EE_Transaction) {
105
+			EE_Error::add_error(
106
+				__('Please provide a valid EE_Transaction object.', 'event_espresso'),
107
+				__FILE__,
108
+				__FUNCTION__,
109
+				__LINE__
110
+			);
111
+			return false;
112
+		}
113
+		// calculate total paid
114
+		$total_paid = $this->recalculate_total_payments_for_transaction($transaction);
115
+		// if total paid has changed
116
+		if ($total_paid !== false && (float) $total_paid !== $transaction->paid()) {
117
+			$transaction->set_paid($total_paid);
118
+			// maybe update status, and make sure to save transaction if not done already
119
+			if (! $transaction->update_status_based_on_total_paid($update_txn)) {
120
+				if ($update_txn) {
121
+					return $transaction->save() ? true : false;
122
+				}
123
+			} else {
124
+				// the status got updated and was saved by
125
+				// update_transaction_status_based_on_total_paid()
126
+				return true;
127
+			}
128
+		}
129
+		return false;
130
+	}
131
+
132
+
133
+	/**
134
+	 * recalculate_total_payments_for_transaction
135
+	 *
136
+	 * @access public
137
+	 * @param EE_Transaction $transaction
138
+	 * @param string         $payment_status One of EEM_Payment's statuses, like 'PAP' (Approved).
139
+	 *                                       By default, searches for approved payments
140
+	 * @return float|false   float on success, false on fail
141
+	 * @throws \EE_Error
142
+	 */
143
+	public function recalculate_total_payments_for_transaction(
144
+		EE_Transaction $transaction,
145
+		$payment_status = EEM_Payment::status_id_approved
146
+	) {
147
+		// verify transaction
148
+		if (! $transaction instanceof EE_Transaction) {
149
+			EE_Error::add_error(
150
+				__('Please provide a valid EE_Transaction object.', 'event_espresso'),
151
+				__FILE__,
152
+				__FUNCTION__,
153
+				__LINE__
154
+			);
155
+			return false;
156
+		}
157
+		// ensure Payment model is loaded
158
+		EE_Registry::instance()->load_model('Payment');
159
+		// calls EEM_Base::sum()
160
+		return EEM_Payment::instance()->sum(
161
+			// query params
162
+			array(array('TXN_ID' => $transaction->ID(), 'STS_ID' => $payment_status)),
163
+			// field to sum
164
+			'PAY_amount'
165
+		);
166
+	}
167
+
168
+
169
+	/**
170
+	 * delete_payment_and_update_transaction
171
+	 * Before deleting the selected payment, we fetch it's transaction,
172
+	 * then delete the payment, and update the transactions' amount paid.
173
+	 *
174
+	 * @param EE_Payment $payment
175
+	 * @return boolean
176
+	 * @throws \EE_Error
177
+	 */
178
+	public function delete_payment_and_update_transaction(EE_Payment $payment)
179
+	{
180
+		// verify payment
181
+		if (! $payment instanceof EE_Payment) {
182
+			EE_Error::add_error(
183
+				__('A valid Payment object was not received.', 'event_espresso'),
184
+				__FILE__,
185
+				__FUNCTION__,
186
+				__LINE__
187
+			);
188
+			return false;
189
+		}
190
+		if (! $this->delete_registration_payments_and_update_registrations($payment)) {
191
+			return false;
192
+		}
193
+		if (! $payment->delete()) {
194
+			EE_Error::add_error(
195
+				__('The payment could not be deleted.', 'event_espresso'),
196
+				__FILE__,
197
+				__FUNCTION__,
198
+				__LINE__
199
+			);
200
+			return false;
201
+		}
202
+
203
+		$transaction = $payment->transaction();
204
+		$TXN_status = $transaction->status_ID();
205
+		if ($TXN_status === EEM_Transaction::abandoned_status_code
206
+			|| $TXN_status === EEM_Transaction::failed_status_code
207
+			|| $payment->amount() === 0
208
+		) {
209
+			EE_Error::add_success(__('The Payment was successfully deleted.', 'event_espresso'));
210
+			return true;
211
+		}
212
+
213
+
214
+		// if this fails, that just means that the transaction didn't get its status changed and/or updated.
215
+		// however the payment was still deleted.
216
+		if (! $this->calculate_total_payments_and_update_status($transaction)) {
217
+			EE_Error::add_attention(
218
+				__(
219
+					'It appears that the Payment was deleted but no change was recorded for the Transaction for an unknown reason. Please verify that all data for this Transaction looks correct..',
220
+					'event_espresso'
221
+				),
222
+				__FILE__,
223
+				__FUNCTION__,
224
+				__LINE__
225
+			);
226
+			return true;
227
+		}
228
+
229
+		EE_Error::add_success(
230
+			__(
231
+				'The Payment was successfully deleted, and the Transaction has been updated accordingly.',
232
+				'event_espresso'
233
+			)
234
+		);
235
+		return true;
236
+	}
237
+
238
+
239
+	/**
240
+	 * delete_registration_payments_and_update_registrations
241
+	 *
242
+	 * removes all registration payment records associated with a payment
243
+	 * and subtracts their amounts from the corresponding registrations REG_paid field
244
+	 *
245
+	 * @param EE_Payment $payment
246
+	 * @param array      $reg_payment_query_params
247
+	 * @return bool
248
+	 * @throws \EE_Error
249
+	 */
250
+	public function delete_registration_payments_and_update_registrations(
251
+		EE_Payment $payment,
252
+		$reg_payment_query_params = array()
253
+	) {
254
+		$save_payment = false;
255
+		$reg_payment_query_params = ! empty($reg_payment_query_params) ? $reg_payment_query_params
256
+			: array(array('PAY_ID' => $payment->ID()));
257
+		$registration_payments = EEM_Registration_Payment::instance()->get_all($reg_payment_query_params);
258
+		if (! empty($registration_payments)) {
259
+			foreach ($registration_payments as $registration_payment) {
260
+				if ($registration_payment instanceof EE_Registration_Payment) {
261
+					$amount_paid = $registration_payment->amount();
262
+					$registration = $registration_payment->registration();
263
+					if ($registration instanceof EE_Registration) {
264
+						$registration->set_paid($registration->paid() - $amount_paid);
265
+						if ($registration->save() !== false) {
266
+							$registration_payment->delete_permanently();
267
+							$save_payment = true;
268
+						}
269
+					} else {
270
+						EE_Error::add_error(
271
+							sprintf(
272
+								__(
273
+									'An invalid Registration object was associated with Registration Payment ID# %1$d.',
274
+									'event_espresso'
275
+								),
276
+								$registration_payment->ID()
277
+							),
278
+							__FILE__,
279
+							__FUNCTION__,
280
+							__LINE__
281
+						);
282
+						return false;
283
+					}
284
+				} else {
285
+					EE_Error::add_error(
286
+						sprintf(
287
+							__(
288
+								'An invalid Registration Payment object was associated with payment ID# %1$d.',
289
+								'event_espresso'
290
+							),
291
+							$payment->ID()
292
+						),
293
+						__FILE__,
294
+						__FUNCTION__,
295
+						__LINE__
296
+					);
297
+					return false;
298
+				}
299
+			}
300
+		}
301
+		if ($save_payment) {
302
+			$payment->save();
303
+		}
304
+		return true;
305
+	}
306
+
307
+
308
+
309
+	/********************************** DEPRECATED METHODS **********************************/
310
+
311
+
312
+	/**
313
+	 * possibly toggles TXN status
314
+	 *
315
+	 * @deprecated 4.9.1
316
+	 * @param EE_Transaction $transaction
317
+	 * @param    boolean     $update_txn whether to save the TXN
318
+	 * @return    boolean        whether the TXN was saved
319
+	 * @throws \EE_Error
320
+	 */
321
+	public function update_transaction_status_based_on_total_paid(EE_Transaction $transaction, $update_txn = true)
322
+	{
323
+		EE_Error::doing_it_wrong(
324
+			__CLASS__ . '::' . __FUNCTION__,
325
+			sprintf(
326
+				__('This method is deprecated. Please use "%s" instead', 'event_espresso'),
327
+				'EE_Transaction::update_status_based_on_total_paid()'
328
+			),
329
+			'4.9.1',
330
+			'5.0.0'
331
+		);
332
+		// verify transaction
333
+		if (! $transaction instanceof EE_Transaction) {
334
+			EE_Error::add_error(
335
+				__('Please provide a valid EE_Transaction object.', 'event_espresso'),
336
+				__FILE__,
337
+				__FUNCTION__,
338
+				__LINE__
339
+			);
340
+			return false;
341
+		}
342
+		// set transaction status based on comparison of TXN_paid vs TXN_total
343
+		return $transaction->update_status_based_on_total_paid($update_txn);
344
+	}
345
+
346
+
347
+	/**
348
+	 * @deprecated 4.9.12
349
+	 * @return string
350
+	 */
351
+	public function old_txn_status()
352
+	{
353
+		EE_Error::doing_it_wrong(
354
+			__METHOD__,
355
+			esc_html__(
356
+				'This logic has been moved into \EE_Transaction::old_txn_status(), please use that method instead.',
357
+				'event_espresso'
358
+			),
359
+			'4.9.12'
360
+		);
361
+		return $this->_old_txn_status;
362
+	}
363
+
364
+
365
+	/**
366
+	 * @deprecated 4.9.12
367
+	 * @param string $old_txn_status
368
+	 */
369
+	public function set_old_txn_status($old_txn_status)
370
+	{
371
+		EE_Error::doing_it_wrong(
372
+			__METHOD__,
373
+			esc_html__(
374
+				'This logic has been moved into \EE_Transaction::set_old_txn_status(), please use that method instead.',
375
+				'event_espresso'
376
+			),
377
+			'4.9.12'
378
+		);
379
+		// only set the first time
380
+		if ($this->_old_txn_status === null) {
381
+			$this->_old_txn_status = $old_txn_status;
382
+		}
383
+	}
384
+
385
+
386
+	/**
387
+	 * @deprecated 4.9.12
388
+	 * @return string
389
+	 */
390
+	public function new_txn_status()
391
+	{
392
+		EE_Error::doing_it_wrong(
393
+			__METHOD__,
394
+			esc_html__(
395
+				'This logic has been removed. Please just use \EE_Transaction::status_ID() instead.',
396
+				'event_espresso'
397
+			),
398
+			'4.9.12'
399
+		);
400
+		return $this->_new_txn_status;
401
+	}
402
+
403
+
404
+	/**
405
+	 * @deprecated 4.9.12
406
+	 * @param string $new_txn_status
407
+	 */
408
+	public function set_new_txn_status($new_txn_status)
409
+	{
410
+		EE_Error::doing_it_wrong(
411
+			__METHOD__,
412
+			esc_html__(
413
+				'This logic has been removed. Please just use \EE_Transaction::set_status() instead.',
414
+				'event_espresso'
415
+			),
416
+			'4.9.12'
417
+		);
418
+		$this->_new_txn_status = $new_txn_status;
419
+	}
420
+
421
+
422
+	/**
423
+	 * @deprecated 4.9.12
424
+	 * @return bool
425
+	 */
426
+	public function txn_status_updated()
427
+	{
428
+		EE_Error::doing_it_wrong(
429
+			__METHOD__,
430
+			esc_html__(
431
+				'This logic has been moved into \EE_Transaction::txn_status_updated(), please use that method instead.',
432
+				'event_espresso'
433
+			),
434
+			'4.9.12'
435
+		);
436
+		return $this->_new_txn_status !== $this->_old_txn_status && $this->_old_txn_status !== null ? true : false;
437
+	}
438 438
 }
Please login to merge, or discard this patch.
Spacing   +12 added lines, -12 removed lines patch added patch discarded remove patch
@@ -43,7 +43,7 @@  discard block
 block discarded – undo
43 43
     public static function instance()
44 44
     {
45 45
         // check if class object is instantiated
46
-        if (! self::$_instance instanceof EE_Transaction_Payments) {
46
+        if ( ! self::$_instance instanceof EE_Transaction_Payments) {
47 47
             self::$_instance = new self();
48 48
         }
49 49
         return self::$_instance;
@@ -62,7 +62,7 @@  discard block
 block discarded – undo
62 62
     public function recalculate_transaction_total(EE_Transaction $transaction, $update_txn = true)
63 63
     {
64 64
         $total_line_item = $transaction->total_line_item();
65
-        if (! $total_line_item instanceof EE_Line_Item) {
65
+        if ( ! $total_line_item instanceof EE_Line_Item) {
66 66
             EE_Error::add_error(
67 67
                 sprintf(
68 68
                     __('The Total Line Item for Transaction %1$d\'s was not found or is invalid.', 'event_espresso'),
@@ -101,7 +101,7 @@  discard block
 block discarded – undo
101 101
     public function calculate_total_payments_and_update_status(EE_Transaction $transaction, $update_txn = true)
102 102
     {
103 103
         // verify transaction
104
-        if (! $transaction instanceof EE_Transaction) {
104
+        if ( ! $transaction instanceof EE_Transaction) {
105 105
             EE_Error::add_error(
106 106
                 __('Please provide a valid EE_Transaction object.', 'event_espresso'),
107 107
                 __FILE__,
@@ -116,7 +116,7 @@  discard block
 block discarded – undo
116 116
         if ($total_paid !== false && (float) $total_paid !== $transaction->paid()) {
117 117
             $transaction->set_paid($total_paid);
118 118
             // maybe update status, and make sure to save transaction if not done already
119
-            if (! $transaction->update_status_based_on_total_paid($update_txn)) {
119
+            if ( ! $transaction->update_status_based_on_total_paid($update_txn)) {
120 120
                 if ($update_txn) {
121 121
                     return $transaction->save() ? true : false;
122 122
                 }
@@ -145,7 +145,7 @@  discard block
 block discarded – undo
145 145
         $payment_status = EEM_Payment::status_id_approved
146 146
     ) {
147 147
         // verify transaction
148
-        if (! $transaction instanceof EE_Transaction) {
148
+        if ( ! $transaction instanceof EE_Transaction) {
149 149
             EE_Error::add_error(
150 150
                 __('Please provide a valid EE_Transaction object.', 'event_espresso'),
151 151
                 __FILE__,
@@ -178,7 +178,7 @@  discard block
 block discarded – undo
178 178
     public function delete_payment_and_update_transaction(EE_Payment $payment)
179 179
     {
180 180
         // verify payment
181
-        if (! $payment instanceof EE_Payment) {
181
+        if ( ! $payment instanceof EE_Payment) {
182 182
             EE_Error::add_error(
183 183
                 __('A valid Payment object was not received.', 'event_espresso'),
184 184
                 __FILE__,
@@ -187,10 +187,10 @@  discard block
 block discarded – undo
187 187
             );
188 188
             return false;
189 189
         }
190
-        if (! $this->delete_registration_payments_and_update_registrations($payment)) {
190
+        if ( ! $this->delete_registration_payments_and_update_registrations($payment)) {
191 191
             return false;
192 192
         }
193
-        if (! $payment->delete()) {
193
+        if ( ! $payment->delete()) {
194 194
             EE_Error::add_error(
195 195
                 __('The payment could not be deleted.', 'event_espresso'),
196 196
                 __FILE__,
@@ -213,7 +213,7 @@  discard block
 block discarded – undo
213 213
 
214 214
         // if this fails, that just means that the transaction didn't get its status changed and/or updated.
215 215
         // however the payment was still deleted.
216
-        if (! $this->calculate_total_payments_and_update_status($transaction)) {
216
+        if ( ! $this->calculate_total_payments_and_update_status($transaction)) {
217 217
             EE_Error::add_attention(
218 218
                 __(
219 219
                     'It appears that the Payment was deleted but no change was recorded for the Transaction for an unknown reason. Please verify that all data for this Transaction looks correct..',
@@ -255,7 +255,7 @@  discard block
 block discarded – undo
255 255
         $reg_payment_query_params = ! empty($reg_payment_query_params) ? $reg_payment_query_params
256 256
             : array(array('PAY_ID' => $payment->ID()));
257 257
         $registration_payments = EEM_Registration_Payment::instance()->get_all($reg_payment_query_params);
258
-        if (! empty($registration_payments)) {
258
+        if ( ! empty($registration_payments)) {
259 259
             foreach ($registration_payments as $registration_payment) {
260 260
                 if ($registration_payment instanceof EE_Registration_Payment) {
261 261
                     $amount_paid = $registration_payment->amount();
@@ -321,7 +321,7 @@  discard block
 block discarded – undo
321 321
     public function update_transaction_status_based_on_total_paid(EE_Transaction $transaction, $update_txn = true)
322 322
     {
323 323
         EE_Error::doing_it_wrong(
324
-            __CLASS__ . '::' . __FUNCTION__,
324
+            __CLASS__.'::'.__FUNCTION__,
325 325
             sprintf(
326 326
                 __('This method is deprecated. Please use "%s" instead', 'event_espresso'),
327 327
                 'EE_Transaction::update_status_based_on_total_paid()'
@@ -330,7 +330,7 @@  discard block
 block discarded – undo
330 330
             '5.0.0'
331 331
         );
332 332
         // verify transaction
333
-        if (! $transaction instanceof EE_Transaction) {
333
+        if ( ! $transaction instanceof EE_Transaction) {
334 334
             EE_Error::add_error(
335 335
                 __('Please provide a valid EE_Transaction object.', 'event_espresso'),
336 336
                 __FILE__,
Please login to merge, or discard this patch.
core/business/EE_Transaction_Processor.class.php 2 patches
Indentation   +944 added lines, -944 removed lines patch added patch discarded remove patch
@@ -17,948 +17,948 @@
 block discarded – undo
17 17
 class EE_Transaction_Processor extends EE_Processor_Base
18 18
 {
19 19
 
20
-    /**
21
-     * @var EE_Registration_Processor $_instance
22
-     * @access    private
23
-     */
24
-    private static $_instance;
25
-
26
-    /**
27
-     * array of query WHERE params to use when retrieving cached registrations from a transaction
28
-     *
29
-     * @var array $registration_query_params
30
-     * @access private
31
-     */
32
-    private $_registration_query_params = array();
33
-
34
-    /**
35
-     * @deprecated
36
-     * @var string
37
-     */
38
-    protected $_old_txn_status;
39
-
40
-    /**
41
-     * @deprecated
42
-     * @var string
43
-     */
44
-    protected $_new_txn_status;
45
-
46
-
47
-    /**
48
-     * @singleton method used to instantiate class object
49
-     * @access    public
50
-     * @param array $registration_query_params
51
-     * @return EE_Transaction_Processor instance
52
-     */
53
-    public static function instance($registration_query_params = array())
54
-    {
55
-        // check if class object is instantiated
56
-        if (! self::$_instance instanceof EE_Transaction_Processor) {
57
-            self::$_instance = new self($registration_query_params);
58
-        }
59
-        return self::$_instance;
60
-    }
61
-
62
-
63
-    /**
64
-     * @param array $registration_query_params
65
-     */
66
-    private function __construct($registration_query_params = array())
67
-    {
68
-        // make sure some query params are set for retrieving registrations
69
-        $this->_set_registration_query_params($registration_query_params);
70
-    }
71
-
72
-
73
-    /**
74
-     * @access private
75
-     * @param array $registration_query_params
76
-     */
77
-    private function _set_registration_query_params($registration_query_params)
78
-    {
79
-        $this->_registration_query_params = ! empty($registration_query_params) ? $registration_query_params
80
-            : array('order_by' => array('REG_count' => 'ASC'));
81
-    }
82
-
83
-
84
-    /**
85
-     * manually_update_registration_statuses
86
-     *
87
-     * @access public
88
-     * @param EE_Transaction $transaction
89
-     * @param string         $new_reg_status
90
-     * @param array          $registration_query_params array of query WHERE params to use
91
-     *                                                  when retrieving cached registrations from a transaction
92
-     * @return    boolean
93
-     * @throws \EE_Error
94
-     */
95
-    public function manually_update_registration_statuses(
96
-        EE_Transaction $transaction,
97
-        $new_reg_status = '',
98
-        $registration_query_params = array()
99
-    ) {
100
-        $status_updates = $this->_call_method_on_registrations_via_Registration_Processor(
101
-            'manually_update_registration_status',
102
-            $transaction,
103
-            $registration_query_params,
104
-            $new_reg_status
105
-        );
106
-        // send messages
107
-        /** @type EE_Registration_Processor $registration_processor */
108
-        $registration_processor = EE_Registry::instance()->load_class('Registration_Processor');
109
-        $registration_processor->trigger_registration_update_notifications(
110
-            $transaction->primary_registration(),
111
-            array('manually_updated' => true)
112
-        );
113
-        do_action(
114
-            'AHEE__EE_Transaction_Processor__manually_update_registration_statuses',
115
-            $transaction,
116
-            $status_updates
117
-        );
118
-        return $status_updates;
119
-    }
120
-
121
-
122
-    /**
123
-     * toggle_registration_statuses_for_default_approved_events
124
-     *
125
-     * @access public
126
-     * @param EE_Transaction $transaction
127
-     * @param array          $registration_query_params array of query WHERE params to use
128
-     *                                                  when retrieving cached registrations from a transaction
129
-     * @return    boolean
130
-     * @throws \EE_Error
131
-     */
132
-    public function toggle_registration_statuses_for_default_approved_events(
133
-        EE_Transaction $transaction,
134
-        $registration_query_params = array()
135
-    ) {
136
-        $status_updates = $this->_call_method_on_registrations_via_Registration_Processor(
137
-            'toggle_registration_status_for_default_approved_events',
138
-            $transaction,
139
-            $registration_query_params
140
-        );
141
-        do_action(
142
-            'AHEE__EE_Transaction_Processor__toggle_registration_statuses_for_default_approved_events',
143
-            $transaction,
144
-            $status_updates
145
-        );
146
-        return $status_updates;
147
-    }
148
-
149
-
150
-    /**
151
-     * toggle_registration_statuses_if_no_monies_owing
152
-     *
153
-     * @access public
154
-     * @param EE_Transaction $transaction
155
-     * @param array          $registration_query_params array of query WHERE params to use
156
-     *                                                  when retrieving cached registrations from a transaction
157
-     * @return    boolean
158
-     * @throws \EE_Error
159
-     */
160
-    public function toggle_registration_statuses_if_no_monies_owing(
161
-        EE_Transaction $transaction,
162
-        $registration_query_params = array()
163
-    ) {
164
-        $status_updates = $this->_call_method_on_registrations_via_Registration_Processor(
165
-            'toggle_registration_status_if_no_monies_owing',
166
-            $transaction,
167
-            $registration_query_params
168
-        );
169
-        do_action(
170
-            'AHEE__EE_Transaction_Processor__toggle_registration_statuses_if_no_monies_owing',
171
-            $transaction,
172
-            $status_updates
173
-        );
174
-        return $status_updates;
175
-    }
176
-
177
-
178
-    /**
179
-     * update_transaction_and_registrations_after_checkout_or_payment
180
-     * cycles thru related registrations and calls update_registration_after_checkout_or_payment() on each
181
-     *
182
-     * @param EE_Transaction     $transaction
183
-     * @param \EE_Payment | NULL $payment
184
-     * @param array              $registration_query_params    array of query WHERE params to use
185
-     *                                                         when retrieving cached registrations from a transaction
186
-     * @param bool               $trigger_notifications        whether or not to call
187
-     *                                                         \EE_Registration_Processor::trigger_registration_update_notifications()
188
-     * @return array
189
-     * @throws \EE_Error
190
-     */
191
-    public function update_transaction_and_registrations_after_checkout_or_payment(
192
-        EE_Transaction $transaction,
193
-        $payment = null,
194
-        $registration_query_params = array(),
195
-        $trigger_notifications = true
196
-    ) {
197
-        // make sure some query params are set for retrieving registrations
198
-        $this->_set_registration_query_params($registration_query_params);
199
-        // get final reg step status
200
-        $finalized = $transaction->final_reg_step_completed();
201
-        // if the 'finalize_registration' step has been initiated (has a timestamp)
202
-        // but has not yet been fully completed (TRUE)
203
-        if (is_int($finalized) && $finalized !== false && $finalized !== true) {
204
-            $transaction->set_reg_step_completed('finalize_registration');
205
-            $finalized = true;
206
-        }
207
-        $transaction->save();
208
-        // array of details to aid in decision making by systems
209
-        $update_params = array(
210
-            'old_txn_status'  => $transaction->old_txn_status(),
211
-            'new_txn_status'  => $transaction->status_ID(),
212
-            'finalized'       => $finalized,
213
-            'revisit'         => $this->_revisit,
214
-            'payment_updates' => $payment instanceof EE_Payment ? true : false,
215
-            'last_payment'    => $payment,
216
-        );
217
-        // now update the registrations and add the results to our $update_params
218
-        $update_params['status_updates'] = $this->_call_method_on_registrations_via_Registration_Processor(
219
-            'update_registration_after_checkout_or_payment',
220
-            $transaction,
221
-            $this->_registration_query_params,
222
-            $update_params
223
-        );
224
-        if ($trigger_notifications) {
225
-            // send messages
226
-            /** @type EE_Registration_Processor $registration_processor */
227
-            $registration_processor = EE_Registry::instance()->load_class('Registration_Processor');
228
-            $registration_processor->trigger_registration_update_notifications(
229
-                $transaction->primary_registration(),
230
-                $update_params
231
-            );
232
-        }
233
-        do_action(
234
-            'AHEE__EE_Transaction_Processor__update_transaction_and_registrations_after_checkout_or_payment',
235
-            $transaction,
236
-            $update_params
237
-        );
238
-        return $update_params;
239
-    }
240
-
241
-
242
-    /**
243
-     * update_transaction_after_registration_reopened
244
-     * readjusts TXN and Line Item totals after a registration is changed from
245
-     * cancelled or declined to another reg status such as pending payment or approved
246
-     *
247
-     * @param \EE_Registration $registration
248
-     * @param array            $closed_reg_statuses
249
-     * @param bool             $update_txn
250
-     * @return bool
251
-     * @throws \EE_Error
252
-     */
253
-    public function update_transaction_after_reinstating_canceled_registration(
254
-        EE_Registration $registration,
255
-        $closed_reg_statuses = array(),
256
-        $update_txn = true
257
-    ) {
258
-        // these reg statuses should not be considered in any calculations involving monies owing
259
-        $closed_reg_statuses = ! empty($closed_reg_statuses) ? $closed_reg_statuses
260
-            : EEM_Registration::closed_reg_statuses();
261
-        if (in_array($registration->status_ID(), $closed_reg_statuses, true)) {
262
-            return false;
263
-        }
264
-        try {
265
-            $transaction = $this->get_transaction_for_registration($registration);
266
-            $ticket_line_item = $this->get_ticket_line_item_for_transaction_registration(
267
-                $transaction,
268
-                $registration
269
-            );
270
-            // un-cancel the ticket
271
-            $success = EEH_Line_Item::reinstate_canceled_ticket_line_item($ticket_line_item);
272
-        } catch (EE_Error $e) {
273
-            EE_Error::add_error(
274
-                sprintf(
275
-                    __(
276
-                        'The Ticket Line Item for Registration %1$d could not be reinstated because :%2$s%3$s',
277
-                        'event_espresso'
278
-                    ),
279
-                    $registration->ID(),
280
-                    '<br />',
281
-                    $e->getMessage()
282
-                ),
283
-                __FILE__,
284
-                __FUNCTION__,
285
-                __LINE__
286
-            );
287
-            return false;
288
-        }
289
-        if ($update_txn) {
290
-            return $transaction->save() ? $success : false;
291
-        }
292
-        return $success;
293
-    }
294
-
295
-
296
-    /**
297
-     * update_transaction_after_canceled_or_declined_registration
298
-     * readjusts TXN and Line Item totals after a registration is cancelled or declined
299
-     *
300
-     * @param \EE_Registration $registration
301
-     * @param array            $closed_reg_statuses
302
-     * @param bool             $update_txn
303
-     * @return bool
304
-     * @throws \EE_Error
305
-     */
306
-    public function update_transaction_after_canceled_or_declined_registration(
307
-        EE_Registration $registration,
308
-        $closed_reg_statuses = array(),
309
-        $update_txn = true
310
-    ) {
311
-        // these reg statuses should not be considered in any calculations involving monies owing
312
-        $closed_reg_statuses = ! empty($closed_reg_statuses) ? $closed_reg_statuses
313
-            : EEM_Registration::closed_reg_statuses();
314
-        if (! in_array($registration->status_ID(), $closed_reg_statuses, true)) {
315
-            return false;
316
-        }
317
-        try {
318
-            $transaction = $this->get_transaction_for_registration($registration);
319
-            if (apply_filters(
320
-                'FHEE__EE_Transaction_Processor__update_transaction_after_canceled_or_declined_registration__cancel_ticket_line_item',
321
-                true,
322
-                $registration,
323
-                $transaction
324
-            )) {
325
-                $ticket_line_item = $this->get_ticket_line_item_for_transaction_registration(
326
-                    $transaction,
327
-                    $registration
328
-                );
329
-                EEH_Line_Item::cancel_ticket_line_item($ticket_line_item);
330
-            }
331
-        } catch (EE_Error $e) {
332
-            EE_Error::add_error(
333
-                sprintf(
334
-                    __(
335
-                        'The Ticket Line Item for Registration %1$d could not be cancelled because :%2$s%3$s',
336
-                        'event_espresso'
337
-                    ),
338
-                    $registration->ID(),
339
-                    '<br />',
340
-                    $e->getMessage()
341
-                ),
342
-                __FILE__,
343
-                __FUNCTION__,
344
-                __LINE__
345
-            );
346
-            return false;
347
-        }
348
-        if ($update_txn) {
349
-            return $transaction->save() ? true : false;
350
-        }
351
-        return true;
352
-    }
353
-
354
-
355
-    /**
356
-     * get_transaction_for_registration
357
-     *
358
-     * @access    public
359
-     * @param    EE_Registration $registration
360
-     * @return    EE_Transaction
361
-     * @throws    EE_Error
362
-     */
363
-    public function get_transaction_for_registration(EE_Registration $registration)
364
-    {
365
-        $transaction = $registration->transaction();
366
-        if (! $transaction instanceof EE_Transaction) {
367
-            throw new EE_Error(
368
-                sprintf(
369
-                    __('The Transaction for Registration %1$d was not found or is invalid.', 'event_espresso'),
370
-                    $registration->ID()
371
-                )
372
-            );
373
-        }
374
-        return $transaction;
375
-    }
376
-
377
-
378
-    /**
379
-     * get_ticket_line_item_for_transaction_registration
380
-     *
381
-     * @access    public
382
-     * @param    EE_Transaction  $transaction
383
-     * @param    EE_Registration $registration
384
-     * @return    EE_Line_Item
385
-     * @throws    EE_Error
386
-     */
387
-    public function get_ticket_line_item_for_transaction_registration(
388
-        EE_Transaction $transaction,
389
-        EE_Registration $registration
390
-    ) {
391
-        EE_Registry::instance()->load_helper('Line_Item');
392
-        $ticket_line_item = EEM_Line_Item::instance()->get_ticket_line_item_for_transaction(
393
-            $transaction->ID(),
394
-            $registration->ticket_ID()
395
-        );
396
-        if (! $ticket_line_item instanceof EE_Line_Item) {
397
-            throw new EE_Error(
398
-                sprintf(
399
-                    __(
400
-                        'The Line Item for Transaction %1$d and Ticket %2$d was not found or is invalid.',
401
-                        'event_espresso'
402
-                    ),
403
-                    $transaction->ID(),
404
-                    $registration->ticket_ID()
405
-                )
406
-            );
407
-        }
408
-        return $ticket_line_item;
409
-    }
410
-
411
-
412
-    /**
413
-     * cancel_transaction_if_all_registrations_canceled
414
-     * cycles thru related registrations and checks their statuses
415
-     * if ALL registrations are Cancelled or Declined, then this sets the TXN status to
416
-     *
417
-     * @access    public
418
-     * @param    EE_Transaction $transaction
419
-     * @param    string         $new_TXN_status
420
-     * @param    array          $registration_query_params - array of query WHERE params to use when
421
-     *                                                     retrieving cached registrations from a transaction
422
-     * @param    array          $closed_reg_statuses
423
-     * @param    bool           $update_txn
424
-     * @return    bool            true if TXN status was updated, false if not
425
-     */
426
-    public function toggle_transaction_status_if_all_registrations_canceled_or_declined(
427
-        EE_Transaction $transaction,
428
-        $new_TXN_status = '',
429
-        $registration_query_params = array(),
430
-        $closed_reg_statuses = array(),
431
-        $update_txn = true
432
-    ) {
433
-        // make sure some query params are set for retrieving registrations
434
-        $this->_set_registration_query_params($registration_query_params);
435
-        // these reg statuses should not be considered in any calculations involving monies owing
436
-        $closed_reg_statuses = ! empty($closed_reg_statuses) ? $closed_reg_statuses
437
-            : EEM_Registration::closed_reg_statuses();
438
-        // loop through cached registrations
439
-        foreach ($transaction->registrations($this->_registration_query_params) as $registration) {
440
-            if ($registration instanceof EE_Registration
441
-                && ! in_array($registration->status_ID(), $closed_reg_statuses)
442
-            ) {
443
-                return false;
444
-            }
445
-        }
446
-        if (in_array($new_TXN_status, EEM_Transaction::txn_status_array())) {
447
-            $transaction->set_status($new_TXN_status);
448
-        }
449
-        if ($update_txn) {
450
-            return $transaction->save() ? true : false;
451
-        }
452
-        return true;
453
-    }
454
-
455
-
456
-    /**
457
-     * _call_method_on_registrations_via_Registration_Processor
458
-     * cycles thru related registrations and calls the requested method on each
459
-     *
460
-     * @access private
461
-     * @param string         $method_name
462
-     * @param EE_Transaction $transaction
463
-     * @param array          $registration_query_params array of query WHERE params to use
464
-     *                                                  when retrieving cached registrations from a transaction
465
-     * @param string         $additional_param
466
-     * @throws \EE_Error
467
-     * @return boolean
468
-     */
469
-    private function _call_method_on_registrations_via_Registration_Processor(
470
-        $method_name,
471
-        EE_Transaction $transaction,
472
-        $registration_query_params = array(),
473
-        $additional_param = null
474
-    ) {
475
-        $response = false;
476
-        /** @type EE_Registration_Processor $registration_processor */
477
-        $registration_processor = EE_Registry::instance()->load_class('Registration_Processor');
478
-        // check that method exists
479
-        if (! method_exists($registration_processor, $method_name)) {
480
-            throw new EE_Error(__('Method does not exist.', 'event_espresso'));
481
-        }
482
-        // make sure some query params are set for retrieving registrations
483
-        $this->_set_registration_query_params($registration_query_params);
484
-        // loop through cached registrations
485
-        foreach ($transaction->registrations($this->_registration_query_params) as $registration) {
486
-            if ($registration instanceof EE_Registration) {
487
-                if ($additional_param) {
488
-                    $response = $registration_processor->{$method_name}($registration, $additional_param)
489
-                        ? true
490
-                        : $response;
491
-                } else {
492
-                    $response = $registration_processor->{$method_name}($registration)
493
-                        ? true
494
-                        : $response;
495
-                }
496
-            }
497
-        }
498
-        return $response;
499
-    }
500
-
501
-
502
-    /**
503
-     * set_transaction_payment_method_based_on_registration_statuses
504
-     * sets or unsets the PMD_ID field on the TXN based on the related REG statuses
505
-     * basically if ALL Registrations are "Not Approved", then the EE_Transaction.PMD_ID is set to null,
506
-     * but if any Registration has a different status, then EE_Transaction.PMD_ID is set to either:
507
-     *        the first "default" Payment Method
508
-     *        the first active Payment Method
509
-     *    whichever is found first.
510
-     *
511
-     * @param  EE_Registration $edited_registration
512
-     * @return void
513
-     * @throws \EE_Error
514
-     */
515
-    public function set_transaction_payment_method_based_on_registration_statuses(
516
-        EE_Registration $edited_registration
517
-    ) {
518
-        if ($edited_registration instanceof EE_Registration) {
519
-            $transaction = $edited_registration->transaction();
520
-            if ($transaction instanceof EE_Transaction) {
521
-                $all_not_approved = true;
522
-                foreach ($transaction->registrations() as $registration) {
523
-                    if ($registration instanceof EE_Registration) {
524
-                        // if any REG != "Not Approved" then toggle to false
525
-                        $all_not_approved = $registration->is_not_approved() ? $all_not_approved : false;
526
-                    }
527
-                }
528
-                // if ALL Registrations are "Not Approved"
529
-                if ($all_not_approved) {
530
-                    $transaction->set_payment_method_ID(null);
531
-                    $transaction->save();
532
-                } else {
533
-                    $available_payment_methods = EEM_Payment_Method::instance()->get_all_for_transaction(
534
-                        $transaction,
535
-                        EEM_Payment_Method::scope_cart
536
-                    );
537
-                    if (! empty($available_payment_methods)) {
538
-                        $PMD_ID = 0;
539
-                        foreach ($available_payment_methods as $available_payment_method) {
540
-                            if ($available_payment_method instanceof EE_Payment_Method
541
-                                && $available_payment_method->open_by_default()
542
-                            ) {
543
-                                $PMD_ID = $available_payment_method->ID();
544
-                                break;
545
-                            }
546
-                        }
547
-                        if (! $PMD_ID) {
548
-                            $first_payment_method = reset($available_payment_methods);
549
-                            if ($first_payment_method instanceof EE_Payment_Method) {
550
-                                $PMD_ID = $first_payment_method->ID();
551
-                            } else {
552
-                                EE_Error::add_error(
553
-                                    __(
554
-                                        'A valid Payment Method could not be determined. Please ensure that at least one Payment Method is activated.',
555
-                                        'event_espresso'
556
-                                    ),
557
-                                    __FILE__,
558
-                                    __LINE__,
559
-                                    __FUNCTION__
560
-                                );
561
-                            }
562
-                        }
563
-                        $transaction->set_payment_method_ID($PMD_ID);
564
-                        $transaction->save();
565
-                    } else {
566
-                        EE_Error::add_error(
567
-                            __(
568
-                                'Please activate at least one Payment Method in order for things to operate correctly.',
569
-                                'event_espresso'
570
-                            ),
571
-                            __FILE__,
572
-                            __LINE__,
573
-                            __FUNCTION__
574
-                        );
575
-                    }
576
-                }
577
-            }
578
-        }
579
-    }
580
-
581
-
582
-
583
-    /********************************** DEPRECATED METHODS **********************************/
584
-
585
-
586
-    /**
587
-     * @deprecated 4.9.12
588
-     * @return string
589
-     */
590
-    public function old_txn_status()
591
-    {
592
-        EE_Error::doing_it_wrong(
593
-            __METHOD__,
594
-            esc_html__(
595
-                'This logic has been moved into \EE_Transaction::old_txn_status(), please use that method instead.',
596
-                'event_espresso'
597
-            ),
598
-            '4.9.12'
599
-        );
600
-        return $this->_old_txn_status;
601
-    }
602
-
603
-
604
-    /**
605
-     * @deprecated 4.9.12
606
-     * @param string $old_txn_status
607
-     */
608
-    public function set_old_txn_status($old_txn_status)
609
-    {
610
-        EE_Error::doing_it_wrong(
611
-            __METHOD__,
612
-            esc_html__(
613
-                'This logic has been moved into \EE_Transaction::set_old_txn_status(), please use that method instead.',
614
-                'event_espresso'
615
-            ),
616
-            '4.9.12'
617
-        );
618
-        // only set the first time
619
-        if ($this->_old_txn_status === null) {
620
-            $this->_old_txn_status = $old_txn_status;
621
-        }
622
-    }
623
-
624
-
625
-    /**
626
-     * @deprecated 4.9.12
627
-     * @return string
628
-     */
629
-    public function new_txn_status()
630
-    {
631
-        EE_Error::doing_it_wrong(
632
-            __METHOD__,
633
-            esc_html__(
634
-                'This logic has been removed. Please just use \EE_Transaction::status_ID() instead.',
635
-                'event_espresso'
636
-            ),
637
-            '4.9.12'
638
-        );
639
-        return $this->_new_txn_status;
640
-    }
641
-
642
-
643
-    /**
644
-     * @deprecated 4.9.12
645
-     * @param string $new_txn_status
646
-     */
647
-    public function set_new_txn_status($new_txn_status)
648
-    {
649
-        EE_Error::doing_it_wrong(
650
-            __METHOD__,
651
-            esc_html__(
652
-                'This logic has been removed. Please just use \EE_Transaction::set_status() instead.',
653
-                'event_espresso'
654
-            ),
655
-            '4.9.12'
656
-        );
657
-        $this->_new_txn_status = $new_txn_status;
658
-    }
659
-
660
-
661
-    /**
662
-     * reg_status_updated
663
-     *
664
-     * @deprecated 4.9.12
665
-     * @return bool
666
-     */
667
-    public function txn_status_updated()
668
-    {
669
-        EE_Error::doing_it_wrong(
670
-            __METHOD__,
671
-            esc_html__(
672
-                'This logic has been moved into \EE_Transaction::txn_status_updated(), please use that method instead.',
673
-                'event_espresso'
674
-            ),
675
-            '4.9.12'
676
-        );
677
-        return $this->_new_txn_status !== $this->_old_txn_status && $this->_old_txn_status !== null ? true : false;
678
-    }
679
-
680
-
681
-    /**
682
-     * all_reg_steps_completed
683
-     * returns:
684
-     *    true if ALL reg steps have been marked as completed
685
-     *        or false if any step is not completed
686
-     *
687
-     * @deprecated 4.9.12
688
-     * @param EE_Transaction $transaction
689
-     * @return boolean
690
-     */
691
-    public function all_reg_steps_completed(EE_Transaction $transaction)
692
-    {
693
-        EE_Error::doing_it_wrong(
694
-            __METHOD__,
695
-            esc_html__(
696
-                'This logic has been moved into \EE_Transaction::all_reg_steps_completed(), please use that method instead.',
697
-                'event_espresso'
698
-            ),
699
-            '4.9.12',
700
-            '5.0.0'
701
-        );
702
-        return $transaction->all_reg_steps_completed();
703
-    }
704
-
705
-
706
-    /**
707
-     * all_reg_steps_completed_except
708
-     * returns:
709
-     *        true if ALL reg steps, except a particular step that you wish to skip over, have been marked as completed
710
-     *        or false if any other step is not completed
711
-     *        or false if ALL steps are completed including the exception you are testing !!!
712
-     *
713
-     * @deprecated 4.9.12
714
-     * @param EE_Transaction $transaction
715
-     * @param string         $exception
716
-     * @return boolean
717
-     */
718
-    public function all_reg_steps_completed_except(EE_Transaction $transaction, $exception = '')
719
-    {
720
-        EE_Error::doing_it_wrong(
721
-            __METHOD__,
722
-            esc_html__(
723
-                'This logic has been moved into \EE_Transaction::all_reg_steps_completed_except(), please use that method instead.',
724
-                'event_espresso'
725
-            ),
726
-            '4.9.12',
727
-            '5.0.0'
728
-        );
729
-        return $transaction->all_reg_steps_completed_except($exception);
730
-    }
731
-
732
-
733
-    /**
734
-     * all_reg_steps_completed_except
735
-     * returns:
736
-     *        true if ALL reg steps, except the final step, have been marked as completed
737
-     *        or false if any step is not completed
738
-     *    or false if ALL steps are completed including the final step !!!
739
-     *
740
-     * @deprecated 4.9.12
741
-     * @param EE_Transaction $transaction
742
-     * @return boolean
743
-     */
744
-    public function all_reg_steps_completed_except_final_step(EE_Transaction $transaction)
745
-    {
746
-        EE_Error::doing_it_wrong(
747
-            __METHOD__,
748
-            esc_html__(
749
-                'This logic has been moved into \EE_Transaction::all_reg_steps_completed_except_final_step(), please use that method instead.',
750
-                'event_espresso'
751
-            ),
752
-            '4.9.12',
753
-            '5.0.0'
754
-        );
755
-        return $transaction->all_reg_steps_completed_except_final_step();
756
-    }
757
-
758
-
759
-    /**
760
-     * reg_step_completed
761
-     * returns:
762
-     *    true if a specific reg step has been marked as completed
763
-     *    a Unix timestamp if it has been initialized but not yet completed,
764
-     *    or false if it has not yet been initialized
765
-     *
766
-     * @deprecated 4.9.12
767
-     * @param EE_Transaction $transaction
768
-     * @param string         $reg_step_slug
769
-     * @return boolean | int
770
-     */
771
-    public function reg_step_completed(EE_Transaction $transaction, $reg_step_slug)
772
-    {
773
-        EE_Error::doing_it_wrong(
774
-            __METHOD__,
775
-            esc_html__(
776
-                'This logic has been moved into \EE_Transaction::reg_step_completed(), please use that method instead.',
777
-                'event_espresso'
778
-            ),
779
-            '4.9.12',
780
-            '5.0.0'
781
-        );
782
-        return $transaction->reg_step_completed($reg_step_slug);
783
-    }
784
-
785
-
786
-    /**
787
-     * completed_final_reg_step
788
-     * returns:
789
-     *    true if the finalize_registration reg step has been marked as completed
790
-     *    a Unix timestamp if it has been initialized but not yet completed,
791
-     *    or false if it has not yet been initialized
792
-     *
793
-     * @deprecated 4.9.12
794
-     * @param EE_Transaction $transaction
795
-     * @return boolean | int
796
-     */
797
-    public function final_reg_step_completed(EE_Transaction $transaction)
798
-    {
799
-        EE_Error::doing_it_wrong(
800
-            __METHOD__,
801
-            esc_html__(
802
-                'This logic has been moved into \EE_Transaction::final_reg_step_completed(), please use that method instead.',
803
-                'event_espresso'
804
-            ),
805
-            '4.9.12',
806
-            '5.0.0'
807
-        );
808
-        return $transaction->final_reg_step_completed();
809
-    }
810
-
811
-
812
-    /**
813
-     * set_reg_step_initiated
814
-     * given a valid TXN_reg_step, this sets it's value to a unix timestamp
815
-     *
816
-     * @deprecated 4.9.12
817
-     * @access     public
818
-     * @param \EE_Transaction $transaction
819
-     * @param string          $reg_step_slug
820
-     * @return boolean
821
-     * @throws \EE_Error
822
-     */
823
-    public function set_reg_step_initiated(EE_Transaction $transaction, $reg_step_slug)
824
-    {
825
-        EE_Error::doing_it_wrong(
826
-            __METHOD__,
827
-            esc_html__(
828
-                'This logic has been moved into \EE_Transaction::set_reg_step_initiated(), please use that method instead.',
829
-                'event_espresso'
830
-            ),
831
-            '4.9.12',
832
-            '5.0.0'
833
-        );
834
-        return $transaction->set_reg_step_initiated($reg_step_slug);
835
-    }
836
-
837
-
838
-    /**
839
-     * set_reg_step_completed
840
-     * given a valid TXN_reg_step, this sets the step as completed
841
-     *
842
-     * @deprecated 4.9.12
843
-     * @access     public
844
-     * @param \EE_Transaction $transaction
845
-     * @param string          $reg_step_slug
846
-     * @return boolean
847
-     * @throws \EE_Error
848
-     */
849
-    public function set_reg_step_completed(EE_Transaction $transaction, $reg_step_slug)
850
-    {
851
-        EE_Error::doing_it_wrong(
852
-            __METHOD__,
853
-            esc_html__(
854
-                'This logic has been moved into \EE_Transaction::set_reg_step_completed(), please use that method instead.',
855
-                'event_espresso'
856
-            ),
857
-            '4.9.12',
858
-            '5.0.0'
859
-        );
860
-        return $transaction->set_reg_step_completed($reg_step_slug);
861
-    }
862
-
863
-
864
-    /**
865
-     * set_reg_step_completed
866
-     * given a valid TXN_reg_step slug, this sets the step as NOT completed
867
-     *
868
-     * @deprecated 4.9.12
869
-     * @access     public
870
-     * @param \EE_Transaction $transaction
871
-     * @param string          $reg_step_slug
872
-     * @return boolean
873
-     * @throws \EE_Error
874
-     */
875
-    public function set_reg_step_not_completed(EE_Transaction $transaction, $reg_step_slug)
876
-    {
877
-        EE_Error::doing_it_wrong(
878
-            __METHOD__,
879
-            esc_html__(
880
-                'This logic has been moved into \EE_Transaction::set_reg_step_not_completed(), please use that method instead.',
881
-                'event_espresso'
882
-            ),
883
-            '4.9.12',
884
-            '5.0.0'
885
-        );
886
-        return $transaction->set_reg_step_not_completed($reg_step_slug);
887
-    }
888
-
889
-
890
-    /**
891
-     * remove_reg_step
892
-     * given a valid TXN_reg_step slug, this will remove (unset)
893
-     * the reg step from the TXN reg step array
894
-     *
895
-     * @deprecated 4.9.12
896
-     * @access     public
897
-     * @param \EE_Transaction $transaction
898
-     * @param string          $reg_step_slug
899
-     * @return void
900
-     */
901
-    public function remove_reg_step(EE_Transaction $transaction, $reg_step_slug)
902
-    {
903
-        EE_Error::doing_it_wrong(
904
-            __METHOD__,
905
-            esc_html__(
906
-                'This logic has been moved into \EE_Transaction::remove_reg_step(), please use that method instead.',
907
-                'event_espresso'
908
-            ),
909
-            '4.9.12',
910
-            '5.0.0'
911
-        );
912
-        $transaction->remove_reg_step($reg_step_slug);
913
-    }
914
-
915
-
916
-    /**
917
-     *    toggle_failed_transaction_status
918
-     * upgrades a TXNs status from failed to abandoned,
919
-     * meaning that contact information has been captured for at least one registrant
920
-     *
921
-     * @deprecated 4.9.12
922
-     * @access     public
923
-     * @param EE_Transaction $transaction
924
-     * @return    boolean
925
-     * @throws \EE_Error
926
-     */
927
-    public function toggle_failed_transaction_status(EE_Transaction $transaction)
928
-    {
929
-        EE_Error::doing_it_wrong(
930
-            __METHOD__,
931
-            esc_html__(
932
-                'This logic has been moved into \EE_Transaction::toggle_failed_transaction_status(), please use that method instead.',
933
-                'event_espresso'
934
-            ),
935
-            '4.9.12',
936
-            '5.0.0'
937
-        );
938
-        return $transaction->toggle_failed_transaction_status();
939
-    }
940
-
941
-
942
-    /**
943
-     * toggle_abandoned_transaction_status
944
-     * upgrades a TXNs status from failed or abandoned to incomplete
945
-     *
946
-     * @deprecated 4.9.12
947
-     * @access     public
948
-     * @param  EE_Transaction $transaction
949
-     * @return boolean
950
-     */
951
-    public function toggle_abandoned_transaction_status(EE_Transaction $transaction)
952
-    {
953
-        EE_Error::doing_it_wrong(
954
-            __METHOD__,
955
-            esc_html__(
956
-                'This logic has been moved into \EE_Transaction::toggle_abandoned_transaction_status(), please use that method instead.',
957
-                'event_espresso'
958
-            ),
959
-            '4.9.12',
960
-            '5.0.0'
961
-        );
962
-        return $transaction->toggle_abandoned_transaction_status();
963
-    }
20
+	/**
21
+	 * @var EE_Registration_Processor $_instance
22
+	 * @access    private
23
+	 */
24
+	private static $_instance;
25
+
26
+	/**
27
+	 * array of query WHERE params to use when retrieving cached registrations from a transaction
28
+	 *
29
+	 * @var array $registration_query_params
30
+	 * @access private
31
+	 */
32
+	private $_registration_query_params = array();
33
+
34
+	/**
35
+	 * @deprecated
36
+	 * @var string
37
+	 */
38
+	protected $_old_txn_status;
39
+
40
+	/**
41
+	 * @deprecated
42
+	 * @var string
43
+	 */
44
+	protected $_new_txn_status;
45
+
46
+
47
+	/**
48
+	 * @singleton method used to instantiate class object
49
+	 * @access    public
50
+	 * @param array $registration_query_params
51
+	 * @return EE_Transaction_Processor instance
52
+	 */
53
+	public static function instance($registration_query_params = array())
54
+	{
55
+		// check if class object is instantiated
56
+		if (! self::$_instance instanceof EE_Transaction_Processor) {
57
+			self::$_instance = new self($registration_query_params);
58
+		}
59
+		return self::$_instance;
60
+	}
61
+
62
+
63
+	/**
64
+	 * @param array $registration_query_params
65
+	 */
66
+	private function __construct($registration_query_params = array())
67
+	{
68
+		// make sure some query params are set for retrieving registrations
69
+		$this->_set_registration_query_params($registration_query_params);
70
+	}
71
+
72
+
73
+	/**
74
+	 * @access private
75
+	 * @param array $registration_query_params
76
+	 */
77
+	private function _set_registration_query_params($registration_query_params)
78
+	{
79
+		$this->_registration_query_params = ! empty($registration_query_params) ? $registration_query_params
80
+			: array('order_by' => array('REG_count' => 'ASC'));
81
+	}
82
+
83
+
84
+	/**
85
+	 * manually_update_registration_statuses
86
+	 *
87
+	 * @access public
88
+	 * @param EE_Transaction $transaction
89
+	 * @param string         $new_reg_status
90
+	 * @param array          $registration_query_params array of query WHERE params to use
91
+	 *                                                  when retrieving cached registrations from a transaction
92
+	 * @return    boolean
93
+	 * @throws \EE_Error
94
+	 */
95
+	public function manually_update_registration_statuses(
96
+		EE_Transaction $transaction,
97
+		$new_reg_status = '',
98
+		$registration_query_params = array()
99
+	) {
100
+		$status_updates = $this->_call_method_on_registrations_via_Registration_Processor(
101
+			'manually_update_registration_status',
102
+			$transaction,
103
+			$registration_query_params,
104
+			$new_reg_status
105
+		);
106
+		// send messages
107
+		/** @type EE_Registration_Processor $registration_processor */
108
+		$registration_processor = EE_Registry::instance()->load_class('Registration_Processor');
109
+		$registration_processor->trigger_registration_update_notifications(
110
+			$transaction->primary_registration(),
111
+			array('manually_updated' => true)
112
+		);
113
+		do_action(
114
+			'AHEE__EE_Transaction_Processor__manually_update_registration_statuses',
115
+			$transaction,
116
+			$status_updates
117
+		);
118
+		return $status_updates;
119
+	}
120
+
121
+
122
+	/**
123
+	 * toggle_registration_statuses_for_default_approved_events
124
+	 *
125
+	 * @access public
126
+	 * @param EE_Transaction $transaction
127
+	 * @param array          $registration_query_params array of query WHERE params to use
128
+	 *                                                  when retrieving cached registrations from a transaction
129
+	 * @return    boolean
130
+	 * @throws \EE_Error
131
+	 */
132
+	public function toggle_registration_statuses_for_default_approved_events(
133
+		EE_Transaction $transaction,
134
+		$registration_query_params = array()
135
+	) {
136
+		$status_updates = $this->_call_method_on_registrations_via_Registration_Processor(
137
+			'toggle_registration_status_for_default_approved_events',
138
+			$transaction,
139
+			$registration_query_params
140
+		);
141
+		do_action(
142
+			'AHEE__EE_Transaction_Processor__toggle_registration_statuses_for_default_approved_events',
143
+			$transaction,
144
+			$status_updates
145
+		);
146
+		return $status_updates;
147
+	}
148
+
149
+
150
+	/**
151
+	 * toggle_registration_statuses_if_no_monies_owing
152
+	 *
153
+	 * @access public
154
+	 * @param EE_Transaction $transaction
155
+	 * @param array          $registration_query_params array of query WHERE params to use
156
+	 *                                                  when retrieving cached registrations from a transaction
157
+	 * @return    boolean
158
+	 * @throws \EE_Error
159
+	 */
160
+	public function toggle_registration_statuses_if_no_monies_owing(
161
+		EE_Transaction $transaction,
162
+		$registration_query_params = array()
163
+	) {
164
+		$status_updates = $this->_call_method_on_registrations_via_Registration_Processor(
165
+			'toggle_registration_status_if_no_monies_owing',
166
+			$transaction,
167
+			$registration_query_params
168
+		);
169
+		do_action(
170
+			'AHEE__EE_Transaction_Processor__toggle_registration_statuses_if_no_monies_owing',
171
+			$transaction,
172
+			$status_updates
173
+		);
174
+		return $status_updates;
175
+	}
176
+
177
+
178
+	/**
179
+	 * update_transaction_and_registrations_after_checkout_or_payment
180
+	 * cycles thru related registrations and calls update_registration_after_checkout_or_payment() on each
181
+	 *
182
+	 * @param EE_Transaction     $transaction
183
+	 * @param \EE_Payment | NULL $payment
184
+	 * @param array              $registration_query_params    array of query WHERE params to use
185
+	 *                                                         when retrieving cached registrations from a transaction
186
+	 * @param bool               $trigger_notifications        whether or not to call
187
+	 *                                                         \EE_Registration_Processor::trigger_registration_update_notifications()
188
+	 * @return array
189
+	 * @throws \EE_Error
190
+	 */
191
+	public function update_transaction_and_registrations_after_checkout_or_payment(
192
+		EE_Transaction $transaction,
193
+		$payment = null,
194
+		$registration_query_params = array(),
195
+		$trigger_notifications = true
196
+	) {
197
+		// make sure some query params are set for retrieving registrations
198
+		$this->_set_registration_query_params($registration_query_params);
199
+		// get final reg step status
200
+		$finalized = $transaction->final_reg_step_completed();
201
+		// if the 'finalize_registration' step has been initiated (has a timestamp)
202
+		// but has not yet been fully completed (TRUE)
203
+		if (is_int($finalized) && $finalized !== false && $finalized !== true) {
204
+			$transaction->set_reg_step_completed('finalize_registration');
205
+			$finalized = true;
206
+		}
207
+		$transaction->save();
208
+		// array of details to aid in decision making by systems
209
+		$update_params = array(
210
+			'old_txn_status'  => $transaction->old_txn_status(),
211
+			'new_txn_status'  => $transaction->status_ID(),
212
+			'finalized'       => $finalized,
213
+			'revisit'         => $this->_revisit,
214
+			'payment_updates' => $payment instanceof EE_Payment ? true : false,
215
+			'last_payment'    => $payment,
216
+		);
217
+		// now update the registrations and add the results to our $update_params
218
+		$update_params['status_updates'] = $this->_call_method_on_registrations_via_Registration_Processor(
219
+			'update_registration_after_checkout_or_payment',
220
+			$transaction,
221
+			$this->_registration_query_params,
222
+			$update_params
223
+		);
224
+		if ($trigger_notifications) {
225
+			// send messages
226
+			/** @type EE_Registration_Processor $registration_processor */
227
+			$registration_processor = EE_Registry::instance()->load_class('Registration_Processor');
228
+			$registration_processor->trigger_registration_update_notifications(
229
+				$transaction->primary_registration(),
230
+				$update_params
231
+			);
232
+		}
233
+		do_action(
234
+			'AHEE__EE_Transaction_Processor__update_transaction_and_registrations_after_checkout_or_payment',
235
+			$transaction,
236
+			$update_params
237
+		);
238
+		return $update_params;
239
+	}
240
+
241
+
242
+	/**
243
+	 * update_transaction_after_registration_reopened
244
+	 * readjusts TXN and Line Item totals after a registration is changed from
245
+	 * cancelled or declined to another reg status such as pending payment or approved
246
+	 *
247
+	 * @param \EE_Registration $registration
248
+	 * @param array            $closed_reg_statuses
249
+	 * @param bool             $update_txn
250
+	 * @return bool
251
+	 * @throws \EE_Error
252
+	 */
253
+	public function update_transaction_after_reinstating_canceled_registration(
254
+		EE_Registration $registration,
255
+		$closed_reg_statuses = array(),
256
+		$update_txn = true
257
+	) {
258
+		// these reg statuses should not be considered in any calculations involving monies owing
259
+		$closed_reg_statuses = ! empty($closed_reg_statuses) ? $closed_reg_statuses
260
+			: EEM_Registration::closed_reg_statuses();
261
+		if (in_array($registration->status_ID(), $closed_reg_statuses, true)) {
262
+			return false;
263
+		}
264
+		try {
265
+			$transaction = $this->get_transaction_for_registration($registration);
266
+			$ticket_line_item = $this->get_ticket_line_item_for_transaction_registration(
267
+				$transaction,
268
+				$registration
269
+			);
270
+			// un-cancel the ticket
271
+			$success = EEH_Line_Item::reinstate_canceled_ticket_line_item($ticket_line_item);
272
+		} catch (EE_Error $e) {
273
+			EE_Error::add_error(
274
+				sprintf(
275
+					__(
276
+						'The Ticket Line Item for Registration %1$d could not be reinstated because :%2$s%3$s',
277
+						'event_espresso'
278
+					),
279
+					$registration->ID(),
280
+					'<br />',
281
+					$e->getMessage()
282
+				),
283
+				__FILE__,
284
+				__FUNCTION__,
285
+				__LINE__
286
+			);
287
+			return false;
288
+		}
289
+		if ($update_txn) {
290
+			return $transaction->save() ? $success : false;
291
+		}
292
+		return $success;
293
+	}
294
+
295
+
296
+	/**
297
+	 * update_transaction_after_canceled_or_declined_registration
298
+	 * readjusts TXN and Line Item totals after a registration is cancelled or declined
299
+	 *
300
+	 * @param \EE_Registration $registration
301
+	 * @param array            $closed_reg_statuses
302
+	 * @param bool             $update_txn
303
+	 * @return bool
304
+	 * @throws \EE_Error
305
+	 */
306
+	public function update_transaction_after_canceled_or_declined_registration(
307
+		EE_Registration $registration,
308
+		$closed_reg_statuses = array(),
309
+		$update_txn = true
310
+	) {
311
+		// these reg statuses should not be considered in any calculations involving monies owing
312
+		$closed_reg_statuses = ! empty($closed_reg_statuses) ? $closed_reg_statuses
313
+			: EEM_Registration::closed_reg_statuses();
314
+		if (! in_array($registration->status_ID(), $closed_reg_statuses, true)) {
315
+			return false;
316
+		}
317
+		try {
318
+			$transaction = $this->get_transaction_for_registration($registration);
319
+			if (apply_filters(
320
+				'FHEE__EE_Transaction_Processor__update_transaction_after_canceled_or_declined_registration__cancel_ticket_line_item',
321
+				true,
322
+				$registration,
323
+				$transaction
324
+			)) {
325
+				$ticket_line_item = $this->get_ticket_line_item_for_transaction_registration(
326
+					$transaction,
327
+					$registration
328
+				);
329
+				EEH_Line_Item::cancel_ticket_line_item($ticket_line_item);
330
+			}
331
+		} catch (EE_Error $e) {
332
+			EE_Error::add_error(
333
+				sprintf(
334
+					__(
335
+						'The Ticket Line Item for Registration %1$d could not be cancelled because :%2$s%3$s',
336
+						'event_espresso'
337
+					),
338
+					$registration->ID(),
339
+					'<br />',
340
+					$e->getMessage()
341
+				),
342
+				__FILE__,
343
+				__FUNCTION__,
344
+				__LINE__
345
+			);
346
+			return false;
347
+		}
348
+		if ($update_txn) {
349
+			return $transaction->save() ? true : false;
350
+		}
351
+		return true;
352
+	}
353
+
354
+
355
+	/**
356
+	 * get_transaction_for_registration
357
+	 *
358
+	 * @access    public
359
+	 * @param    EE_Registration $registration
360
+	 * @return    EE_Transaction
361
+	 * @throws    EE_Error
362
+	 */
363
+	public function get_transaction_for_registration(EE_Registration $registration)
364
+	{
365
+		$transaction = $registration->transaction();
366
+		if (! $transaction instanceof EE_Transaction) {
367
+			throw new EE_Error(
368
+				sprintf(
369
+					__('The Transaction for Registration %1$d was not found or is invalid.', 'event_espresso'),
370
+					$registration->ID()
371
+				)
372
+			);
373
+		}
374
+		return $transaction;
375
+	}
376
+
377
+
378
+	/**
379
+	 * get_ticket_line_item_for_transaction_registration
380
+	 *
381
+	 * @access    public
382
+	 * @param    EE_Transaction  $transaction
383
+	 * @param    EE_Registration $registration
384
+	 * @return    EE_Line_Item
385
+	 * @throws    EE_Error
386
+	 */
387
+	public function get_ticket_line_item_for_transaction_registration(
388
+		EE_Transaction $transaction,
389
+		EE_Registration $registration
390
+	) {
391
+		EE_Registry::instance()->load_helper('Line_Item');
392
+		$ticket_line_item = EEM_Line_Item::instance()->get_ticket_line_item_for_transaction(
393
+			$transaction->ID(),
394
+			$registration->ticket_ID()
395
+		);
396
+		if (! $ticket_line_item instanceof EE_Line_Item) {
397
+			throw new EE_Error(
398
+				sprintf(
399
+					__(
400
+						'The Line Item for Transaction %1$d and Ticket %2$d was not found or is invalid.',
401
+						'event_espresso'
402
+					),
403
+					$transaction->ID(),
404
+					$registration->ticket_ID()
405
+				)
406
+			);
407
+		}
408
+		return $ticket_line_item;
409
+	}
410
+
411
+
412
+	/**
413
+	 * cancel_transaction_if_all_registrations_canceled
414
+	 * cycles thru related registrations and checks their statuses
415
+	 * if ALL registrations are Cancelled or Declined, then this sets the TXN status to
416
+	 *
417
+	 * @access    public
418
+	 * @param    EE_Transaction $transaction
419
+	 * @param    string         $new_TXN_status
420
+	 * @param    array          $registration_query_params - array of query WHERE params to use when
421
+	 *                                                     retrieving cached registrations from a transaction
422
+	 * @param    array          $closed_reg_statuses
423
+	 * @param    bool           $update_txn
424
+	 * @return    bool            true if TXN status was updated, false if not
425
+	 */
426
+	public function toggle_transaction_status_if_all_registrations_canceled_or_declined(
427
+		EE_Transaction $transaction,
428
+		$new_TXN_status = '',
429
+		$registration_query_params = array(),
430
+		$closed_reg_statuses = array(),
431
+		$update_txn = true
432
+	) {
433
+		// make sure some query params are set for retrieving registrations
434
+		$this->_set_registration_query_params($registration_query_params);
435
+		// these reg statuses should not be considered in any calculations involving monies owing
436
+		$closed_reg_statuses = ! empty($closed_reg_statuses) ? $closed_reg_statuses
437
+			: EEM_Registration::closed_reg_statuses();
438
+		// loop through cached registrations
439
+		foreach ($transaction->registrations($this->_registration_query_params) as $registration) {
440
+			if ($registration instanceof EE_Registration
441
+				&& ! in_array($registration->status_ID(), $closed_reg_statuses)
442
+			) {
443
+				return false;
444
+			}
445
+		}
446
+		if (in_array($new_TXN_status, EEM_Transaction::txn_status_array())) {
447
+			$transaction->set_status($new_TXN_status);
448
+		}
449
+		if ($update_txn) {
450
+			return $transaction->save() ? true : false;
451
+		}
452
+		return true;
453
+	}
454
+
455
+
456
+	/**
457
+	 * _call_method_on_registrations_via_Registration_Processor
458
+	 * cycles thru related registrations and calls the requested method on each
459
+	 *
460
+	 * @access private
461
+	 * @param string         $method_name
462
+	 * @param EE_Transaction $transaction
463
+	 * @param array          $registration_query_params array of query WHERE params to use
464
+	 *                                                  when retrieving cached registrations from a transaction
465
+	 * @param string         $additional_param
466
+	 * @throws \EE_Error
467
+	 * @return boolean
468
+	 */
469
+	private function _call_method_on_registrations_via_Registration_Processor(
470
+		$method_name,
471
+		EE_Transaction $transaction,
472
+		$registration_query_params = array(),
473
+		$additional_param = null
474
+	) {
475
+		$response = false;
476
+		/** @type EE_Registration_Processor $registration_processor */
477
+		$registration_processor = EE_Registry::instance()->load_class('Registration_Processor');
478
+		// check that method exists
479
+		if (! method_exists($registration_processor, $method_name)) {
480
+			throw new EE_Error(__('Method does not exist.', 'event_espresso'));
481
+		}
482
+		// make sure some query params are set for retrieving registrations
483
+		$this->_set_registration_query_params($registration_query_params);
484
+		// loop through cached registrations
485
+		foreach ($transaction->registrations($this->_registration_query_params) as $registration) {
486
+			if ($registration instanceof EE_Registration) {
487
+				if ($additional_param) {
488
+					$response = $registration_processor->{$method_name}($registration, $additional_param)
489
+						? true
490
+						: $response;
491
+				} else {
492
+					$response = $registration_processor->{$method_name}($registration)
493
+						? true
494
+						: $response;
495
+				}
496
+			}
497
+		}
498
+		return $response;
499
+	}
500
+
501
+
502
+	/**
503
+	 * set_transaction_payment_method_based_on_registration_statuses
504
+	 * sets or unsets the PMD_ID field on the TXN based on the related REG statuses
505
+	 * basically if ALL Registrations are "Not Approved", then the EE_Transaction.PMD_ID is set to null,
506
+	 * but if any Registration has a different status, then EE_Transaction.PMD_ID is set to either:
507
+	 *        the first "default" Payment Method
508
+	 *        the first active Payment Method
509
+	 *    whichever is found first.
510
+	 *
511
+	 * @param  EE_Registration $edited_registration
512
+	 * @return void
513
+	 * @throws \EE_Error
514
+	 */
515
+	public function set_transaction_payment_method_based_on_registration_statuses(
516
+		EE_Registration $edited_registration
517
+	) {
518
+		if ($edited_registration instanceof EE_Registration) {
519
+			$transaction = $edited_registration->transaction();
520
+			if ($transaction instanceof EE_Transaction) {
521
+				$all_not_approved = true;
522
+				foreach ($transaction->registrations() as $registration) {
523
+					if ($registration instanceof EE_Registration) {
524
+						// if any REG != "Not Approved" then toggle to false
525
+						$all_not_approved = $registration->is_not_approved() ? $all_not_approved : false;
526
+					}
527
+				}
528
+				// if ALL Registrations are "Not Approved"
529
+				if ($all_not_approved) {
530
+					$transaction->set_payment_method_ID(null);
531
+					$transaction->save();
532
+				} else {
533
+					$available_payment_methods = EEM_Payment_Method::instance()->get_all_for_transaction(
534
+						$transaction,
535
+						EEM_Payment_Method::scope_cart
536
+					);
537
+					if (! empty($available_payment_methods)) {
538
+						$PMD_ID = 0;
539
+						foreach ($available_payment_methods as $available_payment_method) {
540
+							if ($available_payment_method instanceof EE_Payment_Method
541
+								&& $available_payment_method->open_by_default()
542
+							) {
543
+								$PMD_ID = $available_payment_method->ID();
544
+								break;
545
+							}
546
+						}
547
+						if (! $PMD_ID) {
548
+							$first_payment_method = reset($available_payment_methods);
549
+							if ($first_payment_method instanceof EE_Payment_Method) {
550
+								$PMD_ID = $first_payment_method->ID();
551
+							} else {
552
+								EE_Error::add_error(
553
+									__(
554
+										'A valid Payment Method could not be determined. Please ensure that at least one Payment Method is activated.',
555
+										'event_espresso'
556
+									),
557
+									__FILE__,
558
+									__LINE__,
559
+									__FUNCTION__
560
+								);
561
+							}
562
+						}
563
+						$transaction->set_payment_method_ID($PMD_ID);
564
+						$transaction->save();
565
+					} else {
566
+						EE_Error::add_error(
567
+							__(
568
+								'Please activate at least one Payment Method in order for things to operate correctly.',
569
+								'event_espresso'
570
+							),
571
+							__FILE__,
572
+							__LINE__,
573
+							__FUNCTION__
574
+						);
575
+					}
576
+				}
577
+			}
578
+		}
579
+	}
580
+
581
+
582
+
583
+	/********************************** DEPRECATED METHODS **********************************/
584
+
585
+
586
+	/**
587
+	 * @deprecated 4.9.12
588
+	 * @return string
589
+	 */
590
+	public function old_txn_status()
591
+	{
592
+		EE_Error::doing_it_wrong(
593
+			__METHOD__,
594
+			esc_html__(
595
+				'This logic has been moved into \EE_Transaction::old_txn_status(), please use that method instead.',
596
+				'event_espresso'
597
+			),
598
+			'4.9.12'
599
+		);
600
+		return $this->_old_txn_status;
601
+	}
602
+
603
+
604
+	/**
605
+	 * @deprecated 4.9.12
606
+	 * @param string $old_txn_status
607
+	 */
608
+	public function set_old_txn_status($old_txn_status)
609
+	{
610
+		EE_Error::doing_it_wrong(
611
+			__METHOD__,
612
+			esc_html__(
613
+				'This logic has been moved into \EE_Transaction::set_old_txn_status(), please use that method instead.',
614
+				'event_espresso'
615
+			),
616
+			'4.9.12'
617
+		);
618
+		// only set the first time
619
+		if ($this->_old_txn_status === null) {
620
+			$this->_old_txn_status = $old_txn_status;
621
+		}
622
+	}
623
+
624
+
625
+	/**
626
+	 * @deprecated 4.9.12
627
+	 * @return string
628
+	 */
629
+	public function new_txn_status()
630
+	{
631
+		EE_Error::doing_it_wrong(
632
+			__METHOD__,
633
+			esc_html__(
634
+				'This logic has been removed. Please just use \EE_Transaction::status_ID() instead.',
635
+				'event_espresso'
636
+			),
637
+			'4.9.12'
638
+		);
639
+		return $this->_new_txn_status;
640
+	}
641
+
642
+
643
+	/**
644
+	 * @deprecated 4.9.12
645
+	 * @param string $new_txn_status
646
+	 */
647
+	public function set_new_txn_status($new_txn_status)
648
+	{
649
+		EE_Error::doing_it_wrong(
650
+			__METHOD__,
651
+			esc_html__(
652
+				'This logic has been removed. Please just use \EE_Transaction::set_status() instead.',
653
+				'event_espresso'
654
+			),
655
+			'4.9.12'
656
+		);
657
+		$this->_new_txn_status = $new_txn_status;
658
+	}
659
+
660
+
661
+	/**
662
+	 * reg_status_updated
663
+	 *
664
+	 * @deprecated 4.9.12
665
+	 * @return bool
666
+	 */
667
+	public function txn_status_updated()
668
+	{
669
+		EE_Error::doing_it_wrong(
670
+			__METHOD__,
671
+			esc_html__(
672
+				'This logic has been moved into \EE_Transaction::txn_status_updated(), please use that method instead.',
673
+				'event_espresso'
674
+			),
675
+			'4.9.12'
676
+		);
677
+		return $this->_new_txn_status !== $this->_old_txn_status && $this->_old_txn_status !== null ? true : false;
678
+	}
679
+
680
+
681
+	/**
682
+	 * all_reg_steps_completed
683
+	 * returns:
684
+	 *    true if ALL reg steps have been marked as completed
685
+	 *        or false if any step is not completed
686
+	 *
687
+	 * @deprecated 4.9.12
688
+	 * @param EE_Transaction $transaction
689
+	 * @return boolean
690
+	 */
691
+	public function all_reg_steps_completed(EE_Transaction $transaction)
692
+	{
693
+		EE_Error::doing_it_wrong(
694
+			__METHOD__,
695
+			esc_html__(
696
+				'This logic has been moved into \EE_Transaction::all_reg_steps_completed(), please use that method instead.',
697
+				'event_espresso'
698
+			),
699
+			'4.9.12',
700
+			'5.0.0'
701
+		);
702
+		return $transaction->all_reg_steps_completed();
703
+	}
704
+
705
+
706
+	/**
707
+	 * all_reg_steps_completed_except
708
+	 * returns:
709
+	 *        true if ALL reg steps, except a particular step that you wish to skip over, have been marked as completed
710
+	 *        or false if any other step is not completed
711
+	 *        or false if ALL steps are completed including the exception you are testing !!!
712
+	 *
713
+	 * @deprecated 4.9.12
714
+	 * @param EE_Transaction $transaction
715
+	 * @param string         $exception
716
+	 * @return boolean
717
+	 */
718
+	public function all_reg_steps_completed_except(EE_Transaction $transaction, $exception = '')
719
+	{
720
+		EE_Error::doing_it_wrong(
721
+			__METHOD__,
722
+			esc_html__(
723
+				'This logic has been moved into \EE_Transaction::all_reg_steps_completed_except(), please use that method instead.',
724
+				'event_espresso'
725
+			),
726
+			'4.9.12',
727
+			'5.0.0'
728
+		);
729
+		return $transaction->all_reg_steps_completed_except($exception);
730
+	}
731
+
732
+
733
+	/**
734
+	 * all_reg_steps_completed_except
735
+	 * returns:
736
+	 *        true if ALL reg steps, except the final step, have been marked as completed
737
+	 *        or false if any step is not completed
738
+	 *    or false if ALL steps are completed including the final step !!!
739
+	 *
740
+	 * @deprecated 4.9.12
741
+	 * @param EE_Transaction $transaction
742
+	 * @return boolean
743
+	 */
744
+	public function all_reg_steps_completed_except_final_step(EE_Transaction $transaction)
745
+	{
746
+		EE_Error::doing_it_wrong(
747
+			__METHOD__,
748
+			esc_html__(
749
+				'This logic has been moved into \EE_Transaction::all_reg_steps_completed_except_final_step(), please use that method instead.',
750
+				'event_espresso'
751
+			),
752
+			'4.9.12',
753
+			'5.0.0'
754
+		);
755
+		return $transaction->all_reg_steps_completed_except_final_step();
756
+	}
757
+
758
+
759
+	/**
760
+	 * reg_step_completed
761
+	 * returns:
762
+	 *    true if a specific reg step has been marked as completed
763
+	 *    a Unix timestamp if it has been initialized but not yet completed,
764
+	 *    or false if it has not yet been initialized
765
+	 *
766
+	 * @deprecated 4.9.12
767
+	 * @param EE_Transaction $transaction
768
+	 * @param string         $reg_step_slug
769
+	 * @return boolean | int
770
+	 */
771
+	public function reg_step_completed(EE_Transaction $transaction, $reg_step_slug)
772
+	{
773
+		EE_Error::doing_it_wrong(
774
+			__METHOD__,
775
+			esc_html__(
776
+				'This logic has been moved into \EE_Transaction::reg_step_completed(), please use that method instead.',
777
+				'event_espresso'
778
+			),
779
+			'4.9.12',
780
+			'5.0.0'
781
+		);
782
+		return $transaction->reg_step_completed($reg_step_slug);
783
+	}
784
+
785
+
786
+	/**
787
+	 * completed_final_reg_step
788
+	 * returns:
789
+	 *    true if the finalize_registration reg step has been marked as completed
790
+	 *    a Unix timestamp if it has been initialized but not yet completed,
791
+	 *    or false if it has not yet been initialized
792
+	 *
793
+	 * @deprecated 4.9.12
794
+	 * @param EE_Transaction $transaction
795
+	 * @return boolean | int
796
+	 */
797
+	public function final_reg_step_completed(EE_Transaction $transaction)
798
+	{
799
+		EE_Error::doing_it_wrong(
800
+			__METHOD__,
801
+			esc_html__(
802
+				'This logic has been moved into \EE_Transaction::final_reg_step_completed(), please use that method instead.',
803
+				'event_espresso'
804
+			),
805
+			'4.9.12',
806
+			'5.0.0'
807
+		);
808
+		return $transaction->final_reg_step_completed();
809
+	}
810
+
811
+
812
+	/**
813
+	 * set_reg_step_initiated
814
+	 * given a valid TXN_reg_step, this sets it's value to a unix timestamp
815
+	 *
816
+	 * @deprecated 4.9.12
817
+	 * @access     public
818
+	 * @param \EE_Transaction $transaction
819
+	 * @param string          $reg_step_slug
820
+	 * @return boolean
821
+	 * @throws \EE_Error
822
+	 */
823
+	public function set_reg_step_initiated(EE_Transaction $transaction, $reg_step_slug)
824
+	{
825
+		EE_Error::doing_it_wrong(
826
+			__METHOD__,
827
+			esc_html__(
828
+				'This logic has been moved into \EE_Transaction::set_reg_step_initiated(), please use that method instead.',
829
+				'event_espresso'
830
+			),
831
+			'4.9.12',
832
+			'5.0.0'
833
+		);
834
+		return $transaction->set_reg_step_initiated($reg_step_slug);
835
+	}
836
+
837
+
838
+	/**
839
+	 * set_reg_step_completed
840
+	 * given a valid TXN_reg_step, this sets the step as completed
841
+	 *
842
+	 * @deprecated 4.9.12
843
+	 * @access     public
844
+	 * @param \EE_Transaction $transaction
845
+	 * @param string          $reg_step_slug
846
+	 * @return boolean
847
+	 * @throws \EE_Error
848
+	 */
849
+	public function set_reg_step_completed(EE_Transaction $transaction, $reg_step_slug)
850
+	{
851
+		EE_Error::doing_it_wrong(
852
+			__METHOD__,
853
+			esc_html__(
854
+				'This logic has been moved into \EE_Transaction::set_reg_step_completed(), please use that method instead.',
855
+				'event_espresso'
856
+			),
857
+			'4.9.12',
858
+			'5.0.0'
859
+		);
860
+		return $transaction->set_reg_step_completed($reg_step_slug);
861
+	}
862
+
863
+
864
+	/**
865
+	 * set_reg_step_completed
866
+	 * given a valid TXN_reg_step slug, this sets the step as NOT completed
867
+	 *
868
+	 * @deprecated 4.9.12
869
+	 * @access     public
870
+	 * @param \EE_Transaction $transaction
871
+	 * @param string          $reg_step_slug
872
+	 * @return boolean
873
+	 * @throws \EE_Error
874
+	 */
875
+	public function set_reg_step_not_completed(EE_Transaction $transaction, $reg_step_slug)
876
+	{
877
+		EE_Error::doing_it_wrong(
878
+			__METHOD__,
879
+			esc_html__(
880
+				'This logic has been moved into \EE_Transaction::set_reg_step_not_completed(), please use that method instead.',
881
+				'event_espresso'
882
+			),
883
+			'4.9.12',
884
+			'5.0.0'
885
+		);
886
+		return $transaction->set_reg_step_not_completed($reg_step_slug);
887
+	}
888
+
889
+
890
+	/**
891
+	 * remove_reg_step
892
+	 * given a valid TXN_reg_step slug, this will remove (unset)
893
+	 * the reg step from the TXN reg step array
894
+	 *
895
+	 * @deprecated 4.9.12
896
+	 * @access     public
897
+	 * @param \EE_Transaction $transaction
898
+	 * @param string          $reg_step_slug
899
+	 * @return void
900
+	 */
901
+	public function remove_reg_step(EE_Transaction $transaction, $reg_step_slug)
902
+	{
903
+		EE_Error::doing_it_wrong(
904
+			__METHOD__,
905
+			esc_html__(
906
+				'This logic has been moved into \EE_Transaction::remove_reg_step(), please use that method instead.',
907
+				'event_espresso'
908
+			),
909
+			'4.9.12',
910
+			'5.0.0'
911
+		);
912
+		$transaction->remove_reg_step($reg_step_slug);
913
+	}
914
+
915
+
916
+	/**
917
+	 *    toggle_failed_transaction_status
918
+	 * upgrades a TXNs status from failed to abandoned,
919
+	 * meaning that contact information has been captured for at least one registrant
920
+	 *
921
+	 * @deprecated 4.9.12
922
+	 * @access     public
923
+	 * @param EE_Transaction $transaction
924
+	 * @return    boolean
925
+	 * @throws \EE_Error
926
+	 */
927
+	public function toggle_failed_transaction_status(EE_Transaction $transaction)
928
+	{
929
+		EE_Error::doing_it_wrong(
930
+			__METHOD__,
931
+			esc_html__(
932
+				'This logic has been moved into \EE_Transaction::toggle_failed_transaction_status(), please use that method instead.',
933
+				'event_espresso'
934
+			),
935
+			'4.9.12',
936
+			'5.0.0'
937
+		);
938
+		return $transaction->toggle_failed_transaction_status();
939
+	}
940
+
941
+
942
+	/**
943
+	 * toggle_abandoned_transaction_status
944
+	 * upgrades a TXNs status from failed or abandoned to incomplete
945
+	 *
946
+	 * @deprecated 4.9.12
947
+	 * @access     public
948
+	 * @param  EE_Transaction $transaction
949
+	 * @return boolean
950
+	 */
951
+	public function toggle_abandoned_transaction_status(EE_Transaction $transaction)
952
+	{
953
+		EE_Error::doing_it_wrong(
954
+			__METHOD__,
955
+			esc_html__(
956
+				'This logic has been moved into \EE_Transaction::toggle_abandoned_transaction_status(), please use that method instead.',
957
+				'event_espresso'
958
+			),
959
+			'4.9.12',
960
+			'5.0.0'
961
+		);
962
+		return $transaction->toggle_abandoned_transaction_status();
963
+	}
964 964
 }
Please login to merge, or discard this patch.
Spacing   +7 added lines, -7 removed lines patch added patch discarded remove patch
@@ -53,7 +53,7 @@  discard block
 block discarded – undo
53 53
     public static function instance($registration_query_params = array())
54 54
     {
55 55
         // check if class object is instantiated
56
-        if (! self::$_instance instanceof EE_Transaction_Processor) {
56
+        if ( ! self::$_instance instanceof EE_Transaction_Processor) {
57 57
             self::$_instance = new self($registration_query_params);
58 58
         }
59 59
         return self::$_instance;
@@ -311,7 +311,7 @@  discard block
 block discarded – undo
311 311
         // these reg statuses should not be considered in any calculations involving monies owing
312 312
         $closed_reg_statuses = ! empty($closed_reg_statuses) ? $closed_reg_statuses
313 313
             : EEM_Registration::closed_reg_statuses();
314
-        if (! in_array($registration->status_ID(), $closed_reg_statuses, true)) {
314
+        if ( ! in_array($registration->status_ID(), $closed_reg_statuses, true)) {
315 315
             return false;
316 316
         }
317 317
         try {
@@ -363,7 +363,7 @@  discard block
 block discarded – undo
363 363
     public function get_transaction_for_registration(EE_Registration $registration)
364 364
     {
365 365
         $transaction = $registration->transaction();
366
-        if (! $transaction instanceof EE_Transaction) {
366
+        if ( ! $transaction instanceof EE_Transaction) {
367 367
             throw new EE_Error(
368 368
                 sprintf(
369 369
                     __('The Transaction for Registration %1$d was not found or is invalid.', 'event_espresso'),
@@ -393,7 +393,7 @@  discard block
 block discarded – undo
393 393
             $transaction->ID(),
394 394
             $registration->ticket_ID()
395 395
         );
396
-        if (! $ticket_line_item instanceof EE_Line_Item) {
396
+        if ( ! $ticket_line_item instanceof EE_Line_Item) {
397 397
             throw new EE_Error(
398 398
                 sprintf(
399 399
                     __(
@@ -476,7 +476,7 @@  discard block
 block discarded – undo
476 476
         /** @type EE_Registration_Processor $registration_processor */
477 477
         $registration_processor = EE_Registry::instance()->load_class('Registration_Processor');
478 478
         // check that method exists
479
-        if (! method_exists($registration_processor, $method_name)) {
479
+        if ( ! method_exists($registration_processor, $method_name)) {
480 480
             throw new EE_Error(__('Method does not exist.', 'event_espresso'));
481 481
         }
482 482
         // make sure some query params are set for retrieving registrations
@@ -534,7 +534,7 @@  discard block
 block discarded – undo
534 534
                         $transaction,
535 535
                         EEM_Payment_Method::scope_cart
536 536
                     );
537
-                    if (! empty($available_payment_methods)) {
537
+                    if ( ! empty($available_payment_methods)) {
538 538
                         $PMD_ID = 0;
539 539
                         foreach ($available_payment_methods as $available_payment_method) {
540 540
                             if ($available_payment_method instanceof EE_Payment_Method
@@ -544,7 +544,7 @@  discard block
 block discarded – undo
544 544
                                 break;
545 545
                             }
546 546
                         }
547
-                        if (! $PMD_ID) {
547
+                        if ( ! $PMD_ID) {
548 548
                             $first_payment_method = reset($available_payment_methods);
549 549
                             if ($first_payment_method instanceof EE_Payment_Method) {
550 550
                                 $PMD_ID = $first_payment_method->ID();
Please login to merge, or discard this patch.
core/admin/EE_Help_Tour_final_stop.class.php 2 patches
Indentation   +43 added lines, -43 removed lines patch added patch discarded remove patch
@@ -15,51 +15,51 @@
 block discarded – undo
15 15
 class EE_Help_Tour_final_stop extends EE_Help_Tour
16 16
 {
17 17
 
18
-    protected function _set_tour_properties()
19
-    {
20
-        $this->_label = __('Final Stop Tour', 'event_espresso');
21
-        $this->_slug = 'final-stop-tour';
22
-    }
18
+	protected function _set_tour_properties()
19
+	{
20
+		$this->_label = __('Final Stop Tour', 'event_espresso');
21
+		$this->_slug = 'final-stop-tour';
22
+	}
23 23
 
24 24
 
25
-    protected function _set_tour_stops()
26
-    {
27
-        $this->_stops = array(
28
-            10 => array(
29
-                'id'          => 'contextual-help-link',
30
-                'content'     => $this->_end(),
31
-                'button_text' => __('Quit', 'event_espresso'),
32
-                'options'     => array(
33
-                    'tipLocation'    => 'left',
34
-                    'tipAdjustmentY' => -20,
35
-                    'tipAdjustmentX' => 10,
36
-                ),
37
-            ),
38
-        );
39
-    }
25
+	protected function _set_tour_stops()
26
+	{
27
+		$this->_stops = array(
28
+			10 => array(
29
+				'id'          => 'contextual-help-link',
30
+				'content'     => $this->_end(),
31
+				'button_text' => __('Quit', 'event_espresso'),
32
+				'options'     => array(
33
+					'tipLocation'    => 'left',
34
+					'tipAdjustmentY' => -20,
35
+					'tipAdjustmentX' => 10,
36
+				),
37
+			),
38
+		);
39
+	}
40 40
 
41 41
 
42
-    /**
43
-     * This is the default last stop for all tours that is displayed at the end of a tour OR when a tour is exited for
44
-     * the first time.
45
-     *
46
-     * @return string
47
-     */
48
-    protected function _end()
49
-    {
50
-        $query_args = array(
51
-            'action' => 'admin_option_settings',
52
-            'page'   => 'espresso_general_settings',
53
-        );
54
-        return '<p>'
55
-               . sprintf(
56
-                   __(
57
-                       'That\'s it for the tour!  At any time you can restart a tour by clicking on this help dropdown and then clicking one of the Tour buttons.  There are help tours available on all Event Espresso Admin pages.  If you want to turn off help tours for all pages, %sgo here%s. All the best with your events!',
58
-                       'event_espresso'
59
-                   ),
60
-                   '<a href="' . EE_Admin_Page::add_query_args_and_nonce($query_args, admin_url('admin.php')) . '">',
61
-                   '</a>'
62
-               )
63
-               . '</p>';
64
-    }
42
+	/**
43
+	 * This is the default last stop for all tours that is displayed at the end of a tour OR when a tour is exited for
44
+	 * the first time.
45
+	 *
46
+	 * @return string
47
+	 */
48
+	protected function _end()
49
+	{
50
+		$query_args = array(
51
+			'action' => 'admin_option_settings',
52
+			'page'   => 'espresso_general_settings',
53
+		);
54
+		return '<p>'
55
+			   . sprintf(
56
+				   __(
57
+					   'That\'s it for the tour!  At any time you can restart a tour by clicking on this help dropdown and then clicking one of the Tour buttons.  There are help tours available on all Event Espresso Admin pages.  If you want to turn off help tours for all pages, %sgo here%s. All the best with your events!',
58
+					   'event_espresso'
59
+				   ),
60
+				   '<a href="' . EE_Admin_Page::add_query_args_and_nonce($query_args, admin_url('admin.php')) . '">',
61
+				   '</a>'
62
+			   )
63
+			   . '</p>';
64
+	}
65 65
 }
Please login to merge, or discard this patch.
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -57,7 +57,7 @@
 block discarded – undo
57 57
                        'That\'s it for the tour!  At any time you can restart a tour by clicking on this help dropdown and then clicking one of the Tour buttons.  There are help tours available on all Event Espresso Admin pages.  If you want to turn off help tours for all pages, %sgo here%s. All the best with your events!',
58 58
                        'event_espresso'
59 59
                    ),
60
-                   '<a href="' . EE_Admin_Page::add_query_args_and_nonce($query_args, admin_url('admin.php')) . '">',
60
+                   '<a href="'.EE_Admin_Page::add_query_args_and_nonce($query_args, admin_url('admin.php')).'">',
61 61
                    '</a>'
62 62
                )
63 63
                . '</p>';
Please login to merge, or discard this patch.
modules/single_page_checkout/inc/EE_SPCO_Reg_Step.class.php 2 patches
Indentation   +627 added lines, -627 removed lines patch added patch discarded remove patch
@@ -12,631 +12,631 @@
 block discarded – undo
12 12
 abstract class EE_SPCO_Reg_Step
13 13
 {
14 14
 
15
-    /**
16
-     *    $_completed - TRUE if this step has fully completed it's duties
17
-     *
18
-     * @access protected
19
-     * @type bool $_completed
20
-     */
21
-    protected $_completed = false;
22
-
23
-    /**
24
-     *    $_is_current_step - TRUE if this is the current step
25
-     *
26
-     * @access protected
27
-     * @type bool $_is_current_step
28
-     */
29
-    protected $_is_current_step = false;
30
-
31
-    /**
32
-     *    $_order - when the reg step should be run relative to other steps
33
-     *
34
-     * @access protected
35
-     * @type int $_template
36
-     */
37
-    protected $_order = 0;
38
-
39
-    /**
40
-     *    $_slug - URL param for this step
41
-     *
42
-     * @access protected
43
-     * @type string $_slug
44
-     */
45
-    protected $_slug;
46
-
47
-    /**
48
-     *    $_name - Step Name - translatable string
49
-     *
50
-     * @access protected
51
-     * @type string $_slug
52
-     */
53
-    protected $_name;
54
-
55
-    /**
56
-     *    $_submit_button_text - translatable string that appears on this step's submit button
57
-     *
58
-     * @access protected
59
-     * @type string $_slug
60
-     */
61
-    protected $_submit_button_text;
62
-
63
-    /**
64
-     *    $_template - template name
65
-     *
66
-     * @access protected
67
-     * @type string $_template
68
-     */
69
-    protected $_template;
70
-
71
-    /**
72
-     *    $_reg_form_name - the form input name and id attribute
73
-     *
74
-     * @access protected
75
-     * @var string $_reg_form_name
76
-     */
77
-    protected $_reg_form_name;
78
-
79
-    /**
80
-     *    $_success_message - text to display upon successful form submission
81
-     *
82
-     * @access private
83
-     * @var string $_success_message
84
-     */
85
-    protected $_success_message;
86
-
87
-    /**
88
-     *    $_instructions - a brief description of how to complete the reg step.
89
-     *    Usually displayed in conjunction with the previous step's success message.
90
-     *
91
-     * @access private
92
-     * @var string $_instructions
93
-     */
94
-    protected $_instructions;
95
-
96
-    /**
97
-     *    $_valid_data - the normalized and validated data for this step
98
-     *
99
-     * @access public
100
-     * @var array $_valid_data
101
-     */
102
-    protected $_valid_data = array();
103
-
104
-    /**
105
-     *    $reg_form - the registration form for this step
106
-     *
107
-     * @access public
108
-     * @var EE_Form_Section_Proper $reg_form
109
-     */
110
-    public $reg_form;
111
-
112
-    /**
113
-     *    $checkout - EE_Checkout object for handling the properties of the current checkout process
114
-     *
115
-     * @access public
116
-     * @var EE_Checkout $checkout
117
-     */
118
-    public $checkout;
119
-
120
-
121
-    /**
122
-     * @return void
123
-     */
124
-    abstract public function translate_js_strings();
125
-
126
-
127
-    /**
128
-     * @return void
129
-     */
130
-    abstract public function enqueue_styles_and_scripts();
131
-
132
-
133
-    /**
134
-     * @return boolean
135
-     */
136
-    abstract public function initialize_reg_step();
137
-
138
-
139
-    /**
140
-     * @return string
141
-     */
142
-    abstract public function generate_reg_form();
143
-
144
-
145
-    /**
146
-     * @return boolean
147
-     */
148
-    abstract public function process_reg_step();
149
-
150
-
151
-    /**
152
-     * @return boolean
153
-     */
154
-    abstract public function update_reg_step();
155
-
156
-
157
-    /**
158
-     * @return boolean
159
-     */
160
-    public function completed()
161
-    {
162
-        return $this->_completed;
163
-    }
164
-
165
-
166
-    /**
167
-     * set_completed - toggles $_completed to TRUE
168
-     */
169
-    public function set_completed()
170
-    {
171
-        // DEBUG LOG
172
-        // $this->checkout->log( __CLASS__, __FUNCTION__, __LINE__ );
173
-        $this->_completed = apply_filters('FHEE__EE_SPCO_Reg_Step__set_completed___completed', true, $this);
174
-    }
175
-
176
-
177
-    /**
178
-     * set_completed - toggles $_completed to FALSE
179
-     */
180
-    public function set_not_completed()
181
-    {
182
-        $this->_completed = false;
183
-    }
184
-
185
-
186
-    /**
187
-     * @return string
188
-     */
189
-    public function name()
190
-    {
191
-        return $this->_name;
192
-    }
193
-
194
-
195
-    /**
196
-     * @return string
197
-     */
198
-    public function slug()
199
-    {
200
-        return $this->_slug;
201
-    }
202
-
203
-
204
-    /**
205
-     * submit_button_text
206
-     * the text that appears on the reg step form submit button
207
-     *
208
-     * @return string
209
-     */
210
-    public function submit_button_text()
211
-    {
212
-        return $this->_submit_button_text;
213
-    }
214
-
215
-
216
-    /**
217
-     * set_submit_button_text
218
-     * sets the text that appears on the reg step form submit button
219
-     *
220
-     * @param string $submit_button_text
221
-     */
222
-    public function set_submit_button_text($submit_button_text = '')
223
-    {
224
-        if (! empty($submit_button_text)) {
225
-            $this->_submit_button_text = $submit_button_text;
226
-        } elseif ($this->checkout->next_step instanceof EE_SPCO_Reg_Step) {
227
-            if ($this->checkout->revisit) {
228
-                $this->_submit_button_text = sprintf(
229
-                    __('Update %s', 'event_espresso'),
230
-                    $this->checkout->current_step->name()
231
-                );
232
-            } else {
233
-                $this->_submit_button_text = sprintf(
234
-                    __('Proceed to %s', 'event_espresso'),
235
-                    $this->checkout->next_step->name()
236
-                );
237
-            }
238
-        }
239
-        // filters the submit button text
240
-        $this->_submit_button_text = apply_filters(
241
-            'FHEE__EE_SPCO_Reg_Step__set_submit_button_text___submit_button_text',
242
-            $this->_submit_button_text,
243
-            $this->checkout
244
-        );
245
-    }
246
-
247
-
248
-    /**
249
-     * @param boolean $is_current_step
250
-     */
251
-    public function set_is_current_step($is_current_step)
252
-    {
253
-        $this->_is_current_step = $is_current_step;
254
-    }
255
-
256
-
257
-    /**
258
-     * @return boolean
259
-     */
260
-    public function is_current_step()
261
-    {
262
-        return $this->_is_current_step;
263
-    }
264
-
265
-
266
-    /**
267
-     * @return boolean
268
-     */
269
-    public function is_final_step()
270
-    {
271
-        return $this instanceof EE_SPCO_Reg_Step_Finalize_Registration ? true : false;
272
-    }
273
-
274
-
275
-    /**
276
-     * @param int $order
277
-     */
278
-    public function set_order($order)
279
-    {
280
-        $this->_order = $order;
281
-    }
282
-
283
-
284
-    /**
285
-     * @return int
286
-     */
287
-    public function order()
288
-    {
289
-        return $this->_order;
290
-    }
291
-
292
-
293
-    /**
294
-     * @return string
295
-     */
296
-    public function template()
297
-    {
298
-        return $this->_template;
299
-    }
300
-
301
-
302
-    /**
303
-     * @return string
304
-     */
305
-    public function success_message()
306
-    {
307
-        return $this->_success_message;
308
-    }
309
-
310
-
311
-    /**
312
-     * _set_success_message
313
-     *
314
-     * @param string $success_message
315
-     */
316
-    protected function _set_success_message($success_message)
317
-    {
318
-        $this->_success_message = $success_message;
319
-    }
320
-
321
-
322
-    /**
323
-     * _reset_success_message
324
-     *
325
-     * @return void
326
-     */
327
-    protected function _reset_success_message()
328
-    {
329
-        $this->_success_message = '';
330
-    }
331
-
332
-
333
-    /**
334
-     * @return string
335
-     */
336
-    public function _instructions()
337
-    {
338
-        return $this->_instructions;
339
-    }
340
-
341
-
342
-    /**
343
-     * @param string $instructions
344
-     */
345
-    public function set_instructions($instructions)
346
-    {
347
-        $this->_instructions = apply_filters(
348
-            'FHEE__EE_SPCO_Reg_Step__set_instructions__instructions',
349
-            $instructions,
350
-            $this
351
-        );
352
-    }
353
-
354
-
355
-    /**
356
-     * @param array $valid_data
357
-     */
358
-    public function set_valid_data($valid_data)
359
-    {
360
-        $this->_valid_data = $valid_data;
361
-    }
362
-
363
-
364
-    /**
365
-     * @return array
366
-     */
367
-    public function valid_data()
368
-    {
369
-        if (empty($this->_valid_data)) {
370
-            $this->_valid_data = $this->reg_form->valid_data();
371
-        }
372
-        return $this->_valid_data;
373
-    }
374
-
375
-
376
-    /**
377
-     * @return string
378
-     */
379
-    public function reg_form_name()
380
-    {
381
-        if (empty($this->_reg_form_name)) {
382
-            $this->set_reg_form_name('ee-spco-' . $this->slug() . '-reg-step-form');
383
-        }
384
-        return $this->_reg_form_name;
385
-    }
386
-
387
-
388
-    /**
389
-     * @param string $reg_form_name
390
-     */
391
-    protected function set_reg_form_name($reg_form_name)
392
-    {
393
-        $this->_reg_form_name = $reg_form_name;
394
-    }
395
-
396
-
397
-    /**
398
-     * reg_step_url
399
-     *
400
-     * @param string $action
401
-     * @return string
402
-     */
403
-    public function reg_step_url($action = '')
404
-    {
405
-        $query_args = array('step' => $this->slug());
406
-        if (! empty($action)) {
407
-            $query_args['action'] = $action;
408
-        }
409
-        // final step has no display
410
-        if ($this instanceof EE_SPCO_Reg_Step_Finalize_Registration && $action === 'display_spco_reg_step') {
411
-            $query_args['action'] = 'process_reg_step';
412
-        }
413
-        if ($this->checkout->revisit) {
414
-            $query_args['revisit'] = true;
415
-        }
416
-        if ($this->checkout->reg_url_link) {
417
-            $query_args['e_reg_url_link'] = $this->checkout->reg_url_link;
418
-        }
419
-        return add_query_arg($query_args, $this->checkout->reg_page_base_url);
420
-    }
421
-
422
-
423
-    /**
424
-     * creates the default hidden inputs section
425
-     *
426
-     * @return EE_Form_Section_Proper
427
-     * @throws \EE_Error
428
-     */
429
-    public function reg_step_hidden_inputs()
430
-    {
431
-        // hidden inputs for admin registrations
432
-        if ($this->checkout->admin_request) {
433
-            return new EE_Form_Section_Proper(
434
-                array(
435
-                    'layout_strategy' => new EE_Div_Per_Section_Layout(),
436
-                    'html_id'         => 'ee-' . $this->slug() . '-hidden-inputs',
437
-                    'subsections'     => array(
438
-                        'next_step' => new EE_Fixed_Hidden_Input(
439
-                            array(
440
-                                'html_name' => 'next_step',
441
-                                'html_id'   => 'spco-' . $this->slug() . '-next-step',
442
-                                'default'   => $this->checkout->next_step instanceof EE_SPCO_Reg_Step
443
-                                    ? $this->checkout->next_step->slug()
444
-                                    : '',
445
-                            )
446
-                        ),
447
-                    ),
448
-                )
449
-            );
450
-        }
451
-        // hidden inputs for frontend registrations
452
-        return new EE_Form_Section_Proper(
453
-            array(
454
-                'layout_strategy' => new EE_Div_Per_Section_Layout(),
455
-                'html_id'         => 'ee-' . $this->slug() . '-hidden-inputs',
456
-                'subsections'     => array(
457
-                    'action'         => new EE_Fixed_Hidden_Input(
458
-                        array(
459
-                            'html_name' => 'action',
460
-                            'html_id'   => 'spco-' . $this->slug() . '-action',
461
-                            'default'   => apply_filters(
462
-                                'FHEE__EE_SPCO_Reg_Step__reg_step_hidden_inputs__default_form_action',
463
-                                empty($this->checkout->reg_url_link)
464
-                                    ? 'process_reg_step'
465
-                                    : 'update_reg_step',
466
-                                $this
467
-                            ),
468
-                        )
469
-                    ),
470
-                    'next_step'      => new EE_Fixed_Hidden_Input(
471
-                        array(
472
-                            'html_name' => 'next_step',
473
-                            'html_id'   => 'spco-' . $this->slug() . '-next-step',
474
-                            'default'   => $this->checkout->next_step instanceof EE_SPCO_Reg_Step
475
-                                ? $this->checkout->next_step->slug()
476
-                                : '',
477
-                        )
478
-                    ),
479
-                    'e_reg_url_link' => new EE_Fixed_Hidden_Input(
480
-                        array(
481
-                            'html_name' => 'e_reg_url_link',
482
-                            'html_id'   => 'spco-reg_url_link',
483
-                            'default'   => $this->checkout->reg_url_link,
484
-                        )
485
-                    ),
486
-                    'revisit'        => new EE_Fixed_Hidden_Input(
487
-                        array(
488
-                            'html_name' => 'revisit',
489
-                            'html_id'   => 'spco-revisit',
490
-                            'default'   => $this->checkout->revisit,
491
-                        )
492
-                    ),
493
-                ),
494
-            )
495
-        );
496
-    }
497
-
498
-
499
-    /**
500
-     * generate_reg_form_for_actions
501
-     *
502
-     * @param array $actions
503
-     * @return void
504
-     */
505
-    public function generate_reg_form_for_actions($actions = array())
506
-    {
507
-        $actions = array_merge(
508
-            array(
509
-                'generate_reg_form',
510
-                'display_spco_reg_step',
511
-                'process_reg_step',
512
-                'update_reg_step',
513
-            ),
514
-            $actions
515
-        );
516
-        $this->checkout->generate_reg_form = in_array($this->checkout->action, $actions, true) ? true : false;
517
-    }
518
-
519
-
520
-    /**
521
-     * @return string
522
-     * @throws \EE_Error
523
-     */
524
-    public function display_reg_form()
525
-    {
526
-        $html = '';
527
-        if ($this->reg_form instanceof EE_Form_Section_Proper) {
528
-            do_action('AHEE__EE_SPCO_Reg_Step__display_reg_form__reg_form', $this->reg_form, $this);
529
-            $html .= ! $this->checkout->admin_request ? $this->reg_form->form_open($this->reg_step_url()) : '';
530
-            if (EE_Registry::instance()->REQ->ajax) {
531
-                $this->reg_form->localize_validation_rules();
532
-                $this->checkout->json_response->add_validation_rules(EE_Form_Section_Proper::js_localization());
533
-            }
534
-            $html .= $this->reg_form->get_html();
535
-            $html .= ! $this->checkout->admin_request ? $this->reg_step_submit_button() : '';
536
-            $html .= ! $this->checkout->admin_request ? $this->reg_form->form_close() : '';
537
-        }
538
-        return $html;
539
-    }
540
-
541
-
542
-    /**
543
-     * div_class - returns nothing for current step, but a css class of "hidden" for others
544
-     *
545
-     * @return string
546
-     * @throws \EE_Error
547
-     */
548
-    public function reg_step_submit_button()
549
-    {
550
-        if (! $this->checkout->next_step instanceof EE_SPCO_Reg_Step) {
551
-            return '';
552
-        }
553
-        ob_start();
554
-        do_action(
555
-            'AHEE__before_spco_whats_next_buttons',
556
-            $this->slug(),
557
-            $this->checkout->next_step->slug(),
558
-            $this->checkout
559
-        );
560
-        $html = ob_get_clean();
561
-        // generate submit button
562
-        $sbmt_btn = new EE_Submit_Input(
563
-            array(
564
-                'html_name'             => 'spco-go-to-step-' . $this->checkout->next_step->slug(),
565
-                'html_id'               => 'spco-go-to-step-' . $this->checkout->next_step->slug(),
566
-                'html_class'            => 'spco-next-step-btn',
567
-                'other_html_attributes' => ' rel="' . $this->slug() . '"',
568
-                'default'               => $this->submit_button_text(),
569
-            )
570
-        );
571
-        $sbmt_btn->set_button_css_attributes(true, 'large');
572
-        $sbmt_btn_html = $sbmt_btn->get_html_for_input();
573
-        $html .= EEH_HTML::div(
574
-            apply_filters('FHEE__EE_SPCO_Reg_Step__reg_step_submit_button__sbmt_btn_html', $sbmt_btn_html, $this),
575
-            'spco-' . $this->slug() . '-whats-next-buttons-dv',
576
-            'spco-whats-next-buttons'
577
-        );
578
-        return $html;
579
-    }
580
-
581
-
582
-    /**
583
-     * div_class - returns nothing for current step, but a css class of "hidden" for others
584
-     *
585
-     * @return string
586
-     */
587
-    public function div_class()
588
-    {
589
-        return $this->is_current_step() ? '' : ' hidden';
590
-    }
591
-
592
-
593
-    /**
594
-     * div_class - returns  a css class of "hidden" for current step, but nothing for others
595
-     *
596
-     * @return string
597
-     */
598
-    public function edit_lnk_url()
599
-    {
600
-        return add_query_arg(array('step' => $this->slug()), $this->checkout->reg_page_base_url);
601
-    }
602
-
603
-
604
-    /**
605
-     * div_class - returns  a css class of "hidden" for current step, but nothing for others
606
-     *
607
-     * @return string
608
-     */
609
-    public function edit_link_class()
610
-    {
611
-        return $this->is_current_step() ? ' hidden' : '';
612
-    }
613
-
614
-
615
-    /**
616
-     * update_checkout with changes that have been made to the cart
617
-     *
618
-     * @return void
619
-     * @throws \EE_Error
620
-     */
621
-    public function update_checkout()
622
-    {
623
-        // grab the cart grand total and reset TXN total
624
-        $this->checkout->transaction->set_total($this->checkout->cart->get_cart_grand_total());
625
-        $this->checkout->stash_transaction_and_checkout();
626
-    }
627
-
628
-
629
-    /**
630
-     *    __sleep
631
-     * to conserve db space, let's remove the reg_form and the EE_Checkout object from EE_SPCO_Reg_Step objects upon
632
-     * serialization EE_Checkout will handle the reimplementation of itself upon waking, but we won't bother with the
633
-     * reg form, because if needed, it will be regenerated anyways
634
-     *
635
-     * @return array
636
-     */
637
-    public function __sleep()
638
-    {
639
-        // remove the reg form and the checkout
640
-        return array_diff(array_keys(get_object_vars($this)), array('reg_form', 'checkout'));
641
-    }
15
+	/**
16
+	 *    $_completed - TRUE if this step has fully completed it's duties
17
+	 *
18
+	 * @access protected
19
+	 * @type bool $_completed
20
+	 */
21
+	protected $_completed = false;
22
+
23
+	/**
24
+	 *    $_is_current_step - TRUE if this is the current step
25
+	 *
26
+	 * @access protected
27
+	 * @type bool $_is_current_step
28
+	 */
29
+	protected $_is_current_step = false;
30
+
31
+	/**
32
+	 *    $_order - when the reg step should be run relative to other steps
33
+	 *
34
+	 * @access protected
35
+	 * @type int $_template
36
+	 */
37
+	protected $_order = 0;
38
+
39
+	/**
40
+	 *    $_slug - URL param for this step
41
+	 *
42
+	 * @access protected
43
+	 * @type string $_slug
44
+	 */
45
+	protected $_slug;
46
+
47
+	/**
48
+	 *    $_name - Step Name - translatable string
49
+	 *
50
+	 * @access protected
51
+	 * @type string $_slug
52
+	 */
53
+	protected $_name;
54
+
55
+	/**
56
+	 *    $_submit_button_text - translatable string that appears on this step's submit button
57
+	 *
58
+	 * @access protected
59
+	 * @type string $_slug
60
+	 */
61
+	protected $_submit_button_text;
62
+
63
+	/**
64
+	 *    $_template - template name
65
+	 *
66
+	 * @access protected
67
+	 * @type string $_template
68
+	 */
69
+	protected $_template;
70
+
71
+	/**
72
+	 *    $_reg_form_name - the form input name and id attribute
73
+	 *
74
+	 * @access protected
75
+	 * @var string $_reg_form_name
76
+	 */
77
+	protected $_reg_form_name;
78
+
79
+	/**
80
+	 *    $_success_message - text to display upon successful form submission
81
+	 *
82
+	 * @access private
83
+	 * @var string $_success_message
84
+	 */
85
+	protected $_success_message;
86
+
87
+	/**
88
+	 *    $_instructions - a brief description of how to complete the reg step.
89
+	 *    Usually displayed in conjunction with the previous step's success message.
90
+	 *
91
+	 * @access private
92
+	 * @var string $_instructions
93
+	 */
94
+	protected $_instructions;
95
+
96
+	/**
97
+	 *    $_valid_data - the normalized and validated data for this step
98
+	 *
99
+	 * @access public
100
+	 * @var array $_valid_data
101
+	 */
102
+	protected $_valid_data = array();
103
+
104
+	/**
105
+	 *    $reg_form - the registration form for this step
106
+	 *
107
+	 * @access public
108
+	 * @var EE_Form_Section_Proper $reg_form
109
+	 */
110
+	public $reg_form;
111
+
112
+	/**
113
+	 *    $checkout - EE_Checkout object for handling the properties of the current checkout process
114
+	 *
115
+	 * @access public
116
+	 * @var EE_Checkout $checkout
117
+	 */
118
+	public $checkout;
119
+
120
+
121
+	/**
122
+	 * @return void
123
+	 */
124
+	abstract public function translate_js_strings();
125
+
126
+
127
+	/**
128
+	 * @return void
129
+	 */
130
+	abstract public function enqueue_styles_and_scripts();
131
+
132
+
133
+	/**
134
+	 * @return boolean
135
+	 */
136
+	abstract public function initialize_reg_step();
137
+
138
+
139
+	/**
140
+	 * @return string
141
+	 */
142
+	abstract public function generate_reg_form();
143
+
144
+
145
+	/**
146
+	 * @return boolean
147
+	 */
148
+	abstract public function process_reg_step();
149
+
150
+
151
+	/**
152
+	 * @return boolean
153
+	 */
154
+	abstract public function update_reg_step();
155
+
156
+
157
+	/**
158
+	 * @return boolean
159
+	 */
160
+	public function completed()
161
+	{
162
+		return $this->_completed;
163
+	}
164
+
165
+
166
+	/**
167
+	 * set_completed - toggles $_completed to TRUE
168
+	 */
169
+	public function set_completed()
170
+	{
171
+		// DEBUG LOG
172
+		// $this->checkout->log( __CLASS__, __FUNCTION__, __LINE__ );
173
+		$this->_completed = apply_filters('FHEE__EE_SPCO_Reg_Step__set_completed___completed', true, $this);
174
+	}
175
+
176
+
177
+	/**
178
+	 * set_completed - toggles $_completed to FALSE
179
+	 */
180
+	public function set_not_completed()
181
+	{
182
+		$this->_completed = false;
183
+	}
184
+
185
+
186
+	/**
187
+	 * @return string
188
+	 */
189
+	public function name()
190
+	{
191
+		return $this->_name;
192
+	}
193
+
194
+
195
+	/**
196
+	 * @return string
197
+	 */
198
+	public function slug()
199
+	{
200
+		return $this->_slug;
201
+	}
202
+
203
+
204
+	/**
205
+	 * submit_button_text
206
+	 * the text that appears on the reg step form submit button
207
+	 *
208
+	 * @return string
209
+	 */
210
+	public function submit_button_text()
211
+	{
212
+		return $this->_submit_button_text;
213
+	}
214
+
215
+
216
+	/**
217
+	 * set_submit_button_text
218
+	 * sets the text that appears on the reg step form submit button
219
+	 *
220
+	 * @param string $submit_button_text
221
+	 */
222
+	public function set_submit_button_text($submit_button_text = '')
223
+	{
224
+		if (! empty($submit_button_text)) {
225
+			$this->_submit_button_text = $submit_button_text;
226
+		} elseif ($this->checkout->next_step instanceof EE_SPCO_Reg_Step) {
227
+			if ($this->checkout->revisit) {
228
+				$this->_submit_button_text = sprintf(
229
+					__('Update %s', 'event_espresso'),
230
+					$this->checkout->current_step->name()
231
+				);
232
+			} else {
233
+				$this->_submit_button_text = sprintf(
234
+					__('Proceed to %s', 'event_espresso'),
235
+					$this->checkout->next_step->name()
236
+				);
237
+			}
238
+		}
239
+		// filters the submit button text
240
+		$this->_submit_button_text = apply_filters(
241
+			'FHEE__EE_SPCO_Reg_Step__set_submit_button_text___submit_button_text',
242
+			$this->_submit_button_text,
243
+			$this->checkout
244
+		);
245
+	}
246
+
247
+
248
+	/**
249
+	 * @param boolean $is_current_step
250
+	 */
251
+	public function set_is_current_step($is_current_step)
252
+	{
253
+		$this->_is_current_step = $is_current_step;
254
+	}
255
+
256
+
257
+	/**
258
+	 * @return boolean
259
+	 */
260
+	public function is_current_step()
261
+	{
262
+		return $this->_is_current_step;
263
+	}
264
+
265
+
266
+	/**
267
+	 * @return boolean
268
+	 */
269
+	public function is_final_step()
270
+	{
271
+		return $this instanceof EE_SPCO_Reg_Step_Finalize_Registration ? true : false;
272
+	}
273
+
274
+
275
+	/**
276
+	 * @param int $order
277
+	 */
278
+	public function set_order($order)
279
+	{
280
+		$this->_order = $order;
281
+	}
282
+
283
+
284
+	/**
285
+	 * @return int
286
+	 */
287
+	public function order()
288
+	{
289
+		return $this->_order;
290
+	}
291
+
292
+
293
+	/**
294
+	 * @return string
295
+	 */
296
+	public function template()
297
+	{
298
+		return $this->_template;
299
+	}
300
+
301
+
302
+	/**
303
+	 * @return string
304
+	 */
305
+	public function success_message()
306
+	{
307
+		return $this->_success_message;
308
+	}
309
+
310
+
311
+	/**
312
+	 * _set_success_message
313
+	 *
314
+	 * @param string $success_message
315
+	 */
316
+	protected function _set_success_message($success_message)
317
+	{
318
+		$this->_success_message = $success_message;
319
+	}
320
+
321
+
322
+	/**
323
+	 * _reset_success_message
324
+	 *
325
+	 * @return void
326
+	 */
327
+	protected function _reset_success_message()
328
+	{
329
+		$this->_success_message = '';
330
+	}
331
+
332
+
333
+	/**
334
+	 * @return string
335
+	 */
336
+	public function _instructions()
337
+	{
338
+		return $this->_instructions;
339
+	}
340
+
341
+
342
+	/**
343
+	 * @param string $instructions
344
+	 */
345
+	public function set_instructions($instructions)
346
+	{
347
+		$this->_instructions = apply_filters(
348
+			'FHEE__EE_SPCO_Reg_Step__set_instructions__instructions',
349
+			$instructions,
350
+			$this
351
+		);
352
+	}
353
+
354
+
355
+	/**
356
+	 * @param array $valid_data
357
+	 */
358
+	public function set_valid_data($valid_data)
359
+	{
360
+		$this->_valid_data = $valid_data;
361
+	}
362
+
363
+
364
+	/**
365
+	 * @return array
366
+	 */
367
+	public function valid_data()
368
+	{
369
+		if (empty($this->_valid_data)) {
370
+			$this->_valid_data = $this->reg_form->valid_data();
371
+		}
372
+		return $this->_valid_data;
373
+	}
374
+
375
+
376
+	/**
377
+	 * @return string
378
+	 */
379
+	public function reg_form_name()
380
+	{
381
+		if (empty($this->_reg_form_name)) {
382
+			$this->set_reg_form_name('ee-spco-' . $this->slug() . '-reg-step-form');
383
+		}
384
+		return $this->_reg_form_name;
385
+	}
386
+
387
+
388
+	/**
389
+	 * @param string $reg_form_name
390
+	 */
391
+	protected function set_reg_form_name($reg_form_name)
392
+	{
393
+		$this->_reg_form_name = $reg_form_name;
394
+	}
395
+
396
+
397
+	/**
398
+	 * reg_step_url
399
+	 *
400
+	 * @param string $action
401
+	 * @return string
402
+	 */
403
+	public function reg_step_url($action = '')
404
+	{
405
+		$query_args = array('step' => $this->slug());
406
+		if (! empty($action)) {
407
+			$query_args['action'] = $action;
408
+		}
409
+		// final step has no display
410
+		if ($this instanceof EE_SPCO_Reg_Step_Finalize_Registration && $action === 'display_spco_reg_step') {
411
+			$query_args['action'] = 'process_reg_step';
412
+		}
413
+		if ($this->checkout->revisit) {
414
+			$query_args['revisit'] = true;
415
+		}
416
+		if ($this->checkout->reg_url_link) {
417
+			$query_args['e_reg_url_link'] = $this->checkout->reg_url_link;
418
+		}
419
+		return add_query_arg($query_args, $this->checkout->reg_page_base_url);
420
+	}
421
+
422
+
423
+	/**
424
+	 * creates the default hidden inputs section
425
+	 *
426
+	 * @return EE_Form_Section_Proper
427
+	 * @throws \EE_Error
428
+	 */
429
+	public function reg_step_hidden_inputs()
430
+	{
431
+		// hidden inputs for admin registrations
432
+		if ($this->checkout->admin_request) {
433
+			return new EE_Form_Section_Proper(
434
+				array(
435
+					'layout_strategy' => new EE_Div_Per_Section_Layout(),
436
+					'html_id'         => 'ee-' . $this->slug() . '-hidden-inputs',
437
+					'subsections'     => array(
438
+						'next_step' => new EE_Fixed_Hidden_Input(
439
+							array(
440
+								'html_name' => 'next_step',
441
+								'html_id'   => 'spco-' . $this->slug() . '-next-step',
442
+								'default'   => $this->checkout->next_step instanceof EE_SPCO_Reg_Step
443
+									? $this->checkout->next_step->slug()
444
+									: '',
445
+							)
446
+						),
447
+					),
448
+				)
449
+			);
450
+		}
451
+		// hidden inputs for frontend registrations
452
+		return new EE_Form_Section_Proper(
453
+			array(
454
+				'layout_strategy' => new EE_Div_Per_Section_Layout(),
455
+				'html_id'         => 'ee-' . $this->slug() . '-hidden-inputs',
456
+				'subsections'     => array(
457
+					'action'         => new EE_Fixed_Hidden_Input(
458
+						array(
459
+							'html_name' => 'action',
460
+							'html_id'   => 'spco-' . $this->slug() . '-action',
461
+							'default'   => apply_filters(
462
+								'FHEE__EE_SPCO_Reg_Step__reg_step_hidden_inputs__default_form_action',
463
+								empty($this->checkout->reg_url_link)
464
+									? 'process_reg_step'
465
+									: 'update_reg_step',
466
+								$this
467
+							),
468
+						)
469
+					),
470
+					'next_step'      => new EE_Fixed_Hidden_Input(
471
+						array(
472
+							'html_name' => 'next_step',
473
+							'html_id'   => 'spco-' . $this->slug() . '-next-step',
474
+							'default'   => $this->checkout->next_step instanceof EE_SPCO_Reg_Step
475
+								? $this->checkout->next_step->slug()
476
+								: '',
477
+						)
478
+					),
479
+					'e_reg_url_link' => new EE_Fixed_Hidden_Input(
480
+						array(
481
+							'html_name' => 'e_reg_url_link',
482
+							'html_id'   => 'spco-reg_url_link',
483
+							'default'   => $this->checkout->reg_url_link,
484
+						)
485
+					),
486
+					'revisit'        => new EE_Fixed_Hidden_Input(
487
+						array(
488
+							'html_name' => 'revisit',
489
+							'html_id'   => 'spco-revisit',
490
+							'default'   => $this->checkout->revisit,
491
+						)
492
+					),
493
+				),
494
+			)
495
+		);
496
+	}
497
+
498
+
499
+	/**
500
+	 * generate_reg_form_for_actions
501
+	 *
502
+	 * @param array $actions
503
+	 * @return void
504
+	 */
505
+	public function generate_reg_form_for_actions($actions = array())
506
+	{
507
+		$actions = array_merge(
508
+			array(
509
+				'generate_reg_form',
510
+				'display_spco_reg_step',
511
+				'process_reg_step',
512
+				'update_reg_step',
513
+			),
514
+			$actions
515
+		);
516
+		$this->checkout->generate_reg_form = in_array($this->checkout->action, $actions, true) ? true : false;
517
+	}
518
+
519
+
520
+	/**
521
+	 * @return string
522
+	 * @throws \EE_Error
523
+	 */
524
+	public function display_reg_form()
525
+	{
526
+		$html = '';
527
+		if ($this->reg_form instanceof EE_Form_Section_Proper) {
528
+			do_action('AHEE__EE_SPCO_Reg_Step__display_reg_form__reg_form', $this->reg_form, $this);
529
+			$html .= ! $this->checkout->admin_request ? $this->reg_form->form_open($this->reg_step_url()) : '';
530
+			if (EE_Registry::instance()->REQ->ajax) {
531
+				$this->reg_form->localize_validation_rules();
532
+				$this->checkout->json_response->add_validation_rules(EE_Form_Section_Proper::js_localization());
533
+			}
534
+			$html .= $this->reg_form->get_html();
535
+			$html .= ! $this->checkout->admin_request ? $this->reg_step_submit_button() : '';
536
+			$html .= ! $this->checkout->admin_request ? $this->reg_form->form_close() : '';
537
+		}
538
+		return $html;
539
+	}
540
+
541
+
542
+	/**
543
+	 * div_class - returns nothing for current step, but a css class of "hidden" for others
544
+	 *
545
+	 * @return string
546
+	 * @throws \EE_Error
547
+	 */
548
+	public function reg_step_submit_button()
549
+	{
550
+		if (! $this->checkout->next_step instanceof EE_SPCO_Reg_Step) {
551
+			return '';
552
+		}
553
+		ob_start();
554
+		do_action(
555
+			'AHEE__before_spco_whats_next_buttons',
556
+			$this->slug(),
557
+			$this->checkout->next_step->slug(),
558
+			$this->checkout
559
+		);
560
+		$html = ob_get_clean();
561
+		// generate submit button
562
+		$sbmt_btn = new EE_Submit_Input(
563
+			array(
564
+				'html_name'             => 'spco-go-to-step-' . $this->checkout->next_step->slug(),
565
+				'html_id'               => 'spco-go-to-step-' . $this->checkout->next_step->slug(),
566
+				'html_class'            => 'spco-next-step-btn',
567
+				'other_html_attributes' => ' rel="' . $this->slug() . '"',
568
+				'default'               => $this->submit_button_text(),
569
+			)
570
+		);
571
+		$sbmt_btn->set_button_css_attributes(true, 'large');
572
+		$sbmt_btn_html = $sbmt_btn->get_html_for_input();
573
+		$html .= EEH_HTML::div(
574
+			apply_filters('FHEE__EE_SPCO_Reg_Step__reg_step_submit_button__sbmt_btn_html', $sbmt_btn_html, $this),
575
+			'spco-' . $this->slug() . '-whats-next-buttons-dv',
576
+			'spco-whats-next-buttons'
577
+		);
578
+		return $html;
579
+	}
580
+
581
+
582
+	/**
583
+	 * div_class - returns nothing for current step, but a css class of "hidden" for others
584
+	 *
585
+	 * @return string
586
+	 */
587
+	public function div_class()
588
+	{
589
+		return $this->is_current_step() ? '' : ' hidden';
590
+	}
591
+
592
+
593
+	/**
594
+	 * div_class - returns  a css class of "hidden" for current step, but nothing for others
595
+	 *
596
+	 * @return string
597
+	 */
598
+	public function edit_lnk_url()
599
+	{
600
+		return add_query_arg(array('step' => $this->slug()), $this->checkout->reg_page_base_url);
601
+	}
602
+
603
+
604
+	/**
605
+	 * div_class - returns  a css class of "hidden" for current step, but nothing for others
606
+	 *
607
+	 * @return string
608
+	 */
609
+	public function edit_link_class()
610
+	{
611
+		return $this->is_current_step() ? ' hidden' : '';
612
+	}
613
+
614
+
615
+	/**
616
+	 * update_checkout with changes that have been made to the cart
617
+	 *
618
+	 * @return void
619
+	 * @throws \EE_Error
620
+	 */
621
+	public function update_checkout()
622
+	{
623
+		// grab the cart grand total and reset TXN total
624
+		$this->checkout->transaction->set_total($this->checkout->cart->get_cart_grand_total());
625
+		$this->checkout->stash_transaction_and_checkout();
626
+	}
627
+
628
+
629
+	/**
630
+	 *    __sleep
631
+	 * to conserve db space, let's remove the reg_form and the EE_Checkout object from EE_SPCO_Reg_Step objects upon
632
+	 * serialization EE_Checkout will handle the reimplementation of itself upon waking, but we won't bother with the
633
+	 * reg form, because if needed, it will be regenerated anyways
634
+	 *
635
+	 * @return array
636
+	 */
637
+	public function __sleep()
638
+	{
639
+		// remove the reg form and the checkout
640
+		return array_diff(array_keys(get_object_vars($this)), array('reg_form', 'checkout'));
641
+	}
642 642
 }
Please login to merge, or discard this patch.
Spacing   +13 added lines, -13 removed lines patch added patch discarded remove patch
@@ -221,7 +221,7 @@  discard block
 block discarded – undo
221 221
      */
222 222
     public function set_submit_button_text($submit_button_text = '')
223 223
     {
224
-        if (! empty($submit_button_text)) {
224
+        if ( ! empty($submit_button_text)) {
225 225
             $this->_submit_button_text = $submit_button_text;
226 226
         } elseif ($this->checkout->next_step instanceof EE_SPCO_Reg_Step) {
227 227
             if ($this->checkout->revisit) {
@@ -379,7 +379,7 @@  discard block
 block discarded – undo
379 379
     public function reg_form_name()
380 380
     {
381 381
         if (empty($this->_reg_form_name)) {
382
-            $this->set_reg_form_name('ee-spco-' . $this->slug() . '-reg-step-form');
382
+            $this->set_reg_form_name('ee-spco-'.$this->slug().'-reg-step-form');
383 383
         }
384 384
         return $this->_reg_form_name;
385 385
     }
@@ -403,7 +403,7 @@  discard block
 block discarded – undo
403 403
     public function reg_step_url($action = '')
404 404
     {
405 405
         $query_args = array('step' => $this->slug());
406
-        if (! empty($action)) {
406
+        if ( ! empty($action)) {
407 407
             $query_args['action'] = $action;
408 408
         }
409 409
         // final step has no display
@@ -433,12 +433,12 @@  discard block
 block discarded – undo
433 433
             return new EE_Form_Section_Proper(
434 434
                 array(
435 435
                     'layout_strategy' => new EE_Div_Per_Section_Layout(),
436
-                    'html_id'         => 'ee-' . $this->slug() . '-hidden-inputs',
436
+                    'html_id'         => 'ee-'.$this->slug().'-hidden-inputs',
437 437
                     'subsections'     => array(
438 438
                         'next_step' => new EE_Fixed_Hidden_Input(
439 439
                             array(
440 440
                                 'html_name' => 'next_step',
441
-                                'html_id'   => 'spco-' . $this->slug() . '-next-step',
441
+                                'html_id'   => 'spco-'.$this->slug().'-next-step',
442 442
                                 'default'   => $this->checkout->next_step instanceof EE_SPCO_Reg_Step
443 443
                                     ? $this->checkout->next_step->slug()
444 444
                                     : '',
@@ -452,12 +452,12 @@  discard block
 block discarded – undo
452 452
         return new EE_Form_Section_Proper(
453 453
             array(
454 454
                 'layout_strategy' => new EE_Div_Per_Section_Layout(),
455
-                'html_id'         => 'ee-' . $this->slug() . '-hidden-inputs',
455
+                'html_id'         => 'ee-'.$this->slug().'-hidden-inputs',
456 456
                 'subsections'     => array(
457 457
                     'action'         => new EE_Fixed_Hidden_Input(
458 458
                         array(
459 459
                             'html_name' => 'action',
460
-                            'html_id'   => 'spco-' . $this->slug() . '-action',
460
+                            'html_id'   => 'spco-'.$this->slug().'-action',
461 461
                             'default'   => apply_filters(
462 462
                                 'FHEE__EE_SPCO_Reg_Step__reg_step_hidden_inputs__default_form_action',
463 463
                                 empty($this->checkout->reg_url_link)
@@ -470,7 +470,7 @@  discard block
 block discarded – undo
470 470
                     'next_step'      => new EE_Fixed_Hidden_Input(
471 471
                         array(
472 472
                             'html_name' => 'next_step',
473
-                            'html_id'   => 'spco-' . $this->slug() . '-next-step',
473
+                            'html_id'   => 'spco-'.$this->slug().'-next-step',
474 474
                             'default'   => $this->checkout->next_step instanceof EE_SPCO_Reg_Step
475 475
                                 ? $this->checkout->next_step->slug()
476 476
                                 : '',
@@ -547,7 +547,7 @@  discard block
 block discarded – undo
547 547
      */
548 548
     public function reg_step_submit_button()
549 549
     {
550
-        if (! $this->checkout->next_step instanceof EE_SPCO_Reg_Step) {
550
+        if ( ! $this->checkout->next_step instanceof EE_SPCO_Reg_Step) {
551 551
             return '';
552 552
         }
553 553
         ob_start();
@@ -561,10 +561,10 @@  discard block
 block discarded – undo
561 561
         // generate submit button
562 562
         $sbmt_btn = new EE_Submit_Input(
563 563
             array(
564
-                'html_name'             => 'spco-go-to-step-' . $this->checkout->next_step->slug(),
565
-                'html_id'               => 'spco-go-to-step-' . $this->checkout->next_step->slug(),
564
+                'html_name'             => 'spco-go-to-step-'.$this->checkout->next_step->slug(),
565
+                'html_id'               => 'spco-go-to-step-'.$this->checkout->next_step->slug(),
566 566
                 'html_class'            => 'spco-next-step-btn',
567
-                'other_html_attributes' => ' rel="' . $this->slug() . '"',
567
+                'other_html_attributes' => ' rel="'.$this->slug().'"',
568 568
                 'default'               => $this->submit_button_text(),
569 569
             )
570 570
         );
@@ -572,7 +572,7 @@  discard block
 block discarded – undo
572 572
         $sbmt_btn_html = $sbmt_btn->get_html_for_input();
573 573
         $html .= EEH_HTML::div(
574 574
             apply_filters('FHEE__EE_SPCO_Reg_Step__reg_step_submit_button__sbmt_btn_html', $sbmt_btn_html, $this),
575
-            'spco-' . $this->slug() . '-whats-next-buttons-dv',
575
+            'spco-'.$this->slug().'-whats-next-buttons-dv',
576 576
             'spco-whats-next-buttons'
577 577
         );
578 578
         return $html;
Please login to merge, or discard this patch.
modules/single_page_checkout/inc/EE_Checkout.class.php 2 patches
Indentation   +1425 added lines, -1425 removed lines patch added patch discarded remove patch
@@ -15,1429 +15,1429 @@
 block discarded – undo
15 15
 class EE_Checkout
16 16
 {
17 17
 
18
-    /**
19
-     *    whether current request originated from the EE admin
20
-     *
21
-     * @type bool
22
-     */
23
-    public $admin_request = false;
24
-
25
-    /**
26
-     * whether returning to edit attendee information or to retry a payment
27
-     *
28
-     * @type bool
29
-     */
30
-    public $revisit = false;
31
-
32
-    /**
33
-     * whether the primary registrant is returning to edit attendee information or to retry a payment
34
-     *
35
-     * @type bool
36
-     */
37
-    public $primary_revisit = false;
38
-
39
-    /**
40
-     * is registration allowed to progress or halted for some reason such as failing to pass recaptcha?
41
-     *
42
-     * @type bool
43
-     */
44
-    public $continue_reg = true;
45
-
46
-    /**
47
-     * redirect to thank you page ?
48
-     *
49
-     * @type bool
50
-     */
51
-    public $redirect = false;
52
-
53
-    /**
54
-     * generate the reg form or not ?
55
-     *
56
-     * @type bool
57
-     */
58
-    public $generate_reg_form = true;
59
-
60
-    /**
61
-     * process a reg form submission or not ?
62
-     *
63
-     * @type bool
64
-     */
65
-    public $process_form_submission = false;
66
-
67
-    /**
68
-     * tracks whether the TXN status modified during this checkout
69
-     *
70
-     * @type bool
71
-     */
72
-    public $txn_status_updated = false;
73
-
74
-    /**
75
-     * only triggered to true after absolutely everything has finished.
76
-     *
77
-     * @type bool
78
-     */
79
-    protected $exit_spco = false;
80
-
81
-    /**
82
-     * tracks whether any of the TXN's Registrations statuses modified during this checkout
83
-     * indexed by registration ID
84
-     *
85
-     * @type array
86
-     */
87
-    protected $reg_status_updated = array();
88
-
89
-    /**
90
-     * timestamp when redirected from Ticket Selector to the checkout
91
-     *
92
-     * @type int
93
-     */
94
-    public $uts = 0;
95
-
96
-    /**
97
-     * total number of tickets that were in the cart
98
-     *
99
-     * @type int
100
-     */
101
-    public $total_ticket_count = 0;
102
-
103
-    /**
104
-     * corresponds loosely to EE_Transaction::remaining()
105
-     * but can be modified by SPCO
106
-     *
107
-     * @type float
108
-     */
109
-    public $amount_owing = 0;
110
-
111
-    /**
112
-     * the reg step slug from the incoming request
113
-     *
114
-     * @type string
115
-     */
116
-    public $step = '';
117
-
118
-    /**
119
-     * the reg step slug for a step being edited
120
-     *
121
-     * @type string
122
-     */
123
-    public $edit_step = '';
124
-
125
-    /**
126
-     * the action being performed on the current step
127
-     *
128
-     * @type string
129
-     */
130
-    public $action = '';
131
-
132
-    /**
133
-     * reg_url_link for a previously saved registration
134
-     *
135
-     * @type string
136
-     */
137
-    public $reg_url_link = '';
138
-
139
-    /**
140
-     * string slug for the payment method that was selected during the payment options step
141
-     *
142
-     * @type string
143
-     */
144
-    public $selected_method_of_payment = '';
145
-
146
-    /**
147
-     * base url for the site's registration checkout page - additional url params will be added to this
148
-     *
149
-     * @type string
150
-     */
151
-    public $reg_page_base_url = '';
152
-
153
-    /**
154
-     * base url for the site's registration cancelled page - additional url params will be added to this
155
-     *
156
-     * @type string
157
-     */
158
-    public $cancel_page_url = '';
159
-
160
-    /**
161
-     * base url for the site's thank you page - additional url params will be added to this
162
-     *
163
-     * @type string
164
-     */
165
-    public $thank_you_page_url = '';
166
-
167
-    /**
168
-     * base url for any redirects - additional url params will be added to this
169
-     *
170
-     * @type string
171
-     */
172
-    public $redirect_url = '';
173
-
174
-    /**
175
-     * form of POST data for use with off-site gateways
176
-     *
177
-     * @type string
178
-     */
179
-    public $redirect_form = '';
180
-
181
-    /**
182
-     * array of query where params to use when retrieving cached registrations from $this->checkout->transaction
183
-     *
184
-     * @type array
185
-     */
186
-    public $reg_cache_where_params = array();
187
-
188
-    /**
189
-     * a class for managing and creating the JSON encoded array of data that gets passed back to the client during AJAX
190
-     * requests
191
-     *
192
-     * @type EE_SPCO_JSON_Response
193
-     */
194
-    public $json_response;
195
-
196
-    /**
197
-     * where we are going next in the reg process
198
-     *
199
-     * @type EE_SPCO_Reg_Step
200
-     */
201
-    public $next_step;
202
-
203
-    /**
204
-     * where we are in the reg process
205
-     *
206
-     * @type EE_SPCO_Reg_Step
207
-     */
208
-    public $current_step;
209
-
210
-    /**
211
-     *    $_cart - the current cart object
212
-     *
213
-     * @var EE_CART
214
-     */
215
-    public $cart;
216
-
217
-    /**
218
-     *    $_transaction - the current transaction object
219
-     *
220
-     * @var EE_Transaction
221
-     */
222
-    public $transaction;
223
-
224
-    /**
225
-     *    the related attendee object for the primary registrant
226
-     *
227
-     * @type EE_Attendee
228
-     */
229
-    public $primary_attendee_obj;
230
-
231
-    /**
232
-     *    $payment_method - the payment method object for the selected method of payment
233
-     *
234
-     * @type EE_Payment_Method
235
-     */
236
-    public $payment_method;
237
-
238
-    /**
239
-     *    $payment - if a payment was successfully made during the reg process,
240
-     *    then here it is !!!
241
-     *
242
-     * @type EE_Payment
243
-     */
244
-    public $payment;
245
-
246
-    /**
247
-     *    if a payment method was selected that uses an on-site gateway, then this is the billing form
248
-     *
249
-     * @type EE_Billing_Info_Form | EE_Billing_Attendee_Info_Form
250
-     */
251
-    public $billing_form;
252
-
253
-    /**
254
-     *    the entire registration form composed of ALL of the subsections generated by the various reg steps
255
-     *
256
-     * @type EE_Form_Section_Proper
257
-     */
258
-    public $registration_form;
259
-
260
-    /**
261
-     * array of EE_SPCO_Reg_Step objects
262
-     *
263
-     * @type EE_SPCO_Reg_Step[]
264
-     */
265
-    public $reg_steps = array();
266
-
267
-    /**
268
-     * array of EE_Payment_Method objects
269
-     *
270
-     * @type EE_Payment_Method[]
271
-     */
272
-    public $available_payment_methods = array();
273
-
274
-
275
-    /**
276
-     *    class constructor
277
-     *
278
-     * @access    public
279
-     */
280
-    public function __construct()
281
-    {
282
-        $this->reg_page_base_url = EE_Registry::instance()->CFG->core->reg_page_url();
283
-        $this->thank_you_page_url = EE_Registry::instance()->CFG->core->thank_you_page_url();
284
-        $this->cancel_page_url = EE_Registry::instance()->CFG->core->cancel_page_url();
285
-        $this->continue_reg = apply_filters('FHEE__EE_Checkout___construct___continue_reg', true);
286
-        $this->admin_request = is_admin() && ! EE_Registry::instance()->REQ->ajax;
287
-        $this->reg_cache_where_params = array(
288
-            0          => array('REG_deleted' => false),
289
-            'order_by' => array('REG_count' => 'ASC'),
290
-        );
291
-    }
292
-
293
-
294
-    /**
295
-     * returns true if ANY reg status was updated during checkout
296
-     *
297
-     * @return boolean
298
-     */
299
-    public function any_reg_status_updated()
300
-    {
301
-        foreach ($this->reg_status_updated as $reg_status) {
302
-            if ($reg_status) {
303
-                return true;
304
-            }
305
-        }
306
-        return false;
307
-    }
308
-
309
-
310
-    /**
311
-     * @param $REG_ID
312
-     * @return boolean
313
-     */
314
-    public function reg_status_updated($REG_ID)
315
-    {
316
-        return isset($this->reg_status_updated[ $REG_ID ]) ? $this->reg_status_updated[ $REG_ID ] : false;
317
-    }
318
-
319
-
320
-    /**
321
-     * @param $REG_ID
322
-     * @param $reg_status
323
-     */
324
-    public function set_reg_status_updated($REG_ID, $reg_status)
325
-    {
326
-        $this->reg_status_updated[ $REG_ID ] = filter_var($reg_status, FILTER_VALIDATE_BOOLEAN);
327
-    }
328
-
329
-
330
-    /**
331
-     * exit_spco
332
-     *
333
-     * @return bool
334
-     */
335
-    public function exit_spco()
336
-    {
337
-        return $this->exit_spco;
338
-    }
339
-
340
-
341
-    /**
342
-     * set_exit_spco
343
-     * can ONLY be set by the  Finalize_Registration reg step
344
-     */
345
-    public function set_exit_spco()
346
-    {
347
-        if ($this->current_step instanceof EE_SPCO_Reg_Step_Finalize_Registration) {
348
-            $this->exit_spco = true;
349
-        }
350
-    }
351
-
352
-
353
-    /**
354
-     *    reset_for_current_request
355
-     *
356
-     * @access    public
357
-     * @return    void
358
-     */
359
-    public function reset_for_current_request()
360
-    {
361
-        $this->process_form_submission = false;
362
-        $this->continue_reg = apply_filters('FHEE__EE_Checkout___construct___continue_reg', true);
363
-        $this->admin_request = is_admin() && ! EE_Registry::instance()->REQ->front_ajax;
364
-        $this->continue_reg = true;
365
-        $this->redirect = false;
366
-        // don't reset the cached redirect form if we're about to be asked to display it !!!
367
-        if (EE_Registry::instance()->REQ->get('action', 'display_spco_reg_step') !== 'redirect_form') {
368
-            $this->redirect_form = '';
369
-        }
370
-        $this->redirect_url = '';
371
-        $this->json_response = new EE_SPCO_JSON_Response();
372
-        EE_Form_Section_Proper::reset_js_localization();
373
-    }
374
-
375
-
376
-    /**
377
-     *    add_reg_step
378
-     *
379
-     * @access    public
380
-     * @param EE_SPCO_Reg_Step $reg_step_obj
381
-     * @return    void
382
-     */
383
-    public function add_reg_step(EE_SPCO_Reg_Step $reg_step_obj)
384
-    {
385
-        $this->reg_steps[ $reg_step_obj->slug() ] = $reg_step_obj;
386
-    }
387
-
388
-
389
-    /**
390
-     * skip_reg_step
391
-     * if the current reg step does not need to run for some reason,
392
-     * then this will advance SPCO to the next reg step,
393
-     * and mark the skipped step as completed
394
-     *
395
-     * @access    public
396
-     * @param string $reg_step_slug
397
-     * @return    void
398
-     * @throws \EE_Error
399
-     */
400
-    public function skip_reg_step($reg_step_slug = '')
401
-    {
402
-        $step_to_skip = $this->find_reg_step($reg_step_slug);
403
-        if ($step_to_skip instanceof EE_SPCO_Reg_Step && $step_to_skip->is_current_step()) {
404
-            $step_to_skip->set_is_current_step(false);
405
-            $step_to_skip->set_completed();
406
-            // advance to the next step
407
-            $this->set_current_step($this->next_step->slug());
408
-            // also reset the step param in the request in case any other code references that directly
409
-            EE_Registry::instance()->REQ->set('step', $this->current_step->slug());
410
-            // since we are skipping a step and setting the current step to be what was previously the next step,
411
-            // we need to check that the next step is now correct, and not still set to the current step.
412
-            if ($this->current_step->slug() === $this->next_step->slug()) {
413
-                // correctly setup the next step
414
-                $this->set_next_step();
415
-            }
416
-            $this->set_reg_step_initiated($this->current_step);
417
-        }
418
-    }
419
-
420
-
421
-    /**
422
-     *    remove_reg_step
423
-     *
424
-     * @access    public
425
-     * @param string $reg_step_slug
426
-     * @param bool   $reset whether to reset reg steps after removal
427
-     * @throws EE_Error
428
-     */
429
-    public function remove_reg_step($reg_step_slug = '', $reset = true)
430
-    {
431
-        unset($this->reg_steps[ $reg_step_slug ]);
432
-        if ($this->transaction instanceof EE_Transaction) {
433
-            // now remove reg step from TXN and save
434
-            $this->transaction->remove_reg_step($reg_step_slug);
435
-            $this->transaction->save();
436
-        }
437
-        if ($reset) {
438
-            $this->reset_reg_steps();
439
-        }
440
-    }
441
-
442
-
443
-    /**
444
-     *    set_reg_step_order
445
-     *
446
-     * @access    public
447
-     * @param string $reg_step_slug
448
-     * @param int    $order
449
-     * @return    void
450
-     */
451
-    public function set_reg_step_order($reg_step_slug = '', $order = 100)
452
-    {
453
-        if (isset($this->reg_steps[ $reg_step_slug ])) {
454
-            $this->reg_steps[ $reg_step_slug ]->set_order($order);
455
-        }
456
-    }
457
-
458
-
459
-    /**
460
-     *    set_current_step
461
-     *
462
-     * @access    public
463
-     * @param string $current_step
464
-     * @return    void
465
-     */
466
-    public function set_current_step($current_step)
467
-    {
468
-        // grab what step we're on
469
-        $this->current_step = isset($this->reg_steps[ $current_step ])
470
-            ? $this->reg_steps[ $current_step ]
471
-            : reset(
472
-                $this->reg_steps
473
-            );
474
-        // verify instance
475
-        if ($this->current_step instanceof EE_SPCO_Reg_Step) {
476
-            // we don't want to repeat completed steps if this is the first time through SPCO
477
-            if ($this->continue_reg && ! $this->revisit && $this->current_step->completed()) {
478
-                // so advance to the next step
479
-                $this->set_next_step();
480
-                if ($this->next_step instanceof EE_SPCO_Reg_Step) {
481
-                    // and attempt to set it as the current step
482
-                    $this->set_current_step($this->next_step->slug());
483
-                }
484
-                return;
485
-            }
486
-            $this->current_step->set_is_current_step(true);
487
-        } else {
488
-            EE_Error::add_error(
489
-                __('The current step could not be set.', 'event_espresso'),
490
-                __FILE__,
491
-                __FUNCTION__,
492
-                __LINE__
493
-            );
494
-        }
495
-    }
496
-
497
-
498
-    /**
499
-     *    set_next_step
500
-     * advances the reg_steps array pointer and sets the next step, then reverses pointer back to the current step
501
-     *
502
-     * @access    public
503
-     * @return    void
504
-     */
505
-    public function set_next_step()
506
-    {
507
-        // set pointer to start of array
508
-        reset($this->reg_steps);
509
-        // if there is more than one step
510
-        if (count($this->reg_steps) > 1) {
511
-            // advance to the current step and set pointer
512
-            while (key($this->reg_steps) !== $this->current_step->slug() && key($this->reg_steps) !== '') {
513
-                next($this->reg_steps);
514
-            }
515
-        }
516
-        // advance one more spot ( if it exists )
517
-        $this->next_step = next($this->reg_steps);
518
-        // verify instance
519
-        $this->next_step = $this->next_step instanceof EE_SPCO_Reg_Step ? $this->next_step : null;
520
-        // then back to current step to reset
521
-        prev($this->reg_steps);
522
-    }
523
-
524
-
525
-    /**
526
-     *    get_next_reg_step
527
-     *    this simply returns the next step from reg_steps array
528
-     *
529
-     * @access    public
530
-     * @return    EE_SPCO_Reg_Step | null
531
-     */
532
-    public function get_next_reg_step()
533
-    {
534
-        $next = next($this->reg_steps);
535
-        prev($this->reg_steps);
536
-        return $next instanceof EE_SPCO_Reg_Step ? $next : null;
537
-    }
538
-
539
-
540
-    /**
541
-     * get_prev_reg_step
542
-     *    this simply returns the previous step from reg_steps array
543
-     *
544
-     * @access    public
545
-     * @return    EE_SPCO_Reg_Step | null
546
-     */
547
-    public function get_prev_reg_step()
548
-    {
549
-        $prev = prev($this->reg_steps);
550
-        next($this->reg_steps);
551
-        return $prev instanceof EE_SPCO_Reg_Step ? $prev : null;
552
-    }
553
-
554
-
555
-    /**
556
-     * sort_reg_steps
557
-     *
558
-     * @access public
559
-     * @return void
560
-     */
561
-    public function sort_reg_steps()
562
-    {
563
-        $reg_step_sorting_callback = apply_filters(
564
-            'FHEE__EE_Checkout__sort_reg_steps__reg_step_sorting_callback',
565
-            'reg_step_sorting_callback'
566
-        );
567
-        uasort($this->reg_steps, array($this, $reg_step_sorting_callback));
568
-    }
569
-
570
-
571
-    /**
572
-     * find_reg_step
573
-     * finds a reg step by the given slug
574
-     *
575
-     * @access    public
576
-     * @param string $reg_step_slug
577
-     * @return EE_SPCO_Reg_Step|null
578
-     */
579
-    public function find_reg_step($reg_step_slug = '')
580
-    {
581
-        if (! empty($reg_step_slug)) {
582
-            // copy reg step array
583
-            $reg_steps = $this->reg_steps;
584
-            // set pointer to start of array
585
-            reset($reg_steps);
586
-            // if there is more than one step
587
-            if (count($reg_steps) > 1) {
588
-                // advance to the current step and set pointer
589
-                while (key($reg_steps) !== $reg_step_slug && key($reg_steps) !== '') {
590
-                    next($reg_steps);
591
-                }
592
-                return current($reg_steps);
593
-            }
594
-        }
595
-        return null;
596
-    }
597
-
598
-
599
-    /**
600
-     * reg_step_sorting_callback
601
-     *
602
-     * @access public
603
-     * @param EE_SPCO_Reg_Step $reg_step_A
604
-     * @param EE_SPCO_Reg_Step $reg_step_B
605
-     * @return int
606
-     */
607
-    public function reg_step_sorting_callback(EE_SPCO_Reg_Step $reg_step_A, EE_SPCO_Reg_Step $reg_step_B)
608
-    {
609
-        // send finalize_registration step to the end of the array
610
-        if ($reg_step_A->slug() === 'finalize_registration') {
611
-            return 1;
612
-        } elseif ($reg_step_B->slug() === 'finalize_registration') {
613
-            return -1;
614
-        }
615
-        if ($reg_step_A->order() === $reg_step_B->order()) {
616
-            return 0;
617
-        }
618
-        return ($reg_step_A->order() > $reg_step_B->order()) ? 1 : -1;
619
-    }
620
-
621
-
622
-    /**
623
-     * set_reg_step_initiated
624
-     *
625
-     * @access    public
626
-     * @param    EE_SPCO_Reg_Step $reg_step
627
-     * @throws \EE_Error
628
-     */
629
-    public function set_reg_step_initiated(EE_SPCO_Reg_Step $reg_step)
630
-    {
631
-        // call set_reg_step_initiated ???
632
-        if (// first time visiting SPCO ?
633
-            ! $this->revisit
634
-            && (
635
-                // and displaying the reg step form for the first time ?
636
-                $this->action === 'display_spco_reg_step'
637
-                // or initializing the final step
638
-                || $reg_step instanceof EE_SPCO_Reg_Step_Finalize_Registration
639
-            )
640
-        ) {
641
-            // set the start time for this reg step
642
-            if (! $this->transaction->set_reg_step_initiated($reg_step->slug())) {
643
-                if (WP_DEBUG) {
644
-                    EE_Error::add_error(
645
-                        sprintf(
646
-                            __('The "%1$s" registration step was not initialized properly.', 'event_espresso'),
647
-                            $reg_step->name()
648
-                        ),
649
-                        __FILE__,
650
-                        __FUNCTION__,
651
-                        __LINE__
652
-                    );
653
-                }
654
-            }
655
-        }
656
-    }
657
-
658
-
659
-    /**
660
-     *    set_reg_step_JSON_info
661
-     *
662
-     * @access public
663
-     * @return    void
664
-     */
665
-    public function set_reg_step_JSON_info()
666
-    {
667
-        EE_Registry::$i18n_js_strings['reg_steps'] = array();
668
-        // pass basic reg step data to JS
669
-        foreach ($this->reg_steps as $reg_step) {
670
-            EE_Registry::$i18n_js_strings['reg_steps'][] = $reg_step->slug();
671
-        }
672
-        // reset reg step html
673
-        // $this->json_response->set_reg_step_html('');
674
-    }
675
-
676
-
677
-    /**
678
-     *    reset_reg_steps
679
-     *
680
-     * @access public
681
-     * @return void
682
-     */
683
-    public function reset_reg_steps()
684
-    {
685
-        $this->sort_reg_steps();
686
-        $this->set_current_step(EE_Registry::instance()->REQ->get('step'));
687
-        $this->set_next_step();
688
-        // the text that appears on the reg step form submit button
689
-        $this->current_step->set_submit_button_text();
690
-        $this->set_reg_step_JSON_info();
691
-    }
692
-
693
-
694
-    /**
695
-     *    get_registration_time_limit
696
-     *
697
-     * @access    public
698
-     * @return        string
699
-     */
700
-    public function get_registration_time_limit()
701
-    {
702
-
703
-        $registration_time_limit = (float) (EE_Registry::instance()->SSN->expiration() - time());
704
-        $time_limit_format = $registration_time_limit > 60 * MINUTE_IN_SECONDS ? 'H:i:s' : 'i:s';
705
-        $registration_time_limit = date($time_limit_format, $registration_time_limit);
706
-        return apply_filters(
707
-            'FHEE__EE_Checkout__get_registration_time_limit__registration_time_limit',
708
-            $registration_time_limit
709
-        );
710
-    }
711
-
712
-
713
-    /**
714
-     * payment_required
715
-     *
716
-     * @return boolean
717
-     */
718
-    public function payment_required()
719
-    {
720
-        // if NOT:
721
-        //     registration via admin
722
-        //      completed TXN
723
-        //      overpaid TXN
724
-        //      free TXN(total = 0.00)
725
-        //      then payment required is TRUE
726
-        return ! ($this->admin_request
727
-                  || $this->transaction->is_completed()
728
-                  || $this->transaction->is_overpaid()
729
-                  || $this->transaction->is_free()) ? true : false;
730
-    }
731
-
732
-
733
-    /**
734
-     * get_cart_for_transaction
735
-     *
736
-     * @access public
737
-     * @param EE_Transaction $transaction
738
-     * @return EE_Cart
739
-     */
740
-    public function get_cart_for_transaction($transaction)
741
-    {
742
-        $session = EE_Registry::instance()->load_core('Session');
743
-        $cart = $transaction instanceof EE_Transaction ? EE_Cart::get_cart_from_txn($transaction, $session) : null;
744
-        // verify cart
745
-        if (! $cart instanceof EE_Cart) {
746
-            $cart = EE_Registry::instance()->load_core('Cart');
747
-        }
748
-
749
-        return $cart;
750
-    }
751
-
752
-
753
-    /**
754
-     *    initialize_txn_reg_steps_array
755
-     *
756
-     * @access public
757
-     * @return    array
758
-     */
759
-    public function initialize_txn_reg_steps_array()
760
-    {
761
-        $txn_reg_steps_array = array();
762
-        foreach ($this->reg_steps as $reg_step) {
763
-            $txn_reg_steps_array[ $reg_step->slug() ] = false;
764
-        }
765
-        return $txn_reg_steps_array;
766
-    }
767
-
768
-
769
-    /**
770
-     *    update_txn_reg_steps_array
771
-     *
772
-     * @access public
773
-     * @return    bool
774
-     * @throws \EE_Error
775
-     */
776
-    public function update_txn_reg_steps_array()
777
-    {
778
-        $updated = false;
779
-        foreach ($this->reg_steps as $reg_step) {
780
-            if ($reg_step->completed()) {
781
-                $updated = $this->transaction->set_reg_step_completed($reg_step->slug())
782
-                    ? true
783
-                    : $updated;
784
-            }
785
-        }
786
-        if ($updated) {
787
-            $this->transaction->save();
788
-        }
789
-        return $updated;
790
-    }
791
-
792
-
793
-    /**
794
-     *    stash_transaction_and_checkout
795
-     *
796
-     * @access public
797
-     * @return    void
798
-     * @throws \EE_Error
799
-     */
800
-    public function stash_transaction_and_checkout()
801
-    {
802
-        if (! $this->revisit) {
803
-            $this->update_txn_reg_steps_array();
804
-        }
805
-        $this->track_transaction_and_registration_status_updates();
806
-        // save all data to the db, but suppress errors
807
-        // $this->save_all_data( FALSE );
808
-        // cache the checkout in the session
809
-        EE_Registry::instance()->SSN->set_checkout($this);
810
-    }
811
-
812
-
813
-    /**
814
-     *    track_transaction_and_registration_status_updates
815
-     *    stores whether any updates were made to the TXN or it's related registrations
816
-     *
817
-     * @access public
818
-     * @return void
819
-     * @throws \EE_Error
820
-     */
821
-    public function track_transaction_and_registration_status_updates()
822
-    {
823
-        // verify the transaction
824
-        if ($this->transaction instanceof EE_Transaction) {
825
-            // has there been a TXN status change during this checkout?
826
-            $this->txn_status_updated = $this->transaction->txn_status_updated();
827
-            /** @type EE_Registration_Processor $registration_processor */
828
-            $registration_processor = EE_Registry::instance()->load_class('Registration_Processor');
829
-            // grab the saved registrations from the transaction
830
-            foreach ($this->transaction->registrations($this->reg_cache_where_params) as $registration) {
831
-                if ($registration_processor->reg_status_updated($registration->ID())) {
832
-                    $this->set_reg_status_updated($registration->ID(), true);
833
-                }
834
-            }
835
-        }
836
-    }
837
-
838
-
839
-    /**
840
-     *    visit_allows_processing_of_this_registration
841
-     *    determines if the current SPCO visit should allow the passed EE_Registration to be used in processing.
842
-     *    one of the following conditions must be met:
843
-     *        EITHER:    A) first time thru SPCO -> process ALL registrations ( NOT a revisit )
844
-     *        OR :        B) primary registrant is editing info -> process ALL registrations ( primary_revisit )
845
-     *        OR :        C) another registrant is editing info -> ONLY process their registration ( revisit AND their
846
-     *        reg_url_link matches )
847
-     *
848
-     * @access public
849
-     * @param    EE_Registration $registration
850
-     * @return    bool
851
-     * @throws \EE_Error
852
-     */
853
-    public function visit_allows_processing_of_this_registration(EE_Registration $registration)
854
-    {
855
-        return ! $this->revisit
856
-               || $this->primary_revisit
857
-               || (
858
-                   $this->revisit && $this->reg_url_link === $registration->reg_url_link()
859
-               )
860
-            ? true
861
-            : false;
862
-    }
863
-
864
-
865
-    /**
866
-     *    _transaction_has_primary_registration
867
-     *
868
-     * @access        private
869
-     * @return        bool
870
-     */
871
-    public function transaction_has_primary_registrant()
872
-    {
873
-        return $this->primary_attendee_obj instanceof EE_Attendee ? true : false;
874
-    }
875
-
876
-
877
-    /**
878
-     *    save_all_data
879
-     *    simply loops through the current transaction and saves all data for each registration
880
-     *
881
-     * @access public
882
-     * @param bool $show_errors
883
-     * @return bool
884
-     * @throws \EE_Error
885
-     */
886
-    public function save_all_data($show_errors = true)
887
-    {
888
-        // verify the transaction
889
-        if ($this->transaction instanceof EE_Transaction) {
890
-            // save to ensure that TXN has ID
891
-            $this->transaction->save();
892
-            // grab the saved registrations from the transaction
893
-            foreach ($this->transaction->registrations($this->reg_cache_where_params) as $registration) {
894
-                $this->_save_registration($registration, $show_errors);
895
-            }
896
-        } else {
897
-            if ($show_errors) {
898
-                EE_Error::add_error(
899
-                    __(
900
-                        'A valid Transaction was not found when attempting to save your registration information.',
901
-                        'event_espresso'
902
-                    ),
903
-                    __FILE__,
904
-                    __FUNCTION__,
905
-                    __LINE__
906
-                );
907
-            }
908
-            return false;
909
-        }
910
-        return true;
911
-    }
912
-
913
-
914
-    /**
915
-     * _save_registration_attendee
916
-     *
917
-     * @param    EE_Registration $registration
918
-     * @param bool               $show_errors
919
-     * @return void
920
-     * @throws \EE_Error
921
-     */
922
-    private function _save_registration($registration, $show_errors = true)
923
-    {
924
-        // verify object
925
-        if ($registration instanceof EE_Registration) {
926
-            // should this registration be processed during this visit ?
927
-            if ($this->visit_allows_processing_of_this_registration($registration)) {
928
-                // set TXN ID
929
-                if (! $registration->transaction_ID()) {
930
-                    $registration->set_transaction_id($this->transaction->ID());
931
-                }
932
-                // verify and save the attendee
933
-                $this->_save_registration_attendee($registration, $show_errors);
934
-                // save answers to reg form questions
935
-                $this->_save_registration_answers($registration, $show_errors);
936
-                // save changes
937
-                $registration->save();
938
-                // update txn cache
939
-                if (! $this->transaction->update_cache_after_object_save('Registration', $registration)) {
940
-                    if ($show_errors) {
941
-                        EE_Error::add_error(
942
-                            __(
943
-                                'The newly saved Registration object could not be cached on the Transaction.',
944
-                                'event_espresso'
945
-                            ),
946
-                            __FILE__,
947
-                            __FUNCTION__,
948
-                            __LINE__
949
-                        );
950
-                    }
951
-                }
952
-            }
953
-        } else {
954
-            if ($show_errors) {
955
-                EE_Error::add_error(
956
-                    __(
957
-                        'An invalid Registration object was discovered when attempting to save your registration information.',
958
-                        'event_espresso'
959
-                    ),
960
-                    __FILE__,
961
-                    __FUNCTION__,
962
-                    __LINE__
963
-                );
964
-            }
965
-        }
966
-    }
967
-
968
-
969
-    /**
970
-     * _save_registration_attendee
971
-     *
972
-     * @param    EE_Registration $registration
973
-     * @param bool               $show_errors
974
-     * @return void
975
-     * @throws \EE_Error
976
-     */
977
-    private function _save_registration_attendee($registration, $show_errors = true)
978
-    {
979
-        if ($registration->attendee() instanceof EE_Attendee) {
980
-            // save so that ATT has ID
981
-            $registration->attendee()->save();
982
-            if (! $registration->update_cache_after_object_save('Attendee', $registration->attendee())) {
983
-                if ($show_errors) {
984
-                    EE_Error::add_error(
985
-                        __(
986
-                            'The newly saved Attendee object could not be cached on the registration.',
987
-                            'event_espresso'
988
-                        ),
989
-                        __FILE__,
990
-                        __FUNCTION__,
991
-                        __LINE__
992
-                    );
993
-                }
994
-            }
995
-        } else {
996
-            if ($show_errors) {
997
-                EE_Error::add_error(
998
-                    sprintf(
999
-                        '%1$s||%1$s $attendee = %2$s',
1000
-                        __(
1001
-                            'Either no Attendee information was found, or an invalid Attendee object was discovered when attempting to save your registration information.',
1002
-                            'event_espresso'
1003
-                        ),
1004
-                        var_export($registration->attendee(), true)
1005
-                    ),
1006
-                    __FILE__,
1007
-                    __FUNCTION__,
1008
-                    __LINE__
1009
-                );
1010
-            }
1011
-        }
1012
-    }
1013
-
1014
-
1015
-    /**
1016
-     * _save_question_answers
1017
-     *
1018
-     * @param    EE_Registration $registration
1019
-     * @param bool               $show_errors
1020
-     * @return void
1021
-     * @throws \EE_Error
1022
-     */
1023
-    private function _save_registration_answers($registration, $show_errors = true)
1024
-    {
1025
-        // now save the answers
1026
-        foreach ($registration->answers() as $cache_key => $answer) {
1027
-            // verify object
1028
-            if ($answer instanceof EE_Answer) {
1029
-                $answer->set_registration($registration->ID());
1030
-                $answer->save();
1031
-                if (! $registration->update_cache_after_object_save('Answer', $answer, $cache_key)) {
1032
-                    if ($show_errors) {
1033
-                        EE_Error::add_error(
1034
-                            __(
1035
-                                'The newly saved Answer object could not be cached on the registration.',
1036
-                                'event_espresso'
1037
-                            ),
1038
-                            __FILE__,
1039
-                            __FUNCTION__,
1040
-                            __LINE__
1041
-                        );
1042
-                    }
1043
-                }
1044
-            } else {
1045
-                if ($show_errors) {
1046
-                    EE_Error::add_error(
1047
-                        __(
1048
-                            'An invalid Answer object was discovered when attempting to save your registration information.',
1049
-                            'event_espresso'
1050
-                        ),
1051
-                        __FILE__,
1052
-                        __FUNCTION__,
1053
-                        __LINE__
1054
-                    );
1055
-                }
1056
-            }
1057
-        }
1058
-    }
1059
-
1060
-
1061
-    /**
1062
-     *    refresh_all_entities
1063
-     *   will either refresh the entity map with objects form the db or from the checkout cache
1064
-     *
1065
-     * @access public
1066
-     * @param bool $from_db
1067
-     * @return bool
1068
-     * @throws \EE_Error
1069
-     */
1070
-    public function refresh_all_entities($from_db = false)
1071
-    {
1072
-        $from_db = $this->current_step->is_final_step() || $this->action === 'process_gateway_response'
1073
-            ? true
1074
-            : $from_db;
1075
-        // $this->log(
1076
-        //     __CLASS__,
1077
-        //     __FUNCTION__,
1078
-        //     __LINE__,
1079
-        //     array('from_db' => $from_db)
1080
-        // );
1081
-        return $from_db ? $this->refresh_from_db() : $this->refresh_entity_map();
1082
-    }
1083
-
1084
-
1085
-    /**
1086
-     *  refresh_entity_map
1087
-     *  simply loops through the current transaction and updates each
1088
-     *  model's entity map using EEM_Base::refresh_entity_map_from_db()
1089
-     *
1090
-     * @access public
1091
-     * @return bool
1092
-     * @throws \EE_Error
1093
-     */
1094
-    protected function refresh_from_db()
1095
-    {
1096
-        // verify the transaction
1097
-        if ($this->transaction instanceof EE_Transaction && $this->transaction->ID()) {
1098
-            // pull fresh TXN data from the db
1099
-            $this->transaction = $this->transaction->get_model()->refresh_entity_map_from_db($this->transaction->ID());
1100
-            // update EE_Checkout's cached primary_attendee object
1101
-            $this->primary_attendee_obj = $this->_refresh_primary_attendee_obj_from_db($this->transaction);
1102
-            // update EE_Checkout's cached payment object
1103
-            $payment = $this->transaction->last_payment();
1104
-            $this->payment = $payment instanceof EE_Payment ? $payment : $this->payment;
1105
-            // update EE_Checkout's cached payment_method object
1106
-            $payment_method = $this->payment instanceof EE_Payment ? $this->payment->payment_method() : null;
1107
-            $this->payment_method = $payment_method instanceof EE_Payment_Method ? $payment_method
1108
-                : $this->payment_method;
1109
-            // now refresh the cart, based on the TXN
1110
-            $this->cart = $this->get_cart_for_transaction($this->transaction);
1111
-        } else {
1112
-            EE_Error::add_error(
1113
-                __(
1114
-                    'A valid Transaction was not found when attempting to update the model entity mapper.',
1115
-                    'event_espresso'
1116
-                ),
1117
-                __FILE__,
1118
-                __FUNCTION__,
1119
-                __LINE__
1120
-            );
1121
-            return false;
1122
-        }
1123
-        return true;
1124
-    }
1125
-
1126
-
1127
-    /**
1128
-     * _refresh_primary_attendee_obj_from_db
1129
-     *
1130
-     * @param   EE_Transaction $transaction
1131
-     * @return  EE_Attendee | null
1132
-     * @throws \EE_Error
1133
-     */
1134
-    protected function _refresh_primary_attendee_obj_from_db(EE_Transaction $transaction)
1135
-    {
1136
-
1137
-        $primary_attendee_obj = null;
1138
-        // grab the saved registrations from the transaction
1139
-        foreach ($transaction->registrations($this->reg_cache_where_params, true) as $registration) {
1140
-            // verify object
1141
-            if ($registration instanceof EE_Registration) {
1142
-                $attendee = $registration->attendee();
1143
-                // verify object && maybe cache primary_attendee_obj ?
1144
-                if ($attendee instanceof EE_Attendee && $registration->is_primary_registrant()) {
1145
-                    $primary_attendee_obj = $attendee;
1146
-                }
1147
-            } else {
1148
-                EE_Error::add_error(
1149
-                    __(
1150
-                        'An invalid Registration object was discovered when attempting to update the model entity mapper.',
1151
-                        'event_espresso'
1152
-                    ),
1153
-                    __FILE__,
1154
-                    __FUNCTION__,
1155
-                    __LINE__
1156
-                );
1157
-            }
1158
-        }
1159
-        return $primary_attendee_obj;
1160
-    }
1161
-
1162
-
1163
-    /**
1164
-     *  refresh_entity_map
1165
-     *  simply loops through the current transaction and updates
1166
-     *  each model's entity map using EEM_Base::refresh_entity_map_with()
1167
-     *
1168
-     * @access public
1169
-     * @return bool
1170
-     * @throws \EE_Error
1171
-     */
1172
-    protected function refresh_entity_map()
1173
-    {
1174
-        // verify the transaction
1175
-        if ($this->transaction instanceof EE_Transaction && $this->transaction->ID()) {
1176
-            // never cache payment info
1177
-            $this->transaction->clear_cache('Payment');
1178
-            // is the Payment Options Reg Step completed ?
1179
-            if ($this->transaction->reg_step_completed('payment_options')) {
1180
-                // then check for payments and update TXN accordingly
1181
-                /** @type EE_Transaction_Payments $transaction_payments */
1182
-                $transaction_payments = EE_Registry::instance()->load_class('Transaction_Payments');
1183
-                $transaction_payments->calculate_total_payments_and_update_status($this->transaction);
1184
-            }
1185
-            // grab the saved registrations from the transaction
1186
-            foreach ($this->transaction->registrations($this->reg_cache_where_params) as $reg_cache_ID => $registration) {
1187
-                $this->_refresh_registration($reg_cache_ID, $registration);
1188
-            }
1189
-            // make sure our cached TXN is added to the model entity mapper
1190
-            $this->transaction = $this->transaction->get_model()->refresh_entity_map_with(
1191
-                $this->transaction->ID(),
1192
-                $this->transaction
1193
-            );
1194
-        } else {
1195
-            EE_Error::add_error(
1196
-                __(
1197
-                    'A valid Transaction was not found when attempting to update the model entity mapper.',
1198
-                    'event_espresso'
1199
-                ),
1200
-                __FILE__,
1201
-                __FUNCTION__,
1202
-                __LINE__
1203
-            );
1204
-            return false;
1205
-        }
1206
-        // verify and update the cart because inaccurate totals are not so much fun
1207
-        if ($this->cart instanceof EE_Cart) {
1208
-            $grand_total = $this->cart->get_grand_total();
1209
-            if ($grand_total instanceof EE_Line_Item && $grand_total->ID()) {
1210
-                $grand_total->recalculate_total_including_taxes();
1211
-                $grand_total = $grand_total->get_model()->refresh_entity_map_with(
1212
-                    $this->cart->get_grand_total()->ID(),
1213
-                    $this->cart->get_grand_total()
1214
-                );
1215
-            }
1216
-            if ($grand_total instanceof EE_Line_Item) {
1217
-                $this->cart = EE_Cart::instance($grand_total);
1218
-            } else {
1219
-                EE_Error::add_error(
1220
-                    __(
1221
-                        'A valid Cart was not found when attempting to update the model entity mapper.',
1222
-                        'event_espresso'
1223
-                    ),
1224
-                    __FILE__,
1225
-                    __FUNCTION__,
1226
-                    __LINE__
1227
-                );
1228
-                return false;
1229
-            }
1230
-        }
1231
-        return true;
1232
-    }
1233
-
1234
-
1235
-    /**
1236
-     * _refresh_registration
1237
-     *
1238
-     * @param    string | int    $reg_cache_ID
1239
-     * @param    EE_Registration $registration
1240
-     * @return void
1241
-     * @throws \EE_Error
1242
-     */
1243
-    protected function _refresh_registration($reg_cache_ID, $registration)
1244
-    {
1245
-
1246
-        // verify object
1247
-        if ($registration instanceof EE_Registration) {
1248
-            // update the entity mapper attendee
1249
-            $this->_refresh_registration_attendee($registration);
1250
-            // update the entity mapper answers for reg form questions
1251
-            $this->_refresh_registration_answers($registration);
1252
-            // make sure the cached registration is added to the model entity mapper
1253
-            $registration->get_model()->refresh_entity_map_with($reg_cache_ID, $registration);
1254
-        } else {
1255
-            EE_Error::add_error(
1256
-                __(
1257
-                    'An invalid Registration object was discovered when attempting to update the model entity mapper.',
1258
-                    'event_espresso'
1259
-                ),
1260
-                __FILE__,
1261
-                __FUNCTION__,
1262
-                __LINE__
1263
-            );
1264
-        }
1265
-    }
1266
-
1267
-
1268
-    /**
1269
-     * _save_registration_attendee
1270
-     *
1271
-     * @param    EE_Registration $registration
1272
-     * @return void
1273
-     * @throws \EE_Error
1274
-     */
1275
-    protected function _refresh_registration_attendee($registration)
1276
-    {
1277
-
1278
-        $attendee = $registration->attendee();
1279
-        // verify object
1280
-        if ($attendee instanceof EE_Attendee && $attendee->ID()) {
1281
-            // make sure the cached attendee is added to the model entity mapper
1282
-            $registration->attendee()->get_model()->refresh_entity_map_with($attendee->ID(), $attendee);
1283
-            // maybe cache primary_attendee_obj ?
1284
-            if ($registration->is_primary_registrant()) {
1285
-                $this->primary_attendee_obj = $attendee;
1286
-            }
1287
-        }
1288
-    }
1289
-
1290
-
1291
-    /**
1292
-     * _refresh_registration_answers
1293
-     *
1294
-     * @param    EE_Registration $registration
1295
-     * @return void
1296
-     * @throws \EE_Error
1297
-     */
1298
-    protected function _refresh_registration_answers($registration)
1299
-    {
1300
-
1301
-        // now update the answers
1302
-        foreach ($registration->answers() as $cache_key => $answer) {
1303
-            // verify object
1304
-            if ($answer instanceof EE_Answer) {
1305
-                if ($answer->ID()) {
1306
-                    // make sure the cached answer is added to the model entity mapper
1307
-                    $answer->get_model()->refresh_entity_map_with($answer->ID(), $answer);
1308
-                }
1309
-            } else {
1310
-                EE_Error::add_error(
1311
-                    __(
1312
-                        'An invalid Answer object was discovered when attempting to update the model entity mapper.',
1313
-                        'event_espresso'
1314
-                    ),
1315
-                    __FILE__,
1316
-                    __FUNCTION__,
1317
-                    __LINE__
1318
-                );
1319
-            }
1320
-        }
1321
-    }
1322
-
1323
-
1324
-    /**
1325
-     *    __sleep
1326
-     * to conserve db space, let's remove the reg_form and the EE_Checkout object from EE_SPCO_Reg_Step objects upon
1327
-     * serialization EE_Checkout will handle the reimplementation of itself upon waking, but we won't bother with the
1328
-     * reg form, because if needed, it will be regenerated anyways
1329
-     *
1330
-     * @return array
1331
-     * @throws \EE_Error
1332
-     */
1333
-    public function __sleep()
1334
-    {
1335
-        if ($this->primary_attendee_obj instanceof EE_Attendee && $this->primary_attendee_obj->ID()) {
1336
-            $this->primary_attendee_obj = $this->primary_attendee_obj->ID();
1337
-        }        // remove the reg form and the checkout
1338
-        if ($this->transaction instanceof EE_Transaction && $this->transaction->ID()) {
1339
-            $this->transaction = $this->transaction->ID();
1340
-        }        // remove the reg form and the checkout
1341
-        return array_diff(array_keys(get_object_vars($this)), array('billing_form', 'registration_form'));
1342
-    }
1343
-
1344
-
1345
-    /**
1346
-     *    __wakeup
1347
-     * to conserve db space, we are removing the EE_Checkout object from EE_SPCO_Reg_Step objects upon serialization
1348
-     * this will reinstate the EE_Checkout object on each EE_SPCO_Reg_Step object
1349
-     */
1350
-    public function __wakeup()
1351
-    {
1352
-        if (! $this->primary_attendee_obj instanceof EE_Attendee && absint($this->primary_attendee_obj) !== 0) {
1353
-            // $this->primary_attendee_obj is actually just an ID, so use it to get the object from the db
1354
-            $this->primary_attendee_obj = EEM_Attendee::instance()->get_one_by_ID($this->primary_attendee_obj);
1355
-        }
1356
-        if (! $this->transaction instanceof EE_Transaction && absint($this->transaction) !== 0) {
1357
-            // $this->transaction is actually just an ID, so use it to get the object from the db
1358
-            $this->transaction = EEM_Transaction::instance()->get_one_by_ID($this->transaction);
1359
-        }
1360
-        foreach ($this->reg_steps as $reg_step) {
1361
-            $reg_step->checkout = $this;
1362
-        }
1363
-    }
1364
-
1365
-
1366
-    /**
1367
-     * debug
1368
-     *
1369
-     * @param string $class
1370
-     * @param string $func
1371
-     * @param string $line
1372
-     * @param array  $info
1373
-     * @param bool   $display_request
1374
-     * @throws \EE_Error
1375
-     */
1376
-    public function log($class = '', $func = '', $line = '', $info = array(), $display_request = false)
1377
-    {
1378
-        $disabled = true;
1379
-        if (WP_DEBUG && ! $disabled) {
1380
-            $debug_data = get_option('EE_DEBUG_SPCO_' . EE_Session::instance()->id(), array());
1381
-            $default_data = array(
1382
-                $class                    => $func . '() : ' . $line,
1383
-                'request->step'           => $this->step,
1384
-                'request->action'         => $this->action,
1385
-                'current_step->slug'      => $this->current_step instanceof EE_SPCO_Reg_Step ?
1386
-                    $this->current_step->slug() : '',
1387
-                'current_step->completed' => $this->current_step instanceof EE_SPCO_Reg_Step ?
1388
-                    $this->current_step->completed() : '',
1389
-                'txn_status_updated'      => $this->transaction->txn_status_updated(),
1390
-                'reg_status_updated'      => $this->reg_status_updated,
1391
-                'reg_url_link'            => $this->reg_url_link,
1392
-                'REQ'                     => $display_request ? $_REQUEST : '',
1393
-            );
1394
-            if ($this->transaction instanceof EE_Transaction) {
1395
-                $default_data['TXN_status'] = $this->transaction->status_ID();
1396
-                $default_data['TXN_reg_steps'] = $this->transaction->reg_steps();
1397
-                foreach ($this->transaction->registrations($this->reg_cache_where_params) as $REG_ID => $registration) {
1398
-                    $default_data['registrations'][ $REG_ID ] = $registration->status_ID();
1399
-                }
1400
-                if ($this->transaction->ID()) {
1401
-                    $TXN_ID = 'EE_Transaction: ' . $this->transaction->ID();
1402
-                    // don't serialize objects
1403
-                    $info = $this->_strip_objects($info);
1404
-                    if (! isset($debug_data[ $TXN_ID ])) {
1405
-                        $debug_data[ $TXN_ID ] = array();
1406
-                    }
1407
-                    $debug_data[ $TXN_ID ][ microtime() ] = array_merge(
1408
-                        $default_data,
1409
-                        $info
1410
-                    );
1411
-                    update_option('EE_DEBUG_SPCO_' . EE_Session::instance()->id(), $debug_data);
1412
-                }
1413
-            }
1414
-        }
1415
-    }
1416
-
1417
-
1418
-    /**
1419
-     * _strip_objects
1420
-     *
1421
-     * @param array $info
1422
-     * @return array
1423
-     */
1424
-    public function _strip_objects($info = array())
1425
-    {
1426
-        foreach ((array) $info as $key => $value) {
1427
-            if (is_array($value)) {
1428
-                $info[ $key ] = $this->_strip_objects($value);
1429
-            } elseif (is_object($value)) {
1430
-                $object_class = get_class($value);
1431
-                $info[ $object_class ] = array();
1432
-                $info[ $object_class ]['ID'] = method_exists($value, 'ID') ? $value->ID() : 0;
1433
-                if (method_exists($value, 'status')) {
1434
-                    $info[ $object_class ]['status'] = $value->status();
1435
-                } elseif (method_exists($value, 'status_ID')) {
1436
-                    $info[ $object_class ]['status'] = $value->status_ID();
1437
-                }
1438
-                unset($info[ $key ]);
1439
-            }
1440
-        }
1441
-        return (array) $info;
1442
-    }
18
+	/**
19
+	 *    whether current request originated from the EE admin
20
+	 *
21
+	 * @type bool
22
+	 */
23
+	public $admin_request = false;
24
+
25
+	/**
26
+	 * whether returning to edit attendee information or to retry a payment
27
+	 *
28
+	 * @type bool
29
+	 */
30
+	public $revisit = false;
31
+
32
+	/**
33
+	 * whether the primary registrant is returning to edit attendee information or to retry a payment
34
+	 *
35
+	 * @type bool
36
+	 */
37
+	public $primary_revisit = false;
38
+
39
+	/**
40
+	 * is registration allowed to progress or halted for some reason such as failing to pass recaptcha?
41
+	 *
42
+	 * @type bool
43
+	 */
44
+	public $continue_reg = true;
45
+
46
+	/**
47
+	 * redirect to thank you page ?
48
+	 *
49
+	 * @type bool
50
+	 */
51
+	public $redirect = false;
52
+
53
+	/**
54
+	 * generate the reg form or not ?
55
+	 *
56
+	 * @type bool
57
+	 */
58
+	public $generate_reg_form = true;
59
+
60
+	/**
61
+	 * process a reg form submission or not ?
62
+	 *
63
+	 * @type bool
64
+	 */
65
+	public $process_form_submission = false;
66
+
67
+	/**
68
+	 * tracks whether the TXN status modified during this checkout
69
+	 *
70
+	 * @type bool
71
+	 */
72
+	public $txn_status_updated = false;
73
+
74
+	/**
75
+	 * only triggered to true after absolutely everything has finished.
76
+	 *
77
+	 * @type bool
78
+	 */
79
+	protected $exit_spco = false;
80
+
81
+	/**
82
+	 * tracks whether any of the TXN's Registrations statuses modified during this checkout
83
+	 * indexed by registration ID
84
+	 *
85
+	 * @type array
86
+	 */
87
+	protected $reg_status_updated = array();
88
+
89
+	/**
90
+	 * timestamp when redirected from Ticket Selector to the checkout
91
+	 *
92
+	 * @type int
93
+	 */
94
+	public $uts = 0;
95
+
96
+	/**
97
+	 * total number of tickets that were in the cart
98
+	 *
99
+	 * @type int
100
+	 */
101
+	public $total_ticket_count = 0;
102
+
103
+	/**
104
+	 * corresponds loosely to EE_Transaction::remaining()
105
+	 * but can be modified by SPCO
106
+	 *
107
+	 * @type float
108
+	 */
109
+	public $amount_owing = 0;
110
+
111
+	/**
112
+	 * the reg step slug from the incoming request
113
+	 *
114
+	 * @type string
115
+	 */
116
+	public $step = '';
117
+
118
+	/**
119
+	 * the reg step slug for a step being edited
120
+	 *
121
+	 * @type string
122
+	 */
123
+	public $edit_step = '';
124
+
125
+	/**
126
+	 * the action being performed on the current step
127
+	 *
128
+	 * @type string
129
+	 */
130
+	public $action = '';
131
+
132
+	/**
133
+	 * reg_url_link for a previously saved registration
134
+	 *
135
+	 * @type string
136
+	 */
137
+	public $reg_url_link = '';
138
+
139
+	/**
140
+	 * string slug for the payment method that was selected during the payment options step
141
+	 *
142
+	 * @type string
143
+	 */
144
+	public $selected_method_of_payment = '';
145
+
146
+	/**
147
+	 * base url for the site's registration checkout page - additional url params will be added to this
148
+	 *
149
+	 * @type string
150
+	 */
151
+	public $reg_page_base_url = '';
152
+
153
+	/**
154
+	 * base url for the site's registration cancelled page - additional url params will be added to this
155
+	 *
156
+	 * @type string
157
+	 */
158
+	public $cancel_page_url = '';
159
+
160
+	/**
161
+	 * base url for the site's thank you page - additional url params will be added to this
162
+	 *
163
+	 * @type string
164
+	 */
165
+	public $thank_you_page_url = '';
166
+
167
+	/**
168
+	 * base url for any redirects - additional url params will be added to this
169
+	 *
170
+	 * @type string
171
+	 */
172
+	public $redirect_url = '';
173
+
174
+	/**
175
+	 * form of POST data for use with off-site gateways
176
+	 *
177
+	 * @type string
178
+	 */
179
+	public $redirect_form = '';
180
+
181
+	/**
182
+	 * array of query where params to use when retrieving cached registrations from $this->checkout->transaction
183
+	 *
184
+	 * @type array
185
+	 */
186
+	public $reg_cache_where_params = array();
187
+
188
+	/**
189
+	 * a class for managing and creating the JSON encoded array of data that gets passed back to the client during AJAX
190
+	 * requests
191
+	 *
192
+	 * @type EE_SPCO_JSON_Response
193
+	 */
194
+	public $json_response;
195
+
196
+	/**
197
+	 * where we are going next in the reg process
198
+	 *
199
+	 * @type EE_SPCO_Reg_Step
200
+	 */
201
+	public $next_step;
202
+
203
+	/**
204
+	 * where we are in the reg process
205
+	 *
206
+	 * @type EE_SPCO_Reg_Step
207
+	 */
208
+	public $current_step;
209
+
210
+	/**
211
+	 *    $_cart - the current cart object
212
+	 *
213
+	 * @var EE_CART
214
+	 */
215
+	public $cart;
216
+
217
+	/**
218
+	 *    $_transaction - the current transaction object
219
+	 *
220
+	 * @var EE_Transaction
221
+	 */
222
+	public $transaction;
223
+
224
+	/**
225
+	 *    the related attendee object for the primary registrant
226
+	 *
227
+	 * @type EE_Attendee
228
+	 */
229
+	public $primary_attendee_obj;
230
+
231
+	/**
232
+	 *    $payment_method - the payment method object for the selected method of payment
233
+	 *
234
+	 * @type EE_Payment_Method
235
+	 */
236
+	public $payment_method;
237
+
238
+	/**
239
+	 *    $payment - if a payment was successfully made during the reg process,
240
+	 *    then here it is !!!
241
+	 *
242
+	 * @type EE_Payment
243
+	 */
244
+	public $payment;
245
+
246
+	/**
247
+	 *    if a payment method was selected that uses an on-site gateway, then this is the billing form
248
+	 *
249
+	 * @type EE_Billing_Info_Form | EE_Billing_Attendee_Info_Form
250
+	 */
251
+	public $billing_form;
252
+
253
+	/**
254
+	 *    the entire registration form composed of ALL of the subsections generated by the various reg steps
255
+	 *
256
+	 * @type EE_Form_Section_Proper
257
+	 */
258
+	public $registration_form;
259
+
260
+	/**
261
+	 * array of EE_SPCO_Reg_Step objects
262
+	 *
263
+	 * @type EE_SPCO_Reg_Step[]
264
+	 */
265
+	public $reg_steps = array();
266
+
267
+	/**
268
+	 * array of EE_Payment_Method objects
269
+	 *
270
+	 * @type EE_Payment_Method[]
271
+	 */
272
+	public $available_payment_methods = array();
273
+
274
+
275
+	/**
276
+	 *    class constructor
277
+	 *
278
+	 * @access    public
279
+	 */
280
+	public function __construct()
281
+	{
282
+		$this->reg_page_base_url = EE_Registry::instance()->CFG->core->reg_page_url();
283
+		$this->thank_you_page_url = EE_Registry::instance()->CFG->core->thank_you_page_url();
284
+		$this->cancel_page_url = EE_Registry::instance()->CFG->core->cancel_page_url();
285
+		$this->continue_reg = apply_filters('FHEE__EE_Checkout___construct___continue_reg', true);
286
+		$this->admin_request = is_admin() && ! EE_Registry::instance()->REQ->ajax;
287
+		$this->reg_cache_where_params = array(
288
+			0          => array('REG_deleted' => false),
289
+			'order_by' => array('REG_count' => 'ASC'),
290
+		);
291
+	}
292
+
293
+
294
+	/**
295
+	 * returns true if ANY reg status was updated during checkout
296
+	 *
297
+	 * @return boolean
298
+	 */
299
+	public function any_reg_status_updated()
300
+	{
301
+		foreach ($this->reg_status_updated as $reg_status) {
302
+			if ($reg_status) {
303
+				return true;
304
+			}
305
+		}
306
+		return false;
307
+	}
308
+
309
+
310
+	/**
311
+	 * @param $REG_ID
312
+	 * @return boolean
313
+	 */
314
+	public function reg_status_updated($REG_ID)
315
+	{
316
+		return isset($this->reg_status_updated[ $REG_ID ]) ? $this->reg_status_updated[ $REG_ID ] : false;
317
+	}
318
+
319
+
320
+	/**
321
+	 * @param $REG_ID
322
+	 * @param $reg_status
323
+	 */
324
+	public function set_reg_status_updated($REG_ID, $reg_status)
325
+	{
326
+		$this->reg_status_updated[ $REG_ID ] = filter_var($reg_status, FILTER_VALIDATE_BOOLEAN);
327
+	}
328
+
329
+
330
+	/**
331
+	 * exit_spco
332
+	 *
333
+	 * @return bool
334
+	 */
335
+	public function exit_spco()
336
+	{
337
+		return $this->exit_spco;
338
+	}
339
+
340
+
341
+	/**
342
+	 * set_exit_spco
343
+	 * can ONLY be set by the  Finalize_Registration reg step
344
+	 */
345
+	public function set_exit_spco()
346
+	{
347
+		if ($this->current_step instanceof EE_SPCO_Reg_Step_Finalize_Registration) {
348
+			$this->exit_spco = true;
349
+		}
350
+	}
351
+
352
+
353
+	/**
354
+	 *    reset_for_current_request
355
+	 *
356
+	 * @access    public
357
+	 * @return    void
358
+	 */
359
+	public function reset_for_current_request()
360
+	{
361
+		$this->process_form_submission = false;
362
+		$this->continue_reg = apply_filters('FHEE__EE_Checkout___construct___continue_reg', true);
363
+		$this->admin_request = is_admin() && ! EE_Registry::instance()->REQ->front_ajax;
364
+		$this->continue_reg = true;
365
+		$this->redirect = false;
366
+		// don't reset the cached redirect form if we're about to be asked to display it !!!
367
+		if (EE_Registry::instance()->REQ->get('action', 'display_spco_reg_step') !== 'redirect_form') {
368
+			$this->redirect_form = '';
369
+		}
370
+		$this->redirect_url = '';
371
+		$this->json_response = new EE_SPCO_JSON_Response();
372
+		EE_Form_Section_Proper::reset_js_localization();
373
+	}
374
+
375
+
376
+	/**
377
+	 *    add_reg_step
378
+	 *
379
+	 * @access    public
380
+	 * @param EE_SPCO_Reg_Step $reg_step_obj
381
+	 * @return    void
382
+	 */
383
+	public function add_reg_step(EE_SPCO_Reg_Step $reg_step_obj)
384
+	{
385
+		$this->reg_steps[ $reg_step_obj->slug() ] = $reg_step_obj;
386
+	}
387
+
388
+
389
+	/**
390
+	 * skip_reg_step
391
+	 * if the current reg step does not need to run for some reason,
392
+	 * then this will advance SPCO to the next reg step,
393
+	 * and mark the skipped step as completed
394
+	 *
395
+	 * @access    public
396
+	 * @param string $reg_step_slug
397
+	 * @return    void
398
+	 * @throws \EE_Error
399
+	 */
400
+	public function skip_reg_step($reg_step_slug = '')
401
+	{
402
+		$step_to_skip = $this->find_reg_step($reg_step_slug);
403
+		if ($step_to_skip instanceof EE_SPCO_Reg_Step && $step_to_skip->is_current_step()) {
404
+			$step_to_skip->set_is_current_step(false);
405
+			$step_to_skip->set_completed();
406
+			// advance to the next step
407
+			$this->set_current_step($this->next_step->slug());
408
+			// also reset the step param in the request in case any other code references that directly
409
+			EE_Registry::instance()->REQ->set('step', $this->current_step->slug());
410
+			// since we are skipping a step and setting the current step to be what was previously the next step,
411
+			// we need to check that the next step is now correct, and not still set to the current step.
412
+			if ($this->current_step->slug() === $this->next_step->slug()) {
413
+				// correctly setup the next step
414
+				$this->set_next_step();
415
+			}
416
+			$this->set_reg_step_initiated($this->current_step);
417
+		}
418
+	}
419
+
420
+
421
+	/**
422
+	 *    remove_reg_step
423
+	 *
424
+	 * @access    public
425
+	 * @param string $reg_step_slug
426
+	 * @param bool   $reset whether to reset reg steps after removal
427
+	 * @throws EE_Error
428
+	 */
429
+	public function remove_reg_step($reg_step_slug = '', $reset = true)
430
+	{
431
+		unset($this->reg_steps[ $reg_step_slug ]);
432
+		if ($this->transaction instanceof EE_Transaction) {
433
+			// now remove reg step from TXN and save
434
+			$this->transaction->remove_reg_step($reg_step_slug);
435
+			$this->transaction->save();
436
+		}
437
+		if ($reset) {
438
+			$this->reset_reg_steps();
439
+		}
440
+	}
441
+
442
+
443
+	/**
444
+	 *    set_reg_step_order
445
+	 *
446
+	 * @access    public
447
+	 * @param string $reg_step_slug
448
+	 * @param int    $order
449
+	 * @return    void
450
+	 */
451
+	public function set_reg_step_order($reg_step_slug = '', $order = 100)
452
+	{
453
+		if (isset($this->reg_steps[ $reg_step_slug ])) {
454
+			$this->reg_steps[ $reg_step_slug ]->set_order($order);
455
+		}
456
+	}
457
+
458
+
459
+	/**
460
+	 *    set_current_step
461
+	 *
462
+	 * @access    public
463
+	 * @param string $current_step
464
+	 * @return    void
465
+	 */
466
+	public function set_current_step($current_step)
467
+	{
468
+		// grab what step we're on
469
+		$this->current_step = isset($this->reg_steps[ $current_step ])
470
+			? $this->reg_steps[ $current_step ]
471
+			: reset(
472
+				$this->reg_steps
473
+			);
474
+		// verify instance
475
+		if ($this->current_step instanceof EE_SPCO_Reg_Step) {
476
+			// we don't want to repeat completed steps if this is the first time through SPCO
477
+			if ($this->continue_reg && ! $this->revisit && $this->current_step->completed()) {
478
+				// so advance to the next step
479
+				$this->set_next_step();
480
+				if ($this->next_step instanceof EE_SPCO_Reg_Step) {
481
+					// and attempt to set it as the current step
482
+					$this->set_current_step($this->next_step->slug());
483
+				}
484
+				return;
485
+			}
486
+			$this->current_step->set_is_current_step(true);
487
+		} else {
488
+			EE_Error::add_error(
489
+				__('The current step could not be set.', 'event_espresso'),
490
+				__FILE__,
491
+				__FUNCTION__,
492
+				__LINE__
493
+			);
494
+		}
495
+	}
496
+
497
+
498
+	/**
499
+	 *    set_next_step
500
+	 * advances the reg_steps array pointer and sets the next step, then reverses pointer back to the current step
501
+	 *
502
+	 * @access    public
503
+	 * @return    void
504
+	 */
505
+	public function set_next_step()
506
+	{
507
+		// set pointer to start of array
508
+		reset($this->reg_steps);
509
+		// if there is more than one step
510
+		if (count($this->reg_steps) > 1) {
511
+			// advance to the current step and set pointer
512
+			while (key($this->reg_steps) !== $this->current_step->slug() && key($this->reg_steps) !== '') {
513
+				next($this->reg_steps);
514
+			}
515
+		}
516
+		// advance one more spot ( if it exists )
517
+		$this->next_step = next($this->reg_steps);
518
+		// verify instance
519
+		$this->next_step = $this->next_step instanceof EE_SPCO_Reg_Step ? $this->next_step : null;
520
+		// then back to current step to reset
521
+		prev($this->reg_steps);
522
+	}
523
+
524
+
525
+	/**
526
+	 *    get_next_reg_step
527
+	 *    this simply returns the next step from reg_steps array
528
+	 *
529
+	 * @access    public
530
+	 * @return    EE_SPCO_Reg_Step | null
531
+	 */
532
+	public function get_next_reg_step()
533
+	{
534
+		$next = next($this->reg_steps);
535
+		prev($this->reg_steps);
536
+		return $next instanceof EE_SPCO_Reg_Step ? $next : null;
537
+	}
538
+
539
+
540
+	/**
541
+	 * get_prev_reg_step
542
+	 *    this simply returns the previous step from reg_steps array
543
+	 *
544
+	 * @access    public
545
+	 * @return    EE_SPCO_Reg_Step | null
546
+	 */
547
+	public function get_prev_reg_step()
548
+	{
549
+		$prev = prev($this->reg_steps);
550
+		next($this->reg_steps);
551
+		return $prev instanceof EE_SPCO_Reg_Step ? $prev : null;
552
+	}
553
+
554
+
555
+	/**
556
+	 * sort_reg_steps
557
+	 *
558
+	 * @access public
559
+	 * @return void
560
+	 */
561
+	public function sort_reg_steps()
562
+	{
563
+		$reg_step_sorting_callback = apply_filters(
564
+			'FHEE__EE_Checkout__sort_reg_steps__reg_step_sorting_callback',
565
+			'reg_step_sorting_callback'
566
+		);
567
+		uasort($this->reg_steps, array($this, $reg_step_sorting_callback));
568
+	}
569
+
570
+
571
+	/**
572
+	 * find_reg_step
573
+	 * finds a reg step by the given slug
574
+	 *
575
+	 * @access    public
576
+	 * @param string $reg_step_slug
577
+	 * @return EE_SPCO_Reg_Step|null
578
+	 */
579
+	public function find_reg_step($reg_step_slug = '')
580
+	{
581
+		if (! empty($reg_step_slug)) {
582
+			// copy reg step array
583
+			$reg_steps = $this->reg_steps;
584
+			// set pointer to start of array
585
+			reset($reg_steps);
586
+			// if there is more than one step
587
+			if (count($reg_steps) > 1) {
588
+				// advance to the current step and set pointer
589
+				while (key($reg_steps) !== $reg_step_slug && key($reg_steps) !== '') {
590
+					next($reg_steps);
591
+				}
592
+				return current($reg_steps);
593
+			}
594
+		}
595
+		return null;
596
+	}
597
+
598
+
599
+	/**
600
+	 * reg_step_sorting_callback
601
+	 *
602
+	 * @access public
603
+	 * @param EE_SPCO_Reg_Step $reg_step_A
604
+	 * @param EE_SPCO_Reg_Step $reg_step_B
605
+	 * @return int
606
+	 */
607
+	public function reg_step_sorting_callback(EE_SPCO_Reg_Step $reg_step_A, EE_SPCO_Reg_Step $reg_step_B)
608
+	{
609
+		// send finalize_registration step to the end of the array
610
+		if ($reg_step_A->slug() === 'finalize_registration') {
611
+			return 1;
612
+		} elseif ($reg_step_B->slug() === 'finalize_registration') {
613
+			return -1;
614
+		}
615
+		if ($reg_step_A->order() === $reg_step_B->order()) {
616
+			return 0;
617
+		}
618
+		return ($reg_step_A->order() > $reg_step_B->order()) ? 1 : -1;
619
+	}
620
+
621
+
622
+	/**
623
+	 * set_reg_step_initiated
624
+	 *
625
+	 * @access    public
626
+	 * @param    EE_SPCO_Reg_Step $reg_step
627
+	 * @throws \EE_Error
628
+	 */
629
+	public function set_reg_step_initiated(EE_SPCO_Reg_Step $reg_step)
630
+	{
631
+		// call set_reg_step_initiated ???
632
+		if (// first time visiting SPCO ?
633
+			! $this->revisit
634
+			&& (
635
+				// and displaying the reg step form for the first time ?
636
+				$this->action === 'display_spco_reg_step'
637
+				// or initializing the final step
638
+				|| $reg_step instanceof EE_SPCO_Reg_Step_Finalize_Registration
639
+			)
640
+		) {
641
+			// set the start time for this reg step
642
+			if (! $this->transaction->set_reg_step_initiated($reg_step->slug())) {
643
+				if (WP_DEBUG) {
644
+					EE_Error::add_error(
645
+						sprintf(
646
+							__('The "%1$s" registration step was not initialized properly.', 'event_espresso'),
647
+							$reg_step->name()
648
+						),
649
+						__FILE__,
650
+						__FUNCTION__,
651
+						__LINE__
652
+					);
653
+				}
654
+			}
655
+		}
656
+	}
657
+
658
+
659
+	/**
660
+	 *    set_reg_step_JSON_info
661
+	 *
662
+	 * @access public
663
+	 * @return    void
664
+	 */
665
+	public function set_reg_step_JSON_info()
666
+	{
667
+		EE_Registry::$i18n_js_strings['reg_steps'] = array();
668
+		// pass basic reg step data to JS
669
+		foreach ($this->reg_steps as $reg_step) {
670
+			EE_Registry::$i18n_js_strings['reg_steps'][] = $reg_step->slug();
671
+		}
672
+		// reset reg step html
673
+		// $this->json_response->set_reg_step_html('');
674
+	}
675
+
676
+
677
+	/**
678
+	 *    reset_reg_steps
679
+	 *
680
+	 * @access public
681
+	 * @return void
682
+	 */
683
+	public function reset_reg_steps()
684
+	{
685
+		$this->sort_reg_steps();
686
+		$this->set_current_step(EE_Registry::instance()->REQ->get('step'));
687
+		$this->set_next_step();
688
+		// the text that appears on the reg step form submit button
689
+		$this->current_step->set_submit_button_text();
690
+		$this->set_reg_step_JSON_info();
691
+	}
692
+
693
+
694
+	/**
695
+	 *    get_registration_time_limit
696
+	 *
697
+	 * @access    public
698
+	 * @return        string
699
+	 */
700
+	public function get_registration_time_limit()
701
+	{
702
+
703
+		$registration_time_limit = (float) (EE_Registry::instance()->SSN->expiration() - time());
704
+		$time_limit_format = $registration_time_limit > 60 * MINUTE_IN_SECONDS ? 'H:i:s' : 'i:s';
705
+		$registration_time_limit = date($time_limit_format, $registration_time_limit);
706
+		return apply_filters(
707
+			'FHEE__EE_Checkout__get_registration_time_limit__registration_time_limit',
708
+			$registration_time_limit
709
+		);
710
+	}
711
+
712
+
713
+	/**
714
+	 * payment_required
715
+	 *
716
+	 * @return boolean
717
+	 */
718
+	public function payment_required()
719
+	{
720
+		// if NOT:
721
+		//     registration via admin
722
+		//      completed TXN
723
+		//      overpaid TXN
724
+		//      free TXN(total = 0.00)
725
+		//      then payment required is TRUE
726
+		return ! ($this->admin_request
727
+				  || $this->transaction->is_completed()
728
+				  || $this->transaction->is_overpaid()
729
+				  || $this->transaction->is_free()) ? true : false;
730
+	}
731
+
732
+
733
+	/**
734
+	 * get_cart_for_transaction
735
+	 *
736
+	 * @access public
737
+	 * @param EE_Transaction $transaction
738
+	 * @return EE_Cart
739
+	 */
740
+	public function get_cart_for_transaction($transaction)
741
+	{
742
+		$session = EE_Registry::instance()->load_core('Session');
743
+		$cart = $transaction instanceof EE_Transaction ? EE_Cart::get_cart_from_txn($transaction, $session) : null;
744
+		// verify cart
745
+		if (! $cart instanceof EE_Cart) {
746
+			$cart = EE_Registry::instance()->load_core('Cart');
747
+		}
748
+
749
+		return $cart;
750
+	}
751
+
752
+
753
+	/**
754
+	 *    initialize_txn_reg_steps_array
755
+	 *
756
+	 * @access public
757
+	 * @return    array
758
+	 */
759
+	public function initialize_txn_reg_steps_array()
760
+	{
761
+		$txn_reg_steps_array = array();
762
+		foreach ($this->reg_steps as $reg_step) {
763
+			$txn_reg_steps_array[ $reg_step->slug() ] = false;
764
+		}
765
+		return $txn_reg_steps_array;
766
+	}
767
+
768
+
769
+	/**
770
+	 *    update_txn_reg_steps_array
771
+	 *
772
+	 * @access public
773
+	 * @return    bool
774
+	 * @throws \EE_Error
775
+	 */
776
+	public function update_txn_reg_steps_array()
777
+	{
778
+		$updated = false;
779
+		foreach ($this->reg_steps as $reg_step) {
780
+			if ($reg_step->completed()) {
781
+				$updated = $this->transaction->set_reg_step_completed($reg_step->slug())
782
+					? true
783
+					: $updated;
784
+			}
785
+		}
786
+		if ($updated) {
787
+			$this->transaction->save();
788
+		}
789
+		return $updated;
790
+	}
791
+
792
+
793
+	/**
794
+	 *    stash_transaction_and_checkout
795
+	 *
796
+	 * @access public
797
+	 * @return    void
798
+	 * @throws \EE_Error
799
+	 */
800
+	public function stash_transaction_and_checkout()
801
+	{
802
+		if (! $this->revisit) {
803
+			$this->update_txn_reg_steps_array();
804
+		}
805
+		$this->track_transaction_and_registration_status_updates();
806
+		// save all data to the db, but suppress errors
807
+		// $this->save_all_data( FALSE );
808
+		// cache the checkout in the session
809
+		EE_Registry::instance()->SSN->set_checkout($this);
810
+	}
811
+
812
+
813
+	/**
814
+	 *    track_transaction_and_registration_status_updates
815
+	 *    stores whether any updates were made to the TXN or it's related registrations
816
+	 *
817
+	 * @access public
818
+	 * @return void
819
+	 * @throws \EE_Error
820
+	 */
821
+	public function track_transaction_and_registration_status_updates()
822
+	{
823
+		// verify the transaction
824
+		if ($this->transaction instanceof EE_Transaction) {
825
+			// has there been a TXN status change during this checkout?
826
+			$this->txn_status_updated = $this->transaction->txn_status_updated();
827
+			/** @type EE_Registration_Processor $registration_processor */
828
+			$registration_processor = EE_Registry::instance()->load_class('Registration_Processor');
829
+			// grab the saved registrations from the transaction
830
+			foreach ($this->transaction->registrations($this->reg_cache_where_params) as $registration) {
831
+				if ($registration_processor->reg_status_updated($registration->ID())) {
832
+					$this->set_reg_status_updated($registration->ID(), true);
833
+				}
834
+			}
835
+		}
836
+	}
837
+
838
+
839
+	/**
840
+	 *    visit_allows_processing_of_this_registration
841
+	 *    determines if the current SPCO visit should allow the passed EE_Registration to be used in processing.
842
+	 *    one of the following conditions must be met:
843
+	 *        EITHER:    A) first time thru SPCO -> process ALL registrations ( NOT a revisit )
844
+	 *        OR :        B) primary registrant is editing info -> process ALL registrations ( primary_revisit )
845
+	 *        OR :        C) another registrant is editing info -> ONLY process their registration ( revisit AND their
846
+	 *        reg_url_link matches )
847
+	 *
848
+	 * @access public
849
+	 * @param    EE_Registration $registration
850
+	 * @return    bool
851
+	 * @throws \EE_Error
852
+	 */
853
+	public function visit_allows_processing_of_this_registration(EE_Registration $registration)
854
+	{
855
+		return ! $this->revisit
856
+			   || $this->primary_revisit
857
+			   || (
858
+				   $this->revisit && $this->reg_url_link === $registration->reg_url_link()
859
+			   )
860
+			? true
861
+			: false;
862
+	}
863
+
864
+
865
+	/**
866
+	 *    _transaction_has_primary_registration
867
+	 *
868
+	 * @access        private
869
+	 * @return        bool
870
+	 */
871
+	public function transaction_has_primary_registrant()
872
+	{
873
+		return $this->primary_attendee_obj instanceof EE_Attendee ? true : false;
874
+	}
875
+
876
+
877
+	/**
878
+	 *    save_all_data
879
+	 *    simply loops through the current transaction and saves all data for each registration
880
+	 *
881
+	 * @access public
882
+	 * @param bool $show_errors
883
+	 * @return bool
884
+	 * @throws \EE_Error
885
+	 */
886
+	public function save_all_data($show_errors = true)
887
+	{
888
+		// verify the transaction
889
+		if ($this->transaction instanceof EE_Transaction) {
890
+			// save to ensure that TXN has ID
891
+			$this->transaction->save();
892
+			// grab the saved registrations from the transaction
893
+			foreach ($this->transaction->registrations($this->reg_cache_where_params) as $registration) {
894
+				$this->_save_registration($registration, $show_errors);
895
+			}
896
+		} else {
897
+			if ($show_errors) {
898
+				EE_Error::add_error(
899
+					__(
900
+						'A valid Transaction was not found when attempting to save your registration information.',
901
+						'event_espresso'
902
+					),
903
+					__FILE__,
904
+					__FUNCTION__,
905
+					__LINE__
906
+				);
907
+			}
908
+			return false;
909
+		}
910
+		return true;
911
+	}
912
+
913
+
914
+	/**
915
+	 * _save_registration_attendee
916
+	 *
917
+	 * @param    EE_Registration $registration
918
+	 * @param bool               $show_errors
919
+	 * @return void
920
+	 * @throws \EE_Error
921
+	 */
922
+	private function _save_registration($registration, $show_errors = true)
923
+	{
924
+		// verify object
925
+		if ($registration instanceof EE_Registration) {
926
+			// should this registration be processed during this visit ?
927
+			if ($this->visit_allows_processing_of_this_registration($registration)) {
928
+				// set TXN ID
929
+				if (! $registration->transaction_ID()) {
930
+					$registration->set_transaction_id($this->transaction->ID());
931
+				}
932
+				// verify and save the attendee
933
+				$this->_save_registration_attendee($registration, $show_errors);
934
+				// save answers to reg form questions
935
+				$this->_save_registration_answers($registration, $show_errors);
936
+				// save changes
937
+				$registration->save();
938
+				// update txn cache
939
+				if (! $this->transaction->update_cache_after_object_save('Registration', $registration)) {
940
+					if ($show_errors) {
941
+						EE_Error::add_error(
942
+							__(
943
+								'The newly saved Registration object could not be cached on the Transaction.',
944
+								'event_espresso'
945
+							),
946
+							__FILE__,
947
+							__FUNCTION__,
948
+							__LINE__
949
+						);
950
+					}
951
+				}
952
+			}
953
+		} else {
954
+			if ($show_errors) {
955
+				EE_Error::add_error(
956
+					__(
957
+						'An invalid Registration object was discovered when attempting to save your registration information.',
958
+						'event_espresso'
959
+					),
960
+					__FILE__,
961
+					__FUNCTION__,
962
+					__LINE__
963
+				);
964
+			}
965
+		}
966
+	}
967
+
968
+
969
+	/**
970
+	 * _save_registration_attendee
971
+	 *
972
+	 * @param    EE_Registration $registration
973
+	 * @param bool               $show_errors
974
+	 * @return void
975
+	 * @throws \EE_Error
976
+	 */
977
+	private function _save_registration_attendee($registration, $show_errors = true)
978
+	{
979
+		if ($registration->attendee() instanceof EE_Attendee) {
980
+			// save so that ATT has ID
981
+			$registration->attendee()->save();
982
+			if (! $registration->update_cache_after_object_save('Attendee', $registration->attendee())) {
983
+				if ($show_errors) {
984
+					EE_Error::add_error(
985
+						__(
986
+							'The newly saved Attendee object could not be cached on the registration.',
987
+							'event_espresso'
988
+						),
989
+						__FILE__,
990
+						__FUNCTION__,
991
+						__LINE__
992
+					);
993
+				}
994
+			}
995
+		} else {
996
+			if ($show_errors) {
997
+				EE_Error::add_error(
998
+					sprintf(
999
+						'%1$s||%1$s $attendee = %2$s',
1000
+						__(
1001
+							'Either no Attendee information was found, or an invalid Attendee object was discovered when attempting to save your registration information.',
1002
+							'event_espresso'
1003
+						),
1004
+						var_export($registration->attendee(), true)
1005
+					),
1006
+					__FILE__,
1007
+					__FUNCTION__,
1008
+					__LINE__
1009
+				);
1010
+			}
1011
+		}
1012
+	}
1013
+
1014
+
1015
+	/**
1016
+	 * _save_question_answers
1017
+	 *
1018
+	 * @param    EE_Registration $registration
1019
+	 * @param bool               $show_errors
1020
+	 * @return void
1021
+	 * @throws \EE_Error
1022
+	 */
1023
+	private function _save_registration_answers($registration, $show_errors = true)
1024
+	{
1025
+		// now save the answers
1026
+		foreach ($registration->answers() as $cache_key => $answer) {
1027
+			// verify object
1028
+			if ($answer instanceof EE_Answer) {
1029
+				$answer->set_registration($registration->ID());
1030
+				$answer->save();
1031
+				if (! $registration->update_cache_after_object_save('Answer', $answer, $cache_key)) {
1032
+					if ($show_errors) {
1033
+						EE_Error::add_error(
1034
+							__(
1035
+								'The newly saved Answer object could not be cached on the registration.',
1036
+								'event_espresso'
1037
+							),
1038
+							__FILE__,
1039
+							__FUNCTION__,
1040
+							__LINE__
1041
+						);
1042
+					}
1043
+				}
1044
+			} else {
1045
+				if ($show_errors) {
1046
+					EE_Error::add_error(
1047
+						__(
1048
+							'An invalid Answer object was discovered when attempting to save your registration information.',
1049
+							'event_espresso'
1050
+						),
1051
+						__FILE__,
1052
+						__FUNCTION__,
1053
+						__LINE__
1054
+					);
1055
+				}
1056
+			}
1057
+		}
1058
+	}
1059
+
1060
+
1061
+	/**
1062
+	 *    refresh_all_entities
1063
+	 *   will either refresh the entity map with objects form the db or from the checkout cache
1064
+	 *
1065
+	 * @access public
1066
+	 * @param bool $from_db
1067
+	 * @return bool
1068
+	 * @throws \EE_Error
1069
+	 */
1070
+	public function refresh_all_entities($from_db = false)
1071
+	{
1072
+		$from_db = $this->current_step->is_final_step() || $this->action === 'process_gateway_response'
1073
+			? true
1074
+			: $from_db;
1075
+		// $this->log(
1076
+		//     __CLASS__,
1077
+		//     __FUNCTION__,
1078
+		//     __LINE__,
1079
+		//     array('from_db' => $from_db)
1080
+		// );
1081
+		return $from_db ? $this->refresh_from_db() : $this->refresh_entity_map();
1082
+	}
1083
+
1084
+
1085
+	/**
1086
+	 *  refresh_entity_map
1087
+	 *  simply loops through the current transaction and updates each
1088
+	 *  model's entity map using EEM_Base::refresh_entity_map_from_db()
1089
+	 *
1090
+	 * @access public
1091
+	 * @return bool
1092
+	 * @throws \EE_Error
1093
+	 */
1094
+	protected function refresh_from_db()
1095
+	{
1096
+		// verify the transaction
1097
+		if ($this->transaction instanceof EE_Transaction && $this->transaction->ID()) {
1098
+			// pull fresh TXN data from the db
1099
+			$this->transaction = $this->transaction->get_model()->refresh_entity_map_from_db($this->transaction->ID());
1100
+			// update EE_Checkout's cached primary_attendee object
1101
+			$this->primary_attendee_obj = $this->_refresh_primary_attendee_obj_from_db($this->transaction);
1102
+			// update EE_Checkout's cached payment object
1103
+			$payment = $this->transaction->last_payment();
1104
+			$this->payment = $payment instanceof EE_Payment ? $payment : $this->payment;
1105
+			// update EE_Checkout's cached payment_method object
1106
+			$payment_method = $this->payment instanceof EE_Payment ? $this->payment->payment_method() : null;
1107
+			$this->payment_method = $payment_method instanceof EE_Payment_Method ? $payment_method
1108
+				: $this->payment_method;
1109
+			// now refresh the cart, based on the TXN
1110
+			$this->cart = $this->get_cart_for_transaction($this->transaction);
1111
+		} else {
1112
+			EE_Error::add_error(
1113
+				__(
1114
+					'A valid Transaction was not found when attempting to update the model entity mapper.',
1115
+					'event_espresso'
1116
+				),
1117
+				__FILE__,
1118
+				__FUNCTION__,
1119
+				__LINE__
1120
+			);
1121
+			return false;
1122
+		}
1123
+		return true;
1124
+	}
1125
+
1126
+
1127
+	/**
1128
+	 * _refresh_primary_attendee_obj_from_db
1129
+	 *
1130
+	 * @param   EE_Transaction $transaction
1131
+	 * @return  EE_Attendee | null
1132
+	 * @throws \EE_Error
1133
+	 */
1134
+	protected function _refresh_primary_attendee_obj_from_db(EE_Transaction $transaction)
1135
+	{
1136
+
1137
+		$primary_attendee_obj = null;
1138
+		// grab the saved registrations from the transaction
1139
+		foreach ($transaction->registrations($this->reg_cache_where_params, true) as $registration) {
1140
+			// verify object
1141
+			if ($registration instanceof EE_Registration) {
1142
+				$attendee = $registration->attendee();
1143
+				// verify object && maybe cache primary_attendee_obj ?
1144
+				if ($attendee instanceof EE_Attendee && $registration->is_primary_registrant()) {
1145
+					$primary_attendee_obj = $attendee;
1146
+				}
1147
+			} else {
1148
+				EE_Error::add_error(
1149
+					__(
1150
+						'An invalid Registration object was discovered when attempting to update the model entity mapper.',
1151
+						'event_espresso'
1152
+					),
1153
+					__FILE__,
1154
+					__FUNCTION__,
1155
+					__LINE__
1156
+				);
1157
+			}
1158
+		}
1159
+		return $primary_attendee_obj;
1160
+	}
1161
+
1162
+
1163
+	/**
1164
+	 *  refresh_entity_map
1165
+	 *  simply loops through the current transaction and updates
1166
+	 *  each model's entity map using EEM_Base::refresh_entity_map_with()
1167
+	 *
1168
+	 * @access public
1169
+	 * @return bool
1170
+	 * @throws \EE_Error
1171
+	 */
1172
+	protected function refresh_entity_map()
1173
+	{
1174
+		// verify the transaction
1175
+		if ($this->transaction instanceof EE_Transaction && $this->transaction->ID()) {
1176
+			// never cache payment info
1177
+			$this->transaction->clear_cache('Payment');
1178
+			// is the Payment Options Reg Step completed ?
1179
+			if ($this->transaction->reg_step_completed('payment_options')) {
1180
+				// then check for payments and update TXN accordingly
1181
+				/** @type EE_Transaction_Payments $transaction_payments */
1182
+				$transaction_payments = EE_Registry::instance()->load_class('Transaction_Payments');
1183
+				$transaction_payments->calculate_total_payments_and_update_status($this->transaction);
1184
+			}
1185
+			// grab the saved registrations from the transaction
1186
+			foreach ($this->transaction->registrations($this->reg_cache_where_params) as $reg_cache_ID => $registration) {
1187
+				$this->_refresh_registration($reg_cache_ID, $registration);
1188
+			}
1189
+			// make sure our cached TXN is added to the model entity mapper
1190
+			$this->transaction = $this->transaction->get_model()->refresh_entity_map_with(
1191
+				$this->transaction->ID(),
1192
+				$this->transaction
1193
+			);
1194
+		} else {
1195
+			EE_Error::add_error(
1196
+				__(
1197
+					'A valid Transaction was not found when attempting to update the model entity mapper.',
1198
+					'event_espresso'
1199
+				),
1200
+				__FILE__,
1201
+				__FUNCTION__,
1202
+				__LINE__
1203
+			);
1204
+			return false;
1205
+		}
1206
+		// verify and update the cart because inaccurate totals are not so much fun
1207
+		if ($this->cart instanceof EE_Cart) {
1208
+			$grand_total = $this->cart->get_grand_total();
1209
+			if ($grand_total instanceof EE_Line_Item && $grand_total->ID()) {
1210
+				$grand_total->recalculate_total_including_taxes();
1211
+				$grand_total = $grand_total->get_model()->refresh_entity_map_with(
1212
+					$this->cart->get_grand_total()->ID(),
1213
+					$this->cart->get_grand_total()
1214
+				);
1215
+			}
1216
+			if ($grand_total instanceof EE_Line_Item) {
1217
+				$this->cart = EE_Cart::instance($grand_total);
1218
+			} else {
1219
+				EE_Error::add_error(
1220
+					__(
1221
+						'A valid Cart was not found when attempting to update the model entity mapper.',
1222
+						'event_espresso'
1223
+					),
1224
+					__FILE__,
1225
+					__FUNCTION__,
1226
+					__LINE__
1227
+				);
1228
+				return false;
1229
+			}
1230
+		}
1231
+		return true;
1232
+	}
1233
+
1234
+
1235
+	/**
1236
+	 * _refresh_registration
1237
+	 *
1238
+	 * @param    string | int    $reg_cache_ID
1239
+	 * @param    EE_Registration $registration
1240
+	 * @return void
1241
+	 * @throws \EE_Error
1242
+	 */
1243
+	protected function _refresh_registration($reg_cache_ID, $registration)
1244
+	{
1245
+
1246
+		// verify object
1247
+		if ($registration instanceof EE_Registration) {
1248
+			// update the entity mapper attendee
1249
+			$this->_refresh_registration_attendee($registration);
1250
+			// update the entity mapper answers for reg form questions
1251
+			$this->_refresh_registration_answers($registration);
1252
+			// make sure the cached registration is added to the model entity mapper
1253
+			$registration->get_model()->refresh_entity_map_with($reg_cache_ID, $registration);
1254
+		} else {
1255
+			EE_Error::add_error(
1256
+				__(
1257
+					'An invalid Registration object was discovered when attempting to update the model entity mapper.',
1258
+					'event_espresso'
1259
+				),
1260
+				__FILE__,
1261
+				__FUNCTION__,
1262
+				__LINE__
1263
+			);
1264
+		}
1265
+	}
1266
+
1267
+
1268
+	/**
1269
+	 * _save_registration_attendee
1270
+	 *
1271
+	 * @param    EE_Registration $registration
1272
+	 * @return void
1273
+	 * @throws \EE_Error
1274
+	 */
1275
+	protected function _refresh_registration_attendee($registration)
1276
+	{
1277
+
1278
+		$attendee = $registration->attendee();
1279
+		// verify object
1280
+		if ($attendee instanceof EE_Attendee && $attendee->ID()) {
1281
+			// make sure the cached attendee is added to the model entity mapper
1282
+			$registration->attendee()->get_model()->refresh_entity_map_with($attendee->ID(), $attendee);
1283
+			// maybe cache primary_attendee_obj ?
1284
+			if ($registration->is_primary_registrant()) {
1285
+				$this->primary_attendee_obj = $attendee;
1286
+			}
1287
+		}
1288
+	}
1289
+
1290
+
1291
+	/**
1292
+	 * _refresh_registration_answers
1293
+	 *
1294
+	 * @param    EE_Registration $registration
1295
+	 * @return void
1296
+	 * @throws \EE_Error
1297
+	 */
1298
+	protected function _refresh_registration_answers($registration)
1299
+	{
1300
+
1301
+		// now update the answers
1302
+		foreach ($registration->answers() as $cache_key => $answer) {
1303
+			// verify object
1304
+			if ($answer instanceof EE_Answer) {
1305
+				if ($answer->ID()) {
1306
+					// make sure the cached answer is added to the model entity mapper
1307
+					$answer->get_model()->refresh_entity_map_with($answer->ID(), $answer);
1308
+				}
1309
+			} else {
1310
+				EE_Error::add_error(
1311
+					__(
1312
+						'An invalid Answer object was discovered when attempting to update the model entity mapper.',
1313
+						'event_espresso'
1314
+					),
1315
+					__FILE__,
1316
+					__FUNCTION__,
1317
+					__LINE__
1318
+				);
1319
+			}
1320
+		}
1321
+	}
1322
+
1323
+
1324
+	/**
1325
+	 *    __sleep
1326
+	 * to conserve db space, let's remove the reg_form and the EE_Checkout object from EE_SPCO_Reg_Step objects upon
1327
+	 * serialization EE_Checkout will handle the reimplementation of itself upon waking, but we won't bother with the
1328
+	 * reg form, because if needed, it will be regenerated anyways
1329
+	 *
1330
+	 * @return array
1331
+	 * @throws \EE_Error
1332
+	 */
1333
+	public function __sleep()
1334
+	{
1335
+		if ($this->primary_attendee_obj instanceof EE_Attendee && $this->primary_attendee_obj->ID()) {
1336
+			$this->primary_attendee_obj = $this->primary_attendee_obj->ID();
1337
+		}        // remove the reg form and the checkout
1338
+		if ($this->transaction instanceof EE_Transaction && $this->transaction->ID()) {
1339
+			$this->transaction = $this->transaction->ID();
1340
+		}        // remove the reg form and the checkout
1341
+		return array_diff(array_keys(get_object_vars($this)), array('billing_form', 'registration_form'));
1342
+	}
1343
+
1344
+
1345
+	/**
1346
+	 *    __wakeup
1347
+	 * to conserve db space, we are removing the EE_Checkout object from EE_SPCO_Reg_Step objects upon serialization
1348
+	 * this will reinstate the EE_Checkout object on each EE_SPCO_Reg_Step object
1349
+	 */
1350
+	public function __wakeup()
1351
+	{
1352
+		if (! $this->primary_attendee_obj instanceof EE_Attendee && absint($this->primary_attendee_obj) !== 0) {
1353
+			// $this->primary_attendee_obj is actually just an ID, so use it to get the object from the db
1354
+			$this->primary_attendee_obj = EEM_Attendee::instance()->get_one_by_ID($this->primary_attendee_obj);
1355
+		}
1356
+		if (! $this->transaction instanceof EE_Transaction && absint($this->transaction) !== 0) {
1357
+			// $this->transaction is actually just an ID, so use it to get the object from the db
1358
+			$this->transaction = EEM_Transaction::instance()->get_one_by_ID($this->transaction);
1359
+		}
1360
+		foreach ($this->reg_steps as $reg_step) {
1361
+			$reg_step->checkout = $this;
1362
+		}
1363
+	}
1364
+
1365
+
1366
+	/**
1367
+	 * debug
1368
+	 *
1369
+	 * @param string $class
1370
+	 * @param string $func
1371
+	 * @param string $line
1372
+	 * @param array  $info
1373
+	 * @param bool   $display_request
1374
+	 * @throws \EE_Error
1375
+	 */
1376
+	public function log($class = '', $func = '', $line = '', $info = array(), $display_request = false)
1377
+	{
1378
+		$disabled = true;
1379
+		if (WP_DEBUG && ! $disabled) {
1380
+			$debug_data = get_option('EE_DEBUG_SPCO_' . EE_Session::instance()->id(), array());
1381
+			$default_data = array(
1382
+				$class                    => $func . '() : ' . $line,
1383
+				'request->step'           => $this->step,
1384
+				'request->action'         => $this->action,
1385
+				'current_step->slug'      => $this->current_step instanceof EE_SPCO_Reg_Step ?
1386
+					$this->current_step->slug() : '',
1387
+				'current_step->completed' => $this->current_step instanceof EE_SPCO_Reg_Step ?
1388
+					$this->current_step->completed() : '',
1389
+				'txn_status_updated'      => $this->transaction->txn_status_updated(),
1390
+				'reg_status_updated'      => $this->reg_status_updated,
1391
+				'reg_url_link'            => $this->reg_url_link,
1392
+				'REQ'                     => $display_request ? $_REQUEST : '',
1393
+			);
1394
+			if ($this->transaction instanceof EE_Transaction) {
1395
+				$default_data['TXN_status'] = $this->transaction->status_ID();
1396
+				$default_data['TXN_reg_steps'] = $this->transaction->reg_steps();
1397
+				foreach ($this->transaction->registrations($this->reg_cache_where_params) as $REG_ID => $registration) {
1398
+					$default_data['registrations'][ $REG_ID ] = $registration->status_ID();
1399
+				}
1400
+				if ($this->transaction->ID()) {
1401
+					$TXN_ID = 'EE_Transaction: ' . $this->transaction->ID();
1402
+					// don't serialize objects
1403
+					$info = $this->_strip_objects($info);
1404
+					if (! isset($debug_data[ $TXN_ID ])) {
1405
+						$debug_data[ $TXN_ID ] = array();
1406
+					}
1407
+					$debug_data[ $TXN_ID ][ microtime() ] = array_merge(
1408
+						$default_data,
1409
+						$info
1410
+					);
1411
+					update_option('EE_DEBUG_SPCO_' . EE_Session::instance()->id(), $debug_data);
1412
+				}
1413
+			}
1414
+		}
1415
+	}
1416
+
1417
+
1418
+	/**
1419
+	 * _strip_objects
1420
+	 *
1421
+	 * @param array $info
1422
+	 * @return array
1423
+	 */
1424
+	public function _strip_objects($info = array())
1425
+	{
1426
+		foreach ((array) $info as $key => $value) {
1427
+			if (is_array($value)) {
1428
+				$info[ $key ] = $this->_strip_objects($value);
1429
+			} elseif (is_object($value)) {
1430
+				$object_class = get_class($value);
1431
+				$info[ $object_class ] = array();
1432
+				$info[ $object_class ]['ID'] = method_exists($value, 'ID') ? $value->ID() : 0;
1433
+				if (method_exists($value, 'status')) {
1434
+					$info[ $object_class ]['status'] = $value->status();
1435
+				} elseif (method_exists($value, 'status_ID')) {
1436
+					$info[ $object_class ]['status'] = $value->status_ID();
1437
+				}
1438
+				unset($info[ $key ]);
1439
+			}
1440
+		}
1441
+		return (array) $info;
1442
+	}
1443 1443
 }
Please login to merge, or discard this patch.
Spacing   +33 added lines, -33 removed lines patch added patch discarded remove patch
@@ -313,7 +313,7 @@  discard block
 block discarded – undo
313 313
      */
314 314
     public function reg_status_updated($REG_ID)
315 315
     {
316
-        return isset($this->reg_status_updated[ $REG_ID ]) ? $this->reg_status_updated[ $REG_ID ] : false;
316
+        return isset($this->reg_status_updated[$REG_ID]) ? $this->reg_status_updated[$REG_ID] : false;
317 317
     }
318 318
 
319 319
 
@@ -323,7 +323,7 @@  discard block
 block discarded – undo
323 323
      */
324 324
     public function set_reg_status_updated($REG_ID, $reg_status)
325 325
     {
326
-        $this->reg_status_updated[ $REG_ID ] = filter_var($reg_status, FILTER_VALIDATE_BOOLEAN);
326
+        $this->reg_status_updated[$REG_ID] = filter_var($reg_status, FILTER_VALIDATE_BOOLEAN);
327 327
     }
328 328
 
329 329
 
@@ -382,7 +382,7 @@  discard block
 block discarded – undo
382 382
      */
383 383
     public function add_reg_step(EE_SPCO_Reg_Step $reg_step_obj)
384 384
     {
385
-        $this->reg_steps[ $reg_step_obj->slug() ] = $reg_step_obj;
385
+        $this->reg_steps[$reg_step_obj->slug()] = $reg_step_obj;
386 386
     }
387 387
 
388 388
 
@@ -428,7 +428,7 @@  discard block
 block discarded – undo
428 428
      */
429 429
     public function remove_reg_step($reg_step_slug = '', $reset = true)
430 430
     {
431
-        unset($this->reg_steps[ $reg_step_slug ]);
431
+        unset($this->reg_steps[$reg_step_slug]);
432 432
         if ($this->transaction instanceof EE_Transaction) {
433 433
             // now remove reg step from TXN and save
434 434
             $this->transaction->remove_reg_step($reg_step_slug);
@@ -450,8 +450,8 @@  discard block
 block discarded – undo
450 450
      */
451 451
     public function set_reg_step_order($reg_step_slug = '', $order = 100)
452 452
     {
453
-        if (isset($this->reg_steps[ $reg_step_slug ])) {
454
-            $this->reg_steps[ $reg_step_slug ]->set_order($order);
453
+        if (isset($this->reg_steps[$reg_step_slug])) {
454
+            $this->reg_steps[$reg_step_slug]->set_order($order);
455 455
         }
456 456
     }
457 457
 
@@ -466,8 +466,8 @@  discard block
 block discarded – undo
466 466
     public function set_current_step($current_step)
467 467
     {
468 468
         // grab what step we're on
469
-        $this->current_step = isset($this->reg_steps[ $current_step ])
470
-            ? $this->reg_steps[ $current_step ]
469
+        $this->current_step = isset($this->reg_steps[$current_step])
470
+            ? $this->reg_steps[$current_step]
471 471
             : reset(
472 472
                 $this->reg_steps
473 473
             );
@@ -578,7 +578,7 @@  discard block
 block discarded – undo
578 578
      */
579 579
     public function find_reg_step($reg_step_slug = '')
580 580
     {
581
-        if (! empty($reg_step_slug)) {
581
+        if ( ! empty($reg_step_slug)) {
582 582
             // copy reg step array
583 583
             $reg_steps = $this->reg_steps;
584 584
             // set pointer to start of array
@@ -639,7 +639,7 @@  discard block
 block discarded – undo
639 639
             )
640 640
         ) {
641 641
             // set the start time for this reg step
642
-            if (! $this->transaction->set_reg_step_initiated($reg_step->slug())) {
642
+            if ( ! $this->transaction->set_reg_step_initiated($reg_step->slug())) {
643 643
                 if (WP_DEBUG) {
644 644
                     EE_Error::add_error(
645 645
                         sprintf(
@@ -742,7 +742,7 @@  discard block
 block discarded – undo
742 742
         $session = EE_Registry::instance()->load_core('Session');
743 743
         $cart = $transaction instanceof EE_Transaction ? EE_Cart::get_cart_from_txn($transaction, $session) : null;
744 744
         // verify cart
745
-        if (! $cart instanceof EE_Cart) {
745
+        if ( ! $cart instanceof EE_Cart) {
746 746
             $cart = EE_Registry::instance()->load_core('Cart');
747 747
         }
748 748
 
@@ -760,7 +760,7 @@  discard block
 block discarded – undo
760 760
     {
761 761
         $txn_reg_steps_array = array();
762 762
         foreach ($this->reg_steps as $reg_step) {
763
-            $txn_reg_steps_array[ $reg_step->slug() ] = false;
763
+            $txn_reg_steps_array[$reg_step->slug()] = false;
764 764
         }
765 765
         return $txn_reg_steps_array;
766 766
     }
@@ -799,7 +799,7 @@  discard block
 block discarded – undo
799 799
      */
800 800
     public function stash_transaction_and_checkout()
801 801
     {
802
-        if (! $this->revisit) {
802
+        if ( ! $this->revisit) {
803 803
             $this->update_txn_reg_steps_array();
804 804
         }
805 805
         $this->track_transaction_and_registration_status_updates();
@@ -926,7 +926,7 @@  discard block
 block discarded – undo
926 926
             // should this registration be processed during this visit ?
927 927
             if ($this->visit_allows_processing_of_this_registration($registration)) {
928 928
                 // set TXN ID
929
-                if (! $registration->transaction_ID()) {
929
+                if ( ! $registration->transaction_ID()) {
930 930
                     $registration->set_transaction_id($this->transaction->ID());
931 931
                 }
932 932
                 // verify and save the attendee
@@ -936,7 +936,7 @@  discard block
 block discarded – undo
936 936
                 // save changes
937 937
                 $registration->save();
938 938
                 // update txn cache
939
-                if (! $this->transaction->update_cache_after_object_save('Registration', $registration)) {
939
+                if ( ! $this->transaction->update_cache_after_object_save('Registration', $registration)) {
940 940
                     if ($show_errors) {
941 941
                         EE_Error::add_error(
942 942
                             __(
@@ -979,7 +979,7 @@  discard block
 block discarded – undo
979 979
         if ($registration->attendee() instanceof EE_Attendee) {
980 980
             // save so that ATT has ID
981 981
             $registration->attendee()->save();
982
-            if (! $registration->update_cache_after_object_save('Attendee', $registration->attendee())) {
982
+            if ( ! $registration->update_cache_after_object_save('Attendee', $registration->attendee())) {
983 983
                 if ($show_errors) {
984 984
                     EE_Error::add_error(
985 985
                         __(
@@ -1028,7 +1028,7 @@  discard block
 block discarded – undo
1028 1028
             if ($answer instanceof EE_Answer) {
1029 1029
                 $answer->set_registration($registration->ID());
1030 1030
                 $answer->save();
1031
-                if (! $registration->update_cache_after_object_save('Answer', $answer, $cache_key)) {
1031
+                if ( ! $registration->update_cache_after_object_save('Answer', $answer, $cache_key)) {
1032 1032
                     if ($show_errors) {
1033 1033
                         EE_Error::add_error(
1034 1034
                             __(
@@ -1349,11 +1349,11 @@  discard block
 block discarded – undo
1349 1349
      */
1350 1350
     public function __wakeup()
1351 1351
     {
1352
-        if (! $this->primary_attendee_obj instanceof EE_Attendee && absint($this->primary_attendee_obj) !== 0) {
1352
+        if ( ! $this->primary_attendee_obj instanceof EE_Attendee && absint($this->primary_attendee_obj) !== 0) {
1353 1353
             // $this->primary_attendee_obj is actually just an ID, so use it to get the object from the db
1354 1354
             $this->primary_attendee_obj = EEM_Attendee::instance()->get_one_by_ID($this->primary_attendee_obj);
1355 1355
         }
1356
-        if (! $this->transaction instanceof EE_Transaction && absint($this->transaction) !== 0) {
1356
+        if ( ! $this->transaction instanceof EE_Transaction && absint($this->transaction) !== 0) {
1357 1357
             // $this->transaction is actually just an ID, so use it to get the object from the db
1358 1358
             $this->transaction = EEM_Transaction::instance()->get_one_by_ID($this->transaction);
1359 1359
         }
@@ -1377,9 +1377,9 @@  discard block
 block discarded – undo
1377 1377
     {
1378 1378
         $disabled = true;
1379 1379
         if (WP_DEBUG && ! $disabled) {
1380
-            $debug_data = get_option('EE_DEBUG_SPCO_' . EE_Session::instance()->id(), array());
1380
+            $debug_data = get_option('EE_DEBUG_SPCO_'.EE_Session::instance()->id(), array());
1381 1381
             $default_data = array(
1382
-                $class                    => $func . '() : ' . $line,
1382
+                $class                    => $func.'() : '.$line,
1383 1383
                 'request->step'           => $this->step,
1384 1384
                 'request->action'         => $this->action,
1385 1385
                 'current_step->slug'      => $this->current_step instanceof EE_SPCO_Reg_Step ?
@@ -1395,20 +1395,20 @@  discard block
 block discarded – undo
1395 1395
                 $default_data['TXN_status'] = $this->transaction->status_ID();
1396 1396
                 $default_data['TXN_reg_steps'] = $this->transaction->reg_steps();
1397 1397
                 foreach ($this->transaction->registrations($this->reg_cache_where_params) as $REG_ID => $registration) {
1398
-                    $default_data['registrations'][ $REG_ID ] = $registration->status_ID();
1398
+                    $default_data['registrations'][$REG_ID] = $registration->status_ID();
1399 1399
                 }
1400 1400
                 if ($this->transaction->ID()) {
1401
-                    $TXN_ID = 'EE_Transaction: ' . $this->transaction->ID();
1401
+                    $TXN_ID = 'EE_Transaction: '.$this->transaction->ID();
1402 1402
                     // don't serialize objects
1403 1403
                     $info = $this->_strip_objects($info);
1404
-                    if (! isset($debug_data[ $TXN_ID ])) {
1405
-                        $debug_data[ $TXN_ID ] = array();
1404
+                    if ( ! isset($debug_data[$TXN_ID])) {
1405
+                        $debug_data[$TXN_ID] = array();
1406 1406
                     }
1407
-                    $debug_data[ $TXN_ID ][ microtime() ] = array_merge(
1407
+                    $debug_data[$TXN_ID][microtime()] = array_merge(
1408 1408
                         $default_data,
1409 1409
                         $info
1410 1410
                     );
1411
-                    update_option('EE_DEBUG_SPCO_' . EE_Session::instance()->id(), $debug_data);
1411
+                    update_option('EE_DEBUG_SPCO_'.EE_Session::instance()->id(), $debug_data);
1412 1412
                 }
1413 1413
             }
1414 1414
         }
@@ -1425,17 +1425,17 @@  discard block
 block discarded – undo
1425 1425
     {
1426 1426
         foreach ((array) $info as $key => $value) {
1427 1427
             if (is_array($value)) {
1428
-                $info[ $key ] = $this->_strip_objects($value);
1428
+                $info[$key] = $this->_strip_objects($value);
1429 1429
             } elseif (is_object($value)) {
1430 1430
                 $object_class = get_class($value);
1431
-                $info[ $object_class ] = array();
1432
-                $info[ $object_class ]['ID'] = method_exists($value, 'ID') ? $value->ID() : 0;
1431
+                $info[$object_class] = array();
1432
+                $info[$object_class]['ID'] = method_exists($value, 'ID') ? $value->ID() : 0;
1433 1433
                 if (method_exists($value, 'status')) {
1434
-                    $info[ $object_class ]['status'] = $value->status();
1434
+                    $info[$object_class]['status'] = $value->status();
1435 1435
                 } elseif (method_exists($value, 'status_ID')) {
1436
-                    $info[ $object_class ]['status'] = $value->status_ID();
1436
+                    $info[$object_class]['status'] = $value->status_ID();
1437 1437
                 }
1438
-                unset($info[ $key ]);
1438
+                unset($info[$key]);
1439 1439
             }
1440 1440
         }
1441 1441
         return (array) $info;
Please login to merge, or discard this patch.
finalize_registration/EE_SPCO_Reg_Step_Finalize_Registration.class.php 2 patches
Spacing   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -92,14 +92,14 @@  discard block
 block discarded – undo
92 92
             $txn_update_params
93 93
         );
94 94
         // check if transaction has a primary registrant and that it has a related Attendee object
95
-        if (! $this->_validate_primary_registrant()) {
95
+        if ( ! $this->_validate_primary_registrant()) {
96 96
             return false;
97 97
         }
98 98
         // you don't have to go home but you can't stay here !
99 99
         $this->checkout->redirect = true;
100 100
         $this->checkout->continue_reg = true;
101 101
         $this->checkout->json_response->set_redirect_url($this->checkout->redirect_url);
102
-        if (! (
102
+        if ( ! (
103 103
             $this->checkout->payment_method instanceof EE_Payment_Method
104 104
             && $this->checkout->payment_method->is_off_site()
105 105
         )) {
@@ -210,7 +210,7 @@  discard block
 block discarded – undo
210 210
      */
211 211
     protected function _validate_primary_registrant()
212 212
     {
213
-        if (! $this->checkout->transaction_has_primary_registrant()) {
213
+        if ( ! $this->checkout->transaction_has_primary_registrant()) {
214 214
             EE_Error::add_error(
215 215
                 __('A valid Primary Registration for this Transaction could not be found.', 'event_espresso'),
216 216
                 __FILE__,
@@ -236,7 +236,7 @@  discard block
 block discarded – undo
236 236
     public function update_reg_step()
237 237
     {
238 238
         EE_Error::doing_it_wrong(
239
-            __CLASS__ . '::' . __FILE__,
239
+            __CLASS__.'::'.__FILE__,
240 240
             __(
241 241
                 'Can not call update_reg_step() on the Finalize Registration reg step.',
242 242
                 'event_espresso'
Please login to merge, or discard this patch.
Indentation   +236 added lines, -236 removed lines patch added patch discarded remove patch
@@ -12,240 +12,240 @@
 block discarded – undo
12 12
 class EE_SPCO_Reg_Step_Finalize_Registration extends EE_SPCO_Reg_Step
13 13
 {
14 14
 
15
-    /**
16
-     *    class constructor
17
-     *
18
-     * @access    public
19
-     * @param    EE_Checkout $checkout
20
-     */
21
-    public function __construct(EE_Checkout $checkout)
22
-    {
23
-        $this->_slug = 'finalize_registration';
24
-        $this->_name = __('Finalize Registration', 'event_espresso');
25
-        $this->_submit_button_text = $this->_name;
26
-        $this->_template = '';
27
-        $this->checkout = $checkout;
28
-    }
29
-
30
-
31
-    public function translate_js_strings()
32
-    {
33
-    }
34
-
35
-
36
-    public function enqueue_styles_and_scripts()
37
-    {
38
-    }
39
-
40
-
41
-    /**
42
-     * @return boolean
43
-     */
44
-    public function initialize_reg_step()
45
-    {
46
-        // there's actually no reg form to process if this is the final step
47
-        if ($this->is_current_step()) {
48
-            $this->checkout->step = $_REQUEST['step'] = $this->slug();
49
-            $this->checkout->action = $_REQUEST['action'] = 'process_reg_step';
50
-            $this->checkout->generate_reg_form = false;
51
-        }
52
-        return true;
53
-    }
54
-
55
-
56
-    /**
57
-     * @return string
58
-     * @throws \EE_Error
59
-     */
60
-    public function generate_reg_form()
61
-    {
62
-        // create empty form so that things don't break
63
-        $this->reg_form = new EE_Form_Section_Proper();
64
-        return '';
65
-    }
66
-
67
-
68
-    /**
69
-     * @return boolean
70
-     * @throws \RuntimeException
71
-     * @throws \EE_Error
72
-     */
73
-    public function process_reg_step()
74
-    {
75
-        // ensure all data gets refreshed from the db
76
-        $this->checkout->refresh_all_entities(true);
77
-        // ensures that all details and statuses for transaction, registration, and payments are updated
78
-        $txn_update_params = $this->_finalize_transaction();
79
-        // maybe send messages
80
-        $this->_set_notification_triggers();
81
-        // send messages
82
-        /** @type EE_Registration_Processor $registration_processor */
83
-        $registration_processor = EE_Registry::instance()->load_class('Registration_Processor');
84
-        $registration_processor->trigger_registration_update_notifications(
85
-            $this->checkout->transaction->primary_registration(),
86
-            $txn_update_params
87
-        );
88
-        // set a hook point
89
-        do_action(
90
-            'AHEE__EE_SPCO_Reg_Step_Finalize_Registration__process_reg_step__completed',
91
-            $this->checkout,
92
-            $txn_update_params
93
-        );
94
-        // check if transaction has a primary registrant and that it has a related Attendee object
95
-        if (! $this->_validate_primary_registrant()) {
96
-            return false;
97
-        }
98
-        // you don't have to go home but you can't stay here !
99
-        $this->checkout->redirect = true;
100
-        $this->checkout->continue_reg = true;
101
-        $this->checkout->json_response->set_redirect_url($this->checkout->redirect_url);
102
-        if (! (
103
-            $this->checkout->payment_method instanceof EE_Payment_Method
104
-            && $this->checkout->payment_method->is_off_site()
105
-        )) {
106
-            // mark this reg step as completed
107
-            $this->set_completed();
108
-        }
109
-        $this->checkout->set_exit_spco();
110
-        return true;
111
-    }
112
-
113
-
114
-    /**
115
-     * _finalize_transaction
116
-     * ensures that all details and statuses for transaction, registration, and payments are updated
117
-     *
118
-     * @return array
119
-     * @throws \RuntimeException
120
-     * @throws \EE_Error
121
-     */
122
-    protected function _finalize_transaction()
123
-    {
124
-        /** @type EE_Transaction_Processor $transaction_processor */
125
-        $transaction_processor = EE_Registry::instance()->load_class('Transaction_Processor');
126
-        // set revisit flag in txn processor
127
-        $transaction_processor->set_revisit($this->checkout->revisit);
128
-        // at this point we'll consider a TXN to not have been abandoned
129
-        $this->checkout->transaction->toggle_abandoned_transaction_status();
130
-        if ($this->checkout->cart instanceof EE_Cart) {
131
-            // save TXN data to the cart
132
-            $this->checkout->cart->get_grand_total()->save_this_and_descendants_to_txn(
133
-                $this->checkout->transaction->ID()
134
-            );
135
-        }
136
-        // maybe update status, but don't save transaction just yet
137
-        $this->checkout->transaction->update_status_based_on_total_paid(false);
138
-        // this will result in the base session properties getting saved to the TXN_Session_data field
139
-        $session_data = EE_Registry::instance()->SSN->get_session_data(null, true);
140
-        // anonymize the last part of the IP address, now that the transaction is complete (we won't be using the IP address
141
-        // for spam or bot detection now)
142
-        if (function_exists('wp_privacy_anonymize_ip') && isset($session_data['ip_address'])) {
143
-            $session_data['ip_address'] = wp_privacy_anonymize_ip($session_data['ip_address']);
144
-        }
145
-        $this->checkout->transaction->set_txn_session_data($session_data);
146
-        // update the TXN if payment conditions have changed, but do NOT trigger notifications,
147
-        // because we will do that in process_reg_step() after setting some more triggers
148
-        return $transaction_processor->update_transaction_and_registrations_after_checkout_or_payment(
149
-            $this->checkout->transaction,
150
-            $this->checkout->payment,
151
-            $this->checkout->reg_cache_where_params,
152
-            false
153
-        );
154
-    }
155
-
156
-
157
-    /**
158
-     * If request is not a revisit, and an Off-Site gateway using IPNs has NOT been selected...
159
-     * OR
160
-     * if it IS a revisit and the TXN and/or one or more REG statuses have changed...
161
-     * then trigger notifications
162
-     *
163
-     * @return void
164
-     * @throws \EE_Error
165
-     */
166
-    protected function _set_notification_triggers()
167
-    {
168
-
169
-        if ($this->checkout->payment_method instanceof EE_Payment_Method) {
170
-            // let's start with the assumption that we need to trigger notifications
171
-            // then toggle this to false for conditions where we know we don't need to
172
-            $deliver_notifications = true;
173
-            if (// if SPCO revisit
174
-                filter_var($this->checkout->revisit, FILTER_VALIDATE_BOOLEAN)
175
-                // and TXN or REG statuses have NOT changed due to a payment
176
-                && ! (
177
-                    $this->checkout->transaction->txn_status_updated()
178
-                    || $this->checkout->any_reg_status_updated()
179
-                )
180
-            ) {
181
-                $deliver_notifications = false;
182
-            }
183
-            if ($this->checkout->payment_method->is_off_site()) {
184
-                /** @var EE_Gateway $gateway */
185
-                $gateway = $this->checkout->payment_method->type_obj()->get_gateway();
186
-                // and the gateway uses a separate request to process the IPN
187
-                if ($gateway instanceof EE_Offsite_Gateway
188
-                    && $gateway->handle_IPN_in_this_request(\EE_Registry::instance()->REQ->params(), true)
189
-                ) {
190
-                    // IPN request will handle triggering notifications
191
-                    $deliver_notifications = false;
192
-                    // no really... don't send any notices in this request
193
-                    remove_all_filters('FHEE__EED_Messages___maybe_registration__deliver_notifications');
194
-                    add_filter(
195
-                        'FHEE__EED_Messages___maybe_registration__deliver_notifications',
196
-                        '__return_false',
197
-                        15
198
-                    );
199
-                }
200
-            }
201
-            if ($deliver_notifications) {
202
-                // send out notifications
203
-                add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10);
204
-            }
205
-        }
206
-    }
207
-
208
-
209
-    /**
210
-     * check if transaction has a primary registrant and that it has a related Attendee object
211
-     *
212
-     * @return boolean
213
-     * @throws \EE_Error
214
-     */
215
-    protected function _validate_primary_registrant()
216
-    {
217
-        if (! $this->checkout->transaction_has_primary_registrant()) {
218
-            EE_Error::add_error(
219
-                __('A valid Primary Registration for this Transaction could not be found.', 'event_espresso'),
220
-                __FILE__,
221
-                __FUNCTION__,
222
-                __LINE__
223
-            );
224
-            $this->checkout->redirect = false;
225
-            $this->checkout->continue_reg = false;
226
-            return false;
227
-        }
228
-        // setup URL for redirect
229
-        $this->checkout->redirect_url = add_query_arg(
230
-            array('e_reg_url_link' => $this->checkout->transaction->primary_registration()->reg_url_link()),
231
-            $this->checkout->thank_you_page_url
232
-        );
233
-        return true;
234
-    }
235
-
236
-
237
-    /**
238
-     * @return void
239
-     */
240
-    public function update_reg_step()
241
-    {
242
-        EE_Error::doing_it_wrong(
243
-            __CLASS__ . '::' . __FILE__,
244
-            __(
245
-                'Can not call update_reg_step() on the Finalize Registration reg step.',
246
-                'event_espresso'
247
-            ),
248
-            '4.6.0'
249
-        );
250
-    }
15
+	/**
16
+	 *    class constructor
17
+	 *
18
+	 * @access    public
19
+	 * @param    EE_Checkout $checkout
20
+	 */
21
+	public function __construct(EE_Checkout $checkout)
22
+	{
23
+		$this->_slug = 'finalize_registration';
24
+		$this->_name = __('Finalize Registration', 'event_espresso');
25
+		$this->_submit_button_text = $this->_name;
26
+		$this->_template = '';
27
+		$this->checkout = $checkout;
28
+	}
29
+
30
+
31
+	public function translate_js_strings()
32
+	{
33
+	}
34
+
35
+
36
+	public function enqueue_styles_and_scripts()
37
+	{
38
+	}
39
+
40
+
41
+	/**
42
+	 * @return boolean
43
+	 */
44
+	public function initialize_reg_step()
45
+	{
46
+		// there's actually no reg form to process if this is the final step
47
+		if ($this->is_current_step()) {
48
+			$this->checkout->step = $_REQUEST['step'] = $this->slug();
49
+			$this->checkout->action = $_REQUEST['action'] = 'process_reg_step';
50
+			$this->checkout->generate_reg_form = false;
51
+		}
52
+		return true;
53
+	}
54
+
55
+
56
+	/**
57
+	 * @return string
58
+	 * @throws \EE_Error
59
+	 */
60
+	public function generate_reg_form()
61
+	{
62
+		// create empty form so that things don't break
63
+		$this->reg_form = new EE_Form_Section_Proper();
64
+		return '';
65
+	}
66
+
67
+
68
+	/**
69
+	 * @return boolean
70
+	 * @throws \RuntimeException
71
+	 * @throws \EE_Error
72
+	 */
73
+	public function process_reg_step()
74
+	{
75
+		// ensure all data gets refreshed from the db
76
+		$this->checkout->refresh_all_entities(true);
77
+		// ensures that all details and statuses for transaction, registration, and payments are updated
78
+		$txn_update_params = $this->_finalize_transaction();
79
+		// maybe send messages
80
+		$this->_set_notification_triggers();
81
+		// send messages
82
+		/** @type EE_Registration_Processor $registration_processor */
83
+		$registration_processor = EE_Registry::instance()->load_class('Registration_Processor');
84
+		$registration_processor->trigger_registration_update_notifications(
85
+			$this->checkout->transaction->primary_registration(),
86
+			$txn_update_params
87
+		);
88
+		// set a hook point
89
+		do_action(
90
+			'AHEE__EE_SPCO_Reg_Step_Finalize_Registration__process_reg_step__completed',
91
+			$this->checkout,
92
+			$txn_update_params
93
+		);
94
+		// check if transaction has a primary registrant and that it has a related Attendee object
95
+		if (! $this->_validate_primary_registrant()) {
96
+			return false;
97
+		}
98
+		// you don't have to go home but you can't stay here !
99
+		$this->checkout->redirect = true;
100
+		$this->checkout->continue_reg = true;
101
+		$this->checkout->json_response->set_redirect_url($this->checkout->redirect_url);
102
+		if (! (
103
+			$this->checkout->payment_method instanceof EE_Payment_Method
104
+			&& $this->checkout->payment_method->is_off_site()
105
+		)) {
106
+			// mark this reg step as completed
107
+			$this->set_completed();
108
+		}
109
+		$this->checkout->set_exit_spco();
110
+		return true;
111
+	}
112
+
113
+
114
+	/**
115
+	 * _finalize_transaction
116
+	 * ensures that all details and statuses for transaction, registration, and payments are updated
117
+	 *
118
+	 * @return array
119
+	 * @throws \RuntimeException
120
+	 * @throws \EE_Error
121
+	 */
122
+	protected function _finalize_transaction()
123
+	{
124
+		/** @type EE_Transaction_Processor $transaction_processor */
125
+		$transaction_processor = EE_Registry::instance()->load_class('Transaction_Processor');
126
+		// set revisit flag in txn processor
127
+		$transaction_processor->set_revisit($this->checkout->revisit);
128
+		// at this point we'll consider a TXN to not have been abandoned
129
+		$this->checkout->transaction->toggle_abandoned_transaction_status();
130
+		if ($this->checkout->cart instanceof EE_Cart) {
131
+			// save TXN data to the cart
132
+			$this->checkout->cart->get_grand_total()->save_this_and_descendants_to_txn(
133
+				$this->checkout->transaction->ID()
134
+			);
135
+		}
136
+		// maybe update status, but don't save transaction just yet
137
+		$this->checkout->transaction->update_status_based_on_total_paid(false);
138
+		// this will result in the base session properties getting saved to the TXN_Session_data field
139
+		$session_data = EE_Registry::instance()->SSN->get_session_data(null, true);
140
+		// anonymize the last part of the IP address, now that the transaction is complete (we won't be using the IP address
141
+		// for spam or bot detection now)
142
+		if (function_exists('wp_privacy_anonymize_ip') && isset($session_data['ip_address'])) {
143
+			$session_data['ip_address'] = wp_privacy_anonymize_ip($session_data['ip_address']);
144
+		}
145
+		$this->checkout->transaction->set_txn_session_data($session_data);
146
+		// update the TXN if payment conditions have changed, but do NOT trigger notifications,
147
+		// because we will do that in process_reg_step() after setting some more triggers
148
+		return $transaction_processor->update_transaction_and_registrations_after_checkout_or_payment(
149
+			$this->checkout->transaction,
150
+			$this->checkout->payment,
151
+			$this->checkout->reg_cache_where_params,
152
+			false
153
+		);
154
+	}
155
+
156
+
157
+	/**
158
+	 * If request is not a revisit, and an Off-Site gateway using IPNs has NOT been selected...
159
+	 * OR
160
+	 * if it IS a revisit and the TXN and/or one or more REG statuses have changed...
161
+	 * then trigger notifications
162
+	 *
163
+	 * @return void
164
+	 * @throws \EE_Error
165
+	 */
166
+	protected function _set_notification_triggers()
167
+	{
168
+
169
+		if ($this->checkout->payment_method instanceof EE_Payment_Method) {
170
+			// let's start with the assumption that we need to trigger notifications
171
+			// then toggle this to false for conditions where we know we don't need to
172
+			$deliver_notifications = true;
173
+			if (// if SPCO revisit
174
+				filter_var($this->checkout->revisit, FILTER_VALIDATE_BOOLEAN)
175
+				// and TXN or REG statuses have NOT changed due to a payment
176
+				&& ! (
177
+					$this->checkout->transaction->txn_status_updated()
178
+					|| $this->checkout->any_reg_status_updated()
179
+				)
180
+			) {
181
+				$deliver_notifications = false;
182
+			}
183
+			if ($this->checkout->payment_method->is_off_site()) {
184
+				/** @var EE_Gateway $gateway */
185
+				$gateway = $this->checkout->payment_method->type_obj()->get_gateway();
186
+				// and the gateway uses a separate request to process the IPN
187
+				if ($gateway instanceof EE_Offsite_Gateway
188
+					&& $gateway->handle_IPN_in_this_request(\EE_Registry::instance()->REQ->params(), true)
189
+				) {
190
+					// IPN request will handle triggering notifications
191
+					$deliver_notifications = false;
192
+					// no really... don't send any notices in this request
193
+					remove_all_filters('FHEE__EED_Messages___maybe_registration__deliver_notifications');
194
+					add_filter(
195
+						'FHEE__EED_Messages___maybe_registration__deliver_notifications',
196
+						'__return_false',
197
+						15
198
+					);
199
+				}
200
+			}
201
+			if ($deliver_notifications) {
202
+				// send out notifications
203
+				add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10);
204
+			}
205
+		}
206
+	}
207
+
208
+
209
+	/**
210
+	 * check if transaction has a primary registrant and that it has a related Attendee object
211
+	 *
212
+	 * @return boolean
213
+	 * @throws \EE_Error
214
+	 */
215
+	protected function _validate_primary_registrant()
216
+	{
217
+		if (! $this->checkout->transaction_has_primary_registrant()) {
218
+			EE_Error::add_error(
219
+				__('A valid Primary Registration for this Transaction could not be found.', 'event_espresso'),
220
+				__FILE__,
221
+				__FUNCTION__,
222
+				__LINE__
223
+			);
224
+			$this->checkout->redirect = false;
225
+			$this->checkout->continue_reg = false;
226
+			return false;
227
+		}
228
+		// setup URL for redirect
229
+		$this->checkout->redirect_url = add_query_arg(
230
+			array('e_reg_url_link' => $this->checkout->transaction->primary_registration()->reg_url_link()),
231
+			$this->checkout->thank_you_page_url
232
+		);
233
+		return true;
234
+	}
235
+
236
+
237
+	/**
238
+	 * @return void
239
+	 */
240
+	public function update_reg_step()
241
+	{
242
+		EE_Error::doing_it_wrong(
243
+			__CLASS__ . '::' . __FILE__,
244
+			__(
245
+				'Can not call update_reg_step() on the Finalize Registration reg step.',
246
+				'event_espresso'
247
+			),
248
+			'4.6.0'
249
+		);
250
+	}
251 251
 }
Please login to merge, or discard this patch.
admin_pages/registrations/EE_Attendee_Contact_List_Table.class.php 2 patches
Indentation   +370 added lines, -370 removed lines patch added patch discarded remove patch
@@ -12,374 +12,374 @@
 block discarded – undo
12 12
  */
13 13
 class EE_Attendee_Contact_List_Table extends EE_Admin_List_Table
14 14
 {
15
-    /**
16
-     * Initial setup of data (called by parent).
17
-     */
18
-    protected function _setup_data()
19
-    {
20
-        $this->_data = $this->_view !== 'trash'
21
-            ? $this->_admin_page->get_attendees($this->_per_page)
22
-            : $this->_admin_page->get_attendees($this->_per_page, false, true);
23
-        $this->_all_data_count = $this->_view !== 'trash'
24
-            ? $this->_admin_page->get_attendees($this->_per_page, true)
25
-            : $this->_admin_page->get_attendees($this->_per_page, true, true);
26
-    }
27
-
28
-
29
-    /**
30
-     * Initial setup of properties.
31
-     */
32
-    protected function _set_properties()
33
-    {
34
-        $this->_wp_list_args = array(
35
-            'singular' => esc_html__('attendee', 'event_espresso'),
36
-            'plural'   => esc_html__('attendees', 'event_espresso'),
37
-            'ajax'     => true,
38
-            'screen'   => $this->_admin_page->get_current_screen()->id,
39
-        );
40
-
41
-        $this->_columns = array(
42
-            'cb'                 => '<input type="checkbox" />', // Render a checkbox instead of text
43
-            'ATT_ID'             => esc_html__('ID', 'event_espresso'),
44
-            'ATT_fname'          => esc_html__('First Name', 'event_espresso'),
45
-            'ATT_lname'          => esc_html__('Last Name', 'event_espresso'),
46
-            'ATT_email'          => esc_html__('Email Address', 'event_espresso'),
47
-            'Registration_Count' => esc_html__('# Registrations', 'event_espresso'),
48
-            'ATT_phone'          => esc_html__('Phone', 'event_espresso'),
49
-            'ATT_address'        => esc_html__('Address', 'event_espresso'),
50
-            'ATT_city'           => esc_html__('City', 'event_espresso'),
51
-            'STA_ID'             => esc_html__('State/Province', 'event_espresso'),
52
-            'CNT_ISO'            => esc_html__('Country', 'event_espresso'),
53
-        );
54
-
55
-        $this->_sortable_columns = array(
56
-            'ATT_ID'             => array('ATT_ID' => false),
57
-            'ATT_lname'          => array('ATT_lname' => true), // true means its already sorted
58
-            'ATT_fname'          => array('ATT_fname' => false),
59
-            'ATT_email'          => array('ATT_email' => false),
60
-            'Registration_Count' => array('Registration_Count' => false),
61
-            'ATT_city'           => array('ATT_city' => false),
62
-            'STA_ID'             => array('STA_ID' => false),
63
-            'CNT_ISO'            => array('CNT_ISO' => false),
64
-        );
65
-
66
-        $this->_hidden_columns = array(
67
-            'ATT_phone',
68
-            'ATT_address',
69
-            'ATT_city',
70
-            'STA_ID',
71
-            'CNT_ISO',
72
-        );
73
-    }
74
-
75
-
76
-    /**
77
-     * Initial setup of filters
78
-     *
79
-     * @return array
80
-     */
81
-    protected function _get_table_filters()
82
-    {
83
-        return array();
84
-    }
85
-
86
-
87
-    /**
88
-     * Initial setup of counts for views
89
-     *
90
-     * @throws InvalidArgumentException
91
-     * @throws InvalidDataTypeException
92
-     * @throws InvalidInterfaceException
93
-     */
94
-    protected function _add_view_counts()
95
-    {
96
-        $this->_views['in_use']['count'] = $this->_admin_page->get_attendees($this->_per_page, true);
97
-        if (EE_Registry::instance()->CAP->current_user_can(
98
-            'ee_delete_contacts',
99
-            'espresso_registrations_delete_registration'
100
-        )) {
101
-            $this->_views['trash']['count'] = $this->_admin_page->get_attendees($this->_per_page, true, true);
102
-        }
103
-    }
104
-
105
-
106
-    /**
107
-     * Get count of attendees.
108
-     *
109
-     * @return int
110
-     * @throws EE_Error
111
-     * @throws InvalidArgumentException
112
-     * @throws InvalidDataTypeException
113
-     * @throws InvalidInterfaceException
114
-     */
115
-    protected function _get_attendees_count()
116
-    {
117
-        return EEM_Attendee::instance()->count();
118
-    }
119
-
120
-
121
-    /**
122
-     * Checkbox column
123
-     *
124
-     * @param EE_Attendee $attendee Unable to typehint this method because overrides parent.
125
-     * @return string
126
-     * @throws EE_Error
127
-     */
128
-    public function column_cb($attendee)
129
-    {
130
-        if (! $attendee instanceof EE_Attendee) {
131
-            return '';
132
-        }
133
-        return sprintf(
134
-            '<input type="checkbox" name="checkbox[%1$s]" value="%1$s" />',
135
-            $attendee->ID()
136
-        );
137
-    }
138
-
139
-
140
-    /**
141
-     * ATT_ID column
142
-     *
143
-     * @param EE_Attendee $attendee
144
-     * @return string
145
-     * @throws EE_Error
146
-     */
147
-    public function column_ATT_ID(EE_Attendee $attendee)
148
-    {
149
-        $content = $attendee->ID();
150
-        $attendee_name = $attendee instanceof EE_Attendee ? $attendee->full_name() : '';
151
-        $content .= '  <span class="show-on-mobile-view-only">' . $attendee_name . '</span>';
152
-        return $content;
153
-    }
154
-
155
-
156
-    /**
157
-     * ATT_lname column
158
-     *
159
-     * @param EE_Attendee $attendee
160
-     * @return string
161
-     * @throws InvalidArgumentException
162
-     * @throws InvalidDataTypeException
163
-     * @throws InvalidInterfaceException
164
-     * @throws EE_Error
165
-     */
166
-    public function column_ATT_lname(EE_Attendee $attendee)
167
-    {
168
-        // edit attendee link
169
-        $edit_lnk_url = EE_Admin_Page::add_query_args_and_nonce(
170
-            array(
171
-                'action' => 'edit_attendee',
172
-                'post'   => $attendee->ID(),
173
-            ),
174
-            REG_ADMIN_URL
175
-        );
176
-        $name_link = EE_Registry::instance()->CAP->current_user_can(
177
-            'ee_edit_contacts',
178
-            'espresso_registrations_edit_attendee'
179
-        )
180
-            ? '<a href="' . $edit_lnk_url . '" title="'
181
-              . esc_attr__('Edit Contact', 'event_espresso') . '">'
182
-              . $attendee->lname() . '</a>'
183
-            : $attendee->lname();
184
-        return $name_link;
185
-    }
186
-
187
-
188
-    /**
189
-     * ATT_fname column
190
-     *
191
-     * @param EE_Attendee $attendee
192
-     * @return string
193
-     * @throws InvalidArgumentException
194
-     * @throws InvalidDataTypeException
195
-     * @throws InvalidInterfaceException
196
-     * @throws EE_Error
197
-     */
198
-    public function column_ATT_fname(EE_Attendee $attendee)
199
-    {
200
-        // Build row actions
201
-        $actions = array();
202
-        // edit attendee link
203
-        if (EE_Registry::instance()->CAP->current_user_can(
204
-            'ee_edit_contacts',
205
-            'espresso_registrations_edit_attendee'
206
-        )) {
207
-            $edit_lnk_url = EE_Admin_Page::add_query_args_and_nonce(
208
-                array(
209
-                    'action' => 'edit_attendee',
210
-                    'post'   => $attendee->ID(),
211
-                ),
212
-                REG_ADMIN_URL
213
-            );
214
-            $actions['edit'] = '<a href="' . $edit_lnk_url . '" title="'
215
-                               . esc_attr__('Edit Contact', 'event_espresso') . '">'
216
-                               . esc_html__('Edit', 'event_espresso') . '</a>';
217
-        }
218
-
219
-        if ($this->_view === 'in_use') {
220
-            // trash attendee link
221
-            if (EE_Registry::instance()->CAP->current_user_can(
222
-                'ee_delete_contacts',
223
-                'espresso_registrations_trash_attendees'
224
-            )) {
225
-                $trash_lnk_url = EE_Admin_Page::add_query_args_and_nonce(
226
-                    array(
227
-                        'action' => 'trash_attendee',
228
-                        'ATT_ID' => $attendee->ID(),
229
-                    ),
230
-                    REG_ADMIN_URL
231
-                );
232
-                $actions['trash'] = '<a href="' . $trash_lnk_url . '" title="'
233
-                                    . esc_attr__('Move Contact to Trash', 'event_espresso')
234
-                                    . '">' . esc_html__('Trash', 'event_espresso') . '</a>';
235
-            }
236
-        } else {
237
-            if (EE_Registry::instance()->CAP->current_user_can(
238
-                'ee_delete_contacts',
239
-                'espresso_registrations_restore_attendees'
240
-            )) {
241
-                // restore attendee link
242
-                $restore_lnk_url = EE_Admin_Page::add_query_args_and_nonce(
243
-                    array(
244
-                        'action' => 'restore_attendees',
245
-                        'ATT_ID' => $attendee->ID(),
246
-                    ),
247
-                    REG_ADMIN_URL
248
-                );
249
-                $actions['restore'] = '<a href="' . $restore_lnk_url . '" title="'
250
-                                      . esc_attr__('Restore Contact', 'event_espresso') . '">'
251
-                                      . esc_html__('Restore', 'event_espresso') . '</a>';
252
-            }
253
-        }
254
-
255
-        $edit_lnk_url = EE_Admin_Page::add_query_args_and_nonce(
256
-            array(
257
-                'action' => 'edit_attendee',
258
-                'post'   => $attendee->ID(),
259
-            ),
260
-            REG_ADMIN_URL
261
-        );
262
-        $name_link = EE_Registry::instance()->CAP->current_user_can(
263
-            'ee_edit_contacts',
264
-            'espresso_registrations_edit_attendee'
265
-        )
266
-            ? '<a href="' . $edit_lnk_url . '" title="'
267
-              . esc_attr__('Edit Contact', 'event_espresso') . '">' . $attendee->fname() . '</a>'
268
-            : $attendee->fname();
269
-
270
-        // Return the name contents
271
-        return sprintf('%1$s %2$s', $name_link, $this->row_actions($actions));
272
-    }
273
-
274
-
275
-    /**
276
-     * Email Column
277
-     *
278
-     * @param EE_Attendee $attendee
279
-     * @return string
280
-     * @throws EE_Error
281
-     */
282
-    public function column_ATT_email(EE_Attendee $attendee)
283
-    {
284
-        return '<a href="mailto:' . $attendee->email() . '">' . $attendee->email() . '</a>';
285
-    }
286
-
287
-
288
-    /**
289
-     * Column displaying count of registrations attached to Attendee.
290
-     *
291
-     * @param EE_Attendee $attendee
292
-     * @return string
293
-     * @throws EE_Error
294
-     */
295
-    public function column_Registration_Count(EE_Attendee $attendee)
296
-    {
297
-        $link = EEH_URL::add_query_args_and_nonce(
298
-            array(
299
-                'action' => 'default',
300
-                'ATT_ID' => $attendee->ID(),
301
-            ),
302
-            REG_ADMIN_URL
303
-        );
304
-        return '<a href="' . $link . '">' . $attendee->getCustomSelect('Registration_Count') . '</a>';
305
-    }
306
-
307
-
308
-    /**
309
-     * ATT_address column
310
-     *
311
-     * @param EE_Attendee $attendee
312
-     * @return mixed
313
-     * @throws EE_Error
314
-     */
315
-    public function column_ATT_address(EE_Attendee $attendee)
316
-    {
317
-        return $attendee->address();
318
-    }
319
-
320
-
321
-    /**
322
-     * ATT_city column
323
-     *
324
-     * @param EE_Attendee $attendee
325
-     * @return mixed
326
-     * @throws EE_Error
327
-     */
328
-    public function column_ATT_city(EE_Attendee $attendee)
329
-    {
330
-        return $attendee->city();
331
-    }
332
-
333
-
334
-    /**
335
-     * State Column
336
-     *
337
-     * @param EE_Attendee $attendee
338
-     * @return string
339
-     * @throws EE_Error
340
-     * @throws InvalidArgumentException
341
-     * @throws InvalidDataTypeException
342
-     * @throws InvalidInterfaceException
343
-     */
344
-    public function column_STA_ID(EE_Attendee $attendee)
345
-    {
346
-        $states = EEM_State::instance()->get_all_states();
347
-        $state = isset($states[ $attendee->state_ID() ])
348
-            ? $states[ $attendee->state_ID() ]->get('STA_name')
349
-            : $attendee->state_ID();
350
-        return ! is_numeric($state) ? $state : '';
351
-    }
352
-
353
-
354
-    /**
355
-     * Country Column
356
-     *
357
-     * @param EE_Attendee $attendee
358
-     * @return string
359
-     * @throws EE_Error
360
-     * @throws InvalidArgumentException
361
-     * @throws InvalidDataTypeException
362
-     * @throws InvalidInterfaceException
363
-     */
364
-    public function column_CNT_ISO(EE_Attendee $attendee)
365
-    {
366
-        $countries = EEM_Country::instance()->get_all_countries();
367
-        $country = isset($countries[ $attendee->country_ID() ])
368
-            ? $countries[ $attendee->country_ID() ]->get('CNT_name')
369
-            : $attendee->country_ID();
370
-        return ! is_numeric($country) ? $country : '';
371
-    }
372
-
373
-
374
-    /**
375
-     * Phone Number column
376
-     *
377
-     * @param EE_Attendee $attendee
378
-     * @return mixed
379
-     * @throws EE_Error
380
-     */
381
-    public function column_ATT_phone(EE_Attendee $attendee)
382
-    {
383
-        return $attendee->phone();
384
-    }
15
+	/**
16
+	 * Initial setup of data (called by parent).
17
+	 */
18
+	protected function _setup_data()
19
+	{
20
+		$this->_data = $this->_view !== 'trash'
21
+			? $this->_admin_page->get_attendees($this->_per_page)
22
+			: $this->_admin_page->get_attendees($this->_per_page, false, true);
23
+		$this->_all_data_count = $this->_view !== 'trash'
24
+			? $this->_admin_page->get_attendees($this->_per_page, true)
25
+			: $this->_admin_page->get_attendees($this->_per_page, true, true);
26
+	}
27
+
28
+
29
+	/**
30
+	 * Initial setup of properties.
31
+	 */
32
+	protected function _set_properties()
33
+	{
34
+		$this->_wp_list_args = array(
35
+			'singular' => esc_html__('attendee', 'event_espresso'),
36
+			'plural'   => esc_html__('attendees', 'event_espresso'),
37
+			'ajax'     => true,
38
+			'screen'   => $this->_admin_page->get_current_screen()->id,
39
+		);
40
+
41
+		$this->_columns = array(
42
+			'cb'                 => '<input type="checkbox" />', // Render a checkbox instead of text
43
+			'ATT_ID'             => esc_html__('ID', 'event_espresso'),
44
+			'ATT_fname'          => esc_html__('First Name', 'event_espresso'),
45
+			'ATT_lname'          => esc_html__('Last Name', 'event_espresso'),
46
+			'ATT_email'          => esc_html__('Email Address', 'event_espresso'),
47
+			'Registration_Count' => esc_html__('# Registrations', 'event_espresso'),
48
+			'ATT_phone'          => esc_html__('Phone', 'event_espresso'),
49
+			'ATT_address'        => esc_html__('Address', 'event_espresso'),
50
+			'ATT_city'           => esc_html__('City', 'event_espresso'),
51
+			'STA_ID'             => esc_html__('State/Province', 'event_espresso'),
52
+			'CNT_ISO'            => esc_html__('Country', 'event_espresso'),
53
+		);
54
+
55
+		$this->_sortable_columns = array(
56
+			'ATT_ID'             => array('ATT_ID' => false),
57
+			'ATT_lname'          => array('ATT_lname' => true), // true means its already sorted
58
+			'ATT_fname'          => array('ATT_fname' => false),
59
+			'ATT_email'          => array('ATT_email' => false),
60
+			'Registration_Count' => array('Registration_Count' => false),
61
+			'ATT_city'           => array('ATT_city' => false),
62
+			'STA_ID'             => array('STA_ID' => false),
63
+			'CNT_ISO'            => array('CNT_ISO' => false),
64
+		);
65
+
66
+		$this->_hidden_columns = array(
67
+			'ATT_phone',
68
+			'ATT_address',
69
+			'ATT_city',
70
+			'STA_ID',
71
+			'CNT_ISO',
72
+		);
73
+	}
74
+
75
+
76
+	/**
77
+	 * Initial setup of filters
78
+	 *
79
+	 * @return array
80
+	 */
81
+	protected function _get_table_filters()
82
+	{
83
+		return array();
84
+	}
85
+
86
+
87
+	/**
88
+	 * Initial setup of counts for views
89
+	 *
90
+	 * @throws InvalidArgumentException
91
+	 * @throws InvalidDataTypeException
92
+	 * @throws InvalidInterfaceException
93
+	 */
94
+	protected function _add_view_counts()
95
+	{
96
+		$this->_views['in_use']['count'] = $this->_admin_page->get_attendees($this->_per_page, true);
97
+		if (EE_Registry::instance()->CAP->current_user_can(
98
+			'ee_delete_contacts',
99
+			'espresso_registrations_delete_registration'
100
+		)) {
101
+			$this->_views['trash']['count'] = $this->_admin_page->get_attendees($this->_per_page, true, true);
102
+		}
103
+	}
104
+
105
+
106
+	/**
107
+	 * Get count of attendees.
108
+	 *
109
+	 * @return int
110
+	 * @throws EE_Error
111
+	 * @throws InvalidArgumentException
112
+	 * @throws InvalidDataTypeException
113
+	 * @throws InvalidInterfaceException
114
+	 */
115
+	protected function _get_attendees_count()
116
+	{
117
+		return EEM_Attendee::instance()->count();
118
+	}
119
+
120
+
121
+	/**
122
+	 * Checkbox column
123
+	 *
124
+	 * @param EE_Attendee $attendee Unable to typehint this method because overrides parent.
125
+	 * @return string
126
+	 * @throws EE_Error
127
+	 */
128
+	public function column_cb($attendee)
129
+	{
130
+		if (! $attendee instanceof EE_Attendee) {
131
+			return '';
132
+		}
133
+		return sprintf(
134
+			'<input type="checkbox" name="checkbox[%1$s]" value="%1$s" />',
135
+			$attendee->ID()
136
+		);
137
+	}
138
+
139
+
140
+	/**
141
+	 * ATT_ID column
142
+	 *
143
+	 * @param EE_Attendee $attendee
144
+	 * @return string
145
+	 * @throws EE_Error
146
+	 */
147
+	public function column_ATT_ID(EE_Attendee $attendee)
148
+	{
149
+		$content = $attendee->ID();
150
+		$attendee_name = $attendee instanceof EE_Attendee ? $attendee->full_name() : '';
151
+		$content .= '  <span class="show-on-mobile-view-only">' . $attendee_name . '</span>';
152
+		return $content;
153
+	}
154
+
155
+
156
+	/**
157
+	 * ATT_lname column
158
+	 *
159
+	 * @param EE_Attendee $attendee
160
+	 * @return string
161
+	 * @throws InvalidArgumentException
162
+	 * @throws InvalidDataTypeException
163
+	 * @throws InvalidInterfaceException
164
+	 * @throws EE_Error
165
+	 */
166
+	public function column_ATT_lname(EE_Attendee $attendee)
167
+	{
168
+		// edit attendee link
169
+		$edit_lnk_url = EE_Admin_Page::add_query_args_and_nonce(
170
+			array(
171
+				'action' => 'edit_attendee',
172
+				'post'   => $attendee->ID(),
173
+			),
174
+			REG_ADMIN_URL
175
+		);
176
+		$name_link = EE_Registry::instance()->CAP->current_user_can(
177
+			'ee_edit_contacts',
178
+			'espresso_registrations_edit_attendee'
179
+		)
180
+			? '<a href="' . $edit_lnk_url . '" title="'
181
+			  . esc_attr__('Edit Contact', 'event_espresso') . '">'
182
+			  . $attendee->lname() . '</a>'
183
+			: $attendee->lname();
184
+		return $name_link;
185
+	}
186
+
187
+
188
+	/**
189
+	 * ATT_fname column
190
+	 *
191
+	 * @param EE_Attendee $attendee
192
+	 * @return string
193
+	 * @throws InvalidArgumentException
194
+	 * @throws InvalidDataTypeException
195
+	 * @throws InvalidInterfaceException
196
+	 * @throws EE_Error
197
+	 */
198
+	public function column_ATT_fname(EE_Attendee $attendee)
199
+	{
200
+		// Build row actions
201
+		$actions = array();
202
+		// edit attendee link
203
+		if (EE_Registry::instance()->CAP->current_user_can(
204
+			'ee_edit_contacts',
205
+			'espresso_registrations_edit_attendee'
206
+		)) {
207
+			$edit_lnk_url = EE_Admin_Page::add_query_args_and_nonce(
208
+				array(
209
+					'action' => 'edit_attendee',
210
+					'post'   => $attendee->ID(),
211
+				),
212
+				REG_ADMIN_URL
213
+			);
214
+			$actions['edit'] = '<a href="' . $edit_lnk_url . '" title="'
215
+							   . esc_attr__('Edit Contact', 'event_espresso') . '">'
216
+							   . esc_html__('Edit', 'event_espresso') . '</a>';
217
+		}
218
+
219
+		if ($this->_view === 'in_use') {
220
+			// trash attendee link
221
+			if (EE_Registry::instance()->CAP->current_user_can(
222
+				'ee_delete_contacts',
223
+				'espresso_registrations_trash_attendees'
224
+			)) {
225
+				$trash_lnk_url = EE_Admin_Page::add_query_args_and_nonce(
226
+					array(
227
+						'action' => 'trash_attendee',
228
+						'ATT_ID' => $attendee->ID(),
229
+					),
230
+					REG_ADMIN_URL
231
+				);
232
+				$actions['trash'] = '<a href="' . $trash_lnk_url . '" title="'
233
+									. esc_attr__('Move Contact to Trash', 'event_espresso')
234
+									. '">' . esc_html__('Trash', 'event_espresso') . '</a>';
235
+			}
236
+		} else {
237
+			if (EE_Registry::instance()->CAP->current_user_can(
238
+				'ee_delete_contacts',
239
+				'espresso_registrations_restore_attendees'
240
+			)) {
241
+				// restore attendee link
242
+				$restore_lnk_url = EE_Admin_Page::add_query_args_and_nonce(
243
+					array(
244
+						'action' => 'restore_attendees',
245
+						'ATT_ID' => $attendee->ID(),
246
+					),
247
+					REG_ADMIN_URL
248
+				);
249
+				$actions['restore'] = '<a href="' . $restore_lnk_url . '" title="'
250
+									  . esc_attr__('Restore Contact', 'event_espresso') . '">'
251
+									  . esc_html__('Restore', 'event_espresso') . '</a>';
252
+			}
253
+		}
254
+
255
+		$edit_lnk_url = EE_Admin_Page::add_query_args_and_nonce(
256
+			array(
257
+				'action' => 'edit_attendee',
258
+				'post'   => $attendee->ID(),
259
+			),
260
+			REG_ADMIN_URL
261
+		);
262
+		$name_link = EE_Registry::instance()->CAP->current_user_can(
263
+			'ee_edit_contacts',
264
+			'espresso_registrations_edit_attendee'
265
+		)
266
+			? '<a href="' . $edit_lnk_url . '" title="'
267
+			  . esc_attr__('Edit Contact', 'event_espresso') . '">' . $attendee->fname() . '</a>'
268
+			: $attendee->fname();
269
+
270
+		// Return the name contents
271
+		return sprintf('%1$s %2$s', $name_link, $this->row_actions($actions));
272
+	}
273
+
274
+
275
+	/**
276
+	 * Email Column
277
+	 *
278
+	 * @param EE_Attendee $attendee
279
+	 * @return string
280
+	 * @throws EE_Error
281
+	 */
282
+	public function column_ATT_email(EE_Attendee $attendee)
283
+	{
284
+		return '<a href="mailto:' . $attendee->email() . '">' . $attendee->email() . '</a>';
285
+	}
286
+
287
+
288
+	/**
289
+	 * Column displaying count of registrations attached to Attendee.
290
+	 *
291
+	 * @param EE_Attendee $attendee
292
+	 * @return string
293
+	 * @throws EE_Error
294
+	 */
295
+	public function column_Registration_Count(EE_Attendee $attendee)
296
+	{
297
+		$link = EEH_URL::add_query_args_and_nonce(
298
+			array(
299
+				'action' => 'default',
300
+				'ATT_ID' => $attendee->ID(),
301
+			),
302
+			REG_ADMIN_URL
303
+		);
304
+		return '<a href="' . $link . '">' . $attendee->getCustomSelect('Registration_Count') . '</a>';
305
+	}
306
+
307
+
308
+	/**
309
+	 * ATT_address column
310
+	 *
311
+	 * @param EE_Attendee $attendee
312
+	 * @return mixed
313
+	 * @throws EE_Error
314
+	 */
315
+	public function column_ATT_address(EE_Attendee $attendee)
316
+	{
317
+		return $attendee->address();
318
+	}
319
+
320
+
321
+	/**
322
+	 * ATT_city column
323
+	 *
324
+	 * @param EE_Attendee $attendee
325
+	 * @return mixed
326
+	 * @throws EE_Error
327
+	 */
328
+	public function column_ATT_city(EE_Attendee $attendee)
329
+	{
330
+		return $attendee->city();
331
+	}
332
+
333
+
334
+	/**
335
+	 * State Column
336
+	 *
337
+	 * @param EE_Attendee $attendee
338
+	 * @return string
339
+	 * @throws EE_Error
340
+	 * @throws InvalidArgumentException
341
+	 * @throws InvalidDataTypeException
342
+	 * @throws InvalidInterfaceException
343
+	 */
344
+	public function column_STA_ID(EE_Attendee $attendee)
345
+	{
346
+		$states = EEM_State::instance()->get_all_states();
347
+		$state = isset($states[ $attendee->state_ID() ])
348
+			? $states[ $attendee->state_ID() ]->get('STA_name')
349
+			: $attendee->state_ID();
350
+		return ! is_numeric($state) ? $state : '';
351
+	}
352
+
353
+
354
+	/**
355
+	 * Country Column
356
+	 *
357
+	 * @param EE_Attendee $attendee
358
+	 * @return string
359
+	 * @throws EE_Error
360
+	 * @throws InvalidArgumentException
361
+	 * @throws InvalidDataTypeException
362
+	 * @throws InvalidInterfaceException
363
+	 */
364
+	public function column_CNT_ISO(EE_Attendee $attendee)
365
+	{
366
+		$countries = EEM_Country::instance()->get_all_countries();
367
+		$country = isset($countries[ $attendee->country_ID() ])
368
+			? $countries[ $attendee->country_ID() ]->get('CNT_name')
369
+			: $attendee->country_ID();
370
+		return ! is_numeric($country) ? $country : '';
371
+	}
372
+
373
+
374
+	/**
375
+	 * Phone Number column
376
+	 *
377
+	 * @param EE_Attendee $attendee
378
+	 * @return mixed
379
+	 * @throws EE_Error
380
+	 */
381
+	public function column_ATT_phone(EE_Attendee $attendee)
382
+	{
383
+		return $attendee->phone();
384
+	}
385 385
 }
Please login to merge, or discard this patch.
Spacing   +21 added lines, -21 removed lines patch added patch discarded remove patch
@@ -127,7 +127,7 @@  discard block
 block discarded – undo
127 127
      */
128 128
     public function column_cb($attendee)
129 129
     {
130
-        if (! $attendee instanceof EE_Attendee) {
130
+        if ( ! $attendee instanceof EE_Attendee) {
131 131
             return '';
132 132
         }
133 133
         return sprintf(
@@ -148,7 +148,7 @@  discard block
 block discarded – undo
148 148
     {
149 149
         $content = $attendee->ID();
150 150
         $attendee_name = $attendee instanceof EE_Attendee ? $attendee->full_name() : '';
151
-        $content .= '  <span class="show-on-mobile-view-only">' . $attendee_name . '</span>';
151
+        $content .= '  <span class="show-on-mobile-view-only">'.$attendee_name.'</span>';
152 152
         return $content;
153 153
     }
154 154
 
@@ -177,9 +177,9 @@  discard block
 block discarded – undo
177 177
             'ee_edit_contacts',
178 178
             'espresso_registrations_edit_attendee'
179 179
         )
180
-            ? '<a href="' . $edit_lnk_url . '" title="'
181
-              . esc_attr__('Edit Contact', 'event_espresso') . '">'
182
-              . $attendee->lname() . '</a>'
180
+            ? '<a href="'.$edit_lnk_url.'" title="'
181
+              . esc_attr__('Edit Contact', 'event_espresso').'">'
182
+              . $attendee->lname().'</a>'
183 183
             : $attendee->lname();
184 184
         return $name_link;
185 185
     }
@@ -211,9 +211,9 @@  discard block
 block discarded – undo
211 211
                 ),
212 212
                 REG_ADMIN_URL
213 213
             );
214
-            $actions['edit'] = '<a href="' . $edit_lnk_url . '" title="'
215
-                               . esc_attr__('Edit Contact', 'event_espresso') . '">'
216
-                               . esc_html__('Edit', 'event_espresso') . '</a>';
214
+            $actions['edit'] = '<a href="'.$edit_lnk_url.'" title="'
215
+                               . esc_attr__('Edit Contact', 'event_espresso').'">'
216
+                               . esc_html__('Edit', 'event_espresso').'</a>';
217 217
         }
218 218
 
219 219
         if ($this->_view === 'in_use') {
@@ -229,9 +229,9 @@  discard block
 block discarded – undo
229 229
                     ),
230 230
                     REG_ADMIN_URL
231 231
                 );
232
-                $actions['trash'] = '<a href="' . $trash_lnk_url . '" title="'
232
+                $actions['trash'] = '<a href="'.$trash_lnk_url.'" title="'
233 233
                                     . esc_attr__('Move Contact to Trash', 'event_espresso')
234
-                                    . '">' . esc_html__('Trash', 'event_espresso') . '</a>';
234
+                                    . '">'.esc_html__('Trash', 'event_espresso').'</a>';
235 235
             }
236 236
         } else {
237 237
             if (EE_Registry::instance()->CAP->current_user_can(
@@ -246,9 +246,9 @@  discard block
 block discarded – undo
246 246
                     ),
247 247
                     REG_ADMIN_URL
248 248
                 );
249
-                $actions['restore'] = '<a href="' . $restore_lnk_url . '" title="'
250
-                                      . esc_attr__('Restore Contact', 'event_espresso') . '">'
251
-                                      . esc_html__('Restore', 'event_espresso') . '</a>';
249
+                $actions['restore'] = '<a href="'.$restore_lnk_url.'" title="'
250
+                                      . esc_attr__('Restore Contact', 'event_espresso').'">'
251
+                                      . esc_html__('Restore', 'event_espresso').'</a>';
252 252
             }
253 253
         }
254 254
 
@@ -263,8 +263,8 @@  discard block
 block discarded – undo
263 263
             'ee_edit_contacts',
264 264
             'espresso_registrations_edit_attendee'
265 265
         )
266
-            ? '<a href="' . $edit_lnk_url . '" title="'
267
-              . esc_attr__('Edit Contact', 'event_espresso') . '">' . $attendee->fname() . '</a>'
266
+            ? '<a href="'.$edit_lnk_url.'" title="'
267
+              . esc_attr__('Edit Contact', 'event_espresso').'">'.$attendee->fname().'</a>'
268 268
             : $attendee->fname();
269 269
 
270 270
         // Return the name contents
@@ -281,7 +281,7 @@  discard block
 block discarded – undo
281 281
      */
282 282
     public function column_ATT_email(EE_Attendee $attendee)
283 283
     {
284
-        return '<a href="mailto:' . $attendee->email() . '">' . $attendee->email() . '</a>';
284
+        return '<a href="mailto:'.$attendee->email().'">'.$attendee->email().'</a>';
285 285
     }
286 286
 
287 287
 
@@ -301,7 +301,7 @@  discard block
 block discarded – undo
301 301
             ),
302 302
             REG_ADMIN_URL
303 303
         );
304
-        return '<a href="' . $link . '">' . $attendee->getCustomSelect('Registration_Count') . '</a>';
304
+        return '<a href="'.$link.'">'.$attendee->getCustomSelect('Registration_Count').'</a>';
305 305
     }
306 306
 
307 307
 
@@ -344,8 +344,8 @@  discard block
 block discarded – undo
344 344
     public function column_STA_ID(EE_Attendee $attendee)
345 345
     {
346 346
         $states = EEM_State::instance()->get_all_states();
347
-        $state = isset($states[ $attendee->state_ID() ])
348
-            ? $states[ $attendee->state_ID() ]->get('STA_name')
347
+        $state = isset($states[$attendee->state_ID()])
348
+            ? $states[$attendee->state_ID()]->get('STA_name')
349 349
             : $attendee->state_ID();
350 350
         return ! is_numeric($state) ? $state : '';
351 351
     }
@@ -364,8 +364,8 @@  discard block
 block discarded – undo
364 364
     public function column_CNT_ISO(EE_Attendee $attendee)
365 365
     {
366 366
         $countries = EEM_Country::instance()->get_all_countries();
367
-        $country = isset($countries[ $attendee->country_ID() ])
368
-            ? $countries[ $attendee->country_ID() ]->get('CNT_name')
367
+        $country = isset($countries[$attendee->country_ID()])
368
+            ? $countries[$attendee->country_ID()]->get('CNT_name')
369 369
             : $attendee->country_ID();
370 370
         return ! is_numeric($country) ? $country : '';
371 371
     }
Please login to merge, or discard this patch.