Completed
Branch master (491978)
by
unknown
67:09 queued 59:02
created
admin/extend/registrations/EE_Event_Registrations_List_Table.class.php 1 patch
Indentation   +553 added lines, -553 removed lines patch added patch discarded remove patch
@@ -12,562 +12,562 @@
 block discarded – undo
12 12
 class EE_Event_Registrations_List_Table extends EE_Admin_List_Table
13 13
 {
14 14
 
15
-    /**
16
-     * This property will hold the related Datetimes on an event IF the event id is included in the request.
17
-     *
18
-     * @var EE_Datetime[]
19
-     */
20
-    protected $_dtts_for_event = array();
21
-
22
-
23
-    /**
24
-     * The event if one is specified in the request
25
-     *
26
-     * @var EE_Event
27
-     */
28
-    protected $_evt = null;
29
-
30
-
31
-    /**
32
-     * The DTT_ID if the current view has a specified datetime.
33
-     *
34
-     * @var int $_cur_dtt_id
35
-     */
36
-    protected $_cur_dtt_id = 0;
37
-
38
-
39
-    /**
40
-     * EE_Event_Registrations_List_Table constructor.
41
-     *
42
-     * @param \Registrations_Admin_Page $admin_page
43
-     */
44
-    public function __construct($admin_page)
45
-    {
46
-        parent::__construct($admin_page);
47
-        $this->_status = $this->_admin_page->get_registration_status_array();
48
-    }
49
-
50
-
51
-    protected function _setup_data()
52
-    {
53
-        $this->_data = $this->_view !== 'trash' ? $this->_admin_page->get_event_attendees($this->_per_page)
54
-            : $this->_admin_page->get_event_attendees($this->_per_page, false, true);
55
-        $this->_all_data_count = $this->_view !== 'trash' ? $this->_admin_page->get_event_attendees(
56
-            $this->_per_page,
57
-            true
58
-        ) : $this->_admin_page->get_event_attendees($this->_per_page, true, true);
59
-    }
60
-
61
-
62
-    protected function _set_properties()
63
-    {
64
-        $evt_id = isset($this->_req_data['event_id']) ? $this->_req_data['event_id'] : null;
65
-        $this->_wp_list_args = array(
66
-            'singular' => __('registrant', 'event_espresso'),
67
-            'plural'   => __('registrants', 'event_espresso'),
68
-            'ajax'     => true,
69
-            'screen'   => $this->_admin_page->get_current_screen()->id,
70
-        );
71
-        $columns = array();
72
-        // $columns['_Reg_Status'] = '';
73
-        if (! empty($evt_id)) {
74
-            $columns['cb'] = '<input type="checkbox" />'; // Render a checkbox instead of text
75
-            $this->_has_checkbox_column = true;
76
-        }
77
-        $this->_columns = array(
78
-            '_REG_att_checked_in' => '<span class="dashicons dashicons-yes ee-icon-size-18"></span>',
79
-            'ATT_name'            => __('Registrant', 'event_espresso'),
80
-            'ATT_email'           => __('Email Address', 'event_espresso'),
81
-            'Event'               => __('Event', 'event_espresso'),
82
-            'PRC_name'            => __('TKT Option', 'event_espresso'),
83
-            '_REG_final_price'    => __('Price', 'event_espresso'),
84
-            'TXN_paid'            => __('Paid', 'event_espresso'),
85
-            'TXN_total'           => __('Total', 'event_espresso'),
86
-        );
87
-        $this->_columns = array_merge($columns, $this->_columns);
88
-        $this->_primary_column = '_REG_att_checked_in';
89
-        if (! empty($evt_id)
90
-            && EE_Registry::instance()->CAP->current_user_can(
91
-                'ee_read_registrations',
92
-                'espresso_registrations_registrations_reports',
93
-                $evt_id
94
-            )
95
-        ) {
96
-            $this->_bottom_buttons = array(
97
-                'report' => array(
98
-                    'route'         => 'registrations_report',
99
-                    'extra_request' =>
100
-                        array(
101
-                            'EVT_ID'     => $evt_id,
102
-                            'return_url' => urlencode("//{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}"),
103
-                        ),
104
-                ),
105
-            );
106
-        }
107
-        $this->_bottom_buttons['report_filtered'] = array(
108
-            'route'         => 'registrations_checkin_report',
109
-            'extra_request' => array(
110
-                'use_filters' => true,
111
-                'filters'     => array_merge(
112
-                    array(
113
-                        'EVT_ID' => $evt_id,
114
-                    ),
115
-                    array_diff_key(
116
-                        $this->_req_data,
117
-                        array_flip(
118
-                            array(
119
-                                'page',
120
-                                'action',
121
-                                'default_nonce',
122
-                            )
123
-                        )
124
-                    )
125
-                ),
126
-                'return_url'  => urlencode("//{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}"),
127
-            ),
128
-        );
129
-        $this->_sortable_columns = array(
130
-            /**
131
-             * Allows users to change the default sort if they wish.
132
-             * Returning a falsey on this filter will result in the default sort to be by firstname rather than last name.
133
-             *
134
-             * Note: usual naming conventions for filters aren't followed here so that just one filter can be used to
135
-             * change the sorts on any list table involving registration contacts.  If you want to only change the filter
136
-             * for a specific list table you can use the provided reference to this object instance.
137
-             */
138
-            'ATT_name' => array(
139
-                'FHEE__EE_Registrations_List_Table___set_properties__default_sort_by_registration_last_name',
140
-                true,
141
-                $this,
142
-            )
143
-                ? array('ATT_lname' => true)
144
-                : array('ATT_fname' => true),
145
-            'Event'    => array('Event.EVT_name' => false),
146
-        );
147
-        $this->_hidden_columns = array();
148
-        $this->_evt = EEM_Event::instance()->get_one_by_ID($evt_id);
149
-        $this->_dtts_for_event = $this->_evt instanceof EE_Event ? $this->_evt->datetimes_ordered() : array();
150
-    }
151
-
152
-
153
-    /**
154
-     * @param \EE_Registration $item
155
-     * @return string
156
-     */
157
-    protected function _get_row_class($item)
158
-    {
159
-        $class = parent::_get_row_class($item);
160
-        // add status class
161
-        $class .= ' ee-status-strip reg-status-' . $item->status_ID();
162
-        if ($this->_has_checkbox_column) {
163
-            $class .= ' has-checkbox-column';
164
-        }
165
-        return $class;
166
-    }
167
-
168
-
169
-    /**
170
-     * @return array
171
-     * @throws \EE_Error
172
-     */
173
-    protected function _get_table_filters()
174
-    {
175
-        $filters = $where = array();
176
-        $current_EVT_ID = isset($this->_req_data['event_id']) ? (int) $this->_req_data['event_id'] : 0;
177
-        if (empty($this->_dtts_for_event) || count($this->_dtts_for_event) === 1) {
178
-            // this means we don't have an event so let's setup a filter dropdown for all the events to select
179
-            // note possible capability restrictions
180
-            if (! EE_Registry::instance()->CAP->current_user_can('ee_read_private_events', 'get_events')) {
181
-                $where['status**'] = array('!=', 'private');
182
-            }
183
-            if (! EE_Registry::instance()->CAP->current_user_can('ee_read_others_events', 'get_events')) {
184
-                $where['EVT_wp_user'] = get_current_user_id();
185
-            }
186
-            $events = EEM_Event::instance()->get_all(
187
-                array(
188
-                    $where,
189
-                    'order_by' => array('Datetime.DTT_EVT_start' => 'DESC'),
190
-                )
191
-            );
192
-            $evts[] = array(
193
-                'id'   => 0,
194
-                'text' => __('To toggle Check-in status, select an event', 'event_espresso'),
195
-            );
196
-            $checked = 'checked';
197
-            /** @var EE_Event $evt */
198
-            foreach ($events as $evt) {
199
-                // any registrations for this event?
200
-                if (! $evt->get_count_of_all_registrations()) {
201
-                    continue;
202
-                }
203
-                $evts[] = array(
204
-                    'id'    => $evt->ID(),
205
-                    'text'  => apply_filters(
206
-                        'FHEE__EE_Event_Registrations___get_table_filters__event_name',
207
-                        $evt->get('EVT_name'),
208
-                        $evt
209
-                    ),
210
-                    'class' => $evt->is_expired() ? 'ee-expired-event' : '',
211
-                );
212
-                if ($evt->ID() === $current_EVT_ID && $evt->is_expired()) {
213
-                    $checked = '';
214
-                }
215
-            }
216
-            $event_filter = '<div class="ee-event-filter">';
217
-            $event_filter .= EEH_Form_Fields::select_input('event_id', $evts, $current_EVT_ID);
218
-            $event_filter .= '<span class="ee-event-filter-toggle">';
219
-            $event_filter .= '<input type="checkbox" id="js-ee-hide-expired-events" ' . $checked . '> ';
220
-            $event_filter .= __('Hide Expired Events', 'event_espresso');
221
-            $event_filter .= '</span>';
222
-            $event_filter .= '</div>';
223
-            $filters[] = $event_filter;
224
-        }
225
-        if (! empty($this->_dtts_for_event)) {
226
-            // DTT datetimes filter
227
-            $this->_cur_dtt_id = isset($this->_req_data['DTT_ID']) ? $this->_req_data['DTT_ID'] : 0;
228
-            if (count($this->_dtts_for_event) > 1) {
229
-                $dtts[0] = __('To toggle check-in status, select a datetime.', 'event_espresso');
230
-                foreach ($this->_dtts_for_event as $dtt) {
231
-                    $datetime_string = $dtt->name();
232
-                    $datetime_string = ! empty($datetime_string) ? ' (' . $datetime_string . ')' : '';
233
-                    $datetime_string = $dtt->start_date_and_time() . ' - ' . $dtt->end_date_and_time() . $datetime_string;
234
-                    $dtts[ $dtt->ID() ] = $datetime_string;
235
-                }
236
-                $input = new EE_Select_Input(
237
-                    $dtts,
238
-                    array(
239
-                        'html_name' => 'DTT_ID',
240
-                        'html_id'   => 'DTT_ID',
241
-                        'default'   => $this->_cur_dtt_id,
242
-                    )
243
-                );
244
-                $filters[] = $input->get_html_for_input();
245
-                $filters[] = '<input type="hidden" name="event_id" value="' . $current_EVT_ID . '">';
246
-            }
247
-        }
248
-        return $filters;
249
-    }
250
-
251
-
252
-    protected function _add_view_counts()
253
-    {
254
-        $this->_views['all']['count'] = $this->_get_total_event_attendees();
255
-    }
256
-
257
-
258
-    /**
259
-     * @return int
260
-     * @throws \EE_Error
261
-     */
262
-    protected function _get_total_event_attendees()
263
-    {
264
-        $EVT_ID = isset($this->_req_data['event_id']) ? absint($this->_req_data['event_id']) : false;
265
-        $DTT_ID = $this->_cur_dtt_id;
266
-        $query_params = array();
267
-        if ($EVT_ID) {
268
-            $query_params[0]['EVT_ID'] = $EVT_ID;
269
-        }
270
-        // if DTT is included we only show for that datetime.  Otherwise we're showing for all datetimes (the event).
271
-        if ($DTT_ID) {
272
-            $query_params[0]['Ticket.Datetime.DTT_ID'] = $DTT_ID;
273
-        }
274
-        $status_ids_array = apply_filters(
275
-            'FHEE__Extend_Registrations_Admin_Page__get_event_attendees__status_ids_array',
276
-            array(EEM_Registration::status_id_pending_payment, EEM_Registration::status_id_approved)
277
-        );
278
-        $query_params[0]['STS_ID'] = array('IN', $status_ids_array);
279
-        return EEM_Registration::instance()->count($query_params);
280
-    }
281
-
282
-
283
-    /**
284
-     * @param \EE_Registration $item
285
-     * @return string
286
-     */
287
-    public function column__Reg_Status(EE_Registration $item)
288
-    {
289
-        return '<span class="ee-status-strip ee-status-strip-td reg-status-' . $item->status_ID() . '"></span>';
290
-    }
291
-
292
-
293
-    /**
294
-     * @param \EE_Registration $item
295
-     * @return string
296
-     * @throws \EE_Error
297
-     */
298
-    public function column_cb($item)
299
-    {
300
-        return sprintf('<input type="checkbox" name="checkbox[%1$s]" value="%1$s" />', $item->ID());
301
-    }
302
-
303
-
304
-    /**
305
-     * column_REG_att_checked_in
306
-     *
307
-     * @param EE_Registration $item
308
-     * @return string
309
-     * @throws EE_Error
310
-     * @throws InvalidArgumentException
311
-     * @throws InvalidDataTypeException
312
-     * @throws InvalidInterfaceException
313
-     */
314
-    public function column__REG_att_checked_in(EE_Registration $item)
315
-    {
316
-        $attendee = $item->attendee();
317
-        $attendee_name = $attendee instanceof EE_Attendee ? $attendee->full_name() : '';
318
-
319
-        if ($this->_cur_dtt_id === 0 && count($this->_dtts_for_event) === 1) {
320
-            $latest_related_datetime = $item->get_latest_related_datetime();
321
-            if ($latest_related_datetime instanceof EE_Datetime) {
322
-                $this->_cur_dtt_id = $latest_related_datetime->ID();
323
-            }
324
-        }
325
-        $checkin_status_dashicon = CheckinStatusDashicon::fromRegistrationAndDatetimeId(
326
-            $item,
327
-            $this->_cur_dtt_id
328
-        );
329
-        $nonce = wp_create_nonce('checkin_nonce');
330
-        $toggle_active = ! empty($this->_cur_dtt_id)
331
-                         && EE_Registry::instance()->CAP->current_user_can(
332
-                             'ee_edit_checkin',
333
-                             'espresso_registrations_toggle_checkin_status',
334
-                             $item->ID()
335
-                         )
336
-            ? ' clickable trigger-checkin'
337
-            : '';
338
-        $mobile_view_content = ' <span class="show-on-mobile-view-only">' . $attendee_name . '</span>';
339
-        return '<span class="' . $checkin_status_dashicon->cssClasses() . $toggle_active . '"'
340
-               . ' data-_regid="' . $item->ID() . '"'
341
-               . ' data-dttid="' . $this->_cur_dtt_id . '"'
342
-               . ' data-nonce="' . $nonce . '">'
343
-               . '</span>'
344
-               . $mobile_view_content;
345
-    }
346
-
347
-
348
-    /**
349
-     * @param \EE_Registration $item
350
-     * @return mixed|string|void
351
-     * @throws \EE_Error
352
-     */
353
-    public function column_ATT_name(EE_Registration $item)
354
-    {
355
-        $attendee = $item->attendee();
356
-        if (! $attendee instanceof EE_Attendee) {
357
-            return __('No contact record for this registration.', 'event_espresso');
358
-        }
359
-        // edit attendee link
360
-        $edit_lnk_url = EE_Admin_Page::add_query_args_and_nonce(
361
-            array('action' => 'view_registration', '_REG_ID' => $item->ID()),
362
-            REG_ADMIN_URL
363
-        );
364
-        $name_link = EE_Registry::instance()->CAP->current_user_can(
365
-            'ee_edit_contacts',
366
-            'espresso_registrations_edit_attendee'
367
-        )
368
-            ? '<a href="' . $edit_lnk_url . '" title="' . esc_attr__('View Registration Details', 'event_espresso') . '">'
369
-              . $item->attendee()->full_name()
370
-              . '</a>'
371
-            : $item->attendee()->full_name();
372
-        $name_link .= $item->count() === 1
373
-            ? '&nbsp;<sup><div class="dashicons dashicons-star-filled lt-blue-icon ee-icon-size-8"></div></sup>	'
374
-            : '';
375
-        // add group details
376
-        $name_link .= '&nbsp;' . sprintf(__('(%s of %s)', 'event_espresso'), $item->count(), $item->group_size());
377
-        // add regcode
378
-        $link = EE_Admin_Page::add_query_args_and_nonce(
379
-            array('action' => 'view_registration', '_REG_ID' => $item->ID()),
380
-            REG_ADMIN_URL
381
-        );
382
-        $name_link .= '<br>';
383
-        $name_link .= EE_Registry::instance()->instance()->CAP->current_user_can(
384
-            'ee_read_registration',
385
-            'view_registration',
386
-            $item->ID()
387
-        )
388
-            ? '<a href="' . $link . '" title="' . esc_attr__('View Registration Details', 'event_espresso') . '">'
389
-              . $item->reg_code()
390
-              . '</a>'
391
-            : $item->reg_code();
392
-        // status
393
-        $name_link .= '<br><span class="ee-status-text-small">';
394
-        $name_link .= EEH_Template::pretty_status($item->status_ID(), false, 'sentence');
395
-        $name_link .= '</span>';
396
-        $actions = array();
397
-        $DTT_ID = $this->_cur_dtt_id;
398
-        $latest_related_datetime = empty($DTT_ID) && ! empty($this->_req_data['event_id']) && $item instanceof EE_Registration
399
-            ? $item->get_latest_related_datetime()
400
-            : null;
401
-        $DTT_ID = $latest_related_datetime instanceof EE_Datetime
402
-            ? $latest_related_datetime->ID()
403
-            : $DTT_ID;
404
-        if (! empty($DTT_ID)
405
-            && EE_Registry::instance()->CAP->current_user_can(
406
-                'ee_read_checkins',
407
-                'espresso_registrations_registration_checkins'
408
-            )
409
-        ) {
410
-            $checkin_list_url = EE_Admin_Page::add_query_args_and_nonce(
411
-                array('action' => 'registration_checkins', '_REG_ID' => $item->ID(), 'DTT_ID' => $DTT_ID),
412
-                REG_ADMIN_URL
413
-            );
414
-            // get the timestamps for this registration's checkins, related to the selected datetime
415
-            $timestamps = $item->get_many_related('Checkin', array(array('DTT_ID' => $DTT_ID)));
416
-            if (! empty($timestamps)) {
417
-                // get the last timestamp
418
-                $last_timestamp = end($timestamps);
419
-                // checked in or checked out?
420
-                $checkin_status = $last_timestamp->get('CHK_in')
421
-                    ? esc_html__('Checked In', 'event_espresso')
422
-                    : esc_html__('Checked Out', 'event_espresso');
423
-                // get timestamp string
424
-                $timestamp_string = $last_timestamp->get_datetime('CHK_timestamp');
425
-                $actions['checkin'] = '<a href="' . $checkin_list_url . '" title="'
426
-                                      . esc_attr__(
427
-                                          'View this registrant\'s check-ins/checkouts for the datetime',
428
-                                          'event_espresso'
429
-                                      ) . '">' . $checkin_status . ': ' . $timestamp_string . '</a>';
430
-            }
431
-        }
432
-        return (! empty($DTT_ID) && ! empty($timestamps))
433
-            ? sprintf('%1$s %2$s', $name_link, $this->row_actions($actions, true))
434
-            : $name_link;
435
-    }
436
-
437
-
438
-    /**
439
-     * @param \EE_Registration $item
440
-     * @return string
441
-     */
442
-    public function column_ATT_email(EE_Registration $item)
443
-    {
444
-        $attendee = $item->attendee();
445
-        return $attendee instanceof EE_Attendee ? $attendee->email() : '';
446
-    }
447
-
448
-
449
-    /**
450
-     * @param \EE_Registration $item
451
-     * @return bool|string
452
-     * @throws \EE_Error
453
-     */
454
-    public function column_Event(EE_Registration $item)
455
-    {
456
-        try {
457
-            $event = $this->_evt instanceof EE_Event ? $this->_evt : $item->event();
458
-            $chkin_lnk_url = EE_Admin_Page::add_query_args_and_nonce(
459
-                array('action' => 'event_registrations', 'event_id' => $event->ID()),
460
-                REG_ADMIN_URL
461
-            );
462
-            $event_label = EE_Registry::instance()->CAP->current_user_can(
463
-                'ee_read_checkins',
464
-                'espresso_registrations_registration_checkins'
465
-            ) ? '<a href="' . $chkin_lnk_url . '" title="'
466
-                . esc_attr__(
467
-                    'View Checkins for this Event',
468
-                    'event_espresso'
469
-                ) . '">' . $event->name() . '</a>' : $event->name();
470
-        } catch (\EventEspresso\core\exceptions\EntityNotFoundException $e) {
471
-            $event_label = esc_html__('Unknown', 'event_espresso');
472
-        }
473
-        return $event_label;
474
-    }
475
-
476
-
477
-    /**
478
-     * @param \EE_Registration $item
479
-     * @return mixed|string|void
480
-     */
481
-    public function column_PRC_name(EE_Registration $item)
482
-    {
483
-        return $item->ticket() instanceof EE_Ticket ? $item->ticket()->name() : __("Unknown", "event_espresso");
484
-    }
485
-
486
-
487
-    /**
488
-     * column_REG_final_price
489
-     *
490
-     * @param \EE_Registration $item
491
-     * @return string
492
-     */
493
-    public function column__REG_final_price(EE_Registration $item)
494
-    {
495
-        return '<span class="reg-pad-rght">' . ' ' . $item->pretty_final_price() . '</span>';
496
-    }
497
-
498
-
499
-    /**
500
-     * column_TXN_paid
501
-     *
502
-     * @param \EE_Registration $item
503
-     * @return string
504
-     * @throws \EE_Error
505
-     */
506
-    public function column_TXN_paid(EE_Registration $item)
507
-    {
508
-        if ($item->count() === 1) {
509
-            if ($item->transaction()->paid() >= $item->transaction()->total()) {
510
-                return '<span class="reg-pad-rght"><div class="dashicons dashicons-yes green-icon"></div></span>';
511
-            } else {
512
-                $view_txn_lnk_url = EE_Admin_Page::add_query_args_and_nonce(
513
-                    array('action' => 'view_transaction', 'TXN_ID' => $item->transaction_ID()),
514
-                    TXN_ADMIN_URL
515
-                );
516
-                return EE_Registry::instance()->CAP->current_user_can(
517
-                    'ee_read_transaction',
518
-                    'espresso_transactions_view_transaction'
519
-                ) ? '
15
+	/**
16
+	 * This property will hold the related Datetimes on an event IF the event id is included in the request.
17
+	 *
18
+	 * @var EE_Datetime[]
19
+	 */
20
+	protected $_dtts_for_event = array();
21
+
22
+
23
+	/**
24
+	 * The event if one is specified in the request
25
+	 *
26
+	 * @var EE_Event
27
+	 */
28
+	protected $_evt = null;
29
+
30
+
31
+	/**
32
+	 * The DTT_ID if the current view has a specified datetime.
33
+	 *
34
+	 * @var int $_cur_dtt_id
35
+	 */
36
+	protected $_cur_dtt_id = 0;
37
+
38
+
39
+	/**
40
+	 * EE_Event_Registrations_List_Table constructor.
41
+	 *
42
+	 * @param \Registrations_Admin_Page $admin_page
43
+	 */
44
+	public function __construct($admin_page)
45
+	{
46
+		parent::__construct($admin_page);
47
+		$this->_status = $this->_admin_page->get_registration_status_array();
48
+	}
49
+
50
+
51
+	protected function _setup_data()
52
+	{
53
+		$this->_data = $this->_view !== 'trash' ? $this->_admin_page->get_event_attendees($this->_per_page)
54
+			: $this->_admin_page->get_event_attendees($this->_per_page, false, true);
55
+		$this->_all_data_count = $this->_view !== 'trash' ? $this->_admin_page->get_event_attendees(
56
+			$this->_per_page,
57
+			true
58
+		) : $this->_admin_page->get_event_attendees($this->_per_page, true, true);
59
+	}
60
+
61
+
62
+	protected function _set_properties()
63
+	{
64
+		$evt_id = isset($this->_req_data['event_id']) ? $this->_req_data['event_id'] : null;
65
+		$this->_wp_list_args = array(
66
+			'singular' => __('registrant', 'event_espresso'),
67
+			'plural'   => __('registrants', 'event_espresso'),
68
+			'ajax'     => true,
69
+			'screen'   => $this->_admin_page->get_current_screen()->id,
70
+		);
71
+		$columns = array();
72
+		// $columns['_Reg_Status'] = '';
73
+		if (! empty($evt_id)) {
74
+			$columns['cb'] = '<input type="checkbox" />'; // Render a checkbox instead of text
75
+			$this->_has_checkbox_column = true;
76
+		}
77
+		$this->_columns = array(
78
+			'_REG_att_checked_in' => '<span class="dashicons dashicons-yes ee-icon-size-18"></span>',
79
+			'ATT_name'            => __('Registrant', 'event_espresso'),
80
+			'ATT_email'           => __('Email Address', 'event_espresso'),
81
+			'Event'               => __('Event', 'event_espresso'),
82
+			'PRC_name'            => __('TKT Option', 'event_espresso'),
83
+			'_REG_final_price'    => __('Price', 'event_espresso'),
84
+			'TXN_paid'            => __('Paid', 'event_espresso'),
85
+			'TXN_total'           => __('Total', 'event_espresso'),
86
+		);
87
+		$this->_columns = array_merge($columns, $this->_columns);
88
+		$this->_primary_column = '_REG_att_checked_in';
89
+		if (! empty($evt_id)
90
+			&& EE_Registry::instance()->CAP->current_user_can(
91
+				'ee_read_registrations',
92
+				'espresso_registrations_registrations_reports',
93
+				$evt_id
94
+			)
95
+		) {
96
+			$this->_bottom_buttons = array(
97
+				'report' => array(
98
+					'route'         => 'registrations_report',
99
+					'extra_request' =>
100
+						array(
101
+							'EVT_ID'     => $evt_id,
102
+							'return_url' => urlencode("//{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}"),
103
+						),
104
+				),
105
+			);
106
+		}
107
+		$this->_bottom_buttons['report_filtered'] = array(
108
+			'route'         => 'registrations_checkin_report',
109
+			'extra_request' => array(
110
+				'use_filters' => true,
111
+				'filters'     => array_merge(
112
+					array(
113
+						'EVT_ID' => $evt_id,
114
+					),
115
+					array_diff_key(
116
+						$this->_req_data,
117
+						array_flip(
118
+							array(
119
+								'page',
120
+								'action',
121
+								'default_nonce',
122
+							)
123
+						)
124
+					)
125
+				),
126
+				'return_url'  => urlencode("//{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}"),
127
+			),
128
+		);
129
+		$this->_sortable_columns = array(
130
+			/**
131
+			 * Allows users to change the default sort if they wish.
132
+			 * Returning a falsey on this filter will result in the default sort to be by firstname rather than last name.
133
+			 *
134
+			 * Note: usual naming conventions for filters aren't followed here so that just one filter can be used to
135
+			 * change the sorts on any list table involving registration contacts.  If you want to only change the filter
136
+			 * for a specific list table you can use the provided reference to this object instance.
137
+			 */
138
+			'ATT_name' => array(
139
+				'FHEE__EE_Registrations_List_Table___set_properties__default_sort_by_registration_last_name',
140
+				true,
141
+				$this,
142
+			)
143
+				? array('ATT_lname' => true)
144
+				: array('ATT_fname' => true),
145
+			'Event'    => array('Event.EVT_name' => false),
146
+		);
147
+		$this->_hidden_columns = array();
148
+		$this->_evt = EEM_Event::instance()->get_one_by_ID($evt_id);
149
+		$this->_dtts_for_event = $this->_evt instanceof EE_Event ? $this->_evt->datetimes_ordered() : array();
150
+	}
151
+
152
+
153
+	/**
154
+	 * @param \EE_Registration $item
155
+	 * @return string
156
+	 */
157
+	protected function _get_row_class($item)
158
+	{
159
+		$class = parent::_get_row_class($item);
160
+		// add status class
161
+		$class .= ' ee-status-strip reg-status-' . $item->status_ID();
162
+		if ($this->_has_checkbox_column) {
163
+			$class .= ' has-checkbox-column';
164
+		}
165
+		return $class;
166
+	}
167
+
168
+
169
+	/**
170
+	 * @return array
171
+	 * @throws \EE_Error
172
+	 */
173
+	protected function _get_table_filters()
174
+	{
175
+		$filters = $where = array();
176
+		$current_EVT_ID = isset($this->_req_data['event_id']) ? (int) $this->_req_data['event_id'] : 0;
177
+		if (empty($this->_dtts_for_event) || count($this->_dtts_for_event) === 1) {
178
+			// this means we don't have an event so let's setup a filter dropdown for all the events to select
179
+			// note possible capability restrictions
180
+			if (! EE_Registry::instance()->CAP->current_user_can('ee_read_private_events', 'get_events')) {
181
+				$where['status**'] = array('!=', 'private');
182
+			}
183
+			if (! EE_Registry::instance()->CAP->current_user_can('ee_read_others_events', 'get_events')) {
184
+				$where['EVT_wp_user'] = get_current_user_id();
185
+			}
186
+			$events = EEM_Event::instance()->get_all(
187
+				array(
188
+					$where,
189
+					'order_by' => array('Datetime.DTT_EVT_start' => 'DESC'),
190
+				)
191
+			);
192
+			$evts[] = array(
193
+				'id'   => 0,
194
+				'text' => __('To toggle Check-in status, select an event', 'event_espresso'),
195
+			);
196
+			$checked = 'checked';
197
+			/** @var EE_Event $evt */
198
+			foreach ($events as $evt) {
199
+				// any registrations for this event?
200
+				if (! $evt->get_count_of_all_registrations()) {
201
+					continue;
202
+				}
203
+				$evts[] = array(
204
+					'id'    => $evt->ID(),
205
+					'text'  => apply_filters(
206
+						'FHEE__EE_Event_Registrations___get_table_filters__event_name',
207
+						$evt->get('EVT_name'),
208
+						$evt
209
+					),
210
+					'class' => $evt->is_expired() ? 'ee-expired-event' : '',
211
+				);
212
+				if ($evt->ID() === $current_EVT_ID && $evt->is_expired()) {
213
+					$checked = '';
214
+				}
215
+			}
216
+			$event_filter = '<div class="ee-event-filter">';
217
+			$event_filter .= EEH_Form_Fields::select_input('event_id', $evts, $current_EVT_ID);
218
+			$event_filter .= '<span class="ee-event-filter-toggle">';
219
+			$event_filter .= '<input type="checkbox" id="js-ee-hide-expired-events" ' . $checked . '> ';
220
+			$event_filter .= __('Hide Expired Events', 'event_espresso');
221
+			$event_filter .= '</span>';
222
+			$event_filter .= '</div>';
223
+			$filters[] = $event_filter;
224
+		}
225
+		if (! empty($this->_dtts_for_event)) {
226
+			// DTT datetimes filter
227
+			$this->_cur_dtt_id = isset($this->_req_data['DTT_ID']) ? $this->_req_data['DTT_ID'] : 0;
228
+			if (count($this->_dtts_for_event) > 1) {
229
+				$dtts[0] = __('To toggle check-in status, select a datetime.', 'event_espresso');
230
+				foreach ($this->_dtts_for_event as $dtt) {
231
+					$datetime_string = $dtt->name();
232
+					$datetime_string = ! empty($datetime_string) ? ' (' . $datetime_string . ')' : '';
233
+					$datetime_string = $dtt->start_date_and_time() . ' - ' . $dtt->end_date_and_time() . $datetime_string;
234
+					$dtts[ $dtt->ID() ] = $datetime_string;
235
+				}
236
+				$input = new EE_Select_Input(
237
+					$dtts,
238
+					array(
239
+						'html_name' => 'DTT_ID',
240
+						'html_id'   => 'DTT_ID',
241
+						'default'   => $this->_cur_dtt_id,
242
+					)
243
+				);
244
+				$filters[] = $input->get_html_for_input();
245
+				$filters[] = '<input type="hidden" name="event_id" value="' . $current_EVT_ID . '">';
246
+			}
247
+		}
248
+		return $filters;
249
+	}
250
+
251
+
252
+	protected function _add_view_counts()
253
+	{
254
+		$this->_views['all']['count'] = $this->_get_total_event_attendees();
255
+	}
256
+
257
+
258
+	/**
259
+	 * @return int
260
+	 * @throws \EE_Error
261
+	 */
262
+	protected function _get_total_event_attendees()
263
+	{
264
+		$EVT_ID = isset($this->_req_data['event_id']) ? absint($this->_req_data['event_id']) : false;
265
+		$DTT_ID = $this->_cur_dtt_id;
266
+		$query_params = array();
267
+		if ($EVT_ID) {
268
+			$query_params[0]['EVT_ID'] = $EVT_ID;
269
+		}
270
+		// if DTT is included we only show for that datetime.  Otherwise we're showing for all datetimes (the event).
271
+		if ($DTT_ID) {
272
+			$query_params[0]['Ticket.Datetime.DTT_ID'] = $DTT_ID;
273
+		}
274
+		$status_ids_array = apply_filters(
275
+			'FHEE__Extend_Registrations_Admin_Page__get_event_attendees__status_ids_array',
276
+			array(EEM_Registration::status_id_pending_payment, EEM_Registration::status_id_approved)
277
+		);
278
+		$query_params[0]['STS_ID'] = array('IN', $status_ids_array);
279
+		return EEM_Registration::instance()->count($query_params);
280
+	}
281
+
282
+
283
+	/**
284
+	 * @param \EE_Registration $item
285
+	 * @return string
286
+	 */
287
+	public function column__Reg_Status(EE_Registration $item)
288
+	{
289
+		return '<span class="ee-status-strip ee-status-strip-td reg-status-' . $item->status_ID() . '"></span>';
290
+	}
291
+
292
+
293
+	/**
294
+	 * @param \EE_Registration $item
295
+	 * @return string
296
+	 * @throws \EE_Error
297
+	 */
298
+	public function column_cb($item)
299
+	{
300
+		return sprintf('<input type="checkbox" name="checkbox[%1$s]" value="%1$s" />', $item->ID());
301
+	}
302
+
303
+
304
+	/**
305
+	 * column_REG_att_checked_in
306
+	 *
307
+	 * @param EE_Registration $item
308
+	 * @return string
309
+	 * @throws EE_Error
310
+	 * @throws InvalidArgumentException
311
+	 * @throws InvalidDataTypeException
312
+	 * @throws InvalidInterfaceException
313
+	 */
314
+	public function column__REG_att_checked_in(EE_Registration $item)
315
+	{
316
+		$attendee = $item->attendee();
317
+		$attendee_name = $attendee instanceof EE_Attendee ? $attendee->full_name() : '';
318
+
319
+		if ($this->_cur_dtt_id === 0 && count($this->_dtts_for_event) === 1) {
320
+			$latest_related_datetime = $item->get_latest_related_datetime();
321
+			if ($latest_related_datetime instanceof EE_Datetime) {
322
+				$this->_cur_dtt_id = $latest_related_datetime->ID();
323
+			}
324
+		}
325
+		$checkin_status_dashicon = CheckinStatusDashicon::fromRegistrationAndDatetimeId(
326
+			$item,
327
+			$this->_cur_dtt_id
328
+		);
329
+		$nonce = wp_create_nonce('checkin_nonce');
330
+		$toggle_active = ! empty($this->_cur_dtt_id)
331
+						 && EE_Registry::instance()->CAP->current_user_can(
332
+							 'ee_edit_checkin',
333
+							 'espresso_registrations_toggle_checkin_status',
334
+							 $item->ID()
335
+						 )
336
+			? ' clickable trigger-checkin'
337
+			: '';
338
+		$mobile_view_content = ' <span class="show-on-mobile-view-only">' . $attendee_name . '</span>';
339
+		return '<span class="' . $checkin_status_dashicon->cssClasses() . $toggle_active . '"'
340
+			   . ' data-_regid="' . $item->ID() . '"'
341
+			   . ' data-dttid="' . $this->_cur_dtt_id . '"'
342
+			   . ' data-nonce="' . $nonce . '">'
343
+			   . '</span>'
344
+			   . $mobile_view_content;
345
+	}
346
+
347
+
348
+	/**
349
+	 * @param \EE_Registration $item
350
+	 * @return mixed|string|void
351
+	 * @throws \EE_Error
352
+	 */
353
+	public function column_ATT_name(EE_Registration $item)
354
+	{
355
+		$attendee = $item->attendee();
356
+		if (! $attendee instanceof EE_Attendee) {
357
+			return __('No contact record for this registration.', 'event_espresso');
358
+		}
359
+		// edit attendee link
360
+		$edit_lnk_url = EE_Admin_Page::add_query_args_and_nonce(
361
+			array('action' => 'view_registration', '_REG_ID' => $item->ID()),
362
+			REG_ADMIN_URL
363
+		);
364
+		$name_link = EE_Registry::instance()->CAP->current_user_can(
365
+			'ee_edit_contacts',
366
+			'espresso_registrations_edit_attendee'
367
+		)
368
+			? '<a href="' . $edit_lnk_url . '" title="' . esc_attr__('View Registration Details', 'event_espresso') . '">'
369
+			  . $item->attendee()->full_name()
370
+			  . '</a>'
371
+			: $item->attendee()->full_name();
372
+		$name_link .= $item->count() === 1
373
+			? '&nbsp;<sup><div class="dashicons dashicons-star-filled lt-blue-icon ee-icon-size-8"></div></sup>	'
374
+			: '';
375
+		// add group details
376
+		$name_link .= '&nbsp;' . sprintf(__('(%s of %s)', 'event_espresso'), $item->count(), $item->group_size());
377
+		// add regcode
378
+		$link = EE_Admin_Page::add_query_args_and_nonce(
379
+			array('action' => 'view_registration', '_REG_ID' => $item->ID()),
380
+			REG_ADMIN_URL
381
+		);
382
+		$name_link .= '<br>';
383
+		$name_link .= EE_Registry::instance()->instance()->CAP->current_user_can(
384
+			'ee_read_registration',
385
+			'view_registration',
386
+			$item->ID()
387
+		)
388
+			? '<a href="' . $link . '" title="' . esc_attr__('View Registration Details', 'event_espresso') . '">'
389
+			  . $item->reg_code()
390
+			  . '</a>'
391
+			: $item->reg_code();
392
+		// status
393
+		$name_link .= '<br><span class="ee-status-text-small">';
394
+		$name_link .= EEH_Template::pretty_status($item->status_ID(), false, 'sentence');
395
+		$name_link .= '</span>';
396
+		$actions = array();
397
+		$DTT_ID = $this->_cur_dtt_id;
398
+		$latest_related_datetime = empty($DTT_ID) && ! empty($this->_req_data['event_id']) && $item instanceof EE_Registration
399
+			? $item->get_latest_related_datetime()
400
+			: null;
401
+		$DTT_ID = $latest_related_datetime instanceof EE_Datetime
402
+			? $latest_related_datetime->ID()
403
+			: $DTT_ID;
404
+		if (! empty($DTT_ID)
405
+			&& EE_Registry::instance()->CAP->current_user_can(
406
+				'ee_read_checkins',
407
+				'espresso_registrations_registration_checkins'
408
+			)
409
+		) {
410
+			$checkin_list_url = EE_Admin_Page::add_query_args_and_nonce(
411
+				array('action' => 'registration_checkins', '_REG_ID' => $item->ID(), 'DTT_ID' => $DTT_ID),
412
+				REG_ADMIN_URL
413
+			);
414
+			// get the timestamps for this registration's checkins, related to the selected datetime
415
+			$timestamps = $item->get_many_related('Checkin', array(array('DTT_ID' => $DTT_ID)));
416
+			if (! empty($timestamps)) {
417
+				// get the last timestamp
418
+				$last_timestamp = end($timestamps);
419
+				// checked in or checked out?
420
+				$checkin_status = $last_timestamp->get('CHK_in')
421
+					? esc_html__('Checked In', 'event_espresso')
422
+					: esc_html__('Checked Out', 'event_espresso');
423
+				// get timestamp string
424
+				$timestamp_string = $last_timestamp->get_datetime('CHK_timestamp');
425
+				$actions['checkin'] = '<a href="' . $checkin_list_url . '" title="'
426
+									  . esc_attr__(
427
+										  'View this registrant\'s check-ins/checkouts for the datetime',
428
+										  'event_espresso'
429
+									  ) . '">' . $checkin_status . ': ' . $timestamp_string . '</a>';
430
+			}
431
+		}
432
+		return (! empty($DTT_ID) && ! empty($timestamps))
433
+			? sprintf('%1$s %2$s', $name_link, $this->row_actions($actions, true))
434
+			: $name_link;
435
+	}
436
+
437
+
438
+	/**
439
+	 * @param \EE_Registration $item
440
+	 * @return string
441
+	 */
442
+	public function column_ATT_email(EE_Registration $item)
443
+	{
444
+		$attendee = $item->attendee();
445
+		return $attendee instanceof EE_Attendee ? $attendee->email() : '';
446
+	}
447
+
448
+
449
+	/**
450
+	 * @param \EE_Registration $item
451
+	 * @return bool|string
452
+	 * @throws \EE_Error
453
+	 */
454
+	public function column_Event(EE_Registration $item)
455
+	{
456
+		try {
457
+			$event = $this->_evt instanceof EE_Event ? $this->_evt : $item->event();
458
+			$chkin_lnk_url = EE_Admin_Page::add_query_args_and_nonce(
459
+				array('action' => 'event_registrations', 'event_id' => $event->ID()),
460
+				REG_ADMIN_URL
461
+			);
462
+			$event_label = EE_Registry::instance()->CAP->current_user_can(
463
+				'ee_read_checkins',
464
+				'espresso_registrations_registration_checkins'
465
+			) ? '<a href="' . $chkin_lnk_url . '" title="'
466
+				. esc_attr__(
467
+					'View Checkins for this Event',
468
+					'event_espresso'
469
+				) . '">' . $event->name() . '</a>' : $event->name();
470
+		} catch (\EventEspresso\core\exceptions\EntityNotFoundException $e) {
471
+			$event_label = esc_html__('Unknown', 'event_espresso');
472
+		}
473
+		return $event_label;
474
+	}
475
+
476
+
477
+	/**
478
+	 * @param \EE_Registration $item
479
+	 * @return mixed|string|void
480
+	 */
481
+	public function column_PRC_name(EE_Registration $item)
482
+	{
483
+		return $item->ticket() instanceof EE_Ticket ? $item->ticket()->name() : __("Unknown", "event_espresso");
484
+	}
485
+
486
+
487
+	/**
488
+	 * column_REG_final_price
489
+	 *
490
+	 * @param \EE_Registration $item
491
+	 * @return string
492
+	 */
493
+	public function column__REG_final_price(EE_Registration $item)
494
+	{
495
+		return '<span class="reg-pad-rght">' . ' ' . $item->pretty_final_price() . '</span>';
496
+	}
497
+
498
+
499
+	/**
500
+	 * column_TXN_paid
501
+	 *
502
+	 * @param \EE_Registration $item
503
+	 * @return string
504
+	 * @throws \EE_Error
505
+	 */
506
+	public function column_TXN_paid(EE_Registration $item)
507
+	{
508
+		if ($item->count() === 1) {
509
+			if ($item->transaction()->paid() >= $item->transaction()->total()) {
510
+				return '<span class="reg-pad-rght"><div class="dashicons dashicons-yes green-icon"></div></span>';
511
+			} else {
512
+				$view_txn_lnk_url = EE_Admin_Page::add_query_args_and_nonce(
513
+					array('action' => 'view_transaction', 'TXN_ID' => $item->transaction_ID()),
514
+					TXN_ADMIN_URL
515
+				);
516
+				return EE_Registry::instance()->CAP->current_user_can(
517
+					'ee_read_transaction',
518
+					'espresso_transactions_view_transaction'
519
+				) ? '
520 520
 				<span class="reg-pad-rght">
521 521
 					<a class="status-'
522
-                    . $item->transaction()->status_ID()
523
-                    . '" href="'
524
-                    . $view_txn_lnk_url
525
-                    . '"  title="'
526
-                    . esc_attr__('View Transaction', 'event_espresso')
527
-                    . '">
522
+					. $item->transaction()->status_ID()
523
+					. '" href="'
524
+					. $view_txn_lnk_url
525
+					. '"  title="'
526
+					. esc_attr__('View Transaction', 'event_espresso')
527
+					. '">
528 528
 						'
529
-                    . $item->transaction()->pretty_paid()
530
-                    . '
529
+					. $item->transaction()->pretty_paid()
530
+					. '
531 531
 					</a>
532 532
 				<span>' : '<span class="reg-pad-rght">' . $item->transaction()->pretty_paid() . '</span>';
533
-            }
534
-        } else {
535
-            return '<span class="reg-pad-rght"></span>';
536
-        }
537
-    }
538
-
539
-
540
-    /**
541
-     *        column_TXN_total
542
-     *
543
-     * @param \EE_Registration $item
544
-     * @return string
545
-     * @throws \EE_Error
546
-     */
547
-    public function column_TXN_total(EE_Registration $item)
548
-    {
549
-        $txn = $item->transaction();
550
-        $view_txn_url = add_query_arg(array('action' => 'view_transaction', 'TXN_ID' => $txn->ID()), TXN_ADMIN_URL);
551
-        if ($item->get('REG_count') === 1) {
552
-            $line_total_obj = $txn->total_line_item();
553
-            $txn_total = $line_total_obj instanceof EE_Line_Item
554
-                ? $line_total_obj->get_pretty('LIN_total')
555
-                : __(
556
-                    'View Transaction',
557
-                    'event_espresso'
558
-                );
559
-            return EE_Registry::instance()->CAP->current_user_can(
560
-                'ee_read_transaction',
561
-                'espresso_transactions_view_transaction'
562
-            ) ? '<a href="'
563
-                . $view_txn_url
564
-                . '" title="'
565
-                . esc_attr__('View Transaction', 'event_espresso')
566
-                . '"><span class="reg-pad-rght">'
567
-                . $txn_total
568
-                . '</span></a>' : '<span class="reg-pad-rght">' . $txn_total . '</span>';
569
-        } else {
570
-            return '<span class="reg-pad-rght"></span>';
571
-        }
572
-    }
533
+			}
534
+		} else {
535
+			return '<span class="reg-pad-rght"></span>';
536
+		}
537
+	}
538
+
539
+
540
+	/**
541
+	 *        column_TXN_total
542
+	 *
543
+	 * @param \EE_Registration $item
544
+	 * @return string
545
+	 * @throws \EE_Error
546
+	 */
547
+	public function column_TXN_total(EE_Registration $item)
548
+	{
549
+		$txn = $item->transaction();
550
+		$view_txn_url = add_query_arg(array('action' => 'view_transaction', 'TXN_ID' => $txn->ID()), TXN_ADMIN_URL);
551
+		if ($item->get('REG_count') === 1) {
552
+			$line_total_obj = $txn->total_line_item();
553
+			$txn_total = $line_total_obj instanceof EE_Line_Item
554
+				? $line_total_obj->get_pretty('LIN_total')
555
+				: __(
556
+					'View Transaction',
557
+					'event_espresso'
558
+				);
559
+			return EE_Registry::instance()->CAP->current_user_can(
560
+				'ee_read_transaction',
561
+				'espresso_transactions_view_transaction'
562
+			) ? '<a href="'
563
+				. $view_txn_url
564
+				. '" title="'
565
+				. esc_attr__('View Transaction', 'event_espresso')
566
+				. '"><span class="reg-pad-rght">'
567
+				. $txn_total
568
+				. '</span></a>' : '<span class="reg-pad-rght">' . $txn_total . '</span>';
569
+		} else {
570
+			return '<span class="reg-pad-rght"></span>';
571
+		}
572
+	}
573 573
 }
Please login to merge, or discard this patch.