Completed
Branch FET/introduce-css-component-bu... (633dd7)
by
unknown
22:05 queued 10:23
created
core/libraries/messages/messenger/EE_Email_messenger.class.php 3 patches
Doc Comments   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -456,7 +456,7 @@
 block discarded – undo
456 456
      * be empty
457 457
      *
458 458
      * @since 4.3.1
459
-     * @return array
459
+     * @return string[]
460 460
      */
461 461
     private function _parse_from()
462 462
     {
Please login to merge, or discard this patch.
Indentation   +644 added lines, -644 removed lines patch added patch discarded remove patch
@@ -6,648 +6,648 @@
 block discarded – undo
6 6
 class EE_Email_messenger extends EE_messenger
7 7
 {
8 8
 
9
-    /**
10
-     * To field for email
11
-     * @var string
12
-     */
13
-    protected $_to = '';
14
-
15
-
16
-    /**
17
-     * CC field for email.
18
-     * @var string
19
-     */
20
-    protected $_cc = '';
21
-
22
-    /**
23
-     * From field for email
24
-     * @var string
25
-     */
26
-    protected $_from = '';
27
-
28
-
29
-    /**
30
-     * Subject field for email
31
-     * @var string
32
-     */
33
-    protected $_subject = '';
34
-
35
-
36
-    /**
37
-     * Content field for email
38
-     * @var string
39
-     */
40
-    protected $_content = '';
41
-
42
-
43
-    /**
44
-     * constructor
45
-     *
46
-     * @access public
47
-     */
48
-    public function __construct()
49
-    {
50
-        // set name and description properties
51
-        $this->name                = 'email';
52
-        $this->description         = sprintf(
53
-            esc_html__(
54
-                'This messenger delivers messages via email using the built-in %s function included with WordPress',
55
-                'event_espresso'
56
-            ),
57
-            '<code>wp_mail</code>'
58
-        );
59
-        $this->label               = array(
60
-            'singular' => esc_html__('email', 'event_espresso'),
61
-            'plural'   => esc_html__('emails', 'event_espresso'),
62
-        );
63
-        $this->activate_on_install = true;
64
-
65
-        // we're using defaults so let's call parent constructor that will take care of setting up all the other
66
-        // properties
67
-        parent::__construct();
68
-    }
69
-
70
-
71
-    /**
72
-     * see abstract declaration in parent class for details.
73
-     */
74
-    protected function _set_admin_pages()
75
-    {
76
-        $this->admin_registered_pages = array(
77
-            'events_edit' => true,
78
-        );
79
-    }
80
-
81
-
82
-    /**
83
-     * see abstract declaration in parent class for details
84
-     */
85
-    protected function _set_valid_shortcodes()
86
-    {
87
-        // remember by leaving the other fields not set, those fields will inherit the valid shortcodes from the
88
-        // message type.
89
-        $this->_valid_shortcodes = array(
90
-            'to'   => array('email', 'event_author', 'primary_registration_details', 'recipient_details'),
91
-            'cc' => array('email', 'event_author', 'primary_registration_details', 'recipient_details'),
92
-            'from' => array('email', 'event_author', 'primary_registration_details', 'recipient_details'),
93
-        );
94
-    }
95
-
96
-
97
-    /**
98
-     * see abstract declaration in parent class for details
99
-     *
100
-     * @access protected
101
-     * @return void
102
-     */
103
-    protected function _set_validator_config()
104
-    {
105
-        $valid_shortcodes = $this->get_valid_shortcodes();
106
-
107
-        $this->_validator_config = array(
108
-            'to'            => array(
109
-                'shortcodes' => $valid_shortcodes['to'],
110
-                'type'       => 'email',
111
-            ),
112
-            'cc' => array(
113
-                'shortcodes' => $valid_shortcodes['to'],
114
-                'type' => 'email',
115
-            ),
116
-            'from'          => array(
117
-                'shortcodes' => $valid_shortcodes['from'],
118
-                'type'       => 'email',
119
-            ),
120
-            'subject'       => array(
121
-                'shortcodes' => array(
122
-                    'organization',
123
-                    'primary_registration_details',
124
-                    'event_author',
125
-                    'primary_registration_details',
126
-                    'recipient_details',
127
-                ),
128
-            ),
129
-            'content'       => array(
130
-                'shortcodes' => array(
131
-                    'event_list',
132
-                    'attendee_list',
133
-                    'ticket_list',
134
-                    'organization',
135
-                    'primary_registration_details',
136
-                    'primary_registration_list',
137
-                    'event_author',
138
-                    'recipient_details',
139
-                    'recipient_list',
140
-                    'transaction',
141
-                    'messenger',
142
-                ),
143
-            ),
144
-            'attendee_list' => array(
145
-                'shortcodes' => array('attendee', 'event_list', 'ticket_list'),
146
-                'required'   => array('[ATTENDEE_LIST]'),
147
-            ),
148
-            'event_list'    => array(
149
-                'shortcodes' => array(
150
-                    'event',
151
-                    'attendee_list',
152
-                    'ticket_list',
153
-                    'venue',
154
-                    'datetime_list',
155
-                    'attendee',
156
-                    'primary_registration_details',
157
-                    'primary_registration_list',
158
-                    'event_author',
159
-                    'recipient_details',
160
-                    'recipient_list',
161
-                ),
162
-                'required'   => array('[EVENT_LIST]'),
163
-            ),
164
-            'ticket_list'   => array(
165
-                'shortcodes' => array(
166
-                    'event_list',
167
-                    'attendee_list',
168
-                    'ticket',
169
-                    'datetime_list',
170
-                    'primary_registration_details',
171
-                    'recipient_details',
172
-                ),
173
-                'required'   => array('[TICKET_LIST]'),
174
-            ),
175
-            'datetime_list' => array(
176
-                'shortcodes' => array('datetime'),
177
-                'required'   => array('[DATETIME_LIST]'),
178
-            ),
179
-        );
180
-    }
181
-
182
-
183
-    /**
184
-     * @see   parent EE_messenger class for docs
185
-     * @since 4.5.0
186
-     */
187
-    public function do_secondary_messenger_hooks($sending_messenger_name)
188
-    {
189
-        if ($sending_messenger_name = 'html') {
190
-            add_filter('FHEE__EE_Messages_Template_Pack__get_variation', array($this, 'add_email_css'), 10, 8);
191
-        }
192
-    }
193
-
194
-
195
-    public function add_email_css(
196
-        $variation_path,
197
-        $messenger,
198
-        $message_type,
199
-        $type,
200
-        $variation,
201
-        $file_extension,
202
-        $url,
203
-        EE_Messages_Template_Pack $template_pack
204
-    ) {
205
-        // prevent recursion on this callback.
206
-        remove_filter('FHEE__EE_Messages_Template_Pack__get_variation', array($this, 'add_email_css'), 10);
207
-        $variation = $this->get_variation($template_pack, $message_type, $url, 'main', $variation, false);
208
-
209
-        add_filter('FHEE__EE_Messages_Template_Pack__get_variation', array($this, 'add_email_css'), 10, 8);
210
-        return $variation;
211
-    }
212
-
213
-
214
-    /**
215
-     * See parent for details
216
-     *
217
-     * @access protected
218
-     * @return void
219
-     */
220
-    protected function _set_test_settings_fields()
221
-    {
222
-        $this->_test_settings_fields = array(
223
-            'to'      => array(
224
-                'input'      => 'text',
225
-                'label'      => esc_html__('Send a test email to', 'event_espresso'),
226
-                'type'       => 'email',
227
-                'required'   => true,
228
-                'validation' => true,
229
-                'css_class'  => 'large-text',
230
-                'format'     => '%s',
231
-                'default'    => get_bloginfo('admin_email'),
232
-            ),
233
-            'subject' => array(
234
-                'input'      => 'hidden',
235
-                'label'      => '',
236
-                'type'       => 'string',
237
-                'required'   => false,
238
-                'validation' => false,
239
-                'format'     => '%s',
240
-                'value'      => sprintf(__('Test email sent from %s', 'event_espresso'), get_bloginfo('name')),
241
-                'default'    => '',
242
-                'css_class'  => '',
243
-            ),
244
-        );
245
-    }
246
-
247
-
248
-    /**
249
-     * _set_template_fields
250
-     * This sets up the fields that a messenger requires for the message to go out.
251
-     *
252
-     * @access  protected
253
-     * @return void
254
-     */
255
-    protected function _set_template_fields()
256
-    {
257
-        // any extra template fields that are NOT used by the messenger but will get used by a messenger field for
258
-        // shortcode replacement get added to the 'extra' key in an associated array indexed by the messenger field
259
-        // they relate to.  This is important for the Messages_admin to know what fields to display to the user.
260
-        //  Also, notice that the "values" are equal to the field type that messages admin will use to know what
261
-        // kind of field to display. The values ALSO have one index labeled "shortcode".  the values in that array
262
-        // indicate which ACTUAL SHORTCODE (i.e. [SHORTCODE]) is required in order for this extra field to be
263
-        // displayed.  If the required shortcode isn't part of the shortcodes array then the field is not needed and
264
-        // will not be displayed/parsed.
265
-        $this->_template_fields = array(
266
-            'to'      => array(
267
-                'input'      => 'text',
268
-                'label'      => esc_html_x(
269
-                    'To',
270
-                    'Label for the "To" field for email addresses',
271
-                    'event_espresso'
272
-                ),
273
-                'type'       => 'string',
274
-                'required'   => true,
275
-                'validation' => true,
276
-                'css_class'  => 'large-text',
277
-                'format'     => '%s',
278
-            ),
279
-            'cc'      => array(
280
-                'input'      => 'text',
281
-                'label'      => esc_html_x(
282
-                    'CC',
283
-                    'Label for the "Carbon Copy" field used for additional email addresses',
284
-                    'event_espresso'
285
-                ),
286
-                'type'       => 'string',
287
-                'required'   => false,
288
-                'validation' => true,
289
-                'css_class'  => 'large-text',
290
-                'format'     => '%s',
291
-            ),
292
-            'from'    => array(
293
-                'input'      => 'text',
294
-                'label'      => esc_html_x(
295
-                    'From',
296
-                    'Label for the "From" field for email addresses.',
297
-                    'event_espresso'
298
-                ),
299
-                'type'       => 'string',
300
-                'required'   => true,
301
-                'validation' => true,
302
-                'css_class'  => 'large-text',
303
-                'format'     => '%s',
304
-            ),
305
-            'subject' => array(
306
-                'input'      => 'text',
307
-                'label'      => esc_html_x(
308
-                    'Subject',
309
-                    'Label for the "Subject" field (short description of contents) for emails.',
310
-                    'event_espresso'
311
-                ),
312
-                'type'       => 'string',
313
-                'required'   => true,
314
-                'validation' => true,
315
-                'css_class'  => 'large-text',
316
-                'format'     => '%s',
317
-            ),
318
-            'content' => '',
319
-            // left empty b/c it is in the "extra array" but messenger still needs needs to know this is a field.
320
-            'extra'   => array(
321
-                'content' => array(
322
-                    'main'          => array(
323
-                        'input'      => 'wp_editor',
324
-                        'label'      => esc_html__('Main Content', 'event_espresso'),
325
-                        'type'       => 'string',
326
-                        'required'   => true,
327
-                        'validation' => true,
328
-                        'format'     => '%s',
329
-                        'rows'       => '15',
330
-                    ),
331
-                    'event_list'    => array(
332
-                        'input'               => 'wp_editor',
333
-                        'label'               => '[EVENT_LIST]',
334
-                        'type'                => 'string',
335
-                        'required'            => true,
336
-                        'validation'          => true,
337
-                        'format'              => '%s',
338
-                        'rows'                => '15',
339
-                        'shortcodes_required' => array('[EVENT_LIST]'),
340
-                    ),
341
-                    'attendee_list' => array(
342
-                        'input'               => 'textarea',
343
-                        'label'               => '[ATTENDEE_LIST]',
344
-                        'type'                => 'string',
345
-                        'required'            => true,
346
-                        'validation'          => true,
347
-                        'format'              => '%s',
348
-                        'css_class'           => 'large-text',
349
-                        'rows'                => '5',
350
-                        'shortcodes_required' => array('[ATTENDEE_LIST]'),
351
-                    ),
352
-                    'ticket_list'   => array(
353
-                        'input'               => 'textarea',
354
-                        'label'               => '[TICKET_LIST]',
355
-                        'type'                => 'string',
356
-                        'required'            => true,
357
-                        'validation'          => true,
358
-                        'format'              => '%s',
359
-                        'css_class'           => 'large-text',
360
-                        'rows'                => '10',
361
-                        'shortcodes_required' => array('[TICKET_LIST]'),
362
-                    ),
363
-                    'datetime_list' => array(
364
-                        'input'               => 'textarea',
365
-                        'label'               => '[DATETIME_LIST]',
366
-                        'type'                => 'string',
367
-                        'required'            => true,
368
-                        'validation'          => true,
369
-                        'format'              => '%s',
370
-                        'css_class'           => 'large-text',
371
-                        'rows'                => '10',
372
-                        'shortcodes_required' => array('[DATETIME_LIST]'),
373
-                    ),
374
-                ),
375
-            ),
376
-        );
377
-    }
378
-
379
-
380
-    /**
381
-     * See definition of this class in parent
382
-     */
383
-    protected function _set_default_message_types()
384
-    {
385
-        $this->_default_message_types = array(
386
-            'payment',
387
-            'payment_refund',
388
-            'registration',
389
-            'not_approved_registration',
390
-            'pending_approval',
391
-        );
392
-    }
393
-
394
-
395
-    /**
396
-     * @see   definition of this class in parent
397
-     * @since 4.5.0
398
-     */
399
-    protected function _set_valid_message_types()
400
-    {
401
-        $this->_valid_message_types = array(
402
-            'payment',
403
-            'registration',
404
-            'not_approved_registration',
405
-            'declined_registration',
406
-            'cancelled_registration',
407
-            'pending_approval',
408
-            'registration_summary',
409
-            'payment_reminder',
410
-            'payment_declined',
411
-            'payment_refund',
412
-        );
413
-    }
414
-
415
-
416
-    /**
417
-     * setting up admin_settings_fields for messenger.
418
-     */
419
-    protected function _set_admin_settings_fields()
420
-    {
421
-    }
422
-
423
-    /**
424
-     * We just deliver the messages don't kill us!!
425
-     *
426
-     * @return bool|WP_Error true if message delivered, false if it didn't deliver OR bubble up any error object if
427
-     *              present.
428
-     * @throws EE_Error
429
-     * @throws \TijsVerkoyen\CssToInlineStyles\Exception
430
-     */
431
-    protected function _send_message()
432
-    {
433
-        $success = wp_mail(
434
-            $this->_to,
435
-            // some old values for subject may be expecting HTML entities to be decoded in the subject
436
-            // and subjects aren't interpreted as HTML, so there should be no HTML in them
437
-            wp_strip_all_tags(wp_specialchars_decode($this->_subject, ENT_QUOTES)),
438
-            $this->_body(),
439
-            $this->_headers()
440
-        );
441
-        if (! $success) {
442
-            EE_Error::add_error(
443
-                sprintf(
444
-                    esc_html__(
445
-                        'The email did not send successfully.%3$sThe WordPress wp_mail function is used for sending mails but does not give any useful information when an email fails to send.%3$sIt is possible the "to" address (%1$s) or "from" address (%2$s) is invalid.%3$s',
446
-                        'event_espresso'
447
-                    ),
448
-                    $this->_to,
449
-                    $this->_from,
450
-                    '<br />'
451
-                ),
452
-                __FILE__,
453
-                __FUNCTION__,
454
-                __LINE__
455
-            );
456
-        }
457
-        return $success;
458
-    }
459
-
460
-
461
-    /**
462
-     * see parent for definition
463
-     *
464
-     * @return string html body of the message content and the related css.
465
-     * @throws EE_Error
466
-     * @throws \TijsVerkoyen\CssToInlineStyles\Exception
467
-     */
468
-    protected function _preview()
469
-    {
470
-        return $this->_body(true);
471
-    }
472
-
473
-
474
-    /**
475
-     * Setup headers for email
476
-     *
477
-     * @access protected
478
-     * @return string formatted header for email
479
-     */
480
-    protected function _headers()
481
-    {
482
-        $this->_ensure_has_from_email_address();
483
-        $from    = $this->_from;
484
-        $headers = array(
485
-            'From:' . $from,
486
-            'Reply-To:' . $from,
487
-            'Content-Type:text/html; charset=utf-8',
488
-        );
489
-
490
-        /**
491
-         * Second condition added as a result of https://events.codebasehq.com/projects/event-espresso/tickets/11416 to
492
-         * cover back compat where there may be users who have saved cc values in their db for the newsletter message
493
-         * type which they are no longer able to change.
494
-         */
495
-        if (! empty($this->_cc) && ! $this->_incoming_message_type instanceof EE_Newsletter_message_type) {
496
-            $headers[] = 'cc: ' . $this->_cc;
497
-        }
498
-
499
-        // but wait!  Header's for the from is NOT reliable because some plugins don't respect From: as set in the
500
-        // header.
501
-        add_filter('wp_mail_from', array($this, 'set_from_address'), 100);
502
-        add_filter('wp_mail_from_name', array($this, 'set_from_name'), 100);
503
-        return apply_filters('FHEE__EE_Email_messenger___headers', $headers, $this->_incoming_message_type, $this);
504
-    }
505
-
506
-
507
-    /**
508
-     * This simply ensures that the from address is not empty.  If it is, then we use whatever is set as the site email
509
-     * address for the from address to avoid problems with sending emails.
510
-     */
511
-    protected function _ensure_has_from_email_address()
512
-    {
513
-        if (empty($this->_from)) {
514
-            $this->_from = get_bloginfo('admin_email');
515
-        }
516
-    }
517
-
518
-
519
-    /**
520
-     * This simply parses whatever is set as the $_from address and determines if it is in the format {name} <{email}>
521
-     * or just {email} and returns an array with the "from_name" and "from_email" as the values. Note from_name *MAY*
522
-     * be empty
523
-     *
524
-     * @since 4.3.1
525
-     * @return array
526
-     */
527
-    private function _parse_from()
528
-    {
529
-        if (strpos($this->_from, '<') !== false) {
530
-            $from_name = substr($this->_from, 0, strpos($this->_from, '<') - 1);
531
-            $from_name = str_replace('"', '', $from_name);
532
-            $from_name = trim($from_name);
533
-
534
-            $from_email = substr($this->_from, strpos($this->_from, '<') + 1);
535
-            $from_email = str_replace('>', '', $from_email);
536
-            $from_email = trim($from_email);
537
-        } elseif (trim($this->_from) !== '') {
538
-            $from_name  = '';
539
-            $from_email = trim($this->_from);
540
-        } else {
541
-            $from_name = $from_email = '';
542
-        }
543
-        return array($from_name, $from_email);
544
-    }
545
-
546
-
547
-    /**
548
-     * Callback for the wp_mail_from filter.
549
-     *
550
-     * @since 4.3.1
551
-     * @param string $from_email What the original from_email is.
552
-     * @return string
553
-     */
554
-    public function set_from_address($from_email)
555
-    {
556
-        $parsed_from = $this->_parse_from();
557
-        // includes fallback if the parsing failed.
558
-        $from_email = is_array($parsed_from) && ! empty($parsed_from[1])
559
-            ? $parsed_from[1]
560
-            : get_bloginfo('admin_email');
561
-        return $from_email;
562
-    }
563
-
564
-
565
-    /**
566
-     * Callback fro the wp_mail_from_name filter.
567
-     *
568
-     * @since 4.3.1
569
-     * @param string $from_name The original from_name.
570
-     * @return string
571
-     */
572
-    public function set_from_name($from_name)
573
-    {
574
-        $parsed_from = $this->_parse_from();
575
-        if (is_array($parsed_from) && ! empty($parsed_from[0])) {
576
-            $from_name = $parsed_from[0];
577
-        }
578
-
579
-        // if from name is "WordPress" let's sub in the site name instead (more friendly!)
580
-        // but realize the default name is HTML entity-encoded
581
-        $from_name = $from_name == 'WordPress' ? wp_specialchars_decode(get_bloginfo(), ENT_QUOTES) : $from_name;
582
-
583
-        return $from_name;
584
-    }
585
-
586
-
587
-    /**
588
-     * setup body for email
589
-     *
590
-     * @param bool $preview will determine whether this is preview template or not.
591
-     * @return string formatted body for email.
592
-     * @throws EE_Error
593
-     * @throws \TijsVerkoyen\CssToInlineStyles\Exception
594
-     */
595
-    protected function _body($preview = false)
596
-    {
597
-        // setup template args!
598
-        $this->_template_args = array(
599
-            'subject'   => $this->_subject,
600
-            'from'      => $this->_from,
601
-            'main_body' => wpautop($this->_content),
602
-        );
603
-        $body                 = $this->_get_main_template($preview);
604
-
605
-        /**
606
-         * This filter allows one to bypass the CSSToInlineStyles tool and leave the body untouched.
607
-         *
608
-         * @type    bool $preview Indicates whether a preview is being generated or not.
609
-         * @return  bool    true  indicates to use the inliner, false bypasses it.
610
-         */
611
-        if (apply_filters('FHEE__EE_Email_messenger__apply_CSSInliner ', true, $preview)) {
612
-            // require CssToInlineStyles library and its dependencies via composer autoloader
613
-            require_once EE_THIRD_PARTY . 'cssinliner/vendor/autoload.php';
614
-
615
-            // now if this isn't a preview, let's setup the body so it has inline styles
616
-            if (! $preview || ($preview && defined('DOING_AJAX'))) {
617
-                $style = file_get_contents(
618
-                    $this->get_variation(
619
-                        $this->_tmp_pack,
620
-                        $this->_incoming_message_type->name,
621
-                        false,
622
-                        'main',
623
-                        $this->_variation
624
-                    ),
625
-                    true
626
-                );
627
-                $CSS   = new TijsVerkoyen\CssToInlineStyles\CssToInlineStyles($body, $style);
628
-                // for some reason the library has a bracket and new line at the beginning.  This takes care of that.
629
-                $body  = ltrim($CSS->convert(true), ">\n");
630
-                // see https://events.codebasehq.com/projects/event-espresso/tickets/8609
631
-                $body  = ltrim($body, "<?");
632
-            }
633
-        }
634
-        return $body;
635
-    }
636
-
637
-
638
-    /**
639
-     * This just returns any existing test settings that might be saved in the database
640
-     *
641
-     * @access public
642
-     * @return array
643
-     */
644
-    public function get_existing_test_settings()
645
-    {
646
-        $settings = parent::get_existing_test_settings();
647
-        // override subject if present because we always want it to be fresh.
648
-        if (is_array($settings) && ! empty($settings['subject'])) {
649
-            $settings['subject'] = sprintf(__('Test email sent from %s', 'event_espresso'), get_bloginfo('name'));
650
-        }
651
-        return $settings;
652
-    }
9
+	/**
10
+	 * To field for email
11
+	 * @var string
12
+	 */
13
+	protected $_to = '';
14
+
15
+
16
+	/**
17
+	 * CC field for email.
18
+	 * @var string
19
+	 */
20
+	protected $_cc = '';
21
+
22
+	/**
23
+	 * From field for email
24
+	 * @var string
25
+	 */
26
+	protected $_from = '';
27
+
28
+
29
+	/**
30
+	 * Subject field for email
31
+	 * @var string
32
+	 */
33
+	protected $_subject = '';
34
+
35
+
36
+	/**
37
+	 * Content field for email
38
+	 * @var string
39
+	 */
40
+	protected $_content = '';
41
+
42
+
43
+	/**
44
+	 * constructor
45
+	 *
46
+	 * @access public
47
+	 */
48
+	public function __construct()
49
+	{
50
+		// set name and description properties
51
+		$this->name                = 'email';
52
+		$this->description         = sprintf(
53
+			esc_html__(
54
+				'This messenger delivers messages via email using the built-in %s function included with WordPress',
55
+				'event_espresso'
56
+			),
57
+			'<code>wp_mail</code>'
58
+		);
59
+		$this->label               = array(
60
+			'singular' => esc_html__('email', 'event_espresso'),
61
+			'plural'   => esc_html__('emails', 'event_espresso'),
62
+		);
63
+		$this->activate_on_install = true;
64
+
65
+		// we're using defaults so let's call parent constructor that will take care of setting up all the other
66
+		// properties
67
+		parent::__construct();
68
+	}
69
+
70
+
71
+	/**
72
+	 * see abstract declaration in parent class for details.
73
+	 */
74
+	protected function _set_admin_pages()
75
+	{
76
+		$this->admin_registered_pages = array(
77
+			'events_edit' => true,
78
+		);
79
+	}
80
+
81
+
82
+	/**
83
+	 * see abstract declaration in parent class for details
84
+	 */
85
+	protected function _set_valid_shortcodes()
86
+	{
87
+		// remember by leaving the other fields not set, those fields will inherit the valid shortcodes from the
88
+		// message type.
89
+		$this->_valid_shortcodes = array(
90
+			'to'   => array('email', 'event_author', 'primary_registration_details', 'recipient_details'),
91
+			'cc' => array('email', 'event_author', 'primary_registration_details', 'recipient_details'),
92
+			'from' => array('email', 'event_author', 'primary_registration_details', 'recipient_details'),
93
+		);
94
+	}
95
+
96
+
97
+	/**
98
+	 * see abstract declaration in parent class for details
99
+	 *
100
+	 * @access protected
101
+	 * @return void
102
+	 */
103
+	protected function _set_validator_config()
104
+	{
105
+		$valid_shortcodes = $this->get_valid_shortcodes();
106
+
107
+		$this->_validator_config = array(
108
+			'to'            => array(
109
+				'shortcodes' => $valid_shortcodes['to'],
110
+				'type'       => 'email',
111
+			),
112
+			'cc' => array(
113
+				'shortcodes' => $valid_shortcodes['to'],
114
+				'type' => 'email',
115
+			),
116
+			'from'          => array(
117
+				'shortcodes' => $valid_shortcodes['from'],
118
+				'type'       => 'email',
119
+			),
120
+			'subject'       => array(
121
+				'shortcodes' => array(
122
+					'organization',
123
+					'primary_registration_details',
124
+					'event_author',
125
+					'primary_registration_details',
126
+					'recipient_details',
127
+				),
128
+			),
129
+			'content'       => array(
130
+				'shortcodes' => array(
131
+					'event_list',
132
+					'attendee_list',
133
+					'ticket_list',
134
+					'organization',
135
+					'primary_registration_details',
136
+					'primary_registration_list',
137
+					'event_author',
138
+					'recipient_details',
139
+					'recipient_list',
140
+					'transaction',
141
+					'messenger',
142
+				),
143
+			),
144
+			'attendee_list' => array(
145
+				'shortcodes' => array('attendee', 'event_list', 'ticket_list'),
146
+				'required'   => array('[ATTENDEE_LIST]'),
147
+			),
148
+			'event_list'    => array(
149
+				'shortcodes' => array(
150
+					'event',
151
+					'attendee_list',
152
+					'ticket_list',
153
+					'venue',
154
+					'datetime_list',
155
+					'attendee',
156
+					'primary_registration_details',
157
+					'primary_registration_list',
158
+					'event_author',
159
+					'recipient_details',
160
+					'recipient_list',
161
+				),
162
+				'required'   => array('[EVENT_LIST]'),
163
+			),
164
+			'ticket_list'   => array(
165
+				'shortcodes' => array(
166
+					'event_list',
167
+					'attendee_list',
168
+					'ticket',
169
+					'datetime_list',
170
+					'primary_registration_details',
171
+					'recipient_details',
172
+				),
173
+				'required'   => array('[TICKET_LIST]'),
174
+			),
175
+			'datetime_list' => array(
176
+				'shortcodes' => array('datetime'),
177
+				'required'   => array('[DATETIME_LIST]'),
178
+			),
179
+		);
180
+	}
181
+
182
+
183
+	/**
184
+	 * @see   parent EE_messenger class for docs
185
+	 * @since 4.5.0
186
+	 */
187
+	public function do_secondary_messenger_hooks($sending_messenger_name)
188
+	{
189
+		if ($sending_messenger_name = 'html') {
190
+			add_filter('FHEE__EE_Messages_Template_Pack__get_variation', array($this, 'add_email_css'), 10, 8);
191
+		}
192
+	}
193
+
194
+
195
+	public function add_email_css(
196
+		$variation_path,
197
+		$messenger,
198
+		$message_type,
199
+		$type,
200
+		$variation,
201
+		$file_extension,
202
+		$url,
203
+		EE_Messages_Template_Pack $template_pack
204
+	) {
205
+		// prevent recursion on this callback.
206
+		remove_filter('FHEE__EE_Messages_Template_Pack__get_variation', array($this, 'add_email_css'), 10);
207
+		$variation = $this->get_variation($template_pack, $message_type, $url, 'main', $variation, false);
208
+
209
+		add_filter('FHEE__EE_Messages_Template_Pack__get_variation', array($this, 'add_email_css'), 10, 8);
210
+		return $variation;
211
+	}
212
+
213
+
214
+	/**
215
+	 * See parent for details
216
+	 *
217
+	 * @access protected
218
+	 * @return void
219
+	 */
220
+	protected function _set_test_settings_fields()
221
+	{
222
+		$this->_test_settings_fields = array(
223
+			'to'      => array(
224
+				'input'      => 'text',
225
+				'label'      => esc_html__('Send a test email to', 'event_espresso'),
226
+				'type'       => 'email',
227
+				'required'   => true,
228
+				'validation' => true,
229
+				'css_class'  => 'large-text',
230
+				'format'     => '%s',
231
+				'default'    => get_bloginfo('admin_email'),
232
+			),
233
+			'subject' => array(
234
+				'input'      => 'hidden',
235
+				'label'      => '',
236
+				'type'       => 'string',
237
+				'required'   => false,
238
+				'validation' => false,
239
+				'format'     => '%s',
240
+				'value'      => sprintf(__('Test email sent from %s', 'event_espresso'), get_bloginfo('name')),
241
+				'default'    => '',
242
+				'css_class'  => '',
243
+			),
244
+		);
245
+	}
246
+
247
+
248
+	/**
249
+	 * _set_template_fields
250
+	 * This sets up the fields that a messenger requires for the message to go out.
251
+	 *
252
+	 * @access  protected
253
+	 * @return void
254
+	 */
255
+	protected function _set_template_fields()
256
+	{
257
+		// any extra template fields that are NOT used by the messenger but will get used by a messenger field for
258
+		// shortcode replacement get added to the 'extra' key in an associated array indexed by the messenger field
259
+		// they relate to.  This is important for the Messages_admin to know what fields to display to the user.
260
+		//  Also, notice that the "values" are equal to the field type that messages admin will use to know what
261
+		// kind of field to display. The values ALSO have one index labeled "shortcode".  the values in that array
262
+		// indicate which ACTUAL SHORTCODE (i.e. [SHORTCODE]) is required in order for this extra field to be
263
+		// displayed.  If the required shortcode isn't part of the shortcodes array then the field is not needed and
264
+		// will not be displayed/parsed.
265
+		$this->_template_fields = array(
266
+			'to'      => array(
267
+				'input'      => 'text',
268
+				'label'      => esc_html_x(
269
+					'To',
270
+					'Label for the "To" field for email addresses',
271
+					'event_espresso'
272
+				),
273
+				'type'       => 'string',
274
+				'required'   => true,
275
+				'validation' => true,
276
+				'css_class'  => 'large-text',
277
+				'format'     => '%s',
278
+			),
279
+			'cc'      => array(
280
+				'input'      => 'text',
281
+				'label'      => esc_html_x(
282
+					'CC',
283
+					'Label for the "Carbon Copy" field used for additional email addresses',
284
+					'event_espresso'
285
+				),
286
+				'type'       => 'string',
287
+				'required'   => false,
288
+				'validation' => true,
289
+				'css_class'  => 'large-text',
290
+				'format'     => '%s',
291
+			),
292
+			'from'    => array(
293
+				'input'      => 'text',
294
+				'label'      => esc_html_x(
295
+					'From',
296
+					'Label for the "From" field for email addresses.',
297
+					'event_espresso'
298
+				),
299
+				'type'       => 'string',
300
+				'required'   => true,
301
+				'validation' => true,
302
+				'css_class'  => 'large-text',
303
+				'format'     => '%s',
304
+			),
305
+			'subject' => array(
306
+				'input'      => 'text',
307
+				'label'      => esc_html_x(
308
+					'Subject',
309
+					'Label for the "Subject" field (short description of contents) for emails.',
310
+					'event_espresso'
311
+				),
312
+				'type'       => 'string',
313
+				'required'   => true,
314
+				'validation' => true,
315
+				'css_class'  => 'large-text',
316
+				'format'     => '%s',
317
+			),
318
+			'content' => '',
319
+			// left empty b/c it is in the "extra array" but messenger still needs needs to know this is a field.
320
+			'extra'   => array(
321
+				'content' => array(
322
+					'main'          => array(
323
+						'input'      => 'wp_editor',
324
+						'label'      => esc_html__('Main Content', 'event_espresso'),
325
+						'type'       => 'string',
326
+						'required'   => true,
327
+						'validation' => true,
328
+						'format'     => '%s',
329
+						'rows'       => '15',
330
+					),
331
+					'event_list'    => array(
332
+						'input'               => 'wp_editor',
333
+						'label'               => '[EVENT_LIST]',
334
+						'type'                => 'string',
335
+						'required'            => true,
336
+						'validation'          => true,
337
+						'format'              => '%s',
338
+						'rows'                => '15',
339
+						'shortcodes_required' => array('[EVENT_LIST]'),
340
+					),
341
+					'attendee_list' => array(
342
+						'input'               => 'textarea',
343
+						'label'               => '[ATTENDEE_LIST]',
344
+						'type'                => 'string',
345
+						'required'            => true,
346
+						'validation'          => true,
347
+						'format'              => '%s',
348
+						'css_class'           => 'large-text',
349
+						'rows'                => '5',
350
+						'shortcodes_required' => array('[ATTENDEE_LIST]'),
351
+					),
352
+					'ticket_list'   => array(
353
+						'input'               => 'textarea',
354
+						'label'               => '[TICKET_LIST]',
355
+						'type'                => 'string',
356
+						'required'            => true,
357
+						'validation'          => true,
358
+						'format'              => '%s',
359
+						'css_class'           => 'large-text',
360
+						'rows'                => '10',
361
+						'shortcodes_required' => array('[TICKET_LIST]'),
362
+					),
363
+					'datetime_list' => array(
364
+						'input'               => 'textarea',
365
+						'label'               => '[DATETIME_LIST]',
366
+						'type'                => 'string',
367
+						'required'            => true,
368
+						'validation'          => true,
369
+						'format'              => '%s',
370
+						'css_class'           => 'large-text',
371
+						'rows'                => '10',
372
+						'shortcodes_required' => array('[DATETIME_LIST]'),
373
+					),
374
+				),
375
+			),
376
+		);
377
+	}
378
+
379
+
380
+	/**
381
+	 * See definition of this class in parent
382
+	 */
383
+	protected function _set_default_message_types()
384
+	{
385
+		$this->_default_message_types = array(
386
+			'payment',
387
+			'payment_refund',
388
+			'registration',
389
+			'not_approved_registration',
390
+			'pending_approval',
391
+		);
392
+	}
393
+
394
+
395
+	/**
396
+	 * @see   definition of this class in parent
397
+	 * @since 4.5.0
398
+	 */
399
+	protected function _set_valid_message_types()
400
+	{
401
+		$this->_valid_message_types = array(
402
+			'payment',
403
+			'registration',
404
+			'not_approved_registration',
405
+			'declined_registration',
406
+			'cancelled_registration',
407
+			'pending_approval',
408
+			'registration_summary',
409
+			'payment_reminder',
410
+			'payment_declined',
411
+			'payment_refund',
412
+		);
413
+	}
414
+
415
+
416
+	/**
417
+	 * setting up admin_settings_fields for messenger.
418
+	 */
419
+	protected function _set_admin_settings_fields()
420
+	{
421
+	}
422
+
423
+	/**
424
+	 * We just deliver the messages don't kill us!!
425
+	 *
426
+	 * @return bool|WP_Error true if message delivered, false if it didn't deliver OR bubble up any error object if
427
+	 *              present.
428
+	 * @throws EE_Error
429
+	 * @throws \TijsVerkoyen\CssToInlineStyles\Exception
430
+	 */
431
+	protected function _send_message()
432
+	{
433
+		$success = wp_mail(
434
+			$this->_to,
435
+			// some old values for subject may be expecting HTML entities to be decoded in the subject
436
+			// and subjects aren't interpreted as HTML, so there should be no HTML in them
437
+			wp_strip_all_tags(wp_specialchars_decode($this->_subject, ENT_QUOTES)),
438
+			$this->_body(),
439
+			$this->_headers()
440
+		);
441
+		if (! $success) {
442
+			EE_Error::add_error(
443
+				sprintf(
444
+					esc_html__(
445
+						'The email did not send successfully.%3$sThe WordPress wp_mail function is used for sending mails but does not give any useful information when an email fails to send.%3$sIt is possible the "to" address (%1$s) or "from" address (%2$s) is invalid.%3$s',
446
+						'event_espresso'
447
+					),
448
+					$this->_to,
449
+					$this->_from,
450
+					'<br />'
451
+				),
452
+				__FILE__,
453
+				__FUNCTION__,
454
+				__LINE__
455
+			);
456
+		}
457
+		return $success;
458
+	}
459
+
460
+
461
+	/**
462
+	 * see parent for definition
463
+	 *
464
+	 * @return string html body of the message content and the related css.
465
+	 * @throws EE_Error
466
+	 * @throws \TijsVerkoyen\CssToInlineStyles\Exception
467
+	 */
468
+	protected function _preview()
469
+	{
470
+		return $this->_body(true);
471
+	}
472
+
473
+
474
+	/**
475
+	 * Setup headers for email
476
+	 *
477
+	 * @access protected
478
+	 * @return string formatted header for email
479
+	 */
480
+	protected function _headers()
481
+	{
482
+		$this->_ensure_has_from_email_address();
483
+		$from    = $this->_from;
484
+		$headers = array(
485
+			'From:' . $from,
486
+			'Reply-To:' . $from,
487
+			'Content-Type:text/html; charset=utf-8',
488
+		);
489
+
490
+		/**
491
+		 * Second condition added as a result of https://events.codebasehq.com/projects/event-espresso/tickets/11416 to
492
+		 * cover back compat where there may be users who have saved cc values in their db for the newsletter message
493
+		 * type which they are no longer able to change.
494
+		 */
495
+		if (! empty($this->_cc) && ! $this->_incoming_message_type instanceof EE_Newsletter_message_type) {
496
+			$headers[] = 'cc: ' . $this->_cc;
497
+		}
498
+
499
+		// but wait!  Header's for the from is NOT reliable because some plugins don't respect From: as set in the
500
+		// header.
501
+		add_filter('wp_mail_from', array($this, 'set_from_address'), 100);
502
+		add_filter('wp_mail_from_name', array($this, 'set_from_name'), 100);
503
+		return apply_filters('FHEE__EE_Email_messenger___headers', $headers, $this->_incoming_message_type, $this);
504
+	}
505
+
506
+
507
+	/**
508
+	 * This simply ensures that the from address is not empty.  If it is, then we use whatever is set as the site email
509
+	 * address for the from address to avoid problems with sending emails.
510
+	 */
511
+	protected function _ensure_has_from_email_address()
512
+	{
513
+		if (empty($this->_from)) {
514
+			$this->_from = get_bloginfo('admin_email');
515
+		}
516
+	}
517
+
518
+
519
+	/**
520
+	 * This simply parses whatever is set as the $_from address and determines if it is in the format {name} <{email}>
521
+	 * or just {email} and returns an array with the "from_name" and "from_email" as the values. Note from_name *MAY*
522
+	 * be empty
523
+	 *
524
+	 * @since 4.3.1
525
+	 * @return array
526
+	 */
527
+	private function _parse_from()
528
+	{
529
+		if (strpos($this->_from, '<') !== false) {
530
+			$from_name = substr($this->_from, 0, strpos($this->_from, '<') - 1);
531
+			$from_name = str_replace('"', '', $from_name);
532
+			$from_name = trim($from_name);
533
+
534
+			$from_email = substr($this->_from, strpos($this->_from, '<') + 1);
535
+			$from_email = str_replace('>', '', $from_email);
536
+			$from_email = trim($from_email);
537
+		} elseif (trim($this->_from) !== '') {
538
+			$from_name  = '';
539
+			$from_email = trim($this->_from);
540
+		} else {
541
+			$from_name = $from_email = '';
542
+		}
543
+		return array($from_name, $from_email);
544
+	}
545
+
546
+
547
+	/**
548
+	 * Callback for the wp_mail_from filter.
549
+	 *
550
+	 * @since 4.3.1
551
+	 * @param string $from_email What the original from_email is.
552
+	 * @return string
553
+	 */
554
+	public function set_from_address($from_email)
555
+	{
556
+		$parsed_from = $this->_parse_from();
557
+		// includes fallback if the parsing failed.
558
+		$from_email = is_array($parsed_from) && ! empty($parsed_from[1])
559
+			? $parsed_from[1]
560
+			: get_bloginfo('admin_email');
561
+		return $from_email;
562
+	}
563
+
564
+
565
+	/**
566
+	 * Callback fro the wp_mail_from_name filter.
567
+	 *
568
+	 * @since 4.3.1
569
+	 * @param string $from_name The original from_name.
570
+	 * @return string
571
+	 */
572
+	public function set_from_name($from_name)
573
+	{
574
+		$parsed_from = $this->_parse_from();
575
+		if (is_array($parsed_from) && ! empty($parsed_from[0])) {
576
+			$from_name = $parsed_from[0];
577
+		}
578
+
579
+		// if from name is "WordPress" let's sub in the site name instead (more friendly!)
580
+		// but realize the default name is HTML entity-encoded
581
+		$from_name = $from_name == 'WordPress' ? wp_specialchars_decode(get_bloginfo(), ENT_QUOTES) : $from_name;
582
+
583
+		return $from_name;
584
+	}
585
+
586
+
587
+	/**
588
+	 * setup body for email
589
+	 *
590
+	 * @param bool $preview will determine whether this is preview template or not.
591
+	 * @return string formatted body for email.
592
+	 * @throws EE_Error
593
+	 * @throws \TijsVerkoyen\CssToInlineStyles\Exception
594
+	 */
595
+	protected function _body($preview = false)
596
+	{
597
+		// setup template args!
598
+		$this->_template_args = array(
599
+			'subject'   => $this->_subject,
600
+			'from'      => $this->_from,
601
+			'main_body' => wpautop($this->_content),
602
+		);
603
+		$body                 = $this->_get_main_template($preview);
604
+
605
+		/**
606
+		 * This filter allows one to bypass the CSSToInlineStyles tool and leave the body untouched.
607
+		 *
608
+		 * @type    bool $preview Indicates whether a preview is being generated or not.
609
+		 * @return  bool    true  indicates to use the inliner, false bypasses it.
610
+		 */
611
+		if (apply_filters('FHEE__EE_Email_messenger__apply_CSSInliner ', true, $preview)) {
612
+			// require CssToInlineStyles library and its dependencies via composer autoloader
613
+			require_once EE_THIRD_PARTY . 'cssinliner/vendor/autoload.php';
614
+
615
+			// now if this isn't a preview, let's setup the body so it has inline styles
616
+			if (! $preview || ($preview && defined('DOING_AJAX'))) {
617
+				$style = file_get_contents(
618
+					$this->get_variation(
619
+						$this->_tmp_pack,
620
+						$this->_incoming_message_type->name,
621
+						false,
622
+						'main',
623
+						$this->_variation
624
+					),
625
+					true
626
+				);
627
+				$CSS   = new TijsVerkoyen\CssToInlineStyles\CssToInlineStyles($body, $style);
628
+				// for some reason the library has a bracket and new line at the beginning.  This takes care of that.
629
+				$body  = ltrim($CSS->convert(true), ">\n");
630
+				// see https://events.codebasehq.com/projects/event-espresso/tickets/8609
631
+				$body  = ltrim($body, "<?");
632
+			}
633
+		}
634
+		return $body;
635
+	}
636
+
637
+
638
+	/**
639
+	 * This just returns any existing test settings that might be saved in the database
640
+	 *
641
+	 * @access public
642
+	 * @return array
643
+	 */
644
+	public function get_existing_test_settings()
645
+	{
646
+		$settings = parent::get_existing_test_settings();
647
+		// override subject if present because we always want it to be fresh.
648
+		if (is_array($settings) && ! empty($settings['subject'])) {
649
+			$settings['subject'] = sprintf(__('Test email sent from %s', 'event_espresso'), get_bloginfo('name'));
650
+		}
651
+		return $settings;
652
+	}
653 653
 }
Please login to merge, or discard this patch.
Spacing   +9 added lines, -9 removed lines patch added patch discarded remove patch
@@ -56,7 +56,7 @@  discard block
 block discarded – undo
56 56
             ),
57 57
             '<code>wp_mail</code>'
58 58
         );
59
-        $this->label               = array(
59
+        $this->label = array(
60 60
             'singular' => esc_html__('email', 'event_espresso'),
61 61
             'plural'   => esc_html__('emails', 'event_espresso'),
62 62
         );
@@ -438,7 +438,7 @@  discard block
 block discarded – undo
438 438
             $this->_body(),
439 439
             $this->_headers()
440 440
         );
441
-        if (! $success) {
441
+        if ( ! $success) {
442 442
             EE_Error::add_error(
443 443
                 sprintf(
444 444
                     esc_html__(
@@ -482,8 +482,8 @@  discard block
 block discarded – undo
482 482
         $this->_ensure_has_from_email_address();
483 483
         $from    = $this->_from;
484 484
         $headers = array(
485
-            'From:' . $from,
486
-            'Reply-To:' . $from,
485
+            'From:'.$from,
486
+            'Reply-To:'.$from,
487 487
             'Content-Type:text/html; charset=utf-8',
488 488
         );
489 489
 
@@ -492,8 +492,8 @@  discard block
 block discarded – undo
492 492
          * cover back compat where there may be users who have saved cc values in their db for the newsletter message
493 493
          * type which they are no longer able to change.
494 494
          */
495
-        if (! empty($this->_cc) && ! $this->_incoming_message_type instanceof EE_Newsletter_message_type) {
496
-            $headers[] = 'cc: ' . $this->_cc;
495
+        if ( ! empty($this->_cc) && ! $this->_incoming_message_type instanceof EE_Newsletter_message_type) {
496
+            $headers[] = 'cc: '.$this->_cc;
497 497
         }
498 498
 
499 499
         // but wait!  Header's for the from is NOT reliable because some plugins don't respect From: as set in the
@@ -600,7 +600,7 @@  discard block
 block discarded – undo
600 600
             'from'      => $this->_from,
601 601
             'main_body' => wpautop($this->_content),
602 602
         );
603
-        $body                 = $this->_get_main_template($preview);
603
+        $body = $this->_get_main_template($preview);
604 604
 
605 605
         /**
606 606
          * This filter allows one to bypass the CSSToInlineStyles tool and leave the body untouched.
@@ -610,10 +610,10 @@  discard block
 block discarded – undo
610 610
          */
611 611
         if (apply_filters('FHEE__EE_Email_messenger__apply_CSSInliner ', true, $preview)) {
612 612
             // require CssToInlineStyles library and its dependencies via composer autoloader
613
-            require_once EE_THIRD_PARTY . 'cssinliner/vendor/autoload.php';
613
+            require_once EE_THIRD_PARTY.'cssinliner/vendor/autoload.php';
614 614
 
615 615
             // now if this isn't a preview, let's setup the body so it has inline styles
616
-            if (! $preview || ($preview && defined('DOING_AJAX'))) {
616
+            if ( ! $preview || ($preview && defined('DOING_AJAX'))) {
617 617
                 $style = file_get_contents(
618 618
                     $this->get_variation(
619 619
                         $this->_tmp_pack,
Please login to merge, or discard this patch.
public/template_tags.php 2 patches
Indentation   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -206,7 +206,7 @@
 block discarded – undo
206 206
 	function espresso_ticket_selector( $event = NULL ) {
207 207
 		if (  ! apply_filters( 'FHEE_disable_espresso_ticket_selector', FALSE ) ) {
208 208
 			espresso_load_ticket_selector();
209
-            \EED_Ticket_Selector::set_definitions();
209
+			\EED_Ticket_Selector::set_definitions();
210 210
 			echo EED_Ticket_Selector::display_ticket_selector( $event );
211 211
 		}
212 212
 	}
Please login to merge, or discard this patch.
Spacing   +289 added lines, -289 removed lines patch added patch discarded remove patch
@@ -14,12 +14,12 @@  discard block
 block discarded – undo
14 14
  * @param int | \EE_Event $event
15 15
  * @return bool
16 16
  */
17
-function is_espresso_event( $event = NULL ) {
18
-	if ( can_use_espresso_conditionals( __FUNCTION__ )) {
17
+function is_espresso_event($event = NULL) {
18
+	if (can_use_espresso_conditionals(__FUNCTION__)) {
19 19
 		// extract EE_Event object from passed param regardless of what it is (within reason of course)
20
-		$event = EEH_Event_View::get_event( $event );
20
+		$event = EEH_Event_View::get_event($event);
21 21
 		// do we have a valid event ?
22
-		return $event instanceof EE_Event  ? TRUE : FALSE;
22
+		return $event instanceof EE_Event ? TRUE : FALSE;
23 23
 	}
24 24
 	return FALSE;
25 25
 }
@@ -31,7 +31,7 @@  discard block
 block discarded – undo
31 31
  * @return bool
32 32
  */
33 33
 function is_espresso_event_single() {
34
-	if ( can_use_espresso_conditionals( __FUNCTION__ )) {
34
+	if (can_use_espresso_conditionals(__FUNCTION__)) {
35 35
 		global $wp_query;
36 36
 		// return conditionals set by CPTs
37 37
 		return $wp_query instanceof WP_Query ? $wp_query->is_espresso_event_single : FALSE;
@@ -46,7 +46,7 @@  discard block
 block discarded – undo
46 46
  * @return bool
47 47
  */
48 48
 function is_espresso_event_archive() {
49
-	if ( can_use_espresso_conditionals( __FUNCTION__ )) {
49
+	if (can_use_espresso_conditionals(__FUNCTION__)) {
50 50
 		global $wp_query;
51 51
 		return $wp_query instanceof WP_Query ? $wp_query->is_espresso_event_archive : FALSE;
52 52
 	}
@@ -60,7 +60,7 @@  discard block
 block discarded – undo
60 60
  * @return bool
61 61
  */
62 62
 function is_espresso_event_taxonomy() {
63
-	if ( can_use_espresso_conditionals( __FUNCTION__ )) {
63
+	if (can_use_espresso_conditionals(__FUNCTION__)) {
64 64
 		global $wp_query;
65 65
 		return $wp_query instanceof WP_Query ? $wp_query->is_espresso_event_taxonomy : FALSE;
66 66
 	}
@@ -74,10 +74,10 @@  discard block
 block discarded – undo
74 74
  * @param int | \EE_Venue $venue
75 75
  * @return bool
76 76
  */
77
-function is_espresso_venue( $venue = NULL ) {
78
-	if ( can_use_espresso_conditionals( __FUNCTION__ )) {
77
+function is_espresso_venue($venue = NULL) {
78
+	if (can_use_espresso_conditionals(__FUNCTION__)) {
79 79
 		// extract EE_Venue object from passed param regardless of what it is (within reason of course)
80
-		$venue = EEH_Venue_View::get_venue( $venue, FALSE );
80
+		$venue = EEH_Venue_View::get_venue($venue, FALSE);
81 81
 		// do we have a valid event ?
82 82
 		return $venue instanceof EE_Venue ? TRUE : FALSE;
83 83
 	}
@@ -91,7 +91,7 @@  discard block
 block discarded – undo
91 91
  * @return bool
92 92
  */
93 93
 function is_espresso_venue_single() {
94
-	if ( can_use_espresso_conditionals( __FUNCTION__ )) {
94
+	if (can_use_espresso_conditionals(__FUNCTION__)) {
95 95
 		global $wp_query;
96 96
 		return $wp_query instanceof WP_Query ? $wp_query->is_espresso_venue_single : FALSE;
97 97
 	}
@@ -105,7 +105,7 @@  discard block
 block discarded – undo
105 105
  * @return bool
106 106
  */
107 107
 function is_espresso_venue_archive() {
108
-	if ( can_use_espresso_conditionals( __FUNCTION__ )) {
108
+	if (can_use_espresso_conditionals(__FUNCTION__)) {
109 109
 		global $wp_query;
110 110
 		return $wp_query instanceof WP_Query ? $wp_query->is_espresso_venue_archive : FALSE;
111 111
 	}
@@ -119,7 +119,7 @@  discard block
 block discarded – undo
119 119
  * @return bool
120 120
  */
121 121
 function is_espresso_venue_taxonomy() {
122
-	if ( can_use_espresso_conditionals( __FUNCTION__ )) {
122
+	if (can_use_espresso_conditionals(__FUNCTION__)) {
123 123
 		global $wp_query;
124 124
 		return $wp_query instanceof WP_Query ? $wp_query->is_espresso_venue_taxonomy : FALSE;
125 125
 	}
@@ -133,12 +133,12 @@  discard block
 block discarded – undo
133 133
  * @param $conditional_tag
134 134
  * @return bool
135 135
  */
136
-function can_use_espresso_conditionals( $conditional_tag ) {
137
-	if ( ! did_action( 'AHEE__EE_System__initialize' )) {
136
+function can_use_espresso_conditionals($conditional_tag) {
137
+	if ( ! did_action('AHEE__EE_System__initialize')) {
138 138
 		EE_Error::doing_it_wrong(
139 139
 			__FUNCTION__,
140 140
 			sprintf(
141
-				__( 'The "%s" conditional tag can not be used until after the "init" hook has run, but works best when used within a theme\'s template files.','event_espresso'),
141
+				__('The "%s" conditional tag can not be used until after the "init" hook has run, but works best when used within a theme\'s template files.', 'event_espresso'),
142 142
 				$conditional_tag
143 143
 			),
144 144
 			'4.4.0'
@@ -153,13 +153,13 @@  discard block
 block discarded – undo
153 153
 
154 154
 /*************************** Event Queries ***************************/
155 155
 
156
-if ( ! function_exists( 'espresso_get_events' )) {
156
+if ( ! function_exists('espresso_get_events')) {
157 157
 	/**
158 158
 	 * 	espresso_get_events
159 159
 	 * @param array $params
160 160
 	 * @return array
161 161
 	 */
162
-	function espresso_get_events( $params = array() ) {
162
+	function espresso_get_events($params = array()) {
163 163
 		//set default params
164 164
 		$default_espresso_events_params = array(
165 165
 			'limit' => 10,
@@ -170,18 +170,18 @@  discard block
 block discarded – undo
170 170
 			'sort' => 'ASC'
171 171
 		);
172 172
 		// allow the defaults to be filtered
173
-		$default_espresso_events_params = apply_filters( 'espresso_get_events__default_espresso_events_params', $default_espresso_events_params );
173
+		$default_espresso_events_params = apply_filters('espresso_get_events__default_espresso_events_params', $default_espresso_events_params);
174 174
 		// grab params and merge with defaults, then extract
175
-		$params = array_merge( $default_espresso_events_params, $params );
175
+		$params = array_merge($default_espresso_events_params, $params);
176 176
 		// run the query
177
-		$events_query = new EventEspresso\core\domain\services\wp_queries\EventListQuery( $params );
177
+		$events_query = new EventEspresso\core\domain\services\wp_queries\EventListQuery($params);
178 178
 		// assign results to a variable so we can return it
179 179
 		$events = $events_query->have_posts() ? $events_query->posts : array();
180 180
 		// but first reset the query and postdata
181 181
 		wp_reset_query();
182 182
 		wp_reset_postdata();
183 183
 		EED_Events_Archive::remove_all_events_archive_filters();
184
-		unset( $events_query );
184
+		unset($events_query);
185 185
 		return $events;
186 186
 	}
187 187
 }
@@ -195,33 +195,33 @@  discard block
 block discarded – undo
195 195
  * espresso_load_ticket_selector
196 196
  */
197 197
 function espresso_load_ticket_selector() {
198
-	EE_Registry::instance()->load_file( EE_MODULES . 'ticket_selector', 'EED_Ticket_Selector', 'module' );
198
+	EE_Registry::instance()->load_file(EE_MODULES.'ticket_selector', 'EED_Ticket_Selector', 'module');
199 199
 }
200 200
 
201
-if ( ! function_exists( 'espresso_ticket_selector' )) {
201
+if ( ! function_exists('espresso_ticket_selector')) {
202 202
 	/**
203 203
 	 * espresso_ticket_selector
204 204
 	 * @param null $event
205 205
 	 */
206
-	function espresso_ticket_selector( $event = NULL ) {
207
-		if (  ! apply_filters( 'FHEE_disable_espresso_ticket_selector', FALSE ) ) {
206
+	function espresso_ticket_selector($event = NULL) {
207
+		if ( ! apply_filters('FHEE_disable_espresso_ticket_selector', FALSE)) {
208 208
 			espresso_load_ticket_selector();
209 209
             \EED_Ticket_Selector::set_definitions();
210
-			echo EED_Ticket_Selector::display_ticket_selector( $event );
210
+			echo EED_Ticket_Selector::display_ticket_selector($event);
211 211
 		}
212 212
 	}
213 213
 }
214 214
 
215 215
 
216
-	if ( ! function_exists( 'espresso_view_details_btn' )) {
216
+	if ( ! function_exists('espresso_view_details_btn')) {
217 217
 	/**
218 218
 	 * espresso_view_details_btn
219 219
 	 * @param null $event
220 220
 	 */
221
-	function espresso_view_details_btn( $event = NULL ) {
222
-		if (  ! apply_filters( 'FHEE_disable_espresso_view_details_btn', FALSE ) ) {
221
+	function espresso_view_details_btn($event = NULL) {
222
+		if ( ! apply_filters('FHEE_disable_espresso_view_details_btn', FALSE)) {
223 223
 			espresso_load_ticket_selector();
224
-			echo EED_Ticket_Selector::display_ticket_selector( $event, TRUE );
224
+			echo EED_Ticket_Selector::display_ticket_selector($event, TRUE);
225 225
 		}
226 226
 	}
227 227
 }
@@ -231,7 +231,7 @@  discard block
 block discarded – undo
231 231
 
232 232
 /*************************** EEH_Event_View ***************************/
233 233
 
234
-if ( ! function_exists( 'espresso_load_event_list_assets' )) {
234
+if ( ! function_exists('espresso_load_event_list_assets')) {
235 235
 	/**
236 236
 	 * espresso_load_event_list_assets
237 237
 	 * ensures that event list styles and scripts are loaded
@@ -240,13 +240,13 @@  discard block
 block discarded – undo
240 240
 	 */
241 241
 	function espresso_load_event_list_assets() {
242 242
 		$event_list = EED_Events_Archive::instance();
243
-		add_action( 'AHEE__EE_System__initialize_last', array( $event_list, 'load_event_list_assets' ), 10 );
244
-		add_filter( 'FHEE_enable_default_espresso_css', '__return_true' );
243
+		add_action('AHEE__EE_System__initialize_last', array($event_list, 'load_event_list_assets'), 10);
244
+		add_filter('FHEE_enable_default_espresso_css', '__return_true');
245 245
 	}
246 246
 }
247 247
 
248 248
 
249
-if ( ! function_exists( 'espresso_event_reg_button' )) {
249
+if ( ! function_exists('espresso_event_reg_button')) {
250 250
 	/**
251 251
 	 * espresso_event_reg_button
252 252
 	 * returns the "Register Now" button if event is active,
@@ -258,9 +258,9 @@  discard block
 block discarded – undo
258 258
 	 * @param bool $EVT_ID
259 259
 	 * @return string
260 260
 	 */
261
-	function espresso_event_reg_button( $btn_text_if_active = NULL, $btn_text_if_inactive = FALSE, $EVT_ID = FALSE ) {
262
-		$event_status = EEH_Event_View::event_active_status( $EVT_ID );
263
-		switch ( $event_status ) {
261
+	function espresso_event_reg_button($btn_text_if_active = NULL, $btn_text_if_inactive = FALSE, $EVT_ID = FALSE) {
262
+		$event_status = EEH_Event_View::event_active_status($EVT_ID);
263
+		switch ($event_status) {
264 264
 			case EE_Datetime::sold_out :
265 265
 				$btn_text = __('Sold Out', 'event_espresso');
266 266
 				$class = 'ee-pink';
@@ -276,10 +276,10 @@  discard block
 block discarded – undo
276 276
 			case EE_Datetime::upcoming :
277 277
 			case EE_Datetime::active :
278 278
 			default :
279
-				$btn_text =! empty( $btn_text_if_active ) ? $btn_text_if_active : __( 'Register Now', 'event_espresso' );
279
+				$btn_text = ! empty($btn_text_if_active) ? $btn_text_if_active : __('Register Now', 'event_espresso');
280 280
 				$class = 'ee-green';
281 281
 		}
282
-		if ( $event_status < 1 && ! empty( $btn_text_if_inactive )) {
282
+		if ($event_status < 1 && ! empty($btn_text_if_inactive)) {
283 283
 			$btn_text = $btn_text_if_inactive;
284 284
 			$class = 'ee-grey';
285 285
 		}
@@ -293,7 +293,7 @@  discard block
 block discarded – undo
293 293
 
294 294
 
295 295
 
296
-if ( ! function_exists( 'espresso_display_ticket_selector' )) {
296
+if ( ! function_exists('espresso_display_ticket_selector')) {
297 297
 	/**
298 298
 	 * espresso_display_ticket_selector
299 299
 	 * whether or not to display the Ticket Selector for an event
@@ -301,14 +301,14 @@  discard block
 block discarded – undo
301 301
 	 * @param bool $EVT_ID
302 302
 	 * @return boolean
303 303
 	 */
304
-	function espresso_display_ticket_selector( $EVT_ID = FALSE ) {
305
-		return EEH_Event_View::display_ticket_selector( $EVT_ID );
304
+	function espresso_display_ticket_selector($EVT_ID = FALSE) {
305
+		return EEH_Event_View::display_ticket_selector($EVT_ID);
306 306
 	}
307 307
 }
308 308
 
309 309
 
310 310
 
311
-if ( ! function_exists( 'espresso_event_status_banner' )) {
311
+if ( ! function_exists('espresso_event_status_banner')) {
312 312
 	/**
313 313
 	 * espresso_event_status
314 314
 	 * returns a banner showing the event status if it is sold out, expired, or inactive
@@ -316,13 +316,13 @@  discard block
 block discarded – undo
316 316
 	 * @param bool $EVT_ID
317 317
 	 * @return string
318 318
 	 */
319
-	function espresso_event_status_banner( $EVT_ID = FALSE ) {
320
-		return EEH_Event_View::event_status( $EVT_ID );
319
+	function espresso_event_status_banner($EVT_ID = FALSE) {
320
+		return EEH_Event_View::event_status($EVT_ID);
321 321
 	}
322 322
 }
323 323
 
324 324
 
325
-if ( ! function_exists( 'espresso_event_status' )) {
325
+if ( ! function_exists('espresso_event_status')) {
326 326
 	/**
327 327
 	 * espresso_event_status
328 328
 	 * returns the event status if it is sold out, expired, or inactive
@@ -331,13 +331,13 @@  discard block
 block discarded – undo
331 331
 	 * @param bool $echo
332 332
 	 * @return string
333 333
 	 */
334
-	function espresso_event_status( $EVT_ID = 0, $echo = TRUE ) {
335
-		return EEH_Event_View::event_active_status( $EVT_ID, $echo );
334
+	function espresso_event_status($EVT_ID = 0, $echo = TRUE) {
335
+		return EEH_Event_View::event_active_status($EVT_ID, $echo);
336 336
 	}
337 337
 }
338 338
 
339 339
 
340
-if ( ! function_exists( 'espresso_event_categories' )) {
340
+if ( ! function_exists('espresso_event_categories')) {
341 341
 	/**
342 342
 	 * espresso_event_categories
343 343
 	 * returns the terms associated with an event
@@ -347,17 +347,17 @@  discard block
 block discarded – undo
347 347
 	 * @param bool $echo
348 348
 	 * @return string
349 349
 	 */
350
-	function espresso_event_categories( $EVT_ID = 0, $hide_uncategorized = TRUE, $echo = TRUE ) {
351
-		if ( $echo ) {
352
-			echo EEH_Event_View::event_categories( $EVT_ID, $hide_uncategorized );
350
+	function espresso_event_categories($EVT_ID = 0, $hide_uncategorized = TRUE, $echo = TRUE) {
351
+		if ($echo) {
352
+			echo EEH_Event_View::event_categories($EVT_ID, $hide_uncategorized);
353 353
 			return '';
354 354
 		}
355
-		return EEH_Event_View::event_categories( $EVT_ID, $hide_uncategorized );
355
+		return EEH_Event_View::event_categories($EVT_ID, $hide_uncategorized);
356 356
 	}
357 357
 }
358 358
 
359 359
 
360
-if ( ! function_exists( 'espresso_event_tickets_available' )) {
360
+if ( ! function_exists('espresso_event_tickets_available')) {
361 361
 	/**
362 362
 	 * espresso_event_tickets_available
363 363
 	 * returns the ticket types available for purchase for an event
@@ -367,26 +367,26 @@  discard block
 block discarded – undo
367 367
 	 * @param bool $format
368 368
 	 * @return string
369 369
 	 */
370
-	function espresso_event_tickets_available( $EVT_ID = 0, $echo = TRUE, $format = TRUE ) {
371
-		$tickets = EEH_Event_View::event_tickets_available( $EVT_ID );
372
-		if ( is_array( $tickets ) && ! empty( $tickets )) {
370
+	function espresso_event_tickets_available($EVT_ID = 0, $echo = TRUE, $format = TRUE) {
371
+		$tickets = EEH_Event_View::event_tickets_available($EVT_ID);
372
+		if (is_array($tickets) && ! empty($tickets)) {
373 373
 			// if formatting then $html will be a string, else it will be an array of ticket objects
374
-			$html = $format ? '<ul id="ee-event-tickets-ul-' . $EVT_ID . '" class="ee-event-tickets-ul">' : array();
375
-			foreach ( $tickets as $ticket ) {
376
-				if ( $ticket instanceof EE_Ticket ) {
377
-					if ( $format ) {
378
-						$html .= '<li id="ee-event-tickets-li-' . $ticket->ID() . '" class="ee-event-tickets-li">';
379
-						$html .= $ticket->name() . ' ' . EEH_Template::format_currency( $ticket->get_ticket_total_with_taxes() );
374
+			$html = $format ? '<ul id="ee-event-tickets-ul-'.$EVT_ID.'" class="ee-event-tickets-ul">' : array();
375
+			foreach ($tickets as $ticket) {
376
+				if ($ticket instanceof EE_Ticket) {
377
+					if ($format) {
378
+						$html .= '<li id="ee-event-tickets-li-'.$ticket->ID().'" class="ee-event-tickets-li">';
379
+						$html .= $ticket->name().' '.EEH_Template::format_currency($ticket->get_ticket_total_with_taxes());
380 380
 						$html .= '</li>';
381 381
 					} else {
382 382
 						$html[] = $ticket;
383 383
 					}
384 384
 				}
385 385
 			}
386
-			if ( $format ) {
386
+			if ($format) {
387 387
 				$html .= '</ul>';
388 388
 			}
389
-			if ( $echo && $format ) {
389
+			if ($echo && $format) {
390 390
 				echo $html;
391 391
 				return '';
392 392
 			}
@@ -396,7 +396,7 @@  discard block
 block discarded – undo
396 396
 	}
397 397
 }
398 398
 
399
-if ( ! function_exists( 'espresso_event_date_obj' )) {
399
+if ( ! function_exists('espresso_event_date_obj')) {
400 400
 	/**
401 401
 	 * espresso_event_date_obj
402 402
 	 * returns the primary date object for an event
@@ -404,13 +404,13 @@  discard block
 block discarded – undo
404 404
 	 * @param bool $EVT_ID
405 405
 	 * @return object
406 406
 	 */
407
-	function espresso_event_date_obj( $EVT_ID = FALSE ) {
408
-		return EEH_Event_View::get_primary_date_obj( $EVT_ID );
407
+	function espresso_event_date_obj($EVT_ID = FALSE) {
408
+		return EEH_Event_View::get_primary_date_obj($EVT_ID);
409 409
 	}
410 410
 }
411 411
 
412 412
 
413
-if ( ! function_exists( 'espresso_event_date' )) {
413
+if ( ! function_exists('espresso_event_date')) {
414 414
 	/**
415 415
 	 * espresso_event_date
416 416
 	 * returns the primary date for an event
@@ -421,22 +421,22 @@  discard block
 block discarded – undo
421 421
 	 * @param bool $echo
422 422
 	 * @return string
423 423
 	 */
424
-	function espresso_event_date( $date_format = '', $time_format = '', $EVT_ID = FALSE, $echo = TRUE ) {
425
-		$date_format = ! empty( $date_format ) ? $date_format : get_option( 'date_format' );
426
-		$time_format = ! empty( $time_format ) ? $time_format : get_option( 'time_format' );
427
-		$date_format = apply_filters( 'FHEE__espresso_event_date__date_format', $date_format );
428
-		$time_format = apply_filters( 'FHEE__espresso_event_date__time_format', $time_format );
429
-		if($echo){
430
-			echo EEH_Event_View::the_event_date( $date_format, $time_format, $EVT_ID );
424
+	function espresso_event_date($date_format = '', $time_format = '', $EVT_ID = FALSE, $echo = TRUE) {
425
+		$date_format = ! empty($date_format) ? $date_format : get_option('date_format');
426
+		$time_format = ! empty($time_format) ? $time_format : get_option('time_format');
427
+		$date_format = apply_filters('FHEE__espresso_event_date__date_format', $date_format);
428
+		$time_format = apply_filters('FHEE__espresso_event_date__time_format', $time_format);
429
+		if ($echo) {
430
+			echo EEH_Event_View::the_event_date($date_format, $time_format, $EVT_ID);
431 431
 			return '';
432 432
 		}
433
-		return EEH_Event_View::the_event_date( $date_format, $time_format, $EVT_ID );
433
+		return EEH_Event_View::the_event_date($date_format, $time_format, $EVT_ID);
434 434
 
435 435
 	}
436 436
 }
437 437
 
438 438
 
439
-if ( ! function_exists( 'espresso_list_of_event_dates' )) {
439
+if ( ! function_exists('espresso_list_of_event_dates')) {
440 440
 	/**
441 441
 	 * espresso_list_of_event_dates
442 442
 	 * returns a unordered list of dates for an event
@@ -451,40 +451,40 @@  discard block
 block discarded – undo
451 451
 	 * @param null   $limit
452 452
 	 * @return string
453 453
 	 */
454
-	function espresso_list_of_event_dates( $EVT_ID = 0, $date_format = '', $time_format = '', $echo = TRUE, $show_expired = NULL, $format = TRUE, $add_breaks = TRUE, $limit = NULL ) {
455
-		$date_format = ! empty( $date_format ) ? $date_format : get_option( 'date_format' );
456
-		$time_format = ! empty( $time_format ) ? $time_format : get_option( 'time_format' );
457
-		$date_format = apply_filters( 'FHEE__espresso_list_of_event_dates__date_format', $date_format );
458
-		$time_format = apply_filters( 'FHEE__espresso_list_of_event_dates__time_format', $time_format );
459
-		$datetimes = EEH_Event_View::get_all_date_obj( $EVT_ID, $show_expired, FALSE, $limit );
460
-		if ( ! $format ) {
461
-			return apply_filters( 'FHEE__espresso_list_of_event_dates__datetimes', $datetimes );
454
+	function espresso_list_of_event_dates($EVT_ID = 0, $date_format = '', $time_format = '', $echo = TRUE, $show_expired = NULL, $format = TRUE, $add_breaks = TRUE, $limit = NULL) {
455
+		$date_format = ! empty($date_format) ? $date_format : get_option('date_format');
456
+		$time_format = ! empty($time_format) ? $time_format : get_option('time_format');
457
+		$date_format = apply_filters('FHEE__espresso_list_of_event_dates__date_format', $date_format);
458
+		$time_format = apply_filters('FHEE__espresso_list_of_event_dates__time_format', $time_format);
459
+		$datetimes = EEH_Event_View::get_all_date_obj($EVT_ID, $show_expired, FALSE, $limit);
460
+		if ( ! $format) {
461
+			return apply_filters('FHEE__espresso_list_of_event_dates__datetimes', $datetimes);
462 462
 		}
463 463
 		//d( $datetimes );
464
-		if ( is_array( $datetimes ) && ! empty( $datetimes )) {
464
+		if (is_array($datetimes) && ! empty($datetimes)) {
465 465
 			global $post;
466
-			$html = $format ? '<ul id="ee-event-datetimes-ul-' . $post->ID . '" class="ee-event-datetimes-ul ee-clearfix">' : '';
467
-			foreach ( $datetimes as $datetime ) {
468
-				if ( $datetime instanceof EE_Datetime ) {
469
-					$html .= '<li id="ee-event-datetimes-li-' . $datetime->ID();
470
-					$html .= '" class="ee-event-datetimes-li ee-event-datetimes-li-' . $datetime->get_active_status() . '">';
466
+			$html = $format ? '<ul id="ee-event-datetimes-ul-'.$post->ID.'" class="ee-event-datetimes-ul ee-clearfix">' : '';
467
+			foreach ($datetimes as $datetime) {
468
+				if ($datetime instanceof EE_Datetime) {
469
+					$html .= '<li id="ee-event-datetimes-li-'.$datetime->ID();
470
+					$html .= '" class="ee-event-datetimes-li ee-event-datetimes-li-'.$datetime->get_active_status().'">';
471 471
 					$datetime_name = $datetime->name();
472
-					$html .= ! empty( $datetime_name ) ? '<strong>' . $datetime_name . '</strong>' : '';
473
-					$html .= ! empty( $datetime_name )  && $add_breaks ? '<br />' : '';
474
-					$html .= '<span class="dashicons dashicons-calendar"></span><span class="ee-event-datetimes-li-daterange">' . $datetime->date_range( $date_format ) . '</span><br/>';
475
-					$html .= '<span class="dashicons dashicons-clock"></span><span class="ee-event-datetimes-li-timerange">' . $datetime->time_range( $time_format ) . '</span>';
472
+					$html .= ! empty($datetime_name) ? '<strong>'.$datetime_name.'</strong>' : '';
473
+					$html .= ! empty($datetime_name) && $add_breaks ? '<br />' : '';
474
+					$html .= '<span class="dashicons dashicons-calendar"></span><span class="ee-event-datetimes-li-daterange">'.$datetime->date_range($date_format).'</span><br/>';
475
+					$html .= '<span class="dashicons dashicons-clock"></span><span class="ee-event-datetimes-li-timerange">'.$datetime->time_range($time_format).'</span>';
476 476
 					$datetime_description = $datetime->description();
477
-					$html .= ! empty( $datetime_description )  && $add_breaks ? '<br />' : '';
478
-					$html .= ! empty( $datetime_description ) ? ' - ' . $datetime_description : '';
479
-					$html = apply_filters( 'FHEE__espresso_list_of_event_dates__datetime_html', $html, $datetime );
477
+					$html .= ! empty($datetime_description) && $add_breaks ? '<br />' : '';
478
+					$html .= ! empty($datetime_description) ? ' - '.$datetime_description : '';
479
+					$html = apply_filters('FHEE__espresso_list_of_event_dates__datetime_html', $html, $datetime);
480 480
 					$html .= '</li>';
481 481
 				}
482 482
 			}
483 483
 			$html .= $format ? '</ul>' : '';
484 484
 		} else {
485
-			$html = $format ?  '<p><span class="dashicons dashicons-marker pink-text"></span>' . __( 'There are no upcoming dates for this event.', 'event_espresso' ) . '</p><br/>' : '';
485
+			$html = $format ? '<p><span class="dashicons dashicons-marker pink-text"></span>'.__('There are no upcoming dates for this event.', 'event_espresso').'</p><br/>' : '';
486 486
 		}
487
-		if ( $echo ) {
487
+		if ($echo) {
488 488
 			echo $html;
489 489
 			return '';
490 490
 		}
@@ -493,7 +493,7 @@  discard block
 block discarded – undo
493 493
 }
494 494
 
495 495
 
496
-if ( ! function_exists( 'espresso_event_end_date' )) {
496
+if ( ! function_exists('espresso_event_end_date')) {
497 497
 	/**
498 498
 	 * espresso_event_end_date
499 499
 	 * returns the last date for an event
@@ -504,20 +504,20 @@  discard block
 block discarded – undo
504 504
 	 * @param bool   $echo
505 505
 	 * @return string
506 506
 	 */
507
-	function espresso_event_end_date( $date_format = '', $time_format = '', $EVT_ID = FALSE, $echo = TRUE ) {
508
-		$date_format = ! empty( $date_format ) ? $date_format : get_option( 'date_format' );
509
-		$time_format = ! empty( $time_format ) ? $time_format : get_option( 'time_format' );
510
-		$date_format = apply_filters( 'FHEE__espresso_event_end_date__date_format', $date_format );
511
-		$time_format = apply_filters( 'FHEE__espresso_event_end_date__time_format', $time_format );
512
-		if($echo){
513
-			echo EEH_Event_View::the_event_end_date( $date_format, $time_format, $EVT_ID );
507
+	function espresso_event_end_date($date_format = '', $time_format = '', $EVT_ID = FALSE, $echo = TRUE) {
508
+		$date_format = ! empty($date_format) ? $date_format : get_option('date_format');
509
+		$time_format = ! empty($time_format) ? $time_format : get_option('time_format');
510
+		$date_format = apply_filters('FHEE__espresso_event_end_date__date_format', $date_format);
511
+		$time_format = apply_filters('FHEE__espresso_event_end_date__time_format', $time_format);
512
+		if ($echo) {
513
+			echo EEH_Event_View::the_event_end_date($date_format, $time_format, $EVT_ID);
514 514
 			return '';
515 515
 		}
516
-		return EEH_Event_View::the_event_end_date( $date_format, $time_format, $EVT_ID );
516
+		return EEH_Event_View::the_event_end_date($date_format, $time_format, $EVT_ID);
517 517
 	}
518 518
 }
519 519
 
520
-if ( ! function_exists( 'espresso_event_date_range' )) {
520
+if ( ! function_exists('espresso_event_date_range')) {
521 521
 	/**
522 522
 	 * espresso_event_date_range
523 523
 	 * returns the first and last chronologically ordered dates for an event (if different)
@@ -530,31 +530,31 @@  discard block
 block discarded – undo
530 530
 	 * @param bool   $echo
531 531
 	 * @return string
532 532
 	 */
533
-	function espresso_event_date_range( $date_format = '', $time_format = '', $single_date_format = '', $single_time_format = '', $EVT_ID = FALSE, $echo = TRUE ) {
533
+	function espresso_event_date_range($date_format = '', $time_format = '', $single_date_format = '', $single_time_format = '', $EVT_ID = FALSE, $echo = TRUE) {
534 534
 		// set and filter date and time formats when a range is returned
535
-		$date_format = ! empty( $date_format ) ? $date_format : get_option( 'date_format' );
536
-		$date_format = apply_filters( 'FHEE__espresso_event_date_range__date_format', $date_format );
535
+		$date_format = ! empty($date_format) ? $date_format : get_option('date_format');
536
+		$date_format = apply_filters('FHEE__espresso_event_date_range__date_format', $date_format);
537 537
 		// get the start and end date with NO time portion
538
-		$the_event_date = EEH_Event_View::the_earliest_event_date( $date_format, '', $EVT_ID );
539
-		$the_event_end_date = EEH_Event_View::the_latest_event_date( $date_format, '', $EVT_ID );
538
+		$the_event_date = EEH_Event_View::the_earliest_event_date($date_format, '', $EVT_ID);
539
+		$the_event_end_date = EEH_Event_View::the_latest_event_date($date_format, '', $EVT_ID);
540 540
 		// now we can determine if date range spans more than one day
541
-		if ( $the_event_date != $the_event_end_date ) {
542
-			$time_format = ! empty( $time_format ) ? $time_format : get_option( 'time_format' );
543
-			$time_format = apply_filters( 'FHEE__espresso_event_date_range__time_format', $time_format );
541
+		if ($the_event_date != $the_event_end_date) {
542
+			$time_format = ! empty($time_format) ? $time_format : get_option('time_format');
543
+			$time_format = apply_filters('FHEE__espresso_event_date_range__time_format', $time_format);
544 544
 			$html = sprintf(
545
-				__( '%1$s - %2$s', 'event_espresso' ),
546
-				EEH_Event_View::the_earliest_event_date( $date_format, $time_format, $EVT_ID ),
547
-				EEH_Event_View::the_latest_event_date( $date_format, $time_format, $EVT_ID )
545
+				__('%1$s - %2$s', 'event_espresso'),
546
+				EEH_Event_View::the_earliest_event_date($date_format, $time_format, $EVT_ID),
547
+				EEH_Event_View::the_latest_event_date($date_format, $time_format, $EVT_ID)
548 548
 			);
549 549
 		} else {
550 550
 			// set and filter date and time formats when only a single datetime is returned
551
-			$single_date_format = ! empty( $single_date_format ) ? $single_date_format : get_option( 'date_format' );
552
-			$single_time_format = ! empty( $single_time_format ) ? $single_time_format : get_option( 'time_format' );
553
-			$single_date_format = apply_filters( 'FHEE__espresso_event_date_range__single_date_format', $single_date_format );
554
-			$single_time_format = apply_filters( 'FHEE__espresso_event_date_range__single_time_format', $single_time_format );
555
-			$html = EEH_Event_View::the_earliest_event_date( $single_date_format, $single_time_format, $EVT_ID );
551
+			$single_date_format = ! empty($single_date_format) ? $single_date_format : get_option('date_format');
552
+			$single_time_format = ! empty($single_time_format) ? $single_time_format : get_option('time_format');
553
+			$single_date_format = apply_filters('FHEE__espresso_event_date_range__single_date_format', $single_date_format);
554
+			$single_time_format = apply_filters('FHEE__espresso_event_date_range__single_time_format', $single_time_format);
555
+			$html = EEH_Event_View::the_earliest_event_date($single_date_format, $single_time_format, $EVT_ID);
556 556
 		}
557
-		if ( $echo ) {
557
+		if ($echo) {
558 558
 			echo $html;
559 559
 			return '';
560 560
 		}
@@ -562,7 +562,7 @@  discard block
 block discarded – undo
562 562
 	}
563 563
 }
564 564
 
565
-if ( ! function_exists( 'espresso_next_upcoming_datetime_obj' )) {
565
+if ( ! function_exists('espresso_next_upcoming_datetime_obj')) {
566 566
 	/**
567 567
 	 * espresso_next_upcoming_datetime_obj
568 568
 	 * returns the next upcoming datetime object for an event
@@ -570,12 +570,12 @@  discard block
 block discarded – undo
570 570
 	 * @param int $EVT_ID
571 571
 	 * @return EE_Datetime|null
572 572
 	 */
573
-	function espresso_next_upcoming_datetime_obj( $EVT_ID = 0 ) {
574
-		return EEH_Event_View::get_next_upcoming_date_obj( $EVT_ID );
573
+	function espresso_next_upcoming_datetime_obj($EVT_ID = 0) {
574
+		return EEH_Event_View::get_next_upcoming_date_obj($EVT_ID);
575 575
 	}
576 576
 }
577 577
 
578
-if ( ! function_exists( 'espresso_next_upcoming_datetime' ) ) {
578
+if ( ! function_exists('espresso_next_upcoming_datetime')) {
579 579
 	/**
580 580
 	 * espresso_next_upcoming_datetime
581 581
 	 * returns the start date and time for the next upcoming event.
@@ -586,30 +586,30 @@  discard block
 block discarded – undo
586 586
 	 * @param bool $echo
587 587
 	 * @return string
588 588
 	 */
589
-	function espresso_next_upcoming_datetime( $date_format = '', $time_format = '', $EVT_ID = 0, $echo = true ) {
589
+	function espresso_next_upcoming_datetime($date_format = '', $time_format = '', $EVT_ID = 0, $echo = true) {
590 590
 
591
-		$date_format = ! empty( $date_format ) ? $date_format : get_option( 'date_format' );
592
-		$date_format = apply_filters( 'FHEE__espresso_next_upcoming_datetime__date_format', $date_format );
591
+		$date_format = ! empty($date_format) ? $date_format : get_option('date_format');
592
+		$date_format = apply_filters('FHEE__espresso_next_upcoming_datetime__date_format', $date_format);
593 593
 
594
-		$time_format = ! empty( $time_format ) ? $time_format : get_option( 'time_format' );
595
-		$time_format = apply_filters( 'FHEE__espresso_next_upcoming_datetime__time_format', $time_format );
594
+		$time_format = ! empty($time_format) ? $time_format : get_option('time_format');
595
+		$time_format = apply_filters('FHEE__espresso_next_upcoming_datetime__time_format', $time_format);
596 596
 
597
-		$datetime_format = trim( $date_format . ' ' . $time_format);
597
+		$datetime_format = trim($date_format.' '.$time_format);
598 598
 
599
-		$datetime = espresso_next_upcoming_datetime_obj( $EVT_ID );
599
+		$datetime = espresso_next_upcoming_datetime_obj($EVT_ID);
600 600
 
601
-		if( ! $datetime instanceof EE_Datetime ) {
601
+		if ( ! $datetime instanceof EE_Datetime) {
602 602
 			return '';
603 603
 		}
604
-		if ( $echo ){
605
-			echo $datetime->get_i18n_datetime( 'DTT_EVT_start', $datetime_format );
604
+		if ($echo) {
605
+			echo $datetime->get_i18n_datetime('DTT_EVT_start', $datetime_format);
606 606
 			return '';
607 607
 		}
608
-		return $datetime->get_i18n_datetime( 'DTT_EVT_start', $datetime_format );
608
+		return $datetime->get_i18n_datetime('DTT_EVT_start', $datetime_format);
609 609
 	}
610 610
 }
611 611
 
612
-if ( ! function_exists( 'espresso_event_date_as_calendar_page' )) {
612
+if ( ! function_exists('espresso_event_date_as_calendar_page')) {
613 613
 	/**
614 614
 	 * espresso_event_date_as_calendar_page
615 615
 	 * returns the primary date for an event, stylized to appear as the page of a calendar
@@ -617,15 +617,15 @@  discard block
 block discarded – undo
617 617
 	 * @param bool $EVT_ID
618 618
 	 * @return string
619 619
 	 */
620
-	function espresso_event_date_as_calendar_page( $EVT_ID = FALSE ) {
621
-		EEH_Event_View::event_date_as_calendar_page( $EVT_ID );
620
+	function espresso_event_date_as_calendar_page($EVT_ID = FALSE) {
621
+		EEH_Event_View::event_date_as_calendar_page($EVT_ID);
622 622
 	}
623 623
 }
624 624
 
625 625
 
626 626
 
627 627
 
628
-if ( ! function_exists( 'espresso_event_link_url' )) {
628
+if ( ! function_exists('espresso_event_link_url')) {
629 629
 	/**
630 630
 	 * espresso_event_link_url
631 631
 	 *
@@ -633,18 +633,18 @@  discard block
 block discarded – undo
633 633
 	 * @param bool $echo
634 634
 	 * @return string
635 635
 	 */
636
-	function espresso_event_link_url( $EVT_ID = 0, $echo = TRUE ) {
637
-		if ( $echo ) {
638
-			echo EEH_Event_View::event_link_url( $EVT_ID );
636
+	function espresso_event_link_url($EVT_ID = 0, $echo = TRUE) {
637
+		if ($echo) {
638
+			echo EEH_Event_View::event_link_url($EVT_ID);
639 639
 			return '';
640 640
 		}
641
-		return EEH_Event_View::event_link_url( $EVT_ID );
641
+		return EEH_Event_View::event_link_url($EVT_ID);
642 642
 	}
643 643
 }
644 644
 
645 645
 
646 646
 
647
-if ( ! function_exists( 'espresso_event_has_content_or_excerpt' )) {
647
+if ( ! function_exists('espresso_event_has_content_or_excerpt')) {
648 648
 	/**
649 649
 	 *    espresso_event_has_content_or_excerpt
650 650
 	 *
@@ -652,15 +652,15 @@  discard block
 block discarded – undo
652 652
 	 * @param bool $EVT_ID
653 653
 	 * @return    boolean
654 654
 	 */
655
-	function espresso_event_has_content_or_excerpt( $EVT_ID = FALSE ) {
656
-		return EEH_Event_View::event_has_content_or_excerpt( $EVT_ID );
655
+	function espresso_event_has_content_or_excerpt($EVT_ID = FALSE) {
656
+		return EEH_Event_View::event_has_content_or_excerpt($EVT_ID);
657 657
 	}
658 658
 }
659 659
 
660 660
 
661 661
 
662 662
 
663
-if ( ! function_exists( 'espresso_event_content_or_excerpt' )) {
663
+if ( ! function_exists('espresso_event_content_or_excerpt')) {
664 664
 	/**
665 665
 	 * espresso_event_content_or_excerpt
666 666
 	 *
@@ -669,18 +669,18 @@  discard block
 block discarded – undo
669 669
 	 * @param bool $echo
670 670
 	 * @return string
671 671
 	 */
672
-	function espresso_event_content_or_excerpt( $num_words = 55, $more = NULL, $echo = TRUE ) {
673
-		if ( $echo ) {
674
-			echo EEH_Event_View::event_content_or_excerpt( $num_words, $more );
672
+	function espresso_event_content_or_excerpt($num_words = 55, $more = NULL, $echo = TRUE) {
673
+		if ($echo) {
674
+			echo EEH_Event_View::event_content_or_excerpt($num_words, $more);
675 675
 			return '';
676 676
 		}
677
-		return EEH_Event_View::event_content_or_excerpt( $num_words, $more );
677
+		return EEH_Event_View::event_content_or_excerpt($num_words, $more);
678 678
 	}
679 679
 }
680 680
 
681 681
 
682 682
 
683
-if ( ! function_exists( 'espresso_event_phone' )) {
683
+if ( ! function_exists('espresso_event_phone')) {
684 684
 	/**
685 685
 	 * espresso_event_phone
686 686
 	 *
@@ -688,18 +688,18 @@  discard block
 block discarded – undo
688 688
 	 * @param bool $echo
689 689
 	 * @return string
690 690
 	 */
691
-	function espresso_event_phone( $EVT_ID = 0, $echo = TRUE ) {
692
-		if ( $echo ) {
693
-			echo EEH_Event_View::event_phone( $EVT_ID );
691
+	function espresso_event_phone($EVT_ID = 0, $echo = TRUE) {
692
+		if ($echo) {
693
+			echo EEH_Event_View::event_phone($EVT_ID);
694 694
 			return '';
695 695
 		}
696
-		return EEH_Event_View::event_phone( $EVT_ID );
696
+		return EEH_Event_View::event_phone($EVT_ID);
697 697
 	}
698 698
 }
699 699
 
700 700
 
701 701
 
702
-if ( ! function_exists( 'espresso_edit_event_link' )) {
702
+if ( ! function_exists('espresso_edit_event_link')) {
703 703
 	/**
704 704
 	 * espresso_edit_event_link
705 705
 	 * returns a link to edit an event
@@ -708,39 +708,39 @@  discard block
 block discarded – undo
708 708
 	 * @param bool $echo
709 709
 	 * @return string
710 710
 	 */
711
-	function espresso_edit_event_link( $EVT_ID = 0, $echo = TRUE ) {
712
-		if ( $echo ) {
713
-			echo EEH_Event_View::edit_event_link( $EVT_ID );
711
+	function espresso_edit_event_link($EVT_ID = 0, $echo = TRUE) {
712
+		if ($echo) {
713
+			echo EEH_Event_View::edit_event_link($EVT_ID);
714 714
 			return '';
715 715
 		}
716
-		return EEH_Event_View::edit_event_link( $EVT_ID );
716
+		return EEH_Event_View::edit_event_link($EVT_ID);
717 717
 	}
718 718
 }
719 719
 
720 720
 
721
-if ( ! function_exists( 'espresso_organization_name' )) {
721
+if ( ! function_exists('espresso_organization_name')) {
722 722
 	/**
723 723
 	 * espresso_organization_name
724 724
 	 * @param bool $echo
725 725
 	 * @return string
726 726
 	 */
727 727
 	function espresso_organization_name($echo = TRUE) {
728
-		if($echo){
729
-			echo EE_Registry::instance()->CFG->organization->get_pretty( 'name' );
728
+		if ($echo) {
729
+			echo EE_Registry::instance()->CFG->organization->get_pretty('name');
730 730
 			return '';
731 731
 		}
732
-		return EE_Registry::instance()->CFG->organization->get_pretty( 'name' );
732
+		return EE_Registry::instance()->CFG->organization->get_pretty('name');
733 733
 	}
734 734
 }
735 735
 
736
-if ( ! function_exists( 'espresso_organization_address' )) {
736
+if ( ! function_exists('espresso_organization_address')) {
737 737
 	/**
738 738
 	 * espresso_organization_address
739 739
 	 * @param string $type
740 740
 	 * @return string
741 741
 	 */
742
-	function espresso_organization_address( $type = 'inline' ) {
743
-		if ( EE_Registry::instance()->CFG->organization instanceof EE_Organization_Config ) {
742
+	function espresso_organization_address($type = 'inline') {
743
+		if (EE_Registry::instance()->CFG->organization instanceof EE_Organization_Config) {
744 744
 			$address = new EventEspresso\core\domain\entities\GenericAddress(
745 745
 				EE_Registry::instance()->CFG->organization->address_1,
746 746
 				EE_Registry::instance()->CFG->organization->address_2,
@@ -749,129 +749,129 @@  discard block
 block discarded – undo
749 749
 				EE_Registry::instance()->CFG->organization->zip,
750 750
 				EE_Registry::instance()->CFG->organization->CNT_ISO
751 751
 			);
752
-			return EEH_Address::format( $address, $type );
752
+			return EEH_Address::format($address, $type);
753 753
 		}
754 754
 		return '';
755 755
 	}
756 756
 }
757 757
 
758
-if ( ! function_exists( 'espresso_organization_email' )) {
758
+if ( ! function_exists('espresso_organization_email')) {
759 759
 	/**
760 760
 	 * espresso_organization_email
761 761
 	 * @param bool $echo
762 762
 	 * @return string
763 763
 	 */
764
-	function espresso_organization_email( $echo = TRUE ) {
765
-		if($echo){
766
-			echo EE_Registry::instance()->CFG->organization->get_pretty( 'email' );
764
+	function espresso_organization_email($echo = TRUE) {
765
+		if ($echo) {
766
+			echo EE_Registry::instance()->CFG->organization->get_pretty('email');
767 767
 			return '';
768 768
 		}
769
-		return EE_Registry::instance()->CFG->organization->get_pretty( 'email' );
769
+		return EE_Registry::instance()->CFG->organization->get_pretty('email');
770 770
 	}
771 771
 }
772 772
 
773
-if ( ! function_exists( 'espresso_organization_logo_url' )) {
773
+if ( ! function_exists('espresso_organization_logo_url')) {
774 774
 	/**
775 775
 	 * espresso_organization_logo_url
776 776
 	 * @param bool $echo
777 777
 	 * @return string
778 778
 	 */
779
-	function espresso_organization_logo_url( $echo = TRUE ) {
780
-		if($echo){
781
-			echo EE_Registry::instance()->CFG->organization->get_pretty( 'logo_url' );
779
+	function espresso_organization_logo_url($echo = TRUE) {
780
+		if ($echo) {
781
+			echo EE_Registry::instance()->CFG->organization->get_pretty('logo_url');
782 782
 			return '';
783 783
 		}
784
-		return EE_Registry::instance()->CFG->organization->get_pretty( 'logo_url' );
784
+		return EE_Registry::instance()->CFG->organization->get_pretty('logo_url');
785 785
 	}
786 786
 }
787 787
 
788
-if ( ! function_exists( 'espresso_organization_facebook' )) {
788
+if ( ! function_exists('espresso_organization_facebook')) {
789 789
 	/**
790 790
 	 * espresso_organization_facebook
791 791
 	 * @param bool $echo
792 792
 	 * @return string
793 793
 	 */
794
-	function espresso_organization_facebook( $echo = TRUE ) {
795
-		if($echo){
796
-			echo EE_Registry::instance()->CFG->organization->get_pretty( 'facebook' );
794
+	function espresso_organization_facebook($echo = TRUE) {
795
+		if ($echo) {
796
+			echo EE_Registry::instance()->CFG->organization->get_pretty('facebook');
797 797
 			return '';
798 798
 		}
799
-		return EE_Registry::instance()->CFG->organization->get_pretty( 'facebook' );
799
+		return EE_Registry::instance()->CFG->organization->get_pretty('facebook');
800 800
 	}
801 801
 }
802 802
 
803
-if ( ! function_exists( 'espresso_organization_twitter' )) {
803
+if ( ! function_exists('espresso_organization_twitter')) {
804 804
 	/**
805 805
 	 * espresso_organization_twitter
806 806
 	 * @param bool $echo
807 807
 	 * @return string
808 808
 	 */
809
-	function espresso_organization_twitter( $echo = TRUE ) {
810
-		if($echo){
811
-			echo EE_Registry::instance()->CFG->organization->get_pretty( 'twitter' );
809
+	function espresso_organization_twitter($echo = TRUE) {
810
+		if ($echo) {
811
+			echo EE_Registry::instance()->CFG->organization->get_pretty('twitter');
812 812
 			return '';
813 813
 		}
814
-		return EE_Registry::instance()->CFG->organization->get_pretty( 'twitter' );
814
+		return EE_Registry::instance()->CFG->organization->get_pretty('twitter');
815 815
 	}
816 816
 }
817 817
 
818
-if ( ! function_exists( 'espresso_organization_linkedin' )) {
818
+if ( ! function_exists('espresso_organization_linkedin')) {
819 819
 	/**
820 820
 	 * espresso_organization_linkedin
821 821
 	 * @param bool $echo
822 822
 	 * @return string
823 823
 	 */
824
-	function espresso_organization_linkedin( $echo = TRUE ) {
825
-		if($echo){
826
-			echo EE_Registry::instance()->CFG->organization->get_pretty( 'linkedin' );
824
+	function espresso_organization_linkedin($echo = TRUE) {
825
+		if ($echo) {
826
+			echo EE_Registry::instance()->CFG->organization->get_pretty('linkedin');
827 827
 			return '';
828 828
 		}
829
-		return EE_Registry::instance()->CFG->organization->get_pretty( 'linkedin' );
829
+		return EE_Registry::instance()->CFG->organization->get_pretty('linkedin');
830 830
 	}
831 831
 }
832 832
 
833
-if ( ! function_exists( 'espresso_organization_pinterest' )) {
833
+if ( ! function_exists('espresso_organization_pinterest')) {
834 834
 	/**
835 835
 	 * espresso_organization_pinterest
836 836
 	 * @param bool $echo
837 837
 	 * @return string
838 838
 	 */
839
-	function espresso_organization_pinterest( $echo = TRUE ) {
840
-		if($echo){
841
-			echo EE_Registry::instance()->CFG->organization->get_pretty( 'pinterest' );
839
+	function espresso_organization_pinterest($echo = TRUE) {
840
+		if ($echo) {
841
+			echo EE_Registry::instance()->CFG->organization->get_pretty('pinterest');
842 842
 			return '';
843 843
 		}
844
-		return EE_Registry::instance()->CFG->organization->get_pretty( 'pinterest' );
844
+		return EE_Registry::instance()->CFG->organization->get_pretty('pinterest');
845 845
 	}
846 846
 }
847 847
 
848
-if ( ! function_exists( 'espresso_organization_google' )) {
848
+if ( ! function_exists('espresso_organization_google')) {
849 849
 	/**
850 850
 	 * espresso_organization_google
851 851
 	 * @param bool $echo
852 852
 	 * @return string
853 853
 	 */
854
-	function espresso_organization_google( $echo = TRUE ) {
855
-		if($echo){
856
-			echo EE_Registry::instance()->CFG->organization->get_pretty( 'google' );
854
+	function espresso_organization_google($echo = TRUE) {
855
+		if ($echo) {
856
+			echo EE_Registry::instance()->CFG->organization->get_pretty('google');
857 857
 			return '';
858 858
 		}
859
-		return EE_Registry::instance()->CFG->organization->get_pretty( 'google' );
859
+		return EE_Registry::instance()->CFG->organization->get_pretty('google');
860 860
 	}
861 861
 }
862 862
 
863
-if ( ! function_exists( 'espresso_organization_instagram' )) {
863
+if ( ! function_exists('espresso_organization_instagram')) {
864 864
 	/**
865 865
 	 * espresso_organization_instagram
866 866
 	 * @param bool $echo
867 867
 	 * @return string
868 868
 	 */
869
-	function espresso_organization_instagram( $echo = TRUE ) {
870
-		if($echo){
871
-			echo EE_Registry::instance()->CFG->organization->get_pretty( 'instagram' );
869
+	function espresso_organization_instagram($echo = TRUE) {
870
+		if ($echo) {
871
+			echo EE_Registry::instance()->CFG->organization->get_pretty('instagram');
872 872
 			return '';
873 873
 		}
874
-		return EE_Registry::instance()->CFG->organization->get_pretty( 'instagram' );
874
+		return EE_Registry::instance()->CFG->organization->get_pretty('instagram');
875 875
 	}
876 876
 }
877 877
 
@@ -881,7 +881,7 @@  discard block
 block discarded – undo
881 881
 
882 882
 
883 883
 
884
-if ( ! function_exists( 'espresso_event_venues' )) {
884
+if ( ! function_exists('espresso_event_venues')) {
885 885
 	/**
886 886
 	 * espresso_event_venues
887 887
 	 *
@@ -895,7 +895,7 @@  discard block
 block discarded – undo
895 895
 
896 896
 
897 897
 
898
-if ( ! function_exists( 'espresso_venue_id' )) {
898
+if ( ! function_exists('espresso_venue_id')) {
899 899
 	/**
900 900
 	 *    espresso_venue_name
901 901
 	 *
@@ -903,15 +903,15 @@  discard block
 block discarded – undo
903 903
 	 * @param     int $EVT_ID
904 904
 	 * @return    string
905 905
 	 */
906
-	function espresso_venue_id( $EVT_ID = 0 ) {
907
-		$venue = EEH_Venue_View::get_venue( $EVT_ID );
906
+	function espresso_venue_id($EVT_ID = 0) {
907
+		$venue = EEH_Venue_View::get_venue($EVT_ID);
908 908
 		return $venue instanceof EE_Venue ? $venue->ID() : 0;
909 909
 	}
910 910
 }
911 911
 
912 912
 
913 913
 
914
-if ( ! function_exists( 'espresso_is_venue_private' ) ) {
914
+if ( ! function_exists('espresso_is_venue_private')) {
915 915
 	/**
916 916
 	 * Return whether a venue is private or not.
917 917
 	 * @see EEH_Venue_View::get_venue() for more info on expected return results.
@@ -920,45 +920,45 @@  discard block
 block discarded – undo
920 920
 	 *
921 921
 	 * @return bool | null
922 922
 	 */
923
-	function espresso_is_venue_private( $VNU_ID = 0 ) {
924
-		return EEH_Venue_View::is_venue_private( $VNU_ID );
923
+	function espresso_is_venue_private($VNU_ID = 0) {
924
+		return EEH_Venue_View::is_venue_private($VNU_ID);
925 925
 	}
926 926
 }
927 927
 
928 928
 
929 929
 
930
-if ( ! function_exists( 'espresso_venue_is_password_protected' ) ) {
930
+if ( ! function_exists('espresso_venue_is_password_protected')) {
931 931
 	/**
932 932
 	 * returns true or false if a venue is password protected or not
933 933
 	 *
934 934
 	 * @param int     $VNU_ID optional, the venue id to check.
935 935
 	 * @return string
936 936
 	 */
937
-	function espresso_venue_is_password_protected( $VNU_ID = 0 ) {
938
-		EE_Registry::instance()->load_helper( 'Venue_View' );
939
-		return EEH_Venue_View::is_venue_password_protected( $VNU_ID );
937
+	function espresso_venue_is_password_protected($VNU_ID = 0) {
938
+		EE_Registry::instance()->load_helper('Venue_View');
939
+		return EEH_Venue_View::is_venue_password_protected($VNU_ID);
940 940
 	}
941 941
 }
942 942
 
943 943
 
944 944
 
945
-if ( ! function_exists( 'espresso_password_protected_venue_form' ) ) {
945
+if ( ! function_exists('espresso_password_protected_venue_form')) {
946 946
 	/**
947 947
 	 * Returns a password form if venue is password protected.
948 948
 	 *
949 949
 	 * @param int     $VNU_ID optional, the venue id to check.
950 950
 	 * @return string
951 951
 	 */
952
-	function espresso_password_protected_venue_form( $VNU_ID = 0 ) {
953
-		EE_Registry::instance()->load_helper( 'Venue_View' );
954
-		return EEH_Venue_View::password_protected_venue_form( $VNU_ID );
952
+	function espresso_password_protected_venue_form($VNU_ID = 0) {
953
+		EE_Registry::instance()->load_helper('Venue_View');
954
+		return EEH_Venue_View::password_protected_venue_form($VNU_ID);
955 955
 	}
956 956
 }
957 957
 
958 958
 
959 959
 
960 960
 
961
-if ( ! function_exists( 'espresso_venue_name' )) {
961
+if ( ! function_exists('espresso_venue_name')) {
962 962
 	/**
963 963
 	 *    espresso_venue_name
964 964
 	 *
@@ -968,19 +968,19 @@  discard block
 block discarded – undo
968 968
 	 * @param bool   $echo
969 969
 	 * @return    string
970 970
 	 */
971
-	function espresso_venue_name( $VNU_ID = 0, $link_to = 'details', $echo = TRUE ) {
972
-		if($echo){
973
-			echo EEH_Venue_View::venue_name( $link_to, $VNU_ID );
971
+	function espresso_venue_name($VNU_ID = 0, $link_to = 'details', $echo = TRUE) {
972
+		if ($echo) {
973
+			echo EEH_Venue_View::venue_name($link_to, $VNU_ID);
974 974
 			return '';
975 975
 		}
976
-		return EEH_Venue_View::venue_name( $link_to, $VNU_ID );
976
+		return EEH_Venue_View::venue_name($link_to, $VNU_ID);
977 977
 	}
978 978
 }
979 979
 
980 980
 
981 981
 
982 982
 
983
-if ( ! function_exists( 'espresso_venue_link' )) {
983
+if ( ! function_exists('espresso_venue_link')) {
984 984
 	/**
985 985
 	 * 	espresso_venue_link
986 986
 	 *
@@ -989,14 +989,14 @@  discard block
 block discarded – undo
989 989
 	 *  @param 	string 	$text
990 990
 	 *  @return 	string
991 991
 	 */
992
-	function espresso_venue_link( $VNU_ID = 0, $text = '' ) {
993
-		return EEH_Venue_View::venue_details_link( $VNU_ID, $text );
992
+	function espresso_venue_link($VNU_ID = 0, $text = '') {
993
+		return EEH_Venue_View::venue_details_link($VNU_ID, $text);
994 994
 	}
995 995
 }
996 996
 
997 997
 
998 998
 
999
-if ( ! function_exists( 'espresso_venue_description' )) {
999
+if ( ! function_exists('espresso_venue_description')) {
1000 1000
 	/**
1001 1001
 	 *    espresso_venue_description
1002 1002
 	 *
@@ -1005,17 +1005,17 @@  discard block
 block discarded – undo
1005 1005
 	 * @param bool $echo
1006 1006
 	 * @return    string
1007 1007
 	 */
1008
-	function espresso_venue_description( $VNU_ID = FALSE, $echo = TRUE ) {
1009
-		if($echo){
1010
-			echo EEH_Venue_View::venue_description( $VNU_ID );
1008
+	function espresso_venue_description($VNU_ID = FALSE, $echo = TRUE) {
1009
+		if ($echo) {
1010
+			echo EEH_Venue_View::venue_description($VNU_ID);
1011 1011
 			return '';
1012 1012
 		}
1013
-		return EEH_Venue_View::venue_description( $VNU_ID );
1013
+		return EEH_Venue_View::venue_description($VNU_ID);
1014 1014
 	}
1015 1015
 }
1016 1016
 
1017 1017
 
1018
-if ( ! function_exists( 'espresso_venue_excerpt' )) {
1018
+if ( ! function_exists('espresso_venue_excerpt')) {
1019 1019
 	/**
1020 1020
 	 *    espresso_venue_excerpt
1021 1021
 	 *
@@ -1024,18 +1024,18 @@  discard block
 block discarded – undo
1024 1024
 	 * @param bool $echo
1025 1025
 	 * @return    string
1026 1026
 	 */
1027
-	function espresso_venue_excerpt( $VNU_ID = 0,  $echo = TRUE ) {
1028
-		if ( $echo ) {
1029
-			echo EEH_Venue_View::venue_excerpt( $VNU_ID );
1027
+	function espresso_venue_excerpt($VNU_ID = 0, $echo = TRUE) {
1028
+		if ($echo) {
1029
+			echo EEH_Venue_View::venue_excerpt($VNU_ID);
1030 1030
 			return '';
1031 1031
 		}
1032
-		return EEH_Venue_View::venue_excerpt( $VNU_ID );
1032
+		return EEH_Venue_View::venue_excerpt($VNU_ID);
1033 1033
 	}
1034 1034
 }
1035 1035
 
1036 1036
 
1037 1037
 
1038
-if ( ! function_exists( 'espresso_venue_categories' )) {
1038
+if ( ! function_exists('espresso_venue_categories')) {
1039 1039
 	/**
1040 1040
 	 * espresso_venue_categories
1041 1041
 	 * returns the terms associated with a venue
@@ -1045,17 +1045,17 @@  discard block
 block discarded – undo
1045 1045
 	 * @param bool $echo
1046 1046
 	 * @return string
1047 1047
 	 */
1048
-	function espresso_venue_categories( $VNU_ID = 0, $hide_uncategorized = TRUE,  $echo = TRUE ) {
1049
-		if ( $echo ) {
1050
-			echo EEH_Venue_View::venue_categories( $VNU_ID, $hide_uncategorized );
1048
+	function espresso_venue_categories($VNU_ID = 0, $hide_uncategorized = TRUE, $echo = TRUE) {
1049
+		if ($echo) {
1050
+			echo EEH_Venue_View::venue_categories($VNU_ID, $hide_uncategorized);
1051 1051
 			return '';
1052 1052
 		}
1053
-		return EEH_Venue_View::venue_categories( $VNU_ID, $hide_uncategorized );
1053
+		return EEH_Venue_View::venue_categories($VNU_ID, $hide_uncategorized);
1054 1054
 	}
1055 1055
 }
1056 1056
 
1057 1057
 
1058
-if ( ! function_exists( 'espresso_venue_address' )) {
1058
+if ( ! function_exists('espresso_venue_address')) {
1059 1059
 	/**
1060 1060
 	 * espresso_venue_address
1061 1061
 	 * returns a formatted block of html  for displaying a venue's address
@@ -1065,17 +1065,17 @@  discard block
 block discarded – undo
1065 1065
 	 * @param bool   $echo
1066 1066
 	 * @return string
1067 1067
 	 */
1068
-	function espresso_venue_address( $type = 'multiline', $VNU_ID = 0, $echo = TRUE ) {
1069
-		if ( $echo ) {
1070
-			echo EEH_Venue_View::venue_address( $type, $VNU_ID );
1068
+	function espresso_venue_address($type = 'multiline', $VNU_ID = 0, $echo = TRUE) {
1069
+		if ($echo) {
1070
+			echo EEH_Venue_View::venue_address($type, $VNU_ID);
1071 1071
 			return '';
1072 1072
 		}
1073
-		return EEH_Venue_View::venue_address( $type, $VNU_ID );
1073
+		return EEH_Venue_View::venue_address($type, $VNU_ID);
1074 1074
 	}
1075 1075
 }
1076 1076
 
1077 1077
 
1078
-if ( ! function_exists( 'espresso_venue_raw_address' )) {
1078
+if ( ! function_exists('espresso_venue_raw_address')) {
1079 1079
 	/**
1080 1080
 	 * espresso_venue_address
1081 1081
 	 * returns an UN-formatted string containing a venue's address
@@ -1085,17 +1085,17 @@  discard block
 block discarded – undo
1085 1085
 	 * @param bool     $echo
1086 1086
 	 * @return string
1087 1087
 	 */
1088
-	function espresso_venue_raw_address( $type = 'multiline', $VNU_ID = 0, $echo = TRUE ) {
1089
-		if ( $echo ) {
1090
-			echo EEH_Venue_View::venue_address( $type, $VNU_ID, FALSE, FALSE );
1088
+	function espresso_venue_raw_address($type = 'multiline', $VNU_ID = 0, $echo = TRUE) {
1089
+		if ($echo) {
1090
+			echo EEH_Venue_View::venue_address($type, $VNU_ID, FALSE, FALSE);
1091 1091
 			return '';
1092 1092
 		}
1093
-		return EEH_Venue_View::venue_address( $type, $VNU_ID, FALSE, FALSE );
1093
+		return EEH_Venue_View::venue_address($type, $VNU_ID, FALSE, FALSE);
1094 1094
 	}
1095 1095
 }
1096 1096
 
1097 1097
 
1098
-if ( ! function_exists( 'espresso_venue_has_address' )) {
1098
+if ( ! function_exists('espresso_venue_has_address')) {
1099 1099
 	/**
1100 1100
 	 * espresso_venue_has_address
1101 1101
 	 * returns TRUE or FALSE if a Venue has address information
@@ -1103,13 +1103,13 @@  discard block
 block discarded – undo
1103 1103
 	 * @param int $VNU_ID
1104 1104
 	 * @return bool
1105 1105
 	 */
1106
-	function espresso_venue_has_address( $VNU_ID = 0 ) {
1107
-		return EEH_Venue_View::venue_has_address( $VNU_ID );
1106
+	function espresso_venue_has_address($VNU_ID = 0) {
1107
+		return EEH_Venue_View::venue_has_address($VNU_ID);
1108 1108
 	}
1109 1109
 }
1110 1110
 
1111 1111
 
1112
-if ( ! function_exists( 'espresso_venue_gmap' )) {
1112
+if ( ! function_exists('espresso_venue_gmap')) {
1113 1113
 	/**
1114 1114
 	 * espresso_venue_gmap
1115 1115
 	 * returns a google map for the venue address
@@ -1120,17 +1120,17 @@  discard block
 block discarded – undo
1120 1120
 	 * @param bool     $echo
1121 1121
 	 * @return string
1122 1122
 	 */
1123
-	function espresso_venue_gmap( $VNU_ID = 0, $map_ID = FALSE, $gmap = array(), $echo = TRUE  ) {
1124
-		if ( $echo ) {
1125
-			echo EEH_Venue_View::venue_gmap( $VNU_ID, $map_ID, $gmap );
1123
+	function espresso_venue_gmap($VNU_ID = 0, $map_ID = FALSE, $gmap = array(), $echo = TRUE) {
1124
+		if ($echo) {
1125
+			echo EEH_Venue_View::venue_gmap($VNU_ID, $map_ID, $gmap);
1126 1126
 			return '';
1127 1127
 		}
1128
-		return EEH_Venue_View::venue_gmap( $VNU_ID, $map_ID, $gmap );
1128
+		return EEH_Venue_View::venue_gmap($VNU_ID, $map_ID, $gmap);
1129 1129
 	}
1130 1130
 }
1131 1131
 
1132 1132
 
1133
-if ( ! function_exists( 'espresso_venue_phone' )) {
1133
+if ( ! function_exists('espresso_venue_phone')) {
1134 1134
 	/**
1135 1135
 	 * espresso_venue_phone
1136 1136
 	 *
@@ -1138,18 +1138,18 @@  discard block
 block discarded – undo
1138 1138
 	 * @param bool $echo
1139 1139
 	 * @return string
1140 1140
 	 */
1141
-	function espresso_venue_phone( $VNU_ID = 0, $echo = TRUE ) {
1142
-		if ( $echo ) {
1143
-			echo EEH_Venue_View::venue_phone( $VNU_ID );
1141
+	function espresso_venue_phone($VNU_ID = 0, $echo = TRUE) {
1142
+		if ($echo) {
1143
+			echo EEH_Venue_View::venue_phone($VNU_ID);
1144 1144
 			return '';
1145 1145
 		}
1146
-		return EEH_Venue_View::venue_phone( $VNU_ID );
1146
+		return EEH_Venue_View::venue_phone($VNU_ID);
1147 1147
 	}
1148 1148
 }
1149 1149
 
1150 1150
 
1151 1151
 
1152
-if ( ! function_exists( 'espresso_venue_website' )) {
1152
+if ( ! function_exists('espresso_venue_website')) {
1153 1153
 	/**
1154 1154
 	 * espresso_venue_website
1155 1155
 	 *
@@ -1157,18 +1157,18 @@  discard block
 block discarded – undo
1157 1157
 	 * @param bool $echo
1158 1158
 	 * @return string
1159 1159
 	 */
1160
-	function espresso_venue_website( $VNU_ID = 0, $echo = TRUE ) {
1161
-		if ( $echo ) {
1162
-			echo EEH_Venue_View::venue_website_link( $VNU_ID );
1160
+	function espresso_venue_website($VNU_ID = 0, $echo = TRUE) {
1161
+		if ($echo) {
1162
+			echo EEH_Venue_View::venue_website_link($VNU_ID);
1163 1163
 			return '';
1164 1164
 		}
1165
-		return EEH_Venue_View::venue_website_link( $VNU_ID );
1165
+		return EEH_Venue_View::venue_website_link($VNU_ID);
1166 1166
 	}
1167 1167
 }
1168 1168
 
1169 1169
 
1170 1170
 
1171
-if ( ! function_exists( 'espresso_edit_venue_link' )) {
1171
+if ( ! function_exists('espresso_edit_venue_link')) {
1172 1172
 	/**
1173 1173
 	 * espresso_edit_venue_link
1174 1174
 	 *
@@ -1176,12 +1176,12 @@  discard block
 block discarded – undo
1176 1176
 	 * @param bool $echo
1177 1177
 	 * @return string
1178 1178
 	 */
1179
-	function espresso_edit_venue_link( $VNU_ID = 0, $echo = TRUE ) {
1180
-		if($echo){
1181
-			echo EEH_Venue_View::edit_venue_link( $VNU_ID );
1179
+	function espresso_edit_venue_link($VNU_ID = 0, $echo = TRUE) {
1180
+		if ($echo) {
1181
+			echo EEH_Venue_View::edit_venue_link($VNU_ID);
1182 1182
 			return '';
1183 1183
 		}
1184
-		return EEH_Venue_View::edit_venue_link( $VNU_ID );
1184
+		return EEH_Venue_View::edit_venue_link($VNU_ID);
1185 1185
 	}
1186 1186
 }
1187 1187
 
Please login to merge, or discard this patch.
core/domain/services/event/EventSpacesCalculator.php 3 patches
Doc Comments   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -164,7 +164,7 @@
 block discarded – undo
164 164
 
165 165
 
166 166
     /**
167
-     * @param $ticket
167
+     * @param \EE_Base_Class $ticket
168 168
      * @throws DomainException
169 169
      * @throws EE_Error
170 170
      * @throws UnexpectedEntityException
Please login to merge, or discard this patch.
Spacing   +46 added lines, -46 removed lines patch added patch discarded remove patch
@@ -174,14 +174,14 @@  discard block
 block discarded – undo
174 174
      */
175 175
     public function setActiveTickets(array $active_tickets = array())
176 176
     {
177
-        if (! empty($active_tickets)) {
177
+        if ( ! empty($active_tickets)) {
178 178
             foreach ($active_tickets as $active_ticket) {
179 179
                 $this->validateTicket($active_ticket);
180 180
             }
181 181
             // sort incoming array by ticket quantity (asc)
182 182
             usort(
183 183
                 $active_tickets,
184
-                function (EE_Ticket $a, EE_Ticket $b) {
184
+                function(EE_Ticket $a, EE_Ticket $b) {
185 185
                     if ($a->qty() === $b->qty()) {
186 186
                         return 0;
187 187
                     }
@@ -203,7 +203,7 @@  discard block
 block discarded – undo
203 203
      */
204 204
     private function validateTicket($ticket)
205 205
     {
206
-        if (! $ticket instanceof EE_Ticket) {
206
+        if ( ! $ticket instanceof EE_Ticket) {
207 207
             throw new DomainException(
208 208
                 esc_html__(
209 209
                     'Invalid Ticket. Only EE_Ticket objects can be used to calculate event space availability.',
@@ -254,7 +254,7 @@  discard block
 block discarded – undo
254 254
                 )
255 255
             );
256 256
         }
257
-        $this->datetimes[ $datetime->ID() ] = $datetime;
257
+        $this->datetimes[$datetime->ID()] = $datetime;
258 258
     }
259 259
 
260 260
 
@@ -327,7 +327,7 @@  discard block
 block discarded – undo
327 327
         $this->tickets_sold = array();
328 328
         $this->total_spaces = array();
329 329
         $active_tickets = $this->getActiveTickets();
330
-        if (! empty($active_tickets)) {
330
+        if ( ! empty($active_tickets)) {
331 331
             foreach ($active_tickets as $ticket) {
332 332
                 $this->validateTicket($ticket);
333 333
                 // we need to index our data arrays using strings for the purpose of sorting,
@@ -349,16 +349,16 @@  discard block
 block discarded – undo
349 349
                     // we are going to move all of our data into the following arrays:
350 350
                     // datetime spaces initially represents the reg limit for each datetime,
351 351
                     // but this will get adjusted as tickets are accounted for
352
-                    $this->datetime_spaces[ $datetime_identifier ] = $reg_limit;
352
+                    $this->datetime_spaces[$datetime_identifier] = $reg_limit;
353 353
                     // just an array of ticket IDs grouped by datetime
354
-                    $this->datetime_tickets[ $datetime_identifier ][] = $ticket_identifier;
354
+                    $this->datetime_tickets[$datetime_identifier][] = $ticket_identifier;
355 355
                     // and an array of datetime IDs grouped by ticket
356
-                    $this->ticket_datetimes[ $ticket_identifier ][] = $datetime_identifier;
356
+                    $this->ticket_datetimes[$ticket_identifier][] = $datetime_identifier;
357 357
                 }
358 358
                 // total quantity of sold and reserved for each ticket
359
-                $this->tickets_sold[ $ticket_identifier ] = $ticket->sold() + $ticket->reserved();
359
+                $this->tickets_sold[$ticket_identifier] = $ticket->sold() + $ticket->reserved();
360 360
                 // and the maximum ticket quantities for each ticket (adjusted for reg limit)
361
-                $this->ticket_quantities[ $ticket_identifier ] = $max_tickets;
361
+                $this->ticket_quantities[$ticket_identifier] = $max_tickets;
362 362
             }
363 363
         }
364 364
         // sort datetime spaces by reg limit, but maintain our string indexes
@@ -417,11 +417,11 @@  discard block
 block discarded – undo
417 417
             \EEH_Debug_Tools::printr(__FUNCTION__, __CLASS__, __FILE__, __LINE__, 2);
418 418
         }
419 419
         foreach ($this->tickets_sold as $ticket_identifier => $tickets_sold) {
420
-            if (isset($this->ticket_quantities[ $ticket_identifier ])) {
421
-                $this->ticket_quantities[ $ticket_identifier ] -= $tickets_sold;
420
+            if (isset($this->ticket_quantities[$ticket_identifier])) {
421
+                $this->ticket_quantities[$ticket_identifier] -= $tickets_sold;
422 422
                 // don't let values go below zero
423
-                $this->ticket_quantities[ $ticket_identifier ] = max(
424
-                    $this->ticket_quantities[ $ticket_identifier ],
423
+                $this->ticket_quantities[$ticket_identifier] = max(
424
+                    $this->ticket_quantities[$ticket_identifier],
425 425
                     0
426 426
                 );
427 427
                 if ($this->debug) {
@@ -433,15 +433,15 @@  discard block
 block discarded – undo
433 433
                     );
434 434
                 }
435 435
             }
436
-            if (isset($this->ticket_datetimes[ $ticket_identifier ])
437
-                && is_array($this->ticket_datetimes[ $ticket_identifier ])
436
+            if (isset($this->ticket_datetimes[$ticket_identifier])
437
+                && is_array($this->ticket_datetimes[$ticket_identifier])
438 438
             ) {
439
-                foreach ($this->ticket_datetimes[ $ticket_identifier ] as $ticket_datetime) {
440
-                    if (isset($this->ticket_quantities[ $ticket_identifier ])) {
441
-                        $this->datetime_spaces[ $ticket_datetime ] -= $tickets_sold;
439
+                foreach ($this->ticket_datetimes[$ticket_identifier] as $ticket_datetime) {
440
+                    if (isset($this->ticket_quantities[$ticket_identifier])) {
441
+                        $this->datetime_spaces[$ticket_datetime] -= $tickets_sold;
442 442
                         // don't let values go below zero
443
-                        $this->datetime_spaces[ $ticket_datetime ] = max(
444
-                            $this->datetime_spaces[ $ticket_datetime ],
443
+                        $this->datetime_spaces[$ticket_datetime] = max(
444
+                            $this->datetime_spaces[$ticket_datetime],
445 445
                             0
446 446
                         );
447 447
                         if ($this->debug) {
@@ -466,11 +466,11 @@  discard block
 block discarded – undo
466 466
     private function trackAvailableSpacesForDatetimes($datetime_identifier, array $tickets)
467 467
     {
468 468
         // make sure a reg limit is set for the datetime
469
-        $reg_limit = isset($this->datetime_spaces[ $datetime_identifier ])
470
-            ? $this->datetime_spaces[ $datetime_identifier ]
469
+        $reg_limit = isset($this->datetime_spaces[$datetime_identifier])
470
+            ? $this->datetime_spaces[$datetime_identifier]
471 471
             : 0;
472 472
         // and bail if it is not
473
-        if (! $reg_limit) {
473
+        if ( ! $reg_limit) {
474 474
             if ($this->debug) {
475 475
                 \EEH_Debug_Tools::printr('AT CAPACITY', " . {$datetime_identifier}", __FILE__, __LINE__);
476 476
             }
@@ -487,7 +487,7 @@  discard block
 block discarded – undo
487 487
         }
488 488
         // number of allocated spaces always starts at zero
489 489
         $spaces_allocated = 0;
490
-        $this->total_spaces[ $datetime_identifier ] = 0;
490
+        $this->total_spaces[$datetime_identifier] = 0;
491 491
         foreach ($tickets as $ticket_identifier) {
492 492
             $spaces_allocated = $this->calculateAvailableSpacesForTicket(
493 493
                 $datetime_identifier,
@@ -500,7 +500,7 @@  discard block
 block discarded – undo
500 500
         $spaces_allocated = max($spaces_allocated, 0);
501 501
         if ($spaces_allocated) {
502 502
             // track any non-zero values
503
-            $this->total_spaces[ $datetime_identifier ] += $spaces_allocated;
503
+            $this->total_spaces[$datetime_identifier] += $spaces_allocated;
504 504
             if ($this->debug) {
505 505
                 \EEH_Debug_Tools::printr((string) $spaces_allocated, ' . $spaces_allocated: ', __FILE__, __LINE__);
506 506
             }
@@ -511,7 +511,7 @@  discard block
 block discarded – undo
511 511
         }
512 512
         if ($this->debug) {
513 513
             \EEH_Debug_Tools::printr(
514
-                $this->total_spaces[ $datetime_identifier ],
514
+                $this->total_spaces[$datetime_identifier],
515 515
                 '$total_spaces',
516 516
                 __FILE__,
517 517
                 __LINE__
@@ -536,8 +536,8 @@  discard block
 block discarded – undo
536 536
         $spaces_allocated
537 537
     ) {
538 538
         // make sure ticket quantity is set
539
-        $ticket_quantity = isset($this->ticket_quantities[ $ticket_identifier ])
540
-            ? $this->ticket_quantities[ $ticket_identifier ]
539
+        $ticket_quantity = isset($this->ticket_quantities[$ticket_identifier])
540
+            ? $this->ticket_quantities[$ticket_identifier]
541 541
             : 0;
542 542
         if ($this->debug) {
543 543
             \EEH_Debug_Tools::printr("{$spaces_allocated}", '$spaces_allocated', __FILE__, __LINE__);
@@ -567,7 +567,7 @@  discard block
 block discarded – undo
567 567
                 //  or the maximum ticket quantity
568 568
                 $ticket_quantity = min($reg_limit - $spaces_allocated, $ticket_quantity);
569 569
                 // adjust the available quantity in our tracking array
570
-                $this->ticket_quantities[ $ticket_identifier ] -= $ticket_quantity;
570
+                $this->ticket_quantities[$ticket_identifier] -= $ticket_quantity;
571 571
                 // and increment spaces allocated for this datetime
572 572
                 $spaces_allocated += $ticket_quantity;
573 573
                 $at_capacity = $spaces_allocated >= $reg_limit;
@@ -624,14 +624,14 @@  discard block
 block discarded – undo
624 624
                 $ticket_quantity
625 625
             );
626 626
             // skip to next ticket if nothing changed
627
-            if (! ($adjusted || $at_capacity)) {
627
+            if ( ! ($adjusted || $at_capacity)) {
628 628
                 continue;
629 629
             }
630 630
             // then all of it's tickets are now unavailable
631 631
             foreach ($datetime_tickets as $datetime_ticket) {
632 632
                 if (($ticket_identifier === $datetime_ticket || $at_capacity)
633
-                    && isset($this->ticket_quantities[ $datetime_ticket ])
634
-                    && $this->ticket_quantities[ $datetime_ticket ] > 0
633
+                    && isset($this->ticket_quantities[$datetime_ticket])
634
+                    && $this->ticket_quantities[$datetime_ticket] > 0
635 635
                 ) {
636 636
                     if ($this->debug) {
637 637
                         \EEH_Debug_Tools::printr(
@@ -645,14 +645,14 @@  discard block
 block discarded – undo
645 645
                     // otherwise just subtract the ticket quantity
646 646
                     $new_quantity = $at_capacity
647 647
                         ? 0
648
-                        : $this->ticket_quantities[ $datetime_ticket ] - $ticket_quantity;
648
+                        : $this->ticket_quantities[$datetime_ticket] - $ticket_quantity;
649 649
                     // don't let ticket quantity go below zero
650
-                    $this->ticket_quantities[ $datetime_ticket ] = max($new_quantity, 0);
650
+                    $this->ticket_quantities[$datetime_ticket] = max($new_quantity, 0);
651 651
                     if ($this->debug) {
652 652
                         \EEH_Debug_Tools::printr(
653 653
                             $at_capacity
654 654
                                 ? "0 because Datetime {$datetime_identifier} is at capacity"
655
-                                : "{$this->ticket_quantities[ $datetime_ticket ]}",
655
+                                : "{$this->ticket_quantities[$datetime_ticket]}",
656 656
                             " . . . . {$datetime_ticket} quantity set to ",
657 657
                             __FILE__,
658 658
                             __LINE__
@@ -661,8 +661,8 @@  discard block
 block discarded – undo
661 661
                 }
662 662
                 // but we also need to adjust spaces for any other datetimes this ticket has access to
663 663
                 if ($datetime_ticket === $ticket_identifier) {
664
-                    if (isset($this->ticket_datetimes[ $datetime_ticket ])
665
-                        && is_array($this->ticket_datetimes[ $datetime_ticket ])
664
+                    if (isset($this->ticket_datetimes[$datetime_ticket])
665
+                        && is_array($this->ticket_datetimes[$datetime_ticket])
666 666
                     ) {
667 667
                         if ($this->debug) {
668 668
                             \EEH_Debug_Tools::printr(
@@ -672,7 +672,7 @@  discard block
 block discarded – undo
672 672
                                 __LINE__
673 673
                             );
674 674
                         }
675
-                        foreach ($this->ticket_datetimes[ $datetime_ticket ] as $datetime) {
675
+                        foreach ($this->ticket_datetimes[$datetime_ticket] as $datetime) {
676 676
                             // don't adjust the current datetime twice
677 677
                             if ($datetime !== $datetime_identifier) {
678 678
                                 $this->adjustDatetimeSpaces(
@@ -692,24 +692,24 @@  discard block
 block discarded – undo
692 692
     {
693 693
         // does datetime have spaces available?
694 694
         // and does the supplied ticket have access to this datetime ?
695
-        if ($this->datetime_spaces[ $datetime_identifier ] > 0
696
-            && isset($this->datetime_spaces[ $datetime_identifier ], $this->datetime_tickets[ $datetime_identifier ])
697
-            && in_array($ticket_identifier, $this->datetime_tickets[ $datetime_identifier ], true)
695
+        if ($this->datetime_spaces[$datetime_identifier] > 0
696
+            && isset($this->datetime_spaces[$datetime_identifier], $this->datetime_tickets[$datetime_identifier])
697
+            && in_array($ticket_identifier, $this->datetime_tickets[$datetime_identifier], true)
698 698
         ) {
699 699
             if ($this->debug) {
700 700
                 \EEH_Debug_Tools::printr($datetime_identifier, ' . . adjust Datetime Spaces for', __FILE__, __LINE__);
701 701
                 \EEH_Debug_Tools::printr(
702
-                    "{$this->datetime_spaces[ $datetime_identifier ]}",
702
+                    "{$this->datetime_spaces[$datetime_identifier]}",
703 703
                     " . . current  {$datetime_identifier} spaces available",
704 704
                     __FILE__,
705 705
                     __LINE__
706 706
                 );
707 707
             }
708 708
             // then decrement the available spaces for the datetime
709
-            $this->datetime_spaces[ $datetime_identifier ] -= $ticket_quantity;
709
+            $this->datetime_spaces[$datetime_identifier] -= $ticket_quantity;
710 710
             // but don't let quantities go below zero
711
-            $this->datetime_spaces[ $datetime_identifier ] = max(
712
-                $this->datetime_spaces[ $datetime_identifier ],
711
+            $this->datetime_spaces[$datetime_identifier] = max(
712
+                $this->datetime_spaces[$datetime_identifier],
713 713
                 0
714 714
             );
715 715
             if ($this->debug) {
Please login to merge, or discard this patch.
Indentation   +711 added lines, -711 removed lines patch added patch discarded remove patch
@@ -26,715 +26,715 @@
 block discarded – undo
26 26
 class EventSpacesCalculator
27 27
 {
28 28
 
29
-    /**
30
-     * @var EE_Event $event
31
-     */
32
-    private $event;
33
-
34
-    /**
35
-     * @var array $datetime_query_params
36
-     */
37
-    private $datetime_query_params;
38
-
39
-    /**
40
-     * @var EE_Ticket[] $active_tickets
41
-     */
42
-    private $active_tickets = array();
43
-
44
-    /**
45
-     * @var EE_Datetime[] $datetimes
46
-     */
47
-    private $datetimes = array();
48
-
49
-    /**
50
-     * Array of Ticket IDs grouped by Datetime
51
-     *
52
-     * @var array $datetimes
53
-     */
54
-    private $datetime_tickets = array();
55
-
56
-    /**
57
-     * Max spaces for each Datetime (reg limit - previous sold)
58
-     *
59
-     * @var array $datetime_spaces
60
-     */
61
-    private $datetime_spaces = array();
62
-
63
-    /**
64
-     * Array of Datetime IDs grouped by Ticket
65
-     *
66
-     * @var array[] $ticket_datetimes
67
-     */
68
-    private $ticket_datetimes = array();
69
-
70
-    /**
71
-     * maximum ticket quantities for each ticket (adjusted for reg limit)
72
-     *
73
-     * @var array $ticket_quantities
74
-     */
75
-    private $ticket_quantities = array();
76
-
77
-    /**
78
-     * total quantity of sold and reserved for each ticket
79
-     *
80
-     * @var array $tickets_sold
81
-     */
82
-    private $tickets_sold = array();
83
-
84
-    /**
85
-     * total spaces available across all datetimes
86
-     *
87
-     * @var array $total_spaces
88
-     */
89
-    private $total_spaces = array();
90
-
91
-    /**
92
-     * @var boolean $debug
93
-     */
94
-    private $debug = false; // true false
95
-
96
-    /**
97
-     * @var null|int $spaces_remaining
98
-     */
99
-    private $spaces_remaining;
100
-
101
-    /**
102
-     * @var null|int $total_spaces_available
103
-     */
104
-    private $total_spaces_available;
105
-
106
-
107
-    /**
108
-     * EventSpacesCalculator constructor.
109
-     *
110
-     * @param EE_Event $event
111
-     * @param array    $datetime_query_params
112
-     * @throws EE_Error
113
-     */
114
-    public function __construct(EE_Event $event, array $datetime_query_params = array())
115
-    {
116
-        if ($this->debug) {
117
-            \EEH_Debug_Tools::printr(__FUNCTION__, __CLASS__, __FILE__, __LINE__, 1);
118
-            \EEH_Debug_Tools::printr((string) $event->ID(), 'For event', __FILE__, __LINE__);
119
-        }
120
-        $this->event = $event;
121
-        $this->datetime_query_params = $datetime_query_params + array('order_by' => array('DTT_reg_limit' => 'ASC'));
122
-        $this->setHooks();
123
-    }
124
-
125
-
126
-    /**
127
-     * @return void
128
-     */
129
-    private function setHooks()
130
-    {
131
-        add_action('AHEE__EE_Ticket__increase_sold', array($this, 'clearResults'));
132
-        add_action('AHEE__EE_Ticket__decrease_sold', array($this, 'clearResults'));
133
-        add_action('AHEE__EE_Datetime__increase_sold', array($this, 'clearResults'));
134
-        add_action('AHEE__EE_Datetime__decrease_sold', array($this, 'clearResults'));
135
-        add_action('AHEE__EE_Ticket__increase_reserved', array($this, 'clearResults'));
136
-        add_action('AHEE__EE_Ticket__decrease_reserved', array($this, 'clearResults'));
137
-        add_action('AHEE__EE_Datetime__increase_reserved', array($this, 'clearResults'));
138
-        add_action('AHEE__EE_Datetime__decrease_reserved', array($this, 'clearResults'));
139
-    }
140
-
141
-
142
-    /**
143
-     * @return void
144
-     */
145
-    public function clearResults()
146
-    {
147
-        if ($this->debug) {
148
-            \EEH_Debug_Tools::printr(__FUNCTION__, __CLASS__, __FILE__, __LINE__, 1);
149
-        }
150
-        $this->spaces_remaining = null;
151
-        $this->total_spaces_available = null;
152
-    }
153
-
154
-
155
-    /**
156
-     * @return EE_Ticket[]
157
-     * @throws EE_Error
158
-     * @throws InvalidDataTypeException
159
-     * @throws InvalidInterfaceException
160
-     * @throws InvalidArgumentException
161
-     */
162
-    public function getActiveTickets()
163
-    {
164
-        if (empty($this->active_tickets)) {
165
-            $this->active_tickets = $this->event->tickets(
166
-                array(
167
-                    array('TKT_deleted' => false),
168
-                    'order_by' => array('TKT_qty' => 'ASC'),
169
-                )
170
-            );
171
-        }
172
-        return $this->active_tickets;
173
-    }
174
-
175
-
176
-    /**
177
-     * @param EE_Ticket[] $active_tickets
178
-     * @throws EE_Error
179
-     * @throws DomainException
180
-     * @throws UnexpectedEntityException
181
-     */
182
-    public function setActiveTickets(array $active_tickets = array())
183
-    {
184
-        if (! empty($active_tickets)) {
185
-            foreach ($active_tickets as $active_ticket) {
186
-                $this->validateTicket($active_ticket);
187
-            }
188
-            // sort incoming array by ticket quantity (asc)
189
-            usort(
190
-                $active_tickets,
191
-                function (EE_Ticket $a, EE_Ticket $b) {
192
-                    if ($a->qty() === $b->qty()) {
193
-                        return 0;
194
-                    }
195
-                    return ($a->qty() < $b->qty())
196
-                        ? -1
197
-                        : 1;
198
-                }
199
-            );
200
-        }
201
-        $this->active_tickets = $active_tickets;
202
-    }
203
-
204
-
205
-    /**
206
-     * @param $ticket
207
-     * @throws DomainException
208
-     * @throws EE_Error
209
-     * @throws UnexpectedEntityException
210
-     */
211
-    private function validateTicket($ticket)
212
-    {
213
-        if (! $ticket instanceof EE_Ticket) {
214
-            throw new DomainException(
215
-                esc_html__(
216
-                    'Invalid Ticket. Only EE_Ticket objects can be used to calculate event space availability.',
217
-                    'event_espresso'
218
-                )
219
-            );
220
-        }
221
-        if ($ticket->get_event_ID() !== $this->event->ID()) {
222
-            throw new DomainException(
223
-                sprintf(
224
-                    esc_html__(
225
-                        'An EE_Ticket for Event %1$d was supplied while calculating event space availability for Event %2$d.',
226
-                        'event_espresso'
227
-                    ),
228
-                    $ticket->get_event_ID(),
229
-                    $this->event->ID()
230
-                )
231
-            );
232
-        }
233
-    }
234
-
235
-
236
-    /**
237
-     * @return EE_Datetime[]
238
-     */
239
-    public function getDatetimes()
240
-    {
241
-        return $this->datetimes;
242
-    }
243
-
244
-
245
-    /**
246
-     * @param EE_Datetime $datetime
247
-     * @throws EE_Error
248
-     * @throws DomainException
249
-     */
250
-    public function setDatetime(EE_Datetime $datetime)
251
-    {
252
-        if ($datetime->event()->ID() !== $this->event->ID()) {
253
-            throw new DomainException(
254
-                sprintf(
255
-                    esc_html__(
256
-                        'An EE_Datetime for Event %1$d was supplied while calculating event space availability for Event %2$d.',
257
-                        'event_espresso'
258
-                    ),
259
-                    $datetime->event()->ID(),
260
-                    $this->event->ID()
261
-                )
262
-            );
263
-        }
264
-        $this->datetimes[ $datetime->ID() ] = $datetime;
265
-    }
266
-
267
-
268
-    /**
269
-     * calculate spaces remaining based on "saleable" tickets
270
-     *
271
-     * @return float|int
272
-     * @throws EE_Error
273
-     * @throws DomainException
274
-     * @throws UnexpectedEntityException
275
-     * @throws InvalidDataTypeException
276
-     * @throws InvalidInterfaceException
277
-     * @throws InvalidArgumentException
278
-     */
279
-    public function spacesRemaining()
280
-    {
281
-        if ($this->debug) {
282
-            \EEH_Debug_Tools::printr(__FUNCTION__, __CLASS__, __FILE__, __LINE__, 2);
283
-        }
284
-        if ($this->spaces_remaining === null) {
285
-            $this->initialize();
286
-            $this->spaces_remaining = $this->calculate();
287
-        }
288
-        return $this->spaces_remaining;
289
-    }
290
-
291
-
292
-    /**
293
-     * calculates total available spaces for an event with no regard for sold tickets
294
-     *
295
-     * @return int|float
296
-     * @throws EE_Error
297
-     * @throws DomainException
298
-     * @throws UnexpectedEntityException
299
-     * @throws InvalidDataTypeException
300
-     * @throws InvalidInterfaceException
301
-     * @throws InvalidArgumentException
302
-     */
303
-    public function totalSpacesAvailable()
304
-    {
305
-        if ($this->debug) {
306
-            \EEH_Debug_Tools::printr(__FUNCTION__, __CLASS__, __FILE__, __LINE__, 2);
307
-        }
308
-        if ($this->total_spaces_available === null) {
309
-            $this->initialize();
310
-            $this->total_spaces_available = $this->calculate(false);
311
-        }
312
-        return $this->total_spaces_available;
313
-    }
314
-
315
-
316
-    /**
317
-     * Loops through the active tickets for the event
318
-     * and builds a series of data arrays that will be used for calculating
319
-     * the total maximum available spaces, as well as the spaces remaining.
320
-     * Because ticket quantities affect datetime spaces and vice versa,
321
-     * we need to be constantly updating these data arrays as things change,
322
-     * which is the entire reason for their existence.
323
-     *
324
-     * @throws EE_Error
325
-     * @throws DomainException
326
-     * @throws UnexpectedEntityException
327
-     * @throws InvalidDataTypeException
328
-     * @throws InvalidInterfaceException
329
-     * @throws InvalidArgumentException
330
-     */
331
-    private function initialize()
332
-    {
333
-        if ($this->debug) {
334
-            \EEH_Debug_Tools::printr(__FUNCTION__, __CLASS__, __FILE__, __LINE__, 2);
335
-        }
336
-        $this->datetime_tickets = array();
337
-        $this->datetime_spaces = array();
338
-        $this->ticket_datetimes = array();
339
-        $this->ticket_quantities = array();
340
-        $this->tickets_sold = array();
341
-        $this->total_spaces = array();
342
-        $active_tickets = $this->getActiveTickets();
343
-        if (! empty($active_tickets)) {
344
-            foreach ($active_tickets as $ticket) {
345
-                $this->validateTicket($ticket);
346
-                // we need to index our data arrays using strings for the purpose of sorting,
347
-                // but we also need them to be unique, so  we'll just prepend a letter T to the ID
348
-                $ticket_identifier = "T{$ticket->ID()}";
349
-                // to start, we'll just consider the raw qty to be the maximum availability for this ticket,
350
-                // unless the ticket is past its "sell until" date, in which case the qty will be 0
351
-                $max_tickets = $ticket->is_expired() ? 0 : $ticket->qty();
352
-                // but we'll adjust that after looping over each datetime for the ticket and checking reg limits
353
-                $ticket_datetimes = $ticket->datetimes($this->datetime_query_params);
354
-                foreach ($ticket_datetimes as $datetime) {
355
-                    // save all datetimes
356
-                    $this->setDatetime($datetime);
357
-                    $datetime_identifier = "D{$datetime->ID()}";
358
-                    $reg_limit = $datetime->reg_limit();
359
-                    // ticket quantity can not exceed datetime reg limit
360
-                    $max_tickets = min($max_tickets, $reg_limit);
361
-                    // as described earlier, because we need to be able to constantly adjust numbers for things,
362
-                    // we are going to move all of our data into the following arrays:
363
-                    // datetime spaces initially represents the reg limit for each datetime,
364
-                    // but this will get adjusted as tickets are accounted for
365
-                    $this->datetime_spaces[ $datetime_identifier ] = $reg_limit;
366
-                    // just an array of ticket IDs grouped by datetime
367
-                    $this->datetime_tickets[ $datetime_identifier ][] = $ticket_identifier;
368
-                    // and an array of datetime IDs grouped by ticket
369
-                    $this->ticket_datetimes[ $ticket_identifier ][] = $datetime_identifier;
370
-                }
371
-                // total quantity of sold and reserved for each ticket
372
-                $this->tickets_sold[ $ticket_identifier ] = $ticket->sold() + $ticket->reserved();
373
-                // and the maximum ticket quantities for each ticket (adjusted for reg limit)
374
-                $this->ticket_quantities[ $ticket_identifier ] = $max_tickets;
375
-            }
376
-        }
377
-        // sort datetime spaces by reg limit, but maintain our string indexes
378
-        asort($this->datetime_spaces, SORT_NUMERIC);
379
-        // datetime tickets need to be sorted in the SAME order as the above array...
380
-        // so we'll just use array_merge() to take the structure of datetime_spaces
381
-        // but overwrite all of the data with that from datetime_tickets
382
-        $this->datetime_tickets = array_merge(
383
-            $this->datetime_spaces,
384
-            $this->datetime_tickets
385
-        );
386
-        if ($this->debug) {
387
-            \EEH_Debug_Tools::printr($this->datetime_spaces, 'datetime_spaces', __FILE__, __LINE__);
388
-            \EEH_Debug_Tools::printr($this->datetime_tickets, 'datetime_tickets', __FILE__, __LINE__);
389
-            \EEH_Debug_Tools::printr($this->ticket_quantities, 'ticket_quantities', __FILE__, __LINE__);
390
-        }
391
-    }
392
-
393
-
394
-    /**
395
-     * performs calculations on initialized data
396
-     *
397
-     * @param bool $consider_sold
398
-     * @return int|float
399
-     */
400
-    private function calculate($consider_sold = true)
401
-    {
402
-        if ($this->debug) {
403
-            \EEH_Debug_Tools::printr(__FUNCTION__, __CLASS__, __FILE__, __LINE__, 2);
404
-            \EEH_Debug_Tools::printr($consider_sold, '$consider_sold', __FILE__, __LINE__);
405
-        }
406
-        if ($consider_sold) {
407
-            // subtract amounts sold from all ticket quantities and datetime spaces
408
-            $this->adjustTicketQuantitiesDueToSales();
409
-        }
410
-        foreach ($this->datetime_tickets as $datetime_identifier => $tickets) {
411
-            $this->trackAvailableSpacesForDatetimes($datetime_identifier, $tickets);
412
-        }
413
-        // total spaces available is just the sum of the spaces available for each datetime
414
-        $spaces_remaining = array_sum($this->total_spaces);
415
-        if ($this->debug) {
416
-            \EEH_Debug_Tools::printr($this->total_spaces, '$this->total_spaces', __FILE__, __LINE__);
417
-            \EEH_Debug_Tools::printr($this->tickets_sold, '$this->tickets_sold', __FILE__, __LINE__);
418
-            \EEH_Debug_Tools::printr($spaces_remaining, '$spaces_remaining', __FILE__, __LINE__);
419
-        }
420
-        return $spaces_remaining;
421
-    }
422
-
423
-
424
-    /**
425
-     * subtracts amount of  tickets sold from ticket quantities and datetime spaces
426
-     */
427
-    private function adjustTicketQuantitiesDueToSales()
428
-    {
429
-        if ($this->debug) {
430
-            \EEH_Debug_Tools::printr(__FUNCTION__, __CLASS__, __FILE__, __LINE__, 2);
431
-        }
432
-        foreach ($this->tickets_sold as $ticket_identifier => $tickets_sold) {
433
-            if (isset($this->ticket_quantities[ $ticket_identifier ])) {
434
-                $this->ticket_quantities[ $ticket_identifier ] -= $tickets_sold;
435
-                // don't let values go below zero
436
-                $this->ticket_quantities[ $ticket_identifier ] = max(
437
-                    $this->ticket_quantities[ $ticket_identifier ],
438
-                    0
439
-                );
440
-                if ($this->debug) {
441
-                    \EEH_Debug_Tools::printr(
442
-                        "{$tickets_sold} sales for ticket {$ticket_identifier} ",
443
-                        'subtracting',
444
-                        __FILE__,
445
-                        __LINE__
446
-                    );
447
-                }
448
-            }
449
-            if (isset($this->ticket_datetimes[ $ticket_identifier ])
450
-                && is_array($this->ticket_datetimes[ $ticket_identifier ])
451
-            ) {
452
-                foreach ($this->ticket_datetimes[ $ticket_identifier ] as $ticket_datetime) {
453
-                    if (isset($this->ticket_quantities[ $ticket_identifier ])) {
454
-                        $this->datetime_spaces[ $ticket_datetime ] -= $tickets_sold;
455
-                        // don't let values go below zero
456
-                        $this->datetime_spaces[ $ticket_datetime ] = max(
457
-                            $this->datetime_spaces[ $ticket_datetime ],
458
-                            0
459
-                        );
460
-                        if ($this->debug) {
461
-                            \EEH_Debug_Tools::printr(
462
-                                "{$tickets_sold} sales for datetime {$ticket_datetime} ",
463
-                                'subtracting',
464
-                                __FILE__,
465
-                                __LINE__
466
-                            );
467
-                        }
468
-                    }
469
-                }
470
-            }
471
-        }
472
-    }
473
-
474
-
475
-    /**
476
-     * @param string $datetime_identifier
477
-     * @param array  $tickets
478
-     */
479
-    private function trackAvailableSpacesForDatetimes($datetime_identifier, array $tickets)
480
-    {
481
-        // make sure a reg limit is set for the datetime
482
-        $reg_limit = isset($this->datetime_spaces[ $datetime_identifier ])
483
-            ? $this->datetime_spaces[ $datetime_identifier ]
484
-            : 0;
485
-        // and bail if it is not
486
-        if (! $reg_limit) {
487
-            if ($this->debug) {
488
-                \EEH_Debug_Tools::printr('AT CAPACITY', " . {$datetime_identifier}", __FILE__, __LINE__);
489
-            }
490
-            return;
491
-        }
492
-        if ($this->debug) {
493
-            \EEH_Debug_Tools::printr($datetime_identifier, '* $datetime_identifier', __FILE__, __LINE__, 1);
494
-            \EEH_Debug_Tools::printr(
495
-                "{$reg_limit}",
496
-                'REG LIMIT',
497
-                __FILE__,
498
-                __LINE__
499
-            );
500
-        }
501
-        // number of allocated spaces always starts at zero
502
-        $spaces_allocated = 0;
503
-        $this->total_spaces[ $datetime_identifier ] = 0;
504
-        foreach ($tickets as $ticket_identifier) {
505
-            $spaces_allocated = $this->calculateAvailableSpacesForTicket(
506
-                $datetime_identifier,
507
-                $reg_limit,
508
-                $ticket_identifier,
509
-                $spaces_allocated
510
-            );
511
-        }
512
-        // spaces can't be negative
513
-        $spaces_allocated = max($spaces_allocated, 0);
514
-        if ($spaces_allocated) {
515
-            // track any non-zero values
516
-            $this->total_spaces[ $datetime_identifier ] += $spaces_allocated;
517
-            if ($this->debug) {
518
-                \EEH_Debug_Tools::printr((string) $spaces_allocated, ' . $spaces_allocated: ', __FILE__, __LINE__);
519
-            }
520
-        } else {
521
-            if ($this->debug) {
522
-                \EEH_Debug_Tools::printr(' ', ' . NO TICKETS AVAILABLE FOR DATETIME', __FILE__, __LINE__);
523
-            }
524
-        }
525
-        if ($this->debug) {
526
-            \EEH_Debug_Tools::printr(
527
-                $this->total_spaces[ $datetime_identifier ],
528
-                '$total_spaces',
529
-                __FILE__,
530
-                __LINE__
531
-            );
532
-            \EEH_Debug_Tools::printr($this->ticket_quantities, '$ticket_quantities', __FILE__, __LINE__);
533
-            \EEH_Debug_Tools::printr($this->datetime_spaces, 'datetime_spaces', __FILE__, __LINE__);
534
-        }
535
-    }
536
-
537
-
538
-    /**
539
-     * @param string $datetime_identifier
540
-     * @param int    $reg_limit
541
-     * @param string $ticket_identifier
542
-     * @param int    $spaces_allocated
543
-     * @return int
544
-     */
545
-    private function calculateAvailableSpacesForTicket(
546
-        $datetime_identifier,
547
-        $reg_limit,
548
-        $ticket_identifier,
549
-        $spaces_allocated
550
-    ) {
551
-        // make sure ticket quantity is set
552
-        $ticket_quantity = isset($this->ticket_quantities[ $ticket_identifier ])
553
-            ? $this->ticket_quantities[ $ticket_identifier ]
554
-            : 0;
555
-        if ($this->debug) {
556
-            \EEH_Debug_Tools::printr("{$spaces_allocated}", '$spaces_allocated', __FILE__, __LINE__);
557
-            \EEH_Debug_Tools::printr(
558
-                "{$ticket_quantity}",
559
-                "ticket $ticket_identifier quantity: ",
560
-                __FILE__,
561
-                __LINE__,
562
-                2
563
-            );
564
-        }
565
-        if ($ticket_quantity) {
566
-            if ($this->debug) {
567
-                \EEH_Debug_Tools::printr(
568
-                    ($spaces_allocated <= $reg_limit)
569
-                        ? 'true'
570
-                        : 'false',
571
-                    ' . spaces_allocated <= reg_limit = ',
572
-                    __FILE__,
573
-                    __LINE__
574
-                );
575
-            }
576
-            // if the datetime is NOT at full capacity yet
577
-            if ($spaces_allocated <= $reg_limit) {
578
-                // then the maximum ticket quantity we can allocate is the lowest value of either:
579
-                //  the number of remaining spaces for the datetime, which is the limit - spaces already taken
580
-                //  or the maximum ticket quantity
581
-                $ticket_quantity = min($reg_limit - $spaces_allocated, $ticket_quantity);
582
-                // adjust the available quantity in our tracking array
583
-                $this->ticket_quantities[ $ticket_identifier ] -= $ticket_quantity;
584
-                // and increment spaces allocated for this datetime
585
-                $spaces_allocated += $ticket_quantity;
586
-                $at_capacity = $spaces_allocated >= $reg_limit;
587
-                if ($this->debug) {
588
-                    \EEH_Debug_Tools::printr(
589
-                        "{$ticket_quantity} {$ticket_identifier} tickets",
590
-                        ' > > allocate ',
591
-                        __FILE__,
592
-                        __LINE__,
593
-                        3
594
-                    );
595
-                    if ($at_capacity) {
596
-                        \EEH_Debug_Tools::printr('AT CAPACITY', " . {$datetime_identifier}", __FILE__, __LINE__, 3);
597
-                    }
598
-                }
599
-                // now adjust all other datetimes that allow access to this ticket
600
-                $this->adjustDatetimes(
601
-                    $datetime_identifier,
602
-                    $ticket_identifier,
603
-                    $ticket_quantity,
604
-                    $at_capacity
605
-                );
606
-            }
607
-        }
608
-        return $spaces_allocated;
609
-    }
610
-
611
-
612
-    /**
613
-     * subtracts ticket amounts from all datetime reg limits
614
-     * that allow access to the ticket specified,
615
-     * because that ticket could be used
616
-     * to attend any of the datetimes it has access to
617
-     *
618
-     * @param string $datetime_identifier
619
-     * @param string $ticket_identifier
620
-     * @param bool   $at_capacity
621
-     * @param int    $ticket_quantity
622
-     */
623
-    private function adjustDatetimes(
624
-        $datetime_identifier,
625
-        $ticket_identifier,
626
-        $ticket_quantity,
627
-        $at_capacity
628
-    ) {
629
-        /** @var array $datetime_tickets */
630
-        foreach ($this->datetime_tickets as $datetime_ID => $datetime_tickets) {
631
-            if ($datetime_ID !== $datetime_identifier || ! is_array($datetime_tickets)) {
632
-                continue;
633
-            }
634
-            $adjusted = $this->adjustDatetimeSpaces(
635
-                $datetime_ID,
636
-                $ticket_identifier,
637
-                $ticket_quantity
638
-            );
639
-            // skip to next ticket if nothing changed
640
-            if (! ($adjusted || $at_capacity)) {
641
-                continue;
642
-            }
643
-            // then all of it's tickets are now unavailable
644
-            foreach ($datetime_tickets as $datetime_ticket) {
645
-                if (($ticket_identifier === $datetime_ticket || $at_capacity)
646
-                    && isset($this->ticket_quantities[ $datetime_ticket ])
647
-                    && $this->ticket_quantities[ $datetime_ticket ] > 0
648
-                ) {
649
-                    if ($this->debug) {
650
-                        \EEH_Debug_Tools::printr(
651
-                            $datetime_ticket,
652
-                            ' . . . adjust ticket quantities for',
653
-                            __FILE__,
654
-                            __LINE__
655
-                        );
656
-                    }
657
-                    // if this datetime is at full capacity, set any tracked available quantities to zero
658
-                    // otherwise just subtract the ticket quantity
659
-                    $new_quantity = $at_capacity
660
-                        ? 0
661
-                        : $this->ticket_quantities[ $datetime_ticket ] - $ticket_quantity;
662
-                    // don't let ticket quantity go below zero
663
-                    $this->ticket_quantities[ $datetime_ticket ] = max($new_quantity, 0);
664
-                    if ($this->debug) {
665
-                        \EEH_Debug_Tools::printr(
666
-                            $at_capacity
667
-                                ? "0 because Datetime {$datetime_identifier} is at capacity"
668
-                                : "{$this->ticket_quantities[ $datetime_ticket ]}",
669
-                            " . . . . {$datetime_ticket} quantity set to ",
670
-                            __FILE__,
671
-                            __LINE__
672
-                        );
673
-                    }
674
-                }
675
-                // but we also need to adjust spaces for any other datetimes this ticket has access to
676
-                if ($datetime_ticket === $ticket_identifier) {
677
-                    if (isset($this->ticket_datetimes[ $datetime_ticket ])
678
-                        && is_array($this->ticket_datetimes[ $datetime_ticket ])
679
-                    ) {
680
-                        if ($this->debug) {
681
-                            \EEH_Debug_Tools::printr(
682
-                                $datetime_ticket,
683
-                                ' . . adjust other Datetimes for',
684
-                                __FILE__,
685
-                                __LINE__
686
-                            );
687
-                        }
688
-                        foreach ($this->ticket_datetimes[ $datetime_ticket ] as $datetime) {
689
-                            // don't adjust the current datetime twice
690
-                            if ($datetime !== $datetime_identifier) {
691
-                                $this->adjustDatetimeSpaces(
692
-                                    $datetime,
693
-                                    $datetime_ticket,
694
-                                    $ticket_quantity
695
-                                );
696
-                            }
697
-                        }
698
-                    }
699
-                }
700
-            }
701
-        }
702
-    }
703
-
704
-    private function adjustDatetimeSpaces($datetime_identifier, $ticket_identifier, $ticket_quantity = 0)
705
-    {
706
-        // does datetime have spaces available?
707
-        // and does the supplied ticket have access to this datetime ?
708
-        if ($this->datetime_spaces[ $datetime_identifier ] > 0
709
-            && isset($this->datetime_spaces[ $datetime_identifier ], $this->datetime_tickets[ $datetime_identifier ])
710
-            && in_array($ticket_identifier, $this->datetime_tickets[ $datetime_identifier ], true)
711
-        ) {
712
-            if ($this->debug) {
713
-                \EEH_Debug_Tools::printr($datetime_identifier, ' . . adjust Datetime Spaces for', __FILE__, __LINE__);
714
-                \EEH_Debug_Tools::printr(
715
-                    "{$this->datetime_spaces[ $datetime_identifier ]}",
716
-                    " . . current  {$datetime_identifier} spaces available",
717
-                    __FILE__,
718
-                    __LINE__
719
-                );
720
-            }
721
-            // then decrement the available spaces for the datetime
722
-            $this->datetime_spaces[ $datetime_identifier ] -= $ticket_quantity;
723
-            // but don't let quantities go below zero
724
-            $this->datetime_spaces[ $datetime_identifier ] = max(
725
-                $this->datetime_spaces[ $datetime_identifier ],
726
-                0
727
-            );
728
-            if ($this->debug) {
729
-                \EEH_Debug_Tools::printr(
730
-                    "{$ticket_quantity}",
731
-                    " . . . {$datetime_identifier} capacity reduced by",
732
-                    __FILE__,
733
-                    __LINE__
734
-                );
735
-            }
736
-            return true;
737
-        }
738
-        return false;
739
-    }
29
+	/**
30
+	 * @var EE_Event $event
31
+	 */
32
+	private $event;
33
+
34
+	/**
35
+	 * @var array $datetime_query_params
36
+	 */
37
+	private $datetime_query_params;
38
+
39
+	/**
40
+	 * @var EE_Ticket[] $active_tickets
41
+	 */
42
+	private $active_tickets = array();
43
+
44
+	/**
45
+	 * @var EE_Datetime[] $datetimes
46
+	 */
47
+	private $datetimes = array();
48
+
49
+	/**
50
+	 * Array of Ticket IDs grouped by Datetime
51
+	 *
52
+	 * @var array $datetimes
53
+	 */
54
+	private $datetime_tickets = array();
55
+
56
+	/**
57
+	 * Max spaces for each Datetime (reg limit - previous sold)
58
+	 *
59
+	 * @var array $datetime_spaces
60
+	 */
61
+	private $datetime_spaces = array();
62
+
63
+	/**
64
+	 * Array of Datetime IDs grouped by Ticket
65
+	 *
66
+	 * @var array[] $ticket_datetimes
67
+	 */
68
+	private $ticket_datetimes = array();
69
+
70
+	/**
71
+	 * maximum ticket quantities for each ticket (adjusted for reg limit)
72
+	 *
73
+	 * @var array $ticket_quantities
74
+	 */
75
+	private $ticket_quantities = array();
76
+
77
+	/**
78
+	 * total quantity of sold and reserved for each ticket
79
+	 *
80
+	 * @var array $tickets_sold
81
+	 */
82
+	private $tickets_sold = array();
83
+
84
+	/**
85
+	 * total spaces available across all datetimes
86
+	 *
87
+	 * @var array $total_spaces
88
+	 */
89
+	private $total_spaces = array();
90
+
91
+	/**
92
+	 * @var boolean $debug
93
+	 */
94
+	private $debug = false; // true false
95
+
96
+	/**
97
+	 * @var null|int $spaces_remaining
98
+	 */
99
+	private $spaces_remaining;
100
+
101
+	/**
102
+	 * @var null|int $total_spaces_available
103
+	 */
104
+	private $total_spaces_available;
105
+
106
+
107
+	/**
108
+	 * EventSpacesCalculator constructor.
109
+	 *
110
+	 * @param EE_Event $event
111
+	 * @param array    $datetime_query_params
112
+	 * @throws EE_Error
113
+	 */
114
+	public function __construct(EE_Event $event, array $datetime_query_params = array())
115
+	{
116
+		if ($this->debug) {
117
+			\EEH_Debug_Tools::printr(__FUNCTION__, __CLASS__, __FILE__, __LINE__, 1);
118
+			\EEH_Debug_Tools::printr((string) $event->ID(), 'For event', __FILE__, __LINE__);
119
+		}
120
+		$this->event = $event;
121
+		$this->datetime_query_params = $datetime_query_params + array('order_by' => array('DTT_reg_limit' => 'ASC'));
122
+		$this->setHooks();
123
+	}
124
+
125
+
126
+	/**
127
+	 * @return void
128
+	 */
129
+	private function setHooks()
130
+	{
131
+		add_action('AHEE__EE_Ticket__increase_sold', array($this, 'clearResults'));
132
+		add_action('AHEE__EE_Ticket__decrease_sold', array($this, 'clearResults'));
133
+		add_action('AHEE__EE_Datetime__increase_sold', array($this, 'clearResults'));
134
+		add_action('AHEE__EE_Datetime__decrease_sold', array($this, 'clearResults'));
135
+		add_action('AHEE__EE_Ticket__increase_reserved', array($this, 'clearResults'));
136
+		add_action('AHEE__EE_Ticket__decrease_reserved', array($this, 'clearResults'));
137
+		add_action('AHEE__EE_Datetime__increase_reserved', array($this, 'clearResults'));
138
+		add_action('AHEE__EE_Datetime__decrease_reserved', array($this, 'clearResults'));
139
+	}
140
+
141
+
142
+	/**
143
+	 * @return void
144
+	 */
145
+	public function clearResults()
146
+	{
147
+		if ($this->debug) {
148
+			\EEH_Debug_Tools::printr(__FUNCTION__, __CLASS__, __FILE__, __LINE__, 1);
149
+		}
150
+		$this->spaces_remaining = null;
151
+		$this->total_spaces_available = null;
152
+	}
153
+
154
+
155
+	/**
156
+	 * @return EE_Ticket[]
157
+	 * @throws EE_Error
158
+	 * @throws InvalidDataTypeException
159
+	 * @throws InvalidInterfaceException
160
+	 * @throws InvalidArgumentException
161
+	 */
162
+	public function getActiveTickets()
163
+	{
164
+		if (empty($this->active_tickets)) {
165
+			$this->active_tickets = $this->event->tickets(
166
+				array(
167
+					array('TKT_deleted' => false),
168
+					'order_by' => array('TKT_qty' => 'ASC'),
169
+				)
170
+			);
171
+		}
172
+		return $this->active_tickets;
173
+	}
174
+
175
+
176
+	/**
177
+	 * @param EE_Ticket[] $active_tickets
178
+	 * @throws EE_Error
179
+	 * @throws DomainException
180
+	 * @throws UnexpectedEntityException
181
+	 */
182
+	public function setActiveTickets(array $active_tickets = array())
183
+	{
184
+		if (! empty($active_tickets)) {
185
+			foreach ($active_tickets as $active_ticket) {
186
+				$this->validateTicket($active_ticket);
187
+			}
188
+			// sort incoming array by ticket quantity (asc)
189
+			usort(
190
+				$active_tickets,
191
+				function (EE_Ticket $a, EE_Ticket $b) {
192
+					if ($a->qty() === $b->qty()) {
193
+						return 0;
194
+					}
195
+					return ($a->qty() < $b->qty())
196
+						? -1
197
+						: 1;
198
+				}
199
+			);
200
+		}
201
+		$this->active_tickets = $active_tickets;
202
+	}
203
+
204
+
205
+	/**
206
+	 * @param $ticket
207
+	 * @throws DomainException
208
+	 * @throws EE_Error
209
+	 * @throws UnexpectedEntityException
210
+	 */
211
+	private function validateTicket($ticket)
212
+	{
213
+		if (! $ticket instanceof EE_Ticket) {
214
+			throw new DomainException(
215
+				esc_html__(
216
+					'Invalid Ticket. Only EE_Ticket objects can be used to calculate event space availability.',
217
+					'event_espresso'
218
+				)
219
+			);
220
+		}
221
+		if ($ticket->get_event_ID() !== $this->event->ID()) {
222
+			throw new DomainException(
223
+				sprintf(
224
+					esc_html__(
225
+						'An EE_Ticket for Event %1$d was supplied while calculating event space availability for Event %2$d.',
226
+						'event_espresso'
227
+					),
228
+					$ticket->get_event_ID(),
229
+					$this->event->ID()
230
+				)
231
+			);
232
+		}
233
+	}
234
+
235
+
236
+	/**
237
+	 * @return EE_Datetime[]
238
+	 */
239
+	public function getDatetimes()
240
+	{
241
+		return $this->datetimes;
242
+	}
243
+
244
+
245
+	/**
246
+	 * @param EE_Datetime $datetime
247
+	 * @throws EE_Error
248
+	 * @throws DomainException
249
+	 */
250
+	public function setDatetime(EE_Datetime $datetime)
251
+	{
252
+		if ($datetime->event()->ID() !== $this->event->ID()) {
253
+			throw new DomainException(
254
+				sprintf(
255
+					esc_html__(
256
+						'An EE_Datetime for Event %1$d was supplied while calculating event space availability for Event %2$d.',
257
+						'event_espresso'
258
+					),
259
+					$datetime->event()->ID(),
260
+					$this->event->ID()
261
+				)
262
+			);
263
+		}
264
+		$this->datetimes[ $datetime->ID() ] = $datetime;
265
+	}
266
+
267
+
268
+	/**
269
+	 * calculate spaces remaining based on "saleable" tickets
270
+	 *
271
+	 * @return float|int
272
+	 * @throws EE_Error
273
+	 * @throws DomainException
274
+	 * @throws UnexpectedEntityException
275
+	 * @throws InvalidDataTypeException
276
+	 * @throws InvalidInterfaceException
277
+	 * @throws InvalidArgumentException
278
+	 */
279
+	public function spacesRemaining()
280
+	{
281
+		if ($this->debug) {
282
+			\EEH_Debug_Tools::printr(__FUNCTION__, __CLASS__, __FILE__, __LINE__, 2);
283
+		}
284
+		if ($this->spaces_remaining === null) {
285
+			$this->initialize();
286
+			$this->spaces_remaining = $this->calculate();
287
+		}
288
+		return $this->spaces_remaining;
289
+	}
290
+
291
+
292
+	/**
293
+	 * calculates total available spaces for an event with no regard for sold tickets
294
+	 *
295
+	 * @return int|float
296
+	 * @throws EE_Error
297
+	 * @throws DomainException
298
+	 * @throws UnexpectedEntityException
299
+	 * @throws InvalidDataTypeException
300
+	 * @throws InvalidInterfaceException
301
+	 * @throws InvalidArgumentException
302
+	 */
303
+	public function totalSpacesAvailable()
304
+	{
305
+		if ($this->debug) {
306
+			\EEH_Debug_Tools::printr(__FUNCTION__, __CLASS__, __FILE__, __LINE__, 2);
307
+		}
308
+		if ($this->total_spaces_available === null) {
309
+			$this->initialize();
310
+			$this->total_spaces_available = $this->calculate(false);
311
+		}
312
+		return $this->total_spaces_available;
313
+	}
314
+
315
+
316
+	/**
317
+	 * Loops through the active tickets for the event
318
+	 * and builds a series of data arrays that will be used for calculating
319
+	 * the total maximum available spaces, as well as the spaces remaining.
320
+	 * Because ticket quantities affect datetime spaces and vice versa,
321
+	 * we need to be constantly updating these data arrays as things change,
322
+	 * which is the entire reason for their existence.
323
+	 *
324
+	 * @throws EE_Error
325
+	 * @throws DomainException
326
+	 * @throws UnexpectedEntityException
327
+	 * @throws InvalidDataTypeException
328
+	 * @throws InvalidInterfaceException
329
+	 * @throws InvalidArgumentException
330
+	 */
331
+	private function initialize()
332
+	{
333
+		if ($this->debug) {
334
+			\EEH_Debug_Tools::printr(__FUNCTION__, __CLASS__, __FILE__, __LINE__, 2);
335
+		}
336
+		$this->datetime_tickets = array();
337
+		$this->datetime_spaces = array();
338
+		$this->ticket_datetimes = array();
339
+		$this->ticket_quantities = array();
340
+		$this->tickets_sold = array();
341
+		$this->total_spaces = array();
342
+		$active_tickets = $this->getActiveTickets();
343
+		if (! empty($active_tickets)) {
344
+			foreach ($active_tickets as $ticket) {
345
+				$this->validateTicket($ticket);
346
+				// we need to index our data arrays using strings for the purpose of sorting,
347
+				// but we also need them to be unique, so  we'll just prepend a letter T to the ID
348
+				$ticket_identifier = "T{$ticket->ID()}";
349
+				// to start, we'll just consider the raw qty to be the maximum availability for this ticket,
350
+				// unless the ticket is past its "sell until" date, in which case the qty will be 0
351
+				$max_tickets = $ticket->is_expired() ? 0 : $ticket->qty();
352
+				// but we'll adjust that after looping over each datetime for the ticket and checking reg limits
353
+				$ticket_datetimes = $ticket->datetimes($this->datetime_query_params);
354
+				foreach ($ticket_datetimes as $datetime) {
355
+					// save all datetimes
356
+					$this->setDatetime($datetime);
357
+					$datetime_identifier = "D{$datetime->ID()}";
358
+					$reg_limit = $datetime->reg_limit();
359
+					// ticket quantity can not exceed datetime reg limit
360
+					$max_tickets = min($max_tickets, $reg_limit);
361
+					// as described earlier, because we need to be able to constantly adjust numbers for things,
362
+					// we are going to move all of our data into the following arrays:
363
+					// datetime spaces initially represents the reg limit for each datetime,
364
+					// but this will get adjusted as tickets are accounted for
365
+					$this->datetime_spaces[ $datetime_identifier ] = $reg_limit;
366
+					// just an array of ticket IDs grouped by datetime
367
+					$this->datetime_tickets[ $datetime_identifier ][] = $ticket_identifier;
368
+					// and an array of datetime IDs grouped by ticket
369
+					$this->ticket_datetimes[ $ticket_identifier ][] = $datetime_identifier;
370
+				}
371
+				// total quantity of sold and reserved for each ticket
372
+				$this->tickets_sold[ $ticket_identifier ] = $ticket->sold() + $ticket->reserved();
373
+				// and the maximum ticket quantities for each ticket (adjusted for reg limit)
374
+				$this->ticket_quantities[ $ticket_identifier ] = $max_tickets;
375
+			}
376
+		}
377
+		// sort datetime spaces by reg limit, but maintain our string indexes
378
+		asort($this->datetime_spaces, SORT_NUMERIC);
379
+		// datetime tickets need to be sorted in the SAME order as the above array...
380
+		// so we'll just use array_merge() to take the structure of datetime_spaces
381
+		// but overwrite all of the data with that from datetime_tickets
382
+		$this->datetime_tickets = array_merge(
383
+			$this->datetime_spaces,
384
+			$this->datetime_tickets
385
+		);
386
+		if ($this->debug) {
387
+			\EEH_Debug_Tools::printr($this->datetime_spaces, 'datetime_spaces', __FILE__, __LINE__);
388
+			\EEH_Debug_Tools::printr($this->datetime_tickets, 'datetime_tickets', __FILE__, __LINE__);
389
+			\EEH_Debug_Tools::printr($this->ticket_quantities, 'ticket_quantities', __FILE__, __LINE__);
390
+		}
391
+	}
392
+
393
+
394
+	/**
395
+	 * performs calculations on initialized data
396
+	 *
397
+	 * @param bool $consider_sold
398
+	 * @return int|float
399
+	 */
400
+	private function calculate($consider_sold = true)
401
+	{
402
+		if ($this->debug) {
403
+			\EEH_Debug_Tools::printr(__FUNCTION__, __CLASS__, __FILE__, __LINE__, 2);
404
+			\EEH_Debug_Tools::printr($consider_sold, '$consider_sold', __FILE__, __LINE__);
405
+		}
406
+		if ($consider_sold) {
407
+			// subtract amounts sold from all ticket quantities and datetime spaces
408
+			$this->adjustTicketQuantitiesDueToSales();
409
+		}
410
+		foreach ($this->datetime_tickets as $datetime_identifier => $tickets) {
411
+			$this->trackAvailableSpacesForDatetimes($datetime_identifier, $tickets);
412
+		}
413
+		// total spaces available is just the sum of the spaces available for each datetime
414
+		$spaces_remaining = array_sum($this->total_spaces);
415
+		if ($this->debug) {
416
+			\EEH_Debug_Tools::printr($this->total_spaces, '$this->total_spaces', __FILE__, __LINE__);
417
+			\EEH_Debug_Tools::printr($this->tickets_sold, '$this->tickets_sold', __FILE__, __LINE__);
418
+			\EEH_Debug_Tools::printr($spaces_remaining, '$spaces_remaining', __FILE__, __LINE__);
419
+		}
420
+		return $spaces_remaining;
421
+	}
422
+
423
+
424
+	/**
425
+	 * subtracts amount of  tickets sold from ticket quantities and datetime spaces
426
+	 */
427
+	private function adjustTicketQuantitiesDueToSales()
428
+	{
429
+		if ($this->debug) {
430
+			\EEH_Debug_Tools::printr(__FUNCTION__, __CLASS__, __FILE__, __LINE__, 2);
431
+		}
432
+		foreach ($this->tickets_sold as $ticket_identifier => $tickets_sold) {
433
+			if (isset($this->ticket_quantities[ $ticket_identifier ])) {
434
+				$this->ticket_quantities[ $ticket_identifier ] -= $tickets_sold;
435
+				// don't let values go below zero
436
+				$this->ticket_quantities[ $ticket_identifier ] = max(
437
+					$this->ticket_quantities[ $ticket_identifier ],
438
+					0
439
+				);
440
+				if ($this->debug) {
441
+					\EEH_Debug_Tools::printr(
442
+						"{$tickets_sold} sales for ticket {$ticket_identifier} ",
443
+						'subtracting',
444
+						__FILE__,
445
+						__LINE__
446
+					);
447
+				}
448
+			}
449
+			if (isset($this->ticket_datetimes[ $ticket_identifier ])
450
+				&& is_array($this->ticket_datetimes[ $ticket_identifier ])
451
+			) {
452
+				foreach ($this->ticket_datetimes[ $ticket_identifier ] as $ticket_datetime) {
453
+					if (isset($this->ticket_quantities[ $ticket_identifier ])) {
454
+						$this->datetime_spaces[ $ticket_datetime ] -= $tickets_sold;
455
+						// don't let values go below zero
456
+						$this->datetime_spaces[ $ticket_datetime ] = max(
457
+							$this->datetime_spaces[ $ticket_datetime ],
458
+							0
459
+						);
460
+						if ($this->debug) {
461
+							\EEH_Debug_Tools::printr(
462
+								"{$tickets_sold} sales for datetime {$ticket_datetime} ",
463
+								'subtracting',
464
+								__FILE__,
465
+								__LINE__
466
+							);
467
+						}
468
+					}
469
+				}
470
+			}
471
+		}
472
+	}
473
+
474
+
475
+	/**
476
+	 * @param string $datetime_identifier
477
+	 * @param array  $tickets
478
+	 */
479
+	private function trackAvailableSpacesForDatetimes($datetime_identifier, array $tickets)
480
+	{
481
+		// make sure a reg limit is set for the datetime
482
+		$reg_limit = isset($this->datetime_spaces[ $datetime_identifier ])
483
+			? $this->datetime_spaces[ $datetime_identifier ]
484
+			: 0;
485
+		// and bail if it is not
486
+		if (! $reg_limit) {
487
+			if ($this->debug) {
488
+				\EEH_Debug_Tools::printr('AT CAPACITY', " . {$datetime_identifier}", __FILE__, __LINE__);
489
+			}
490
+			return;
491
+		}
492
+		if ($this->debug) {
493
+			\EEH_Debug_Tools::printr($datetime_identifier, '* $datetime_identifier', __FILE__, __LINE__, 1);
494
+			\EEH_Debug_Tools::printr(
495
+				"{$reg_limit}",
496
+				'REG LIMIT',
497
+				__FILE__,
498
+				__LINE__
499
+			);
500
+		}
501
+		// number of allocated spaces always starts at zero
502
+		$spaces_allocated = 0;
503
+		$this->total_spaces[ $datetime_identifier ] = 0;
504
+		foreach ($tickets as $ticket_identifier) {
505
+			$spaces_allocated = $this->calculateAvailableSpacesForTicket(
506
+				$datetime_identifier,
507
+				$reg_limit,
508
+				$ticket_identifier,
509
+				$spaces_allocated
510
+			);
511
+		}
512
+		// spaces can't be negative
513
+		$spaces_allocated = max($spaces_allocated, 0);
514
+		if ($spaces_allocated) {
515
+			// track any non-zero values
516
+			$this->total_spaces[ $datetime_identifier ] += $spaces_allocated;
517
+			if ($this->debug) {
518
+				\EEH_Debug_Tools::printr((string) $spaces_allocated, ' . $spaces_allocated: ', __FILE__, __LINE__);
519
+			}
520
+		} else {
521
+			if ($this->debug) {
522
+				\EEH_Debug_Tools::printr(' ', ' . NO TICKETS AVAILABLE FOR DATETIME', __FILE__, __LINE__);
523
+			}
524
+		}
525
+		if ($this->debug) {
526
+			\EEH_Debug_Tools::printr(
527
+				$this->total_spaces[ $datetime_identifier ],
528
+				'$total_spaces',
529
+				__FILE__,
530
+				__LINE__
531
+			);
532
+			\EEH_Debug_Tools::printr($this->ticket_quantities, '$ticket_quantities', __FILE__, __LINE__);
533
+			\EEH_Debug_Tools::printr($this->datetime_spaces, 'datetime_spaces', __FILE__, __LINE__);
534
+		}
535
+	}
536
+
537
+
538
+	/**
539
+	 * @param string $datetime_identifier
540
+	 * @param int    $reg_limit
541
+	 * @param string $ticket_identifier
542
+	 * @param int    $spaces_allocated
543
+	 * @return int
544
+	 */
545
+	private function calculateAvailableSpacesForTicket(
546
+		$datetime_identifier,
547
+		$reg_limit,
548
+		$ticket_identifier,
549
+		$spaces_allocated
550
+	) {
551
+		// make sure ticket quantity is set
552
+		$ticket_quantity = isset($this->ticket_quantities[ $ticket_identifier ])
553
+			? $this->ticket_quantities[ $ticket_identifier ]
554
+			: 0;
555
+		if ($this->debug) {
556
+			\EEH_Debug_Tools::printr("{$spaces_allocated}", '$spaces_allocated', __FILE__, __LINE__);
557
+			\EEH_Debug_Tools::printr(
558
+				"{$ticket_quantity}",
559
+				"ticket $ticket_identifier quantity: ",
560
+				__FILE__,
561
+				__LINE__,
562
+				2
563
+			);
564
+		}
565
+		if ($ticket_quantity) {
566
+			if ($this->debug) {
567
+				\EEH_Debug_Tools::printr(
568
+					($spaces_allocated <= $reg_limit)
569
+						? 'true'
570
+						: 'false',
571
+					' . spaces_allocated <= reg_limit = ',
572
+					__FILE__,
573
+					__LINE__
574
+				);
575
+			}
576
+			// if the datetime is NOT at full capacity yet
577
+			if ($spaces_allocated <= $reg_limit) {
578
+				// then the maximum ticket quantity we can allocate is the lowest value of either:
579
+				//  the number of remaining spaces for the datetime, which is the limit - spaces already taken
580
+				//  or the maximum ticket quantity
581
+				$ticket_quantity = min($reg_limit - $spaces_allocated, $ticket_quantity);
582
+				// adjust the available quantity in our tracking array
583
+				$this->ticket_quantities[ $ticket_identifier ] -= $ticket_quantity;
584
+				// and increment spaces allocated for this datetime
585
+				$spaces_allocated += $ticket_quantity;
586
+				$at_capacity = $spaces_allocated >= $reg_limit;
587
+				if ($this->debug) {
588
+					\EEH_Debug_Tools::printr(
589
+						"{$ticket_quantity} {$ticket_identifier} tickets",
590
+						' > > allocate ',
591
+						__FILE__,
592
+						__LINE__,
593
+						3
594
+					);
595
+					if ($at_capacity) {
596
+						\EEH_Debug_Tools::printr('AT CAPACITY', " . {$datetime_identifier}", __FILE__, __LINE__, 3);
597
+					}
598
+				}
599
+				// now adjust all other datetimes that allow access to this ticket
600
+				$this->adjustDatetimes(
601
+					$datetime_identifier,
602
+					$ticket_identifier,
603
+					$ticket_quantity,
604
+					$at_capacity
605
+				);
606
+			}
607
+		}
608
+		return $spaces_allocated;
609
+	}
610
+
611
+
612
+	/**
613
+	 * subtracts ticket amounts from all datetime reg limits
614
+	 * that allow access to the ticket specified,
615
+	 * because that ticket could be used
616
+	 * to attend any of the datetimes it has access to
617
+	 *
618
+	 * @param string $datetime_identifier
619
+	 * @param string $ticket_identifier
620
+	 * @param bool   $at_capacity
621
+	 * @param int    $ticket_quantity
622
+	 */
623
+	private function adjustDatetimes(
624
+		$datetime_identifier,
625
+		$ticket_identifier,
626
+		$ticket_quantity,
627
+		$at_capacity
628
+	) {
629
+		/** @var array $datetime_tickets */
630
+		foreach ($this->datetime_tickets as $datetime_ID => $datetime_tickets) {
631
+			if ($datetime_ID !== $datetime_identifier || ! is_array($datetime_tickets)) {
632
+				continue;
633
+			}
634
+			$adjusted = $this->adjustDatetimeSpaces(
635
+				$datetime_ID,
636
+				$ticket_identifier,
637
+				$ticket_quantity
638
+			);
639
+			// skip to next ticket if nothing changed
640
+			if (! ($adjusted || $at_capacity)) {
641
+				continue;
642
+			}
643
+			// then all of it's tickets are now unavailable
644
+			foreach ($datetime_tickets as $datetime_ticket) {
645
+				if (($ticket_identifier === $datetime_ticket || $at_capacity)
646
+					&& isset($this->ticket_quantities[ $datetime_ticket ])
647
+					&& $this->ticket_quantities[ $datetime_ticket ] > 0
648
+				) {
649
+					if ($this->debug) {
650
+						\EEH_Debug_Tools::printr(
651
+							$datetime_ticket,
652
+							' . . . adjust ticket quantities for',
653
+							__FILE__,
654
+							__LINE__
655
+						);
656
+					}
657
+					// if this datetime is at full capacity, set any tracked available quantities to zero
658
+					// otherwise just subtract the ticket quantity
659
+					$new_quantity = $at_capacity
660
+						? 0
661
+						: $this->ticket_quantities[ $datetime_ticket ] - $ticket_quantity;
662
+					// don't let ticket quantity go below zero
663
+					$this->ticket_quantities[ $datetime_ticket ] = max($new_quantity, 0);
664
+					if ($this->debug) {
665
+						\EEH_Debug_Tools::printr(
666
+							$at_capacity
667
+								? "0 because Datetime {$datetime_identifier} is at capacity"
668
+								: "{$this->ticket_quantities[ $datetime_ticket ]}",
669
+							" . . . . {$datetime_ticket} quantity set to ",
670
+							__FILE__,
671
+							__LINE__
672
+						);
673
+					}
674
+				}
675
+				// but we also need to adjust spaces for any other datetimes this ticket has access to
676
+				if ($datetime_ticket === $ticket_identifier) {
677
+					if (isset($this->ticket_datetimes[ $datetime_ticket ])
678
+						&& is_array($this->ticket_datetimes[ $datetime_ticket ])
679
+					) {
680
+						if ($this->debug) {
681
+							\EEH_Debug_Tools::printr(
682
+								$datetime_ticket,
683
+								' . . adjust other Datetimes for',
684
+								__FILE__,
685
+								__LINE__
686
+							);
687
+						}
688
+						foreach ($this->ticket_datetimes[ $datetime_ticket ] as $datetime) {
689
+							// don't adjust the current datetime twice
690
+							if ($datetime !== $datetime_identifier) {
691
+								$this->adjustDatetimeSpaces(
692
+									$datetime,
693
+									$datetime_ticket,
694
+									$ticket_quantity
695
+								);
696
+							}
697
+						}
698
+					}
699
+				}
700
+			}
701
+		}
702
+	}
703
+
704
+	private function adjustDatetimeSpaces($datetime_identifier, $ticket_identifier, $ticket_quantity = 0)
705
+	{
706
+		// does datetime have spaces available?
707
+		// and does the supplied ticket have access to this datetime ?
708
+		if ($this->datetime_spaces[ $datetime_identifier ] > 0
709
+			&& isset($this->datetime_spaces[ $datetime_identifier ], $this->datetime_tickets[ $datetime_identifier ])
710
+			&& in_array($ticket_identifier, $this->datetime_tickets[ $datetime_identifier ], true)
711
+		) {
712
+			if ($this->debug) {
713
+				\EEH_Debug_Tools::printr($datetime_identifier, ' . . adjust Datetime Spaces for', __FILE__, __LINE__);
714
+				\EEH_Debug_Tools::printr(
715
+					"{$this->datetime_spaces[ $datetime_identifier ]}",
716
+					" . . current  {$datetime_identifier} spaces available",
717
+					__FILE__,
718
+					__LINE__
719
+				);
720
+			}
721
+			// then decrement the available spaces for the datetime
722
+			$this->datetime_spaces[ $datetime_identifier ] -= $ticket_quantity;
723
+			// but don't let quantities go below zero
724
+			$this->datetime_spaces[ $datetime_identifier ] = max(
725
+				$this->datetime_spaces[ $datetime_identifier ],
726
+				0
727
+			);
728
+			if ($this->debug) {
729
+				\EEH_Debug_Tools::printr(
730
+					"{$ticket_quantity}",
731
+					" . . . {$datetime_identifier} capacity reduced by",
732
+					__FILE__,
733
+					__LINE__
734
+				);
735
+			}
736
+			return true;
737
+		}
738
+		return false;
739
+	}
740 740
 }
Please login to merge, or discard this patch.
form_sections/strategies/display/EE_Number_Input_Display_Strategy.php 2 patches
Doc Comments   +3 added lines patch added patch discarded remove patch
@@ -64,6 +64,9 @@
 block discarded – undo
64 64
     }
65 65
 
66 66
 
67
+    /**
68
+     * @param string $argument_label
69
+     */
67 70
     private function throwValidationException($argument_label, $argument_value)
68 71
     {
69 72
         throw new InvalidArgumentException(
Please login to merge, or discard this patch.
Indentation   +93 added lines, -93 removed lines patch added patch discarded remove patch
@@ -11,109 +11,109 @@
 block discarded – undo
11 11
 class EE_Number_Input_Display_Strategy extends EE_Display_Strategy_Base
12 12
 {
13 13
 
14
-    /**
15
-     * minimum value for number field
16
-     *
17
-     * @var int|null $min
18
-     */
19
-    protected $min;
14
+	/**
15
+	 * minimum value for number field
16
+	 *
17
+	 * @var int|null $min
18
+	 */
19
+	protected $min;
20 20
 
21
-    /**
22
-     * maximum value for number field
23
-     *
24
-     * @var int|null $max
25
-     */
26
-    protected $max;
21
+	/**
22
+	 * maximum value for number field
23
+	 *
24
+	 * @var int|null $max
25
+	 */
26
+	protected $max;
27 27
 
28 28
 
29
-    /**
30
-     * This is used to set the "step" attribute for the html5 number input.
31
-     * Controls the increments on the input when incrementing or decrementing the value.
32
-     * Note:  Although the step attribute allows for the string "any" to be used, Firefox and Chrome will interpret that
33
-     * to increment by 1.  So although "any" is accepted as a value, it is converted to 1.
34
-     * @var float
35
-     */
36
-    protected $step;
29
+	/**
30
+	 * This is used to set the "step" attribute for the html5 number input.
31
+	 * Controls the increments on the input when incrementing or decrementing the value.
32
+	 * Note:  Although the step attribute allows for the string "any" to be used, Firefox and Chrome will interpret that
33
+	 * to increment by 1.  So although "any" is accepted as a value, it is converted to 1.
34
+	 * @var float
35
+	 */
36
+	protected $step;
37 37
 
38 38
 
39
-    /**
40
-     * EE_Number_Input_Display_Strategy constructor.
41
-     * Null is the default value for the incoming arguments because 0 is a valid value.  So we use null
42
-     * to indicate NOT setting this attribute.
43
-     *
44
-     * @param int|null $min
45
-     * @param int|null $max
46
-     * @param int|null $step
47
-     * @throws InvalidArgumentException
48
-     */
49
-    public function __construct($min = null, $max = null, $step = null)
50
-    {
51
-        $this->min = is_numeric($min) || $min === null
52
-            ? $min
53
-            : $this->throwValidationException('min', $min);
54
-        $this->max = is_numeric($max) || $max === null
55
-            ? $max
56
-            : $this->throwValidationException('max', $max);
57
-        $step = $step === 'any' ? 1 : $step;
58
-        $this->step = is_numeric($step) || $step === null
59
-            ? $step
60
-            : $this->throwValidationException('step', $step);
61
-    }
39
+	/**
40
+	 * EE_Number_Input_Display_Strategy constructor.
41
+	 * Null is the default value for the incoming arguments because 0 is a valid value.  So we use null
42
+	 * to indicate NOT setting this attribute.
43
+	 *
44
+	 * @param int|null $min
45
+	 * @param int|null $max
46
+	 * @param int|null $step
47
+	 * @throws InvalidArgumentException
48
+	 */
49
+	public function __construct($min = null, $max = null, $step = null)
50
+	{
51
+		$this->min = is_numeric($min) || $min === null
52
+			? $min
53
+			: $this->throwValidationException('min', $min);
54
+		$this->max = is_numeric($max) || $max === null
55
+			? $max
56
+			: $this->throwValidationException('max', $max);
57
+		$step = $step === 'any' ? 1 : $step;
58
+		$this->step = is_numeric($step) || $step === null
59
+			? $step
60
+			: $this->throwValidationException('step', $step);
61
+	}
62 62
 
63 63
 
64
-    private function throwValidationException($argument_label, $argument_value)
65
-    {
66
-        throw new InvalidArgumentException(
67
-            sprintf(
68
-                esc_html__(
69
-                    'The %1$s parameter value for %2$s must be numeric or null, %3$s was passed into the constructor.',
70
-                    'event_espresso'
71
-                ),
72
-                $argument_label,
73
-                __CLASS__,
74
-                $argument_value
75
-            )
76
-        );
77
-    }
64
+	private function throwValidationException($argument_label, $argument_value)
65
+	{
66
+		throw new InvalidArgumentException(
67
+			sprintf(
68
+				esc_html__(
69
+					'The %1$s parameter value for %2$s must be numeric or null, %3$s was passed into the constructor.',
70
+					'event_espresso'
71
+				),
72
+				$argument_label,
73
+				__CLASS__,
74
+				$argument_value
75
+			)
76
+		);
77
+	}
78 78
 
79 79
 
80 80
 
81
-    /**
82
-     * @return string of html to display the field
83
-     */
84
-    public function display()
85
-    {
86
-        $input = $this->_opening_tag('input');
87
-        $input .= $this->_attributes_string(
88
-            array_merge(
89
-                $this->_standard_attributes_array(),
90
-                $this->getNumberInputAttributes()
91
-            )
92
-        );
93
-        $input .= $this->_close_tag();
94
-        return $input;
95
-    }
81
+	/**
82
+	 * @return string of html to display the field
83
+	 */
84
+	public function display()
85
+	{
86
+		$input = $this->_opening_tag('input');
87
+		$input .= $this->_attributes_string(
88
+			array_merge(
89
+				$this->_standard_attributes_array(),
90
+				$this->getNumberInputAttributes()
91
+			)
92
+		);
93
+		$input .= $this->_close_tag();
94
+		return $input;
95
+	}
96 96
 
97 97
 
98
-    /**
99
-     * Return the attributes specific to this display strategy
100
-     * @return array
101
-     */
102
-    private function getNumberInputAttributes()
103
-    {
104
-        $attributes = array(
105
-            'type' => 'number',
106
-            'value' => $this->_input->raw_value_in_form()
107
-        );
108
-        if ($this->min !== null) {
109
-            $attributes['min'] = $this->min;
110
-        }
111
-        if ($this->max !== null) {
112
-            $attributes['max'] = $this->max;
113
-        }
114
-        if ($this->step !== null) {
115
-            $attributes['step'] = $this->step;
116
-        }
117
-        return $attributes;
118
-    }
98
+	/**
99
+	 * Return the attributes specific to this display strategy
100
+	 * @return array
101
+	 */
102
+	private function getNumberInputAttributes()
103
+	{
104
+		$attributes = array(
105
+			'type' => 'number',
106
+			'value' => $this->_input->raw_value_in_form()
107
+		);
108
+		if ($this->min !== null) {
109
+			$attributes['min'] = $this->min;
110
+		}
111
+		if ($this->max !== null) {
112
+			$attributes['max'] = $this->max;
113
+		}
114
+		if ($this->step !== null) {
115
+			$attributes['step'] = $this->step;
116
+		}
117
+		return $attributes;
118
+	}
119 119
 }
Please login to merge, or discard this patch.
core/libraries/form_sections/inputs/EE_Float_Input.input.php 1 patch
Indentation   +29 added lines, -29 removed lines patch added patch discarded remove patch
@@ -11,33 +11,33 @@
 block discarded – undo
11 11
 class EE_Float_Input extends EE_Form_Input_Base
12 12
 {
13 13
 
14
-    /**
15
-     * @param array $input_settings
16
-     * @throws InvalidArgumentException
17
-     */
18
-    public function __construct($input_settings = array())
19
-    {
20
-        $this->_set_display_strategy(
21
-            new EE_Number_Input_Display_Strategy(
22
-                isset($input_settings['min_value'])
23
-                    ? $input_settings['min_value']
24
-                    : null,
25
-                isset($input_settings['max_value'])
26
-                    ? $input_settings['max_value']
27
-                    : null,
28
-                isset($input_settings['step_value'])
29
-                    ? $input_settings['step_value']
30
-                    : null
31
-            )
32
-        );
33
-        $this->_set_normalization_strategy(new EE_Float_Normalization());
34
-        $this->_add_validation_strategy(
35
-            new EE_Float_Validation_Strategy(
36
-                isset($input_settings['validation_error_message'])
37
-                    ? $input_settings['validation_error_message']
38
-                    : null
39
-            )
40
-        );
41
-        parent::__construct($input_settings);
42
-    }
14
+	/**
15
+	 * @param array $input_settings
16
+	 * @throws InvalidArgumentException
17
+	 */
18
+	public function __construct($input_settings = array())
19
+	{
20
+		$this->_set_display_strategy(
21
+			new EE_Number_Input_Display_Strategy(
22
+				isset($input_settings['min_value'])
23
+					? $input_settings['min_value']
24
+					: null,
25
+				isset($input_settings['max_value'])
26
+					? $input_settings['max_value']
27
+					: null,
28
+				isset($input_settings['step_value'])
29
+					? $input_settings['step_value']
30
+					: null
31
+			)
32
+		);
33
+		$this->_set_normalization_strategy(new EE_Float_Normalization());
34
+		$this->_add_validation_strategy(
35
+			new EE_Float_Validation_Strategy(
36
+				isset($input_settings['validation_error_message'])
37
+					? $input_settings['validation_error_message']
38
+					: null
39
+			)
40
+		);
41
+		parent::__construct($input_settings);
42
+	}
43 43
 }
Please login to merge, or discard this patch.
admin_pages/events/Events_Admin_List_Table.class.php 3 patches
Doc Comments   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -152,7 +152,7 @@
 block discarded – undo
152 152
 
153 153
     /**
154 154
      * @param EE_Event $item
155
-     * @return mixed|string
155
+     * @return string
156 156
      * @throws EE_Error
157 157
      */
158 158
     public function column_id(EE_Event $item)
Please login to merge, or discard this patch.
Spacing   +29 added lines, -29 removed lines patch added patch discarded remove patch
@@ -112,7 +112,7 @@  discard block
 block discarded – undo
112 112
         $class = parent::_get_row_class($item);
113 113
         // add status class
114 114
         $class .= $item instanceof EE_Event
115
-            ? ' ee-status-strip event-status-' . $item->get_active_status()
115
+            ? ' ee-status-strip event-status-'.$item->get_active_status()
116 116
             : '';
117 117
         if ($this->_has_checkbox_column) {
118 118
             $class .= ' has-checkbox-column';
@@ -141,7 +141,7 @@  discard block
 block discarded – undo
141 141
      */
142 142
     public function column_cb($item)
143 143
     {
144
-        if (! $item instanceof EE_Event) {
144
+        if ( ! $item instanceof EE_Event) {
145 145
             return '';
146 146
         }
147 147
         $this->_dtt = $item->primary_datetime(); // set this for use in other columns
@@ -164,7 +164,7 @@  discard block
 block discarded – undo
164 164
     public function column_id(EE_Event $item)
165 165
     {
166 166
         $content = $item->ID();
167
-        $content .= '  <span class="show-on-mobile-view-only">' . $item->name() . '</span>';
167
+        $content .= '  <span class="show-on-mobile-view-only">'.$item->name().'</span>';
168 168
         return $content;
169 169
     }
170 170
 
@@ -187,7 +187,7 @@  discard block
 block discarded – undo
187 187
         $actions = $this->_column_name_action_setup($item);
188 188
         $status = ''; // $item->status() !== 'publish' ? ' (' . $item->status() . ')' : '';
189 189
         $content = '<strong><a class="row-title" href="'
190
-                   . $edit_link . '">'
190
+                   . $edit_link.'">'
191 191
                    . $item->name()
192 192
                    . '</a></strong>'
193 193
                    . $status;
@@ -216,7 +216,7 @@  discard block
 block discarded – undo
216 216
     protected function _column_name_action_setup(EE_Event $item)
217 217
     {
218 218
         // todo: remove when attendees is active
219
-        if (! defined('REG_ADMIN_URL')) {
219
+        if ( ! defined('REG_ADMIN_URL')) {
220 220
             define('REG_ADMIN_URL', EVENTS_ADMIN_URL);
221 221
         }
222 222
         $actions = array();
@@ -233,8 +233,8 @@  discard block
 block discarded – undo
233 233
                 'post'   => $item->ID(),
234 234
             );
235 235
             $edit_link = EE_Admin_Page::add_query_args_and_nonce($edit_query_args, EVENTS_ADMIN_URL);
236
-            $actions['edit'] = '<a href="' . $edit_link . '"'
237
-                               . ' title="' . esc_attr__('Edit Event', 'event_espresso') . '">'
236
+            $actions['edit'] = '<a href="'.$edit_link.'"'
237
+                               . ' title="'.esc_attr__('Edit Event', 'event_espresso').'">'
238 238
                                . esc_html__('Edit', 'event_espresso')
239 239
                                . '</a>';
240 240
         }
@@ -253,8 +253,8 @@  discard block
 block discarded – undo
253 253
                 'event_id' => $item->ID(),
254 254
             );
255 255
             $attendees_link = EE_Admin_Page::add_query_args_and_nonce($attendees_query_args, REG_ADMIN_URL);
256
-            $actions['attendees'] = '<a href="' . $attendees_link . '"'
257
-                                    . ' title="' . esc_attr__('View Registrations', 'event_espresso') . '">'
256
+            $actions['attendees'] = '<a href="'.$attendees_link.'"'
257
+                                    . ' title="'.esc_attr__('View Registrations', 'event_espresso').'">'
258 258
                                     . esc_html__('Registrations', 'event_espresso')
259 259
                                     . '</a>';
260 260
         }
@@ -301,8 +301,8 @@  discard block
 block discarded – undo
301 301
             );
302 302
         }
303 303
         $view_link = get_permalink($item->ID());
304
-        $actions['view'] = '<a href="' . $view_link . '"'
305
-                           . ' title="' . esc_attr__('View Event', 'event_espresso') . '">'
304
+        $actions['view'] = '<a href="'.$view_link.'"'
305
+                           . ' title="'.esc_attr__('View Event', 'event_espresso').'">'
306 306
                            . esc_html__('View', 'event_espresso')
307 307
                            . '</a>';
308 308
         if ($item->get('status') === 'trash') {
@@ -311,8 +311,8 @@  discard block
 block discarded – undo
311 311
                 'espresso_events_restore_event',
312 312
                 $item->ID()
313 313
             )) {
314
-                $actions['restore_from_trash'] = '<a href="' . $restore_event_link . '"'
315
-                                                 . ' title="' . esc_attr__('Restore from Trash', 'event_espresso')
314
+                $actions['restore_from_trash'] = '<a href="'.$restore_event_link.'"'
315
+                                                 . ' title="'.esc_attr__('Restore from Trash', 'event_espresso')
316 316
                                                  . '">'
317 317
                                                  . esc_html__('Restore from Trash', 'event_espresso')
318 318
                                                  . '</a>';
@@ -324,8 +324,8 @@  discard block
 block discarded – undo
324 324
                     $item->ID()
325 325
                 )
326 326
             ) {
327
-                $actions['delete'] = '<a href="' . $delete_event_link . '"'
328
-                                     . ' title="' . esc_attr__('Delete Permanently', 'event_espresso') . '">'
327
+                $actions['delete'] = '<a href="'.$delete_event_link.'"'
328
+                                     . ' title="'.esc_attr__('Delete Permanently', 'event_espresso').'">'
329 329
                                      . esc_html__('Delete Permanently', 'event_espresso')
330 330
                                      . '</a>';
331 331
             }
@@ -335,8 +335,8 @@  discard block
 block discarded – undo
335 335
                 'espresso_events_trash_event',
336 336
                 $item->ID()
337 337
             )) {
338
-                $actions['move to trash'] = '<a href="' . $trash_event_link . '"'
339
-                                            . ' title="' . esc_attr__('Trash Event', 'event_espresso') . '">'
338
+                $actions['move to trash'] = '<a href="'.$trash_event_link.'"'
339
+                                            . ' title="'.esc_attr__('Trash Event', 'event_espresso').'">'
340 340
                                             . esc_html__('Trash', 'event_espresso')
341 341
                                             . '</a>';
342 342
             }
@@ -361,8 +361,8 @@  discard block
 block discarded – undo
361 361
             'EVT_wp_user' => $item->wp_user(),
362 362
         );
363 363
         $filter_url = EE_Admin_Page::add_query_args_and_nonce($query_args, EVENTS_ADMIN_URL);
364
-        return $gravatar . '  <a href="' . $filter_url . '"'
365
-               . ' title="' . esc_attr__('Click to filter events by this author.', 'event_espresso') . '">'
364
+        return $gravatar.'  <a href="'.$filter_url.'"'
365
+               . ' title="'.esc_attr__('Click to filter events by this author.', 'event_espresso').'">'
366 366
                . $event_author->display_name
367 367
                . '</a>';
368 368
     }
@@ -379,7 +379,7 @@  discard block
 block discarded – undo
379 379
         return implode(
380 380
             ', ',
381 381
             array_map(
382
-                function (EE_Term $category) {
382
+                function(EE_Term $category) {
383 383
                     return $category->name();
384 384
                 },
385 385
                 $event_categories
@@ -454,7 +454,7 @@  discard block
 block discarded – undo
454 454
                    'ee_read_registrations',
455 455
                    'espresso_registrations_view_registration'
456 456
                )
457
-            ? '<a href="' . $attendees_link . '">' . $registered_attendees . '</a>'
457
+            ? '<a href="'.$attendees_link.'">'.$registered_attendees.'</a>'
458 458
             : $registered_attendees;
459 459
     }
460 460
 
@@ -484,13 +484,13 @@  discard block
 block discarded – undo
484 484
     public function column_actions(EE_Event $item)
485 485
     {
486 486
         // todo: remove when attendees is active
487
-        if (! defined('REG_ADMIN_URL')) {
487
+        if ( ! defined('REG_ADMIN_URL')) {
488 488
             define('REG_ADMIN_URL', EVENTS_ADMIN_URL);
489 489
         }
490 490
         $action_links = array();
491 491
         $view_link = get_permalink($item->ID());
492
-        $action_links[] = '<a href="' . $view_link . '"'
493
-                          . ' title="' . esc_attr__('View Event', 'event_espresso') . '" target="_blank">';
492
+        $action_links[] = '<a href="'.$view_link.'"'
493
+                          . ' title="'.esc_attr__('View Event', 'event_espresso').'" target="_blank">';
494 494
         $action_links[] = '<div class="dashicons dashicons-search"></div></a>';
495 495
         if (EE_Registry::instance()->CAP->current_user_can(
496 496
             'ee_edit_event',
@@ -502,8 +502,8 @@  discard block
 block discarded – undo
502 502
                 'post'   => $item->ID(),
503 503
             );
504 504
             $edit_link = EE_Admin_Page::add_query_args_and_nonce($edit_query_args, EVENTS_ADMIN_URL);
505
-            $action_links[] = '<a href="' . $edit_link . '"'
506
-                              . ' title="' . esc_attr__('Edit Event', 'event_espresso') . '">'
505
+            $action_links[] = '<a href="'.$edit_link.'"'
506
+                              . ' title="'.esc_attr__('Edit Event', 'event_espresso').'">'
507 507
                               . '<div class="ee-icon ee-icon-calendar-edit"></div>'
508 508
                               . '</a>';
509 509
         }
@@ -521,8 +521,8 @@  discard block
 block discarded – undo
521 521
                 'event_id' => $item->ID(),
522 522
             );
523 523
             $attendees_link = EE_Admin_Page::add_query_args_and_nonce($attendees_query_args, REG_ADMIN_URL);
524
-            $action_links[] = '<a href="' . $attendees_link . '"'
525
-                              . ' title="' . esc_attr__('View Registrants', 'event_espresso') . '">'
524
+            $action_links[] = '<a href="'.$attendees_link.'"'
525
+                              . ' title="'.esc_attr__('View Registrants', 'event_espresso').'">'
526 526
                               . '<div class="dashicons dashicons-groups"></div>'
527 527
                               . '</a>';
528 528
         }
@@ -557,7 +557,7 @@  discard block
 block discarded – undo
557 557
         }
558 558
         $column_array = [];
559 559
         foreach ($this->_columns as $column => $column_label) {
560
-            $column_array[ $column ] = $column_label;
560
+            $column_array[$column] = $column_label;
561 561
             if ($column === 'venue') {
562 562
                 $column_array['event_category'] = esc_html__('Event Category', 'event_espresso');
563 563
             }
Please login to merge, or discard this patch.
Indentation   +549 added lines, -549 removed lines patch added patch discarded remove patch
@@ -15,553 +15,553 @@
 block discarded – undo
15 15
 class Events_Admin_List_Table extends EE_Admin_List_Table
16 16
 {
17 17
 
18
-    /**
19
-     * @var EE_Datetime
20
-     */
21
-    private $_dtt;
22
-
23
-
24
-    /**
25
-     * Initial setup of data properties for the list table.
26
-     */
27
-    protected function _setup_data()
28
-    {
29
-        $this->_data = $this->_admin_page->get_events($this->_per_page, $this->_current_page);
30
-        $this->_all_data_count = $this->_admin_page->get_events(0, 0, true);
31
-    }
32
-
33
-
34
-    /**
35
-     * Set up of additional properties for the list table.
36
-     */
37
-    protected function _set_properties()
38
-    {
39
-        $this->_wp_list_args = array(
40
-            'singular' => esc_html__('event', 'event_espresso'),
41
-            'plural'   => esc_html__('events', 'event_espresso'),
42
-            'ajax'     => true, // for now
43
-            'screen'   => $this->_admin_page->get_current_screen()->id,
44
-        );
45
-        $this->_columns = array(
46
-            'cb'              => '<input type="checkbox" />',
47
-            'id'              => esc_html__('ID', 'event_espresso'),
48
-            'name'            => esc_html__('Name', 'event_espresso'),
49
-            'author'          => esc_html__('Author', 'event_espresso'),
50
-            'venue'           => esc_html__('Venue', 'event_espresso'),
51
-            'start_date_time' => esc_html__('Event Start', 'event_espresso'),
52
-            'reg_begins'      => esc_html__('On Sale', 'event_espresso'),
53
-            'attendees'       => '<span class="dashicons dashicons-groups ee-icon-color-ee-green ee-icon-size-20">'
54
-                                 . '<span class="screen-reader-text">'
55
-                                 . esc_html__('Approved Registrations', 'event_espresso')
56
-                                 . '</span>'
57
-                                 . '</span>',
58
-            // 'tkts_sold' => esc_html__('Tickets Sold', 'event_espresso'),
59
-            'actions'         => esc_html__('Actions', 'event_espresso'),
60
-        );
61
-        $this->addConditionalColumns();
62
-        $this->_sortable_columns = array(
63
-            'id'              => array('EVT_ID' => true),
64
-            'name'            => array('EVT_name' => false),
65
-            'author'          => array('EVT_wp_user' => false),
66
-            'venue'           => array('Venue.VNU_name' => false),
67
-            'start_date_time' => array('Datetime.DTT_EVT_start' => false),
68
-            'reg_begins'      => array('Datetime.Ticket.TKT_start_date' => false),
69
-        );
70
-
71
-        $this->_primary_column = 'id';
72
-        $this->_hidden_columns = array('author', 'event_category');
73
-    }
74
-
75
-
76
-    /**
77
-     * @return array
78
-     */
79
-    protected function _get_table_filters()
80
-    {
81
-        return array(); // no filters with decaf
82
-    }
83
-
84
-
85
-    /**
86
-     * Setup of views properties.
87
-     *
88
-     * @throws InvalidDataTypeException
89
-     * @throws InvalidInterfaceException
90
-     * @throws InvalidArgumentException
91
-     */
92
-    protected function _add_view_counts()
93
-    {
94
-        $this->_views['all']['count'] = $this->_admin_page->total_events();
95
-        $this->_views['draft']['count'] = $this->_admin_page->total_events_draft();
96
-        if (EE_Registry::instance()->CAP->current_user_can(
97
-            'ee_delete_events',
98
-            'espresso_events_trash_events'
99
-        )) {
100
-            $this->_views['trash']['count'] = $this->_admin_page->total_trashed_events();
101
-        }
102
-    }
103
-
104
-
105
-    /**
106
-     * @param EE_Event $item
107
-     * @return string
108
-     * @throws EE_Error
109
-     */
110
-    protected function _get_row_class($item)
111
-    {
112
-        $class = parent::_get_row_class($item);
113
-        // add status class
114
-        $class .= $item instanceof EE_Event
115
-            ? ' ee-status-strip event-status-' . $item->get_active_status()
116
-            : '';
117
-        if ($this->_has_checkbox_column) {
118
-            $class .= ' has-checkbox-column';
119
-        }
120
-        return $class;
121
-    }
122
-
123
-
124
-    /**
125
-     * @param EE_Event $item
126
-     * @return string
127
-     * @throws EE_Error
128
-     */
129
-    public function column_status(EE_Event $item)
130
-    {
131
-        return '<span class="ee-status-strip ee-status-strip-td event-status-'
132
-               . $item->get_active_status()
133
-               . '"></span>';
134
-    }
135
-
136
-
137
-    /**
138
-     * @param  EE_Event $item
139
-     * @return string
140
-     * @throws EE_Error
141
-     */
142
-    public function column_cb($item)
143
-    {
144
-        if (! $item instanceof EE_Event) {
145
-            return '';
146
-        }
147
-        $this->_dtt = $item->primary_datetime(); // set this for use in other columns
148
-        // does event have any attached registrations?
149
-        $regs = $item->count_related('Registration');
150
-        return $regs > 0 && $this->_view === 'trash'
151
-            ? '<span class="ee-lock-icon"></span>'
152
-            : sprintf(
153
-                '<input type="checkbox" name="EVT_IDs[]" value="%s" />',
154
-                $item->ID()
155
-            );
156
-    }
157
-
158
-
159
-    /**
160
-     * @param EE_Event $item
161
-     * @return mixed|string
162
-     * @throws EE_Error
163
-     */
164
-    public function column_id(EE_Event $item)
165
-    {
166
-        $content = $item->ID();
167
-        $content .= '  <span class="show-on-mobile-view-only">' . $item->name() . '</span>';
168
-        return $content;
169
-    }
170
-
171
-
172
-    /**
173
-     * @param EE_Event $item
174
-     * @return string
175
-     * @throws EE_Error
176
-     * @throws InvalidArgumentException
177
-     * @throws InvalidDataTypeException
178
-     * @throws InvalidInterfaceException
179
-     */
180
-    public function column_name(EE_Event $item)
181
-    {
182
-        $edit_query_args = array(
183
-            'action' => 'edit',
184
-            'post'   => $item->ID(),
185
-        );
186
-        $edit_link = EE_Admin_Page::add_query_args_and_nonce($edit_query_args, EVENTS_ADMIN_URL);
187
-        $actions = $this->_column_name_action_setup($item);
188
-        $status = ''; // $item->status() !== 'publish' ? ' (' . $item->status() . ')' : '';
189
-        $content = '<strong><a class="row-title" href="'
190
-                   . $edit_link . '">'
191
-                   . $item->name()
192
-                   . '</a></strong>'
193
-                   . $status;
194
-        $content .= '<br><span class="ee-status-text-small">'
195
-                    . EEH_Template::pretty_status(
196
-                        $item->get_active_status(),
197
-                        false,
198
-                        'sentence'
199
-                    )
200
-                    . '</span>';
201
-        $content .= $this->row_actions($actions);
202
-        return $content;
203
-    }
204
-
205
-
206
-    /**
207
-     * Just a method for setting up the actions for the name column
208
-     *
209
-     * @param EE_Event $item
210
-     * @return array array of actions
211
-     * @throws EE_Error
212
-     * @throws InvalidArgumentException
213
-     * @throws InvalidDataTypeException
214
-     * @throws InvalidInterfaceException
215
-     */
216
-    protected function _column_name_action_setup(EE_Event $item)
217
-    {
218
-        // todo: remove when attendees is active
219
-        if (! defined('REG_ADMIN_URL')) {
220
-            define('REG_ADMIN_URL', EVENTS_ADMIN_URL);
221
-        }
222
-        $actions = array();
223
-        $restore_event_link = '';
224
-        $delete_event_link = '';
225
-        $trash_event_link = '';
226
-        if (EE_Registry::instance()->CAP->current_user_can(
227
-            'ee_edit_event',
228
-            'espresso_events_edit',
229
-            $item->ID()
230
-        )) {
231
-            $edit_query_args = array(
232
-                'action' => 'edit',
233
-                'post'   => $item->ID(),
234
-            );
235
-            $edit_link = EE_Admin_Page::add_query_args_and_nonce($edit_query_args, EVENTS_ADMIN_URL);
236
-            $actions['edit'] = '<a href="' . $edit_link . '"'
237
-                               . ' title="' . esc_attr__('Edit Event', 'event_espresso') . '">'
238
-                               . esc_html__('Edit', 'event_espresso')
239
-                               . '</a>';
240
-        }
241
-        if (EE_Registry::instance()->CAP->current_user_can(
242
-            'ee_read_registrations',
243
-            'espresso_registrations_view_registration'
244
-        )
245
-            && EE_Registry::instance()->CAP->current_user_can(
246
-                'ee_read_event',
247
-                'espresso_registrations_view_registration',
248
-                $item->ID()
249
-            )
250
-        ) {
251
-            $attendees_query_args = array(
252
-                'action'   => 'default',
253
-                'event_id' => $item->ID(),
254
-            );
255
-            $attendees_link = EE_Admin_Page::add_query_args_and_nonce($attendees_query_args, REG_ADMIN_URL);
256
-            $actions['attendees'] = '<a href="' . $attendees_link . '"'
257
-                                    . ' title="' . esc_attr__('View Registrations', 'event_espresso') . '">'
258
-                                    . esc_html__('Registrations', 'event_espresso')
259
-                                    . '</a>';
260
-        }
261
-        if (EE_Registry::instance()->CAP->current_user_can(
262
-            'ee_delete_event',
263
-            'espresso_events_trash_event',
264
-            $item->ID()
265
-        )) {
266
-            $trash_event_query_args = array(
267
-                'action' => 'trash_event',
268
-                'EVT_ID' => $item->ID(),
269
-            );
270
-            $trash_event_link = EE_Admin_Page::add_query_args_and_nonce(
271
-                $trash_event_query_args,
272
-                EVENTS_ADMIN_URL
273
-            );
274
-        }
275
-        if (EE_Registry::instance()->CAP->current_user_can(
276
-            'ee_delete_event',
277
-            'espresso_events_restore_event',
278
-            $item->ID()
279
-        )) {
280
-            $restore_event_query_args = array(
281
-                'action' => 'restore_event',
282
-                'EVT_ID' => $item->ID(),
283
-            );
284
-            $restore_event_link = EE_Admin_Page::add_query_args_and_nonce(
285
-                $restore_event_query_args,
286
-                EVENTS_ADMIN_URL
287
-            );
288
-        }
289
-        if (EE_Registry::instance()->CAP->current_user_can(
290
-            'ee_delete_event',
291
-            'espresso_events_delete_event',
292
-            $item->ID()
293
-        )) {
294
-            $delete_event_query_args = array(
295
-                'action' => 'delete_event',
296
-                'EVT_ID' => $item->ID(),
297
-            );
298
-            $delete_event_link = EE_Admin_Page::add_query_args_and_nonce(
299
-                $delete_event_query_args,
300
-                EVENTS_ADMIN_URL
301
-            );
302
-        }
303
-        $view_link = get_permalink($item->ID());
304
-        $actions['view'] = '<a href="' . $view_link . '"'
305
-                           . ' title="' . esc_attr__('View Event', 'event_espresso') . '">'
306
-                           . esc_html__('View', 'event_espresso')
307
-                           . '</a>';
308
-        if ($item->get('status') === 'trash') {
309
-            if (EE_Registry::instance()->CAP->current_user_can(
310
-                'ee_delete_event',
311
-                'espresso_events_restore_event',
312
-                $item->ID()
313
-            )) {
314
-                $actions['restore_from_trash'] = '<a href="' . $restore_event_link . '"'
315
-                                                 . ' title="' . esc_attr__('Restore from Trash', 'event_espresso')
316
-                                                 . '">'
317
-                                                 . esc_html__('Restore from Trash', 'event_espresso')
318
-                                                 . '</a>';
319
-            }
320
-            if ($item->count_related('Registration') === 0
321
-                && EE_Registry::instance()->CAP->current_user_can(
322
-                    'ee_delete_event',
323
-                    'espresso_events_delete_event',
324
-                    $item->ID()
325
-                )
326
-            ) {
327
-                $actions['delete'] = '<a href="' . $delete_event_link . '"'
328
-                                     . ' title="' . esc_attr__('Delete Permanently', 'event_espresso') . '">'
329
-                                     . esc_html__('Delete Permanently', 'event_espresso')
330
-                                     . '</a>';
331
-            }
332
-        } else {
333
-            if (EE_Registry::instance()->CAP->current_user_can(
334
-                'ee_delete_event',
335
-                'espresso_events_trash_event',
336
-                $item->ID()
337
-            )) {
338
-                $actions['move to trash'] = '<a href="' . $trash_event_link . '"'
339
-                                            . ' title="' . esc_attr__('Trash Event', 'event_espresso') . '">'
340
-                                            . esc_html__('Trash', 'event_espresso')
341
-                                            . '</a>';
342
-            }
343
-        }
344
-        return $actions;
345
-    }
346
-
347
-
348
-    /**
349
-     * @param EE_Event $item
350
-     * @return string
351
-     * @throws EE_Error
352
-     */
353
-    public function column_author(EE_Event $item)
354
-    {
355
-        // user author info
356
-        $event_author = get_userdata($item->wp_user());
357
-        $gravatar = get_avatar($item->wp_user(), '15');
358
-        // filter link
359
-        $query_args = array(
360
-            'action'      => 'default',
361
-            'EVT_wp_user' => $item->wp_user(),
362
-        );
363
-        $filter_url = EE_Admin_Page::add_query_args_and_nonce($query_args, EVENTS_ADMIN_URL);
364
-        return $gravatar . '  <a href="' . $filter_url . '"'
365
-               . ' title="' . esc_attr__('Click to filter events by this author.', 'event_espresso') . '">'
366
-               . $event_author->display_name
367
-               . '</a>';
368
-    }
369
-
370
-
371
-    /**
372
-     * @param EE_Event $event
373
-     * @return string
374
-     * @throws EE_Error
375
-     */
376
-    public function column_event_category(EE_Event $event)
377
-    {
378
-        $event_categories = $event->get_all_event_categories();
379
-        return implode(
380
-            ', ',
381
-            array_map(
382
-                function (EE_Term $category) {
383
-                    return $category->name();
384
-                },
385
-                $event_categories
386
-            )
387
-        );
388
-    }
389
-
390
-
391
-    /**
392
-     * @param EE_Event $item
393
-     * @return string
394
-     * @throws EE_Error
395
-     */
396
-    public function column_venue(EE_Event $item)
397
-    {
398
-        $venue = $item->get_first_related('Venue');
399
-        return ! empty($venue)
400
-            ? $venue->name()
401
-            : '';
402
-    }
403
-
404
-
405
-    /**
406
-     * @param EE_Event $item
407
-     * @return string
408
-     * @throws EE_Error
409
-     */
410
-    public function column_start_date_time(EE_Event $item)
411
-    {
412
-        return $this->_dtt instanceof EE_Datetime
413
-            ? $this->_dtt->get_i18n_datetime('DTT_EVT_start')
414
-            : esc_html__('No Date was saved for this Event', 'event_espresso');
415
-    }
416
-
417
-
418
-    /**
419
-     * @param EE_Event $item
420
-     * @return string
421
-     * @throws EE_Error
422
-     */
423
-    public function column_reg_begins(EE_Event $item)
424
-    {
425
-        $reg_start = $item->get_ticket_with_earliest_start_time();
426
-        return $reg_start instanceof EE_Ticket
427
-            ? $reg_start->get_i18n_datetime('TKT_start_date')
428
-            : esc_html__('No Tickets have been setup for this Event', 'event_espresso');
429
-    }
430
-
431
-
432
-    /**
433
-     * @param EE_Event $item
434
-     * @return int|string
435
-     * @throws EE_Error
436
-     * @throws InvalidArgumentException
437
-     * @throws InvalidDataTypeException
438
-     * @throws InvalidInterfaceException
439
-     */
440
-    public function column_attendees(EE_Event $item)
441
-    {
442
-        $attendees_query_args = array(
443
-            'action'   => 'default',
444
-            'event_id' => $item->ID(),
445
-        );
446
-        $attendees_link = EE_Admin_Page::add_query_args_and_nonce($attendees_query_args, REG_ADMIN_URL);
447
-        $registered_attendees = EEM_Registration::instance()->get_event_registration_count($item->ID());
448
-        return EE_Registry::instance()->CAP->current_user_can(
449
-            'ee_read_event',
450
-            'espresso_registrations_view_registration',
451
-            $item->ID()
452
-        )
453
-               && EE_Registry::instance()->CAP->current_user_can(
454
-                   'ee_read_registrations',
455
-                   'espresso_registrations_view_registration'
456
-               )
457
-            ? '<a href="' . $attendees_link . '">' . $registered_attendees . '</a>'
458
-            : $registered_attendees;
459
-    }
460
-
461
-
462
-    /**
463
-     * @param EE_Event $item
464
-     * @return float
465
-     * @throws EE_Error
466
-     * @throws InvalidArgumentException
467
-     * @throws InvalidDataTypeException
468
-     * @throws InvalidInterfaceException
469
-     */
470
-    public function column_tkts_sold(EE_Event $item)
471
-    {
472
-        return EEM_Ticket::instance()->sum(array(array('Datetime.EVT_ID' => $item->ID())), 'TKT_sold');
473
-    }
474
-
475
-
476
-    /**
477
-     * @param EE_Event $item
478
-     * @return string
479
-     * @throws EE_Error
480
-     * @throws InvalidArgumentException
481
-     * @throws InvalidDataTypeException
482
-     * @throws InvalidInterfaceException
483
-     */
484
-    public function column_actions(EE_Event $item)
485
-    {
486
-        // todo: remove when attendees is active
487
-        if (! defined('REG_ADMIN_URL')) {
488
-            define('REG_ADMIN_URL', EVENTS_ADMIN_URL);
489
-        }
490
-        $action_links = array();
491
-        $view_link = get_permalink($item->ID());
492
-        $action_links[] = '<a href="' . $view_link . '"'
493
-                          . ' title="' . esc_attr__('View Event', 'event_espresso') . '" target="_blank">';
494
-        $action_links[] = '<div class="dashicons dashicons-search"></div></a>';
495
-        if (EE_Registry::instance()->CAP->current_user_can(
496
-            'ee_edit_event',
497
-            'espresso_events_edit',
498
-            $item->ID()
499
-        )) {
500
-            $edit_query_args = array(
501
-                'action' => 'edit',
502
-                'post'   => $item->ID(),
503
-            );
504
-            $edit_link = EE_Admin_Page::add_query_args_and_nonce($edit_query_args, EVENTS_ADMIN_URL);
505
-            $action_links[] = '<a href="' . $edit_link . '"'
506
-                              . ' title="' . esc_attr__('Edit Event', 'event_espresso') . '">'
507
-                              . '<div class="ee-icon ee-icon-calendar-edit"></div>'
508
-                              . '</a>';
509
-        }
510
-        if (EE_Registry::instance()->CAP->current_user_can(
511
-            'ee_read_registrations',
512
-            'espresso_registrations_view_registration'
513
-        ) && EE_Registry::instance()->CAP->current_user_can(
514
-            'ee_read_event',
515
-            'espresso_registrations_view_registration',
516
-            $item->ID()
517
-        )
518
-        ) {
519
-            $attendees_query_args = array(
520
-                'action'   => 'default',
521
-                'event_id' => $item->ID(),
522
-            );
523
-            $attendees_link = EE_Admin_Page::add_query_args_and_nonce($attendees_query_args, REG_ADMIN_URL);
524
-            $action_links[] = '<a href="' . $attendees_link . '"'
525
-                              . ' title="' . esc_attr__('View Registrants', 'event_espresso') . '">'
526
-                              . '<div class="dashicons dashicons-groups"></div>'
527
-                              . '</a>';
528
-        }
529
-        $action_links = apply_filters(
530
-            'FHEE__Events_Admin_List_Table__column_actions__action_links',
531
-            $action_links,
532
-            $item
533
-        );
534
-        return $this->_action_string(
535
-            implode("\n\t", $action_links),
536
-            $item,
537
-            'div'
538
-        );
539
-    }
540
-
541
-
542
-    /**
543
-     * Helper for adding columns conditionally
544
-     *
545
-     * @throws EE_Error
546
-     * @throws InvalidArgumentException
547
-     * @throws InvalidDataTypeException
548
-     * @throws InvalidInterfaceException
549
-     */
550
-    private function addConditionalColumns()
551
-    {
552
-        $event_category_count = EEM_Term::instance()->count(
553
-            [['Term_Taxonomy.taxonomy' => EEM_CPT_Base::EVENT_CATEGORY_TAXONOMY]]
554
-        );
555
-        if ($event_category_count === 0) {
556
-            return;
557
-        }
558
-        $column_array = [];
559
-        foreach ($this->_columns as $column => $column_label) {
560
-            $column_array[ $column ] = $column_label;
561
-            if ($column === 'venue') {
562
-                $column_array['event_category'] = esc_html__('Event Category', 'event_espresso');
563
-            }
564
-        }
565
-        $this->_columns = $column_array;
566
-    }
18
+	/**
19
+	 * @var EE_Datetime
20
+	 */
21
+	private $_dtt;
22
+
23
+
24
+	/**
25
+	 * Initial setup of data properties for the list table.
26
+	 */
27
+	protected function _setup_data()
28
+	{
29
+		$this->_data = $this->_admin_page->get_events($this->_per_page, $this->_current_page);
30
+		$this->_all_data_count = $this->_admin_page->get_events(0, 0, true);
31
+	}
32
+
33
+
34
+	/**
35
+	 * Set up of additional properties for the list table.
36
+	 */
37
+	protected function _set_properties()
38
+	{
39
+		$this->_wp_list_args = array(
40
+			'singular' => esc_html__('event', 'event_espresso'),
41
+			'plural'   => esc_html__('events', 'event_espresso'),
42
+			'ajax'     => true, // for now
43
+			'screen'   => $this->_admin_page->get_current_screen()->id,
44
+		);
45
+		$this->_columns = array(
46
+			'cb'              => '<input type="checkbox" />',
47
+			'id'              => esc_html__('ID', 'event_espresso'),
48
+			'name'            => esc_html__('Name', 'event_espresso'),
49
+			'author'          => esc_html__('Author', 'event_espresso'),
50
+			'venue'           => esc_html__('Venue', 'event_espresso'),
51
+			'start_date_time' => esc_html__('Event Start', 'event_espresso'),
52
+			'reg_begins'      => esc_html__('On Sale', 'event_espresso'),
53
+			'attendees'       => '<span class="dashicons dashicons-groups ee-icon-color-ee-green ee-icon-size-20">'
54
+								 . '<span class="screen-reader-text">'
55
+								 . esc_html__('Approved Registrations', 'event_espresso')
56
+								 . '</span>'
57
+								 . '</span>',
58
+			// 'tkts_sold' => esc_html__('Tickets Sold', 'event_espresso'),
59
+			'actions'         => esc_html__('Actions', 'event_espresso'),
60
+		);
61
+		$this->addConditionalColumns();
62
+		$this->_sortable_columns = array(
63
+			'id'              => array('EVT_ID' => true),
64
+			'name'            => array('EVT_name' => false),
65
+			'author'          => array('EVT_wp_user' => false),
66
+			'venue'           => array('Venue.VNU_name' => false),
67
+			'start_date_time' => array('Datetime.DTT_EVT_start' => false),
68
+			'reg_begins'      => array('Datetime.Ticket.TKT_start_date' => false),
69
+		);
70
+
71
+		$this->_primary_column = 'id';
72
+		$this->_hidden_columns = array('author', 'event_category');
73
+	}
74
+
75
+
76
+	/**
77
+	 * @return array
78
+	 */
79
+	protected function _get_table_filters()
80
+	{
81
+		return array(); // no filters with decaf
82
+	}
83
+
84
+
85
+	/**
86
+	 * Setup of views properties.
87
+	 *
88
+	 * @throws InvalidDataTypeException
89
+	 * @throws InvalidInterfaceException
90
+	 * @throws InvalidArgumentException
91
+	 */
92
+	protected function _add_view_counts()
93
+	{
94
+		$this->_views['all']['count'] = $this->_admin_page->total_events();
95
+		$this->_views['draft']['count'] = $this->_admin_page->total_events_draft();
96
+		if (EE_Registry::instance()->CAP->current_user_can(
97
+			'ee_delete_events',
98
+			'espresso_events_trash_events'
99
+		)) {
100
+			$this->_views['trash']['count'] = $this->_admin_page->total_trashed_events();
101
+		}
102
+	}
103
+
104
+
105
+	/**
106
+	 * @param EE_Event $item
107
+	 * @return string
108
+	 * @throws EE_Error
109
+	 */
110
+	protected function _get_row_class($item)
111
+	{
112
+		$class = parent::_get_row_class($item);
113
+		// add status class
114
+		$class .= $item instanceof EE_Event
115
+			? ' ee-status-strip event-status-' . $item->get_active_status()
116
+			: '';
117
+		if ($this->_has_checkbox_column) {
118
+			$class .= ' has-checkbox-column';
119
+		}
120
+		return $class;
121
+	}
122
+
123
+
124
+	/**
125
+	 * @param EE_Event $item
126
+	 * @return string
127
+	 * @throws EE_Error
128
+	 */
129
+	public function column_status(EE_Event $item)
130
+	{
131
+		return '<span class="ee-status-strip ee-status-strip-td event-status-'
132
+			   . $item->get_active_status()
133
+			   . '"></span>';
134
+	}
135
+
136
+
137
+	/**
138
+	 * @param  EE_Event $item
139
+	 * @return string
140
+	 * @throws EE_Error
141
+	 */
142
+	public function column_cb($item)
143
+	{
144
+		if (! $item instanceof EE_Event) {
145
+			return '';
146
+		}
147
+		$this->_dtt = $item->primary_datetime(); // set this for use in other columns
148
+		// does event have any attached registrations?
149
+		$regs = $item->count_related('Registration');
150
+		return $regs > 0 && $this->_view === 'trash'
151
+			? '<span class="ee-lock-icon"></span>'
152
+			: sprintf(
153
+				'<input type="checkbox" name="EVT_IDs[]" value="%s" />',
154
+				$item->ID()
155
+			);
156
+	}
157
+
158
+
159
+	/**
160
+	 * @param EE_Event $item
161
+	 * @return mixed|string
162
+	 * @throws EE_Error
163
+	 */
164
+	public function column_id(EE_Event $item)
165
+	{
166
+		$content = $item->ID();
167
+		$content .= '  <span class="show-on-mobile-view-only">' . $item->name() . '</span>';
168
+		return $content;
169
+	}
170
+
171
+
172
+	/**
173
+	 * @param EE_Event $item
174
+	 * @return string
175
+	 * @throws EE_Error
176
+	 * @throws InvalidArgumentException
177
+	 * @throws InvalidDataTypeException
178
+	 * @throws InvalidInterfaceException
179
+	 */
180
+	public function column_name(EE_Event $item)
181
+	{
182
+		$edit_query_args = array(
183
+			'action' => 'edit',
184
+			'post'   => $item->ID(),
185
+		);
186
+		$edit_link = EE_Admin_Page::add_query_args_and_nonce($edit_query_args, EVENTS_ADMIN_URL);
187
+		$actions = $this->_column_name_action_setup($item);
188
+		$status = ''; // $item->status() !== 'publish' ? ' (' . $item->status() . ')' : '';
189
+		$content = '<strong><a class="row-title" href="'
190
+				   . $edit_link . '">'
191
+				   . $item->name()
192
+				   . '</a></strong>'
193
+				   . $status;
194
+		$content .= '<br><span class="ee-status-text-small">'
195
+					. EEH_Template::pretty_status(
196
+						$item->get_active_status(),
197
+						false,
198
+						'sentence'
199
+					)
200
+					. '</span>';
201
+		$content .= $this->row_actions($actions);
202
+		return $content;
203
+	}
204
+
205
+
206
+	/**
207
+	 * Just a method for setting up the actions for the name column
208
+	 *
209
+	 * @param EE_Event $item
210
+	 * @return array array of actions
211
+	 * @throws EE_Error
212
+	 * @throws InvalidArgumentException
213
+	 * @throws InvalidDataTypeException
214
+	 * @throws InvalidInterfaceException
215
+	 */
216
+	protected function _column_name_action_setup(EE_Event $item)
217
+	{
218
+		// todo: remove when attendees is active
219
+		if (! defined('REG_ADMIN_URL')) {
220
+			define('REG_ADMIN_URL', EVENTS_ADMIN_URL);
221
+		}
222
+		$actions = array();
223
+		$restore_event_link = '';
224
+		$delete_event_link = '';
225
+		$trash_event_link = '';
226
+		if (EE_Registry::instance()->CAP->current_user_can(
227
+			'ee_edit_event',
228
+			'espresso_events_edit',
229
+			$item->ID()
230
+		)) {
231
+			$edit_query_args = array(
232
+				'action' => 'edit',
233
+				'post'   => $item->ID(),
234
+			);
235
+			$edit_link = EE_Admin_Page::add_query_args_and_nonce($edit_query_args, EVENTS_ADMIN_URL);
236
+			$actions['edit'] = '<a href="' . $edit_link . '"'
237
+							   . ' title="' . esc_attr__('Edit Event', 'event_espresso') . '">'
238
+							   . esc_html__('Edit', 'event_espresso')
239
+							   . '</a>';
240
+		}
241
+		if (EE_Registry::instance()->CAP->current_user_can(
242
+			'ee_read_registrations',
243
+			'espresso_registrations_view_registration'
244
+		)
245
+			&& EE_Registry::instance()->CAP->current_user_can(
246
+				'ee_read_event',
247
+				'espresso_registrations_view_registration',
248
+				$item->ID()
249
+			)
250
+		) {
251
+			$attendees_query_args = array(
252
+				'action'   => 'default',
253
+				'event_id' => $item->ID(),
254
+			);
255
+			$attendees_link = EE_Admin_Page::add_query_args_and_nonce($attendees_query_args, REG_ADMIN_URL);
256
+			$actions['attendees'] = '<a href="' . $attendees_link . '"'
257
+									. ' title="' . esc_attr__('View Registrations', 'event_espresso') . '">'
258
+									. esc_html__('Registrations', 'event_espresso')
259
+									. '</a>';
260
+		}
261
+		if (EE_Registry::instance()->CAP->current_user_can(
262
+			'ee_delete_event',
263
+			'espresso_events_trash_event',
264
+			$item->ID()
265
+		)) {
266
+			$trash_event_query_args = array(
267
+				'action' => 'trash_event',
268
+				'EVT_ID' => $item->ID(),
269
+			);
270
+			$trash_event_link = EE_Admin_Page::add_query_args_and_nonce(
271
+				$trash_event_query_args,
272
+				EVENTS_ADMIN_URL
273
+			);
274
+		}
275
+		if (EE_Registry::instance()->CAP->current_user_can(
276
+			'ee_delete_event',
277
+			'espresso_events_restore_event',
278
+			$item->ID()
279
+		)) {
280
+			$restore_event_query_args = array(
281
+				'action' => 'restore_event',
282
+				'EVT_ID' => $item->ID(),
283
+			);
284
+			$restore_event_link = EE_Admin_Page::add_query_args_and_nonce(
285
+				$restore_event_query_args,
286
+				EVENTS_ADMIN_URL
287
+			);
288
+		}
289
+		if (EE_Registry::instance()->CAP->current_user_can(
290
+			'ee_delete_event',
291
+			'espresso_events_delete_event',
292
+			$item->ID()
293
+		)) {
294
+			$delete_event_query_args = array(
295
+				'action' => 'delete_event',
296
+				'EVT_ID' => $item->ID(),
297
+			);
298
+			$delete_event_link = EE_Admin_Page::add_query_args_and_nonce(
299
+				$delete_event_query_args,
300
+				EVENTS_ADMIN_URL
301
+			);
302
+		}
303
+		$view_link = get_permalink($item->ID());
304
+		$actions['view'] = '<a href="' . $view_link . '"'
305
+						   . ' title="' . esc_attr__('View Event', 'event_espresso') . '">'
306
+						   . esc_html__('View', 'event_espresso')
307
+						   . '</a>';
308
+		if ($item->get('status') === 'trash') {
309
+			if (EE_Registry::instance()->CAP->current_user_can(
310
+				'ee_delete_event',
311
+				'espresso_events_restore_event',
312
+				$item->ID()
313
+			)) {
314
+				$actions['restore_from_trash'] = '<a href="' . $restore_event_link . '"'
315
+												 . ' title="' . esc_attr__('Restore from Trash', 'event_espresso')
316
+												 . '">'
317
+												 . esc_html__('Restore from Trash', 'event_espresso')
318
+												 . '</a>';
319
+			}
320
+			if ($item->count_related('Registration') === 0
321
+				&& EE_Registry::instance()->CAP->current_user_can(
322
+					'ee_delete_event',
323
+					'espresso_events_delete_event',
324
+					$item->ID()
325
+				)
326
+			) {
327
+				$actions['delete'] = '<a href="' . $delete_event_link . '"'
328
+									 . ' title="' . esc_attr__('Delete Permanently', 'event_espresso') . '">'
329
+									 . esc_html__('Delete Permanently', 'event_espresso')
330
+									 . '</a>';
331
+			}
332
+		} else {
333
+			if (EE_Registry::instance()->CAP->current_user_can(
334
+				'ee_delete_event',
335
+				'espresso_events_trash_event',
336
+				$item->ID()
337
+			)) {
338
+				$actions['move to trash'] = '<a href="' . $trash_event_link . '"'
339
+											. ' title="' . esc_attr__('Trash Event', 'event_espresso') . '">'
340
+											. esc_html__('Trash', 'event_espresso')
341
+											. '</a>';
342
+			}
343
+		}
344
+		return $actions;
345
+	}
346
+
347
+
348
+	/**
349
+	 * @param EE_Event $item
350
+	 * @return string
351
+	 * @throws EE_Error
352
+	 */
353
+	public function column_author(EE_Event $item)
354
+	{
355
+		// user author info
356
+		$event_author = get_userdata($item->wp_user());
357
+		$gravatar = get_avatar($item->wp_user(), '15');
358
+		// filter link
359
+		$query_args = array(
360
+			'action'      => 'default',
361
+			'EVT_wp_user' => $item->wp_user(),
362
+		);
363
+		$filter_url = EE_Admin_Page::add_query_args_and_nonce($query_args, EVENTS_ADMIN_URL);
364
+		return $gravatar . '  <a href="' . $filter_url . '"'
365
+			   . ' title="' . esc_attr__('Click to filter events by this author.', 'event_espresso') . '">'
366
+			   . $event_author->display_name
367
+			   . '</a>';
368
+	}
369
+
370
+
371
+	/**
372
+	 * @param EE_Event $event
373
+	 * @return string
374
+	 * @throws EE_Error
375
+	 */
376
+	public function column_event_category(EE_Event $event)
377
+	{
378
+		$event_categories = $event->get_all_event_categories();
379
+		return implode(
380
+			', ',
381
+			array_map(
382
+				function (EE_Term $category) {
383
+					return $category->name();
384
+				},
385
+				$event_categories
386
+			)
387
+		);
388
+	}
389
+
390
+
391
+	/**
392
+	 * @param EE_Event $item
393
+	 * @return string
394
+	 * @throws EE_Error
395
+	 */
396
+	public function column_venue(EE_Event $item)
397
+	{
398
+		$venue = $item->get_first_related('Venue');
399
+		return ! empty($venue)
400
+			? $venue->name()
401
+			: '';
402
+	}
403
+
404
+
405
+	/**
406
+	 * @param EE_Event $item
407
+	 * @return string
408
+	 * @throws EE_Error
409
+	 */
410
+	public function column_start_date_time(EE_Event $item)
411
+	{
412
+		return $this->_dtt instanceof EE_Datetime
413
+			? $this->_dtt->get_i18n_datetime('DTT_EVT_start')
414
+			: esc_html__('No Date was saved for this Event', 'event_espresso');
415
+	}
416
+
417
+
418
+	/**
419
+	 * @param EE_Event $item
420
+	 * @return string
421
+	 * @throws EE_Error
422
+	 */
423
+	public function column_reg_begins(EE_Event $item)
424
+	{
425
+		$reg_start = $item->get_ticket_with_earliest_start_time();
426
+		return $reg_start instanceof EE_Ticket
427
+			? $reg_start->get_i18n_datetime('TKT_start_date')
428
+			: esc_html__('No Tickets have been setup for this Event', 'event_espresso');
429
+	}
430
+
431
+
432
+	/**
433
+	 * @param EE_Event $item
434
+	 * @return int|string
435
+	 * @throws EE_Error
436
+	 * @throws InvalidArgumentException
437
+	 * @throws InvalidDataTypeException
438
+	 * @throws InvalidInterfaceException
439
+	 */
440
+	public function column_attendees(EE_Event $item)
441
+	{
442
+		$attendees_query_args = array(
443
+			'action'   => 'default',
444
+			'event_id' => $item->ID(),
445
+		);
446
+		$attendees_link = EE_Admin_Page::add_query_args_and_nonce($attendees_query_args, REG_ADMIN_URL);
447
+		$registered_attendees = EEM_Registration::instance()->get_event_registration_count($item->ID());
448
+		return EE_Registry::instance()->CAP->current_user_can(
449
+			'ee_read_event',
450
+			'espresso_registrations_view_registration',
451
+			$item->ID()
452
+		)
453
+			   && EE_Registry::instance()->CAP->current_user_can(
454
+				   'ee_read_registrations',
455
+				   'espresso_registrations_view_registration'
456
+			   )
457
+			? '<a href="' . $attendees_link . '">' . $registered_attendees . '</a>'
458
+			: $registered_attendees;
459
+	}
460
+
461
+
462
+	/**
463
+	 * @param EE_Event $item
464
+	 * @return float
465
+	 * @throws EE_Error
466
+	 * @throws InvalidArgumentException
467
+	 * @throws InvalidDataTypeException
468
+	 * @throws InvalidInterfaceException
469
+	 */
470
+	public function column_tkts_sold(EE_Event $item)
471
+	{
472
+		return EEM_Ticket::instance()->sum(array(array('Datetime.EVT_ID' => $item->ID())), 'TKT_sold');
473
+	}
474
+
475
+
476
+	/**
477
+	 * @param EE_Event $item
478
+	 * @return string
479
+	 * @throws EE_Error
480
+	 * @throws InvalidArgumentException
481
+	 * @throws InvalidDataTypeException
482
+	 * @throws InvalidInterfaceException
483
+	 */
484
+	public function column_actions(EE_Event $item)
485
+	{
486
+		// todo: remove when attendees is active
487
+		if (! defined('REG_ADMIN_URL')) {
488
+			define('REG_ADMIN_URL', EVENTS_ADMIN_URL);
489
+		}
490
+		$action_links = array();
491
+		$view_link = get_permalink($item->ID());
492
+		$action_links[] = '<a href="' . $view_link . '"'
493
+						  . ' title="' . esc_attr__('View Event', 'event_espresso') . '" target="_blank">';
494
+		$action_links[] = '<div class="dashicons dashicons-search"></div></a>';
495
+		if (EE_Registry::instance()->CAP->current_user_can(
496
+			'ee_edit_event',
497
+			'espresso_events_edit',
498
+			$item->ID()
499
+		)) {
500
+			$edit_query_args = array(
501
+				'action' => 'edit',
502
+				'post'   => $item->ID(),
503
+			);
504
+			$edit_link = EE_Admin_Page::add_query_args_and_nonce($edit_query_args, EVENTS_ADMIN_URL);
505
+			$action_links[] = '<a href="' . $edit_link . '"'
506
+							  . ' title="' . esc_attr__('Edit Event', 'event_espresso') . '">'
507
+							  . '<div class="ee-icon ee-icon-calendar-edit"></div>'
508
+							  . '</a>';
509
+		}
510
+		if (EE_Registry::instance()->CAP->current_user_can(
511
+			'ee_read_registrations',
512
+			'espresso_registrations_view_registration'
513
+		) && EE_Registry::instance()->CAP->current_user_can(
514
+			'ee_read_event',
515
+			'espresso_registrations_view_registration',
516
+			$item->ID()
517
+		)
518
+		) {
519
+			$attendees_query_args = array(
520
+				'action'   => 'default',
521
+				'event_id' => $item->ID(),
522
+			);
523
+			$attendees_link = EE_Admin_Page::add_query_args_and_nonce($attendees_query_args, REG_ADMIN_URL);
524
+			$action_links[] = '<a href="' . $attendees_link . '"'
525
+							  . ' title="' . esc_attr__('View Registrants', 'event_espresso') . '">'
526
+							  . '<div class="dashicons dashicons-groups"></div>'
527
+							  . '</a>';
528
+		}
529
+		$action_links = apply_filters(
530
+			'FHEE__Events_Admin_List_Table__column_actions__action_links',
531
+			$action_links,
532
+			$item
533
+		);
534
+		return $this->_action_string(
535
+			implode("\n\t", $action_links),
536
+			$item,
537
+			'div'
538
+		);
539
+	}
540
+
541
+
542
+	/**
543
+	 * Helper for adding columns conditionally
544
+	 *
545
+	 * @throws EE_Error
546
+	 * @throws InvalidArgumentException
547
+	 * @throws InvalidDataTypeException
548
+	 * @throws InvalidInterfaceException
549
+	 */
550
+	private function addConditionalColumns()
551
+	{
552
+		$event_category_count = EEM_Term::instance()->count(
553
+			[['Term_Taxonomy.taxonomy' => EEM_CPT_Base::EVENT_CATEGORY_TAXONOMY]]
554
+		);
555
+		if ($event_category_count === 0) {
556
+			return;
557
+		}
558
+		$column_array = [];
559
+		foreach ($this->_columns as $column => $column_label) {
560
+			$column_array[ $column ] = $column_label;
561
+			if ($column === 'venue') {
562
+				$column_array['event_category'] = esc_html__('Event Category', 'event_espresso');
563
+			}
564
+		}
565
+		$this->_columns = $column_array;
566
+	}
567 567
 }
Please login to merge, or discard this patch.
core/EE_Request_Handler.core.php 3 patches
Doc Comments   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -275,7 +275,7 @@  discard block
 block discarded – undo
275 275
 
276 276
 
277 277
     /**
278
-     * @param $string
278
+     * @param string $string
279 279
      * @return void
280 280
      */
281 281
     public function add_output($string)
@@ -327,7 +327,7 @@  discard block
 block discarded – undo
327 327
 
328 328
 
329 329
     /**
330
-     * @return    mixed
330
+     * @return    boolean
331 331
      */
332 332
     public function is_espresso_page()
333 333
     {
@@ -389,7 +389,7 @@  discard block
 block discarded – undo
389 389
     /**
390 390
      * remove param
391 391
      *
392
-     * @param $key
392
+     * @param string $key
393 393
      * @return    void
394 394
      */
395 395
     public function un_set($key)
Please login to merge, or discard this patch.
Indentation   +365 added lines, -365 removed lines patch added patch discarded remove patch
@@ -12,369 +12,369 @@
 block discarded – undo
12 12
 final class EE_Request_Handler implements InterminableInterface
13 13
 {
14 14
 
15
-    /**
16
-     * @var EE_Request $request
17
-     */
18
-    private $request;
19
-
20
-    /**
21
-     * @var array $_notice
22
-     */
23
-    private $_notice = array();
24
-
25
-    /**
26
-     * rendered output to be returned to WP
27
-     *
28
-     * @var string $_output
29
-     */
30
-    private $_output = '';
31
-
32
-    /**
33
-     * whether current request is via AJAX
34
-     *
35
-     * @var boolean $ajax
36
-     */
37
-    public $ajax = false;
38
-
39
-    /**
40
-     * whether current request is via AJAX from the frontend of the site
41
-     *
42
-     * @var boolean $front_ajax
43
-     */
44
-    public $front_ajax = false;
45
-
46
-
47
-    /**
48
-     * @param  EE_Request $request
49
-     */
50
-    public function __construct(EE_Request $request)
51
-    {
52
-        $this->request = $request;
53
-        $this->ajax = $this->request->ajax;
54
-        $this->front_ajax = $this->request->front_ajax;
55
-        do_action('AHEE__EE_Request_Handler__construct__complete');
56
-    }
57
-
58
-
59
-    /**
60
-     * @param WP $wp
61
-     * @return void
62
-     * @throws EE_Error
63
-     * @throws ReflectionException
64
-     */
65
-    public function parse_request($wp = null)
66
-    {
67
-        // if somebody forgot to provide us with WP, that's ok because its global
68
-        if (! $wp instanceof WP) {
69
-            global $wp;
70
-        }
71
-        $this->set_request_vars($wp);
72
-    }
73
-
74
-
75
-    /**
76
-     * @param WP $wp
77
-     * @return void
78
-     * @throws EE_Error
79
-     * @throws ReflectionException
80
-     */
81
-    public function set_request_vars($wp = null)
82
-    {
83
-        if (! is_admin()) {
84
-            // set request post_id
85
-            $this->request->set('post_id', $this->get_post_id_from_request($wp));
86
-            // set request post name
87
-            $this->request->set('post_name', $this->get_post_name_from_request($wp));
88
-            // set request post_type
89
-            $this->request->set('post_type', $this->get_post_type_from_request($wp));
90
-            // true or false ? is this page being used by EE ?
91
-            $this->set_espresso_page();
92
-        }
93
-    }
94
-
95
-
96
-    /**
97
-     * @param WP $wp
98
-     * @return int
99
-     */
100
-    public function get_post_id_from_request($wp = null)
101
-    {
102
-        if (! $wp instanceof WP) {
103
-            global $wp;
104
-        }
105
-        $post_id = null;
106
-        if (isset($wp->query_vars['p'])) {
107
-            $post_id = $wp->query_vars['p'];
108
-        }
109
-        if (! $post_id && isset($wp->query_vars['page_id'])) {
110
-            $post_id = $wp->query_vars['page_id'];
111
-        }
112
-        if (! $post_id && $wp->request !== null && is_numeric(basename($wp->request))) {
113
-            $post_id = basename($wp->request);
114
-        }
115
-        return $post_id;
116
-    }
117
-
118
-
119
-    /**
120
-     * @param WP $wp
121
-     * @return string
122
-     */
123
-    public function get_post_name_from_request($wp = null)
124
-    {
125
-        if (! $wp instanceof WP) {
126
-            global $wp;
127
-        }
128
-        $post_name = null;
129
-        if (isset($wp->query_vars['name']) && ! empty($wp->query_vars['name'])) {
130
-            $post_name = $wp->query_vars['name'];
131
-        }
132
-        if (! $post_name && isset($wp->query_vars['pagename']) && ! empty($wp->query_vars['pagename'])) {
133
-            $post_name = $wp->query_vars['pagename'];
134
-        }
135
-        if (! $post_name && $wp->request !== null && ! empty($wp->request)) {
136
-            $possible_post_name = basename($wp->request);
137
-            if (! is_numeric($possible_post_name)) {
138
-                /** @type WPDB $wpdb */
139
-                global $wpdb;
140
-                $SQL =
141
-                    "SELECT ID from {$wpdb->posts} WHERE post_status NOT IN ('auto-draft', 'inherit', 'trash') AND post_name=%s";
142
-                $possible_post_name = $wpdb->get_var($wpdb->prepare($SQL, $possible_post_name));
143
-                if ($possible_post_name) {
144
-                    $post_name = $possible_post_name;
145
-                }
146
-            }
147
-        }
148
-        if (! $post_name && $this->get('post_id')) {
149
-            /** @type WPDB $wpdb */
150
-            global $wpdb;
151
-            $SQL =
152
-                "SELECT post_name from {$wpdb->posts} WHERE post_status NOT IN ('auto-draft', 'inherit', 'trash') AND ID=%d";
153
-            $possible_post_name = $wpdb->get_var($wpdb->prepare($SQL, $this->get('post_id')));
154
-            if ($possible_post_name) {
155
-                $post_name = $possible_post_name;
156
-            }
157
-        }
158
-        return $post_name;
159
-    }
160
-
161
-
162
-    /**
163
-     * @param WP $wp
164
-     * @return mixed
165
-     */
166
-    public function get_post_type_from_request($wp = null)
167
-    {
168
-        if (! $wp instanceof WP) {
169
-            global $wp;
170
-        }
171
-        return isset($wp->query_vars['post_type'])
172
-            ? $wp->query_vars['post_type']
173
-            : null;
174
-    }
175
-
176
-
177
-    /**
178
-     * Just a helper method for getting the url for the displayed page.
179
-     *
180
-     * @param  WP $wp
181
-     * @return string
182
-     */
183
-    public function get_current_page_permalink($wp = null)
184
-    {
185
-        $post_id = $this->get_post_id_from_request($wp);
186
-        if ($post_id) {
187
-            $current_page_permalink = get_permalink($post_id);
188
-        } else {
189
-            if (! $wp instanceof WP) {
190
-                global $wp;
191
-            }
192
-            if ($wp->request) {
193
-                $current_page_permalink = site_url($wp->request);
194
-            } else {
195
-                $current_page_permalink = esc_url(site_url($_SERVER['REQUEST_URI']));
196
-            }
197
-        }
198
-        return $current_page_permalink;
199
-    }
200
-
201
-
202
-    /**
203
-     * @return bool
204
-     * @throws EE_Error
205
-     * @throws ReflectionException
206
-     */
207
-    public function test_for_espresso_page()
208
-    {
209
-        global $wp;
210
-        /** @type EE_CPT_Strategy $EE_CPT_Strategy */
211
-        $EE_CPT_Strategy = EE_Registry::instance()->load_core('CPT_Strategy');
212
-        $espresso_CPT_taxonomies = $EE_CPT_Strategy->get_CPT_taxonomies();
213
-        if (is_array($espresso_CPT_taxonomies)) {
214
-            foreach ($espresso_CPT_taxonomies as $espresso_CPT_taxonomy => $details) {
215
-                if (isset($wp->query_vars, $wp->query_vars[ $espresso_CPT_taxonomy ])) {
216
-                    return true;
217
-                }
218
-            }
219
-        }
220
-        // load espresso CPT endpoints
221
-        $espresso_CPT_endpoints = $EE_CPT_Strategy->get_CPT_endpoints();
222
-        $post_type_CPT_endpoints = array_flip($espresso_CPT_endpoints);
223
-        $post_types = (array) $this->get('post_type');
224
-        foreach ($post_types as $post_type) {
225
-            // was a post name passed ?
226
-            if (isset($post_type_CPT_endpoints[ $post_type ])) {
227
-                // kk we know this is an espresso page, but is it a specific post ?
228
-                if (! $this->get('post_name')) {
229
-                    // there's no specific post name set, so maybe it's one of our endpoints like www.domain.com/events
230
-                    $post_name = isset($post_type_CPT_endpoints[ $this->get('post_type') ])
231
-                        ? $post_type_CPT_endpoints[ $this->get('post_type') ]
232
-                        : '';
233
-                    // if the post type matches on of our then set the endpoint
234
-                    if ($post_name) {
235
-                        $this->set('post_name', $post_name);
236
-                    }
237
-                }
238
-                return true;
239
-            }
240
-        }
241
-        return false;
242
-    }
243
-
244
-    /**
245
-     * @param $key
246
-     * @param $value
247
-     * @return    void
248
-     */
249
-    public function set_notice($key, $value)
250
-    {
251
-        $this->_notice[ $key ] = $value;
252
-    }
253
-
254
-
255
-    /**
256
-     * @param $key
257
-     * @return    mixed
258
-     */
259
-    public function get_notice($key)
260
-    {
261
-        return isset($this->_notice[ $key ])
262
-            ? $this->_notice[ $key ]
263
-            : null;
264
-    }
265
-
266
-
267
-    /**
268
-     * @param $string
269
-     * @return void
270
-     */
271
-    public function add_output($string)
272
-    {
273
-        $this->_output .= $string;
274
-    }
275
-
276
-
277
-    /**
278
-     * @return string
279
-     */
280
-    public function get_output()
281
-    {
282
-        return $this->_output;
283
-    }
284
-
285
-
286
-    /**
287
-     * @param $item
288
-     * @param $key
289
-     */
290
-    public function sanitize_text_field_for_array_walk(&$item, &$key)
291
-    {
292
-        $item = strpos($item, 'email') !== false
293
-            ? sanitize_email($item)
294
-            : sanitize_text_field($item);
295
-    }
296
-
297
-
298
-    /**
299
-     * @param null|bool $value
300
-     * @return void
301
-     * @throws EE_Error
302
-     * @throws ReflectionException
303
-     */
304
-    public function set_espresso_page($value = null)
305
-    {
306
-        $this->request->set(
307
-            'is_espresso_page',
308
-            ! empty($value)
309
-                ? $value
310
-                : $this->test_for_espresso_page()
311
-        );
312
-    }
313
-
314
-
315
-    /**
316
-     * @return    mixed
317
-     */
318
-    public function is_espresso_page()
319
-    {
320
-        return $this->request->is_set('is_espresso_page');
321
-    }
322
-
323
-
324
-    /**
325
-     * returns contents of $_REQUEST
326
-     *
327
-     * @return array
328
-     */
329
-    public function params()
330
-    {
331
-        return $this->request->params();
332
-    }
333
-
334
-
335
-    /**
336
-     * @param      $key
337
-     * @param      $value
338
-     * @param bool $override_ee
339
-     * @return    void
340
-     */
341
-    public function set($key, $value, $override_ee = false)
342
-    {
343
-        $this->request->set($key, $value, $override_ee);
344
-    }
345
-
346
-
347
-    /**
348
-     * @param      $key
349
-     * @param null $default
350
-     * @return    mixed
351
-     */
352
-    public function get($key, $default = null)
353
-    {
354
-        return $this->request->get($key, $default);
355
-    }
356
-
357
-
358
-    /**
359
-     * check if param exists
360
-     *
361
-     * @param $key
362
-     * @return    boolean
363
-     */
364
-    public function is_set($key)
365
-    {
366
-        return $this->request->is_set($key);
367
-    }
368
-
369
-
370
-    /**
371
-     * remove param
372
-     *
373
-     * @param $key
374
-     * @return    void
375
-     */
376
-    public function un_set($key)
377
-    {
378
-        $this->request->un_set($key);
379
-    }
15
+	/**
16
+	 * @var EE_Request $request
17
+	 */
18
+	private $request;
19
+
20
+	/**
21
+	 * @var array $_notice
22
+	 */
23
+	private $_notice = array();
24
+
25
+	/**
26
+	 * rendered output to be returned to WP
27
+	 *
28
+	 * @var string $_output
29
+	 */
30
+	private $_output = '';
31
+
32
+	/**
33
+	 * whether current request is via AJAX
34
+	 *
35
+	 * @var boolean $ajax
36
+	 */
37
+	public $ajax = false;
38
+
39
+	/**
40
+	 * whether current request is via AJAX from the frontend of the site
41
+	 *
42
+	 * @var boolean $front_ajax
43
+	 */
44
+	public $front_ajax = false;
45
+
46
+
47
+	/**
48
+	 * @param  EE_Request $request
49
+	 */
50
+	public function __construct(EE_Request $request)
51
+	{
52
+		$this->request = $request;
53
+		$this->ajax = $this->request->ajax;
54
+		$this->front_ajax = $this->request->front_ajax;
55
+		do_action('AHEE__EE_Request_Handler__construct__complete');
56
+	}
57
+
58
+
59
+	/**
60
+	 * @param WP $wp
61
+	 * @return void
62
+	 * @throws EE_Error
63
+	 * @throws ReflectionException
64
+	 */
65
+	public function parse_request($wp = null)
66
+	{
67
+		// if somebody forgot to provide us with WP, that's ok because its global
68
+		if (! $wp instanceof WP) {
69
+			global $wp;
70
+		}
71
+		$this->set_request_vars($wp);
72
+	}
73
+
74
+
75
+	/**
76
+	 * @param WP $wp
77
+	 * @return void
78
+	 * @throws EE_Error
79
+	 * @throws ReflectionException
80
+	 */
81
+	public function set_request_vars($wp = null)
82
+	{
83
+		if (! is_admin()) {
84
+			// set request post_id
85
+			$this->request->set('post_id', $this->get_post_id_from_request($wp));
86
+			// set request post name
87
+			$this->request->set('post_name', $this->get_post_name_from_request($wp));
88
+			// set request post_type
89
+			$this->request->set('post_type', $this->get_post_type_from_request($wp));
90
+			// true or false ? is this page being used by EE ?
91
+			$this->set_espresso_page();
92
+		}
93
+	}
94
+
95
+
96
+	/**
97
+	 * @param WP $wp
98
+	 * @return int
99
+	 */
100
+	public function get_post_id_from_request($wp = null)
101
+	{
102
+		if (! $wp instanceof WP) {
103
+			global $wp;
104
+		}
105
+		$post_id = null;
106
+		if (isset($wp->query_vars['p'])) {
107
+			$post_id = $wp->query_vars['p'];
108
+		}
109
+		if (! $post_id && isset($wp->query_vars['page_id'])) {
110
+			$post_id = $wp->query_vars['page_id'];
111
+		}
112
+		if (! $post_id && $wp->request !== null && is_numeric(basename($wp->request))) {
113
+			$post_id = basename($wp->request);
114
+		}
115
+		return $post_id;
116
+	}
117
+
118
+
119
+	/**
120
+	 * @param WP $wp
121
+	 * @return string
122
+	 */
123
+	public function get_post_name_from_request($wp = null)
124
+	{
125
+		if (! $wp instanceof WP) {
126
+			global $wp;
127
+		}
128
+		$post_name = null;
129
+		if (isset($wp->query_vars['name']) && ! empty($wp->query_vars['name'])) {
130
+			$post_name = $wp->query_vars['name'];
131
+		}
132
+		if (! $post_name && isset($wp->query_vars['pagename']) && ! empty($wp->query_vars['pagename'])) {
133
+			$post_name = $wp->query_vars['pagename'];
134
+		}
135
+		if (! $post_name && $wp->request !== null && ! empty($wp->request)) {
136
+			$possible_post_name = basename($wp->request);
137
+			if (! is_numeric($possible_post_name)) {
138
+				/** @type WPDB $wpdb */
139
+				global $wpdb;
140
+				$SQL =
141
+					"SELECT ID from {$wpdb->posts} WHERE post_status NOT IN ('auto-draft', 'inherit', 'trash') AND post_name=%s";
142
+				$possible_post_name = $wpdb->get_var($wpdb->prepare($SQL, $possible_post_name));
143
+				if ($possible_post_name) {
144
+					$post_name = $possible_post_name;
145
+				}
146
+			}
147
+		}
148
+		if (! $post_name && $this->get('post_id')) {
149
+			/** @type WPDB $wpdb */
150
+			global $wpdb;
151
+			$SQL =
152
+				"SELECT post_name from {$wpdb->posts} WHERE post_status NOT IN ('auto-draft', 'inherit', 'trash') AND ID=%d";
153
+			$possible_post_name = $wpdb->get_var($wpdb->prepare($SQL, $this->get('post_id')));
154
+			if ($possible_post_name) {
155
+				$post_name = $possible_post_name;
156
+			}
157
+		}
158
+		return $post_name;
159
+	}
160
+
161
+
162
+	/**
163
+	 * @param WP $wp
164
+	 * @return mixed
165
+	 */
166
+	public function get_post_type_from_request($wp = null)
167
+	{
168
+		if (! $wp instanceof WP) {
169
+			global $wp;
170
+		}
171
+		return isset($wp->query_vars['post_type'])
172
+			? $wp->query_vars['post_type']
173
+			: null;
174
+	}
175
+
176
+
177
+	/**
178
+	 * Just a helper method for getting the url for the displayed page.
179
+	 *
180
+	 * @param  WP $wp
181
+	 * @return string
182
+	 */
183
+	public function get_current_page_permalink($wp = null)
184
+	{
185
+		$post_id = $this->get_post_id_from_request($wp);
186
+		if ($post_id) {
187
+			$current_page_permalink = get_permalink($post_id);
188
+		} else {
189
+			if (! $wp instanceof WP) {
190
+				global $wp;
191
+			}
192
+			if ($wp->request) {
193
+				$current_page_permalink = site_url($wp->request);
194
+			} else {
195
+				$current_page_permalink = esc_url(site_url($_SERVER['REQUEST_URI']));
196
+			}
197
+		}
198
+		return $current_page_permalink;
199
+	}
200
+
201
+
202
+	/**
203
+	 * @return bool
204
+	 * @throws EE_Error
205
+	 * @throws ReflectionException
206
+	 */
207
+	public function test_for_espresso_page()
208
+	{
209
+		global $wp;
210
+		/** @type EE_CPT_Strategy $EE_CPT_Strategy */
211
+		$EE_CPT_Strategy = EE_Registry::instance()->load_core('CPT_Strategy');
212
+		$espresso_CPT_taxonomies = $EE_CPT_Strategy->get_CPT_taxonomies();
213
+		if (is_array($espresso_CPT_taxonomies)) {
214
+			foreach ($espresso_CPT_taxonomies as $espresso_CPT_taxonomy => $details) {
215
+				if (isset($wp->query_vars, $wp->query_vars[ $espresso_CPT_taxonomy ])) {
216
+					return true;
217
+				}
218
+			}
219
+		}
220
+		// load espresso CPT endpoints
221
+		$espresso_CPT_endpoints = $EE_CPT_Strategy->get_CPT_endpoints();
222
+		$post_type_CPT_endpoints = array_flip($espresso_CPT_endpoints);
223
+		$post_types = (array) $this->get('post_type');
224
+		foreach ($post_types as $post_type) {
225
+			// was a post name passed ?
226
+			if (isset($post_type_CPT_endpoints[ $post_type ])) {
227
+				// kk we know this is an espresso page, but is it a specific post ?
228
+				if (! $this->get('post_name')) {
229
+					// there's no specific post name set, so maybe it's one of our endpoints like www.domain.com/events
230
+					$post_name = isset($post_type_CPT_endpoints[ $this->get('post_type') ])
231
+						? $post_type_CPT_endpoints[ $this->get('post_type') ]
232
+						: '';
233
+					// if the post type matches on of our then set the endpoint
234
+					if ($post_name) {
235
+						$this->set('post_name', $post_name);
236
+					}
237
+				}
238
+				return true;
239
+			}
240
+		}
241
+		return false;
242
+	}
243
+
244
+	/**
245
+	 * @param $key
246
+	 * @param $value
247
+	 * @return    void
248
+	 */
249
+	public function set_notice($key, $value)
250
+	{
251
+		$this->_notice[ $key ] = $value;
252
+	}
253
+
254
+
255
+	/**
256
+	 * @param $key
257
+	 * @return    mixed
258
+	 */
259
+	public function get_notice($key)
260
+	{
261
+		return isset($this->_notice[ $key ])
262
+			? $this->_notice[ $key ]
263
+			: null;
264
+	}
265
+
266
+
267
+	/**
268
+	 * @param $string
269
+	 * @return void
270
+	 */
271
+	public function add_output($string)
272
+	{
273
+		$this->_output .= $string;
274
+	}
275
+
276
+
277
+	/**
278
+	 * @return string
279
+	 */
280
+	public function get_output()
281
+	{
282
+		return $this->_output;
283
+	}
284
+
285
+
286
+	/**
287
+	 * @param $item
288
+	 * @param $key
289
+	 */
290
+	public function sanitize_text_field_for_array_walk(&$item, &$key)
291
+	{
292
+		$item = strpos($item, 'email') !== false
293
+			? sanitize_email($item)
294
+			: sanitize_text_field($item);
295
+	}
296
+
297
+
298
+	/**
299
+	 * @param null|bool $value
300
+	 * @return void
301
+	 * @throws EE_Error
302
+	 * @throws ReflectionException
303
+	 */
304
+	public function set_espresso_page($value = null)
305
+	{
306
+		$this->request->set(
307
+			'is_espresso_page',
308
+			! empty($value)
309
+				? $value
310
+				: $this->test_for_espresso_page()
311
+		);
312
+	}
313
+
314
+
315
+	/**
316
+	 * @return    mixed
317
+	 */
318
+	public function is_espresso_page()
319
+	{
320
+		return $this->request->is_set('is_espresso_page');
321
+	}
322
+
323
+
324
+	/**
325
+	 * returns contents of $_REQUEST
326
+	 *
327
+	 * @return array
328
+	 */
329
+	public function params()
330
+	{
331
+		return $this->request->params();
332
+	}
333
+
334
+
335
+	/**
336
+	 * @param      $key
337
+	 * @param      $value
338
+	 * @param bool $override_ee
339
+	 * @return    void
340
+	 */
341
+	public function set($key, $value, $override_ee = false)
342
+	{
343
+		$this->request->set($key, $value, $override_ee);
344
+	}
345
+
346
+
347
+	/**
348
+	 * @param      $key
349
+	 * @param null $default
350
+	 * @return    mixed
351
+	 */
352
+	public function get($key, $default = null)
353
+	{
354
+		return $this->request->get($key, $default);
355
+	}
356
+
357
+
358
+	/**
359
+	 * check if param exists
360
+	 *
361
+	 * @param $key
362
+	 * @return    boolean
363
+	 */
364
+	public function is_set($key)
365
+	{
366
+		return $this->request->is_set($key);
367
+	}
368
+
369
+
370
+	/**
371
+	 * remove param
372
+	 *
373
+	 * @param $key
374
+	 * @return    void
375
+	 */
376
+	public function un_set($key)
377
+	{
378
+		$this->request->un_set($key);
379
+	}
380 380
 }
Please login to merge, or discard this patch.
Spacing   +20 added lines, -20 removed lines patch added patch discarded remove patch
@@ -65,7 +65,7 @@  discard block
 block discarded – undo
65 65
     public function parse_request($wp = null)
66 66
     {
67 67
         // if somebody forgot to provide us with WP, that's ok because its global
68
-        if (! $wp instanceof WP) {
68
+        if ( ! $wp instanceof WP) {
69 69
             global $wp;
70 70
         }
71 71
         $this->set_request_vars($wp);
@@ -80,7 +80,7 @@  discard block
 block discarded – undo
80 80
      */
81 81
     public function set_request_vars($wp = null)
82 82
     {
83
-        if (! is_admin()) {
83
+        if ( ! is_admin()) {
84 84
             // set request post_id
85 85
             $this->request->set('post_id', $this->get_post_id_from_request($wp));
86 86
             // set request post name
@@ -99,17 +99,17 @@  discard block
 block discarded – undo
99 99
      */
100 100
     public function get_post_id_from_request($wp = null)
101 101
     {
102
-        if (! $wp instanceof WP) {
102
+        if ( ! $wp instanceof WP) {
103 103
             global $wp;
104 104
         }
105 105
         $post_id = null;
106 106
         if (isset($wp->query_vars['p'])) {
107 107
             $post_id = $wp->query_vars['p'];
108 108
         }
109
-        if (! $post_id && isset($wp->query_vars['page_id'])) {
109
+        if ( ! $post_id && isset($wp->query_vars['page_id'])) {
110 110
             $post_id = $wp->query_vars['page_id'];
111 111
         }
112
-        if (! $post_id && $wp->request !== null && is_numeric(basename($wp->request))) {
112
+        if ( ! $post_id && $wp->request !== null && is_numeric(basename($wp->request))) {
113 113
             $post_id = basename($wp->request);
114 114
         }
115 115
         return $post_id;
@@ -122,19 +122,19 @@  discard block
 block discarded – undo
122 122
      */
123 123
     public function get_post_name_from_request($wp = null)
124 124
     {
125
-        if (! $wp instanceof WP) {
125
+        if ( ! $wp instanceof WP) {
126 126
             global $wp;
127 127
         }
128 128
         $post_name = null;
129 129
         if (isset($wp->query_vars['name']) && ! empty($wp->query_vars['name'])) {
130 130
             $post_name = $wp->query_vars['name'];
131 131
         }
132
-        if (! $post_name && isset($wp->query_vars['pagename']) && ! empty($wp->query_vars['pagename'])) {
132
+        if ( ! $post_name && isset($wp->query_vars['pagename']) && ! empty($wp->query_vars['pagename'])) {
133 133
             $post_name = $wp->query_vars['pagename'];
134 134
         }
135
-        if (! $post_name && $wp->request !== null && ! empty($wp->request)) {
135
+        if ( ! $post_name && $wp->request !== null && ! empty($wp->request)) {
136 136
             $possible_post_name = basename($wp->request);
137
-            if (! is_numeric($possible_post_name)) {
137
+            if ( ! is_numeric($possible_post_name)) {
138 138
                 /** @type WPDB $wpdb */
139 139
                 global $wpdb;
140 140
                 $SQL =
@@ -145,7 +145,7 @@  discard block
 block discarded – undo
145 145
                 }
146 146
             }
147 147
         }
148
-        if (! $post_name && $this->get('post_id')) {
148
+        if ( ! $post_name && $this->get('post_id')) {
149 149
             /** @type WPDB $wpdb */
150 150
             global $wpdb;
151 151
             $SQL =
@@ -165,7 +165,7 @@  discard block
 block discarded – undo
165 165
      */
166 166
     public function get_post_type_from_request($wp = null)
167 167
     {
168
-        if (! $wp instanceof WP) {
168
+        if ( ! $wp instanceof WP) {
169 169
             global $wp;
170 170
         }
171 171
         return isset($wp->query_vars['post_type'])
@@ -186,7 +186,7 @@  discard block
 block discarded – undo
186 186
         if ($post_id) {
187 187
             $current_page_permalink = get_permalink($post_id);
188 188
         } else {
189
-            if (! $wp instanceof WP) {
189
+            if ( ! $wp instanceof WP) {
190 190
                 global $wp;
191 191
             }
192 192
             if ($wp->request) {
@@ -212,7 +212,7 @@  discard block
 block discarded – undo
212 212
         $espresso_CPT_taxonomies = $EE_CPT_Strategy->get_CPT_taxonomies();
213 213
         if (is_array($espresso_CPT_taxonomies)) {
214 214
             foreach ($espresso_CPT_taxonomies as $espresso_CPT_taxonomy => $details) {
215
-                if (isset($wp->query_vars, $wp->query_vars[ $espresso_CPT_taxonomy ])) {
215
+                if (isset($wp->query_vars, $wp->query_vars[$espresso_CPT_taxonomy])) {
216 216
                     return true;
217 217
                 }
218 218
             }
@@ -223,12 +223,12 @@  discard block
 block discarded – undo
223 223
         $post_types = (array) $this->get('post_type');
224 224
         foreach ($post_types as $post_type) {
225 225
             // was a post name passed ?
226
-            if (isset($post_type_CPT_endpoints[ $post_type ])) {
226
+            if (isset($post_type_CPT_endpoints[$post_type])) {
227 227
                 // kk we know this is an espresso page, but is it a specific post ?
228
-                if (! $this->get('post_name')) {
228
+                if ( ! $this->get('post_name')) {
229 229
                     // there's no specific post name set, so maybe it's one of our endpoints like www.domain.com/events
230
-                    $post_name = isset($post_type_CPT_endpoints[ $this->get('post_type') ])
231
-                        ? $post_type_CPT_endpoints[ $this->get('post_type') ]
230
+                    $post_name = isset($post_type_CPT_endpoints[$this->get('post_type')])
231
+                        ? $post_type_CPT_endpoints[$this->get('post_type')]
232 232
                         : '';
233 233
                     // if the post type matches on of our then set the endpoint
234 234
                     if ($post_name) {
@@ -248,7 +248,7 @@  discard block
 block discarded – undo
248 248
      */
249 249
     public function set_notice($key, $value)
250 250
     {
251
-        $this->_notice[ $key ] = $value;
251
+        $this->_notice[$key] = $value;
252 252
     }
253 253
 
254 254
 
@@ -258,8 +258,8 @@  discard block
 block discarded – undo
258 258
      */
259 259
     public function get_notice($key)
260 260
     {
261
-        return isset($this->_notice[ $key ])
262
-            ? $this->_notice[ $key ]
261
+        return isset($this->_notice[$key])
262
+            ? $this->_notice[$key]
263 263
             : null;
264 264
     }
265 265
 
Please login to merge, or discard this patch.
core/db_classes/EE_Registration.class.php 3 patches
Doc Comments   +4 added lines, -3 removed lines patch added patch discarded remove patch
@@ -1164,7 +1164,7 @@  discard block
 block discarded – undo
1164 1164
      * Sets deleted
1165 1165
      *
1166 1166
      * @param boolean $deleted
1167
-     * @return bool
1167
+     * @return boolean|null
1168 1168
      * @throws EE_Error
1169 1169
      * @throws RuntimeException
1170 1170
      */
@@ -1222,6 +1222,7 @@  discard block
 block discarded – undo
1222 1222
      * @param int | EE_Datetime $DTT_OR_ID      The datetime the registration is being checked against
1223 1223
      * @param bool              $check_approved This is used to indicate whether the caller wants can_checkin to also
1224 1224
      *                                          consider registration status as well as datetime access.
1225
+     * @param integer $DTT_OR_ID
1225 1226
      * @return bool
1226 1227
      * @throws EE_Error
1227 1228
      */
@@ -1392,7 +1393,7 @@  discard block
 block discarded – undo
1392 1393
      * Returns the latest datetime related to this registration (via the ticket attached to the registration).
1393 1394
      * "Latest" is defined by the `DTT_EVT_start` column.
1394 1395
      *
1395
-     * @return EE_Datetime|null
1396
+     * @return null|EE_Base_Class
1396 1397
      * @throws EE_Error
1397 1398
      */
1398 1399
     public function get_latest_related_datetime()
@@ -1688,7 +1689,7 @@  discard block
 block discarded – undo
1688 1689
      * This grabs the payment method corresponding to the last payment made for the amount owing on the registration.
1689 1690
      * Note: if there are no payments on the registration there will be no payment method returned.
1690 1691
      *
1691
-     * @return EE_Payment_Method|null
1692
+     * @return null|EE_Base_Class
1692 1693
      */
1693 1694
     public function payment_method()
1694 1695
     {
Please login to merge, or discard this patch.
Spacing   +15 added lines, -15 removed lines patch added patch discarded remove patch
@@ -119,7 +119,7 @@  discard block
 block discarded – undo
119 119
     {
120 120
         switch ($field_name) {
121 121
             case 'REG_code':
122
-                if (! empty($field_value) && $this->reg_code() === null) {
122
+                if ( ! empty($field_value) && $this->reg_code() === null) {
123 123
                     $this->set_reg_code($field_value, $use_default);
124 124
                 }
125 125
                 break;
@@ -400,7 +400,7 @@  discard block
 block discarded – undo
400 400
     public function event()
401 401
     {
402 402
         $event = $this->get_first_related('Event');
403
-        if (! $event instanceof \EE_Event) {
403
+        if ( ! $event instanceof \EE_Event) {
404 404
             throw new EntityNotFoundException('Event ID', $this->event_ID());
405 405
         }
406 406
         return $event;
@@ -443,7 +443,7 @@  discard block
 block discarded – undo
443 443
     {
444 444
         // reserved ticket and datetime counts will be decremented as sold counts are incremented
445 445
         // so stop tracking that this reg has a ticket reserved
446
-        $this->release_reserved_ticket(false, "REG: {$this->ID()} (ln:" . __LINE__ . ')');
446
+        $this->release_reserved_ticket(false, "REG: {$this->ID()} (ln:".__LINE__.')');
447 447
         $ticket = $this->ticket();
448 448
         $ticket->increaseSold();
449 449
         // possibly set event status to sold out
@@ -497,7 +497,7 @@  discard block
 block discarded – undo
497 497
                 && $update_ticket
498 498
             ) {
499 499
                 $ticket = $this->ticket();
500
-                $ticket->increaseReserved(1, "REG: {$this->ID()} (ln:" . __LINE__ . ')');
500
+                $ticket->increaseReserved(1, "REG: {$this->ID()} (ln:".__LINE__.')');
501 501
                 $ticket->save();
502 502
             }
503 503
         }
@@ -528,7 +528,7 @@  discard block
 block discarded – undo
528 528
                 && $update_ticket
529 529
             ) {
530 530
                 $ticket = $this->ticket();
531
-                $ticket->decreaseReserved(1, true, "REG: {$this->ID()} (ln:" . __LINE__ . ')');
531
+                $ticket->decreaseReserved(1, true, "REG: {$this->ID()} (ln:".__LINE__.')');
532 532
             }
533 533
         }
534 534
     }
@@ -1202,7 +1202,7 @@  discard block
 block discarded – undo
1202 1202
                     : '';
1203 1203
                 break;
1204 1204
         }
1205
-        return $icon . $status[ $this->status_ID() ];
1205
+        return $icon.$status[$this->status_ID()];
1206 1206
     }
1207 1207
 
1208 1208
 
@@ -1420,7 +1420,7 @@  discard block
 block discarded – undo
1420 1420
             return false;
1421 1421
         }
1422 1422
         // is there a datetime ticket that matches this dtt_ID?
1423
-        if (! (EEM_Datetime_Ticket::instance()->exists(
1423
+        if ( ! (EEM_Datetime_Ticket::instance()->exists(
1424 1424
             array(
1425 1425
                 array(
1426 1426
                     'TKT_ID' => $this->get('TKT_ID'),
@@ -1451,7 +1451,7 @@  discard block
 block discarded – undo
1451 1451
     {
1452 1452
         $DTT_ID = EEM_Datetime::instance()->ensure_is_ID($DTT_OR_ID);
1453 1453
 
1454
-        if (! $DTT_ID) {
1454
+        if ( ! $DTT_ID) {
1455 1455
             return false;
1456 1456
         }
1457 1457
 
@@ -1459,7 +1459,7 @@  discard block
 block discarded – undo
1459 1459
 
1460 1460
         // if max uses is not set or equals infinity then return true cause its not a factor for whether user can
1461 1461
         // check-in or not.
1462
-        if (! $max_uses || $max_uses === EE_INF) {
1462
+        if ( ! $max_uses || $max_uses === EE_INF) {
1463 1463
             return true;
1464 1464
         }
1465 1465
 
@@ -1519,7 +1519,7 @@  discard block
 block discarded – undo
1519 1519
             $datetime = $this->get_latest_related_datetime();
1520 1520
             $DTT_ID = $datetime instanceof EE_Datetime ? $datetime->ID() : 0;
1521 1521
             // verify the registration can checkin for the given DTT_ID
1522
-        } elseif (! $this->can_checkin($DTT_ID, $verify)) {
1522
+        } elseif ( ! $this->can_checkin($DTT_ID, $verify)) {
1523 1523
             EE_Error::add_error(
1524 1524
                 sprintf(
1525 1525
                     esc_html__(
@@ -1542,7 +1542,7 @@  discard block
 block discarded – undo
1542 1542
         );
1543 1543
         // start by getting the current status so we know what status we'll be changing to.
1544 1544
         $cur_status = $this->check_in_status_for_datetime($DTT_ID, null);
1545
-        $status_to = $status_paths[ $cur_status ];
1545
+        $status_to = $status_paths[$cur_status];
1546 1546
         // database only records true for checked IN or false for checked OUT
1547 1547
         // no record ( null ) means checked in NEVER, but we obviously don't save that
1548 1548
         $new_status = $status_to === EE_Checkin::status_checked_in ? true : false;
@@ -1707,7 +1707,7 @@  discard block
 block discarded – undo
1707 1707
     public function transaction()
1708 1708
     {
1709 1709
         $transaction = $this->get_first_related('Transaction');
1710
-        if (! $transaction instanceof \EE_Transaction) {
1710
+        if ( ! $transaction instanceof \EE_Transaction) {
1711 1711
             throw new EntityNotFoundException('Transaction ID', $this->transaction_ID());
1712 1712
         }
1713 1713
         return $transaction;
@@ -1761,11 +1761,11 @@  discard block
 block discarded – undo
1761 1761
             );
1762 1762
             return;
1763 1763
         }
1764
-        if (! $this->reg_code()) {
1764
+        if ( ! $this->reg_code()) {
1765 1765
             parent::set('REG_code', $REG_code, $use_default);
1766 1766
         } else {
1767 1767
             EE_Error::doing_it_wrong(
1768
-                __CLASS__ . '::' . __FUNCTION__,
1768
+                __CLASS__.'::'.__FUNCTION__,
1769 1769
                 esc_html__('Can not change a registration REG_code once it has been set.', 'event_espresso'),
1770 1770
                 '4.6.0'
1771 1771
             );
@@ -1916,7 +1916,7 @@  discard block
 block discarded – undo
1916 1916
                 break;
1917 1917
             }
1918 1918
         }
1919
-        if (! ($line_item instanceof \EE_Line_Item && $line_item->OBJ_type() === 'Ticket')) {
1919
+        if ( ! ($line_item instanceof \EE_Line_Item && $line_item->OBJ_type() === 'Ticket')) {
1920 1920
             throw new EntityNotFoundException('Line Item Ticket ID', $ticket->ID());
1921 1921
         }
1922 1922
         return $line_item;
Please login to merge, or discard this patch.
Indentation   +2071 added lines, -2071 removed lines patch added patch discarded remove patch
@@ -17,2075 +17,2075 @@
 block discarded – undo
17 17
 {
18 18
 
19 19
 
20
-    /**
21
-     * Used to reference when a registration has never been checked in.
22
-     *
23
-     * @deprecated use \EE_Checkin::status_checked_never instead
24
-     * @type int
25
-     */
26
-    const checkin_status_never = 2;
27
-
28
-    /**
29
-     * Used to reference when a registration has been checked in.
30
-     *
31
-     * @deprecated use \EE_Checkin::status_checked_in instead
32
-     * @type int
33
-     */
34
-    const checkin_status_in = 1;
35
-
36
-
37
-    /**
38
-     * Used to reference when a registration has been checked out.
39
-     *
40
-     * @deprecated use \EE_Checkin::status_checked_out instead
41
-     * @type int
42
-     */
43
-    const checkin_status_out = 0;
44
-
45
-
46
-    /**
47
-     * extra meta key for tracking reg status os trashed registrations
48
-     *
49
-     * @type string
50
-     */
51
-    const PRE_TRASH_REG_STATUS_KEY = 'pre_trash_registration_status';
52
-
53
-
54
-    /**
55
-     * extra meta key for tracking if registration has reserved ticket
56
-     *
57
-     * @type string
58
-     */
59
-    const HAS_RESERVED_TICKET_KEY = 'has_reserved_ticket';
60
-
61
-
62
-    /**
63
-     * @param array  $props_n_values          incoming values
64
-     * @param string $timezone                incoming timezone (if not set the timezone set for the website will be
65
-     *                                        used.)
66
-     * @param array  $date_formats            incoming date_formats in an array where the first value is the
67
-     *                                        date_format and the second value is the time format
68
-     * @return EE_Registration
69
-     * @throws EE_Error
70
-     */
71
-    public static function new_instance($props_n_values = array(), $timezone = null, $date_formats = array())
72
-    {
73
-        $has_object = parent::_check_for_object($props_n_values, __CLASS__, $timezone, $date_formats);
74
-        return $has_object ? $has_object : new self($props_n_values, false, $timezone, $date_formats);
75
-    }
76
-
77
-
78
-    /**
79
-     * @param array  $props_n_values  incoming values from the database
80
-     * @param string $timezone        incoming timezone as set by the model.  If not set the timezone for
81
-     *                                the website will be used.
82
-     * @return EE_Registration
83
-     */
84
-    public static function new_instance_from_db($props_n_values = array(), $timezone = null)
85
-    {
86
-        return new self($props_n_values, true, $timezone);
87
-    }
88
-
89
-
90
-    /**
91
-     *        Set Event ID
92
-     *
93
-     * @param        int $EVT_ID Event ID
94
-     * @throws EE_Error
95
-     * @throws RuntimeException
96
-     */
97
-    public function set_event($EVT_ID = 0)
98
-    {
99
-        $this->set('EVT_ID', $EVT_ID);
100
-    }
101
-
102
-
103
-    /**
104
-     * Overrides parent set() method so that all calls to set( 'REG_code', $REG_code ) OR set( 'STS_ID', $STS_ID ) can
105
-     * be routed to internal methods
106
-     *
107
-     * @param string $field_name
108
-     * @param mixed  $field_value
109
-     * @param bool   $use_default
110
-     * @throws EE_Error
111
-     * @throws EntityNotFoundException
112
-     * @throws InvalidArgumentException
113
-     * @throws InvalidDataTypeException
114
-     * @throws InvalidInterfaceException
115
-     * @throws ReflectionException
116
-     * @throws RuntimeException
117
-     */
118
-    public function set($field_name, $field_value, $use_default = false)
119
-    {
120
-        switch ($field_name) {
121
-            case 'REG_code':
122
-                if (! empty($field_value) && $this->reg_code() === null) {
123
-                    $this->set_reg_code($field_value, $use_default);
124
-                }
125
-                break;
126
-            case 'STS_ID':
127
-                $this->set_status($field_value, $use_default);
128
-                break;
129
-            default:
130
-                parent::set($field_name, $field_value, $use_default);
131
-        }
132
-    }
133
-
134
-
135
-    /**
136
-     * Set Status ID
137
-     * updates the registration status and ALSO...
138
-     * calls reserve_registration_space() if the reg status changes TO approved from any other reg status
139
-     * calls release_registration_space() if the reg status changes FROM approved to any other reg status
140
-     *
141
-     * @param string                $new_STS_ID
142
-     * @param boolean               $use_default
143
-     * @param ContextInterface|null $context
144
-     * @return bool
145
-     * @throws DomainException
146
-     * @throws EE_Error
147
-     * @throws EntityNotFoundException
148
-     * @throws InvalidArgumentException
149
-     * @throws InvalidDataTypeException
150
-     * @throws InvalidInterfaceException
151
-     * @throws ReflectionException
152
-     * @throws RuntimeException
153
-     * @throws UnexpectedEntityException
154
-     */
155
-    public function set_status($new_STS_ID = null, $use_default = false, ContextInterface $context = null)
156
-    {
157
-        // get current REG_Status
158
-        $old_STS_ID = $this->status_ID();
159
-        // if status has changed
160
-        if ($old_STS_ID !== $new_STS_ID // and that status has actually changed
161
-            && ! empty($old_STS_ID) // and that old status is actually set
162
-            && ! empty($new_STS_ID) // as well as the new status
163
-            && $this->ID() // ensure registration is in the db
164
-        ) {
165
-            // update internal status first
166
-            parent::set('STS_ID', $new_STS_ID, $use_default);
167
-            // THEN handle other changes that occur when reg status changes
168
-            // TO approved
169
-            if ($new_STS_ID === EEM_Registration::status_id_approved) {
170
-                // reserve a space by incrementing ticket and datetime sold values
171
-                $this->reserveRegistrationSpace();
172
-                do_action('AHEE__EE_Registration__set_status__to_approved', $this, $old_STS_ID, $new_STS_ID, $context);
173
-                // OR FROM  approved
174
-            } elseif ($old_STS_ID === EEM_Registration::status_id_approved) {
175
-                // release a space by decrementing ticket and datetime sold values
176
-                $this->releaseRegistrationSpace();
177
-                do_action(
178
-                    'AHEE__EE_Registration__set_status__from_approved',
179
-                    $this,
180
-                    $old_STS_ID,
181
-                    $new_STS_ID,
182
-                    $context
183
-                );
184
-            }
185
-            // update status
186
-            parent::set('STS_ID', $new_STS_ID, $use_default);
187
-            $this->updateIfCanceledOrReinstated($new_STS_ID, $old_STS_ID, $context);
188
-            if ($this->statusChangeUpdatesTransaction($context)) {
189
-                $this->updateTransactionAfterStatusChange();
190
-            }
191
-            do_action('AHEE__EE_Registration__set_status__after_update', $this, $old_STS_ID, $new_STS_ID, $context);
192
-            return true;
193
-        }
194
-        // even though the old value matches the new value, it's still good to
195
-        // allow the parent set method to have a say
196
-        parent::set('STS_ID', $new_STS_ID, $use_default);
197
-        return true;
198
-    }
199
-
200
-
201
-    /**
202
-     * update REGs and TXN when cancelled or declined registrations involved
203
-     *
204
-     * @param string                $new_STS_ID
205
-     * @param string                $old_STS_ID
206
-     * @param ContextInterface|null $context
207
-     * @throws EE_Error
208
-     * @throws InvalidArgumentException
209
-     * @throws InvalidDataTypeException
210
-     * @throws InvalidInterfaceException
211
-     * @throws ReflectionException
212
-     * @throws RuntimeException
213
-     */
214
-    private function updateIfCanceledOrReinstated($new_STS_ID, $old_STS_ID, ContextInterface $context = null)
215
-    {
216
-        // these reg statuses should not be considered in any calculations involving monies owing
217
-        $closed_reg_statuses = EEM_Registration::closed_reg_statuses();
218
-        // true if registration has been cancelled or declined
219
-        $this->updateIfCanceled(
220
-            $closed_reg_statuses,
221
-            $new_STS_ID,
222
-            $old_STS_ID,
223
-            $context
224
-        );
225
-        $this->updateIfReinstated(
226
-            $closed_reg_statuses,
227
-            $new_STS_ID,
228
-            $old_STS_ID,
229
-            $context
230
-        );
231
-    }
232
-
233
-
234
-    /**
235
-     * update REGs and TXN when cancelled or declined registrations involved
236
-     *
237
-     * @param array                 $closed_reg_statuses
238
-     * @param string                $new_STS_ID
239
-     * @param string                $old_STS_ID
240
-     * @param ContextInterface|null $context
241
-     * @throws EE_Error
242
-     * @throws InvalidArgumentException
243
-     * @throws InvalidDataTypeException
244
-     * @throws InvalidInterfaceException
245
-     * @throws ReflectionException
246
-     * @throws RuntimeException
247
-     */
248
-    private function updateIfCanceled(
249
-        array $closed_reg_statuses,
250
-        $new_STS_ID,
251
-        $old_STS_ID,
252
-        ContextInterface $context = null
253
-    ) {
254
-        // true if registration has been cancelled or declined
255
-        if (in_array($new_STS_ID, $closed_reg_statuses, true)
256
-            && ! in_array($old_STS_ID, $closed_reg_statuses, true)
257
-        ) {
258
-            /** @type EE_Registration_Processor $registration_processor */
259
-            $registration_processor = EE_Registry::instance()->load_class('Registration_Processor');
260
-            /** @type EE_Transaction_Processor $transaction_processor */
261
-            $transaction_processor = EE_Registry::instance()->load_class('Transaction_Processor');
262
-            // cancelled or declined registration
263
-            $registration_processor->update_registration_after_being_canceled_or_declined(
264
-                $this,
265
-                $closed_reg_statuses
266
-            );
267
-            $transaction_processor->update_transaction_after_canceled_or_declined_registration(
268
-                $this,
269
-                $closed_reg_statuses,
270
-                false
271
-            );
272
-            do_action(
273
-                'AHEE__EE_Registration__set_status__canceled_or_declined',
274
-                $this,
275
-                $old_STS_ID,
276
-                $new_STS_ID,
277
-                $context
278
-            );
279
-            return;
280
-        }
281
-    }
282
-
283
-
284
-    /**
285
-     * update REGs and TXN when cancelled or declined registrations involved
286
-     *
287
-     * @param array                 $closed_reg_statuses
288
-     * @param string                $new_STS_ID
289
-     * @param string                $old_STS_ID
290
-     * @param ContextInterface|null $context
291
-     * @throws EE_Error
292
-     * @throws InvalidArgumentException
293
-     * @throws InvalidDataTypeException
294
-     * @throws InvalidInterfaceException
295
-     * @throws ReflectionException
296
-     */
297
-    private function updateIfReinstated(
298
-        array $closed_reg_statuses,
299
-        $new_STS_ID,
300
-        $old_STS_ID,
301
-        ContextInterface $context = null
302
-    ) {
303
-        // true if reinstating cancelled or declined registration
304
-        if (in_array($old_STS_ID, $closed_reg_statuses, true)
305
-            && ! in_array($new_STS_ID, $closed_reg_statuses, true)
306
-        ) {
307
-            /** @type EE_Registration_Processor $registration_processor */
308
-            $registration_processor = EE_Registry::instance()->load_class('Registration_Processor');
309
-            /** @type EE_Transaction_Processor $transaction_processor */
310
-            $transaction_processor = EE_Registry::instance()->load_class('Transaction_Processor');
311
-            // reinstating cancelled or declined registration
312
-            $registration_processor->update_canceled_or_declined_registration_after_being_reinstated(
313
-                $this,
314
-                $closed_reg_statuses
315
-            );
316
-            $transaction_processor->update_transaction_after_reinstating_canceled_registration(
317
-                $this,
318
-                $closed_reg_statuses,
319
-                false
320
-            );
321
-            do_action(
322
-                'AHEE__EE_Registration__set_status__after_reinstated',
323
-                $this,
324
-                $old_STS_ID,
325
-                $new_STS_ID,
326
-                $context
327
-            );
328
-        }
329
-    }
330
-
331
-
332
-    /**
333
-     * @param ContextInterface|null $context
334
-     * @return bool
335
-     */
336
-    private function statusChangeUpdatesTransaction(ContextInterface $context = null)
337
-    {
338
-        $contexts_that_do_not_update_transaction = (array) apply_filters(
339
-            'AHEE__EE_Registration__statusChangeUpdatesTransaction__contexts_that_do_not_update_transaction',
340
-            array('spco_reg_step_attendee_information_process_registrations'),
341
-            $context,
342
-            $this
343
-        );
344
-        return ! (
345
-            $context instanceof ContextInterface
346
-            && in_array($context->slug(), $contexts_that_do_not_update_transaction, true)
347
-        );
348
-    }
349
-
350
-
351
-    /**
352
-     * @throws EE_Error
353
-     * @throws EntityNotFoundException
354
-     * @throws InvalidArgumentException
355
-     * @throws InvalidDataTypeException
356
-     * @throws InvalidInterfaceException
357
-     * @throws ReflectionException
358
-     * @throws RuntimeException
359
-     */
360
-    private function updateTransactionAfterStatusChange()
361
-    {
362
-        /** @type EE_Transaction_Payments $transaction_payments */
363
-        $transaction_payments = EE_Registry::instance()->load_class('Transaction_Payments');
364
-        $transaction_payments->recalculate_transaction_total($this->transaction(), false);
365
-        $this->transaction()->update_status_based_on_total_paid(true);
366
-    }
367
-
368
-
369
-    /**
370
-     *        get Status ID
371
-     */
372
-    public function status_ID()
373
-    {
374
-        return $this->get('STS_ID');
375
-    }
376
-
377
-
378
-    /**
379
-     * Gets the ticket this registration is for
380
-     *
381
-     * @param boolean $include_archived whether to include archived tickets or not.
382
-     *
383
-     * @return EE_Ticket|EE_Base_Class
384
-     * @throws EE_Error
385
-     */
386
-    public function ticket($include_archived = true)
387
-    {
388
-        $query_params = array();
389
-        if ($include_archived) {
390
-            $query_params['default_where_conditions'] = 'none';
391
-        }
392
-        return $this->get_first_related('Ticket', $query_params);
393
-    }
394
-
395
-
396
-    /**
397
-     * Gets the event this registration is for
398
-     *
399
-     * @return EE_Event
400
-     * @throws EE_Error
401
-     * @throws EntityNotFoundException
402
-     */
403
-    public function event()
404
-    {
405
-        $event = $this->get_first_related('Event');
406
-        if (! $event instanceof \EE_Event) {
407
-            throw new EntityNotFoundException('Event ID', $this->event_ID());
408
-        }
409
-        return $event;
410
-    }
411
-
412
-
413
-    /**
414
-     * Gets the "author" of the registration.  Note that for the purposes of registrations, the author will correspond
415
-     * with the author of the event this registration is for.
416
-     *
417
-     * @since 4.5.0
418
-     * @return int
419
-     * @throws EE_Error
420
-     * @throws EntityNotFoundException
421
-     */
422
-    public function wp_user()
423
-    {
424
-        $event = $this->event();
425
-        if ($event instanceof EE_Event) {
426
-            return $event->wp_user();
427
-        }
428
-        return 0;
429
-    }
430
-
431
-
432
-    /**
433
-     * increments this registration's related ticket sold and corresponding datetime sold values
434
-     *
435
-     * @return void
436
-     * @throws DomainException
437
-     * @throws EE_Error
438
-     * @throws EntityNotFoundException
439
-     * @throws InvalidArgumentException
440
-     * @throws InvalidDataTypeException
441
-     * @throws InvalidInterfaceException
442
-     * @throws ReflectionException
443
-     * @throws UnexpectedEntityException
444
-     */
445
-    private function reserveRegistrationSpace()
446
-    {
447
-        // reserved ticket and datetime counts will be decremented as sold counts are incremented
448
-        // so stop tracking that this reg has a ticket reserved
449
-        $this->release_reserved_ticket(false, "REG: {$this->ID()} (ln:" . __LINE__ . ')');
450
-        $ticket = $this->ticket();
451
-        $ticket->increaseSold();
452
-        // possibly set event status to sold out
453
-        $this->event()->perform_sold_out_status_check();
454
-    }
455
-
456
-
457
-    /**
458
-     * decrements (subtracts) this registration's related ticket sold and corresponding datetime sold values
459
-     *
460
-     * @return void
461
-     * @throws DomainException
462
-     * @throws EE_Error
463
-     * @throws EntityNotFoundException
464
-     * @throws InvalidArgumentException
465
-     * @throws InvalidDataTypeException
466
-     * @throws InvalidInterfaceException
467
-     * @throws ReflectionException
468
-     * @throws UnexpectedEntityException
469
-     */
470
-    private function releaseRegistrationSpace()
471
-    {
472
-        $ticket = $this->ticket();
473
-        $ticket->decreaseSold();
474
-        // possibly change event status from sold out back to previous status
475
-        $this->event()->perform_sold_out_status_check();
476
-    }
477
-
478
-
479
-    /**
480
-     * tracks this registration's ticket reservation in extra meta
481
-     * and can increment related ticket reserved and corresponding datetime reserved values
482
-     *
483
-     * @param bool $update_ticket if true, will increment ticket and datetime reserved count
484
-     * @return void
485
-     * @throws EE_Error
486
-     * @throws InvalidArgumentException
487
-     * @throws InvalidDataTypeException
488
-     * @throws InvalidInterfaceException
489
-     * @throws ReflectionException
490
-     */
491
-    public function reserve_ticket($update_ticket = false, $source = 'unknown')
492
-    {
493
-        // only reserve ticket if space is not currently reserved
494
-        if ((bool) $this->get_extra_meta(EE_Registration::HAS_RESERVED_TICKET_KEY, true) !== true) {
495
-            $this->update_extra_meta('reserve_ticket', "{$this->ticket_ID()} from {$source}");
496
-            // IMPORTANT !!!
497
-            // although checking $update_ticket first would be more efficient,
498
-            // we NEED to ALWAYS call update_extra_meta(), which is why that is done first
499
-            if ($this->update_extra_meta(EE_Registration::HAS_RESERVED_TICKET_KEY, true)
500
-                && $update_ticket
501
-            ) {
502
-                $ticket = $this->ticket();
503
-                $ticket->increaseReserved(1, "REG: {$this->ID()} (ln:" . __LINE__ . ')');
504
-                $ticket->save();
505
-            }
506
-        }
507
-    }
508
-
509
-
510
-    /**
511
-     * stops tracking this registration's ticket reservation in extra meta
512
-     * decrements (subtracts) related ticket reserved and corresponding datetime reserved values
513
-     *
514
-     * @param bool $update_ticket if true, will decrement ticket and datetime reserved count
515
-     * @return void
516
-     * @throws EE_Error
517
-     * @throws InvalidArgumentException
518
-     * @throws InvalidDataTypeException
519
-     * @throws InvalidInterfaceException
520
-     * @throws ReflectionException
521
-     */
522
-    public function release_reserved_ticket($update_ticket = false, $source = 'unknown')
523
-    {
524
-        // only release ticket if space is currently reserved
525
-        if ((bool) $this->get_extra_meta(EE_Registration::HAS_RESERVED_TICKET_KEY, true) === true) {
526
-            $this->update_extra_meta('release_reserved_ticket', "{$this->ticket_ID()} from {$source}");
527
-            // IMPORTANT !!!
528
-            // although checking $update_ticket first would be more efficient,
529
-            // we NEED to ALWAYS call update_extra_meta(), which is why that is done first
530
-            if ($this->update_extra_meta(EE_Registration::HAS_RESERVED_TICKET_KEY, false)
531
-                && $update_ticket
532
-            ) {
533
-                $ticket = $this->ticket();
534
-                $ticket->decreaseReserved(1, true, "REG: {$this->ID()} (ln:" . __LINE__ . ')');
535
-            }
536
-        }
537
-    }
538
-
539
-
540
-    /**
541
-     * Set Attendee ID
542
-     *
543
-     * @param        int $ATT_ID Attendee ID
544
-     * @throws EE_Error
545
-     * @throws RuntimeException
546
-     */
547
-    public function set_attendee_id($ATT_ID = 0)
548
-    {
549
-        $this->set('ATT_ID', $ATT_ID);
550
-    }
551
-
552
-
553
-    /**
554
-     *        Set Transaction ID
555
-     *
556
-     * @param        int $TXN_ID Transaction ID
557
-     * @throws EE_Error
558
-     * @throws RuntimeException
559
-     */
560
-    public function set_transaction_id($TXN_ID = 0)
561
-    {
562
-        $this->set('TXN_ID', $TXN_ID);
563
-    }
564
-
565
-
566
-    /**
567
-     *        Set Session
568
-     *
569
-     * @param    string $REG_session PHP Session ID
570
-     * @throws EE_Error
571
-     * @throws RuntimeException
572
-     */
573
-    public function set_session($REG_session = '')
574
-    {
575
-        $this->set('REG_session', $REG_session);
576
-    }
577
-
578
-
579
-    /**
580
-     *        Set Registration URL Link
581
-     *
582
-     * @param    string $REG_url_link Registration URL Link
583
-     * @throws EE_Error
584
-     * @throws RuntimeException
585
-     */
586
-    public function set_reg_url_link($REG_url_link = '')
587
-    {
588
-        $this->set('REG_url_link', $REG_url_link);
589
-    }
590
-
591
-
592
-    /**
593
-     *        Set Attendee Counter
594
-     *
595
-     * @param        int $REG_count Primary Attendee
596
-     * @throws EE_Error
597
-     * @throws RuntimeException
598
-     */
599
-    public function set_count($REG_count = 1)
600
-    {
601
-        $this->set('REG_count', $REG_count);
602
-    }
603
-
604
-
605
-    /**
606
-     *        Set Group Size
607
-     *
608
-     * @param        boolean $REG_group_size Group Registration
609
-     * @throws EE_Error
610
-     * @throws RuntimeException
611
-     */
612
-    public function set_group_size($REG_group_size = false)
613
-    {
614
-        $this->set('REG_group_size', $REG_group_size);
615
-    }
616
-
617
-
618
-    /**
619
-     *    is_not_approved -  convenience method that returns TRUE if REG status ID ==
620
-     *    EEM_Registration::status_id_not_approved
621
-     *
622
-     * @return        boolean
623
-     */
624
-    public function is_not_approved()
625
-    {
626
-        return $this->status_ID() == EEM_Registration::status_id_not_approved ? true : false;
627
-    }
628
-
629
-
630
-    /**
631
-     *    is_pending_payment -  convenience method that returns TRUE if REG status ID ==
632
-     *    EEM_Registration::status_id_pending_payment
633
-     *
634
-     * @return        boolean
635
-     */
636
-    public function is_pending_payment()
637
-    {
638
-        return $this->status_ID() == EEM_Registration::status_id_pending_payment ? true : false;
639
-    }
640
-
641
-
642
-    /**
643
-     *    is_approved -  convenience method that returns TRUE if REG status ID == EEM_Registration::status_id_approved
644
-     *
645
-     * @return        boolean
646
-     */
647
-    public function is_approved()
648
-    {
649
-        return $this->status_ID() == EEM_Registration::status_id_approved ? true : false;
650
-    }
651
-
652
-
653
-    /**
654
-     *    is_cancelled -  convenience method that returns TRUE if REG status ID == EEM_Registration::status_id_cancelled
655
-     *
656
-     * @return        boolean
657
-     */
658
-    public function is_cancelled()
659
-    {
660
-        return $this->status_ID() == EEM_Registration::status_id_cancelled ? true : false;
661
-    }
662
-
663
-
664
-    /**
665
-     *    is_declined -  convenience method that returns TRUE if REG status ID == EEM_Registration::status_id_declined
666
-     *
667
-     * @return        boolean
668
-     */
669
-    public function is_declined()
670
-    {
671
-        return $this->status_ID() == EEM_Registration::status_id_declined ? true : false;
672
-    }
673
-
674
-
675
-    /**
676
-     *    is_incomplete -  convenience method that returns TRUE if REG status ID ==
677
-     *    EEM_Registration::status_id_incomplete
678
-     *
679
-     * @return        boolean
680
-     */
681
-    public function is_incomplete()
682
-    {
683
-        return $this->status_ID() == EEM_Registration::status_id_incomplete ? true : false;
684
-    }
685
-
686
-
687
-    /**
688
-     *        Set Registration Date
689
-     *
690
-     * @param        mixed ( int or string ) $REG_date Registration Date - Unix timestamp or string representation of
691
-     *                                                 Date
692
-     * @throws EE_Error
693
-     * @throws RuntimeException
694
-     */
695
-    public function set_reg_date($REG_date = false)
696
-    {
697
-        $this->set('REG_date', $REG_date);
698
-    }
699
-
700
-
701
-    /**
702
-     *    Set final price owing for this registration after all ticket/price modifications
703
-     *
704
-     * @access    public
705
-     * @param    float $REG_final_price
706
-     * @throws EE_Error
707
-     * @throws RuntimeException
708
-     */
709
-    public function set_final_price($REG_final_price = 0.00)
710
-    {
711
-        $this->set('REG_final_price', $REG_final_price);
712
-    }
713
-
714
-
715
-    /**
716
-     *    Set amount paid towards this registration's final price
717
-     *
718
-     * @access    public
719
-     * @param    float $REG_paid
720
-     * @throws EE_Error
721
-     * @throws RuntimeException
722
-     */
723
-    public function set_paid($REG_paid = 0.00)
724
-    {
725
-        $this->set('REG_paid', $REG_paid);
726
-    }
727
-
728
-
729
-    /**
730
-     *        Attendee Is Going
731
-     *
732
-     * @param        boolean $REG_att_is_going Attendee Is Going
733
-     * @throws EE_Error
734
-     * @throws RuntimeException
735
-     */
736
-    public function set_att_is_going($REG_att_is_going = false)
737
-    {
738
-        $this->set('REG_att_is_going', $REG_att_is_going);
739
-    }
740
-
741
-
742
-    /**
743
-     * Gets the related attendee
744
-     *
745
-     * @return EE_Attendee
746
-     * @throws EE_Error
747
-     */
748
-    public function attendee()
749
-    {
750
-        return $this->get_first_related('Attendee');
751
-    }
752
-
753
-
754
-    /**
755
-     *        get Event ID
756
-     */
757
-    public function event_ID()
758
-    {
759
-        return $this->get('EVT_ID');
760
-    }
761
-
762
-
763
-    /**
764
-     *        get Event ID
765
-     */
766
-    public function event_name()
767
-    {
768
-        $event = $this->event_obj();
769
-        if ($event) {
770
-            return $event->name();
771
-        } else {
772
-            return null;
773
-        }
774
-    }
775
-
776
-
777
-    /**
778
-     * Fetches the event this registration is for
779
-     *
780
-     * @return EE_Event
781
-     * @throws EE_Error
782
-     */
783
-    public function event_obj()
784
-    {
785
-        return $this->get_first_related('Event');
786
-    }
787
-
788
-
789
-    /**
790
-     *        get Attendee ID
791
-     */
792
-    public function attendee_ID()
793
-    {
794
-        return $this->get('ATT_ID');
795
-    }
796
-
797
-
798
-    /**
799
-     *        get PHP Session ID
800
-     */
801
-    public function session_ID()
802
-    {
803
-        return $this->get('REG_session');
804
-    }
805
-
806
-
807
-    /**
808
-     * Gets the string which represents the URL trigger for the receipt template in the message template system.
809
-     *
810
-     * @param string $messenger 'pdf' or 'html'.  Default 'html'.
811
-     * @return string
812
-     */
813
-    public function receipt_url($messenger = 'html')
814
-    {
815
-
816
-        /**
817
-         * The below will be deprecated one version after this.  We check first if there is a custom receipt template
818
-         * already in use on old system.  If there is then we just return the standard url for it.
819
-         *
820
-         * @since 4.5.0
821
-         */
822
-        $template_relative_path = 'modules/gateways/Invoice/lib/templates/receipt_body.template.php';
823
-        $has_custom = EEH_Template::locate_template(
824
-            $template_relative_path,
825
-            array(),
826
-            true,
827
-            true,
828
-            true
829
-        );
830
-
831
-        if ($has_custom) {
832
-            return add_query_arg(array('receipt' => 'true'), $this->invoice_url('launch'));
833
-        }
834
-        return apply_filters('FHEE__EE_Registration__receipt_url__receipt_url', '', $this, $messenger, 'receipt');
835
-    }
836
-
837
-
838
-    /**
839
-     * Gets the string which represents the URL trigger for the invoice template in the message template system.
840
-     *
841
-     * @param string $messenger 'pdf' or 'html'.  Default 'html'.
842
-     * @return string
843
-     * @throws EE_Error
844
-     */
845
-    public function invoice_url($messenger = 'html')
846
-    {
847
-        /**
848
-         * The below will be deprecated one version after this.  We check first if there is a custom invoice template
849
-         * already in use on old system.  If there is then we just return the standard url for it.
850
-         *
851
-         * @since 4.5.0
852
-         */
853
-        $template_relative_path = 'modules/gateways/Invoice/lib/templates/invoice_body.template.php';
854
-        $has_custom = EEH_Template::locate_template(
855
-            $template_relative_path,
856
-            array(),
857
-            true,
858
-            true,
859
-            true
860
-        );
861
-
862
-        if ($has_custom) {
863
-            if ($messenger == 'html') {
864
-                return $this->invoice_url('launch');
865
-            }
866
-            $route = $messenger == 'download' || $messenger == 'pdf' ? 'download_invoice' : 'launch_invoice';
867
-
868
-            $query_args = array('ee' => $route, 'id' => $this->reg_url_link());
869
-            if ($messenger == 'html') {
870
-                $query_args['html'] = true;
871
-            }
872
-            return add_query_arg($query_args, get_permalink(EE_Registry::instance()->CFG->core->thank_you_page_id));
873
-        }
874
-        return apply_filters('FHEE__EE_Registration__invoice_url__invoice_url', '', $this, $messenger, 'invoice');
875
-    }
876
-
877
-
878
-    /**
879
-     * get Registration URL Link
880
-     *
881
-     * @access public
882
-     * @return string
883
-     * @throws EE_Error
884
-     */
885
-    public function reg_url_link()
886
-    {
887
-        return (string) $this->get('REG_url_link');
888
-    }
889
-
890
-
891
-    /**
892
-     * Echoes out invoice_url()
893
-     *
894
-     * @param string $type 'download','launch', or 'html' (default is 'launch')
895
-     * @return void
896
-     * @throws EE_Error
897
-     */
898
-    public function e_invoice_url($type = 'launch')
899
-    {
900
-        echo $this->invoice_url($type);
901
-    }
902
-
903
-
904
-    /**
905
-     * Echoes out payment_overview_url
906
-     */
907
-    public function e_payment_overview_url()
908
-    {
909
-        echo $this->payment_overview_url();
910
-    }
911
-
912
-
913
-    /**
914
-     * Gets the URL for the checkout payment options reg step
915
-     * with this registration's REG_url_link added as a query parameter
916
-     *
917
-     * @param bool $clear_session Set to true when you want to clear the session on revisiting the
918
-     *                            payment overview url.
919
-     * @return string
920
-     * @throws InvalidInterfaceException
921
-     * @throws InvalidDataTypeException
922
-     * @throws EE_Error
923
-     * @throws InvalidArgumentException
924
-     */
925
-    public function payment_overview_url($clear_session = false)
926
-    {
927
-        return add_query_arg(
928
-            (array) apply_filters(
929
-                'FHEE__EE_Registration__payment_overview_url__query_args',
930
-                array(
931
-                    'e_reg_url_link' => $this->reg_url_link(),
932
-                    'step'           => 'payment_options',
933
-                    'revisit'        => true,
934
-                    'clear_session'  => (bool) $clear_session,
935
-                ),
936
-                $this
937
-            ),
938
-            EE_Registry::instance()->CFG->core->reg_page_url()
939
-        );
940
-    }
941
-
942
-
943
-    /**
944
-     * Gets the URL for the checkout attendee information reg step
945
-     * with this registration's REG_url_link added as a query parameter
946
-     *
947
-     * @return string
948
-     * @throws InvalidInterfaceException
949
-     * @throws InvalidDataTypeException
950
-     * @throws EE_Error
951
-     * @throws InvalidArgumentException
952
-     */
953
-    public function edit_attendee_information_url()
954
-    {
955
-        return add_query_arg(
956
-            (array) apply_filters(
957
-                'FHEE__EE_Registration__edit_attendee_information_url__query_args',
958
-                array(
959
-                    'e_reg_url_link' => $this->reg_url_link(),
960
-                    'step'           => 'attendee_information',
961
-                    'revisit'        => true,
962
-                ),
963
-                $this
964
-            ),
965
-            EE_Registry::instance()->CFG->core->reg_page_url()
966
-        );
967
-    }
968
-
969
-
970
-    /**
971
-     * Simply generates and returns the appropriate admin_url link to edit this registration
972
-     *
973
-     * @return string
974
-     * @throws EE_Error
975
-     */
976
-    public function get_admin_edit_url()
977
-    {
978
-        return EEH_URL::add_query_args_and_nonce(
979
-            array(
980
-                'page'    => 'espresso_registrations',
981
-                'action'  => 'view_registration',
982
-                '_REG_ID' => $this->ID(),
983
-            ),
984
-            admin_url('admin.php')
985
-        );
986
-    }
987
-
988
-
989
-    /**
990
-     *    is_primary_registrant?
991
-     */
992
-    public function is_primary_registrant()
993
-    {
994
-        return $this->get('REG_count') == 1 ? true : false;
995
-    }
996
-
997
-
998
-    /**
999
-     * This returns the primary registration object for this registration group (which may be this object).
1000
-     *
1001
-     * @return EE_Registration
1002
-     * @throws EE_Error
1003
-     */
1004
-    public function get_primary_registration()
1005
-    {
1006
-        if ($this->is_primary_registrant()) {
1007
-            return $this;
1008
-        }
1009
-
1010
-        // k reg_count !== 1 so let's get the EE_Registration object matching this txn_id and reg_count == 1
1011
-        /** @var EE_Registration $primary_registrant */
1012
-        $primary_registrant = EEM_Registration::instance()->get_one(
1013
-            array(
1014
-                array(
1015
-                    'TXN_ID'    => $this->transaction_ID(),
1016
-                    'REG_count' => 1,
1017
-                ),
1018
-            )
1019
-        );
1020
-        return $primary_registrant;
1021
-    }
1022
-
1023
-
1024
-    /**
1025
-     *        get  Attendee Number
1026
-     *
1027
-     * @access        public
1028
-     */
1029
-    public function count()
1030
-    {
1031
-        return $this->get('REG_count');
1032
-    }
1033
-
1034
-
1035
-    /**
1036
-     *        get Group Size
1037
-     */
1038
-    public function group_size()
1039
-    {
1040
-        return $this->get('REG_group_size');
1041
-    }
1042
-
1043
-
1044
-    /**
1045
-     *        get Registration Date
1046
-     */
1047
-    public function date()
1048
-    {
1049
-        return $this->get('REG_date');
1050
-    }
1051
-
1052
-
1053
-    /**
1054
-     * gets a pretty date
1055
-     *
1056
-     * @param string $date_format
1057
-     * @param string $time_format
1058
-     * @return string
1059
-     * @throws EE_Error
1060
-     */
1061
-    public function pretty_date($date_format = null, $time_format = null)
1062
-    {
1063
-        return $this->get_datetime('REG_date', $date_format, $time_format);
1064
-    }
1065
-
1066
-
1067
-    /**
1068
-     * final_price
1069
-     * the registration's share of the transaction total, so that the
1070
-     * sum of all the transaction's REG_final_prices equal the transaction's total
1071
-     *
1072
-     * @return float
1073
-     * @throws EE_Error
1074
-     */
1075
-    public function final_price()
1076
-    {
1077
-        return $this->get('REG_final_price');
1078
-    }
1079
-
1080
-
1081
-    /**
1082
-     * pretty_final_price
1083
-     *  final price as formatted string, with correct decimal places and currency symbol
1084
-     *
1085
-     * @return string
1086
-     * @throws EE_Error
1087
-     */
1088
-    public function pretty_final_price()
1089
-    {
1090
-        return $this->get_pretty('REG_final_price');
1091
-    }
1092
-
1093
-
1094
-    /**
1095
-     * get paid (yeah)
1096
-     *
1097
-     * @return float
1098
-     * @throws EE_Error
1099
-     */
1100
-    public function paid()
1101
-    {
1102
-        return $this->get('REG_paid');
1103
-    }
1104
-
1105
-
1106
-    /**
1107
-     * pretty_paid
1108
-     *
1109
-     * @return float
1110
-     * @throws EE_Error
1111
-     */
1112
-    public function pretty_paid()
1113
-    {
1114
-        return $this->get_pretty('REG_paid');
1115
-    }
1116
-
1117
-
1118
-    /**
1119
-     * owes_monies_and_can_pay
1120
-     * whether or not this registration has monies owing and it's' status allows payment
1121
-     *
1122
-     * @param array $requires_payment
1123
-     * @return bool
1124
-     * @throws EE_Error
1125
-     */
1126
-    public function owes_monies_and_can_pay($requires_payment = array())
1127
-    {
1128
-        // these reg statuses require payment (if event is not free)
1129
-        $requires_payment = ! empty($requires_payment)
1130
-            ? $requires_payment
1131
-            : EEM_Registration::reg_statuses_that_allow_payment();
1132
-        if (in_array($this->status_ID(), $requires_payment) &&
1133
-            $this->final_price() != 0 &&
1134
-            $this->final_price() != $this->paid()
1135
-        ) {
1136
-            return true;
1137
-        } else {
1138
-            return false;
1139
-        }
1140
-    }
1141
-
1142
-
1143
-    /**
1144
-     * Prints out the return value of $this->pretty_status()
1145
-     *
1146
-     * @param bool $show_icons
1147
-     * @return void
1148
-     * @throws EE_Error
1149
-     */
1150
-    public function e_pretty_status($show_icons = false)
1151
-    {
1152
-        echo $this->pretty_status($show_icons);
1153
-    }
1154
-
1155
-
1156
-    /**
1157
-     * Returns a nice version of the status for displaying to customers
1158
-     *
1159
-     * @param bool $show_icons
1160
-     * @return string
1161
-     * @throws EE_Error
1162
-     */
1163
-    public function pretty_status($show_icons = false)
1164
-    {
1165
-        $status = EEM_Status::instance()->localized_status(
1166
-            array($this->status_ID() => esc_html__('unknown', 'event_espresso')),
1167
-            false,
1168
-            'sentence'
1169
-        );
1170
-        $icon = '';
1171
-        switch ($this->status_ID()) {
1172
-            case EEM_Registration::status_id_approved:
1173
-                $icon = $show_icons
1174
-                    ? '<span class="dashicons dashicons-star-filled ee-icon-size-16 green-text"></span>'
1175
-                    : '';
1176
-                break;
1177
-            case EEM_Registration::status_id_pending_payment:
1178
-                $icon = $show_icons
1179
-                    ? '<span class="dashicons dashicons-star-half ee-icon-size-16 orange-text"></span>'
1180
-                    : '';
1181
-                break;
1182
-            case EEM_Registration::status_id_not_approved:
1183
-                $icon = $show_icons
1184
-                    ? '<span class="dashicons dashicons-marker ee-icon-size-16 orange-text"></span>'
1185
-                    : '';
1186
-                break;
1187
-            case EEM_Registration::status_id_cancelled:
1188
-                $icon = $show_icons
1189
-                    ? '<span class="dashicons dashicons-no ee-icon-size-16 lt-grey-text"></span>'
1190
-                    : '';
1191
-                break;
1192
-            case EEM_Registration::status_id_incomplete:
1193
-                $icon = $show_icons
1194
-                    ? '<span class="dashicons dashicons-no ee-icon-size-16 lt-orange-text"></span>'
1195
-                    : '';
1196
-                break;
1197
-            case EEM_Registration::status_id_declined:
1198
-                $icon = $show_icons
1199
-                    ? '<span class="dashicons dashicons-no ee-icon-size-16 red-text"></span>'
1200
-                    : '';
1201
-                break;
1202
-            case EEM_Registration::status_id_wait_list:
1203
-                $icon = $show_icons
1204
-                    ? '<span class="dashicons dashicons-clipboard ee-icon-size-16 purple-text"></span>'
1205
-                    : '';
1206
-                break;
1207
-        }
1208
-        return $icon . $status[ $this->status_ID() ];
1209
-    }
1210
-
1211
-
1212
-    /**
1213
-     *        get Attendee Is Going
1214
-     */
1215
-    public function att_is_going()
1216
-    {
1217
-        return $this->get('REG_att_is_going');
1218
-    }
1219
-
1220
-
1221
-    /**
1222
-     * Gets related answers
1223
-     *
1224
-     * @param array $query_params @see https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md
1225
-     * @return EE_Answer[]
1226
-     * @throws EE_Error
1227
-     */
1228
-    public function answers($query_params = null)
1229
-    {
1230
-        return $this->get_many_related('Answer', $query_params);
1231
-    }
1232
-
1233
-
1234
-    /**
1235
-     * Gets the registration's answer value to the specified question
1236
-     * (either the question's ID or a question object)
1237
-     *
1238
-     * @param EE_Question|int $question
1239
-     * @param bool            $pretty_value
1240
-     * @return array|string if pretty_value= true, the result will always be a string
1241
-     * (because the answer might be an array of answer values, so passing pretty_value=true
1242
-     * will convert it into some kind of string)
1243
-     * @throws EE_Error
1244
-     */
1245
-    public function answer_value_to_question($question, $pretty_value = true)
1246
-    {
1247
-        $question_id = EEM_Question::instance()->ensure_is_ID($question);
1248
-        return EEM_Answer::instance()->get_answer_value_to_question($this, $question_id, $pretty_value);
1249
-    }
1250
-
1251
-
1252
-    /**
1253
-     * question_groups
1254
-     * returns an array of EE_Question_Group objects for this registration
1255
-     *
1256
-     * @return EE_Question_Group[]
1257
-     * @throws EE_Error
1258
-     * @throws EntityNotFoundException
1259
-     */
1260
-    public function question_groups()
1261
-    {
1262
-        $question_groups = array();
1263
-        if ($this->event() instanceof EE_Event) {
1264
-            $question_groups = $this->event()->question_groups(
1265
-                array(
1266
-                    array(
1267
-                        'Event_Question_Group.EQG_primary' => $this->count() == 1 ? true : false,
1268
-                    ),
1269
-                    'order_by' => array('QSG_order' => 'ASC'),
1270
-                )
1271
-            );
1272
-        }
1273
-        return $question_groups;
1274
-    }
1275
-
1276
-
1277
-    /**
1278
-     * count_question_groups
1279
-     * returns a count of the number of EE_Question_Group objects for this registration
1280
-     *
1281
-     * @return int
1282
-     * @throws EE_Error
1283
-     * @throws EntityNotFoundException
1284
-     */
1285
-    public function count_question_groups()
1286
-    {
1287
-        $qg_count = 0;
1288
-        if ($this->event() instanceof EE_Event) {
1289
-            $qg_count = $this->event()->count_related(
1290
-                'Question_Group',
1291
-                array(
1292
-                    array(
1293
-                        'Event_Question_Group.EQG_primary' => $this->count() == 1 ? true : false,
1294
-                    ),
1295
-                )
1296
-            );
1297
-        }
1298
-        return $qg_count;
1299
-    }
1300
-
1301
-
1302
-    /**
1303
-     * Returns the registration date in the 'standard' string format
1304
-     * (function may be improved in the future to allow for different formats and timezones)
1305
-     *
1306
-     * @return string
1307
-     * @throws EE_Error
1308
-     */
1309
-    public function reg_date()
1310
-    {
1311
-        return $this->get_datetime('REG_date');
1312
-    }
1313
-
1314
-
1315
-    /**
1316
-     * Gets the datetime-ticket for this registration (ie, it can be used to isolate
1317
-     * the ticket this registration purchased, or the datetime they have registered
1318
-     * to attend)
1319
-     *
1320
-     * @return EE_Datetime_Ticket
1321
-     * @throws EE_Error
1322
-     */
1323
-    public function datetime_ticket()
1324
-    {
1325
-        return $this->get_first_related('Datetime_Ticket');
1326
-    }
1327
-
1328
-
1329
-    /**
1330
-     * Sets the registration's datetime_ticket.
1331
-     *
1332
-     * @param EE_Datetime_Ticket $datetime_ticket
1333
-     * @return EE_Datetime_Ticket
1334
-     * @throws EE_Error
1335
-     */
1336
-    public function set_datetime_ticket($datetime_ticket)
1337
-    {
1338
-        return $this->_add_relation_to($datetime_ticket, 'Datetime_Ticket');
1339
-    }
1340
-
1341
-    /**
1342
-     * Gets deleted
1343
-     *
1344
-     * @return bool
1345
-     * @throws EE_Error
1346
-     */
1347
-    public function deleted()
1348
-    {
1349
-        return $this->get('REG_deleted');
1350
-    }
1351
-
1352
-    /**
1353
-     * Sets deleted
1354
-     *
1355
-     * @param boolean $deleted
1356
-     * @return bool
1357
-     * @throws EE_Error
1358
-     * @throws RuntimeException
1359
-     */
1360
-    public function set_deleted($deleted)
1361
-    {
1362
-        if ($deleted) {
1363
-            $this->delete();
1364
-        } else {
1365
-            $this->restore();
1366
-        }
1367
-    }
1368
-
1369
-
1370
-    /**
1371
-     * Get the status object of this object
1372
-     *
1373
-     * @return EE_Status
1374
-     * @throws EE_Error
1375
-     */
1376
-    public function status_obj()
1377
-    {
1378
-        return $this->get_first_related('Status');
1379
-    }
1380
-
1381
-
1382
-    /**
1383
-     * Returns the number of times this registration has checked into any of the datetimes
1384
-     * its available for
1385
-     *
1386
-     * @return int
1387
-     * @throws EE_Error
1388
-     */
1389
-    public function count_checkins()
1390
-    {
1391
-        return $this->get_model()->count_related($this, 'Checkin');
1392
-    }
1393
-
1394
-
1395
-    /**
1396
-     * Returns the number of current Check-ins this registration is checked into for any of the datetimes the
1397
-     * registration is for.  Note, this is ONLY checked in (does not include checkedout)
1398
-     *
1399
-     * @return int
1400
-     * @throws EE_Error
1401
-     */
1402
-    public function count_checkins_not_checkedout()
1403
-    {
1404
-        return $this->get_model()->count_related($this, 'Checkin', array(array('CHK_in' => 1)));
1405
-    }
1406
-
1407
-
1408
-    /**
1409
-     * The purpose of this method is simply to check whether this registration can checkin to the given datetime.
1410
-     *
1411
-     * @param int | EE_Datetime $DTT_OR_ID      The datetime the registration is being checked against
1412
-     * @param bool              $check_approved This is used to indicate whether the caller wants can_checkin to also
1413
-     *                                          consider registration status as well as datetime access.
1414
-     * @return bool
1415
-     * @throws EE_Error
1416
-     */
1417
-    public function can_checkin($DTT_OR_ID, $check_approved = true)
1418
-    {
1419
-        $DTT_ID = EEM_Datetime::instance()->ensure_is_ID($DTT_OR_ID);
1420
-
1421
-        // first check registration status
1422
-        if (($check_approved && ! $this->is_approved()) || ! $DTT_ID) {
1423
-            return false;
1424
-        }
1425
-        // is there a datetime ticket that matches this dtt_ID?
1426
-        if (! (EEM_Datetime_Ticket::instance()->exists(
1427
-            array(
1428
-                array(
1429
-                    'TKT_ID' => $this->get('TKT_ID'),
1430
-                    'DTT_ID' => $DTT_ID,
1431
-                ),
1432
-            )
1433
-        ))
1434
-        ) {
1435
-            return false;
1436
-        }
1437
-
1438
-        // final check is against TKT_uses
1439
-        return $this->verify_can_checkin_against_TKT_uses($DTT_ID);
1440
-    }
1441
-
1442
-
1443
-    /**
1444
-     * This method verifies whether the user can checkin for the given datetime considering the max uses value set on
1445
-     * the ticket. To do this,  a query is done to get the count of the datetime records already checked into.  If the
1446
-     * datetime given does not have a check-in record and checking in for that datetime will exceed the allowed uses,
1447
-     * then return false.  Otherwise return true.
1448
-     *
1449
-     * @param int | EE_Datetime $DTT_OR_ID The datetime the registration is being checked against
1450
-     * @return bool true means can checkin.  false means cannot checkin.
1451
-     * @throws EE_Error
1452
-     */
1453
-    public function verify_can_checkin_against_TKT_uses($DTT_OR_ID)
1454
-    {
1455
-        $DTT_ID = EEM_Datetime::instance()->ensure_is_ID($DTT_OR_ID);
1456
-
1457
-        if (! $DTT_ID) {
1458
-            return false;
1459
-        }
1460
-
1461
-        $max_uses = $this->ticket() instanceof EE_Ticket ? $this->ticket()->uses() : EE_INF;
1462
-
1463
-        // if max uses is not set or equals infinity then return true cause its not a factor for whether user can
1464
-        // check-in or not.
1465
-        if (! $max_uses || $max_uses === EE_INF) {
1466
-            return true;
1467
-        }
1468
-
1469
-        // does this datetime have a checkin record?  If so, then the dtt count has already been verified so we can just
1470
-        // go ahead and toggle.
1471
-        if (EEM_Checkin::instance()->exists(array(array('REG_ID' => $this->ID(), 'DTT_ID' => $DTT_ID)))) {
1472
-            return true;
1473
-        }
1474
-
1475
-        // made it here so the last check is whether the number of checkins per unique datetime on this registration
1476
-        // disallows further check-ins.
1477
-        $count_unique_dtt_checkins = EEM_Checkin::instance()->count(
1478
-            array(
1479
-                array(
1480
-                    'REG_ID' => $this->ID(),
1481
-                    'CHK_in' => true,
1482
-                ),
1483
-            ),
1484
-            'DTT_ID',
1485
-            true
1486
-        );
1487
-        // checkins have already reached their max number of uses
1488
-        // so registrant can NOT checkin
1489
-        if ($count_unique_dtt_checkins >= $max_uses) {
1490
-            EE_Error::add_error(
1491
-                esc_html__(
1492
-                    'Check-in denied because number of datetime uses for the ticket has been reached or exceeded.',
1493
-                    'event_espresso'
1494
-                ),
1495
-                __FILE__,
1496
-                __FUNCTION__,
1497
-                __LINE__
1498
-            );
1499
-            return false;
1500
-        }
1501
-        return true;
1502
-    }
1503
-
1504
-
1505
-    /**
1506
-     * toggle Check-in status for this registration
1507
-     * Check-ins are toggled in the following order:
1508
-     * never checked in -> checked in
1509
-     * checked in -> checked out
1510
-     * checked out -> checked in
1511
-     *
1512
-     * @param  int $DTT_ID  include specific datetime to toggle Check-in for.
1513
-     *                      If not included or null, then it is assumed latest datetime is being toggled.
1514
-     * @param bool $verify  If true then can_checkin() is used to verify whether the person
1515
-     *                      can be checked in or not.  Otherwise this forces change in checkin status.
1516
-     * @return bool|int     the chk_in status toggled to OR false if nothing got changed.
1517
-     * @throws EE_Error
1518
-     */
1519
-    public function toggle_checkin_status($DTT_ID = null, $verify = false)
1520
-    {
1521
-        if (empty($DTT_ID)) {
1522
-            $datetime = $this->get_latest_related_datetime();
1523
-            $DTT_ID = $datetime instanceof EE_Datetime ? $datetime->ID() : 0;
1524
-            // verify the registration can checkin for the given DTT_ID
1525
-        } elseif (! $this->can_checkin($DTT_ID, $verify)) {
1526
-            EE_Error::add_error(
1527
-                sprintf(
1528
-                    esc_html__(
1529
-                        'The given registration (ID:%1$d) can not be checked in to the given DTT_ID (%2$d), because the registration does not have access',
1530
-                        'event_espresso'
1531
-                    ),
1532
-                    $this->ID(),
1533
-                    $DTT_ID
1534
-                ),
1535
-                __FILE__,
1536
-                __FUNCTION__,
1537
-                __LINE__
1538
-            );
1539
-            return false;
1540
-        }
1541
-        $status_paths = array(
1542
-            EE_Checkin::status_checked_never => EE_Checkin::status_checked_in,
1543
-            EE_Checkin::status_checked_in    => EE_Checkin::status_checked_out,
1544
-            EE_Checkin::status_checked_out   => EE_Checkin::status_checked_in,
1545
-        );
1546
-        // start by getting the current status so we know what status we'll be changing to.
1547
-        $cur_status = $this->check_in_status_for_datetime($DTT_ID, null);
1548
-        $status_to = $status_paths[ $cur_status ];
1549
-        // database only records true for checked IN or false for checked OUT
1550
-        // no record ( null ) means checked in NEVER, but we obviously don't save that
1551
-        $new_status = $status_to === EE_Checkin::status_checked_in ? true : false;
1552
-        // add relation - note Check-ins are always creating new rows
1553
-        // because we are keeping track of Check-ins over time.
1554
-        // Eventually we'll probably want to show a list table
1555
-        // for the individual Check-ins so that they can be managed.
1556
-        $checkin = EE_Checkin::new_instance(
1557
-            array(
1558
-                'REG_ID' => $this->ID(),
1559
-                'DTT_ID' => $DTT_ID,
1560
-                'CHK_in' => $new_status,
1561
-            )
1562
-        );
1563
-        // if the record could not be saved then return false
1564
-        if ($checkin->save() === 0) {
1565
-            if (WP_DEBUG) {
1566
-                global $wpdb;
1567
-                $error = sprintf(
1568
-                    esc_html__(
1569
-                        'Registration check in update failed because of the following database error: %1$s%2$s',
1570
-                        'event_espresso'
1571
-                    ),
1572
-                    '<br />',
1573
-                    $wpdb->last_error
1574
-                );
1575
-            } else {
1576
-                $error = esc_html__(
1577
-                    'Registration check in update failed because of an unknown database error',
1578
-                    'event_espresso'
1579
-                );
1580
-            }
1581
-            EE_Error::add_error($error, __FILE__, __FUNCTION__, __LINE__);
1582
-            return false;
1583
-        }
1584
-        return $status_to;
1585
-    }
1586
-
1587
-
1588
-    /**
1589
-     * Returns the latest datetime related to this registration (via the ticket attached to the registration).
1590
-     * "Latest" is defined by the `DTT_EVT_start` column.
1591
-     *
1592
-     * @return EE_Datetime|null
1593
-     * @throws EE_Error
1594
-     */
1595
-    public function get_latest_related_datetime()
1596
-    {
1597
-        return EEM_Datetime::instance()->get_one(
1598
-            array(
1599
-                array(
1600
-                    'Ticket.Registration.REG_ID' => $this->ID(),
1601
-                ),
1602
-                'order_by' => array('DTT_EVT_start' => 'DESC'),
1603
-            )
1604
-        );
1605
-    }
1606
-
1607
-
1608
-    /**
1609
-     * Returns the earliest datetime related to this registration (via the ticket attached to the registration).
1610
-     * "Earliest" is defined by the `DTT_EVT_start` column.
1611
-     *
1612
-     * @throws EE_Error
1613
-     */
1614
-    public function get_earliest_related_datetime()
1615
-    {
1616
-        return EEM_Datetime::instance()->get_one(
1617
-            array(
1618
-                array(
1619
-                    'Ticket.Registration.REG_ID' => $this->ID(),
1620
-                ),
1621
-                'order_by' => array('DTT_EVT_start' => 'ASC'),
1622
-            )
1623
-        );
1624
-    }
1625
-
1626
-
1627
-    /**
1628
-     * This method simply returns the check-in status for this registration and the given datetime.
1629
-     * If neither the datetime nor the checkin values are provided as arguments,
1630
-     * then this will return the LATEST check-in status for the registration across all datetimes it belongs to.
1631
-     *
1632
-     * @param  int       $DTT_ID  The ID of the datetime we're checking against
1633
-     *                            (if empty we'll get the primary datetime for
1634
-     *                            this registration (via event) and use it's ID);
1635
-     * @param EE_Checkin $checkin If present, we use the given checkin object rather than the dtt_id.
1636
-     *
1637
-     * @return int                Integer representing Check-in status.
1638
-     * @throws EE_Error
1639
-     */
1640
-    public function check_in_status_for_datetime($DTT_ID = 0, $checkin = null)
1641
-    {
1642
-        $checkin_query_params = array(
1643
-            'order_by' => array('CHK_timestamp' => 'DESC'),
1644
-        );
1645
-
1646
-        if ($DTT_ID > 0) {
1647
-            $checkin_query_params[0] = array('DTT_ID' => $DTT_ID);
1648
-        }
1649
-
1650
-        // get checkin object (if exists)
1651
-        $checkin = $checkin instanceof EE_Checkin
1652
-            ? $checkin
1653
-            : $this->get_first_related('Checkin', $checkin_query_params);
1654
-        if ($checkin instanceof EE_Checkin) {
1655
-            if ($checkin->get('CHK_in')) {
1656
-                return EE_Checkin::status_checked_in; // checked in
1657
-            }
1658
-            return EE_Checkin::status_checked_out; // had checked in but is now checked out.
1659
-        }
1660
-        return EE_Checkin::status_checked_never; // never been checked in
1661
-    }
1662
-
1663
-
1664
-    /**
1665
-     * This method returns a localized message for the toggled Check-in message.
1666
-     *
1667
-     * @param  int $DTT_ID include specific datetime to get the correct Check-in message.  If not included or null,
1668
-     *                     then it is assumed Check-in for primary datetime was toggled.
1669
-     * @param bool $error  This just flags that you want an error message returned. This is put in so that the error
1670
-     *                     message can be customized with the attendee name.
1671
-     * @return string internationalized message
1672
-     * @throws EE_Error
1673
-     */
1674
-    public function get_checkin_msg($DTT_ID, $error = false)
1675
-    {
1676
-        // let's get the attendee first so we can include the name of the attendee
1677
-        $attendee = $this->get_first_related('Attendee');
1678
-        if ($attendee instanceof EE_Attendee) {
1679
-            if ($error) {
1680
-                return sprintf(__("%s's check-in status was not changed.", "event_espresso"), $attendee->full_name());
1681
-            }
1682
-            $cur_status = $this->check_in_status_for_datetime($DTT_ID);
1683
-            // what is the status message going to be?
1684
-            switch ($cur_status) {
1685
-                case EE_Checkin::status_checked_never:
1686
-                    return sprintf(
1687
-                        __("%s has been removed from Check-in records", "event_espresso"),
1688
-                        $attendee->full_name()
1689
-                    );
1690
-                    break;
1691
-                case EE_Checkin::status_checked_in:
1692
-                    return sprintf(__('%s has been checked in', 'event_espresso'), $attendee->full_name());
1693
-                    break;
1694
-                case EE_Checkin::status_checked_out:
1695
-                    return sprintf(__('%s has been checked out', 'event_espresso'), $attendee->full_name());
1696
-                    break;
1697
-            }
1698
-        }
1699
-        return esc_html__("The check-in status could not be determined.", "event_espresso");
1700
-    }
1701
-
1702
-
1703
-    /**
1704
-     * Returns the related EE_Transaction to this registration
1705
-     *
1706
-     * @return EE_Transaction
1707
-     * @throws EE_Error
1708
-     * @throws EntityNotFoundException
1709
-     */
1710
-    public function transaction()
1711
-    {
1712
-        $transaction = $this->get_first_related('Transaction');
1713
-        if (! $transaction instanceof \EE_Transaction) {
1714
-            throw new EntityNotFoundException('Transaction ID', $this->transaction_ID());
1715
-        }
1716
-        return $transaction;
1717
-    }
1718
-
1719
-
1720
-    /**
1721
-     *        get Registration Code
1722
-     */
1723
-    public function reg_code()
1724
-    {
1725
-        return $this->get('REG_code');
1726
-    }
1727
-
1728
-
1729
-    /**
1730
-     *        get Transaction ID
1731
-     */
1732
-    public function transaction_ID()
1733
-    {
1734
-        return $this->get('TXN_ID');
1735
-    }
1736
-
1737
-
1738
-    /**
1739
-     * @return int
1740
-     * @throws EE_Error
1741
-     */
1742
-    public function ticket_ID()
1743
-    {
1744
-        return $this->get('TKT_ID');
1745
-    }
1746
-
1747
-
1748
-    /**
1749
-     *        Set Registration Code
1750
-     *
1751
-     * @access    public
1752
-     * @param    string  $REG_code Registration Code
1753
-     * @param    boolean $use_default
1754
-     * @throws EE_Error
1755
-     */
1756
-    public function set_reg_code($REG_code, $use_default = false)
1757
-    {
1758
-        if (empty($REG_code)) {
1759
-            EE_Error::add_error(
1760
-                esc_html__('REG_code can not be empty.', 'event_espresso'),
1761
-                __FILE__,
1762
-                __FUNCTION__,
1763
-                __LINE__
1764
-            );
1765
-            return;
1766
-        }
1767
-        if (! $this->reg_code()) {
1768
-            parent::set('REG_code', $REG_code, $use_default);
1769
-        } else {
1770
-            EE_Error::doing_it_wrong(
1771
-                __CLASS__ . '::' . __FUNCTION__,
1772
-                esc_html__('Can not change a registration REG_code once it has been set.', 'event_espresso'),
1773
-                '4.6.0'
1774
-            );
1775
-        }
1776
-    }
1777
-
1778
-
1779
-    /**
1780
-     * Returns all other registrations in the same group as this registrant who have the same ticket option.
1781
-     * Note, if you want to just get all registrations in the same transaction (group), use:
1782
-     *    $registration->transaction()->registrations();
1783
-     *
1784
-     * @since 4.5.0
1785
-     * @return EE_Registration[] or empty array if this isn't a group registration.
1786
-     * @throws EE_Error
1787
-     */
1788
-    public function get_all_other_registrations_in_group()
1789
-    {
1790
-        if ($this->group_size() < 2) {
1791
-            return array();
1792
-        }
1793
-
1794
-        $query[0] = array(
1795
-            'TXN_ID' => $this->transaction_ID(),
1796
-            'REG_ID' => array('!=', $this->ID()),
1797
-            'TKT_ID' => $this->ticket_ID(),
1798
-        );
1799
-        /** @var EE_Registration[] $registrations */
1800
-        $registrations = $this->get_model()->get_all($query);
1801
-        return $registrations;
1802
-    }
1803
-
1804
-    /**
1805
-     * Return the link to the admin details for the object.
1806
-     *
1807
-     * @return string
1808
-     * @throws EE_Error
1809
-     */
1810
-    public function get_admin_details_link()
1811
-    {
1812
-        EE_Registry::instance()->load_helper('URL');
1813
-        return EEH_URL::add_query_args_and_nonce(
1814
-            array(
1815
-                'page'    => 'espresso_registrations',
1816
-                'action'  => 'view_registration',
1817
-                '_REG_ID' => $this->ID(),
1818
-            ),
1819
-            admin_url('admin.php')
1820
-        );
1821
-    }
1822
-
1823
-    /**
1824
-     * Returns the link to the editor for the object.  Sometimes this is the same as the details.
1825
-     *
1826
-     * @return string
1827
-     * @throws EE_Error
1828
-     */
1829
-    public function get_admin_edit_link()
1830
-    {
1831
-        return $this->get_admin_details_link();
1832
-    }
1833
-
1834
-    /**
1835
-     * Returns the link to a settings page for the object.
1836
-     *
1837
-     * @return string
1838
-     * @throws EE_Error
1839
-     */
1840
-    public function get_admin_settings_link()
1841
-    {
1842
-        return $this->get_admin_details_link();
1843
-    }
1844
-
1845
-    /**
1846
-     * Returns the link to the "overview" for the object (typically the "list table" view).
1847
-     *
1848
-     * @return string
1849
-     */
1850
-    public function get_admin_overview_link()
1851
-    {
1852
-        EE_Registry::instance()->load_helper('URL');
1853
-        return EEH_URL::add_query_args_and_nonce(
1854
-            array(
1855
-                'page' => 'espresso_registrations',
1856
-            ),
1857
-            admin_url('admin.php')
1858
-        );
1859
-    }
1860
-
1861
-
1862
-    /**
1863
-     * @param array $query_params
1864
-     *
1865
-     * @return \EE_Registration[]
1866
-     * @throws EE_Error
1867
-     */
1868
-    public function payments($query_params = array())
1869
-    {
1870
-        return $this->get_many_related('Payment', $query_params);
1871
-    }
1872
-
1873
-
1874
-    /**
1875
-     * @param array $query_params
1876
-     *
1877
-     * @return \EE_Registration_Payment[]
1878
-     * @throws EE_Error
1879
-     */
1880
-    public function registration_payments($query_params = array())
1881
-    {
1882
-        return $this->get_many_related('Registration_Payment', $query_params);
1883
-    }
1884
-
1885
-
1886
-    /**
1887
-     * This grabs the payment method corresponding to the last payment made for the amount owing on the registration.
1888
-     * Note: if there are no payments on the registration there will be no payment method returned.
1889
-     *
1890
-     * @return EE_Payment_Method|null
1891
-     */
1892
-    public function payment_method()
1893
-    {
1894
-        return EEM_Payment_Method::instance()->get_last_used_for_registration($this);
1895
-    }
1896
-
1897
-
1898
-    /**
1899
-     * @return \EE_Line_Item
1900
-     * @throws EntityNotFoundException
1901
-     * @throws EE_Error
1902
-     */
1903
-    public function ticket_line_item()
1904
-    {
1905
-        $ticket = $this->ticket();
1906
-        $transaction = $this->transaction();
1907
-        $line_item = null;
1908
-        $ticket_line_items = \EEH_Line_Item::get_line_items_by_object_type_and_IDs(
1909
-            $transaction->total_line_item(),
1910
-            'Ticket',
1911
-            array($ticket->ID())
1912
-        );
1913
-        foreach ($ticket_line_items as $ticket_line_item) {
1914
-            if ($ticket_line_item instanceof \EE_Line_Item
1915
-                && $ticket_line_item->OBJ_type() === 'Ticket'
1916
-                && $ticket_line_item->OBJ_ID() === $ticket->ID()
1917
-            ) {
1918
-                $line_item = $ticket_line_item;
1919
-                break;
1920
-            }
1921
-        }
1922
-        if (! ($line_item instanceof \EE_Line_Item && $line_item->OBJ_type() === 'Ticket')) {
1923
-            throw new EntityNotFoundException('Line Item Ticket ID', $ticket->ID());
1924
-        }
1925
-        return $line_item;
1926
-    }
1927
-
1928
-
1929
-    /**
1930
-     * Soft Deletes this model object.
1931
-     *
1932
-     * @return boolean | int
1933
-     * @throws RuntimeException
1934
-     * @throws EE_Error
1935
-     */
1936
-    public function delete()
1937
-    {
1938
-        if ($this->update_extra_meta(EE_Registration::PRE_TRASH_REG_STATUS_KEY, $this->status_ID()) === true) {
1939
-            $this->set_status(EEM_Registration::status_id_cancelled);
1940
-        }
1941
-        return parent::delete();
1942
-    }
1943
-
1944
-
1945
-    /**
1946
-     * Restores whatever the previous status was on a registration before it was trashed (if possible)
1947
-     *
1948
-     * @throws EE_Error
1949
-     * @throws RuntimeException
1950
-     */
1951
-    public function restore()
1952
-    {
1953
-        $previous_status = $this->get_extra_meta(
1954
-            EE_Registration::PRE_TRASH_REG_STATUS_KEY,
1955
-            true,
1956
-            EEM_Registration::status_id_cancelled
1957
-        );
1958
-        if ($previous_status) {
1959
-            $this->delete_extra_meta(EE_Registration::PRE_TRASH_REG_STATUS_KEY);
1960
-            $this->set_status($previous_status);
1961
-        }
1962
-        return parent::restore();
1963
-    }
1964
-
1965
-
1966
-    /**
1967
-     * possibly toggle Registration status based on comparison of REG_paid vs REG_final_price
1968
-     *
1969
-     * @param  boolean $trigger_set_status_logic EE_Registration::set_status() can trigger additional logic
1970
-     *                                           depending on whether the reg status changes to or from "Approved"
1971
-     * @return boolean whether the Registration status was updated
1972
-     * @throws EE_Error
1973
-     * @throws RuntimeException
1974
-     */
1975
-    public function updateStatusBasedOnTotalPaid($trigger_set_status_logic = true)
1976
-    {
1977
-        $paid = $this->paid();
1978
-        $price = $this->final_price();
1979
-        switch (true) {
1980
-            // overpaid or paid
1981
-            case EEH_Money::compare_floats($paid, $price, '>'):
1982
-            case EEH_Money::compare_floats($paid, $price):
1983
-                $new_status = EEM_Registration::status_id_approved;
1984
-                break;
1985
-            //  underpaid
1986
-            case EEH_Money::compare_floats($paid, $price, '<'):
1987
-                $new_status = EEM_Registration::status_id_pending_payment;
1988
-                break;
1989
-            // uhhh Houston...
1990
-            default:
1991
-                throw new RuntimeException(
1992
-                    esc_html__('The total paid calculation for this registration is inaccurate.', 'event_espresso')
1993
-                );
1994
-        }
1995
-        if ($new_status !== $this->status_ID()) {
1996
-            if ($trigger_set_status_logic) {
1997
-                return $this->set_status($new_status);
1998
-            }
1999
-            parent::set('STS_ID', $new_status);
2000
-            return true;
2001
-        }
2002
-        return false;
2003
-    }
2004
-
2005
-
2006
-    /*************************** DEPRECATED ***************************/
2007
-
2008
-
2009
-    /**
2010
-     * @deprecated
2011
-     * @since     4.7.0
2012
-     * @access    public
2013
-     */
2014
-    public function price_paid()
2015
-    {
2016
-        EE_Error::doing_it_wrong(
2017
-            'EE_Registration::price_paid()',
2018
-            esc_html__(
2019
-                'This method is deprecated, please use EE_Registration::final_price() instead.',
2020
-                'event_espresso'
2021
-            ),
2022
-            '4.7.0'
2023
-        );
2024
-        return $this->final_price();
2025
-    }
2026
-
2027
-
2028
-    /**
2029
-     * @deprecated
2030
-     * @since     4.7.0
2031
-     * @access    public
2032
-     * @param    float $REG_final_price
2033
-     * @throws EE_Error
2034
-     * @throws RuntimeException
2035
-     */
2036
-    public function set_price_paid($REG_final_price = 0.00)
2037
-    {
2038
-        EE_Error::doing_it_wrong(
2039
-            'EE_Registration::set_price_paid()',
2040
-            esc_html__(
2041
-                'This method is deprecated, please use EE_Registration::set_final_price() instead.',
2042
-                'event_espresso'
2043
-            ),
2044
-            '4.7.0'
2045
-        );
2046
-        $this->set_final_price($REG_final_price);
2047
-    }
2048
-
2049
-
2050
-    /**
2051
-     * @deprecated
2052
-     * @since 4.7.0
2053
-     * @return string
2054
-     * @throws EE_Error
2055
-     */
2056
-    public function pretty_price_paid()
2057
-    {
2058
-        EE_Error::doing_it_wrong(
2059
-            'EE_Registration::pretty_price_paid()',
2060
-            esc_html__(
2061
-                'This method is deprecated, please use EE_Registration::pretty_final_price() instead.',
2062
-                'event_espresso'
2063
-            ),
2064
-            '4.7.0'
2065
-        );
2066
-        return $this->pretty_final_price();
2067
-    }
2068
-
2069
-
2070
-    /**
2071
-     * Gets the primary datetime related to this registration via the related Event to this registration
2072
-     *
2073
-     * @deprecated 4.9.17
2074
-     * @return EE_Datetime
2075
-     * @throws EE_Error
2076
-     * @throws EntityNotFoundException
2077
-     */
2078
-    public function get_related_primary_datetime()
2079
-    {
2080
-        EE_Error::doing_it_wrong(
2081
-            __METHOD__,
2082
-            esc_html__(
2083
-                'Use EE_Registration::get_latest_related_datetime() or EE_Registration::get_earliest_related_datetime()',
2084
-                'event_espresso'
2085
-            ),
2086
-            '4.9.17',
2087
-            '5.0.0'
2088
-        );
2089
-        return $this->event()->primary_datetime();
2090
-    }
20
+	/**
21
+	 * Used to reference when a registration has never been checked in.
22
+	 *
23
+	 * @deprecated use \EE_Checkin::status_checked_never instead
24
+	 * @type int
25
+	 */
26
+	const checkin_status_never = 2;
27
+
28
+	/**
29
+	 * Used to reference when a registration has been checked in.
30
+	 *
31
+	 * @deprecated use \EE_Checkin::status_checked_in instead
32
+	 * @type int
33
+	 */
34
+	const checkin_status_in = 1;
35
+
36
+
37
+	/**
38
+	 * Used to reference when a registration has been checked out.
39
+	 *
40
+	 * @deprecated use \EE_Checkin::status_checked_out instead
41
+	 * @type int
42
+	 */
43
+	const checkin_status_out = 0;
44
+
45
+
46
+	/**
47
+	 * extra meta key for tracking reg status os trashed registrations
48
+	 *
49
+	 * @type string
50
+	 */
51
+	const PRE_TRASH_REG_STATUS_KEY = 'pre_trash_registration_status';
52
+
53
+
54
+	/**
55
+	 * extra meta key for tracking if registration has reserved ticket
56
+	 *
57
+	 * @type string
58
+	 */
59
+	const HAS_RESERVED_TICKET_KEY = 'has_reserved_ticket';
60
+
61
+
62
+	/**
63
+	 * @param array  $props_n_values          incoming values
64
+	 * @param string $timezone                incoming timezone (if not set the timezone set for the website will be
65
+	 *                                        used.)
66
+	 * @param array  $date_formats            incoming date_formats in an array where the first value is the
67
+	 *                                        date_format and the second value is the time format
68
+	 * @return EE_Registration
69
+	 * @throws EE_Error
70
+	 */
71
+	public static function new_instance($props_n_values = array(), $timezone = null, $date_formats = array())
72
+	{
73
+		$has_object = parent::_check_for_object($props_n_values, __CLASS__, $timezone, $date_formats);
74
+		return $has_object ? $has_object : new self($props_n_values, false, $timezone, $date_formats);
75
+	}
76
+
77
+
78
+	/**
79
+	 * @param array  $props_n_values  incoming values from the database
80
+	 * @param string $timezone        incoming timezone as set by the model.  If not set the timezone for
81
+	 *                                the website will be used.
82
+	 * @return EE_Registration
83
+	 */
84
+	public static function new_instance_from_db($props_n_values = array(), $timezone = null)
85
+	{
86
+		return new self($props_n_values, true, $timezone);
87
+	}
88
+
89
+
90
+	/**
91
+	 *        Set Event ID
92
+	 *
93
+	 * @param        int $EVT_ID Event ID
94
+	 * @throws EE_Error
95
+	 * @throws RuntimeException
96
+	 */
97
+	public function set_event($EVT_ID = 0)
98
+	{
99
+		$this->set('EVT_ID', $EVT_ID);
100
+	}
101
+
102
+
103
+	/**
104
+	 * Overrides parent set() method so that all calls to set( 'REG_code', $REG_code ) OR set( 'STS_ID', $STS_ID ) can
105
+	 * be routed to internal methods
106
+	 *
107
+	 * @param string $field_name
108
+	 * @param mixed  $field_value
109
+	 * @param bool   $use_default
110
+	 * @throws EE_Error
111
+	 * @throws EntityNotFoundException
112
+	 * @throws InvalidArgumentException
113
+	 * @throws InvalidDataTypeException
114
+	 * @throws InvalidInterfaceException
115
+	 * @throws ReflectionException
116
+	 * @throws RuntimeException
117
+	 */
118
+	public function set($field_name, $field_value, $use_default = false)
119
+	{
120
+		switch ($field_name) {
121
+			case 'REG_code':
122
+				if (! empty($field_value) && $this->reg_code() === null) {
123
+					$this->set_reg_code($field_value, $use_default);
124
+				}
125
+				break;
126
+			case 'STS_ID':
127
+				$this->set_status($field_value, $use_default);
128
+				break;
129
+			default:
130
+				parent::set($field_name, $field_value, $use_default);
131
+		}
132
+	}
133
+
134
+
135
+	/**
136
+	 * Set Status ID
137
+	 * updates the registration status and ALSO...
138
+	 * calls reserve_registration_space() if the reg status changes TO approved from any other reg status
139
+	 * calls release_registration_space() if the reg status changes FROM approved to any other reg status
140
+	 *
141
+	 * @param string                $new_STS_ID
142
+	 * @param boolean               $use_default
143
+	 * @param ContextInterface|null $context
144
+	 * @return bool
145
+	 * @throws DomainException
146
+	 * @throws EE_Error
147
+	 * @throws EntityNotFoundException
148
+	 * @throws InvalidArgumentException
149
+	 * @throws InvalidDataTypeException
150
+	 * @throws InvalidInterfaceException
151
+	 * @throws ReflectionException
152
+	 * @throws RuntimeException
153
+	 * @throws UnexpectedEntityException
154
+	 */
155
+	public function set_status($new_STS_ID = null, $use_default = false, ContextInterface $context = null)
156
+	{
157
+		// get current REG_Status
158
+		$old_STS_ID = $this->status_ID();
159
+		// if status has changed
160
+		if ($old_STS_ID !== $new_STS_ID // and that status has actually changed
161
+			&& ! empty($old_STS_ID) // and that old status is actually set
162
+			&& ! empty($new_STS_ID) // as well as the new status
163
+			&& $this->ID() // ensure registration is in the db
164
+		) {
165
+			// update internal status first
166
+			parent::set('STS_ID', $new_STS_ID, $use_default);
167
+			// THEN handle other changes that occur when reg status changes
168
+			// TO approved
169
+			if ($new_STS_ID === EEM_Registration::status_id_approved) {
170
+				// reserve a space by incrementing ticket and datetime sold values
171
+				$this->reserveRegistrationSpace();
172
+				do_action('AHEE__EE_Registration__set_status__to_approved', $this, $old_STS_ID, $new_STS_ID, $context);
173
+				// OR FROM  approved
174
+			} elseif ($old_STS_ID === EEM_Registration::status_id_approved) {
175
+				// release a space by decrementing ticket and datetime sold values
176
+				$this->releaseRegistrationSpace();
177
+				do_action(
178
+					'AHEE__EE_Registration__set_status__from_approved',
179
+					$this,
180
+					$old_STS_ID,
181
+					$new_STS_ID,
182
+					$context
183
+				);
184
+			}
185
+			// update status
186
+			parent::set('STS_ID', $new_STS_ID, $use_default);
187
+			$this->updateIfCanceledOrReinstated($new_STS_ID, $old_STS_ID, $context);
188
+			if ($this->statusChangeUpdatesTransaction($context)) {
189
+				$this->updateTransactionAfterStatusChange();
190
+			}
191
+			do_action('AHEE__EE_Registration__set_status__after_update', $this, $old_STS_ID, $new_STS_ID, $context);
192
+			return true;
193
+		}
194
+		// even though the old value matches the new value, it's still good to
195
+		// allow the parent set method to have a say
196
+		parent::set('STS_ID', $new_STS_ID, $use_default);
197
+		return true;
198
+	}
199
+
200
+
201
+	/**
202
+	 * update REGs and TXN when cancelled or declined registrations involved
203
+	 *
204
+	 * @param string                $new_STS_ID
205
+	 * @param string                $old_STS_ID
206
+	 * @param ContextInterface|null $context
207
+	 * @throws EE_Error
208
+	 * @throws InvalidArgumentException
209
+	 * @throws InvalidDataTypeException
210
+	 * @throws InvalidInterfaceException
211
+	 * @throws ReflectionException
212
+	 * @throws RuntimeException
213
+	 */
214
+	private function updateIfCanceledOrReinstated($new_STS_ID, $old_STS_ID, ContextInterface $context = null)
215
+	{
216
+		// these reg statuses should not be considered in any calculations involving monies owing
217
+		$closed_reg_statuses = EEM_Registration::closed_reg_statuses();
218
+		// true if registration has been cancelled or declined
219
+		$this->updateIfCanceled(
220
+			$closed_reg_statuses,
221
+			$new_STS_ID,
222
+			$old_STS_ID,
223
+			$context
224
+		);
225
+		$this->updateIfReinstated(
226
+			$closed_reg_statuses,
227
+			$new_STS_ID,
228
+			$old_STS_ID,
229
+			$context
230
+		);
231
+	}
232
+
233
+
234
+	/**
235
+	 * update REGs and TXN when cancelled or declined registrations involved
236
+	 *
237
+	 * @param array                 $closed_reg_statuses
238
+	 * @param string                $new_STS_ID
239
+	 * @param string                $old_STS_ID
240
+	 * @param ContextInterface|null $context
241
+	 * @throws EE_Error
242
+	 * @throws InvalidArgumentException
243
+	 * @throws InvalidDataTypeException
244
+	 * @throws InvalidInterfaceException
245
+	 * @throws ReflectionException
246
+	 * @throws RuntimeException
247
+	 */
248
+	private function updateIfCanceled(
249
+		array $closed_reg_statuses,
250
+		$new_STS_ID,
251
+		$old_STS_ID,
252
+		ContextInterface $context = null
253
+	) {
254
+		// true if registration has been cancelled or declined
255
+		if (in_array($new_STS_ID, $closed_reg_statuses, true)
256
+			&& ! in_array($old_STS_ID, $closed_reg_statuses, true)
257
+		) {
258
+			/** @type EE_Registration_Processor $registration_processor */
259
+			$registration_processor = EE_Registry::instance()->load_class('Registration_Processor');
260
+			/** @type EE_Transaction_Processor $transaction_processor */
261
+			$transaction_processor = EE_Registry::instance()->load_class('Transaction_Processor');
262
+			// cancelled or declined registration
263
+			$registration_processor->update_registration_after_being_canceled_or_declined(
264
+				$this,
265
+				$closed_reg_statuses
266
+			);
267
+			$transaction_processor->update_transaction_after_canceled_or_declined_registration(
268
+				$this,
269
+				$closed_reg_statuses,
270
+				false
271
+			);
272
+			do_action(
273
+				'AHEE__EE_Registration__set_status__canceled_or_declined',
274
+				$this,
275
+				$old_STS_ID,
276
+				$new_STS_ID,
277
+				$context
278
+			);
279
+			return;
280
+		}
281
+	}
282
+
283
+
284
+	/**
285
+	 * update REGs and TXN when cancelled or declined registrations involved
286
+	 *
287
+	 * @param array                 $closed_reg_statuses
288
+	 * @param string                $new_STS_ID
289
+	 * @param string                $old_STS_ID
290
+	 * @param ContextInterface|null $context
291
+	 * @throws EE_Error
292
+	 * @throws InvalidArgumentException
293
+	 * @throws InvalidDataTypeException
294
+	 * @throws InvalidInterfaceException
295
+	 * @throws ReflectionException
296
+	 */
297
+	private function updateIfReinstated(
298
+		array $closed_reg_statuses,
299
+		$new_STS_ID,
300
+		$old_STS_ID,
301
+		ContextInterface $context = null
302
+	) {
303
+		// true if reinstating cancelled or declined registration
304
+		if (in_array($old_STS_ID, $closed_reg_statuses, true)
305
+			&& ! in_array($new_STS_ID, $closed_reg_statuses, true)
306
+		) {
307
+			/** @type EE_Registration_Processor $registration_processor */
308
+			$registration_processor = EE_Registry::instance()->load_class('Registration_Processor');
309
+			/** @type EE_Transaction_Processor $transaction_processor */
310
+			$transaction_processor = EE_Registry::instance()->load_class('Transaction_Processor');
311
+			// reinstating cancelled or declined registration
312
+			$registration_processor->update_canceled_or_declined_registration_after_being_reinstated(
313
+				$this,
314
+				$closed_reg_statuses
315
+			);
316
+			$transaction_processor->update_transaction_after_reinstating_canceled_registration(
317
+				$this,
318
+				$closed_reg_statuses,
319
+				false
320
+			);
321
+			do_action(
322
+				'AHEE__EE_Registration__set_status__after_reinstated',
323
+				$this,
324
+				$old_STS_ID,
325
+				$new_STS_ID,
326
+				$context
327
+			);
328
+		}
329
+	}
330
+
331
+
332
+	/**
333
+	 * @param ContextInterface|null $context
334
+	 * @return bool
335
+	 */
336
+	private function statusChangeUpdatesTransaction(ContextInterface $context = null)
337
+	{
338
+		$contexts_that_do_not_update_transaction = (array) apply_filters(
339
+			'AHEE__EE_Registration__statusChangeUpdatesTransaction__contexts_that_do_not_update_transaction',
340
+			array('spco_reg_step_attendee_information_process_registrations'),
341
+			$context,
342
+			$this
343
+		);
344
+		return ! (
345
+			$context instanceof ContextInterface
346
+			&& in_array($context->slug(), $contexts_that_do_not_update_transaction, true)
347
+		);
348
+	}
349
+
350
+
351
+	/**
352
+	 * @throws EE_Error
353
+	 * @throws EntityNotFoundException
354
+	 * @throws InvalidArgumentException
355
+	 * @throws InvalidDataTypeException
356
+	 * @throws InvalidInterfaceException
357
+	 * @throws ReflectionException
358
+	 * @throws RuntimeException
359
+	 */
360
+	private function updateTransactionAfterStatusChange()
361
+	{
362
+		/** @type EE_Transaction_Payments $transaction_payments */
363
+		$transaction_payments = EE_Registry::instance()->load_class('Transaction_Payments');
364
+		$transaction_payments->recalculate_transaction_total($this->transaction(), false);
365
+		$this->transaction()->update_status_based_on_total_paid(true);
366
+	}
367
+
368
+
369
+	/**
370
+	 *        get Status ID
371
+	 */
372
+	public function status_ID()
373
+	{
374
+		return $this->get('STS_ID');
375
+	}
376
+
377
+
378
+	/**
379
+	 * Gets the ticket this registration is for
380
+	 *
381
+	 * @param boolean $include_archived whether to include archived tickets or not.
382
+	 *
383
+	 * @return EE_Ticket|EE_Base_Class
384
+	 * @throws EE_Error
385
+	 */
386
+	public function ticket($include_archived = true)
387
+	{
388
+		$query_params = array();
389
+		if ($include_archived) {
390
+			$query_params['default_where_conditions'] = 'none';
391
+		}
392
+		return $this->get_first_related('Ticket', $query_params);
393
+	}
394
+
395
+
396
+	/**
397
+	 * Gets the event this registration is for
398
+	 *
399
+	 * @return EE_Event
400
+	 * @throws EE_Error
401
+	 * @throws EntityNotFoundException
402
+	 */
403
+	public function event()
404
+	{
405
+		$event = $this->get_first_related('Event');
406
+		if (! $event instanceof \EE_Event) {
407
+			throw new EntityNotFoundException('Event ID', $this->event_ID());
408
+		}
409
+		return $event;
410
+	}
411
+
412
+
413
+	/**
414
+	 * Gets the "author" of the registration.  Note that for the purposes of registrations, the author will correspond
415
+	 * with the author of the event this registration is for.
416
+	 *
417
+	 * @since 4.5.0
418
+	 * @return int
419
+	 * @throws EE_Error
420
+	 * @throws EntityNotFoundException
421
+	 */
422
+	public function wp_user()
423
+	{
424
+		$event = $this->event();
425
+		if ($event instanceof EE_Event) {
426
+			return $event->wp_user();
427
+		}
428
+		return 0;
429
+	}
430
+
431
+
432
+	/**
433
+	 * increments this registration's related ticket sold and corresponding datetime sold values
434
+	 *
435
+	 * @return void
436
+	 * @throws DomainException
437
+	 * @throws EE_Error
438
+	 * @throws EntityNotFoundException
439
+	 * @throws InvalidArgumentException
440
+	 * @throws InvalidDataTypeException
441
+	 * @throws InvalidInterfaceException
442
+	 * @throws ReflectionException
443
+	 * @throws UnexpectedEntityException
444
+	 */
445
+	private function reserveRegistrationSpace()
446
+	{
447
+		// reserved ticket and datetime counts will be decremented as sold counts are incremented
448
+		// so stop tracking that this reg has a ticket reserved
449
+		$this->release_reserved_ticket(false, "REG: {$this->ID()} (ln:" . __LINE__ . ')');
450
+		$ticket = $this->ticket();
451
+		$ticket->increaseSold();
452
+		// possibly set event status to sold out
453
+		$this->event()->perform_sold_out_status_check();
454
+	}
455
+
456
+
457
+	/**
458
+	 * decrements (subtracts) this registration's related ticket sold and corresponding datetime sold values
459
+	 *
460
+	 * @return void
461
+	 * @throws DomainException
462
+	 * @throws EE_Error
463
+	 * @throws EntityNotFoundException
464
+	 * @throws InvalidArgumentException
465
+	 * @throws InvalidDataTypeException
466
+	 * @throws InvalidInterfaceException
467
+	 * @throws ReflectionException
468
+	 * @throws UnexpectedEntityException
469
+	 */
470
+	private function releaseRegistrationSpace()
471
+	{
472
+		$ticket = $this->ticket();
473
+		$ticket->decreaseSold();
474
+		// possibly change event status from sold out back to previous status
475
+		$this->event()->perform_sold_out_status_check();
476
+	}
477
+
478
+
479
+	/**
480
+	 * tracks this registration's ticket reservation in extra meta
481
+	 * and can increment related ticket reserved and corresponding datetime reserved values
482
+	 *
483
+	 * @param bool $update_ticket if true, will increment ticket and datetime reserved count
484
+	 * @return void
485
+	 * @throws EE_Error
486
+	 * @throws InvalidArgumentException
487
+	 * @throws InvalidDataTypeException
488
+	 * @throws InvalidInterfaceException
489
+	 * @throws ReflectionException
490
+	 */
491
+	public function reserve_ticket($update_ticket = false, $source = 'unknown')
492
+	{
493
+		// only reserve ticket if space is not currently reserved
494
+		if ((bool) $this->get_extra_meta(EE_Registration::HAS_RESERVED_TICKET_KEY, true) !== true) {
495
+			$this->update_extra_meta('reserve_ticket', "{$this->ticket_ID()} from {$source}");
496
+			// IMPORTANT !!!
497
+			// although checking $update_ticket first would be more efficient,
498
+			// we NEED to ALWAYS call update_extra_meta(), which is why that is done first
499
+			if ($this->update_extra_meta(EE_Registration::HAS_RESERVED_TICKET_KEY, true)
500
+				&& $update_ticket
501
+			) {
502
+				$ticket = $this->ticket();
503
+				$ticket->increaseReserved(1, "REG: {$this->ID()} (ln:" . __LINE__ . ')');
504
+				$ticket->save();
505
+			}
506
+		}
507
+	}
508
+
509
+
510
+	/**
511
+	 * stops tracking this registration's ticket reservation in extra meta
512
+	 * decrements (subtracts) related ticket reserved and corresponding datetime reserved values
513
+	 *
514
+	 * @param bool $update_ticket if true, will decrement ticket and datetime reserved count
515
+	 * @return void
516
+	 * @throws EE_Error
517
+	 * @throws InvalidArgumentException
518
+	 * @throws InvalidDataTypeException
519
+	 * @throws InvalidInterfaceException
520
+	 * @throws ReflectionException
521
+	 */
522
+	public function release_reserved_ticket($update_ticket = false, $source = 'unknown')
523
+	{
524
+		// only release ticket if space is currently reserved
525
+		if ((bool) $this->get_extra_meta(EE_Registration::HAS_RESERVED_TICKET_KEY, true) === true) {
526
+			$this->update_extra_meta('release_reserved_ticket', "{$this->ticket_ID()} from {$source}");
527
+			// IMPORTANT !!!
528
+			// although checking $update_ticket first would be more efficient,
529
+			// we NEED to ALWAYS call update_extra_meta(), which is why that is done first
530
+			if ($this->update_extra_meta(EE_Registration::HAS_RESERVED_TICKET_KEY, false)
531
+				&& $update_ticket
532
+			) {
533
+				$ticket = $this->ticket();
534
+				$ticket->decreaseReserved(1, true, "REG: {$this->ID()} (ln:" . __LINE__ . ')');
535
+			}
536
+		}
537
+	}
538
+
539
+
540
+	/**
541
+	 * Set Attendee ID
542
+	 *
543
+	 * @param        int $ATT_ID Attendee ID
544
+	 * @throws EE_Error
545
+	 * @throws RuntimeException
546
+	 */
547
+	public function set_attendee_id($ATT_ID = 0)
548
+	{
549
+		$this->set('ATT_ID', $ATT_ID);
550
+	}
551
+
552
+
553
+	/**
554
+	 *        Set Transaction ID
555
+	 *
556
+	 * @param        int $TXN_ID Transaction ID
557
+	 * @throws EE_Error
558
+	 * @throws RuntimeException
559
+	 */
560
+	public function set_transaction_id($TXN_ID = 0)
561
+	{
562
+		$this->set('TXN_ID', $TXN_ID);
563
+	}
564
+
565
+
566
+	/**
567
+	 *        Set Session
568
+	 *
569
+	 * @param    string $REG_session PHP Session ID
570
+	 * @throws EE_Error
571
+	 * @throws RuntimeException
572
+	 */
573
+	public function set_session($REG_session = '')
574
+	{
575
+		$this->set('REG_session', $REG_session);
576
+	}
577
+
578
+
579
+	/**
580
+	 *        Set Registration URL Link
581
+	 *
582
+	 * @param    string $REG_url_link Registration URL Link
583
+	 * @throws EE_Error
584
+	 * @throws RuntimeException
585
+	 */
586
+	public function set_reg_url_link($REG_url_link = '')
587
+	{
588
+		$this->set('REG_url_link', $REG_url_link);
589
+	}
590
+
591
+
592
+	/**
593
+	 *        Set Attendee Counter
594
+	 *
595
+	 * @param        int $REG_count Primary Attendee
596
+	 * @throws EE_Error
597
+	 * @throws RuntimeException
598
+	 */
599
+	public function set_count($REG_count = 1)
600
+	{
601
+		$this->set('REG_count', $REG_count);
602
+	}
603
+
604
+
605
+	/**
606
+	 *        Set Group Size
607
+	 *
608
+	 * @param        boolean $REG_group_size Group Registration
609
+	 * @throws EE_Error
610
+	 * @throws RuntimeException
611
+	 */
612
+	public function set_group_size($REG_group_size = false)
613
+	{
614
+		$this->set('REG_group_size', $REG_group_size);
615
+	}
616
+
617
+
618
+	/**
619
+	 *    is_not_approved -  convenience method that returns TRUE if REG status ID ==
620
+	 *    EEM_Registration::status_id_not_approved
621
+	 *
622
+	 * @return        boolean
623
+	 */
624
+	public function is_not_approved()
625
+	{
626
+		return $this->status_ID() == EEM_Registration::status_id_not_approved ? true : false;
627
+	}
628
+
629
+
630
+	/**
631
+	 *    is_pending_payment -  convenience method that returns TRUE if REG status ID ==
632
+	 *    EEM_Registration::status_id_pending_payment
633
+	 *
634
+	 * @return        boolean
635
+	 */
636
+	public function is_pending_payment()
637
+	{
638
+		return $this->status_ID() == EEM_Registration::status_id_pending_payment ? true : false;
639
+	}
640
+
641
+
642
+	/**
643
+	 *    is_approved -  convenience method that returns TRUE if REG status ID == EEM_Registration::status_id_approved
644
+	 *
645
+	 * @return        boolean
646
+	 */
647
+	public function is_approved()
648
+	{
649
+		return $this->status_ID() == EEM_Registration::status_id_approved ? true : false;
650
+	}
651
+
652
+
653
+	/**
654
+	 *    is_cancelled -  convenience method that returns TRUE if REG status ID == EEM_Registration::status_id_cancelled
655
+	 *
656
+	 * @return        boolean
657
+	 */
658
+	public function is_cancelled()
659
+	{
660
+		return $this->status_ID() == EEM_Registration::status_id_cancelled ? true : false;
661
+	}
662
+
663
+
664
+	/**
665
+	 *    is_declined -  convenience method that returns TRUE if REG status ID == EEM_Registration::status_id_declined
666
+	 *
667
+	 * @return        boolean
668
+	 */
669
+	public function is_declined()
670
+	{
671
+		return $this->status_ID() == EEM_Registration::status_id_declined ? true : false;
672
+	}
673
+
674
+
675
+	/**
676
+	 *    is_incomplete -  convenience method that returns TRUE if REG status ID ==
677
+	 *    EEM_Registration::status_id_incomplete
678
+	 *
679
+	 * @return        boolean
680
+	 */
681
+	public function is_incomplete()
682
+	{
683
+		return $this->status_ID() == EEM_Registration::status_id_incomplete ? true : false;
684
+	}
685
+
686
+
687
+	/**
688
+	 *        Set Registration Date
689
+	 *
690
+	 * @param        mixed ( int or string ) $REG_date Registration Date - Unix timestamp or string representation of
691
+	 *                                                 Date
692
+	 * @throws EE_Error
693
+	 * @throws RuntimeException
694
+	 */
695
+	public function set_reg_date($REG_date = false)
696
+	{
697
+		$this->set('REG_date', $REG_date);
698
+	}
699
+
700
+
701
+	/**
702
+	 *    Set final price owing for this registration after all ticket/price modifications
703
+	 *
704
+	 * @access    public
705
+	 * @param    float $REG_final_price
706
+	 * @throws EE_Error
707
+	 * @throws RuntimeException
708
+	 */
709
+	public function set_final_price($REG_final_price = 0.00)
710
+	{
711
+		$this->set('REG_final_price', $REG_final_price);
712
+	}
713
+
714
+
715
+	/**
716
+	 *    Set amount paid towards this registration's final price
717
+	 *
718
+	 * @access    public
719
+	 * @param    float $REG_paid
720
+	 * @throws EE_Error
721
+	 * @throws RuntimeException
722
+	 */
723
+	public function set_paid($REG_paid = 0.00)
724
+	{
725
+		$this->set('REG_paid', $REG_paid);
726
+	}
727
+
728
+
729
+	/**
730
+	 *        Attendee Is Going
731
+	 *
732
+	 * @param        boolean $REG_att_is_going Attendee Is Going
733
+	 * @throws EE_Error
734
+	 * @throws RuntimeException
735
+	 */
736
+	public function set_att_is_going($REG_att_is_going = false)
737
+	{
738
+		$this->set('REG_att_is_going', $REG_att_is_going);
739
+	}
740
+
741
+
742
+	/**
743
+	 * Gets the related attendee
744
+	 *
745
+	 * @return EE_Attendee
746
+	 * @throws EE_Error
747
+	 */
748
+	public function attendee()
749
+	{
750
+		return $this->get_first_related('Attendee');
751
+	}
752
+
753
+
754
+	/**
755
+	 *        get Event ID
756
+	 */
757
+	public function event_ID()
758
+	{
759
+		return $this->get('EVT_ID');
760
+	}
761
+
762
+
763
+	/**
764
+	 *        get Event ID
765
+	 */
766
+	public function event_name()
767
+	{
768
+		$event = $this->event_obj();
769
+		if ($event) {
770
+			return $event->name();
771
+		} else {
772
+			return null;
773
+		}
774
+	}
775
+
776
+
777
+	/**
778
+	 * Fetches the event this registration is for
779
+	 *
780
+	 * @return EE_Event
781
+	 * @throws EE_Error
782
+	 */
783
+	public function event_obj()
784
+	{
785
+		return $this->get_first_related('Event');
786
+	}
787
+
788
+
789
+	/**
790
+	 *        get Attendee ID
791
+	 */
792
+	public function attendee_ID()
793
+	{
794
+		return $this->get('ATT_ID');
795
+	}
796
+
797
+
798
+	/**
799
+	 *        get PHP Session ID
800
+	 */
801
+	public function session_ID()
802
+	{
803
+		return $this->get('REG_session');
804
+	}
805
+
806
+
807
+	/**
808
+	 * Gets the string which represents the URL trigger for the receipt template in the message template system.
809
+	 *
810
+	 * @param string $messenger 'pdf' or 'html'.  Default 'html'.
811
+	 * @return string
812
+	 */
813
+	public function receipt_url($messenger = 'html')
814
+	{
815
+
816
+		/**
817
+		 * The below will be deprecated one version after this.  We check first if there is a custom receipt template
818
+		 * already in use on old system.  If there is then we just return the standard url for it.
819
+		 *
820
+		 * @since 4.5.0
821
+		 */
822
+		$template_relative_path = 'modules/gateways/Invoice/lib/templates/receipt_body.template.php';
823
+		$has_custom = EEH_Template::locate_template(
824
+			$template_relative_path,
825
+			array(),
826
+			true,
827
+			true,
828
+			true
829
+		);
830
+
831
+		if ($has_custom) {
832
+			return add_query_arg(array('receipt' => 'true'), $this->invoice_url('launch'));
833
+		}
834
+		return apply_filters('FHEE__EE_Registration__receipt_url__receipt_url', '', $this, $messenger, 'receipt');
835
+	}
836
+
837
+
838
+	/**
839
+	 * Gets the string which represents the URL trigger for the invoice template in the message template system.
840
+	 *
841
+	 * @param string $messenger 'pdf' or 'html'.  Default 'html'.
842
+	 * @return string
843
+	 * @throws EE_Error
844
+	 */
845
+	public function invoice_url($messenger = 'html')
846
+	{
847
+		/**
848
+		 * The below will be deprecated one version after this.  We check first if there is a custom invoice template
849
+		 * already in use on old system.  If there is then we just return the standard url for it.
850
+		 *
851
+		 * @since 4.5.0
852
+		 */
853
+		$template_relative_path = 'modules/gateways/Invoice/lib/templates/invoice_body.template.php';
854
+		$has_custom = EEH_Template::locate_template(
855
+			$template_relative_path,
856
+			array(),
857
+			true,
858
+			true,
859
+			true
860
+		);
861
+
862
+		if ($has_custom) {
863
+			if ($messenger == 'html') {
864
+				return $this->invoice_url('launch');
865
+			}
866
+			$route = $messenger == 'download' || $messenger == 'pdf' ? 'download_invoice' : 'launch_invoice';
867
+
868
+			$query_args = array('ee' => $route, 'id' => $this->reg_url_link());
869
+			if ($messenger == 'html') {
870
+				$query_args['html'] = true;
871
+			}
872
+			return add_query_arg($query_args, get_permalink(EE_Registry::instance()->CFG->core->thank_you_page_id));
873
+		}
874
+		return apply_filters('FHEE__EE_Registration__invoice_url__invoice_url', '', $this, $messenger, 'invoice');
875
+	}
876
+
877
+
878
+	/**
879
+	 * get Registration URL Link
880
+	 *
881
+	 * @access public
882
+	 * @return string
883
+	 * @throws EE_Error
884
+	 */
885
+	public function reg_url_link()
886
+	{
887
+		return (string) $this->get('REG_url_link');
888
+	}
889
+
890
+
891
+	/**
892
+	 * Echoes out invoice_url()
893
+	 *
894
+	 * @param string $type 'download','launch', or 'html' (default is 'launch')
895
+	 * @return void
896
+	 * @throws EE_Error
897
+	 */
898
+	public function e_invoice_url($type = 'launch')
899
+	{
900
+		echo $this->invoice_url($type);
901
+	}
902
+
903
+
904
+	/**
905
+	 * Echoes out payment_overview_url
906
+	 */
907
+	public function e_payment_overview_url()
908
+	{
909
+		echo $this->payment_overview_url();
910
+	}
911
+
912
+
913
+	/**
914
+	 * Gets the URL for the checkout payment options reg step
915
+	 * with this registration's REG_url_link added as a query parameter
916
+	 *
917
+	 * @param bool $clear_session Set to true when you want to clear the session on revisiting the
918
+	 *                            payment overview url.
919
+	 * @return string
920
+	 * @throws InvalidInterfaceException
921
+	 * @throws InvalidDataTypeException
922
+	 * @throws EE_Error
923
+	 * @throws InvalidArgumentException
924
+	 */
925
+	public function payment_overview_url($clear_session = false)
926
+	{
927
+		return add_query_arg(
928
+			(array) apply_filters(
929
+				'FHEE__EE_Registration__payment_overview_url__query_args',
930
+				array(
931
+					'e_reg_url_link' => $this->reg_url_link(),
932
+					'step'           => 'payment_options',
933
+					'revisit'        => true,
934
+					'clear_session'  => (bool) $clear_session,
935
+				),
936
+				$this
937
+			),
938
+			EE_Registry::instance()->CFG->core->reg_page_url()
939
+		);
940
+	}
941
+
942
+
943
+	/**
944
+	 * Gets the URL for the checkout attendee information reg step
945
+	 * with this registration's REG_url_link added as a query parameter
946
+	 *
947
+	 * @return string
948
+	 * @throws InvalidInterfaceException
949
+	 * @throws InvalidDataTypeException
950
+	 * @throws EE_Error
951
+	 * @throws InvalidArgumentException
952
+	 */
953
+	public function edit_attendee_information_url()
954
+	{
955
+		return add_query_arg(
956
+			(array) apply_filters(
957
+				'FHEE__EE_Registration__edit_attendee_information_url__query_args',
958
+				array(
959
+					'e_reg_url_link' => $this->reg_url_link(),
960
+					'step'           => 'attendee_information',
961
+					'revisit'        => true,
962
+				),
963
+				$this
964
+			),
965
+			EE_Registry::instance()->CFG->core->reg_page_url()
966
+		);
967
+	}
968
+
969
+
970
+	/**
971
+	 * Simply generates and returns the appropriate admin_url link to edit this registration
972
+	 *
973
+	 * @return string
974
+	 * @throws EE_Error
975
+	 */
976
+	public function get_admin_edit_url()
977
+	{
978
+		return EEH_URL::add_query_args_and_nonce(
979
+			array(
980
+				'page'    => 'espresso_registrations',
981
+				'action'  => 'view_registration',
982
+				'_REG_ID' => $this->ID(),
983
+			),
984
+			admin_url('admin.php')
985
+		);
986
+	}
987
+
988
+
989
+	/**
990
+	 *    is_primary_registrant?
991
+	 */
992
+	public function is_primary_registrant()
993
+	{
994
+		return $this->get('REG_count') == 1 ? true : false;
995
+	}
996
+
997
+
998
+	/**
999
+	 * This returns the primary registration object for this registration group (which may be this object).
1000
+	 *
1001
+	 * @return EE_Registration
1002
+	 * @throws EE_Error
1003
+	 */
1004
+	public function get_primary_registration()
1005
+	{
1006
+		if ($this->is_primary_registrant()) {
1007
+			return $this;
1008
+		}
1009
+
1010
+		// k reg_count !== 1 so let's get the EE_Registration object matching this txn_id and reg_count == 1
1011
+		/** @var EE_Registration $primary_registrant */
1012
+		$primary_registrant = EEM_Registration::instance()->get_one(
1013
+			array(
1014
+				array(
1015
+					'TXN_ID'    => $this->transaction_ID(),
1016
+					'REG_count' => 1,
1017
+				),
1018
+			)
1019
+		);
1020
+		return $primary_registrant;
1021
+	}
1022
+
1023
+
1024
+	/**
1025
+	 *        get  Attendee Number
1026
+	 *
1027
+	 * @access        public
1028
+	 */
1029
+	public function count()
1030
+	{
1031
+		return $this->get('REG_count');
1032
+	}
1033
+
1034
+
1035
+	/**
1036
+	 *        get Group Size
1037
+	 */
1038
+	public function group_size()
1039
+	{
1040
+		return $this->get('REG_group_size');
1041
+	}
1042
+
1043
+
1044
+	/**
1045
+	 *        get Registration Date
1046
+	 */
1047
+	public function date()
1048
+	{
1049
+		return $this->get('REG_date');
1050
+	}
1051
+
1052
+
1053
+	/**
1054
+	 * gets a pretty date
1055
+	 *
1056
+	 * @param string $date_format
1057
+	 * @param string $time_format
1058
+	 * @return string
1059
+	 * @throws EE_Error
1060
+	 */
1061
+	public function pretty_date($date_format = null, $time_format = null)
1062
+	{
1063
+		return $this->get_datetime('REG_date', $date_format, $time_format);
1064
+	}
1065
+
1066
+
1067
+	/**
1068
+	 * final_price
1069
+	 * the registration's share of the transaction total, so that the
1070
+	 * sum of all the transaction's REG_final_prices equal the transaction's total
1071
+	 *
1072
+	 * @return float
1073
+	 * @throws EE_Error
1074
+	 */
1075
+	public function final_price()
1076
+	{
1077
+		return $this->get('REG_final_price');
1078
+	}
1079
+
1080
+
1081
+	/**
1082
+	 * pretty_final_price
1083
+	 *  final price as formatted string, with correct decimal places and currency symbol
1084
+	 *
1085
+	 * @return string
1086
+	 * @throws EE_Error
1087
+	 */
1088
+	public function pretty_final_price()
1089
+	{
1090
+		return $this->get_pretty('REG_final_price');
1091
+	}
1092
+
1093
+
1094
+	/**
1095
+	 * get paid (yeah)
1096
+	 *
1097
+	 * @return float
1098
+	 * @throws EE_Error
1099
+	 */
1100
+	public function paid()
1101
+	{
1102
+		return $this->get('REG_paid');
1103
+	}
1104
+
1105
+
1106
+	/**
1107
+	 * pretty_paid
1108
+	 *
1109
+	 * @return float
1110
+	 * @throws EE_Error
1111
+	 */
1112
+	public function pretty_paid()
1113
+	{
1114
+		return $this->get_pretty('REG_paid');
1115
+	}
1116
+
1117
+
1118
+	/**
1119
+	 * owes_monies_and_can_pay
1120
+	 * whether or not this registration has monies owing and it's' status allows payment
1121
+	 *
1122
+	 * @param array $requires_payment
1123
+	 * @return bool
1124
+	 * @throws EE_Error
1125
+	 */
1126
+	public function owes_monies_and_can_pay($requires_payment = array())
1127
+	{
1128
+		// these reg statuses require payment (if event is not free)
1129
+		$requires_payment = ! empty($requires_payment)
1130
+			? $requires_payment
1131
+			: EEM_Registration::reg_statuses_that_allow_payment();
1132
+		if (in_array($this->status_ID(), $requires_payment) &&
1133
+			$this->final_price() != 0 &&
1134
+			$this->final_price() != $this->paid()
1135
+		) {
1136
+			return true;
1137
+		} else {
1138
+			return false;
1139
+		}
1140
+	}
1141
+
1142
+
1143
+	/**
1144
+	 * Prints out the return value of $this->pretty_status()
1145
+	 *
1146
+	 * @param bool $show_icons
1147
+	 * @return void
1148
+	 * @throws EE_Error
1149
+	 */
1150
+	public function e_pretty_status($show_icons = false)
1151
+	{
1152
+		echo $this->pretty_status($show_icons);
1153
+	}
1154
+
1155
+
1156
+	/**
1157
+	 * Returns a nice version of the status for displaying to customers
1158
+	 *
1159
+	 * @param bool $show_icons
1160
+	 * @return string
1161
+	 * @throws EE_Error
1162
+	 */
1163
+	public function pretty_status($show_icons = false)
1164
+	{
1165
+		$status = EEM_Status::instance()->localized_status(
1166
+			array($this->status_ID() => esc_html__('unknown', 'event_espresso')),
1167
+			false,
1168
+			'sentence'
1169
+		);
1170
+		$icon = '';
1171
+		switch ($this->status_ID()) {
1172
+			case EEM_Registration::status_id_approved:
1173
+				$icon = $show_icons
1174
+					? '<span class="dashicons dashicons-star-filled ee-icon-size-16 green-text"></span>'
1175
+					: '';
1176
+				break;
1177
+			case EEM_Registration::status_id_pending_payment:
1178
+				$icon = $show_icons
1179
+					? '<span class="dashicons dashicons-star-half ee-icon-size-16 orange-text"></span>'
1180
+					: '';
1181
+				break;
1182
+			case EEM_Registration::status_id_not_approved:
1183
+				$icon = $show_icons
1184
+					? '<span class="dashicons dashicons-marker ee-icon-size-16 orange-text"></span>'
1185
+					: '';
1186
+				break;
1187
+			case EEM_Registration::status_id_cancelled:
1188
+				$icon = $show_icons
1189
+					? '<span class="dashicons dashicons-no ee-icon-size-16 lt-grey-text"></span>'
1190
+					: '';
1191
+				break;
1192
+			case EEM_Registration::status_id_incomplete:
1193
+				$icon = $show_icons
1194
+					? '<span class="dashicons dashicons-no ee-icon-size-16 lt-orange-text"></span>'
1195
+					: '';
1196
+				break;
1197
+			case EEM_Registration::status_id_declined:
1198
+				$icon = $show_icons
1199
+					? '<span class="dashicons dashicons-no ee-icon-size-16 red-text"></span>'
1200
+					: '';
1201
+				break;
1202
+			case EEM_Registration::status_id_wait_list:
1203
+				$icon = $show_icons
1204
+					? '<span class="dashicons dashicons-clipboard ee-icon-size-16 purple-text"></span>'
1205
+					: '';
1206
+				break;
1207
+		}
1208
+		return $icon . $status[ $this->status_ID() ];
1209
+	}
1210
+
1211
+
1212
+	/**
1213
+	 *        get Attendee Is Going
1214
+	 */
1215
+	public function att_is_going()
1216
+	{
1217
+		return $this->get('REG_att_is_going');
1218
+	}
1219
+
1220
+
1221
+	/**
1222
+	 * Gets related answers
1223
+	 *
1224
+	 * @param array $query_params @see https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md
1225
+	 * @return EE_Answer[]
1226
+	 * @throws EE_Error
1227
+	 */
1228
+	public function answers($query_params = null)
1229
+	{
1230
+		return $this->get_many_related('Answer', $query_params);
1231
+	}
1232
+
1233
+
1234
+	/**
1235
+	 * Gets the registration's answer value to the specified question
1236
+	 * (either the question's ID or a question object)
1237
+	 *
1238
+	 * @param EE_Question|int $question
1239
+	 * @param bool            $pretty_value
1240
+	 * @return array|string if pretty_value= true, the result will always be a string
1241
+	 * (because the answer might be an array of answer values, so passing pretty_value=true
1242
+	 * will convert it into some kind of string)
1243
+	 * @throws EE_Error
1244
+	 */
1245
+	public function answer_value_to_question($question, $pretty_value = true)
1246
+	{
1247
+		$question_id = EEM_Question::instance()->ensure_is_ID($question);
1248
+		return EEM_Answer::instance()->get_answer_value_to_question($this, $question_id, $pretty_value);
1249
+	}
1250
+
1251
+
1252
+	/**
1253
+	 * question_groups
1254
+	 * returns an array of EE_Question_Group objects for this registration
1255
+	 *
1256
+	 * @return EE_Question_Group[]
1257
+	 * @throws EE_Error
1258
+	 * @throws EntityNotFoundException
1259
+	 */
1260
+	public function question_groups()
1261
+	{
1262
+		$question_groups = array();
1263
+		if ($this->event() instanceof EE_Event) {
1264
+			$question_groups = $this->event()->question_groups(
1265
+				array(
1266
+					array(
1267
+						'Event_Question_Group.EQG_primary' => $this->count() == 1 ? true : false,
1268
+					),
1269
+					'order_by' => array('QSG_order' => 'ASC'),
1270
+				)
1271
+			);
1272
+		}
1273
+		return $question_groups;
1274
+	}
1275
+
1276
+
1277
+	/**
1278
+	 * count_question_groups
1279
+	 * returns a count of the number of EE_Question_Group objects for this registration
1280
+	 *
1281
+	 * @return int
1282
+	 * @throws EE_Error
1283
+	 * @throws EntityNotFoundException
1284
+	 */
1285
+	public function count_question_groups()
1286
+	{
1287
+		$qg_count = 0;
1288
+		if ($this->event() instanceof EE_Event) {
1289
+			$qg_count = $this->event()->count_related(
1290
+				'Question_Group',
1291
+				array(
1292
+					array(
1293
+						'Event_Question_Group.EQG_primary' => $this->count() == 1 ? true : false,
1294
+					),
1295
+				)
1296
+			);
1297
+		}
1298
+		return $qg_count;
1299
+	}
1300
+
1301
+
1302
+	/**
1303
+	 * Returns the registration date in the 'standard' string format
1304
+	 * (function may be improved in the future to allow for different formats and timezones)
1305
+	 *
1306
+	 * @return string
1307
+	 * @throws EE_Error
1308
+	 */
1309
+	public function reg_date()
1310
+	{
1311
+		return $this->get_datetime('REG_date');
1312
+	}
1313
+
1314
+
1315
+	/**
1316
+	 * Gets the datetime-ticket for this registration (ie, it can be used to isolate
1317
+	 * the ticket this registration purchased, or the datetime they have registered
1318
+	 * to attend)
1319
+	 *
1320
+	 * @return EE_Datetime_Ticket
1321
+	 * @throws EE_Error
1322
+	 */
1323
+	public function datetime_ticket()
1324
+	{
1325
+		return $this->get_first_related('Datetime_Ticket');
1326
+	}
1327
+
1328
+
1329
+	/**
1330
+	 * Sets the registration's datetime_ticket.
1331
+	 *
1332
+	 * @param EE_Datetime_Ticket $datetime_ticket
1333
+	 * @return EE_Datetime_Ticket
1334
+	 * @throws EE_Error
1335
+	 */
1336
+	public function set_datetime_ticket($datetime_ticket)
1337
+	{
1338
+		return $this->_add_relation_to($datetime_ticket, 'Datetime_Ticket');
1339
+	}
1340
+
1341
+	/**
1342
+	 * Gets deleted
1343
+	 *
1344
+	 * @return bool
1345
+	 * @throws EE_Error
1346
+	 */
1347
+	public function deleted()
1348
+	{
1349
+		return $this->get('REG_deleted');
1350
+	}
1351
+
1352
+	/**
1353
+	 * Sets deleted
1354
+	 *
1355
+	 * @param boolean $deleted
1356
+	 * @return bool
1357
+	 * @throws EE_Error
1358
+	 * @throws RuntimeException
1359
+	 */
1360
+	public function set_deleted($deleted)
1361
+	{
1362
+		if ($deleted) {
1363
+			$this->delete();
1364
+		} else {
1365
+			$this->restore();
1366
+		}
1367
+	}
1368
+
1369
+
1370
+	/**
1371
+	 * Get the status object of this object
1372
+	 *
1373
+	 * @return EE_Status
1374
+	 * @throws EE_Error
1375
+	 */
1376
+	public function status_obj()
1377
+	{
1378
+		return $this->get_first_related('Status');
1379
+	}
1380
+
1381
+
1382
+	/**
1383
+	 * Returns the number of times this registration has checked into any of the datetimes
1384
+	 * its available for
1385
+	 *
1386
+	 * @return int
1387
+	 * @throws EE_Error
1388
+	 */
1389
+	public function count_checkins()
1390
+	{
1391
+		return $this->get_model()->count_related($this, 'Checkin');
1392
+	}
1393
+
1394
+
1395
+	/**
1396
+	 * Returns the number of current Check-ins this registration is checked into for any of the datetimes the
1397
+	 * registration is for.  Note, this is ONLY checked in (does not include checkedout)
1398
+	 *
1399
+	 * @return int
1400
+	 * @throws EE_Error
1401
+	 */
1402
+	public function count_checkins_not_checkedout()
1403
+	{
1404
+		return $this->get_model()->count_related($this, 'Checkin', array(array('CHK_in' => 1)));
1405
+	}
1406
+
1407
+
1408
+	/**
1409
+	 * The purpose of this method is simply to check whether this registration can checkin to the given datetime.
1410
+	 *
1411
+	 * @param int | EE_Datetime $DTT_OR_ID      The datetime the registration is being checked against
1412
+	 * @param bool              $check_approved This is used to indicate whether the caller wants can_checkin to also
1413
+	 *                                          consider registration status as well as datetime access.
1414
+	 * @return bool
1415
+	 * @throws EE_Error
1416
+	 */
1417
+	public function can_checkin($DTT_OR_ID, $check_approved = true)
1418
+	{
1419
+		$DTT_ID = EEM_Datetime::instance()->ensure_is_ID($DTT_OR_ID);
1420
+
1421
+		// first check registration status
1422
+		if (($check_approved && ! $this->is_approved()) || ! $DTT_ID) {
1423
+			return false;
1424
+		}
1425
+		// is there a datetime ticket that matches this dtt_ID?
1426
+		if (! (EEM_Datetime_Ticket::instance()->exists(
1427
+			array(
1428
+				array(
1429
+					'TKT_ID' => $this->get('TKT_ID'),
1430
+					'DTT_ID' => $DTT_ID,
1431
+				),
1432
+			)
1433
+		))
1434
+		) {
1435
+			return false;
1436
+		}
1437
+
1438
+		// final check is against TKT_uses
1439
+		return $this->verify_can_checkin_against_TKT_uses($DTT_ID);
1440
+	}
1441
+
1442
+
1443
+	/**
1444
+	 * This method verifies whether the user can checkin for the given datetime considering the max uses value set on
1445
+	 * the ticket. To do this,  a query is done to get the count of the datetime records already checked into.  If the
1446
+	 * datetime given does not have a check-in record and checking in for that datetime will exceed the allowed uses,
1447
+	 * then return false.  Otherwise return true.
1448
+	 *
1449
+	 * @param int | EE_Datetime $DTT_OR_ID The datetime the registration is being checked against
1450
+	 * @return bool true means can checkin.  false means cannot checkin.
1451
+	 * @throws EE_Error
1452
+	 */
1453
+	public function verify_can_checkin_against_TKT_uses($DTT_OR_ID)
1454
+	{
1455
+		$DTT_ID = EEM_Datetime::instance()->ensure_is_ID($DTT_OR_ID);
1456
+
1457
+		if (! $DTT_ID) {
1458
+			return false;
1459
+		}
1460
+
1461
+		$max_uses = $this->ticket() instanceof EE_Ticket ? $this->ticket()->uses() : EE_INF;
1462
+
1463
+		// if max uses is not set or equals infinity then return true cause its not a factor for whether user can
1464
+		// check-in or not.
1465
+		if (! $max_uses || $max_uses === EE_INF) {
1466
+			return true;
1467
+		}
1468
+
1469
+		// does this datetime have a checkin record?  If so, then the dtt count has already been verified so we can just
1470
+		// go ahead and toggle.
1471
+		if (EEM_Checkin::instance()->exists(array(array('REG_ID' => $this->ID(), 'DTT_ID' => $DTT_ID)))) {
1472
+			return true;
1473
+		}
1474
+
1475
+		// made it here so the last check is whether the number of checkins per unique datetime on this registration
1476
+		// disallows further check-ins.
1477
+		$count_unique_dtt_checkins = EEM_Checkin::instance()->count(
1478
+			array(
1479
+				array(
1480
+					'REG_ID' => $this->ID(),
1481
+					'CHK_in' => true,
1482
+				),
1483
+			),
1484
+			'DTT_ID',
1485
+			true
1486
+		);
1487
+		// checkins have already reached their max number of uses
1488
+		// so registrant can NOT checkin
1489
+		if ($count_unique_dtt_checkins >= $max_uses) {
1490
+			EE_Error::add_error(
1491
+				esc_html__(
1492
+					'Check-in denied because number of datetime uses for the ticket has been reached or exceeded.',
1493
+					'event_espresso'
1494
+				),
1495
+				__FILE__,
1496
+				__FUNCTION__,
1497
+				__LINE__
1498
+			);
1499
+			return false;
1500
+		}
1501
+		return true;
1502
+	}
1503
+
1504
+
1505
+	/**
1506
+	 * toggle Check-in status for this registration
1507
+	 * Check-ins are toggled in the following order:
1508
+	 * never checked in -> checked in
1509
+	 * checked in -> checked out
1510
+	 * checked out -> checked in
1511
+	 *
1512
+	 * @param  int $DTT_ID  include specific datetime to toggle Check-in for.
1513
+	 *                      If not included or null, then it is assumed latest datetime is being toggled.
1514
+	 * @param bool $verify  If true then can_checkin() is used to verify whether the person
1515
+	 *                      can be checked in or not.  Otherwise this forces change in checkin status.
1516
+	 * @return bool|int     the chk_in status toggled to OR false if nothing got changed.
1517
+	 * @throws EE_Error
1518
+	 */
1519
+	public function toggle_checkin_status($DTT_ID = null, $verify = false)
1520
+	{
1521
+		if (empty($DTT_ID)) {
1522
+			$datetime = $this->get_latest_related_datetime();
1523
+			$DTT_ID = $datetime instanceof EE_Datetime ? $datetime->ID() : 0;
1524
+			// verify the registration can checkin for the given DTT_ID
1525
+		} elseif (! $this->can_checkin($DTT_ID, $verify)) {
1526
+			EE_Error::add_error(
1527
+				sprintf(
1528
+					esc_html__(
1529
+						'The given registration (ID:%1$d) can not be checked in to the given DTT_ID (%2$d), because the registration does not have access',
1530
+						'event_espresso'
1531
+					),
1532
+					$this->ID(),
1533
+					$DTT_ID
1534
+				),
1535
+				__FILE__,
1536
+				__FUNCTION__,
1537
+				__LINE__
1538
+			);
1539
+			return false;
1540
+		}
1541
+		$status_paths = array(
1542
+			EE_Checkin::status_checked_never => EE_Checkin::status_checked_in,
1543
+			EE_Checkin::status_checked_in    => EE_Checkin::status_checked_out,
1544
+			EE_Checkin::status_checked_out   => EE_Checkin::status_checked_in,
1545
+		);
1546
+		// start by getting the current status so we know what status we'll be changing to.
1547
+		$cur_status = $this->check_in_status_for_datetime($DTT_ID, null);
1548
+		$status_to = $status_paths[ $cur_status ];
1549
+		// database only records true for checked IN or false for checked OUT
1550
+		// no record ( null ) means checked in NEVER, but we obviously don't save that
1551
+		$new_status = $status_to === EE_Checkin::status_checked_in ? true : false;
1552
+		// add relation - note Check-ins are always creating new rows
1553
+		// because we are keeping track of Check-ins over time.
1554
+		// Eventually we'll probably want to show a list table
1555
+		// for the individual Check-ins so that they can be managed.
1556
+		$checkin = EE_Checkin::new_instance(
1557
+			array(
1558
+				'REG_ID' => $this->ID(),
1559
+				'DTT_ID' => $DTT_ID,
1560
+				'CHK_in' => $new_status,
1561
+			)
1562
+		);
1563
+		// if the record could not be saved then return false
1564
+		if ($checkin->save() === 0) {
1565
+			if (WP_DEBUG) {
1566
+				global $wpdb;
1567
+				$error = sprintf(
1568
+					esc_html__(
1569
+						'Registration check in update failed because of the following database error: %1$s%2$s',
1570
+						'event_espresso'
1571
+					),
1572
+					'<br />',
1573
+					$wpdb->last_error
1574
+				);
1575
+			} else {
1576
+				$error = esc_html__(
1577
+					'Registration check in update failed because of an unknown database error',
1578
+					'event_espresso'
1579
+				);
1580
+			}
1581
+			EE_Error::add_error($error, __FILE__, __FUNCTION__, __LINE__);
1582
+			return false;
1583
+		}
1584
+		return $status_to;
1585
+	}
1586
+
1587
+
1588
+	/**
1589
+	 * Returns the latest datetime related to this registration (via the ticket attached to the registration).
1590
+	 * "Latest" is defined by the `DTT_EVT_start` column.
1591
+	 *
1592
+	 * @return EE_Datetime|null
1593
+	 * @throws EE_Error
1594
+	 */
1595
+	public function get_latest_related_datetime()
1596
+	{
1597
+		return EEM_Datetime::instance()->get_one(
1598
+			array(
1599
+				array(
1600
+					'Ticket.Registration.REG_ID' => $this->ID(),
1601
+				),
1602
+				'order_by' => array('DTT_EVT_start' => 'DESC'),
1603
+			)
1604
+		);
1605
+	}
1606
+
1607
+
1608
+	/**
1609
+	 * Returns the earliest datetime related to this registration (via the ticket attached to the registration).
1610
+	 * "Earliest" is defined by the `DTT_EVT_start` column.
1611
+	 *
1612
+	 * @throws EE_Error
1613
+	 */
1614
+	public function get_earliest_related_datetime()
1615
+	{
1616
+		return EEM_Datetime::instance()->get_one(
1617
+			array(
1618
+				array(
1619
+					'Ticket.Registration.REG_ID' => $this->ID(),
1620
+				),
1621
+				'order_by' => array('DTT_EVT_start' => 'ASC'),
1622
+			)
1623
+		);
1624
+	}
1625
+
1626
+
1627
+	/**
1628
+	 * This method simply returns the check-in status for this registration and the given datetime.
1629
+	 * If neither the datetime nor the checkin values are provided as arguments,
1630
+	 * then this will return the LATEST check-in status for the registration across all datetimes it belongs to.
1631
+	 *
1632
+	 * @param  int       $DTT_ID  The ID of the datetime we're checking against
1633
+	 *                            (if empty we'll get the primary datetime for
1634
+	 *                            this registration (via event) and use it's ID);
1635
+	 * @param EE_Checkin $checkin If present, we use the given checkin object rather than the dtt_id.
1636
+	 *
1637
+	 * @return int                Integer representing Check-in status.
1638
+	 * @throws EE_Error
1639
+	 */
1640
+	public function check_in_status_for_datetime($DTT_ID = 0, $checkin = null)
1641
+	{
1642
+		$checkin_query_params = array(
1643
+			'order_by' => array('CHK_timestamp' => 'DESC'),
1644
+		);
1645
+
1646
+		if ($DTT_ID > 0) {
1647
+			$checkin_query_params[0] = array('DTT_ID' => $DTT_ID);
1648
+		}
1649
+
1650
+		// get checkin object (if exists)
1651
+		$checkin = $checkin instanceof EE_Checkin
1652
+			? $checkin
1653
+			: $this->get_first_related('Checkin', $checkin_query_params);
1654
+		if ($checkin instanceof EE_Checkin) {
1655
+			if ($checkin->get('CHK_in')) {
1656
+				return EE_Checkin::status_checked_in; // checked in
1657
+			}
1658
+			return EE_Checkin::status_checked_out; // had checked in but is now checked out.
1659
+		}
1660
+		return EE_Checkin::status_checked_never; // never been checked in
1661
+	}
1662
+
1663
+
1664
+	/**
1665
+	 * This method returns a localized message for the toggled Check-in message.
1666
+	 *
1667
+	 * @param  int $DTT_ID include specific datetime to get the correct Check-in message.  If not included or null,
1668
+	 *                     then it is assumed Check-in for primary datetime was toggled.
1669
+	 * @param bool $error  This just flags that you want an error message returned. This is put in so that the error
1670
+	 *                     message can be customized with the attendee name.
1671
+	 * @return string internationalized message
1672
+	 * @throws EE_Error
1673
+	 */
1674
+	public function get_checkin_msg($DTT_ID, $error = false)
1675
+	{
1676
+		// let's get the attendee first so we can include the name of the attendee
1677
+		$attendee = $this->get_first_related('Attendee');
1678
+		if ($attendee instanceof EE_Attendee) {
1679
+			if ($error) {
1680
+				return sprintf(__("%s's check-in status was not changed.", "event_espresso"), $attendee->full_name());
1681
+			}
1682
+			$cur_status = $this->check_in_status_for_datetime($DTT_ID);
1683
+			// what is the status message going to be?
1684
+			switch ($cur_status) {
1685
+				case EE_Checkin::status_checked_never:
1686
+					return sprintf(
1687
+						__("%s has been removed from Check-in records", "event_espresso"),
1688
+						$attendee->full_name()
1689
+					);
1690
+					break;
1691
+				case EE_Checkin::status_checked_in:
1692
+					return sprintf(__('%s has been checked in', 'event_espresso'), $attendee->full_name());
1693
+					break;
1694
+				case EE_Checkin::status_checked_out:
1695
+					return sprintf(__('%s has been checked out', 'event_espresso'), $attendee->full_name());
1696
+					break;
1697
+			}
1698
+		}
1699
+		return esc_html__("The check-in status could not be determined.", "event_espresso");
1700
+	}
1701
+
1702
+
1703
+	/**
1704
+	 * Returns the related EE_Transaction to this registration
1705
+	 *
1706
+	 * @return EE_Transaction
1707
+	 * @throws EE_Error
1708
+	 * @throws EntityNotFoundException
1709
+	 */
1710
+	public function transaction()
1711
+	{
1712
+		$transaction = $this->get_first_related('Transaction');
1713
+		if (! $transaction instanceof \EE_Transaction) {
1714
+			throw new EntityNotFoundException('Transaction ID', $this->transaction_ID());
1715
+		}
1716
+		return $transaction;
1717
+	}
1718
+
1719
+
1720
+	/**
1721
+	 *        get Registration Code
1722
+	 */
1723
+	public function reg_code()
1724
+	{
1725
+		return $this->get('REG_code');
1726
+	}
1727
+
1728
+
1729
+	/**
1730
+	 *        get Transaction ID
1731
+	 */
1732
+	public function transaction_ID()
1733
+	{
1734
+		return $this->get('TXN_ID');
1735
+	}
1736
+
1737
+
1738
+	/**
1739
+	 * @return int
1740
+	 * @throws EE_Error
1741
+	 */
1742
+	public function ticket_ID()
1743
+	{
1744
+		return $this->get('TKT_ID');
1745
+	}
1746
+
1747
+
1748
+	/**
1749
+	 *        Set Registration Code
1750
+	 *
1751
+	 * @access    public
1752
+	 * @param    string  $REG_code Registration Code
1753
+	 * @param    boolean $use_default
1754
+	 * @throws EE_Error
1755
+	 */
1756
+	public function set_reg_code($REG_code, $use_default = false)
1757
+	{
1758
+		if (empty($REG_code)) {
1759
+			EE_Error::add_error(
1760
+				esc_html__('REG_code can not be empty.', 'event_espresso'),
1761
+				__FILE__,
1762
+				__FUNCTION__,
1763
+				__LINE__
1764
+			);
1765
+			return;
1766
+		}
1767
+		if (! $this->reg_code()) {
1768
+			parent::set('REG_code', $REG_code, $use_default);
1769
+		} else {
1770
+			EE_Error::doing_it_wrong(
1771
+				__CLASS__ . '::' . __FUNCTION__,
1772
+				esc_html__('Can not change a registration REG_code once it has been set.', 'event_espresso'),
1773
+				'4.6.0'
1774
+			);
1775
+		}
1776
+	}
1777
+
1778
+
1779
+	/**
1780
+	 * Returns all other registrations in the same group as this registrant who have the same ticket option.
1781
+	 * Note, if you want to just get all registrations in the same transaction (group), use:
1782
+	 *    $registration->transaction()->registrations();
1783
+	 *
1784
+	 * @since 4.5.0
1785
+	 * @return EE_Registration[] or empty array if this isn't a group registration.
1786
+	 * @throws EE_Error
1787
+	 */
1788
+	public function get_all_other_registrations_in_group()
1789
+	{
1790
+		if ($this->group_size() < 2) {
1791
+			return array();
1792
+		}
1793
+
1794
+		$query[0] = array(
1795
+			'TXN_ID' => $this->transaction_ID(),
1796
+			'REG_ID' => array('!=', $this->ID()),
1797
+			'TKT_ID' => $this->ticket_ID(),
1798
+		);
1799
+		/** @var EE_Registration[] $registrations */
1800
+		$registrations = $this->get_model()->get_all($query);
1801
+		return $registrations;
1802
+	}
1803
+
1804
+	/**
1805
+	 * Return the link to the admin details for the object.
1806
+	 *
1807
+	 * @return string
1808
+	 * @throws EE_Error
1809
+	 */
1810
+	public function get_admin_details_link()
1811
+	{
1812
+		EE_Registry::instance()->load_helper('URL');
1813
+		return EEH_URL::add_query_args_and_nonce(
1814
+			array(
1815
+				'page'    => 'espresso_registrations',
1816
+				'action'  => 'view_registration',
1817
+				'_REG_ID' => $this->ID(),
1818
+			),
1819
+			admin_url('admin.php')
1820
+		);
1821
+	}
1822
+
1823
+	/**
1824
+	 * Returns the link to the editor for the object.  Sometimes this is the same as the details.
1825
+	 *
1826
+	 * @return string
1827
+	 * @throws EE_Error
1828
+	 */
1829
+	public function get_admin_edit_link()
1830
+	{
1831
+		return $this->get_admin_details_link();
1832
+	}
1833
+
1834
+	/**
1835
+	 * Returns the link to a settings page for the object.
1836
+	 *
1837
+	 * @return string
1838
+	 * @throws EE_Error
1839
+	 */
1840
+	public function get_admin_settings_link()
1841
+	{
1842
+		return $this->get_admin_details_link();
1843
+	}
1844
+
1845
+	/**
1846
+	 * Returns the link to the "overview" for the object (typically the "list table" view).
1847
+	 *
1848
+	 * @return string
1849
+	 */
1850
+	public function get_admin_overview_link()
1851
+	{
1852
+		EE_Registry::instance()->load_helper('URL');
1853
+		return EEH_URL::add_query_args_and_nonce(
1854
+			array(
1855
+				'page' => 'espresso_registrations',
1856
+			),
1857
+			admin_url('admin.php')
1858
+		);
1859
+	}
1860
+
1861
+
1862
+	/**
1863
+	 * @param array $query_params
1864
+	 *
1865
+	 * @return \EE_Registration[]
1866
+	 * @throws EE_Error
1867
+	 */
1868
+	public function payments($query_params = array())
1869
+	{
1870
+		return $this->get_many_related('Payment', $query_params);
1871
+	}
1872
+
1873
+
1874
+	/**
1875
+	 * @param array $query_params
1876
+	 *
1877
+	 * @return \EE_Registration_Payment[]
1878
+	 * @throws EE_Error
1879
+	 */
1880
+	public function registration_payments($query_params = array())
1881
+	{
1882
+		return $this->get_many_related('Registration_Payment', $query_params);
1883
+	}
1884
+
1885
+
1886
+	/**
1887
+	 * This grabs the payment method corresponding to the last payment made for the amount owing on the registration.
1888
+	 * Note: if there are no payments on the registration there will be no payment method returned.
1889
+	 *
1890
+	 * @return EE_Payment_Method|null
1891
+	 */
1892
+	public function payment_method()
1893
+	{
1894
+		return EEM_Payment_Method::instance()->get_last_used_for_registration($this);
1895
+	}
1896
+
1897
+
1898
+	/**
1899
+	 * @return \EE_Line_Item
1900
+	 * @throws EntityNotFoundException
1901
+	 * @throws EE_Error
1902
+	 */
1903
+	public function ticket_line_item()
1904
+	{
1905
+		$ticket = $this->ticket();
1906
+		$transaction = $this->transaction();
1907
+		$line_item = null;
1908
+		$ticket_line_items = \EEH_Line_Item::get_line_items_by_object_type_and_IDs(
1909
+			$transaction->total_line_item(),
1910
+			'Ticket',
1911
+			array($ticket->ID())
1912
+		);
1913
+		foreach ($ticket_line_items as $ticket_line_item) {
1914
+			if ($ticket_line_item instanceof \EE_Line_Item
1915
+				&& $ticket_line_item->OBJ_type() === 'Ticket'
1916
+				&& $ticket_line_item->OBJ_ID() === $ticket->ID()
1917
+			) {
1918
+				$line_item = $ticket_line_item;
1919
+				break;
1920
+			}
1921
+		}
1922
+		if (! ($line_item instanceof \EE_Line_Item && $line_item->OBJ_type() === 'Ticket')) {
1923
+			throw new EntityNotFoundException('Line Item Ticket ID', $ticket->ID());
1924
+		}
1925
+		return $line_item;
1926
+	}
1927
+
1928
+
1929
+	/**
1930
+	 * Soft Deletes this model object.
1931
+	 *
1932
+	 * @return boolean | int
1933
+	 * @throws RuntimeException
1934
+	 * @throws EE_Error
1935
+	 */
1936
+	public function delete()
1937
+	{
1938
+		if ($this->update_extra_meta(EE_Registration::PRE_TRASH_REG_STATUS_KEY, $this->status_ID()) === true) {
1939
+			$this->set_status(EEM_Registration::status_id_cancelled);
1940
+		}
1941
+		return parent::delete();
1942
+	}
1943
+
1944
+
1945
+	/**
1946
+	 * Restores whatever the previous status was on a registration before it was trashed (if possible)
1947
+	 *
1948
+	 * @throws EE_Error
1949
+	 * @throws RuntimeException
1950
+	 */
1951
+	public function restore()
1952
+	{
1953
+		$previous_status = $this->get_extra_meta(
1954
+			EE_Registration::PRE_TRASH_REG_STATUS_KEY,
1955
+			true,
1956
+			EEM_Registration::status_id_cancelled
1957
+		);
1958
+		if ($previous_status) {
1959
+			$this->delete_extra_meta(EE_Registration::PRE_TRASH_REG_STATUS_KEY);
1960
+			$this->set_status($previous_status);
1961
+		}
1962
+		return parent::restore();
1963
+	}
1964
+
1965
+
1966
+	/**
1967
+	 * possibly toggle Registration status based on comparison of REG_paid vs REG_final_price
1968
+	 *
1969
+	 * @param  boolean $trigger_set_status_logic EE_Registration::set_status() can trigger additional logic
1970
+	 *                                           depending on whether the reg status changes to or from "Approved"
1971
+	 * @return boolean whether the Registration status was updated
1972
+	 * @throws EE_Error
1973
+	 * @throws RuntimeException
1974
+	 */
1975
+	public function updateStatusBasedOnTotalPaid($trigger_set_status_logic = true)
1976
+	{
1977
+		$paid = $this->paid();
1978
+		$price = $this->final_price();
1979
+		switch (true) {
1980
+			// overpaid or paid
1981
+			case EEH_Money::compare_floats($paid, $price, '>'):
1982
+			case EEH_Money::compare_floats($paid, $price):
1983
+				$new_status = EEM_Registration::status_id_approved;
1984
+				break;
1985
+			//  underpaid
1986
+			case EEH_Money::compare_floats($paid, $price, '<'):
1987
+				$new_status = EEM_Registration::status_id_pending_payment;
1988
+				break;
1989
+			// uhhh Houston...
1990
+			default:
1991
+				throw new RuntimeException(
1992
+					esc_html__('The total paid calculation for this registration is inaccurate.', 'event_espresso')
1993
+				);
1994
+		}
1995
+		if ($new_status !== $this->status_ID()) {
1996
+			if ($trigger_set_status_logic) {
1997
+				return $this->set_status($new_status);
1998
+			}
1999
+			parent::set('STS_ID', $new_status);
2000
+			return true;
2001
+		}
2002
+		return false;
2003
+	}
2004
+
2005
+
2006
+	/*************************** DEPRECATED ***************************/
2007
+
2008
+
2009
+	/**
2010
+	 * @deprecated
2011
+	 * @since     4.7.0
2012
+	 * @access    public
2013
+	 */
2014
+	public function price_paid()
2015
+	{
2016
+		EE_Error::doing_it_wrong(
2017
+			'EE_Registration::price_paid()',
2018
+			esc_html__(
2019
+				'This method is deprecated, please use EE_Registration::final_price() instead.',
2020
+				'event_espresso'
2021
+			),
2022
+			'4.7.0'
2023
+		);
2024
+		return $this->final_price();
2025
+	}
2026
+
2027
+
2028
+	/**
2029
+	 * @deprecated
2030
+	 * @since     4.7.0
2031
+	 * @access    public
2032
+	 * @param    float $REG_final_price
2033
+	 * @throws EE_Error
2034
+	 * @throws RuntimeException
2035
+	 */
2036
+	public function set_price_paid($REG_final_price = 0.00)
2037
+	{
2038
+		EE_Error::doing_it_wrong(
2039
+			'EE_Registration::set_price_paid()',
2040
+			esc_html__(
2041
+				'This method is deprecated, please use EE_Registration::set_final_price() instead.',
2042
+				'event_espresso'
2043
+			),
2044
+			'4.7.0'
2045
+		);
2046
+		$this->set_final_price($REG_final_price);
2047
+	}
2048
+
2049
+
2050
+	/**
2051
+	 * @deprecated
2052
+	 * @since 4.7.0
2053
+	 * @return string
2054
+	 * @throws EE_Error
2055
+	 */
2056
+	public function pretty_price_paid()
2057
+	{
2058
+		EE_Error::doing_it_wrong(
2059
+			'EE_Registration::pretty_price_paid()',
2060
+			esc_html__(
2061
+				'This method is deprecated, please use EE_Registration::pretty_final_price() instead.',
2062
+				'event_espresso'
2063
+			),
2064
+			'4.7.0'
2065
+		);
2066
+		return $this->pretty_final_price();
2067
+	}
2068
+
2069
+
2070
+	/**
2071
+	 * Gets the primary datetime related to this registration via the related Event to this registration
2072
+	 *
2073
+	 * @deprecated 4.9.17
2074
+	 * @return EE_Datetime
2075
+	 * @throws EE_Error
2076
+	 * @throws EntityNotFoundException
2077
+	 */
2078
+	public function get_related_primary_datetime()
2079
+	{
2080
+		EE_Error::doing_it_wrong(
2081
+			__METHOD__,
2082
+			esc_html__(
2083
+				'Use EE_Registration::get_latest_related_datetime() or EE_Registration::get_earliest_related_datetime()',
2084
+				'event_espresso'
2085
+			),
2086
+			'4.9.17',
2087
+			'5.0.0'
2088
+		);
2089
+		return $this->event()->primary_datetime();
2090
+	}
2091 2091
 }
Please login to merge, or discard this patch.
core/db_classes/EE_Message_Template_Group.class.php 3 patches
Doc Comments   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -211,7 +211,7 @@
 block discarded – undo
211 211
      * appropriately.
212 212
      *
213 213
      * @throws EE_Error
214
-     * @return EE_message_type|false if exception thrown.
214
+     * @return null|EE_message_type if exception thrown.
215 215
      */
216 216
     public function message_type_obj()
217 217
     {
Please login to merge, or discard this patch.
Spacing   +8 added lines, -8 removed lines patch added patch discarded remove patch
@@ -48,7 +48,7 @@  discard block
 block discarded – undo
48 48
      */
49 49
     public function set_message_type($message_type = false)
50 50
     {
51
-        if (! $message_type) {
51
+        if ( ! $message_type) {
52 52
             throw new EE_Error(esc_html__('Missing required value for the message_type parameter', 'event_espresso'));
53 53
         }
54 54
         $this->set('MTP_message_type', $message_type);
@@ -61,7 +61,7 @@  discard block
 block discarded – undo
61 61
      */
62 62
     public function set_messenger($messenger = false)
63 63
     {
64
-        if (! $messenger) {
64
+        if ( ! $messenger) {
65 65
             throw new EE_Error(esc_html__('Missing required value for the messenger parameter', 'event_espresso'));
66 66
         }
67 67
         $this->set('MTP_messenger', $messenger);
@@ -74,7 +74,7 @@  discard block
 block discarded – undo
74 74
      */
75 75
     public function set_group_template_id($GRP_ID = false)
76 76
     {
77
-        if (! $GRP_ID) {
77
+        if ( ! $GRP_ID) {
78 78
             throw new EE_Error(
79 79
                 esc_html__(
80 80
                     'Missing required value for the message template group id',
@@ -290,7 +290,7 @@  discard block
 block discarded – undo
290 290
         }
291 291
         // note contexts could have CHECKBOX fields per context. So we return the objects indexed by context AND field.
292 292
         foreach ($mtps as $mtp) {
293
-            $mtps_arr[ $mtp->get('MTP_context') ][ $mtp->get('MTP_template_field') ] = $mtp;
293
+            $mtps_arr[$mtp->get('MTP_context')][$mtp->get('MTP_template_field')] = $mtp;
294 294
         }
295 295
         return $mtps_arr;
296 296
     }
@@ -430,7 +430,7 @@  discard block
 block discarded – undo
430 430
     public function deactivate_context($context)
431 431
     {
432 432
         $this->validate_context($context);
433
-        return $this->update_extra_meta(self::ACTIVE_CONTEXT_RECORD_META_KEY_PREFIX . $context, false);
433
+        return $this->update_extra_meta(self::ACTIVE_CONTEXT_RECORD_META_KEY_PREFIX.$context, false);
434 434
     }
435 435
 
436 436
 
@@ -445,7 +445,7 @@  discard block
 block discarded – undo
445 445
     public function activate_context($context)
446 446
     {
447 447
         $this->validate_context($context);
448
-        return $this->update_extra_meta(self::ACTIVE_CONTEXT_RECORD_META_KEY_PREFIX . $context, true);
448
+        return $this->update_extra_meta(self::ACTIVE_CONTEXT_RECORD_META_KEY_PREFIX.$context, true);
449 449
     }
450 450
 
451 451
 
@@ -465,7 +465,7 @@  discard block
 block discarded – undo
465 465
     {
466 466
         $this->validate_context($context);
467 467
         return filter_var(
468
-            $this->get_extra_meta(self::ACTIVE_CONTEXT_RECORD_META_KEY_PREFIX . $context, true, true),
468
+            $this->get_extra_meta(self::ACTIVE_CONTEXT_RECORD_META_KEY_PREFIX.$context, true, true),
469 469
             FILTER_VALIDATE_BOOLEAN
470 470
         );
471 471
     }
@@ -481,7 +481,7 @@  discard block
 block discarded – undo
481 481
     public function validate_context($context)
482 482
     {
483 483
         $contexts = $this->contexts_config();
484
-        if (! isset($contexts[ $context ])) {
484
+        if ( ! isset($contexts[$context])) {
485 485
             throw new InvalidIdentifierException(
486 486
                 '',
487 487
                 '',
Please login to merge, or discard this patch.
Indentation   +483 added lines, -483 removed lines patch added patch discarded remove patch
@@ -13,487 +13,487 @@
 block discarded – undo
13 13
 class EE_Message_Template_Group extends EE_Soft_Delete_Base_Class
14 14
 {
15 15
 
16
-    /**
17
-     * Extra Meta key prefix for whether a given context for this message tmeplate group is active or not.
18
-     */
19
-    const ACTIVE_CONTEXT_RECORD_META_KEY_PREFIX = 'active_context_';
20
-
21
-    /**
22
-     * @param array  $props_n_values
23
-     * @param string $timezone
24
-     * @return EE_Message_Template_Group|mixed
25
-     * @throws EE_Error
26
-     */
27
-    public static function new_instance($props_n_values = array(), $timezone = '')
28
-    {
29
-        $has_object = parent::_check_for_object($props_n_values, __CLASS__, $timezone);
30
-        return $has_object ? $has_object : new self($props_n_values, false, $timezone);
31
-    }
32
-
33
-
34
-    /**
35
-     * @param array  $props_n_values
36
-     * @param string $timezone
37
-     * @return EE_Message_Template_Group
38
-     */
39
-    public static function new_instance_from_db($props_n_values = array(), $timezone = '')
40
-    {
41
-        return new self($props_n_values, true, $timezone);
42
-    }
43
-
44
-
45
-    /**
46
-     * @param bool $message_type
47
-     * @throws EE_Error
48
-     */
49
-    public function set_message_type($message_type = false)
50
-    {
51
-        if (! $message_type) {
52
-            throw new EE_Error(esc_html__('Missing required value for the message_type parameter', 'event_espresso'));
53
-        }
54
-        $this->set('MTP_message_type', $message_type);
55
-    }
56
-
57
-
58
-    /**
59
-     * @param bool $messenger
60
-     * @throws EE_Error
61
-     */
62
-    public function set_messenger($messenger = false)
63
-    {
64
-        if (! $messenger) {
65
-            throw new EE_Error(esc_html__('Missing required value for the messenger parameter', 'event_espresso'));
66
-        }
67
-        $this->set('MTP_messenger', $messenger);
68
-    }
69
-
70
-
71
-    /**
72
-     * @param bool $GRP_ID
73
-     * @throws EE_Error
74
-     */
75
-    public function set_group_template_id($GRP_ID = false)
76
-    {
77
-        if (! $GRP_ID) {
78
-            throw new EE_Error(
79
-                esc_html__(
80
-                    'Missing required value for the message template group id',
81
-                    'event_espresso'
82
-                )
83
-            );
84
-        }
85
-        $this->set('GRP_ID', $GRP_ID);
86
-    }
87
-
88
-
89
-    /**
90
-     * get Group ID
91
-     *
92
-     * @access public
93
-     * @return int
94
-     * @throws EE_Error
95
-     */
96
-    public function GRP_ID()
97
-    {
98
-        return $this->get('GRP_ID');
99
-    }
100
-
101
-
102
-    /**
103
-     * get User ID
104
-     *
105
-     * @access public
106
-     * @return int
107
-     * @throws EE_Error
108
-     */
109
-    public function user()
110
-    {
111
-        $user_id = $this->get('MTP_user_id');
112
-        return empty($user_id) ? get_current_user_id() : $user_id;
113
-    }
114
-
115
-
116
-    /**
117
-     * Wrapper for the user function() (preserve backward compat)
118
-     *
119
-     * @since  4.5.0
120
-     * @return int
121
-     * @throws EE_Error
122
-     */
123
-    public function wp_user()
124
-    {
125
-        return $this->user();
126
-    }
127
-
128
-
129
-    /**
130
-     * This simply returns a count of all related events to this message template group
131
-     *
132
-     * @return int
133
-     */
134
-    public function count_events()
135
-    {
136
-        return $this->count_related('Event');
137
-    }
138
-
139
-
140
-    /**
141
-     * returns the name saved in the db for this template
142
-     *
143
-     * @return string
144
-     * @throws EE_Error
145
-     */
146
-    public function name()
147
-    {
148
-        return $this->get('MTP_name');
149
-    }
150
-
151
-
152
-    /**
153
-     * Returns the description saved in the db for this template group
154
-     *
155
-     * @return string
156
-     * @throws EE_Error
157
-     */
158
-    public function description()
159
-    {
160
-        return $this->get('MTP_description');
161
-    }
162
-
163
-
164
-    /**
165
-     * returns all related EE_Message_Template objects
166
-     *
167
-     * @param  array $query_params @see https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md
168
-     * @return EE_Message_Template[]
169
-     * @throws EE_Error
170
-     */
171
-    public function message_templates($query_params = array())
172
-    {
173
-        return $this->get_many_related('Message_Template', $query_params);
174
-    }
175
-
176
-
177
-    /**
178
-     * get Message Messenger
179
-     *
180
-     * @access public
181
-     * @return string
182
-     * @throws EE_Error
183
-     */
184
-    public function messenger()
185
-    {
186
-        return $this->get('MTP_messenger');
187
-    }
188
-
189
-
190
-    /**
191
-     * get Message Messenger OBJECT
192
-     * If an attempt to get the corresponding messenger object fails, then we set this message
193
-     * template group to inactive, and save to db.  Then return null so client code can handle
194
-     * appropriately.
195
-     *
196
-     * @return EE_messenger
197
-     * @throws EE_Error
198
-     */
199
-    public function messenger_obj()
200
-    {
201
-        $messenger = $this->messenger();
202
-        try {
203
-            $messenger = EEH_MSG_Template::messenger_obj($messenger);
204
-        } catch (EE_Error $e) {
205
-            // if an exception was thrown then let's deactivate this message template group because it means there is no
206
-            // class for this messenger in this group.
207
-            $this->set('MTP_is_active', false);
208
-            $this->save();
209
-            return null;
210
-        }
211
-        return $messenger;
212
-    }
213
-
214
-
215
-    /**
216
-     * get Message Type
217
-     *
218
-     * @access public
219
-     * @return string
220
-     * @throws EE_Error
221
-     */
222
-    public function message_type()
223
-    {
224
-        return $this->get('MTP_message_type');
225
-    }
226
-
227
-
228
-    /**
229
-     * get Message type OBJECT
230
-     * If an attempt to get the corresponding message type object fails, then we set this message
231
-     * template group to inactive, and save to db.  Then return null so client code can handle
232
-     * appropriately.
233
-     *
234
-     * @throws EE_Error
235
-     * @return EE_message_type|false if exception thrown.
236
-     */
237
-    public function message_type_obj()
238
-    {
239
-        $message_type = $this->message_type();
240
-        try {
241
-            $message_type = EEH_MSG_Template::message_type_obj($message_type);
242
-        } catch (EE_Error $e) {
243
-            // if an exception was thrown then let's deactivate this message template group because it means there is no
244
-            // class for the message type in this group.
245
-            $this->set('MTP_is_active', false);
246
-            $this->save();
247
-            return null;
248
-        }
249
-        return $message_type;
250
-    }
251
-
252
-
253
-    /**
254
-     * @return array
255
-     * @throws EE_Error
256
-     */
257
-    public function contexts_config()
258
-    {
259
-        return $this->message_type_obj()->get_contexts();
260
-    }
261
-
262
-
263
-    /**
264
-     * This returns the context_label for contexts as set in the message type object
265
-     * Note this is an array with singular and plural keys
266
-     *
267
-     * @access public
268
-     * @return array labels for "context"
269
-     * @throws EE_Error
270
-     */
271
-    public function context_label()
272
-    {
273
-        $obj = $this->message_type_obj();
274
-        return $obj->get_context_label();
275
-    }
276
-
277
-
278
-    /**
279
-     * This returns an array of EE_Message_Template objects indexed by context and field.
280
-     *
281
-     * @return array ()
282
-     * @throws EE_Error
283
-     */
284
-    public function context_templates()
285
-    {
286
-        $mtps_arr = array();
287
-        $mtps = $this->get_many_related('Message_Template');
288
-        if (empty($mtps)) {
289
-            return array();
290
-        }
291
-        // note contexts could have CHECKBOX fields per context. So we return the objects indexed by context AND field.
292
-        foreach ($mtps as $mtp) {
293
-            $mtps_arr[ $mtp->get('MTP_context') ][ $mtp->get('MTP_template_field') ] = $mtp;
294
-        }
295
-        return $mtps_arr;
296
-    }
297
-
298
-
299
-    /**
300
-     * this returns if the template group this template belongs to is global
301
-     *
302
-     * @return bool true if it is, false if it isn't
303
-     * @throws EE_Error
304
-     */
305
-    public function is_global()
306
-    {
307
-        return $this->get('MTP_is_global');
308
-    }
309
-
310
-
311
-    /**
312
-     * this returns if the template group this template belongs to is active (i.e. turned "on" or not)
313
-     *
314
-     * @return bool true if it is, false if it isn't
315
-     * @throws EE_Error
316
-     */
317
-    public function is_active()
318
-    {
319
-        return $this->get('MTP_is_active');
320
-    }
321
-
322
-
323
-    /**
324
-     * This will return an array of shortcodes => labels from the messenger and message_type objects associated with
325
-     * this template.
326
-     *
327
-     * @since 4.3.0
328
-     * @uses  EEH_MSG_Template::get_shortcodes()
329
-     * @param string $context what context we're going to return shortcodes for
330
-     * @param array  $fields  what fields we're returning valid shortcodes for.  If empty then we assume all fields are
331
-     *                        to be returned.
332
-     * @param bool   $merged  If TRUE then we don't return shortcodes indexed by field but instead an array of the
333
-     *                        unique shortcodes for all the given (or all) fields.
334
-     * @return mixed (array|bool) an array of shortcodes in the format array( '[shortcode] => 'label') OR FALSE if no
335
-     *                        shortcodes found.
336
-     * @throws EE_Error
337
-     */
338
-    public function get_shortcodes($context, $fields = array(), $merged = false)
339
-    {
340
-        $messenger = $this->messenger();
341
-        $message_type = $this->message_type();
342
-        return EEH_MSG_Template::get_shortcodes($message_type, $messenger, $fields, $context, $merged);
343
-    }
344
-
345
-
346
-    /**
347
-     * This just gets the template pack name assigned to this message template group.  If it's not set, then we just
348
-     * use the default template pack.
349
-     *
350
-     * @since 4.5.0
351
-     * @return string
352
-     * @throws EE_Error
353
-     */
354
-    public function get_template_pack_name()
355
-    {
356
-        return $this->get_extra_meta('MTP_template_pack', true, 'default');
357
-    }
358
-
359
-
360
-    /**
361
-     * This returns the specific template pack object referenced by the template pack name attached to this message
362
-     * template group.  If no template pack is assigned then the default template pack is retrieved.
363
-     *
364
-     * @since 4.5.0
365
-     * @return EE_Messages_Template_Pack
366
-     * @throws EE_Error
367
-     * @throws InvalidArgumentException
368
-     * @throws ReflectionException
369
-     * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
370
-     * @throws \EventEspresso\core\exceptions\InvalidInterfaceException
371
-     */
372
-    public function get_template_pack()
373
-    {
374
-        $pack_name = $this->get_template_pack_name();
375
-        EE_Registry::instance()->load_helper('MSG_Template');
376
-        return EEH_MSG_Template::get_template_pack($pack_name);
377
-    }
378
-
379
-
380
-    /**
381
-     * This retrieves the template variation assigned to this message template group.  If it's not set, then we just
382
-     * use the default template variation.
383
-     *
384
-     * @since 4.5.0
385
-     * @return string
386
-     * @throws EE_Error
387
-     */
388
-    public function get_template_pack_variation()
389
-    {
390
-        return $this->get_extra_meta('MTP_variation', true, 'default');
391
-    }
392
-
393
-
394
-    /**
395
-     * This just sets the template pack name attached to this message template group.
396
-     *
397
-     * @since 4.5.0
398
-     * @param string $template_pack_name What message template pack is assigned.
399
-     * @return int
400
-     * @throws EE_Error
401
-     */
402
-    public function set_template_pack_name($template_pack_name)
403
-    {
404
-        return $this->update_extra_meta('MTP_template_pack', $template_pack_name);
405
-    }
406
-
407
-
408
-    /**
409
-     * This just sets the template pack variation attached to this message template group.
410
-     *
411
-     * @since 4.5.0
412
-     * @param string $variation What variation is being set on the message template group.
413
-     * @return int
414
-     * @throws EE_Error
415
-     */
416
-    public function set_template_pack_variation($variation)
417
-    {
418
-        return $this->update_extra_meta('MTP_variation', $variation);
419
-    }
420
-
421
-
422
-    /**
423
-     * Deactivates the given context.
424
-     *
425
-     * @param $context
426
-     * @return bool|int
427
-     * @throws EE_Error
428
-     * @throws InvalidIdentifierException
429
-     */
430
-    public function deactivate_context($context)
431
-    {
432
-        $this->validate_context($context);
433
-        return $this->update_extra_meta(self::ACTIVE_CONTEXT_RECORD_META_KEY_PREFIX . $context, false);
434
-    }
435
-
436
-
437
-    /**
438
-     * Activates the given context.
439
-     *
440
-     * @param $context
441
-     * @return bool|int
442
-     * @throws EE_Error
443
-     * @throws InvalidIdentifierException
444
-     */
445
-    public function activate_context($context)
446
-    {
447
-        $this->validate_context($context);
448
-        return $this->update_extra_meta(self::ACTIVE_CONTEXT_RECORD_META_KEY_PREFIX . $context, true);
449
-    }
450
-
451
-
452
-    /**
453
-     * Returns whether the context is active or not.
454
-     * Note, this will default to true if the extra meta record doesn't exist.
455
-     * Also, this does NOT account for whether the "To" field is empty or not. Some messengers may allow the "To" field
456
-     * to be empty (@see EE_Messenger::allow_empty_to_field()) so an empty "To" field is not always an indicator of
457
-     * whether a context is "active" or not.
458
-     *
459
-     * @param $context
460
-     * @return bool
461
-     * @throws EE_Error
462
-     * @throws InvalidIdentifierException
463
-     */
464
-    public function is_context_active($context)
465
-    {
466
-        $this->validate_context($context);
467
-        return filter_var(
468
-            $this->get_extra_meta(self::ACTIVE_CONTEXT_RECORD_META_KEY_PREFIX . $context, true, true),
469
-            FILTER_VALIDATE_BOOLEAN
470
-        );
471
-    }
472
-
473
-
474
-    /**
475
-     * Validates the incoming context to verify it matches a registered context for the related message type.
476
-     *
477
-     * @param string $context
478
-     * @throws EE_Error
479
-     * @throws InvalidIdentifierException
480
-     */
481
-    public function validate_context($context)
482
-    {
483
-        $contexts = $this->contexts_config();
484
-        if (! isset($contexts[ $context ])) {
485
-            throw new InvalidIdentifierException(
486
-                '',
487
-                '',
488
-                sprintf(
489
-                    esc_html__(
490
-                        'An invalid string identifying a context was provided.  "%1$s" was received, and one of "%2$s" was expected.',
491
-                        'event_espresso'
492
-                    ),
493
-                    $context,
494
-                    implode(',', array_keys($contexts))
495
-                )
496
-            );
497
-        }
498
-    }
16
+	/**
17
+	 * Extra Meta key prefix for whether a given context for this message tmeplate group is active or not.
18
+	 */
19
+	const ACTIVE_CONTEXT_RECORD_META_KEY_PREFIX = 'active_context_';
20
+
21
+	/**
22
+	 * @param array  $props_n_values
23
+	 * @param string $timezone
24
+	 * @return EE_Message_Template_Group|mixed
25
+	 * @throws EE_Error
26
+	 */
27
+	public static function new_instance($props_n_values = array(), $timezone = '')
28
+	{
29
+		$has_object = parent::_check_for_object($props_n_values, __CLASS__, $timezone);
30
+		return $has_object ? $has_object : new self($props_n_values, false, $timezone);
31
+	}
32
+
33
+
34
+	/**
35
+	 * @param array  $props_n_values
36
+	 * @param string $timezone
37
+	 * @return EE_Message_Template_Group
38
+	 */
39
+	public static function new_instance_from_db($props_n_values = array(), $timezone = '')
40
+	{
41
+		return new self($props_n_values, true, $timezone);
42
+	}
43
+
44
+
45
+	/**
46
+	 * @param bool $message_type
47
+	 * @throws EE_Error
48
+	 */
49
+	public function set_message_type($message_type = false)
50
+	{
51
+		if (! $message_type) {
52
+			throw new EE_Error(esc_html__('Missing required value for the message_type parameter', 'event_espresso'));
53
+		}
54
+		$this->set('MTP_message_type', $message_type);
55
+	}
56
+
57
+
58
+	/**
59
+	 * @param bool $messenger
60
+	 * @throws EE_Error
61
+	 */
62
+	public function set_messenger($messenger = false)
63
+	{
64
+		if (! $messenger) {
65
+			throw new EE_Error(esc_html__('Missing required value for the messenger parameter', 'event_espresso'));
66
+		}
67
+		$this->set('MTP_messenger', $messenger);
68
+	}
69
+
70
+
71
+	/**
72
+	 * @param bool $GRP_ID
73
+	 * @throws EE_Error
74
+	 */
75
+	public function set_group_template_id($GRP_ID = false)
76
+	{
77
+		if (! $GRP_ID) {
78
+			throw new EE_Error(
79
+				esc_html__(
80
+					'Missing required value for the message template group id',
81
+					'event_espresso'
82
+				)
83
+			);
84
+		}
85
+		$this->set('GRP_ID', $GRP_ID);
86
+	}
87
+
88
+
89
+	/**
90
+	 * get Group ID
91
+	 *
92
+	 * @access public
93
+	 * @return int
94
+	 * @throws EE_Error
95
+	 */
96
+	public function GRP_ID()
97
+	{
98
+		return $this->get('GRP_ID');
99
+	}
100
+
101
+
102
+	/**
103
+	 * get User ID
104
+	 *
105
+	 * @access public
106
+	 * @return int
107
+	 * @throws EE_Error
108
+	 */
109
+	public function user()
110
+	{
111
+		$user_id = $this->get('MTP_user_id');
112
+		return empty($user_id) ? get_current_user_id() : $user_id;
113
+	}
114
+
115
+
116
+	/**
117
+	 * Wrapper for the user function() (preserve backward compat)
118
+	 *
119
+	 * @since  4.5.0
120
+	 * @return int
121
+	 * @throws EE_Error
122
+	 */
123
+	public function wp_user()
124
+	{
125
+		return $this->user();
126
+	}
127
+
128
+
129
+	/**
130
+	 * This simply returns a count of all related events to this message template group
131
+	 *
132
+	 * @return int
133
+	 */
134
+	public function count_events()
135
+	{
136
+		return $this->count_related('Event');
137
+	}
138
+
139
+
140
+	/**
141
+	 * returns the name saved in the db for this template
142
+	 *
143
+	 * @return string
144
+	 * @throws EE_Error
145
+	 */
146
+	public function name()
147
+	{
148
+		return $this->get('MTP_name');
149
+	}
150
+
151
+
152
+	/**
153
+	 * Returns the description saved in the db for this template group
154
+	 *
155
+	 * @return string
156
+	 * @throws EE_Error
157
+	 */
158
+	public function description()
159
+	{
160
+		return $this->get('MTP_description');
161
+	}
162
+
163
+
164
+	/**
165
+	 * returns all related EE_Message_Template objects
166
+	 *
167
+	 * @param  array $query_params @see https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md
168
+	 * @return EE_Message_Template[]
169
+	 * @throws EE_Error
170
+	 */
171
+	public function message_templates($query_params = array())
172
+	{
173
+		return $this->get_many_related('Message_Template', $query_params);
174
+	}
175
+
176
+
177
+	/**
178
+	 * get Message Messenger
179
+	 *
180
+	 * @access public
181
+	 * @return string
182
+	 * @throws EE_Error
183
+	 */
184
+	public function messenger()
185
+	{
186
+		return $this->get('MTP_messenger');
187
+	}
188
+
189
+
190
+	/**
191
+	 * get Message Messenger OBJECT
192
+	 * If an attempt to get the corresponding messenger object fails, then we set this message
193
+	 * template group to inactive, and save to db.  Then return null so client code can handle
194
+	 * appropriately.
195
+	 *
196
+	 * @return EE_messenger
197
+	 * @throws EE_Error
198
+	 */
199
+	public function messenger_obj()
200
+	{
201
+		$messenger = $this->messenger();
202
+		try {
203
+			$messenger = EEH_MSG_Template::messenger_obj($messenger);
204
+		} catch (EE_Error $e) {
205
+			// if an exception was thrown then let's deactivate this message template group because it means there is no
206
+			// class for this messenger in this group.
207
+			$this->set('MTP_is_active', false);
208
+			$this->save();
209
+			return null;
210
+		}
211
+		return $messenger;
212
+	}
213
+
214
+
215
+	/**
216
+	 * get Message Type
217
+	 *
218
+	 * @access public
219
+	 * @return string
220
+	 * @throws EE_Error
221
+	 */
222
+	public function message_type()
223
+	{
224
+		return $this->get('MTP_message_type');
225
+	}
226
+
227
+
228
+	/**
229
+	 * get Message type OBJECT
230
+	 * If an attempt to get the corresponding message type object fails, then we set this message
231
+	 * template group to inactive, and save to db.  Then return null so client code can handle
232
+	 * appropriately.
233
+	 *
234
+	 * @throws EE_Error
235
+	 * @return EE_message_type|false if exception thrown.
236
+	 */
237
+	public function message_type_obj()
238
+	{
239
+		$message_type = $this->message_type();
240
+		try {
241
+			$message_type = EEH_MSG_Template::message_type_obj($message_type);
242
+		} catch (EE_Error $e) {
243
+			// if an exception was thrown then let's deactivate this message template group because it means there is no
244
+			// class for the message type in this group.
245
+			$this->set('MTP_is_active', false);
246
+			$this->save();
247
+			return null;
248
+		}
249
+		return $message_type;
250
+	}
251
+
252
+
253
+	/**
254
+	 * @return array
255
+	 * @throws EE_Error
256
+	 */
257
+	public function contexts_config()
258
+	{
259
+		return $this->message_type_obj()->get_contexts();
260
+	}
261
+
262
+
263
+	/**
264
+	 * This returns the context_label for contexts as set in the message type object
265
+	 * Note this is an array with singular and plural keys
266
+	 *
267
+	 * @access public
268
+	 * @return array labels for "context"
269
+	 * @throws EE_Error
270
+	 */
271
+	public function context_label()
272
+	{
273
+		$obj = $this->message_type_obj();
274
+		return $obj->get_context_label();
275
+	}
276
+
277
+
278
+	/**
279
+	 * This returns an array of EE_Message_Template objects indexed by context and field.
280
+	 *
281
+	 * @return array ()
282
+	 * @throws EE_Error
283
+	 */
284
+	public function context_templates()
285
+	{
286
+		$mtps_arr = array();
287
+		$mtps = $this->get_many_related('Message_Template');
288
+		if (empty($mtps)) {
289
+			return array();
290
+		}
291
+		// note contexts could have CHECKBOX fields per context. So we return the objects indexed by context AND field.
292
+		foreach ($mtps as $mtp) {
293
+			$mtps_arr[ $mtp->get('MTP_context') ][ $mtp->get('MTP_template_field') ] = $mtp;
294
+		}
295
+		return $mtps_arr;
296
+	}
297
+
298
+
299
+	/**
300
+	 * this returns if the template group this template belongs to is global
301
+	 *
302
+	 * @return bool true if it is, false if it isn't
303
+	 * @throws EE_Error
304
+	 */
305
+	public function is_global()
306
+	{
307
+		return $this->get('MTP_is_global');
308
+	}
309
+
310
+
311
+	/**
312
+	 * this returns if the template group this template belongs to is active (i.e. turned "on" or not)
313
+	 *
314
+	 * @return bool true if it is, false if it isn't
315
+	 * @throws EE_Error
316
+	 */
317
+	public function is_active()
318
+	{
319
+		return $this->get('MTP_is_active');
320
+	}
321
+
322
+
323
+	/**
324
+	 * This will return an array of shortcodes => labels from the messenger and message_type objects associated with
325
+	 * this template.
326
+	 *
327
+	 * @since 4.3.0
328
+	 * @uses  EEH_MSG_Template::get_shortcodes()
329
+	 * @param string $context what context we're going to return shortcodes for
330
+	 * @param array  $fields  what fields we're returning valid shortcodes for.  If empty then we assume all fields are
331
+	 *                        to be returned.
332
+	 * @param bool   $merged  If TRUE then we don't return shortcodes indexed by field but instead an array of the
333
+	 *                        unique shortcodes for all the given (or all) fields.
334
+	 * @return mixed (array|bool) an array of shortcodes in the format array( '[shortcode] => 'label') OR FALSE if no
335
+	 *                        shortcodes found.
336
+	 * @throws EE_Error
337
+	 */
338
+	public function get_shortcodes($context, $fields = array(), $merged = false)
339
+	{
340
+		$messenger = $this->messenger();
341
+		$message_type = $this->message_type();
342
+		return EEH_MSG_Template::get_shortcodes($message_type, $messenger, $fields, $context, $merged);
343
+	}
344
+
345
+
346
+	/**
347
+	 * This just gets the template pack name assigned to this message template group.  If it's not set, then we just
348
+	 * use the default template pack.
349
+	 *
350
+	 * @since 4.5.0
351
+	 * @return string
352
+	 * @throws EE_Error
353
+	 */
354
+	public function get_template_pack_name()
355
+	{
356
+		return $this->get_extra_meta('MTP_template_pack', true, 'default');
357
+	}
358
+
359
+
360
+	/**
361
+	 * This returns the specific template pack object referenced by the template pack name attached to this message
362
+	 * template group.  If no template pack is assigned then the default template pack is retrieved.
363
+	 *
364
+	 * @since 4.5.0
365
+	 * @return EE_Messages_Template_Pack
366
+	 * @throws EE_Error
367
+	 * @throws InvalidArgumentException
368
+	 * @throws ReflectionException
369
+	 * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
370
+	 * @throws \EventEspresso\core\exceptions\InvalidInterfaceException
371
+	 */
372
+	public function get_template_pack()
373
+	{
374
+		$pack_name = $this->get_template_pack_name();
375
+		EE_Registry::instance()->load_helper('MSG_Template');
376
+		return EEH_MSG_Template::get_template_pack($pack_name);
377
+	}
378
+
379
+
380
+	/**
381
+	 * This retrieves the template variation assigned to this message template group.  If it's not set, then we just
382
+	 * use the default template variation.
383
+	 *
384
+	 * @since 4.5.0
385
+	 * @return string
386
+	 * @throws EE_Error
387
+	 */
388
+	public function get_template_pack_variation()
389
+	{
390
+		return $this->get_extra_meta('MTP_variation', true, 'default');
391
+	}
392
+
393
+
394
+	/**
395
+	 * This just sets the template pack name attached to this message template group.
396
+	 *
397
+	 * @since 4.5.0
398
+	 * @param string $template_pack_name What message template pack is assigned.
399
+	 * @return int
400
+	 * @throws EE_Error
401
+	 */
402
+	public function set_template_pack_name($template_pack_name)
403
+	{
404
+		return $this->update_extra_meta('MTP_template_pack', $template_pack_name);
405
+	}
406
+
407
+
408
+	/**
409
+	 * This just sets the template pack variation attached to this message template group.
410
+	 *
411
+	 * @since 4.5.0
412
+	 * @param string $variation What variation is being set on the message template group.
413
+	 * @return int
414
+	 * @throws EE_Error
415
+	 */
416
+	public function set_template_pack_variation($variation)
417
+	{
418
+		return $this->update_extra_meta('MTP_variation', $variation);
419
+	}
420
+
421
+
422
+	/**
423
+	 * Deactivates the given context.
424
+	 *
425
+	 * @param $context
426
+	 * @return bool|int
427
+	 * @throws EE_Error
428
+	 * @throws InvalidIdentifierException
429
+	 */
430
+	public function deactivate_context($context)
431
+	{
432
+		$this->validate_context($context);
433
+		return $this->update_extra_meta(self::ACTIVE_CONTEXT_RECORD_META_KEY_PREFIX . $context, false);
434
+	}
435
+
436
+
437
+	/**
438
+	 * Activates the given context.
439
+	 *
440
+	 * @param $context
441
+	 * @return bool|int
442
+	 * @throws EE_Error
443
+	 * @throws InvalidIdentifierException
444
+	 */
445
+	public function activate_context($context)
446
+	{
447
+		$this->validate_context($context);
448
+		return $this->update_extra_meta(self::ACTIVE_CONTEXT_RECORD_META_KEY_PREFIX . $context, true);
449
+	}
450
+
451
+
452
+	/**
453
+	 * Returns whether the context is active or not.
454
+	 * Note, this will default to true if the extra meta record doesn't exist.
455
+	 * Also, this does NOT account for whether the "To" field is empty or not. Some messengers may allow the "To" field
456
+	 * to be empty (@see EE_Messenger::allow_empty_to_field()) so an empty "To" field is not always an indicator of
457
+	 * whether a context is "active" or not.
458
+	 *
459
+	 * @param $context
460
+	 * @return bool
461
+	 * @throws EE_Error
462
+	 * @throws InvalidIdentifierException
463
+	 */
464
+	public function is_context_active($context)
465
+	{
466
+		$this->validate_context($context);
467
+		return filter_var(
468
+			$this->get_extra_meta(self::ACTIVE_CONTEXT_RECORD_META_KEY_PREFIX . $context, true, true),
469
+			FILTER_VALIDATE_BOOLEAN
470
+		);
471
+	}
472
+
473
+
474
+	/**
475
+	 * Validates the incoming context to verify it matches a registered context for the related message type.
476
+	 *
477
+	 * @param string $context
478
+	 * @throws EE_Error
479
+	 * @throws InvalidIdentifierException
480
+	 */
481
+	public function validate_context($context)
482
+	{
483
+		$contexts = $this->contexts_config();
484
+		if (! isset($contexts[ $context ])) {
485
+			throw new InvalidIdentifierException(
486
+				'',
487
+				'',
488
+				sprintf(
489
+					esc_html__(
490
+						'An invalid string identifying a context was provided.  "%1$s" was received, and one of "%2$s" was expected.',
491
+						'event_espresso'
492
+					),
493
+					$context,
494
+					implode(',', array_keys($contexts))
495
+				)
496
+			);
497
+		}
498
+	}
499 499
 }
Please login to merge, or discard this patch.