Completed
Branch FET/9575/invisible-recaptcha (e4358d)
by
unknown
49:51 queued 37:56
created

Registrations_Admin_Page   F

Complexity

Total Complexity 367

Size/Duplication

Total Lines 3766
Duplicated Lines 4.46 %

Coupling/Cohesion

Components 1
Dependencies 59

Importance

Changes 0
Metric Value
dl 168
loc 3766
rs 0.5217
c 0
b 0
f 0
wmc 367
lcom 1
cbo 59

96 Methods

Rating   Name   Duplication   Size   Complexity  
A _define_page_props() 0 23 1
A __construct() 0 5 1
B wp_loaded() 0 16 5
B _init_page_props() 0 28 1
A clear_comment_link() 0 9 2
A _ajax_hooks() 0 5 1
F _set_page_routes() 0 293 9
B _set_page_config() 0 139 3
A _add_screen_options() 0 3 1
A _add_feature_pointers() 0 3 1
A admin_init() 0 7 1
A admin_notices() 0 3 1
A admin_footer_scripts() 0 3 1
A _get_registration_status_array() 0 4 1
A _add_screen_options_default() 0 4 1
A load_scripts_styles_edit_attendee() 0 12 1
A load_scripts_styles_view_registration() 0 8 1
A load_scripts_styles_contact_list() 0 11 1
A load_scripts_styles_new_registration() 0 15 1
A AHEE__EE_Admin_Page__route_admin_request_resend_registration() 0 4 1
A AHEE__EE_Admin_Page__route_admin_request_approve_registration() 0 4 1
C _set_list_table_views_default() 0 120 12
B _set_list_table_views_contact_list() 0 25 2
B _registration_legend_items() 9 107 5
A load_scripts_styles() 10 20 1
A _add_screen_options_contact_list() 7 7 1
D _registrations_overview_list_table() 46 82 11
B _set_registration_object() 0 23 4
B get_registrations() 0 25 4
A _get_registration_query_parameters() 0 23 2
A addAttendeeIdToWhereConditions() 0 8 2
A _add_event_id_to_where_conditions() 0 8 2
A _add_category_id_to_where_conditions() 0 8 3
A _add_datetime_id_to_where_conditions() 0 11 3
B _add_registration_status_to_where_conditions() 0 27 5
C _add_date_to_where_conditions() 0 75 9
B _add_search_to_where_conditions() 0 28 2
A _get_where_conditions_for_registrations_query() 0 16 1
D _get_orderby_for_registrations_query() 0 43 10
A _get_limit() 0 17 4
A get_registration_status_array() 0 4 1
B _registration_details() 0 91 5
B _registration_details_metaboxes() 0 44 5
A set_reg_status_buttons_metabox() 0 15 1
A _generate_reg_status_change_form() 0 60 1
A _get_reg_statuses() 0 15 3
C _set_registration_status_from_request() 0 48 8
C _set_registration_status() 0 37 7
C _reg_status_change_return() 0 41 11
C _change_reg_status() 0 41 15
A bulk_action_on_registrations() 0 12 2
A approve_registration() 0 4 1
A decline_registration() 0 4 1
A cancel_registration() 0 4 1
A not_approve_registration() 0 4 1
A pending_registration() 0 4 1
A wait_list_registration() 0 4 1
F _reg_details_meta_box() 0 130 11
A _reg_questions_meta_box() 0 18 3
A form_before_question_group() 0 15 1
B form_after_question_group() 0 28 1
A form_form_field_label_wrap() 16 16 1
A form_form_field_input__wrap() 16 16 1
B _update_attendee_registration_form() 0 14 5
A _get_reg_custom_questions_form() 0 11 2
B _save_reg_custom_questions_form() 0 38 6
B _reg_attendees_meta_box() 0 57 6
C _reg_registrant_side_meta_box() 0 43 7
C _trash_or_restore_registrations() 13 63 11
D _delete_registrations() 0 40 9
B _delete_registration() 0 58 7
C new_registration() 0 50 7
B _get_registration_step_content() 0 91 6
A _set_reg_event() 0 12 4
D process_reg_step() 32 102 14
A redirect_to_txn() 0 22 3
A _attendee_contact_list_table() 0 6 1
F get_attendees() 0 86 23
A _resend_registration() 0 8 2
B _registrations_report_base() 0 38 5
A _registrations_report() 0 4 1
A _contact_list_export() 0 8 2
A _contact_list_report() 0 17 3
B _duplicate_attendee() 0 35 3
F _insert_update_cpt_item() 0 57 14
A trash_cpt_item() 0 3 1
A delete_cpt_item() 0 3 1
A restore_cpt_item() 0 3 1
A _restore_cpt_item() 0 3 1
A attendee_editor_metaboxes() 19 56 3
A attendee_contact_info() 0 7 1
A getAttendeeContactDetailsMetaboxFormHandler() 0 4 1
A attendee_address_details() 0 54 1
A attendee_registrations_meta_box() 0 8 1
A after_title_form_fields() 0 8 2
C _trash_or_restore_attendees() 0 36 11

How to fix   Duplicated Code    Complexity   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

Complex Class

 Tip:   Before tackling complexity, make sure that you eliminate any duplication first. This often can reduce the size of classes significantly.

Complex classes like Registrations_Admin_Page often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use Registrations_Admin_Page, and based on these observations, apply Extract Interface, too.

1
<?php
2
3
use EventEspresso\core\domain\Domain;
4
use EventEspresso\core\domain\entities\contexts\Context;
5
use EventEspresso\core\exceptions\EntityNotFoundException;
6
use EventEspresso\core\exceptions\InvalidDataTypeException;
7
use EventEspresso\core\exceptions\InvalidFormSubmissionException;
8
use EventEspresso\core\exceptions\InvalidInterfaceException;
9
use EventEspresso\core\domain\services\attendee\forms\AttendeeContactDetailsMetaboxFormHandler;
10
defined('EVENT_ESPRESSO_VERSION') || exit('No direct script access allowed');
11
12
13
/**
14
 * Event Espresso
15
 * Event Registration and Management Plugin for WordPress
16
 * @ package            Event Espresso
17
 * @ author                Seth Shoultes
18
 * @ copyright        (c) 2008-2011 Event Espresso  All Rights Reserved.
19
 * @ license            {@link http://eventespresso.com/support/terms-conditions/}   * see Plugin Licensing *
20
 * @ link                    {@link http://www.eventespresso.com}
21
 * @ since                4.0
22
 * ------------------------------------------------------------------------
23
 * Registrations_Admin_Page class
24
 *
25
 * @package               Event Espresso
26
 * @subpackage            includes/core/admin/transactions/Registrations_Admin_Page.core.php
27
 * @author                Brent Christensen
28
 *                        ------------------------------------------------------------------------
29
 */
