Completed
Branch BUG/batch-strings-overridden (415991)
by
unknown
09:29 queued 38s
created
libraries/form_sections/strategies/layout/EE_Two_Column_Layout.strategy.php 1 patch
Indentation   +68 added lines, -68 removed lines patch added patch discarded remove patch
@@ -5,81 +5,81 @@
 block discarded – undo
5 5
 class EE_Two_Column_Layout extends EE_Form_Section_Layout_Base
6 6
 {
7 7
 
8
-    /**
9
-     * Should be used to start teh form section (Eg a table tag, or a div tag, etc.)
10
-     *
11
-     * @param array $additional_args
12
-     * @return string
13
-     */
14
-    public function layout_form_begin($additional_args = array())
15
-    {
16
-        return $this->display_form_wide_errors()
17
-        . EEH_HTML::table(
18
-            '',
19
-            $this->_form_section->html_id(),
20
-            $this->_form_section->html_class(),
21
-            $this->_form_section->html_style()
22
-        ) . EEH_HTML::tbody();
23
-    }
8
+	/**
9
+	 * Should be used to start teh form section (Eg a table tag, or a div tag, etc.)
10
+	 *
11
+	 * @param array $additional_args
12
+	 * @return string
13
+	 */
14
+	public function layout_form_begin($additional_args = array())
15
+	{
16
+		return $this->display_form_wide_errors()
17
+		. EEH_HTML::table(
18
+			'',
19
+			$this->_form_section->html_id(),
20
+			$this->_form_section->html_class(),
21
+			$this->_form_section->html_style()
22
+		) . EEH_HTML::tbody();
23
+	}
24 24
 
25 25
 
26 26
 
27
-    /**
28
-     * Should be used to end the form section (eg a /table tag, or a /div tag, etc)
29
-     *
30
-     * @param array $additional_args
31
-     * @return string
32
-     */
33
-    public function layout_form_end($additional_args = array())
34
-    {
35
-        return EEH_HTML::tbodyx() . EEH_HTML::tablex($this->_form_section->html_id());
36
-    }
27
+	/**
28
+	 * Should be used to end the form section (eg a /table tag, or a /div tag, etc)
29
+	 *
30
+	 * @param array $additional_args
31
+	 * @return string
32
+	 */
33
+	public function layout_form_end($additional_args = array())
34
+	{
35
+		return EEH_HTML::tbodyx() . EEH_HTML::tablex($this->_form_section->html_id());
36
+	}
37 37
 
38 38
 
39 39
 
40
-    /**
41
-     * Lays out the row for the input, including label and errors
42
-     *
43
-     * @param EE_Form_Input_Base $input
44
-     * @return string
45
-     */
46
-    public function layout_input($input)
47
-    {
48
-        $html = '';
49
-        if ($input instanceof EE_Hidden_Input) {
50
-            $html .= $input->get_html_for_input();
51
-        } else {
52
-            $html_for_input = $input->get_html_for_input();
53
-            $html_for_input .= $input->get_html_for_errors() != ''
54
-                ? EEH_HTML::nl() . $input->get_html_for_errors()
55
-                : '';
56
-            $html_for_input .= $input->get_html_for_help() != '' ? EEH_HTML::nl() . $input->get_html_for_help() : '';
57
-            $html .= EEH_HTML::tr(
58
-                EEH_HTML::th($input->get_html_for_label()) .
59
-                EEH_HTML::td($html_for_input)
60
-            );
61
-        }
62
-        return $html;
63
-    }
40
+	/**
41
+	 * Lays out the row for the input, including label and errors
42
+	 *
43
+	 * @param EE_Form_Input_Base $input
44
+	 * @return string
45
+	 */
46
+	public function layout_input($input)
47
+	{
48
+		$html = '';
49
+		if ($input instanceof EE_Hidden_Input) {
50
+			$html .= $input->get_html_for_input();
51
+		} else {
52
+			$html_for_input = $input->get_html_for_input();
53
+			$html_for_input .= $input->get_html_for_errors() != ''
54
+				? EEH_HTML::nl() . $input->get_html_for_errors()
55
+				: '';
56
+			$html_for_input .= $input->get_html_for_help() != '' ? EEH_HTML::nl() . $input->get_html_for_help() : '';
57
+			$html .= EEH_HTML::tr(
58
+				EEH_HTML::th($input->get_html_for_label()) .
59
+				EEH_HTML::td($html_for_input)
60
+			);
61
+		}
62
+		return $html;
63
+	}
64 64
 
65 65
 
66 66
 
67
-    /**
68
-     * Lays out a row for the subsection. Please note that if you have a subsection which you don't want wrapped in
69
-     * a tr and td with a colspan=2, you should use a different layout strategy, like EE_No_Layout, EE_Template_Layout,
70
-     * or EE_Div_Per_Section_Layout, and create subsections using EE_Two_Column_Layout for everywhere you want the
71
-     * two-column layout, and then other sub-sections can be outside the EE_Two_Column_Layout table.
72
-     *
73
-     * @param EE_Form_Section_Proper $form_section
74
-     * @return string
75
-    */
76
-    public function layout_subsection($form_section)
77
-    {
78
-        if ($form_section instanceof EE_Form_Section_Proper
79
-            || $form_section instanceof EE_Form_Section_HTML
80
-        ) {
81
-            return EEH_HTML::no_row($form_section->get_html());
82
-        }
83
-        return '';
84
-    }
67
+	/**
68
+	 * Lays out a row for the subsection. Please note that if you have a subsection which you don't want wrapped in
69
+	 * a tr and td with a colspan=2, you should use a different layout strategy, like EE_No_Layout, EE_Template_Layout,
70
+	 * or EE_Div_Per_Section_Layout, and create subsections using EE_Two_Column_Layout for everywhere you want the
71
+	 * two-column layout, and then other sub-sections can be outside the EE_Two_Column_Layout table.
72
+	 *
73
+	 * @param EE_Form_Section_Proper $form_section
74
+	 * @return string
75
+	 */
76
+	public function layout_subsection($form_section)
77
+	{
78
+		if ($form_section instanceof EE_Form_Section_Proper
79
+			|| $form_section instanceof EE_Form_Section_HTML
80
+		) {
81
+			return EEH_HTML::no_row($form_section->get_html());
82
+		}
83
+		return '';
84
+	}
85 85
 }
Please login to merge, or discard this patch.
form_sections/strategies/layout/EE_Admin_Two_Column_Layout.strategy.php 1 patch
Indentation   +55 added lines, -55 removed lines patch added patch discarded remove patch
@@ -7,62 +7,62 @@
 block discarded – undo
7 7
 class EE_Admin_Two_Column_Layout extends EE_Two_Column_Layout
8 8
 {
9 9
 
10
-    /**
11
-     * Overriding the parent table layout to include <tbody> tags
12
-     *
13
-     * @param array $additional_args
14
-     * @return string
15
-     */
16
-    public function layout_form_begin($additional_args = array())
17
-    {
18
-        $this->_form_section->set_html_class($this->_form_section->html_class() . ' form-table');
19
-        return parent::layout_form_begin($additional_args);
20
-    }
10
+	/**
11
+	 * Overriding the parent table layout to include <tbody> tags
12
+	 *
13
+	 * @param array $additional_args
14
+	 * @return string
15
+	 */
16
+	public function layout_form_begin($additional_args = array())
17
+	{
18
+		$this->_form_section->set_html_class($this->_form_section->html_class() . ' form-table');
19
+		return parent::layout_form_begin($additional_args);
20
+	}
21 21
 
22 22
 
23 23
 
24
-    /**
25
-     * Lays out the row for the input, including label and errors
26
-     *
27
-     * @param EE_Form_Input_Base $input
28
-     * @return string
29
-     * @throws EE_Error
30
-     */
31
-    public function layout_input($input)
32
-    {
33
-        if ($input->get_display_strategy() instanceof EE_Text_Area_Display_Strategy
34
-            || $input->get_display_strategy() instanceof EE_Text_Input_Display_Strategy
35
-            || $input->get_display_strategy() instanceof EE_Admin_File_Uploader_Display_Strategy
36
-        ) {
37
-            $input->set_html_class($input->html_class() . ' large-text');
38
-        }
39
-        if ($input instanceof EE_Text_Area_Input) {
40
-            $input->set_rows(4);
41
-            $input->set_cols(60);
42
-        }
43
-        $input_html = $input->get_html_for_input();
44
-        // maybe add errors and help text ?
45
-        $input_html .= $input->get_html_for_errors() !== ''
46
-            ? EEH_HTML::nl() . $input->get_html_for_errors()
47
-            : '';
48
-        $input_html .= $input->get_html_for_help() !== ''
49
-            ? EEH_HTML::nl() . $input->get_html_for_help()
50
-            : '';
51
-        // overriding parent to add wp admin specific things.
52
-        $html = '';
53
-        if ($input instanceof EE_Hidden_Input) {
54
-            $html .= EEH_HTML::no_row($input->get_html_for_input());
55
-        } else {
56
-            $html .= EEH_HTML::tr(
57
-                EEH_HTML::th(
58
-                    $input->get_html_for_label(),
59
-                    '',
60
-                    '',
61
-                    '',
62
-                    'scope="row"'
63
-                ) . EEH_HTML::td($input_html)
64
-            );
65
-        }
66
-        return $html;
67
-    }
24
+	/**
25
+	 * Lays out the row for the input, including label and errors
26
+	 *
27
+	 * @param EE_Form_Input_Base $input
28
+	 * @return string
29
+	 * @throws EE_Error
30
+	 */
31
+	public function layout_input($input)
32
+	{
33
+		if ($input->get_display_strategy() instanceof EE_Text_Area_Display_Strategy
34
+			|| $input->get_display_strategy() instanceof EE_Text_Input_Display_Strategy
35
+			|| $input->get_display_strategy() instanceof EE_Admin_File_Uploader_Display_Strategy
36
+		) {
37
+			$input->set_html_class($input->html_class() . ' large-text');
38
+		}
39
+		if ($input instanceof EE_Text_Area_Input) {
40
+			$input->set_rows(4);
41
+			$input->set_cols(60);
42
+		}
43
+		$input_html = $input->get_html_for_input();
44
+		// maybe add errors and help text ?
45
+		$input_html .= $input->get_html_for_errors() !== ''
46
+			? EEH_HTML::nl() . $input->get_html_for_errors()
47
+			: '';
48
+		$input_html .= $input->get_html_for_help() !== ''
49
+			? EEH_HTML::nl() . $input->get_html_for_help()
50
+			: '';
51
+		// overriding parent to add wp admin specific things.
52
+		$html = '';
53
+		if ($input instanceof EE_Hidden_Input) {
54
+			$html .= EEH_HTML::no_row($input->get_html_for_input());
55
+		} else {
56
+			$html .= EEH_HTML::tr(
57
+				EEH_HTML::th(
58
+					$input->get_html_for_label(),
59
+					'',
60
+					'',
61
+					'',
62
+					'scope="row"'
63
+				) . EEH_HTML::td($input_html)
64
+			);
65
+		}
66
+		return $html;
67
+	}
68 68
 }
Please login to merge, or discard this patch.
mijireh_slurper/templates/additional_content_on_gateway.template.php 1 patch
Indentation   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -1,9 +1,9 @@
 block discarded – undo
1 1
 <table>
2 2
     <tr>
3 3
         <th><?php _e("Mijireh Checkout Page Design", 'event_espresso'); ?><?php
4
-            echo EEH_Template::get_help_tab_link(
5
-                'ee_mijireh_help_tab'
6
-            ); ?></th>
4
+			echo EEH_Template::get_help_tab_link(
5
+				'ee_mijireh_help_tab'
6
+			); ?></th>
7 7
         <td>
8 8
             <a href="?mijireh_edit_slurp_page=true"><?php _e("Edit Slurp Page", 'event_espresso'); ?></a>
9 9
         </td>
Please login to merge, or discard this patch.
Invoice/templates/invoice_settings_header_display.template.php 1 patch
Indentation   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -16,9 +16,9 @@
 block discarded – undo
16 16
         <td>
17 17
             <span class="description">
18 18
                 <?php _e(
19
-                    "The following settings affect the content and/or appearance of the downloadable PDF invoice.",
20
-                    'event_espresso'
21
-                ); ?></span>
19
+					"The following settings affect the content and/or appearance of the downloadable PDF invoice.",
20
+					'event_espresso'
21
+				); ?></span>
22 22
         </td>
23 23
     </tr>
24 24
 </table>
25 25
\ No newline at end of file
Please login to merge, or discard this patch.
Invoice/templates/invoice_settings_header_gateway.template.php 1 patch
Indentation   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -16,9 +16,9 @@
 block discarded – undo
16 16
         <td>
17 17
             <span class="description">
18 18
                 <?php _e(
19
-                    "The following settings affect the functioning of the Invoice gateway.",
20
-                    'event_espresso'
21
-                ); ?></span>
19
+					"The following settings affect the functioning of the Invoice gateway.",
20
+					'event_espresso'
21
+				); ?></span>
22 22
         </td>
23 23
     </tr>
24 24
 </table>
25 25
\ No newline at end of file
Please login to merge, or discard this patch.
admin_pages/registrations/Registrations_Admin_Page.core.php 2 patches
Indentation   +3826 added lines, -3826 removed lines patch added patch discarded remove patch
@@ -19,2398 +19,2398 @@  discard block
 block discarded – undo
19 19
 class Registrations_Admin_Page extends EE_Admin_Page_CPT
20 20
 {
21 21
 
22
-    /**
23
-     * @var EE_Registration
24
-     */
25
-    private $_registration;
26
-
27
-    /**
28
-     * @var EE_Event
29
-     */
30
-    private $_reg_event;
31
-
32
-    /**
33
-     * @var EE_Session
34
-     */
35
-    private $_session;
36
-
37
-    private static $_reg_status;
38
-
39
-    /**
40
-     * Form for displaying the custom questions for this registration.
41
-     * This gets used a few times throughout the request so its best to cache it
42
-     *
43
-     * @var EE_Registration_Custom_Questions_Form
44
-     */
45
-    protected $_reg_custom_questions_form = null;
46
-
47
-
48
-    /**
49
-     *        constructor
50
-     *
51
-     * @Constructor
52
-     * @access public
53
-     * @param bool $routing
54
-     * @return Registrations_Admin_Page
55
-     */
56
-    public function __construct($routing = true)
57
-    {
58
-        parent::__construct($routing);
59
-        add_action('wp_loaded', array($this, 'wp_loaded'));
60
-    }
61
-
62
-
63
-    public function wp_loaded()
64
-    {
65
-        // when adding a new registration...
66
-        if (isset($this->_req_data['action']) && $this->_req_data['action'] === 'new_registration') {
67
-            EE_System::do_not_cache();
68
-            if (! isset($this->_req_data['processing_registration'])
69
-                || absint($this->_req_data['processing_registration']) !== 1
70
-            ) {
71
-                // and it's NOT the attendee information reg step
72
-                // force cookie expiration by setting time to last week
73
-                setcookie('ee_registration_added', 0, time() - WEEK_IN_SECONDS, '/');
74
-                // and update the global
75
-                $_COOKIE['ee_registration_added'] = 0;
76
-            }
77
-        }
78
-    }
79
-
80
-
81
-    protected function _init_page_props()
82
-    {
83
-        $this->page_slug = REG_PG_SLUG;
84
-        $this->_admin_base_url = REG_ADMIN_URL;
85
-        $this->_admin_base_path = REG_ADMIN;
86
-        $this->page_label = esc_html__('Registrations', 'event_espresso');
87
-        $this->_cpt_routes = array(
88
-            'add_new_attendee' => 'espresso_attendees',
89
-            'edit_attendee'    => 'espresso_attendees',
90
-            'insert_attendee'  => 'espresso_attendees',
91
-            'update_attendee'  => 'espresso_attendees',
92
-        );
93
-        $this->_cpt_model_names = array(
94
-            'add_new_attendee' => 'EEM_Attendee',
95
-            'edit_attendee'    => 'EEM_Attendee',
96
-        );
97
-        $this->_cpt_edit_routes = array(
98
-            'espresso_attendees' => 'edit_attendee',
99
-        );
100
-        $this->_pagenow_map = array(
101
-            'add_new_attendee' => 'post-new.php',
102
-            'edit_attendee'    => 'post.php',
103
-            'trash'            => 'post.php',
104
-        );
105
-        add_action('edit_form_after_title', array($this, 'after_title_form_fields'), 10);
106
-        // add filters so that the comment urls don't take users to a confusing 404 page
107
-        add_filter('get_comment_link', array($this, 'clear_comment_link'), 10, 3);
108
-    }
109
-
110
-
111
-    public function clear_comment_link($link, $comment, $args)
112
-    {
113
-        // gotta make sure this only happens on this route
114
-        $post_type = get_post_type($comment->comment_post_ID);
115
-        if ($post_type === 'espresso_attendees') {
116
-            return '#commentsdiv';
117
-        }
118
-        return $link;
119
-    }
120
-
121
-
122
-    protected function _ajax_hooks()
123
-    {
124
-        // todo: all hooks for registrations ajax goes in here
125
-        add_action('wp_ajax_toggle_checkin_status', array($this, 'toggle_checkin_status'));
126
-    }
127
-
128
-
129
-    protected function _define_page_props()
130
-    {
131
-        $this->_admin_page_title = $this->page_label;
132
-        $this->_labels = array(
133
-            'buttons'                      => array(
134
-                'add-registrant'      => esc_html__('Add New Registration', 'event_espresso'),
135
-                'add-attendee'        => esc_html__('Add Contact', 'event_espresso'),
136
-                'edit'                => esc_html__('Edit Contact', 'event_espresso'),
137
-                'report'              => esc_html__("Event Registrations CSV Report", "event_espresso"),
138
-                'report_all'          => esc_html__('All Registrations CSV Report', 'event_espresso'),
139
-                'report_filtered'     => esc_html__('Filtered CSV Report', 'event_espresso'),
140
-                'contact_list_report' => esc_html__('Contact List Report', 'event_espresso'),
141
-                'contact_list_export' => esc_html__("Export Data", "event_espresso"),
142
-            ),
143
-            'publishbox'                   => array(
144
-                'add_new_attendee' => esc_html__("Add Contact Record", 'event_espresso'),
145
-                'edit_attendee'    => esc_html__("Update Contact Record", 'event_espresso'),
146
-            ),
147
-            'hide_add_button_on_cpt_route' => array(
148
-                'edit_attendee' => true,
149
-            ),
150
-        );
151
-    }
152
-
153
-
154
-    /**
155
-     *        grab url requests and route them
156
-     *
157
-     * @access private
158
-     * @return void
159
-     */
160
-    public function _set_page_routes()
161
-    {
162
-        $this->_get_registration_status_array();
163
-        $reg_id = ! empty($this->_req_data['_REG_ID']) && ! is_array($this->_req_data['_REG_ID'])
164
-            ? $this->_req_data['_REG_ID'] : 0;
165
-        $reg_id = empty($reg_id) && ! empty($this->_req_data['reg_status_change_form']['REG_ID'])
166
-            ? $this->_req_data['reg_status_change_form']['REG_ID']
167
-            : $reg_id;
168
-        $att_id = ! empty($this->_req_data['ATT_ID']) && ! is_array($this->_req_data['ATT_ID'])
169
-            ? $this->_req_data['ATT_ID'] : 0;
170
-        $att_id = ! empty($this->_req_data['post']) && ! is_array($this->_req_data['post'])
171
-            ? $this->_req_data['post']
172
-            : $att_id;
173
-        $this->_page_routes = array(
174
-            'default'                             => array(
175
-                'func'       => '_registrations_overview_list_table',
176
-                'capability' => 'ee_read_registrations',
177
-            ),
178
-            'view_registration'                   => array(
179
-                'func'       => '_registration_details',
180
-                'capability' => 'ee_read_registration',
181
-                'obj_id'     => $reg_id,
182
-            ),
183
-            'edit_registration'                   => array(
184
-                'func'               => '_update_attendee_registration_form',
185
-                'noheader'           => true,
186
-                'headers_sent_route' => 'view_registration',
187
-                'capability'         => 'ee_edit_registration',
188
-                'obj_id'             => $reg_id,
189
-                '_REG_ID'            => $reg_id,
190
-            ),
191
-            'trash_registrations'                 => array(
192
-                'func'       => '_trash_or_restore_registrations',
193
-                'args'       => array('trash' => true),
194
-                'noheader'   => true,
195
-                'capability' => 'ee_delete_registrations',
196
-            ),
197
-            'restore_registrations'               => array(
198
-                'func'       => '_trash_or_restore_registrations',
199
-                'args'       => array('trash' => false),
200
-                'noheader'   => true,
201
-                'capability' => 'ee_delete_registrations',
202
-            ),
203
-            'delete_registrations'                => array(
204
-                'func'       => '_delete_registrations',
205
-                'noheader'   => true,
206
-                'capability' => 'ee_delete_registrations',
207
-            ),
208
-            'new_registration'                    => array(
209
-                'func'       => 'new_registration',
210
-                'capability' => 'ee_edit_registrations',
211
-            ),
212
-            'process_reg_step'                    => array(
213
-                'func'       => 'process_reg_step',
214
-                'noheader'   => true,
215
-                'capability' => 'ee_edit_registrations',
216
-            ),
217
-            'redirect_to_txn'                     => array(
218
-                'func'       => 'redirect_to_txn',
219
-                'noheader'   => true,
220
-                'capability' => 'ee_edit_registrations',
221
-            ),
222
-            'change_reg_status'                   => array(
223
-                'func'       => '_change_reg_status',
224
-                'noheader'   => true,
225
-                'capability' => 'ee_edit_registration',
226
-                'obj_id'     => $reg_id,
227
-            ),
228
-            'approve_registration'                => array(
229
-                'func'       => 'approve_registration',
230
-                'noheader'   => true,
231
-                'capability' => 'ee_edit_registration',
232
-                'obj_id'     => $reg_id,
233
-            ),
234
-            'approve_and_notify_registration'     => array(
235
-                'func'       => 'approve_registration',
236
-                'noheader'   => true,
237
-                'args'       => array(true),
238
-                'capability' => 'ee_edit_registration',
239
-                'obj_id'     => $reg_id,
240
-            ),
241
-            'approve_registrations'               => array(
242
-                'func'       => 'bulk_action_on_registrations',
243
-                'noheader'   => true,
244
-                'capability' => 'ee_edit_registrations',
245
-                'args'       => array('approve'),
246
-            ),
247
-            'approve_and_notify_registrations'    => array(
248
-                'func'       => 'bulk_action_on_registrations',
249
-                'noheader'   => true,
250
-                'capability' => 'ee_edit_registrations',
251
-                'args'       => array('approve', true),
252
-            ),
253
-            'decline_registration'                => array(
254
-                'func'       => 'decline_registration',
255
-                'noheader'   => true,
256
-                'capability' => 'ee_edit_registration',
257
-                'obj_id'     => $reg_id,
258
-            ),
259
-            'decline_and_notify_registration'     => array(
260
-                'func'       => 'decline_registration',
261
-                'noheader'   => true,
262
-                'args'       => array(true),
263
-                'capability' => 'ee_edit_registration',
264
-                'obj_id'     => $reg_id,
265
-            ),
266
-            'decline_registrations'               => array(
267
-                'func'       => 'bulk_action_on_registrations',
268
-                'noheader'   => true,
269
-                'capability' => 'ee_edit_registrations',
270
-                'args'       => array('decline'),
271
-            ),
272
-            'decline_and_notify_registrations'    => array(
273
-                'func'       => 'bulk_action_on_registrations',
274
-                'noheader'   => true,
275
-                'capability' => 'ee_edit_registrations',
276
-                'args'       => array('decline', true),
277
-            ),
278
-            'pending_registration'                => array(
279
-                'func'       => 'pending_registration',
280
-                'noheader'   => true,
281
-                'capability' => 'ee_edit_registration',
282
-                'obj_id'     => $reg_id,
283
-            ),
284
-            'pending_and_notify_registration'     => array(
285
-                'func'       => 'pending_registration',
286
-                'noheader'   => true,
287
-                'args'       => array(true),
288
-                'capability' => 'ee_edit_registration',
289
-                'obj_id'     => $reg_id,
290
-            ),
291
-            'pending_registrations'               => array(
292
-                'func'       => 'bulk_action_on_registrations',
293
-                'noheader'   => true,
294
-                'capability' => 'ee_edit_registrations',
295
-                'args'       => array('pending'),
296
-            ),
297
-            'pending_and_notify_registrations'    => array(
298
-                'func'       => 'bulk_action_on_registrations',
299
-                'noheader'   => true,
300
-                'capability' => 'ee_edit_registrations',
301
-                'args'       => array('pending', true),
302
-            ),
303
-            'no_approve_registration'             => array(
304
-                'func'       => 'not_approve_registration',
305
-                'noheader'   => true,
306
-                'capability' => 'ee_edit_registration',
307
-                'obj_id'     => $reg_id,
308
-            ),
309
-            'no_approve_and_notify_registration'  => array(
310
-                'func'       => 'not_approve_registration',
311
-                'noheader'   => true,
312
-                'args'       => array(true),
313
-                'capability' => 'ee_edit_registration',
314
-                'obj_id'     => $reg_id,
315
-            ),
316
-            'no_approve_registrations'            => array(
317
-                'func'       => 'bulk_action_on_registrations',
318
-                'noheader'   => true,
319
-                'capability' => 'ee_edit_registrations',
320
-                'args'       => array('not_approve'),
321
-            ),
322
-            'no_approve_and_notify_registrations' => array(
323
-                'func'       => 'bulk_action_on_registrations',
324
-                'noheader'   => true,
325
-                'capability' => 'ee_edit_registrations',
326
-                'args'       => array('not_approve', true),
327
-            ),
328
-            'cancel_registration'                 => array(
329
-                'func'       => 'cancel_registration',
330
-                'noheader'   => true,
331
-                'capability' => 'ee_edit_registration',
332
-                'obj_id'     => $reg_id,
333
-            ),
334
-            'cancel_and_notify_registration'      => array(
335
-                'func'       => 'cancel_registration',
336
-                'noheader'   => true,
337
-                'args'       => array(true),
338
-                'capability' => 'ee_edit_registration',
339
-                'obj_id'     => $reg_id,
340
-            ),
341
-            'cancel_registrations'                => array(
342
-                'func'       => 'bulk_action_on_registrations',
343
-                'noheader'   => true,
344
-                'capability' => 'ee_edit_registrations',
345
-                'args'       => array('cancel'),
346
-            ),
347
-            'cancel_and_notify_registrations'     => array(
348
-                'func'       => 'bulk_action_on_registrations',
349
-                'noheader'   => true,
350
-                'capability' => 'ee_edit_registrations',
351
-                'args'       => array('cancel', true),
352
-            ),
353
-            'wait_list_registration'              => array(
354
-                'func'       => 'wait_list_registration',
355
-                'noheader'   => true,
356
-                'capability' => 'ee_edit_registration',
357
-                'obj_id'     => $reg_id,
358
-            ),
359
-            'wait_list_and_notify_registration'   => array(
360
-                'func'       => 'wait_list_registration',
361
-                'noheader'   => true,
362
-                'args'       => array(true),
363
-                'capability' => 'ee_edit_registration',
364
-                'obj_id'     => $reg_id,
365
-            ),
366
-            'contact_list'                        => array(
367
-                'func'       => '_attendee_contact_list_table',
368
-                'capability' => 'ee_read_contacts',
369
-            ),
370
-            'add_new_attendee'                    => array(
371
-                'func' => '_create_new_cpt_item',
372
-                'args' => array(
373
-                    'new_attendee' => true,
374
-                    'capability'   => 'ee_edit_contacts',
375
-                ),
376
-            ),
377
-            'edit_attendee'                       => array(
378
-                'func'       => '_edit_cpt_item',
379
-                'capability' => 'ee_edit_contacts',
380
-                'obj_id'     => $att_id,
381
-            ),
382
-            'duplicate_attendee'                  => array(
383
-                'func'       => '_duplicate_attendee',
384
-                'noheader'   => true,
385
-                'capability' => 'ee_edit_contacts',
386
-                'obj_id'     => $att_id,
387
-            ),
388
-            'insert_attendee'                     => array(
389
-                'func'       => '_insert_or_update_attendee',
390
-                'args'       => array(
391
-                    'new_attendee' => true,
392
-                ),
393
-                'noheader'   => true,
394
-                'capability' => 'ee_edit_contacts',
395
-            ),
396
-            'update_attendee'                     => array(
397
-                'func'       => '_insert_or_update_attendee',
398
-                'args'       => array(
399
-                    'new_attendee' => false,
400
-                ),
401
-                'noheader'   => true,
402
-                'capability' => 'ee_edit_contacts',
403
-                'obj_id'     => $att_id,
404
-            ),
405
-            'trash_attendees'                     => array(
406
-                'func'       => '_trash_or_restore_attendees',
407
-                'args'       => array(
408
-                    'trash' => 'true',
409
-                ),
410
-                'noheader'   => true,
411
-                'capability' => 'ee_delete_contacts',
412
-            ),
413
-            'trash_attendee'                      => array(
414
-                'func'       => '_trash_or_restore_attendees',
415
-                'args'       => array(
416
-                    'trash' => true,
417
-                ),
418
-                'noheader'   => true,
419
-                'capability' => 'ee_delete_contacts',
420
-                'obj_id'     => $att_id,
421
-            ),
422
-            'restore_attendees'                   => array(
423
-                'func'       => '_trash_or_restore_attendees',
424
-                'args'       => array(
425
-                    'trash' => false,
426
-                ),
427
-                'noheader'   => true,
428
-                'capability' => 'ee_delete_contacts',
429
-                'obj_id'     => $att_id,
430
-            ),
431
-            'resend_registration'                 => array(
432
-                'func'       => '_resend_registration',
433
-                'noheader'   => true,
434
-                'capability' => 'ee_send_message',
435
-            ),
436
-            'registrations_report'                => array(
437
-                'func'       => '_registrations_report',
438
-                'noheader'   => true,
439
-                'capability' => 'ee_read_registrations',
440
-            ),
441
-            'contact_list_export'                 => array(
442
-                'func'       => '_contact_list_export',
443
-                'noheader'   => true,
444
-                'capability' => 'export',
445
-            ),
446
-            'contact_list_report'                 => array(
447
-                'func'       => '_contact_list_report',
448
-                'noheader'   => true,
449
-                'capability' => 'ee_read_contacts',
450
-            ),
451
-        );
452
-    }
453
-
454
-
455
-    protected function _set_page_config()
456
-    {
457
-        $this->_page_config = array(
458
-            'default'           => array(
459
-                'nav'           => array(
460
-                    'label' => esc_html__('Overview', 'event_espresso'),
461
-                    'order' => 5,
462
-                ),
463
-                'help_tabs'     => array(
464
-                    'registrations_overview_help_tab'                       => array(
465
-                        'title'    => esc_html__('Registrations Overview', 'event_espresso'),
466
-                        'filename' => 'registrations_overview',
467
-                    ),
468
-                    'registrations_overview_table_column_headings_help_tab' => array(
469
-                        'title'    => esc_html__('Registrations Table Column Headings', 'event_espresso'),
470
-                        'filename' => 'registrations_overview_table_column_headings',
471
-                    ),
472
-                    'registrations_overview_filters_help_tab'               => array(
473
-                        'title'    => esc_html__('Registration Filters', 'event_espresso'),
474
-                        'filename' => 'registrations_overview_filters',
475
-                    ),
476
-                    'registrations_overview_views_help_tab'                 => array(
477
-                        'title'    => esc_html__('Registration Views', 'event_espresso'),
478
-                        'filename' => 'registrations_overview_views',
479
-                    ),
480
-                    'registrations_regoverview_other_help_tab'              => array(
481
-                        'title'    => esc_html__('Registrations Other', 'event_espresso'),
482
-                        'filename' => 'registrations_overview_other',
483
-                    ),
484
-                ),
485
-                'help_tour'     => array('Registration_Overview_Help_Tour'),
486
-                'qtips'         => array('Registration_List_Table_Tips'),
487
-                'list_table'    => 'EE_Registrations_List_Table',
488
-                'require_nonce' => false,
489
-            ),
490
-            'view_registration' => array(
491
-                'nav'           => array(
492
-                    'label'      => esc_html__('REG Details', 'event_espresso'),
493
-                    'order'      => 15,
494
-                    'url'        => isset($this->_req_data['_REG_ID'])
495
-                        ? add_query_arg(array('_REG_ID' => $this->_req_data['_REG_ID']), $this->_current_page_view_url)
496
-                        : $this->_admin_base_url,
497
-                    'persistent' => false,
498
-                ),
499
-                'help_tabs'     => array(
500
-                    'registrations_details_help_tab'                    => array(
501
-                        'title'    => esc_html__('Registration Details', 'event_espresso'),
502
-                        'filename' => 'registrations_details',
503
-                    ),
504
-                    'registrations_details_table_help_tab'              => array(
505
-                        'title'    => esc_html__('Registration Details Table', 'event_espresso'),
506
-                        'filename' => 'registrations_details_table',
507
-                    ),
508
-                    'registrations_details_form_answers_help_tab'       => array(
509
-                        'title'    => esc_html__('Registration Form Answers', 'event_espresso'),
510
-                        'filename' => 'registrations_details_form_answers',
511
-                    ),
512
-                    'registrations_details_registrant_details_help_tab' => array(
513
-                        'title'    => esc_html__('Contact Details', 'event_espresso'),
514
-                        'filename' => 'registrations_details_registrant_details',
515
-                    ),
516
-                ),
517
-                'help_tour'     => array('Registration_Details_Help_Tour'),
518
-                'metaboxes'     => array_merge(
519
-                    $this->_default_espresso_metaboxes,
520
-                    array('_registration_details_metaboxes')
521
-                ),
522
-                'require_nonce' => false,
523
-            ),
524
-            'new_registration'  => array(
525
-                'nav'           => array(
526
-                    'label'      => esc_html__('Add New Registration', 'event_espresso'),
527
-                    'url'        => '#',
528
-                    'order'      => 15,
529
-                    'persistent' => false,
530
-                ),
531
-                'metaboxes'     => $this->_default_espresso_metaboxes,
532
-                'labels'        => array(
533
-                    'publishbox' => esc_html__('Save Registration', 'event_espresso'),
534
-                ),
535
-                'require_nonce' => false,
536
-            ),
537
-            'add_new_attendee'  => array(
538
-                'nav'           => array(
539
-                    'label'      => esc_html__('Add Contact', 'event_espresso'),
540
-                    'order'      => 15,
541
-                    'persistent' => false,
542
-                ),
543
-                'metaboxes'     => array_merge(
544
-                    $this->_default_espresso_metaboxes,
545
-                    array('_publish_post_box', 'attendee_editor_metaboxes')
546
-                ),
547
-                'require_nonce' => false,
548
-            ),
549
-            'edit_attendee'     => array(
550
-                'nav'           => array(
551
-                    'label'      => esc_html__('Edit Contact', 'event_espresso'),
552
-                    'order'      => 15,
553
-                    'persistent' => false,
554
-                    'url'        => isset($this->_req_data['ATT_ID'])
555
-                        ? add_query_arg(array('ATT_ID' => $this->_req_data['ATT_ID']), $this->_current_page_view_url)
556
-                        : $this->_admin_base_url,
557
-                ),
558
-                'metaboxes'     => array('attendee_editor_metaboxes'),
559
-                'require_nonce' => false,
560
-            ),
561
-            'contact_list'      => array(
562
-                'nav'           => array(
563
-                    'label' => esc_html__('Contact List', 'event_espresso'),
564
-                    'order' => 20,
565
-                ),
566
-                'list_table'    => 'EE_Attendee_Contact_List_Table',
567
-                'help_tabs'     => array(
568
-                    'registrations_contact_list_help_tab'                       => array(
569
-                        'title'    => esc_html__('Registrations Contact List', 'event_espresso'),
570
-                        'filename' => 'registrations_contact_list',
571
-                    ),
572
-                    'registrations_contact-list_table_column_headings_help_tab' => array(
573
-                        'title'    => esc_html__('Contact List Table Column Headings', 'event_espresso'),
574
-                        'filename' => 'registrations_contact_list_table_column_headings',
575
-                    ),
576
-                    'registrations_contact_list_views_help_tab'                 => array(
577
-                        'title'    => esc_html__('Contact List Views', 'event_espresso'),
578
-                        'filename' => 'registrations_contact_list_views',
579
-                    ),
580
-                    'registrations_contact_list_other_help_tab'                 => array(
581
-                        'title'    => esc_html__('Contact List Other', 'event_espresso'),
582
-                        'filename' => 'registrations_contact_list_other',
583
-                    ),
584
-                ),
585
-                'help_tour'     => array('Contact_List_Help_Tour'),
586
-                'metaboxes'     => array(),
587
-                'require_nonce' => false,
588
-            ),
589
-            // override default cpt routes
590
-            'create_new'        => '',
591
-            'edit'              => '',
592
-        );
593
-    }
594
-
595
-
596
-    /**
597
-     * The below methods aren't used by this class currently
598
-     */
599
-    protected function _add_screen_options()
600
-    {
601
-    }
602
-
603
-
604
-    protected function _add_feature_pointers()
605
-    {
606
-    }
607
-
608
-
609
-    public function admin_init()
610
-    {
611
-        EE_Registry::$i18n_js_strings['update_att_qstns'] = esc_html__(
612
-            'click "Update Registration Questions" to save your changes',
613
-            'event_espresso'
614
-        );
615
-    }
616
-
617
-
618
-    public function admin_notices()
619
-    {
620
-    }
621
-
622
-
623
-    public function admin_footer_scripts()
624
-    {
625
-    }
626
-
627
-
628
-    /**
629
-     *        get list of registration statuses
630
-     *
631
-     * @access private
632
-     * @return void
633
-     * @throws EE_Error
634
-     */
635
-    private function _get_registration_status_array()
636
-    {
637
-        self::$_reg_status = EEM_Registration::reg_status_array(array(), true);
638
-    }
639
-
640
-
641
-    protected function _add_screen_options_default()
642
-    {
643
-        $this->_per_page_screen_option();
644
-    }
645
-
646
-
647
-    protected function _add_screen_options_contact_list()
648
-    {
649
-        $page_title = $this->_admin_page_title;
650
-        $this->_admin_page_title = esc_html__("Contacts", 'event_espresso');
651
-        $this->_per_page_screen_option();
652
-        $this->_admin_page_title = $page_title;
653
-    }
654
-
655
-
656
-    public function load_scripts_styles()
657
-    {
658
-        // style
659
-        wp_register_style(
660
-            'espresso_reg',
661
-            REG_ASSETS_URL . 'espresso_registrations_admin.css',
662
-            array('ee-admin-css'),
663
-            EVENT_ESPRESSO_VERSION
664
-        );
665
-        wp_enqueue_style('espresso_reg');
666
-        // script
667
-        wp_register_script(
668
-            'espresso_reg',
669
-            REG_ASSETS_URL . 'espresso_registrations_admin.js',
670
-            array('jquery-ui-datepicker', 'jquery-ui-draggable', 'ee_admin_js'),
671
-            EVENT_ESPRESSO_VERSION,
672
-            true
673
-        );
674
-        wp_enqueue_script('espresso_reg');
675
-    }
676
-
677
-
678
-    public function load_scripts_styles_edit_attendee()
679
-    {
680
-        // stuff to only show up on our attendee edit details page.
681
-        $attendee_details_translations = array(
682
-            'att_publish_text' => sprintf(
683
-                esc_html__('Created on: <b>%1$s</b>', 'event_espresso'),
684
-                $this->_cpt_model_obj->get_datetime('ATT_created')
685
-            ),
686
-        );
687
-        wp_localize_script('espresso_reg', 'ATTENDEE_DETAILS', $attendee_details_translations);
688
-        wp_enqueue_script('jquery-validate');
689
-    }
690
-
691
-
692
-    public function load_scripts_styles_view_registration()
693
-    {
694
-        // styles
695
-        wp_enqueue_style('espresso-ui-theme');
696
-        // scripts
697
-        $this->_get_reg_custom_questions_form($this->_registration->ID());
698
-        $this->_reg_custom_questions_form->wp_enqueue_scripts(true);
699
-    }
700
-
701
-
702
-    public function load_scripts_styles_contact_list()
703
-    {
704
-        wp_dequeue_style('espresso_reg');
705
-        wp_register_style(
706
-            'espresso_att',
707
-            REG_ASSETS_URL . 'espresso_attendees_admin.css',
708
-            array('ee-admin-css'),
709
-            EVENT_ESPRESSO_VERSION
710
-        );
711
-        wp_enqueue_style('espresso_att');
712
-    }
713
-
714
-
715
-    public function load_scripts_styles_new_registration()
716
-    {
717
-        wp_register_script(
718
-            'ee-spco-for-admin',
719
-            REG_ASSETS_URL . 'spco_for_admin.js',
720
-            array('underscore', 'jquery'),
721
-            EVENT_ESPRESSO_VERSION,
722
-            true
723
-        );
724
-        wp_enqueue_script('ee-spco-for-admin');
725
-        add_filter('FHEE__EED_Ticket_Selector__load_tckt_slctr_assets', '__return_true');
726
-        EE_Form_Section_Proper::wp_enqueue_scripts();
727
-        EED_Ticket_Selector::load_tckt_slctr_assets();
728
-        EE_Datepicker_Input::enqueue_styles_and_scripts();
729
-    }
730
-
731
-
732
-    public function AHEE__EE_Admin_Page__route_admin_request_resend_registration()
733
-    {
734
-        add_filter('FHEE_load_EE_messages', '__return_true');
735
-    }
736
-
737
-
738
-    public function AHEE__EE_Admin_Page__route_admin_request_approve_registration()
739
-    {
740
-        add_filter('FHEE_load_EE_messages', '__return_true');
741
-    }
742
-
743
-
744
-    protected function _set_list_table_views_default()
745
-    {
746
-        // for notification related bulk actions we need to make sure only active messengers have an option.
747
-        EED_Messages::set_autoloaders();
748
-        /** @type EE_Message_Resource_Manager $message_resource_manager */
749
-        $message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
750
-        $active_mts = $message_resource_manager->list_of_active_message_types();
751
-        // key= bulk_action_slug, value= message type.
752
-        $match_array = array(
753
-            'approve_registrations'    => 'registration',
754
-            'decline_registrations'    => 'declined_registration',
755
-            'pending_registrations'    => 'pending_approval',
756
-            'no_approve_registrations' => 'not_approved_registration',
757
-            'cancel_registrations'     => 'cancelled_registration',
758
-        );
759
-        $can_send = EE_Registry::instance()->CAP->current_user_can(
760
-            'ee_send_message',
761
-            'batch_send_messages'
762
-        );
763
-        /** setup reg status bulk actions **/
764
-        $def_reg_status_actions['approve_registrations'] = esc_html__('Approve Registrations', 'event_espresso');
765
-        if ($can_send && in_array($match_array['approve_registrations'], $active_mts, true)) {
766
-            $def_reg_status_actions['approve_and_notify_registrations'] = esc_html__(
767
-                'Approve and Notify Registrations',
768
-                'event_espresso'
769
-            );
770
-        }
771
-        $def_reg_status_actions['decline_registrations'] = esc_html__('Decline Registrations', 'event_espresso');
772
-        if ($can_send && in_array($match_array['decline_registrations'], $active_mts, true)) {
773
-            $def_reg_status_actions['decline_and_notify_registrations'] = esc_html__(
774
-                'Decline and Notify Registrations',
775
-                'event_espresso'
776
-            );
777
-        }
778
-        $def_reg_status_actions['pending_registrations'] = esc_html__(
779
-            'Set Registrations to Pending Payment',
780
-            'event_espresso'
781
-        );
782
-        if ($can_send && in_array($match_array['pending_registrations'], $active_mts, true)) {
783
-            $def_reg_status_actions['pending_and_notify_registrations'] = esc_html__(
784
-                'Set Registrations to Pending Payment and Notify',
785
-                'event_espresso'
786
-            );
787
-        }
788
-        $def_reg_status_actions['no_approve_registrations'] = esc_html__(
789
-            'Set Registrations to Not Approved',
790
-            'event_espresso'
791
-        );
792
-        if ($can_send && in_array($match_array['no_approve_registrations'], $active_mts, true)) {
793
-            $def_reg_status_actions['no_approve_and_notify_registrations'] = esc_html__(
794
-                'Set Registrations to Not Approved and Notify',
795
-                'event_espresso'
796
-            );
797
-        }
798
-        $def_reg_status_actions['cancel_registrations'] = esc_html__('Cancel Registrations', 'event_espresso');
799
-        if ($can_send && in_array($match_array['cancel_registrations'], $active_mts, true)) {
800
-            $def_reg_status_actions['cancel_and_notify_registrations'] = esc_html__(
801
-                'Cancel Registrations and Notify',
802
-                'event_espresso'
803
-            );
804
-        }
805
-        $def_reg_status_actions = apply_filters(
806
-            'FHEE__Registrations_Admin_Page___set_list_table_views_default__def_reg_status_actions_array',
807
-            $def_reg_status_actions,
808
-            $active_mts,
809
-            $can_send
810
-        );
811
-
812
-        $this->_views = array(
813
-            'all'   => array(
814
-                'slug'        => 'all',
815
-                'label'       => esc_html__('View All Registrations', 'event_espresso'),
816
-                'count'       => 0,
817
-                'bulk_action' => array_merge(
818
-                    $def_reg_status_actions,
819
-                    array(
820
-                        'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
821
-                    )
822
-                ),
823
-            ),
824
-            'month' => array(
825
-                'slug'        => 'month',
826
-                'label'       => esc_html__('This Month', 'event_espresso'),
827
-                'count'       => 0,
828
-                'bulk_action' => array_merge(
829
-                    $def_reg_status_actions,
830
-                    array(
831
-                        'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
832
-                    )
833
-                ),
834
-            ),
835
-            'today' => array(
836
-                'slug'        => 'today',
837
-                'label'       => sprintf(
838
-                    esc_html__('Today - %s', 'event_espresso'),
839
-                    date('M d, Y', current_time('timestamp'))
840
-                ),
841
-                'count'       => 0,
842
-                'bulk_action' => array_merge(
843
-                    $def_reg_status_actions,
844
-                    array(
845
-                        'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
846
-                    )
847
-                ),
848
-            ),
849
-        );
850
-        if (EE_Registry::instance()->CAP->current_user_can(
851
-            'ee_delete_registrations',
852
-            'espresso_registrations_delete_registration'
853
-        )) {
854
-            $this->_views['incomplete'] = array(
855
-                'slug'        => 'incomplete',
856
-                'label'       => esc_html__('Incomplete', 'event_espresso'),
857
-                'count'       => 0,
858
-                'bulk_action' => array(
859
-                    'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
860
-                ),
861
-            );
862
-            $this->_views['trash'] = array(
863
-                'slug'        => 'trash',
864
-                'label'       => esc_html__('Trash', 'event_espresso'),
865
-                'count'       => 0,
866
-                'bulk_action' => array(
867
-                    'restore_registrations' => esc_html__('Restore Registrations', 'event_espresso'),
868
-                    'delete_registrations'  => esc_html__('Delete Registrations Permanently', 'event_espresso'),
869
-                ),
870
-            );
871
-        }
872
-    }
873
-
874
-
875
-    protected function _set_list_table_views_contact_list()
876
-    {
877
-        $this->_views = array(
878
-            'in_use' => array(
879
-                'slug'        => 'in_use',
880
-                'label'       => esc_html__('In Use', 'event_espresso'),
881
-                'count'       => 0,
882
-                'bulk_action' => array(
883
-                    'trash_attendees' => esc_html__('Move to Trash', 'event_espresso'),
884
-                ),
885
-            ),
886
-        );
887
-        if (EE_Registry::instance()->CAP->current_user_can(
888
-            'ee_delete_contacts',
889
-            'espresso_registrations_trash_attendees'
890
-        )
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
-        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
-            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
-            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
-            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
-         *
1166
-         * @link https://events.codebasehq.com/projects/event-espresso/tickets/10093
1167
-         * @see https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md
1168
-         *                             or if you have the development copy of EE you can view this at the path:
1169
-         *                             /docs/G--Model-System/model-query-params.md
1170
-         */
1171
-        $query_params['group_by'] = '';
1172
-
1173
-        return $count
1174
-            ? EEM_Registration::instance()->count($query_params)
1175
-            /** @type EE_Registration[] */
1176
-            : EEM_Registration::instance()->get_all($query_params);
1177
-    }
1178
-
1179
-
1180
-    /**
1181
-     * Retrieves the query parameters to be used by the Registration model for getting registrations.
1182
-     * Note: this listens to values on the request for some of the query parameters.
1183
-     *
1184
-     * @param array $request
1185
-     * @param int   $per_page
1186
-     * @param bool  $count
1187
-     * @return array
1188
-     * @throws EE_Error
1189
-     */
1190
-    protected function _get_registration_query_parameters(
1191
-        $request = array(),
1192
-        $per_page = 10,
1193
-        $count = false
1194
-    ) {
1195
-
1196
-        $query_params = array(
1197
-            0                          => $this->_get_where_conditions_for_registrations_query(
1198
-                $request
1199
-            ),
1200
-            'caps'                     => EEM_Registration::caps_read_admin,
1201
-            'default_where_conditions' => 'this_model_only',
1202
-        );
1203
-        if (! $count) {
1204
-            $query_params = array_merge(
1205
-                $query_params,
1206
-                $this->_get_orderby_for_registrations_query(),
1207
-                $this->_get_limit($per_page)
1208
-            );
1209
-        }
1210
-
1211
-        return $query_params;
1212
-    }
1213
-
1214
-
1215
-    /**
1216
-     * This will add ATT_ID to the provided $where array for EE model query parameters.
1217
-     *
1218
-     * @param array $request usually the same as $this->_req_data but not necessarily
1219
-     * @return array
1220
-     */
1221
-    protected function addAttendeeIdToWhereConditions(array $request)
1222
-    {
1223
-        $where = array();
1224
-        if (! empty($request['ATT_ID'])) {
1225
-            $where['ATT_ID'] = absint($request['ATT_ID']);
1226
-        }
1227
-        return $where;
1228
-    }
1229
-
1230
-
1231
-    /**
1232
-     * This will add EVT_ID to the provided $where array for EE model query parameters.
1233
-     *
1234
-     * @param array $request usually the same as $this->_req_data but not necessarily
1235
-     * @return array
1236
-     */
1237
-    protected function _add_event_id_to_where_conditions(array $request)
1238
-    {
1239
-        $where = array();
1240
-        if (! empty($request['event_id'])) {
1241
-            $where['EVT_ID'] = absint($request['event_id']);
1242
-        }
1243
-        return $where;
1244
-    }
1245
-
1246
-
1247
-    /**
1248
-     * Adds category ID if it exists in the request to the where conditions for the registrations query.
1249
-     *
1250
-     * @param array $request usually the same as $this->_req_data but not necessarily
1251
-     * @return array
1252
-     */
1253
-    protected function _add_category_id_to_where_conditions(array $request)
1254
-    {
1255
-        $where = array();
1256
-        if (! empty($request['EVT_CAT']) && (int) $request['EVT_CAT'] !== -1) {
1257
-            $where['Event.Term_Taxonomy.term_id'] = absint($request['EVT_CAT']);
1258
-        }
1259
-        return $where;
1260
-    }
1261
-
1262
-
1263
-    /**
1264
-     * Adds the datetime ID if it exists in the request to the where conditions for the registrations query.
1265
-     *
1266
-     * @param array $request usually the same as $this->_req_data but not necessarily
1267
-     * @return array
1268
-     */
1269
-    protected function _add_datetime_id_to_where_conditions(array $request)
1270
-    {
1271
-        $where = array();
1272
-        if (! empty($request['datetime_id'])) {
1273
-            $where['Ticket.Datetime.DTT_ID'] = absint($request['datetime_id']);
1274
-        }
1275
-        if (! empty($request['DTT_ID'])) {
1276
-            $where['Ticket.Datetime.DTT_ID'] = absint($request['DTT_ID']);
1277
-        }
1278
-        return $where;
1279
-    }
1280
-
1281
-
1282
-    /**
1283
-     * Adds the correct registration status to the where conditions for the registrations query.
1284
-     *
1285
-     * @param array $request usually the same as $this->_req_data but not necessarily
1286
-     * @return array
1287
-     */
1288
-    protected function _add_registration_status_to_where_conditions(array $request)
1289
-    {
1290
-        $where = array();
1291
-        $view = EEH_Array::is_set($request, 'status', '');
1292
-        $registration_status = ! empty($request['_reg_status'])
1293
-            ? sanitize_text_field($request['_reg_status'])
1294
-            : '';
1295
-
1296
-        /*
22
+	/**
23
+	 * @var EE_Registration
24
+	 */
25
+	private $_registration;
26
+
27
+	/**
28
+	 * @var EE_Event
29
+	 */
30
+	private $_reg_event;
31
+
32
+	/**
33
+	 * @var EE_Session
34
+	 */
35
+	private $_session;
36
+
37
+	private static $_reg_status;
38
+
39
+	/**
40
+	 * Form for displaying the custom questions for this registration.
41
+	 * This gets used a few times throughout the request so its best to cache it
42
+	 *
43
+	 * @var EE_Registration_Custom_Questions_Form
44
+	 */
45
+	protected $_reg_custom_questions_form = null;
46
+
47
+
48
+	/**
49
+	 *        constructor
50
+	 *
51
+	 * @Constructor
52
+	 * @access public
53
+	 * @param bool $routing
54
+	 * @return Registrations_Admin_Page
55
+	 */
56
+	public function __construct($routing = true)
57
+	{
58
+		parent::__construct($routing);
59
+		add_action('wp_loaded', array($this, 'wp_loaded'));
60
+	}
61
+
62
+
63
+	public function wp_loaded()
64
+	{
65
+		// when adding a new registration...
66
+		if (isset($this->_req_data['action']) && $this->_req_data['action'] === 'new_registration') {
67
+			EE_System::do_not_cache();
68
+			if (! isset($this->_req_data['processing_registration'])
69
+				|| absint($this->_req_data['processing_registration']) !== 1
70
+			) {
71
+				// and it's NOT the attendee information reg step
72
+				// force cookie expiration by setting time to last week
73
+				setcookie('ee_registration_added', 0, time() - WEEK_IN_SECONDS, '/');
74
+				// and update the global
75
+				$_COOKIE['ee_registration_added'] = 0;
76
+			}
77
+		}
78
+	}
79
+
80
+
81
+	protected function _init_page_props()
82
+	{
83
+		$this->page_slug = REG_PG_SLUG;
84
+		$this->_admin_base_url = REG_ADMIN_URL;
85
+		$this->_admin_base_path = REG_ADMIN;
86
+		$this->page_label = esc_html__('Registrations', 'event_espresso');
87
+		$this->_cpt_routes = array(
88
+			'add_new_attendee' => 'espresso_attendees',
89
+			'edit_attendee'    => 'espresso_attendees',
90
+			'insert_attendee'  => 'espresso_attendees',
91
+			'update_attendee'  => 'espresso_attendees',
92
+		);
93
+		$this->_cpt_model_names = array(
94
+			'add_new_attendee' => 'EEM_Attendee',
95
+			'edit_attendee'    => 'EEM_Attendee',
96
+		);
97
+		$this->_cpt_edit_routes = array(
98
+			'espresso_attendees' => 'edit_attendee',
99
+		);
100
+		$this->_pagenow_map = array(
101
+			'add_new_attendee' => 'post-new.php',
102
+			'edit_attendee'    => 'post.php',
103
+			'trash'            => 'post.php',
104
+		);
105
+		add_action('edit_form_after_title', array($this, 'after_title_form_fields'), 10);
106
+		// add filters so that the comment urls don't take users to a confusing 404 page
107
+		add_filter('get_comment_link', array($this, 'clear_comment_link'), 10, 3);
108
+	}
109
+
110
+
111
+	public function clear_comment_link($link, $comment, $args)
112
+	{
113
+		// gotta make sure this only happens on this route
114
+		$post_type = get_post_type($comment->comment_post_ID);
115
+		if ($post_type === 'espresso_attendees') {
116
+			return '#commentsdiv';
117
+		}
118
+		return $link;
119
+	}
120
+
121
+
122
+	protected function _ajax_hooks()
123
+	{
124
+		// todo: all hooks for registrations ajax goes in here
125
+		add_action('wp_ajax_toggle_checkin_status', array($this, 'toggle_checkin_status'));
126
+	}
127
+
128
+
129
+	protected function _define_page_props()
130
+	{
131
+		$this->_admin_page_title = $this->page_label;
132
+		$this->_labels = array(
133
+			'buttons'                      => array(
134
+				'add-registrant'      => esc_html__('Add New Registration', 'event_espresso'),
135
+				'add-attendee'        => esc_html__('Add Contact', 'event_espresso'),
136
+				'edit'                => esc_html__('Edit Contact', 'event_espresso'),
137
+				'report'              => esc_html__("Event Registrations CSV Report", "event_espresso"),
138
+				'report_all'          => esc_html__('All Registrations CSV Report', 'event_espresso'),
139
+				'report_filtered'     => esc_html__('Filtered CSV Report', 'event_espresso'),
140
+				'contact_list_report' => esc_html__('Contact List Report', 'event_espresso'),
141
+				'contact_list_export' => esc_html__("Export Data", "event_espresso"),
142
+			),
143
+			'publishbox'                   => array(
144
+				'add_new_attendee' => esc_html__("Add Contact Record", 'event_espresso'),
145
+				'edit_attendee'    => esc_html__("Update Contact Record", 'event_espresso'),
146
+			),
147
+			'hide_add_button_on_cpt_route' => array(
148
+				'edit_attendee' => true,
149
+			),
150
+		);
151
+	}
152
+
153
+
154
+	/**
155
+	 *        grab url requests and route them
156
+	 *
157
+	 * @access private
158
+	 * @return void
159
+	 */
160
+	public function _set_page_routes()
161
+	{
162
+		$this->_get_registration_status_array();
163
+		$reg_id = ! empty($this->_req_data['_REG_ID']) && ! is_array($this->_req_data['_REG_ID'])
164
+			? $this->_req_data['_REG_ID'] : 0;
165
+		$reg_id = empty($reg_id) && ! empty($this->_req_data['reg_status_change_form']['REG_ID'])
166
+			? $this->_req_data['reg_status_change_form']['REG_ID']
167
+			: $reg_id;
168
+		$att_id = ! empty($this->_req_data['ATT_ID']) && ! is_array($this->_req_data['ATT_ID'])
169
+			? $this->_req_data['ATT_ID'] : 0;
170
+		$att_id = ! empty($this->_req_data['post']) && ! is_array($this->_req_data['post'])
171
+			? $this->_req_data['post']
172
+			: $att_id;
173
+		$this->_page_routes = array(
174
+			'default'                             => array(
175
+				'func'       => '_registrations_overview_list_table',
176
+				'capability' => 'ee_read_registrations',
177
+			),
178
+			'view_registration'                   => array(
179
+				'func'       => '_registration_details',
180
+				'capability' => 'ee_read_registration',
181
+				'obj_id'     => $reg_id,
182
+			),
183
+			'edit_registration'                   => array(
184
+				'func'               => '_update_attendee_registration_form',
185
+				'noheader'           => true,
186
+				'headers_sent_route' => 'view_registration',
187
+				'capability'         => 'ee_edit_registration',
188
+				'obj_id'             => $reg_id,
189
+				'_REG_ID'            => $reg_id,
190
+			),
191
+			'trash_registrations'                 => array(
192
+				'func'       => '_trash_or_restore_registrations',
193
+				'args'       => array('trash' => true),
194
+				'noheader'   => true,
195
+				'capability' => 'ee_delete_registrations',
196
+			),
197
+			'restore_registrations'               => array(
198
+				'func'       => '_trash_or_restore_registrations',
199
+				'args'       => array('trash' => false),
200
+				'noheader'   => true,
201
+				'capability' => 'ee_delete_registrations',
202
+			),
203
+			'delete_registrations'                => array(
204
+				'func'       => '_delete_registrations',
205
+				'noheader'   => true,
206
+				'capability' => 'ee_delete_registrations',
207
+			),
208
+			'new_registration'                    => array(
209
+				'func'       => 'new_registration',
210
+				'capability' => 'ee_edit_registrations',
211
+			),
212
+			'process_reg_step'                    => array(
213
+				'func'       => 'process_reg_step',
214
+				'noheader'   => true,
215
+				'capability' => 'ee_edit_registrations',
216
+			),
217
+			'redirect_to_txn'                     => array(
218
+				'func'       => 'redirect_to_txn',
219
+				'noheader'   => true,
220
+				'capability' => 'ee_edit_registrations',
221
+			),
222
+			'change_reg_status'                   => array(
223
+				'func'       => '_change_reg_status',
224
+				'noheader'   => true,
225
+				'capability' => 'ee_edit_registration',
226
+				'obj_id'     => $reg_id,
227
+			),
228
+			'approve_registration'                => array(
229
+				'func'       => 'approve_registration',
230
+				'noheader'   => true,
231
+				'capability' => 'ee_edit_registration',
232
+				'obj_id'     => $reg_id,
233
+			),
234
+			'approve_and_notify_registration'     => array(
235
+				'func'       => 'approve_registration',
236
+				'noheader'   => true,
237
+				'args'       => array(true),
238
+				'capability' => 'ee_edit_registration',
239
+				'obj_id'     => $reg_id,
240
+			),
241
+			'approve_registrations'               => array(
242
+				'func'       => 'bulk_action_on_registrations',
243
+				'noheader'   => true,
244
+				'capability' => 'ee_edit_registrations',
245
+				'args'       => array('approve'),
246
+			),
247
+			'approve_and_notify_registrations'    => array(
248
+				'func'       => 'bulk_action_on_registrations',
249
+				'noheader'   => true,
250
+				'capability' => 'ee_edit_registrations',
251
+				'args'       => array('approve', true),
252
+			),
253
+			'decline_registration'                => array(
254
+				'func'       => 'decline_registration',
255
+				'noheader'   => true,
256
+				'capability' => 'ee_edit_registration',
257
+				'obj_id'     => $reg_id,
258
+			),
259
+			'decline_and_notify_registration'     => array(
260
+				'func'       => 'decline_registration',
261
+				'noheader'   => true,
262
+				'args'       => array(true),
263
+				'capability' => 'ee_edit_registration',
264
+				'obj_id'     => $reg_id,
265
+			),
266
+			'decline_registrations'               => array(
267
+				'func'       => 'bulk_action_on_registrations',
268
+				'noheader'   => true,
269
+				'capability' => 'ee_edit_registrations',
270
+				'args'       => array('decline'),
271
+			),
272
+			'decline_and_notify_registrations'    => array(
273
+				'func'       => 'bulk_action_on_registrations',
274
+				'noheader'   => true,
275
+				'capability' => 'ee_edit_registrations',
276
+				'args'       => array('decline', true),
277
+			),
278
+			'pending_registration'                => array(
279
+				'func'       => 'pending_registration',
280
+				'noheader'   => true,
281
+				'capability' => 'ee_edit_registration',
282
+				'obj_id'     => $reg_id,
283
+			),
284
+			'pending_and_notify_registration'     => array(
285
+				'func'       => 'pending_registration',
286
+				'noheader'   => true,
287
+				'args'       => array(true),
288
+				'capability' => 'ee_edit_registration',
289
+				'obj_id'     => $reg_id,
290
+			),
291
+			'pending_registrations'               => array(
292
+				'func'       => 'bulk_action_on_registrations',
293
+				'noheader'   => true,
294
+				'capability' => 'ee_edit_registrations',
295
+				'args'       => array('pending'),
296
+			),
297
+			'pending_and_notify_registrations'    => array(
298
+				'func'       => 'bulk_action_on_registrations',
299
+				'noheader'   => true,
300
+				'capability' => 'ee_edit_registrations',
301
+				'args'       => array('pending', true),
302
+			),
303
+			'no_approve_registration'             => array(
304
+				'func'       => 'not_approve_registration',
305
+				'noheader'   => true,
306
+				'capability' => 'ee_edit_registration',
307
+				'obj_id'     => $reg_id,
308
+			),
309
+			'no_approve_and_notify_registration'  => array(
310
+				'func'       => 'not_approve_registration',
311
+				'noheader'   => true,
312
+				'args'       => array(true),
313
+				'capability' => 'ee_edit_registration',
314
+				'obj_id'     => $reg_id,
315
+			),
316
+			'no_approve_registrations'            => array(
317
+				'func'       => 'bulk_action_on_registrations',
318
+				'noheader'   => true,
319
+				'capability' => 'ee_edit_registrations',
320
+				'args'       => array('not_approve'),
321
+			),
322
+			'no_approve_and_notify_registrations' => array(
323
+				'func'       => 'bulk_action_on_registrations',
324
+				'noheader'   => true,
325
+				'capability' => 'ee_edit_registrations',
326
+				'args'       => array('not_approve', true),
327
+			),
328
+			'cancel_registration'                 => array(
329
+				'func'       => 'cancel_registration',
330
+				'noheader'   => true,
331
+				'capability' => 'ee_edit_registration',
332
+				'obj_id'     => $reg_id,
333
+			),
334
+			'cancel_and_notify_registration'      => array(
335
+				'func'       => 'cancel_registration',
336
+				'noheader'   => true,
337
+				'args'       => array(true),
338
+				'capability' => 'ee_edit_registration',
339
+				'obj_id'     => $reg_id,
340
+			),
341
+			'cancel_registrations'                => array(
342
+				'func'       => 'bulk_action_on_registrations',
343
+				'noheader'   => true,
344
+				'capability' => 'ee_edit_registrations',
345
+				'args'       => array('cancel'),
346
+			),
347
+			'cancel_and_notify_registrations'     => array(
348
+				'func'       => 'bulk_action_on_registrations',
349
+				'noheader'   => true,
350
+				'capability' => 'ee_edit_registrations',
351
+				'args'       => array('cancel', true),
352
+			),
353
+			'wait_list_registration'              => array(
354
+				'func'       => 'wait_list_registration',
355
+				'noheader'   => true,
356
+				'capability' => 'ee_edit_registration',
357
+				'obj_id'     => $reg_id,
358
+			),
359
+			'wait_list_and_notify_registration'   => array(
360
+				'func'       => 'wait_list_registration',
361
+				'noheader'   => true,
362
+				'args'       => array(true),
363
+				'capability' => 'ee_edit_registration',
364
+				'obj_id'     => $reg_id,
365
+			),
366
+			'contact_list'                        => array(
367
+				'func'       => '_attendee_contact_list_table',
368
+				'capability' => 'ee_read_contacts',
369
+			),
370
+			'add_new_attendee'                    => array(
371
+				'func' => '_create_new_cpt_item',
372
+				'args' => array(
373
+					'new_attendee' => true,
374
+					'capability'   => 'ee_edit_contacts',
375
+				),
376
+			),
377
+			'edit_attendee'                       => array(
378
+				'func'       => '_edit_cpt_item',
379
+				'capability' => 'ee_edit_contacts',
380
+				'obj_id'     => $att_id,
381
+			),
382
+			'duplicate_attendee'                  => array(
383
+				'func'       => '_duplicate_attendee',
384
+				'noheader'   => true,
385
+				'capability' => 'ee_edit_contacts',
386
+				'obj_id'     => $att_id,
387
+			),
388
+			'insert_attendee'                     => array(
389
+				'func'       => '_insert_or_update_attendee',
390
+				'args'       => array(
391
+					'new_attendee' => true,
392
+				),
393
+				'noheader'   => true,
394
+				'capability' => 'ee_edit_contacts',
395
+			),
396
+			'update_attendee'                     => array(
397
+				'func'       => '_insert_or_update_attendee',
398
+				'args'       => array(
399
+					'new_attendee' => false,
400
+				),
401
+				'noheader'   => true,
402
+				'capability' => 'ee_edit_contacts',
403
+				'obj_id'     => $att_id,
404
+			),
405
+			'trash_attendees'                     => array(
406
+				'func'       => '_trash_or_restore_attendees',
407
+				'args'       => array(
408
+					'trash' => 'true',
409
+				),
410
+				'noheader'   => true,
411
+				'capability' => 'ee_delete_contacts',
412
+			),
413
+			'trash_attendee'                      => array(
414
+				'func'       => '_trash_or_restore_attendees',
415
+				'args'       => array(
416
+					'trash' => true,
417
+				),
418
+				'noheader'   => true,
419
+				'capability' => 'ee_delete_contacts',
420
+				'obj_id'     => $att_id,
421
+			),
422
+			'restore_attendees'                   => array(
423
+				'func'       => '_trash_or_restore_attendees',
424
+				'args'       => array(
425
+					'trash' => false,
426
+				),
427
+				'noheader'   => true,
428
+				'capability' => 'ee_delete_contacts',
429
+				'obj_id'     => $att_id,
430
+			),
431
+			'resend_registration'                 => array(
432
+				'func'       => '_resend_registration',
433
+				'noheader'   => true,
434
+				'capability' => 'ee_send_message',
435
+			),
436
+			'registrations_report'                => array(
437
+				'func'       => '_registrations_report',
438
+				'noheader'   => true,
439
+				'capability' => 'ee_read_registrations',
440
+			),
441
+			'contact_list_export'                 => array(
442
+				'func'       => '_contact_list_export',
443
+				'noheader'   => true,
444
+				'capability' => 'export',
445
+			),
446
+			'contact_list_report'                 => array(
447
+				'func'       => '_contact_list_report',
448
+				'noheader'   => true,
449
+				'capability' => 'ee_read_contacts',
450
+			),
451
+		);
452
+	}
453
+
454
+
455
+	protected function _set_page_config()
456
+	{
457
+		$this->_page_config = array(
458
+			'default'           => array(
459
+				'nav'           => array(
460
+					'label' => esc_html__('Overview', 'event_espresso'),
461
+					'order' => 5,
462
+				),
463
+				'help_tabs'     => array(
464
+					'registrations_overview_help_tab'                       => array(
465
+						'title'    => esc_html__('Registrations Overview', 'event_espresso'),
466
+						'filename' => 'registrations_overview',
467
+					),
468
+					'registrations_overview_table_column_headings_help_tab' => array(
469
+						'title'    => esc_html__('Registrations Table Column Headings', 'event_espresso'),
470
+						'filename' => 'registrations_overview_table_column_headings',
471
+					),
472
+					'registrations_overview_filters_help_tab'               => array(
473
+						'title'    => esc_html__('Registration Filters', 'event_espresso'),
474
+						'filename' => 'registrations_overview_filters',
475
+					),
476
+					'registrations_overview_views_help_tab'                 => array(
477
+						'title'    => esc_html__('Registration Views', 'event_espresso'),
478
+						'filename' => 'registrations_overview_views',
479
+					),
480
+					'registrations_regoverview_other_help_tab'              => array(
481
+						'title'    => esc_html__('Registrations Other', 'event_espresso'),
482
+						'filename' => 'registrations_overview_other',
483
+					),
484
+				),
485
+				'help_tour'     => array('Registration_Overview_Help_Tour'),
486
+				'qtips'         => array('Registration_List_Table_Tips'),
487
+				'list_table'    => 'EE_Registrations_List_Table',
488
+				'require_nonce' => false,
489
+			),
490
+			'view_registration' => array(
491
+				'nav'           => array(
492
+					'label'      => esc_html__('REG Details', 'event_espresso'),
493
+					'order'      => 15,
494
+					'url'        => isset($this->_req_data['_REG_ID'])
495
+						? add_query_arg(array('_REG_ID' => $this->_req_data['_REG_ID']), $this->_current_page_view_url)
496
+						: $this->_admin_base_url,
497
+					'persistent' => false,
498
+				),
499
+				'help_tabs'     => array(
500
+					'registrations_details_help_tab'                    => array(
501
+						'title'    => esc_html__('Registration Details', 'event_espresso'),
502
+						'filename' => 'registrations_details',
503
+					),
504
+					'registrations_details_table_help_tab'              => array(
505
+						'title'    => esc_html__('Registration Details Table', 'event_espresso'),
506
+						'filename' => 'registrations_details_table',
507
+					),
508
+					'registrations_details_form_answers_help_tab'       => array(
509
+						'title'    => esc_html__('Registration Form Answers', 'event_espresso'),
510
+						'filename' => 'registrations_details_form_answers',
511
+					),
512
+					'registrations_details_registrant_details_help_tab' => array(
513
+						'title'    => esc_html__('Contact Details', 'event_espresso'),
514
+						'filename' => 'registrations_details_registrant_details',
515
+					),
516
+				),
517
+				'help_tour'     => array('Registration_Details_Help_Tour'),
518
+				'metaboxes'     => array_merge(
519
+					$this->_default_espresso_metaboxes,
520
+					array('_registration_details_metaboxes')
521
+				),
522
+				'require_nonce' => false,
523
+			),
524
+			'new_registration'  => array(
525
+				'nav'           => array(
526
+					'label'      => esc_html__('Add New Registration', 'event_espresso'),
527
+					'url'        => '#',
528
+					'order'      => 15,
529
+					'persistent' => false,
530
+				),
531
+				'metaboxes'     => $this->_default_espresso_metaboxes,
532
+				'labels'        => array(
533
+					'publishbox' => esc_html__('Save Registration', 'event_espresso'),
534
+				),
535
+				'require_nonce' => false,
536
+			),
537
+			'add_new_attendee'  => array(
538
+				'nav'           => array(
539
+					'label'      => esc_html__('Add Contact', 'event_espresso'),
540
+					'order'      => 15,
541
+					'persistent' => false,
542
+				),
543
+				'metaboxes'     => array_merge(
544
+					$this->_default_espresso_metaboxes,
545
+					array('_publish_post_box', 'attendee_editor_metaboxes')
546
+				),
547
+				'require_nonce' => false,
548
+			),
549
+			'edit_attendee'     => array(
550
+				'nav'           => array(
551
+					'label'      => esc_html__('Edit Contact', 'event_espresso'),
552
+					'order'      => 15,
553
+					'persistent' => false,
554
+					'url'        => isset($this->_req_data['ATT_ID'])
555
+						? add_query_arg(array('ATT_ID' => $this->_req_data['ATT_ID']), $this->_current_page_view_url)
556
+						: $this->_admin_base_url,
557
+				),
558
+				'metaboxes'     => array('attendee_editor_metaboxes'),
559
+				'require_nonce' => false,
560
+			),
561
+			'contact_list'      => array(
562
+				'nav'           => array(
563
+					'label' => esc_html__('Contact List', 'event_espresso'),
564
+					'order' => 20,
565
+				),
566
+				'list_table'    => 'EE_Attendee_Contact_List_Table',
567
+				'help_tabs'     => array(
568
+					'registrations_contact_list_help_tab'                       => array(
569
+						'title'    => esc_html__('Registrations Contact List', 'event_espresso'),
570
+						'filename' => 'registrations_contact_list',
571
+					),
572
+					'registrations_contact-list_table_column_headings_help_tab' => array(
573
+						'title'    => esc_html__('Contact List Table Column Headings', 'event_espresso'),
574
+						'filename' => 'registrations_contact_list_table_column_headings',
575
+					),
576
+					'registrations_contact_list_views_help_tab'                 => array(
577
+						'title'    => esc_html__('Contact List Views', 'event_espresso'),
578
+						'filename' => 'registrations_contact_list_views',
579
+					),
580
+					'registrations_contact_list_other_help_tab'                 => array(
581
+						'title'    => esc_html__('Contact List Other', 'event_espresso'),
582
+						'filename' => 'registrations_contact_list_other',
583
+					),
584
+				),
585
+				'help_tour'     => array('Contact_List_Help_Tour'),
586
+				'metaboxes'     => array(),
587
+				'require_nonce' => false,
588
+			),
589
+			// override default cpt routes
590
+			'create_new'        => '',
591
+			'edit'              => '',
592
+		);
593
+	}
594
+
595
+
596
+	/**
597
+	 * The below methods aren't used by this class currently
598
+	 */
599
+	protected function _add_screen_options()
600
+	{
601
+	}
602
+
603
+
604
+	protected function _add_feature_pointers()
605
+	{
606
+	}
607
+
608
+
609
+	public function admin_init()
610
+	{
611
+		EE_Registry::$i18n_js_strings['update_att_qstns'] = esc_html__(
612
+			'click "Update Registration Questions" to save your changes',
613
+			'event_espresso'
614
+		);
615
+	}
616
+
617
+
618
+	public function admin_notices()
619
+	{
620
+	}
621
+
622
+
623
+	public function admin_footer_scripts()
624
+	{
625
+	}
626
+
627
+
628
+	/**
629
+	 *        get list of registration statuses
630
+	 *
631
+	 * @access private
632
+	 * @return void
633
+	 * @throws EE_Error
634
+	 */
635
+	private function _get_registration_status_array()
636
+	{
637
+		self::$_reg_status = EEM_Registration::reg_status_array(array(), true);
638
+	}
639
+
640
+
641
+	protected function _add_screen_options_default()
642
+	{
643
+		$this->_per_page_screen_option();
644
+	}
645
+
646
+
647
+	protected function _add_screen_options_contact_list()
648
+	{
649
+		$page_title = $this->_admin_page_title;
650
+		$this->_admin_page_title = esc_html__("Contacts", 'event_espresso');
651
+		$this->_per_page_screen_option();
652
+		$this->_admin_page_title = $page_title;
653
+	}
654
+
655
+
656
+	public function load_scripts_styles()
657
+	{
658
+		// style
659
+		wp_register_style(
660
+			'espresso_reg',
661
+			REG_ASSETS_URL . 'espresso_registrations_admin.css',
662
+			array('ee-admin-css'),
663
+			EVENT_ESPRESSO_VERSION
664
+		);
665
+		wp_enqueue_style('espresso_reg');
666
+		// script
667
+		wp_register_script(
668
+			'espresso_reg',
669
+			REG_ASSETS_URL . 'espresso_registrations_admin.js',
670
+			array('jquery-ui-datepicker', 'jquery-ui-draggable', 'ee_admin_js'),
671
+			EVENT_ESPRESSO_VERSION,
672
+			true
673
+		);
674
+		wp_enqueue_script('espresso_reg');
675
+	}
676
+
677
+
678
+	public function load_scripts_styles_edit_attendee()
679
+	{
680
+		// stuff to only show up on our attendee edit details page.
681
+		$attendee_details_translations = array(
682
+			'att_publish_text' => sprintf(
683
+				esc_html__('Created on: <b>%1$s</b>', 'event_espresso'),
684
+				$this->_cpt_model_obj->get_datetime('ATT_created')
685
+			),
686
+		);
687
+		wp_localize_script('espresso_reg', 'ATTENDEE_DETAILS', $attendee_details_translations);
688
+		wp_enqueue_script('jquery-validate');
689
+	}
690
+
691
+
692
+	public function load_scripts_styles_view_registration()
693
+	{
694
+		// styles
695
+		wp_enqueue_style('espresso-ui-theme');
696
+		// scripts
697
+		$this->_get_reg_custom_questions_form($this->_registration->ID());
698
+		$this->_reg_custom_questions_form->wp_enqueue_scripts(true);
699
+	}
700
+
701
+
702
+	public function load_scripts_styles_contact_list()
703
+	{
704
+		wp_dequeue_style('espresso_reg');
705
+		wp_register_style(
706
+			'espresso_att',
707
+			REG_ASSETS_URL . 'espresso_attendees_admin.css',
708
+			array('ee-admin-css'),
709
+			EVENT_ESPRESSO_VERSION
710
+		);
711
+		wp_enqueue_style('espresso_att');
712
+	}
713
+
714
+
715
+	public function load_scripts_styles_new_registration()
716
+	{
717
+		wp_register_script(
718
+			'ee-spco-for-admin',
719
+			REG_ASSETS_URL . 'spco_for_admin.js',
720
+			array('underscore', 'jquery'),
721
+			EVENT_ESPRESSO_VERSION,
722
+			true
723
+		);
724
+		wp_enqueue_script('ee-spco-for-admin');
725
+		add_filter('FHEE__EED_Ticket_Selector__load_tckt_slctr_assets', '__return_true');
726
+		EE_Form_Section_Proper::wp_enqueue_scripts();
727
+		EED_Ticket_Selector::load_tckt_slctr_assets();
728
+		EE_Datepicker_Input::enqueue_styles_and_scripts();
729
+	}
730
+
731
+
732
+	public function AHEE__EE_Admin_Page__route_admin_request_resend_registration()
733
+	{
734
+		add_filter('FHEE_load_EE_messages', '__return_true');
735
+	}
736
+
737
+
738
+	public function AHEE__EE_Admin_Page__route_admin_request_approve_registration()
739
+	{
740
+		add_filter('FHEE_load_EE_messages', '__return_true');
741
+	}
742
+
743
+
744
+	protected function _set_list_table_views_default()
745
+	{
746
+		// for notification related bulk actions we need to make sure only active messengers have an option.
747
+		EED_Messages::set_autoloaders();
748
+		/** @type EE_Message_Resource_Manager $message_resource_manager */
749
+		$message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
750
+		$active_mts = $message_resource_manager->list_of_active_message_types();
751
+		// key= bulk_action_slug, value= message type.
752
+		$match_array = array(
753
+			'approve_registrations'    => 'registration',
754
+			'decline_registrations'    => 'declined_registration',
755
+			'pending_registrations'    => 'pending_approval',
756
+			'no_approve_registrations' => 'not_approved_registration',
757
+			'cancel_registrations'     => 'cancelled_registration',
758
+		);
759
+		$can_send = EE_Registry::instance()->CAP->current_user_can(
760
+			'ee_send_message',
761
+			'batch_send_messages'
762
+		);
763
+		/** setup reg status bulk actions **/
764
+		$def_reg_status_actions['approve_registrations'] = esc_html__('Approve Registrations', 'event_espresso');
765
+		if ($can_send && in_array($match_array['approve_registrations'], $active_mts, true)) {
766
+			$def_reg_status_actions['approve_and_notify_registrations'] = esc_html__(
767
+				'Approve and Notify Registrations',
768
+				'event_espresso'
769
+			);
770
+		}
771
+		$def_reg_status_actions['decline_registrations'] = esc_html__('Decline Registrations', 'event_espresso');
772
+		if ($can_send && in_array($match_array['decline_registrations'], $active_mts, true)) {
773
+			$def_reg_status_actions['decline_and_notify_registrations'] = esc_html__(
774
+				'Decline and Notify Registrations',
775
+				'event_espresso'
776
+			);
777
+		}
778
+		$def_reg_status_actions['pending_registrations'] = esc_html__(
779
+			'Set Registrations to Pending Payment',
780
+			'event_espresso'
781
+		);
782
+		if ($can_send && in_array($match_array['pending_registrations'], $active_mts, true)) {
783
+			$def_reg_status_actions['pending_and_notify_registrations'] = esc_html__(
784
+				'Set Registrations to Pending Payment and Notify',
785
+				'event_espresso'
786
+			);
787
+		}
788
+		$def_reg_status_actions['no_approve_registrations'] = esc_html__(
789
+			'Set Registrations to Not Approved',
790
+			'event_espresso'
791
+		);
792
+		if ($can_send && in_array($match_array['no_approve_registrations'], $active_mts, true)) {
793
+			$def_reg_status_actions['no_approve_and_notify_registrations'] = esc_html__(
794
+				'Set Registrations to Not Approved and Notify',
795
+				'event_espresso'
796
+			);
797
+		}
798
+		$def_reg_status_actions['cancel_registrations'] = esc_html__('Cancel Registrations', 'event_espresso');
799
+		if ($can_send && in_array($match_array['cancel_registrations'], $active_mts, true)) {
800
+			$def_reg_status_actions['cancel_and_notify_registrations'] = esc_html__(
801
+				'Cancel Registrations and Notify',
802
+				'event_espresso'
803
+			);
804
+		}
805
+		$def_reg_status_actions = apply_filters(
806
+			'FHEE__Registrations_Admin_Page___set_list_table_views_default__def_reg_status_actions_array',
807
+			$def_reg_status_actions,
808
+			$active_mts,
809
+			$can_send
810
+		);
811
+
812
+		$this->_views = array(
813
+			'all'   => array(
814
+				'slug'        => 'all',
815
+				'label'       => esc_html__('View All Registrations', 'event_espresso'),
816
+				'count'       => 0,
817
+				'bulk_action' => array_merge(
818
+					$def_reg_status_actions,
819
+					array(
820
+						'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
821
+					)
822
+				),
823
+			),
824
+			'month' => array(
825
+				'slug'        => 'month',
826
+				'label'       => esc_html__('This Month', 'event_espresso'),
827
+				'count'       => 0,
828
+				'bulk_action' => array_merge(
829
+					$def_reg_status_actions,
830
+					array(
831
+						'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
832
+					)
833
+				),
834
+			),
835
+			'today' => array(
836
+				'slug'        => 'today',
837
+				'label'       => sprintf(
838
+					esc_html__('Today - %s', 'event_espresso'),
839
+					date('M d, Y', current_time('timestamp'))
840
+				),
841
+				'count'       => 0,
842
+				'bulk_action' => array_merge(
843
+					$def_reg_status_actions,
844
+					array(
845
+						'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
846
+					)
847
+				),
848
+			),
849
+		);
850
+		if (EE_Registry::instance()->CAP->current_user_can(
851
+			'ee_delete_registrations',
852
+			'espresso_registrations_delete_registration'
853
+		)) {
854
+			$this->_views['incomplete'] = array(
855
+				'slug'        => 'incomplete',
856
+				'label'       => esc_html__('Incomplete', 'event_espresso'),
857
+				'count'       => 0,
858
+				'bulk_action' => array(
859
+					'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
860
+				),
861
+			);
862
+			$this->_views['trash'] = array(
863
+				'slug'        => 'trash',
864
+				'label'       => esc_html__('Trash', 'event_espresso'),
865
+				'count'       => 0,
866
+				'bulk_action' => array(
867
+					'restore_registrations' => esc_html__('Restore Registrations', 'event_espresso'),
868
+					'delete_registrations'  => esc_html__('Delete Registrations Permanently', 'event_espresso'),
869
+				),
870
+			);
871
+		}
872
+	}
873
+
874
+
875
+	protected function _set_list_table_views_contact_list()
876
+	{
877
+		$this->_views = array(
878
+			'in_use' => array(
879
+				'slug'        => 'in_use',
880
+				'label'       => esc_html__('In Use', 'event_espresso'),
881
+				'count'       => 0,
882
+				'bulk_action' => array(
883
+					'trash_attendees' => esc_html__('Move to Trash', 'event_espresso'),
884
+				),
885
+			),
886
+		);
887
+		if (EE_Registry::instance()->CAP->current_user_can(
888
+			'ee_delete_contacts',
889
+			'espresso_registrations_trash_attendees'
890
+		)
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
+		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
+			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
+			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
+			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
+		 *
1166
+		 * @link https://events.codebasehq.com/projects/event-espresso/tickets/10093
1167
+		 * @see https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md
1168
+		 *                             or if you have the development copy of EE you can view this at the path:
1169
+		 *                             /docs/G--Model-System/model-query-params.md
1170
+		 */
1171
+		$query_params['group_by'] = '';
1172
+
1173
+		return $count
1174
+			? EEM_Registration::instance()->count($query_params)
1175
+			/** @type EE_Registration[] */
1176
+			: EEM_Registration::instance()->get_all($query_params);
1177
+	}
1178
+
1179
+
1180
+	/**
1181
+	 * Retrieves the query parameters to be used by the Registration model for getting registrations.
1182
+	 * Note: this listens to values on the request for some of the query parameters.
1183
+	 *
1184
+	 * @param array $request
1185
+	 * @param int   $per_page
1186
+	 * @param bool  $count
1187
+	 * @return array
1188
+	 * @throws EE_Error
1189
+	 */
1190
+	protected function _get_registration_query_parameters(
1191
+		$request = array(),
1192
+		$per_page = 10,
1193
+		$count = false
1194
+	) {
1195
+
1196
+		$query_params = array(
1197
+			0                          => $this->_get_where_conditions_for_registrations_query(
1198
+				$request
1199
+			),
1200
+			'caps'                     => EEM_Registration::caps_read_admin,
1201
+			'default_where_conditions' => 'this_model_only',
1202
+		);
1203
+		if (! $count) {
1204
+			$query_params = array_merge(
1205
+				$query_params,
1206
+				$this->_get_orderby_for_registrations_query(),
1207
+				$this->_get_limit($per_page)
1208
+			);
1209
+		}
1210
+
1211
+		return $query_params;
1212
+	}
1213
+
1214
+
1215
+	/**
1216
+	 * This will add ATT_ID to the provided $where array for EE model query parameters.
1217
+	 *
1218
+	 * @param array $request usually the same as $this->_req_data but not necessarily
1219
+	 * @return array
1220
+	 */
1221
+	protected function addAttendeeIdToWhereConditions(array $request)
1222
+	{
1223
+		$where = array();
1224
+		if (! empty($request['ATT_ID'])) {
1225
+			$where['ATT_ID'] = absint($request['ATT_ID']);
1226
+		}
1227
+		return $where;
1228
+	}
1229
+
1230
+
1231
+	/**
1232
+	 * This will add EVT_ID to the provided $where array for EE model query parameters.
1233
+	 *
1234
+	 * @param array $request usually the same as $this->_req_data but not necessarily
1235
+	 * @return array
1236
+	 */
1237
+	protected function _add_event_id_to_where_conditions(array $request)
1238
+	{
1239
+		$where = array();
1240
+		if (! empty($request['event_id'])) {
1241
+			$where['EVT_ID'] = absint($request['event_id']);
1242
+		}
1243
+		return $where;
1244
+	}
1245
+
1246
+
1247
+	/**
1248
+	 * Adds category ID if it exists in the request to the where conditions for the registrations query.
1249
+	 *
1250
+	 * @param array $request usually the same as $this->_req_data but not necessarily
1251
+	 * @return array
1252
+	 */
1253
+	protected function _add_category_id_to_where_conditions(array $request)
1254
+	{
1255
+		$where = array();
1256
+		if (! empty($request['EVT_CAT']) && (int) $request['EVT_CAT'] !== -1) {
1257
+			$where['Event.Term_Taxonomy.term_id'] = absint($request['EVT_CAT']);
1258
+		}
1259
+		return $where;
1260
+	}
1261
+
1262
+
1263
+	/**
1264
+	 * Adds the datetime ID if it exists in the request to the where conditions for the registrations query.
1265
+	 *
1266
+	 * @param array $request usually the same as $this->_req_data but not necessarily
1267
+	 * @return array
1268
+	 */
1269
+	protected function _add_datetime_id_to_where_conditions(array $request)
1270
+	{
1271
+		$where = array();
1272
+		if (! empty($request['datetime_id'])) {
1273
+			$where['Ticket.Datetime.DTT_ID'] = absint($request['datetime_id']);
1274
+		}
1275
+		if (! empty($request['DTT_ID'])) {
1276
+			$where['Ticket.Datetime.DTT_ID'] = absint($request['DTT_ID']);
1277
+		}
1278
+		return $where;
1279
+	}
1280
+
1281
+
1282
+	/**
1283
+	 * Adds the correct registration status to the where conditions for the registrations query.
1284
+	 *
1285
+	 * @param array $request usually the same as $this->_req_data but not necessarily
1286
+	 * @return array
1287
+	 */
1288
+	protected function _add_registration_status_to_where_conditions(array $request)
1289
+	{
1290
+		$where = array();
1291
+		$view = EEH_Array::is_set($request, 'status', '');
1292
+		$registration_status = ! empty($request['_reg_status'])
1293
+			? sanitize_text_field($request['_reg_status'])
1294
+			: '';
1295
+
1296
+		/*
1297 1297
          * If filtering by registration status, then we show registrations matching that status.
1298 1298
          * If not filtering by specified status, then we show all registrations excluding incomplete registrations
1299 1299
          * UNLESS viewing trashed registrations.
1300 1300
          */
1301
-        if (! empty($registration_status)) {
1302
-            $where['STS_ID'] = $registration_status;
1303
-        } else {
1304
-            // make sure we exclude incomplete registrations, but only if not trashed.
1305
-            if ($view === 'trash') {
1306
-                $where['REG_deleted'] = true;
1307
-            } elseif ($view === 'incomplete') {
1308
-                $where['STS_ID'] = EEM_Registration::status_id_incomplete;
1309
-            } else {
1310
-                $where['STS_ID'] = array('!=', EEM_Registration::status_id_incomplete);
1311
-            }
1312
-        }
1313
-        return $where;
1314
-    }
1315
-
1316
-
1317
-    /**
1318
-     * Adds any provided date restraints to the where conditions for the registrations query.
1319
-     *
1320
-     * @param array $request usually the same as $this->_req_data but not necessarily
1321
-     * @return array
1322
-     * @throws EE_Error
1323
-     * @throws InvalidArgumentException
1324
-     * @throws InvalidDataTypeException
1325
-     * @throws InvalidInterfaceException
1326
-     */
1327
-    protected function _add_date_to_where_conditions(array $request)
1328
-    {
1329
-        $where = array();
1330
-        $view = EEH_Array::is_set($request, 'status', '');
1331
-        $month_range = ! empty($request['month_range'])
1332
-            ? sanitize_text_field($request['month_range'])
1333
-            : '';
1334
-        $retrieve_for_today = $view === 'today';
1335
-        $retrieve_for_this_month = $view === 'month';
1336
-
1337
-        if ($retrieve_for_today) {
1338
-            $now = date('Y-m-d', current_time('timestamp'));
1339
-            $where['REG_date'] = array(
1340
-                'BETWEEN',
1341
-                array(
1342
-                    EEM_Registration::instance()->convert_datetime_for_query(
1343
-                        'REG_date',
1344
-                        $now . ' 00:00:00',
1345
-                        'Y-m-d H:i:s'
1346
-                    ),
1347
-                    EEM_Registration::instance()->convert_datetime_for_query(
1348
-                        'REG_date',
1349
-                        $now . ' 23:59:59',
1350
-                        'Y-m-d H:i:s'
1351
-                    ),
1352
-                ),
1353
-            );
1354
-        } elseif ($retrieve_for_this_month) {
1355
-            $current_year_and_month = date('Y-m', current_time('timestamp'));
1356
-            $days_this_month = date('t', current_time('timestamp'));
1357
-            $where['REG_date'] = array(
1358
-                'BETWEEN',
1359
-                array(
1360
-                    EEM_Registration::instance()->convert_datetime_for_query(
1361
-                        'REG_date',
1362
-                        $current_year_and_month . '-01 00:00:00',
1363
-                        'Y-m-d H:i:s'
1364
-                    ),
1365
-                    EEM_Registration::instance()->convert_datetime_for_query(
1366
-                        'REG_date',
1367
-                        $current_year_and_month . '-' . $days_this_month . ' 23:59:59',
1368
-                        'Y-m-d H:i:s'
1369
-                    ),
1370
-                ),
1371
-            );
1372
-        } elseif ($month_range) {
1373
-            $pieces = explode(' ', $month_range, 3);
1374
-            $month_requested = ! empty($pieces[0])
1375
-                ? date('m', \EEH_DTT_Helper::first_of_month_timestamp($pieces[0]))
1376
-                : '';
1377
-            $year_requested = ! empty($pieces[1])
1378
-                ? $pieces[1]
1379
-                : '';
1380
-            // if there is not a month or year then we can't go further
1381
-            if ($month_requested && $year_requested) {
1382
-                $days_in_month = date('t', strtotime($year_requested . '-' . $month_requested . '-' . '01'));
1383
-                $where['REG_date'] = array(
1384
-                    'BETWEEN',
1385
-                    array(
1386
-                        EEM_Registration::instance()->convert_datetime_for_query(
1387
-                            'REG_date',
1388
-                            $year_requested . '-' . $month_requested . '-01 00:00:00',
1389
-                            'Y-m-d H:i:s'
1390
-                        ),
1391
-                        EEM_Registration::instance()->convert_datetime_for_query(
1392
-                            'REG_date',
1393
-                            $year_requested . '-' . $month_requested . '-' . $days_in_month . ' 23:59:59',
1394
-                            'Y-m-d H:i:s'
1395
-                        ),
1396
-                    ),
1397
-                );
1398
-            }
1399
-        }
1400
-        return $where;
1401
-    }
1402
-
1403
-
1404
-    /**
1405
-     * Adds any provided search restraints to the where conditions for the registrations query
1406
-     *
1407
-     * @param array $request usually the same as $this->_req_data but not necessarily
1408
-     * @return array
1409
-     */
1410
-    protected function _add_search_to_where_conditions(array $request)
1411
-    {
1412
-        $where = array();
1413
-        if (! empty($request['s'])) {
1414
-            $search_string = '%' . sanitize_text_field($request['s']) . '%';
1415
-            $where['OR*search_conditions'] = array(
1416
-                'Event.EVT_name'                          => array('LIKE', $search_string),
1417
-                'Event.EVT_desc'                          => array('LIKE', $search_string),
1418
-                'Event.EVT_short_desc'                    => array('LIKE', $search_string),
1419
-                'Attendee.ATT_full_name'                  => array('LIKE', $search_string),
1420
-                'Attendee.ATT_fname'                      => array('LIKE', $search_string),
1421
-                'Attendee.ATT_lname'                      => array('LIKE', $search_string),
1422
-                'Attendee.ATT_short_bio'                  => array('LIKE', $search_string),
1423
-                'Attendee.ATT_email'                      => array('LIKE', $search_string),
1424
-                'Attendee.ATT_address'                    => array('LIKE', $search_string),
1425
-                'Attendee.ATT_address2'                   => array('LIKE', $search_string),
1426
-                'Attendee.ATT_city'                       => array('LIKE', $search_string),
1427
-                'REG_final_price'                         => array('LIKE', $search_string),
1428
-                'REG_code'                                => array('LIKE', $search_string),
1429
-                'REG_count'                               => array('LIKE', $search_string),
1430
-                'REG_group_size'                          => array('LIKE', $search_string),
1431
-                'Ticket.TKT_name'                         => array('LIKE', $search_string),
1432
-                'Ticket.TKT_description'                  => array('LIKE', $search_string),
1433
-                'Transaction.Payment.PAY_txn_id_chq_nmbr' => array('LIKE', $search_string),
1434
-            );
1435
-        }
1436
-        return $where;
1437
-    }
1438
-
1439
-
1440
-    /**
1441
-     * Sets up the where conditions for the registrations query.
1442
-     *
1443
-     * @param array $request
1444
-     * @return array
1445
-     * @throws EE_Error
1446
-     */
1447
-    protected function _get_where_conditions_for_registrations_query($request)
1448
-    {
1449
-        return apply_filters(
1450
-            'FHEE__Registrations_Admin_Page___get_where_conditions_for_registrations_query',
1451
-            array_merge(
1452
-                $this->addAttendeeIdToWhereConditions($request),
1453
-                $this->_add_event_id_to_where_conditions($request),
1454
-                $this->_add_category_id_to_where_conditions($request),
1455
-                $this->_add_datetime_id_to_where_conditions($request),
1456
-                $this->_add_registration_status_to_where_conditions($request),
1457
-                $this->_add_date_to_where_conditions($request),
1458
-                $this->_add_search_to_where_conditions($request)
1459
-            ),
1460
-            $request
1461
-        );
1462
-    }
1463
-
1464
-
1465
-    /**
1466
-     * Sets up the orderby for the registrations query.
1467
-     *
1468
-     * @return array
1469
-     */
1470
-    protected function _get_orderby_for_registrations_query()
1471
-    {
1472
-        $orderby_field = ! empty($this->_req_data['orderby'])
1473
-            ? sanitize_text_field($this->_req_data['orderby'])
1474
-            : '_REG_date';
1475
-        switch ($orderby_field) {
1476
-            case '_REG_ID':
1477
-                $orderby = array('REG_ID');
1478
-                break;
1479
-            case '_Reg_status':
1480
-                $orderby = array('STS_ID');
1481
-                break;
1482
-            case 'ATT_fname':
1483
-                $orderby = array('Attendee.ATT_fname', 'Attendee.ATT_lname');
1484
-                break;
1485
-            case 'ATT_lname':
1486
-                $orderby = array('Attendee.ATT_lname', 'Attendee.ATT_fname');
1487
-                break;
1488
-            case 'event_name':
1489
-                $orderby = array('Event.EVT_name');
1490
-                break;
1491
-            case 'DTT_EVT_start':
1492
-                $orderby = array('Event.Datetime.DTT_EVT_start');
1493
-                break;
1494
-            case '_REG_date':
1495
-                $orderby = array('REG_date');
1496
-                break;
1497
-            default:
1498
-                $orderby = array($orderby_field);
1499
-                break;
1500
-        }
1501
-
1502
-        // order
1503
-        $order = ! empty($this->_req_data['order'])
1504
-            ? sanitize_text_field($this->_req_data['order'])
1505
-            : 'DESC';
1506
-        $orderby = array_combine(
1507
-            $orderby,
1508
-            array_fill(0, count($orderby), $order)
1509
-        );
1510
-        // because there are many registrations with the same date, define
1511
-        // a secondary way to order them, otherwise MySQL seems to be a bit random
1512
-        if (empty($orderby['REG_ID'])) {
1513
-            $orderby['REG_ID'] = $order;
1514
-        }
1515
-
1516
-        $orderby = apply_filters(
1517
-            'FHEE__Registrations_Admin_Page___get_orderby_for_registrations_query',
1518
-            $orderby,
1519
-            $this->_req_data
1520
-        );
1521
-
1522
-        return array('order_by' => $orderby);
1523
-    }
1524
-
1525
-
1526
-    /**
1527
-     * Sets up the limit for the registrations query.
1528
-     *
1529
-     * @param $per_page
1530
-     * @return array
1531
-     */
1532
-    protected function _get_limit($per_page)
1533
-    {
1534
-        $current_page = ! empty($this->_req_data['paged'])
1535
-            ? absint($this->_req_data['paged'])
1536
-            : 1;
1537
-        $per_page = ! empty($this->_req_data['perpage'])
1538
-            ? $this->_req_data['perpage']
1539
-            : $per_page;
1540
-
1541
-        // -1 means return all results so get out if that's set.
1542
-        if ((int) $per_page === -1) {
1543
-            return array();
1544
-        }
1545
-        $per_page = absint($per_page);
1546
-        $offset = ($current_page - 1) * $per_page;
1547
-        return array('limit' => array($offset, $per_page));
1548
-    }
1549
-
1550
-
1551
-    public function get_registration_status_array()
1552
-    {
1553
-        return self::$_reg_status;
1554
-    }
1555
-
1556
-
1557
-
1558
-
1559
-    /***************************************        REGISTRATION DETAILS        ***************************************/
1560
-    /**
1561
-     *        generates HTML for the View Registration Details Admin page
1562
-     *
1563
-     * @access protected
1564
-     * @return void
1565
-     * @throws DomainException
1566
-     * @throws EE_Error
1567
-     * @throws InvalidArgumentException
1568
-     * @throws InvalidDataTypeException
1569
-     * @throws InvalidInterfaceException
1570
-     * @throws EntityNotFoundException
1571
-     */
1572
-    protected function _registration_details()
1573
-    {
1574
-        $this->_template_args = array();
1575
-        $this->_set_registration_object();
1576
-        if (is_object($this->_registration)) {
1577
-            $transaction = $this->_registration->transaction()
1578
-                ? $this->_registration->transaction()
1579
-                : EE_Transaction::new_instance();
1580
-            $this->_session = $transaction->session_data();
1581
-            $event_id = $this->_registration->event_ID();
1582
-            $this->_template_args['reg_nmbr']['value'] = $this->_registration->ID();
1583
-            $this->_template_args['reg_nmbr']['label'] = esc_html__('Registration Number', 'event_espresso');
1584
-            $this->_template_args['reg_datetime']['value'] = $this->_registration->get_i18n_datetime('REG_date');
1585
-            $this->_template_args['reg_datetime']['label'] = esc_html__('Date', 'event_espresso');
1586
-            $this->_template_args['grand_total'] = $transaction->total();
1587
-            $this->_template_args['currency_sign'] = EE_Registry::instance()->CFG->currency->sign;
1588
-            // link back to overview
1589
-            $this->_template_args['reg_overview_url'] = REG_ADMIN_URL;
1590
-            $this->_template_args['registration'] = $this->_registration;
1591
-            $this->_template_args['filtered_registrations_link'] = EE_Admin_Page::add_query_args_and_nonce(
1592
-                array(
1593
-                    'action'   => 'default',
1594
-                    'event_id' => $event_id,
1595
-                ),
1596
-                REG_ADMIN_URL
1597
-            );
1598
-            $this->_template_args['filtered_transactions_link'] = EE_Admin_Page::add_query_args_and_nonce(
1599
-                array(
1600
-                    'action' => 'default',
1601
-                    'EVT_ID' => $event_id,
1602
-                    'page'   => 'espresso_transactions',
1603
-                ),
1604
-                admin_url('admin.php')
1605
-            );
1606
-            $this->_template_args['event_link'] = EE_Admin_Page::add_query_args_and_nonce(
1607
-                array(
1608
-                    'page'   => 'espresso_events',
1609
-                    'action' => 'edit',
1610
-                    'post'   => $event_id,
1611
-                ),
1612
-                admin_url('admin.php')
1613
-            );
1614
-            // next and previous links
1615
-            $next_reg = $this->_registration->next(
1616
-                null,
1617
-                array(),
1618
-                'REG_ID'
1619
-            );
1620
-            $this->_template_args['next_registration'] = $next_reg
1621
-                ? $this->_next_link(
1622
-                    EE_Admin_Page::add_query_args_and_nonce(
1623
-                        array(
1624
-                            'action'  => 'view_registration',
1625
-                            '_REG_ID' => $next_reg['REG_ID'],
1626
-                        ),
1627
-                        REG_ADMIN_URL
1628
-                    ),
1629
-                    'dashicons dashicons-arrow-right ee-icon-size-22'
1630
-                )
1631
-                : '';
1632
-            $previous_reg = $this->_registration->previous(
1633
-                null,
1634
-                array(),
1635
-                'REG_ID'
1636
-            );
1637
-            $this->_template_args['previous_registration'] = $previous_reg
1638
-                ? $this->_previous_link(
1639
-                    EE_Admin_Page::add_query_args_and_nonce(
1640
-                        array(
1641
-                            'action'  => 'view_registration',
1642
-                            '_REG_ID' => $previous_reg['REG_ID'],
1643
-                        ),
1644
-                        REG_ADMIN_URL
1645
-                    ),
1646
-                    'dashicons dashicons-arrow-left ee-icon-size-22'
1647
-                )
1648
-                : '';
1649
-            // grab header
1650
-            $template_path = REG_TEMPLATE_PATH . 'reg_admin_details_header.template.php';
1651
-            $this->_template_args['REG_ID'] = $this->_registration->ID();
1652
-            $this->_template_args['admin_page_header'] = EEH_Template::display_template(
1653
-                $template_path,
1654
-                $this->_template_args,
1655
-                true
1656
-            );
1657
-        } else {
1658
-            $this->_template_args['admin_page_header'] = $this->display_espresso_notices();
1659
-        }
1660
-        // the details template wrapper
1661
-        $this->display_admin_page_with_sidebar();
1662
-    }
1663
-
1664
-
1665
-    protected function _registration_details_metaboxes()
1666
-    {
1667
-        do_action('AHEE__Registrations_Admin_Page___registration_details_metabox__start', $this);
1668
-        $this->_set_registration_object();
1669
-        $attendee = $this->_registration instanceof EE_Registration ? $this->_registration->attendee() : null;
1670
-        add_meta_box(
1671
-            'edit-reg-status-mbox',
1672
-            esc_html__('Registration Status', 'event_espresso'),
1673
-            array($this, 'set_reg_status_buttons_metabox'),
1674
-            $this->wp_page_slug,
1675
-            'normal',
1676
-            'high'
1677
-        );
1678
-        add_meta_box(
1679
-            'edit-reg-details-mbox',
1680
-            esc_html__('Registration Details', 'event_espresso'),
1681
-            array($this, '_reg_details_meta_box'),
1682
-            $this->wp_page_slug,
1683
-            'normal',
1684
-            'high'
1685
-        );
1686
-        if ($attendee instanceof EE_Attendee
1687
-            && EE_Registry::instance()->CAP->current_user_can(
1688
-                'ee_read_registration',
1689
-                'edit-reg-questions-mbox',
1690
-                $this->_registration->ID()
1691
-            )
1692
-        ) {
1693
-            add_meta_box(
1694
-                'edit-reg-questions-mbox',
1695
-                esc_html__('Registration Form Answers', 'event_espresso'),
1696
-                array($this, '_reg_questions_meta_box'),
1697
-                $this->wp_page_slug,
1698
-                'normal',
1699
-                'high'
1700
-            );
1701
-        }
1702
-        add_meta_box(
1703
-            'edit-reg-registrant-mbox',
1704
-            esc_html__('Contact Details', 'event_espresso'),
1705
-            array($this, '_reg_registrant_side_meta_box'),
1706
-            $this->wp_page_slug,
1707
-            'side',
1708
-            'high'
1709
-        );
1710
-        if ($this->_registration->group_size() > 1) {
1711
-            add_meta_box(
1712
-                'edit-reg-attendees-mbox',
1713
-                esc_html__('Other Registrations in this Transaction', 'event_espresso'),
1714
-                array($this, '_reg_attendees_meta_box'),
1715
-                $this->wp_page_slug,
1716
-                'normal',
1717
-                'high'
1718
-            );
1719
-        }
1720
-    }
1721
-
1722
-
1723
-    /**
1724
-     * set_reg_status_buttons_metabox
1725
-     *
1726
-     * @access protected
1727
-     * @return string
1728
-     * @throws \EE_Error
1729
-     */
1730
-    public function set_reg_status_buttons_metabox()
1731
-    {
1732
-        $this->_set_registration_object();
1733
-        $change_reg_status_form = $this->_generate_reg_status_change_form();
1734
-        echo $change_reg_status_form->form_open(
1735
-            self::add_query_args_and_nonce(
1736
-                array(
1737
-                    'action' => 'change_reg_status',
1738
-                ),
1739
-                REG_ADMIN_URL
1740
-            )
1741
-        );
1742
-        echo $change_reg_status_form->get_html();
1743
-        echo $change_reg_status_form->form_close();
1744
-    }
1745
-
1746
-
1747
-    /**
1748
-     * @return EE_Form_Section_Proper
1749
-     * @throws EE_Error
1750
-     * @throws InvalidArgumentException
1751
-     * @throws InvalidDataTypeException
1752
-     * @throws InvalidInterfaceException
1753
-     * @throws \EventEspresso\core\exceptions\EntityNotFoundException
1754
-     */
1755
-    protected function _generate_reg_status_change_form()
1756
-    {
1757
-        $reg_status_change_form_array = array(
1758
-            'name'            => 'reg_status_change_form',
1759
-            'html_id'         => 'reg-status-change-form',
1760
-            'layout_strategy' => new EE_Admin_Two_Column_Layout(),
1761
-            'subsections'     => array(
1762
-                'return'             => new EE_Hidden_Input(
1763
-                    array(
1764
-                        'name'    => 'return',
1765
-                        'default' => 'view_registration',
1766
-                    )
1767
-                ),
1768
-                'REG_ID'             => new EE_Hidden_Input(
1769
-                    array(
1770
-                        'name'    => 'REG_ID',
1771
-                        'default' => $this->_registration->ID(),
1772
-                    )
1773
-                ),
1774
-                'current_status'     => new EE_Form_Section_HTML(
1775
-                    EEH_HTML::table(
1776
-                        EEH_HTML::tr(
1777
-                            EEH_HTML::th(
1778
-                                EEH_HTML::label(
1779
-                                    EEH_HTML::strong(
1780
-                                        esc_html__('Current Registration Status', 'event_espresso')
1781
-                                    )
1782
-                                )
1783
-                            )
1784
-                            . EEH_HTML::td(
1785
-                                EEH_HTML::strong(
1786
-                                    $this->_registration->pretty_status(),
1787
-                                    '',
1788
-                                    'status-' . $this->_registration->status_ID(),
1789
-                                    'line-height: 1em; font-size: 1.5em; font-weight: bold;'
1790
-                                )
1791
-                            )
1792
-                        )
1793
-                    )
1794
-                )
1795
-            )
1796
-        );
1797
-        if (EE_Registry::instance()->CAP->current_user_can(
1798
-            'ee_edit_registration',
1799
-            'toggle_registration_status',
1800
-            $this->_registration->ID()
1801
-        )) {
1802
-            $reg_status_change_form_array['subsections']['reg_status'] = new EE_Select_Input(
1803
-                $this->_get_reg_statuses(),
1804
-                array(
1805
-                    'html_label_text' => esc_html__('Change Registration Status to', 'event_espresso'),
1806
-                    'default'         => $this->_registration->status_ID(),
1807
-                )
1808
-            );
1809
-            $reg_status_change_form_array['subsections']['send_notifications'] = new EE_Yes_No_Input(
1810
-                array(
1811
-                    'html_label_text' => esc_html__('Send Related Messages', 'event_espresso'),
1812
-                    'default'         => false,
1813
-                    'html_help_text'  => esc_html__(
1814
-                        'If set to "Yes", then the related messages will be sent to the registrant.',
1815
-                        'event_espresso'
1816
-                    )
1817
-                )
1818
-            );
1819
-            $reg_status_change_form_array['subsections']['submit'] = new EE_Submit_Input(
1820
-                array(
1821
-                    'html_class'      => 'button-primary',
1822
-                    'html_label_text' => '&nbsp;',
1823
-                    'default'         => esc_html__('Update Registration Status', 'event_espresso'),
1824
-                )
1825
-            );
1826
-        }
1827
-        return new EE_Form_Section_Proper($reg_status_change_form_array);
1828
-    }
1829
-
1830
-
1831
-    /**
1832
-     * Returns an array of all the buttons for the various statuses and switch status actions
1833
-     *
1834
-     * @return array
1835
-     * @throws EE_Error
1836
-     * @throws InvalidArgumentException
1837
-     * @throws InvalidDataTypeException
1838
-     * @throws InvalidInterfaceException
1839
-     * @throws EntityNotFoundException
1840
-     */
1841
-    protected function _get_reg_statuses()
1842
-    {
1843
-        $reg_status_array = EEM_Registration::instance()->reg_status_array();
1844
-        unset($reg_status_array[ EEM_Registration::status_id_incomplete ]);
1845
-        // get current reg status
1846
-        $current_status = $this->_registration->status_ID();
1847
-        // is registration for free event? This will determine whether to display the pending payment option
1848
-        if ($current_status !== EEM_Registration::status_id_pending_payment
1849
-            && EEH_Money::compare_floats($this->_registration->ticket()->price(), 0.00)
1850
-        ) {
1851
-            unset($reg_status_array[ EEM_Registration::status_id_pending_payment ]);
1852
-        }
1853
-        return EEM_Status::instance()->localized_status($reg_status_array, false, 'sentence');
1854
-    }
1855
-
1856
-
1857
-    /**
1858
-     * This method is used when using _REG_ID from request which may or may not be an array of reg_ids.
1859
-     *
1860
-     * @param bool $status REG status given for changing registrations to.
1861
-     * @param bool $notify Whether to send messages notifications or not.
1862
-     * @return array (array with reg_id(s) updated and whether update was successful.
1863
-     * @throws EE_Error
1864
-     * @throws InvalidArgumentException
1865
-     * @throws InvalidDataTypeException
1866
-     * @throws InvalidInterfaceException
1867
-     * @throws ReflectionException
1868
-     * @throws RuntimeException
1869
-     * @throws EntityNotFoundException
1870
-     */
1871
-    protected function _set_registration_status_from_request($status = false, $notify = false)
1872
-    {
1873
-        if (isset($this->_req_data['reg_status_change_form'])) {
1874
-            $REG_IDs = isset($this->_req_data['reg_status_change_form']['REG_ID'])
1875
-                ? (array) $this->_req_data['reg_status_change_form']['REG_ID']
1876
-                : array();
1877
-        } else {
1878
-            $REG_IDs = isset($this->_req_data['_REG_ID'])
1879
-                ? (array) $this->_req_data['_REG_ID']
1880
-                : array();
1881
-        }
1882
-        // sanitize $REG_IDs
1883
-        $REG_IDs = array_map('absint', $REG_IDs);
1884
-        // and remove empty entries
1885
-        $REG_IDs = array_filter($REG_IDs);
1886
-
1887
-        $result = $this->_set_registration_status($REG_IDs, $status, $notify);
1888
-
1889
-        /**
1890
-         * Set and filter $_req_data['_REG_ID'] for any potential future messages notifications.
1891
-         * Currently this value is used downstream by the _process_resend_registration method.
1892
-         *
1893
-         * @param int|array                $registration_ids The registration ids that have had their status changed successfully.
1894
-         * @param bool                     $status           The status registrations were changed to.
1895
-         * @param bool                     $success          If the status was changed successfully for all registrations.
1896
-         * @param Registrations_Admin_Page $admin_page_object
1897
-         */
1898
-        $this->_req_data['_REG_ID'] = apply_filters(
1899
-            'FHEE__Registrations_Admin_Page___set_registration_status_from_request__REG_IDs',
1900
-            $result['REG_ID'],
1901
-            $status,
1902
-            $result['success'],
1903
-            $this
1904
-        );
1905
-
1906
-        // notify?
1907
-        if ($notify
1908
-            && $result['success']
1909
-            && ! empty($this->_req_data['_REG_ID'])
1910
-            && EE_Registry::instance()->CAP->current_user_can(
1911
-                'ee_send_message',
1912
-                'espresso_registrations_resend_registration'
1913
-            )
1914
-        ) {
1915
-            $this->_process_resend_registration();
1916
-        }
1917
-        return $result;
1918
-    }
1919
-
1920
-
1921
-    /**
1922
-     * Set the registration status for the given reg_id (which may or may not be an array, it gets typecast to an
1923
-     * array). Note, this method does NOT take care of possible notifications.  That is required by calling code.
1924
-     *
1925
-     * @param array  $REG_IDs
1926
-     * @param string $status
1927
-     * @param bool   $notify  Used to indicate whether notification was requested or not.  This determines the context
1928
-     *                        slug sent with setting the registration status.
1929
-     * @return array (an array with 'success' key representing whether status change was successful, and 'REG_ID' as
1930
-     * @throws EE_Error
1931
-     * @throws InvalidArgumentException
1932
-     * @throws InvalidDataTypeException
1933
-     * @throws InvalidInterfaceException
1934
-     * @throws ReflectionException
1935
-     * @throws RuntimeException
1936
-     * @throws EntityNotFoundException
1937
-     */
1938
-    protected function _set_registration_status($REG_IDs = array(), $status = '', $notify = false)
1939
-    {
1940
-        $success = false;
1941
-        // typecast $REG_IDs
1942
-        $REG_IDs = (array) $REG_IDs;
1943
-        if (! empty($REG_IDs)) {
1944
-            $success = true;
1945
-            // set default status if none is passed
1946
-            $status = $status ? $status : EEM_Registration::status_id_pending_payment;
1947
-            $status_context = $notify
1948
-                ? Domain::CONTEXT_REGISTRATION_STATUS_CHANGE_REGISTRATION_ADMIN_NOTIFY
1949
-                : Domain::CONTEXT_REGISTRATION_STATUS_CHANGE_REGISTRATION_ADMIN;
1950
-            // loop through REG_ID's and change status
1951
-            foreach ($REG_IDs as $REG_ID) {
1952
-                $registration = EEM_Registration::instance()->get_one_by_ID($REG_ID);
1953
-                if ($registration instanceof EE_Registration) {
1954
-                    $registration->set_status(
1955
-                        $status,
1956
-                        false,
1957
-                        new Context(
1958
-                            $status_context,
1959
-                            esc_html__(
1960
-                                'Manually triggered status change on a Registration Admin Page route.',
1961
-                                'event_espresso'
1962
-                            )
1963
-                        )
1964
-                    );
1965
-                    $result = $registration->save();
1966
-                    // verifying explicit fails because update *may* just return 0 for 0 rows affected
1967
-                    $success = $result !== false ? $success : false;
1968
-                }
1969
-            }
1970
-        }
1971
-
1972
-        // return $success and processed registrations
1973
-        return array('REG_ID' => $REG_IDs, 'success' => $success);
1974
-    }
1975
-
1976
-
1977
-    /**
1978
-     * Common logic for setting up success message and redirecting to appropriate route
1979
-     *
1980
-     * @param  string $STS_ID status id for the registration changed to
1981
-     * @param   bool  $notify indicates whether the _set_registration_status_from_request does notifications or not.
1982
-     * @return void
1983
-     * @throws EE_Error
1984
-     */
1985
-    protected function _reg_status_change_return($STS_ID, $notify = false)
1986
-    {
1987
-        $result = ! empty($STS_ID) ? $this->_set_registration_status_from_request($STS_ID, $notify)
1988
-            : array('success' => false);
1989
-        $success = isset($result['success']) && $result['success'];
1990
-        // setup success message
1991
-        if ($success) {
1992
-            if (is_array($result['REG_ID']) && count($result['REG_ID']) === 1) {
1993
-                $msg = sprintf(
1994
-                    esc_html__('Registration status has been set to %s', 'event_espresso'),
1995
-                    EEH_Template::pretty_status($STS_ID, false, 'lower')
1996
-                );
1997
-            } else {
1998
-                $msg = sprintf(
1999
-                    esc_html__('Registrations have been set to %s.', 'event_espresso'),
2000
-                    EEH_Template::pretty_status($STS_ID, false, 'lower')
2001
-                );
2002
-            }
2003
-            EE_Error::add_success($msg);
2004
-        } else {
2005
-            EE_Error::add_error(
2006
-                esc_html__(
2007
-                    'Something went wrong, and the status was not changed',
2008
-                    'event_espresso'
2009
-                ),
2010
-                __FILE__,
2011
-                __LINE__,
2012
-                __FUNCTION__
2013
-            );
2014
-        }
2015
-        if (isset($this->_req_data['return']) && $this->_req_data['return'] == 'view_registration') {
2016
-            $route = array('action' => 'view_registration', '_REG_ID' => reset($result['REG_ID']));
2017
-        } else {
2018
-            $route = array('action' => 'default');
2019
-        }
2020
-        $route = $this->mergeExistingRequestParamsWithRedirectArgs($route);
2021
-        $this->_redirect_after_action($success, '', '', $route, true);
2022
-    }
2023
-
2024
-
2025
-    /**
2026
-     * incoming reg status change from reg details page.
2027
-     *
2028
-     * @return void
2029
-     */
2030
-    protected function _change_reg_status()
2031
-    {
2032
-        $this->_req_data['return'] = 'view_registration';
2033
-        // set notify based on whether the send notifications toggle is set or not
2034
-        $notify = ! empty($this->_req_data['reg_status_change_form']['send_notifications']);
2035
-        // $notify = ! empty( $this->_req_data['txn_reg_status_change']['send_notifications'] );
2036
-        $this->_req_data['reg_status_change_form']['reg_status'] = isset($this->_req_data['reg_status_change_form']['reg_status'])
2037
-            ? $this->_req_data['reg_status_change_form']['reg_status'] : '';
2038
-        switch ($this->_req_data['reg_status_change_form']['reg_status']) {
2039
-            case EEM_Registration::status_id_approved:
2040
-            case EEH_Template::pretty_status(EEM_Registration::status_id_approved, false, 'sentence'):
2041
-                $this->approve_registration($notify);
2042
-                break;
2043
-            case EEM_Registration::status_id_pending_payment:
2044
-            case EEH_Template::pretty_status(EEM_Registration::status_id_pending_payment, false, 'sentence'):
2045
-                $this->pending_registration($notify);
2046
-                break;
2047
-            case EEM_Registration::status_id_not_approved:
2048
-            case EEH_Template::pretty_status(EEM_Registration::status_id_not_approved, false, 'sentence'):
2049
-                $this->not_approve_registration($notify);
2050
-                break;
2051
-            case EEM_Registration::status_id_declined:
2052
-            case EEH_Template::pretty_status(EEM_Registration::status_id_declined, false, 'sentence'):
2053
-                $this->decline_registration($notify);
2054
-                break;
2055
-            case EEM_Registration::status_id_cancelled:
2056
-            case EEH_Template::pretty_status(EEM_Registration::status_id_cancelled, false, 'sentence'):
2057
-                $this->cancel_registration($notify);
2058
-                break;
2059
-            case EEM_Registration::status_id_wait_list:
2060
-            case EEH_Template::pretty_status(EEM_Registration::status_id_wait_list, false, 'sentence'):
2061
-                $this->wait_list_registration($notify);
2062
-                break;
2063
-            case EEM_Registration::status_id_incomplete:
2064
-            default:
2065
-                $result['success'] = false;
2066
-                unset($this->_req_data['return']);
2067
-                $this->_reg_status_change_return('', false);
2068
-                break;
2069
-        }
2070
-    }
2071
-
2072
-
2073
-    /**
2074
-     * Callback for bulk action routes.
2075
-     * Note: although we could just register the singular route callbacks for each bulk action route as well, this
2076
-     * method was chosen so there is one central place all the registration status bulk actions are going through.
2077
-     * Potentially, this provides an easier place to locate logic that is specific to these bulk actions (as opposed to
2078
-     * when an action is happening on just a single registration).
2079
-     *
2080
-     * @param      $action
2081
-     * @param bool $notify
2082
-     */
2083
-    protected function bulk_action_on_registrations($action, $notify = false)
2084
-    {
2085
-        do_action(
2086
-            'AHEE__Registrations_Admin_Page__bulk_action_on_registrations__before_execution',
2087
-            $this,
2088
-            $action,
2089
-            $notify
2090
-        );
2091
-        $method = $action . '_registration';
2092
-        if (method_exists($this, $method)) {
2093
-            $this->$method($notify);
2094
-        }
2095
-    }
2096
-
2097
-
2098
-    /**
2099
-     * approve_registration
2100
-     *
2101
-     * @access protected
2102
-     * @param bool $notify whether or not to notify the registrant about their approval.
2103
-     * @return void
2104
-     */
2105
-    protected function approve_registration($notify = false)
2106
-    {
2107
-        $this->_reg_status_change_return(EEM_Registration::status_id_approved, $notify);
2108
-    }
2109
-
2110
-
2111
-    /**
2112
-     *        decline_registration
2113
-     *
2114
-     * @access protected
2115
-     * @param bool $notify whether or not to notify the registrant about their status change.
2116
-     * @return void
2117
-     */
2118
-    protected function decline_registration($notify = false)
2119
-    {
2120
-        $this->_reg_status_change_return(EEM_Registration::status_id_declined, $notify);
2121
-    }
2122
-
2123
-
2124
-    /**
2125
-     *        cancel_registration
2126
-     *
2127
-     * @access protected
2128
-     * @param bool $notify whether or not to notify the registrant about their status change.
2129
-     * @return void
2130
-     */
2131
-    protected function cancel_registration($notify = false)
2132
-    {
2133
-        $this->_reg_status_change_return(EEM_Registration::status_id_cancelled, $notify);
2134
-    }
2135
-
2136
-
2137
-    /**
2138
-     *        not_approve_registration
2139
-     *
2140
-     * @access protected
2141
-     * @param bool $notify whether or not to notify the registrant about their status change.
2142
-     * @return void
2143
-     */
2144
-    protected function not_approve_registration($notify = false)
2145
-    {
2146
-        $this->_reg_status_change_return(EEM_Registration::status_id_not_approved, $notify);
2147
-    }
2148
-
2149
-
2150
-    /**
2151
-     *        decline_registration
2152
-     *
2153
-     * @access protected
2154
-     * @param bool $notify whether or not to notify the registrant about their status change.
2155
-     * @return void
2156
-     */
2157
-    protected function pending_registration($notify = false)
2158
-    {
2159
-        $this->_reg_status_change_return(EEM_Registration::status_id_pending_payment, $notify);
2160
-    }
2161
-
2162
-
2163
-    /**
2164
-     * waitlist_registration
2165
-     *
2166
-     * @access protected
2167
-     * @param bool $notify whether or not to notify the registrant about their status change.
2168
-     * @return void
2169
-     */
2170
-    protected function wait_list_registration($notify = false)
2171
-    {
2172
-        $this->_reg_status_change_return(EEM_Registration::status_id_wait_list, $notify);
2173
-    }
2174
-
2175
-
2176
-    /**
2177
-     *        generates HTML for the Registration main meta box
2178
-     *
2179
-     * @access public
2180
-     * @return void
2181
-     * @throws DomainException
2182
-     * @throws EE_Error
2183
-     * @throws InvalidArgumentException
2184
-     * @throws InvalidDataTypeException
2185
-     * @throws InvalidInterfaceException
2186
-     * @throws ReflectionException
2187
-     * @throws EntityNotFoundException
2188
-     */
2189
-    public function _reg_details_meta_box()
2190
-    {
2191
-        EEH_Autoloader::register_line_item_display_autoloaders();
2192
-        EEH_Autoloader::register_line_item_filter_autoloaders();
2193
-        EE_Registry::instance()->load_helper('Line_Item');
2194
-        $transaction = $this->_registration->transaction() ? $this->_registration->transaction()
2195
-            : EE_Transaction::new_instance();
2196
-        $this->_session = $transaction->session_data();
2197
-        $filters = new EE_Line_Item_Filter_Collection();
2198
-        // $filters->add( new EE_Non_Zero_Line_Item_Filter() );
2199
-        $filters->add(new EE_Single_Registration_Line_Item_Filter($this->_registration));
2200
-        $line_item_filter_processor = new EE_Line_Item_Filter_Processor(
2201
-            $filters,
2202
-            $transaction->total_line_item()
2203
-        );
2204
-        $filtered_line_item_tree = $line_item_filter_processor->process();
2205
-        $line_item_display = new EE_Line_Item_Display(
2206
-            'reg_admin_table',
2207
-            'EE_Admin_Table_Registration_Line_Item_Display_Strategy'
2208
-        );
2209
-        $this->_template_args['line_item_table'] = $line_item_display->display_line_item(
2210
-            $filtered_line_item_tree,
2211
-            array('EE_Registration' => $this->_registration)
2212
-        );
2213
-        $attendee = $this->_registration->attendee();
2214
-        if (EE_Registry::instance()->CAP->current_user_can(
2215
-            'ee_read_transaction',
2216
-            'espresso_transactions_view_transaction'
2217
-        )) {
2218
-            $this->_template_args['view_transaction_button'] = EEH_Template::get_button_or_link(
2219
-                EE_Admin_Page::add_query_args_and_nonce(
2220
-                    array(
2221
-                        'action' => 'view_transaction',
2222
-                        'TXN_ID' => $transaction->ID(),
2223
-                    ),
2224
-                    TXN_ADMIN_URL
2225
-                ),
2226
-                esc_html__(' View Transaction', 'event_espresso'),
2227
-                'button secondary-button right',
2228
-                'dashicons dashicons-cart'
2229
-            );
2230
-        } else {
2231
-            $this->_template_args['view_transaction_button'] = '';
2232
-        }
2233
-        if ($attendee instanceof EE_Attendee
2234
-            && EE_Registry::instance()->CAP->current_user_can(
2235
-                'ee_send_message',
2236
-                'espresso_registrations_resend_registration'
2237
-            )
2238
-        ) {
2239
-            $this->_template_args['resend_registration_button'] = EEH_Template::get_button_or_link(
2240
-                EE_Admin_Page::add_query_args_and_nonce(
2241
-                    array(
2242
-                        'action'      => 'resend_registration',
2243
-                        '_REG_ID'     => $this->_registration->ID(),
2244
-                        'redirect_to' => 'view_registration',
2245
-                    ),
2246
-                    REG_ADMIN_URL
2247
-                ),
2248
-                esc_html__(' Resend Registration', 'event_espresso'),
2249
-                'button secondary-button right',
2250
-                'dashicons dashicons-email-alt'
2251
-            );
2252
-        } else {
2253
-            $this->_template_args['resend_registration_button'] = '';
2254
-        }
2255
-        $this->_template_args['currency_sign'] = EE_Registry::instance()->CFG->currency->sign;
2256
-        $payment = $transaction->get_first_related('Payment');
2257
-        $payment = ! $payment instanceof EE_Payment
2258
-            ? EE_Payment::new_instance()
2259
-            : $payment;
2260
-        $payment_method = $payment->get_first_related('Payment_Method');
2261
-        $payment_method = ! $payment_method instanceof EE_Payment_Method
2262
-            ? EE_Payment_Method::new_instance()
2263
-            : $payment_method;
2264
-        $reg_details = array(
2265
-            'payment_method'       => $payment_method->name(),
2266
-            'response_msg'         => $payment->gateway_response(),
2267
-            'registration_id'      => $this->_registration->get('REG_code'),
2268
-            'registration_session' => $this->_registration->session_ID(),
2269
-            'ip_address'           => isset($this->_session['ip_address']) ? $this->_session['ip_address'] : '',
2270
-            'user_agent'           => isset($this->_session['user_agent']) ? $this->_session['user_agent'] : '',
2271
-        );
2272
-        if (isset($reg_details['registration_id'])) {
2273
-            $this->_template_args['reg_details']['registration_id']['value'] = $reg_details['registration_id'];
2274
-            $this->_template_args['reg_details']['registration_id']['label'] = esc_html__(
2275
-                'Registration ID',
2276
-                'event_espresso'
2277
-            );
2278
-            $this->_template_args['reg_details']['registration_id']['class'] = 'regular-text';
2279
-        }
2280
-        if (isset($reg_details['payment_method'])) {
2281
-            $this->_template_args['reg_details']['payment_method']['value'] = $reg_details['payment_method'];
2282
-            $this->_template_args['reg_details']['payment_method']['label'] = esc_html__(
2283
-                'Most Recent Payment Method',
2284
-                'event_espresso'
2285
-            );
2286
-            $this->_template_args['reg_details']['payment_method']['class'] = 'regular-text';
2287
-            $this->_template_args['reg_details']['response_msg']['value'] = $reg_details['response_msg'];
2288
-            $this->_template_args['reg_details']['response_msg']['label'] = esc_html__(
2289
-                'Payment method response',
2290
-                'event_espresso'
2291
-            );
2292
-            $this->_template_args['reg_details']['response_msg']['class'] = 'regular-text';
2293
-        }
2294
-        $this->_template_args['reg_details']['registration_session']['value'] = $reg_details['registration_session'];
2295
-        $this->_template_args['reg_details']['registration_session']['label'] = esc_html__(
2296
-            'Registration Session',
2297
-            'event_espresso'
2298
-        );
2299
-        $this->_template_args['reg_details']['registration_session']['class'] = 'regular-text';
2300
-        $this->_template_args['reg_details']['ip_address']['value'] = $reg_details['ip_address'];
2301
-        $this->_template_args['reg_details']['ip_address']['label'] = esc_html__(
2302
-            'Registration placed from IP',
2303
-            'event_espresso'
2304
-        );
2305
-        $this->_template_args['reg_details']['ip_address']['class'] = 'regular-text';
2306
-        $this->_template_args['reg_details']['user_agent']['value'] = $reg_details['user_agent'];
2307
-        $this->_template_args['reg_details']['user_agent']['label'] = esc_html__(
2308
-            'Registrant User Agent',
2309
-            'event_espresso'
2310
-        );
2311
-        $this->_template_args['reg_details']['user_agent']['class'] = 'large-text';
2312
-        $this->_template_args['event_link'] = EE_Admin_Page::add_query_args_and_nonce(
2313
-            array(
2314
-                'action'   => 'default',
2315
-                'event_id' => $this->_registration->event_ID(),
2316
-            ),
2317
-            REG_ADMIN_URL
2318
-        );
2319
-        $this->_template_args['REG_ID'] = $this->_registration->ID();
2320
-        $this->_template_args['event_id'] = $this->_registration->event_ID();
2321
-        $template_path =
2322
-            REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_reg_details.template.php';
2323
-        echo EEH_Template::display_template($template_path, $this->_template_args, true);
2324
-    }
2325
-
2326
-
2327
-    /**
2328
-     * generates HTML for the Registration Questions meta box.
2329
-     * If pre-4.8.32.rc.000 hooks are used, uses old methods (with its filters),
2330
-     * otherwise uses new forms system
2331
-     *
2332
-     * @access public
2333
-     * @return void
2334
-     * @throws DomainException
2335
-     * @throws EE_Error
2336
-     */
2337
-    public function _reg_questions_meta_box()
2338
-    {
2339
-        // allow someone to override this method entirely
2340
-        if (apply_filters(
2341
-            'FHEE__Registrations_Admin_Page___reg_questions_meta_box__do_default',
2342
-            true,
2343
-            $this,
2344
-            $this->_registration
2345
-        )) {
2346
-            $form = $this->_get_reg_custom_questions_form(
2347
-                $this->_registration->ID()
2348
-            );
2349
-            $this->_template_args['att_questions'] = count($form->subforms()) > 0
2350
-                ? $form->get_html_and_js()
2351
-                : '';
2352
-            $this->_template_args['reg_questions_form_action'] = 'edit_registration';
2353
-            $this->_template_args['REG_ID'] = $this->_registration->ID();
2354
-            $template_path =
2355
-                REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_reg_questions.template.php';
2356
-            echo EEH_Template::display_template($template_path, $this->_template_args, true);
2357
-        }
2358
-    }
2359
-
2360
-
2361
-    /**
2362
-     * form_before_question_group
2363
-     *
2364
-     * @deprecated    as of 4.8.32.rc.000
2365
-     * @access        public
2366
-     * @param        string $output
2367
-     * @return        string
2368
-     */
2369
-    public function form_before_question_group($output)
2370
-    {
2371
-        EE_Error::doing_it_wrong(
2372
-            __CLASS__ . '::' . __FUNCTION__,
2373
-            esc_html__(
2374
-                '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.',
2375
-                'event_espresso'
2376
-            ),
2377
-            '4.8.32.rc.000'
2378
-        );
2379
-        return '
1301
+		if (! empty($registration_status)) {
1302
+			$where['STS_ID'] = $registration_status;
1303
+		} else {
1304
+			// make sure we exclude incomplete registrations, but only if not trashed.
1305
+			if ($view === 'trash') {
1306
+				$where['REG_deleted'] = true;
1307
+			} elseif ($view === 'incomplete') {
1308
+				$where['STS_ID'] = EEM_Registration::status_id_incomplete;
1309
+			} else {
1310
+				$where['STS_ID'] = array('!=', EEM_Registration::status_id_incomplete);
1311
+			}
1312
+		}
1313
+		return $where;
1314
+	}
1315
+
1316
+
1317
+	/**
1318
+	 * Adds any provided date restraints to the where conditions for the registrations query.
1319
+	 *
1320
+	 * @param array $request usually the same as $this->_req_data but not necessarily
1321
+	 * @return array
1322
+	 * @throws EE_Error
1323
+	 * @throws InvalidArgumentException
1324
+	 * @throws InvalidDataTypeException
1325
+	 * @throws InvalidInterfaceException
1326
+	 */
1327
+	protected function _add_date_to_where_conditions(array $request)
1328
+	{
1329
+		$where = array();
1330
+		$view = EEH_Array::is_set($request, 'status', '');
1331
+		$month_range = ! empty($request['month_range'])
1332
+			? sanitize_text_field($request['month_range'])
1333
+			: '';
1334
+		$retrieve_for_today = $view === 'today';
1335
+		$retrieve_for_this_month = $view === 'month';
1336
+
1337
+		if ($retrieve_for_today) {
1338
+			$now = date('Y-m-d', current_time('timestamp'));
1339
+			$where['REG_date'] = array(
1340
+				'BETWEEN',
1341
+				array(
1342
+					EEM_Registration::instance()->convert_datetime_for_query(
1343
+						'REG_date',
1344
+						$now . ' 00:00:00',
1345
+						'Y-m-d H:i:s'
1346
+					),
1347
+					EEM_Registration::instance()->convert_datetime_for_query(
1348
+						'REG_date',
1349
+						$now . ' 23:59:59',
1350
+						'Y-m-d H:i:s'
1351
+					),
1352
+				),
1353
+			);
1354
+		} elseif ($retrieve_for_this_month) {
1355
+			$current_year_and_month = date('Y-m', current_time('timestamp'));
1356
+			$days_this_month = date('t', current_time('timestamp'));
1357
+			$where['REG_date'] = array(
1358
+				'BETWEEN',
1359
+				array(
1360
+					EEM_Registration::instance()->convert_datetime_for_query(
1361
+						'REG_date',
1362
+						$current_year_and_month . '-01 00:00:00',
1363
+						'Y-m-d H:i:s'
1364
+					),
1365
+					EEM_Registration::instance()->convert_datetime_for_query(
1366
+						'REG_date',
1367
+						$current_year_and_month . '-' . $days_this_month . ' 23:59:59',
1368
+						'Y-m-d H:i:s'
1369
+					),
1370
+				),
1371
+			);
1372
+		} elseif ($month_range) {
1373
+			$pieces = explode(' ', $month_range, 3);
1374
+			$month_requested = ! empty($pieces[0])
1375
+				? date('m', \EEH_DTT_Helper::first_of_month_timestamp($pieces[0]))
1376
+				: '';
1377
+			$year_requested = ! empty($pieces[1])
1378
+				? $pieces[1]
1379
+				: '';
1380
+			// if there is not a month or year then we can't go further
1381
+			if ($month_requested && $year_requested) {
1382
+				$days_in_month = date('t', strtotime($year_requested . '-' . $month_requested . '-' . '01'));
1383
+				$where['REG_date'] = array(
1384
+					'BETWEEN',
1385
+					array(
1386
+						EEM_Registration::instance()->convert_datetime_for_query(
1387
+							'REG_date',
1388
+							$year_requested . '-' . $month_requested . '-01 00:00:00',
1389
+							'Y-m-d H:i:s'
1390
+						),
1391
+						EEM_Registration::instance()->convert_datetime_for_query(
1392
+							'REG_date',
1393
+							$year_requested . '-' . $month_requested . '-' . $days_in_month . ' 23:59:59',
1394
+							'Y-m-d H:i:s'
1395
+						),
1396
+					),
1397
+				);
1398
+			}
1399
+		}
1400
+		return $where;
1401
+	}
1402
+
1403
+
1404
+	/**
1405
+	 * Adds any provided search restraints to the where conditions for the registrations query
1406
+	 *
1407
+	 * @param array $request usually the same as $this->_req_data but not necessarily
1408
+	 * @return array
1409
+	 */
1410
+	protected function _add_search_to_where_conditions(array $request)
1411
+	{
1412
+		$where = array();
1413
+		if (! empty($request['s'])) {
1414
+			$search_string = '%' . sanitize_text_field($request['s']) . '%';
1415
+			$where['OR*search_conditions'] = array(
1416
+				'Event.EVT_name'                          => array('LIKE', $search_string),
1417
+				'Event.EVT_desc'                          => array('LIKE', $search_string),
1418
+				'Event.EVT_short_desc'                    => array('LIKE', $search_string),
1419
+				'Attendee.ATT_full_name'                  => array('LIKE', $search_string),
1420
+				'Attendee.ATT_fname'                      => array('LIKE', $search_string),
1421
+				'Attendee.ATT_lname'                      => array('LIKE', $search_string),
1422
+				'Attendee.ATT_short_bio'                  => array('LIKE', $search_string),
1423
+				'Attendee.ATT_email'                      => array('LIKE', $search_string),
1424
+				'Attendee.ATT_address'                    => array('LIKE', $search_string),
1425
+				'Attendee.ATT_address2'                   => array('LIKE', $search_string),
1426
+				'Attendee.ATT_city'                       => array('LIKE', $search_string),
1427
+				'REG_final_price'                         => array('LIKE', $search_string),
1428
+				'REG_code'                                => array('LIKE', $search_string),
1429
+				'REG_count'                               => array('LIKE', $search_string),
1430
+				'REG_group_size'                          => array('LIKE', $search_string),
1431
+				'Ticket.TKT_name'                         => array('LIKE', $search_string),
1432
+				'Ticket.TKT_description'                  => array('LIKE', $search_string),
1433
+				'Transaction.Payment.PAY_txn_id_chq_nmbr' => array('LIKE', $search_string),
1434
+			);
1435
+		}
1436
+		return $where;
1437
+	}
1438
+
1439
+
1440
+	/**
1441
+	 * Sets up the where conditions for the registrations query.
1442
+	 *
1443
+	 * @param array $request
1444
+	 * @return array
1445
+	 * @throws EE_Error
1446
+	 */
1447
+	protected function _get_where_conditions_for_registrations_query($request)
1448
+	{
1449
+		return apply_filters(
1450
+			'FHEE__Registrations_Admin_Page___get_where_conditions_for_registrations_query',
1451
+			array_merge(
1452
+				$this->addAttendeeIdToWhereConditions($request),
1453
+				$this->_add_event_id_to_where_conditions($request),
1454
+				$this->_add_category_id_to_where_conditions($request),
1455
+				$this->_add_datetime_id_to_where_conditions($request),
1456
+				$this->_add_registration_status_to_where_conditions($request),
1457
+				$this->_add_date_to_where_conditions($request),
1458
+				$this->_add_search_to_where_conditions($request)
1459
+			),
1460
+			$request
1461
+		);
1462
+	}
1463
+
1464
+
1465
+	/**
1466
+	 * Sets up the orderby for the registrations query.
1467
+	 *
1468
+	 * @return array
1469
+	 */
1470
+	protected function _get_orderby_for_registrations_query()
1471
+	{
1472
+		$orderby_field = ! empty($this->_req_data['orderby'])
1473
+			? sanitize_text_field($this->_req_data['orderby'])
1474
+			: '_REG_date';
1475
+		switch ($orderby_field) {
1476
+			case '_REG_ID':
1477
+				$orderby = array('REG_ID');
1478
+				break;
1479
+			case '_Reg_status':
1480
+				$orderby = array('STS_ID');
1481
+				break;
1482
+			case 'ATT_fname':
1483
+				$orderby = array('Attendee.ATT_fname', 'Attendee.ATT_lname');
1484
+				break;
1485
+			case 'ATT_lname':
1486
+				$orderby = array('Attendee.ATT_lname', 'Attendee.ATT_fname');
1487
+				break;
1488
+			case 'event_name':
1489
+				$orderby = array('Event.EVT_name');
1490
+				break;
1491
+			case 'DTT_EVT_start':
1492
+				$orderby = array('Event.Datetime.DTT_EVT_start');
1493
+				break;
1494
+			case '_REG_date':
1495
+				$orderby = array('REG_date');
1496
+				break;
1497
+			default:
1498
+				$orderby = array($orderby_field);
1499
+				break;
1500
+		}
1501
+
1502
+		// order
1503
+		$order = ! empty($this->_req_data['order'])
1504
+			? sanitize_text_field($this->_req_data['order'])
1505
+			: 'DESC';
1506
+		$orderby = array_combine(
1507
+			$orderby,
1508
+			array_fill(0, count($orderby), $order)
1509
+		);
1510
+		// because there are many registrations with the same date, define
1511
+		// a secondary way to order them, otherwise MySQL seems to be a bit random
1512
+		if (empty($orderby['REG_ID'])) {
1513
+			$orderby['REG_ID'] = $order;
1514
+		}
1515
+
1516
+		$orderby = apply_filters(
1517
+			'FHEE__Registrations_Admin_Page___get_orderby_for_registrations_query',
1518
+			$orderby,
1519
+			$this->_req_data
1520
+		);
1521
+
1522
+		return array('order_by' => $orderby);
1523
+	}
1524
+
1525
+
1526
+	/**
1527
+	 * Sets up the limit for the registrations query.
1528
+	 *
1529
+	 * @param $per_page
1530
+	 * @return array
1531
+	 */
1532
+	protected function _get_limit($per_page)
1533
+	{
1534
+		$current_page = ! empty($this->_req_data['paged'])
1535
+			? absint($this->_req_data['paged'])
1536
+			: 1;
1537
+		$per_page = ! empty($this->_req_data['perpage'])
1538
+			? $this->_req_data['perpage']
1539
+			: $per_page;
1540
+
1541
+		// -1 means return all results so get out if that's set.
1542
+		if ((int) $per_page === -1) {
1543
+			return array();
1544
+		}
1545
+		$per_page = absint($per_page);
1546
+		$offset = ($current_page - 1) * $per_page;
1547
+		return array('limit' => array($offset, $per_page));
1548
+	}
1549
+
1550
+
1551
+	public function get_registration_status_array()
1552
+	{
1553
+		return self::$_reg_status;
1554
+	}
1555
+
1556
+
1557
+
1558
+
1559
+	/***************************************        REGISTRATION DETAILS        ***************************************/
1560
+	/**
1561
+	 *        generates HTML for the View Registration Details Admin page
1562
+	 *
1563
+	 * @access protected
1564
+	 * @return void
1565
+	 * @throws DomainException
1566
+	 * @throws EE_Error
1567
+	 * @throws InvalidArgumentException
1568
+	 * @throws InvalidDataTypeException
1569
+	 * @throws InvalidInterfaceException
1570
+	 * @throws EntityNotFoundException
1571
+	 */
1572
+	protected function _registration_details()
1573
+	{
1574
+		$this->_template_args = array();
1575
+		$this->_set_registration_object();
1576
+		if (is_object($this->_registration)) {
1577
+			$transaction = $this->_registration->transaction()
1578
+				? $this->_registration->transaction()
1579
+				: EE_Transaction::new_instance();
1580
+			$this->_session = $transaction->session_data();
1581
+			$event_id = $this->_registration->event_ID();
1582
+			$this->_template_args['reg_nmbr']['value'] = $this->_registration->ID();
1583
+			$this->_template_args['reg_nmbr']['label'] = esc_html__('Registration Number', 'event_espresso');
1584
+			$this->_template_args['reg_datetime']['value'] = $this->_registration->get_i18n_datetime('REG_date');
1585
+			$this->_template_args['reg_datetime']['label'] = esc_html__('Date', 'event_espresso');
1586
+			$this->_template_args['grand_total'] = $transaction->total();
1587
+			$this->_template_args['currency_sign'] = EE_Registry::instance()->CFG->currency->sign;
1588
+			// link back to overview
1589
+			$this->_template_args['reg_overview_url'] = REG_ADMIN_URL;
1590
+			$this->_template_args['registration'] = $this->_registration;
1591
+			$this->_template_args['filtered_registrations_link'] = EE_Admin_Page::add_query_args_and_nonce(
1592
+				array(
1593
+					'action'   => 'default',
1594
+					'event_id' => $event_id,
1595
+				),
1596
+				REG_ADMIN_URL
1597
+			);
1598
+			$this->_template_args['filtered_transactions_link'] = EE_Admin_Page::add_query_args_and_nonce(
1599
+				array(
1600
+					'action' => 'default',
1601
+					'EVT_ID' => $event_id,
1602
+					'page'   => 'espresso_transactions',
1603
+				),
1604
+				admin_url('admin.php')
1605
+			);
1606
+			$this->_template_args['event_link'] = EE_Admin_Page::add_query_args_and_nonce(
1607
+				array(
1608
+					'page'   => 'espresso_events',
1609
+					'action' => 'edit',
1610
+					'post'   => $event_id,
1611
+				),
1612
+				admin_url('admin.php')
1613
+			);
1614
+			// next and previous links
1615
+			$next_reg = $this->_registration->next(
1616
+				null,
1617
+				array(),
1618
+				'REG_ID'
1619
+			);
1620
+			$this->_template_args['next_registration'] = $next_reg
1621
+				? $this->_next_link(
1622
+					EE_Admin_Page::add_query_args_and_nonce(
1623
+						array(
1624
+							'action'  => 'view_registration',
1625
+							'_REG_ID' => $next_reg['REG_ID'],
1626
+						),
1627
+						REG_ADMIN_URL
1628
+					),
1629
+					'dashicons dashicons-arrow-right ee-icon-size-22'
1630
+				)
1631
+				: '';
1632
+			$previous_reg = $this->_registration->previous(
1633
+				null,
1634
+				array(),
1635
+				'REG_ID'
1636
+			);
1637
+			$this->_template_args['previous_registration'] = $previous_reg
1638
+				? $this->_previous_link(
1639
+					EE_Admin_Page::add_query_args_and_nonce(
1640
+						array(
1641
+							'action'  => 'view_registration',
1642
+							'_REG_ID' => $previous_reg['REG_ID'],
1643
+						),
1644
+						REG_ADMIN_URL
1645
+					),
1646
+					'dashicons dashicons-arrow-left ee-icon-size-22'
1647
+				)
1648
+				: '';
1649
+			// grab header
1650
+			$template_path = REG_TEMPLATE_PATH . 'reg_admin_details_header.template.php';
1651
+			$this->_template_args['REG_ID'] = $this->_registration->ID();
1652
+			$this->_template_args['admin_page_header'] = EEH_Template::display_template(
1653
+				$template_path,
1654
+				$this->_template_args,
1655
+				true
1656
+			);
1657
+		} else {
1658
+			$this->_template_args['admin_page_header'] = $this->display_espresso_notices();
1659
+		}
1660
+		// the details template wrapper
1661
+		$this->display_admin_page_with_sidebar();
1662
+	}
1663
+
1664
+
1665
+	protected function _registration_details_metaboxes()
1666
+	{
1667
+		do_action('AHEE__Registrations_Admin_Page___registration_details_metabox__start', $this);
1668
+		$this->_set_registration_object();
1669
+		$attendee = $this->_registration instanceof EE_Registration ? $this->_registration->attendee() : null;
1670
+		add_meta_box(
1671
+			'edit-reg-status-mbox',
1672
+			esc_html__('Registration Status', 'event_espresso'),
1673
+			array($this, 'set_reg_status_buttons_metabox'),
1674
+			$this->wp_page_slug,
1675
+			'normal',
1676
+			'high'
1677
+		);
1678
+		add_meta_box(
1679
+			'edit-reg-details-mbox',
1680
+			esc_html__('Registration Details', 'event_espresso'),
1681
+			array($this, '_reg_details_meta_box'),
1682
+			$this->wp_page_slug,
1683
+			'normal',
1684
+			'high'
1685
+		);
1686
+		if ($attendee instanceof EE_Attendee
1687
+			&& EE_Registry::instance()->CAP->current_user_can(
1688
+				'ee_read_registration',
1689
+				'edit-reg-questions-mbox',
1690
+				$this->_registration->ID()
1691
+			)
1692
+		) {
1693
+			add_meta_box(
1694
+				'edit-reg-questions-mbox',
1695
+				esc_html__('Registration Form Answers', 'event_espresso'),
1696
+				array($this, '_reg_questions_meta_box'),
1697
+				$this->wp_page_slug,
1698
+				'normal',
1699
+				'high'
1700
+			);
1701
+		}
1702
+		add_meta_box(
1703
+			'edit-reg-registrant-mbox',
1704
+			esc_html__('Contact Details', 'event_espresso'),
1705
+			array($this, '_reg_registrant_side_meta_box'),
1706
+			$this->wp_page_slug,
1707
+			'side',
1708
+			'high'
1709
+		);
1710
+		if ($this->_registration->group_size() > 1) {
1711
+			add_meta_box(
1712
+				'edit-reg-attendees-mbox',
1713
+				esc_html__('Other Registrations in this Transaction', 'event_espresso'),
1714
+				array($this, '_reg_attendees_meta_box'),
1715
+				$this->wp_page_slug,
1716
+				'normal',
1717
+				'high'
1718
+			);
1719
+		}
1720
+	}
1721
+
1722
+
1723
+	/**
1724
+	 * set_reg_status_buttons_metabox
1725
+	 *
1726
+	 * @access protected
1727
+	 * @return string
1728
+	 * @throws \EE_Error
1729
+	 */
1730
+	public function set_reg_status_buttons_metabox()
1731
+	{
1732
+		$this->_set_registration_object();
1733
+		$change_reg_status_form = $this->_generate_reg_status_change_form();
1734
+		echo $change_reg_status_form->form_open(
1735
+			self::add_query_args_and_nonce(
1736
+				array(
1737
+					'action' => 'change_reg_status',
1738
+				),
1739
+				REG_ADMIN_URL
1740
+			)
1741
+		);
1742
+		echo $change_reg_status_form->get_html();
1743
+		echo $change_reg_status_form->form_close();
1744
+	}
1745
+
1746
+
1747
+	/**
1748
+	 * @return EE_Form_Section_Proper
1749
+	 * @throws EE_Error
1750
+	 * @throws InvalidArgumentException
1751
+	 * @throws InvalidDataTypeException
1752
+	 * @throws InvalidInterfaceException
1753
+	 * @throws \EventEspresso\core\exceptions\EntityNotFoundException
1754
+	 */
1755
+	protected function _generate_reg_status_change_form()
1756
+	{
1757
+		$reg_status_change_form_array = array(
1758
+			'name'            => 'reg_status_change_form',
1759
+			'html_id'         => 'reg-status-change-form',
1760
+			'layout_strategy' => new EE_Admin_Two_Column_Layout(),
1761
+			'subsections'     => array(
1762
+				'return'             => new EE_Hidden_Input(
1763
+					array(
1764
+						'name'    => 'return',
1765
+						'default' => 'view_registration',
1766
+					)
1767
+				),
1768
+				'REG_ID'             => new EE_Hidden_Input(
1769
+					array(
1770
+						'name'    => 'REG_ID',
1771
+						'default' => $this->_registration->ID(),
1772
+					)
1773
+				),
1774
+				'current_status'     => new EE_Form_Section_HTML(
1775
+					EEH_HTML::table(
1776
+						EEH_HTML::tr(
1777
+							EEH_HTML::th(
1778
+								EEH_HTML::label(
1779
+									EEH_HTML::strong(
1780
+										esc_html__('Current Registration Status', 'event_espresso')
1781
+									)
1782
+								)
1783
+							)
1784
+							. EEH_HTML::td(
1785
+								EEH_HTML::strong(
1786
+									$this->_registration->pretty_status(),
1787
+									'',
1788
+									'status-' . $this->_registration->status_ID(),
1789
+									'line-height: 1em; font-size: 1.5em; font-weight: bold;'
1790
+								)
1791
+							)
1792
+						)
1793
+					)
1794
+				)
1795
+			)
1796
+		);
1797
+		if (EE_Registry::instance()->CAP->current_user_can(
1798
+			'ee_edit_registration',
1799
+			'toggle_registration_status',
1800
+			$this->_registration->ID()
1801
+		)) {
1802
+			$reg_status_change_form_array['subsections']['reg_status'] = new EE_Select_Input(
1803
+				$this->_get_reg_statuses(),
1804
+				array(
1805
+					'html_label_text' => esc_html__('Change Registration Status to', 'event_espresso'),
1806
+					'default'         => $this->_registration->status_ID(),
1807
+				)
1808
+			);
1809
+			$reg_status_change_form_array['subsections']['send_notifications'] = new EE_Yes_No_Input(
1810
+				array(
1811
+					'html_label_text' => esc_html__('Send Related Messages', 'event_espresso'),
1812
+					'default'         => false,
1813
+					'html_help_text'  => esc_html__(
1814
+						'If set to "Yes", then the related messages will be sent to the registrant.',
1815
+						'event_espresso'
1816
+					)
1817
+				)
1818
+			);
1819
+			$reg_status_change_form_array['subsections']['submit'] = new EE_Submit_Input(
1820
+				array(
1821
+					'html_class'      => 'button-primary',
1822
+					'html_label_text' => '&nbsp;',
1823
+					'default'         => esc_html__('Update Registration Status', 'event_espresso'),
1824
+				)
1825
+			);
1826
+		}
1827
+		return new EE_Form_Section_Proper($reg_status_change_form_array);
1828
+	}
1829
+
1830
+
1831
+	/**
1832
+	 * Returns an array of all the buttons for the various statuses and switch status actions
1833
+	 *
1834
+	 * @return array
1835
+	 * @throws EE_Error
1836
+	 * @throws InvalidArgumentException
1837
+	 * @throws InvalidDataTypeException
1838
+	 * @throws InvalidInterfaceException
1839
+	 * @throws EntityNotFoundException
1840
+	 */
1841
+	protected function _get_reg_statuses()
1842
+	{
1843
+		$reg_status_array = EEM_Registration::instance()->reg_status_array();
1844
+		unset($reg_status_array[ EEM_Registration::status_id_incomplete ]);
1845
+		// get current reg status
1846
+		$current_status = $this->_registration->status_ID();
1847
+		// is registration for free event? This will determine whether to display the pending payment option
1848
+		if ($current_status !== EEM_Registration::status_id_pending_payment
1849
+			&& EEH_Money::compare_floats($this->_registration->ticket()->price(), 0.00)
1850
+		) {
1851
+			unset($reg_status_array[ EEM_Registration::status_id_pending_payment ]);
1852
+		}
1853
+		return EEM_Status::instance()->localized_status($reg_status_array, false, 'sentence');
1854
+	}
1855
+
1856
+
1857
+	/**
1858
+	 * This method is used when using _REG_ID from request which may or may not be an array of reg_ids.
1859
+	 *
1860
+	 * @param bool $status REG status given for changing registrations to.
1861
+	 * @param bool $notify Whether to send messages notifications or not.
1862
+	 * @return array (array with reg_id(s) updated and whether update was successful.
1863
+	 * @throws EE_Error
1864
+	 * @throws InvalidArgumentException
1865
+	 * @throws InvalidDataTypeException
1866
+	 * @throws InvalidInterfaceException
1867
+	 * @throws ReflectionException
1868
+	 * @throws RuntimeException
1869
+	 * @throws EntityNotFoundException
1870
+	 */
1871
+	protected function _set_registration_status_from_request($status = false, $notify = false)
1872
+	{
1873
+		if (isset($this->_req_data['reg_status_change_form'])) {
1874
+			$REG_IDs = isset($this->_req_data['reg_status_change_form']['REG_ID'])
1875
+				? (array) $this->_req_data['reg_status_change_form']['REG_ID']
1876
+				: array();
1877
+		} else {
1878
+			$REG_IDs = isset($this->_req_data['_REG_ID'])
1879
+				? (array) $this->_req_data['_REG_ID']
1880
+				: array();
1881
+		}
1882
+		// sanitize $REG_IDs
1883
+		$REG_IDs = array_map('absint', $REG_IDs);
1884
+		// and remove empty entries
1885
+		$REG_IDs = array_filter($REG_IDs);
1886
+
1887
+		$result = $this->_set_registration_status($REG_IDs, $status, $notify);
1888
+
1889
+		/**
1890
+		 * Set and filter $_req_data['_REG_ID'] for any potential future messages notifications.
1891
+		 * Currently this value is used downstream by the _process_resend_registration method.
1892
+		 *
1893
+		 * @param int|array                $registration_ids The registration ids that have had their status changed successfully.
1894
+		 * @param bool                     $status           The status registrations were changed to.
1895
+		 * @param bool                     $success          If the status was changed successfully for all registrations.
1896
+		 * @param Registrations_Admin_Page $admin_page_object
1897
+		 */
1898
+		$this->_req_data['_REG_ID'] = apply_filters(
1899
+			'FHEE__Registrations_Admin_Page___set_registration_status_from_request__REG_IDs',
1900
+			$result['REG_ID'],
1901
+			$status,
1902
+			$result['success'],
1903
+			$this
1904
+		);
1905
+
1906
+		// notify?
1907
+		if ($notify
1908
+			&& $result['success']
1909
+			&& ! empty($this->_req_data['_REG_ID'])
1910
+			&& EE_Registry::instance()->CAP->current_user_can(
1911
+				'ee_send_message',
1912
+				'espresso_registrations_resend_registration'
1913
+			)
1914
+		) {
1915
+			$this->_process_resend_registration();
1916
+		}
1917
+		return $result;
1918
+	}
1919
+
1920
+
1921
+	/**
1922
+	 * Set the registration status for the given reg_id (which may or may not be an array, it gets typecast to an
1923
+	 * array). Note, this method does NOT take care of possible notifications.  That is required by calling code.
1924
+	 *
1925
+	 * @param array  $REG_IDs
1926
+	 * @param string $status
1927
+	 * @param bool   $notify  Used to indicate whether notification was requested or not.  This determines the context
1928
+	 *                        slug sent with setting the registration status.
1929
+	 * @return array (an array with 'success' key representing whether status change was successful, and 'REG_ID' as
1930
+	 * @throws EE_Error
1931
+	 * @throws InvalidArgumentException
1932
+	 * @throws InvalidDataTypeException
1933
+	 * @throws InvalidInterfaceException
1934
+	 * @throws ReflectionException
1935
+	 * @throws RuntimeException
1936
+	 * @throws EntityNotFoundException
1937
+	 */
1938
+	protected function _set_registration_status($REG_IDs = array(), $status = '', $notify = false)
1939
+	{
1940
+		$success = false;
1941
+		// typecast $REG_IDs
1942
+		$REG_IDs = (array) $REG_IDs;
1943
+		if (! empty($REG_IDs)) {
1944
+			$success = true;
1945
+			// set default status if none is passed
1946
+			$status = $status ? $status : EEM_Registration::status_id_pending_payment;
1947
+			$status_context = $notify
1948
+				? Domain::CONTEXT_REGISTRATION_STATUS_CHANGE_REGISTRATION_ADMIN_NOTIFY
1949
+				: Domain::CONTEXT_REGISTRATION_STATUS_CHANGE_REGISTRATION_ADMIN;
1950
+			// loop through REG_ID's and change status
1951
+			foreach ($REG_IDs as $REG_ID) {
1952
+				$registration = EEM_Registration::instance()->get_one_by_ID($REG_ID);
1953
+				if ($registration instanceof EE_Registration) {
1954
+					$registration->set_status(
1955
+						$status,
1956
+						false,
1957
+						new Context(
1958
+							$status_context,
1959
+							esc_html__(
1960
+								'Manually triggered status change on a Registration Admin Page route.',
1961
+								'event_espresso'
1962
+							)
1963
+						)
1964
+					);
1965
+					$result = $registration->save();
1966
+					// verifying explicit fails because update *may* just return 0 for 0 rows affected
1967
+					$success = $result !== false ? $success : false;
1968
+				}
1969
+			}
1970
+		}
1971
+
1972
+		// return $success and processed registrations
1973
+		return array('REG_ID' => $REG_IDs, 'success' => $success);
1974
+	}
1975
+
1976
+
1977
+	/**
1978
+	 * Common logic for setting up success message and redirecting to appropriate route
1979
+	 *
1980
+	 * @param  string $STS_ID status id for the registration changed to
1981
+	 * @param   bool  $notify indicates whether the _set_registration_status_from_request does notifications or not.
1982
+	 * @return void
1983
+	 * @throws EE_Error
1984
+	 */
1985
+	protected function _reg_status_change_return($STS_ID, $notify = false)
1986
+	{
1987
+		$result = ! empty($STS_ID) ? $this->_set_registration_status_from_request($STS_ID, $notify)
1988
+			: array('success' => false);
1989
+		$success = isset($result['success']) && $result['success'];
1990
+		// setup success message
1991
+		if ($success) {
1992
+			if (is_array($result['REG_ID']) && count($result['REG_ID']) === 1) {
1993
+				$msg = sprintf(
1994
+					esc_html__('Registration status has been set to %s', 'event_espresso'),
1995
+					EEH_Template::pretty_status($STS_ID, false, 'lower')
1996
+				);
1997
+			} else {
1998
+				$msg = sprintf(
1999
+					esc_html__('Registrations have been set to %s.', 'event_espresso'),
2000
+					EEH_Template::pretty_status($STS_ID, false, 'lower')
2001
+				);
2002
+			}
2003
+			EE_Error::add_success($msg);
2004
+		} else {
2005
+			EE_Error::add_error(
2006
+				esc_html__(
2007
+					'Something went wrong, and the status was not changed',
2008
+					'event_espresso'
2009
+				),
2010
+				__FILE__,
2011
+				__LINE__,
2012
+				__FUNCTION__
2013
+			);
2014
+		}
2015
+		if (isset($this->_req_data['return']) && $this->_req_data['return'] == 'view_registration') {
2016
+			$route = array('action' => 'view_registration', '_REG_ID' => reset($result['REG_ID']));
2017
+		} else {
2018
+			$route = array('action' => 'default');
2019
+		}
2020
+		$route = $this->mergeExistingRequestParamsWithRedirectArgs($route);
2021
+		$this->_redirect_after_action($success, '', '', $route, true);
2022
+	}
2023
+
2024
+
2025
+	/**
2026
+	 * incoming reg status change from reg details page.
2027
+	 *
2028
+	 * @return void
2029
+	 */
2030
+	protected function _change_reg_status()
2031
+	{
2032
+		$this->_req_data['return'] = 'view_registration';
2033
+		// set notify based on whether the send notifications toggle is set or not
2034
+		$notify = ! empty($this->_req_data['reg_status_change_form']['send_notifications']);
2035
+		// $notify = ! empty( $this->_req_data['txn_reg_status_change']['send_notifications'] );
2036
+		$this->_req_data['reg_status_change_form']['reg_status'] = isset($this->_req_data['reg_status_change_form']['reg_status'])
2037
+			? $this->_req_data['reg_status_change_form']['reg_status'] : '';
2038
+		switch ($this->_req_data['reg_status_change_form']['reg_status']) {
2039
+			case EEM_Registration::status_id_approved:
2040
+			case EEH_Template::pretty_status(EEM_Registration::status_id_approved, false, 'sentence'):
2041
+				$this->approve_registration($notify);
2042
+				break;
2043
+			case EEM_Registration::status_id_pending_payment:
2044
+			case EEH_Template::pretty_status(EEM_Registration::status_id_pending_payment, false, 'sentence'):
2045
+				$this->pending_registration($notify);
2046
+				break;
2047
+			case EEM_Registration::status_id_not_approved:
2048
+			case EEH_Template::pretty_status(EEM_Registration::status_id_not_approved, false, 'sentence'):
2049
+				$this->not_approve_registration($notify);
2050
+				break;
2051
+			case EEM_Registration::status_id_declined:
2052
+			case EEH_Template::pretty_status(EEM_Registration::status_id_declined, false, 'sentence'):
2053
+				$this->decline_registration($notify);
2054
+				break;
2055
+			case EEM_Registration::status_id_cancelled:
2056
+			case EEH_Template::pretty_status(EEM_Registration::status_id_cancelled, false, 'sentence'):
2057
+				$this->cancel_registration($notify);
2058
+				break;
2059
+			case EEM_Registration::status_id_wait_list:
2060
+			case EEH_Template::pretty_status(EEM_Registration::status_id_wait_list, false, 'sentence'):
2061
+				$this->wait_list_registration($notify);
2062
+				break;
2063
+			case EEM_Registration::status_id_incomplete:
2064
+			default:
2065
+				$result['success'] = false;
2066
+				unset($this->_req_data['return']);
2067
+				$this->_reg_status_change_return('', false);
2068
+				break;
2069
+		}
2070
+	}
2071
+
2072
+
2073
+	/**
2074
+	 * Callback for bulk action routes.
2075
+	 * Note: although we could just register the singular route callbacks for each bulk action route as well, this
2076
+	 * method was chosen so there is one central place all the registration status bulk actions are going through.
2077
+	 * Potentially, this provides an easier place to locate logic that is specific to these bulk actions (as opposed to
2078
+	 * when an action is happening on just a single registration).
2079
+	 *
2080
+	 * @param      $action
2081
+	 * @param bool $notify
2082
+	 */
2083
+	protected function bulk_action_on_registrations($action, $notify = false)
2084
+	{
2085
+		do_action(
2086
+			'AHEE__Registrations_Admin_Page__bulk_action_on_registrations__before_execution',
2087
+			$this,
2088
+			$action,
2089
+			$notify
2090
+		);
2091
+		$method = $action . '_registration';
2092
+		if (method_exists($this, $method)) {
2093
+			$this->$method($notify);
2094
+		}
2095
+	}
2096
+
2097
+
2098
+	/**
2099
+	 * approve_registration
2100
+	 *
2101
+	 * @access protected
2102
+	 * @param bool $notify whether or not to notify the registrant about their approval.
2103
+	 * @return void
2104
+	 */
2105
+	protected function approve_registration($notify = false)
2106
+	{
2107
+		$this->_reg_status_change_return(EEM_Registration::status_id_approved, $notify);
2108
+	}
2109
+
2110
+
2111
+	/**
2112
+	 *        decline_registration
2113
+	 *
2114
+	 * @access protected
2115
+	 * @param bool $notify whether or not to notify the registrant about their status change.
2116
+	 * @return void
2117
+	 */
2118
+	protected function decline_registration($notify = false)
2119
+	{
2120
+		$this->_reg_status_change_return(EEM_Registration::status_id_declined, $notify);
2121
+	}
2122
+
2123
+
2124
+	/**
2125
+	 *        cancel_registration
2126
+	 *
2127
+	 * @access protected
2128
+	 * @param bool $notify whether or not to notify the registrant about their status change.
2129
+	 * @return void
2130
+	 */
2131
+	protected function cancel_registration($notify = false)
2132
+	{
2133
+		$this->_reg_status_change_return(EEM_Registration::status_id_cancelled, $notify);
2134
+	}
2135
+
2136
+
2137
+	/**
2138
+	 *        not_approve_registration
2139
+	 *
2140
+	 * @access protected
2141
+	 * @param bool $notify whether or not to notify the registrant about their status change.
2142
+	 * @return void
2143
+	 */
2144
+	protected function not_approve_registration($notify = false)
2145
+	{
2146
+		$this->_reg_status_change_return(EEM_Registration::status_id_not_approved, $notify);
2147
+	}
2148
+
2149
+
2150
+	/**
2151
+	 *        decline_registration
2152
+	 *
2153
+	 * @access protected
2154
+	 * @param bool $notify whether or not to notify the registrant about their status change.
2155
+	 * @return void
2156
+	 */
2157
+	protected function pending_registration($notify = false)
2158
+	{
2159
+		$this->_reg_status_change_return(EEM_Registration::status_id_pending_payment, $notify);
2160
+	}
2161
+
2162
+
2163
+	/**
2164
+	 * waitlist_registration
2165
+	 *
2166
+	 * @access protected
2167
+	 * @param bool $notify whether or not to notify the registrant about their status change.
2168
+	 * @return void
2169
+	 */
2170
+	protected function wait_list_registration($notify = false)
2171
+	{
2172
+		$this->_reg_status_change_return(EEM_Registration::status_id_wait_list, $notify);
2173
+	}
2174
+
2175
+
2176
+	/**
2177
+	 *        generates HTML for the Registration main meta box
2178
+	 *
2179
+	 * @access public
2180
+	 * @return void
2181
+	 * @throws DomainException
2182
+	 * @throws EE_Error
2183
+	 * @throws InvalidArgumentException
2184
+	 * @throws InvalidDataTypeException
2185
+	 * @throws InvalidInterfaceException
2186
+	 * @throws ReflectionException
2187
+	 * @throws EntityNotFoundException
2188
+	 */
2189
+	public function _reg_details_meta_box()
2190
+	{
2191
+		EEH_Autoloader::register_line_item_display_autoloaders();
2192
+		EEH_Autoloader::register_line_item_filter_autoloaders();
2193
+		EE_Registry::instance()->load_helper('Line_Item');
2194
+		$transaction = $this->_registration->transaction() ? $this->_registration->transaction()
2195
+			: EE_Transaction::new_instance();
2196
+		$this->_session = $transaction->session_data();
2197
+		$filters = new EE_Line_Item_Filter_Collection();
2198
+		// $filters->add( new EE_Non_Zero_Line_Item_Filter() );
2199
+		$filters->add(new EE_Single_Registration_Line_Item_Filter($this->_registration));
2200
+		$line_item_filter_processor = new EE_Line_Item_Filter_Processor(
2201
+			$filters,
2202
+			$transaction->total_line_item()
2203
+		);
2204
+		$filtered_line_item_tree = $line_item_filter_processor->process();
2205
+		$line_item_display = new EE_Line_Item_Display(
2206
+			'reg_admin_table',
2207
+			'EE_Admin_Table_Registration_Line_Item_Display_Strategy'
2208
+		);
2209
+		$this->_template_args['line_item_table'] = $line_item_display->display_line_item(
2210
+			$filtered_line_item_tree,
2211
+			array('EE_Registration' => $this->_registration)
2212
+		);
2213
+		$attendee = $this->_registration->attendee();
2214
+		if (EE_Registry::instance()->CAP->current_user_can(
2215
+			'ee_read_transaction',
2216
+			'espresso_transactions_view_transaction'
2217
+		)) {
2218
+			$this->_template_args['view_transaction_button'] = EEH_Template::get_button_or_link(
2219
+				EE_Admin_Page::add_query_args_and_nonce(
2220
+					array(
2221
+						'action' => 'view_transaction',
2222
+						'TXN_ID' => $transaction->ID(),
2223
+					),
2224
+					TXN_ADMIN_URL
2225
+				),
2226
+				esc_html__(' View Transaction', 'event_espresso'),
2227
+				'button secondary-button right',
2228
+				'dashicons dashicons-cart'
2229
+			);
2230
+		} else {
2231
+			$this->_template_args['view_transaction_button'] = '';
2232
+		}
2233
+		if ($attendee instanceof EE_Attendee
2234
+			&& EE_Registry::instance()->CAP->current_user_can(
2235
+				'ee_send_message',
2236
+				'espresso_registrations_resend_registration'
2237
+			)
2238
+		) {
2239
+			$this->_template_args['resend_registration_button'] = EEH_Template::get_button_or_link(
2240
+				EE_Admin_Page::add_query_args_and_nonce(
2241
+					array(
2242
+						'action'      => 'resend_registration',
2243
+						'_REG_ID'     => $this->_registration->ID(),
2244
+						'redirect_to' => 'view_registration',
2245
+					),
2246
+					REG_ADMIN_URL
2247
+				),
2248
+				esc_html__(' Resend Registration', 'event_espresso'),
2249
+				'button secondary-button right',
2250
+				'dashicons dashicons-email-alt'
2251
+			);
2252
+		} else {
2253
+			$this->_template_args['resend_registration_button'] = '';
2254
+		}
2255
+		$this->_template_args['currency_sign'] = EE_Registry::instance()->CFG->currency->sign;
2256
+		$payment = $transaction->get_first_related('Payment');
2257
+		$payment = ! $payment instanceof EE_Payment
2258
+			? EE_Payment::new_instance()
2259
+			: $payment;
2260
+		$payment_method = $payment->get_first_related('Payment_Method');
2261
+		$payment_method = ! $payment_method instanceof EE_Payment_Method
2262
+			? EE_Payment_Method::new_instance()
2263
+			: $payment_method;
2264
+		$reg_details = array(
2265
+			'payment_method'       => $payment_method->name(),
2266
+			'response_msg'         => $payment->gateway_response(),
2267
+			'registration_id'      => $this->_registration->get('REG_code'),
2268
+			'registration_session' => $this->_registration->session_ID(),
2269
+			'ip_address'           => isset($this->_session['ip_address']) ? $this->_session['ip_address'] : '',
2270
+			'user_agent'           => isset($this->_session['user_agent']) ? $this->_session['user_agent'] : '',
2271
+		);
2272
+		if (isset($reg_details['registration_id'])) {
2273
+			$this->_template_args['reg_details']['registration_id']['value'] = $reg_details['registration_id'];
2274
+			$this->_template_args['reg_details']['registration_id']['label'] = esc_html__(
2275
+				'Registration ID',
2276
+				'event_espresso'
2277
+			);
2278
+			$this->_template_args['reg_details']['registration_id']['class'] = 'regular-text';
2279
+		}
2280
+		if (isset($reg_details['payment_method'])) {
2281
+			$this->_template_args['reg_details']['payment_method']['value'] = $reg_details['payment_method'];
2282
+			$this->_template_args['reg_details']['payment_method']['label'] = esc_html__(
2283
+				'Most Recent Payment Method',
2284
+				'event_espresso'
2285
+			);
2286
+			$this->_template_args['reg_details']['payment_method']['class'] = 'regular-text';
2287
+			$this->_template_args['reg_details']['response_msg']['value'] = $reg_details['response_msg'];
2288
+			$this->_template_args['reg_details']['response_msg']['label'] = esc_html__(
2289
+				'Payment method response',
2290
+				'event_espresso'
2291
+			);
2292
+			$this->_template_args['reg_details']['response_msg']['class'] = 'regular-text';
2293
+		}
2294
+		$this->_template_args['reg_details']['registration_session']['value'] = $reg_details['registration_session'];
2295
+		$this->_template_args['reg_details']['registration_session']['label'] = esc_html__(
2296
+			'Registration Session',
2297
+			'event_espresso'
2298
+		);
2299
+		$this->_template_args['reg_details']['registration_session']['class'] = 'regular-text';
2300
+		$this->_template_args['reg_details']['ip_address']['value'] = $reg_details['ip_address'];
2301
+		$this->_template_args['reg_details']['ip_address']['label'] = esc_html__(
2302
+			'Registration placed from IP',
2303
+			'event_espresso'
2304
+		);
2305
+		$this->_template_args['reg_details']['ip_address']['class'] = 'regular-text';
2306
+		$this->_template_args['reg_details']['user_agent']['value'] = $reg_details['user_agent'];
2307
+		$this->_template_args['reg_details']['user_agent']['label'] = esc_html__(
2308
+			'Registrant User Agent',
2309
+			'event_espresso'
2310
+		);
2311
+		$this->_template_args['reg_details']['user_agent']['class'] = 'large-text';
2312
+		$this->_template_args['event_link'] = EE_Admin_Page::add_query_args_and_nonce(
2313
+			array(
2314
+				'action'   => 'default',
2315
+				'event_id' => $this->_registration->event_ID(),
2316
+			),
2317
+			REG_ADMIN_URL
2318
+		);
2319
+		$this->_template_args['REG_ID'] = $this->_registration->ID();
2320
+		$this->_template_args['event_id'] = $this->_registration->event_ID();
2321
+		$template_path =
2322
+			REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_reg_details.template.php';
2323
+		echo EEH_Template::display_template($template_path, $this->_template_args, true);
2324
+	}
2325
+
2326
+
2327
+	/**
2328
+	 * generates HTML for the Registration Questions meta box.
2329
+	 * If pre-4.8.32.rc.000 hooks are used, uses old methods (with its filters),
2330
+	 * otherwise uses new forms system
2331
+	 *
2332
+	 * @access public
2333
+	 * @return void
2334
+	 * @throws DomainException
2335
+	 * @throws EE_Error
2336
+	 */
2337
+	public function _reg_questions_meta_box()
2338
+	{
2339
+		// allow someone to override this method entirely
2340
+		if (apply_filters(
2341
+			'FHEE__Registrations_Admin_Page___reg_questions_meta_box__do_default',
2342
+			true,
2343
+			$this,
2344
+			$this->_registration
2345
+		)) {
2346
+			$form = $this->_get_reg_custom_questions_form(
2347
+				$this->_registration->ID()
2348
+			);
2349
+			$this->_template_args['att_questions'] = count($form->subforms()) > 0
2350
+				? $form->get_html_and_js()
2351
+				: '';
2352
+			$this->_template_args['reg_questions_form_action'] = 'edit_registration';
2353
+			$this->_template_args['REG_ID'] = $this->_registration->ID();
2354
+			$template_path =
2355
+				REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_reg_questions.template.php';
2356
+			echo EEH_Template::display_template($template_path, $this->_template_args, true);
2357
+		}
2358
+	}
2359
+
2360
+
2361
+	/**
2362
+	 * form_before_question_group
2363
+	 *
2364
+	 * @deprecated    as of 4.8.32.rc.000
2365
+	 * @access        public
2366
+	 * @param        string $output
2367
+	 * @return        string
2368
+	 */
2369
+	public function form_before_question_group($output)
2370
+	{
2371
+		EE_Error::doing_it_wrong(
2372
+			__CLASS__ . '::' . __FUNCTION__,
2373
+			esc_html__(
2374
+				'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.',
2375
+				'event_espresso'
2376
+			),
2377
+			'4.8.32.rc.000'
2378
+		);
2379
+		return '
2380 2380
 	<table class="form-table ee-width-100">
2381 2381
 		<tbody>
2382 2382
 			';
2383
-    }
2384
-
2385
-
2386
-    /**
2387
-     * form_after_question_group
2388
-     *
2389
-     * @deprecated    as of 4.8.32.rc.000
2390
-     * @access        public
2391
-     * @param        string $output
2392
-     * @return        string
2393
-     */
2394
-    public function form_after_question_group($output)
2395
-    {
2396
-        EE_Error::doing_it_wrong(
2397
-            __CLASS__ . '::' . __FUNCTION__,
2398
-            esc_html__(
2399
-                '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.',
2400
-                'event_espresso'
2401
-            ),
2402
-            '4.8.32.rc.000'
2403
-        );
2404
-        return '
2383
+	}
2384
+
2385
+
2386
+	/**
2387
+	 * form_after_question_group
2388
+	 *
2389
+	 * @deprecated    as of 4.8.32.rc.000
2390
+	 * @access        public
2391
+	 * @param        string $output
2392
+	 * @return        string
2393
+	 */
2394
+	public function form_after_question_group($output)
2395
+	{
2396
+		EE_Error::doing_it_wrong(
2397
+			__CLASS__ . '::' . __FUNCTION__,
2398
+			esc_html__(
2399
+				'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.',
2400
+				'event_espresso'
2401
+			),
2402
+			'4.8.32.rc.000'
2403
+		);
2404
+		return '
2405 2405
 			<tr class="hide-if-no-js">
2406 2406
 				<th> </th>
2407 2407
 				<td class="reg-admin-edit-attendee-question-td">
2408 2408
 					<a class="reg-admin-edit-attendee-question-lnk" href="#" title="'
2409
-               . esc_attr__('click to edit question', 'event_espresso')
2410
-               . '">
2409
+			   . esc_attr__('click to edit question', 'event_espresso')
2410
+			   . '">
2411 2411
 						<span class="reg-admin-edit-question-group-spn lt-grey-txt">'
2412
-               . esc_html__('edit the above question group', 'event_espresso')
2413
-               . '</span>
2412
+			   . esc_html__('edit the above question group', 'event_espresso')
2413
+			   . '</span>
2414 2414
 						<div class="dashicons dashicons-edit"></div>
2415 2415
 					</a>
2416 2416
 				</td>
@@ -2418,609 +2418,609 @@  discard block
 block discarded – undo
2418 2418
 		</tbody>
2419 2419
 	</table>
2420 2420
 ';
2421
-    }
2422
-
2423
-
2424
-    /**
2425
-     * form_form_field_label_wrap
2426
-     *
2427
-     * @deprecated    as of 4.8.32.rc.000
2428
-     * @access        public
2429
-     * @param        string $label
2430
-     * @return        string
2431
-     */
2432
-    public function form_form_field_label_wrap($label)
2433
-    {
2434
-        EE_Error::doing_it_wrong(
2435
-            __CLASS__ . '::' . __FUNCTION__,
2436
-            esc_html__(
2437
-                '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.',
2438
-                'event_espresso'
2439
-            ),
2440
-            '4.8.32.rc.000'
2441
-        );
2442
-        return '
2421
+	}
2422
+
2423
+
2424
+	/**
2425
+	 * form_form_field_label_wrap
2426
+	 *
2427
+	 * @deprecated    as of 4.8.32.rc.000
2428
+	 * @access        public
2429
+	 * @param        string $label
2430
+	 * @return        string
2431
+	 */
2432
+	public function form_form_field_label_wrap($label)
2433
+	{
2434
+		EE_Error::doing_it_wrong(
2435
+			__CLASS__ . '::' . __FUNCTION__,
2436
+			esc_html__(
2437
+				'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.',
2438
+				'event_espresso'
2439
+			),
2440
+			'4.8.32.rc.000'
2441
+		);
2442
+		return '
2443 2443
 			<tr>
2444 2444
 				<th>
2445 2445
 					' . $label . '
2446 2446
 				</th>';
2447
-    }
2448
-
2449
-
2450
-    /**
2451
-     * form_form_field_input__wrap
2452
-     *
2453
-     * @deprecated    as of 4.8.32.rc.000
2454
-     * @access        public
2455
-     * @param        string $input
2456
-     * @return        string
2457
-     */
2458
-    public function form_form_field_input__wrap($input)
2459
-    {
2460
-        EE_Error::doing_it_wrong(
2461
-            __CLASS__ . '::' . __FUNCTION__,
2462
-            esc_html__(
2463
-                '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.',
2464
-                'event_espresso'
2465
-            ),
2466
-            '4.8.32.rc.000'
2467
-        );
2468
-        return '
2447
+	}
2448
+
2449
+
2450
+	/**
2451
+	 * form_form_field_input__wrap
2452
+	 *
2453
+	 * @deprecated    as of 4.8.32.rc.000
2454
+	 * @access        public
2455
+	 * @param        string $input
2456
+	 * @return        string
2457
+	 */
2458
+	public function form_form_field_input__wrap($input)
2459
+	{
2460
+		EE_Error::doing_it_wrong(
2461
+			__CLASS__ . '::' . __FUNCTION__,
2462
+			esc_html__(
2463
+				'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.',
2464
+				'event_espresso'
2465
+			),
2466
+			'4.8.32.rc.000'
2467
+		);
2468
+		return '
2469 2469
 				<td class="reg-admin-attendee-questions-input-td disabled-input">
2470 2470
 					' . $input . '
2471 2471
 				</td>
2472 2472
 			</tr>';
2473
-    }
2474
-
2475
-
2476
-    /**
2477
-     * Updates the registration's custom questions according to the form info, if the form is submitted.
2478
-     * If it's not a post, the "view_registrations" route will be called next on the SAME request
2479
-     * to display the page
2480
-     *
2481
-     * @access protected
2482
-     * @return void
2483
-     * @throws EE_Error
2484
-     */
2485
-    protected function _update_attendee_registration_form()
2486
-    {
2487
-        do_action('AHEE__Registrations_Admin_Page___update_attendee_registration_form__start', $this);
2488
-        if ($_SERVER['REQUEST_METHOD'] == 'POST') {
2489
-            $REG_ID = isset($this->_req_data['_REG_ID']) ? absint($this->_req_data['_REG_ID']) : false;
2490
-            $success = $this->_save_reg_custom_questions_form($REG_ID);
2491
-            if ($success) {
2492
-                $what = esc_html__('Registration Form', 'event_espresso');
2493
-                $route = $REG_ID ? array('action' => 'view_registration', '_REG_ID' => $REG_ID)
2494
-                    : array('action' => 'default');
2495
-                $this->_redirect_after_action($success, $what, esc_html__('updated', 'event_espresso'), $route);
2496
-            }
2497
-        }
2498
-    }
2499
-
2500
-
2501
-    /**
2502
-     * Gets the form for saving registrations custom questions (if done
2503
-     * previously retrieves the cached form object, which may have validation errors in it)
2504
-     *
2505
-     * @param int $REG_ID
2506
-     * @return EE_Registration_Custom_Questions_Form
2507
-     * @throws EE_Error
2508
-     * @throws InvalidArgumentException
2509
-     * @throws InvalidDataTypeException
2510
-     * @throws InvalidInterfaceException
2511
-     */
2512
-    protected function _get_reg_custom_questions_form($REG_ID)
2513
-    {
2514
-        if (! $this->_reg_custom_questions_form) {
2515
-            require_once(REG_ADMIN . 'form_sections' . DS . 'EE_Registration_Custom_Questions_Form.form.php');
2516
-            $this->_reg_custom_questions_form = new EE_Registration_Custom_Questions_Form(
2517
-                EEM_Registration::instance()->get_one_by_ID($REG_ID)
2518
-            );
2519
-            $this->_reg_custom_questions_form->_construct_finalize(null, null);
2520
-        }
2521
-        return $this->_reg_custom_questions_form;
2522
-    }
2523
-
2524
-
2525
-    /**
2526
-     * Saves
2527
-     *
2528
-     * @access private
2529
-     * @param bool $REG_ID
2530
-     * @return bool
2531
-     * @throws EE_Error
2532
-     * @throws InvalidArgumentException
2533
-     * @throws InvalidDataTypeException
2534
-     * @throws InvalidInterfaceException
2535
-     */
2536
-    private function _save_reg_custom_questions_form($REG_ID = false)
2537
-    {
2538
-        if (! $REG_ID) {
2539
-            EE_Error::add_error(
2540
-                esc_html__(
2541
-                    'An error occurred. No registration ID was received.',
2542
-                    'event_espresso'
2543
-                ),
2544
-                __FILE__,
2545
-                __FUNCTION__,
2546
-                __LINE__
2547
-            );
2548
-        }
2549
-        $form = $this->_get_reg_custom_questions_form($REG_ID);
2550
-        $form->receive_form_submission($this->_req_data);
2551
-        $success = false;
2552
-        if ($form->is_valid()) {
2553
-            foreach ($form->subforms() as $question_group_id => $question_group_form) {
2554
-                foreach ($question_group_form->inputs() as $question_id => $input) {
2555
-                    $where_conditions = array(
2556
-                        'QST_ID' => $question_id,
2557
-                        'REG_ID' => $REG_ID,
2558
-                    );
2559
-                    $possibly_new_values = array(
2560
-                        'ANS_value' => $input->normalized_value(),
2561
-                    );
2562
-                    $answer = EEM_Answer::instance()->get_one(array($where_conditions));
2563
-                    if ($answer instanceof EE_Answer) {
2564
-                        $success = $answer->save($possibly_new_values);
2565
-                    } else {
2566
-                        // insert it then
2567
-                        $cols_n_vals = array_merge($where_conditions, $possibly_new_values);
2568
-                        $answer = EE_Answer::new_instance($cols_n_vals);
2569
-                        $success = $answer->save();
2570
-                    }
2571
-                }
2572
-            }
2573
-        } else {
2574
-            EE_Error::add_error($form->get_validation_error_string(), __FILE__, __FUNCTION__, __LINE__);
2575
-        }
2576
-        return $success;
2577
-    }
2578
-
2579
-
2580
-    /**
2581
-     *        generates HTML for the Registration main meta box
2582
-     *
2583
-     * @access public
2584
-     * @return void
2585
-     * @throws DomainException
2586
-     * @throws EE_Error
2587
-     * @throws InvalidArgumentException
2588
-     * @throws InvalidDataTypeException
2589
-     * @throws InvalidInterfaceException
2590
-     */
2591
-    public function _reg_attendees_meta_box()
2592
-    {
2593
-        $REG = EEM_Registration::instance();
2594
-        // get all other registrations on this transaction, and cache
2595
-        // the attendees for them so we don't have to run another query using force_join
2596
-        $registrations = $REG->get_all(
2597
-            array(
2598
-                array(
2599
-                    'TXN_ID' => $this->_registration->transaction_ID(),
2600
-                    'REG_ID' => array('!=', $this->_registration->ID()),
2601
-                ),
2602
-                'force_join' => array('Attendee'),
2603
-                'default_where_conditions' => 'other_models_only',
2604
-            )
2605
-        );
2606
-        $this->_template_args['attendees'] = array();
2607
-        $this->_template_args['attendee_notice'] = '';
2608
-        if (empty($registrations)
2609
-            || (is_array($registrations)
2610
-                && ! EEH_Array::get_one_item_from_array($registrations))
2611
-        ) {
2612
-            EE_Error::add_error(
2613
-                esc_html__(
2614
-                    'There are no records attached to this registration. Something may have gone wrong with the registration',
2615
-                    'event_espresso'
2616
-                ),
2617
-                __FILE__,
2618
-                __FUNCTION__,
2619
-                __LINE__
2620
-            );
2621
-            $this->_template_args['attendee_notice'] = EE_Error::get_notices();
2622
-        } else {
2623
-            $att_nmbr = 1;
2624
-            foreach ($registrations as $registration) {
2625
-                /* @var $registration EE_Registration */
2626
-                $attendee = $registration->attendee()
2627
-                    ? $registration->attendee()
2628
-                    : EEM_Attendee::instance()
2629
-                                  ->create_default_object();
2630
-                $this->_template_args['attendees'][ $att_nmbr ]['STS_ID'] = $registration->status_ID();
2631
-                $this->_template_args['attendees'][ $att_nmbr ]['fname'] = $attendee->fname();
2632
-                $this->_template_args['attendees'][ $att_nmbr ]['lname'] = $attendee->lname();
2633
-                $this->_template_args['attendees'][ $att_nmbr ]['email'] = $attendee->email();
2634
-                $this->_template_args['attendees'][ $att_nmbr ]['final_price'] = $registration->final_price();
2635
-                $this->_template_args['attendees'][ $att_nmbr ]['address'] = implode(
2636
-                    ', ',
2637
-                    $attendee->full_address_as_array()
2638
-                );
2639
-                $this->_template_args['attendees'][ $att_nmbr ]['att_link'] = self::add_query_args_and_nonce(
2640
-                    array(
2641
-                        'action' => 'edit_attendee',
2642
-                        'post'   => $attendee->ID(),
2643
-                    ),
2644
-                    REG_ADMIN_URL
2645
-                );
2646
-                $this->_template_args['attendees'][ $att_nmbr ]['event_name'] = $registration->event_obj() instanceof EE_Event
2647
-                    ? $registration->event_obj()->name()
2648
-                    : '';
2649
-                $att_nmbr++;
2650
-            }
2651
-            $this->_template_args['currency_sign'] = EE_Registry::instance()->CFG->currency->sign;
2652
-        }
2653
-        $template_path = REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_attendees.template.php';
2654
-        echo EEH_Template::display_template($template_path, $this->_template_args, true);
2655
-    }
2656
-
2657
-
2658
-    /**
2659
-     *        generates HTML for the Edit Registration side meta box
2660
-     *
2661
-     * @access public
2662
-     * @return void
2663
-     * @throws DomainException
2664
-     * @throws EE_Error
2665
-     * @throws InvalidArgumentException
2666
-     * @throws InvalidDataTypeException
2667
-     * @throws InvalidInterfaceException
2668
-     */
2669
-    public function _reg_registrant_side_meta_box()
2670
-    {
2671
-        /*@var $attendee EE_Attendee */
2672
-        $att_check = $this->_registration->attendee();
2673
-        $attendee = $att_check instanceof EE_Attendee ? $att_check : EEM_Attendee::instance()->create_default_object();
2674
-        // now let's determine if this is not the primary registration.  If it isn't then we set the
2675
-        // primary_registration object for reference BUT ONLY if the Attendee object loaded is not the same as the
2676
-        // primary registration object (that way we know if we need to show create button or not)
2677
-        if (! $this->_registration->is_primary_registrant()) {
2678
-            $primary_registration = $this->_registration->get_primary_registration();
2679
-            $primary_attendee = $primary_registration instanceof EE_Registration ? $primary_registration->attendee()
2680
-                : null;
2681
-            if (! $primary_attendee instanceof EE_Attendee || $attendee->ID() !== $primary_attendee->ID()) {
2682
-                // in here?  This means the displayed registration is not the primary registrant but ALREADY HAS its own
2683
-                // custom attendee object so let's not worry about the primary reg.
2684
-                $primary_registration = null;
2685
-            }
2686
-        } else {
2687
-            $primary_registration = null;
2688
-        }
2689
-        $this->_template_args['ATT_ID'] = $attendee->ID();
2690
-        $this->_template_args['fname'] = $attendee->fname();
2691
-        $this->_template_args['lname'] = $attendee->lname();
2692
-        $this->_template_args['email'] = $attendee->email();
2693
-        $this->_template_args['phone'] = $attendee->phone();
2694
-        $this->_template_args['formatted_address'] = EEH_Address::format($attendee);
2695
-        // edit link
2696
-        $this->_template_args['att_edit_link'] = EE_Admin_Page::add_query_args_and_nonce(
2697
-            array(
2698
-                'action' => 'edit_attendee',
2699
-                'post'   => $attendee->ID(),
2700
-            ),
2701
-            REG_ADMIN_URL
2702
-        );
2703
-        $this->_template_args['att_edit_label'] = esc_html__('View/Edit Contact', 'event_espresso');
2704
-        // create link
2705
-        $this->_template_args['create_link'] = $primary_registration instanceof EE_Registration
2706
-            ? EE_Admin_Page::add_query_args_and_nonce(
2707
-                array(
2708
-                    'action'  => 'duplicate_attendee',
2709
-                    '_REG_ID' => $this->_registration->ID(),
2710
-                ),
2711
-                REG_ADMIN_URL
2712
-            ) : '';
2713
-        $this->_template_args['create_label'] = esc_html__('Create Contact', 'event_espresso');
2714
-        $this->_template_args['att_check'] = $att_check;
2715
-        $template_path = REG_TEMPLATE_PATH . 'reg_admin_details_side_meta_box_registrant.template.php';
2716
-        echo EEH_Template::display_template($template_path, $this->_template_args, true);
2717
-    }
2718
-
2719
-
2720
-    /**
2721
-     * trash or restore registrations
2722
-     *
2723
-     * @param  boolean $trash whether to archive or restore
2724
-     * @return void
2725
-     * @throws EE_Error
2726
-     * @throws InvalidArgumentException
2727
-     * @throws InvalidDataTypeException
2728
-     * @throws InvalidInterfaceException
2729
-     * @throws RuntimeException
2730
-     * @access protected
2731
-     */
2732
-    protected function _trash_or_restore_registrations($trash = true)
2733
-    {
2734
-        // if empty _REG_ID then get out because there's nothing to do
2735
-        if (empty($this->_req_data['_REG_ID'])) {
2736
-            EE_Error::add_error(
2737
-                sprintf(
2738
-                    esc_html__(
2739
-                        'In order to %1$s registrations you must select which ones you wish to %1$s by clicking the checkboxes.',
2740
-                        'event_espresso'
2741
-                    ),
2742
-                    $trash ? 'trash' : 'restore'
2743
-                ),
2744
-                __FILE__,
2745
-                __LINE__,
2746
-                __FUNCTION__
2747
-            );
2748
-            $this->_redirect_after_action(false, '', '', array(), true);
2749
-        }
2750
-        $success = 0;
2751
-        $overwrite_msgs = false;
2752
-        // Checkboxes
2753
-        if (! is_array($this->_req_data['_REG_ID'])) {
2754
-            $this->_req_data['_REG_ID'] = array($this->_req_data['_REG_ID']);
2755
-        }
2756
-        $reg_count = count($this->_req_data['_REG_ID']);
2757
-        // cycle thru checkboxes
2758
-        foreach ($this->_req_data['_REG_ID'] as $REG_ID) {
2759
-            /** @var EE_Registration $REG */
2760
-            $REG = EEM_Registration::instance()->get_one_by_ID($REG_ID);
2761
-            $payments = $REG->registration_payments();
2762
-            if (! empty($payments)) {
2763
-                $name = $REG->attendee() instanceof EE_Attendee
2764
-                    ? $REG->attendee()->full_name()
2765
-                    : esc_html__('Unknown Attendee', 'event_espresso');
2766
-                $overwrite_msgs = true;
2767
-                EE_Error::add_error(
2768
-                    sprintf(
2769
-                        esc_html__(
2770
-                            '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.',
2771
-                            'event_espresso'
2772
-                        ),
2773
-                        $name
2774
-                    ),
2775
-                    __FILE__,
2776
-                    __FUNCTION__,
2777
-                    __LINE__
2778
-                );
2779
-                // can't trash this registration because it has payments.
2780
-                continue;
2781
-            }
2782
-            $updated = $trash ? $REG->delete() : $REG->restore();
2783
-            if ($updated) {
2784
-                $success++;
2785
-            }
2786
-        }
2787
-        $this->_redirect_after_action(
2788
-            $success === $reg_count, // were ALL registrations affected?
2789
-            $success > 1
2790
-                ? esc_html__('Registrations', 'event_espresso')
2791
-                : esc_html__('Registration', 'event_espresso'),
2792
-            $trash
2793
-                ? esc_html__('moved to the trash', 'event_espresso')
2794
-                : esc_html__('restored', 'event_espresso'),
2795
-            $this->mergeExistingRequestParamsWithRedirectArgs(array('action' => 'default')),
2796
-            $overwrite_msgs
2797
-        );
2798
-    }
2799
-
2800
-
2801
-    /**
2802
-     * This is used to permanently delete registrations.  Note, this will handle not only deleting permanently the
2803
-     * registration but also.
2804
-     * 1. Removing relations to EE_Attendee
2805
-     * 2. Deleting permanently the related transaction, but ONLY if all related registrations to the transaction are
2806
-     * ALSO trashed.
2807
-     * 3. Deleting permanently any related Line items but only if the above conditions are met.
2808
-     * 4. Removing relationships between all tickets and the related registrations
2809
-     * 5. Deleting permanently any related Answers (and the answers for other related registrations that were deleted.)
2810
-     * 6. Deleting permanently any related Checkins.
2811
-     *
2812
-     * @return void
2813
-     * @throws EE_Error
2814
-     * @throws InvalidArgumentException
2815
-     * @throws InvalidDataTypeException
2816
-     * @throws InvalidInterfaceException
2817
-     */
2818
-    protected function _delete_registrations()
2819
-    {
2820
-        $REG_MDL = EEM_Registration::instance();
2821
-        $success = 1;
2822
-        // Checkboxes
2823
-        if (! empty($this->_req_data['_REG_ID']) && is_array($this->_req_data['_REG_ID'])) {
2824
-            // if array has more than one element than success message should be plural
2825
-            $success = count($this->_req_data['_REG_ID']) > 1 ? 2 : 1;
2826
-            // cycle thru checkboxes
2827
-            while (list($ind, $REG_ID) = each($this->_req_data['_REG_ID'])) {
2828
-                $REG = $REG_MDL->get_one_by_ID($REG_ID);
2829
-                if (! $REG instanceof EE_Registration) {
2830
-                    continue;
2831
-                }
2832
-                $deleted = $this->_delete_registration($REG);
2833
-                if (! $deleted) {
2834
-                    $success = 0;
2835
-                }
2836
-            }
2837
-        } else {
2838
-            // grab single id and delete
2839
-            $REG_ID = $this->_req_data['_REG_ID'];
2840
-            $REG = $REG_MDL->get_one_by_ID($REG_ID);
2841
-            $deleted = $this->_delete_registration($REG);
2842
-            if (! $deleted) {
2843
-                $success = 0;
2844
-            }
2845
-        }
2846
-        $what = $success > 1
2847
-            ? esc_html__('Registrations', 'event_espresso')
2848
-            : esc_html__('Registration', 'event_espresso');
2849
-        $action_desc = esc_html__('permanently deleted.', 'event_espresso');
2850
-        $this->_redirect_after_action(
2851
-            $success,
2852
-            $what,
2853
-            $action_desc,
2854
-            $this->mergeExistingRequestParamsWithRedirectArgs(['action' => 'default']),
2855
-            true
2856
-        );
2857
-    }
2858
-
2859
-
2860
-    /**
2861
-     * handles the permanent deletion of a registration.  See comments with _delete_registrations() for details on what
2862
-     * models get affected.
2863
-     *
2864
-     * @param  EE_Registration $REG registration to be deleted permenantly
2865
-     * @return bool true = successful deletion, false = fail.
2866
-     * @throws EE_Error
2867
-     */
2868
-    protected function _delete_registration(EE_Registration $REG)
2869
-    {
2870
-        // first we start with the transaction... ultimately, we WILL not delete permanently if there are any related
2871
-        // registrations on the transaction that are NOT trashed.
2872
-        $TXN = $REG->get_first_related('Transaction');
2873
-        $REGS = $TXN->get_many_related('Registration');
2874
-        $all_trashed = true;
2875
-        foreach ($REGS as $registration) {
2876
-            if (! $registration->get('REG_deleted')) {
2877
-                $all_trashed = false;
2878
-            }
2879
-        }
2880
-        if (! $all_trashed) {
2881
-            EE_Error::add_error(
2882
-                esc_html__(
2883
-                    '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.',
2884
-                    'event_espresso'
2885
-                ),
2886
-                __FILE__,
2887
-                __FUNCTION__,
2888
-                __LINE__
2889
-            );
2890
-            return false;
2891
-        }
2892
-        // k made it here so that means we can delete all the related transactions and their answers (but let's do them
2893
-        // separately from THIS one).
2894
-        foreach ($REGS as $registration) {
2895
-            // delete related answers
2896
-            $registration->delete_related_permanently('Answer');
2897
-            // remove relationship to EE_Attendee (but we ALWAYS leave the contact record intact)
2898
-            $attendee = $registration->get_first_related('Attendee');
2899
-            if ($attendee instanceof EE_Attendee) {
2900
-                $registration->_remove_relation_to($attendee, 'Attendee');
2901
-            }
2902
-            // now remove relationships to tickets on this registration.
2903
-            $registration->_remove_relations('Ticket');
2904
-            // now delete permanently the checkins related to this registration.
2905
-            $registration->delete_related_permanently('Checkin');
2906
-            if ($registration->ID() === $REG->ID()) {
2907
-                continue;
2908
-            } //we don't want to delete permanently the existing registration just yet.
2909
-            // remove relation to transaction for these registrations if NOT the existing registrations
2910
-            $registration->_remove_relations('Transaction');
2911
-            // delete permanently any related messages.
2912
-            $registration->delete_related_permanently('Message');
2913
-            // now delete this registration permanently
2914
-            $registration->delete_permanently();
2915
-        }
2916
-        // now all related registrations on the transaction are handled.  So let's just handle this registration itself
2917
-        // (the transaction and line items should be all that's left).
2918
-        // delete the line items related to the transaction for this registration.
2919
-        $TXN->delete_related_permanently('Line_Item');
2920
-        // we need to remove all the relationships on the transaction
2921
-        $TXN->delete_related_permanently('Payment');
2922
-        $TXN->delete_related_permanently('Extra_Meta');
2923
-        $TXN->delete_related_permanently('Message');
2924
-        // now we can delete this REG permanently (and the transaction of course)
2925
-        $REG->delete_related_permanently('Transaction');
2926
-        return $REG->delete_permanently();
2927
-    }
2928
-
2929
-
2930
-    /**
2931
-     *    generates HTML for the Register New Attendee Admin page
2932
-     *
2933
-     * @access private
2934
-     * @throws DomainException
2935
-     * @throws EE_Error
2936
-     */
2937
-    public function new_registration()
2938
-    {
2939
-        if (! $this->_set_reg_event()) {
2940
-            throw new EE_Error(
2941
-                esc_html__(
2942
-                    'Unable to continue with registering because there is no Event ID in the request',
2943
-                    'event_espresso'
2944
-                )
2945
-            );
2946
-        }
2947
-        EE_Registry::instance()->REQ->set_espresso_page(true);
2948
-        // gotta start with a clean slate if we're not coming here via ajax
2949
-        if (! defined('DOING_AJAX')
2950
-            && (! isset($this->_req_data['processing_registration']) || isset($this->_req_data['step_error']))
2951
-        ) {
2952
-            EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
2953
-        }
2954
-        $this->_template_args['event_name'] = '';
2955
-        // event name
2956
-        if ($this->_reg_event) {
2957
-            $this->_template_args['event_name'] = $this->_reg_event->name();
2958
-            $edit_event_url = self::add_query_args_and_nonce(
2959
-                array(
2960
-                    'action' => 'edit',
2961
-                    'post'   => $this->_reg_event->ID(),
2962
-                ),
2963
-                EVENTS_ADMIN_URL
2964
-            );
2965
-            $edit_event_lnk = '<a href="'
2966
-                              . $edit_event_url
2967
-                              . '" title="'
2968
-                              . esc_attr__('Edit ', 'event_espresso')
2969
-                              . $this->_reg_event->name()
2970
-                              . '">'
2971
-                              . esc_html__('Edit Event', 'event_espresso')
2972
-                              . '</a>';
2973
-            $this->_template_args['event_name'] .= ' <span class="admin-page-header-edit-lnk not-bold">'
2974
-                                                   . $edit_event_lnk
2975
-                                                   . '</span>';
2976
-        }
2977
-        $this->_template_args['step_content'] = $this->_get_registration_step_content();
2978
-        if (defined('DOING_AJAX')) {
2979
-            $this->_return_json();
2980
-        }
2981
-        // grab header
2982
-        $template_path =
2983
-            REG_TEMPLATE_PATH . 'reg_admin_register_new_attendee.template.php';
2984
-        $this->_template_args['admin_page_content'] = EEH_Template::display_template(
2985
-            $template_path,
2986
-            $this->_template_args,
2987
-            true
2988
-        );
2989
-        // $this->_set_publish_post_box_vars( NULL, FALSE, FALSE, NULL, FALSE );
2990
-        // the details template wrapper
2991
-        $this->display_admin_page_with_sidebar();
2992
-    }
2993
-
2994
-
2995
-    /**
2996
-     * This returns the content for a registration step
2997
-     *
2998
-     * @access protected
2999
-     * @return string html
3000
-     * @throws DomainException
3001
-     * @throws EE_Error
3002
-     * @throws InvalidArgumentException
3003
-     * @throws InvalidDataTypeException
3004
-     * @throws InvalidInterfaceException
3005
-     */
3006
-    protected function _get_registration_step_content()
3007
-    {
3008
-        if (isset($_COOKIE['ee_registration_added']) && $_COOKIE['ee_registration_added']) {
3009
-            $warning_msg = sprintf(
3010
-                esc_html__(
3011
-                    '%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',
3012
-                    'event_espresso'
3013
-                ),
3014
-                '<br />',
3015
-                '<h3 class="important-notice">',
3016
-                '</h3>',
3017
-                '<div class="float-right">',
3018
-                '<span id="redirect_timer" class="important-notice">30</span>',
3019
-                '</div>',
3020
-                '<b>',
3021
-                '</b>'
3022
-            );
3023
-            return '
2473
+	}
2474
+
2475
+
2476
+	/**
2477
+	 * Updates the registration's custom questions according to the form info, if the form is submitted.
2478
+	 * If it's not a post, the "view_registrations" route will be called next on the SAME request
2479
+	 * to display the page
2480
+	 *
2481
+	 * @access protected
2482
+	 * @return void
2483
+	 * @throws EE_Error
2484
+	 */
2485
+	protected function _update_attendee_registration_form()
2486
+	{
2487
+		do_action('AHEE__Registrations_Admin_Page___update_attendee_registration_form__start', $this);
2488
+		if ($_SERVER['REQUEST_METHOD'] == 'POST') {
2489
+			$REG_ID = isset($this->_req_data['_REG_ID']) ? absint($this->_req_data['_REG_ID']) : false;
2490
+			$success = $this->_save_reg_custom_questions_form($REG_ID);
2491
+			if ($success) {
2492
+				$what = esc_html__('Registration Form', 'event_espresso');
2493
+				$route = $REG_ID ? array('action' => 'view_registration', '_REG_ID' => $REG_ID)
2494
+					: array('action' => 'default');
2495
+				$this->_redirect_after_action($success, $what, esc_html__('updated', 'event_espresso'), $route);
2496
+			}
2497
+		}
2498
+	}
2499
+
2500
+
2501
+	/**
2502
+	 * Gets the form for saving registrations custom questions (if done
2503
+	 * previously retrieves the cached form object, which may have validation errors in it)
2504
+	 *
2505
+	 * @param int $REG_ID
2506
+	 * @return EE_Registration_Custom_Questions_Form
2507
+	 * @throws EE_Error
2508
+	 * @throws InvalidArgumentException
2509
+	 * @throws InvalidDataTypeException
2510
+	 * @throws InvalidInterfaceException
2511
+	 */
2512
+	protected function _get_reg_custom_questions_form($REG_ID)
2513
+	{
2514
+		if (! $this->_reg_custom_questions_form) {
2515
+			require_once(REG_ADMIN . 'form_sections' . DS . 'EE_Registration_Custom_Questions_Form.form.php');
2516
+			$this->_reg_custom_questions_form = new EE_Registration_Custom_Questions_Form(
2517
+				EEM_Registration::instance()->get_one_by_ID($REG_ID)
2518
+			);
2519
+			$this->_reg_custom_questions_form->_construct_finalize(null, null);
2520
+		}
2521
+		return $this->_reg_custom_questions_form;
2522
+	}
2523
+
2524
+
2525
+	/**
2526
+	 * Saves
2527
+	 *
2528
+	 * @access private
2529
+	 * @param bool $REG_ID
2530
+	 * @return bool
2531
+	 * @throws EE_Error
2532
+	 * @throws InvalidArgumentException
2533
+	 * @throws InvalidDataTypeException
2534
+	 * @throws InvalidInterfaceException
2535
+	 */
2536
+	private function _save_reg_custom_questions_form($REG_ID = false)
2537
+	{
2538
+		if (! $REG_ID) {
2539
+			EE_Error::add_error(
2540
+				esc_html__(
2541
+					'An error occurred. No registration ID was received.',
2542
+					'event_espresso'
2543
+				),
2544
+				__FILE__,
2545
+				__FUNCTION__,
2546
+				__LINE__
2547
+			);
2548
+		}
2549
+		$form = $this->_get_reg_custom_questions_form($REG_ID);
2550
+		$form->receive_form_submission($this->_req_data);
2551
+		$success = false;
2552
+		if ($form->is_valid()) {
2553
+			foreach ($form->subforms() as $question_group_id => $question_group_form) {
2554
+				foreach ($question_group_form->inputs() as $question_id => $input) {
2555
+					$where_conditions = array(
2556
+						'QST_ID' => $question_id,
2557
+						'REG_ID' => $REG_ID,
2558
+					);
2559
+					$possibly_new_values = array(
2560
+						'ANS_value' => $input->normalized_value(),
2561
+					);
2562
+					$answer = EEM_Answer::instance()->get_one(array($where_conditions));
2563
+					if ($answer instanceof EE_Answer) {
2564
+						$success = $answer->save($possibly_new_values);
2565
+					} else {
2566
+						// insert it then
2567
+						$cols_n_vals = array_merge($where_conditions, $possibly_new_values);
2568
+						$answer = EE_Answer::new_instance($cols_n_vals);
2569
+						$success = $answer->save();
2570
+					}
2571
+				}
2572
+			}
2573
+		} else {
2574
+			EE_Error::add_error($form->get_validation_error_string(), __FILE__, __FUNCTION__, __LINE__);
2575
+		}
2576
+		return $success;
2577
+	}
2578
+
2579
+
2580
+	/**
2581
+	 *        generates HTML for the Registration main meta box
2582
+	 *
2583
+	 * @access public
2584
+	 * @return void
2585
+	 * @throws DomainException
2586
+	 * @throws EE_Error
2587
+	 * @throws InvalidArgumentException
2588
+	 * @throws InvalidDataTypeException
2589
+	 * @throws InvalidInterfaceException
2590
+	 */
2591
+	public function _reg_attendees_meta_box()
2592
+	{
2593
+		$REG = EEM_Registration::instance();
2594
+		// get all other registrations on this transaction, and cache
2595
+		// the attendees for them so we don't have to run another query using force_join
2596
+		$registrations = $REG->get_all(
2597
+			array(
2598
+				array(
2599
+					'TXN_ID' => $this->_registration->transaction_ID(),
2600
+					'REG_ID' => array('!=', $this->_registration->ID()),
2601
+				),
2602
+				'force_join' => array('Attendee'),
2603
+				'default_where_conditions' => 'other_models_only',
2604
+			)
2605
+		);
2606
+		$this->_template_args['attendees'] = array();
2607
+		$this->_template_args['attendee_notice'] = '';
2608
+		if (empty($registrations)
2609
+			|| (is_array($registrations)
2610
+				&& ! EEH_Array::get_one_item_from_array($registrations))
2611
+		) {
2612
+			EE_Error::add_error(
2613
+				esc_html__(
2614
+					'There are no records attached to this registration. Something may have gone wrong with the registration',
2615
+					'event_espresso'
2616
+				),
2617
+				__FILE__,
2618
+				__FUNCTION__,
2619
+				__LINE__
2620
+			);
2621
+			$this->_template_args['attendee_notice'] = EE_Error::get_notices();
2622
+		} else {
2623
+			$att_nmbr = 1;
2624
+			foreach ($registrations as $registration) {
2625
+				/* @var $registration EE_Registration */
2626
+				$attendee = $registration->attendee()
2627
+					? $registration->attendee()
2628
+					: EEM_Attendee::instance()
2629
+								  ->create_default_object();
2630
+				$this->_template_args['attendees'][ $att_nmbr ]['STS_ID'] = $registration->status_ID();
2631
+				$this->_template_args['attendees'][ $att_nmbr ]['fname'] = $attendee->fname();
2632
+				$this->_template_args['attendees'][ $att_nmbr ]['lname'] = $attendee->lname();
2633
+				$this->_template_args['attendees'][ $att_nmbr ]['email'] = $attendee->email();
2634
+				$this->_template_args['attendees'][ $att_nmbr ]['final_price'] = $registration->final_price();
2635
+				$this->_template_args['attendees'][ $att_nmbr ]['address'] = implode(
2636
+					', ',
2637
+					$attendee->full_address_as_array()
2638
+				);
2639
+				$this->_template_args['attendees'][ $att_nmbr ]['att_link'] = self::add_query_args_and_nonce(
2640
+					array(
2641
+						'action' => 'edit_attendee',
2642
+						'post'   => $attendee->ID(),
2643
+					),
2644
+					REG_ADMIN_URL
2645
+				);
2646
+				$this->_template_args['attendees'][ $att_nmbr ]['event_name'] = $registration->event_obj() instanceof EE_Event
2647
+					? $registration->event_obj()->name()
2648
+					: '';
2649
+				$att_nmbr++;
2650
+			}
2651
+			$this->_template_args['currency_sign'] = EE_Registry::instance()->CFG->currency->sign;
2652
+		}
2653
+		$template_path = REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_attendees.template.php';
2654
+		echo EEH_Template::display_template($template_path, $this->_template_args, true);
2655
+	}
2656
+
2657
+
2658
+	/**
2659
+	 *        generates HTML for the Edit Registration side meta box
2660
+	 *
2661
+	 * @access public
2662
+	 * @return void
2663
+	 * @throws DomainException
2664
+	 * @throws EE_Error
2665
+	 * @throws InvalidArgumentException
2666
+	 * @throws InvalidDataTypeException
2667
+	 * @throws InvalidInterfaceException
2668
+	 */
2669
+	public function _reg_registrant_side_meta_box()
2670
+	{
2671
+		/*@var $attendee EE_Attendee */
2672
+		$att_check = $this->_registration->attendee();
2673
+		$attendee = $att_check instanceof EE_Attendee ? $att_check : EEM_Attendee::instance()->create_default_object();
2674
+		// now let's determine if this is not the primary registration.  If it isn't then we set the
2675
+		// primary_registration object for reference BUT ONLY if the Attendee object loaded is not the same as the
2676
+		// primary registration object (that way we know if we need to show create button or not)
2677
+		if (! $this->_registration->is_primary_registrant()) {
2678
+			$primary_registration = $this->_registration->get_primary_registration();
2679
+			$primary_attendee = $primary_registration instanceof EE_Registration ? $primary_registration->attendee()
2680
+				: null;
2681
+			if (! $primary_attendee instanceof EE_Attendee || $attendee->ID() !== $primary_attendee->ID()) {
2682
+				// in here?  This means the displayed registration is not the primary registrant but ALREADY HAS its own
2683
+				// custom attendee object so let's not worry about the primary reg.
2684
+				$primary_registration = null;
2685
+			}
2686
+		} else {
2687
+			$primary_registration = null;
2688
+		}
2689
+		$this->_template_args['ATT_ID'] = $attendee->ID();
2690
+		$this->_template_args['fname'] = $attendee->fname();
2691
+		$this->_template_args['lname'] = $attendee->lname();
2692
+		$this->_template_args['email'] = $attendee->email();
2693
+		$this->_template_args['phone'] = $attendee->phone();
2694
+		$this->_template_args['formatted_address'] = EEH_Address::format($attendee);
2695
+		// edit link
2696
+		$this->_template_args['att_edit_link'] = EE_Admin_Page::add_query_args_and_nonce(
2697
+			array(
2698
+				'action' => 'edit_attendee',
2699
+				'post'   => $attendee->ID(),
2700
+			),
2701
+			REG_ADMIN_URL
2702
+		);
2703
+		$this->_template_args['att_edit_label'] = esc_html__('View/Edit Contact', 'event_espresso');
2704
+		// create link
2705
+		$this->_template_args['create_link'] = $primary_registration instanceof EE_Registration
2706
+			? EE_Admin_Page::add_query_args_and_nonce(
2707
+				array(
2708
+					'action'  => 'duplicate_attendee',
2709
+					'_REG_ID' => $this->_registration->ID(),
2710
+				),
2711
+				REG_ADMIN_URL
2712
+			) : '';
2713
+		$this->_template_args['create_label'] = esc_html__('Create Contact', 'event_espresso');
2714
+		$this->_template_args['att_check'] = $att_check;
2715
+		$template_path = REG_TEMPLATE_PATH . 'reg_admin_details_side_meta_box_registrant.template.php';
2716
+		echo EEH_Template::display_template($template_path, $this->_template_args, true);
2717
+	}
2718
+
2719
+
2720
+	/**
2721
+	 * trash or restore registrations
2722
+	 *
2723
+	 * @param  boolean $trash whether to archive or restore
2724
+	 * @return void
2725
+	 * @throws EE_Error
2726
+	 * @throws InvalidArgumentException
2727
+	 * @throws InvalidDataTypeException
2728
+	 * @throws InvalidInterfaceException
2729
+	 * @throws RuntimeException
2730
+	 * @access protected
2731
+	 */
2732
+	protected function _trash_or_restore_registrations($trash = true)
2733
+	{
2734
+		// if empty _REG_ID then get out because there's nothing to do
2735
+		if (empty($this->_req_data['_REG_ID'])) {
2736
+			EE_Error::add_error(
2737
+				sprintf(
2738
+					esc_html__(
2739
+						'In order to %1$s registrations you must select which ones you wish to %1$s by clicking the checkboxes.',
2740
+						'event_espresso'
2741
+					),
2742
+					$trash ? 'trash' : 'restore'
2743
+				),
2744
+				__FILE__,
2745
+				__LINE__,
2746
+				__FUNCTION__
2747
+			);
2748
+			$this->_redirect_after_action(false, '', '', array(), true);
2749
+		}
2750
+		$success = 0;
2751
+		$overwrite_msgs = false;
2752
+		// Checkboxes
2753
+		if (! is_array($this->_req_data['_REG_ID'])) {
2754
+			$this->_req_data['_REG_ID'] = array($this->_req_data['_REG_ID']);
2755
+		}
2756
+		$reg_count = count($this->_req_data['_REG_ID']);
2757
+		// cycle thru checkboxes
2758
+		foreach ($this->_req_data['_REG_ID'] as $REG_ID) {
2759
+			/** @var EE_Registration $REG */
2760
+			$REG = EEM_Registration::instance()->get_one_by_ID($REG_ID);
2761
+			$payments = $REG->registration_payments();
2762
+			if (! empty($payments)) {
2763
+				$name = $REG->attendee() instanceof EE_Attendee
2764
+					? $REG->attendee()->full_name()
2765
+					: esc_html__('Unknown Attendee', 'event_espresso');
2766
+				$overwrite_msgs = true;
2767
+				EE_Error::add_error(
2768
+					sprintf(
2769
+						esc_html__(
2770
+							'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.',
2771
+							'event_espresso'
2772
+						),
2773
+						$name
2774
+					),
2775
+					__FILE__,
2776
+					__FUNCTION__,
2777
+					__LINE__
2778
+				);
2779
+				// can't trash this registration because it has payments.
2780
+				continue;
2781
+			}
2782
+			$updated = $trash ? $REG->delete() : $REG->restore();
2783
+			if ($updated) {
2784
+				$success++;
2785
+			}
2786
+		}
2787
+		$this->_redirect_after_action(
2788
+			$success === $reg_count, // were ALL registrations affected?
2789
+			$success > 1
2790
+				? esc_html__('Registrations', 'event_espresso')
2791
+				: esc_html__('Registration', 'event_espresso'),
2792
+			$trash
2793
+				? esc_html__('moved to the trash', 'event_espresso')
2794
+				: esc_html__('restored', 'event_espresso'),
2795
+			$this->mergeExistingRequestParamsWithRedirectArgs(array('action' => 'default')),
2796
+			$overwrite_msgs
2797
+		);
2798
+	}
2799
+
2800
+
2801
+	/**
2802
+	 * This is used to permanently delete registrations.  Note, this will handle not only deleting permanently the
2803
+	 * registration but also.
2804
+	 * 1. Removing relations to EE_Attendee
2805
+	 * 2. Deleting permanently the related transaction, but ONLY if all related registrations to the transaction are
2806
+	 * ALSO trashed.
2807
+	 * 3. Deleting permanently any related Line items but only if the above conditions are met.
2808
+	 * 4. Removing relationships between all tickets and the related registrations
2809
+	 * 5. Deleting permanently any related Answers (and the answers for other related registrations that were deleted.)
2810
+	 * 6. Deleting permanently any related Checkins.
2811
+	 *
2812
+	 * @return void
2813
+	 * @throws EE_Error
2814
+	 * @throws InvalidArgumentException
2815
+	 * @throws InvalidDataTypeException
2816
+	 * @throws InvalidInterfaceException
2817
+	 */
2818
+	protected function _delete_registrations()
2819
+	{
2820
+		$REG_MDL = EEM_Registration::instance();
2821
+		$success = 1;
2822
+		// Checkboxes
2823
+		if (! empty($this->_req_data['_REG_ID']) && is_array($this->_req_data['_REG_ID'])) {
2824
+			// if array has more than one element than success message should be plural
2825
+			$success = count($this->_req_data['_REG_ID']) > 1 ? 2 : 1;
2826
+			// cycle thru checkboxes
2827
+			while (list($ind, $REG_ID) = each($this->_req_data['_REG_ID'])) {
2828
+				$REG = $REG_MDL->get_one_by_ID($REG_ID);
2829
+				if (! $REG instanceof EE_Registration) {
2830
+					continue;
2831
+				}
2832
+				$deleted = $this->_delete_registration($REG);
2833
+				if (! $deleted) {
2834
+					$success = 0;
2835
+				}
2836
+			}
2837
+		} else {
2838
+			// grab single id and delete
2839
+			$REG_ID = $this->_req_data['_REG_ID'];
2840
+			$REG = $REG_MDL->get_one_by_ID($REG_ID);
2841
+			$deleted = $this->_delete_registration($REG);
2842
+			if (! $deleted) {
2843
+				$success = 0;
2844
+			}
2845
+		}
2846
+		$what = $success > 1
2847
+			? esc_html__('Registrations', 'event_espresso')
2848
+			: esc_html__('Registration', 'event_espresso');
2849
+		$action_desc = esc_html__('permanently deleted.', 'event_espresso');
2850
+		$this->_redirect_after_action(
2851
+			$success,
2852
+			$what,
2853
+			$action_desc,
2854
+			$this->mergeExistingRequestParamsWithRedirectArgs(['action' => 'default']),
2855
+			true
2856
+		);
2857
+	}
2858
+
2859
+
2860
+	/**
2861
+	 * handles the permanent deletion of a registration.  See comments with _delete_registrations() for details on what
2862
+	 * models get affected.
2863
+	 *
2864
+	 * @param  EE_Registration $REG registration to be deleted permenantly
2865
+	 * @return bool true = successful deletion, false = fail.
2866
+	 * @throws EE_Error
2867
+	 */
2868
+	protected function _delete_registration(EE_Registration $REG)
2869
+	{
2870
+		// first we start with the transaction... ultimately, we WILL not delete permanently if there are any related
2871
+		// registrations on the transaction that are NOT trashed.
2872
+		$TXN = $REG->get_first_related('Transaction');
2873
+		$REGS = $TXN->get_many_related('Registration');
2874
+		$all_trashed = true;
2875
+		foreach ($REGS as $registration) {
2876
+			if (! $registration->get('REG_deleted')) {
2877
+				$all_trashed = false;
2878
+			}
2879
+		}
2880
+		if (! $all_trashed) {
2881
+			EE_Error::add_error(
2882
+				esc_html__(
2883
+					'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.',
2884
+					'event_espresso'
2885
+				),
2886
+				__FILE__,
2887
+				__FUNCTION__,
2888
+				__LINE__
2889
+			);
2890
+			return false;
2891
+		}
2892
+		// k made it here so that means we can delete all the related transactions and their answers (but let's do them
2893
+		// separately from THIS one).
2894
+		foreach ($REGS as $registration) {
2895
+			// delete related answers
2896
+			$registration->delete_related_permanently('Answer');
2897
+			// remove relationship to EE_Attendee (but we ALWAYS leave the contact record intact)
2898
+			$attendee = $registration->get_first_related('Attendee');
2899
+			if ($attendee instanceof EE_Attendee) {
2900
+				$registration->_remove_relation_to($attendee, 'Attendee');
2901
+			}
2902
+			// now remove relationships to tickets on this registration.
2903
+			$registration->_remove_relations('Ticket');
2904
+			// now delete permanently the checkins related to this registration.
2905
+			$registration->delete_related_permanently('Checkin');
2906
+			if ($registration->ID() === $REG->ID()) {
2907
+				continue;
2908
+			} //we don't want to delete permanently the existing registration just yet.
2909
+			// remove relation to transaction for these registrations if NOT the existing registrations
2910
+			$registration->_remove_relations('Transaction');
2911
+			// delete permanently any related messages.
2912
+			$registration->delete_related_permanently('Message');
2913
+			// now delete this registration permanently
2914
+			$registration->delete_permanently();
2915
+		}
2916
+		// now all related registrations on the transaction are handled.  So let's just handle this registration itself
2917
+		// (the transaction and line items should be all that's left).
2918
+		// delete the line items related to the transaction for this registration.
2919
+		$TXN->delete_related_permanently('Line_Item');
2920
+		// we need to remove all the relationships on the transaction
2921
+		$TXN->delete_related_permanently('Payment');
2922
+		$TXN->delete_related_permanently('Extra_Meta');
2923
+		$TXN->delete_related_permanently('Message');
2924
+		// now we can delete this REG permanently (and the transaction of course)
2925
+		$REG->delete_related_permanently('Transaction');
2926
+		return $REG->delete_permanently();
2927
+	}
2928
+
2929
+
2930
+	/**
2931
+	 *    generates HTML for the Register New Attendee Admin page
2932
+	 *
2933
+	 * @access private
2934
+	 * @throws DomainException
2935
+	 * @throws EE_Error
2936
+	 */
2937
+	public function new_registration()
2938
+	{
2939
+		if (! $this->_set_reg_event()) {
2940
+			throw new EE_Error(
2941
+				esc_html__(
2942
+					'Unable to continue with registering because there is no Event ID in the request',
2943
+					'event_espresso'
2944
+				)
2945
+			);
2946
+		}
2947
+		EE_Registry::instance()->REQ->set_espresso_page(true);
2948
+		// gotta start with a clean slate if we're not coming here via ajax
2949
+		if (! defined('DOING_AJAX')
2950
+			&& (! isset($this->_req_data['processing_registration']) || isset($this->_req_data['step_error']))
2951
+		) {
2952
+			EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
2953
+		}
2954
+		$this->_template_args['event_name'] = '';
2955
+		// event name
2956
+		if ($this->_reg_event) {
2957
+			$this->_template_args['event_name'] = $this->_reg_event->name();
2958
+			$edit_event_url = self::add_query_args_and_nonce(
2959
+				array(
2960
+					'action' => 'edit',
2961
+					'post'   => $this->_reg_event->ID(),
2962
+				),
2963
+				EVENTS_ADMIN_URL
2964
+			);
2965
+			$edit_event_lnk = '<a href="'
2966
+							  . $edit_event_url
2967
+							  . '" title="'
2968
+							  . esc_attr__('Edit ', 'event_espresso')
2969
+							  . $this->_reg_event->name()
2970
+							  . '">'
2971
+							  . esc_html__('Edit Event', 'event_espresso')
2972
+							  . '</a>';
2973
+			$this->_template_args['event_name'] .= ' <span class="admin-page-header-edit-lnk not-bold">'
2974
+												   . $edit_event_lnk
2975
+												   . '</span>';
2976
+		}
2977
+		$this->_template_args['step_content'] = $this->_get_registration_step_content();
2978
+		if (defined('DOING_AJAX')) {
2979
+			$this->_return_json();
2980
+		}
2981
+		// grab header
2982
+		$template_path =
2983
+			REG_TEMPLATE_PATH . 'reg_admin_register_new_attendee.template.php';
2984
+		$this->_template_args['admin_page_content'] = EEH_Template::display_template(
2985
+			$template_path,
2986
+			$this->_template_args,
2987
+			true
2988
+		);
2989
+		// $this->_set_publish_post_box_vars( NULL, FALSE, FALSE, NULL, FALSE );
2990
+		// the details template wrapper
2991
+		$this->display_admin_page_with_sidebar();
2992
+	}
2993
+
2994
+
2995
+	/**
2996
+	 * This returns the content for a registration step
2997
+	 *
2998
+	 * @access protected
2999
+	 * @return string html
3000
+	 * @throws DomainException
3001
+	 * @throws EE_Error
3002
+	 * @throws InvalidArgumentException
3003
+	 * @throws InvalidDataTypeException
3004
+	 * @throws InvalidInterfaceException
3005
+	 */
3006
+	protected function _get_registration_step_content()
3007
+	{
3008
+		if (isset($_COOKIE['ee_registration_added']) && $_COOKIE['ee_registration_added']) {
3009
+			$warning_msg = sprintf(
3010
+				esc_html__(
3011
+					'%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',
3012
+					'event_espresso'
3013
+				),
3014
+				'<br />',
3015
+				'<h3 class="important-notice">',
3016
+				'</h3>',
3017
+				'<div class="float-right">',
3018
+				'<span id="redirect_timer" class="important-notice">30</span>',
3019
+				'</div>',
3020
+				'<b>',
3021
+				'</b>'
3022
+			);
3023
+			return '
3024 3024
 	<div id="ee-add-reg-back-button-dv"><p>' . $warning_msg . '</p></div>
3025 3025
 	<script >
3026 3026
 		// WHOAH !!! it appears that someone is using the back button from the Transaction admin page
@@ -3033,855 +3033,855 @@  discard block
 block discarded – undo
3033 3033
 	        }
3034 3034
 	    }, 800 );
3035 3035
 	</script >';
3036
-        }
3037
-        $template_args = array(
3038
-            'title'                    => '',
3039
-            'content'                  => '',
3040
-            'step_button_text'         => '',
3041
-            'show_notification_toggle' => false,
3042
-        );
3043
-        // to indicate we're processing a new registration
3044
-        $hidden_fields = array(
3045
-            'processing_registration' => array(
3046
-                'type'  => 'hidden',
3047
-                'value' => 0,
3048
-            ),
3049
-            'event_id'                => array(
3050
-                'type'  => 'hidden',
3051
-                'value' => $this->_reg_event->ID(),
3052
-            ),
3053
-        );
3054
-        // if the cart is empty then we know we're at step one so we'll display ticket selector
3055
-        $cart = EE_Registry::instance()->SSN->cart();
3056
-        $step = ! $cart instanceof EE_Cart ? 'ticket' : 'questions';
3057
-        switch ($step) {
3058
-            case 'ticket':
3059
-                $hidden_fields['processing_registration']['value'] = 1;
3060
-                $template_args['title'] = esc_html__(
3061
-                    'Step One: Select the Ticket for this registration',
3062
-                    'event_espresso'
3063
-                );
3064
-                $template_args['content'] =
3065
-                    EED_Ticket_Selector::instance()->display_ticket_selector($this->_reg_event);
3066
-                $template_args['step_button_text'] = esc_html__(
3067
-                    'Add Tickets and Continue to Registrant Details',
3068
-                    'event_espresso'
3069
-                );
3070
-                $template_args['show_notification_toggle'] = false;
3071
-                break;
3072
-            case 'questions':
3073
-                $hidden_fields['processing_registration']['value'] = 2;
3074
-                $template_args['title'] = esc_html__(
3075
-                    'Step Two: Add Registrant Details for this Registration',
3076
-                    'event_espresso'
3077
-                );
3078
-                // in theory we should be able to run EED_SPCO at this point because the cart should have been setup
3079
-                // properly by the first process_reg_step run.
3080
-                $template_args['content'] =
3081
-                    EED_Single_Page_Checkout::registration_checkout_for_admin();
3082
-                $template_args['step_button_text'] = esc_html__(
3083
-                    'Save Registration and Continue to Details',
3084
-                    'event_espresso'
3085
-                );
3086
-                $template_args['show_notification_toggle'] = true;
3087
-                break;
3088
-        }
3089
-        // we come back to the process_registration_step route.
3090
-        $this->_set_add_edit_form_tags('process_reg_step', $hidden_fields);
3091
-        return EEH_Template::display_template(
3092
-            REG_TEMPLATE_PATH . 'reg_admin_register_new_attendee_step_content.template.php',
3093
-            $template_args,
3094
-            true
3095
-        );
3096
-    }
3097
-
3098
-
3099
-    /**
3100
-     *        set_reg_event
3101
-     *
3102
-     * @access private
3103
-     * @return bool
3104
-     * @throws EE_Error
3105
-     * @throws InvalidArgumentException
3106
-     * @throws InvalidDataTypeException
3107
-     * @throws InvalidInterfaceException
3108
-     */
3109
-    private function _set_reg_event()
3110
-    {
3111
-        if (is_object($this->_reg_event)) {
3112
-            return true;
3113
-        }
3114
-        $EVT_ID = (! empty($this->_req_data['event_id'])) ? absint($this->_req_data['event_id']) : false;
3115
-        if (! $EVT_ID) {
3116
-            return false;
3117
-        }
3118
-        $this->_reg_event = EEM_Event::instance()->get_one_by_ID($EVT_ID);
3119
-        return true;
3120
-    }
3121
-
3122
-
3123
-    /**
3124
-     * process_reg_step
3125
-     *
3126
-     * @access        public
3127
-     * @return string
3128
-     * @throws DomainException
3129
-     * @throws EE_Error
3130
-     * @throws InvalidArgumentException
3131
-     * @throws InvalidDataTypeException
3132
-     * @throws InvalidInterfaceException
3133
-     * @throws ReflectionException
3134
-     * @throws RuntimeException
3135
-     */
3136
-    public function process_reg_step()
3137
-    {
3138
-        EE_System::do_not_cache();
3139
-        $this->_set_reg_event();
3140
-        EE_Registry::instance()->REQ->set_espresso_page(true);
3141
-        EE_Registry::instance()->REQ->set('uts', time());
3142
-        // what step are we on?
3143
-        $cart = EE_Registry::instance()->SSN->cart();
3144
-        $step = ! $cart instanceof EE_Cart ? 'ticket' : 'questions';
3145
-        // if doing ajax then we need to verify the nonce
3146
-        if (defined('DOING_AJAX')) {
3147
-            $nonce = isset($this->_req_data[ $this->_req_nonce ])
3148
-                ? sanitize_text_field($this->_req_data[ $this->_req_nonce ]) : '';
3149
-            $this->_verify_nonce($nonce, $this->_req_nonce);
3150
-        }
3151
-        switch ($step) {
3152
-            case 'ticket':
3153
-                // process ticket selection
3154
-                $success = EED_Ticket_Selector::instance()->process_ticket_selections();
3155
-                if ($success) {
3156
-                    EE_Error::add_success(
3157
-                        esc_html__(
3158
-                            'Tickets Selected. Now complete the registration.',
3159
-                            'event_espresso'
3160
-                        )
3161
-                    );
3162
-                } else {
3163
-                    $query_args['step_error'] = $this->_req_data['step_error'] = true;
3164
-                }
3165
-                if (defined('DOING_AJAX')) {
3166
-                    $this->new_registration(); // display next step
3167
-                } else {
3168
-                    $query_args = array(
3169
-                        'action'                  => 'new_registration',
3170
-                        'processing_registration' => 1,
3171
-                        'event_id'                => $this->_reg_event->ID(),
3172
-                        'uts'                     => time(),
3173
-                    );
3174
-                    $this->_redirect_after_action(
3175
-                        false,
3176
-                        '',
3177
-                        '',
3178
-                        $query_args,
3179
-                        true
3180
-                    );
3181
-                }
3182
-                break;
3183
-            case 'questions':
3184
-                if (! isset(
3185
-                    $this->_req_data['txn_reg_status_change'],
3186
-                    $this->_req_data['txn_reg_status_change']['send_notifications']
3187
-                )
3188
-                ) {
3189
-                    add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_false', 15);
3190
-                }
3191
-                // process registration
3192
-                $transaction = EED_Single_Page_Checkout::instance()->process_registration_from_admin();
3193
-                if ($cart instanceof EE_Cart) {
3194
-                    $grand_total = $cart->get_cart_grand_total();
3195
-                    if ($grand_total instanceof EE_Line_Item) {
3196
-                        $grand_total->save_this_and_descendants_to_txn();
3197
-                    }
3198
-                }
3199
-                if (! $transaction instanceof EE_Transaction) {
3200
-                    $query_args = array(
3201
-                        'action'                  => 'new_registration',
3202
-                        'processing_registration' => 2,
3203
-                        'event_id'                => $this->_reg_event->ID(),
3204
-                        'uts'                     => time(),
3205
-                    );
3206
-                    if (defined('DOING_AJAX')) {
3207
-                        // display registration form again because there are errors (maybe validation?)
3208
-                        $this->new_registration();
3209
-                        return;
3210
-                    } else {
3211
-                        $this->_redirect_after_action(
3212
-                            false,
3213
-                            '',
3214
-                            '',
3215
-                            $query_args,
3216
-                            true
3217
-                        );
3218
-                        return;
3219
-                    }
3220
-                }
3221
-                // maybe update status, and make sure to save transaction if not done already
3222
-                if (! $transaction->update_status_based_on_total_paid()) {
3223
-                    $transaction->save();
3224
-                }
3225
-                EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
3226
-                $this->_req_data = array();
3227
-                $query_args = array(
3228
-                    'action'        => 'redirect_to_txn',
3229
-                    'TXN_ID'        => $transaction->ID(),
3230
-                    'EVT_ID'        => $this->_reg_event->ID(),
3231
-                    'event_name'    => urlencode($this->_reg_event->name()),
3232
-                    'redirect_from' => 'new_registration',
3233
-                );
3234
-                $this->_redirect_after_action(false, '', '', $query_args, true);
3235
-                break;
3236
-        }
3237
-        // what are you looking here for?  Should be nothing to do at this point.
3238
-    }
3239
-
3240
-
3241
-    /**
3242
-     * redirect_to_txn
3243
-     *
3244
-     * @access public
3245
-     * @return void
3246
-     * @throws EE_Error
3247
-     * @throws InvalidArgumentException
3248
-     * @throws InvalidDataTypeException
3249
-     * @throws InvalidInterfaceException
3250
-     */
3251
-    public function redirect_to_txn()
3252
-    {
3253
-        EE_System::do_not_cache();
3254
-        EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
3255
-        $query_args = array(
3256
-            'action' => 'view_transaction',
3257
-            'TXN_ID' => isset($this->_req_data['TXN_ID']) ? absint($this->_req_data['TXN_ID']) : 0,
3258
-            'page'   => 'espresso_transactions',
3259
-        );
3260
-        if (isset($this->_req_data['EVT_ID'], $this->_req_data['redirect_from'])) {
3261
-            $query_args['EVT_ID'] = $this->_req_data['EVT_ID'];
3262
-            $query_args['event_name'] = urlencode($this->_req_data['event_name']);
3263
-            $query_args['redirect_from'] = $this->_req_data['redirect_from'];
3264
-        }
3265
-        EE_Error::add_success(
3266
-            esc_html__(
3267
-                'Registration Created.  Please review the transaction and add any payments as necessary',
3268
-                'event_espresso'
3269
-            )
3270
-        );
3271
-        $this->_redirect_after_action(false, '', '', $query_args, true);
3272
-    }
3273
-
3274
-
3275
-    /**
3276
-     *        generates HTML for the Attendee Contact List
3277
-     *
3278
-     * @access protected
3279
-     * @return void
3280
-     */
3281
-    protected function _attendee_contact_list_table()
3282
-    {
3283
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
3284
-        $this->_search_btn_label = esc_html__('Contacts', 'event_espresso');
3285
-        $this->display_admin_list_table_page_with_no_sidebar();
3286
-    }
3287
-
3288
-
3289
-    /**
3290
-     *        get_attendees
3291
-     *
3292
-     * @param      $per_page
3293
-     * @param bool $count whether to return count or data.
3294
-     * @param bool $trash
3295
-     * @return array
3296
-     * @throws EE_Error
3297
-     * @throws InvalidArgumentException
3298
-     * @throws InvalidDataTypeException
3299
-     * @throws InvalidInterfaceException
3300
-     * @access public
3301
-     */
3302
-    public function get_attendees($per_page, $count = false, $trash = false)
3303
-    {
3304
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
3305
-        require_once(REG_ADMIN . 'EE_Attendee_Contact_List_Table.class.php');
3306
-        $ATT_MDL = EEM_Attendee::instance();
3307
-        $this->_req_data['orderby'] = ! empty($this->_req_data['orderby']) ? $this->_req_data['orderby'] : '';
3308
-        switch ($this->_req_data['orderby']) {
3309
-            case 'ATT_ID':
3310
-                $orderby = 'ATT_ID';
3311
-                break;
3312
-            case 'ATT_fname':
3313
-                $orderby = 'ATT_fname';
3314
-                break;
3315
-            case 'ATT_email':
3316
-                $orderby = 'ATT_email';
3317
-                break;
3318
-            case 'ATT_city':
3319
-                $orderby = 'ATT_city';
3320
-                break;
3321
-            case 'STA_ID':
3322
-                $orderby = 'STA_ID';
3323
-                break;
3324
-            case 'CNT_ID':
3325
-                $orderby = 'CNT_ID';
3326
-                break;
3327
-            case 'Registration_Count':
3328
-                $orderby = 'Registration_Count';
3329
-                break;
3330
-            default:
3331
-                $orderby = 'ATT_lname';
3332
-        }
3333
-        $sort = (isset($this->_req_data['order']) && ! empty($this->_req_data['order']))
3334
-            ? $this->_req_data['order']
3335
-            : 'ASC';
3336
-        $current_page = isset($this->_req_data['paged']) && ! empty($this->_req_data['paged'])
3337
-            ? $this->_req_data['paged']
3338
-            : 1;
3339
-        $per_page = isset($per_page) && ! empty($per_page) ? $per_page : 10;
3340
-        $per_page = isset($this->_req_data['perpage']) && ! empty($this->_req_data['perpage'])
3341
-            ? $this->_req_data['perpage']
3342
-            : $per_page;
3343
-        $_where = array();
3344
-        if (! empty($this->_req_data['s'])) {
3345
-            $sstr = '%' . $this->_req_data['s'] . '%';
3346
-            $_where['OR'] = array(
3347
-                'Registration.Event.EVT_name'       => array('LIKE', $sstr),
3348
-                'Registration.Event.EVT_desc'       => array('LIKE', $sstr),
3349
-                'Registration.Event.EVT_short_desc' => array('LIKE', $sstr),
3350
-                'ATT_fname'                         => array('LIKE', $sstr),
3351
-                'ATT_lname'                         => array('LIKE', $sstr),
3352
-                'ATT_short_bio'                     => array('LIKE', $sstr),
3353
-                'ATT_email'                         => array('LIKE', $sstr),
3354
-                'ATT_address'                       => array('LIKE', $sstr),
3355
-                'ATT_address2'                      => array('LIKE', $sstr),
3356
-                'ATT_city'                          => array('LIKE', $sstr),
3357
-                'Country.CNT_name'                  => array('LIKE', $sstr),
3358
-                'State.STA_name'                    => array('LIKE', $sstr),
3359
-                'ATT_phone'                         => array('LIKE', $sstr),
3360
-                'Registration.REG_final_price'      => array('LIKE', $sstr),
3361
-                'Registration.REG_code'             => array('LIKE', $sstr),
3362
-                'Registration.REG_group_size'       => array('LIKE', $sstr),
3363
-            );
3364
-        }
3365
-        $offset = ($current_page - 1) * $per_page;
3366
-        $limit = $count ? null : array($offset, $per_page);
3367
-        $query_args = array(
3368
-            $_where,
3369
-            'extra_selects' => array('Registration_Count' => array('Registration.REG_ID', 'count', '%d')),
3370
-            'limit'         => $limit,
3371
-        );
3372
-        if (! $count) {
3373
-            $query_args['order_by'] = array($orderby => $sort);
3374
-        }
3375
-        if ($trash) {
3376
-            $query_args[0]['status'] = array('!=', 'publish');
3377
-            $all_attendees = $count
3378
-                ? $ATT_MDL->count($query_args, 'ATT_ID', true)
3379
-                : $ATT_MDL->get_all($query_args);
3380
-        } else {
3381
-            $query_args[0]['status'] = array('IN', array('publish'));
3382
-            $all_attendees = $count
3383
-                ? $ATT_MDL->count($query_args, 'ATT_ID', true)
3384
-                : $ATT_MDL->get_all($query_args);
3385
-        }
3386
-        return $all_attendees;
3387
-    }
3388
-
3389
-
3390
-    /**
3391
-     * This is just taking care of resending the registration confirmation
3392
-     *
3393
-     * @access protected
3394
-     * @return void
3395
-     */
3396
-    protected function _resend_registration()
3397
-    {
3398
-        $this->_process_resend_registration();
3399
-        $query_args = isset($this->_req_data['redirect_to'])
3400
-            ? array('action' => $this->_req_data['redirect_to'], '_REG_ID' => $this->_req_data['_REG_ID'])
3401
-            : array('action' => 'default');
3402
-        $this->_redirect_after_action(false, '', '', $query_args, true);
3403
-    }
3404
-
3405
-    /**
3406
-     * Creates a registration report, but accepts the name of a method to use for preparing the query parameters
3407
-     * to use when selecting registrations
3408
-     *
3409
-     * @param string $method_name_for_getting_query_params the name of the method (on this class) to use for preparing
3410
-     *                                                     the query parameters from the request
3411
-     * @return void ends the request with a redirect or download
3412
-     */
3413
-    public function _registrations_report_base($method_name_for_getting_query_params)
3414
-    {
3415
-        if (! defined('EE_USE_OLD_CSV_REPORT_CLASS')) {
3416
-            wp_redirect(
3417
-                EE_Admin_Page::add_query_args_and_nonce(
3418
-                    array(
3419
-                        'page'        => 'espresso_batch',
3420
-                        'batch'       => 'file',
3421
-                        'EVT_ID'      => isset($this->_req_data['EVT_ID']) ? $this->_req_data['EVT_ID'] : null,
3422
-                        'filters'     => urlencode(
3423
-                            serialize(
3424
-                                call_user_func(
3425
-                                    array($this, $method_name_for_getting_query_params),
3426
-                                    EEH_Array::is_set(
3427
-                                        $this->_req_data,
3428
-                                        'filters',
3429
-                                        array()
3430
-                                    )
3431
-                                )
3432
-                            )
3433
-                        ),
3434
-                        'use_filters' => EEH_Array::is_set($this->_req_data, 'use_filters', false),
3435
-                        'job_handler' => urlencode('EventEspressoBatchRequest\JobHandlers\RegistrationsReport'),
3436
-                        'return_url'  => urlencode($this->_req_data['return_url']),
3437
-                    )
3438
-                )
3439
-            );
3440
-        } else {
3441
-            $new_request_args = array(
3442
-                'export' => 'report',
3443
-                'action' => 'registrations_report_for_event',
3444
-                'EVT_ID' => isset($this->_req_data['EVT_ID']) ? $this->_req_data['EVT_ID'] : null,
3445
-            );
3446
-            $this->_req_data = array_merge($this->_req_data, $new_request_args);
3447
-            if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3448
-                require_once(EE_CLASSES . 'EE_Export.class.php');
3449
-                $EE_Export = EE_Export::instance($this->_req_data);
3450
-                $EE_Export->export();
3451
-            }
3452
-        }
3453
-    }
3454
-
3455
-
3456
-    /**
3457
-     * Creates a registration report using only query parameters in the request
3458
-     *
3459
-     * @return void
3460
-     */
3461
-    public function _registrations_report()
3462
-    {
3463
-        $this->_registrations_report_base('_get_registration_query_parameters');
3464
-    }
3465
-
3466
-
3467
-    public function _contact_list_export()
3468
-    {
3469
-        if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3470
-            require_once(EE_CLASSES . 'EE_Export.class.php');
3471
-            $EE_Export = EE_Export::instance($this->_req_data);
3472
-            $EE_Export->export_attendees();
3473
-        }
3474
-    }
3475
-
3476
-
3477
-    public function _contact_list_report()
3478
-    {
3479
-        if (! defined('EE_USE_OLD_CSV_REPORT_CLASS')) {
3480
-            wp_redirect(
3481
-                EE_Admin_Page::add_query_args_and_nonce(
3482
-                    array(
3483
-                        'page'        => 'espresso_batch',
3484
-                        'batch'       => 'file',
3485
-                        'job_handler' => urlencode('EventEspressoBatchRequest\JobHandlers\AttendeesReport'),
3486
-                        'return_url'  => urlencode($this->_req_data['return_url']),
3487
-                    )
3488
-                )
3489
-            );
3490
-        } else {
3491
-            if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3492
-                require_once(EE_CLASSES . 'EE_Export.class.php');
3493
-                $EE_Export = EE_Export::instance($this->_req_data);
3494
-                $EE_Export->report_attendees();
3495
-            }
3496
-        }
3497
-    }
3498
-
3499
-
3500
-
3501
-
3502
-
3503
-    /***************************************        ATTENDEE DETAILS        ***************************************/
3504
-    /**
3505
-     * This duplicates the attendee object for the given incoming registration id and attendee_id.
3506
-     *
3507
-     * @return void
3508
-     * @throws EE_Error
3509
-     * @throws InvalidArgumentException
3510
-     * @throws InvalidDataTypeException
3511
-     * @throws InvalidInterfaceException
3512
-     */
3513
-    protected function _duplicate_attendee()
3514
-    {
3515
-        $action = ! empty($this->_req_data['return']) ? $this->_req_data['return'] : 'default';
3516
-        // verify we have necessary info
3517
-        if (empty($this->_req_data['_REG_ID'])) {
3518
-            EE_Error::add_error(
3519
-                esc_html__(
3520
-                    'Unable to create the contact for the registration because the required parameters are not present (_REG_ID )',
3521
-                    'event_espresso'
3522
-                ),
3523
-                __FILE__,
3524
-                __LINE__,
3525
-                __FUNCTION__
3526
-            );
3527
-            $query_args = array('action' => $action);
3528
-            $this->_redirect_after_action('', '', '', $query_args, true);
3529
-        }
3530
-        // okay necessary deets present... let's dupe the incoming attendee and attach to incoming registration.
3531
-        $registration = EEM_Registration::instance()->get_one_by_ID($this->_req_data['_REG_ID']);
3532
-        $attendee = $registration->attendee();
3533
-        // remove relation of existing attendee on registration
3534
-        $registration->_remove_relation_to($attendee, 'Attendee');
3535
-        // new attendee
3536
-        $new_attendee = clone $attendee;
3537
-        $new_attendee->set('ATT_ID', 0);
3538
-        $new_attendee->save();
3539
-        // add new attendee to reg
3540
-        $registration->_add_relation_to($new_attendee, 'Attendee');
3541
-        EE_Error::add_success(
3542
-            esc_html__(
3543
-                'New Contact record created.  Now make any edits you wish to make for this contact.',
3544
-                'event_espresso'
3545
-            )
3546
-        );
3547
-        // redirect to edit page for attendee
3548
-        $query_args = array('post' => $new_attendee->ID(), 'action' => 'edit_attendee');
3549
-        $this->_redirect_after_action('', '', '', $query_args, true);
3550
-    }
3551
-
3552
-
3553
-    /**
3554
-     * Callback invoked by parent EE_Admin_CPT class hooked in on `save_post` wp hook.
3555
-     *
3556
-     * @param int     $post_id
3557
-     * @param WP_POST $post
3558
-     * @throws DomainException
3559
-     * @throws EE_Error
3560
-     * @throws InvalidArgumentException
3561
-     * @throws InvalidDataTypeException
3562
-     * @throws InvalidInterfaceException
3563
-     * @throws LogicException
3564
-     * @throws InvalidFormSubmissionException
3565
-     */
3566
-    protected function _insert_update_cpt_item($post_id, $post)
3567
-    {
3568
-        $success = true;
3569
-        $attendee = $post instanceof WP_Post && $post->post_type === 'espresso_attendees'
3570
-            ? EEM_Attendee::instance()->get_one_by_ID($post_id)
3571
-            : null;
3572
-        // for attendee updates
3573
-        if ($attendee instanceof EE_Attendee) {
3574
-            // note we should only be UPDATING attendees at this point.
3575
-            $updated_fields = array(
3576
-                'ATT_fname'     => $this->_req_data['ATT_fname'],
3577
-                'ATT_lname'     => $this->_req_data['ATT_lname'],
3578
-                'ATT_full_name' => $this->_req_data['ATT_fname'] . ' ' . $this->_req_data['ATT_lname'],
3579
-                'ATT_address'   => isset($this->_req_data['ATT_address']) ? $this->_req_data['ATT_address'] : '',
3580
-                'ATT_address2'  => isset($this->_req_data['ATT_address2']) ? $this->_req_data['ATT_address2'] : '',
3581
-                'ATT_city'      => isset($this->_req_data['ATT_city']) ? $this->_req_data['ATT_city'] : '',
3582
-                'STA_ID'        => isset($this->_req_data['STA_ID']) ? $this->_req_data['STA_ID'] : '',
3583
-                'CNT_ISO'       => isset($this->_req_data['CNT_ISO']) ? $this->_req_data['CNT_ISO'] : '',
3584
-                'ATT_zip'       => isset($this->_req_data['ATT_zip']) ? $this->_req_data['ATT_zip'] : '',
3585
-            );
3586
-            foreach ($updated_fields as $field => $value) {
3587
-                $attendee->set($field, $value);
3588
-            }
3589
-
3590
-            // process contact details metabox form handler (which will also save the attendee)
3591
-            $contact_details_form = $this->getAttendeeContactDetailsMetaboxFormHandler($attendee);
3592
-            $success = $contact_details_form->process($this->_req_data);
3593
-
3594
-            $attendee_update_callbacks = apply_filters(
3595
-                'FHEE__Registrations_Admin_Page__insert_update_cpt_item__attendee_update',
3596
-                array()
3597
-            );
3598
-            foreach ($attendee_update_callbacks as $a_callback) {
3599
-                if (false === call_user_func_array($a_callback, array($attendee, $this->_req_data))) {
3600
-                    throw new EE_Error(
3601
-                        sprintf(
3602
-                            esc_html__(
3603
-                                '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.',
3604
-                                'event_espresso'
3605
-                            ),
3606
-                            $a_callback
3607
-                        )
3608
-                    );
3609
-                }
3610
-            }
3611
-        }
3612
-
3613
-        if ($success === false) {
3614
-            EE_Error::add_error(
3615
-                esc_html__(
3616
-                    'Something went wrong with updating the meta table data for the registration.',
3617
-                    'event_espresso'
3618
-                ),
3619
-                __FILE__,
3620
-                __FUNCTION__,
3621
-                __LINE__
3622
-            );
3623
-        }
3624
-    }
3625
-
3626
-
3627
-    public function trash_cpt_item($post_id)
3628
-    {
3629
-    }
3630
-
3631
-
3632
-    public function delete_cpt_item($post_id)
3633
-    {
3634
-    }
3635
-
3636
-
3637
-    public function restore_cpt_item($post_id)
3638
-    {
3639
-    }
3640
-
3641
-
3642
-    protected function _restore_cpt_item($post_id, $revision_id)
3643
-    {
3644
-    }
3645
-
3646
-
3647
-    public function attendee_editor_metaboxes()
3648
-    {
3649
-        $this->verify_cpt_object();
3650
-        remove_meta_box(
3651
-            'postexcerpt',
3652
-            esc_html__('Excerpt', 'event_espresso'),
3653
-            'post_excerpt_meta_box',
3654
-            $this->_cpt_routes[ $this->_req_action ],
3655
-            'normal',
3656
-            'core'
3657
-        );
3658
-        remove_meta_box('commentstatusdiv', $this->_cpt_routes[ $this->_req_action ], 'normal', 'core');
3659
-        if (post_type_supports('espresso_attendees', 'excerpt')) {
3660
-            add_meta_box(
3661
-                'postexcerpt',
3662
-                esc_html__('Short Biography', 'event_espresso'),
3663
-                'post_excerpt_meta_box',
3664
-                $this->_cpt_routes[ $this->_req_action ],
3665
-                'normal'
3666
-            );
3667
-        }
3668
-        if (post_type_supports('espresso_attendees', 'comments')) {
3669
-            add_meta_box(
3670
-                'commentsdiv',
3671
-                esc_html__('Notes on the Contact', 'event_espresso'),
3672
-                'post_comment_meta_box',
3673
-                $this->_cpt_routes[ $this->_req_action ],
3674
-                'normal',
3675
-                'core'
3676
-            );
3677
-        }
3678
-        add_meta_box(
3679
-            'attendee_contact_info',
3680
-            esc_html__('Contact Info', 'event_espresso'),
3681
-            array($this, 'attendee_contact_info'),
3682
-            $this->_cpt_routes[ $this->_req_action ],
3683
-            'side',
3684
-            'core'
3685
-        );
3686
-        add_meta_box(
3687
-            'attendee_details_address',
3688
-            esc_html__('Address Details', 'event_espresso'),
3689
-            array($this, 'attendee_address_details'),
3690
-            $this->_cpt_routes[ $this->_req_action ],
3691
-            'normal',
3692
-            'core'
3693
-        );
3694
-        add_meta_box(
3695
-            'attendee_registrations',
3696
-            esc_html__('Registrations for this Contact', 'event_espresso'),
3697
-            array($this, 'attendee_registrations_meta_box'),
3698
-            $this->_cpt_routes[ $this->_req_action ],
3699
-            'normal',
3700
-            'high'
3701
-        );
3702
-    }
3703
-
3704
-
3705
-    /**
3706
-     * Metabox for attendee contact info
3707
-     *
3708
-     * @param  WP_Post $post wp post object
3709
-     * @return string attendee contact info ( and form )
3710
-     * @throws EE_Error
3711
-     * @throws InvalidArgumentException
3712
-     * @throws InvalidDataTypeException
3713
-     * @throws InvalidInterfaceException
3714
-     * @throws LogicException
3715
-     * @throws DomainException
3716
-     */
3717
-    public function attendee_contact_info($post)
3718
-    {
3719
-        // get attendee object ( should already have it )
3720
-        $form = $this->getAttendeeContactDetailsMetaboxFormHandler($this->_cpt_model_obj);
3721
-        $form->enqueueStylesAndScripts();
3722
-        echo $form->display();
3723
-    }
3724
-
3725
-
3726
-    /**
3727
-     * Return form handler for the contact details metabox
3728
-     *
3729
-     * @param EE_Attendee $attendee
3730
-     * @return AttendeeContactDetailsMetaboxFormHandler
3731
-     * @throws DomainException
3732
-     * @throws InvalidArgumentException
3733
-     * @throws InvalidDataTypeException
3734
-     * @throws InvalidInterfaceException
3735
-     */
3736
-    protected function getAttendeeContactDetailsMetaboxFormHandler(EE_Attendee $attendee)
3737
-    {
3738
-        return new AttendeeContactDetailsMetaboxFormHandler($attendee, EE_Registry::instance());
3739
-    }
3740
-
3741
-
3742
-    /**
3743
-     * Metabox for attendee details
3744
-     *
3745
-     * @param  WP_Post $post wp post object
3746
-     * @throws DomainException
3747
-     */
3748
-    public function attendee_address_details($post)
3749
-    {
3750
-        // get attendee object (should already have it)
3751
-        $this->_template_args['attendee'] = $this->_cpt_model_obj;
3752
-        $this->_template_args['state_html'] = EEH_Form_Fields::generate_form_input(
3753
-            new EE_Question_Form_Input(
3754
-                EE_Question::new_instance(
3755
-                    array(
3756
-                        'QST_ID'           => 0,
3757
-                        'QST_display_text' => esc_html__('State/Province', 'event_espresso'),
3758
-                        'QST_system'       => 'admin-state',
3759
-                    )
3760
-                ),
3761
-                EE_Answer::new_instance(
3762
-                    array(
3763
-                        'ANS_ID'    => 0,
3764
-                        'ANS_value' => $this->_cpt_model_obj->state_ID(),
3765
-                    )
3766
-                ),
3767
-                array(
3768
-                    'input_id'       => 'STA_ID',
3769
-                    'input_name'     => 'STA_ID',
3770
-                    'input_prefix'   => '',
3771
-                    'append_qstn_id' => false,
3772
-                )
3773
-            )
3774
-        );
3775
-        $this->_template_args['country_html'] = EEH_Form_Fields::generate_form_input(
3776
-            new EE_Question_Form_Input(
3777
-                EE_Question::new_instance(
3778
-                    array(
3779
-                        'QST_ID'           => 0,
3780
-                        'QST_display_text' => esc_html__('Country', 'event_espresso'),
3781
-                        'QST_system'       => 'admin-country',
3782
-                    )
3783
-                ),
3784
-                EE_Answer::new_instance(
3785
-                    array(
3786
-                        'ANS_ID'    => 0,
3787
-                        'ANS_value' => $this->_cpt_model_obj->country_ID(),
3788
-                    )
3789
-                ),
3790
-                array(
3791
-                    'input_id'       => 'CNT_ISO',
3792
-                    'input_name'     => 'CNT_ISO',
3793
-                    'input_prefix'   => '',
3794
-                    'append_qstn_id' => false,
3795
-                )
3796
-            )
3797
-        );
3798
-        $template =
3799
-            REG_TEMPLATE_PATH . 'attendee_address_details_metabox_content.template.php';
3800
-        EEH_Template::display_template($template, $this->_template_args);
3801
-    }
3802
-
3803
-
3804
-    /**
3805
-     *        _attendee_details
3806
-     *
3807
-     * @access protected
3808
-     * @param $post
3809
-     * @return void
3810
-     * @throws DomainException
3811
-     * @throws EE_Error
3812
-     */
3813
-    public function attendee_registrations_meta_box($post)
3814
-    {
3815
-        $this->_template_args['attendee'] = $this->_cpt_model_obj;
3816
-        $this->_template_args['registrations'] = $this->_cpt_model_obj->get_many_related('Registration');
3817
-        $template =
3818
-            REG_TEMPLATE_PATH . 'attendee_registrations_main_meta_box.template.php';
3819
-        EEH_Template::display_template($template, $this->_template_args);
3820
-    }
3821
-
3822
-
3823
-    /**
3824
-     * add in the form fields for the attendee edit
3825
-     *
3826
-     * @param  WP_Post $post wp post object
3827
-     * @return string html for new form.
3828
-     * @throws DomainException
3829
-     */
3830
-    public function after_title_form_fields($post)
3831
-    {
3832
-        if ($post->post_type == 'espresso_attendees') {
3833
-            $template = REG_TEMPLATE_PATH . 'attendee_details_after_title_form_fields.template.php';
3834
-            $template_args['attendee'] = $this->_cpt_model_obj;
3835
-            EEH_Template::display_template($template, $template_args);
3836
-        }
3837
-    }
3838
-
3839
-
3840
-    /**
3841
-     *        _trash_or_restore_attendee
3842
-     *
3843
-     * @param boolean $trash - whether to move item to trash (TRUE) or restore it (FALSE)
3844
-     * @return void
3845
-     * @throws EE_Error
3846
-     * @throws InvalidArgumentException
3847
-     * @throws InvalidDataTypeException
3848
-     * @throws InvalidInterfaceException
3849
-     * @access protected
3850
-     */
3851
-    protected function _trash_or_restore_attendees($trash = true)
3852
-    {
3853
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
3854
-        $ATT_MDL = EEM_Attendee::instance();
3855
-        $success = 1;
3856
-        // Checkboxes
3857
-        if (! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
3858
-            // if array has more than one element than success message should be plural
3859
-            $success = count($this->_req_data['checkbox']) > 1 ? 2 : 1;
3860
-            // cycle thru checkboxes
3861
-            while (list($ATT_ID, $value) = each($this->_req_data['checkbox'])) {
3862
-                $updated = $trash ? $ATT_MDL->update_by_ID(array('status' => 'trash'), $ATT_ID)
3863
-                    : $ATT_MDL->update_by_ID(array('status' => 'publish'), $ATT_ID);
3864
-                if (! $updated) {
3865
-                    $success = 0;
3866
-                }
3867
-            }
3868
-        } else {
3869
-            // grab single id and delete
3870
-            $ATT_ID = absint($this->_req_data['ATT_ID']);
3871
-            // get attendee
3872
-            $att = $ATT_MDL->get_one_by_ID($ATT_ID);
3873
-            $updated = $trash ? $att->set_status('trash') : $att->set_status('publish');
3874
-            $updated = $att->save();
3875
-            if (! $updated) {
3876
-                $success = 0;
3877
-            }
3878
-        }
3879
-        $what = $success > 1
3880
-            ? esc_html__('Contacts', 'event_espresso')
3881
-            : esc_html__('Contact', 'event_espresso');
3882
-        $action_desc = $trash
3883
-            ? esc_html__('moved to the trash', 'event_espresso')
3884
-            : esc_html__('restored', 'event_espresso');
3885
-        $this->_redirect_after_action($success, $what, $action_desc, array('action' => 'contact_list'));
3886
-    }
3036
+		}
3037
+		$template_args = array(
3038
+			'title'                    => '',
3039
+			'content'                  => '',
3040
+			'step_button_text'         => '',
3041
+			'show_notification_toggle' => false,
3042
+		);
3043
+		// to indicate we're processing a new registration
3044
+		$hidden_fields = array(
3045
+			'processing_registration' => array(
3046
+				'type'  => 'hidden',
3047
+				'value' => 0,
3048
+			),
3049
+			'event_id'                => array(
3050
+				'type'  => 'hidden',
3051
+				'value' => $this->_reg_event->ID(),
3052
+			),
3053
+		);
3054
+		// if the cart is empty then we know we're at step one so we'll display ticket selector
3055
+		$cart = EE_Registry::instance()->SSN->cart();
3056
+		$step = ! $cart instanceof EE_Cart ? 'ticket' : 'questions';
3057
+		switch ($step) {
3058
+			case 'ticket':
3059
+				$hidden_fields['processing_registration']['value'] = 1;
3060
+				$template_args['title'] = esc_html__(
3061
+					'Step One: Select the Ticket for this registration',
3062
+					'event_espresso'
3063
+				);
3064
+				$template_args['content'] =
3065
+					EED_Ticket_Selector::instance()->display_ticket_selector($this->_reg_event);
3066
+				$template_args['step_button_text'] = esc_html__(
3067
+					'Add Tickets and Continue to Registrant Details',
3068
+					'event_espresso'
3069
+				);
3070
+				$template_args['show_notification_toggle'] = false;
3071
+				break;
3072
+			case 'questions':
3073
+				$hidden_fields['processing_registration']['value'] = 2;
3074
+				$template_args['title'] = esc_html__(
3075
+					'Step Two: Add Registrant Details for this Registration',
3076
+					'event_espresso'
3077
+				);
3078
+				// in theory we should be able to run EED_SPCO at this point because the cart should have been setup
3079
+				// properly by the first process_reg_step run.
3080
+				$template_args['content'] =
3081
+					EED_Single_Page_Checkout::registration_checkout_for_admin();
3082
+				$template_args['step_button_text'] = esc_html__(
3083
+					'Save Registration and Continue to Details',
3084
+					'event_espresso'
3085
+				);
3086
+				$template_args['show_notification_toggle'] = true;
3087
+				break;
3088
+		}
3089
+		// we come back to the process_registration_step route.
3090
+		$this->_set_add_edit_form_tags('process_reg_step', $hidden_fields);
3091
+		return EEH_Template::display_template(
3092
+			REG_TEMPLATE_PATH . 'reg_admin_register_new_attendee_step_content.template.php',
3093
+			$template_args,
3094
+			true
3095
+		);
3096
+	}
3097
+
3098
+
3099
+	/**
3100
+	 *        set_reg_event
3101
+	 *
3102
+	 * @access private
3103
+	 * @return bool
3104
+	 * @throws EE_Error
3105
+	 * @throws InvalidArgumentException
3106
+	 * @throws InvalidDataTypeException
3107
+	 * @throws InvalidInterfaceException
3108
+	 */
3109
+	private function _set_reg_event()
3110
+	{
3111
+		if (is_object($this->_reg_event)) {
3112
+			return true;
3113
+		}
3114
+		$EVT_ID = (! empty($this->_req_data['event_id'])) ? absint($this->_req_data['event_id']) : false;
3115
+		if (! $EVT_ID) {
3116
+			return false;
3117
+		}
3118
+		$this->_reg_event = EEM_Event::instance()->get_one_by_ID($EVT_ID);
3119
+		return true;
3120
+	}
3121
+
3122
+
3123
+	/**
3124
+	 * process_reg_step
3125
+	 *
3126
+	 * @access        public
3127
+	 * @return string
3128
+	 * @throws DomainException
3129
+	 * @throws EE_Error
3130
+	 * @throws InvalidArgumentException
3131
+	 * @throws InvalidDataTypeException
3132
+	 * @throws InvalidInterfaceException
3133
+	 * @throws ReflectionException
3134
+	 * @throws RuntimeException
3135
+	 */
3136
+	public function process_reg_step()
3137
+	{
3138
+		EE_System::do_not_cache();
3139
+		$this->_set_reg_event();
3140
+		EE_Registry::instance()->REQ->set_espresso_page(true);
3141
+		EE_Registry::instance()->REQ->set('uts', time());
3142
+		// what step are we on?
3143
+		$cart = EE_Registry::instance()->SSN->cart();
3144
+		$step = ! $cart instanceof EE_Cart ? 'ticket' : 'questions';
3145
+		// if doing ajax then we need to verify the nonce
3146
+		if (defined('DOING_AJAX')) {
3147
+			$nonce = isset($this->_req_data[ $this->_req_nonce ])
3148
+				? sanitize_text_field($this->_req_data[ $this->_req_nonce ]) : '';
3149
+			$this->_verify_nonce($nonce, $this->_req_nonce);
3150
+		}
3151
+		switch ($step) {
3152
+			case 'ticket':
3153
+				// process ticket selection
3154
+				$success = EED_Ticket_Selector::instance()->process_ticket_selections();
3155
+				if ($success) {
3156
+					EE_Error::add_success(
3157
+						esc_html__(
3158
+							'Tickets Selected. Now complete the registration.',
3159
+							'event_espresso'
3160
+						)
3161
+					);
3162
+				} else {
3163
+					$query_args['step_error'] = $this->_req_data['step_error'] = true;
3164
+				}
3165
+				if (defined('DOING_AJAX')) {
3166
+					$this->new_registration(); // display next step
3167
+				} else {
3168
+					$query_args = array(
3169
+						'action'                  => 'new_registration',
3170
+						'processing_registration' => 1,
3171
+						'event_id'                => $this->_reg_event->ID(),
3172
+						'uts'                     => time(),
3173
+					);
3174
+					$this->_redirect_after_action(
3175
+						false,
3176
+						'',
3177
+						'',
3178
+						$query_args,
3179
+						true
3180
+					);
3181
+				}
3182
+				break;
3183
+			case 'questions':
3184
+				if (! isset(
3185
+					$this->_req_data['txn_reg_status_change'],
3186
+					$this->_req_data['txn_reg_status_change']['send_notifications']
3187
+				)
3188
+				) {
3189
+					add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_false', 15);
3190
+				}
3191
+				// process registration
3192
+				$transaction = EED_Single_Page_Checkout::instance()->process_registration_from_admin();
3193
+				if ($cart instanceof EE_Cart) {
3194
+					$grand_total = $cart->get_cart_grand_total();
3195
+					if ($grand_total instanceof EE_Line_Item) {
3196
+						$grand_total->save_this_and_descendants_to_txn();
3197
+					}
3198
+				}
3199
+				if (! $transaction instanceof EE_Transaction) {
3200
+					$query_args = array(
3201
+						'action'                  => 'new_registration',
3202
+						'processing_registration' => 2,
3203
+						'event_id'                => $this->_reg_event->ID(),
3204
+						'uts'                     => time(),
3205
+					);
3206
+					if (defined('DOING_AJAX')) {
3207
+						// display registration form again because there are errors (maybe validation?)
3208
+						$this->new_registration();
3209
+						return;
3210
+					} else {
3211
+						$this->_redirect_after_action(
3212
+							false,
3213
+							'',
3214
+							'',
3215
+							$query_args,
3216
+							true
3217
+						);
3218
+						return;
3219
+					}
3220
+				}
3221
+				// maybe update status, and make sure to save transaction if not done already
3222
+				if (! $transaction->update_status_based_on_total_paid()) {
3223
+					$transaction->save();
3224
+				}
3225
+				EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
3226
+				$this->_req_data = array();
3227
+				$query_args = array(
3228
+					'action'        => 'redirect_to_txn',
3229
+					'TXN_ID'        => $transaction->ID(),
3230
+					'EVT_ID'        => $this->_reg_event->ID(),
3231
+					'event_name'    => urlencode($this->_reg_event->name()),
3232
+					'redirect_from' => 'new_registration',
3233
+				);
3234
+				$this->_redirect_after_action(false, '', '', $query_args, true);
3235
+				break;
3236
+		}
3237
+		// what are you looking here for?  Should be nothing to do at this point.
3238
+	}
3239
+
3240
+
3241
+	/**
3242
+	 * redirect_to_txn
3243
+	 *
3244
+	 * @access public
3245
+	 * @return void
3246
+	 * @throws EE_Error
3247
+	 * @throws InvalidArgumentException
3248
+	 * @throws InvalidDataTypeException
3249
+	 * @throws InvalidInterfaceException
3250
+	 */
3251
+	public function redirect_to_txn()
3252
+	{
3253
+		EE_System::do_not_cache();
3254
+		EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
3255
+		$query_args = array(
3256
+			'action' => 'view_transaction',
3257
+			'TXN_ID' => isset($this->_req_data['TXN_ID']) ? absint($this->_req_data['TXN_ID']) : 0,
3258
+			'page'   => 'espresso_transactions',
3259
+		);
3260
+		if (isset($this->_req_data['EVT_ID'], $this->_req_data['redirect_from'])) {
3261
+			$query_args['EVT_ID'] = $this->_req_data['EVT_ID'];
3262
+			$query_args['event_name'] = urlencode($this->_req_data['event_name']);
3263
+			$query_args['redirect_from'] = $this->_req_data['redirect_from'];
3264
+		}
3265
+		EE_Error::add_success(
3266
+			esc_html__(
3267
+				'Registration Created.  Please review the transaction and add any payments as necessary',
3268
+				'event_espresso'
3269
+			)
3270
+		);
3271
+		$this->_redirect_after_action(false, '', '', $query_args, true);
3272
+	}
3273
+
3274
+
3275
+	/**
3276
+	 *        generates HTML for the Attendee Contact List
3277
+	 *
3278
+	 * @access protected
3279
+	 * @return void
3280
+	 */
3281
+	protected function _attendee_contact_list_table()
3282
+	{
3283
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
3284
+		$this->_search_btn_label = esc_html__('Contacts', 'event_espresso');
3285
+		$this->display_admin_list_table_page_with_no_sidebar();
3286
+	}
3287
+
3288
+
3289
+	/**
3290
+	 *        get_attendees
3291
+	 *
3292
+	 * @param      $per_page
3293
+	 * @param bool $count whether to return count or data.
3294
+	 * @param bool $trash
3295
+	 * @return array
3296
+	 * @throws EE_Error
3297
+	 * @throws InvalidArgumentException
3298
+	 * @throws InvalidDataTypeException
3299
+	 * @throws InvalidInterfaceException
3300
+	 * @access public
3301
+	 */
3302
+	public function get_attendees($per_page, $count = false, $trash = false)
3303
+	{
3304
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
3305
+		require_once(REG_ADMIN . 'EE_Attendee_Contact_List_Table.class.php');
3306
+		$ATT_MDL = EEM_Attendee::instance();
3307
+		$this->_req_data['orderby'] = ! empty($this->_req_data['orderby']) ? $this->_req_data['orderby'] : '';
3308
+		switch ($this->_req_data['orderby']) {
3309
+			case 'ATT_ID':
3310
+				$orderby = 'ATT_ID';
3311
+				break;
3312
+			case 'ATT_fname':
3313
+				$orderby = 'ATT_fname';
3314
+				break;
3315
+			case 'ATT_email':
3316
+				$orderby = 'ATT_email';
3317
+				break;
3318
+			case 'ATT_city':
3319
+				$orderby = 'ATT_city';
3320
+				break;
3321
+			case 'STA_ID':
3322
+				$orderby = 'STA_ID';
3323
+				break;
3324
+			case 'CNT_ID':
3325
+				$orderby = 'CNT_ID';
3326
+				break;
3327
+			case 'Registration_Count':
3328
+				$orderby = 'Registration_Count';
3329
+				break;
3330
+			default:
3331
+				$orderby = 'ATT_lname';
3332
+		}
3333
+		$sort = (isset($this->_req_data['order']) && ! empty($this->_req_data['order']))
3334
+			? $this->_req_data['order']
3335
+			: 'ASC';
3336
+		$current_page = isset($this->_req_data['paged']) && ! empty($this->_req_data['paged'])
3337
+			? $this->_req_data['paged']
3338
+			: 1;
3339
+		$per_page = isset($per_page) && ! empty($per_page) ? $per_page : 10;
3340
+		$per_page = isset($this->_req_data['perpage']) && ! empty($this->_req_data['perpage'])
3341
+			? $this->_req_data['perpage']
3342
+			: $per_page;
3343
+		$_where = array();
3344
+		if (! empty($this->_req_data['s'])) {
3345
+			$sstr = '%' . $this->_req_data['s'] . '%';
3346
+			$_where['OR'] = array(
3347
+				'Registration.Event.EVT_name'       => array('LIKE', $sstr),
3348
+				'Registration.Event.EVT_desc'       => array('LIKE', $sstr),
3349
+				'Registration.Event.EVT_short_desc' => array('LIKE', $sstr),
3350
+				'ATT_fname'                         => array('LIKE', $sstr),
3351
+				'ATT_lname'                         => array('LIKE', $sstr),
3352
+				'ATT_short_bio'                     => array('LIKE', $sstr),
3353
+				'ATT_email'                         => array('LIKE', $sstr),
3354
+				'ATT_address'                       => array('LIKE', $sstr),
3355
+				'ATT_address2'                      => array('LIKE', $sstr),
3356
+				'ATT_city'                          => array('LIKE', $sstr),
3357
+				'Country.CNT_name'                  => array('LIKE', $sstr),
3358
+				'State.STA_name'                    => array('LIKE', $sstr),
3359
+				'ATT_phone'                         => array('LIKE', $sstr),
3360
+				'Registration.REG_final_price'      => array('LIKE', $sstr),
3361
+				'Registration.REG_code'             => array('LIKE', $sstr),
3362
+				'Registration.REG_group_size'       => array('LIKE', $sstr),
3363
+			);
3364
+		}
3365
+		$offset = ($current_page - 1) * $per_page;
3366
+		$limit = $count ? null : array($offset, $per_page);
3367
+		$query_args = array(
3368
+			$_where,
3369
+			'extra_selects' => array('Registration_Count' => array('Registration.REG_ID', 'count', '%d')),
3370
+			'limit'         => $limit,
3371
+		);
3372
+		if (! $count) {
3373
+			$query_args['order_by'] = array($orderby => $sort);
3374
+		}
3375
+		if ($trash) {
3376
+			$query_args[0]['status'] = array('!=', 'publish');
3377
+			$all_attendees = $count
3378
+				? $ATT_MDL->count($query_args, 'ATT_ID', true)
3379
+				: $ATT_MDL->get_all($query_args);
3380
+		} else {
3381
+			$query_args[0]['status'] = array('IN', array('publish'));
3382
+			$all_attendees = $count
3383
+				? $ATT_MDL->count($query_args, 'ATT_ID', true)
3384
+				: $ATT_MDL->get_all($query_args);
3385
+		}
3386
+		return $all_attendees;
3387
+	}
3388
+
3389
+
3390
+	/**
3391
+	 * This is just taking care of resending the registration confirmation
3392
+	 *
3393
+	 * @access protected
3394
+	 * @return void
3395
+	 */
3396
+	protected function _resend_registration()
3397
+	{
3398
+		$this->_process_resend_registration();
3399
+		$query_args = isset($this->_req_data['redirect_to'])
3400
+			? array('action' => $this->_req_data['redirect_to'], '_REG_ID' => $this->_req_data['_REG_ID'])
3401
+			: array('action' => 'default');
3402
+		$this->_redirect_after_action(false, '', '', $query_args, true);
3403
+	}
3404
+
3405
+	/**
3406
+	 * Creates a registration report, but accepts the name of a method to use for preparing the query parameters
3407
+	 * to use when selecting registrations
3408
+	 *
3409
+	 * @param string $method_name_for_getting_query_params the name of the method (on this class) to use for preparing
3410
+	 *                                                     the query parameters from the request
3411
+	 * @return void ends the request with a redirect or download
3412
+	 */
3413
+	public function _registrations_report_base($method_name_for_getting_query_params)
3414
+	{
3415
+		if (! defined('EE_USE_OLD_CSV_REPORT_CLASS')) {
3416
+			wp_redirect(
3417
+				EE_Admin_Page::add_query_args_and_nonce(
3418
+					array(
3419
+						'page'        => 'espresso_batch',
3420
+						'batch'       => 'file',
3421
+						'EVT_ID'      => isset($this->_req_data['EVT_ID']) ? $this->_req_data['EVT_ID'] : null,
3422
+						'filters'     => urlencode(
3423
+							serialize(
3424
+								call_user_func(
3425
+									array($this, $method_name_for_getting_query_params),
3426
+									EEH_Array::is_set(
3427
+										$this->_req_data,
3428
+										'filters',
3429
+										array()
3430
+									)
3431
+								)
3432
+							)
3433
+						),
3434
+						'use_filters' => EEH_Array::is_set($this->_req_data, 'use_filters', false),
3435
+						'job_handler' => urlencode('EventEspressoBatchRequest\JobHandlers\RegistrationsReport'),
3436
+						'return_url'  => urlencode($this->_req_data['return_url']),
3437
+					)
3438
+				)
3439
+			);
3440
+		} else {
3441
+			$new_request_args = array(
3442
+				'export' => 'report',
3443
+				'action' => 'registrations_report_for_event',
3444
+				'EVT_ID' => isset($this->_req_data['EVT_ID']) ? $this->_req_data['EVT_ID'] : null,
3445
+			);
3446
+			$this->_req_data = array_merge($this->_req_data, $new_request_args);
3447
+			if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3448
+				require_once(EE_CLASSES . 'EE_Export.class.php');
3449
+				$EE_Export = EE_Export::instance($this->_req_data);
3450
+				$EE_Export->export();
3451
+			}
3452
+		}
3453
+	}
3454
+
3455
+
3456
+	/**
3457
+	 * Creates a registration report using only query parameters in the request
3458
+	 *
3459
+	 * @return void
3460
+	 */
3461
+	public function _registrations_report()
3462
+	{
3463
+		$this->_registrations_report_base('_get_registration_query_parameters');
3464
+	}
3465
+
3466
+
3467
+	public function _contact_list_export()
3468
+	{
3469
+		if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3470
+			require_once(EE_CLASSES . 'EE_Export.class.php');
3471
+			$EE_Export = EE_Export::instance($this->_req_data);
3472
+			$EE_Export->export_attendees();
3473
+		}
3474
+	}
3475
+
3476
+
3477
+	public function _contact_list_report()
3478
+	{
3479
+		if (! defined('EE_USE_OLD_CSV_REPORT_CLASS')) {
3480
+			wp_redirect(
3481
+				EE_Admin_Page::add_query_args_and_nonce(
3482
+					array(
3483
+						'page'        => 'espresso_batch',
3484
+						'batch'       => 'file',
3485
+						'job_handler' => urlencode('EventEspressoBatchRequest\JobHandlers\AttendeesReport'),
3486
+						'return_url'  => urlencode($this->_req_data['return_url']),
3487
+					)
3488
+				)
3489
+			);
3490
+		} else {
3491
+			if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3492
+				require_once(EE_CLASSES . 'EE_Export.class.php');
3493
+				$EE_Export = EE_Export::instance($this->_req_data);
3494
+				$EE_Export->report_attendees();
3495
+			}
3496
+		}
3497
+	}
3498
+
3499
+
3500
+
3501
+
3502
+
3503
+	/***************************************        ATTENDEE DETAILS        ***************************************/
3504
+	/**
3505
+	 * This duplicates the attendee object for the given incoming registration id and attendee_id.
3506
+	 *
3507
+	 * @return void
3508
+	 * @throws EE_Error
3509
+	 * @throws InvalidArgumentException
3510
+	 * @throws InvalidDataTypeException
3511
+	 * @throws InvalidInterfaceException
3512
+	 */
3513
+	protected function _duplicate_attendee()
3514
+	{
3515
+		$action = ! empty($this->_req_data['return']) ? $this->_req_data['return'] : 'default';
3516
+		// verify we have necessary info
3517
+		if (empty($this->_req_data['_REG_ID'])) {
3518
+			EE_Error::add_error(
3519
+				esc_html__(
3520
+					'Unable to create the contact for the registration because the required parameters are not present (_REG_ID )',
3521
+					'event_espresso'
3522
+				),
3523
+				__FILE__,
3524
+				__LINE__,
3525
+				__FUNCTION__
3526
+			);
3527
+			$query_args = array('action' => $action);
3528
+			$this->_redirect_after_action('', '', '', $query_args, true);
3529
+		}
3530
+		// okay necessary deets present... let's dupe the incoming attendee and attach to incoming registration.
3531
+		$registration = EEM_Registration::instance()->get_one_by_ID($this->_req_data['_REG_ID']);
3532
+		$attendee = $registration->attendee();
3533
+		// remove relation of existing attendee on registration
3534
+		$registration->_remove_relation_to($attendee, 'Attendee');
3535
+		// new attendee
3536
+		$new_attendee = clone $attendee;
3537
+		$new_attendee->set('ATT_ID', 0);
3538
+		$new_attendee->save();
3539
+		// add new attendee to reg
3540
+		$registration->_add_relation_to($new_attendee, 'Attendee');
3541
+		EE_Error::add_success(
3542
+			esc_html__(
3543
+				'New Contact record created.  Now make any edits you wish to make for this contact.',
3544
+				'event_espresso'
3545
+			)
3546
+		);
3547
+		// redirect to edit page for attendee
3548
+		$query_args = array('post' => $new_attendee->ID(), 'action' => 'edit_attendee');
3549
+		$this->_redirect_after_action('', '', '', $query_args, true);
3550
+	}
3551
+
3552
+
3553
+	/**
3554
+	 * Callback invoked by parent EE_Admin_CPT class hooked in on `save_post` wp hook.
3555
+	 *
3556
+	 * @param int     $post_id
3557
+	 * @param WP_POST $post
3558
+	 * @throws DomainException
3559
+	 * @throws EE_Error
3560
+	 * @throws InvalidArgumentException
3561
+	 * @throws InvalidDataTypeException
3562
+	 * @throws InvalidInterfaceException
3563
+	 * @throws LogicException
3564
+	 * @throws InvalidFormSubmissionException
3565
+	 */
3566
+	protected function _insert_update_cpt_item($post_id, $post)
3567
+	{
3568
+		$success = true;
3569
+		$attendee = $post instanceof WP_Post && $post->post_type === 'espresso_attendees'
3570
+			? EEM_Attendee::instance()->get_one_by_ID($post_id)
3571
+			: null;
3572
+		// for attendee updates
3573
+		if ($attendee instanceof EE_Attendee) {
3574
+			// note we should only be UPDATING attendees at this point.
3575
+			$updated_fields = array(
3576
+				'ATT_fname'     => $this->_req_data['ATT_fname'],
3577
+				'ATT_lname'     => $this->_req_data['ATT_lname'],
3578
+				'ATT_full_name' => $this->_req_data['ATT_fname'] . ' ' . $this->_req_data['ATT_lname'],
3579
+				'ATT_address'   => isset($this->_req_data['ATT_address']) ? $this->_req_data['ATT_address'] : '',
3580
+				'ATT_address2'  => isset($this->_req_data['ATT_address2']) ? $this->_req_data['ATT_address2'] : '',
3581
+				'ATT_city'      => isset($this->_req_data['ATT_city']) ? $this->_req_data['ATT_city'] : '',
3582
+				'STA_ID'        => isset($this->_req_data['STA_ID']) ? $this->_req_data['STA_ID'] : '',
3583
+				'CNT_ISO'       => isset($this->_req_data['CNT_ISO']) ? $this->_req_data['CNT_ISO'] : '',
3584
+				'ATT_zip'       => isset($this->_req_data['ATT_zip']) ? $this->_req_data['ATT_zip'] : '',
3585
+			);
3586
+			foreach ($updated_fields as $field => $value) {
3587
+				$attendee->set($field, $value);
3588
+			}
3589
+
3590
+			// process contact details metabox form handler (which will also save the attendee)
3591
+			$contact_details_form = $this->getAttendeeContactDetailsMetaboxFormHandler($attendee);
3592
+			$success = $contact_details_form->process($this->_req_data);
3593
+
3594
+			$attendee_update_callbacks = apply_filters(
3595
+				'FHEE__Registrations_Admin_Page__insert_update_cpt_item__attendee_update',
3596
+				array()
3597
+			);
3598
+			foreach ($attendee_update_callbacks as $a_callback) {
3599
+				if (false === call_user_func_array($a_callback, array($attendee, $this->_req_data))) {
3600
+					throw new EE_Error(
3601
+						sprintf(
3602
+							esc_html__(
3603
+								'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.',
3604
+								'event_espresso'
3605
+							),
3606
+							$a_callback
3607
+						)
3608
+					);
3609
+				}
3610
+			}
3611
+		}
3612
+
3613
+		if ($success === false) {
3614
+			EE_Error::add_error(
3615
+				esc_html__(
3616
+					'Something went wrong with updating the meta table data for the registration.',
3617
+					'event_espresso'
3618
+				),
3619
+				__FILE__,
3620
+				__FUNCTION__,
3621
+				__LINE__
3622
+			);
3623
+		}
3624
+	}
3625
+
3626
+
3627
+	public function trash_cpt_item($post_id)
3628
+	{
3629
+	}
3630
+
3631
+
3632
+	public function delete_cpt_item($post_id)
3633
+	{
3634
+	}
3635
+
3636
+
3637
+	public function restore_cpt_item($post_id)
3638
+	{
3639
+	}
3640
+
3641
+
3642
+	protected function _restore_cpt_item($post_id, $revision_id)
3643
+	{
3644
+	}
3645
+
3646
+
3647
+	public function attendee_editor_metaboxes()
3648
+	{
3649
+		$this->verify_cpt_object();
3650
+		remove_meta_box(
3651
+			'postexcerpt',
3652
+			esc_html__('Excerpt', 'event_espresso'),
3653
+			'post_excerpt_meta_box',
3654
+			$this->_cpt_routes[ $this->_req_action ],
3655
+			'normal',
3656
+			'core'
3657
+		);
3658
+		remove_meta_box('commentstatusdiv', $this->_cpt_routes[ $this->_req_action ], 'normal', 'core');
3659
+		if (post_type_supports('espresso_attendees', 'excerpt')) {
3660
+			add_meta_box(
3661
+				'postexcerpt',
3662
+				esc_html__('Short Biography', 'event_espresso'),
3663
+				'post_excerpt_meta_box',
3664
+				$this->_cpt_routes[ $this->_req_action ],
3665
+				'normal'
3666
+			);
3667
+		}
3668
+		if (post_type_supports('espresso_attendees', 'comments')) {
3669
+			add_meta_box(
3670
+				'commentsdiv',
3671
+				esc_html__('Notes on the Contact', 'event_espresso'),
3672
+				'post_comment_meta_box',
3673
+				$this->_cpt_routes[ $this->_req_action ],
3674
+				'normal',
3675
+				'core'
3676
+			);
3677
+		}
3678
+		add_meta_box(
3679
+			'attendee_contact_info',
3680
+			esc_html__('Contact Info', 'event_espresso'),
3681
+			array($this, 'attendee_contact_info'),
3682
+			$this->_cpt_routes[ $this->_req_action ],
3683
+			'side',
3684
+			'core'
3685
+		);
3686
+		add_meta_box(
3687
+			'attendee_details_address',
3688
+			esc_html__('Address Details', 'event_espresso'),
3689
+			array($this, 'attendee_address_details'),
3690
+			$this->_cpt_routes[ $this->_req_action ],
3691
+			'normal',
3692
+			'core'
3693
+		);
3694
+		add_meta_box(
3695
+			'attendee_registrations',
3696
+			esc_html__('Registrations for this Contact', 'event_espresso'),
3697
+			array($this, 'attendee_registrations_meta_box'),
3698
+			$this->_cpt_routes[ $this->_req_action ],
3699
+			'normal',
3700
+			'high'
3701
+		);
3702
+	}
3703
+
3704
+
3705
+	/**
3706
+	 * Metabox for attendee contact info
3707
+	 *
3708
+	 * @param  WP_Post $post wp post object
3709
+	 * @return string attendee contact info ( and form )
3710
+	 * @throws EE_Error
3711
+	 * @throws InvalidArgumentException
3712
+	 * @throws InvalidDataTypeException
3713
+	 * @throws InvalidInterfaceException
3714
+	 * @throws LogicException
3715
+	 * @throws DomainException
3716
+	 */
3717
+	public function attendee_contact_info($post)
3718
+	{
3719
+		// get attendee object ( should already have it )
3720
+		$form = $this->getAttendeeContactDetailsMetaboxFormHandler($this->_cpt_model_obj);
3721
+		$form->enqueueStylesAndScripts();
3722
+		echo $form->display();
3723
+	}
3724
+
3725
+
3726
+	/**
3727
+	 * Return form handler for the contact details metabox
3728
+	 *
3729
+	 * @param EE_Attendee $attendee
3730
+	 * @return AttendeeContactDetailsMetaboxFormHandler
3731
+	 * @throws DomainException
3732
+	 * @throws InvalidArgumentException
3733
+	 * @throws InvalidDataTypeException
3734
+	 * @throws InvalidInterfaceException
3735
+	 */
3736
+	protected function getAttendeeContactDetailsMetaboxFormHandler(EE_Attendee $attendee)
3737
+	{
3738
+		return new AttendeeContactDetailsMetaboxFormHandler($attendee, EE_Registry::instance());
3739
+	}
3740
+
3741
+
3742
+	/**
3743
+	 * Metabox for attendee details
3744
+	 *
3745
+	 * @param  WP_Post $post wp post object
3746
+	 * @throws DomainException
3747
+	 */
3748
+	public function attendee_address_details($post)
3749
+	{
3750
+		// get attendee object (should already have it)
3751
+		$this->_template_args['attendee'] = $this->_cpt_model_obj;
3752
+		$this->_template_args['state_html'] = EEH_Form_Fields::generate_form_input(
3753
+			new EE_Question_Form_Input(
3754
+				EE_Question::new_instance(
3755
+					array(
3756
+						'QST_ID'           => 0,
3757
+						'QST_display_text' => esc_html__('State/Province', 'event_espresso'),
3758
+						'QST_system'       => 'admin-state',
3759
+					)
3760
+				),
3761
+				EE_Answer::new_instance(
3762
+					array(
3763
+						'ANS_ID'    => 0,
3764
+						'ANS_value' => $this->_cpt_model_obj->state_ID(),
3765
+					)
3766
+				),
3767
+				array(
3768
+					'input_id'       => 'STA_ID',
3769
+					'input_name'     => 'STA_ID',
3770
+					'input_prefix'   => '',
3771
+					'append_qstn_id' => false,
3772
+				)
3773
+			)
3774
+		);
3775
+		$this->_template_args['country_html'] = EEH_Form_Fields::generate_form_input(
3776
+			new EE_Question_Form_Input(
3777
+				EE_Question::new_instance(
3778
+					array(
3779
+						'QST_ID'           => 0,
3780
+						'QST_display_text' => esc_html__('Country', 'event_espresso'),
3781
+						'QST_system'       => 'admin-country',
3782
+					)
3783
+				),
3784
+				EE_Answer::new_instance(
3785
+					array(
3786
+						'ANS_ID'    => 0,
3787
+						'ANS_value' => $this->_cpt_model_obj->country_ID(),
3788
+					)
3789
+				),
3790
+				array(
3791
+					'input_id'       => 'CNT_ISO',
3792
+					'input_name'     => 'CNT_ISO',
3793
+					'input_prefix'   => '',
3794
+					'append_qstn_id' => false,
3795
+				)
3796
+			)
3797
+		);
3798
+		$template =
3799
+			REG_TEMPLATE_PATH . 'attendee_address_details_metabox_content.template.php';
3800
+		EEH_Template::display_template($template, $this->_template_args);
3801
+	}
3802
+
3803
+
3804
+	/**
3805
+	 *        _attendee_details
3806
+	 *
3807
+	 * @access protected
3808
+	 * @param $post
3809
+	 * @return void
3810
+	 * @throws DomainException
3811
+	 * @throws EE_Error
3812
+	 */
3813
+	public function attendee_registrations_meta_box($post)
3814
+	{
3815
+		$this->_template_args['attendee'] = $this->_cpt_model_obj;
3816
+		$this->_template_args['registrations'] = $this->_cpt_model_obj->get_many_related('Registration');
3817
+		$template =
3818
+			REG_TEMPLATE_PATH . 'attendee_registrations_main_meta_box.template.php';
3819
+		EEH_Template::display_template($template, $this->_template_args);
3820
+	}
3821
+
3822
+
3823
+	/**
3824
+	 * add in the form fields for the attendee edit
3825
+	 *
3826
+	 * @param  WP_Post $post wp post object
3827
+	 * @return string html for new form.
3828
+	 * @throws DomainException
3829
+	 */
3830
+	public function after_title_form_fields($post)
3831
+	{
3832
+		if ($post->post_type == 'espresso_attendees') {
3833
+			$template = REG_TEMPLATE_PATH . 'attendee_details_after_title_form_fields.template.php';
3834
+			$template_args['attendee'] = $this->_cpt_model_obj;
3835
+			EEH_Template::display_template($template, $template_args);
3836
+		}
3837
+	}
3838
+
3839
+
3840
+	/**
3841
+	 *        _trash_or_restore_attendee
3842
+	 *
3843
+	 * @param boolean $trash - whether to move item to trash (TRUE) or restore it (FALSE)
3844
+	 * @return void
3845
+	 * @throws EE_Error
3846
+	 * @throws InvalidArgumentException
3847
+	 * @throws InvalidDataTypeException
3848
+	 * @throws InvalidInterfaceException
3849
+	 * @access protected
3850
+	 */
3851
+	protected function _trash_or_restore_attendees($trash = true)
3852
+	{
3853
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
3854
+		$ATT_MDL = EEM_Attendee::instance();
3855
+		$success = 1;
3856
+		// Checkboxes
3857
+		if (! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
3858
+			// if array has more than one element than success message should be plural
3859
+			$success = count($this->_req_data['checkbox']) > 1 ? 2 : 1;
3860
+			// cycle thru checkboxes
3861
+			while (list($ATT_ID, $value) = each($this->_req_data['checkbox'])) {
3862
+				$updated = $trash ? $ATT_MDL->update_by_ID(array('status' => 'trash'), $ATT_ID)
3863
+					: $ATT_MDL->update_by_ID(array('status' => 'publish'), $ATT_ID);
3864
+				if (! $updated) {
3865
+					$success = 0;
3866
+				}
3867
+			}
3868
+		} else {
3869
+			// grab single id and delete
3870
+			$ATT_ID = absint($this->_req_data['ATT_ID']);
3871
+			// get attendee
3872
+			$att = $ATT_MDL->get_one_by_ID($ATT_ID);
3873
+			$updated = $trash ? $att->set_status('trash') : $att->set_status('publish');
3874
+			$updated = $att->save();
3875
+			if (! $updated) {
3876
+				$success = 0;
3877
+			}
3878
+		}
3879
+		$what = $success > 1
3880
+			? esc_html__('Contacts', 'event_espresso')
3881
+			: esc_html__('Contact', 'event_espresso');
3882
+		$action_desc = $trash
3883
+			? esc_html__('moved to the trash', 'event_espresso')
3884
+			: esc_html__('restored', 'event_espresso');
3885
+		$this->_redirect_after_action($success, $what, $action_desc, array('action' => 'contact_list'));
3886
+	}
3887 3887
 }
Please login to merge, or discard this patch.
Spacing   +109 added lines, -109 removed lines patch added patch discarded remove patch
@@ -65,7 +65,7 @@  discard block
 block discarded – undo
65 65
         // when adding a new registration...
66 66
         if (isset($this->_req_data['action']) && $this->_req_data['action'] === 'new_registration') {
67 67
             EE_System::do_not_cache();
68
-            if (! isset($this->_req_data['processing_registration'])
68
+            if ( ! isset($this->_req_data['processing_registration'])
69 69
                 || absint($this->_req_data['processing_registration']) !== 1
70 70
             ) {
71 71
                 // and it's NOT the attendee information reg step
@@ -658,7 +658,7 @@  discard block
 block discarded – undo
658 658
         // style
659 659
         wp_register_style(
660 660
             'espresso_reg',
661
-            REG_ASSETS_URL . 'espresso_registrations_admin.css',
661
+            REG_ASSETS_URL.'espresso_registrations_admin.css',
662 662
             array('ee-admin-css'),
663 663
             EVENT_ESPRESSO_VERSION
664 664
         );
@@ -666,7 +666,7 @@  discard block
 block discarded – undo
666 666
         // script
667 667
         wp_register_script(
668 668
             'espresso_reg',
669
-            REG_ASSETS_URL . 'espresso_registrations_admin.js',
669
+            REG_ASSETS_URL.'espresso_registrations_admin.js',
670 670
             array('jquery-ui-datepicker', 'jquery-ui-draggable', 'ee_admin_js'),
671 671
             EVENT_ESPRESSO_VERSION,
672 672
             true
@@ -704,7 +704,7 @@  discard block
 block discarded – undo
704 704
         wp_dequeue_style('espresso_reg');
705 705
         wp_register_style(
706 706
             'espresso_att',
707
-            REG_ASSETS_URL . 'espresso_attendees_admin.css',
707
+            REG_ASSETS_URL.'espresso_attendees_admin.css',
708 708
             array('ee-admin-css'),
709 709
             EVENT_ESPRESSO_VERSION
710 710
         );
@@ -716,7 +716,7 @@  discard block
 block discarded – undo
716 716
     {
717 717
         wp_register_script(
718 718
             'ee-spco-for-admin',
719
-            REG_ASSETS_URL . 'spco_for_admin.js',
719
+            REG_ASSETS_URL.'spco_for_admin.js',
720 720
             array('underscore', 'jquery'),
721 721
             EVENT_ESPRESSO_VERSION,
722 722
             true
@@ -950,7 +950,7 @@  discard block
 block discarded – undo
950 950
         }
951 951
         $sc_items = array(
952 952
             'approved_status'   => array(
953
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_approved,
953
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_approved,
954 954
                 'desc'  => EEH_Template::pretty_status(
955 955
                     EEM_Registration::status_id_approved,
956 956
                     false,
@@ -958,7 +958,7 @@  discard block
 block discarded – undo
958 958
                 ),
959 959
             ),
960 960
             'pending_status'    => array(
961
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_pending_payment,
961
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_pending_payment,
962 962
                 'desc'  => EEH_Template::pretty_status(
963 963
                     EEM_Registration::status_id_pending_payment,
964 964
                     false,
@@ -966,7 +966,7 @@  discard block
 block discarded – undo
966 966
                 ),
967 967
             ),
968 968
             'wait_list'         => array(
969
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_wait_list,
969
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_wait_list,
970 970
                 'desc'  => EEH_Template::pretty_status(
971 971
                     EEM_Registration::status_id_wait_list,
972 972
                     false,
@@ -974,7 +974,7 @@  discard block
 block discarded – undo
974 974
                 ),
975 975
             ),
976 976
             'incomplete_status' => array(
977
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_incomplete,
977
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_incomplete,
978 978
                 'desc'  => EEH_Template::pretty_status(
979 979
                     EEM_Registration::status_id_incomplete,
980 980
                     false,
@@ -982,7 +982,7 @@  discard block
 block discarded – undo
982 982
                 ),
983 983
             ),
984 984
             'not_approved'      => array(
985
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_not_approved,
985
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_not_approved,
986 986
                 'desc'  => EEH_Template::pretty_status(
987 987
                     EEM_Registration::status_id_not_approved,
988 988
                     false,
@@ -990,7 +990,7 @@  discard block
 block discarded – undo
990 990
                 ),
991 991
             ),
992 992
             'declined_status'   => array(
993
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_declined,
993
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_declined,
994 994
                 'desc'  => EEH_Template::pretty_status(
995 995
                     EEM_Registration::status_id_declined,
996 996
                     false,
@@ -998,7 +998,7 @@  discard block
 block discarded – undo
998 998
                 ),
999 999
             ),
1000 1000
             'cancelled_status'  => array(
1001
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_cancelled,
1001
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_cancelled,
1002 1002
                 'desc'  => EEH_Template::pretty_status(
1003 1003
                     EEM_Registration::status_id_cancelled,
1004 1004
                     false,
@@ -1033,13 +1033,13 @@  discard block
 block discarded – undo
1033 1033
                         'event_espresso'
1034 1034
                     ),
1035 1035
                     '<h3 style="line-height:1.5em;">',
1036
-                    '<a href="' . EE_Admin_Page::add_query_args_and_nonce(
1036
+                    '<a href="'.EE_Admin_Page::add_query_args_and_nonce(
1037 1037
                         array(
1038 1038
                             'action' => 'edit_attendee',
1039 1039
                             'post'   => $ATT_ID,
1040 1040
                         ),
1041 1041
                         REG_ADMIN_URL
1042
-                    ) . '">' . $attendee->full_name() . '</a>',
1042
+                    ).'">'.$attendee->full_name().'</a>',
1043 1043
                     '</h3>'
1044 1044
                 );
1045 1045
             }
@@ -1050,7 +1050,7 @@  discard block
 block discarded – undo
1050 1050
                 'espresso_registrations_new_registration',
1051 1051
                 $EVT_ID
1052 1052
             )) {
1053
-                $this->_admin_page_title .= ' ' . $this->get_action_link_or_button(
1053
+                $this->_admin_page_title .= ' '.$this->get_action_link_or_button(
1054 1054
                     'new_registration',
1055 1055
                     'add-registrant',
1056 1056
                     array('event_id' => $EVT_ID),
@@ -1090,7 +1090,7 @@  discard block
 block discarded – undo
1090 1090
                 $this->_template_args['admin_page_header'] .= ' &nbsp;<span class="drk-grey-text">';
1091 1091
                 $this->_template_args['admin_page_header'] .= '<span class="dashicons dashicons-calendar"></span>';
1092 1092
                 $this->_template_args['admin_page_header'] .= $datetime->name();
1093
-                $this->_template_args['admin_page_header'] .= ' ( ' . $datetime->start_date() . ' )';
1093
+                $this->_template_args['admin_page_header'] .= ' ( '.$datetime->start_date().' )';
1094 1094
                 $this->_template_args['admin_page_header'] .= '</span></h3>';
1095 1095
             }
1096 1096
         }
@@ -1116,7 +1116,7 @@  discard block
 block discarded – undo
1116 1116
             return true;
1117 1117
         }
1118 1118
         $REG = EEM_Registration::instance();
1119
-        $REG_ID = (! empty($this->_req_data['_REG_ID'])) ? absint($this->_req_data['_REG_ID']) : false;
1119
+        $REG_ID = ( ! empty($this->_req_data['_REG_ID'])) ? absint($this->_req_data['_REG_ID']) : false;
1120 1120
         if ($this->_registration = $REG->get_one_by_ID($REG_ID)) {
1121 1121
             return true;
1122 1122
         } else {
@@ -1200,7 +1200,7 @@  discard block
 block discarded – undo
1200 1200
             'caps'                     => EEM_Registration::caps_read_admin,
1201 1201
             'default_where_conditions' => 'this_model_only',
1202 1202
         );
1203
-        if (! $count) {
1203
+        if ( ! $count) {
1204 1204
             $query_params = array_merge(
1205 1205
                 $query_params,
1206 1206
                 $this->_get_orderby_for_registrations_query(),
@@ -1221,7 +1221,7 @@  discard block
 block discarded – undo
1221 1221
     protected function addAttendeeIdToWhereConditions(array $request)
1222 1222
     {
1223 1223
         $where = array();
1224
-        if (! empty($request['ATT_ID'])) {
1224
+        if ( ! empty($request['ATT_ID'])) {
1225 1225
             $where['ATT_ID'] = absint($request['ATT_ID']);
1226 1226
         }
1227 1227
         return $where;
@@ -1237,7 +1237,7 @@  discard block
 block discarded – undo
1237 1237
     protected function _add_event_id_to_where_conditions(array $request)
1238 1238
     {
1239 1239
         $where = array();
1240
-        if (! empty($request['event_id'])) {
1240
+        if ( ! empty($request['event_id'])) {
1241 1241
             $where['EVT_ID'] = absint($request['event_id']);
1242 1242
         }
1243 1243
         return $where;
@@ -1253,7 +1253,7 @@  discard block
 block discarded – undo
1253 1253
     protected function _add_category_id_to_where_conditions(array $request)
1254 1254
     {
1255 1255
         $where = array();
1256
-        if (! empty($request['EVT_CAT']) && (int) $request['EVT_CAT'] !== -1) {
1256
+        if ( ! empty($request['EVT_CAT']) && (int) $request['EVT_CAT'] !== -1) {
1257 1257
             $where['Event.Term_Taxonomy.term_id'] = absint($request['EVT_CAT']);
1258 1258
         }
1259 1259
         return $where;
@@ -1269,10 +1269,10 @@  discard block
 block discarded – undo
1269 1269
     protected function _add_datetime_id_to_where_conditions(array $request)
1270 1270
     {
1271 1271
         $where = array();
1272
-        if (! empty($request['datetime_id'])) {
1272
+        if ( ! empty($request['datetime_id'])) {
1273 1273
             $where['Ticket.Datetime.DTT_ID'] = absint($request['datetime_id']);
1274 1274
         }
1275
-        if (! empty($request['DTT_ID'])) {
1275
+        if ( ! empty($request['DTT_ID'])) {
1276 1276
             $where['Ticket.Datetime.DTT_ID'] = absint($request['DTT_ID']);
1277 1277
         }
1278 1278
         return $where;
@@ -1298,7 +1298,7 @@  discard block
 block discarded – undo
1298 1298
          * If not filtering by specified status, then we show all registrations excluding incomplete registrations
1299 1299
          * UNLESS viewing trashed registrations.
1300 1300
          */
1301
-        if (! empty($registration_status)) {
1301
+        if ( ! empty($registration_status)) {
1302 1302
             $where['STS_ID'] = $registration_status;
1303 1303
         } else {
1304 1304
             // make sure we exclude incomplete registrations, but only if not trashed.
@@ -1341,12 +1341,12 @@  discard block
 block discarded – undo
1341 1341
                 array(
1342 1342
                     EEM_Registration::instance()->convert_datetime_for_query(
1343 1343
                         'REG_date',
1344
-                        $now . ' 00:00:00',
1344
+                        $now.' 00:00:00',
1345 1345
                         'Y-m-d H:i:s'
1346 1346
                     ),
1347 1347
                     EEM_Registration::instance()->convert_datetime_for_query(
1348 1348
                         'REG_date',
1349
-                        $now . ' 23:59:59',
1349
+                        $now.' 23:59:59',
1350 1350
                         'Y-m-d H:i:s'
1351 1351
                     ),
1352 1352
                 ),
@@ -1359,12 +1359,12 @@  discard block
 block discarded – undo
1359 1359
                 array(
1360 1360
                     EEM_Registration::instance()->convert_datetime_for_query(
1361 1361
                         'REG_date',
1362
-                        $current_year_and_month . '-01 00:00:00',
1362
+                        $current_year_and_month.'-01 00:00:00',
1363 1363
                         'Y-m-d H:i:s'
1364 1364
                     ),
1365 1365
                     EEM_Registration::instance()->convert_datetime_for_query(
1366 1366
                         'REG_date',
1367
-                        $current_year_and_month . '-' . $days_this_month . ' 23:59:59',
1367
+                        $current_year_and_month.'-'.$days_this_month.' 23:59:59',
1368 1368
                         'Y-m-d H:i:s'
1369 1369
                     ),
1370 1370
                 ),
@@ -1379,18 +1379,18 @@  discard block
 block discarded – undo
1379 1379
                 : '';
1380 1380
             // if there is not a month or year then we can't go further
1381 1381
             if ($month_requested && $year_requested) {
1382
-                $days_in_month = date('t', strtotime($year_requested . '-' . $month_requested . '-' . '01'));
1382
+                $days_in_month = date('t', strtotime($year_requested.'-'.$month_requested.'-'.'01'));
1383 1383
                 $where['REG_date'] = array(
1384 1384
                     'BETWEEN',
1385 1385
                     array(
1386 1386
                         EEM_Registration::instance()->convert_datetime_for_query(
1387 1387
                             'REG_date',
1388
-                            $year_requested . '-' . $month_requested . '-01 00:00:00',
1388
+                            $year_requested.'-'.$month_requested.'-01 00:00:00',
1389 1389
                             'Y-m-d H:i:s'
1390 1390
                         ),
1391 1391
                         EEM_Registration::instance()->convert_datetime_for_query(
1392 1392
                             'REG_date',
1393
-                            $year_requested . '-' . $month_requested . '-' . $days_in_month . ' 23:59:59',
1393
+                            $year_requested.'-'.$month_requested.'-'.$days_in_month.' 23:59:59',
1394 1394
                             'Y-m-d H:i:s'
1395 1395
                         ),
1396 1396
                     ),
@@ -1410,8 +1410,8 @@  discard block
 block discarded – undo
1410 1410
     protected function _add_search_to_where_conditions(array $request)
1411 1411
     {
1412 1412
         $where = array();
1413
-        if (! empty($request['s'])) {
1414
-            $search_string = '%' . sanitize_text_field($request['s']) . '%';
1413
+        if ( ! empty($request['s'])) {
1414
+            $search_string = '%'.sanitize_text_field($request['s']).'%';
1415 1415
             $where['OR*search_conditions'] = array(
1416 1416
                 'Event.EVT_name'                          => array('LIKE', $search_string),
1417 1417
                 'Event.EVT_desc'                          => array('LIKE', $search_string),
@@ -1647,7 +1647,7 @@  discard block
 block discarded – undo
1647 1647
                 )
1648 1648
                 : '';
1649 1649
             // grab header
1650
-            $template_path = REG_TEMPLATE_PATH . 'reg_admin_details_header.template.php';
1650
+            $template_path = REG_TEMPLATE_PATH.'reg_admin_details_header.template.php';
1651 1651
             $this->_template_args['REG_ID'] = $this->_registration->ID();
1652 1652
             $this->_template_args['admin_page_header'] = EEH_Template::display_template(
1653 1653
                 $template_path,
@@ -1785,7 +1785,7 @@  discard block
 block discarded – undo
1785 1785
                                 EEH_HTML::strong(
1786 1786
                                     $this->_registration->pretty_status(),
1787 1787
                                     '',
1788
-                                    'status-' . $this->_registration->status_ID(),
1788
+                                    'status-'.$this->_registration->status_ID(),
1789 1789
                                     'line-height: 1em; font-size: 1.5em; font-weight: bold;'
1790 1790
                                 )
1791 1791
                             )
@@ -1841,14 +1841,14 @@  discard block
 block discarded – undo
1841 1841
     protected function _get_reg_statuses()
1842 1842
     {
1843 1843
         $reg_status_array = EEM_Registration::instance()->reg_status_array();
1844
-        unset($reg_status_array[ EEM_Registration::status_id_incomplete ]);
1844
+        unset($reg_status_array[EEM_Registration::status_id_incomplete]);
1845 1845
         // get current reg status
1846 1846
         $current_status = $this->_registration->status_ID();
1847 1847
         // is registration for free event? This will determine whether to display the pending payment option
1848 1848
         if ($current_status !== EEM_Registration::status_id_pending_payment
1849 1849
             && EEH_Money::compare_floats($this->_registration->ticket()->price(), 0.00)
1850 1850
         ) {
1851
-            unset($reg_status_array[ EEM_Registration::status_id_pending_payment ]);
1851
+            unset($reg_status_array[EEM_Registration::status_id_pending_payment]);
1852 1852
         }
1853 1853
         return EEM_Status::instance()->localized_status($reg_status_array, false, 'sentence');
1854 1854
     }
@@ -1940,7 +1940,7 @@  discard block
 block discarded – undo
1940 1940
         $success = false;
1941 1941
         // typecast $REG_IDs
1942 1942
         $REG_IDs = (array) $REG_IDs;
1943
-        if (! empty($REG_IDs)) {
1943
+        if ( ! empty($REG_IDs)) {
1944 1944
             $success = true;
1945 1945
             // set default status if none is passed
1946 1946
             $status = $status ? $status : EEM_Registration::status_id_pending_payment;
@@ -2088,7 +2088,7 @@  discard block
 block discarded – undo
2088 2088
             $action,
2089 2089
             $notify
2090 2090
         );
2091
-        $method = $action . '_registration';
2091
+        $method = $action.'_registration';
2092 2092
         if (method_exists($this, $method)) {
2093 2093
             $this->$method($notify);
2094 2094
         }
@@ -2319,7 +2319,7 @@  discard block
 block discarded – undo
2319 2319
         $this->_template_args['REG_ID'] = $this->_registration->ID();
2320 2320
         $this->_template_args['event_id'] = $this->_registration->event_ID();
2321 2321
         $template_path =
2322
-            REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_reg_details.template.php';
2322
+            REG_TEMPLATE_PATH.'reg_admin_details_main_meta_box_reg_details.template.php';
2323 2323
         echo EEH_Template::display_template($template_path, $this->_template_args, true);
2324 2324
     }
2325 2325
 
@@ -2352,7 +2352,7 @@  discard block
 block discarded – undo
2352 2352
             $this->_template_args['reg_questions_form_action'] = 'edit_registration';
2353 2353
             $this->_template_args['REG_ID'] = $this->_registration->ID();
2354 2354
             $template_path =
2355
-                REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_reg_questions.template.php';
2355
+                REG_TEMPLATE_PATH.'reg_admin_details_main_meta_box_reg_questions.template.php';
2356 2356
             echo EEH_Template::display_template($template_path, $this->_template_args, true);
2357 2357
         }
2358 2358
     }
@@ -2369,7 +2369,7 @@  discard block
 block discarded – undo
2369 2369
     public function form_before_question_group($output)
2370 2370
     {
2371 2371
         EE_Error::doing_it_wrong(
2372
-            __CLASS__ . '::' . __FUNCTION__,
2372
+            __CLASS__.'::'.__FUNCTION__,
2373 2373
             esc_html__(
2374 2374
                 '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.',
2375 2375
                 'event_espresso'
@@ -2394,7 +2394,7 @@  discard block
 block discarded – undo
2394 2394
     public function form_after_question_group($output)
2395 2395
     {
2396 2396
         EE_Error::doing_it_wrong(
2397
-            __CLASS__ . '::' . __FUNCTION__,
2397
+            __CLASS__.'::'.__FUNCTION__,
2398 2398
             esc_html__(
2399 2399
                 '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.',
2400 2400
                 'event_espresso'
@@ -2432,7 +2432,7 @@  discard block
 block discarded – undo
2432 2432
     public function form_form_field_label_wrap($label)
2433 2433
     {
2434 2434
         EE_Error::doing_it_wrong(
2435
-            __CLASS__ . '::' . __FUNCTION__,
2435
+            __CLASS__.'::'.__FUNCTION__,
2436 2436
             esc_html__(
2437 2437
                 '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.',
2438 2438
                 'event_espresso'
@@ -2442,7 +2442,7 @@  discard block
 block discarded – undo
2442 2442
         return '
2443 2443
 			<tr>
2444 2444
 				<th>
2445
-					' . $label . '
2445
+					' . $label.'
2446 2446
 				</th>';
2447 2447
     }
2448 2448
 
@@ -2458,7 +2458,7 @@  discard block
 block discarded – undo
2458 2458
     public function form_form_field_input__wrap($input)
2459 2459
     {
2460 2460
         EE_Error::doing_it_wrong(
2461
-            __CLASS__ . '::' . __FUNCTION__,
2461
+            __CLASS__.'::'.__FUNCTION__,
2462 2462
             esc_html__(
2463 2463
                 '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.',
2464 2464
                 'event_espresso'
@@ -2467,7 +2467,7 @@  discard block
 block discarded – undo
2467 2467
         );
2468 2468
         return '
2469 2469
 				<td class="reg-admin-attendee-questions-input-td disabled-input">
2470
-					' . $input . '
2470
+					' . $input.'
2471 2471
 				</td>
2472 2472
 			</tr>';
2473 2473
     }
@@ -2511,8 +2511,8 @@  discard block
 block discarded – undo
2511 2511
      */
2512 2512
     protected function _get_reg_custom_questions_form($REG_ID)
2513 2513
     {
2514
-        if (! $this->_reg_custom_questions_form) {
2515
-            require_once(REG_ADMIN . 'form_sections' . DS . 'EE_Registration_Custom_Questions_Form.form.php');
2514
+        if ( ! $this->_reg_custom_questions_form) {
2515
+            require_once(REG_ADMIN.'form_sections'.DS.'EE_Registration_Custom_Questions_Form.form.php');
2516 2516
             $this->_reg_custom_questions_form = new EE_Registration_Custom_Questions_Form(
2517 2517
                 EEM_Registration::instance()->get_one_by_ID($REG_ID)
2518 2518
             );
@@ -2535,7 +2535,7 @@  discard block
 block discarded – undo
2535 2535
      */
2536 2536
     private function _save_reg_custom_questions_form($REG_ID = false)
2537 2537
     {
2538
-        if (! $REG_ID) {
2538
+        if ( ! $REG_ID) {
2539 2539
             EE_Error::add_error(
2540 2540
                 esc_html__(
2541 2541
                     'An error occurred. No registration ID was received.',
@@ -2627,30 +2627,30 @@  discard block
 block discarded – undo
2627 2627
                     ? $registration->attendee()
2628 2628
                     : EEM_Attendee::instance()
2629 2629
                                   ->create_default_object();
2630
-                $this->_template_args['attendees'][ $att_nmbr ]['STS_ID'] = $registration->status_ID();
2631
-                $this->_template_args['attendees'][ $att_nmbr ]['fname'] = $attendee->fname();
2632
-                $this->_template_args['attendees'][ $att_nmbr ]['lname'] = $attendee->lname();
2633
-                $this->_template_args['attendees'][ $att_nmbr ]['email'] = $attendee->email();
2634
-                $this->_template_args['attendees'][ $att_nmbr ]['final_price'] = $registration->final_price();
2635
-                $this->_template_args['attendees'][ $att_nmbr ]['address'] = implode(
2630
+                $this->_template_args['attendees'][$att_nmbr]['STS_ID'] = $registration->status_ID();
2631
+                $this->_template_args['attendees'][$att_nmbr]['fname'] = $attendee->fname();
2632
+                $this->_template_args['attendees'][$att_nmbr]['lname'] = $attendee->lname();
2633
+                $this->_template_args['attendees'][$att_nmbr]['email'] = $attendee->email();
2634
+                $this->_template_args['attendees'][$att_nmbr]['final_price'] = $registration->final_price();
2635
+                $this->_template_args['attendees'][$att_nmbr]['address'] = implode(
2636 2636
                     ', ',
2637 2637
                     $attendee->full_address_as_array()
2638 2638
                 );
2639
-                $this->_template_args['attendees'][ $att_nmbr ]['att_link'] = self::add_query_args_and_nonce(
2639
+                $this->_template_args['attendees'][$att_nmbr]['att_link'] = self::add_query_args_and_nonce(
2640 2640
                     array(
2641 2641
                         'action' => 'edit_attendee',
2642 2642
                         'post'   => $attendee->ID(),
2643 2643
                     ),
2644 2644
                     REG_ADMIN_URL
2645 2645
                 );
2646
-                $this->_template_args['attendees'][ $att_nmbr ]['event_name'] = $registration->event_obj() instanceof EE_Event
2646
+                $this->_template_args['attendees'][$att_nmbr]['event_name'] = $registration->event_obj() instanceof EE_Event
2647 2647
                     ? $registration->event_obj()->name()
2648 2648
                     : '';
2649 2649
                 $att_nmbr++;
2650 2650
             }
2651 2651
             $this->_template_args['currency_sign'] = EE_Registry::instance()->CFG->currency->sign;
2652 2652
         }
2653
-        $template_path = REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_attendees.template.php';
2653
+        $template_path = REG_TEMPLATE_PATH.'reg_admin_details_main_meta_box_attendees.template.php';
2654 2654
         echo EEH_Template::display_template($template_path, $this->_template_args, true);
2655 2655
     }
2656 2656
 
@@ -2674,11 +2674,11 @@  discard block
 block discarded – undo
2674 2674
         // now let's determine if this is not the primary registration.  If it isn't then we set the
2675 2675
         // primary_registration object for reference BUT ONLY if the Attendee object loaded is not the same as the
2676 2676
         // primary registration object (that way we know if we need to show create button or not)
2677
-        if (! $this->_registration->is_primary_registrant()) {
2677
+        if ( ! $this->_registration->is_primary_registrant()) {
2678 2678
             $primary_registration = $this->_registration->get_primary_registration();
2679 2679
             $primary_attendee = $primary_registration instanceof EE_Registration ? $primary_registration->attendee()
2680 2680
                 : null;
2681
-            if (! $primary_attendee instanceof EE_Attendee || $attendee->ID() !== $primary_attendee->ID()) {
2681
+            if ( ! $primary_attendee instanceof EE_Attendee || $attendee->ID() !== $primary_attendee->ID()) {
2682 2682
                 // in here?  This means the displayed registration is not the primary registrant but ALREADY HAS its own
2683 2683
                 // custom attendee object so let's not worry about the primary reg.
2684 2684
                 $primary_registration = null;
@@ -2712,7 +2712,7 @@  discard block
 block discarded – undo
2712 2712
             ) : '';
2713 2713
         $this->_template_args['create_label'] = esc_html__('Create Contact', 'event_espresso');
2714 2714
         $this->_template_args['att_check'] = $att_check;
2715
-        $template_path = REG_TEMPLATE_PATH . 'reg_admin_details_side_meta_box_registrant.template.php';
2715
+        $template_path = REG_TEMPLATE_PATH.'reg_admin_details_side_meta_box_registrant.template.php';
2716 2716
         echo EEH_Template::display_template($template_path, $this->_template_args, true);
2717 2717
     }
2718 2718
 
@@ -2750,7 +2750,7 @@  discard block
 block discarded – undo
2750 2750
         $success = 0;
2751 2751
         $overwrite_msgs = false;
2752 2752
         // Checkboxes
2753
-        if (! is_array($this->_req_data['_REG_ID'])) {
2753
+        if ( ! is_array($this->_req_data['_REG_ID'])) {
2754 2754
             $this->_req_data['_REG_ID'] = array($this->_req_data['_REG_ID']);
2755 2755
         }
2756 2756
         $reg_count = count($this->_req_data['_REG_ID']);
@@ -2759,7 +2759,7 @@  discard block
 block discarded – undo
2759 2759
             /** @var EE_Registration $REG */
2760 2760
             $REG = EEM_Registration::instance()->get_one_by_ID($REG_ID);
2761 2761
             $payments = $REG->registration_payments();
2762
-            if (! empty($payments)) {
2762
+            if ( ! empty($payments)) {
2763 2763
                 $name = $REG->attendee() instanceof EE_Attendee
2764 2764
                     ? $REG->attendee()->full_name()
2765 2765
                     : esc_html__('Unknown Attendee', 'event_espresso');
@@ -2820,17 +2820,17 @@  discard block
 block discarded – undo
2820 2820
         $REG_MDL = EEM_Registration::instance();
2821 2821
         $success = 1;
2822 2822
         // Checkboxes
2823
-        if (! empty($this->_req_data['_REG_ID']) && is_array($this->_req_data['_REG_ID'])) {
2823
+        if ( ! empty($this->_req_data['_REG_ID']) && is_array($this->_req_data['_REG_ID'])) {
2824 2824
             // if array has more than one element than success message should be plural
2825 2825
             $success = count($this->_req_data['_REG_ID']) > 1 ? 2 : 1;
2826 2826
             // cycle thru checkboxes
2827 2827
             while (list($ind, $REG_ID) = each($this->_req_data['_REG_ID'])) {
2828 2828
                 $REG = $REG_MDL->get_one_by_ID($REG_ID);
2829
-                if (! $REG instanceof EE_Registration) {
2829
+                if ( ! $REG instanceof EE_Registration) {
2830 2830
                     continue;
2831 2831
                 }
2832 2832
                 $deleted = $this->_delete_registration($REG);
2833
-                if (! $deleted) {
2833
+                if ( ! $deleted) {
2834 2834
                     $success = 0;
2835 2835
                 }
2836 2836
             }
@@ -2839,7 +2839,7 @@  discard block
 block discarded – undo
2839 2839
             $REG_ID = $this->_req_data['_REG_ID'];
2840 2840
             $REG = $REG_MDL->get_one_by_ID($REG_ID);
2841 2841
             $deleted = $this->_delete_registration($REG);
2842
-            if (! $deleted) {
2842
+            if ( ! $deleted) {
2843 2843
                 $success = 0;
2844 2844
             }
2845 2845
         }
@@ -2873,11 +2873,11 @@  discard block
 block discarded – undo
2873 2873
         $REGS = $TXN->get_many_related('Registration');
2874 2874
         $all_trashed = true;
2875 2875
         foreach ($REGS as $registration) {
2876
-            if (! $registration->get('REG_deleted')) {
2876
+            if ( ! $registration->get('REG_deleted')) {
2877 2877
                 $all_trashed = false;
2878 2878
             }
2879 2879
         }
2880
-        if (! $all_trashed) {
2880
+        if ( ! $all_trashed) {
2881 2881
             EE_Error::add_error(
2882 2882
                 esc_html__(
2883 2883
                     '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.',
@@ -2936,7 +2936,7 @@  discard block
 block discarded – undo
2936 2936
      */
2937 2937
     public function new_registration()
2938 2938
     {
2939
-        if (! $this->_set_reg_event()) {
2939
+        if ( ! $this->_set_reg_event()) {
2940 2940
             throw new EE_Error(
2941 2941
                 esc_html__(
2942 2942
                     'Unable to continue with registering because there is no Event ID in the request',
@@ -2946,8 +2946,8 @@  discard block
 block discarded – undo
2946 2946
         }
2947 2947
         EE_Registry::instance()->REQ->set_espresso_page(true);
2948 2948
         // gotta start with a clean slate if we're not coming here via ajax
2949
-        if (! defined('DOING_AJAX')
2950
-            && (! isset($this->_req_data['processing_registration']) || isset($this->_req_data['step_error']))
2949
+        if ( ! defined('DOING_AJAX')
2950
+            && ( ! isset($this->_req_data['processing_registration']) || isset($this->_req_data['step_error']))
2951 2951
         ) {
2952 2952
             EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
2953 2953
         }
@@ -2980,7 +2980,7 @@  discard block
 block discarded – undo
2980 2980
         }
2981 2981
         // grab header
2982 2982
         $template_path =
2983
-            REG_TEMPLATE_PATH . 'reg_admin_register_new_attendee.template.php';
2983
+            REG_TEMPLATE_PATH.'reg_admin_register_new_attendee.template.php';
2984 2984
         $this->_template_args['admin_page_content'] = EEH_Template::display_template(
2985 2985
             $template_path,
2986 2986
             $this->_template_args,
@@ -3021,7 +3021,7 @@  discard block
 block discarded – undo
3021 3021
                 '</b>'
3022 3022
             );
3023 3023
             return '
3024
-	<div id="ee-add-reg-back-button-dv"><p>' . $warning_msg . '</p></div>
3024
+	<div id="ee-add-reg-back-button-dv"><p>' . $warning_msg.'</p></div>
3025 3025
 	<script >
3026 3026
 		// WHOAH !!! it appears that someone is using the back button from the Transaction admin page
3027 3027
 		// after just adding a new registration... we gotta try to put a stop to that !!!
@@ -3089,7 +3089,7 @@  discard block
 block discarded – undo
3089 3089
         // we come back to the process_registration_step route.
3090 3090
         $this->_set_add_edit_form_tags('process_reg_step', $hidden_fields);
3091 3091
         return EEH_Template::display_template(
3092
-            REG_TEMPLATE_PATH . 'reg_admin_register_new_attendee_step_content.template.php',
3092
+            REG_TEMPLATE_PATH.'reg_admin_register_new_attendee_step_content.template.php',
3093 3093
             $template_args,
3094 3094
             true
3095 3095
         );
@@ -3111,8 +3111,8 @@  discard block
 block discarded – undo
3111 3111
         if (is_object($this->_reg_event)) {
3112 3112
             return true;
3113 3113
         }
3114
-        $EVT_ID = (! empty($this->_req_data['event_id'])) ? absint($this->_req_data['event_id']) : false;
3115
-        if (! $EVT_ID) {
3114
+        $EVT_ID = ( ! empty($this->_req_data['event_id'])) ? absint($this->_req_data['event_id']) : false;
3115
+        if ( ! $EVT_ID) {
3116 3116
             return false;
3117 3117
         }
3118 3118
         $this->_reg_event = EEM_Event::instance()->get_one_by_ID($EVT_ID);
@@ -3144,8 +3144,8 @@  discard block
 block discarded – undo
3144 3144
         $step = ! $cart instanceof EE_Cart ? 'ticket' : 'questions';
3145 3145
         // if doing ajax then we need to verify the nonce
3146 3146
         if (defined('DOING_AJAX')) {
3147
-            $nonce = isset($this->_req_data[ $this->_req_nonce ])
3148
-                ? sanitize_text_field($this->_req_data[ $this->_req_nonce ]) : '';
3147
+            $nonce = isset($this->_req_data[$this->_req_nonce])
3148
+                ? sanitize_text_field($this->_req_data[$this->_req_nonce]) : '';
3149 3149
             $this->_verify_nonce($nonce, $this->_req_nonce);
3150 3150
         }
3151 3151
         switch ($step) {
@@ -3181,7 +3181,7 @@  discard block
 block discarded – undo
3181 3181
                 }
3182 3182
                 break;
3183 3183
             case 'questions':
3184
-                if (! isset(
3184
+                if ( ! isset(
3185 3185
                     $this->_req_data['txn_reg_status_change'],
3186 3186
                     $this->_req_data['txn_reg_status_change']['send_notifications']
3187 3187
                 )
@@ -3196,7 +3196,7 @@  discard block
 block discarded – undo
3196 3196
                         $grand_total->save_this_and_descendants_to_txn();
3197 3197
                     }
3198 3198
                 }
3199
-                if (! $transaction instanceof EE_Transaction) {
3199
+                if ( ! $transaction instanceof EE_Transaction) {
3200 3200
                     $query_args = array(
3201 3201
                         'action'                  => 'new_registration',
3202 3202
                         'processing_registration' => 2,
@@ -3219,7 +3219,7 @@  discard block
 block discarded – undo
3219 3219
                     }
3220 3220
                 }
3221 3221
                 // maybe update status, and make sure to save transaction if not done already
3222
-                if (! $transaction->update_status_based_on_total_paid()) {
3222
+                if ( ! $transaction->update_status_based_on_total_paid()) {
3223 3223
                     $transaction->save();
3224 3224
                 }
3225 3225
                 EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
@@ -3302,7 +3302,7 @@  discard block
 block discarded – undo
3302 3302
     public function get_attendees($per_page, $count = false, $trash = false)
3303 3303
     {
3304 3304
         do_action('AHEE_log', __FILE__, __FUNCTION__, '');
3305
-        require_once(REG_ADMIN . 'EE_Attendee_Contact_List_Table.class.php');
3305
+        require_once(REG_ADMIN.'EE_Attendee_Contact_List_Table.class.php');
3306 3306
         $ATT_MDL = EEM_Attendee::instance();
3307 3307
         $this->_req_data['orderby'] = ! empty($this->_req_data['orderby']) ? $this->_req_data['orderby'] : '';
3308 3308
         switch ($this->_req_data['orderby']) {
@@ -3341,8 +3341,8 @@  discard block
 block discarded – undo
3341 3341
             ? $this->_req_data['perpage']
3342 3342
             : $per_page;
3343 3343
         $_where = array();
3344
-        if (! empty($this->_req_data['s'])) {
3345
-            $sstr = '%' . $this->_req_data['s'] . '%';
3344
+        if ( ! empty($this->_req_data['s'])) {
3345
+            $sstr = '%'.$this->_req_data['s'].'%';
3346 3346
             $_where['OR'] = array(
3347 3347
                 'Registration.Event.EVT_name'       => array('LIKE', $sstr),
3348 3348
                 'Registration.Event.EVT_desc'       => array('LIKE', $sstr),
@@ -3369,7 +3369,7 @@  discard block
 block discarded – undo
3369 3369
             'extra_selects' => array('Registration_Count' => array('Registration.REG_ID', 'count', '%d')),
3370 3370
             'limit'         => $limit,
3371 3371
         );
3372
-        if (! $count) {
3372
+        if ( ! $count) {
3373 3373
             $query_args['order_by'] = array($orderby => $sort);
3374 3374
         }
3375 3375
         if ($trash) {
@@ -3412,7 +3412,7 @@  discard block
 block discarded – undo
3412 3412
      */
3413 3413
     public function _registrations_report_base($method_name_for_getting_query_params)
3414 3414
     {
3415
-        if (! defined('EE_USE_OLD_CSV_REPORT_CLASS')) {
3415
+        if ( ! defined('EE_USE_OLD_CSV_REPORT_CLASS')) {
3416 3416
             wp_redirect(
3417 3417
                 EE_Admin_Page::add_query_args_and_nonce(
3418 3418
                     array(
@@ -3444,8 +3444,8 @@  discard block
 block discarded – undo
3444 3444
                 'EVT_ID' => isset($this->_req_data['EVT_ID']) ? $this->_req_data['EVT_ID'] : null,
3445 3445
             );
3446 3446
             $this->_req_data = array_merge($this->_req_data, $new_request_args);
3447
-            if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3448
-                require_once(EE_CLASSES . 'EE_Export.class.php');
3447
+            if (is_readable(EE_CLASSES.'EE_Export.class.php')) {
3448
+                require_once(EE_CLASSES.'EE_Export.class.php');
3449 3449
                 $EE_Export = EE_Export::instance($this->_req_data);
3450 3450
                 $EE_Export->export();
3451 3451
             }
@@ -3466,8 +3466,8 @@  discard block
 block discarded – undo
3466 3466
 
3467 3467
     public function _contact_list_export()
3468 3468
     {
3469
-        if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3470
-            require_once(EE_CLASSES . 'EE_Export.class.php');
3469
+        if (is_readable(EE_CLASSES.'EE_Export.class.php')) {
3470
+            require_once(EE_CLASSES.'EE_Export.class.php');
3471 3471
             $EE_Export = EE_Export::instance($this->_req_data);
3472 3472
             $EE_Export->export_attendees();
3473 3473
         }
@@ -3476,7 +3476,7 @@  discard block
 block discarded – undo
3476 3476
 
3477 3477
     public function _contact_list_report()
3478 3478
     {
3479
-        if (! defined('EE_USE_OLD_CSV_REPORT_CLASS')) {
3479
+        if ( ! defined('EE_USE_OLD_CSV_REPORT_CLASS')) {
3480 3480
             wp_redirect(
3481 3481
                 EE_Admin_Page::add_query_args_and_nonce(
3482 3482
                     array(
@@ -3488,8 +3488,8 @@  discard block
 block discarded – undo
3488 3488
                 )
3489 3489
             );
3490 3490
         } else {
3491
-            if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3492
-                require_once(EE_CLASSES . 'EE_Export.class.php');
3491
+            if (is_readable(EE_CLASSES.'EE_Export.class.php')) {
3492
+                require_once(EE_CLASSES.'EE_Export.class.php');
3493 3493
                 $EE_Export = EE_Export::instance($this->_req_data);
3494 3494
                 $EE_Export->report_attendees();
3495 3495
             }
@@ -3575,7 +3575,7 @@  discard block
 block discarded – undo
3575 3575
             $updated_fields = array(
3576 3576
                 'ATT_fname'     => $this->_req_data['ATT_fname'],
3577 3577
                 'ATT_lname'     => $this->_req_data['ATT_lname'],
3578
-                'ATT_full_name' => $this->_req_data['ATT_fname'] . ' ' . $this->_req_data['ATT_lname'],
3578
+                'ATT_full_name' => $this->_req_data['ATT_fname'].' '.$this->_req_data['ATT_lname'],
3579 3579
                 'ATT_address'   => isset($this->_req_data['ATT_address']) ? $this->_req_data['ATT_address'] : '',
3580 3580
                 'ATT_address2'  => isset($this->_req_data['ATT_address2']) ? $this->_req_data['ATT_address2'] : '',
3581 3581
                 'ATT_city'      => isset($this->_req_data['ATT_city']) ? $this->_req_data['ATT_city'] : '',
@@ -3651,17 +3651,17 @@  discard block
 block discarded – undo
3651 3651
             'postexcerpt',
3652 3652
             esc_html__('Excerpt', 'event_espresso'),
3653 3653
             'post_excerpt_meta_box',
3654
-            $this->_cpt_routes[ $this->_req_action ],
3654
+            $this->_cpt_routes[$this->_req_action],
3655 3655
             'normal',
3656 3656
             'core'
3657 3657
         );
3658
-        remove_meta_box('commentstatusdiv', $this->_cpt_routes[ $this->_req_action ], 'normal', 'core');
3658
+        remove_meta_box('commentstatusdiv', $this->_cpt_routes[$this->_req_action], 'normal', 'core');
3659 3659
         if (post_type_supports('espresso_attendees', 'excerpt')) {
3660 3660
             add_meta_box(
3661 3661
                 'postexcerpt',
3662 3662
                 esc_html__('Short Biography', 'event_espresso'),
3663 3663
                 'post_excerpt_meta_box',
3664
-                $this->_cpt_routes[ $this->_req_action ],
3664
+                $this->_cpt_routes[$this->_req_action],
3665 3665
                 'normal'
3666 3666
             );
3667 3667
         }
@@ -3670,7 +3670,7 @@  discard block
 block discarded – undo
3670 3670
                 'commentsdiv',
3671 3671
                 esc_html__('Notes on the Contact', 'event_espresso'),
3672 3672
                 'post_comment_meta_box',
3673
-                $this->_cpt_routes[ $this->_req_action ],
3673
+                $this->_cpt_routes[$this->_req_action],
3674 3674
                 'normal',
3675 3675
                 'core'
3676 3676
             );
@@ -3679,7 +3679,7 @@  discard block
 block discarded – undo
3679 3679
             'attendee_contact_info',
3680 3680
             esc_html__('Contact Info', 'event_espresso'),
3681 3681
             array($this, 'attendee_contact_info'),
3682
-            $this->_cpt_routes[ $this->_req_action ],
3682
+            $this->_cpt_routes[$this->_req_action],
3683 3683
             'side',
3684 3684
             'core'
3685 3685
         );
@@ -3687,7 +3687,7 @@  discard block
 block discarded – undo
3687 3687
             'attendee_details_address',
3688 3688
             esc_html__('Address Details', 'event_espresso'),
3689 3689
             array($this, 'attendee_address_details'),
3690
-            $this->_cpt_routes[ $this->_req_action ],
3690
+            $this->_cpt_routes[$this->_req_action],
3691 3691
             'normal',
3692 3692
             'core'
3693 3693
         );
@@ -3695,7 +3695,7 @@  discard block
 block discarded – undo
3695 3695
             'attendee_registrations',
3696 3696
             esc_html__('Registrations for this Contact', 'event_espresso'),
3697 3697
             array($this, 'attendee_registrations_meta_box'),
3698
-            $this->_cpt_routes[ $this->_req_action ],
3698
+            $this->_cpt_routes[$this->_req_action],
3699 3699
             'normal',
3700 3700
             'high'
3701 3701
         );
@@ -3796,7 +3796,7 @@  discard block
 block discarded – undo
3796 3796
             )
3797 3797
         );
3798 3798
         $template =
3799
-            REG_TEMPLATE_PATH . 'attendee_address_details_metabox_content.template.php';
3799
+            REG_TEMPLATE_PATH.'attendee_address_details_metabox_content.template.php';
3800 3800
         EEH_Template::display_template($template, $this->_template_args);
3801 3801
     }
3802 3802
 
@@ -3815,7 +3815,7 @@  discard block
 block discarded – undo
3815 3815
         $this->_template_args['attendee'] = $this->_cpt_model_obj;
3816 3816
         $this->_template_args['registrations'] = $this->_cpt_model_obj->get_many_related('Registration');
3817 3817
         $template =
3818
-            REG_TEMPLATE_PATH . 'attendee_registrations_main_meta_box.template.php';
3818
+            REG_TEMPLATE_PATH.'attendee_registrations_main_meta_box.template.php';
3819 3819
         EEH_Template::display_template($template, $this->_template_args);
3820 3820
     }
3821 3821
 
@@ -3830,7 +3830,7 @@  discard block
 block discarded – undo
3830 3830
     public function after_title_form_fields($post)
3831 3831
     {
3832 3832
         if ($post->post_type == 'espresso_attendees') {
3833
-            $template = REG_TEMPLATE_PATH . 'attendee_details_after_title_form_fields.template.php';
3833
+            $template = REG_TEMPLATE_PATH.'attendee_details_after_title_form_fields.template.php';
3834 3834
             $template_args['attendee'] = $this->_cpt_model_obj;
3835 3835
             EEH_Template::display_template($template, $template_args);
3836 3836
         }
@@ -3854,14 +3854,14 @@  discard block
 block discarded – undo
3854 3854
         $ATT_MDL = EEM_Attendee::instance();
3855 3855
         $success = 1;
3856 3856
         // Checkboxes
3857
-        if (! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
3857
+        if ( ! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
3858 3858
             // if array has more than one element than success message should be plural
3859 3859
             $success = count($this->_req_data['checkbox']) > 1 ? 2 : 1;
3860 3860
             // cycle thru checkboxes
3861 3861
             while (list($ATT_ID, $value) = each($this->_req_data['checkbox'])) {
3862 3862
                 $updated = $trash ? $ATT_MDL->update_by_ID(array('status' => 'trash'), $ATT_ID)
3863 3863
                     : $ATT_MDL->update_by_ID(array('status' => 'publish'), $ATT_ID);
3864
-                if (! $updated) {
3864
+                if ( ! $updated) {
3865 3865
                     $success = 0;
3866 3866
                 }
3867 3867
             }
@@ -3872,7 +3872,7 @@  discard block
 block discarded – undo
3872 3872
             $att = $ATT_MDL->get_one_by_ID($ATT_ID);
3873 3873
             $updated = $trash ? $att->set_status('trash') : $att->set_status('publish');
3874 3874
             $updated = $att->save();
3875
-            if (! $updated) {
3875
+            if ( ! $updated) {
3876 3876
                 $success = 0;
3877 3877
             }
3878 3878
         }
Please login to merge, or discard this patch.
data_migration_scripts/4_1_0_stages/EE_DMS_4_1_0_org_options.dmsstage.php 2 patches
Indentation   +273 added lines, -273 removed lines patch added patch discarded remove patch
@@ -103,289 +103,289 @@
 block discarded – undo
103 103
 class EE_DMS_4_1_0_org_options extends EE_Data_Migration_Script_Stage
104 104
 {
105 105
 
106
-    public function _migration_step($num_items = 50)
107
-    {
106
+	public function _migration_step($num_items = 50)
107
+	{
108 108
 
109
-        $items_actually_migrated = 0;
110
-        $old_org_options = get_option('events_organization_settings');
111
-        foreach ($this->_org_options_we_know_how_to_migrate as $option_name) {
112
-            // only bother migrating if there's a setting to migrate. Otherwise we'll just use the default
113
-            if (isset($old_org_options[ $option_name ])) {
114
-                $this->_handle_org_option($option_name, $old_org_options[ $option_name ]);
115
-            }
116
-            if ($option_name=='surcharge') {
117
-                $this->_insert_new_global_surcharge_price($old_org_options);
118
-            }
119
-            $items_actually_migrated++;
120
-        }
109
+		$items_actually_migrated = 0;
110
+		$old_org_options = get_option('events_organization_settings');
111
+		foreach ($this->_org_options_we_know_how_to_migrate as $option_name) {
112
+			// only bother migrating if there's a setting to migrate. Otherwise we'll just use the default
113
+			if (isset($old_org_options[ $option_name ])) {
114
+				$this->_handle_org_option($option_name, $old_org_options[ $option_name ]);
115
+			}
116
+			if ($option_name=='surcharge') {
117
+				$this->_insert_new_global_surcharge_price($old_org_options);
118
+			}
119
+			$items_actually_migrated++;
120
+		}
121 121
 
122
-        $success = EE_Config::instance()->update_espresso_config(false, true);
123
-        if (! $success) {
124
-            $this->add_error(sprintf(__('Could not save EE Config during org options stage. Reason: %s', 'event_espresso'), EE_Error::get_notices(false)));
125
-            EE_Error::overwrite_errors();
126
-        }
127
-        EE_Network_Config::instance()->update_config(false, false);
128
-        if ($this->count_records_migrated() + $items_actually_migrated >= $this->count_records_to_migrate()) {
129
-            // we may have added new pages and this might be necessary
130
-            flush_rewrite_rules();
131
-            $this->set_completed();
132
-        }
133
-        return $items_actually_migrated;
134
-    }
135
-    public function _count_records_to_migrate()
136
-    {
137
-        $count_of_options_to_migrate = count($this->_org_options_we_know_how_to_migrate);
138
-        return $count_of_options_to_migrate;
139
-    }
140
-    public function __construct()
141
-    {
142
-        $this->_pretty_name = __("Organization Options/Config", "event_espresso");
143
-        $this->_org_options_we_know_how_to_migrate = apply_filters('FHEE__EE_DMS_4_1_0_org_options__org_options_we_know_how_to_migrate', $this->_org_options_we_know_how_to_migrate);
144
-        parent::__construct();
145
-    }
122
+		$success = EE_Config::instance()->update_espresso_config(false, true);
123
+		if (! $success) {
124
+			$this->add_error(sprintf(__('Could not save EE Config during org options stage. Reason: %s', 'event_espresso'), EE_Error::get_notices(false)));
125
+			EE_Error::overwrite_errors();
126
+		}
127
+		EE_Network_Config::instance()->update_config(false, false);
128
+		if ($this->count_records_migrated() + $items_actually_migrated >= $this->count_records_to_migrate()) {
129
+			// we may have added new pages and this might be necessary
130
+			flush_rewrite_rules();
131
+			$this->set_completed();
132
+		}
133
+		return $items_actually_migrated;
134
+	}
135
+	public function _count_records_to_migrate()
136
+	{
137
+		$count_of_options_to_migrate = count($this->_org_options_we_know_how_to_migrate);
138
+		return $count_of_options_to_migrate;
139
+	}
140
+	public function __construct()
141
+	{
142
+		$this->_pretty_name = __("Organization Options/Config", "event_espresso");
143
+		$this->_org_options_we_know_how_to_migrate = apply_filters('FHEE__EE_DMS_4_1_0_org_options__org_options_we_know_how_to_migrate', $this->_org_options_we_know_how_to_migrate);
144
+		parent::__construct();
145
+	}
146 146
 
147
-    private function _handle_org_option($option_name, $value)
148
-    {
149
-        $c = EE_Config::instance();
150
-        $cn = EE_Network_Config::instance();
151
-        switch ($option_name) {
152
-            case 'organization':
153
-                $c->organization->name = $value;
154
-                break;
155
-            case 'organization_street1':
156
-                $c->organization->address_1 = $value;
157
-                break;
158
-            case 'organization_street2':
159
-                $c->organization->address_2 = $value;
160
-                break;
161
-            case 'organization_city':
162
-                $c->organization->city = $value;
163
-                break;
164
-            case 'organization_state':
165
-                try {
166
-                    $state = $this->get_migration_script()->get_or_create_state($value);
167
-                    $state_id = $state['STA_ID'];
168
-                    $c->organization->STA_ID = $state_id;
169
-                } catch (EE_Error $e) {
170
-                }
171
-                break;
172
-            case 'organization_zip':
173
-                $c->organization->zip = $value;
174
-                break;
175
-            case 'contact_email':
176
-                $c->organization->email = $value;
177
-                break;
178
-            case 'default_payment_status':
179
-                $c->registration->default_STS_ID =  $this->get_migration_script()->convert_3_1_payment_status_to_4_1_STS_ID($value);
180
-                break;
181
-            case 'organization_country':
182
-                $iso =$this->get_migration_script()->get_iso_from_3_1_country_id($value);
183
-                $c->organization->CNT_ISO = $iso;
184
-                $country_row = $this->get_migration_script()->get_or_create_country($iso);
185
-                if (! $country_row) {
186
-                    $this->add_error(sprintf(__("Could not set country's currency config because no country exists for ISO %s", "event_espresso"), $iso));
187
-                }
188
-                // can't use EE_Currency_Config's handy constructor because the models are off-limits right now (and it uses them)
189
-                $c->currency->code = $country_row['CNT_cur_code'];          // currency code: USD, CAD, EUR
190
-                $c->currency->name = $country_row['CNT_cur_single'];    // Dollar
191
-                $c->currency->plural = $country_row['CNT_cur_plural'];  // Dollars
192
-                $c->currency->sign =  $country_row['CNT_cur_sign'];             // currency sign: $
193
-                $c->currency->sign_b4 = filter_var($country_row['CNT_cur_sign_b4'], FILTER_VALIDATE_BOOLEAN);        // currency sign before or after: $TRUE  or  FALSE$
194
-                $c->currency->dec_plc = (int) $country_row['CNT_cur_dec_plc'];    // decimal places: 2 = 0.00  3 = 0.000
195
-                $c->currency->dec_mrk = $country_row['CNT_cur_dec_mrk'];    // decimal mark: (comma) ',' = 0,01   or (decimal) '.' = 0.01
196
-                $c->currency->thsnds = $country_row['CNT_cur_thsnds'];  // thousands separator: (comma) ',' = 1,000   or (decimal) '.' = 1.000
147
+	private function _handle_org_option($option_name, $value)
148
+	{
149
+		$c = EE_Config::instance();
150
+		$cn = EE_Network_Config::instance();
151
+		switch ($option_name) {
152
+			case 'organization':
153
+				$c->organization->name = $value;
154
+				break;
155
+			case 'organization_street1':
156
+				$c->organization->address_1 = $value;
157
+				break;
158
+			case 'organization_street2':
159
+				$c->organization->address_2 = $value;
160
+				break;
161
+			case 'organization_city':
162
+				$c->organization->city = $value;
163
+				break;
164
+			case 'organization_state':
165
+				try {
166
+					$state = $this->get_migration_script()->get_or_create_state($value);
167
+					$state_id = $state['STA_ID'];
168
+					$c->organization->STA_ID = $state_id;
169
+				} catch (EE_Error $e) {
170
+				}
171
+				break;
172
+			case 'organization_zip':
173
+				$c->organization->zip = $value;
174
+				break;
175
+			case 'contact_email':
176
+				$c->organization->email = $value;
177
+				break;
178
+			case 'default_payment_status':
179
+				$c->registration->default_STS_ID =  $this->get_migration_script()->convert_3_1_payment_status_to_4_1_STS_ID($value);
180
+				break;
181
+			case 'organization_country':
182
+				$iso =$this->get_migration_script()->get_iso_from_3_1_country_id($value);
183
+				$c->organization->CNT_ISO = $iso;
184
+				$country_row = $this->get_migration_script()->get_or_create_country($iso);
185
+				if (! $country_row) {
186
+					$this->add_error(sprintf(__("Could not set country's currency config because no country exists for ISO %s", "event_espresso"), $iso));
187
+				}
188
+				// can't use EE_Currency_Config's handy constructor because the models are off-limits right now (and it uses them)
189
+				$c->currency->code = $country_row['CNT_cur_code'];          // currency code: USD, CAD, EUR
190
+				$c->currency->name = $country_row['CNT_cur_single'];    // Dollar
191
+				$c->currency->plural = $country_row['CNT_cur_plural'];  // Dollars
192
+				$c->currency->sign =  $country_row['CNT_cur_sign'];             // currency sign: $
193
+				$c->currency->sign_b4 = filter_var($country_row['CNT_cur_sign_b4'], FILTER_VALIDATE_BOOLEAN);        // currency sign before or after: $TRUE  or  FALSE$
194
+				$c->currency->dec_plc = (int) $country_row['CNT_cur_dec_plc'];    // decimal places: 2 = 0.00  3 = 0.000
195
+				$c->currency->dec_mrk = $country_row['CNT_cur_dec_mrk'];    // decimal mark: (comma) ',' = 0,01   or (decimal) '.' = 0.01
196
+				$c->currency->thsnds = $country_row['CNT_cur_thsnds'];  // thousands separator: (comma) ',' = 1,000   or (decimal) '.' = 1.000
197 197
   //            $c->currency = new EE_Currency_Config($c->organization->CNT_ISO);break;
198 198
   //        case 'currency_symbol': ignore the currency symbol. we'll just go by their country.
199 199
   //            $c->currency->sign = $value;break;
200
-            case 'show_pending_payment_options':
201
-                $c->registration->show_pending_payment_options = ($value == 'Y');
202
-                break;
203
-            case 'display_address_in_regform':
204
-                $c->template_settings->display_address_in_regform = ($value == 'Y');
205
-                break;
206
-            case 'default_logo_url':
207
-                $c->organization->logo_url = $value;
208
-                break;
209
-            case 'event_page_id':
210
-                // also, find that post, and changes the shortcode in it from ESPRESSO_PAYMENTS
211
-                // to ESPRESSO_THANK_YOU
212
-                $reg_page_post = get_post($value);
213
-                $reg_page_post->post_content = str_replace("[ESPRESSO_EVENTS]", "[ESPRESSO_CHECKOUT]", $reg_page_post->post_content);
214
-                wp_update_post($reg_page_post);
215
-                $c->core->reg_page_id = $value;
216
-                break;
217
-            case 'return_url':
218
-                // also, find that post, and changes the shortcode in it from ESPRESSO_PAYMENTS
219
-                // to ESPRESSO_THANK_YOU
220
-                $thank_you_page_post = get_post($value);
221
-                $thank_you_page_post->post_content = str_replace("[ESPRESSO_PAYMENTS]", "[ESPRESSO_THANK_YOU]", $thank_you_page_post->post_content);
222
-                wp_update_post($thank_you_page_post);
223
-                $c->core->thank_you_page_id = $value;
224
-                break;
225
-            case 'cancel_return':
226
-                $c->core->cancel_page_id = $value;
200
+			case 'show_pending_payment_options':
201
+				$c->registration->show_pending_payment_options = ($value == 'Y');
202
+				break;
203
+			case 'display_address_in_regform':
204
+				$c->template_settings->display_address_in_regform = ($value == 'Y');
205
+				break;
206
+			case 'default_logo_url':
207
+				$c->organization->logo_url = $value;
208
+				break;
209
+			case 'event_page_id':
210
+				// also, find that post, and changes the shortcode in it from ESPRESSO_PAYMENTS
211
+				// to ESPRESSO_THANK_YOU
212
+				$reg_page_post = get_post($value);
213
+				$reg_page_post->post_content = str_replace("[ESPRESSO_EVENTS]", "[ESPRESSO_CHECKOUT]", $reg_page_post->post_content);
214
+				wp_update_post($reg_page_post);
215
+				$c->core->reg_page_id = $value;
216
+				break;
217
+			case 'return_url':
218
+				// also, find that post, and changes the shortcode in it from ESPRESSO_PAYMENTS
219
+				// to ESPRESSO_THANK_YOU
220
+				$thank_you_page_post = get_post($value);
221
+				$thank_you_page_post->post_content = str_replace("[ESPRESSO_PAYMENTS]", "[ESPRESSO_THANK_YOU]", $thank_you_page_post->post_content);
222
+				wp_update_post($thank_you_page_post);
223
+				$c->core->thank_you_page_id = $value;
224
+				break;
225
+			case 'cancel_return':
226
+				$c->core->cancel_page_id = $value;
227 227
 
228
-                break;
229
-            case 'notify_url':
230
-                $c->core->txn_page_id = $value;
231
-                break;
232
-            case 'use_captcha':
233
-                $c->registration->use_captcha = ($value == 'Y');
234
-                break;
235
-            case 'recaptcha_publickey':
236
-                $c->registration->recaptcha_publickey = $value;
237
-                break;
238
-            case 'recaptcha_privatekey':
239
-                $c->registration->recaptcha_privatekey = $value;
240
-                break;
241
-            case 'recaptcha_theme':
242
-                $c->registration->recaptcha_theme = $value;
243
-                break;
244
-            case 'recaptcha_width':
245
-                $c->registration->recaptcha_width = $value;
246
-                break;
247
-            case 'recaptcha_language':
248
-                $c->registration->recaptcha_language = $value;
249
-                break;
250
-            case 'espresso_dashboard_widget':
251
-                $c->admin->use_dashboard_widget = ($value == 'Y');
252
-                break;
253
-            case 'use_personnel_manager':
254
-                $c->admin->use_personnel_manager = ($value == 'Y');
255
-                break;
256
-            case 'use_event_timezones':
257
-                $c->admin->use_event_timezones = ($value == 'Y');
258
-                break;
259
-            case 'full_logging':
260
-                $c->admin->use_full_logging = ($value == 'Y');
261
-                break;
262
-            case 'affiliate_id':
263
-                $c->admin->affiliate_id = $value;
264
-                break;
265
-            case 'site_license_key':
266
-                $cn->core->site_license_key = $value;
267
-                break;
268
-            default:
269
-                do_action('AHEE__EE_DMS_4_1_0__handle_org_option', $option_name, $value);
270
-        }
271
-    }
228
+				break;
229
+			case 'notify_url':
230
+				$c->core->txn_page_id = $value;
231
+				break;
232
+			case 'use_captcha':
233
+				$c->registration->use_captcha = ($value == 'Y');
234
+				break;
235
+			case 'recaptcha_publickey':
236
+				$c->registration->recaptcha_publickey = $value;
237
+				break;
238
+			case 'recaptcha_privatekey':
239
+				$c->registration->recaptcha_privatekey = $value;
240
+				break;
241
+			case 'recaptcha_theme':
242
+				$c->registration->recaptcha_theme = $value;
243
+				break;
244
+			case 'recaptcha_width':
245
+				$c->registration->recaptcha_width = $value;
246
+				break;
247
+			case 'recaptcha_language':
248
+				$c->registration->recaptcha_language = $value;
249
+				break;
250
+			case 'espresso_dashboard_widget':
251
+				$c->admin->use_dashboard_widget = ($value == 'Y');
252
+				break;
253
+			case 'use_personnel_manager':
254
+				$c->admin->use_personnel_manager = ($value == 'Y');
255
+				break;
256
+			case 'use_event_timezones':
257
+				$c->admin->use_event_timezones = ($value == 'Y');
258
+				break;
259
+			case 'full_logging':
260
+				$c->admin->use_full_logging = ($value == 'Y');
261
+				break;
262
+			case 'affiliate_id':
263
+				$c->admin->affiliate_id = $value;
264
+				break;
265
+			case 'site_license_key':
266
+				$cn->core->site_license_key = $value;
267
+				break;
268
+			default:
269
+				do_action('AHEE__EE_DMS_4_1_0__handle_org_option', $option_name, $value);
270
+		}
271
+	}
272 272
 
273
-    /**
274
-     * Creates a 4.1 member price discount
275
-     * @global type $wpdb
276
-     * @param type $old_price
277
-     * @return int
278
-     */
279
-    private function _insert_new_global_surcharge_price($org_options)
280
-    {
281
-        $amount = floatval($org_options['surcharge']);
282
-        // dont createa a price if the surcharge is 0
283
-        if ($amount <=.01) {
284
-            return 0;
285
-        }
286
-        if ($org_options['surcharge_type'] == 'flat_rate') {
287
-            $price_type = EE_DMS_4_1_0_prices::price_type_flat_surcharge;
288
-        } else {
289
-            $price_type = EE_DMS_4_1_0_prices::price_type_percent_surcharge;
290
-        }
291
-        global $wpdb;
292
-        $cols_n_values = array(
293
-            'PRT_ID'=>$price_type,
294
-            'PRC_amount'=>$amount,
295
-            'PRC_name'=>  $org_options['surcharge_text'],
296
-            'PRC_is_default'=>true,
297
-            'PRC_overrides'=>false,
298
-            'PRC_order'=>100,
299
-            'PRC_deleted'=>false,
300
-            'PRC_parent'=>null
273
+	/**
274
+	 * Creates a 4.1 member price discount
275
+	 * @global type $wpdb
276
+	 * @param type $old_price
277
+	 * @return int
278
+	 */
279
+	private function _insert_new_global_surcharge_price($org_options)
280
+	{
281
+		$amount = floatval($org_options['surcharge']);
282
+		// dont createa a price if the surcharge is 0
283
+		if ($amount <=.01) {
284
+			return 0;
285
+		}
286
+		if ($org_options['surcharge_type'] == 'flat_rate') {
287
+			$price_type = EE_DMS_4_1_0_prices::price_type_flat_surcharge;
288
+		} else {
289
+			$price_type = EE_DMS_4_1_0_prices::price_type_percent_surcharge;
290
+		}
291
+		global $wpdb;
292
+		$cols_n_values = array(
293
+			'PRT_ID'=>$price_type,
294
+			'PRC_amount'=>$amount,
295
+			'PRC_name'=>  $org_options['surcharge_text'],
296
+			'PRC_is_default'=>true,
297
+			'PRC_overrides'=>false,
298
+			'PRC_order'=>100,
299
+			'PRC_deleted'=>false,
300
+			'PRC_parent'=>null
301 301
 
302
-        );
303
-        $datatypes = array(
304
-            '%d',// PRT_ID
305
-            '%f',// PRT_amount
306
-            '%s',// PRC_name
307
-            '%d',// PRC_is_default
308
-            '%d',// PRC_overrides
309
-            '%d',// PRC_order
310
-            '%d',// PRC_deleted
311
-            '%d',// PRC_parent
312
-        );
313
-        $price_table = $wpdb->prefix."esp_price";
314
-        $success = $wpdb->insert($price_table, $cols_n_values, $datatypes);
315
-        if (! $success) {
316
-            $this->add_error($this->get_migration_script()->_create_error_message_for_db_insertion(
317
-                'org_options',
318
-                array(
319
-                        'surcharge'=>$org_options['surcharge'],
320
-                        'surcharge_type'=>$org_options['surcharge_type'],
321
-                        'surcharge_text'=>$org_options['surcharge_text']),
322
-                $price_table,
323
-                $cols_n_values,
324
-                $datatypes
325
-            ));
326
-            return 0;
327
-        }
328
-        $new_id = $wpdb->insert_id;
329
-        return $new_id;
330
-    }
302
+		);
303
+		$datatypes = array(
304
+			'%d',// PRT_ID
305
+			'%f',// PRT_amount
306
+			'%s',// PRC_name
307
+			'%d',// PRC_is_default
308
+			'%d',// PRC_overrides
309
+			'%d',// PRC_order
310
+			'%d',// PRC_deleted
311
+			'%d',// PRC_parent
312
+		);
313
+		$price_table = $wpdb->prefix."esp_price";
314
+		$success = $wpdb->insert($price_table, $cols_n_values, $datatypes);
315
+		if (! $success) {
316
+			$this->add_error($this->get_migration_script()->_create_error_message_for_db_insertion(
317
+				'org_options',
318
+				array(
319
+						'surcharge'=>$org_options['surcharge'],
320
+						'surcharge_type'=>$org_options['surcharge_type'],
321
+						'surcharge_text'=>$org_options['surcharge_text']),
322
+				$price_table,
323
+				$cols_n_values,
324
+				$datatypes
325
+			));
326
+			return 0;
327
+		}
328
+		$new_id = $wpdb->insert_id;
329
+		return $new_id;
330
+	}
331 331
 
332
-    protected $_org_options_we_know_how_to_migrate = array(
333
-      'organization',
334
-      'organization_street1',
335
-      'organization_street2',
336
-      'organization_city',
337
-      'organization_state',
338
-      'organization_zip',
339
-      'contact_email',
340
-      'default_mail',
341
-      'payment_subject',
342
-      'payment_message',
343
-      'message',
344
-      'default_payment_status',
345
-      'surcharge',// unused?
346
-      'country_id',// unused?
347
-      'organization_country',
332
+	protected $_org_options_we_know_how_to_migrate = array(
333
+	  'organization',
334
+	  'organization_street1',
335
+	  'organization_street2',
336
+	  'organization_city',
337
+	  'organization_state',
338
+	  'organization_zip',
339
+	  'contact_email',
340
+	  'default_mail',
341
+	  'payment_subject',
342
+	  'payment_message',
343
+	  'message',
344
+	  'default_payment_status',
345
+	  'surcharge',// unused?
346
+	  'country_id',// unused?
347
+	  'organization_country',
348 348
 //    'currency_symbol',
349
-      'expire_on_registration_end',
350
-      'email_before_payment',
351
-      'email_fancy_headers',
352
-      'enable_default_style',
353
-      'event_ssl_active',
354
-      'selected_style',
355
-      'show_pending_payment_options',
356
-      'show_reg_footer',
357
-      'skip_confirmation_page',
358
-      'allow_mer_discounts',// no equiv
359
-      'allow_mer_vouchers',// no equiv
360
-      'display_short_description_in_event_list',
361
-      'display_description_on_multi_reg_page',
362
-      'display_address_in_event_list',
363
-      'display_address_in_regform',
364
-      'use_custom_post_types',// no equiv
365
-      'display_ical_download',
366
-      'display_featured_image',
367
-      'themeroller',
368
-      'default_logo_url',
369
-      'event_page_id',
370
-      'return_url',
371
-      'cancel_return',
372
-      'notify_url',
373
-      'events_in_dashboard',
374
-      'use_captcha',
375
-      'recaptcha_publickey',
376
-      'recaptcha_privatekey',
377
-      'recaptcha_theme',
378
-      'recaptcha_width',
379
-      'recaptcha_language',
380
-      'espresso_dashboard_widget',
381
-      'time_reg_limit',
349
+	  'expire_on_registration_end',
350
+	  'email_before_payment',
351
+	  'email_fancy_headers',
352
+	  'enable_default_style',
353
+	  'event_ssl_active',
354
+	  'selected_style',
355
+	  'show_pending_payment_options',
356
+	  'show_reg_footer',
357
+	  'skip_confirmation_page',
358
+	  'allow_mer_discounts',// no equiv
359
+	  'allow_mer_vouchers',// no equiv
360
+	  'display_short_description_in_event_list',
361
+	  'display_description_on_multi_reg_page',
362
+	  'display_address_in_event_list',
363
+	  'display_address_in_regform',
364
+	  'use_custom_post_types',// no equiv
365
+	  'display_ical_download',
366
+	  'display_featured_image',
367
+	  'themeroller',
368
+	  'default_logo_url',
369
+	  'event_page_id',
370
+	  'return_url',
371
+	  'cancel_return',
372
+	  'notify_url',
373
+	  'events_in_dashboard',
374
+	  'use_captcha',
375
+	  'recaptcha_publickey',
376
+	  'recaptcha_privatekey',
377
+	  'recaptcha_theme',
378
+	  'recaptcha_width',
379
+	  'recaptcha_language',
380
+	  'espresso_dashboard_widget',
381
+	  'time_reg_limit',
382 382
 //    'use_attendee_pre_approval', removed in 4.1- instead this is factored into the default reg status
383
-      'use_personnel_manager',// no equiv
384
-      'use_event_timezones',
385
-      'full_logging',
386
-      'surcharge_type',// unused
387
-      'surcharge_text',// unused
388
-      'affiliate_id',
389
-      'site_license_key',
390
-    );
383
+	  'use_personnel_manager',// no equiv
384
+	  'use_event_timezones',
385
+	  'full_logging',
386
+	  'surcharge_type',// unused
387
+	  'surcharge_text',// unused
388
+	  'affiliate_id',
389
+	  'site_license_key',
390
+	);
391 391
 }
Please login to merge, or discard this patch.
Spacing   +33 added lines, -33 removed lines patch added patch discarded remove patch
@@ -110,17 +110,17 @@  discard block
 block discarded – undo
110 110
         $old_org_options = get_option('events_organization_settings');
111 111
         foreach ($this->_org_options_we_know_how_to_migrate as $option_name) {
112 112
             // only bother migrating if there's a setting to migrate. Otherwise we'll just use the default
113
-            if (isset($old_org_options[ $option_name ])) {
114
-                $this->_handle_org_option($option_name, $old_org_options[ $option_name ]);
113
+            if (isset($old_org_options[$option_name])) {
114
+                $this->_handle_org_option($option_name, $old_org_options[$option_name]);
115 115
             }
116
-            if ($option_name=='surcharge') {
116
+            if ($option_name == 'surcharge') {
117 117
                 $this->_insert_new_global_surcharge_price($old_org_options);
118 118
             }
119 119
             $items_actually_migrated++;
120 120
         }
121 121
 
122 122
         $success = EE_Config::instance()->update_espresso_config(false, true);
123
-        if (! $success) {
123
+        if ( ! $success) {
124 124
             $this->add_error(sprintf(__('Could not save EE Config during org options stage. Reason: %s', 'event_espresso'), EE_Error::get_notices(false)));
125 125
             EE_Error::overwrite_errors();
126 126
         }
@@ -176,24 +176,24 @@  discard block
 block discarded – undo
176 176
                 $c->organization->email = $value;
177 177
                 break;
178 178
             case 'default_payment_status':
179
-                $c->registration->default_STS_ID =  $this->get_migration_script()->convert_3_1_payment_status_to_4_1_STS_ID($value);
179
+                $c->registration->default_STS_ID = $this->get_migration_script()->convert_3_1_payment_status_to_4_1_STS_ID($value);
180 180
                 break;
181 181
             case 'organization_country':
182
-                $iso =$this->get_migration_script()->get_iso_from_3_1_country_id($value);
182
+                $iso = $this->get_migration_script()->get_iso_from_3_1_country_id($value);
183 183
                 $c->organization->CNT_ISO = $iso;
184 184
                 $country_row = $this->get_migration_script()->get_or_create_country($iso);
185
-                if (! $country_row) {
185
+                if ( ! $country_row) {
186 186
                     $this->add_error(sprintf(__("Could not set country's currency config because no country exists for ISO %s", "event_espresso"), $iso));
187 187
                 }
188 188
                 // can't use EE_Currency_Config's handy constructor because the models are off-limits right now (and it uses them)
189
-                $c->currency->code = $country_row['CNT_cur_code'];          // currency code: USD, CAD, EUR
190
-                $c->currency->name = $country_row['CNT_cur_single'];    // Dollar
191
-                $c->currency->plural = $country_row['CNT_cur_plural'];  // Dollars
192
-                $c->currency->sign =  $country_row['CNT_cur_sign'];             // currency sign: $
193
-                $c->currency->sign_b4 = filter_var($country_row['CNT_cur_sign_b4'], FILTER_VALIDATE_BOOLEAN);        // currency sign before or after: $TRUE  or  FALSE$
194
-                $c->currency->dec_plc = (int) $country_row['CNT_cur_dec_plc'];    // decimal places: 2 = 0.00  3 = 0.000
195
-                $c->currency->dec_mrk = $country_row['CNT_cur_dec_mrk'];    // decimal mark: (comma) ',' = 0,01   or (decimal) '.' = 0.01
196
-                $c->currency->thsnds = $country_row['CNT_cur_thsnds'];  // thousands separator: (comma) ',' = 1,000   or (decimal) '.' = 1.000
189
+                $c->currency->code = $country_row['CNT_cur_code']; // currency code: USD, CAD, EUR
190
+                $c->currency->name = $country_row['CNT_cur_single']; // Dollar
191
+                $c->currency->plural = $country_row['CNT_cur_plural']; // Dollars
192
+                $c->currency->sign = $country_row['CNT_cur_sign']; // currency sign: $
193
+                $c->currency->sign_b4 = filter_var($country_row['CNT_cur_sign_b4'], FILTER_VALIDATE_BOOLEAN); // currency sign before or after: $TRUE  or  FALSE$
194
+                $c->currency->dec_plc = (int) $country_row['CNT_cur_dec_plc']; // decimal places: 2 = 0.00  3 = 0.000
195
+                $c->currency->dec_mrk = $country_row['CNT_cur_dec_mrk']; // decimal mark: (comma) ',' = 0,01   or (decimal) '.' = 0.01
196
+                $c->currency->thsnds = $country_row['CNT_cur_thsnds']; // thousands separator: (comma) ',' = 1,000   or (decimal) '.' = 1.000
197 197
   //            $c->currency = new EE_Currency_Config($c->organization->CNT_ISO);break;
198 198
   //        case 'currency_symbol': ignore the currency symbol. we'll just go by their country.
199 199
   //            $c->currency->sign = $value;break;
@@ -280,7 +280,7 @@  discard block
 block discarded – undo
280 280
     {
281 281
         $amount = floatval($org_options['surcharge']);
282 282
         // dont createa a price if the surcharge is 0
283
-        if ($amount <=.01) {
283
+        if ($amount <= .01) {
284 284
             return 0;
285 285
         }
286 286
         if ($org_options['surcharge_type'] == 'flat_rate') {
@@ -301,18 +301,18 @@  discard block
 block discarded – undo
301 301
 
302 302
         );
303 303
         $datatypes = array(
304
-            '%d',// PRT_ID
305
-            '%f',// PRT_amount
306
-            '%s',// PRC_name
307
-            '%d',// PRC_is_default
308
-            '%d',// PRC_overrides
309
-            '%d',// PRC_order
310
-            '%d',// PRC_deleted
311
-            '%d',// PRC_parent
304
+            '%d', // PRT_ID
305
+            '%f', // PRT_amount
306
+            '%s', // PRC_name
307
+            '%d', // PRC_is_default
308
+            '%d', // PRC_overrides
309
+            '%d', // PRC_order
310
+            '%d', // PRC_deleted
311
+            '%d', // PRC_parent
312 312
         );
313 313
         $price_table = $wpdb->prefix."esp_price";
314 314
         $success = $wpdb->insert($price_table, $cols_n_values, $datatypes);
315
-        if (! $success) {
315
+        if ( ! $success) {
316 316
             $this->add_error($this->get_migration_script()->_create_error_message_for_db_insertion(
317 317
                 'org_options',
318 318
                 array(
@@ -342,8 +342,8 @@  discard block
 block discarded – undo
342 342
       'payment_message',
343 343
       'message',
344 344
       'default_payment_status',
345
-      'surcharge',// unused?
346
-      'country_id',// unused?
345
+      'surcharge', // unused?
346
+      'country_id', // unused?
347 347
       'organization_country',
348 348
 //    'currency_symbol',
349 349
       'expire_on_registration_end',
@@ -355,13 +355,13 @@  discard block
 block discarded – undo
355 355
       'show_pending_payment_options',
356 356
       'show_reg_footer',
357 357
       'skip_confirmation_page',
358
-      'allow_mer_discounts',// no equiv
359
-      'allow_mer_vouchers',// no equiv
358
+      'allow_mer_discounts', // no equiv
359
+      'allow_mer_vouchers', // no equiv
360 360
       'display_short_description_in_event_list',
361 361
       'display_description_on_multi_reg_page',
362 362
       'display_address_in_event_list',
363 363
       'display_address_in_regform',
364
-      'use_custom_post_types',// no equiv
364
+      'use_custom_post_types', // no equiv
365 365
       'display_ical_download',
366 366
       'display_featured_image',
367 367
       'themeroller',
@@ -380,11 +380,11 @@  discard block
 block discarded – undo
380 380
       'espresso_dashboard_widget',
381 381
       'time_reg_limit',
382 382
 //    'use_attendee_pre_approval', removed in 4.1- instead this is factored into the default reg status
383
-      'use_personnel_manager',// no equiv
383
+      'use_personnel_manager', // no equiv
384 384
       'use_event_timezones',
385 385
       'full_logging',
386
-      'surcharge_type',// unused
387
-      'surcharge_text',// unused
386
+      'surcharge_type', // unused
387
+      'surcharge_text', // unused
388 388
       'affiliate_id',
389 389
       'site_license_key',
390 390
     );
Please login to merge, or discard this patch.
core/domain/services/assets/CoreAssetManager.php 1 patch
Indentation   +544 added lines, -544 removed lines patch added patch discarded remove patch
@@ -32,570 +32,570 @@
 block discarded – undo
32 32
 class CoreAssetManager extends AssetManager
33 33
 {
34 34
 
35
-    // WordPress core / Third party JS asset handles
36
-    const JS_HANDLE_JQUERY = 'jquery';
35
+	// WordPress core / Third party JS asset handles
36
+	const JS_HANDLE_JQUERY = 'jquery';
37 37
 
38
-    const JS_HANDLE_JQUERY_VALIDATE = 'jquery-validate';
38
+	const JS_HANDLE_JQUERY_VALIDATE = 'jquery-validate';
39 39
 
40
-    const JS_HANDLE_JQUERY_VALIDATE_EXTRA = 'jquery-validate-extra-methods';
40
+	const JS_HANDLE_JQUERY_VALIDATE_EXTRA = 'jquery-validate-extra-methods';
41 41
 
42
-    const JS_HANDLE_UNDERSCORE = 'underscore';
42
+	const JS_HANDLE_UNDERSCORE = 'underscore';
43 43
 
44
-    const JS_HANDLE_ACCOUNTING_CORE = 'ee-accounting-core';
44
+	const JS_HANDLE_ACCOUNTING_CORE = 'ee-accounting-core';
45 45
 
46
-    /**
47
-     * @since 4.9.71.p
48
-     */
49
-    const JS_HANDLE_REACT = 'react';
46
+	/**
47
+	 * @since 4.9.71.p
48
+	 */
49
+	const JS_HANDLE_REACT = 'react';
50 50
 
51
-    /**
52
-     * @since 4.9.71.p
53
-     */
54
-    const JS_HANDLE_REACT_DOM = 'react-dom';
51
+	/**
52
+	 * @since 4.9.71.p
53
+	 */
54
+	const JS_HANDLE_REACT_DOM = 'react-dom';
55 55
 
56
-    /**
57
-     * @since 4.9.71.p
58
-     */
59
-    const JS_HANDLE_LODASH = 'lodash';
56
+	/**
57
+	 * @since 4.9.71.p
58
+	 */
59
+	const JS_HANDLE_LODASH = 'lodash';
60 60
 
61
-    // EE JS assets handles
62
-    const JS_HANDLE_MANIFEST = 'ee-manifest';
61
+	// EE JS assets handles
62
+	const JS_HANDLE_MANIFEST = 'ee-manifest';
63 63
 
64
-    const JS_HANDLE_JS_CORE = 'eejs-core';
64
+	const JS_HANDLE_JS_CORE = 'eejs-core';
65 65
 
66
-    const JS_HANDLE_VENDOR = 'eventespresso-vendor';
66
+	const JS_HANDLE_VENDOR = 'eventespresso-vendor';
67 67
 
68
-    const JS_HANDLE_DATA_STORES = 'eventespresso-data-stores';
68
+	const JS_HANDLE_DATA_STORES = 'eventespresso-data-stores';
69 69
 
70
-    const JS_HANDLE_HELPERS = 'eventespresso-helpers';
70
+	const JS_HANDLE_HELPERS = 'eventespresso-helpers';
71 71
 
72
-    const JS_HANDLE_MODEL = 'eventespresso-model';
72
+	const JS_HANDLE_MODEL = 'eventespresso-model';
73 73
 
74
-    const JS_HANDLE_VALUE_OBJECTS = 'eventespresso-value-objects';
74
+	const JS_HANDLE_VALUE_OBJECTS = 'eventespresso-value-objects';
75 75
 
76
-    const JS_HANDLE_HOCS = 'eventespresso-hocs';
76
+	const JS_HANDLE_HOCS = 'eventespresso-hocs';
77 77
 
78
-    const JS_HANDLE_COMPONENTS = 'eventespresso-components';
78
+	const JS_HANDLE_COMPONENTS = 'eventespresso-components';
79 79
 
80
-    const JS_HANDLE_EDITOR_HOCS = 'eventespresso-editor-hocs';
80
+	const JS_HANDLE_EDITOR_HOCS = 'eventespresso-editor-hocs';
81 81
 
82
-    const JS_HANDLE_VALIDATORS = 'eventespresso-validators';
82
+	const JS_HANDLE_VALIDATORS = 'eventespresso-validators';
83 83
 
84
-    const JS_HANDLE_CORE = 'espresso_core';
84
+	const JS_HANDLE_CORE = 'espresso_core';
85 85
 
86
-    const JS_HANDLE_I18N = 'eei18n';
86
+	const JS_HANDLE_I18N = 'eei18n';
87 87
 
88
-    const JS_HANDLE_ACCOUNTING = 'ee-accounting';
88
+	const JS_HANDLE_ACCOUNTING = 'ee-accounting';
89 89
 
90
-    const JS_HANDLE_WP_PLUGINS_PAGE = 'ee-wp-plugins-page';
91
-
92
-    // EE CSS assets handles
93
-    const CSS_HANDLE_DEFAULT = 'espresso_default';
94
-
95
-    const CSS_HANDLE_CUSTOM = 'espresso_custom_css';
96
-
97
-    const CSS_HANDLE_COMPONENTS = 'eventespresso-components';
98
-
99
-    const CSS_HANDLE_CORE_CSS_DEFAULT = 'eventespresso-core-css-default';
100
-
101
-    /**
102
-     * @var EE_Currency_Config $currency_config
103
-     */
104
-    protected $currency_config;
105
-
106
-    /**
107
-     * @var EE_Template_Config $template_config
108
-     */
109
-    protected $template_config;
110
-
111
-
112
-    /**
113
-     * CoreAssetRegister constructor.
114
-     *
115
-     * @param AssetCollection    $assets
116
-     * @param EE_Currency_Config $currency_config
117
-     * @param EE_Template_Config $template_config
118
-     * @param DomainInterface    $domain
119
-     * @param Registry           $registry
120
-     */
121
-    public function __construct(
122
-        AssetCollection $assets,
123
-        EE_Currency_Config $currency_config,
124
-        EE_Template_Config $template_config,
125
-        DomainInterface $domain,
126
-        Registry $registry
127
-    ) {
128
-        $this->currency_config = $currency_config;
129
-        $this->template_config = $template_config;
130
-        parent::__construct($domain, $assets, $registry);
131
-    }
132
-
133
-
134
-    /**
135
-     * @since 4.9.62.p
136
-     * @throws DomainException
137
-     * @throws DuplicateCollectionIdentifierException
138
-     * @throws InvalidArgumentException
139
-     * @throws InvalidDataTypeException
140
-     * @throws InvalidEntityException
141
-     * @throws InvalidInterfaceException
142
-     */
143
-    public function addAssets()
144
-    {
145
-        $this->addJavascriptFiles();
146
-        $this->addStylesheetFiles();
147
-    }
148
-
149
-
150
-    /**
151
-     * @since 4.9.62.p
152
-     * @throws DomainException
153
-     * @throws DuplicateCollectionIdentifierException
154
-     * @throws InvalidArgumentException
155
-     * @throws InvalidDataTypeException
156
-     * @throws InvalidEntityException
157
-     * @throws InvalidInterfaceException
158
-     */
159
-    public function addJavascriptFiles()
160
-    {
161
-        $this->loadCoreJs();
162
-        $this->loadJqueryValidate();
163
-        $this->loadAccountingJs();
164
-        add_action(
165
-            'AHEE__EventEspresso_core_services_assets_Registry__registerScripts__before_script',
166
-            array($this, 'loadQtipJs')
167
-        );
168
-        $this->registerAdminAssets();
169
-    }
170
-
171
-
172
-    /**
173
-     * @since 4.9.62.p
174
-     * @throws DuplicateCollectionIdentifierException
175
-     * @throws InvalidDataTypeException
176
-     * @throws InvalidEntityException
177
-     */
178
-    public function addStylesheetFiles()
179
-    {
180
-        $this->loadCoreCss();
181
-    }
182
-
183
-
184
-    /**
185
-     * core default javascript
186
-     *
187
-     * @since 4.9.62.p
188
-     * @throws DomainException
189
-     * @throws DuplicateCollectionIdentifierException
190
-     * @throws InvalidArgumentException
191
-     * @throws InvalidDataTypeException
192
-     * @throws InvalidEntityException
193
-     * @throws InvalidInterfaceException
194
-     */
195
-    private function loadCoreJs()
196
-    {
197
-        // conditionally load third-party libraries that WP core MIGHT have.
198
-        $this->registerWpAssets();
199
-
200
-        $this->addJavascript(
201
-            CoreAssetManager::JS_HANDLE_MANIFEST,
202
-            $this->registry->getJsUrl($this->domain->assetNamespace(), 'manifest')
203
-        );
204
-
205
-        $this->addJavascript(
206
-            CoreAssetManager::JS_HANDLE_JS_CORE,
207
-            $this->registry->getJsUrl($this->domain->assetNamespace(), 'eejs'),
208
-            array(CoreAssetManager::JS_HANDLE_MANIFEST)
209
-        )
210
-        ->setHasInlineData();
211
-
212
-        $this->addJavascript(
213
-            CoreAssetManager::JS_HANDLE_VENDOR,
214
-            $this->registry->getJsUrl($this->domain->assetNamespace(), 'vendor'),
215
-            array(
216
-                CoreAssetManager::JS_HANDLE_JS_CORE,
217
-                CoreAssetManager::JS_HANDLE_REACT,
218
-                CoreAssetManager::JS_HANDLE_REACT_DOM,
219
-                CoreAssetManager::JS_HANDLE_LODASH,
220
-            )
221
-        );
222
-
223
-        $this->addJavascript(
224
-            CoreAssetManager::JS_HANDLE_VALIDATORS,
225
-            $this->registry->getJsUrl($this->domain->assetNamespace(), 'validators')
226
-        )->setRequiresTranslation();
227
-
228
-        $this->addJavascript(
229
-            CoreAssetManager::JS_HANDLE_HELPERS,
230
-            $this->registry->getJsUrl($this->domain->assetNamespace(), 'helpers'),
231
-            array(
232
-                CoreAssetManager::JS_HANDLE_VALIDATORS
233
-            )
234
-        )->setRequiresTranslation();
235
-
236
-        $this->addJavascript(
237
-            CoreAssetManager::JS_HANDLE_MODEL,
238
-            $this->registry->getJsUrl($this->domain->assetNamespace(), 'model'),
239
-            array(
240
-                CoreAssetManager::JS_HANDLE_HELPERS,
241
-                CoreAssetManager::JS_HANDLE_VALUE_OBJECTS,
242
-            )
243
-        )->setRequiresTranslation();
244
-
245
-        $this->addJavascript(
246
-            CoreAssetManager::JS_HANDLE_VALUE_OBJECTS,
247
-            $this->registry->getJsUrl($this->domain->assetNamespace(), 'valueObjects'),
248
-            array(
249
-                CoreAssetManager::JS_HANDLE_VALIDATORS,
250
-                CoreAssetManager::JS_HANDLE_HELPERS,
251
-            )
252
-        )->setRequiresTranslation();
253
-
254
-        $this->addJavascript(
255
-            CoreAssetManager::JS_HANDLE_DATA_STORES,
256
-            $this->registry->getJsUrl($this->domain->assetNamespace(), 'data-stores'),
257
-            array(
258
-                CoreAssetManager::JS_HANDLE_VENDOR,
259
-                'wp-data',
260
-                'wp-api-fetch',
261
-                CoreAssetManager::JS_HANDLE_VALUE_OBJECTS,
262
-                CoreAssetManager::JS_HANDLE_MODEL,
263
-            )
264
-        )
265
-             ->setRequiresTranslation()
266
-             ->setInlineDataCallback(
267
-                 function() {
268
-                     wp_add_inline_script(
269
-                         CoreAssetManager::JS_HANDLE_DATA_STORES,
270
-                         is_admin()
271
-                             ? 'wp.apiFetch.use( eejs.middleWares.apiFetch.capsMiddleware( eejs.middleWares.apiFetch.CONTEXT_CAPS_EDIT ) )'
272
-                             : 'wp.apiFetch.use( eejs.middleWares.apiFetch.capsMiddleware )'
273
-                     );
274
-                 }
275
-             );
276
-
277
-        $this->addJavascript(
278
-            CoreAssetManager::JS_HANDLE_HOCS,
279
-            $this->registry->getJsUrl($this->domain->assetNamespace(), 'hocs'),
280
-            array(
281
-                CoreAssetManager::JS_HANDLE_DATA_STORES,
282
-                CoreAssetManager::JS_HANDLE_VALUE_OBJECTS,
283
-                'wp-components',
284
-            )
285
-        )->setRequiresTranslation();
286
-
287
-        $this->addJavascript(
288
-            CoreAssetManager::JS_HANDLE_COMPONENTS,
289
-            $this->registry->getJsUrl($this->domain->assetNamespace(), 'components'),
290
-            array(
291
-                CoreAssetManager::JS_HANDLE_DATA_STORES,
292
-                CoreAssetManager::JS_HANDLE_VALUE_OBJECTS,
293
-                'wp-components',
294
-            )
295
-        )
296
-        ->setRequiresTranslation();
297
-
298
-        $this->addJavascript(
299
-            CoreAssetManager::JS_HANDLE_EDITOR_HOCS,
300
-            $this->registry->getJsUrl($this->domain->assetNamespace(), 'editor-hocs'),
301
-            array(
302
-                CoreAssetManager::JS_HANDLE_COMPONENTS
303
-            )
304
-        )->setRequiresTranslation();
305
-
306
-        $this->registry->addData('eejs_api_nonce', wp_create_nonce('wp_rest'));
307
-        $this->registry->addData(
308
-            'paths',
309
-            array(
310
-                'base_rest_route' => rest_url(),
311
-                'rest_route' => rest_url('ee/v4.8.36/'),
312
-                'collection_endpoints' => EED_Core_Rest_Api::getCollectionRoutesIndexedByModelName(),
313
-                'primary_keys' => EED_Core_Rest_Api::getPrimaryKeyNamesIndexedByModelName(),
314
-                'site_url' => site_url('/'),
315
-                'admin_url' => admin_url('/'),
316
-            )
317
-        );
318
-        // Event Espresso brand name
319
-        $this->registry->addData('brandName', Domain::brandName());
320
-        /** site formatting values **/
321
-        $this->registry->addData(
322
-            'site_formats',
323
-            array(
324
-                'date_formats' => EEH_DTT_Helper::convert_php_to_js_and_moment_date_formats()
325
-            )
326
-        );
327
-        /** currency data **/
328
-        $this->registry->addData(
329
-            'currency_config',
330
-            $this->getCurrencySettings()
331
-        );
332
-        /** site timezone */
333
-        $this->registry->addData(
334
-            'default_timezone',
335
-            array(
336
-                'pretty' => EEH_DTT_Helper::get_timezone_string_for_display(),
337
-                'string' => get_option('timezone_string'),
338
-                'offset' => EEH_DTT_Helper::get_site_timezone_gmt_offset(),
339
-            )
340
-        );
341
-        /** site locale (user locale if user logged in) */
342
-        $this->registry->addData(
343
-            'locale',
344
-            array(
345
-                'user' => get_user_locale(),
346
-                'site' => get_locale()
347
-            )
348
-        );
349
-
350
-        $this->addJavascript(
351
-            CoreAssetManager::JS_HANDLE_CORE,
352
-            EE_GLOBAL_ASSETS_URL . 'scripts/espresso_core.js',
353
-            array(CoreAssetManager::JS_HANDLE_JQUERY)
354
-        )
355
-        ->setInlineDataCallback(
356
-            function () {
357
-                wp_localize_script(
358
-                    CoreAssetManager::JS_HANDLE_CORE,
359
-                    CoreAssetManager::JS_HANDLE_I18N,
360
-                    EE_Registry::$i18n_js_strings
361
-                );
362
-            }
363
-        );
364
-    }
365
-
366
-
367
-    /**
368
-     * Registers vendor files that are bundled with a later version WP but might not be for the current version of
369
-     * WordPress in the running environment.
370
-     *
371
-     * @throws DuplicateCollectionIdentifierException
372
-     * @throws InvalidDataTypeException
373
-     * @throws InvalidEntityException
374
-     * @throws DomainException
375
-     * @since 4.9.71.p
376
-     */
377
-    private function registerWpAssets()
378
-    {
379
-        global $wp_version;
380
-        if (version_compare($wp_version, '5.0.beta', '>=')) {
381
-            return;
382
-        }
383
-        $this->addVendorJavascript(CoreAssetManager::JS_HANDLE_REACT)
384
-            ->setVersion('16.6.0');
385
-        $this->addVendorJavascript(
386
-            CoreAssetManager::JS_HANDLE_REACT_DOM,
387
-            array(CoreAssetManager::JS_HANDLE_REACT)
388
-        )->setVersion('16.6.0');
389
-        $this->addVendorJavascript(CoreAssetManager::JS_HANDLE_LODASH)
390
-            ->setInlineDataCallback(
391
-                function() {
392
-                    wp_add_inline_script(
393
-                        CoreAssetManager::JS_HANDLE_LODASH,
394
-                        'window.lodash = _.noConflict();'
395
-                    );
396
-                }
397
-            )
398
-            ->setVersion('4.17.11');
399
-    }
400
-
401
-
402
-    /**
403
-     * Returns configuration data for the accounting-js library.
404
-     * @since 4.9.71.p
405
-     * @return array
406
-     */
407
-    private function getAccountingSettings() {
408
-        return array(
409
-            'currency' => array(
410
-                'symbol'    => $this->currency_config->sign,
411
-                'format'    => array(
412
-                    'pos'  => $this->currency_config->sign_b4 ? '%s%v' : '%v%s',
413
-                    'neg'  => $this->currency_config->sign_b4 ? '- %s%v' : '- %v%s',
414
-                    'zero' => $this->currency_config->sign_b4 ? '%s--' : '--%s',
415
-                ),
416
-                'decimal'   => $this->currency_config->dec_mrk,
417
-                'thousand'  => $this->currency_config->thsnds,
418
-                'precision' => $this->currency_config->dec_plc,
419
-            ),
420
-            'number'   => array(
421
-                'precision' => $this->currency_config->dec_plc,
422
-                'thousand'  => $this->currency_config->thsnds,
423
-                'decimal'   => $this->currency_config->dec_mrk,
424
-            ),
425
-        );
426
-    }
427
-
428
-
429
-    /**
430
-     * Returns configuration data for the js Currency VO.
431
-     * @since 4.9.71.p
432
-     * @return array
433
-     */
434
-    private function getCurrencySettings()
435
-    {
436
-        return array(
437
-            'code' => $this->currency_config->code,
438
-            'singularLabel' => $this->currency_config->name,
439
-            'pluralLabel' => $this->currency_config->plural,
440
-            'sign' => $this->currency_config->sign,
441
-            'signB4' => $this->currency_config->sign_b4,
442
-            'decimalPlaces' => $this->currency_config->dec_plc,
443
-            'decimalMark' => $this->currency_config->dec_mrk,
444
-            'thousandsSeparator' => $this->currency_config->thsnds,
445
-        );
446
-    }
447
-
448
-
449
-    /**
450
-     * @since 4.9.62.p
451
-     * @throws DuplicateCollectionIdentifierException
452
-     * @throws InvalidDataTypeException
453
-     * @throws InvalidEntityException
454
-     */
455
-    private function loadCoreCss()
456
-    {
457
-        if ($this->template_config->enable_default_style && ! is_admin()) {
458
-            $this->addStylesheet(
459
-                CoreAssetManager::CSS_HANDLE_DEFAULT,
460
-                is_readable(EVENT_ESPRESSO_UPLOAD_DIR . 'css/style.css')
461
-                    ? EVENT_ESPRESSO_UPLOAD_DIR . 'css/espresso_default.css'
462
-                    : EE_GLOBAL_ASSETS_URL . 'css/espresso_default.css',
463
-                array('dashicons')
464
-            );
465
-            //Load custom style sheet if available
466
-            if ($this->template_config->custom_style_sheet !== null) {
467
-                $this->addStylesheet(
468
-                    CoreAssetManager::CSS_HANDLE_CUSTOM,
469
-                    EVENT_ESPRESSO_UPLOAD_URL . 'css/' . $this->template_config->custom_style_sheet,
470
-                    array(CoreAssetManager::CSS_HANDLE_DEFAULT)
471
-                );
472
-            }
473
-        }
474
-        $this->addStylesheet(
475
-            CoreAssetManager::CSS_HANDLE_CORE_CSS_DEFAULT,
476
-            $this->registry->getCssUrl(
477
-                $this->domain->assetNamespace(),
478
-                'core-default-theme'
479
-            ),
480
-            ['dashicons']
481
-        );
482
-        $this->addStylesheet(
483
-            CoreAssetManager::CSS_HANDLE_COMPONENTS,
484
-            $this->registry->getCssUrl(
485
-                $this->domain->assetNamespace(),
486
-                'components'
487
-            ),
488
-            [CoreAssetManager::CSS_HANDLE_CORE_CSS_DEFAULT]
489
-        );
490
-    }
491
-
492
-
493
-    /**
494
-     * jQuery Validate for form validation
495
-     *
496
-     * @since 4.9.62.p
497
-     * @throws DomainException
498
-     * @throws DuplicateCollectionIdentifierException
499
-     * @throws InvalidDataTypeException
500
-     * @throws InvalidEntityException
501
-     */
502
-    private function loadJqueryValidate()
503
-    {
504
-        $this->addJavascript(
505
-            CoreAssetManager::JS_HANDLE_JQUERY_VALIDATE,
506
-            EE_GLOBAL_ASSETS_URL . 'scripts/jquery.validate.min.js',
507
-            array(CoreAssetManager::JS_HANDLE_JQUERY)
508
-        )
509
-        ->setVersion('1.15.0');
510
-
511
-        $this->addJavascript(
512
-            CoreAssetManager::JS_HANDLE_JQUERY_VALIDATE_EXTRA,
513
-            EE_GLOBAL_ASSETS_URL . 'scripts/jquery.validate.additional-methods.min.js',
514
-            array(CoreAssetManager::JS_HANDLE_JQUERY_VALIDATE)
515
-        )
516
-        ->setVersion('1.15.0');
517
-    }
518
-
519
-
520
-    /**
521
-     * accounting.js for performing client-side calculations
522
-     *
523
-     * @since 4.9.62.p
524
-     * @throws DomainException
525
-     * @throws DuplicateCollectionIdentifierException
526
-     * @throws InvalidDataTypeException
527
-     * @throws InvalidEntityException
528
-     */
529
-    private function loadAccountingJs()
530
-    {
531
-        //accounting.js library
532
-        // @link http://josscrowcroft.github.io/accounting.js/
533
-        $this->addJavascript(
534
-            CoreAssetManager::JS_HANDLE_ACCOUNTING_CORE,
535
-            EE_THIRD_PARTY_URL . 'accounting/accounting.js',
536
-            array(CoreAssetManager::JS_HANDLE_UNDERSCORE)
537
-        )
538
-        ->setVersion('0.3.2');
539
-
540
-        $this->addJavascript(
541
-            CoreAssetManager::JS_HANDLE_ACCOUNTING,
542
-            EE_GLOBAL_ASSETS_URL . 'scripts/ee-accounting-config.js',
543
-            array(CoreAssetManager::JS_HANDLE_ACCOUNTING_CORE)
544
-        )
545
-        ->setInlineDataCallback(
546
-            function () {
547
-                 wp_localize_script(
548
-                     CoreAssetManager::JS_HANDLE_ACCOUNTING,
549
-                     'EE_ACCOUNTING_CFG',
550
-                     $this->getAccountingSettings()
551
-                 );
552
-            }
553
-        )
554
-        ->setVersion();
555
-    }
556
-
557
-
558
-    /**
559
-     * registers assets for cleaning your ears
560
-     *
561
-     * @param JavascriptAsset $script
562
-     */
563
-    public function loadQtipJs(JavascriptAsset $script)
564
-    {
565
-        // qtip is turned OFF by default, but prior to the wp_enqueue_scripts hook,
566
-        // can be turned back on again via: add_filter('FHEE_load_qtip', '__return_true' );
567
-        if (
568
-            $script->handle() === CoreAssetManager::JS_HANDLE_WP_PLUGINS_PAGE
569
-            && apply_filters('FHEE_load_qtip', false)
570
-        ) {
571
-            EEH_Qtip_Loader::instance()->register_and_enqueue();
572
-        }
573
-    }
574
-
575
-
576
-    /**
577
-     * assets that are used in the WordPress admin
578
-     *
579
-     * @since 4.9.62.p
580
-     * @throws DuplicateCollectionIdentifierException
581
-     * @throws InvalidDataTypeException
582
-     * @throws InvalidEntityException
583
-     */
584
-    private function registerAdminAssets()
585
-    {
586
-        $this->addJavascript(
587
-            CoreAssetManager::JS_HANDLE_WP_PLUGINS_PAGE,
588
-            $this->registry->getJsUrl($this->domain->assetNamespace(), 'wp-plugins-page'),
589
-            array(
590
-                CoreAssetManager::JS_HANDLE_JQUERY,
591
-                CoreAssetManager::JS_HANDLE_VENDOR,
592
-            )
593
-        )
594
-        ->setRequiresTranslation();
595
-
596
-        $this->addStylesheet(
597
-            CoreAssetManager::JS_HANDLE_WP_PLUGINS_PAGE,
598
-            $this->registry->getCssUrl($this->domain->assetNamespace(), 'wp-plugins-page')
599
-        );
600
-    }
90
+	const JS_HANDLE_WP_PLUGINS_PAGE = 'ee-wp-plugins-page';
91
+
92
+	// EE CSS assets handles
93
+	const CSS_HANDLE_DEFAULT = 'espresso_default';
94
+
95
+	const CSS_HANDLE_CUSTOM = 'espresso_custom_css';
96
+
97
+	const CSS_HANDLE_COMPONENTS = 'eventespresso-components';
98
+
99
+	const CSS_HANDLE_CORE_CSS_DEFAULT = 'eventespresso-core-css-default';
100
+
101
+	/**
102
+	 * @var EE_Currency_Config $currency_config
103
+	 */
104
+	protected $currency_config;
105
+
106
+	/**
107
+	 * @var EE_Template_Config $template_config
108
+	 */
109
+	protected $template_config;
110
+
111
+
112
+	/**
113
+	 * CoreAssetRegister constructor.
114
+	 *
115
+	 * @param AssetCollection    $assets
116
+	 * @param EE_Currency_Config $currency_config
117
+	 * @param EE_Template_Config $template_config
118
+	 * @param DomainInterface    $domain
119
+	 * @param Registry           $registry
120
+	 */
121
+	public function __construct(
122
+		AssetCollection $assets,
123
+		EE_Currency_Config $currency_config,
124
+		EE_Template_Config $template_config,
125
+		DomainInterface $domain,
126
+		Registry $registry
127
+	) {
128
+		$this->currency_config = $currency_config;
129
+		$this->template_config = $template_config;
130
+		parent::__construct($domain, $assets, $registry);
131
+	}
132
+
133
+
134
+	/**
135
+	 * @since 4.9.62.p
136
+	 * @throws DomainException
137
+	 * @throws DuplicateCollectionIdentifierException
138
+	 * @throws InvalidArgumentException
139
+	 * @throws InvalidDataTypeException
140
+	 * @throws InvalidEntityException
141
+	 * @throws InvalidInterfaceException
142
+	 */
143
+	public function addAssets()
144
+	{
145
+		$this->addJavascriptFiles();
146
+		$this->addStylesheetFiles();
147
+	}
148
+
149
+
150
+	/**
151
+	 * @since 4.9.62.p
152
+	 * @throws DomainException
153
+	 * @throws DuplicateCollectionIdentifierException
154
+	 * @throws InvalidArgumentException
155
+	 * @throws InvalidDataTypeException
156
+	 * @throws InvalidEntityException
157
+	 * @throws InvalidInterfaceException
158
+	 */
159
+	public function addJavascriptFiles()
160
+	{
161
+		$this->loadCoreJs();
162
+		$this->loadJqueryValidate();
163
+		$this->loadAccountingJs();
164
+		add_action(
165
+			'AHEE__EventEspresso_core_services_assets_Registry__registerScripts__before_script',
166
+			array($this, 'loadQtipJs')
167
+		);
168
+		$this->registerAdminAssets();
169
+	}
170
+
171
+
172
+	/**
173
+	 * @since 4.9.62.p
174
+	 * @throws DuplicateCollectionIdentifierException
175
+	 * @throws InvalidDataTypeException
176
+	 * @throws InvalidEntityException
177
+	 */
178
+	public function addStylesheetFiles()
179
+	{
180
+		$this->loadCoreCss();
181
+	}
182
+
183
+
184
+	/**
185
+	 * core default javascript
186
+	 *
187
+	 * @since 4.9.62.p
188
+	 * @throws DomainException
189
+	 * @throws DuplicateCollectionIdentifierException
190
+	 * @throws InvalidArgumentException
191
+	 * @throws InvalidDataTypeException
192
+	 * @throws InvalidEntityException
193
+	 * @throws InvalidInterfaceException
194
+	 */
195
+	private function loadCoreJs()
196
+	{
197
+		// conditionally load third-party libraries that WP core MIGHT have.
198
+		$this->registerWpAssets();
199
+
200
+		$this->addJavascript(
201
+			CoreAssetManager::JS_HANDLE_MANIFEST,
202
+			$this->registry->getJsUrl($this->domain->assetNamespace(), 'manifest')
203
+		);
204
+
205
+		$this->addJavascript(
206
+			CoreAssetManager::JS_HANDLE_JS_CORE,
207
+			$this->registry->getJsUrl($this->domain->assetNamespace(), 'eejs'),
208
+			array(CoreAssetManager::JS_HANDLE_MANIFEST)
209
+		)
210
+		->setHasInlineData();
211
+
212
+		$this->addJavascript(
213
+			CoreAssetManager::JS_HANDLE_VENDOR,
214
+			$this->registry->getJsUrl($this->domain->assetNamespace(), 'vendor'),
215
+			array(
216
+				CoreAssetManager::JS_HANDLE_JS_CORE,
217
+				CoreAssetManager::JS_HANDLE_REACT,
218
+				CoreAssetManager::JS_HANDLE_REACT_DOM,
219
+				CoreAssetManager::JS_HANDLE_LODASH,
220
+			)
221
+		);
222
+
223
+		$this->addJavascript(
224
+			CoreAssetManager::JS_HANDLE_VALIDATORS,
225
+			$this->registry->getJsUrl($this->domain->assetNamespace(), 'validators')
226
+		)->setRequiresTranslation();
227
+
228
+		$this->addJavascript(
229
+			CoreAssetManager::JS_HANDLE_HELPERS,
230
+			$this->registry->getJsUrl($this->domain->assetNamespace(), 'helpers'),
231
+			array(
232
+				CoreAssetManager::JS_HANDLE_VALIDATORS
233
+			)
234
+		)->setRequiresTranslation();
235
+
236
+		$this->addJavascript(
237
+			CoreAssetManager::JS_HANDLE_MODEL,
238
+			$this->registry->getJsUrl($this->domain->assetNamespace(), 'model'),
239
+			array(
240
+				CoreAssetManager::JS_HANDLE_HELPERS,
241
+				CoreAssetManager::JS_HANDLE_VALUE_OBJECTS,
242
+			)
243
+		)->setRequiresTranslation();
244
+
245
+		$this->addJavascript(
246
+			CoreAssetManager::JS_HANDLE_VALUE_OBJECTS,
247
+			$this->registry->getJsUrl($this->domain->assetNamespace(), 'valueObjects'),
248
+			array(
249
+				CoreAssetManager::JS_HANDLE_VALIDATORS,
250
+				CoreAssetManager::JS_HANDLE_HELPERS,
251
+			)
252
+		)->setRequiresTranslation();
253
+
254
+		$this->addJavascript(
255
+			CoreAssetManager::JS_HANDLE_DATA_STORES,
256
+			$this->registry->getJsUrl($this->domain->assetNamespace(), 'data-stores'),
257
+			array(
258
+				CoreAssetManager::JS_HANDLE_VENDOR,
259
+				'wp-data',
260
+				'wp-api-fetch',
261
+				CoreAssetManager::JS_HANDLE_VALUE_OBJECTS,
262
+				CoreAssetManager::JS_HANDLE_MODEL,
263
+			)
264
+		)
265
+			 ->setRequiresTranslation()
266
+			 ->setInlineDataCallback(
267
+				 function() {
268
+					 wp_add_inline_script(
269
+						 CoreAssetManager::JS_HANDLE_DATA_STORES,
270
+						 is_admin()
271
+							 ? 'wp.apiFetch.use( eejs.middleWares.apiFetch.capsMiddleware( eejs.middleWares.apiFetch.CONTEXT_CAPS_EDIT ) )'
272
+							 : 'wp.apiFetch.use( eejs.middleWares.apiFetch.capsMiddleware )'
273
+					 );
274
+				 }
275
+			 );
276
+
277
+		$this->addJavascript(
278
+			CoreAssetManager::JS_HANDLE_HOCS,
279
+			$this->registry->getJsUrl($this->domain->assetNamespace(), 'hocs'),
280
+			array(
281
+				CoreAssetManager::JS_HANDLE_DATA_STORES,
282
+				CoreAssetManager::JS_HANDLE_VALUE_OBJECTS,
283
+				'wp-components',
284
+			)
285
+		)->setRequiresTranslation();
286
+
287
+		$this->addJavascript(
288
+			CoreAssetManager::JS_HANDLE_COMPONENTS,
289
+			$this->registry->getJsUrl($this->domain->assetNamespace(), 'components'),
290
+			array(
291
+				CoreAssetManager::JS_HANDLE_DATA_STORES,
292
+				CoreAssetManager::JS_HANDLE_VALUE_OBJECTS,
293
+				'wp-components',
294
+			)
295
+		)
296
+		->setRequiresTranslation();
297
+
298
+		$this->addJavascript(
299
+			CoreAssetManager::JS_HANDLE_EDITOR_HOCS,
300
+			$this->registry->getJsUrl($this->domain->assetNamespace(), 'editor-hocs'),
301
+			array(
302
+				CoreAssetManager::JS_HANDLE_COMPONENTS
303
+			)
304
+		)->setRequiresTranslation();
305
+
306
+		$this->registry->addData('eejs_api_nonce', wp_create_nonce('wp_rest'));
307
+		$this->registry->addData(
308
+			'paths',
309
+			array(
310
+				'base_rest_route' => rest_url(),
311
+				'rest_route' => rest_url('ee/v4.8.36/'),
312
+				'collection_endpoints' => EED_Core_Rest_Api::getCollectionRoutesIndexedByModelName(),
313
+				'primary_keys' => EED_Core_Rest_Api::getPrimaryKeyNamesIndexedByModelName(),
314
+				'site_url' => site_url('/'),
315
+				'admin_url' => admin_url('/'),
316
+			)
317
+		);
318
+		// Event Espresso brand name
319
+		$this->registry->addData('brandName', Domain::brandName());
320
+		/** site formatting values **/
321
+		$this->registry->addData(
322
+			'site_formats',
323
+			array(
324
+				'date_formats' => EEH_DTT_Helper::convert_php_to_js_and_moment_date_formats()
325
+			)
326
+		);
327
+		/** currency data **/
328
+		$this->registry->addData(
329
+			'currency_config',
330
+			$this->getCurrencySettings()
331
+		);
332
+		/** site timezone */
333
+		$this->registry->addData(
334
+			'default_timezone',
335
+			array(
336
+				'pretty' => EEH_DTT_Helper::get_timezone_string_for_display(),
337
+				'string' => get_option('timezone_string'),
338
+				'offset' => EEH_DTT_Helper::get_site_timezone_gmt_offset(),
339
+			)
340
+		);
341
+		/** site locale (user locale if user logged in) */
342
+		$this->registry->addData(
343
+			'locale',
344
+			array(
345
+				'user' => get_user_locale(),
346
+				'site' => get_locale()
347
+			)
348
+		);
349
+
350
+		$this->addJavascript(
351
+			CoreAssetManager::JS_HANDLE_CORE,
352
+			EE_GLOBAL_ASSETS_URL . 'scripts/espresso_core.js',
353
+			array(CoreAssetManager::JS_HANDLE_JQUERY)
354
+		)
355
+		->setInlineDataCallback(
356
+			function () {
357
+				wp_localize_script(
358
+					CoreAssetManager::JS_HANDLE_CORE,
359
+					CoreAssetManager::JS_HANDLE_I18N,
360
+					EE_Registry::$i18n_js_strings
361
+				);
362
+			}
363
+		);
364
+	}
365
+
366
+
367
+	/**
368
+	 * Registers vendor files that are bundled with a later version WP but might not be for the current version of
369
+	 * WordPress in the running environment.
370
+	 *
371
+	 * @throws DuplicateCollectionIdentifierException
372
+	 * @throws InvalidDataTypeException
373
+	 * @throws InvalidEntityException
374
+	 * @throws DomainException
375
+	 * @since 4.9.71.p
376
+	 */
377
+	private function registerWpAssets()
378
+	{
379
+		global $wp_version;
380
+		if (version_compare($wp_version, '5.0.beta', '>=')) {
381
+			return;
382
+		}
383
+		$this->addVendorJavascript(CoreAssetManager::JS_HANDLE_REACT)
384
+			->setVersion('16.6.0');
385
+		$this->addVendorJavascript(
386
+			CoreAssetManager::JS_HANDLE_REACT_DOM,
387
+			array(CoreAssetManager::JS_HANDLE_REACT)
388
+		)->setVersion('16.6.0');
389
+		$this->addVendorJavascript(CoreAssetManager::JS_HANDLE_LODASH)
390
+			->setInlineDataCallback(
391
+				function() {
392
+					wp_add_inline_script(
393
+						CoreAssetManager::JS_HANDLE_LODASH,
394
+						'window.lodash = _.noConflict();'
395
+					);
396
+				}
397
+			)
398
+			->setVersion('4.17.11');
399
+	}
400
+
401
+
402
+	/**
403
+	 * Returns configuration data for the accounting-js library.
404
+	 * @since 4.9.71.p
405
+	 * @return array
406
+	 */
407
+	private function getAccountingSettings() {
408
+		return array(
409
+			'currency' => array(
410
+				'symbol'    => $this->currency_config->sign,
411
+				'format'    => array(
412
+					'pos'  => $this->currency_config->sign_b4 ? '%s%v' : '%v%s',
413
+					'neg'  => $this->currency_config->sign_b4 ? '- %s%v' : '- %v%s',
414
+					'zero' => $this->currency_config->sign_b4 ? '%s--' : '--%s',
415
+				),
416
+				'decimal'   => $this->currency_config->dec_mrk,
417
+				'thousand'  => $this->currency_config->thsnds,
418
+				'precision' => $this->currency_config->dec_plc,
419
+			),
420
+			'number'   => array(
421
+				'precision' => $this->currency_config->dec_plc,
422
+				'thousand'  => $this->currency_config->thsnds,
423
+				'decimal'   => $this->currency_config->dec_mrk,
424
+			),
425
+		);
426
+	}
427
+
428
+
429
+	/**
430
+	 * Returns configuration data for the js Currency VO.
431
+	 * @since 4.9.71.p
432
+	 * @return array
433
+	 */
434
+	private function getCurrencySettings()
435
+	{
436
+		return array(
437
+			'code' => $this->currency_config->code,
438
+			'singularLabel' => $this->currency_config->name,
439
+			'pluralLabel' => $this->currency_config->plural,
440
+			'sign' => $this->currency_config->sign,
441
+			'signB4' => $this->currency_config->sign_b4,
442
+			'decimalPlaces' => $this->currency_config->dec_plc,
443
+			'decimalMark' => $this->currency_config->dec_mrk,
444
+			'thousandsSeparator' => $this->currency_config->thsnds,
445
+		);
446
+	}
447
+
448
+
449
+	/**
450
+	 * @since 4.9.62.p
451
+	 * @throws DuplicateCollectionIdentifierException
452
+	 * @throws InvalidDataTypeException
453
+	 * @throws InvalidEntityException
454
+	 */
455
+	private function loadCoreCss()
456
+	{
457
+		if ($this->template_config->enable_default_style && ! is_admin()) {
458
+			$this->addStylesheet(
459
+				CoreAssetManager::CSS_HANDLE_DEFAULT,
460
+				is_readable(EVENT_ESPRESSO_UPLOAD_DIR . 'css/style.css')
461
+					? EVENT_ESPRESSO_UPLOAD_DIR . 'css/espresso_default.css'
462
+					: EE_GLOBAL_ASSETS_URL . 'css/espresso_default.css',
463
+				array('dashicons')
464
+			);
465
+			//Load custom style sheet if available
466
+			if ($this->template_config->custom_style_sheet !== null) {
467
+				$this->addStylesheet(
468
+					CoreAssetManager::CSS_HANDLE_CUSTOM,
469
+					EVENT_ESPRESSO_UPLOAD_URL . 'css/' . $this->template_config->custom_style_sheet,
470
+					array(CoreAssetManager::CSS_HANDLE_DEFAULT)
471
+				);
472
+			}
473
+		}
474
+		$this->addStylesheet(
475
+			CoreAssetManager::CSS_HANDLE_CORE_CSS_DEFAULT,
476
+			$this->registry->getCssUrl(
477
+				$this->domain->assetNamespace(),
478
+				'core-default-theme'
479
+			),
480
+			['dashicons']
481
+		);
482
+		$this->addStylesheet(
483
+			CoreAssetManager::CSS_HANDLE_COMPONENTS,
484
+			$this->registry->getCssUrl(
485
+				$this->domain->assetNamespace(),
486
+				'components'
487
+			),
488
+			[CoreAssetManager::CSS_HANDLE_CORE_CSS_DEFAULT]
489
+		);
490
+	}
491
+
492
+
493
+	/**
494
+	 * jQuery Validate for form validation
495
+	 *
496
+	 * @since 4.9.62.p
497
+	 * @throws DomainException
498
+	 * @throws DuplicateCollectionIdentifierException
499
+	 * @throws InvalidDataTypeException
500
+	 * @throws InvalidEntityException
501
+	 */
502
+	private function loadJqueryValidate()
503
+	{
504
+		$this->addJavascript(
505
+			CoreAssetManager::JS_HANDLE_JQUERY_VALIDATE,
506
+			EE_GLOBAL_ASSETS_URL . 'scripts/jquery.validate.min.js',
507
+			array(CoreAssetManager::JS_HANDLE_JQUERY)
508
+		)
509
+		->setVersion('1.15.0');
510
+
511
+		$this->addJavascript(
512
+			CoreAssetManager::JS_HANDLE_JQUERY_VALIDATE_EXTRA,
513
+			EE_GLOBAL_ASSETS_URL . 'scripts/jquery.validate.additional-methods.min.js',
514
+			array(CoreAssetManager::JS_HANDLE_JQUERY_VALIDATE)
515
+		)
516
+		->setVersion('1.15.0');
517
+	}
518
+
519
+
520
+	/**
521
+	 * accounting.js for performing client-side calculations
522
+	 *
523
+	 * @since 4.9.62.p
524
+	 * @throws DomainException
525
+	 * @throws DuplicateCollectionIdentifierException
526
+	 * @throws InvalidDataTypeException
527
+	 * @throws InvalidEntityException
528
+	 */
529
+	private function loadAccountingJs()
530
+	{
531
+		//accounting.js library
532
+		// @link http://josscrowcroft.github.io/accounting.js/
533
+		$this->addJavascript(
534
+			CoreAssetManager::JS_HANDLE_ACCOUNTING_CORE,
535
+			EE_THIRD_PARTY_URL . 'accounting/accounting.js',
536
+			array(CoreAssetManager::JS_HANDLE_UNDERSCORE)
537
+		)
538
+		->setVersion('0.3.2');
539
+
540
+		$this->addJavascript(
541
+			CoreAssetManager::JS_HANDLE_ACCOUNTING,
542
+			EE_GLOBAL_ASSETS_URL . 'scripts/ee-accounting-config.js',
543
+			array(CoreAssetManager::JS_HANDLE_ACCOUNTING_CORE)
544
+		)
545
+		->setInlineDataCallback(
546
+			function () {
547
+				 wp_localize_script(
548
+					 CoreAssetManager::JS_HANDLE_ACCOUNTING,
549
+					 'EE_ACCOUNTING_CFG',
550
+					 $this->getAccountingSettings()
551
+				 );
552
+			}
553
+		)
554
+		->setVersion();
555
+	}
556
+
557
+
558
+	/**
559
+	 * registers assets for cleaning your ears
560
+	 *
561
+	 * @param JavascriptAsset $script
562
+	 */
563
+	public function loadQtipJs(JavascriptAsset $script)
564
+	{
565
+		// qtip is turned OFF by default, but prior to the wp_enqueue_scripts hook,
566
+		// can be turned back on again via: add_filter('FHEE_load_qtip', '__return_true' );
567
+		if (
568
+			$script->handle() === CoreAssetManager::JS_HANDLE_WP_PLUGINS_PAGE
569
+			&& apply_filters('FHEE_load_qtip', false)
570
+		) {
571
+			EEH_Qtip_Loader::instance()->register_and_enqueue();
572
+		}
573
+	}
574
+
575
+
576
+	/**
577
+	 * assets that are used in the WordPress admin
578
+	 *
579
+	 * @since 4.9.62.p
580
+	 * @throws DuplicateCollectionIdentifierException
581
+	 * @throws InvalidDataTypeException
582
+	 * @throws InvalidEntityException
583
+	 */
584
+	private function registerAdminAssets()
585
+	{
586
+		$this->addJavascript(
587
+			CoreAssetManager::JS_HANDLE_WP_PLUGINS_PAGE,
588
+			$this->registry->getJsUrl($this->domain->assetNamespace(), 'wp-plugins-page'),
589
+			array(
590
+				CoreAssetManager::JS_HANDLE_JQUERY,
591
+				CoreAssetManager::JS_HANDLE_VENDOR,
592
+			)
593
+		)
594
+		->setRequiresTranslation();
595
+
596
+		$this->addStylesheet(
597
+			CoreAssetManager::JS_HANDLE_WP_PLUGINS_PAGE,
598
+			$this->registry->getCssUrl($this->domain->assetNamespace(), 'wp-plugins-page')
599
+		);
600
+	}
601 601
 }
Please login to merge, or discard this patch.
registration_form/help_tabs/registration_form_add_question.help_tab.php 2 patches
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -25,8 +25,8 @@
 block discarded – undo
25 25
 <?php esc_html_e('This shows the type of question. Available options are Text, Textarea, Checkboxes, Radio Buttons, Dropdown, State/Province Dropdown, Country Dropdown, and Date Picker.', 'event_espresso'); ?>
26 26
 </li>
27 27
 <li>
28
-<strong><?php esc_html_e('Answer Options (for applicable question types)', 'event_espresso');?></strong><br/>
29
-<?php esc_html_e('Values do not allow any HTML, however, descriptions do allow HTML.', 'event_espresso');?>
28
+<strong><?php esc_html_e('Answer Options (for applicable question types)', 'event_espresso'); ?></strong><br/>
29
+<?php esc_html_e('Values do not allow any HTML, however, descriptions do allow HTML.', 'event_espresso'); ?>
30 30
 </li>
31 31
 <li>
32 32
 <strong><?php esc_html_e('Required Question', 'event_espresso'); ?></strong><br />
Please login to merge, or discard this patch.
Indentation   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -4,8 +4,8 @@
 block discarded – undo
4 4
 <p><strong><?php esc_html_e('Add New Question', 'event_espresso'); ?></strong></p>
5 5
 <p>
6 6
 <?php printf(
7
-    esc_html__('This page allows you to add a new question for %s.', 'event_espresso'),
8
-    Domain::brandName()
7
+	esc_html__('This page allows you to add a new question for %s.', 'event_espresso'),
8
+	Domain::brandName()
9 9
 ); ?>
10 10
 </p>
11 11
 <ul>
Please login to merge, or discard this patch.