30
class Registrations_Admin_Page extends EE_Admin_Page_CPT
31
{
32
33
    /**
34
     * @var EE_Registration
35
     */
36
    private $_registration;
37
38
    /**
39
     * @var EE_Event
40
     */
41
    private $_reg_event;
42
43
    /**
44
     * @var EE_Session
45
     */
46
    private $_session;
47
48
    private static $_reg_status;
49
50
    /**
51
     * Form for displaying the custom questions for this registration.
52
     * This gets used a few times throughout the request so its best to cache it
53
     *
54
     * @var EE_Registration_Custom_Questions_Form
55
     */
56
    protected $_reg_custom_questions_form = null;
57
58
59
    /**
60
     *        constructor
61
     *
62
     * @Constructor
63
     * @access public
64
     * @param bool $routing
65
     * @return Registrations_Admin_Page
0 ignored issues
show
Comprehensibility Best Practice introduced by
Adding a @return annotation to constructors is generally not recommended as a constructor does not have a meaningful return value.

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

Please refer to the PHP core documentation on constructors.

Loading history...
66
     */
67
    public function __construct($routing = true)
68
    {
69
        parent::__construct($routing);
70
        add_action('wp_loaded', array($this, 'wp_loaded'));
71
    }
72
73
74
    public function wp_loaded()
75
    {
76
        // when adding a new registration...
77
        if (isset($this->_req_data['action']) && $this->_req_data['action'] === 'new_registration') {
78
            EE_System::do_not_cache();
79
            if (! isset($this->_req_data['processing_registration'])
80
                 || absint($this->_req_data['processing_registration']) !== 1
81
            ) {
82
                // and it's NOT the attendee information reg step
83
                // force cookie expiration by setting time to last week
84
                setcookie('ee_registration_added', 0, time() - WEEK_IN_SECONDS, '/');
85
                // and update the global
86
                $_COOKIE['ee_registration_added'] = 0;
87
            }
88
        }
89
    }
90
91
92
    protected function _init_page_props()
93
    {
94
        $this->page_slug        = REG_PG_SLUG;
95
        $this->_admin_base_url  = REG_ADMIN_URL;
96
        $this->_admin_base_path = REG_ADMIN;
97
        $this->page_label       = esc_html__('Registrations', 'event_espresso');
98
        $this->_cpt_routes      = array(
99
            'add_new_attendee' => 'espresso_attendees',
100
            'edit_attendee'    => 'espresso_attendees',
101
            'insert_attendee'  => 'espresso_attendees',
102
            'update_attendee'  => 'espresso_attendees',
103
        );
104
        $this->_cpt_model_names = array(
105
            'add_new_attendee' => 'EEM_Attendee',
106
            'edit_attendee'    => 'EEM_Attendee',
107
        );
108
        $this->_cpt_edit_routes = array(
109
            'espresso_attendees' => 'edit_attendee',
110
        );
111
        $this->_pagenow_map     = array(
112
            'add_new_attendee' => 'post-new.php',
113
            'edit_attendee'    => 'post.php',
114
            'trash'            => 'post.php',
115
        );
116
        add_action('edit_form_after_title', array($this, 'after_title_form_fields'), 10);
117
        //add filters so that the comment urls don't take users to a confusing 404 page
118
        add_filter('get_comment_link', array($this, 'clear_comment_link'), 10, 3);
119
    }
120
121
122
    public function clear_comment_link($link, $comment, $args)
123
    {
124
        //gotta make sure this only happens on this route
125
        $post_type = get_post_type($comment->comment_post_ID);
126
        if ($post_type === 'espresso_attendees') {
127
            return '#commentsdiv';
128
        }
129
        return $link;
130
    }
131
132
133
    protected function _ajax_hooks()
134
    {
135
        //todo: all hooks for registrations ajax goes in here
136
        add_action('wp_ajax_toggle_checkin_status', array($this, 'toggle_checkin_status'));
137
    }
138
139
140
    protected function _define_page_props()
141
    {
142
        $this->_admin_page_title = $this->page_label;
143
        $this->_labels           = array(
144
            'buttons'                      => array(
145
                'add-registrant'      => esc_html__('Add New Registration', 'event_espresso'),
146
                'add-attendee'        => esc_html__('Add Contact', 'event_espresso'),
147
                'edit'                => esc_html__('Edit Contact', 'event_espresso'),
148
                'report'              => esc_html__("Event Registrations CSV Report", "event_espresso"),
149
                'report_all'          => esc_html__('All Registrations CSV Report', 'event_espresso'),
150
                'report_filtered'     => esc_html__('Filtered CSV Report', 'event_espresso'),
151
                'contact_list_report' => esc_html__('Contact List Report', 'event_espresso'),
152
                'contact_list_export' => esc_html__("Export Data", "event_espresso"),
153
            ),
154
            'publishbox'                   => array(
155
                'add_new_attendee' => esc_html__("Add Contact Record", 'event_espresso'),
156
                'edit_attendee'    => esc_html__("Update Contact Record", 'event_espresso'),
157
            ),
158
            'hide_add_button_on_cpt_route' => array(
159
                'edit_attendee' => true,
160
            ),
161
        );
162
    }
163
164
165
    /**
166
     *        grab url requests and route them
167
     *
168
     * @access private
169
     * @return void
170
     */
171
    public function _set_page_routes()
172
    {
173
        $this->_get_registration_status_array();
174
        $reg_id             = ! empty($this->_req_data['_REG_ID']) && ! is_array($this->_req_data['_REG_ID'])
175
            ? $this->_req_data['_REG_ID'] : 0;
176
        $reg_id = empty($reg_id) && ! empty($this->_req_data['reg_status_change_form']['REG_ID'])
177
            ? $this->_req_data['reg_status_change_form']['REG_ID']
178
            : $reg_id;
179
        $att_id             = ! empty($this->_req_data['ATT_ID']) && ! is_array($this->_req_data['ATT_ID'])
180
            ? $this->_req_data['ATT_ID'] : 0;
181
        $att_id             = ! empty($this->_req_data['post']) && ! is_array($this->_req_data['post'])
182
            ? $this->_req_data['post']
183
            : $att_id;
184
        $this->_page_routes = array(
185
            'default'                            => array(
186
                'func'       => '_registrations_overview_list_table',
187
                'capability' => 'ee_read_registrations',
188
            ),
189
            'view_registration'                  => array(
190
                'func'       => '_registration_details',
191
                'capability' => 'ee_read_registration',
192
                'obj_id'     => $reg_id,
193
            ),
194
            'edit_registration'                  => array(
195
                'func'               => '_update_attendee_registration_form',
196
                'noheader'           => true,
197
                'headers_sent_route' => 'view_registration',
198
                'capability'         => 'ee_edit_registration',
199
                'obj_id'             => $reg_id,
200
                '_REG_ID'            => $reg_id,
201
            ),
202
            'trash_registrations'                => array(
203
                'func'       => '_trash_or_restore_registrations',
204
                'args'       => array('trash' => true),
205
                'noheader'   => true,
206
                'capability' => 'ee_delete_registrations',
207
            ),
208
            'restore_registrations'              => array(
209
                'func'       => '_trash_or_restore_registrations',
210
                'args'       => array('trash' => false),
211
                'noheader'   => true,
212
                'capability' => 'ee_delete_registrations',
213
            ),
214
            'delete_registrations'               => array(
215
                'func'       => '_delete_registrations',
216
                'noheader'   => true,
217
                'capability' => 'ee_delete_registrations',
218
            ),
219
            'new_registration'                   => array(
220
                'func'       => 'new_registration',
221
                'capability' => 'ee_edit_registrations',
222
            ),
223
            'process_reg_step'                   => array(
224
                'func'       => 'process_reg_step',
225
                'noheader'   => true,
226
                'capability' => 'ee_edit_registrations',
227
            ),
228
            'redirect_to_txn'                    => array(
229
                'func'       => 'redirect_to_txn',
230
                'noheader'   => true,
231
                'capability' => 'ee_edit_registrations',
232
            ),
233
            'change_reg_status'                  => array(
234
                'func'       => '_change_reg_status',
235
                'noheader'   => true,
236
                'capability' => 'ee_edit_registration',
237
                'obj_id'     => $reg_id,
238
            ),
239
            'approve_registration'               => array(
240
                'func'       => 'approve_registration',
241
                'noheader'   => true,
242
                'capability' => 'ee_edit_registration',
243
                'obj_id'     => $reg_id,
244
            ),
245
            'approve_and_notify_registration'    => array(
246
                'func'       => 'approve_registration',
247
                'noheader'   => true,
248
                'args'       => array(true),
249
                'capability' => 'ee_edit_registration',
250
                'obj_id'     => $reg_id,
251
            ),
252
            'approve_registrations'               => array(
253
                'func'       => 'bulk_action_on_registrations',
254
                'noheader'   => true,
255
                'capability' => 'ee_edit_registrations',
256
                'args' => array('approve')
257
            ),
258
            'approve_and_notify_registrations'               => array(
259
                'func'       => 'bulk_action_on_registrations',
260
                'noheader'   => true,
261
                'capability' => 'ee_edit_registrations',
262
                'args' => array('approve', true)
263
            ),
264
            'decline_registration'               => array(
265
                'func'       => 'decline_registration',
266
                'noheader'   => true,
267
                'capability' => 'ee_edit_registration',
268
                'obj_id'     => $reg_id,
269
            ),
270
            'decline_and_notify_registration'    => array(
271
                'func'       => 'decline_registration',
272
                'noheader'   => true,
273
                'args'       => array(true),
274
                'capability' => 'ee_edit_registration',
275
                'obj_id'     => $reg_id,
276
            ),
277
            'decline_registrations'               => array(
278
                'func'       => 'bulk_action_on_registrations',
279
                'noheader'   => true,
280
                'capability' => 'ee_edit_registrations',
281
                'args' => array('decline')
282
            ),
283
            'decline_and_notify_registrations'    => array(
284
                'func'       => 'bulk_action_on_registrations',
285
                'noheader'   => true,
286
                'capability' => 'ee_edit_registrations',
287
                'args' => array('decline', true)
288
            ),
289
            'pending_registration'               => array(
290
                'func'       => 'pending_registration',
291
                'noheader'   => true,
292
                'capability' => 'ee_edit_registration',
293
                'obj_id'     => $reg_id,
294
            ),
295
            'pending_and_notify_registration'    => array(
296
                'func'       => 'pending_registration',
297
                'noheader'   => true,
298
                'args'       => array(true),
299
                'capability' => 'ee_edit_registration',
300
                'obj_id'     => $reg_id,
301
            ),
302
            'pending_registrations'               => array(
303
                'func'       => 'bulk_action_on_registrations',
304
                'noheader'   => true,
305
                'capability' => 'ee_edit_registrations',
306
                'args' => array('pending')
307
            ),
308
            'pending_and_notify_registrations'    => array(
309
                'func'       => 'bulk_action_on_registrations',
310
                'noheader'   => true,
311
                'capability' => 'ee_edit_registrations',
312
                'args' => array('pending', true)
313
            ),
314
            'no_approve_registration'            => array(
315
                'func'       => 'not_approve_registration',
316
                'noheader'   => true,
317
                'capability' => 'ee_edit_registration',
318
                'obj_id'     => $reg_id,
319
            ),
320
            'no_approve_and_notify_registration' => array(
321
                'func'       => 'not_approve_registration',
322
                'noheader'   => true,
323
                'args'       => array(true),
324
                'capability' => 'ee_edit_registration',
325
                'obj_id'     => $reg_id,
326
            ),
327
            'no_approve_registrations'            => array(
328
                'func'       => 'bulk_action_on_registrations',
329
                'noheader'   => true,
330
                'capability' => 'ee_edit_registrations',
331
                'args' => array('not_approve')
332
            ),
333
            'no_approve_and_notify_registrations' => array(
334
                'func'       => 'bulk_action_on_registrations',
335
                'noheader'   => true,
336
                'capability' => 'ee_edit_registrations',
337
                'args' => array('not_approve', true)
338
            ),
339
            'cancel_registration'                => array(
340
                'func'       => 'cancel_registration',
341
                'noheader'   => true,
342
                'capability' => 'ee_edit_registration',
343
                'obj_id'     => $reg_id,
344
            ),
345
            'cancel_and_notify_registration'     => array(
346
                'func'       => 'cancel_registration',
347
                'noheader'   => true,
348
                'args'       => array(true),
349
                'capability' => 'ee_edit_registration',
350
                'obj_id'     => $reg_id,
351
            ),
352
            'cancel_registrations'                => array(
353
                'func'       => 'bulk_action_on_registrations',
354
                'noheader'   => true,
355
                'capability' => 'ee_edit_registrations',
356
                'args' => array('cancel')
357
            ),
358
            'cancel_and_notify_registrations'     => array(
359
                'func'       => 'bulk_action_on_registrations',
360
                'noheader'   => true,
361
                'capability' => 'ee_edit_registrations',
362
                'args' => array('cancel', true)
363
            ),
364
            'wait_list_registration' => array(
365
                'func'       => 'wait_list_registration',
366
                'noheader'   => true,
367
                'capability' => 'ee_edit_registration',
368
                'obj_id'     => $reg_id,
369
            ),
370
            'wait_list_and_notify_registration' => array(
371
                'func'       => 'wait_list_registration',
372
                'noheader'   => true,
373
                'args'       => array(true),
374
                'capability' => 'ee_edit_registration',
375
                'obj_id'     => $reg_id,
376
            ),
377
            'contact_list'                       => array(
378
                'func'       => '_attendee_contact_list_table',
379
                'capability' => 'ee_read_contacts',
380
            ),
381
            'add_new_attendee'                   => array(
382
                'func' => '_create_new_cpt_item',
383
                'args' => array(
384
                    'new_attendee' => true,
385
                    'capability'   => 'ee_edit_contacts',
386
                ),
387
            ),
388
            'edit_attendee'                      => array(
389
                'func'       => '_edit_cpt_item',
390
                'capability' => 'ee_edit_contacts',
391
                'obj_id'     => $att_id,
392
            ),
393
            'duplicate_attendee'                 => array(
394
                'func'       => '_duplicate_attendee',
395
                'noheader'   => true,
396
                'capability' => 'ee_edit_contacts',
397
                'obj_id'     => $att_id,
398
            ),
399
            'insert_attendee'                    => array(
400
                'func'       => '_insert_or_update_attendee',
401
                'args'       => array(
402
                    'new_attendee' => true,
403
                ),
404
                'noheader'   => true,
405
                'capability' => 'ee_edit_contacts',
406
            ),
407
            'update_attendee'                    => array(
408
                'func'       => '_insert_or_update_attendee',
409
                'args'       => array(
410
                    'new_attendee' => false,
411
                ),
412
                'noheader'   => true,
413
                'capability' => 'ee_edit_contacts',
414
                'obj_id'     => $att_id,
415
            ),
416
            'trash_attendees' => array(
417
                'func' => '_trash_or_restore_attendees',
418
                'args' => array(
419
                    'trash' => 'true'
420
                ),
421
                'noheader' => true,
422
                'capability' => 'ee_delete_contacts'
423
            ),
424
            'trash_attendee'                    => array(
425
                'func'       => '_trash_or_restore_attendees',
426
                'args'       => array(
427
                    'trash' => true,
428
                ),
429
                'noheader'   => true,
430
                'capability' => 'ee_delete_contacts',
431
                'obj_id'     => $att_id,
432
            ),
433
            'restore_attendees'                  => array(
434
                'func'       => '_trash_or_restore_attendees',
435
                'args'       => array(
436
                    'trash' => false,
437
                ),
438
                'noheader'   => true,
439
                'capability' => 'ee_delete_contacts',
440
                'obj_id'     => $att_id,
441
            ),
442
            'resend_registration'                => array(
443
                'func'       => '_resend_registration',
444
                'noheader'   => true,
445
                'capability' => 'ee_send_message',
446
            ),
447
            'registrations_report'               => array(
448
                'func'       => '_registrations_report',
449
                'noheader'   => true,
450
                'capability' => 'ee_read_registrations',
451
            ),
452
            'contact_list_export'                => array(
453
                'func'       => '_contact_list_export',
454
                'noheader'   => true,
455
                'capability' => 'export',
456
            ),
457
            'contact_list_report'                => array(
458
                'func'       => '_contact_list_report',
459
                'noheader'   => true,
460
                'capability' => 'ee_read_contacts',
461
            ),
462
        );
463
    }
464
465
466
    protected function _set_page_config()
467
    {
468
        $this->_page_config = array(
469
            'default'           => array(
470
                'nav'           => array(
471
                    'label' => esc_html__('Overview', 'event_espresso'),
472
                    'order' => 5,
473
                ),
474
                'help_tabs'     => array(
475
                    'registrations_overview_help_tab'                       => array(
476
                        'title'    => esc_html__('Registrations Overview', 'event_espresso'),
477
                        'filename' => 'registrations_overview',
478
                    ),
479
                    'registrations_overview_table_column_headings_help_tab' => array(
480
                        'title'    => esc_html__('Registrations Table Column Headings', 'event_espresso'),
481
                        'filename' => 'registrations_overview_table_column_headings',
482
                    ),
483
                    'registrations_overview_filters_help_tab'               => array(
484
                        'title'    => esc_html__('Registration Filters', 'event_espresso'),
485
                        'filename' => 'registrations_overview_filters',
486
                    ),
487
                    'registrations_overview_views_help_tab'                 => array(
488
                        'title'    => esc_html__('Registration Views', 'event_espresso'),
489
                        'filename' => 'registrations_overview_views',
490
                    ),
491
                    'registrations_regoverview_other_help_tab'              => array(
492
                        'title'    => esc_html__('Registrations Other', 'event_espresso'),
493
                        'filename' => 'registrations_overview_other',
494
                    ),
495
                ),
496
                'help_tour'     => array('Registration_Overview_Help_Tour'),
497
                'qtips'         => array('Registration_List_Table_Tips'),
498
                'list_table'    => 'EE_Registrations_List_Table',
499
                'require_nonce' => false,
500
            ),
501
            'view_registration' => array(
502
                'nav'           => array(
503
                    'label'      => esc_html__('REG Details', 'event_espresso'),
504
                    'order'      => 15,
505
                    'url'        => isset($this->_req_data['_REG_ID'])
506
                        ? add_query_arg(array('_REG_ID' => $this->_req_data['_REG_ID']), $this->_current_page_view_url)
507
                        : $this->_admin_base_url,
508
                    'persistent' => false,
509
                ),
510
                'help_tabs'     => array(
511
                    'registrations_details_help_tab'                    => array(
512
                        'title'    => esc_html__('Registration Details', 'event_espresso'),
513
                        'filename' => 'registrations_details',
514
                    ),
515
                    'registrations_details_table_help_tab'              => array(
516
                        'title'    => esc_html__('Registration Details Table', 'event_espresso'),
517
                        'filename' => 'registrations_details_table',
518
                    ),
519
                    'registrations_details_form_answers_help_tab'       => array(
520
                        'title'    => esc_html__('Registration Form Answers', 'event_espresso'),
521
                        'filename' => 'registrations_details_form_answers',
522
                    ),
523
                    'registrations_details_registrant_details_help_tab' => array(
524
                        'title'    => esc_html__('Contact Details', 'event_espresso'),
525
                        'filename' => 'registrations_details_registrant_details',
526
                    ),
527
                ),
528
                'help_tour'     => array('Registration_Details_Help_Tour'),
529
                'metaboxes'     => array_merge(
530
                    $this->_default_espresso_metaboxes,
531
                    array('_registration_details_metaboxes')
532
                ),
533
                'require_nonce' => false,
534
            ),
535
            'new_registration'  => array(
536
                'nav'           => array(
537
                    'label'      => esc_html__('Add New Registration', 'event_espresso'),
538
                    'url'        => '#',
539
                    'order'      => 15,
540
                    'persistent' => false,
541
                ),
542
                'metaboxes'     => $this->_default_espresso_metaboxes,
543
                'labels'        => array(
544
                    'publishbox' => esc_html__('Save Registration', 'event_espresso'),
545
                ),
546
                'require_nonce' => false,
547
            ),
548
            'add_new_attendee'  => array(
549
                'nav'           => array(
550
                    'label'      => esc_html__('Add Contact', 'event_espresso'),
551
                    'order'      => 15,
552
                    'persistent' => false,
553
                ),
554
                'metaboxes'     => array_merge(
555
                    $this->_default_espresso_metaboxes,
556
                    array('_publish_post_box', 'attendee_editor_metaboxes')
557
                ),
558
                'require_nonce' => false,
559
            ),
560
            'edit_attendee'     => array(
561
                'nav'           => array(
562
                    'label'      => esc_html__('Edit Contact', 'event_espresso'),
563
                    'order'      => 15,
564
                    'persistent' => false,
565
                    'url'        => isset($this->_req_data['ATT_ID'])
566
                        ? add_query_arg(array('ATT_ID' => $this->_req_data['ATT_ID']), $this->_current_page_view_url)
567
                        : $this->_admin_base_url,
568
                ),
569
                'metaboxes'     => array('attendee_editor_metaboxes'),
570
                'require_nonce' => false,
571
            ),
572
            'contact_list'      => array(
573
                'nav'           => array(
574
                    'label' => esc_html__('Contact List', 'event_espresso'),
575
                    'order' => 20,
576
                ),
577
                'list_table'    => 'EE_Attendee_Contact_List_Table',
578
                'help_tabs'     => array(
579
                    'registrations_contact_list_help_tab'                       => array(
580
                        'title'    => esc_html__('Registrations Contact List', 'event_espresso'),
581
                        'filename' => 'registrations_contact_list',
582
                    ),
583
                    'registrations_contact-list_table_column_headings_help_tab' => array(
584
                        'title'    => esc_html__('Contact List Table Column Headings', 'event_espresso'),
585
                        'filename' => 'registrations_contact_list_table_column_headings',
586
                    ),
587
                    'registrations_contact_list_views_help_tab'                 => array(
588
                        'title'    => esc_html__('Contact List Views', 'event_espresso'),
589
                        'filename' => 'registrations_contact_list_views',
590
                    ),
591
                    'registrations_contact_list_other_help_tab'                 => array(
592
                        'title'    => esc_html__('Contact List Other', 'event_espresso'),
593
                        'filename' => 'registrations_contact_list_other',
594
                    ),
595
                ),
596
                'help_tour'     => array('Contact_List_Help_Tour'),
597
                'metaboxes'     => array(),
598
                'require_nonce' => false,
599
            ),
600
            //override default cpt routes
601
            'create_new'        => '',
602
            'edit'              => '',
603
        );
604
    }
605
606
607
    /**
608
     * The below methods aren't used by this class currently
609
     */
610
    protected function _add_screen_options()
611
    {
612
    }
613
614
615
    protected function _add_feature_pointers()
616
    {
617
    }
618
619
620
    public function admin_init()
621
    {
622
        EE_Registry::$i18n_js_strings['update_att_qstns'] = esc_html__(
623
            'click "Update Registration Questions" to save your changes',
624
            'event_espresso'
625
        );
626
    }
627
628
629
    public function admin_notices()
630
    {
631
    }
632
633
634
    public function admin_footer_scripts()
635
    {
636
    }
637
638
639
    /**
640
     *        get list of registration statuses
641
     *
642
     * @access private
643
     * @return void
644
     * @throws EE_Error
645
     */
646
    private function _get_registration_status_array()
647
    {
648
        self::$_reg_status = EEM_Registration::reg_status_array(array(), true);
649
    }
650
651
652
    protected function _add_screen_options_default()
653
    {
654
        $this->_per_page_screen_option();
655
    }
656
657
658 View Code Duplication
    protected function _add_screen_options_contact_list()
659
    {
660
        $page_title              = $this->_admin_page_title;
661
        $this->_admin_page_title = esc_html__("Contacts", 'event_espresso');
662
        $this->_per_page_screen_option();
663
        $this->_admin_page_title = $page_title;
664
    }
665
666
667 View Code Duplication
    public function load_scripts_styles()
668
    {
669
        //style
670
        wp_register_style(
671
            'espresso_reg',
672
            REG_ASSETS_URL . 'espresso_registrations_admin.css',
673
            array('ee-admin-css'),
674
            EVENT_ESPRESSO_VERSION
675
        );
676
        wp_enqueue_style('espresso_reg');
677
        //script
678
        wp_register_script(
679
            'espresso_reg',
680
            REG_ASSETS_URL . 'espresso_registrations_admin.js',
681
            array('jquery-ui-datepicker', 'jquery-ui-draggable', 'ee_admin_js'),
682
            EVENT_ESPRESSO_VERSION,
683
            true
684
        );
685
        wp_enqueue_script('espresso_reg');
686
    }
687
688
689
    public function load_scripts_styles_edit_attendee()
690
    {
691
        //stuff to only show up on our attendee edit details page.
692
        $attendee_details_translations = array(
693
            'att_publish_text' => sprintf(
694
                esc_html__('Created on: <b>%1$s</b>', 'event_espresso'),
695
                $this->_cpt_model_obj->get_datetime('ATT_created')
696
            ),
697
        );
698
        wp_localize_script('espresso_reg', 'ATTENDEE_DETAILS', $attendee_details_translations);
699
        wp_enqueue_script('jquery-validate');
700
    }
701
702
703
    public function load_scripts_styles_view_registration()
704
    {
705
        //styles
706
        wp_enqueue_style('espresso-ui-theme');
707
        //scripts
708
        $this->_get_reg_custom_questions_form($this->_registration->ID());
709
        $this->_reg_custom_questions_form->wp_enqueue_scripts(true);
710
    }
711
712
713
    public function load_scripts_styles_contact_list()
714
    {
715
        wp_deregister_style('espresso_reg');
716
        wp_register_style(
717
            'espresso_att',
718
            REG_ASSETS_URL . 'espresso_attendees_admin.css',
719
            array('ee-admin-css'),
720
            EVENT_ESPRESSO_VERSION
721
        );
722
        wp_enqueue_style('espresso_att');
723
    }
724
725
726
    public function load_scripts_styles_new_registration()
727
    {
728
        wp_register_script(
729
            'ee-spco-for-admin',
730
            REG_ASSETS_URL . 'spco_for_admin.js',
731
            array('underscore', 'jquery'),
732
            EVENT_ESPRESSO_VERSION,
733
            true
734
        );
735
        wp_enqueue_script('ee-spco-for-admin');
736
        add_filter('FHEE__EED_Ticket_Selector__load_tckt_slctr_assets', '__return_true');
737
        EE_Form_Section_Proper::wp_enqueue_scripts();
738
        EED_Ticket_Selector::load_tckt_slctr_assets();
739
        EE_Datepicker_Input::enqueue_styles_and_scripts();
740
    }
741
742
743
    public function AHEE__EE_Admin_Page__route_admin_request_resend_registration()
744
    {
745
        add_filter('FHEE_load_EE_messages', '__return_true');
746
    }
747
748
749
    public function AHEE__EE_Admin_Page__route_admin_request_approve_registration()
750
    {
751
        add_filter('FHEE_load_EE_messages', '__return_true');
752
    }
753
754
755
    protected function _set_list_table_views_default()
756
    {
757
        //for notification related bulk actions we need to make sure only active messengers have an option.
758
        EED_Messages::set_autoloaders();
759
        /** @type EE_Message_Resource_Manager $message_resource_manager */
760
        $message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
761
        $active_mts               = $message_resource_manager->list_of_active_message_types();
762
        //key= bulk_action_slug, value= message type.
763
        $match_array = array(
764
            'approve_registrations'    => 'registration',
765
            'decline_registrations'    => 'declined_registration',
766
            'pending_registrations'    => 'pending_approval',
767
            'no_approve_registrations' => 'not_approved_registration',
768
            'cancel_registrations'     => 'cancelled_registration',
769
        );
770
        $can_send = EE_Registry::instance()->CAP->current_user_can(
771
            'ee_send_message',
772
            'batch_send_messages'
773
        );
774
        /** setup reg status bulk actions **/
775
        $def_reg_status_actions['approve_registrations'] = esc_html__('Approve Registrations', 'event_espresso');
0 ignored issues
show
Coding Style Comprehensibility introduced by
$def_reg_status_actions was never initialized. Although not strictly required by PHP, it is generally a good practice to add $def_reg_status_actions = array(); before regardless.

Adding an explicit array definition is generally preferable to implicit array definition as it guarantees a stable state of the code.

Let’s take a look at an example:

foreach ($collection as $item) {
    $myArray['foo'] = $item->getFoo();

    if ($item->hasBar()) {
        $myArray['bar'] = $item->getBar();
    }

    // do something with $myArray
}

As you can see in this example, the array $myArray is initialized the first time when the foreach loop is entered. You can also see that the value of the bar key is only written conditionally; thus, its value might result from a previous iteration.

This might or might not be intended. To make your intention clear, your code more readible and to avoid accidental bugs, we recommend to add an explicit initialization $myArray = array() either outside or inside the foreach loop.

Loading history...
776
        if ($can_send && in_array($match_array['approve_registrations'], $active_mts, true)) {
777
                $def_reg_status_actions['approve_and_notify_registrations'] = esc_html__(
778
                    'Approve and Notify Registrations',
779
                    'event_espresso'
780
                );
781
        }
782
        $def_reg_status_actions['decline_registrations'] = esc_html__('Decline Registrations', 'event_espresso');
783
        if ($can_send && in_array($match_array['decline_registrations'], $active_mts, true)) {
784
                $def_reg_status_actions['decline_and_notify_registrations'] = esc_html__(
785
                    'Decline and Notify Registrations',
786
                    'event_espresso'
787
                );
788
        }
789
        $def_reg_status_actions['pending_registrations'] = esc_html__(
790
            'Set Registrations to Pending Payment',
791
            'event_espresso'
792
        );
793
        if ($can_send && in_array($match_array['pending_registrations'], $active_mts, true)) {
794
                $def_reg_status_actions['pending_and_notify_registrations'] = esc_html__(
795
                    'Set Registrations to Pending Payment and Notify',
796
                    'event_espresso'
797
                );
798
        }
799
        $def_reg_status_actions['no_approve_registrations'] = esc_html__(
800
            'Set Registrations to Not Approved',
801
            'event_espresso'
802
        );
803
        if ($can_send && in_array($match_array['no_approve_registrations'], $active_mts, true)) {
804
                $def_reg_status_actions['no_approve_and_notify_registrations'] = esc_html__(
805
                    'Set Registrations to Not Approved and Notify',
806
                    'event_espresso'
807
                );
808
        }
809
        $def_reg_status_actions['cancel_registrations'] = esc_html__('Cancel Registrations', 'event_espresso');
810
        if ($can_send && in_array($match_array['cancel_registrations'], $active_mts, true)) {
811
                $def_reg_status_actions['cancel_and_notify_registrations'] = esc_html__(
812
                    'Cancel Registrations and Notify',
813
                    'event_espresso'
814
                );
815
        }
816
        $def_reg_status_actions = apply_filters(
817
            'FHEE__Registrations_Admin_Page___set_list_table_views_default__def_reg_status_actions_array',
818
            $def_reg_status_actions,
819
            $active_mts,
820
            $can_send
821
        );
822
823
        $this->_views = array(
824
            'all'   => array(
825
                'slug'        => 'all',
826
                'label'       => esc_html__('View All Registrations', 'event_espresso'),
827
                'count'       => 0,
828
                'bulk_action' => array_merge($def_reg_status_actions, array(
829
                    'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
830
                )),
831
            ),
832
            'month' => array(
833
                'slug'        => 'month',
834
                'label'       => esc_html__('This Month', 'event_espresso'),
835
                'count'       => 0,
836
                'bulk_action' => array_merge($def_reg_status_actions, array(
837
                    'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
838
                )),
839
            ),
840
            'today' => array(
841
                'slug'        => 'today',
842
                'label'       => sprintf(
843
                    esc_html__('Today - %s', 'event_espresso'),
844
                    date('M d, Y', current_time('timestamp'))
845
                ),
846
                'count'       => 0,
847
                'bulk_action' => array_merge($def_reg_status_actions, array(
848
                    'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
849
                )),
850
            ),
851
        );
852
        if (EE_Registry::instance()->CAP->current_user_can(
853
            'ee_delete_registrations',
854
            'espresso_registrations_delete_registration'
855
        )) {
856
            $this->_views['incomplete'] = array(
857
                'slug'        => 'incomplete',
858
                'label'       => esc_html__('Incomplete', 'event_espresso'),
859
                'count'       => 0,
860
                'bulk_action' => array(
861
                    'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
862
                ),
863
            );
864
            $this->_views['trash']      = array(
865
                'slug'        => 'trash',
866
                'label'       => esc_html__('Trash', 'event_espresso'),
867
                'count'       => 0,
868
                'bulk_action' => array(
869
                    'restore_registrations' => esc_html__('Restore Registrations', 'event_espresso'),
870
                    'delete_registrations'  => esc_html__('Delete Registrations Permanently', 'event_espresso'),
871
                ),
872
            );
873
        }
874
    }
875
876
877
    protected function _set_list_table_views_contact_list()
878
    {
879
        $this->_views = array(
880
            'in_use' => array(
881
                'slug'        => 'in_use',
882
                'label'       => esc_html__('In Use', 'event_espresso'),
883
                'count'       => 0,
884
                'bulk_action' => array(
885
                    'trash_attendees' => esc_html__('Move to Trash', 'event_espresso'),
886
                ),
887
            ),
888
        );
889
        if (EE_Registry::instance()->CAP->current_user_can('ee_delete_contacts',
890
            'espresso_registrations_trash_attendees')
891
        ) {
892
            $this->_views['trash'] = array(
893
                'slug'        => 'trash',
894
                'label'       => esc_html__('Trash', 'event_espresso'),
895
                'count'       => 0,
896
                'bulk_action' => array(
897
                    'restore_attendees' => esc_html__('Restore from Trash', 'event_espresso'),
898
                ),
899
            );
900
        }
901
    }
902
903
904
    protected function _registration_legend_items()
905
    {
906
        $fc_items = array(
907
            'star-icon'        => array(
908
                'class' => 'dashicons dashicons-star-filled lt-blue-icon ee-icon-size-8',
909
                'desc'  => esc_html__('This is the Primary Registrant', 'event_espresso'),
910
            ),
911
            'view_details'     => array(
912
                'class' => 'dashicons dashicons-clipboard',
913
                'desc'  => esc_html__('View Registration Details', 'event_espresso'),
914
            ),
915
            'edit_attendee'    => array(
916
                'class' => 'ee-icon ee-icon-user-edit ee-icon-size-16',
917
                'desc'  => esc_html__('Edit Contact Details', 'event_espresso'),
918
            ),
919
            'view_transaction' => array(
920
                'class' => 'dashicons dashicons-cart',
921
                'desc'  => esc_html__('View Transaction Details', 'event_espresso'),
922
            ),
923
            'view_invoice'     => array(
924
                'class' => 'dashicons dashicons-media-spreadsheet',
925
                'desc'  => esc_html__('View Transaction Invoice', 'event_espresso'),
926
            ),
927
        );
928
        if (EE_Registry::instance()->CAP->current_user_can(
929
            'ee_send_message',
930
            'espresso_registrations_resend_registration'
931
        )) {
932
            $fc_items['resend_registration'] = array(
933
                'class' => 'dashicons dashicons-email-alt',
934
                'desc'  => esc_html__('Resend Registration Details', 'event_espresso'),
935
            );
936
        } else {
937
            $fc_items['blank'] = array('class' => 'blank', 'desc' => '');
938
        }
939 View Code Duplication
        if (EE_Registry::instance()->CAP->current_user_can(
940
            'ee_read_global_messages',
941
            'view_filtered_messages'
942
        )) {
943
            $related_for_icon = EEH_MSG_Template::get_message_action_icon('see_notifications_for');
944
            if (isset($related_for_icon['css_class']) && isset($related_for_icon['label'])) {
945
                $fc_items['view_related_messages'] = array(
946
                    'class' => $related_for_icon['css_class'],
947
                    'desc'  => $related_for_icon['label'],
948
                );
949
            }
950
        }
951
        $sc_items = array(
952
            'approved_status'   => array(
953
                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_approved,
954
                'desc'  => EEH_Template::pretty_status(
955
                    EEM_Registration::status_id_approved,
956
                    false,
957
                    'sentence'
958
                ),
959
            ),
960
            'pending_status'    => array(
961
                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_pending_payment,
962
                'desc'  => EEH_Template::pretty_status(
963
                    EEM_Registration::status_id_pending_payment,
964
                    false,
965
                    'sentence'
966
                ),
967
            ),
968
            'wait_list'         => array(
969
                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_wait_list,
970
                'desc'  => EEH_Template::pretty_status(
971
                    EEM_Registration::status_id_wait_list,
972
                    false,
973
                    'sentence'
974
                ),
975
            ),
976
            'incomplete_status' => array(
977
                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_incomplete,
978
                'desc'  => EEH_Template::pretty_status(
979
                    EEM_Registration::status_id_incomplete,
980
                    false,
981
                    'sentence'
982
                ),
983
            ),
984
            'not_approved'      => array(
985
                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_not_approved,
986
                'desc'  => EEH_Template::pretty_status(
987
                    EEM_Registration::status_id_not_approved,
988
                    false,
989
                    'sentence'
990
                ),
991
            ),
992
            'declined_status'   => array(
993
                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_declined,
994
                'desc'  => EEH_Template::pretty_status(
995
                    EEM_Registration::status_id_declined,
996
                    false,
997
                    'sentence'
998
                ),
999
            ),
1000
            'cancelled_status'  => array(
1001
                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_cancelled,
1002
                'desc'  => EEH_Template::pretty_status(
1003
                    EEM_Registration::status_id_cancelled,
1004
                    false,
1005
                    'sentence'
1006
                ),
1007
            ),
1008
        );
1009
        return array_merge($fc_items, $sc_items);
1010
    }
1011
1012
1013
1014
    /***************************************        REGISTRATION OVERVIEW        **************************************/
1015
    /**
1016
     * @throws \EE_Error
1017
     */
1018
    protected function _registrations_overview_list_table()
1019
    {
1020
        $this->_template_args['admin_page_header'] = '';
1021
        $EVT_ID                                    = ! empty($this->_req_data['event_id'])
1022
            ? absint($this->_req_data['event_id'])
1023
            : 0;
1024
        $ATT_ID = !empty($this->_req_data['ATT_ID'])
1025
            ? absint($this->_req_data['ATT_ID'])
1026
            : 0;
1027
        if ($ATT_ID) {
1028
            $attendee = EEM_Attendee::instance()->get_one_by_ID($ATT_ID);
1029 View Code Duplication
            if ($attendee instanceof EE_Attendee) {
1030
                $this->_template_args['admin_page_header'] = sprintf(
1031
                    esc_html__(
1032
                        '%1$s Viewing registrations for %2$s%3$s',
1033
                        'event_espresso'
1034
                    ),
1035
                    '<h3 style="line-height:1.5em;">',
1036
                    '<a href="' . EE_Admin_Page::add_query_args_and_nonce(
1037
                        array(
1038
                            'action' => 'edit_attendee',
1039
                            'post' => $ATT_ID
1040
                        ),
1041
                        REG_ADMIN_URL
1042
                    ) . '">' . $attendee->full_name() . '</a>',
1043
                    '</h3>'
1044
                );
1045
            }
1046
        }
1047
        if ($EVT_ID) {
1048
            if (EE_Registry::instance()->CAP->current_user_can(
1049
                'ee_edit_registrations',
1050
                'espresso_registrations_new_registration',
1051
                $EVT_ID
1052
            )) {
1053
                $this->_admin_page_title .= ' ' . $this->get_action_link_or_button(
1054
                    'new_registration',
1055
                    'add-registrant',
1056
                    array('event_id' => $EVT_ID),
1057
                    'add-new-h2'
1058
                );
1059
            }
1060
            $event = EEM_Event::instance()->get_one_by_ID($EVT_ID);
1061 View Code Duplication
            if ($event instanceof EE_Event) {
1062
                $this->_template_args['admin_page_header'] = sprintf(
1063
                    esc_html__(
1064
                        '%s Viewing registrations for the event: %s%s',
1065
                        'event_espresso'
1066
                    ),
1067
                    '<h3 style="line-height:1.5em;">',
1068
                    '<br /><a href="'
1069
                        . EE_Admin_Page::add_query_args_and_nonce(
1070
                            array(
1071
                                'action' => 'edit',
1072
                                'post'   => $event->ID(),
1073
                            ),
1074
                            EVENTS_ADMIN_URL
1075
                        )
1076
                        . '">&nbsp;'
1077
                        . $event->get('EVT_name')
1078
                        . '&nbsp;</a>&nbsp;',
1079
                    '</h3>'
1080
                );
1081
            }
1082
            $DTT_ID   = ! empty($this->_req_data['datetime_id']) ? absint($this->_req_data['datetime_id']) : 0;
1083
            $datetime = EEM_Datetime::instance()->get_one_by_ID($DTT_ID);
1084 View Code Duplication
            if ($datetime instanceof EE_Datetime && $this->_template_args['admin_page_header'] !== '') {
1085
                $this->_template_args['admin_page_header'] = substr(
1086
                    $this->_template_args['admin_page_header'],
1087
                    0,
1088
                    -5
1089
                );
1090
                $this->_template_args['admin_page_header'] .= ' &nbsp;<span class="drk-grey-text">';
1091
                $this->_template_args['admin_page_header'] .= '<span class="dashicons dashicons-calendar"></span>';
1092
                $this->_template_args['admin_page_header'] .= $datetime->name();
1093
                $this->_template_args['admin_page_header'] .= ' ( ' . $datetime->start_date() . ' )';
1094
                $this->_template_args['admin_page_header'] .= '</span></h3>';
1095
            }
1096
        }
1097
        $this->_template_args['after_list_table'] = $this->_display_legend($this->_registration_legend_items());
1098
        $this->display_admin_list_table_page_with_no_sidebar();
1099
    }
1100
1101
1102
    /**
1103
     * This sets the _registration property for the registration details screen
1104
     *
1105
     * @access private
1106
     * @return bool
1107
     * @throws EE_Error
1108
     * @throws InvalidArgumentException
1109
     * @throws InvalidDataTypeException
1110
     * @throws InvalidInterfaceException
1111
     */
1112
    private function _set_registration_object()
1113
    {
1114
        //get out if we've already set the object
1115
        if ($this->_registration instanceof EE_Registration) {
1116
            return true;
1117
        }
1118
        $REG    = EEM_Registration::instance();
1119
        $REG_ID = ( ! empty($this->_req_data['_REG_ID'])) ? absint($this->_req_data['_REG_ID']) : false;
1120
        if ($this->_registration = $REG->get_one_by_ID($REG_ID)) {
1121
            return true;
1122
        } else {
1123
            $error_msg = sprintf(
1124
                esc_html__(
1125
                    'An error occurred and the details for Registration ID #%s could not be retrieved.',
1126
                    'event_espresso'
1127
                ),
1128
                $REG_ID
1129
            );
1130
            EE_Error::add_error($error_msg, __FILE__, __FUNCTION__, __LINE__);
1131
            $this->_registration = null;
1132
            return false;
1133
        }
1134
    }
1135
1136
1137
    /**
1138
     * Used to retrieve registrations for the list table.
1139
     *
1140
     * @param int  $per_page
1141
     * @param bool $count
1142
     * @param bool $this_month
1143
     * @param bool $today
1144
     * @return EE_Registration[]|int
1145
     * @throws EE_Error
1146
     * @throws InvalidArgumentException
1147
     * @throws InvalidDataTypeException
1148
     * @throws InvalidInterfaceException
1149
     */
1150
    public function get_registrations(
1151
        $per_page = 10,
1152
        $count = false,
1153
        $this_month = false,
1154
        $today = false
1155
    ) {
1156
        if ($this_month) {
1157
            $this->_req_data['status'] = 'month';
1158
        }
1159
        if ($today) {
1160
            $this->_req_data['status'] = 'today';
1161
        }
1162
        $query_params = $this->_get_registration_query_parameters($this->_req_data, $per_page, $count);
1163
        /**
1164
         * Override the default groupby added by EEM_Base so that sorts with multiple order bys work as expected
1165
         * @link https://events.codebasehq.com/projects/event-espresso/tickets/10093
1166
         * @see EEM_Base::get_all()
1167
         */
1168
        $query_params['group_by'] = '';
1169
1170
        return $count
1171
            ? EEM_Registration::instance()->count($query_params)
1172
            /** @type EE_Registration[] */
1173
            : EEM_Registration::instance()->get_all($query_params);
1174
    }
1175
1176
1177
    /**
1178
     * Retrieves the query parameters to be used by the Registration model for getting registrations.
1179
     * Note: this listens to values on the request for some of the query parameters.
1180
     *
1181
     * @param array $request
1182
     * @param int   $per_page
1183
     * @param bool  $count
1184
     * @return array
1185
     * @throws EE_Error
1186
     */
1187
    protected function _get_registration_query_parameters(
1188
        $request = array(),
1189
        $per_page = 10,
1190
        $count = false
1191
    ) {
1192
1193
        $query_params = array(
1194
            0                          => $this->_get_where_conditions_for_registrations_query(
1195
                $request
1196
            ),
1197
            'caps'                     => EEM_Registration::caps_read_admin,
1198
            'default_where_conditions' => 'this_model_only',
1199
        );
1200
        if (! $count) {
1201
            $query_params = array_merge(
1202
                $query_params,
1203
                $this->_get_orderby_for_registrations_query(),
1204
                $this->_get_limit($per_page)
1205
            );
1206
        }
1207
1208
        return $query_params;
1209
    }
1210
1211
1212
    /**
1213
     * This will add ATT_ID to the provided $where array for EE model query parameters.
1214
     *
1215
     * @param array $request usually the same as $this->_req_data but not necessarily
1216
     * @return array
1217
     */
1218
    protected function addAttendeeIdToWhereConditions(array $request)
1219
    {
1220
        $where = array();
1221
        if (! empty($request['ATT_ID'])) {
1222
            $where['ATT_ID'] = absint($request['ATT_ID']);
1223
        }
1224
        return $where;
1225
    }
1226
1227
1228
    /**
1229
     * This will add EVT_ID to the provided $where array for EE model query parameters.
1230
     *
1231
     * @param array $request usually the same as $this->_req_data but not necessarily
1232
     * @return array
1233
     */
1234
    protected function _add_event_id_to_where_conditions(array $request)
1235
    {
1236
        $where = array();
1237
        if (! empty($request['event_id'])) {
1238
            $where['EVT_ID'] = absint($request['event_id']);
1239
        }
1240
        return $where;
1241
    }
1242
1243
1244
    /**
1245
     * Adds category ID if it exists in the request to the where conditions for the registrations query.
1246
     *
1247
     * @param array $request usually the same as $this->_req_data but not necessarily
1248
     * @return array
1249
     */
1250
    protected function _add_category_id_to_where_conditions(array $request)
1251
    {
1252
        $where = array();
1253
        if (! empty($request['EVT_CAT']) && (int)$request['EVT_CAT'] !== -1) {
1254
            $where['Event.Term_Taxonomy.term_id'] = absint($request['EVT_CAT']);
1255
        }
1256
        return $where;
1257
    }
1258
1259
1260
    /**
1261
     * Adds the datetime ID if it exists in the request to the where conditions for the registrations query.
1262
     *
1263
     * @param array $request usually the same as $this->_req_data but not necessarily
1264
     * @return array
1265
     */
1266
    protected function _add_datetime_id_to_where_conditions(array $request)
1267
    {
1268
        $where = array();
1269
        if (! empty($request['datetime_id'])) {
1270
            $where['Ticket.Datetime.DTT_ID'] = absint($request['datetime_id']);
1271
        }
1272
        if (! empty($request['DTT_ID'])) {
1273
            $where['Ticket.Datetime.DTT_ID'] = absint($request['DTT_ID']);
1274
        }
1275
        return $where;
1276
    }
1277
1278
1279
    /**
1280
     * Adds the correct registration status to the where conditions for the registrations query.
1281
     *
1282
     * @param array $request usually the same as $this->_req_data but not necessarily
1283
     * @return array
1284
     */
1285
    protected function _add_registration_status_to_where_conditions(array $request)
1286
    {
1287
        $where = array();
1288
        $view = EEH_Array::is_set($request, 'status', '');
1289
        $registration_status = ! empty($request['_reg_status'])
1290
            ? sanitize_text_field($request['_reg_status'])
1291
            : '';
1292
1293
        /*
1294
         * If filtering by registration status, then we show registrations matching that status.
1295
         * If not filtering by specified status, then we show all registrations excluding incomplete registrations
1296
         * UNLESS viewing trashed registrations.
1297
         */
1298
        if (! empty($registration_status)) {
1299
            $where['STS_ID'] = $registration_status;
1300
        } else {
1301
            //make sure we exclude incomplete registrations, but only if not trashed.
1302
            if ($view === 'trash') {
1303
                $where['REG_deleted'] = true;
1304
            } elseif ($view === 'incomplete') {
1305
                $where['STS_ID'] = EEM_Registration::status_id_incomplete;
1306
            } else {
1307
                $where['STS_ID'] = array('!=', EEM_Registration::status_id_incomplete);
1308
            }
1309
        }
1310
        return $where;
1311
    }
1312
1313
1314
    /**
1315
     * Adds any provided date restraints to the where conditions for the registrations query.
1316
     *
1317
     * @param array $request usually the same as $this->_req_data but not necessarily
1318
     * @return array
1319
     * @throws EE_Error
1320
     * @throws InvalidArgumentException
1321
     * @throws InvalidDataTypeException
1322
     * @throws InvalidInterfaceException
1323
     */
1324
    protected function _add_date_to_where_conditions(array $request)
1325
    {
1326
        $where = array();
1327
        $view = EEH_Array::is_set($request, 'status', '');
1328
        $month_range             = ! empty($request['month_range'])
1329
            ? sanitize_text_field($request['month_range'])
1330
            : '';
1331
        $retrieve_for_today      = $view === 'today';
1332
        $retrieve_for_this_month = $view === 'month';
1333
1334
        if ($retrieve_for_today) {
1335
            $now               = date('Y-m-d', current_time('timestamp'));
1336
            $where['REG_date'] = array(
1337
                'BETWEEN',
1338
                array(
1339
                    EEM_Registration::instance()->convert_datetime_for_query(
1340
                        'REG_date',
1341
                        $now . ' 00:00:00',
1342
                        'Y-m-d H:i:s'
1343
                    ),
1344
                    EEM_Registration::instance()->convert_datetime_for_query(
1345
                        'REG_date',
1346
                        $now . ' 23:59:59',
1347
                        'Y-m-d H:i:s'
1348
                    ),
1349
                ),
1350
            );
1351
        } elseif ($retrieve_for_this_month) {
1352
            $current_year_and_month = date('Y-m', current_time('timestamp'));
1353
            $days_this_month        = date('t', current_time('timestamp'));
1354
            $where['REG_date']      = array(
1355
                'BETWEEN',
1356
                array(
1357
                    EEM_Registration::instance()->convert_datetime_for_query(
1358
                        'REG_date',
1359
                        $current_year_and_month . '-01 00:00:00',
1360
                        'Y-m-d H:i:s'
1361
                    ),
1362
                    EEM_Registration::instance()->convert_datetime_for_query(
1363
                        'REG_date',
1364
                        $current_year_and_month . '-' . $days_this_month . ' 23:59:59',
1365
                        'Y-m-d H:i:s'
1366
                    ),
1367
                ),
1368
            );
1369
        } elseif ($month_range) {
1370
            $pieces          = explode(' ', $month_range, 3);
1371
            $month_requested = ! empty($pieces[0])
1372
                ? date('m', \EEH_DTT_Helper::first_of_month_timestamp($pieces[0]))
1373
                : '';
1374
            $year_requested  = ! empty($pieces[1])
1375
                ? $pieces[1]
1376
                : '';
1377
            //if there is not a month or year then we can't go further
1378
            if ($month_requested && $year_requested) {
1379
                $days_in_month     = date('t', strtotime($year_requested . '-' . $month_requested . '-' . '01'));
1380
                $where['REG_date'] = array(
1381
                    'BETWEEN',
1382
                    array(
1383
                        EEM_Registration::instance()->convert_datetime_for_query(
1384
                            'REG_date',
1385
                            $year_requested . '-' . $month_requested . '-01 00:00:00',
1386
                            'Y-m-d H:i:s'
1387
                        ),
1388
                        EEM_Registration::instance()->convert_datetime_for_query(
1389
                            'REG_date',
1390
                            $year_requested . '-' . $month_requested . '-' . $days_in_month . ' 23:59:59',
1391
                            'Y-m-d H:i:s'
1392
                        ),
1393
                    ),
1394
                );
1395
            }
1396
        }
1397
        return $where;
1398
    }
1399
1400
1401
    /**
1402
     * Adds any provided search restraints to the where conditions for the registrations query
1403
     *
1404
     * @param array $request usually the same as $this->_req_data but not necessarily
1405
     * @return array
1406
     */
1407
    protected function _add_search_to_where_conditions(array $request)
1408
    {
1409
        $where = array();
1410
        if (! empty($request['s'])) {
1411
            $search_string = '%' . sanitize_text_field($request['s']) . '%';
1412
            $where['OR*search_conditions'] = array(
1413
                'Event.EVT_name'                          => array('LIKE', $search_string),
1414
                'Event.EVT_desc'                          => array('LIKE', $search_string),
1415
                'Event.EVT_short_desc'                    => array('LIKE', $search_string),
1416
                'Attendee.ATT_full_name'                  => array('LIKE', $search_string),
1417
                'Attendee.ATT_fname'                      => array('LIKE', $search_string),
1418
                'Attendee.ATT_lname'                      => array('LIKE', $search_string),
1419
                'Attendee.ATT_short_bio'                  => array('LIKE', $search_string),
1420
                'Attendee.ATT_email'                      => array('LIKE', $search_string),
1421
                'Attendee.ATT_address'                    => array('LIKE', $search_string),
1422
                'Attendee.ATT_address2'                   => array('LIKE', $search_string),
1423
                'Attendee.ATT_city'                       => array('LIKE', $search_string),
1424
                'REG_final_price'                         => array('LIKE', $search_string),
1425
                'REG_code'                                => array('LIKE', $search_string),
1426
                'REG_count'                               => array('LIKE', $search_string),
1427
                'REG_group_size'                          => array('LIKE', $search_string),
1428
                'Ticket.TKT_name'                         => array('LIKE', $search_string),
1429
                'Ticket.TKT_description'                  => array('LIKE', $search_string),
1430
                'Transaction.Payment.PAY_txn_id_chq_nmbr' => array('LIKE', $search_string),
1431
            );
1432
        }
1433
        return $where;
1434
    }
1435
1436
1437
    /**
1438
     * Sets up the where conditions for the registrations query.
1439
     *
1440
     * @param array $request
1441
     * @return array
1442
     * @throws EE_Error
1443
     */
1444
    protected function _get_where_conditions_for_registrations_query($request)
1445
    {
1446
        return apply_filters(
1447
            'FHEE__Registrations_Admin_Page___get_where_conditions_for_registrations_query',
1448
            array_merge(
1449
                $this->addAttendeeIdToWhereConditions($request),
1450
                $this->_add_event_id_to_where_conditions($request),
1451
                $this->_add_category_id_to_where_conditions($request),
1452
                $this->_add_datetime_id_to_where_conditions($request),
1453
                $this->_add_registration_status_to_where_conditions($request),
1454
                $this->_add_date_to_where_conditions($request),
1455
                $this->_add_search_to_where_conditions($request)
1456
            ),
1457
            $request
1458
        );
1459
    }
1460
1461
1462
    /**
1463
     * Sets up the orderby for the registrations query.
1464
     *
1465
     * @return array
1466
     */
1467
    protected function _get_orderby_for_registrations_query()
1468
    {
1469
        $orderby_field = ! empty($this->_req_data['orderby'])
1470
            ? sanitize_text_field($this->_req_data['orderby'])
1471
            : '';
1472
        switch ($orderby_field) {
1473
            case '_REG_ID':
1474
                $orderby = array('REG_ID');
1475
                break;
1476
            case '_Reg_status':
1477
                $orderby = array('STS_ID');
1478
                break;
1479
            case 'ATT_fname':
1480
                $orderby = array('Attendee.ATT_fname', 'Attendee.ATT_lname');
1481
                break;
1482
            case 'ATT_lname':
1483
                $orderby = array('Attendee.ATT_lname', 'Attendee.ATT_fname');
1484
                break;
1485
            case 'event_name':
1486
                $orderby = array('Event.EVT_name');
1487
                break;
1488
            case 'DTT_EVT_start':
1489
                $orderby = array('Event.Datetime.DTT_EVT_start');
1490
                break;
1491
            default: //'REG_date'
1492
                $orderby = array('REG_date');
1493
        }
1494
1495
        //order
1496
        $order = ! empty($this->_req_data['order'])
1497
            ? sanitize_text_field($this->_req_data['order'])
1498
            : 'DESC';
1499
        $orderby = array_combine(
1500
            $orderby,
1501
            array_fill(0, count($orderby), $order)
1502
        );
1503
        //because there are many registrations with the same date, define
1504
        //a secondary way to order them, otherwise MySQL seems to be a bit random
1505
        if (empty($orderby['REG_ID'])) {
1506
            $orderby['REG_ID'] = $order;
1507
        }
1508
        return array('order_by' => $orderby);
1509
    }
1510
1511
1512
    /**
1513
     * Sets up the limit for the registrations query.
1514
     *
1515
     * @param $per_page
1516
     * @return array
1517
     */
1518
    protected function _get_limit($per_page)
1519
    {
1520
        $current_page = ! empty($this->_req_data['paged'])
1521
            ? absint($this->_req_data['paged'])
1522
            : 1;
1523
        $per_page     = ! empty($this->_req_data['perpage'])
1524
            ? $this->_req_data['perpage']
1525
            : $per_page;
1526
1527
        //-1 means return all results so get out if that's set.
1528
        if ((int)$per_page === -1) {
1529
            return array();
1530
        }
1531
        $per_page = absint($per_page);
1532
        $offset   = ($current_page - 1) * $per_page;
1533
        return array('limit' => array($offset, $per_page));
1534
    }
1535
1536
1537
    public function get_registration_status_array()
1538
    {
1539
        return self::$_reg_status;
1540
    }
1541
1542
1543
1544
1545
    /***************************************        REGISTRATION DETAILS        ***************************************/
1546
    /**
1547
     *        generates HTML for the View Registration Details Admin page
1548
     *
1549
     * @access protected
1550
     * @return void
1551
     * @throws DomainException
1552
     * @throws EE_Error
1553
     * @throws InvalidArgumentException
1554
     * @throws InvalidDataTypeException
1555
     * @throws InvalidInterfaceException
1556
     * @throws EntityNotFoundException
1557
     */
1558
    protected function _registration_details()
1559
    {
1560
        $this->_template_args = array();
1561
        $this->_set_registration_object();
1562
        if (is_object($this->_registration)) {
1563
            $transaction                                   = $this->_registration->transaction()
1564
                ? $this->_registration->transaction()
1565
                : EE_Transaction::new_instance();
1566
            $this->_session                                = $transaction->session_data();
1567
            $event_id                                      = $this->_registration->event_ID();
1568
            $this->_template_args['reg_nmbr']['value']     = $this->_registration->ID();
1569
            $this->_template_args['reg_nmbr']['label']     = esc_html__('Registration Number', 'event_espresso');
1570
            $this->_template_args['reg_datetime']['value'] = $this->_registration->get_i18n_datetime('REG_date');
1571
            $this->_template_args['reg_datetime']['label'] = esc_html__('Date', 'event_espresso');
1572
            $this->_template_args['grand_total']           = $transaction->total();
1573
            $this->_template_args['currency_sign']         = EE_Registry::instance()->CFG->currency->sign;
1574
            // link back to overview
1575
            $this->_template_args['reg_overview_url']            = REG_ADMIN_URL;
1576
            $this->_template_args['registration']                = $this->_registration;
1577
            $this->_template_args['filtered_registrations_link'] = EE_Admin_Page::add_query_args_and_nonce(
1578
                array(
1579
                    'action'   => 'default',
1580
                    'event_id' => $event_id,
1581
                ),
1582
                REG_ADMIN_URL
1583
            );
1584
            $this->_template_args['filtered_transactions_link']  = EE_Admin_Page::add_query_args_and_nonce(
1585
                array(
1586
                    'action' => 'default',
1587
                    'EVT_ID' => $event_id,
1588
                    'page'   => 'espresso_transactions',
1589
                ),
1590
                admin_url('admin.php')
1591
            );
1592
            $this->_template_args['event_link']                  = EE_Admin_Page::add_query_args_and_nonce(
1593
                array(
1594
                    'page'   => 'espresso_events',
1595
                    'action' => 'edit',
1596
                    'post'   => $event_id,
1597
                ),
1598
                admin_url('admin.php')
1599
            );
1600
            //next and previous links
1601
            $next_reg                                      = $this->_registration->next(
1602
                null,
1603
                array(),
1604
                'REG_ID'
1605
            );
1606
            $this->_template_args['next_registration']     = $next_reg
1607
                ? $this->_next_link(
1608
                    EE_Admin_Page::add_query_args_and_nonce(
1609
                        array(
1610
                            'action'  => 'view_registration',
1611
                            '_REG_ID' => $next_reg['REG_ID'],
1612
                        ),
1613
                        REG_ADMIN_URL
1614
                    ),
1615
                    'dashicons dashicons-arrow-right ee-icon-size-22'
1616
                )
1617
                : '';
1618
            $previous_reg                                  = $this->_registration->previous(
1619
                null,
1620
                array(),
1621
                'REG_ID'
1622
            );
1623
            $this->_template_args['previous_registration'] = $previous_reg
1624
                ? $this->_previous_link(
1625
                    EE_Admin_Page::add_query_args_and_nonce(
1626
                        array(
1627
                            'action'  => 'view_registration',
1628
                            '_REG_ID' => $previous_reg['REG_ID'],
1629
                        ),
1630
                        REG_ADMIN_URL
1631
                    ),
1632
                    'dashicons dashicons-arrow-left ee-icon-size-22'
1633
                )
1634
                : '';
1635
            // grab header
1636
            $template_path                             = REG_TEMPLATE_PATH . 'reg_admin_details_header.template.php';
1637
            $this->_template_args['REG_ID']            = $this->_registration->ID();
1638
            $this->_template_args['admin_page_header'] = EEH_Template::display_template(
1639
                $template_path,
1640
                $this->_template_args,
1641
                true
1642
            );
1643
        } else {
1644
            $this->_template_args['admin_page_header'] = $this->display_espresso_notices();
1645
        }
1646
        // the details template wrapper
1647
        $this->display_admin_page_with_sidebar();
1648
    }
1649
1650
1651
    protected function _registration_details_metaboxes()
1652
    {
1653
        do_action('AHEE__Registrations_Admin_Page___registration_details_metabox__start', $this);
1654
        $this->_set_registration_object();
1655
        $attendee = $this->_registration instanceof EE_Registration ? $this->_registration->attendee() : null;
1656
        add_meta_box('edit-reg-status-mbox', esc_html__('Registration Status', 'event_espresso'),
1657
            array($this, 'set_reg_status_buttons_metabox'), $this->wp_page_slug, 'normal', 'high');
0 ignored issues
show
Bug introduced by
The property wp_page_slug does not seem to exist. Did you mean page_slug?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
1658
        add_meta_box('edit-reg-details-mbox', esc_html__('Registration Details', 'event_espresso'),
1659
            array($this, '_reg_details_meta_box'), $this->wp_page_slug, 'normal', 'high');
0 ignored issues
show
Bug introduced by
The property wp_page_slug does not seem to exist. Did you mean page_slug?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
1660
        if ($attendee instanceof EE_Attendee
1661
            && EE_Registry::instance()->CAP->current_user_can(
1662
                'ee_edit_registration',
1663
                'edit-reg-questions-mbox',
1664
                $this->_registration->ID()
1665
            )
1666
        ) {
1667
            add_meta_box(
1668
                'edit-reg-questions-mbox',
1669
                esc_html__('Registration Form Answers', 'event_espresso'),
1670
                array($this, '_reg_questions_meta_box'),
1671
                $this->wp_page_slug,
0 ignored issues
show
Bug introduced by
The property wp_page_slug does not seem to exist. Did you mean page_slug?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
1672
                'normal',
1673
                'high'
1674
            );
1675
        }
1676
        add_meta_box(
1677
            'edit-reg-registrant-mbox',
1678
            esc_html__('Contact Details', 'event_espresso'),
1679
            array($this, '_reg_registrant_side_meta_box'),
1680
            $this->wp_page_slug,
0 ignored issues
show
Bug introduced by
The property wp_page_slug does not seem to exist. Did you mean page_slug?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
1681
            'side',
1682
            'high'
1683
        );
1684
        if ($this->_registration->group_size() > 1) {
1685
            add_meta_box(
1686
                'edit-reg-attendees-mbox',
1687
                esc_html__('Other Registrations in this Transaction', 'event_espresso'),
1688
                array($this, '_reg_attendees_meta_box'),
1689
                $this->wp_page_slug,
0 ignored issues
show
Bug introduced by
The property wp_page_slug does not seem to exist. Did you mean page_slug?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
1690
                'normal',
1691
                'high'
1692
            );
1693
        }
1694
    }
1695
1696
1697
    /**
1698
     * set_reg_status_buttons_metabox
1699
     *
1700
     * @access protected
1701
     * @return string
1702
     * @throws \EE_Error
1703
     */
1704
    public function set_reg_status_buttons_metabox()
1705
    {
1706
        $this->_set_registration_object();
1707
        $change_reg_status_form = $this->_generate_reg_status_change_form();
1708
        echo $change_reg_status_form->form_open(
1709
            self::add_query_args_and_nonce(
1710
                array(
1711
                    'action' => 'change_reg_status',
1712
                ),
1713
                REG_ADMIN_URL
1714
            )
1715
        );
1716
        echo $change_reg_status_form->get_html();
1717
        echo $change_reg_status_form->form_close();
1718
    }
1719
1720
1721
    /**
1722
     * @return EE_Form_Section_Proper
1723
     * @throws EE_Error
1724
     * @throws InvalidArgumentException
1725
     * @throws InvalidDataTypeException
1726
     * @throws InvalidInterfaceException
1727
     * @throws \EventEspresso\core\exceptions\EntityNotFoundException
1728
     */
1729
    protected function _generate_reg_status_change_form()
1730
    {
1731
        return new EE_Form_Section_Proper(array(
1732
            'name'            => 'reg_status_change_form',
1733
            'html_id'         => 'reg-status-change-form',
1734
            'layout_strategy' => new EE_Admin_Two_Column_Layout(),
1735
            'subsections'     => array(
1736
                'return'             => new EE_Hidden_Input(array(
1737
                    'name'    => 'return',
1738
                    'default' => 'view_registration',
1739
                )),
1740
                'REG_ID'             => new EE_Hidden_Input(array(
1741
                    'name'    => 'REG_ID',
1742
                    'default' => $this->_registration->ID(),
1743
                )),
1744
                'current_status'     => new EE_Form_Section_HTML(
1745
                    EEH_HTML::tr(
1746
                        EEH_HTML::th(
1747
                            EEH_HTML::label(
1748
                                EEH_HTML::strong(esc_html__('Current Registration Status', 'event_espresso')
1749
                                )
1750
                            )
1751
                        )
1752
                        . EEH_HTML::td(
1753
                            EEH_HTML::strong(
1754
                                $this->_registration->pretty_status(),
1755
                                '',
1756
                                'status-' . $this->_registration->status_ID(),
1757
                                'line-height: 1em; font-size: 1.5em; font-weight: bold;'
1758
                            )
1759
                        )
1760
                    )
1761
                ),
1762
                'reg_status'         => new EE_Select_Input(
1763
                    $this->_get_reg_statuses(),
1764
                    array(
1765
                        'html_label_text' => esc_html__('Change Registration Status to', 'event_espresso'),
1766
                        'default'         => $this->_registration->status_ID(),
1767
                    )
1768
                ),
1769
                'send_notifications' => new EE_Yes_No_Input(
1770
                    array(
1771
                        'html_label_text' => esc_html__('Send Related Messages', 'event_espresso'),
1772
                        'default'         => false,
1773
                        'html_help_text'  => esc_html__(
1774
                            'If set to "Yes", then the related messages will be sent to the registrant.',
1775
                            'event_espresso'
1776
                        ),
1777
                    )
1778
                ),
1779
                'submit'             => new EE_Submit_Input(
1780
                    array(
1781
                        'html_class'      => 'button-primary',
1782
                        'html_label_text' => '&nbsp;',
1783
                        'default'         => esc_html__('Update Registration Status', 'event_espresso'),
1784
                    )
1785
                ),
1786
            ),
1787
        ));
1788
    }
1789
1790
1791
    /**
1792
     * Returns an array of all the buttons for the various statuses and switch status actions
1793
     *
1794
     * @return array
1795
     * @throws EE_Error
1796
     * @throws InvalidArgumentException
1797
     * @throws InvalidDataTypeException
1798
     * @throws InvalidInterfaceException
1799
     * @throws EntityNotFoundException
1800
     */
1801
    protected function _get_reg_statuses()
1802
    {
1803
        $reg_status_array = EEM_Registration::instance()->reg_status_array();
1804
        unset ($reg_status_array[EEM_Registration::status_id_incomplete]);
1805
        // get current reg status
1806
        $current_status = $this->_registration->status_ID();
1807
        // is registration for free event? This will determine whether to display the pending payment option
1808
        if (
1809
            $current_status !== EEM_Registration::status_id_pending_payment
1810
            && EEH_Money::compare_floats($this->_registration->ticket()->price(), 0.00)
1811
        ) {
1812
            unset($reg_status_array[EEM_Registration::status_id_pending_payment]);
1813
        }
1814
        return EEM_Status::instance()->localized_status($reg_status_array, false, 'sentence');
1815
    }
1816
1817
1818
    /**
1819
     * This method is used when using _REG_ID from request which may or may not be an array of reg_ids.
1820
     *
1821
     * @param bool $status REG status given for changing registrations to.
1822
     * @param bool $notify Whether to send messages notifications or not.
1823
     * @return array (array with reg_id(s) updated and whether update was successful.
1824
     * @throws EE_Error
1825
     * @throws InvalidArgumentException
1826
     * @throws InvalidDataTypeException
1827
     * @throws InvalidInterfaceException
1828
     * @throws ReflectionException
1829
     * @throws RuntimeException
1830
     * @throws EntityNotFoundException
1831
     */
1832
    protected function _set_registration_status_from_request($status = false, $notify = false)
1833
    {
1834
        if (isset($this->_req_data['reg_status_change_form'])) {
1835
            $REG_IDs = isset($this->_req_data['reg_status_change_form']['REG_ID'])
1836
                ? (array)$this->_req_data['reg_status_change_form']['REG_ID']
1837
                : array();
1838
        } else {
1839
            $REG_IDs = isset($this->_req_data['_REG_ID'])
1840
                ? (array)$this->_req_data['_REG_ID']
1841
                : array();
1842
        }
1843
        // sanitize $REG_IDs
1844
        $REG_IDs = array_map('absint', $REG_IDs);
1845
        // and remove empty entries
1846
        $REG_IDs = array_filter($REG_IDs);
1847
1848
        $result = $this->_set_registration_status($REG_IDs, $status, $notify);
1849
1850
        /**
1851
         * Set and filter $_req_data['_REG_ID'] for any potential future messages notifications.
1852
         * Currently this value is used downstream by the _process_resend_registration method.
1853
         *
1854
         * @param int|array                $registration_ids The registration ids that have had their status changed successfully.
1855
         * @param bool                     $status           The status registrations were changed to.
1856
         * @param bool                     $success          If the status was changed successfully for all registrations.
1857
         * @param Registrations_Admin_Page $admin_page_object
1858
         */
1859
        $this->_req_data['_REG_ID'] = apply_filters(
1860
            'FHEE__Registrations_Admin_Page___set_registration_status_from_request__REG_IDs',
1861
            $result['REG_ID'],
1862
            $status,
1863
            $result['success'],
1864
            $this
1865
        );
1866
1867
        //notify?
1868
        if ($notify
1869
            && $result['success']
1870
            && ! empty($this->_req_data['_REG_ID'])
1871
            && EE_Registry::instance()->CAP->current_user_can(
1872
                'ee_send_message',
1873
                'espresso_registrations_resend_registration'
1874
            )
1875
        ) {
1876
            $this->_process_resend_registration();
1877
        }
1878
        return $result;
1879
    }
1880
1881
1882
    /**
1883
     * Set the registration status for the given reg_id (which may or may not be an array, it gets typecast to an
1884
     * array). Note, this method does NOT take care of possible notifications.  That is required by calling code.
1885
     *
1886
     * @param array  $REG_IDs
1887
     * @param string $status
1888
     * @param bool   $notify  Used to indicate whether notification was requested or not.  This determines the context
1889
     *                        slug sent with setting the registration status.
1890
     * @return array (an array with 'success' key representing whether status change was successful, and 'REG_ID' as
1891
     * @throws EE_Error
1892
     * @throws InvalidArgumentException
1893
     * @throws InvalidDataTypeException
1894
     * @throws InvalidInterfaceException
1895
     * @throws ReflectionException
1896
     * @throws RuntimeException
1897
     * @throws EntityNotFoundException
1898
     */
1899
    protected function _set_registration_status($REG_IDs = array(), $status = '', $notify = false)
1900
    {
1901
        $success = false;
1902
        // typecast $REG_IDs
1903
        $REG_IDs = (array)$REG_IDs;
1904
        if ( ! empty($REG_IDs)) {
1905
            $success = true;
1906
            // set default status if none is passed
1907
            $status = $status ? $status : EEM_Registration::status_id_pending_payment;
1908
            $status_context = $notify
1909
                ? Domain::CONTEXT_REGISTRATION_STATUS_CHANGE_REGISTRATION_ADMIN_NOTIFY
1910
                : Domain::CONTEXT_REGISTRATION_STATUS_CHANGE_REGISTRATION_ADMIN;
1911
            //loop through REG_ID's and change status
1912
            foreach ($REG_IDs as $REG_ID) {
1913
                $registration = EEM_Registration::instance()->get_one_by_ID($REG_ID);
1914
                if ($registration instanceof EE_Registration) {
1915
                    $registration->set_status(
1916
                        $status,
1917
                        false,
1918
                        new Context(
1919
                            $status_context,
1920
                            esc_html__(
1921
                                'Manually triggered status change on a Registration Admin Page route.',
1922
                                'event_espresso'
1923
                            )
1924
                        )
1925
                    );
1926
                    $result = $registration->save();
1927
                    // verifying explicit fails because update *may* just return 0 for 0 rows affected
1928
                    $success = $result !== false ? $success : false;
1929
                }
1930
            }
1931
        }
1932
1933
        //return $success and processed registrations
1934
        return array('REG_ID' => $REG_IDs, 'success' => $success);
1935
    }
1936
1937
1938
    /**
1939
     * Common logic for setting up success message and redirecting to appropriate route
1940
     *
1941
     * @param  string $STS_ID status id for the registration changed to
1942
     * @param   bool  $notify indicates whether the _set_registration_status_from_request does notifications or not.
1943
     * @return void
1944
     * @throws EE_Error
1945
     */
1946
    protected function _reg_status_change_return($STS_ID, $notify = false)
1947
    {
1948
        $result  = ! empty($STS_ID) ? $this->_set_registration_status_from_request($STS_ID, $notify)
1949
            : array('success' => false);
1950
        $success = isset($result['success']) && $result['success'];
1951
        //setup success message
1952
        if ($success) {
1953
            if (is_array($result['REG_ID']) && count($result['REG_ID']) === 1) {
1954
                $msg = sprintf(esc_html__('Registration status has been set to %s', 'event_espresso'),
1955
                    EEH_Template::pretty_status($STS_ID, false, 'lower'));
1956
            } else {
1957
                $msg = sprintf(esc_html__('Registrations have been set to %s.', 'event_espresso'),
1958
                    EEH_Template::pretty_status($STS_ID, false, 'lower'));
1959
            }
1960
            EE_Error::add_success($msg);
1961
        } else {
1962
            EE_Error::add_error(
1963
                esc_html__(
1964
                    'Something went wrong, and the status was not changed',
1965
                    'event_espresso'
1966
                ), __FILE__, __LINE__, __FUNCTION__
1967
            );
1968
        }
1969
        if (isset($this->_req_data['return']) && $this->_req_data['return'] == 'view_registration') {
1970
            $route = array('action' => 'view_registration', '_REG_ID' => reset($result['REG_ID']));
1971
        } else {
1972
            $route = array('action' => 'default');
1973
        }
1974
        //unset nonces
1975
        foreach ($this->_req_data as $ref => $value) {
1976
            if (strpos($ref, 'nonce') !== false) {
1977
                unset($this->_req_data[$ref]);
1978
                continue;
1979
            }
1980
            $value                 = is_array($value) ? array_map('urlencode', $value) : urlencode($value);
1981
            $this->_req_data[$ref] = $value;
1982
        }
1983
        //merge request vars so that the reloaded list table contains any existing filter query params
1984
        $route = array_merge($this->_req_data, $route);
1985
        $this->_redirect_after_action($success, '', '', $route, true);
1986
    }
1987
1988
1989
    /**
1990
     * incoming reg status change from reg details page.
1991
     *
1992
     * @return void
1993
     */
1994
    protected function _change_reg_status()
1995
    {
1996
        $this->_req_data['return'] = 'view_registration';
1997
        //set notify based on whether the send notifications toggle is set or not
1998
        $notify = ! empty($this->_req_data['reg_status_change_form']['send_notifications']);
1999
        //$notify = ! empty( $this->_req_data['txn_reg_status_change']['send_notifications'] );
2000
        $this->_req_data['reg_status_change_form']['reg_status'] = isset($this->_req_data['reg_status_change_form']['reg_status'])
2001
            ? $this->_req_data['reg_status_change_form']['reg_status'] : '';
2002
        switch ($this->_req_data['reg_status_change_form']['reg_status']) {
2003
            case EEM_Registration::status_id_approved :
2004
            case EEH_Template::pretty_status(EEM_Registration::status_id_approved, false, 'sentence') :
2005
                $this->approve_registration($notify);
2006
                break;
2007
            case EEM_Registration::status_id_pending_payment :
2008
            case EEH_Template::pretty_status(EEM_Registration::status_id_pending_payment, false, 'sentence') :
2009
                $this->pending_registration($notify);
2010
                break;
2011
            case EEM_Registration::status_id_not_approved :
2012
            case EEH_Template::pretty_status(EEM_Registration::status_id_not_approved, false, 'sentence') :
2013
                $this->not_approve_registration($notify);
2014
                break;
2015
            case EEM_Registration::status_id_declined :
2016
            case EEH_Template::pretty_status(EEM_Registration::status_id_declined, false, 'sentence') :
2017
                $this->decline_registration($notify);
2018
                break;
2019
            case EEM_Registration::status_id_cancelled :
2020
            case EEH_Template::pretty_status(EEM_Registration::status_id_cancelled, false, 'sentence') :
2021
                $this->cancel_registration($notify);
2022
                break;
2023
            case EEM_Registration::status_id_wait_list :
2024
            case EEH_Template::pretty_status(EEM_Registration::status_id_wait_list, false, 'sentence') :
2025
                $this->wait_list_registration($notify);
2026
                break;
2027
            case EEM_Registration::status_id_incomplete :
2028
            default :
2029
                $result['success'] = false;
0 ignored issues
show
Coding Style Comprehensibility introduced by
$result was never initialized. Although not strictly required by PHP, it is generally a good practice to add $result = array(); before regardless.

Adding an explicit array definition is generally preferable to implicit array definition as it guarantees a stable state of the code.

Let’s take a look at an example:

foreach ($collection as $item) {
    $myArray['foo'] = $item->getFoo();

    if ($item->hasBar()) {
        $myArray['bar'] = $item->getBar();
    }

    // do something with $myArray
}

As you can see in this example, the array $myArray is initialized the first time when the foreach loop is entered. You can also see that the value of the bar key is only written conditionally; thus, its value might result from a previous iteration.

This might or might not be intended. To make your intention clear, your code more readible and to avoid accidental bugs, we recommend to add an explicit initialization $myArray = array() either outside or inside the foreach loop.

Loading history...
2030
                unset($this->_req_data['return']);
2031
                $this->_reg_status_change_return('', false);
2032
                break;
2033
        }
2034
    }
2035
2036
2037
    /**
2038
     * Callback for bulk action routes.
2039
     * Note: although we could just register the singular route callbacks for each bulk action route as well, this
2040
     * method was chosen so there is one central place all the registration status bulk actions are going through.
2041
     * Potentially, this provides an easier place to locate logic that is specific to these bulk actions (as opposed to
2042
     * when an action is happening on just a single registration).
2043
     * @param      $action
2044
     * @param bool $notify
2045
     */
2046
    protected function bulk_action_on_registrations($action, $notify = false) {
2047
        do_action(
2048
            'AHEE__Registrations_Admin_Page__bulk_action_on_registrations__before_execution',
2049
            $this,
2050
            $action,
2051
            $notify
2052
        );
2053
        $method = $action . '_registration';
2054
        if (method_exists($this, $method)) {
2055
            $this->$method($notify);
2056
        }
2057
    }
2058
2059
2060
    /**
2061
     * approve_registration
2062
     *
2063
     * @access protected
2064
     * @param bool $notify whether or not to notify the registrant about their approval.
2065
     * @return void
2066
     */
2067
    protected function approve_registration($notify = false)
2068
    {
2069
        $this->_reg_status_change_return(EEM_Registration::status_id_approved, $notify);
2070
    }
2071
2072
2073
    /**
2074
     *        decline_registration
2075
     *
2076
     * @access protected
2077
     * @param bool $notify whether or not to notify the registrant about their status change.
2078
     * @return void
2079
     */
2080
    protected function decline_registration($notify = false)
2081
    {
2082
        $this->_reg_status_change_return(EEM_Registration::status_id_declined, $notify);
2083
    }
2084
2085
2086
    /**
2087
     *        cancel_registration
2088
     *
2089
     * @access protected
2090
     * @param bool $notify whether or not to notify the registrant about their status change.
2091
     * @return void
2092
     */
2093
    protected function cancel_registration($notify = false)
2094
    {
2095
        $this->_reg_status_change_return(EEM_Registration::status_id_cancelled, $notify);
2096
    }
2097
2098
2099
    /**
2100
     *        not_approve_registration
2101
     *
2102
     * @access protected
2103
     * @param bool $notify whether or not to notify the registrant about their status change.
2104
     * @return void
2105
     */
2106
    protected function not_approve_registration($notify = false)
2107
    {
2108
        $this->_reg_status_change_return(EEM_Registration::status_id_not_approved, $notify);
2109
    }
2110
2111
2112
    /**
2113
     *        decline_registration
2114
     *
2115
     * @access protected
2116
     * @param bool $notify whether or not to notify the registrant about their status change.
2117
     * @return void
2118
     */
2119
    protected function pending_registration($notify = false)
2120
    {
2121
        $this->_reg_status_change_return(EEM_Registration::status_id_pending_payment, $notify);
2122
    }
2123
2124
2125
    /**
2126
     * waitlist_registration
2127
     *
2128
     * @access protected
2129
     * @param bool $notify whether or not to notify the registrant about their status change.
2130
     * @return void
2131
     */
2132
    protected function wait_list_registration($notify = false)
2133
    {
2134
        $this->_reg_status_change_return(EEM_Registration::status_id_wait_list, $notify);
2135
    }
2136
2137
2138
    /**
2139
     *        generates HTML for the Registration main meta box
2140
     *
2141
     * @access public
2142
     * @return void
2143
     * @throws DomainException
2144
     * @throws EE_Error
2145
     * @throws InvalidArgumentException
2146
     * @throws InvalidDataTypeException
2147
     * @throws InvalidInterfaceException
2148
     * @throws ReflectionException
2149
     * @throws EntityNotFoundException
2150
     */
2151
    public function _reg_details_meta_box()
2152
    {
2153
        EEH_Autoloader::register_line_item_display_autoloaders();
2154
        EEH_Autoloader::register_line_item_filter_autoloaders();
2155
        EE_Registry::instance()->load_helper('Line_Item');
2156
        $transaction    = $this->_registration->transaction() ? $this->_registration->transaction()
2157
            : EE_Transaction::new_instance();
2158
        $this->_session = $transaction->session_data();
2159
        $filters        = new EE_Line_Item_Filter_Collection();
2160
        //$filters->add( new EE_Non_Zero_Line_Item_Filter() );
2161
        $filters->add(new EE_Single_Registration_Line_Item_Filter($this->_registration));
2162
        $line_item_filter_processor              = new EE_Line_Item_Filter_Processor($filters,
2163
            $transaction->total_line_item());
2164
        $filtered_line_item_tree                 = $line_item_filter_processor->process();
2165
        $line_item_display                       = new EE_Line_Item_Display('reg_admin_table',
2166
            'EE_Admin_Table_Registration_Line_Item_Display_Strategy');
2167
        $this->_template_args['line_item_table'] = $line_item_display->display_line_item(
2168
            $filtered_line_item_tree,
2169
            array('EE_Registration' => $this->_registration)
2170
        );
2171
        $attendee                                = $this->_registration->attendee();
2172
        if (EE_Registry::instance()->CAP->current_user_can(
2173
            'ee_read_transaction',
2174
            'espresso_transactions_view_transaction'
2175
        )) {
2176
            $this->_template_args['view_transaction_button'] = EEH_Template::get_button_or_link(
2177
                EE_Admin_Page::add_query_args_and_nonce(
2178
                    array(
2179
                        'action' => 'view_transaction',
2180
                        'TXN_ID' => $transaction->ID(),
2181
                    ),
2182
                    TXN_ADMIN_URL
2183
                ),
2184
                esc_html__(' View Transaction', 'event_espresso'),
2185
                'button secondary-button right',
2186
                'dashicons dashicons-cart'
2187
            );
2188
        } else {
2189
            $this->_template_args['view_transaction_button'] = '';
2190
        }
2191
        if ($attendee instanceof EE_Attendee
2192
            && EE_Registry::instance()->CAP->current_user_can(
2193
                'ee_send_message',
2194
                'espresso_registrations_resend_registration'
2195
            )
2196
        ) {
2197
            $this->_template_args['resend_registration_button'] = EEH_Template::get_button_or_link(
2198
                EE_Admin_Page::add_query_args_and_nonce(
2199
                    array(
2200
                        'action'      => 'resend_registration',
2201
                        '_REG_ID'     => $this->_registration->ID(),
2202
                        'redirect_to' => 'view_registration',
2203
                    ),
2204
                    REG_ADMIN_URL
2205
                ),
2206
                esc_html__(' Resend Registration', 'event_espresso'),
2207
                'button secondary-button right',
2208
                'dashicons dashicons-email-alt'
2209
            );
2210
        } else {
2211
            $this->_template_args['resend_registration_button'] = '';
2212
        }
2213
        $this->_template_args['currency_sign'] = EE_Registry::instance()->CFG->currency->sign;
2214
        $payment                               = $transaction->get_first_related('Payment');
2215
        $payment                               = ! $payment instanceof EE_Payment
2216
            ? EE_Payment::new_instance()
2217
            : $payment;
2218
        $payment_method                        = $payment->get_first_related('Payment_Method');
2219
        $payment_method                        = ! $payment_method instanceof EE_Payment_Method
2220
            ? EE_Payment_Method::new_instance()
2221
            : $payment_method;
2222
        $reg_details                           = array(
2223
            'payment_method'       => $payment_method->name(),
2224
            'response_msg'         => $payment->gateway_response(),
2225
            'registration_id'      => $this->_registration->get('REG_code'),
2226
            'registration_session' => $this->_registration->session_ID(),
2227
            'ip_address'           => isset($this->_session['ip_address']) ? $this->_session['ip_address'] : '',
2228
            'user_agent'           => isset($this->_session['user_agent']) ? $this->_session['user_agent'] : '',
2229
        );
2230
        if (isset($reg_details['registration_id'])) {
2231
            $this->_template_args['reg_details']['registration_id']['value'] = $reg_details['registration_id'];
2232
            $this->_template_args['reg_details']['registration_id']['label'] = esc_html__(
2233
                'Registration ID',
2234
                'event_espresso'
2235
            );
2236
            $this->_template_args['reg_details']['registration_id']['class'] = 'regular-text';
2237
        }
2238
        if (isset($reg_details['payment_method'])) {
2239
            $this->_template_args['reg_details']['payment_method']['value'] = $reg_details['payment_method'];
2240
            $this->_template_args['reg_details']['payment_method']['label'] = esc_html__(
2241
                'Most Recent Payment Method',
2242
                'event_espresso'
2243
            );
2244
            $this->_template_args['reg_details']['payment_method']['class'] = 'regular-text';
2245
            $this->_template_args['reg_details']['response_msg']['value']   = $reg_details['response_msg'];
2246
            $this->_template_args['reg_details']['response_msg']['label']   = esc_html__(
2247
                'Payment method response',
2248
                'event_espresso'
2249
            );
2250
            $this->_template_args['reg_details']['response_msg']['class']   = 'regular-text';
2251
        }
2252
        $this->_template_args['reg_details']['registration_session']['value'] = $reg_details['registration_session'];
2253
        $this->_template_args['reg_details']['registration_session']['label'] = esc_html__(
2254
            'Registration Session',
2255
            'event_espresso'
2256
        );
2257
        $this->_template_args['reg_details']['registration_session']['class'] = 'regular-text';
2258
        $this->_template_args['reg_details']['ip_address']['value']           = $reg_details['ip_address'];
2259
        $this->_template_args['reg_details']['ip_address']['label']           = esc_html__(
2260
            'Registration placed from IP',
2261
            'event_espresso'
2262
        );
2263
        $this->_template_args['reg_details']['ip_address']['class']           = 'regular-text';
2264
        $this->_template_args['reg_details']['user_agent']['value']           = $reg_details['user_agent'];
2265
        $this->_template_args['reg_details']['user_agent']['label']           = esc_html__('Registrant User Agent',
2266
            'event_espresso');
2267
        $this->_template_args['reg_details']['user_agent']['class']           = 'large-text';
2268
        $this->_template_args['event_link']                                   = EE_Admin_Page::add_query_args_and_nonce(
2269
            array(
2270
                'action'   => 'default',
2271
                'event_id' => $this->_registration->event_ID(),
2272
            ),
2273
            REG_ADMIN_URL
2274
        );
2275
        $this->_template_args['REG_ID']                                       = $this->_registration->ID();
2276
        $this->_template_args['event_id']                                     = $this->_registration->event_ID();
2277
        $template_path                                                        =
2278
            REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_reg_details.template.php';
2279
        echo EEH_Template::display_template($template_path, $this->_template_args, true);
2280
    }
2281
2282
2283
    /**
2284
     * generates HTML for the Registration Questions meta box.
2285
     * If pre-4.8.32.rc.000 hooks are used, uses old methods (with its filters),
2286
     * otherwise uses new forms system
2287
     *
2288
     * @access public
2289
     * @return void
2290
     * @throws DomainException
2291
     * @throws EE_Error
2292
     */
2293
    public function _reg_questions_meta_box()
2294
    {
2295
        //allow someone to override this method entirely
2296
        if (apply_filters('FHEE__Registrations_Admin_Page___reg_questions_meta_box__do_default', true, $this,
2297
            $this->_registration)) {
2298
            $form                                              = $this->_get_reg_custom_questions_form(
2299
                $this->_registration->ID()
2300
            );
2301
            $this->_template_args['att_questions']             = count($form->subforms()) > 0
2302
                ? $form->get_html_and_js()
2303
                : '';
2304
            $this->_template_args['reg_questions_form_action'] = 'edit_registration';
2305
            $this->_template_args['REG_ID']                    = $this->_registration->ID();
2306
            $template_path                                     =
2307
                REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_reg_questions.template.php';
2308
            echo EEH_Template::display_template($template_path, $this->_template_args, true);
2309
        }
2310
    }
2311
2312
2313
    /**
2314
     * form_before_question_group
2315
     *
2316
     * @deprecated    as of 4.8.32.rc.000
2317
     * @access        public
2318
     * @param        string $output
2319
     * @return        string
2320
     */
2321
    public function form_before_question_group($output)
2322
    {
2323
        EE_Error::doing_it_wrong(
2324
            __CLASS__ . '::' . __FUNCTION__,
2325
            esc_html__(
2326
                'This method would have been protected but was used on a filter callback so needed to be public. Please discontinue usage as it will be removed soon.',
2327
                'event_espresso'
2328
            ),
2329
            '4.8.32.rc.000'
2330
        );
2331
        return '
2332
	<table class="form-table ee-width-100">
2333
		<tbody>
2334
			';
2335
    }
2336
2337
2338
    /**
2339
     * form_after_question_group
2340
     *
2341
     * @deprecated    as of 4.8.32.rc.000
2342
     * @access        public
2343
     * @param        string $output
2344
     * @return        string
2345
     */
2346
    public function form_after_question_group($output)
2347
    {
2348
        EE_Error::doing_it_wrong(
2349
            __CLASS__ . '::' . __FUNCTION__,
2350
            esc_html__(
2351
                'This method would have been protected but was used on a filter callback so needed to be public. Please discontinue usage as it will be removed soon.',
2352
                'event_espresso'
2353
            ),
2354
            '4.8.32.rc.000'
2355
        );
2356
        return '
2357
			<tr class="hide-if-no-js">
2358
				<th> </th>
2359
				<td class="reg-admin-edit-attendee-question-td">
2360
					<a class="reg-admin-edit-attendee-question-lnk" href="#" title="'
2361
               . esc_attr__('click to edit question', 'event_espresso')
2362
               . '">
2363
						<span class="reg-admin-edit-question-group-spn lt-grey-txt">'
2364
               . esc_html__('edit the above question group', 'event_espresso')
2365
               . '</span>
2366
						<div class="dashicons dashicons-edit"></div>
2367
					</a>
2368
				</td>
2369
			</tr>
2370
		</tbody>
2371
	</table>
2372
';
2373
    }
2374
2375
2376
    /**
2377
     * form_form_field_label_wrap
2378
     *
2379
     * @deprecated    as of 4.8.32.rc.000
2380
     * @access        public
2381
     * @param        string $label
2382
     * @return        string
2383
     */
2384 View Code Duplication
    public function form_form_field_label_wrap($label)
2385
    {
2386
        EE_Error::doing_it_wrong(
2387
            __CLASS__ . '::' . __FUNCTION__,
2388
            esc_html__(
2389
                'This method would have been protected but was used on a filter callback so needed to be public. Please discontinue usage as it will be removed soon.',
2390
                'event_espresso'
2391
            ),
2392
            '4.8.32.rc.000'
2393
        );
2394
        return '
2395
			<tr>
2396
				<th>
2397
					' . $label . '
2398
				</th>';
2399
    }
2400
2401
2402
    /**
2403
     * form_form_field_input__wrap
2404
     *
2405
     * @deprecated    as of 4.8.32.rc.000
2406
     * @access        public
2407
     * @param        string $input
2408
     * @return        string
2409
     */
2410 View Code Duplication
    public function form_form_field_input__wrap($input)
2411
    {
2412
        EE_Error::doing_it_wrong(
2413
            __CLASS__ . '::' . __FUNCTION__,
2414
            esc_html__(
2415
                'This method would have been protected but was used on a filter callback so needed to be public. Please discontinue usage as it will be removed soon.',
2416
                'event_espresso'
2417
            ),
2418
            '4.8.32.rc.000'
2419
        );
2420
        return '
2421
				<td class="reg-admin-attendee-questions-input-td disabled-input">
2422
					' . $input . '
2423
				</td>
2424
			</tr>';
2425
    }
2426
2427
2428
    /**
2429
     * Updates the registration's custom questions according to the form info, if the form is submitted.
2430
     * If it's not a post, the "view_registrations" route will be called next on the SAME request
2431
     * to display the page
2432
     *
2433
     * @access protected
2434
     * @return void
2435
     * @throws EE_Error
2436
     */
2437
    protected function _update_attendee_registration_form()
2438
    {
2439
        do_action('AHEE__Registrations_Admin_Page___update_attendee_registration_form__start', $this);
2440
        if ($_SERVER['REQUEST_METHOD'] == 'POST') {
2441
            $REG_ID  = isset($this->_req_data['_REG_ID']) ? absint($this->_req_data['_REG_ID']) : false;
2442
            $success = $this->_save_reg_custom_questions_form($REG_ID);
2443
            if ($success) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $success of type integer|false is loosely compared to true; this is ambiguous if the integer can be zero. You might want to explicitly use !== null instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For integer values, zero is a special case, in particular the following results might be unexpected:

0   == false // true
0   == null  // true
123 == false // false
123 == null  // false

// It is often better to use strict comparison
0 === false // false
0 === null  // false
Loading history...
2444
                $what  = esc_html__('Registration Form', 'event_espresso');
2445
                $route = $REG_ID ? array('action' => 'view_registration', '_REG_ID' => $REG_ID)
2446
                    : array('action' => 'default');
2447
                $this->_redirect_after_action($success, $what, esc_html__('updated', 'event_espresso'), $route);
2448
            }
2449
        }
2450
    }
2451
2452
2453
    /**
2454
     * Gets the form for saving registrations custom questions (if done
2455
     * previously retrieves the cached form object, which may have validation errors in it)
2456
     *
2457
     * @param int $REG_ID
2458
     * @return EE_Registration_Custom_Questions_Form
2459
     * @throws EE_Error
2460
     * @throws InvalidArgumentException
2461
     * @throws InvalidDataTypeException
2462
     * @throws InvalidInterfaceException
2463
     */
2464
    protected function _get_reg_custom_questions_form($REG_ID)
2465
    {
2466
        if ( ! $this->_reg_custom_questions_form) {
2467
            require_once(REG_ADMIN . 'form_sections' . DS . 'EE_Registration_Custom_Questions_Form.form.php');
2468
            $this->_reg_custom_questions_form = new EE_Registration_Custom_Questions_Form(
2469
                EEM_Registration::instance()->get_one_by_ID($REG_ID)
2470
            );
2471
            $this->_reg_custom_questions_form->_construct_finalize(null, null);
2472
        }
2473
        return $this->_reg_custom_questions_form;
2474
    }
2475
2476
2477
    /**
2478
     * Saves
2479
     *
2480
     * @access private
2481
     * @param bool $REG_ID
2482
     * @return bool
2483
     * @throws EE_Error
2484
     * @throws InvalidArgumentException
2485
     * @throws InvalidDataTypeException
2486
     * @throws InvalidInterfaceException
2487
     */
2488
    private function _save_reg_custom_questions_form($REG_ID = false)
2489
    {
2490
        if ( ! $REG_ID) {
2491
            EE_Error::add_error(
2492
                esc_html__(
2493
                    'An error occurred. No registration ID was received.', 'event_espresso'),
2494
                __FILE__, __FUNCTION__, __LINE__
2495
            );
2496
        }
2497
        $form = $this->_get_reg_custom_questions_form($REG_ID);
2498
        $form->receive_form_submission($this->_req_data);
2499
        $success = false;
2500
        if ($form->is_valid()) {
2501
            foreach ($form->subforms() as $question_group_id => $question_group_form) {
2502
                foreach ($question_group_form->inputs() as $question_id => $input) {
2503
                    $where_conditions    = array(
2504
                        'QST_ID' => $question_id,
2505
                        'REG_ID' => $REG_ID,
2506
                    );
2507
                    $possibly_new_values = array(
2508
                        'ANS_value' => $input->normalized_value(),
2509
                    );
2510
                    $answer              = EEM_Answer::instance()->get_one(array($where_conditions));
2511
                    if ($answer instanceof EE_Answer) {
2512
                        $success = $answer->save($possibly_new_values);
2513
                    } else {
2514
                        //insert it then
2515
                        $cols_n_vals = array_merge($where_conditions, $possibly_new_values);
2516
                        $answer      = EE_Answer::new_instance($cols_n_vals);
2517
                        $success     = $answer->save();
2518
                    }
2519
                }
2520
            }
2521
        } else {
2522
            EE_Error::add_error($form->get_validation_error_string(), __FILE__, __FUNCTION__, __LINE__);
2523
        }
2524
        return $success;
2525
    }
2526
2527
2528
    /**
2529
     *        generates HTML for the Registration main meta box
2530
     *
2531
     * @access public
2532
     * @return void
2533
     * @throws DomainException
2534
     * @throws EE_Error
2535
     * @throws InvalidArgumentException
2536
     * @throws InvalidDataTypeException
2537
     * @throws InvalidInterfaceException
2538
     */
2539
    public function _reg_attendees_meta_box()
2540
    {
2541
        $REG = EEM_Registration::instance();
2542
        //get all other registrations on this transaction, and cache
2543
        //the attendees for them so we don't have to run another query using force_join
2544
        $registrations                           = $REG->get_all(array(
2545
            array(
2546
                'TXN_ID' => $this->_registration->transaction_ID(),
2547
                'REG_ID' => array('!=', $this->_registration->ID()),
2548
            ),
2549
            'force_join' => array('Attendee'),
2550
        ));
2551
        $this->_template_args['attendees']       = array();
2552
        $this->_template_args['attendee_notice'] = '';
2553
        if (empty($registrations)
2554
            || (is_array($registrations)
2555
                && ! EEH_Array::get_one_item_from_array($registrations))
2556
        ) {
2557
            EE_Error::add_error(
2558
                esc_html__(
2559
                    'There are no records attached to this registration. Something may have gone wrong with the registration',
2560
                    'event_espresso'
2561
                ), __FILE__, __FUNCTION__, __LINE__
2562
            );
2563
            $this->_template_args['attendee_notice'] = EE_Error::get_notices();
2564
        } else {
2565
            $att_nmbr = 1;
2566
            foreach ($registrations as $registration) {
2567
                /* @var $registration EE_Registration */
2568
                $attendee                                                    = $registration->attendee()
2569
                    ? $registration->attendee()
2570
                    : EEM_Attendee::instance()
2571
                                  ->create_default_object();
2572
                $this->_template_args['attendees'][$att_nmbr]['STS_ID']      = $registration->status_ID();
2573
                $this->_template_args['attendees'][$att_nmbr]['fname']       = $attendee->fname();
2574
                $this->_template_args['attendees'][$att_nmbr]['lname']       = $attendee->lname();
2575
                $this->_template_args['attendees'][$att_nmbr]['email']       = $attendee->email();
2576
                $this->_template_args['attendees'][$att_nmbr]['final_price'] = $registration->final_price();
2577
                $this->_template_args['attendees'][$att_nmbr]['address']     = implode(
2578
                    ', ',
2579
                    $attendee->full_address_as_array()
2580
                );
2581
                $this->_template_args['attendees'][$att_nmbr]['att_link']    = self::add_query_args_and_nonce(
2582
                    array(
2583
                        'action' => 'edit_attendee',
2584
                        'post'   => $attendee->ID(),
2585
                    ),
2586
                    REG_ADMIN_URL
2587
                );
2588
                $this->_template_args['attendees'][$att_nmbr]['event_name']  = $registration->event_obj()->name();
2589
                $att_nmbr++;
2590
            }
2591
            $this->_template_args['currency_sign'] = EE_Registry::instance()->CFG->currency->sign;
2592
        }
2593
        $template_path = REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_attendees.template.php';
2594
        echo EEH_Template::display_template($template_path, $this->_template_args, true);
2595
    }
2596
2597
2598
    /**
2599
     *        generates HTML for the Edit Registration side meta box
2600
     *
2601
     * @access public
2602
     * @return void
2603
     * @throws DomainException
2604
     * @throws EE_Error
2605
     * @throws InvalidArgumentException
2606
     * @throws InvalidDataTypeException
2607
     * @throws InvalidInterfaceException
2608
     */
2609
    public function _reg_registrant_side_meta_box()
2610
    {
2611
        /*@var $attendee EE_Attendee */
2612
        $att_check = $this->_registration->attendee();
2613
        $attendee  = $att_check instanceof EE_Attendee ? $att_check : EEM_Attendee::instance()->create_default_object();
2614
        //now let's determine if this is not the primary registration.  If it isn't then we set the
2615
        //primary_registration object for reference BUT ONLY if the Attendee object loaded is not the same as the
2616
        //primary registration object (that way we know if we need to show create button or not)
2617
        if ( ! $this->_registration->is_primary_registrant()) {
2618
            $primary_registration = $this->_registration->get_primary_registration();
2619
            $primary_attendee     = $primary_registration instanceof EE_Registration ? $primary_registration->attendee()
2620
                : null;
2621
            if ( ! $primary_attendee instanceof EE_Attendee || $attendee->ID() !== $primary_attendee->ID()) {
2622
                //in here?  This means the displayed registration is not the primary registrant but ALREADY HAS its own
2623
                //custom attendee object so let's not worry about the primary reg.
2624
                $primary_registration = null;
2625
            }
2626
        } else {
2627
            $primary_registration = null;
2628
        }
2629
        $this->_template_args['ATT_ID']            = $attendee->ID();
2630
        $this->_template_args['fname']             = $attendee->fname();
2631
        $this->_template_args['lname']             = $attendee->lname();
2632
        $this->_template_args['email']             = $attendee->email();
2633
        $this->_template_args['phone']             = $attendee->phone();
2634
        $this->_template_args['formatted_address'] = EEH_Address::format($attendee);
2635
        //edit link
2636
        $this->_template_args['att_edit_link']  = EE_Admin_Page::add_query_args_and_nonce(array(
2637
            'action' => 'edit_attendee',
2638
            'post'   => $attendee->ID(),
2639
        ), REG_ADMIN_URL);
2640
        $this->_template_args['att_edit_label'] = esc_html__('View/Edit Contact', 'event_espresso');
2641
        //create link
2642
        $this->_template_args['create_link']  = $primary_registration instanceof EE_Registration
2643
            ? EE_Admin_Page::add_query_args_and_nonce(array(
2644
                'action'  => 'duplicate_attendee',
2645
                '_REG_ID' => $this->_registration->ID(),
2646
            ), REG_ADMIN_URL) : '';
2647
        $this->_template_args['create_label'] = esc_html__('Create Contact', 'event_espresso');
2648
        $this->_template_args['att_check']    = $att_check;
2649
        $template_path                        = REG_TEMPLATE_PATH . 'reg_admin_details_side_meta_box_registrant.template.php';
2650
        echo EEH_Template::display_template($template_path, $this->_template_args, true);
2651
    }
2652
2653
2654
    /**
2655
     * trash or restore registrations
2656
     *
2657
     * @param  boolean $trash whether to archive or restore
2658
     * @return void
2659
     * @throws EE_Error
2660
     * @throws InvalidArgumentException
2661
     * @throws InvalidDataTypeException
2662
     * @throws InvalidInterfaceException
2663
     * @throws RuntimeException
2664
     * @access protected
2665
     */
2666
    protected function _trash_or_restore_registrations($trash = true)
2667
    {
2668
        //if empty _REG_ID then get out because there's nothing to do
2669 View Code Duplication
        if (empty($this->_req_data['_REG_ID'])) {
2670
            EE_Error::add_error(
2671
                sprintf(
2672
                    esc_html__(
2673
                        'In order to %1$s registrations you must select which ones you wish to %1$s by clicking the checkboxes.',
2674
                        'event_espresso'
2675
                    ),
2676
                    $trash ? 'trash' : 'restore'
2677
                ),
2678
                __FILE__, __LINE__, __FUNCTION__
2679
            );
2680
            $this->_redirect_after_action(false, '', '', array(), true);
2681
        }
2682
        $success = 0;
2683
        $overwrite_msgs = false;
2684
        //Checkboxes
2685
        if ( ! is_array($this->_req_data['_REG_ID'])) {
2686
            $this->_req_data['_REG_ID'] = array($this->_req_data['_REG_ID']);
2687
        }
2688
        $reg_count = count($this->_req_data['_REG_ID']);
2689
        // cycle thru checkboxes
2690
        foreach ($this->_req_data['_REG_ID'] as $REG_ID) {
2691
            /** @var EE_Registration $REG */
2692
            $REG = EEM_Registration::instance()->get_one_by_ID($REG_ID);
2693
            $payments = $REG->registration_payments();
2694
            if (! empty($payments)) {
2695
                $name = $REG->attendee() instanceof EE_Attendee
2696
                    ? $REG->attendee()->full_name()
2697
                    : esc_html__('Unknown Attendee', 'event_espresso');
2698
                $overwrite_msgs = true;
2699
                EE_Error::add_error(
2700
                    sprintf(
2701
                        esc_html__(
2702
                            'The registration for %s could not be trashed because it has payments attached to the related transaction.  If you wish to trash this registration you must first delete the payments on the related transaction.',
2703
                            'event_espresso'
2704
                        ),
2705
                        $name
2706
                    ),
2707
                    __FILE__, __FUNCTION__, __LINE__
2708
                );
2709
                //can't trash this registration because it has payments.
2710
                continue;
2711
            }
2712
            $updated = $trash ? $REG->delete() : $REG->restore();
2713
            if ($updated) {
2714
                $success++;
2715
            }
2716
        }
2717
        $this->_redirect_after_action(
2718
            $success === $reg_count, // were ALL registrations affected?
2719
            $success > 1
2720
                ? esc_html__('Registrations', 'event_espresso')
2721
                : esc_html__('Registration', 'event_espresso'),
2722
            $trash
2723
                ? esc_html__('moved to the trash', 'event_espresso')
2724
                : esc_html__('restored', 'event_espresso'),
2725
            array('action' => 'default'),
2726
            $overwrite_msgs
2727
        );
2728
    }
2729
2730
2731
    /**
2732
     * This is used to permanently delete registrations.  Note, this will handle not only deleting permanently the
2733
     * registration but also.
2734
     * 1. Removing relations to EE_Attendee
2735
     * 2. Deleting permanently the related transaction, but ONLY if all related registrations to the transaction are
2736
     * ALSO trashed.
2737
     * 3. Deleting permanently any related Line items but only if the above conditions are met.
2738
     * 4. Removing relationships between all tickets and the related registrations
2739
     * 5. Deleting permanently any related Answers (and the answers for other related registrations that were deleted.)
2740
     * 6. Deleting permanently any related Checkins.
2741
     *
2742
     * @return void
2743
     * @throws EE_Error
2744
     * @throws InvalidArgumentException
2745
     * @throws InvalidDataTypeException
2746
     * @throws InvalidInterfaceException
2747
     */
2748
    protected function _delete_registrations()
2749
    {
2750
        $REG_MDL = EEM_Registration::instance();
2751
        $success = 1;
2752
        //Checkboxes
2753
        if ( ! empty($this->_req_data['_REG_ID']) && is_array($this->_req_data['_REG_ID'])) {
2754
            // if array has more than one element than success message should be plural
2755
            $success = count($this->_req_data['_REG_ID']) > 1 ? 2 : 1;
2756
            // cycle thru checkboxes
2757
            while (list($ind, $REG_ID) = each($this->_req_data['_REG_ID'])) {
0 ignored issues
show
Unused Code introduced by
The assignment to $ind is unused. Consider omitting it like so list($first,,$third).

This checks looks for assignemnts to variables using the list(...) function, where not all assigned variables are subsequently used.

Consider the following code example.

<?php

function returnThreeValues() {
    return array('a', 'b', 'c');
}

list($a, $b, $c) = returnThreeValues();

print $a . " - " . $c;

Only the variables $a and $c are used. There was no need to assign $b.

Instead, the list call could have been.

list($a,, $c) = returnThreeValues();
Loading history...
2758
                $REG = $REG_MDL->get_one_by_ID($REG_ID);
2759
                if ( ! $REG instanceof EE_Registration) {
2760
                    continue;
2761
                }
2762
                $deleted = $this->_delete_registration($REG);
2763
                if ( ! $deleted) {
2764
                    $success = 0;
2765
                }
2766
            }
2767
        } else {
2768
            // grab single id and delete
2769
            $REG_ID  = $this->_req_data['_REG_ID'];
2770
            $REG     = $REG_MDL->get_one_by_ID($REG_ID);
2771
            $deleted = $this->_delete_registration($REG);
2772
            if ( ! $deleted) {
2773
                $success = 0;
2774
            }
2775
        }
2776
        $what        = $success > 1
2777
            ? esc_html__('Registrations', 'event_espresso')
2778
            : esc_html__('Registration', 'event_espresso');
2779
        $action_desc = esc_html__('permanently deleted.', 'event_espresso');
2780
        $this->_redirect_after_action(
2781
            $success,
2782
            $what,
2783
            $action_desc,
2784
            array('action' => 'default'),
2785
            true
2786
        );
2787
    }
2788
2789
2790
    /**
2791
     * handles the permanent deletion of a registration.  See comments with _delete_registrations() for details on what
2792
     * models get affected.
2793
     *
2794
     * @param  EE_Registration $REG registration to be deleted permenantly
2795
     * @return bool true = successful deletion, false = fail.
2796
     * @throws EE_Error
2797
     */
2798
    protected function _delete_registration(EE_Registration $REG)
2799
    {
2800
        //first we start with the transaction... ultimately, we WILL not delete permanently if there are any related
2801
        //registrations on the transaction that are NOT trashed.
2802
        $TXN         = $REG->get_first_related('Transaction');
2803
        $REGS        = $TXN->get_many_related('Registration');
2804
        $all_trashed = true;
2805
        foreach ($REGS as $registration) {
2806
            if ( ! $registration->get('REG_deleted')) {
2807
                $all_trashed = false;
2808
            }
2809
        }
2810
        if ( ! $all_trashed) {
2811
            EE_Error::add_error(
2812
                esc_html__(
2813
                    'Unable to permanently delete this registration. Before this registration can be permanently deleted, all registrations made in the same transaction must be trashed as well.  These registrations will be permanently deleted in the same action.',
2814
                    'event_espresso'
2815
                ),
2816
                __FILE__, __FUNCTION__, __LINE__
2817
            );
2818
            return false;
2819
        }
2820
        //k made it here so that means we can delete all the related transactions and their answers (but let's do them
2821
        //separately from THIS one).
2822
        foreach ($REGS as $registration) {
2823
            //delete related answers
2824
            $registration->delete_related_permanently('Answer');
2825
            //remove relationship to EE_Attendee (but we ALWAYS leave the contact record intact)
2826
            $attendee = $registration->get_first_related('Attendee');
2827
            if ($attendee instanceof EE_Attendee) {
2828
                $registration->_remove_relation_to($attendee, 'Attendee');
2829
            }
2830
            //now remove relationships to tickets on this registration.
2831
            $registration->_remove_relations('Ticket');
2832
            //now delete permanently the checkins related to this registration.
2833
            $registration->delete_related_permanently('Checkin');
2834
            if ($registration->ID() === $REG->ID()) {
2835
                continue;
2836
            } //we don't want to delete permanently the existing registration just yet.
2837
            //remove relation to transaction for these registrations if NOT the existing registrations
2838
            $registration->_remove_relations('Transaction');
2839
            //delete permanently any related messages.
2840
            $registration->delete_related_permanently('Message');
2841
            //now delete this registration permanently
2842
            $registration->delete_permanently();
2843
        }
2844
        //now all related registrations on the transaction are handled.  So let's just handle this registration itself
2845
        // (the transaction and line items should be all that's left).
2846
        // delete the line items related to the transaction for this registration.
2847
        $TXN->delete_related_permanently('Line_Item');
2848
        //we need to remove all the relationships on the transaction
2849
        $TXN->delete_related_permanently('Payment');
2850
        $TXN->delete_related_permanently('Extra_Meta');
2851
        $TXN->delete_related_permanently('Message');
2852
        //now we can delete this REG permanently (and the transaction of course)
2853
        $REG->delete_related_permanently('Transaction');
2854
        return $REG->delete_permanently();
2855
    }
2856
2857
2858
    /**
2859
     *    generates HTML for the Register New Attendee Admin page
2860
     *
2861
     * @access private
2862
     * @throws DomainException
2863
     * @throws EE_Error
2864
     */
2865
    public function new_registration()
2866
    {
2867
        if ( ! $this->_set_reg_event()) {
2868
            throw new EE_Error(
2869
                esc_html__(
2870
                    'Unable to continue with registering because there is no Event ID in the request',
2871
                    'event_espresso'
2872
                )
2873
            );
2874
        }
2875
        EE_Registry::instance()->REQ->set_espresso_page(true);
2876
        // gotta start with a clean slate if we're not coming here via ajax
2877
        if ( ! defined('DOING_AJAX')
2878
             && ( ! isset($this->_req_data['processing_registration']) || isset($this->_req_data['step_error']))
2879
        ) {
2880
            EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
2881
        }
2882
        $this->_template_args['event_name'] = '';
2883
        // event name
2884
        if ($this->_reg_event) {
2885
            $this->_template_args['event_name'] = $this->_reg_event->name();
2886
            $edit_event_url                     = self::add_query_args_and_nonce(array(
2887
                'action' => 'edit',
2888
                'post'   => $this->_reg_event->ID(),
2889
            ), EVENTS_ADMIN_URL);
2890
            $edit_event_lnk                     = '<a href="'
2891
                                                  . $edit_event_url
2892
                                                  . '" title="'
2893
                                                  . esc_attr__('Edit ', 'event_espresso')
2894
                                                  . $this->_reg_event->name()
2895
                                                  . '">'
2896
                                                  . esc_html__('Edit Event', 'event_espresso')
2897
                                                  . '</a>';
2898
            $this->_template_args['event_name'] .= ' <span class="admin-page-header-edit-lnk not-bold">'
2899
                                                   . $edit_event_lnk
2900
                                                   . '</span>';
2901
        }
2902
        $this->_template_args['step_content'] = $this->_get_registration_step_content();
2903
        if (defined('DOING_AJAX')) {
2904
            $this->_return_json();
2905
        }
2906
        // grab header
2907
        $template_path                              =
2908
            REG_TEMPLATE_PATH . 'reg_admin_register_new_attendee.template.php';
2909
        $this->_template_args['admin_page_content'] = EEH_Template::display_template($template_path,
2910
            $this->_template_args, true);
2911
        //$this->_set_publish_post_box_vars( NULL, FALSE, FALSE, NULL, FALSE );
2912
        // the details template wrapper
2913
        $this->display_admin_page_with_sidebar();
2914
    }
2915
2916
2917
    /**
2918
     * This returns the content for a registration step
2919
     *
2920
     * @access protected
2921
     * @return string html
2922
     * @throws DomainException
2923
     * @throws EE_Error
2924
     * @throws InvalidArgumentException
2925
     * @throws InvalidDataTypeException
2926
     * @throws InvalidInterfaceException
2927
     */
2928
    protected function _get_registration_step_content()
2929
    {
2930
        if (isset($_COOKIE['ee_registration_added']) && $_COOKIE['ee_registration_added']) {
2931
            $warning_msg = sprintf(
2932
                esc_html__(
2933
                    '%2$sWARNING!!!%3$s%1$sPlease do not use the back button to return to this page for the purpose of adding another registration.%1$sThis can result in lost and/or corrupted data.%1$sIf you wish to add another registration, then please click the%1$s%7$s"Add Another New Registration to Event"%8$s button%1$son the Transaction details page, after you are redirected.%1$s%1$s%4$s redirecting in %5$s seconds %6$s',
2934
                    'event_espresso'
2935
                ),
2936
                '<br />',
2937
                '<h3 class="important-notice">',
2938
                '</h3>',
2939
                '<div class="float-right">',
2940
                '<span id="redirect_timer" class="important-notice">30</span>',
2941
                '</div>',
2942
                '<b>',
2943
                '</b>'
2944
            );
2945
            return '
2946
	<div id="ee-add-reg-back-button-dv"><p>' . $warning_msg . '</p></div>
2947
	<script >
2948
		// WHOAH !!! it appears that someone is using the back button from the Transaction admin page
2949
		// after just adding a new registration... we gotta try to put a stop to that !!!
2950
		var timer = 30;
2951
		setInterval( function () {
2952
			jQuery("#redirect_timer").html( parseInt( timer ) );
2953
	        if ( --timer < 0 ) {
2954
	            window.history.forward()
2955
	        }
2956
	    }, 800 );
2957
	</script >';
2958
        }
2959
        $template_args = array(
2960
            'title'                    => '',
2961
            'content'                  => '',
2962
            'step_button_text'         => '',
2963
            'show_notification_toggle' => false,
2964
        );
2965
        //to indicate we're processing a new registration
2966
        $hidden_fields = array(
2967
            'processing_registration' => array(
2968
                'type'  => 'hidden',
2969
                'value' => 0,
2970
            ),
2971
            'event_id'                => array(
2972
                'type'  => 'hidden',
2973
                'value' => $this->_reg_event->ID(),
2974
            ),
2975
        );
2976
        //if the cart is empty then we know we're at step one so we'll display ticket selector
2977
        $cart = EE_Registry::instance()->SSN->cart();
2978
        $step = ! $cart instanceof EE_Cart ? 'ticket' : 'questions';
2979
        switch ($step) {
2980
            case 'ticket' :
2981
                $hidden_fields['processing_registration']['value'] = 1;
2982
                $template_args['title']                            = esc_html__(
2983
                    'Step One: Select the Ticket for this registration',
2984
                    'event_espresso'
2985
                );
2986
                $template_args['content']                          =
2987
                    EED_Ticket_Selector::instance()->display_ticket_selector($this->_reg_event);
2988
                $template_args['step_button_text']                 = esc_html__(
2989
                    'Add Tickets and Continue to Registrant Details',
2990
                    'event_espresso'
2991
                );
2992
                $template_args['show_notification_toggle']         = false;
2993
                break;
2994
            case 'questions' :
2995
                $hidden_fields['processing_registration']['value'] = 2;
2996
                $template_args['title']                            = esc_html__(
2997
                    'Step Two: Add Registrant Details for this Registration',
2998
                    'event_espresso'
2999
                );
3000
                //in theory we should be able to run EED_SPCO at this point because the cart should have been setup
3001
                // properly by the first process_reg_step run.
3002
                $template_args['content']                  =
3003
                    EED_Single_Page_Checkout::registration_checkout_for_admin();
3004
                $template_args['step_button_text']         = esc_html__(
3005
                    'Save Registration and Continue to Details',
3006
                    'event_espresso'
3007
                );
3008
                $template_args['show_notification_toggle'] = true;
3009
                break;
3010
        }
3011
        //we come back to the process_registration_step route.
3012
        $this->_set_add_edit_form_tags('process_reg_step', $hidden_fields);
3013
        return EEH_Template::display_template(
3014
            REG_TEMPLATE_PATH . 'reg_admin_register_new_attendee_step_content.template.php',
3015
            $template_args,
3016
            true
3017
        );
3018
    }
3019
3020
3021
    /**
3022
     *        set_reg_event
3023
     *
3024
     * @access private
3025
     * @return bool
3026
     * @throws EE_Error
3027
     * @throws InvalidArgumentException
3028
     * @throws InvalidDataTypeException
3029
     * @throws InvalidInterfaceException
3030
     */
3031
    private function _set_reg_event()
3032
    {
3033
        if (is_object($this->_reg_event)) {
3034
            return true;
3035
        }
3036
        $EVT_ID = (! empty($this->_req_data['event_id'])) ? absint($this->_req_data['event_id']) : false;
3037
        if ( ! $EVT_ID) {
3038
            return false;
3039
        }
3040
        $this->_reg_event = EEM_Event::instance()->get_one_by_ID($EVT_ID);
3041
        return true;
3042
    }
3043
3044
3045
    /**
3046
     * process_reg_step
3047
     *
3048
     * @access        public
3049
     * @return string
3050
     * @throws DomainException
3051
     * @throws EE_Error
3052
     * @throws InvalidArgumentException
3053
     * @throws InvalidDataTypeException
3054
     * @throws InvalidInterfaceException
3055
     * @throws ReflectionException
3056
     * @throws RuntimeException
3057
     */
3058
    public function process_reg_step()
3059
    {
3060
        EE_System::do_not_cache();
3061
        $this->_set_reg_event();
3062
        EE_Registry::instance()->REQ->set_espresso_page(true);
3063
        EE_Registry::instance()->REQ->set('uts', time());
3064
        //what step are we on?
3065
        $cart = EE_Registry::instance()->SSN->cart();
3066
        $step = ! $cart instanceof EE_Cart ? 'ticket' : 'questions';
3067
        //if doing ajax then we need to verify the nonce
3068 View Code Duplication
        if (defined('DOING_AJAX')) {
3069
            $nonce = isset($this->_req_data[$this->_req_nonce])
3070
                ? sanitize_text_field($this->_req_data[$this->_req_nonce]) : '';
3071
            $this->_verify_nonce($nonce, $this->_req_nonce);
3072
        }
3073
        switch ($step) {
3074
            case 'ticket' :
3075
                //process ticket selection
3076
                $success = EED_Ticket_Selector::instance()->process_ticket_selections();
3077
                if ($success) {
3078
                    EE_Error::add_success(
3079
                        esc_html__(
3080
                            'Tickets Selected. Now complete the registration.',
3081
                            'event_espresso'
3082
                        )
3083
                    );
3084
                } else {
3085
                    $query_args['step_error'] = $this->_req_data['step_error'] = true;
0 ignored issues
show
Coding Style Comprehensibility introduced by
$query_args was never initialized. Although not strictly required by PHP, it is generally a good practice to add $query_args = array(); before regardless.

Adding an explicit array definition is generally preferable to implicit array definition as it guarantees a stable state of the code.

Let’s take a look at an example:

foreach ($collection as $item) {
    $myArray['foo'] = $item->getFoo();

    if ($item->hasBar()) {
        $myArray['bar'] = $item->getBar();
    }

    // do something with $myArray
}

As you can see in this example, the array $myArray is initialized the first time when the foreach loop is entered. You can also see that the value of the bar key is only written conditionally; thus, its value might result from a previous iteration.

This might or might not be intended. To make your intention clear, your code more readible and to avoid accidental bugs, we recommend to add an explicit initialization $myArray = array() either outside or inside the foreach loop.

Loading history...
3086
                }
3087 View Code Duplication
                if (defined('DOING_AJAX')) {
3088
                    $this->new_registration(); //display next step
3089
                } else {
3090
                    $query_args = array(
3091
                        'action'                  => 'new_registration',
3092
                        'processing_registration' => 1,
3093
                        'event_id'                => $this->_reg_event->ID(),
3094
                        'uts'                     => time(),
3095
                    );
3096
                    $this->_redirect_after_action(
3097
                        false,
3098
                        '',
3099
                        '',
3100
                        $query_args,
3101
                        true
3102
                    );
3103
                }
3104
                break;
3105
            case 'questions' :
3106
                if (! isset(
3107
                    $this->_req_data['txn_reg_status_change'],
3108
                    $this->_req_data['txn_reg_status_change']['send_notifications'])
3109
                ) {
3110
                    add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_false', 15);
3111
                }
3112
                //process registration
3113
                $transaction = EED_Single_Page_Checkout::instance()->process_registration_from_admin();
3114
                if ($cart instanceof EE_Cart) {
3115
                    $grand_total = $cart->get_cart_grand_total();
3116
                    if ($grand_total instanceof EE_Line_Item) {
3117
                        $grand_total->save_this_and_descendants_to_txn();
3118
                    }
3119
                }
3120 View Code Duplication
                if ( ! $transaction instanceof EE_Transaction) {
3121
                    $query_args = array(
3122
                        'action'                  => 'new_registration',
3123
                        'processing_registration' => 2,
3124
                        'event_id'                => $this->_reg_event->ID(),
3125
                        'uts'                     => time(),
3126
                    );
3127
                    if (defined('DOING_AJAX')) {
3128
                        //display registration form again because there are errors (maybe validation?)
3129
                        $this->new_registration();
3130
                        return;
3131
                    } else {
3132
                        $this->_redirect_after_action(
3133
                            false,
3134
                            '',
3135
                            '',
3136
                            $query_args,
3137
                            true
3138
                        );
3139
                        return;
3140
                    }
3141
                }
3142
                // maybe update status, and make sure to save transaction if not done already
3143
                if ( ! $transaction->update_status_based_on_total_paid()) {
3144
                    $transaction->save();
3145
                }
3146
                EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
3147
                $this->_req_data = array();
3148
                $query_args      = array(
3149
                    'action'        => 'redirect_to_txn',
3150
                    'TXN_ID'        => $transaction->ID(),
3151
                    'EVT_ID'        => $this->_reg_event->ID(),
3152
                    'event_name'    => urlencode($this->_reg_event->name()),
3153
                    'redirect_from' => 'new_registration',
3154
                );
3155
                $this->_redirect_after_action(false, '', '', $query_args, true);
3156
                break;
3157
        }
3158
        //what are you looking here for?  Should be nothing to do at this point.
3159
    }
3160
3161
3162
    /**
3163
     * redirect_to_txn
3164
     *
3165
     * @access public
3166
     * @return void
3167
     * @throws EE_Error
3168
     * @throws InvalidArgumentException
3169
     * @throws InvalidDataTypeException
3170
     * @throws InvalidInterfaceException
3171
     */
3172
    public function redirect_to_txn()
3173
    {
3174
        EE_System::do_not_cache();
3175
        EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
3176
        $query_args = array(
3177
            'action' => 'view_transaction',
3178
            'TXN_ID' => isset($this->_req_data['TXN_ID']) ? absint($this->_req_data['TXN_ID']) : 0,
3179
            'page'   => 'espresso_transactions',
3180
        );
3181
        if (isset($this->_req_data['EVT_ID'], $this->_req_data['redirect_from'])) {
3182
            $query_args['EVT_ID']        = $this->_req_data['EVT_ID'];
3183
            $query_args['event_name']    = urlencode($this->_req_data['event_name']);
3184
            $query_args['redirect_from'] = $this->_req_data['redirect_from'];
3185
        }
3186
        EE_Error::add_success(
3187
            esc_html__(
3188
                'Registration Created.  Please review the transaction and add any payments as necessary',
3189
                'event_espresso'
3190
            )
3191
        );
3192
        $this->_redirect_after_action(false, '', '', $query_args, true);
3193
    }
3194
3195
3196
    /**
3197
     *        generates HTML for the Attendee Contact List
3198
     *
3199
     * @access protected
3200
     * @return void
3201
     */
3202
    protected function _attendee_contact_list_table()
3203
    {
3204
        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
3205
        $this->_search_btn_label = esc_html__('Contacts', 'event_espresso');
3206
        $this->display_admin_list_table_page_with_no_sidebar();
3207
    }
3208
3209
3210
    /**
3211
     *        get_attendees
3212
     *
3213
     * @param      $per_page
3214
     * @param bool $count whether to return count or data.
3215
     * @param bool $trash
3216
     * @return array
3217
     * @throws EE_Error
3218
     * @throws InvalidArgumentException
3219
     * @throws InvalidDataTypeException
3220
     * @throws InvalidInterfaceException
3221
     * @access public
3222
     */
3223
    public function get_attendees($per_page, $count = false, $trash = false)
3224
    {
3225
        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
3226
        require_once(REG_ADMIN . 'EE_Attendee_Contact_List_Table.class.php');
3227
        $ATT_MDL                    = EEM_Attendee::instance();
3228
        $this->_req_data['orderby'] = ! empty($this->_req_data['orderby']) ? $this->_req_data['orderby'] : '';
3229
        switch ($this->_req_data['orderby']) {
3230
            case 'ATT_ID':
3231
                $orderby = 'ATT_ID';
3232
                break;
3233
            case 'ATT_fname':
3234
                $orderby = 'ATT_fname';
3235
                break;
3236
            case 'ATT_email':
3237
                $orderby = 'ATT_email';
3238
                break;
3239
            case 'ATT_city':
3240
                $orderby = 'ATT_city';
3241
                break;
3242
            case 'STA_ID':
3243
                $orderby = 'STA_ID';
3244
                break;
3245
            case 'CNT_ID':
3246
                $orderby = 'CNT_ID';
3247
                break;
3248
            case 'Registration_Count':
3249
                $orderby = 'Registration_Count';
3250
                break;
3251
            default:
3252
                $orderby = 'ATT_lname';
3253
        }
3254
        $sort         = (isset($this->_req_data['order']) && ! empty($this->_req_data['order']))
3255
            ? $this->_req_data['order']
3256
            : 'ASC';
3257
        $current_page = isset($this->_req_data['paged']) && ! empty($this->_req_data['paged'])
3258
            ? $this->_req_data['paged']
3259
            : 1;
3260
        $per_page     = isset($per_page) && ! empty($per_page) ? $per_page : 10;
3261
        $per_page     = isset($this->_req_data['perpage']) && ! empty($this->_req_data['perpage'])
3262
            ? $this->_req_data['perpage']
3263
            : $per_page;
3264
        $_where       = array();
3265
        if ( ! empty($this->_req_data['s'])) {
3266
            $sstr         = '%' . $this->_req_data['s'] . '%';
3267
            $_where['OR'] = array(
3268
                'Registration.Event.EVT_name'       => array('LIKE', $sstr),
3269
                'Registration.Event.EVT_desc'       => array('LIKE', $sstr),
3270
                'Registration.Event.EVT_short_desc' => array('LIKE', $sstr),
3271
                'ATT_fname'                         => array('LIKE', $sstr),
3272
                'ATT_lname'                         => array('LIKE', $sstr),
3273
                'ATT_short_bio'                     => array('LIKE', $sstr),
3274
                'ATT_email'                         => array('LIKE', $sstr),
3275
                'ATT_address'                       => array('LIKE', $sstr),
3276
                'ATT_address2'                      => array('LIKE', $sstr),
3277
                'ATT_city'                          => array('LIKE', $sstr),
3278
                'Country.CNT_name'                  => array('LIKE', $sstr),
3279
                'State.STA_name'                    => array('LIKE', $sstr),
3280
                'ATT_phone'                         => array('LIKE', $sstr),
3281
                'Registration.REG_final_price'      => array('LIKE', $sstr),
3282
                'Registration.REG_code'             => array('LIKE', $sstr),
3283
                'Registration.REG_group_size'       => array('LIKE', $sstr),
3284
            );
3285
        }
3286
        $offset = ($current_page - 1) * $per_page;
3287
        $limit  = $count ? null : array($offset, $per_page);
3288
        $query_args = array(
3289
            $_where,
3290
            'extra_selects' => array('Registration_Count' => array('Registration.REG_ID', 'count', '%d')),
3291
            'limit' => $limit
3292
        );
3293
        if (! $count) {
3294
            $query_args['order_by'] = array($orderby => $sort);
3295
        }
3296
        if ($trash) {
3297
            $query_args[0]['status'] = array('!=', 'publish');
3298
            $all_attendees    = $count
3299
                ? $ATT_MDL->count($query_args, 'ATT_ID', true)
3300
                : $ATT_MDL->get_all($query_args);
3301
        } else {
3302
            $query_args[0]['status'] = array('IN', array('publish'));
3303
            $all_attendees    = $count
3304
                ? $ATT_MDL->count($query_args, 'ATT_ID', true)
3305
                : $ATT_MDL->get_all($query_args);
3306
        }
3307
        return $all_attendees;
3308
    }
3309
3310
3311
    /**
3312
     * This is just taking care of resending the registration confirmation
3313
     *
3314
     * @access protected
3315
     * @return void
3316
     */
3317
    protected function _resend_registration()
3318
    {
3319
        $this->_process_resend_registration();
3320
        $query_args = isset($this->_req_data['redirect_to'])
3321
            ? array('action' => $this->_req_data['redirect_to'], '_REG_ID' => $this->_req_data['_REG_ID'])
3322
            : array('action' => 'default');
3323
        $this->_redirect_after_action(false, '', '', $query_args, true);
3324
    }
3325
3326
    /**
3327
     * Creates a registration report, but accepts the name of a method to use for preparing the query parameters
3328
     * to use when selecting registrations
3329
     * @param string $method_name_for_getting_query_params the name of the method (on this class) to use for preparing
3330
     *                                                     the query parameters from the request
3331
     * @return void ends the request with a redirect or download
3332
     */
3333
    public function _registrations_report_base( $method_name_for_getting_query_params )
3334
    {
3335
        if (! defined('EE_USE_OLD_CSV_REPORT_CLASS')) {
3336
            wp_redirect(EE_Admin_Page::add_query_args_and_nonce(
3337
                array(
3338
                    'page'        => 'espresso_batch',
3339
                    'batch'       => 'file',
3340
                    'EVT_ID'      => isset($this->_req_data['EVT_ID']) ? $this->_req_data['EVT_ID'] : null,
3341
                    'filters'     => urlencode(
3342
                        serialize(
3343
                            call_user_func(
3344
                                array( $this, $method_name_for_getting_query_params ),
3345
                                EEH_Array::is_set(
3346
                                    $this->_req_data,
3347
                                    'filters',
3348
                                    array()
3349
                                )
3350
                            )
3351
                        )
3352
                ),
3353
                'use_filters' => EEH_Array::is_set($this->_req_data, 'use_filters', false),
3354
                'job_handler' => urlencode('EventEspressoBatchRequest\JobHandlers\RegistrationsReport'),
3355
                'return_url'  => urlencode($this->_req_data['return_url']),
3356
            )));
3357
        } else {
3358
            $new_request_args = array(
3359
                'export' => 'report',
3360
                'action' => 'registrations_report_for_event',
3361
                'EVT_ID' => isset($this->_req_data['EVT_ID']) ? $this->_req_data['EVT_ID'] : null,
3362
            );
3363
            $this->_req_data = array_merge($this->_req_data, $new_request_args);
3364
            if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3365
                require_once(EE_CLASSES . 'EE_Export.class.php');
3366
                $EE_Export = EE_Export::instance($this->_req_data);
3367
                $EE_Export->export();
3368
            }
3369
        }
3370
    }
3371
3372
3373
3374
    /**
3375
     * Creates a registration report using only query parameters in the request
3376
     * @return void
3377
     */
3378
    public function _registrations_report()
3379
    {
3380
        $this->_registrations_report_base('_get_registration_query_parameters');
3381
    }
3382
3383
3384
    public function _contact_list_export()
3385
    {
3386
        if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3387
            require_once(EE_CLASSES . 'EE_Export.class.php');
3388
            $EE_Export = EE_Export::instance($this->_req_data);
3389
            $EE_Export->export_attendees();
3390
        }
3391
    }
3392
3393
3394
    public function _contact_list_report()
3395
    {
3396
        if ( ! defined('EE_USE_OLD_CSV_REPORT_CLASS')) {
3397
            wp_redirect(EE_Admin_Page::add_query_args_and_nonce(array(
3398
                'page'        => 'espresso_batch',
3399
                'batch'       => 'file',
3400
                'job_handler' => urlencode('EventEspressoBatchRequest\JobHandlers\AttendeesReport'),
3401
                'return_url'  => urlencode($this->_req_data['return_url']),
3402
            )));
3403
        } else {
3404
            if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3405
                require_once(EE_CLASSES . 'EE_Export.class.php');
3406
                $EE_Export = EE_Export::instance($this->_req_data);
3407
                $EE_Export->report_attendees();
3408
            }
3409
        }
3410
    }
3411
3412
3413
3414
3415
3416
    /***************************************        ATTENDEE DETAILS        ***************************************/
3417
    /**
3418
     * This duplicates the attendee object for the given incoming registration id and attendee_id.
3419
     *
3420
     * @return void
3421
     * @throws EE_Error
3422
     * @throws InvalidArgumentException
3423
     * @throws InvalidDataTypeException
3424
     * @throws InvalidInterfaceException
3425
     */
3426
    protected function _duplicate_attendee()
3427
    {
3428
        $action = ! empty($this->_req_data['return']) ? $this->_req_data['return'] : 'default';
3429
        //verify we have necessary info
3430
        if (empty($this->_req_data['_REG_ID'])) {
3431
            EE_Error::add_error(
3432
                esc_html__(
3433
                    'Unable to create the contact for the registration because the required parameters are not present (_REG_ID )',
3434
                    'event_espresso'
3435
                ), __FILE__, __LINE__, __FUNCTION__
3436
            );
3437
            $query_args = array('action' => $action);
3438
            $this->_redirect_after_action('', '', '', $query_args, true);
3439
        }
3440
        //okay necessary deets present... let's dupe the incoming attendee and attach to incoming registration.
3441
        $registration = EEM_Registration::instance()->get_one_by_ID($this->_req_data['_REG_ID']);
3442
        $attendee     = $registration->attendee();
3443
        //remove relation of existing attendee on registration
3444
        $registration->_remove_relation_to($attendee, 'Attendee');
3445
        //new attendee
3446
        $new_attendee = clone $attendee;
3447
        $new_attendee->set('ATT_ID', 0);
3448
        $new_attendee->save();
3449
        //add new attendee to reg
3450
        $registration->_add_relation_to($new_attendee, 'Attendee');
3451
        EE_Error::add_success(
3452
            esc_html__(
3453
                'New Contact record created.  Now make any edits you wish to make for this contact.',
3454
                'event_espresso'
3455
            )
3456
        );
3457
        //redirect to edit page for attendee
3458
        $query_args = array('post' => $new_attendee->ID(), 'action' => 'edit_attendee');
3459
        $this->_redirect_after_action('', '', '', $query_args, true);
3460
    }
3461
3462
3463
    /**
3464
     * Callback invoked by parent EE_Admin_CPT class hooked in on `save_post` wp hook.
3465
     * @param int      $post_id
3466
     * @param WP_POST $post
3467
     * @throws DomainException
3468
     * @throws EE_Error
3469
     * @throws InvalidArgumentException
3470
     * @throws InvalidDataTypeException
3471
     * @throws InvalidInterfaceException
3472
     * @throws LogicException
3473
     * @throws InvalidFormSubmissionException
3474
     */
3475
    protected function _insert_update_cpt_item($post_id, $post)
3476
    {
3477
        $success  = true;
3478
        $attendee = $post instanceof WP_Post && $post->post_type === 'espresso_attendees'
3479
            ? EEM_Attendee::instance()->get_one_by_ID($post_id)
3480
            : null;
3481
        //for attendee updates
3482
        if ($attendee instanceof EE_Attendee) {
3483
            //note we should only be UPDATING attendees at this point.
3484
            $updated_fields = array(
3485
                'ATT_fname'     => $this->_req_data['ATT_fname'],
3486
                'ATT_lname'     => $this->_req_data['ATT_lname'],
3487
                'ATT_full_name' => $this->_req_data['ATT_fname'] . ' ' . $this->_req_data['ATT_lname'],
3488
                'ATT_address'   => isset($this->_req_data['ATT_address']) ? $this->_req_data['ATT_address'] : '',
3489
                'ATT_address2'  => isset($this->_req_data['ATT_address2']) ? $this->_req_data['ATT_address2'] : '',
3490
                'ATT_city'      => isset($this->_req_data['ATT_city']) ? $this->_req_data['ATT_city'] : '',
3491
                'STA_ID'        => isset($this->_req_data['STA_ID']) ? $this->_req_data['STA_ID'] : '',
3492
                'CNT_ISO'       => isset($this->_req_data['CNT_ISO']) ? $this->_req_data['CNT_ISO'] : '',
3493
                'ATT_zip'       => isset($this->_req_data['ATT_zip']) ? $this->_req_data['ATT_zip'] : '',
3494
            );
3495
            foreach ($updated_fields as $field => $value) {
3496
                $attendee->set($field, $value);
3497
            }
3498
3499
            //process contact details metabox form handler (which will also save the attendee)
3500
            $contact_details_form = $this->getAttendeeContactDetailsMetaboxFormHandler($attendee);
3501
            $success = $contact_details_form->process($this->_req_data);
3502
3503
            $attendee_update_callbacks = apply_filters(
3504
                'FHEE__Registrations_Admin_Page__insert_update_cpt_item__attendee_update',
3505
                array()
3506
            );
3507
            foreach ($attendee_update_callbacks as $a_callback) {
3508
                if (false === call_user_func_array($a_callback, array($attendee, $this->_req_data))) {
3509
                    throw new EE_Error(
3510
                        sprintf(
3511
                            esc_html__(
3512
                                'The %s callback given for the "FHEE__Registrations_Admin_Page__insert_update_cpt_item__attendee_update" filter is not a valid callback.  Please check the spelling.',
3513
                                'event_espresso'
3514
                            ),
3515
                            $a_callback
3516
                        )
3517
                    );
3518
                }
3519
            }
3520
        }
3521
3522
        if ($success === false) {
3523
            EE_Error::add_error(
3524
                esc_html__(
3525
                    'Something went wrong with updating the meta table data for the registration.',
3526
                    'event_espresso'
3527
                ),
3528
                __FILE__, __FUNCTION__, __LINE__
3529
            );
3530
        }
3531
    }
3532
3533
3534
    public function trash_cpt_item($post_id)
3535
    {
3536
    }
3537
3538
3539
    public function delete_cpt_item($post_id)
3540
    {
3541
    }
3542
3543
3544
    public function restore_cpt_item($post_id)
3545
    {
3546
    }
3547
3548
3549
    protected function _restore_cpt_item($post_id, $revision_id)
3550
    {
3551
    }
3552
3553
3554
    public function attendee_editor_metaboxes()
3555
    {
3556
        $this->verify_cpt_object();
3557
        remove_meta_box(
3558
            'postexcerpt',
3559
            esc_html__('Excerpt', 'event_espresso'),
3560
            'post_excerpt_meta_box',
3561
            $this->_cpt_routes[$this->_req_action],
3562
            'normal',
3563
            'core'
3564
        );
3565
        remove_meta_box('commentstatusdiv', $this->_cpt_routes[$this->_req_action], 'normal', 'core');
3566 View Code Duplication
        if (post_type_supports('espresso_attendees', 'excerpt')) {
3567
            add_meta_box(
3568
                'postexcerpt',
3569
                esc_html__('Short Biography', 'event_espresso'),
3570
                'post_excerpt_meta_box',
3571
                $this->_cpt_routes[$this->_req_action],
3572
                'normal'
3573
            );
3574
        }
3575 View Code Duplication
        if (post_type_supports('espresso_attendees', 'comments')) {
3576
            add_meta_box(
3577
                'commentsdiv',
3578
                esc_html__('Notes on the Contact', 'event_espresso'),
3579
                'post_comment_meta_box',
3580
                $this->_cpt_routes[$this->_req_action],
3581
                'normal',
3582
                'core'
3583
            );
3584
        }
3585
        add_meta_box(
3586
            'attendee_contact_info',
3587
            esc_html__('Contact Info', 'event_espresso'),
3588
            array($this, 'attendee_contact_info'),
3589
            $this->_cpt_routes[$this->_req_action],
3590
            'side',
3591
            'core'
3592
        );
3593
        add_meta_box(
3594
            'attendee_details_address',
3595
            esc_html__('Address Details', 'event_espresso'),
3596
            array($this, 'attendee_address_details'),
3597
            $this->_cpt_routes[$this->_req_action],
3598
            'normal',
3599
            'core'
3600
        );
3601
        add_meta_box(
3602
            'attendee_registrations',
3603
            esc_html__('Registrations for this Contact', 'event_espresso'),
3604
            array($this, 'attendee_registrations_meta_box'),
3605
            $this->_cpt_routes[$this->_req_action],
3606
            'normal',
3607
            'high'
3608
        );
3609
    }
3610
3611
3612
    /**
3613
     * Metabox for attendee contact info
3614
     *
3615
     * @param  WP_Post $post wp post object
3616
     * @return string attendee contact info ( and form )
3617
     * @throws EE_Error
3618
     * @throws InvalidArgumentException
3619
     * @throws InvalidDataTypeException
3620
     * @throws InvalidInterfaceException
3621
     * @throws LogicException
3622
     * @throws DomainException
3623
     */
3624
    public function attendee_contact_info($post)
3625
    {
3626
        //get attendee object ( should already have it )
3627
        $form = $this->getAttendeeContactDetailsMetaboxFormHandler($this->_cpt_model_obj);
3628
        $form->enqueueStylesAndScripts();
3629
        echo $form->display();
3630
    }
3631
3632
3633
    /**
3634
     * Return form handler for the contact details metabox
3635
     *
3636
     * @param EE_Attendee $attendee
3637
     * @return AttendeeContactDetailsMetaboxFormHandler
3638
     * @throws DomainException
3639
     * @throws InvalidArgumentException
3640
     * @throws InvalidDataTypeException
3641
     * @throws InvalidInterfaceException
3642
     */
3643
    protected function getAttendeeContactDetailsMetaboxFormHandler(EE_Attendee $attendee)
3644
    {
3645
        return new AttendeeContactDetailsMetaboxFormHandler($attendee, EE_Registry::instance());
3646
    }
3647
3648
3649
    /**
3650
     * Metabox for attendee details
3651
     *
3652
     * @param  WP_Post $post wp post object
3653
     * @throws DomainException
3654
     */
3655
    public function attendee_address_details($post)
3656
    {
3657
        //get attendee object (should already have it)
3658
        $this->_template_args['attendee']     = $this->_cpt_model_obj;
3659
        $this->_template_args['state_html']   = EEH_Form_Fields::generate_form_input(
3660
            new EE_Question_Form_Input(
3661
                EE_Question::new_instance(
3662
                    array(
3663
                        'QST_ID'           => 0,
3664
                        'QST_display_text' => esc_html__('State/Province', 'event_espresso'),
3665
                        'QST_system'       => 'admin-state',
3666
                    )
3667
                ),
3668
                EE_Answer::new_instance(
3669
                    array(
3670
                        'ANS_ID'    => 0,
3671
                        'ANS_value' => $this->_cpt_model_obj->state_ID(),
3672
                    )
3673
                ),
3674
                array(
3675
                    'input_id'       => 'STA_ID',
3676
                    'input_name'     => 'STA_ID',
3677
                    'input_prefix'   => '',
3678
                    'append_qstn_id' => false,
3679
                )
3680
            )
3681
        );
3682
        $this->_template_args['country_html'] = EEH_Form_Fields::generate_form_input(
3683
            new EE_Question_Form_Input(
3684
                EE_Question::new_instance(
3685
                    array(
3686
                        'QST_ID'           => 0,
3687
                        'QST_display_text' => esc_html__('Country', 'event_espresso'),
3688
                        'QST_system'       => 'admin-country',
3689
                    )
3690
                ),
3691
                EE_Answer::new_instance(
3692
                    array(
3693
                        'ANS_ID'    => 0,
3694
                        'ANS_value' => $this->_cpt_model_obj->country_ID(),
3695
                    )
3696
                ),
3697
                array(
3698
                    'input_id'       => 'CNT_ISO',
3699
                    'input_name'     => 'CNT_ISO',
3700
                    'input_prefix'   => '',
3701
                    'append_qstn_id' => false,
3702
                )
3703
            )
3704
        );
3705
        $template                             =
3706
            REG_TEMPLATE_PATH . 'attendee_address_details_metabox_content.template.php';
3707
        EEH_Template::display_template($template, $this->_template_args);
3708
    }
3709
3710
3711
    /**
3712
     *        _attendee_details
3713
     *
3714
     * @access protected
3715
     * @param $post
3716
     * @return void
3717
     * @throws DomainException
3718
     * @throws EE_Error
3719
     */
3720
    public function attendee_registrations_meta_box($post)
3721
    {
3722
        $this->_template_args['attendee']      = $this->_cpt_model_obj;
3723
        $this->_template_args['registrations'] = $this->_cpt_model_obj->get_many_related('Registration');
3724
        $template                              =
3725
            REG_TEMPLATE_PATH . 'attendee_registrations_main_meta_box.template.php';
3726
        EEH_Template::display_template($template, $this->_template_args);
3727
    }
3728
3729
3730
    /**
3731
     * add in the form fields for the attendee edit
3732
     *
3733
     * @param  WP_Post $post wp post object
3734
     * @return string html for new form.
3735
     * @throws DomainException
3736
     */
3737
    public function after_title_form_fields($post)
3738
    {
3739
        if ($post->post_type == 'espresso_attendees') {
3740
            $template                  = REG_TEMPLATE_PATH . 'attendee_details_after_title_form_fields.template.php';
3741
            $template_args['attendee'] = $this->_cpt_model_obj;
0 ignored issues
show
Coding Style Comprehensibility introduced by
$template_args was never initialized. Although not strictly required by PHP, it is generally a good practice to add $template_args = array(); before regardless.

Adding an explicit array definition is generally preferable to implicit array definition as it guarantees a stable state of the code.

Let’s take a look at an example:

foreach ($collection as $item) {
    $myArray['foo'] = $item->getFoo();

    if ($item->hasBar()) {
        $myArray['bar'] = $item->getBar();
    }

    // do something with $myArray
}

As you can see in this example, the array $myArray is initialized the first time when the foreach loop is entered. You can also see that the value of the bar key is only written conditionally; thus, its value might result from a previous iteration.

This might or might not be intended. To make your intention clear, your code more readible and to avoid accidental bugs, we recommend to add an explicit initialization $myArray = array() either outside or inside the foreach loop.

Loading history...
3742
            EEH_Template::display_template($template, $template_args);
3743
        }
3744
    }
3745
3746
3747
    /**
3748
     *        _trash_or_restore_attendee
3749
     *
3750
     * @param boolean $trash - whether to move item to trash (TRUE) or restore it (FALSE)
3751
     * @return void
3752
     * @throws EE_Error
3753
     * @throws InvalidArgumentException
3754
     * @throws InvalidDataTypeException
3755
     * @throws InvalidInterfaceException
3756
     * @access protected
3757
     */
3758
    protected function _trash_or_restore_attendees($trash = true)
3759
    {
3760
        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
3761
        $ATT_MDL = EEM_Attendee::instance();
3762
        $success = 1;
3763
        //Checkboxes
3764
        if ( ! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
3765
            // if array has more than one element than success message should be plural
3766
            $success = count($this->_req_data['checkbox']) > 1 ? 2 : 1;
3767
            // cycle thru checkboxes
3768
            while (list($ATT_ID, $value) = each($this->_req_data['checkbox'])) {
0 ignored issues
show
Unused Code introduced by
The assignment to $value is unused. Consider omitting it like so list($first,,$third).

This checks looks for assignemnts to variables using the list(...) function, where not all assigned variables are subsequently used.

Consider the following code example.

<?php

function returnThreeValues() {
    return array('a', 'b', 'c');
}

list($a, $b, $c) = returnThreeValues();

print $a . " - " . $c;

Only the variables $a and $c are used. There was no need to assign $b.

Instead, the list call could have been.

list($a,, $c) = returnThreeValues();
Loading history...
3769
                $updated = $trash ? $ATT_MDL->update_by_ID(array('status' => 'trash'), $ATT_ID)
3770
                    : $ATT_MDL->update_by_ID(array('status' => 'publish'), $ATT_ID);
3771
                if ( ! $updated) {
3772
                    $success = 0;
3773
                }
3774
            }
3775
        } else {
3776
            // grab single id and delete
3777
            $ATT_ID = absint($this->_req_data['ATT_ID']);
3778
            //get attendee
3779
            $att     = $ATT_MDL->get_one_by_ID($ATT_ID);
3780
            $updated = $trash ? $att->set_status('trash') : $att->set_status('publish');
0 ignored issues
show
Unused Code introduced by
$updated is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
3781
            $updated = $att->save();
3782
            if ( ! $updated) {
3783
                $success = 0;
3784
            }
3785
        }
3786
        $what        = $success > 1
3787
            ? esc_html__('Contacts', 'event_espresso')
3788
            : esc_html__('Contact', 'event_espresso');
3789
        $action_desc = $trash
3790
            ? esc_html__('moved to the trash', 'event_espresso')
3791
            : esc_html__('restored', 'event_espresso');
3792
        $this->_redirect_after_action($success, $what, $action_desc, array('action' => 'contact_list'));
3793
    }
3794
3795
}
3796