Completed
Branch BUG/escape-localized-variables (bce518)
by
unknown
25:17 queued 17:03
created
core/db_classes/EE_Price.class.php 1 patch
Indentation   +285 added lines, -285 removed lines patch added patch discarded remove patch
@@ -10,289 +10,289 @@
 block discarded – undo
10 10
 class EE_Price extends EE_Soft_Delete_Base_Class
11 11
 {
12 12
 
13
-    /**
14
-     * @param array  $props_n_values          incoming values
15
-     * @param string $timezone                incoming timezone (if not set the timezone set for the website will be
16
-     *                                        used.)
17
-     * @param array  $date_formats            incoming date_formats in an array where the first value is the
18
-     *                                        date_format and the second value is the time format
19
-     * @return EE_Price
20
-     */
21
-    public static function new_instance($props_n_values = array(), $timezone = null, $date_formats = array())
22
-    {
23
-        $has_object = parent::_check_for_object($props_n_values, __CLASS__, $timezone, $date_formats);
24
-        return $has_object ? $has_object : new self($props_n_values, false, $timezone, $date_formats);
25
-    }
26
-
27
-
28
-    /**
29
-     * @param array  $props_n_values  incoming values from the database
30
-     * @param string $timezone        incoming timezone as set by the model.  If not set the timezone for
31
-     *                                the website will be used.
32
-     * @return EE_Price
33
-     */
34
-    public static function new_instance_from_db($props_n_values = array(), $timezone = null)
35
-    {
36
-        return new self($props_n_values, true, $timezone);
37
-    }
38
-
39
-
40
-    /**
41
-     *        Set Price type ID
42
-     *
43
-     * @access        public
44
-     * @param        int $PRT_ID
45
-     */
46
-    public function set_type($PRT_ID = 0)
47
-    {
48
-        $this->set('PRT_ID', $PRT_ID);
49
-    }
50
-
51
-
52
-    /**
53
-     *        Set Price Amount
54
-     *
55
-     * @access        public
56
-     * @param        float $PRC_amount
57
-     */
58
-    public function set_amount($PRC_amount = 0.00)
59
-    {
60
-        $this->set('PRC_amount', $PRC_amount);
61
-    }
62
-
63
-
64
-    /**
65
-     *        Set Price Name
66
-     *
67
-     * @access        public
68
-     * @param        string $PRC_name
69
-     */
70
-    public function set_name($PRC_name = '')
71
-    {
72
-        $this->set('PRC_name', $PRC_name);
73
-    }
74
-
75
-
76
-    /**
77
-     *        Set Price Description
78
-     *
79
-     * @access        public
80
-     * @param        string $PRC_desc
81
-     */
82
-    public function set_description($PRC_desc = '')
83
-    {
84
-        $this->Set('PRC_desc', $PRC_desc);
85
-    }
86
-
87
-
88
-    /**
89
-     *        set is_default
90
-     *
91
-     * @access        public
92
-     * @param        bool $PRC_is_default
93
-     */
94
-    public function set_is_default($PRC_is_default = false)
95
-    {
96
-        $this->set('PRC_is_default', $PRC_is_default);
97
-    }
98
-
99
-
100
-    /**
101
-     *        set deleted
102
-     *
103
-     * @access        public
104
-     * @param        bool $PRC_deleted
105
-     */
106
-    public function set_deleted($PRC_deleted = null)
107
-    {
108
-        $this->set('PRC_deleted', $PRC_deleted);
109
-    }
110
-
111
-
112
-    /**
113
-     *    get Price type
114
-     *
115
-     * @access        public
116
-     * @return        int
117
-     */
118
-    public function type()
119
-    {
120
-        return $this->get('PRT_ID');
121
-    }
122
-
123
-
124
-    /**
125
-     *    get Price Amount
126
-     *
127
-     * @access        public
128
-     * @return        float
129
-     */
130
-    public function amount()
131
-    {
132
-        return $this->get('PRC_amount');
133
-    }
134
-
135
-
136
-    /**
137
-     *    get Price Name
138
-     *
139
-     * @access        public
140
-     * @return        string
141
-     */
142
-    public function name()
143
-    {
144
-        return $this->get('PRC_name');
145
-    }
146
-
147
-
148
-    /**
149
-     *    get Price description
150
-     *
151
-     * @access        public
152
-     * @return        string
153
-     */
154
-    public function desc()
155
-    {
156
-        return $this->get('PRC_desc');
157
-    }
158
-
159
-
160
-    /**
161
-     *    get overrides
162
-     *
163
-     * @access        public
164
-     * @return        int
165
-     */
166
-    public function overrides()
167
-    {
168
-        return $this->get('PRC_overrides');
169
-    }
170
-
171
-
172
-    /**
173
-     *    get order
174
-     *
175
-     * @access        public
176
-     * @return        int
177
-     */
178
-    public function order()
179
-    {
180
-        return $this->get('PRC_order');
181
-    }
182
-
183
-
184
-    /**
185
-     * get the author of the price
186
-     *
187
-     * @since 4.5.0
188
-     *
189
-     * @return int
190
-     */
191
-    public function wp_user()
192
-    {
193
-        return $this->get('PRC_wp_user');
194
-    }
195
-
196
-
197
-    /**
198
-     *    get is_default
199
-     *
200
-     * @access        public
201
-     * @return        bool
202
-     */
203
-    public function is_default()
204
-    {
205
-        return $this->get('PRC_is_default');
206
-    }
207
-
208
-
209
-    /**
210
-     *    get deleted
211
-     *
212
-     * @access        public
213
-     * @return        bool
214
-     */
215
-    public function deleted()
216
-    {
217
-        return $this->get('PRC_deleted');
218
-    }
219
-
220
-
221
-    /**
222
-     * @return bool
223
-     */
224
-    public function parent()
225
-    {
226
-        return $this->get('PRC_parent');
227
-    }
228
-
229
-
230
-    // some helper methods for getting info on the price_type for this price
231
-
232
-    /**
233
-     * return whether the price is a base price or not
234
-     *
235
-     * @return boolean
236
-     */
237
-    public function is_base_price()
238
-    {
239
-        $price_type = $this->type_obj();
240
-        return $price_type->base_type() === 1;
241
-    }
242
-
243
-
244
-    /**
245
-     *
246
-     * @return EE_Price_Type
247
-     */
248
-    public function type_obj()
249
-    {
250
-        return $this->get_first_related('Price_Type');
251
-    }
252
-
253
-
254
-    /**
255
-     * Simply indicates whether this price increases or decreases the total
256
-     *
257
-     * @return boolean true = discount, otherwise adds to the total
258
-     */
259
-    public function is_discount()
260
-    {
261
-        $price_type = $this->type_obj();
262
-        return $price_type->is_discount();
263
-    }
264
-
265
-
266
-    /**
267
-     * whether the price is a percentage or not
268
-     *
269
-     * @return boolean
270
-     */
271
-    public function is_percent()
272
-    {
273
-        $price_type = $this->type_obj();
274
-        return $price_type->get('PRT_is_percent');
275
-    }
276
-
277
-
278
-    /**
279
-     * return pretty price dependant on whether its a dollar or percent.
280
-     *
281
-     * @since 4.4.0
282
-     *
283
-     * @return string
284
-     */
285
-    public function pretty_price()
286
-    {
287
-        return ! $this->is_percent() ? $this->get_pretty('PRC_amount') : $this->get('PRC_amount') . '%';
288
-    }
289
-
290
-
291
-    /**
292
-     * @return mixed
293
-     */
294
-    public function get_price_without_currency_symbol()
295
-    {
296
-        return str_replace(EE_Registry::instance()->CFG->currency->sign, '', $this->get_pretty('PRC_amount'));
297
-    }
13
+	/**
14
+	 * @param array  $props_n_values          incoming values
15
+	 * @param string $timezone                incoming timezone (if not set the timezone set for the website will be
16
+	 *                                        used.)
17
+	 * @param array  $date_formats            incoming date_formats in an array where the first value is the
18
+	 *                                        date_format and the second value is the time format
19
+	 * @return EE_Price
20
+	 */
21
+	public static function new_instance($props_n_values = array(), $timezone = null, $date_formats = array())
22
+	{
23
+		$has_object = parent::_check_for_object($props_n_values, __CLASS__, $timezone, $date_formats);
24
+		return $has_object ? $has_object : new self($props_n_values, false, $timezone, $date_formats);
25
+	}
26
+
27
+
28
+	/**
29
+	 * @param array  $props_n_values  incoming values from the database
30
+	 * @param string $timezone        incoming timezone as set by the model.  If not set the timezone for
31
+	 *                                the website will be used.
32
+	 * @return EE_Price
33
+	 */
34
+	public static function new_instance_from_db($props_n_values = array(), $timezone = null)
35
+	{
36
+		return new self($props_n_values, true, $timezone);
37
+	}
38
+
39
+
40
+	/**
41
+	 *        Set Price type ID
42
+	 *
43
+	 * @access        public
44
+	 * @param        int $PRT_ID
45
+	 */
46
+	public function set_type($PRT_ID = 0)
47
+	{
48
+		$this->set('PRT_ID', $PRT_ID);
49
+	}
50
+
51
+
52
+	/**
53
+	 *        Set Price Amount
54
+	 *
55
+	 * @access        public
56
+	 * @param        float $PRC_amount
57
+	 */
58
+	public function set_amount($PRC_amount = 0.00)
59
+	{
60
+		$this->set('PRC_amount', $PRC_amount);
61
+	}
62
+
63
+
64
+	/**
65
+	 *        Set Price Name
66
+	 *
67
+	 * @access        public
68
+	 * @param        string $PRC_name
69
+	 */
70
+	public function set_name($PRC_name = '')
71
+	{
72
+		$this->set('PRC_name', $PRC_name);
73
+	}
74
+
75
+
76
+	/**
77
+	 *        Set Price Description
78
+	 *
79
+	 * @access        public
80
+	 * @param        string $PRC_desc
81
+	 */
82
+	public function set_description($PRC_desc = '')
83
+	{
84
+		$this->Set('PRC_desc', $PRC_desc);
85
+	}
86
+
87
+
88
+	/**
89
+	 *        set is_default
90
+	 *
91
+	 * @access        public
92
+	 * @param        bool $PRC_is_default
93
+	 */
94
+	public function set_is_default($PRC_is_default = false)
95
+	{
96
+		$this->set('PRC_is_default', $PRC_is_default);
97
+	}
98
+
99
+
100
+	/**
101
+	 *        set deleted
102
+	 *
103
+	 * @access        public
104
+	 * @param        bool $PRC_deleted
105
+	 */
106
+	public function set_deleted($PRC_deleted = null)
107
+	{
108
+		$this->set('PRC_deleted', $PRC_deleted);
109
+	}
110
+
111
+
112
+	/**
113
+	 *    get Price type
114
+	 *
115
+	 * @access        public
116
+	 * @return        int
117
+	 */
118
+	public function type()
119
+	{
120
+		return $this->get('PRT_ID');
121
+	}
122
+
123
+
124
+	/**
125
+	 *    get Price Amount
126
+	 *
127
+	 * @access        public
128
+	 * @return        float
129
+	 */
130
+	public function amount()
131
+	{
132
+		return $this->get('PRC_amount');
133
+	}
134
+
135
+
136
+	/**
137
+	 *    get Price Name
138
+	 *
139
+	 * @access        public
140
+	 * @return        string
141
+	 */
142
+	public function name()
143
+	{
144
+		return $this->get('PRC_name');
145
+	}
146
+
147
+
148
+	/**
149
+	 *    get Price description
150
+	 *
151
+	 * @access        public
152
+	 * @return        string
153
+	 */
154
+	public function desc()
155
+	{
156
+		return $this->get('PRC_desc');
157
+	}
158
+
159
+
160
+	/**
161
+	 *    get overrides
162
+	 *
163
+	 * @access        public
164
+	 * @return        int
165
+	 */
166
+	public function overrides()
167
+	{
168
+		return $this->get('PRC_overrides');
169
+	}
170
+
171
+
172
+	/**
173
+	 *    get order
174
+	 *
175
+	 * @access        public
176
+	 * @return        int
177
+	 */
178
+	public function order()
179
+	{
180
+		return $this->get('PRC_order');
181
+	}
182
+
183
+
184
+	/**
185
+	 * get the author of the price
186
+	 *
187
+	 * @since 4.5.0
188
+	 *
189
+	 * @return int
190
+	 */
191
+	public function wp_user()
192
+	{
193
+		return $this->get('PRC_wp_user');
194
+	}
195
+
196
+
197
+	/**
198
+	 *    get is_default
199
+	 *
200
+	 * @access        public
201
+	 * @return        bool
202
+	 */
203
+	public function is_default()
204
+	{
205
+		return $this->get('PRC_is_default');
206
+	}
207
+
208
+
209
+	/**
210
+	 *    get deleted
211
+	 *
212
+	 * @access        public
213
+	 * @return        bool
214
+	 */
215
+	public function deleted()
216
+	{
217
+		return $this->get('PRC_deleted');
218
+	}
219
+
220
+
221
+	/**
222
+	 * @return bool
223
+	 */
224
+	public function parent()
225
+	{
226
+		return $this->get('PRC_parent');
227
+	}
228
+
229
+
230
+	// some helper methods for getting info on the price_type for this price
231
+
232
+	/**
233
+	 * return whether the price is a base price or not
234
+	 *
235
+	 * @return boolean
236
+	 */
237
+	public function is_base_price()
238
+	{
239
+		$price_type = $this->type_obj();
240
+		return $price_type->base_type() === 1;
241
+	}
242
+
243
+
244
+	/**
245
+	 *
246
+	 * @return EE_Price_Type
247
+	 */
248
+	public function type_obj()
249
+	{
250
+		return $this->get_first_related('Price_Type');
251
+	}
252
+
253
+
254
+	/**
255
+	 * Simply indicates whether this price increases or decreases the total
256
+	 *
257
+	 * @return boolean true = discount, otherwise adds to the total
258
+	 */
259
+	public function is_discount()
260
+	{
261
+		$price_type = $this->type_obj();
262
+		return $price_type->is_discount();
263
+	}
264
+
265
+
266
+	/**
267
+	 * whether the price is a percentage or not
268
+	 *
269
+	 * @return boolean
270
+	 */
271
+	public function is_percent()
272
+	{
273
+		$price_type = $this->type_obj();
274
+		return $price_type->get('PRT_is_percent');
275
+	}
276
+
277
+
278
+	/**
279
+	 * return pretty price dependant on whether its a dollar or percent.
280
+	 *
281
+	 * @since 4.4.0
282
+	 *
283
+	 * @return string
284
+	 */
285
+	public function pretty_price()
286
+	{
287
+		return ! $this->is_percent() ? $this->get_pretty('PRC_amount') : $this->get('PRC_amount') . '%';
288
+	}
289
+
290
+
291
+	/**
292
+	 * @return mixed
293
+	 */
294
+	public function get_price_without_currency_symbol()
295
+	{
296
+		return str_replace(EE_Registry::instance()->CFG->currency->sign, '', $this->get_pretty('PRC_amount'));
297
+	}
298 298
 }
Please login to merge, or discard this patch.
admin_pages/registrations/Registrations_Admin_Page.core.php 2 patches
Indentation   +3690 added lines, -3690 removed lines patch added patch discarded remove patch
@@ -18,2227 +18,2227 @@  discard block
 block discarded – undo
18 18
 class Registrations_Admin_Page extends EE_Admin_Page_CPT
19 19
 {
20 20
 
21
-    /**
22
-     * @var EE_Registration
23
-     */
24
-    private $_registration;
25
-
26
-    /**
27
-     * @var EE_Event
28
-     */
29
-    private $_reg_event;
30
-
31
-    /**
32
-     * @var EE_Session
33
-     */
34
-    private $_session;
35
-
36
-    private static $_reg_status;
37
-
38
-    /**
39
-     * Form for displaying the custom questions for this registration.
40
-     * This gets used a few times throughout the request so its best to cache it
41
-     *
42
-     * @var EE_Registration_Custom_Questions_Form
43
-     */
44
-    protected $_reg_custom_questions_form = null;
45
-
46
-    /**
47
-     * @var EEM_Registration $registration_model
48
-     */
49
-    private $registration_model;
50
-
51
-    /**
52
-     * @var EEM_Attendee $attendee_model
53
-     */
54
-    private $attendee_model;
55
-
56
-    /**
57
-     * @var EEM_Event $event_model
58
-     */
59
-    private $event_model;
60
-
61
-    /**
62
-     * @var EEM_Status $status_model
63
-     */
64
-    private $status_model;
65
-
66
-
67
-    /**
68
-     * @param bool $routing
69
-     * @throws EE_Error
70
-     * @throws InvalidArgumentException
71
-     * @throws InvalidDataTypeException
72
-     * @throws InvalidInterfaceException
73
-     * @throws ReflectionException
74
-     */
75
-    public function __construct($routing = true)
76
-    {
77
-        parent::__construct($routing);
78
-        add_action('wp_loaded', array($this, 'wp_loaded'));
79
-    }
80
-
81
-    /**
82
-     * @return EEM_Registration
83
-     * @throws InvalidArgumentException
84
-     * @throws InvalidDataTypeException
85
-     * @throws InvalidInterfaceException
86
-     * @since $VID:$
87
-     */
88
-    protected function getRegistrationModel()
89
-    {
90
-        if (! $this->registration_model instanceof EEM_Registration) {
91
-            $this->registration_model = $this->getLoader()->getShared('EEM_Registration');
92
-        }
93
-        return $this->registration_model;
94
-    }
95
-
96
-    /**
97
-     * @return EEM_Attendee
98
-     * @throws InvalidArgumentException
99
-     * @throws InvalidDataTypeException
100
-     * @throws InvalidInterfaceException
101
-     * @since $VID:$
102
-     */
103
-    protected function getAttendeeModel()
104
-    {
105
-        if (! $this->attendee_model instanceof EEM_Attendee) {
106
-            $this->attendee_model = $this->getLoader()->getShared('EEM_Attendee');
107
-        }
108
-        return $this->attendee_model;
109
-    }
110
-
111
-
112
-    /**
113
-     * @return EEM_Event
114
-     * @throws InvalidArgumentException
115
-     * @throws InvalidDataTypeException
116
-     * @throws InvalidInterfaceException
117
-     * @since $VID:$
118
-     */
119
-    protected function getEventModel()
120
-    {
121
-        if (! $this->event_model instanceof EEM_Event) {
122
-            $this->event_model = $this->getLoader()->getShared('EEM_Event');
123
-        }
124
-        return $this->event_model;
125
-    }
126
-
127
-    /**
128
-     * @return EEM_Status
129
-     * @throws InvalidArgumentException
130
-     * @throws InvalidDataTypeException
131
-     * @throws InvalidInterfaceException
132
-     * @since $VID:$
133
-     */
134
-    protected function getStatusModel()
135
-    {
136
-        if (! $this->status_model instanceof EEM_Status) {
137
-            $this->status_model = $this->getLoader()->getShared('EEM_Status');
138
-        }
139
-        return $this->status_model;
140
-    }
141
-
142
-
143
-    public function wp_loaded()
144
-    {
145
-        // when adding a new registration...
146
-        if (isset($this->_req_data['action']) && $this->_req_data['action'] === 'new_registration') {
147
-            EE_System::do_not_cache();
148
-            if (! isset($this->_req_data['processing_registration'])
149
-                || absint($this->_req_data['processing_registration']) !== 1
150
-            ) {
151
-                // and it's NOT the attendee information reg step
152
-                // force cookie expiration by setting time to last week
153
-                setcookie('ee_registration_added', 0, time() - WEEK_IN_SECONDS, '/');
154
-                // and update the global
155
-                $_COOKIE['ee_registration_added'] = 0;
156
-            }
157
-        }
158
-    }
159
-
160
-
161
-    protected function _init_page_props()
162
-    {
163
-        $this->page_slug = REG_PG_SLUG;
164
-        $this->_admin_base_url = REG_ADMIN_URL;
165
-        $this->_admin_base_path = REG_ADMIN;
166
-        $this->page_label = esc_html__('Registrations', 'event_espresso');
167
-        $this->_cpt_routes = array(
168
-            'add_new_attendee' => 'espresso_attendees',
169
-            'edit_attendee'    => 'espresso_attendees',
170
-            'insert_attendee'  => 'espresso_attendees',
171
-            'update_attendee'  => 'espresso_attendees',
172
-        );
173
-        $this->_cpt_model_names = array(
174
-            'add_new_attendee' => 'EEM_Attendee',
175
-            'edit_attendee'    => 'EEM_Attendee',
176
-        );
177
-        $this->_cpt_edit_routes = array(
178
-            'espresso_attendees' => 'edit_attendee',
179
-        );
180
-        $this->_pagenow_map = array(
181
-            'add_new_attendee' => 'post-new.php',
182
-            'edit_attendee'    => 'post.php',
183
-            'trash'            => 'post.php',
184
-        );
185
-        add_action('edit_form_after_title', array($this, 'after_title_form_fields'), 10);
186
-        // add filters so that the comment urls don't take users to a confusing 404 page
187
-        add_filter('get_comment_link', array($this, 'clear_comment_link'), 10, 3);
188
-    }
189
-
190
-
191
-    public function clear_comment_link($link, $comment, $args)
192
-    {
193
-        // gotta make sure this only happens on this route
194
-        $post_type = get_post_type($comment->comment_post_ID);
195
-        if ($post_type === 'espresso_attendees') {
196
-            return '#commentsdiv';
197
-        }
198
-        return $link;
199
-    }
200
-
201
-
202
-    protected function _ajax_hooks()
203
-    {
204
-        // todo: all hooks for registrations ajax goes in here
205
-        add_action('wp_ajax_toggle_checkin_status', array($this, 'toggle_checkin_status'));
206
-    }
207
-
208
-
209
-    protected function _define_page_props()
210
-    {
211
-        $this->_admin_page_title = $this->page_label;
212
-        $this->_labels = array(
213
-            'buttons'                      => array(
214
-                'add-registrant'      => esc_html__('Add New Registration', 'event_espresso'),
215
-                'add-attendee'        => esc_html__('Add Contact', 'event_espresso'),
216
-                'edit'                => esc_html__('Edit Contact', 'event_espresso'),
217
-                'report'              => esc_html__('Event Registrations CSV Report', 'event_espresso'),
218
-                'report_all'          => esc_html__('All Registrations CSV Report', 'event_espresso'),
219
-                'report_filtered'     => esc_html__('Filtered CSV Report', 'event_espresso'),
220
-                'contact_list_report' => esc_html__('Contact List Report', 'event_espresso'),
221
-                'contact_list_export' => esc_html__('Export Data', 'event_espresso'),
222
-            ),
223
-            'publishbox'                   => array(
224
-                'add_new_attendee' => esc_html__('Add Contact Record', 'event_espresso'),
225
-                'edit_attendee'    => esc_html__('Update Contact Record', 'event_espresso'),
226
-            ),
227
-            'hide_add_button_on_cpt_route' => array(
228
-                'edit_attendee' => true,
229
-            ),
230
-        );
231
-    }
232
-
233
-
234
-    /**
235
-     *        grab url requests and route them
236
-     *
237
-     * @access private
238
-     * @return void
239
-     * @throws EE_Error
240
-     */
241
-    public function _set_page_routes()
242
-    {
243
-        $this->_get_registration_status_array();
244
-        $reg_id = ! empty($this->_req_data['_REG_ID']) && ! is_array($this->_req_data['_REG_ID'])
245
-            ? $this->_req_data['_REG_ID'] : 0;
246
-        $reg_id = empty($reg_id) && ! empty($this->_req_data['reg_status_change_form']['REG_ID'])
247
-            ? $this->_req_data['reg_status_change_form']['REG_ID']
248
-            : $reg_id;
249
-        $att_id = ! empty($this->_req_data['ATT_ID']) && ! is_array($this->_req_data['ATT_ID'])
250
-            ? $this->_req_data['ATT_ID'] : 0;
251
-        $att_id = ! empty($this->_req_data['post']) && ! is_array($this->_req_data['post'])
252
-            ? $this->_req_data['post']
253
-            : $att_id;
254
-        $this->_page_routes = array(
255
-            'default'                             => array(
256
-                'func'       => '_registrations_overview_list_table',
257
-                'capability' => 'ee_read_registrations',
258
-            ),
259
-            'view_registration'                   => array(
260
-                'func'       => '_registration_details',
261
-                'capability' => 'ee_read_registration',
262
-                'obj_id'     => $reg_id,
263
-            ),
264
-            'edit_registration'                   => array(
265
-                'func'               => '_update_attendee_registration_form',
266
-                'noheader'           => true,
267
-                'headers_sent_route' => 'view_registration',
268
-                'capability'         => 'ee_edit_registration',
269
-                'obj_id'             => $reg_id,
270
-                '_REG_ID'            => $reg_id,
271
-            ),
272
-            'trash_registrations'                 => array(
273
-                'func'       => '_trash_or_restore_registrations',
274
-                'args'       => array('trash' => true),
275
-                'noheader'   => true,
276
-                'capability' => 'ee_delete_registrations',
277
-            ),
278
-            'restore_registrations'               => array(
279
-                'func'       => '_trash_or_restore_registrations',
280
-                'args'       => array('trash' => false),
281
-                'noheader'   => true,
282
-                'capability' => 'ee_delete_registrations',
283
-            ),
284
-            'delete_registrations'                => array(
285
-                'func'       => '_delete_registrations',
286
-                'noheader'   => true,
287
-                'capability' => 'ee_delete_registrations',
288
-            ),
289
-            'new_registration'                    => array(
290
-                'func'       => 'new_registration',
291
-                'capability' => 'ee_edit_registrations',
292
-            ),
293
-            'process_reg_step'                    => array(
294
-                'func'       => 'process_reg_step',
295
-                'noheader'   => true,
296
-                'capability' => 'ee_edit_registrations',
297
-            ),
298
-            'redirect_to_txn'                     => array(
299
-                'func'       => 'redirect_to_txn',
300
-                'noheader'   => true,
301
-                'capability' => 'ee_edit_registrations',
302
-            ),
303
-            'change_reg_status'                   => array(
304
-                'func'       => '_change_reg_status',
305
-                'noheader'   => true,
306
-                'capability' => 'ee_edit_registration',
307
-                'obj_id'     => $reg_id,
308
-            ),
309
-            'approve_registration'                => array(
310
-                'func'       => 'approve_registration',
311
-                'noheader'   => true,
312
-                'capability' => 'ee_edit_registration',
313
-                'obj_id'     => $reg_id,
314
-            ),
315
-            'approve_and_notify_registration'     => array(
316
-                'func'       => 'approve_registration',
317
-                'noheader'   => true,
318
-                'args'       => array(true),
319
-                'capability' => 'ee_edit_registration',
320
-                'obj_id'     => $reg_id,
321
-            ),
322
-            'approve_registrations'               => array(
323
-                'func'       => 'bulk_action_on_registrations',
324
-                'noheader'   => true,
325
-                'capability' => 'ee_edit_registrations',
326
-                'args'       => array('approve'),
327
-            ),
328
-            'approve_and_notify_registrations'    => array(
329
-                'func'       => 'bulk_action_on_registrations',
330
-                'noheader'   => true,
331
-                'capability' => 'ee_edit_registrations',
332
-                'args'       => array('approve', true),
333
-            ),
334
-            'decline_registration'                => array(
335
-                'func'       => 'decline_registration',
336
-                'noheader'   => true,
337
-                'capability' => 'ee_edit_registration',
338
-                'obj_id'     => $reg_id,
339
-            ),
340
-            'decline_and_notify_registration'     => array(
341
-                'func'       => 'decline_registration',
342
-                'noheader'   => true,
343
-                'args'       => array(true),
344
-                'capability' => 'ee_edit_registration',
345
-                'obj_id'     => $reg_id,
346
-            ),
347
-            'decline_registrations'               => array(
348
-                'func'       => 'bulk_action_on_registrations',
349
-                'noheader'   => true,
350
-                'capability' => 'ee_edit_registrations',
351
-                'args'       => array('decline'),
352
-            ),
353
-            'decline_and_notify_registrations'    => array(
354
-                'func'       => 'bulk_action_on_registrations',
355
-                'noheader'   => true,
356
-                'capability' => 'ee_edit_registrations',
357
-                'args'       => array('decline', true),
358
-            ),
359
-            'pending_registration'                => array(
360
-                'func'       => 'pending_registration',
361
-                'noheader'   => true,
362
-                'capability' => 'ee_edit_registration',
363
-                'obj_id'     => $reg_id,
364
-            ),
365
-            'pending_and_notify_registration'     => array(
366
-                'func'       => 'pending_registration',
367
-                'noheader'   => true,
368
-                'args'       => array(true),
369
-                'capability' => 'ee_edit_registration',
370
-                'obj_id'     => $reg_id,
371
-            ),
372
-            'pending_registrations'               => array(
373
-                'func'       => 'bulk_action_on_registrations',
374
-                'noheader'   => true,
375
-                'capability' => 'ee_edit_registrations',
376
-                'args'       => array('pending'),
377
-            ),
378
-            'pending_and_notify_registrations'    => array(
379
-                'func'       => 'bulk_action_on_registrations',
380
-                'noheader'   => true,
381
-                'capability' => 'ee_edit_registrations',
382
-                'args'       => array('pending', true),
383
-            ),
384
-            'no_approve_registration'             => array(
385
-                'func'       => 'not_approve_registration',
386
-                'noheader'   => true,
387
-                'capability' => 'ee_edit_registration',
388
-                'obj_id'     => $reg_id,
389
-            ),
390
-            'no_approve_and_notify_registration'  => array(
391
-                'func'       => 'not_approve_registration',
392
-                'noheader'   => true,
393
-                'args'       => array(true),
394
-                'capability' => 'ee_edit_registration',
395
-                'obj_id'     => $reg_id,
396
-            ),
397
-            'no_approve_registrations'            => array(
398
-                'func'       => 'bulk_action_on_registrations',
399
-                'noheader'   => true,
400
-                'capability' => 'ee_edit_registrations',
401
-                'args'       => array('not_approve'),
402
-            ),
403
-            'no_approve_and_notify_registrations' => array(
404
-                'func'       => 'bulk_action_on_registrations',
405
-                'noheader'   => true,
406
-                'capability' => 'ee_edit_registrations',
407
-                'args'       => array('not_approve', true),
408
-            ),
409
-            'cancel_registration'                 => array(
410
-                'func'       => 'cancel_registration',
411
-                'noheader'   => true,
412
-                'capability' => 'ee_edit_registration',
413
-                'obj_id'     => $reg_id,
414
-            ),
415
-            'cancel_and_notify_registration'      => array(
416
-                'func'       => 'cancel_registration',
417
-                'noheader'   => true,
418
-                'args'       => array(true),
419
-                'capability' => 'ee_edit_registration',
420
-                'obj_id'     => $reg_id,
421
-            ),
422
-            'cancel_registrations'                => array(
423
-                'func'       => 'bulk_action_on_registrations',
424
-                'noheader'   => true,
425
-                'capability' => 'ee_edit_registrations',
426
-                'args'       => array('cancel'),
427
-            ),
428
-            'cancel_and_notify_registrations'     => array(
429
-                'func'       => 'bulk_action_on_registrations',
430
-                'noheader'   => true,
431
-                'capability' => 'ee_edit_registrations',
432
-                'args'       => array('cancel', true),
433
-            ),
434
-            'wait_list_registration'              => array(
435
-                'func'       => 'wait_list_registration',
436
-                'noheader'   => true,
437
-                'capability' => 'ee_edit_registration',
438
-                'obj_id'     => $reg_id,
439
-            ),
440
-            'wait_list_and_notify_registration'   => array(
441
-                'func'       => 'wait_list_registration',
442
-                'noheader'   => true,
443
-                'args'       => array(true),
444
-                'capability' => 'ee_edit_registration',
445
-                'obj_id'     => $reg_id,
446
-            ),
447
-            'contact_list'                        => array(
448
-                'func'       => '_attendee_contact_list_table',
449
-                'capability' => 'ee_read_contacts',
450
-            ),
451
-            'add_new_attendee'                    => array(
452
-                'func' => '_create_new_cpt_item',
453
-                'args' => array(
454
-                    'new_attendee' => true,
455
-                    'capability'   => 'ee_edit_contacts',
456
-                ),
457
-            ),
458
-            'edit_attendee'                       => array(
459
-                'func'       => '_edit_cpt_item',
460
-                'capability' => 'ee_edit_contacts',
461
-                'obj_id'     => $att_id,
462
-            ),
463
-            'duplicate_attendee'                  => array(
464
-                'func'       => '_duplicate_attendee',
465
-                'noheader'   => true,
466
-                'capability' => 'ee_edit_contacts',
467
-                'obj_id'     => $att_id,
468
-            ),
469
-            'insert_attendee'                     => array(
470
-                'func'       => '_insert_or_update_attendee',
471
-                'args'       => array(
472
-                    'new_attendee' => true,
473
-                ),
474
-                'noheader'   => true,
475
-                'capability' => 'ee_edit_contacts',
476
-            ),
477
-            'update_attendee'                     => array(
478
-                'func'       => '_insert_or_update_attendee',
479
-                'args'       => array(
480
-                    'new_attendee' => false,
481
-                ),
482
-                'noheader'   => true,
483
-                'capability' => 'ee_edit_contacts',
484
-                'obj_id'     => $att_id,
485
-            ),
486
-            'trash_attendees'                     => array(
487
-                'func'       => '_trash_or_restore_attendees',
488
-                'args'       => array(
489
-                    'trash' => 'true',
490
-                ),
491
-                'noheader'   => true,
492
-                'capability' => 'ee_delete_contacts',
493
-            ),
494
-            'trash_attendee'                      => array(
495
-                'func'       => '_trash_or_restore_attendees',
496
-                'args'       => array(
497
-                    'trash' => true,
498
-                ),
499
-                'noheader'   => true,
500
-                'capability' => 'ee_delete_contacts',
501
-                'obj_id'     => $att_id,
502
-            ),
503
-            'restore_attendees'                   => array(
504
-                'func'       => '_trash_or_restore_attendees',
505
-                'args'       => array(
506
-                    'trash' => false,
507
-                ),
508
-                'noheader'   => true,
509
-                'capability' => 'ee_delete_contacts',
510
-                'obj_id'     => $att_id,
511
-            ),
512
-            'resend_registration'                 => array(
513
-                'func'       => '_resend_registration',
514
-                'noheader'   => true,
515
-                'capability' => 'ee_send_message',
516
-            ),
517
-            'registrations_report'                => array(
518
-                'func'       => '_registrations_report',
519
-                'noheader'   => true,
520
-                'capability' => 'ee_read_registrations',
521
-            ),
522
-            'contact_list_export'                 => array(
523
-                'func'       => '_contact_list_export',
524
-                'noheader'   => true,
525
-                'capability' => 'export',
526
-            ),
527
-            'contact_list_report'                 => array(
528
-                'func'       => '_contact_list_report',
529
-                'noheader'   => true,
530
-                'capability' => 'ee_read_contacts',
531
-            ),
532
-        );
533
-    }
534
-
535
-
536
-    protected function _set_page_config()
537
-    {
538
-        $this->_page_config = array(
539
-            'default'           => array(
540
-                'nav'           => array(
541
-                    'label' => esc_html__('Overview', 'event_espresso'),
542
-                    'order' => 5,
543
-                ),
544
-                'help_tabs'     => array(
545
-                    'registrations_overview_help_tab'                       => array(
546
-                        'title'    => esc_html__('Registrations Overview', 'event_espresso'),
547
-                        'filename' => 'registrations_overview',
548
-                    ),
549
-                    'registrations_overview_table_column_headings_help_tab' => array(
550
-                        'title'    => esc_html__('Registrations Table Column Headings', 'event_espresso'),
551
-                        'filename' => 'registrations_overview_table_column_headings',
552
-                    ),
553
-                    'registrations_overview_filters_help_tab'               => array(
554
-                        'title'    => esc_html__('Registration Filters', 'event_espresso'),
555
-                        'filename' => 'registrations_overview_filters',
556
-                    ),
557
-                    'registrations_overview_views_help_tab'                 => array(
558
-                        'title'    => esc_html__('Registration Views', 'event_espresso'),
559
-                        'filename' => 'registrations_overview_views',
560
-                    ),
561
-                    'registrations_regoverview_other_help_tab'              => array(
562
-                        'title'    => esc_html__('Registrations Other', 'event_espresso'),
563
-                        'filename' => 'registrations_overview_other',
564
-                    ),
565
-                ),
566
-                'help_tour'     => array('Registration_Overview_Help_Tour'),
567
-                'qtips'         => array('Registration_List_Table_Tips'),
568
-                'list_table'    => 'EE_Registrations_List_Table',
569
-                'require_nonce' => false,
570
-            ),
571
-            'view_registration' => array(
572
-                'nav'           => array(
573
-                    'label'      => esc_html__('REG Details', 'event_espresso'),
574
-                    'order'      => 15,
575
-                    'url'        => isset($this->_req_data['_REG_ID'])
576
-                        ? add_query_arg(array('_REG_ID' => $this->_req_data['_REG_ID']), $this->_current_page_view_url)
577
-                        : $this->_admin_base_url,
578
-                    'persistent' => false,
579
-                ),
580
-                'help_tabs'     => array(
581
-                    'registrations_details_help_tab'                    => array(
582
-                        'title'    => esc_html__('Registration Details', 'event_espresso'),
583
-                        'filename' => 'registrations_details',
584
-                    ),
585
-                    'registrations_details_table_help_tab'              => array(
586
-                        'title'    => esc_html__('Registration Details Table', 'event_espresso'),
587
-                        'filename' => 'registrations_details_table',
588
-                    ),
589
-                    'registrations_details_form_answers_help_tab'       => array(
590
-                        'title'    => esc_html__('Registration Form Answers', 'event_espresso'),
591
-                        'filename' => 'registrations_details_form_answers',
592
-                    ),
593
-                    'registrations_details_registrant_details_help_tab' => array(
594
-                        'title'    => esc_html__('Contact Details', 'event_espresso'),
595
-                        'filename' => 'registrations_details_registrant_details',
596
-                    ),
597
-                ),
598
-                'help_tour'     => array('Registration_Details_Help_Tour'),
599
-                'metaboxes'     => array_merge(
600
-                    $this->_default_espresso_metaboxes,
601
-                    array('_registration_details_metaboxes')
602
-                ),
603
-                'require_nonce' => false,
604
-            ),
605
-            'new_registration'  => array(
606
-                'nav'           => array(
607
-                    'label'      => esc_html__('Add New Registration', 'event_espresso'),
608
-                    'url'        => '#',
609
-                    'order'      => 15,
610
-                    'persistent' => false,
611
-                ),
612
-                'metaboxes'     => $this->_default_espresso_metaboxes,
613
-                'labels'        => array(
614
-                    'publishbox' => esc_html__('Save Registration', 'event_espresso'),
615
-                ),
616
-                'require_nonce' => false,
617
-            ),
618
-            'add_new_attendee'  => array(
619
-                'nav'           => array(
620
-                    'label'      => esc_html__('Add Contact', 'event_espresso'),
621
-                    'order'      => 15,
622
-                    'persistent' => false,
623
-                ),
624
-                'metaboxes'     => array_merge(
625
-                    $this->_default_espresso_metaboxes,
626
-                    array('_publish_post_box', 'attendee_editor_metaboxes')
627
-                ),
628
-                'require_nonce' => false,
629
-            ),
630
-            'edit_attendee'     => array(
631
-                'nav'           => array(
632
-                    'label'      => esc_html__('Edit Contact', 'event_espresso'),
633
-                    'order'      => 15,
634
-                    'persistent' => false,
635
-                    'url'        => isset($this->_req_data['ATT_ID'])
636
-                        ? add_query_arg(array('ATT_ID' => $this->_req_data['ATT_ID']), $this->_current_page_view_url)
637
-                        : $this->_admin_base_url,
638
-                ),
639
-                'metaboxes'     => array('attendee_editor_metaboxes'),
640
-                'require_nonce' => false,
641
-            ),
642
-            'contact_list'      => array(
643
-                'nav'           => array(
644
-                    'label' => esc_html__('Contact List', 'event_espresso'),
645
-                    'order' => 20,
646
-                ),
647
-                'list_table'    => 'EE_Attendee_Contact_List_Table',
648
-                'help_tabs'     => array(
649
-                    'registrations_contact_list_help_tab'                       => array(
650
-                        'title'    => esc_html__('Registrations Contact List', 'event_espresso'),
651
-                        'filename' => 'registrations_contact_list',
652
-                    ),
653
-                    'registrations_contact-list_table_column_headings_help_tab' => array(
654
-                        'title'    => esc_html__('Contact List Table Column Headings', 'event_espresso'),
655
-                        'filename' => 'registrations_contact_list_table_column_headings',
656
-                    ),
657
-                    'registrations_contact_list_views_help_tab'                 => array(
658
-                        'title'    => esc_html__('Contact List Views', 'event_espresso'),
659
-                        'filename' => 'registrations_contact_list_views',
660
-                    ),
661
-                    'registrations_contact_list_other_help_tab'                 => array(
662
-                        'title'    => esc_html__('Contact List Other', 'event_espresso'),
663
-                        'filename' => 'registrations_contact_list_other',
664
-                    ),
665
-                ),
666
-                'help_tour'     => array('Contact_List_Help_Tour'),
667
-                'metaboxes'     => array(),
668
-                'require_nonce' => false,
669
-            ),
670
-            // override default cpt routes
671
-            'create_new'        => '',
672
-            'edit'              => '',
673
-        );
674
-    }
675
-
676
-
677
-    /**
678
-     * The below methods aren't used by this class currently
679
-     */
680
-    protected function _add_screen_options()
681
-    {
682
-    }
683
-
684
-
685
-    protected function _add_feature_pointers()
686
-    {
687
-    }
688
-
689
-
690
-    public function admin_init()
691
-    {
692
-        EE_Registry::$i18n_js_strings['update_att_qstns'] = esc_html__(
693
-            'click "Update Registration Questions" to save your changes',
694
-            'event_espresso'
695
-        );
696
-    }
697
-
698
-
699
-    public function admin_notices()
700
-    {
701
-    }
702
-
703
-
704
-    public function admin_footer_scripts()
705
-    {
706
-    }
707
-
708
-
709
-    /**
710
-     *        get list of registration statuses
711
-     *
712
-     * @access private
713
-     * @return void
714
-     * @throws EE_Error
715
-     */
716
-    private function _get_registration_status_array()
717
-    {
718
-        self::$_reg_status = EEM_Registration::reg_status_array(array(), true);
719
-    }
720
-
721
-
722
-    /**
723
-     * @throws InvalidArgumentException
724
-     * @throws InvalidDataTypeException
725
-     * @throws InvalidInterfaceException
726
-     * @since $VID:$
727
-     */
728
-    protected function _add_screen_options_default()
729
-    {
730
-        $this->_per_page_screen_option();
731
-    }
732
-
733
-
734
-    /**
735
-     * @throws InvalidArgumentException
736
-     * @throws InvalidDataTypeException
737
-     * @throws InvalidInterfaceException
738
-     * @since $VID:$
739
-     */
740
-    protected function _add_screen_options_contact_list()
741
-    {
742
-        $page_title = $this->_admin_page_title;
743
-        $this->_admin_page_title = esc_html__('Contacts', 'event_espresso');
744
-        $this->_per_page_screen_option();
745
-        $this->_admin_page_title = $page_title;
746
-    }
747
-
748
-
749
-    public function load_scripts_styles()
750
-    {
751
-        // style
752
-        wp_register_style(
753
-            'espresso_reg',
754
-            REG_ASSETS_URL . 'espresso_registrations_admin.css',
755
-            array('ee-admin-css'),
756
-            EVENT_ESPRESSO_VERSION
757
-        );
758
-        wp_enqueue_style('espresso_reg');
759
-        // script
760
-        wp_register_script(
761
-            'espresso_reg',
762
-            REG_ASSETS_URL . 'espresso_registrations_admin.js',
763
-            array('jquery-ui-datepicker', 'jquery-ui-draggable', 'ee_admin_js'),
764
-            EVENT_ESPRESSO_VERSION,
765
-            true
766
-        );
767
-        wp_enqueue_script('espresso_reg');
768
-    }
769
-
770
-
771
-    /**
772
-     * @throws EE_Error
773
-     * @throws InvalidArgumentException
774
-     * @throws InvalidDataTypeException
775
-     * @throws InvalidInterfaceException
776
-     * @throws ReflectionException
777
-     * @since $VID:$
778
-     */
779
-    public function load_scripts_styles_edit_attendee()
780
-    {
781
-        // stuff to only show up on our attendee edit details page.
782
-        $attendee_details_translations = array(
783
-            'att_publish_text' => sprintf(
784
-                /* translators: The date and time */
785
-                wp_strip_all_tags(__('Created on: %s', 'event_espresso')),
786
-                '<b>' . $this->_cpt_model_obj->get_datetime('ATT_created') . '</b>'
787
-            ),
788
-        );
789
-        wp_localize_script('espresso_reg', 'ATTENDEE_DETAILS', $attendee_details_translations);
790
-        wp_enqueue_script('jquery-validate');
791
-    }
792
-
793
-
794
-    /**
795
-     * @throws EE_Error
796
-     * @throws InvalidArgumentException
797
-     * @throws InvalidDataTypeException
798
-     * @throws InvalidInterfaceException
799
-     * @throws ReflectionException
800
-     * @since $VID:$
801
-     */
802
-    public function load_scripts_styles_view_registration()
803
-    {
804
-        // styles
805
-        wp_enqueue_style('espresso-ui-theme');
806
-        // scripts
807
-        $this->_get_reg_custom_questions_form($this->_registration->ID());
808
-        $this->_reg_custom_questions_form->wp_enqueue_scripts(true);
809
-    }
810
-
811
-
812
-    public function load_scripts_styles_contact_list()
813
-    {
814
-        wp_dequeue_style('espresso_reg');
815
-        wp_register_style(
816
-            'espresso_att',
817
-            REG_ASSETS_URL . 'espresso_attendees_admin.css',
818
-            array('ee-admin-css'),
819
-            EVENT_ESPRESSO_VERSION
820
-        );
821
-        wp_enqueue_style('espresso_att');
822
-    }
823
-
824
-
825
-    public function load_scripts_styles_new_registration()
826
-    {
827
-        wp_register_script(
828
-            'ee-spco-for-admin',
829
-            REG_ASSETS_URL . 'spco_for_admin.js',
830
-            array('underscore', 'jquery'),
831
-            EVENT_ESPRESSO_VERSION,
832
-            true
833
-        );
834
-        wp_enqueue_script('ee-spco-for-admin');
835
-        add_filter('FHEE__EED_Ticket_Selector__load_tckt_slctr_assets', '__return_true');
836
-        EE_Form_Section_Proper::wp_enqueue_scripts();
837
-        EED_Ticket_Selector::load_tckt_slctr_assets();
838
-        EE_Datepicker_Input::enqueue_styles_and_scripts();
839
-    }
840
-
841
-
842
-    public function AHEE__EE_Admin_Page__route_admin_request_resend_registration()
843
-    {
844
-        add_filter('FHEE_load_EE_messages', '__return_true');
845
-    }
846
-
847
-
848
-    public function AHEE__EE_Admin_Page__route_admin_request_approve_registration()
849
-    {
850
-        add_filter('FHEE_load_EE_messages', '__return_true');
851
-    }
852
-
853
-
854
-    /**
855
-     * @throws EE_Error
856
-     * @throws InvalidArgumentException
857
-     * @throws InvalidDataTypeException
858
-     * @throws InvalidInterfaceException
859
-     * @throws ReflectionException
860
-     * @since $VID:$
861
-     */
862
-    protected function _set_list_table_views_default()
863
-    {
864
-        // for notification related bulk actions we need to make sure only active messengers have an option.
865
-        EED_Messages::set_autoloaders();
866
-        /** @type EE_Message_Resource_Manager $message_resource_manager */
867
-        $message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
868
-        $active_mts = $message_resource_manager->list_of_active_message_types();
869
-        // key= bulk_action_slug, value= message type.
870
-        $match_array = array(
871
-            'approve_registrations'    => 'registration',
872
-            'decline_registrations'    => 'declined_registration',
873
-            'pending_registrations'    => 'pending_approval',
874
-            'no_approve_registrations' => 'not_approved_registration',
875
-            'cancel_registrations'     => 'cancelled_registration',
876
-        );
877
-        $can_send = EE_Registry::instance()->CAP->current_user_can(
878
-            'ee_send_message',
879
-            'batch_send_messages'
880
-        );
881
-        /** setup reg status bulk actions **/
882
-        $def_reg_status_actions['approve_registrations'] = esc_html__('Approve Registrations', 'event_espresso');
883
-        if ($can_send && in_array($match_array['approve_registrations'], $active_mts, true)) {
884
-            $def_reg_status_actions['approve_and_notify_registrations'] = esc_html__(
885
-                'Approve and Notify Registrations',
886
-                'event_espresso'
887
-            );
888
-        }
889
-        $def_reg_status_actions['decline_registrations'] = esc_html__('Decline Registrations', 'event_espresso');
890
-        if ($can_send && in_array($match_array['decline_registrations'], $active_mts, true)) {
891
-            $def_reg_status_actions['decline_and_notify_registrations'] = esc_html__(
892
-                'Decline and Notify Registrations',
893
-                'event_espresso'
894
-            );
895
-        }
896
-        $def_reg_status_actions['pending_registrations'] = esc_html__(
897
-            'Set Registrations to Pending Payment',
898
-            'event_espresso'
899
-        );
900
-        if ($can_send && in_array($match_array['pending_registrations'], $active_mts, true)) {
901
-            $def_reg_status_actions['pending_and_notify_registrations'] = esc_html__(
902
-                'Set Registrations to Pending Payment and Notify',
903
-                'event_espresso'
904
-            );
905
-        }
906
-        $def_reg_status_actions['no_approve_registrations'] = esc_html__(
907
-            'Set Registrations to Not Approved',
908
-            'event_espresso'
909
-        );
910
-        if ($can_send && in_array($match_array['no_approve_registrations'], $active_mts, true)) {
911
-            $def_reg_status_actions['no_approve_and_notify_registrations'] = esc_html__(
912
-                'Set Registrations to Not Approved and Notify',
913
-                'event_espresso'
914
-            );
915
-        }
916
-        $def_reg_status_actions['cancel_registrations'] = esc_html__('Cancel Registrations', 'event_espresso');
917
-        if ($can_send && in_array($match_array['cancel_registrations'], $active_mts, true)) {
918
-            $def_reg_status_actions['cancel_and_notify_registrations'] = esc_html__(
919
-                'Cancel Registrations and Notify',
920
-                'event_espresso'
921
-            );
922
-        }
923
-        $def_reg_status_actions = apply_filters(
924
-            'FHEE__Registrations_Admin_Page___set_list_table_views_default__def_reg_status_actions_array',
925
-            $def_reg_status_actions,
926
-            $active_mts,
927
-            $can_send
928
-        );
929
-
930
-        $this->_views = array(
931
-            'all'   => array(
932
-                'slug'        => 'all',
933
-                'label'       => esc_html__('View All Registrations', 'event_espresso'),
934
-                'count'       => 0,
935
-                'bulk_action' => array_merge(
936
-                    $def_reg_status_actions,
937
-                    array(
938
-                        'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
939
-                    )
940
-                ),
941
-            ),
942
-            'month' => array(
943
-                'slug'        => 'month',
944
-                'label'       => esc_html__('This Month', 'event_espresso'),
945
-                'count'       => 0,
946
-                'bulk_action' => array_merge(
947
-                    $def_reg_status_actions,
948
-                    array(
949
-                        'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
950
-                    )
951
-                ),
952
-            ),
953
-            'today' => array(
954
-                'slug'        => 'today',
955
-                'label'       => sprintf(
956
-                    esc_html__('Today - %s', 'event_espresso'),
957
-                    date('M d, Y', current_time('timestamp'))
958
-                ),
959
-                'count'       => 0,
960
-                'bulk_action' => array_merge(
961
-                    $def_reg_status_actions,
962
-                    array(
963
-                        'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
964
-                    )
965
-                ),
966
-            ),
967
-        );
968
-        if (EE_Registry::instance()->CAP->current_user_can(
969
-            'ee_delete_registrations',
970
-            'espresso_registrations_delete_registration'
971
-        )) {
972
-            $this->_views['incomplete'] = array(
973
-                'slug'        => 'incomplete',
974
-                'label'       => esc_html__('Incomplete', 'event_espresso'),
975
-                'count'       => 0,
976
-                'bulk_action' => array(
977
-                    'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
978
-                ),
979
-            );
980
-            $this->_views['trash'] = array(
981
-                'slug'        => 'trash',
982
-                'label'       => esc_html__('Trash', 'event_espresso'),
983
-                'count'       => 0,
984
-                'bulk_action' => array(
985
-                    'restore_registrations' => esc_html__('Restore Registrations', 'event_espresso'),
986
-                    'delete_registrations'  => esc_html__('Delete Registrations Permanently', 'event_espresso'),
987
-                ),
988
-            );
989
-        }
990
-    }
991
-
992
-
993
-    protected function _set_list_table_views_contact_list()
994
-    {
995
-        $this->_views = array(
996
-            'in_use' => array(
997
-                'slug'        => 'in_use',
998
-                'label'       => esc_html__('In Use', 'event_espresso'),
999
-                'count'       => 0,
1000
-                'bulk_action' => array(
1001
-                    'trash_attendees' => esc_html__('Move to Trash', 'event_espresso'),
1002
-                ),
1003
-            ),
1004
-        );
1005
-        if (EE_Registry::instance()->CAP->current_user_can(
1006
-            'ee_delete_contacts',
1007
-            'espresso_registrations_trash_attendees'
1008
-        )
1009
-        ) {
1010
-            $this->_views['trash'] = array(
1011
-                'slug'        => 'trash',
1012
-                'label'       => esc_html__('Trash', 'event_espresso'),
1013
-                'count'       => 0,
1014
-                'bulk_action' => array(
1015
-                    'restore_attendees' => esc_html__('Restore from Trash', 'event_espresso'),
1016
-                ),
1017
-            );
1018
-        }
1019
-    }
1020
-
1021
-
1022
-    protected function _registration_legend_items()
1023
-    {
1024
-        $fc_items = array(
1025
-            'star-icon'        => array(
1026
-                'class' => 'dashicons dashicons-star-filled lt-blue-icon ee-icon-size-8',
1027
-                'desc'  => esc_html__('This is the Primary Registrant', 'event_espresso'),
1028
-            ),
1029
-            'view_details'     => array(
1030
-                'class' => 'dashicons dashicons-clipboard',
1031
-                'desc'  => esc_html__('View Registration Details', 'event_espresso'),
1032
-            ),
1033
-            'edit_attendee'    => array(
1034
-                'class' => 'ee-icon ee-icon-user-edit ee-icon-size-16',
1035
-                'desc'  => esc_html__('Edit Contact Details', 'event_espresso'),
1036
-            ),
1037
-            'view_transaction' => array(
1038
-                'class' => 'dashicons dashicons-cart',
1039
-                'desc'  => esc_html__('View Transaction Details', 'event_espresso'),
1040
-            ),
1041
-            'view_invoice'     => array(
1042
-                'class' => 'dashicons dashicons-media-spreadsheet',
1043
-                'desc'  => esc_html__('View Transaction Invoice', 'event_espresso'),
1044
-            ),
1045
-        );
1046
-        if (EE_Registry::instance()->CAP->current_user_can(
1047
-            'ee_send_message',
1048
-            'espresso_registrations_resend_registration'
1049
-        )) {
1050
-            $fc_items['resend_registration'] = array(
1051
-                'class' => 'dashicons dashicons-email-alt',
1052
-                'desc'  => esc_html__('Resend Registration Details', 'event_espresso'),
1053
-            );
1054
-        } else {
1055
-            $fc_items['blank'] = array('class' => 'blank', 'desc' => '');
1056
-        }
1057
-        if (EE_Registry::instance()->CAP->current_user_can(
1058
-            'ee_read_global_messages',
1059
-            'view_filtered_messages'
1060
-        )) {
1061
-            $related_for_icon = EEH_MSG_Template::get_message_action_icon('see_notifications_for');
1062
-            if (is_array($related_for_icon) && isset($related_for_icon['css_class'], $related_for_icon['label'])) {
1063
-                $fc_items['view_related_messages'] = array(
1064
-                    'class' => $related_for_icon['css_class'],
1065
-                    'desc'  => $related_for_icon['label'],
1066
-                );
1067
-            }
1068
-        }
1069
-        $sc_items = array(
1070
-            'approved_status'   => array(
1071
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_approved,
1072
-                'desc'  => EEH_Template::pretty_status(
1073
-                    EEM_Registration::status_id_approved,
1074
-                    false,
1075
-                    'sentence'
1076
-                ),
1077
-            ),
1078
-            'pending_status'    => array(
1079
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_pending_payment,
1080
-                'desc'  => EEH_Template::pretty_status(
1081
-                    EEM_Registration::status_id_pending_payment,
1082
-                    false,
1083
-                    'sentence'
1084
-                ),
1085
-            ),
1086
-            'wait_list'         => array(
1087
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_wait_list,
1088
-                'desc'  => EEH_Template::pretty_status(
1089
-                    EEM_Registration::status_id_wait_list,
1090
-                    false,
1091
-                    'sentence'
1092
-                ),
1093
-            ),
1094
-            'incomplete_status' => array(
1095
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_incomplete,
1096
-                'desc'  => EEH_Template::pretty_status(
1097
-                    EEM_Registration::status_id_incomplete,
1098
-                    false,
1099
-                    'sentence'
1100
-                ),
1101
-            ),
1102
-            'not_approved'      => array(
1103
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_not_approved,
1104
-                'desc'  => EEH_Template::pretty_status(
1105
-                    EEM_Registration::status_id_not_approved,
1106
-                    false,
1107
-                    'sentence'
1108
-                ),
1109
-            ),
1110
-            'declined_status'   => array(
1111
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_declined,
1112
-                'desc'  => EEH_Template::pretty_status(
1113
-                    EEM_Registration::status_id_declined,
1114
-                    false,
1115
-                    'sentence'
1116
-                ),
1117
-            ),
1118
-            'cancelled_status'  => array(
1119
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_cancelled,
1120
-                'desc'  => EEH_Template::pretty_status(
1121
-                    EEM_Registration::status_id_cancelled,
1122
-                    false,
1123
-                    'sentence'
1124
-                ),
1125
-            ),
1126
-        );
1127
-        return array_merge($fc_items, $sc_items);
1128
-    }
1129
-
1130
-
1131
-
1132
-    /***************************************        REGISTRATION OVERVIEW        **************************************/
1133
-
1134
-
1135
-
1136
-    /**
1137
-     * @throws DomainException
1138
-     * @throws EE_Error
1139
-     * @throws InvalidArgumentException
1140
-     * @throws InvalidDataTypeException
1141
-     * @throws InvalidInterfaceException
1142
-     * @throws ReflectionException
1143
-     */
1144
-    protected function _registrations_overview_list_table()
1145
-    {
1146
-        $this->appendAddNewRegistrationButtonToPageTitle();
1147
-        $header_text = '';
1148
-        $admin_page_header_decorators = [
1149
-            'EventEspresso\core\domain\services\admin\registrations\list_table\page_header\AttendeeFilterHeader',
1150
-            'EventEspresso\core\domain\services\admin\registrations\list_table\page_header\EventFilterHeader',
1151
-            'EventEspresso\core\domain\services\admin\registrations\list_table\page_header\DateFilterHeader',
1152
-            'EventEspresso\core\domain\services\admin\registrations\list_table\page_header\TicketFilterHeader',
1153
-        ];
1154
-        foreach ($admin_page_header_decorators as $admin_page_header_decorator) {
1155
-            $filter_header_decorator = $this->getLoader()->getNew($admin_page_header_decorator);
1156
-            $header_text = $filter_header_decorator->getHeaderText($header_text);
1157
-        }
1158
-        $this->_template_args['admin_page_header'] = $header_text;
1159
-        $this->_template_args['after_list_table'] = $this->_display_legend($this->_registration_legend_items());
1160
-        $this->display_admin_list_table_page_with_no_sidebar();
1161
-    }
1162
-
1163
-
1164
-    /**
1165
-     * @throws EE_Error
1166
-     * @throws InvalidArgumentException
1167
-     * @throws InvalidDataTypeException
1168
-     * @throws InvalidInterfaceException
1169
-     */
1170
-    private function appendAddNewRegistrationButtonToPageTitle()
1171
-    {
1172
-        $EVT_ID = ! empty($this->_req_data['event_id'])
1173
-            ? absint($this->_req_data['event_id'])
1174
-            : 0;
1175
-        if ($EVT_ID
1176
-            && EE_Registry::instance()->CAP->current_user_can(
1177
-                'ee_edit_registrations',
1178
-                'espresso_registrations_new_registration',
1179
-                $EVT_ID
1180
-            )
1181
-        ) {
1182
-            $this->_admin_page_title .= ' ' . $this->get_action_link_or_button(
1183
-                'new_registration',
1184
-                'add-registrant',
1185
-                array('event_id' => $EVT_ID),
1186
-                'add-new-h2'
1187
-            );
1188
-        }
1189
-    }
1190
-
1191
-
1192
-    /**
1193
-     * This sets the _registration property for the registration details screen
1194
-     *
1195
-     * @access private
1196
-     * @return bool
1197
-     * @throws EE_Error
1198
-     * @throws InvalidArgumentException
1199
-     * @throws InvalidDataTypeException
1200
-     * @throws InvalidInterfaceException
1201
-     */
1202
-    private function _set_registration_object()
1203
-    {
1204
-        // get out if we've already set the object
1205
-        if ($this->_registration instanceof EE_Registration) {
1206
-            return true;
1207
-        }
1208
-        $REG_ID = (! empty($this->_req_data['_REG_ID'])) ? absint($this->_req_data['_REG_ID']) : false;
1209
-        if ($this->_registration = $this->getRegistrationModel()->get_one_by_ID($REG_ID)) {
1210
-            return true;
1211
-        }
1212
-        $error_msg = sprintf(
1213
-            esc_html__(
1214
-                'An error occurred and the details for Registration ID #%s could not be retrieved.',
1215
-                'event_espresso'
1216
-            ),
1217
-            $REG_ID
1218
-        );
1219
-        EE_Error::add_error($error_msg, __FILE__, __FUNCTION__, __LINE__);
1220
-        $this->_registration = null;
1221
-        return false;
1222
-    }
1223
-
1224
-
1225
-    /**
1226
-     * Used to retrieve registrations for the list table.
1227
-     *
1228
-     * @param int  $per_page
1229
-     * @param bool $count
1230
-     * @param bool $this_month
1231
-     * @param bool $today
1232
-     * @return EE_Registration[]|int
1233
-     * @throws EE_Error
1234
-     * @throws InvalidArgumentException
1235
-     * @throws InvalidDataTypeException
1236
-     * @throws InvalidInterfaceException
1237
-     */
1238
-    public function get_registrations(
1239
-        $per_page = 10,
1240
-        $count = false,
1241
-        $this_month = false,
1242
-        $today = false
1243
-    ) {
1244
-        if ($this_month) {
1245
-            $this->_req_data['status'] = 'month';
1246
-        }
1247
-        if ($today) {
1248
-            $this->_req_data['status'] = 'today';
1249
-        }
1250
-        $query_params = $this->_get_registration_query_parameters($this->_req_data, $per_page, $count);
1251
-        /**
1252
-         * Override the default groupby added by EEM_Base so that sorts with multiple order bys work as expected
1253
-         *
1254
-         * @link https://events.codebasehq.com/projects/event-espresso/tickets/10093
1255
-         * @see https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md
1256
-         *                             or if you have the development copy of EE you can view this at the path:
1257
-         *                             /docs/G--Model-System/model-query-params.md
1258
-         */
1259
-        $query_params['group_by'] = '';
1260
-
1261
-        return $count
1262
-            ? $this->getRegistrationModel()->count($query_params)
1263
-            /** @type EE_Registration[] */
1264
-            : $this->getRegistrationModel()->get_all($query_params);
1265
-    }
1266
-
1267
-
1268
-    /**
1269
-     * Retrieves the query parameters to be used by the Registration model for getting registrations.
1270
-     * Note: this listens to values on the request for some of the query parameters.
1271
-     *
1272
-     * @param array $request
1273
-     * @param int   $per_page
1274
-     * @param bool  $count
1275
-     * @return array
1276
-     * @throws EE_Error
1277
-     * @throws InvalidArgumentException
1278
-     * @throws InvalidDataTypeException
1279
-     * @throws InvalidInterfaceException
1280
-     */
1281
-    protected function _get_registration_query_parameters(
1282
-        $request = array(),
1283
-        $per_page = 10,
1284
-        $count = false
1285
-    ) {
1286
-        /** @var EventEspresso\core\domain\services\admin\registrations\list_table\QueryBuilder $list_table_query_builder */
1287
-        $list_table_query_builder = $this->getLoader()->getNew(
1288
-            'EventEspresso\core\domain\services\admin\registrations\list_table\QueryBuilder',
1289
-            [ $request ]
1290
-        );
1291
-        return $list_table_query_builder->getQueryParams($per_page, $count);
1292
-    }
1293
-
1294
-
1295
-    public function get_registration_status_array()
1296
-    {
1297
-        return self::$_reg_status;
1298
-    }
1299
-
1300
-
1301
-
1302
-
1303
-    /***************************************        REGISTRATION DETAILS        ***************************************/
1304
-    /**
1305
-     *        generates HTML for the View Registration Details Admin page
1306
-     *
1307
-     * @access protected
1308
-     * @return void
1309
-     * @throws DomainException
1310
-     * @throws EE_Error
1311
-     * @throws InvalidArgumentException
1312
-     * @throws InvalidDataTypeException
1313
-     * @throws InvalidInterfaceException
1314
-     * @throws EntityNotFoundException
1315
-     * @throws ReflectionException
1316
-     */
1317
-    protected function _registration_details()
1318
-    {
1319
-        $this->_template_args = array();
1320
-        $this->_set_registration_object();
1321
-        if (is_object($this->_registration)) {
1322
-            $transaction = $this->_registration->transaction()
1323
-                ? $this->_registration->transaction()
1324
-                : EE_Transaction::new_instance();
1325
-            $this->_session = $transaction->session_data();
1326
-            $event_id = $this->_registration->event_ID();
1327
-            $this->_template_args['reg_nmbr']['value'] = $this->_registration->ID();
1328
-            $this->_template_args['reg_nmbr']['label'] = esc_html__('Registration Number', 'event_espresso');
1329
-            $this->_template_args['reg_datetime']['value'] = $this->_registration->get_i18n_datetime('REG_date');
1330
-            $this->_template_args['reg_datetime']['label'] = esc_html__('Date', 'event_espresso');
1331
-            $this->_template_args['grand_total'] = $transaction->total();
1332
-            $this->_template_args['currency_sign'] = EE_Registry::instance()->CFG->currency->sign;
1333
-            // link back to overview
1334
-            $this->_template_args['reg_overview_url'] = REG_ADMIN_URL;
1335
-            $this->_template_args['registration'] = $this->_registration;
1336
-            $this->_template_args['filtered_registrations_link'] = EE_Admin_Page::add_query_args_and_nonce(
1337
-                array(
1338
-                    'action'   => 'default',
1339
-                    'event_id' => $event_id,
1340
-                ),
1341
-                REG_ADMIN_URL
1342
-            );
1343
-            $this->_template_args['filtered_transactions_link'] = EE_Admin_Page::add_query_args_and_nonce(
1344
-                array(
1345
-                    'action' => 'default',
1346
-                    'EVT_ID' => $event_id,
1347
-                    'page'   => 'espresso_transactions',
1348
-                ),
1349
-                admin_url('admin.php')
1350
-            );
1351
-            $this->_template_args['event_link'] = EE_Admin_Page::add_query_args_and_nonce(
1352
-                array(
1353
-                    'page'   => 'espresso_events',
1354
-                    'action' => 'edit',
1355
-                    'post'   => $event_id,
1356
-                ),
1357
-                admin_url('admin.php')
1358
-            );
1359
-            // next and previous links
1360
-            $next_reg = $this->_registration->next(
1361
-                null,
1362
-                array(),
1363
-                'REG_ID'
1364
-            );
1365
-            $this->_template_args['next_registration'] = $next_reg
1366
-                ? $this->_next_link(
1367
-                    EE_Admin_Page::add_query_args_and_nonce(
1368
-                        array(
1369
-                            'action'  => 'view_registration',
1370
-                            '_REG_ID' => $next_reg['REG_ID'],
1371
-                        ),
1372
-                        REG_ADMIN_URL
1373
-                    ),
1374
-                    'dashicons dashicons-arrow-right ee-icon-size-22'
1375
-                )
1376
-                : '';
1377
-            $previous_reg = $this->_registration->previous(
1378
-                null,
1379
-                array(),
1380
-                'REG_ID'
1381
-            );
1382
-            $this->_template_args['previous_registration'] = $previous_reg
1383
-                ? $this->_previous_link(
1384
-                    EE_Admin_Page::add_query_args_and_nonce(
1385
-                        array(
1386
-                            'action'  => 'view_registration',
1387
-                            '_REG_ID' => $previous_reg['REG_ID'],
1388
-                        ),
1389
-                        REG_ADMIN_URL
1390
-                    ),
1391
-                    'dashicons dashicons-arrow-left ee-icon-size-22'
1392
-                )
1393
-                : '';
1394
-            // grab header
1395
-            $template_path = REG_TEMPLATE_PATH . 'reg_admin_details_header.template.php';
1396
-            $this->_template_args['REG_ID'] = $this->_registration->ID();
1397
-            $this->_template_args['admin_page_header'] = EEH_Template::display_template(
1398
-                $template_path,
1399
-                $this->_template_args,
1400
-                true
1401
-            );
1402
-        } else {
1403
-            $this->_template_args['admin_page_header'] = $this->display_espresso_notices();
1404
-        }
1405
-        // the details template wrapper
1406
-        $this->display_admin_page_with_sidebar();
1407
-    }
1408
-
1409
-
1410
-    /**
1411
-     * @throws EE_Error
1412
-     * @throws InvalidArgumentException
1413
-     * @throws InvalidDataTypeException
1414
-     * @throws InvalidInterfaceException
1415
-     * @throws ReflectionException
1416
-     * @since $VID:$
1417
-     */
1418
-    protected function _registration_details_metaboxes()
1419
-    {
1420
-        do_action('AHEE__Registrations_Admin_Page___registration_details_metabox__start', $this);
1421
-        $this->_set_registration_object();
1422
-        $attendee = $this->_registration instanceof EE_Registration ? $this->_registration->attendee() : null;
1423
-        add_meta_box(
1424
-            'edit-reg-status-mbox',
1425
-            esc_html__('Registration Status', 'event_espresso'),
1426
-            array($this, 'set_reg_status_buttons_metabox'),
1427
-            $this->wp_page_slug,
1428
-            'normal',
1429
-            'high'
1430
-        );
1431
-        add_meta_box(
1432
-            'edit-reg-details-mbox',
1433
-            esc_html__('Registration Details', 'event_espresso'),
1434
-            array($this, '_reg_details_meta_box'),
1435
-            $this->wp_page_slug,
1436
-            'normal',
1437
-            'high'
1438
-        );
1439
-        if ($attendee instanceof EE_Attendee
1440
-            && EE_Registry::instance()->CAP->current_user_can(
1441
-                'ee_read_registration',
1442
-                'edit-reg-questions-mbox',
1443
-                $this->_registration->ID()
1444
-            )
1445
-        ) {
1446
-            add_meta_box(
1447
-                'edit-reg-questions-mbox',
1448
-                esc_html__('Registration Form Answers', 'event_espresso'),
1449
-                array($this, '_reg_questions_meta_box'),
1450
-                $this->wp_page_slug,
1451
-                'normal',
1452
-                'high'
1453
-            );
1454
-        }
1455
-        add_meta_box(
1456
-            'edit-reg-registrant-mbox',
1457
-            esc_html__('Contact Details', 'event_espresso'),
1458
-            array($this, '_reg_registrant_side_meta_box'),
1459
-            $this->wp_page_slug,
1460
-            'side',
1461
-            'high'
1462
-        );
1463
-        if ($this->_registration->group_size() > 1) {
1464
-            add_meta_box(
1465
-                'edit-reg-attendees-mbox',
1466
-                esc_html__('Other Registrations in this Transaction', 'event_espresso'),
1467
-                array($this, '_reg_attendees_meta_box'),
1468
-                $this->wp_page_slug,
1469
-                'normal',
1470
-                'high'
1471
-            );
1472
-        }
1473
-    }
1474
-
1475
-
1476
-    /**
1477
-     * set_reg_status_buttons_metabox
1478
-     *
1479
-     * @access protected
1480
-     * @return string
1481
-     * @throws EE_Error
1482
-     * @throws EntityNotFoundException
1483
-     * @throws InvalidArgumentException
1484
-     * @throws InvalidDataTypeException
1485
-     * @throws InvalidInterfaceException
1486
-     * @throws ReflectionException
1487
-     */
1488
-    public function set_reg_status_buttons_metabox()
1489
-    {
1490
-        $this->_set_registration_object();
1491
-        $change_reg_status_form = $this->_generate_reg_status_change_form();
1492
-        echo $change_reg_status_form->form_open(
1493
-            self::add_query_args_and_nonce(
1494
-                array(
1495
-                    'action' => 'change_reg_status',
1496
-                ),
1497
-                REG_ADMIN_URL
1498
-            )
1499
-        );
1500
-        echo $change_reg_status_form->get_html();
1501
-        echo $change_reg_status_form->form_close();
1502
-    }
1503
-
1504
-
1505
-    /**
1506
-     * @return EE_Form_Section_Proper
1507
-     * @throws EE_Error
1508
-     * @throws InvalidArgumentException
1509
-     * @throws InvalidDataTypeException
1510
-     * @throws InvalidInterfaceException
1511
-     * @throws EntityNotFoundException
1512
-     * @throws ReflectionException
1513
-     */
1514
-    protected function _generate_reg_status_change_form()
1515
-    {
1516
-        $reg_status_change_form_array = array(
1517
-            'name'            => 'reg_status_change_form',
1518
-            'html_id'         => 'reg-status-change-form',
1519
-            'layout_strategy' => new EE_Admin_Two_Column_Layout(),
1520
-            'subsections'     => array(
1521
-                'return'             => new EE_Hidden_Input(
1522
-                    array(
1523
-                        'name'    => 'return',
1524
-                        'default' => 'view_registration',
1525
-                    )
1526
-                ),
1527
-                'REG_ID'             => new EE_Hidden_Input(
1528
-                    array(
1529
-                        'name'    => 'REG_ID',
1530
-                        'default' => $this->_registration->ID(),
1531
-                    )
1532
-                ),
1533
-                'current_status'     => new EE_Form_Section_HTML(
1534
-                    EEH_HTML::table(
1535
-                        EEH_HTML::tr(
1536
-                            EEH_HTML::th(
1537
-                                EEH_HTML::label(
1538
-                                    EEH_HTML::strong(
1539
-                                        esc_html__('Current Registration Status', 'event_espresso')
1540
-                                    )
1541
-                                )
1542
-                            )
1543
-                            . EEH_HTML::td(
1544
-                                EEH_HTML::strong(
1545
-                                    $this->_registration->pretty_status(),
1546
-                                    '',
1547
-                                    'status-' . $this->_registration->status_ID(),
1548
-                                    'line-height: 1em; font-size: 1.5em; font-weight: bold;'
1549
-                                )
1550
-                            )
1551
-                        )
1552
-                    )
1553
-                )
1554
-            )
1555
-        );
1556
-        if (EE_Registry::instance()->CAP->current_user_can(
1557
-            'ee_edit_registration',
1558
-            'toggle_registration_status',
1559
-            $this->_registration->ID()
1560
-        )) {
1561
-            $reg_status_change_form_array['subsections']['reg_status'] = new EE_Select_Input(
1562
-                $this->_get_reg_statuses(),
1563
-                array(
1564
-                    'html_label_text' => esc_html__('Change Registration Status to', 'event_espresso'),
1565
-                    'default'         => $this->_registration->status_ID(),
1566
-                )
1567
-            );
1568
-            $reg_status_change_form_array['subsections']['send_notifications'] = new EE_Yes_No_Input(
1569
-                array(
1570
-                    'html_label_text' => esc_html__('Send Related Messages', 'event_espresso'),
1571
-                    'default'         => false,
1572
-                    'html_help_text'  => esc_html__(
1573
-                        'If set to "Yes", then the related messages will be sent to the registrant.',
1574
-                        'event_espresso'
1575
-                    )
1576
-                )
1577
-            );
1578
-            $reg_status_change_form_array['subsections']['submit'] = new EE_Submit_Input(
1579
-                array(
1580
-                    'html_class'      => 'button-primary',
1581
-                    'html_label_text' => '&nbsp;',
1582
-                    'default'         => esc_html__('Update Registration Status', 'event_espresso'),
1583
-                )
1584
-            );
1585
-        }
1586
-        return new EE_Form_Section_Proper($reg_status_change_form_array);
1587
-    }
1588
-
1589
-
1590
-    /**
1591
-     * Returns an array of all the buttons for the various statuses and switch status actions
1592
-     *
1593
-     * @return array
1594
-     * @throws EE_Error
1595
-     * @throws InvalidArgumentException
1596
-     * @throws InvalidDataTypeException
1597
-     * @throws InvalidInterfaceException
1598
-     * @throws EntityNotFoundException
1599
-     */
1600
-    protected function _get_reg_statuses()
1601
-    {
1602
-        $reg_status_array = $this->getRegistrationModel()->reg_status_array();
1603
-        unset($reg_status_array[ EEM_Registration::status_id_incomplete ]);
1604
-        // get current reg status
1605
-        $current_status = $this->_registration->status_ID();
1606
-        // is registration for free event? This will determine whether to display the pending payment option
1607
-        if ($current_status !== EEM_Registration::status_id_pending_payment
1608
-            && EEH_Money::compare_floats($this->_registration->ticket()->price(), 0.00)
1609
-        ) {
1610
-            unset($reg_status_array[ EEM_Registration::status_id_pending_payment ]);
1611
-        }
1612
-        return $this->getStatusModel()->localized_status($reg_status_array, false, 'sentence');
1613
-    }
1614
-
1615
-
1616
-    /**
1617
-     * This method is used when using _REG_ID from request which may or may not be an array of reg_ids.
1618
-     *
1619
-     * @param bool $status REG status given for changing registrations to.
1620
-     * @param bool $notify Whether to send messages notifications or not.
1621
-     * @return array (array with reg_id(s) updated and whether update was successful.
1622
-     * @throws DomainException
1623
-     * @throws EE_Error
1624
-     * @throws EntityNotFoundException
1625
-     * @throws InvalidArgumentException
1626
-     * @throws InvalidDataTypeException
1627
-     * @throws InvalidInterfaceException
1628
-     * @throws ReflectionException
1629
-     * @throws RuntimeException
1630
-     */
1631
-    protected function _set_registration_status_from_request($status = false, $notify = false)
1632
-    {
1633
-        if (isset($this->_req_data['reg_status_change_form'])) {
1634
-            $REG_IDs = isset($this->_req_data['reg_status_change_form']['REG_ID'])
1635
-                ? (array) $this->_req_data['reg_status_change_form']['REG_ID']
1636
-                : array();
1637
-        } else {
1638
-            $REG_IDs = isset($this->_req_data['_REG_ID'])
1639
-                ? (array) $this->_req_data['_REG_ID']
1640
-                : array();
1641
-        }
1642
-        // sanitize $REG_IDs
1643
-        $REG_IDs = array_map('absint', $REG_IDs);
1644
-        // and remove empty entries
1645
-        $REG_IDs = array_filter($REG_IDs);
1646
-
1647
-        $result = $this->_set_registration_status($REG_IDs, $status, $notify);
1648
-
1649
-        /**
1650
-         * Set and filter $_req_data['_REG_ID'] for any potential future messages notifications.
1651
-         * Currently this value is used downstream by the _process_resend_registration method.
1652
-         *
1653
-         * @param int|array                $registration_ids The registration ids that have had their status changed successfully.
1654
-         * @param bool                     $status           The status registrations were changed to.
1655
-         * @param bool                     $success          If the status was changed successfully for all registrations.
1656
-         * @param Registrations_Admin_Page $admin_page_object
1657
-         */
1658
-        $this->_req_data['_REG_ID'] = apply_filters(
1659
-            'FHEE__Registrations_Admin_Page___set_registration_status_from_request__REG_IDs',
1660
-            $result['REG_ID'],
1661
-            $status,
1662
-            $result['success'],
1663
-            $this
1664
-        );
1665
-
1666
-        // notify?
1667
-        if ($notify
1668
-            && $result['success']
1669
-            && ! empty($this->_req_data['_REG_ID'])
1670
-            && EE_Registry::instance()->CAP->current_user_can(
1671
-                'ee_send_message',
1672
-                'espresso_registrations_resend_registration'
1673
-            )
1674
-        ) {
1675
-            $this->_process_resend_registration();
1676
-        }
1677
-        return $result;
1678
-    }
1679
-
1680
-
1681
-    /**
1682
-     * Set the registration status for the given reg_id (which may or may not be an array, it gets typecast to an
1683
-     * array). Note, this method does NOT take care of possible notifications.  That is required by calling code.
1684
-     *
1685
-     * @param array  $REG_IDs
1686
-     * @param string $status
1687
-     * @param bool   $notify  Used to indicate whether notification was requested or not.  This determines the context
1688
-     *                        slug sent with setting the registration status.
1689
-     * @return array (an array with 'success' key representing whether status change was successful, and 'REG_ID' as
1690
-     * @throws EE_Error
1691
-     * @throws InvalidArgumentException
1692
-     * @throws InvalidDataTypeException
1693
-     * @throws InvalidInterfaceException
1694
-     * @throws ReflectionException
1695
-     * @throws RuntimeException
1696
-     * @throws EntityNotFoundException
1697
-     * @throws DomainException
1698
-     */
1699
-    protected function _set_registration_status($REG_IDs = array(), $status = '', $notify = false)
1700
-    {
1701
-        $success = false;
1702
-        // typecast $REG_IDs
1703
-        $REG_IDs = (array) $REG_IDs;
1704
-        if (! empty($REG_IDs)) {
1705
-            $success = true;
1706
-            // set default status if none is passed
1707
-            $status = $status ? $status : EEM_Registration::status_id_pending_payment;
1708
-            $status_context = $notify
1709
-                ? Domain::CONTEXT_REGISTRATION_STATUS_CHANGE_REGISTRATION_ADMIN_NOTIFY
1710
-                : Domain::CONTEXT_REGISTRATION_STATUS_CHANGE_REGISTRATION_ADMIN;
1711
-            // loop through REG_ID's and change status
1712
-            foreach ($REG_IDs as $REG_ID) {
1713
-                $registration = $this->getRegistrationModel()->get_one_by_ID($REG_ID);
1714
-                if ($registration instanceof EE_Registration) {
1715
-                    $registration->set_status(
1716
-                        $status,
1717
-                        false,
1718
-                        new Context(
1719
-                            $status_context,
1720
-                            esc_html__(
1721
-                                'Manually triggered status change on a Registration Admin Page route.',
1722
-                                'event_espresso'
1723
-                            )
1724
-                        )
1725
-                    );
1726
-                    $result = $registration->save();
1727
-                    // verifying explicit fails because update *may* just return 0 for 0 rows affected
1728
-                    $success = $result !== false ? $success : false;
1729
-                }
1730
-            }
1731
-        }
1732
-
1733
-        // return $success and processed registrations
1734
-        return array('REG_ID' => $REG_IDs, 'success' => $success);
1735
-    }
1736
-
1737
-
1738
-    /**
1739
-     * Common logic for setting up success message and redirecting to appropriate route
1740
-     *
1741
-     * @param string $STS_ID status id for the registration changed to
1742
-     * @param bool   $notify indicates whether the _set_registration_status_from_request does notifications or not.
1743
-     * @return void
1744
-     * @throws DomainException
1745
-     * @throws EE_Error
1746
-     * @throws EntityNotFoundException
1747
-     * @throws InvalidArgumentException
1748
-     * @throws InvalidDataTypeException
1749
-     * @throws InvalidInterfaceException
1750
-     * @throws ReflectionException
1751
-     * @throws RuntimeException
1752
-     */
1753
-    protected function _reg_status_change_return($STS_ID, $notify = false)
1754
-    {
1755
-        $result = ! empty($STS_ID) ? $this->_set_registration_status_from_request($STS_ID, $notify)
1756
-            : array('success' => false);
1757
-        $success = isset($result['success']) && $result['success'];
1758
-        // setup success message
1759
-        if ($success) {
1760
-            if (is_array($result['REG_ID']) && count($result['REG_ID']) === 1) {
1761
-                $msg = sprintf(
1762
-                    esc_html__('Registration status has been set to %s', 'event_espresso'),
1763
-                    EEH_Template::pretty_status($STS_ID, false, 'lower')
1764
-                );
1765
-            } else {
1766
-                $msg = sprintf(
1767
-                    esc_html__('Registrations have been set to %s.', 'event_espresso'),
1768
-                    EEH_Template::pretty_status($STS_ID, false, 'lower')
1769
-                );
1770
-            }
1771
-            EE_Error::add_success($msg);
1772
-        } else {
1773
-            EE_Error::add_error(
1774
-                esc_html__(
1775
-                    'Something went wrong, and the status was not changed',
1776
-                    'event_espresso'
1777
-                ),
1778
-                __FILE__,
1779
-                __LINE__,
1780
-                __FUNCTION__
1781
-            );
1782
-        }
1783
-        if (isset($this->_req_data['return']) && $this->_req_data['return'] === 'view_registration') {
1784
-            $route = array('action' => 'view_registration', '_REG_ID' => reset($result['REG_ID']));
1785
-        } else {
1786
-            $route = array('action' => 'default');
1787
-        }
1788
-        $route = $this->mergeExistingRequestParamsWithRedirectArgs($route);
1789
-        $this->_redirect_after_action($success, '', '', $route, true);
1790
-    }
1791
-
1792
-
1793
-    /**
1794
-     * incoming reg status change from reg details page.
1795
-     *
1796
-     * @return void
1797
-     * @throws EE_Error
1798
-     * @throws EntityNotFoundException
1799
-     * @throws InvalidArgumentException
1800
-     * @throws InvalidDataTypeException
1801
-     * @throws InvalidInterfaceException
1802
-     * @throws ReflectionException
1803
-     * @throws RuntimeException
1804
-     * @throws DomainException
1805
-     */
1806
-    protected function _change_reg_status()
1807
-    {
1808
-        $this->_req_data['return'] = 'view_registration';
1809
-        // set notify based on whether the send notifications toggle is set or not
1810
-        $notify = ! empty($this->_req_data['reg_status_change_form']['send_notifications']);
1811
-        // $notify = ! empty( $this->_req_data['txn_reg_status_change']['send_notifications'] );
1812
-        $this->_req_data['reg_status_change_form']['reg_status'] = isset($this->_req_data['reg_status_change_form']['reg_status'])
1813
-            ? $this->_req_data['reg_status_change_form']['reg_status'] : '';
1814
-        switch ($this->_req_data['reg_status_change_form']['reg_status']) {
1815
-            case EEM_Registration::status_id_approved:
1816
-            case EEH_Template::pretty_status(EEM_Registration::status_id_approved, false, 'sentence'):
1817
-                $this->approve_registration($notify);
1818
-                break;
1819
-            case EEM_Registration::status_id_pending_payment:
1820
-            case EEH_Template::pretty_status(EEM_Registration::status_id_pending_payment, false, 'sentence'):
1821
-                $this->pending_registration($notify);
1822
-                break;
1823
-            case EEM_Registration::status_id_not_approved:
1824
-            case EEH_Template::pretty_status(EEM_Registration::status_id_not_approved, false, 'sentence'):
1825
-                $this->not_approve_registration($notify);
1826
-                break;
1827
-            case EEM_Registration::status_id_declined:
1828
-            case EEH_Template::pretty_status(EEM_Registration::status_id_declined, false, 'sentence'):
1829
-                $this->decline_registration($notify);
1830
-                break;
1831
-            case EEM_Registration::status_id_cancelled:
1832
-            case EEH_Template::pretty_status(EEM_Registration::status_id_cancelled, false, 'sentence'):
1833
-                $this->cancel_registration($notify);
1834
-                break;
1835
-            case EEM_Registration::status_id_wait_list:
1836
-            case EEH_Template::pretty_status(EEM_Registration::status_id_wait_list, false, 'sentence'):
1837
-                $this->wait_list_registration($notify);
1838
-                break;
1839
-            case EEM_Registration::status_id_incomplete:
1840
-            default:
1841
-                $result['success'] = false;
1842
-                unset($this->_req_data['return']);
1843
-                $this->_reg_status_change_return('', false);
1844
-                break;
1845
-        }
1846
-    }
1847
-
1848
-
1849
-    /**
1850
-     * Callback for bulk action routes.
1851
-     * Note: although we could just register the singular route callbacks for each bulk action route as well, this
1852
-     * method was chosen so there is one central place all the registration status bulk actions are going through.
1853
-     * Potentially, this provides an easier place to locate logic that is specific to these bulk actions (as opposed to
1854
-     * when an action is happening on just a single registration).
1855
-     *
1856
-     * @param      $action
1857
-     * @param bool $notify
1858
-     */
1859
-    protected function bulk_action_on_registrations($action, $notify = false)
1860
-    {
1861
-        do_action(
1862
-            'AHEE__Registrations_Admin_Page__bulk_action_on_registrations__before_execution',
1863
-            $this,
1864
-            $action,
1865
-            $notify
1866
-        );
1867
-        $method = $action . '_registration';
1868
-        if (method_exists($this, $method)) {
1869
-            $this->$method($notify);
1870
-        }
1871
-    }
1872
-
1873
-
1874
-    /**
1875
-     * approve_registration
1876
-     *
1877
-     * @access protected
1878
-     * @param bool $notify whether or not to notify the registrant about their approval.
1879
-     * @return void
1880
-     * @throws EE_Error
1881
-     * @throws EntityNotFoundException
1882
-     * @throws InvalidArgumentException
1883
-     * @throws InvalidDataTypeException
1884
-     * @throws InvalidInterfaceException
1885
-     * @throws ReflectionException
1886
-     * @throws RuntimeException
1887
-     * @throws DomainException
1888
-     */
1889
-    protected function approve_registration($notify = false)
1890
-    {
1891
-        $this->_reg_status_change_return(EEM_Registration::status_id_approved, $notify);
1892
-    }
1893
-
1894
-
1895
-    /**
1896
-     *        decline_registration
1897
-     *
1898
-     * @access protected
1899
-     * @param bool $notify whether or not to notify the registrant about their status change.
1900
-     * @return void
1901
-     * @throws EE_Error
1902
-     * @throws EntityNotFoundException
1903
-     * @throws InvalidArgumentException
1904
-     * @throws InvalidDataTypeException
1905
-     * @throws InvalidInterfaceException
1906
-     * @throws ReflectionException
1907
-     * @throws RuntimeException
1908
-     * @throws DomainException
1909
-     */
1910
-    protected function decline_registration($notify = false)
1911
-    {
1912
-        $this->_reg_status_change_return(EEM_Registration::status_id_declined, $notify);
1913
-    }
1914
-
1915
-
1916
-    /**
1917
-     *        cancel_registration
1918
-     *
1919
-     * @access protected
1920
-     * @param bool $notify whether or not to notify the registrant about their status change.
1921
-     * @return void
1922
-     * @throws EE_Error
1923
-     * @throws EntityNotFoundException
1924
-     * @throws InvalidArgumentException
1925
-     * @throws InvalidDataTypeException
1926
-     * @throws InvalidInterfaceException
1927
-     * @throws ReflectionException
1928
-     * @throws RuntimeException
1929
-     * @throws DomainException
1930
-     */
1931
-    protected function cancel_registration($notify = false)
1932
-    {
1933
-        $this->_reg_status_change_return(EEM_Registration::status_id_cancelled, $notify);
1934
-    }
1935
-
1936
-
1937
-    /**
1938
-     *        not_approve_registration
1939
-     *
1940
-     * @access protected
1941
-     * @param bool $notify whether or not to notify the registrant about their status change.
1942
-     * @return void
1943
-     * @throws EE_Error
1944
-     * @throws EntityNotFoundException
1945
-     * @throws InvalidArgumentException
1946
-     * @throws InvalidDataTypeException
1947
-     * @throws InvalidInterfaceException
1948
-     * @throws ReflectionException
1949
-     * @throws RuntimeException
1950
-     * @throws DomainException
1951
-     */
1952
-    protected function not_approve_registration($notify = false)
1953
-    {
1954
-        $this->_reg_status_change_return(EEM_Registration::status_id_not_approved, $notify);
1955
-    }
1956
-
1957
-
1958
-    /**
1959
-     *        decline_registration
1960
-     *
1961
-     * @access protected
1962
-     * @param bool $notify whether or not to notify the registrant about their status change.
1963
-     * @return void
1964
-     * @throws EE_Error
1965
-     * @throws EntityNotFoundException
1966
-     * @throws InvalidArgumentException
1967
-     * @throws InvalidDataTypeException
1968
-     * @throws InvalidInterfaceException
1969
-     * @throws ReflectionException
1970
-     * @throws RuntimeException
1971
-     * @throws DomainException
1972
-     */
1973
-    protected function pending_registration($notify = false)
1974
-    {
1975
-        $this->_reg_status_change_return(EEM_Registration::status_id_pending_payment, $notify);
1976
-    }
1977
-
1978
-
1979
-    /**
1980
-     * waitlist_registration
1981
-     *
1982
-     * @access protected
1983
-     * @param bool $notify whether or not to notify the registrant about their status change.
1984
-     * @return void
1985
-     * @throws EE_Error
1986
-     * @throws EntityNotFoundException
1987
-     * @throws InvalidArgumentException
1988
-     * @throws InvalidDataTypeException
1989
-     * @throws InvalidInterfaceException
1990
-     * @throws ReflectionException
1991
-     * @throws RuntimeException
1992
-     * @throws DomainException
1993
-     */
1994
-    protected function wait_list_registration($notify = false)
1995
-    {
1996
-        $this->_reg_status_change_return(EEM_Registration::status_id_wait_list, $notify);
1997
-    }
1998
-
1999
-
2000
-    /**
2001
-     *        generates HTML for the Registration main meta box
2002
-     *
2003
-     * @access public
2004
-     * @return void
2005
-     * @throws DomainException
2006
-     * @throws EE_Error
2007
-     * @throws InvalidArgumentException
2008
-     * @throws InvalidDataTypeException
2009
-     * @throws InvalidInterfaceException
2010
-     * @throws ReflectionException
2011
-     * @throws EntityNotFoundException
2012
-     */
2013
-    public function _reg_details_meta_box()
2014
-    {
2015
-        EEH_Autoloader::register_line_item_display_autoloaders();
2016
-        EEH_Autoloader::register_line_item_filter_autoloaders();
2017
-        EE_Registry::instance()->load_helper('Line_Item');
2018
-        $transaction = $this->_registration->transaction() ? $this->_registration->transaction()
2019
-            : EE_Transaction::new_instance();
2020
-        $this->_session = $transaction->session_data();
2021
-        $filters = new EE_Line_Item_Filter_Collection();
2022
-        $filters->add(new EE_Single_Registration_Line_Item_Filter($this->_registration));
2023
-        $filters->add(new EE_Non_Zero_Line_Item_Filter());
2024
-        $line_item_filter_processor = new EE_Line_Item_Filter_Processor(
2025
-            $filters,
2026
-            $transaction->total_line_item()
2027
-        );
2028
-        $filtered_line_item_tree = $line_item_filter_processor->process();
2029
-        $line_item_display = new EE_Line_Item_Display(
2030
-            'reg_admin_table',
2031
-            'EE_Admin_Table_Registration_Line_Item_Display_Strategy'
2032
-        );
2033
-        $this->_template_args['line_item_table'] = $line_item_display->display_line_item(
2034
-            $filtered_line_item_tree,
2035
-            array('EE_Registration' => $this->_registration)
2036
-        );
2037
-        $attendee = $this->_registration->attendee();
2038
-        if (EE_Registry::instance()->CAP->current_user_can(
2039
-            'ee_read_transaction',
2040
-            'espresso_transactions_view_transaction'
2041
-        )) {
2042
-            $this->_template_args['view_transaction_button'] = EEH_Template::get_button_or_link(
2043
-                EE_Admin_Page::add_query_args_and_nonce(
2044
-                    array(
2045
-                        'action' => 'view_transaction',
2046
-                        'TXN_ID' => $transaction->ID(),
2047
-                    ),
2048
-                    TXN_ADMIN_URL
2049
-                ),
2050
-                esc_html__(' View Transaction', 'event_espresso'),
2051
-                'button secondary-button right',
2052
-                'dashicons dashicons-cart'
2053
-            );
2054
-        } else {
2055
-            $this->_template_args['view_transaction_button'] = '';
2056
-        }
2057
-        if ($attendee instanceof EE_Attendee
2058
-            && EE_Registry::instance()->CAP->current_user_can(
2059
-                'ee_send_message',
2060
-                'espresso_registrations_resend_registration'
2061
-            )
2062
-        ) {
2063
-            $this->_template_args['resend_registration_button'] = EEH_Template::get_button_or_link(
2064
-                EE_Admin_Page::add_query_args_and_nonce(
2065
-                    array(
2066
-                        'action'      => 'resend_registration',
2067
-                        '_REG_ID'     => $this->_registration->ID(),
2068
-                        'redirect_to' => 'view_registration',
2069
-                    ),
2070
-                    REG_ADMIN_URL
2071
-                ),
2072
-                esc_html__(' Resend Registration', 'event_espresso'),
2073
-                'button secondary-button right',
2074
-                'dashicons dashicons-email-alt'
2075
-            );
2076
-        } else {
2077
-            $this->_template_args['resend_registration_button'] = '';
2078
-        }
2079
-        $this->_template_args['currency_sign'] = EE_Registry::instance()->CFG->currency->sign;
2080
-        $payment = $transaction->get_first_related('Payment');
2081
-        $payment = ! $payment instanceof EE_Payment
2082
-            ? EE_Payment::new_instance()
2083
-            : $payment;
2084
-        $payment_method = $payment->get_first_related('Payment_Method');
2085
-        $payment_method = ! $payment_method instanceof EE_Payment_Method
2086
-            ? EE_Payment_Method::new_instance()
2087
-            : $payment_method;
2088
-        $reg_details = array(
2089
-            'payment_method'       => $payment_method->name(),
2090
-            'response_msg'         => $payment->gateway_response(),
2091
-            'registration_id'      => $this->_registration->get('REG_code'),
2092
-            'registration_session' => $this->_registration->session_ID(),
2093
-            'ip_address'           => isset($this->_session['ip_address']) ? $this->_session['ip_address'] : '',
2094
-            'user_agent'           => isset($this->_session['user_agent']) ? $this->_session['user_agent'] : '',
2095
-        );
2096
-        if (isset($reg_details['registration_id'])) {
2097
-            $this->_template_args['reg_details']['registration_id']['value'] = $reg_details['registration_id'];
2098
-            $this->_template_args['reg_details']['registration_id']['label'] = esc_html__(
2099
-                'Registration ID',
2100
-                'event_espresso'
2101
-            );
2102
-            $this->_template_args['reg_details']['registration_id']['class'] = 'regular-text';
2103
-        }
2104
-        if (isset($reg_details['payment_method'])) {
2105
-            $this->_template_args['reg_details']['payment_method']['value'] = $reg_details['payment_method'];
2106
-            $this->_template_args['reg_details']['payment_method']['label'] = esc_html__(
2107
-                'Most Recent Payment Method',
2108
-                'event_espresso'
2109
-            );
2110
-            $this->_template_args['reg_details']['payment_method']['class'] = 'regular-text';
2111
-            $this->_template_args['reg_details']['response_msg']['value'] = $reg_details['response_msg'];
2112
-            $this->_template_args['reg_details']['response_msg']['label'] = esc_html__(
2113
-                'Payment method response',
2114
-                'event_espresso'
2115
-            );
2116
-            $this->_template_args['reg_details']['response_msg']['class'] = 'regular-text';
2117
-        }
2118
-        $this->_template_args['reg_details']['registration_session']['value'] = $reg_details['registration_session'];
2119
-        $this->_template_args['reg_details']['registration_session']['label'] = esc_html__(
2120
-            'Registration Session',
2121
-            'event_espresso'
2122
-        );
2123
-        $this->_template_args['reg_details']['registration_session']['class'] = 'regular-text';
2124
-        $this->_template_args['reg_details']['ip_address']['value'] = $reg_details['ip_address'];
2125
-        $this->_template_args['reg_details']['ip_address']['label'] = esc_html__(
2126
-            'Registration placed from IP',
2127
-            'event_espresso'
2128
-        );
2129
-        $this->_template_args['reg_details']['ip_address']['class'] = 'regular-text';
2130
-        $this->_template_args['reg_details']['user_agent']['value'] = $reg_details['user_agent'];
2131
-        $this->_template_args['reg_details']['user_agent']['label'] = esc_html__(
2132
-            'Registrant User Agent',
2133
-            'event_espresso'
2134
-        );
2135
-        $this->_template_args['reg_details']['user_agent']['class'] = 'large-text';
2136
-        $this->_template_args['event_link'] = EE_Admin_Page::add_query_args_and_nonce(
2137
-            array(
2138
-                'action'   => 'default',
2139
-                'event_id' => $this->_registration->event_ID(),
2140
-            ),
2141
-            REG_ADMIN_URL
2142
-        );
2143
-        $this->_template_args['REG_ID'] = $this->_registration->ID();
2144
-        $this->_template_args['event_id'] = $this->_registration->event_ID();
2145
-        $template_path =
2146
-            REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_reg_details.template.php';
2147
-        echo EEH_Template::display_template($template_path, $this->_template_args, true);
2148
-    }
2149
-
2150
-
2151
-    /**
2152
-     * generates HTML for the Registration Questions meta box.
2153
-     * If pre-4.8.32.rc.000 hooks are used, uses old methods (with its filters),
2154
-     * otherwise uses new forms system
2155
-     *
2156
-     * @access public
2157
-     * @return void
2158
-     * @throws DomainException
2159
-     * @throws EE_Error
2160
-     * @throws InvalidArgumentException
2161
-     * @throws InvalidDataTypeException
2162
-     * @throws InvalidInterfaceException
2163
-     * @throws ReflectionException
2164
-     */
2165
-    public function _reg_questions_meta_box()
2166
-    {
2167
-        // allow someone to override this method entirely
2168
-        if (apply_filters(
2169
-            'FHEE__Registrations_Admin_Page___reg_questions_meta_box__do_default',
2170
-            true,
2171
-            $this,
2172
-            $this->_registration
2173
-        )) {
2174
-            $form = $this->_get_reg_custom_questions_form(
2175
-                $this->_registration->ID()
2176
-            );
2177
-            $this->_template_args['att_questions'] = count($form->subforms()) > 0
2178
-                ? $form->get_html_and_js()
2179
-                : '';
2180
-            $this->_template_args['reg_questions_form_action'] = 'edit_registration';
2181
-            $this->_template_args['REG_ID'] = $this->_registration->ID();
2182
-            $template_path =
2183
-                REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_reg_questions.template.php';
2184
-            echo EEH_Template::display_template($template_path, $this->_template_args, true);
2185
-        }
2186
-    }
2187
-
2188
-
2189
-    /**
2190
-     * form_before_question_group
2191
-     *
2192
-     * @deprecated    as of 4.8.32.rc.000
2193
-     * @access        public
2194
-     * @param        string $output
2195
-     * @return        string
2196
-     */
2197
-    public function form_before_question_group($output)
2198
-    {
2199
-        EE_Error::doing_it_wrong(
2200
-            __CLASS__ . '::' . __FUNCTION__,
2201
-            esc_html__(
2202
-                '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.',
2203
-                'event_espresso'
2204
-            ),
2205
-            '4.8.32.rc.000'
2206
-        );
2207
-        return '
21
+	/**
22
+	 * @var EE_Registration
23
+	 */
24
+	private $_registration;
25
+
26
+	/**
27
+	 * @var EE_Event
28
+	 */
29
+	private $_reg_event;
30
+
31
+	/**
32
+	 * @var EE_Session
33
+	 */
34
+	private $_session;
35
+
36
+	private static $_reg_status;
37
+
38
+	/**
39
+	 * Form for displaying the custom questions for this registration.
40
+	 * This gets used a few times throughout the request so its best to cache it
41
+	 *
42
+	 * @var EE_Registration_Custom_Questions_Form
43
+	 */
44
+	protected $_reg_custom_questions_form = null;
45
+
46
+	/**
47
+	 * @var EEM_Registration $registration_model
48
+	 */
49
+	private $registration_model;
50
+
51
+	/**
52
+	 * @var EEM_Attendee $attendee_model
53
+	 */
54
+	private $attendee_model;
55
+
56
+	/**
57
+	 * @var EEM_Event $event_model
58
+	 */
59
+	private $event_model;
60
+
61
+	/**
62
+	 * @var EEM_Status $status_model
63
+	 */
64
+	private $status_model;
65
+
66
+
67
+	/**
68
+	 * @param bool $routing
69
+	 * @throws EE_Error
70
+	 * @throws InvalidArgumentException
71
+	 * @throws InvalidDataTypeException
72
+	 * @throws InvalidInterfaceException
73
+	 * @throws ReflectionException
74
+	 */
75
+	public function __construct($routing = true)
76
+	{
77
+		parent::__construct($routing);
78
+		add_action('wp_loaded', array($this, 'wp_loaded'));
79
+	}
80
+
81
+	/**
82
+	 * @return EEM_Registration
83
+	 * @throws InvalidArgumentException
84
+	 * @throws InvalidDataTypeException
85
+	 * @throws InvalidInterfaceException
86
+	 * @since $VID:$
87
+	 */
88
+	protected function getRegistrationModel()
89
+	{
90
+		if (! $this->registration_model instanceof EEM_Registration) {
91
+			$this->registration_model = $this->getLoader()->getShared('EEM_Registration');
92
+		}
93
+		return $this->registration_model;
94
+	}
95
+
96
+	/**
97
+	 * @return EEM_Attendee
98
+	 * @throws InvalidArgumentException
99
+	 * @throws InvalidDataTypeException
100
+	 * @throws InvalidInterfaceException
101
+	 * @since $VID:$
102
+	 */
103
+	protected function getAttendeeModel()
104
+	{
105
+		if (! $this->attendee_model instanceof EEM_Attendee) {
106
+			$this->attendee_model = $this->getLoader()->getShared('EEM_Attendee');
107
+		}
108
+		return $this->attendee_model;
109
+	}
110
+
111
+
112
+	/**
113
+	 * @return EEM_Event
114
+	 * @throws InvalidArgumentException
115
+	 * @throws InvalidDataTypeException
116
+	 * @throws InvalidInterfaceException
117
+	 * @since $VID:$
118
+	 */
119
+	protected function getEventModel()
120
+	{
121
+		if (! $this->event_model instanceof EEM_Event) {
122
+			$this->event_model = $this->getLoader()->getShared('EEM_Event');
123
+		}
124
+		return $this->event_model;
125
+	}
126
+
127
+	/**
128
+	 * @return EEM_Status
129
+	 * @throws InvalidArgumentException
130
+	 * @throws InvalidDataTypeException
131
+	 * @throws InvalidInterfaceException
132
+	 * @since $VID:$
133
+	 */
134
+	protected function getStatusModel()
135
+	{
136
+		if (! $this->status_model instanceof EEM_Status) {
137
+			$this->status_model = $this->getLoader()->getShared('EEM_Status');
138
+		}
139
+		return $this->status_model;
140
+	}
141
+
142
+
143
+	public function wp_loaded()
144
+	{
145
+		// when adding a new registration...
146
+		if (isset($this->_req_data['action']) && $this->_req_data['action'] === 'new_registration') {
147
+			EE_System::do_not_cache();
148
+			if (! isset($this->_req_data['processing_registration'])
149
+				|| absint($this->_req_data['processing_registration']) !== 1
150
+			) {
151
+				// and it's NOT the attendee information reg step
152
+				// force cookie expiration by setting time to last week
153
+				setcookie('ee_registration_added', 0, time() - WEEK_IN_SECONDS, '/');
154
+				// and update the global
155
+				$_COOKIE['ee_registration_added'] = 0;
156
+			}
157
+		}
158
+	}
159
+
160
+
161
+	protected function _init_page_props()
162
+	{
163
+		$this->page_slug = REG_PG_SLUG;
164
+		$this->_admin_base_url = REG_ADMIN_URL;
165
+		$this->_admin_base_path = REG_ADMIN;
166
+		$this->page_label = esc_html__('Registrations', 'event_espresso');
167
+		$this->_cpt_routes = array(
168
+			'add_new_attendee' => 'espresso_attendees',
169
+			'edit_attendee'    => 'espresso_attendees',
170
+			'insert_attendee'  => 'espresso_attendees',
171
+			'update_attendee'  => 'espresso_attendees',
172
+		);
173
+		$this->_cpt_model_names = array(
174
+			'add_new_attendee' => 'EEM_Attendee',
175
+			'edit_attendee'    => 'EEM_Attendee',
176
+		);
177
+		$this->_cpt_edit_routes = array(
178
+			'espresso_attendees' => 'edit_attendee',
179
+		);
180
+		$this->_pagenow_map = array(
181
+			'add_new_attendee' => 'post-new.php',
182
+			'edit_attendee'    => 'post.php',
183
+			'trash'            => 'post.php',
184
+		);
185
+		add_action('edit_form_after_title', array($this, 'after_title_form_fields'), 10);
186
+		// add filters so that the comment urls don't take users to a confusing 404 page
187
+		add_filter('get_comment_link', array($this, 'clear_comment_link'), 10, 3);
188
+	}
189
+
190
+
191
+	public function clear_comment_link($link, $comment, $args)
192
+	{
193
+		// gotta make sure this only happens on this route
194
+		$post_type = get_post_type($comment->comment_post_ID);
195
+		if ($post_type === 'espresso_attendees') {
196
+			return '#commentsdiv';
197
+		}
198
+		return $link;
199
+	}
200
+
201
+
202
+	protected function _ajax_hooks()
203
+	{
204
+		// todo: all hooks for registrations ajax goes in here
205
+		add_action('wp_ajax_toggle_checkin_status', array($this, 'toggle_checkin_status'));
206
+	}
207
+
208
+
209
+	protected function _define_page_props()
210
+	{
211
+		$this->_admin_page_title = $this->page_label;
212
+		$this->_labels = array(
213
+			'buttons'                      => array(
214
+				'add-registrant'      => esc_html__('Add New Registration', 'event_espresso'),
215
+				'add-attendee'        => esc_html__('Add Contact', 'event_espresso'),
216
+				'edit'                => esc_html__('Edit Contact', 'event_espresso'),
217
+				'report'              => esc_html__('Event Registrations CSV Report', 'event_espresso'),
218
+				'report_all'          => esc_html__('All Registrations CSV Report', 'event_espresso'),
219
+				'report_filtered'     => esc_html__('Filtered CSV Report', 'event_espresso'),
220
+				'contact_list_report' => esc_html__('Contact List Report', 'event_espresso'),
221
+				'contact_list_export' => esc_html__('Export Data', 'event_espresso'),
222
+			),
223
+			'publishbox'                   => array(
224
+				'add_new_attendee' => esc_html__('Add Contact Record', 'event_espresso'),
225
+				'edit_attendee'    => esc_html__('Update Contact Record', 'event_espresso'),
226
+			),
227
+			'hide_add_button_on_cpt_route' => array(
228
+				'edit_attendee' => true,
229
+			),
230
+		);
231
+	}
232
+
233
+
234
+	/**
235
+	 *        grab url requests and route them
236
+	 *
237
+	 * @access private
238
+	 * @return void
239
+	 * @throws EE_Error
240
+	 */
241
+	public function _set_page_routes()
242
+	{
243
+		$this->_get_registration_status_array();
244
+		$reg_id = ! empty($this->_req_data['_REG_ID']) && ! is_array($this->_req_data['_REG_ID'])
245
+			? $this->_req_data['_REG_ID'] : 0;
246
+		$reg_id = empty($reg_id) && ! empty($this->_req_data['reg_status_change_form']['REG_ID'])
247
+			? $this->_req_data['reg_status_change_form']['REG_ID']
248
+			: $reg_id;
249
+		$att_id = ! empty($this->_req_data['ATT_ID']) && ! is_array($this->_req_data['ATT_ID'])
250
+			? $this->_req_data['ATT_ID'] : 0;
251
+		$att_id = ! empty($this->_req_data['post']) && ! is_array($this->_req_data['post'])
252
+			? $this->_req_data['post']
253
+			: $att_id;
254
+		$this->_page_routes = array(
255
+			'default'                             => array(
256
+				'func'       => '_registrations_overview_list_table',
257
+				'capability' => 'ee_read_registrations',
258
+			),
259
+			'view_registration'                   => array(
260
+				'func'       => '_registration_details',
261
+				'capability' => 'ee_read_registration',
262
+				'obj_id'     => $reg_id,
263
+			),
264
+			'edit_registration'                   => array(
265
+				'func'               => '_update_attendee_registration_form',
266
+				'noheader'           => true,
267
+				'headers_sent_route' => 'view_registration',
268
+				'capability'         => 'ee_edit_registration',
269
+				'obj_id'             => $reg_id,
270
+				'_REG_ID'            => $reg_id,
271
+			),
272
+			'trash_registrations'                 => array(
273
+				'func'       => '_trash_or_restore_registrations',
274
+				'args'       => array('trash' => true),
275
+				'noheader'   => true,
276
+				'capability' => 'ee_delete_registrations',
277
+			),
278
+			'restore_registrations'               => array(
279
+				'func'       => '_trash_or_restore_registrations',
280
+				'args'       => array('trash' => false),
281
+				'noheader'   => true,
282
+				'capability' => 'ee_delete_registrations',
283
+			),
284
+			'delete_registrations'                => array(
285
+				'func'       => '_delete_registrations',
286
+				'noheader'   => true,
287
+				'capability' => 'ee_delete_registrations',
288
+			),
289
+			'new_registration'                    => array(
290
+				'func'       => 'new_registration',
291
+				'capability' => 'ee_edit_registrations',
292
+			),
293
+			'process_reg_step'                    => array(
294
+				'func'       => 'process_reg_step',
295
+				'noheader'   => true,
296
+				'capability' => 'ee_edit_registrations',
297
+			),
298
+			'redirect_to_txn'                     => array(
299
+				'func'       => 'redirect_to_txn',
300
+				'noheader'   => true,
301
+				'capability' => 'ee_edit_registrations',
302
+			),
303
+			'change_reg_status'                   => array(
304
+				'func'       => '_change_reg_status',
305
+				'noheader'   => true,
306
+				'capability' => 'ee_edit_registration',
307
+				'obj_id'     => $reg_id,
308
+			),
309
+			'approve_registration'                => array(
310
+				'func'       => 'approve_registration',
311
+				'noheader'   => true,
312
+				'capability' => 'ee_edit_registration',
313
+				'obj_id'     => $reg_id,
314
+			),
315
+			'approve_and_notify_registration'     => array(
316
+				'func'       => 'approve_registration',
317
+				'noheader'   => true,
318
+				'args'       => array(true),
319
+				'capability' => 'ee_edit_registration',
320
+				'obj_id'     => $reg_id,
321
+			),
322
+			'approve_registrations'               => array(
323
+				'func'       => 'bulk_action_on_registrations',
324
+				'noheader'   => true,
325
+				'capability' => 'ee_edit_registrations',
326
+				'args'       => array('approve'),
327
+			),
328
+			'approve_and_notify_registrations'    => array(
329
+				'func'       => 'bulk_action_on_registrations',
330
+				'noheader'   => true,
331
+				'capability' => 'ee_edit_registrations',
332
+				'args'       => array('approve', true),
333
+			),
334
+			'decline_registration'                => array(
335
+				'func'       => 'decline_registration',
336
+				'noheader'   => true,
337
+				'capability' => 'ee_edit_registration',
338
+				'obj_id'     => $reg_id,
339
+			),
340
+			'decline_and_notify_registration'     => array(
341
+				'func'       => 'decline_registration',
342
+				'noheader'   => true,
343
+				'args'       => array(true),
344
+				'capability' => 'ee_edit_registration',
345
+				'obj_id'     => $reg_id,
346
+			),
347
+			'decline_registrations'               => array(
348
+				'func'       => 'bulk_action_on_registrations',
349
+				'noheader'   => true,
350
+				'capability' => 'ee_edit_registrations',
351
+				'args'       => array('decline'),
352
+			),
353
+			'decline_and_notify_registrations'    => array(
354
+				'func'       => 'bulk_action_on_registrations',
355
+				'noheader'   => true,
356
+				'capability' => 'ee_edit_registrations',
357
+				'args'       => array('decline', true),
358
+			),
359
+			'pending_registration'                => array(
360
+				'func'       => 'pending_registration',
361
+				'noheader'   => true,
362
+				'capability' => 'ee_edit_registration',
363
+				'obj_id'     => $reg_id,
364
+			),
365
+			'pending_and_notify_registration'     => array(
366
+				'func'       => 'pending_registration',
367
+				'noheader'   => true,
368
+				'args'       => array(true),
369
+				'capability' => 'ee_edit_registration',
370
+				'obj_id'     => $reg_id,
371
+			),
372
+			'pending_registrations'               => array(
373
+				'func'       => 'bulk_action_on_registrations',
374
+				'noheader'   => true,
375
+				'capability' => 'ee_edit_registrations',
376
+				'args'       => array('pending'),
377
+			),
378
+			'pending_and_notify_registrations'    => array(
379
+				'func'       => 'bulk_action_on_registrations',
380
+				'noheader'   => true,
381
+				'capability' => 'ee_edit_registrations',
382
+				'args'       => array('pending', true),
383
+			),
384
+			'no_approve_registration'             => array(
385
+				'func'       => 'not_approve_registration',
386
+				'noheader'   => true,
387
+				'capability' => 'ee_edit_registration',
388
+				'obj_id'     => $reg_id,
389
+			),
390
+			'no_approve_and_notify_registration'  => array(
391
+				'func'       => 'not_approve_registration',
392
+				'noheader'   => true,
393
+				'args'       => array(true),
394
+				'capability' => 'ee_edit_registration',
395
+				'obj_id'     => $reg_id,
396
+			),
397
+			'no_approve_registrations'            => array(
398
+				'func'       => 'bulk_action_on_registrations',
399
+				'noheader'   => true,
400
+				'capability' => 'ee_edit_registrations',
401
+				'args'       => array('not_approve'),
402
+			),
403
+			'no_approve_and_notify_registrations' => array(
404
+				'func'       => 'bulk_action_on_registrations',
405
+				'noheader'   => true,
406
+				'capability' => 'ee_edit_registrations',
407
+				'args'       => array('not_approve', true),
408
+			),
409
+			'cancel_registration'                 => array(
410
+				'func'       => 'cancel_registration',
411
+				'noheader'   => true,
412
+				'capability' => 'ee_edit_registration',
413
+				'obj_id'     => $reg_id,
414
+			),
415
+			'cancel_and_notify_registration'      => array(
416
+				'func'       => 'cancel_registration',
417
+				'noheader'   => true,
418
+				'args'       => array(true),
419
+				'capability' => 'ee_edit_registration',
420
+				'obj_id'     => $reg_id,
421
+			),
422
+			'cancel_registrations'                => array(
423
+				'func'       => 'bulk_action_on_registrations',
424
+				'noheader'   => true,
425
+				'capability' => 'ee_edit_registrations',
426
+				'args'       => array('cancel'),
427
+			),
428
+			'cancel_and_notify_registrations'     => array(
429
+				'func'       => 'bulk_action_on_registrations',
430
+				'noheader'   => true,
431
+				'capability' => 'ee_edit_registrations',
432
+				'args'       => array('cancel', true),
433
+			),
434
+			'wait_list_registration'              => array(
435
+				'func'       => 'wait_list_registration',
436
+				'noheader'   => true,
437
+				'capability' => 'ee_edit_registration',
438
+				'obj_id'     => $reg_id,
439
+			),
440
+			'wait_list_and_notify_registration'   => array(
441
+				'func'       => 'wait_list_registration',
442
+				'noheader'   => true,
443
+				'args'       => array(true),
444
+				'capability' => 'ee_edit_registration',
445
+				'obj_id'     => $reg_id,
446
+			),
447
+			'contact_list'                        => array(
448
+				'func'       => '_attendee_contact_list_table',
449
+				'capability' => 'ee_read_contacts',
450
+			),
451
+			'add_new_attendee'                    => array(
452
+				'func' => '_create_new_cpt_item',
453
+				'args' => array(
454
+					'new_attendee' => true,
455
+					'capability'   => 'ee_edit_contacts',
456
+				),
457
+			),
458
+			'edit_attendee'                       => array(
459
+				'func'       => '_edit_cpt_item',
460
+				'capability' => 'ee_edit_contacts',
461
+				'obj_id'     => $att_id,
462
+			),
463
+			'duplicate_attendee'                  => array(
464
+				'func'       => '_duplicate_attendee',
465
+				'noheader'   => true,
466
+				'capability' => 'ee_edit_contacts',
467
+				'obj_id'     => $att_id,
468
+			),
469
+			'insert_attendee'                     => array(
470
+				'func'       => '_insert_or_update_attendee',
471
+				'args'       => array(
472
+					'new_attendee' => true,
473
+				),
474
+				'noheader'   => true,
475
+				'capability' => 'ee_edit_contacts',
476
+			),
477
+			'update_attendee'                     => array(
478
+				'func'       => '_insert_or_update_attendee',
479
+				'args'       => array(
480
+					'new_attendee' => false,
481
+				),
482
+				'noheader'   => true,
483
+				'capability' => 'ee_edit_contacts',
484
+				'obj_id'     => $att_id,
485
+			),
486
+			'trash_attendees'                     => array(
487
+				'func'       => '_trash_or_restore_attendees',
488
+				'args'       => array(
489
+					'trash' => 'true',
490
+				),
491
+				'noheader'   => true,
492
+				'capability' => 'ee_delete_contacts',
493
+			),
494
+			'trash_attendee'                      => array(
495
+				'func'       => '_trash_or_restore_attendees',
496
+				'args'       => array(
497
+					'trash' => true,
498
+				),
499
+				'noheader'   => true,
500
+				'capability' => 'ee_delete_contacts',
501
+				'obj_id'     => $att_id,
502
+			),
503
+			'restore_attendees'                   => array(
504
+				'func'       => '_trash_or_restore_attendees',
505
+				'args'       => array(
506
+					'trash' => false,
507
+				),
508
+				'noheader'   => true,
509
+				'capability' => 'ee_delete_contacts',
510
+				'obj_id'     => $att_id,
511
+			),
512
+			'resend_registration'                 => array(
513
+				'func'       => '_resend_registration',
514
+				'noheader'   => true,
515
+				'capability' => 'ee_send_message',
516
+			),
517
+			'registrations_report'                => array(
518
+				'func'       => '_registrations_report',
519
+				'noheader'   => true,
520
+				'capability' => 'ee_read_registrations',
521
+			),
522
+			'contact_list_export'                 => array(
523
+				'func'       => '_contact_list_export',
524
+				'noheader'   => true,
525
+				'capability' => 'export',
526
+			),
527
+			'contact_list_report'                 => array(
528
+				'func'       => '_contact_list_report',
529
+				'noheader'   => true,
530
+				'capability' => 'ee_read_contacts',
531
+			),
532
+		);
533
+	}
534
+
535
+
536
+	protected function _set_page_config()
537
+	{
538
+		$this->_page_config = array(
539
+			'default'           => array(
540
+				'nav'           => array(
541
+					'label' => esc_html__('Overview', 'event_espresso'),
542
+					'order' => 5,
543
+				),
544
+				'help_tabs'     => array(
545
+					'registrations_overview_help_tab'                       => array(
546
+						'title'    => esc_html__('Registrations Overview', 'event_espresso'),
547
+						'filename' => 'registrations_overview',
548
+					),
549
+					'registrations_overview_table_column_headings_help_tab' => array(
550
+						'title'    => esc_html__('Registrations Table Column Headings', 'event_espresso'),
551
+						'filename' => 'registrations_overview_table_column_headings',
552
+					),
553
+					'registrations_overview_filters_help_tab'               => array(
554
+						'title'    => esc_html__('Registration Filters', 'event_espresso'),
555
+						'filename' => 'registrations_overview_filters',
556
+					),
557
+					'registrations_overview_views_help_tab'                 => array(
558
+						'title'    => esc_html__('Registration Views', 'event_espresso'),
559
+						'filename' => 'registrations_overview_views',
560
+					),
561
+					'registrations_regoverview_other_help_tab'              => array(
562
+						'title'    => esc_html__('Registrations Other', 'event_espresso'),
563
+						'filename' => 'registrations_overview_other',
564
+					),
565
+				),
566
+				'help_tour'     => array('Registration_Overview_Help_Tour'),
567
+				'qtips'         => array('Registration_List_Table_Tips'),
568
+				'list_table'    => 'EE_Registrations_List_Table',
569
+				'require_nonce' => false,
570
+			),
571
+			'view_registration' => array(
572
+				'nav'           => array(
573
+					'label'      => esc_html__('REG Details', 'event_espresso'),
574
+					'order'      => 15,
575
+					'url'        => isset($this->_req_data['_REG_ID'])
576
+						? add_query_arg(array('_REG_ID' => $this->_req_data['_REG_ID']), $this->_current_page_view_url)
577
+						: $this->_admin_base_url,
578
+					'persistent' => false,
579
+				),
580
+				'help_tabs'     => array(
581
+					'registrations_details_help_tab'                    => array(
582
+						'title'    => esc_html__('Registration Details', 'event_espresso'),
583
+						'filename' => 'registrations_details',
584
+					),
585
+					'registrations_details_table_help_tab'              => array(
586
+						'title'    => esc_html__('Registration Details Table', 'event_espresso'),
587
+						'filename' => 'registrations_details_table',
588
+					),
589
+					'registrations_details_form_answers_help_tab'       => array(
590
+						'title'    => esc_html__('Registration Form Answers', 'event_espresso'),
591
+						'filename' => 'registrations_details_form_answers',
592
+					),
593
+					'registrations_details_registrant_details_help_tab' => array(
594
+						'title'    => esc_html__('Contact Details', 'event_espresso'),
595
+						'filename' => 'registrations_details_registrant_details',
596
+					),
597
+				),
598
+				'help_tour'     => array('Registration_Details_Help_Tour'),
599
+				'metaboxes'     => array_merge(
600
+					$this->_default_espresso_metaboxes,
601
+					array('_registration_details_metaboxes')
602
+				),
603
+				'require_nonce' => false,
604
+			),
605
+			'new_registration'  => array(
606
+				'nav'           => array(
607
+					'label'      => esc_html__('Add New Registration', 'event_espresso'),
608
+					'url'        => '#',
609
+					'order'      => 15,
610
+					'persistent' => false,
611
+				),
612
+				'metaboxes'     => $this->_default_espresso_metaboxes,
613
+				'labels'        => array(
614
+					'publishbox' => esc_html__('Save Registration', 'event_espresso'),
615
+				),
616
+				'require_nonce' => false,
617
+			),
618
+			'add_new_attendee'  => array(
619
+				'nav'           => array(
620
+					'label'      => esc_html__('Add Contact', 'event_espresso'),
621
+					'order'      => 15,
622
+					'persistent' => false,
623
+				),
624
+				'metaboxes'     => array_merge(
625
+					$this->_default_espresso_metaboxes,
626
+					array('_publish_post_box', 'attendee_editor_metaboxes')
627
+				),
628
+				'require_nonce' => false,
629
+			),
630
+			'edit_attendee'     => array(
631
+				'nav'           => array(
632
+					'label'      => esc_html__('Edit Contact', 'event_espresso'),
633
+					'order'      => 15,
634
+					'persistent' => false,
635
+					'url'        => isset($this->_req_data['ATT_ID'])
636
+						? add_query_arg(array('ATT_ID' => $this->_req_data['ATT_ID']), $this->_current_page_view_url)
637
+						: $this->_admin_base_url,
638
+				),
639
+				'metaboxes'     => array('attendee_editor_metaboxes'),
640
+				'require_nonce' => false,
641
+			),
642
+			'contact_list'      => array(
643
+				'nav'           => array(
644
+					'label' => esc_html__('Contact List', 'event_espresso'),
645
+					'order' => 20,
646
+				),
647
+				'list_table'    => 'EE_Attendee_Contact_List_Table',
648
+				'help_tabs'     => array(
649
+					'registrations_contact_list_help_tab'                       => array(
650
+						'title'    => esc_html__('Registrations Contact List', 'event_espresso'),
651
+						'filename' => 'registrations_contact_list',
652
+					),
653
+					'registrations_contact-list_table_column_headings_help_tab' => array(
654
+						'title'    => esc_html__('Contact List Table Column Headings', 'event_espresso'),
655
+						'filename' => 'registrations_contact_list_table_column_headings',
656
+					),
657
+					'registrations_contact_list_views_help_tab'                 => array(
658
+						'title'    => esc_html__('Contact List Views', 'event_espresso'),
659
+						'filename' => 'registrations_contact_list_views',
660
+					),
661
+					'registrations_contact_list_other_help_tab'                 => array(
662
+						'title'    => esc_html__('Contact List Other', 'event_espresso'),
663
+						'filename' => 'registrations_contact_list_other',
664
+					),
665
+				),
666
+				'help_tour'     => array('Contact_List_Help_Tour'),
667
+				'metaboxes'     => array(),
668
+				'require_nonce' => false,
669
+			),
670
+			// override default cpt routes
671
+			'create_new'        => '',
672
+			'edit'              => '',
673
+		);
674
+	}
675
+
676
+
677
+	/**
678
+	 * The below methods aren't used by this class currently
679
+	 */
680
+	protected function _add_screen_options()
681
+	{
682
+	}
683
+
684
+
685
+	protected function _add_feature_pointers()
686
+	{
687
+	}
688
+
689
+
690
+	public function admin_init()
691
+	{
692
+		EE_Registry::$i18n_js_strings['update_att_qstns'] = esc_html__(
693
+			'click "Update Registration Questions" to save your changes',
694
+			'event_espresso'
695
+		);
696
+	}
697
+
698
+
699
+	public function admin_notices()
700
+	{
701
+	}
702
+
703
+
704
+	public function admin_footer_scripts()
705
+	{
706
+	}
707
+
708
+
709
+	/**
710
+	 *        get list of registration statuses
711
+	 *
712
+	 * @access private
713
+	 * @return void
714
+	 * @throws EE_Error
715
+	 */
716
+	private function _get_registration_status_array()
717
+	{
718
+		self::$_reg_status = EEM_Registration::reg_status_array(array(), true);
719
+	}
720
+
721
+
722
+	/**
723
+	 * @throws InvalidArgumentException
724
+	 * @throws InvalidDataTypeException
725
+	 * @throws InvalidInterfaceException
726
+	 * @since $VID:$
727
+	 */
728
+	protected function _add_screen_options_default()
729
+	{
730
+		$this->_per_page_screen_option();
731
+	}
732
+
733
+
734
+	/**
735
+	 * @throws InvalidArgumentException
736
+	 * @throws InvalidDataTypeException
737
+	 * @throws InvalidInterfaceException
738
+	 * @since $VID:$
739
+	 */
740
+	protected function _add_screen_options_contact_list()
741
+	{
742
+		$page_title = $this->_admin_page_title;
743
+		$this->_admin_page_title = esc_html__('Contacts', 'event_espresso');
744
+		$this->_per_page_screen_option();
745
+		$this->_admin_page_title = $page_title;
746
+	}
747
+
748
+
749
+	public function load_scripts_styles()
750
+	{
751
+		// style
752
+		wp_register_style(
753
+			'espresso_reg',
754
+			REG_ASSETS_URL . 'espresso_registrations_admin.css',
755
+			array('ee-admin-css'),
756
+			EVENT_ESPRESSO_VERSION
757
+		);
758
+		wp_enqueue_style('espresso_reg');
759
+		// script
760
+		wp_register_script(
761
+			'espresso_reg',
762
+			REG_ASSETS_URL . 'espresso_registrations_admin.js',
763
+			array('jquery-ui-datepicker', 'jquery-ui-draggable', 'ee_admin_js'),
764
+			EVENT_ESPRESSO_VERSION,
765
+			true
766
+		);
767
+		wp_enqueue_script('espresso_reg');
768
+	}
769
+
770
+
771
+	/**
772
+	 * @throws EE_Error
773
+	 * @throws InvalidArgumentException
774
+	 * @throws InvalidDataTypeException
775
+	 * @throws InvalidInterfaceException
776
+	 * @throws ReflectionException
777
+	 * @since $VID:$
778
+	 */
779
+	public function load_scripts_styles_edit_attendee()
780
+	{
781
+		// stuff to only show up on our attendee edit details page.
782
+		$attendee_details_translations = array(
783
+			'att_publish_text' => sprintf(
784
+				/* translators: The date and time */
785
+				wp_strip_all_tags(__('Created on: %s', 'event_espresso')),
786
+				'<b>' . $this->_cpt_model_obj->get_datetime('ATT_created') . '</b>'
787
+			),
788
+		);
789
+		wp_localize_script('espresso_reg', 'ATTENDEE_DETAILS', $attendee_details_translations);
790
+		wp_enqueue_script('jquery-validate');
791
+	}
792
+
793
+
794
+	/**
795
+	 * @throws EE_Error
796
+	 * @throws InvalidArgumentException
797
+	 * @throws InvalidDataTypeException
798
+	 * @throws InvalidInterfaceException
799
+	 * @throws ReflectionException
800
+	 * @since $VID:$
801
+	 */
802
+	public function load_scripts_styles_view_registration()
803
+	{
804
+		// styles
805
+		wp_enqueue_style('espresso-ui-theme');
806
+		// scripts
807
+		$this->_get_reg_custom_questions_form($this->_registration->ID());
808
+		$this->_reg_custom_questions_form->wp_enqueue_scripts(true);
809
+	}
810
+
811
+
812
+	public function load_scripts_styles_contact_list()
813
+	{
814
+		wp_dequeue_style('espresso_reg');
815
+		wp_register_style(
816
+			'espresso_att',
817
+			REG_ASSETS_URL . 'espresso_attendees_admin.css',
818
+			array('ee-admin-css'),
819
+			EVENT_ESPRESSO_VERSION
820
+		);
821
+		wp_enqueue_style('espresso_att');
822
+	}
823
+
824
+
825
+	public function load_scripts_styles_new_registration()
826
+	{
827
+		wp_register_script(
828
+			'ee-spco-for-admin',
829
+			REG_ASSETS_URL . 'spco_for_admin.js',
830
+			array('underscore', 'jquery'),
831
+			EVENT_ESPRESSO_VERSION,
832
+			true
833
+		);
834
+		wp_enqueue_script('ee-spco-for-admin');
835
+		add_filter('FHEE__EED_Ticket_Selector__load_tckt_slctr_assets', '__return_true');
836
+		EE_Form_Section_Proper::wp_enqueue_scripts();
837
+		EED_Ticket_Selector::load_tckt_slctr_assets();
838
+		EE_Datepicker_Input::enqueue_styles_and_scripts();
839
+	}
840
+
841
+
842
+	public function AHEE__EE_Admin_Page__route_admin_request_resend_registration()
843
+	{
844
+		add_filter('FHEE_load_EE_messages', '__return_true');
845
+	}
846
+
847
+
848
+	public function AHEE__EE_Admin_Page__route_admin_request_approve_registration()
849
+	{
850
+		add_filter('FHEE_load_EE_messages', '__return_true');
851
+	}
852
+
853
+
854
+	/**
855
+	 * @throws EE_Error
856
+	 * @throws InvalidArgumentException
857
+	 * @throws InvalidDataTypeException
858
+	 * @throws InvalidInterfaceException
859
+	 * @throws ReflectionException
860
+	 * @since $VID:$
861
+	 */
862
+	protected function _set_list_table_views_default()
863
+	{
864
+		// for notification related bulk actions we need to make sure only active messengers have an option.
865
+		EED_Messages::set_autoloaders();
866
+		/** @type EE_Message_Resource_Manager $message_resource_manager */
867
+		$message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
868
+		$active_mts = $message_resource_manager->list_of_active_message_types();
869
+		// key= bulk_action_slug, value= message type.
870
+		$match_array = array(
871
+			'approve_registrations'    => 'registration',
872
+			'decline_registrations'    => 'declined_registration',
873
+			'pending_registrations'    => 'pending_approval',
874
+			'no_approve_registrations' => 'not_approved_registration',
875
+			'cancel_registrations'     => 'cancelled_registration',
876
+		);
877
+		$can_send = EE_Registry::instance()->CAP->current_user_can(
878
+			'ee_send_message',
879
+			'batch_send_messages'
880
+		);
881
+		/** setup reg status bulk actions **/
882
+		$def_reg_status_actions['approve_registrations'] = esc_html__('Approve Registrations', 'event_espresso');
883
+		if ($can_send && in_array($match_array['approve_registrations'], $active_mts, true)) {
884
+			$def_reg_status_actions['approve_and_notify_registrations'] = esc_html__(
885
+				'Approve and Notify Registrations',
886
+				'event_espresso'
887
+			);
888
+		}
889
+		$def_reg_status_actions['decline_registrations'] = esc_html__('Decline Registrations', 'event_espresso');
890
+		if ($can_send && in_array($match_array['decline_registrations'], $active_mts, true)) {
891
+			$def_reg_status_actions['decline_and_notify_registrations'] = esc_html__(
892
+				'Decline and Notify Registrations',
893
+				'event_espresso'
894
+			);
895
+		}
896
+		$def_reg_status_actions['pending_registrations'] = esc_html__(
897
+			'Set Registrations to Pending Payment',
898
+			'event_espresso'
899
+		);
900
+		if ($can_send && in_array($match_array['pending_registrations'], $active_mts, true)) {
901
+			$def_reg_status_actions['pending_and_notify_registrations'] = esc_html__(
902
+				'Set Registrations to Pending Payment and Notify',
903
+				'event_espresso'
904
+			);
905
+		}
906
+		$def_reg_status_actions['no_approve_registrations'] = esc_html__(
907
+			'Set Registrations to Not Approved',
908
+			'event_espresso'
909
+		);
910
+		if ($can_send && in_array($match_array['no_approve_registrations'], $active_mts, true)) {
911
+			$def_reg_status_actions['no_approve_and_notify_registrations'] = esc_html__(
912
+				'Set Registrations to Not Approved and Notify',
913
+				'event_espresso'
914
+			);
915
+		}
916
+		$def_reg_status_actions['cancel_registrations'] = esc_html__('Cancel Registrations', 'event_espresso');
917
+		if ($can_send && in_array($match_array['cancel_registrations'], $active_mts, true)) {
918
+			$def_reg_status_actions['cancel_and_notify_registrations'] = esc_html__(
919
+				'Cancel Registrations and Notify',
920
+				'event_espresso'
921
+			);
922
+		}
923
+		$def_reg_status_actions = apply_filters(
924
+			'FHEE__Registrations_Admin_Page___set_list_table_views_default__def_reg_status_actions_array',
925
+			$def_reg_status_actions,
926
+			$active_mts,
927
+			$can_send
928
+		);
929
+
930
+		$this->_views = array(
931
+			'all'   => array(
932
+				'slug'        => 'all',
933
+				'label'       => esc_html__('View All Registrations', 'event_espresso'),
934
+				'count'       => 0,
935
+				'bulk_action' => array_merge(
936
+					$def_reg_status_actions,
937
+					array(
938
+						'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
939
+					)
940
+				),
941
+			),
942
+			'month' => array(
943
+				'slug'        => 'month',
944
+				'label'       => esc_html__('This Month', 'event_espresso'),
945
+				'count'       => 0,
946
+				'bulk_action' => array_merge(
947
+					$def_reg_status_actions,
948
+					array(
949
+						'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
950
+					)
951
+				),
952
+			),
953
+			'today' => array(
954
+				'slug'        => 'today',
955
+				'label'       => sprintf(
956
+					esc_html__('Today - %s', 'event_espresso'),
957
+					date('M d, Y', current_time('timestamp'))
958
+				),
959
+				'count'       => 0,
960
+				'bulk_action' => array_merge(
961
+					$def_reg_status_actions,
962
+					array(
963
+						'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
964
+					)
965
+				),
966
+			),
967
+		);
968
+		if (EE_Registry::instance()->CAP->current_user_can(
969
+			'ee_delete_registrations',
970
+			'espresso_registrations_delete_registration'
971
+		)) {
972
+			$this->_views['incomplete'] = array(
973
+				'slug'        => 'incomplete',
974
+				'label'       => esc_html__('Incomplete', 'event_espresso'),
975
+				'count'       => 0,
976
+				'bulk_action' => array(
977
+					'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
978
+				),
979
+			);
980
+			$this->_views['trash'] = array(
981
+				'slug'        => 'trash',
982
+				'label'       => esc_html__('Trash', 'event_espresso'),
983
+				'count'       => 0,
984
+				'bulk_action' => array(
985
+					'restore_registrations' => esc_html__('Restore Registrations', 'event_espresso'),
986
+					'delete_registrations'  => esc_html__('Delete Registrations Permanently', 'event_espresso'),
987
+				),
988
+			);
989
+		}
990
+	}
991
+
992
+
993
+	protected function _set_list_table_views_contact_list()
994
+	{
995
+		$this->_views = array(
996
+			'in_use' => array(
997
+				'slug'        => 'in_use',
998
+				'label'       => esc_html__('In Use', 'event_espresso'),
999
+				'count'       => 0,
1000
+				'bulk_action' => array(
1001
+					'trash_attendees' => esc_html__('Move to Trash', 'event_espresso'),
1002
+				),
1003
+			),
1004
+		);
1005
+		if (EE_Registry::instance()->CAP->current_user_can(
1006
+			'ee_delete_contacts',
1007
+			'espresso_registrations_trash_attendees'
1008
+		)
1009
+		) {
1010
+			$this->_views['trash'] = array(
1011
+				'slug'        => 'trash',
1012
+				'label'       => esc_html__('Trash', 'event_espresso'),
1013
+				'count'       => 0,
1014
+				'bulk_action' => array(
1015
+					'restore_attendees' => esc_html__('Restore from Trash', 'event_espresso'),
1016
+				),
1017
+			);
1018
+		}
1019
+	}
1020
+
1021
+
1022
+	protected function _registration_legend_items()
1023
+	{
1024
+		$fc_items = array(
1025
+			'star-icon'        => array(
1026
+				'class' => 'dashicons dashicons-star-filled lt-blue-icon ee-icon-size-8',
1027
+				'desc'  => esc_html__('This is the Primary Registrant', 'event_espresso'),
1028
+			),
1029
+			'view_details'     => array(
1030
+				'class' => 'dashicons dashicons-clipboard',
1031
+				'desc'  => esc_html__('View Registration Details', 'event_espresso'),
1032
+			),
1033
+			'edit_attendee'    => array(
1034
+				'class' => 'ee-icon ee-icon-user-edit ee-icon-size-16',
1035
+				'desc'  => esc_html__('Edit Contact Details', 'event_espresso'),
1036
+			),
1037
+			'view_transaction' => array(
1038
+				'class' => 'dashicons dashicons-cart',
1039
+				'desc'  => esc_html__('View Transaction Details', 'event_espresso'),
1040
+			),
1041
+			'view_invoice'     => array(
1042
+				'class' => 'dashicons dashicons-media-spreadsheet',
1043
+				'desc'  => esc_html__('View Transaction Invoice', 'event_espresso'),
1044
+			),
1045
+		);
1046
+		if (EE_Registry::instance()->CAP->current_user_can(
1047
+			'ee_send_message',
1048
+			'espresso_registrations_resend_registration'
1049
+		)) {
1050
+			$fc_items['resend_registration'] = array(
1051
+				'class' => 'dashicons dashicons-email-alt',
1052
+				'desc'  => esc_html__('Resend Registration Details', 'event_espresso'),
1053
+			);
1054
+		} else {
1055
+			$fc_items['blank'] = array('class' => 'blank', 'desc' => '');
1056
+		}
1057
+		if (EE_Registry::instance()->CAP->current_user_can(
1058
+			'ee_read_global_messages',
1059
+			'view_filtered_messages'
1060
+		)) {
1061
+			$related_for_icon = EEH_MSG_Template::get_message_action_icon('see_notifications_for');
1062
+			if (is_array($related_for_icon) && isset($related_for_icon['css_class'], $related_for_icon['label'])) {
1063
+				$fc_items['view_related_messages'] = array(
1064
+					'class' => $related_for_icon['css_class'],
1065
+					'desc'  => $related_for_icon['label'],
1066
+				);
1067
+			}
1068
+		}
1069
+		$sc_items = array(
1070
+			'approved_status'   => array(
1071
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_approved,
1072
+				'desc'  => EEH_Template::pretty_status(
1073
+					EEM_Registration::status_id_approved,
1074
+					false,
1075
+					'sentence'
1076
+				),
1077
+			),
1078
+			'pending_status'    => array(
1079
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_pending_payment,
1080
+				'desc'  => EEH_Template::pretty_status(
1081
+					EEM_Registration::status_id_pending_payment,
1082
+					false,
1083
+					'sentence'
1084
+				),
1085
+			),
1086
+			'wait_list'         => array(
1087
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_wait_list,
1088
+				'desc'  => EEH_Template::pretty_status(
1089
+					EEM_Registration::status_id_wait_list,
1090
+					false,
1091
+					'sentence'
1092
+				),
1093
+			),
1094
+			'incomplete_status' => array(
1095
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_incomplete,
1096
+				'desc'  => EEH_Template::pretty_status(
1097
+					EEM_Registration::status_id_incomplete,
1098
+					false,
1099
+					'sentence'
1100
+				),
1101
+			),
1102
+			'not_approved'      => array(
1103
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_not_approved,
1104
+				'desc'  => EEH_Template::pretty_status(
1105
+					EEM_Registration::status_id_not_approved,
1106
+					false,
1107
+					'sentence'
1108
+				),
1109
+			),
1110
+			'declined_status'   => array(
1111
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_declined,
1112
+				'desc'  => EEH_Template::pretty_status(
1113
+					EEM_Registration::status_id_declined,
1114
+					false,
1115
+					'sentence'
1116
+				),
1117
+			),
1118
+			'cancelled_status'  => array(
1119
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_cancelled,
1120
+				'desc'  => EEH_Template::pretty_status(
1121
+					EEM_Registration::status_id_cancelled,
1122
+					false,
1123
+					'sentence'
1124
+				),
1125
+			),
1126
+		);
1127
+		return array_merge($fc_items, $sc_items);
1128
+	}
1129
+
1130
+
1131
+
1132
+	/***************************************        REGISTRATION OVERVIEW        **************************************/
1133
+
1134
+
1135
+
1136
+	/**
1137
+	 * @throws DomainException
1138
+	 * @throws EE_Error
1139
+	 * @throws InvalidArgumentException
1140
+	 * @throws InvalidDataTypeException
1141
+	 * @throws InvalidInterfaceException
1142
+	 * @throws ReflectionException
1143
+	 */
1144
+	protected function _registrations_overview_list_table()
1145
+	{
1146
+		$this->appendAddNewRegistrationButtonToPageTitle();
1147
+		$header_text = '';
1148
+		$admin_page_header_decorators = [
1149
+			'EventEspresso\core\domain\services\admin\registrations\list_table\page_header\AttendeeFilterHeader',
1150
+			'EventEspresso\core\domain\services\admin\registrations\list_table\page_header\EventFilterHeader',
1151
+			'EventEspresso\core\domain\services\admin\registrations\list_table\page_header\DateFilterHeader',
1152
+			'EventEspresso\core\domain\services\admin\registrations\list_table\page_header\TicketFilterHeader',
1153
+		];
1154
+		foreach ($admin_page_header_decorators as $admin_page_header_decorator) {
1155
+			$filter_header_decorator = $this->getLoader()->getNew($admin_page_header_decorator);
1156
+			$header_text = $filter_header_decorator->getHeaderText($header_text);
1157
+		}
1158
+		$this->_template_args['admin_page_header'] = $header_text;
1159
+		$this->_template_args['after_list_table'] = $this->_display_legend($this->_registration_legend_items());
1160
+		$this->display_admin_list_table_page_with_no_sidebar();
1161
+	}
1162
+
1163
+
1164
+	/**
1165
+	 * @throws EE_Error
1166
+	 * @throws InvalidArgumentException
1167
+	 * @throws InvalidDataTypeException
1168
+	 * @throws InvalidInterfaceException
1169
+	 */
1170
+	private function appendAddNewRegistrationButtonToPageTitle()
1171
+	{
1172
+		$EVT_ID = ! empty($this->_req_data['event_id'])
1173
+			? absint($this->_req_data['event_id'])
1174
+			: 0;
1175
+		if ($EVT_ID
1176
+			&& EE_Registry::instance()->CAP->current_user_can(
1177
+				'ee_edit_registrations',
1178
+				'espresso_registrations_new_registration',
1179
+				$EVT_ID
1180
+			)
1181
+		) {
1182
+			$this->_admin_page_title .= ' ' . $this->get_action_link_or_button(
1183
+				'new_registration',
1184
+				'add-registrant',
1185
+				array('event_id' => $EVT_ID),
1186
+				'add-new-h2'
1187
+			);
1188
+		}
1189
+	}
1190
+
1191
+
1192
+	/**
1193
+	 * This sets the _registration property for the registration details screen
1194
+	 *
1195
+	 * @access private
1196
+	 * @return bool
1197
+	 * @throws EE_Error
1198
+	 * @throws InvalidArgumentException
1199
+	 * @throws InvalidDataTypeException
1200
+	 * @throws InvalidInterfaceException
1201
+	 */
1202
+	private function _set_registration_object()
1203
+	{
1204
+		// get out if we've already set the object
1205
+		if ($this->_registration instanceof EE_Registration) {
1206
+			return true;
1207
+		}
1208
+		$REG_ID = (! empty($this->_req_data['_REG_ID'])) ? absint($this->_req_data['_REG_ID']) : false;
1209
+		if ($this->_registration = $this->getRegistrationModel()->get_one_by_ID($REG_ID)) {
1210
+			return true;
1211
+		}
1212
+		$error_msg = sprintf(
1213
+			esc_html__(
1214
+				'An error occurred and the details for Registration ID #%s could not be retrieved.',
1215
+				'event_espresso'
1216
+			),
1217
+			$REG_ID
1218
+		);
1219
+		EE_Error::add_error($error_msg, __FILE__, __FUNCTION__, __LINE__);
1220
+		$this->_registration = null;
1221
+		return false;
1222
+	}
1223
+
1224
+
1225
+	/**
1226
+	 * Used to retrieve registrations for the list table.
1227
+	 *
1228
+	 * @param int  $per_page
1229
+	 * @param bool $count
1230
+	 * @param bool $this_month
1231
+	 * @param bool $today
1232
+	 * @return EE_Registration[]|int
1233
+	 * @throws EE_Error
1234
+	 * @throws InvalidArgumentException
1235
+	 * @throws InvalidDataTypeException
1236
+	 * @throws InvalidInterfaceException
1237
+	 */
1238
+	public function get_registrations(
1239
+		$per_page = 10,
1240
+		$count = false,
1241
+		$this_month = false,
1242
+		$today = false
1243
+	) {
1244
+		if ($this_month) {
1245
+			$this->_req_data['status'] = 'month';
1246
+		}
1247
+		if ($today) {
1248
+			$this->_req_data['status'] = 'today';
1249
+		}
1250
+		$query_params = $this->_get_registration_query_parameters($this->_req_data, $per_page, $count);
1251
+		/**
1252
+		 * Override the default groupby added by EEM_Base so that sorts with multiple order bys work as expected
1253
+		 *
1254
+		 * @link https://events.codebasehq.com/projects/event-espresso/tickets/10093
1255
+		 * @see https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md
1256
+		 *                             or if you have the development copy of EE you can view this at the path:
1257
+		 *                             /docs/G--Model-System/model-query-params.md
1258
+		 */
1259
+		$query_params['group_by'] = '';
1260
+
1261
+		return $count
1262
+			? $this->getRegistrationModel()->count($query_params)
1263
+			/** @type EE_Registration[] */
1264
+			: $this->getRegistrationModel()->get_all($query_params);
1265
+	}
1266
+
1267
+
1268
+	/**
1269
+	 * Retrieves the query parameters to be used by the Registration model for getting registrations.
1270
+	 * Note: this listens to values on the request for some of the query parameters.
1271
+	 *
1272
+	 * @param array $request
1273
+	 * @param int   $per_page
1274
+	 * @param bool  $count
1275
+	 * @return array
1276
+	 * @throws EE_Error
1277
+	 * @throws InvalidArgumentException
1278
+	 * @throws InvalidDataTypeException
1279
+	 * @throws InvalidInterfaceException
1280
+	 */
1281
+	protected function _get_registration_query_parameters(
1282
+		$request = array(),
1283
+		$per_page = 10,
1284
+		$count = false
1285
+	) {
1286
+		/** @var EventEspresso\core\domain\services\admin\registrations\list_table\QueryBuilder $list_table_query_builder */
1287
+		$list_table_query_builder = $this->getLoader()->getNew(
1288
+			'EventEspresso\core\domain\services\admin\registrations\list_table\QueryBuilder',
1289
+			[ $request ]
1290
+		);
1291
+		return $list_table_query_builder->getQueryParams($per_page, $count);
1292
+	}
1293
+
1294
+
1295
+	public function get_registration_status_array()
1296
+	{
1297
+		return self::$_reg_status;
1298
+	}
1299
+
1300
+
1301
+
1302
+
1303
+	/***************************************        REGISTRATION DETAILS        ***************************************/
1304
+	/**
1305
+	 *        generates HTML for the View Registration Details Admin page
1306
+	 *
1307
+	 * @access protected
1308
+	 * @return void
1309
+	 * @throws DomainException
1310
+	 * @throws EE_Error
1311
+	 * @throws InvalidArgumentException
1312
+	 * @throws InvalidDataTypeException
1313
+	 * @throws InvalidInterfaceException
1314
+	 * @throws EntityNotFoundException
1315
+	 * @throws ReflectionException
1316
+	 */
1317
+	protected function _registration_details()
1318
+	{
1319
+		$this->_template_args = array();
1320
+		$this->_set_registration_object();
1321
+		if (is_object($this->_registration)) {
1322
+			$transaction = $this->_registration->transaction()
1323
+				? $this->_registration->transaction()
1324
+				: EE_Transaction::new_instance();
1325
+			$this->_session = $transaction->session_data();
1326
+			$event_id = $this->_registration->event_ID();
1327
+			$this->_template_args['reg_nmbr']['value'] = $this->_registration->ID();
1328
+			$this->_template_args['reg_nmbr']['label'] = esc_html__('Registration Number', 'event_espresso');
1329
+			$this->_template_args['reg_datetime']['value'] = $this->_registration->get_i18n_datetime('REG_date');
1330
+			$this->_template_args['reg_datetime']['label'] = esc_html__('Date', 'event_espresso');
1331
+			$this->_template_args['grand_total'] = $transaction->total();
1332
+			$this->_template_args['currency_sign'] = EE_Registry::instance()->CFG->currency->sign;
1333
+			// link back to overview
1334
+			$this->_template_args['reg_overview_url'] = REG_ADMIN_URL;
1335
+			$this->_template_args['registration'] = $this->_registration;
1336
+			$this->_template_args['filtered_registrations_link'] = EE_Admin_Page::add_query_args_and_nonce(
1337
+				array(
1338
+					'action'   => 'default',
1339
+					'event_id' => $event_id,
1340
+				),
1341
+				REG_ADMIN_URL
1342
+			);
1343
+			$this->_template_args['filtered_transactions_link'] = EE_Admin_Page::add_query_args_and_nonce(
1344
+				array(
1345
+					'action' => 'default',
1346
+					'EVT_ID' => $event_id,
1347
+					'page'   => 'espresso_transactions',
1348
+				),
1349
+				admin_url('admin.php')
1350
+			);
1351
+			$this->_template_args['event_link'] = EE_Admin_Page::add_query_args_and_nonce(
1352
+				array(
1353
+					'page'   => 'espresso_events',
1354
+					'action' => 'edit',
1355
+					'post'   => $event_id,
1356
+				),
1357
+				admin_url('admin.php')
1358
+			);
1359
+			// next and previous links
1360
+			$next_reg = $this->_registration->next(
1361
+				null,
1362
+				array(),
1363
+				'REG_ID'
1364
+			);
1365
+			$this->_template_args['next_registration'] = $next_reg
1366
+				? $this->_next_link(
1367
+					EE_Admin_Page::add_query_args_and_nonce(
1368
+						array(
1369
+							'action'  => 'view_registration',
1370
+							'_REG_ID' => $next_reg['REG_ID'],
1371
+						),
1372
+						REG_ADMIN_URL
1373
+					),
1374
+					'dashicons dashicons-arrow-right ee-icon-size-22'
1375
+				)
1376
+				: '';
1377
+			$previous_reg = $this->_registration->previous(
1378
+				null,
1379
+				array(),
1380
+				'REG_ID'
1381
+			);
1382
+			$this->_template_args['previous_registration'] = $previous_reg
1383
+				? $this->_previous_link(
1384
+					EE_Admin_Page::add_query_args_and_nonce(
1385
+						array(
1386
+							'action'  => 'view_registration',
1387
+							'_REG_ID' => $previous_reg['REG_ID'],
1388
+						),
1389
+						REG_ADMIN_URL
1390
+					),
1391
+					'dashicons dashicons-arrow-left ee-icon-size-22'
1392
+				)
1393
+				: '';
1394
+			// grab header
1395
+			$template_path = REG_TEMPLATE_PATH . 'reg_admin_details_header.template.php';
1396
+			$this->_template_args['REG_ID'] = $this->_registration->ID();
1397
+			$this->_template_args['admin_page_header'] = EEH_Template::display_template(
1398
+				$template_path,
1399
+				$this->_template_args,
1400
+				true
1401
+			);
1402
+		} else {
1403
+			$this->_template_args['admin_page_header'] = $this->display_espresso_notices();
1404
+		}
1405
+		// the details template wrapper
1406
+		$this->display_admin_page_with_sidebar();
1407
+	}
1408
+
1409
+
1410
+	/**
1411
+	 * @throws EE_Error
1412
+	 * @throws InvalidArgumentException
1413
+	 * @throws InvalidDataTypeException
1414
+	 * @throws InvalidInterfaceException
1415
+	 * @throws ReflectionException
1416
+	 * @since $VID:$
1417
+	 */
1418
+	protected function _registration_details_metaboxes()
1419
+	{
1420
+		do_action('AHEE__Registrations_Admin_Page___registration_details_metabox__start', $this);
1421
+		$this->_set_registration_object();
1422
+		$attendee = $this->_registration instanceof EE_Registration ? $this->_registration->attendee() : null;
1423
+		add_meta_box(
1424
+			'edit-reg-status-mbox',
1425
+			esc_html__('Registration Status', 'event_espresso'),
1426
+			array($this, 'set_reg_status_buttons_metabox'),
1427
+			$this->wp_page_slug,
1428
+			'normal',
1429
+			'high'
1430
+		);
1431
+		add_meta_box(
1432
+			'edit-reg-details-mbox',
1433
+			esc_html__('Registration Details', 'event_espresso'),
1434
+			array($this, '_reg_details_meta_box'),
1435
+			$this->wp_page_slug,
1436
+			'normal',
1437
+			'high'
1438
+		);
1439
+		if ($attendee instanceof EE_Attendee
1440
+			&& EE_Registry::instance()->CAP->current_user_can(
1441
+				'ee_read_registration',
1442
+				'edit-reg-questions-mbox',
1443
+				$this->_registration->ID()
1444
+			)
1445
+		) {
1446
+			add_meta_box(
1447
+				'edit-reg-questions-mbox',
1448
+				esc_html__('Registration Form Answers', 'event_espresso'),
1449
+				array($this, '_reg_questions_meta_box'),
1450
+				$this->wp_page_slug,
1451
+				'normal',
1452
+				'high'
1453
+			);
1454
+		}
1455
+		add_meta_box(
1456
+			'edit-reg-registrant-mbox',
1457
+			esc_html__('Contact Details', 'event_espresso'),
1458
+			array($this, '_reg_registrant_side_meta_box'),
1459
+			$this->wp_page_slug,
1460
+			'side',
1461
+			'high'
1462
+		);
1463
+		if ($this->_registration->group_size() > 1) {
1464
+			add_meta_box(
1465
+				'edit-reg-attendees-mbox',
1466
+				esc_html__('Other Registrations in this Transaction', 'event_espresso'),
1467
+				array($this, '_reg_attendees_meta_box'),
1468
+				$this->wp_page_slug,
1469
+				'normal',
1470
+				'high'
1471
+			);
1472
+		}
1473
+	}
1474
+
1475
+
1476
+	/**
1477
+	 * set_reg_status_buttons_metabox
1478
+	 *
1479
+	 * @access protected
1480
+	 * @return string
1481
+	 * @throws EE_Error
1482
+	 * @throws EntityNotFoundException
1483
+	 * @throws InvalidArgumentException
1484
+	 * @throws InvalidDataTypeException
1485
+	 * @throws InvalidInterfaceException
1486
+	 * @throws ReflectionException
1487
+	 */
1488
+	public function set_reg_status_buttons_metabox()
1489
+	{
1490
+		$this->_set_registration_object();
1491
+		$change_reg_status_form = $this->_generate_reg_status_change_form();
1492
+		echo $change_reg_status_form->form_open(
1493
+			self::add_query_args_and_nonce(
1494
+				array(
1495
+					'action' => 'change_reg_status',
1496
+				),
1497
+				REG_ADMIN_URL
1498
+			)
1499
+		);
1500
+		echo $change_reg_status_form->get_html();
1501
+		echo $change_reg_status_form->form_close();
1502
+	}
1503
+
1504
+
1505
+	/**
1506
+	 * @return EE_Form_Section_Proper
1507
+	 * @throws EE_Error
1508
+	 * @throws InvalidArgumentException
1509
+	 * @throws InvalidDataTypeException
1510
+	 * @throws InvalidInterfaceException
1511
+	 * @throws EntityNotFoundException
1512
+	 * @throws ReflectionException
1513
+	 */
1514
+	protected function _generate_reg_status_change_form()
1515
+	{
1516
+		$reg_status_change_form_array = array(
1517
+			'name'            => 'reg_status_change_form',
1518
+			'html_id'         => 'reg-status-change-form',
1519
+			'layout_strategy' => new EE_Admin_Two_Column_Layout(),
1520
+			'subsections'     => array(
1521
+				'return'             => new EE_Hidden_Input(
1522
+					array(
1523
+						'name'    => 'return',
1524
+						'default' => 'view_registration',
1525
+					)
1526
+				),
1527
+				'REG_ID'             => new EE_Hidden_Input(
1528
+					array(
1529
+						'name'    => 'REG_ID',
1530
+						'default' => $this->_registration->ID(),
1531
+					)
1532
+				),
1533
+				'current_status'     => new EE_Form_Section_HTML(
1534
+					EEH_HTML::table(
1535
+						EEH_HTML::tr(
1536
+							EEH_HTML::th(
1537
+								EEH_HTML::label(
1538
+									EEH_HTML::strong(
1539
+										esc_html__('Current Registration Status', 'event_espresso')
1540
+									)
1541
+								)
1542
+							)
1543
+							. EEH_HTML::td(
1544
+								EEH_HTML::strong(
1545
+									$this->_registration->pretty_status(),
1546
+									'',
1547
+									'status-' . $this->_registration->status_ID(),
1548
+									'line-height: 1em; font-size: 1.5em; font-weight: bold;'
1549
+								)
1550
+							)
1551
+						)
1552
+					)
1553
+				)
1554
+			)
1555
+		);
1556
+		if (EE_Registry::instance()->CAP->current_user_can(
1557
+			'ee_edit_registration',
1558
+			'toggle_registration_status',
1559
+			$this->_registration->ID()
1560
+		)) {
1561
+			$reg_status_change_form_array['subsections']['reg_status'] = new EE_Select_Input(
1562
+				$this->_get_reg_statuses(),
1563
+				array(
1564
+					'html_label_text' => esc_html__('Change Registration Status to', 'event_espresso'),
1565
+					'default'         => $this->_registration->status_ID(),
1566
+				)
1567
+			);
1568
+			$reg_status_change_form_array['subsections']['send_notifications'] = new EE_Yes_No_Input(
1569
+				array(
1570
+					'html_label_text' => esc_html__('Send Related Messages', 'event_espresso'),
1571
+					'default'         => false,
1572
+					'html_help_text'  => esc_html__(
1573
+						'If set to "Yes", then the related messages will be sent to the registrant.',
1574
+						'event_espresso'
1575
+					)
1576
+				)
1577
+			);
1578
+			$reg_status_change_form_array['subsections']['submit'] = new EE_Submit_Input(
1579
+				array(
1580
+					'html_class'      => 'button-primary',
1581
+					'html_label_text' => '&nbsp;',
1582
+					'default'         => esc_html__('Update Registration Status', 'event_espresso'),
1583
+				)
1584
+			);
1585
+		}
1586
+		return new EE_Form_Section_Proper($reg_status_change_form_array);
1587
+	}
1588
+
1589
+
1590
+	/**
1591
+	 * Returns an array of all the buttons for the various statuses and switch status actions
1592
+	 *
1593
+	 * @return array
1594
+	 * @throws EE_Error
1595
+	 * @throws InvalidArgumentException
1596
+	 * @throws InvalidDataTypeException
1597
+	 * @throws InvalidInterfaceException
1598
+	 * @throws EntityNotFoundException
1599
+	 */
1600
+	protected function _get_reg_statuses()
1601
+	{
1602
+		$reg_status_array = $this->getRegistrationModel()->reg_status_array();
1603
+		unset($reg_status_array[ EEM_Registration::status_id_incomplete ]);
1604
+		// get current reg status
1605
+		$current_status = $this->_registration->status_ID();
1606
+		// is registration for free event? This will determine whether to display the pending payment option
1607
+		if ($current_status !== EEM_Registration::status_id_pending_payment
1608
+			&& EEH_Money::compare_floats($this->_registration->ticket()->price(), 0.00)
1609
+		) {
1610
+			unset($reg_status_array[ EEM_Registration::status_id_pending_payment ]);
1611
+		}
1612
+		return $this->getStatusModel()->localized_status($reg_status_array, false, 'sentence');
1613
+	}
1614
+
1615
+
1616
+	/**
1617
+	 * This method is used when using _REG_ID from request which may or may not be an array of reg_ids.
1618
+	 *
1619
+	 * @param bool $status REG status given for changing registrations to.
1620
+	 * @param bool $notify Whether to send messages notifications or not.
1621
+	 * @return array (array with reg_id(s) updated and whether update was successful.
1622
+	 * @throws DomainException
1623
+	 * @throws EE_Error
1624
+	 * @throws EntityNotFoundException
1625
+	 * @throws InvalidArgumentException
1626
+	 * @throws InvalidDataTypeException
1627
+	 * @throws InvalidInterfaceException
1628
+	 * @throws ReflectionException
1629
+	 * @throws RuntimeException
1630
+	 */
1631
+	protected function _set_registration_status_from_request($status = false, $notify = false)
1632
+	{
1633
+		if (isset($this->_req_data['reg_status_change_form'])) {
1634
+			$REG_IDs = isset($this->_req_data['reg_status_change_form']['REG_ID'])
1635
+				? (array) $this->_req_data['reg_status_change_form']['REG_ID']
1636
+				: array();
1637
+		} else {
1638
+			$REG_IDs = isset($this->_req_data['_REG_ID'])
1639
+				? (array) $this->_req_data['_REG_ID']
1640
+				: array();
1641
+		}
1642
+		// sanitize $REG_IDs
1643
+		$REG_IDs = array_map('absint', $REG_IDs);
1644
+		// and remove empty entries
1645
+		$REG_IDs = array_filter($REG_IDs);
1646
+
1647
+		$result = $this->_set_registration_status($REG_IDs, $status, $notify);
1648
+
1649
+		/**
1650
+		 * Set and filter $_req_data['_REG_ID'] for any potential future messages notifications.
1651
+		 * Currently this value is used downstream by the _process_resend_registration method.
1652
+		 *
1653
+		 * @param int|array                $registration_ids The registration ids that have had their status changed successfully.
1654
+		 * @param bool                     $status           The status registrations were changed to.
1655
+		 * @param bool                     $success          If the status was changed successfully for all registrations.
1656
+		 * @param Registrations_Admin_Page $admin_page_object
1657
+		 */
1658
+		$this->_req_data['_REG_ID'] = apply_filters(
1659
+			'FHEE__Registrations_Admin_Page___set_registration_status_from_request__REG_IDs',
1660
+			$result['REG_ID'],
1661
+			$status,
1662
+			$result['success'],
1663
+			$this
1664
+		);
1665
+
1666
+		// notify?
1667
+		if ($notify
1668
+			&& $result['success']
1669
+			&& ! empty($this->_req_data['_REG_ID'])
1670
+			&& EE_Registry::instance()->CAP->current_user_can(
1671
+				'ee_send_message',
1672
+				'espresso_registrations_resend_registration'
1673
+			)
1674
+		) {
1675
+			$this->_process_resend_registration();
1676
+		}
1677
+		return $result;
1678
+	}
1679
+
1680
+
1681
+	/**
1682
+	 * Set the registration status for the given reg_id (which may or may not be an array, it gets typecast to an
1683
+	 * array). Note, this method does NOT take care of possible notifications.  That is required by calling code.
1684
+	 *
1685
+	 * @param array  $REG_IDs
1686
+	 * @param string $status
1687
+	 * @param bool   $notify  Used to indicate whether notification was requested or not.  This determines the context
1688
+	 *                        slug sent with setting the registration status.
1689
+	 * @return array (an array with 'success' key representing whether status change was successful, and 'REG_ID' as
1690
+	 * @throws EE_Error
1691
+	 * @throws InvalidArgumentException
1692
+	 * @throws InvalidDataTypeException
1693
+	 * @throws InvalidInterfaceException
1694
+	 * @throws ReflectionException
1695
+	 * @throws RuntimeException
1696
+	 * @throws EntityNotFoundException
1697
+	 * @throws DomainException
1698
+	 */
1699
+	protected function _set_registration_status($REG_IDs = array(), $status = '', $notify = false)
1700
+	{
1701
+		$success = false;
1702
+		// typecast $REG_IDs
1703
+		$REG_IDs = (array) $REG_IDs;
1704
+		if (! empty($REG_IDs)) {
1705
+			$success = true;
1706
+			// set default status if none is passed
1707
+			$status = $status ? $status : EEM_Registration::status_id_pending_payment;
1708
+			$status_context = $notify
1709
+				? Domain::CONTEXT_REGISTRATION_STATUS_CHANGE_REGISTRATION_ADMIN_NOTIFY
1710
+				: Domain::CONTEXT_REGISTRATION_STATUS_CHANGE_REGISTRATION_ADMIN;
1711
+			// loop through REG_ID's and change status
1712
+			foreach ($REG_IDs as $REG_ID) {
1713
+				$registration = $this->getRegistrationModel()->get_one_by_ID($REG_ID);
1714
+				if ($registration instanceof EE_Registration) {
1715
+					$registration->set_status(
1716
+						$status,
1717
+						false,
1718
+						new Context(
1719
+							$status_context,
1720
+							esc_html__(
1721
+								'Manually triggered status change on a Registration Admin Page route.',
1722
+								'event_espresso'
1723
+							)
1724
+						)
1725
+					);
1726
+					$result = $registration->save();
1727
+					// verifying explicit fails because update *may* just return 0 for 0 rows affected
1728
+					$success = $result !== false ? $success : false;
1729
+				}
1730
+			}
1731
+		}
1732
+
1733
+		// return $success and processed registrations
1734
+		return array('REG_ID' => $REG_IDs, 'success' => $success);
1735
+	}
1736
+
1737
+
1738
+	/**
1739
+	 * Common logic for setting up success message and redirecting to appropriate route
1740
+	 *
1741
+	 * @param string $STS_ID status id for the registration changed to
1742
+	 * @param bool   $notify indicates whether the _set_registration_status_from_request does notifications or not.
1743
+	 * @return void
1744
+	 * @throws DomainException
1745
+	 * @throws EE_Error
1746
+	 * @throws EntityNotFoundException
1747
+	 * @throws InvalidArgumentException
1748
+	 * @throws InvalidDataTypeException
1749
+	 * @throws InvalidInterfaceException
1750
+	 * @throws ReflectionException
1751
+	 * @throws RuntimeException
1752
+	 */
1753
+	protected function _reg_status_change_return($STS_ID, $notify = false)
1754
+	{
1755
+		$result = ! empty($STS_ID) ? $this->_set_registration_status_from_request($STS_ID, $notify)
1756
+			: array('success' => false);
1757
+		$success = isset($result['success']) && $result['success'];
1758
+		// setup success message
1759
+		if ($success) {
1760
+			if (is_array($result['REG_ID']) && count($result['REG_ID']) === 1) {
1761
+				$msg = sprintf(
1762
+					esc_html__('Registration status has been set to %s', 'event_espresso'),
1763
+					EEH_Template::pretty_status($STS_ID, false, 'lower')
1764
+				);
1765
+			} else {
1766
+				$msg = sprintf(
1767
+					esc_html__('Registrations have been set to %s.', 'event_espresso'),
1768
+					EEH_Template::pretty_status($STS_ID, false, 'lower')
1769
+				);
1770
+			}
1771
+			EE_Error::add_success($msg);
1772
+		} else {
1773
+			EE_Error::add_error(
1774
+				esc_html__(
1775
+					'Something went wrong, and the status was not changed',
1776
+					'event_espresso'
1777
+				),
1778
+				__FILE__,
1779
+				__LINE__,
1780
+				__FUNCTION__
1781
+			);
1782
+		}
1783
+		if (isset($this->_req_data['return']) && $this->_req_data['return'] === 'view_registration') {
1784
+			$route = array('action' => 'view_registration', '_REG_ID' => reset($result['REG_ID']));
1785
+		} else {
1786
+			$route = array('action' => 'default');
1787
+		}
1788
+		$route = $this->mergeExistingRequestParamsWithRedirectArgs($route);
1789
+		$this->_redirect_after_action($success, '', '', $route, true);
1790
+	}
1791
+
1792
+
1793
+	/**
1794
+	 * incoming reg status change from reg details page.
1795
+	 *
1796
+	 * @return void
1797
+	 * @throws EE_Error
1798
+	 * @throws EntityNotFoundException
1799
+	 * @throws InvalidArgumentException
1800
+	 * @throws InvalidDataTypeException
1801
+	 * @throws InvalidInterfaceException
1802
+	 * @throws ReflectionException
1803
+	 * @throws RuntimeException
1804
+	 * @throws DomainException
1805
+	 */
1806
+	protected function _change_reg_status()
1807
+	{
1808
+		$this->_req_data['return'] = 'view_registration';
1809
+		// set notify based on whether the send notifications toggle is set or not
1810
+		$notify = ! empty($this->_req_data['reg_status_change_form']['send_notifications']);
1811
+		// $notify = ! empty( $this->_req_data['txn_reg_status_change']['send_notifications'] );
1812
+		$this->_req_data['reg_status_change_form']['reg_status'] = isset($this->_req_data['reg_status_change_form']['reg_status'])
1813
+			? $this->_req_data['reg_status_change_form']['reg_status'] : '';
1814
+		switch ($this->_req_data['reg_status_change_form']['reg_status']) {
1815
+			case EEM_Registration::status_id_approved:
1816
+			case EEH_Template::pretty_status(EEM_Registration::status_id_approved, false, 'sentence'):
1817
+				$this->approve_registration($notify);
1818
+				break;
1819
+			case EEM_Registration::status_id_pending_payment:
1820
+			case EEH_Template::pretty_status(EEM_Registration::status_id_pending_payment, false, 'sentence'):
1821
+				$this->pending_registration($notify);
1822
+				break;
1823
+			case EEM_Registration::status_id_not_approved:
1824
+			case EEH_Template::pretty_status(EEM_Registration::status_id_not_approved, false, 'sentence'):
1825
+				$this->not_approve_registration($notify);
1826
+				break;
1827
+			case EEM_Registration::status_id_declined:
1828
+			case EEH_Template::pretty_status(EEM_Registration::status_id_declined, false, 'sentence'):
1829
+				$this->decline_registration($notify);
1830
+				break;
1831
+			case EEM_Registration::status_id_cancelled:
1832
+			case EEH_Template::pretty_status(EEM_Registration::status_id_cancelled, false, 'sentence'):
1833
+				$this->cancel_registration($notify);
1834
+				break;
1835
+			case EEM_Registration::status_id_wait_list:
1836
+			case EEH_Template::pretty_status(EEM_Registration::status_id_wait_list, false, 'sentence'):
1837
+				$this->wait_list_registration($notify);
1838
+				break;
1839
+			case EEM_Registration::status_id_incomplete:
1840
+			default:
1841
+				$result['success'] = false;
1842
+				unset($this->_req_data['return']);
1843
+				$this->_reg_status_change_return('', false);
1844
+				break;
1845
+		}
1846
+	}
1847
+
1848
+
1849
+	/**
1850
+	 * Callback for bulk action routes.
1851
+	 * Note: although we could just register the singular route callbacks for each bulk action route as well, this
1852
+	 * method was chosen so there is one central place all the registration status bulk actions are going through.
1853
+	 * Potentially, this provides an easier place to locate logic that is specific to these bulk actions (as opposed to
1854
+	 * when an action is happening on just a single registration).
1855
+	 *
1856
+	 * @param      $action
1857
+	 * @param bool $notify
1858
+	 */
1859
+	protected function bulk_action_on_registrations($action, $notify = false)
1860
+	{
1861
+		do_action(
1862
+			'AHEE__Registrations_Admin_Page__bulk_action_on_registrations__before_execution',
1863
+			$this,
1864
+			$action,
1865
+			$notify
1866
+		);
1867
+		$method = $action . '_registration';
1868
+		if (method_exists($this, $method)) {
1869
+			$this->$method($notify);
1870
+		}
1871
+	}
1872
+
1873
+
1874
+	/**
1875
+	 * approve_registration
1876
+	 *
1877
+	 * @access protected
1878
+	 * @param bool $notify whether or not to notify the registrant about their approval.
1879
+	 * @return void
1880
+	 * @throws EE_Error
1881
+	 * @throws EntityNotFoundException
1882
+	 * @throws InvalidArgumentException
1883
+	 * @throws InvalidDataTypeException
1884
+	 * @throws InvalidInterfaceException
1885
+	 * @throws ReflectionException
1886
+	 * @throws RuntimeException
1887
+	 * @throws DomainException
1888
+	 */
1889
+	protected function approve_registration($notify = false)
1890
+	{
1891
+		$this->_reg_status_change_return(EEM_Registration::status_id_approved, $notify);
1892
+	}
1893
+
1894
+
1895
+	/**
1896
+	 *        decline_registration
1897
+	 *
1898
+	 * @access protected
1899
+	 * @param bool $notify whether or not to notify the registrant about their status change.
1900
+	 * @return void
1901
+	 * @throws EE_Error
1902
+	 * @throws EntityNotFoundException
1903
+	 * @throws InvalidArgumentException
1904
+	 * @throws InvalidDataTypeException
1905
+	 * @throws InvalidInterfaceException
1906
+	 * @throws ReflectionException
1907
+	 * @throws RuntimeException
1908
+	 * @throws DomainException
1909
+	 */
1910
+	protected function decline_registration($notify = false)
1911
+	{
1912
+		$this->_reg_status_change_return(EEM_Registration::status_id_declined, $notify);
1913
+	}
1914
+
1915
+
1916
+	/**
1917
+	 *        cancel_registration
1918
+	 *
1919
+	 * @access protected
1920
+	 * @param bool $notify whether or not to notify the registrant about their status change.
1921
+	 * @return void
1922
+	 * @throws EE_Error
1923
+	 * @throws EntityNotFoundException
1924
+	 * @throws InvalidArgumentException
1925
+	 * @throws InvalidDataTypeException
1926
+	 * @throws InvalidInterfaceException
1927
+	 * @throws ReflectionException
1928
+	 * @throws RuntimeException
1929
+	 * @throws DomainException
1930
+	 */
1931
+	protected function cancel_registration($notify = false)
1932
+	{
1933
+		$this->_reg_status_change_return(EEM_Registration::status_id_cancelled, $notify);
1934
+	}
1935
+
1936
+
1937
+	/**
1938
+	 *        not_approve_registration
1939
+	 *
1940
+	 * @access protected
1941
+	 * @param bool $notify whether or not to notify the registrant about their status change.
1942
+	 * @return void
1943
+	 * @throws EE_Error
1944
+	 * @throws EntityNotFoundException
1945
+	 * @throws InvalidArgumentException
1946
+	 * @throws InvalidDataTypeException
1947
+	 * @throws InvalidInterfaceException
1948
+	 * @throws ReflectionException
1949
+	 * @throws RuntimeException
1950
+	 * @throws DomainException
1951
+	 */
1952
+	protected function not_approve_registration($notify = false)
1953
+	{
1954
+		$this->_reg_status_change_return(EEM_Registration::status_id_not_approved, $notify);
1955
+	}
1956
+
1957
+
1958
+	/**
1959
+	 *        decline_registration
1960
+	 *
1961
+	 * @access protected
1962
+	 * @param bool $notify whether or not to notify the registrant about their status change.
1963
+	 * @return void
1964
+	 * @throws EE_Error
1965
+	 * @throws EntityNotFoundException
1966
+	 * @throws InvalidArgumentException
1967
+	 * @throws InvalidDataTypeException
1968
+	 * @throws InvalidInterfaceException
1969
+	 * @throws ReflectionException
1970
+	 * @throws RuntimeException
1971
+	 * @throws DomainException
1972
+	 */
1973
+	protected function pending_registration($notify = false)
1974
+	{
1975
+		$this->_reg_status_change_return(EEM_Registration::status_id_pending_payment, $notify);
1976
+	}
1977
+
1978
+
1979
+	/**
1980
+	 * waitlist_registration
1981
+	 *
1982
+	 * @access protected
1983
+	 * @param bool $notify whether or not to notify the registrant about their status change.
1984
+	 * @return void
1985
+	 * @throws EE_Error
1986
+	 * @throws EntityNotFoundException
1987
+	 * @throws InvalidArgumentException
1988
+	 * @throws InvalidDataTypeException
1989
+	 * @throws InvalidInterfaceException
1990
+	 * @throws ReflectionException
1991
+	 * @throws RuntimeException
1992
+	 * @throws DomainException
1993
+	 */
1994
+	protected function wait_list_registration($notify = false)
1995
+	{
1996
+		$this->_reg_status_change_return(EEM_Registration::status_id_wait_list, $notify);
1997
+	}
1998
+
1999
+
2000
+	/**
2001
+	 *        generates HTML for the Registration main meta box
2002
+	 *
2003
+	 * @access public
2004
+	 * @return void
2005
+	 * @throws DomainException
2006
+	 * @throws EE_Error
2007
+	 * @throws InvalidArgumentException
2008
+	 * @throws InvalidDataTypeException
2009
+	 * @throws InvalidInterfaceException
2010
+	 * @throws ReflectionException
2011
+	 * @throws EntityNotFoundException
2012
+	 */
2013
+	public function _reg_details_meta_box()
2014
+	{
2015
+		EEH_Autoloader::register_line_item_display_autoloaders();
2016
+		EEH_Autoloader::register_line_item_filter_autoloaders();
2017
+		EE_Registry::instance()->load_helper('Line_Item');
2018
+		$transaction = $this->_registration->transaction() ? $this->_registration->transaction()
2019
+			: EE_Transaction::new_instance();
2020
+		$this->_session = $transaction->session_data();
2021
+		$filters = new EE_Line_Item_Filter_Collection();
2022
+		$filters->add(new EE_Single_Registration_Line_Item_Filter($this->_registration));
2023
+		$filters->add(new EE_Non_Zero_Line_Item_Filter());
2024
+		$line_item_filter_processor = new EE_Line_Item_Filter_Processor(
2025
+			$filters,
2026
+			$transaction->total_line_item()
2027
+		);
2028
+		$filtered_line_item_tree = $line_item_filter_processor->process();
2029
+		$line_item_display = new EE_Line_Item_Display(
2030
+			'reg_admin_table',
2031
+			'EE_Admin_Table_Registration_Line_Item_Display_Strategy'
2032
+		);
2033
+		$this->_template_args['line_item_table'] = $line_item_display->display_line_item(
2034
+			$filtered_line_item_tree,
2035
+			array('EE_Registration' => $this->_registration)
2036
+		);
2037
+		$attendee = $this->_registration->attendee();
2038
+		if (EE_Registry::instance()->CAP->current_user_can(
2039
+			'ee_read_transaction',
2040
+			'espresso_transactions_view_transaction'
2041
+		)) {
2042
+			$this->_template_args['view_transaction_button'] = EEH_Template::get_button_or_link(
2043
+				EE_Admin_Page::add_query_args_and_nonce(
2044
+					array(
2045
+						'action' => 'view_transaction',
2046
+						'TXN_ID' => $transaction->ID(),
2047
+					),
2048
+					TXN_ADMIN_URL
2049
+				),
2050
+				esc_html__(' View Transaction', 'event_espresso'),
2051
+				'button secondary-button right',
2052
+				'dashicons dashicons-cart'
2053
+			);
2054
+		} else {
2055
+			$this->_template_args['view_transaction_button'] = '';
2056
+		}
2057
+		if ($attendee instanceof EE_Attendee
2058
+			&& EE_Registry::instance()->CAP->current_user_can(
2059
+				'ee_send_message',
2060
+				'espresso_registrations_resend_registration'
2061
+			)
2062
+		) {
2063
+			$this->_template_args['resend_registration_button'] = EEH_Template::get_button_or_link(
2064
+				EE_Admin_Page::add_query_args_and_nonce(
2065
+					array(
2066
+						'action'      => 'resend_registration',
2067
+						'_REG_ID'     => $this->_registration->ID(),
2068
+						'redirect_to' => 'view_registration',
2069
+					),
2070
+					REG_ADMIN_URL
2071
+				),
2072
+				esc_html__(' Resend Registration', 'event_espresso'),
2073
+				'button secondary-button right',
2074
+				'dashicons dashicons-email-alt'
2075
+			);
2076
+		} else {
2077
+			$this->_template_args['resend_registration_button'] = '';
2078
+		}
2079
+		$this->_template_args['currency_sign'] = EE_Registry::instance()->CFG->currency->sign;
2080
+		$payment = $transaction->get_first_related('Payment');
2081
+		$payment = ! $payment instanceof EE_Payment
2082
+			? EE_Payment::new_instance()
2083
+			: $payment;
2084
+		$payment_method = $payment->get_first_related('Payment_Method');
2085
+		$payment_method = ! $payment_method instanceof EE_Payment_Method
2086
+			? EE_Payment_Method::new_instance()
2087
+			: $payment_method;
2088
+		$reg_details = array(
2089
+			'payment_method'       => $payment_method->name(),
2090
+			'response_msg'         => $payment->gateway_response(),
2091
+			'registration_id'      => $this->_registration->get('REG_code'),
2092
+			'registration_session' => $this->_registration->session_ID(),
2093
+			'ip_address'           => isset($this->_session['ip_address']) ? $this->_session['ip_address'] : '',
2094
+			'user_agent'           => isset($this->_session['user_agent']) ? $this->_session['user_agent'] : '',
2095
+		);
2096
+		if (isset($reg_details['registration_id'])) {
2097
+			$this->_template_args['reg_details']['registration_id']['value'] = $reg_details['registration_id'];
2098
+			$this->_template_args['reg_details']['registration_id']['label'] = esc_html__(
2099
+				'Registration ID',
2100
+				'event_espresso'
2101
+			);
2102
+			$this->_template_args['reg_details']['registration_id']['class'] = 'regular-text';
2103
+		}
2104
+		if (isset($reg_details['payment_method'])) {
2105
+			$this->_template_args['reg_details']['payment_method']['value'] = $reg_details['payment_method'];
2106
+			$this->_template_args['reg_details']['payment_method']['label'] = esc_html__(
2107
+				'Most Recent Payment Method',
2108
+				'event_espresso'
2109
+			);
2110
+			$this->_template_args['reg_details']['payment_method']['class'] = 'regular-text';
2111
+			$this->_template_args['reg_details']['response_msg']['value'] = $reg_details['response_msg'];
2112
+			$this->_template_args['reg_details']['response_msg']['label'] = esc_html__(
2113
+				'Payment method response',
2114
+				'event_espresso'
2115
+			);
2116
+			$this->_template_args['reg_details']['response_msg']['class'] = 'regular-text';
2117
+		}
2118
+		$this->_template_args['reg_details']['registration_session']['value'] = $reg_details['registration_session'];
2119
+		$this->_template_args['reg_details']['registration_session']['label'] = esc_html__(
2120
+			'Registration Session',
2121
+			'event_espresso'
2122
+		);
2123
+		$this->_template_args['reg_details']['registration_session']['class'] = 'regular-text';
2124
+		$this->_template_args['reg_details']['ip_address']['value'] = $reg_details['ip_address'];
2125
+		$this->_template_args['reg_details']['ip_address']['label'] = esc_html__(
2126
+			'Registration placed from IP',
2127
+			'event_espresso'
2128
+		);
2129
+		$this->_template_args['reg_details']['ip_address']['class'] = 'regular-text';
2130
+		$this->_template_args['reg_details']['user_agent']['value'] = $reg_details['user_agent'];
2131
+		$this->_template_args['reg_details']['user_agent']['label'] = esc_html__(
2132
+			'Registrant User Agent',
2133
+			'event_espresso'
2134
+		);
2135
+		$this->_template_args['reg_details']['user_agent']['class'] = 'large-text';
2136
+		$this->_template_args['event_link'] = EE_Admin_Page::add_query_args_and_nonce(
2137
+			array(
2138
+				'action'   => 'default',
2139
+				'event_id' => $this->_registration->event_ID(),
2140
+			),
2141
+			REG_ADMIN_URL
2142
+		);
2143
+		$this->_template_args['REG_ID'] = $this->_registration->ID();
2144
+		$this->_template_args['event_id'] = $this->_registration->event_ID();
2145
+		$template_path =
2146
+			REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_reg_details.template.php';
2147
+		echo EEH_Template::display_template($template_path, $this->_template_args, true);
2148
+	}
2149
+
2150
+
2151
+	/**
2152
+	 * generates HTML for the Registration Questions meta box.
2153
+	 * If pre-4.8.32.rc.000 hooks are used, uses old methods (with its filters),
2154
+	 * otherwise uses new forms system
2155
+	 *
2156
+	 * @access public
2157
+	 * @return void
2158
+	 * @throws DomainException
2159
+	 * @throws EE_Error
2160
+	 * @throws InvalidArgumentException
2161
+	 * @throws InvalidDataTypeException
2162
+	 * @throws InvalidInterfaceException
2163
+	 * @throws ReflectionException
2164
+	 */
2165
+	public function _reg_questions_meta_box()
2166
+	{
2167
+		// allow someone to override this method entirely
2168
+		if (apply_filters(
2169
+			'FHEE__Registrations_Admin_Page___reg_questions_meta_box__do_default',
2170
+			true,
2171
+			$this,
2172
+			$this->_registration
2173
+		)) {
2174
+			$form = $this->_get_reg_custom_questions_form(
2175
+				$this->_registration->ID()
2176
+			);
2177
+			$this->_template_args['att_questions'] = count($form->subforms()) > 0
2178
+				? $form->get_html_and_js()
2179
+				: '';
2180
+			$this->_template_args['reg_questions_form_action'] = 'edit_registration';
2181
+			$this->_template_args['REG_ID'] = $this->_registration->ID();
2182
+			$template_path =
2183
+				REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_reg_questions.template.php';
2184
+			echo EEH_Template::display_template($template_path, $this->_template_args, true);
2185
+		}
2186
+	}
2187
+
2188
+
2189
+	/**
2190
+	 * form_before_question_group
2191
+	 *
2192
+	 * @deprecated    as of 4.8.32.rc.000
2193
+	 * @access        public
2194
+	 * @param        string $output
2195
+	 * @return        string
2196
+	 */
2197
+	public function form_before_question_group($output)
2198
+	{
2199
+		EE_Error::doing_it_wrong(
2200
+			__CLASS__ . '::' . __FUNCTION__,
2201
+			esc_html__(
2202
+				'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.',
2203
+				'event_espresso'
2204
+			),
2205
+			'4.8.32.rc.000'
2206
+		);
2207
+		return '
2208 2208
 	<table class="form-table ee-width-100">
2209 2209
 		<tbody>
2210 2210
 			';
2211
-    }
2212
-
2213
-
2214
-    /**
2215
-     * form_after_question_group
2216
-     *
2217
-     * @deprecated    as of 4.8.32.rc.000
2218
-     * @access        public
2219
-     * @param        string $output
2220
-     * @return        string
2221
-     */
2222
-    public function form_after_question_group($output)
2223
-    {
2224
-        EE_Error::doing_it_wrong(
2225
-            __CLASS__ . '::' . __FUNCTION__,
2226
-            esc_html__(
2227
-                '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.',
2228
-                'event_espresso'
2229
-            ),
2230
-            '4.8.32.rc.000'
2231
-        );
2232
-        return '
2211
+	}
2212
+
2213
+
2214
+	/**
2215
+	 * form_after_question_group
2216
+	 *
2217
+	 * @deprecated    as of 4.8.32.rc.000
2218
+	 * @access        public
2219
+	 * @param        string $output
2220
+	 * @return        string
2221
+	 */
2222
+	public function form_after_question_group($output)
2223
+	{
2224
+		EE_Error::doing_it_wrong(
2225
+			__CLASS__ . '::' . __FUNCTION__,
2226
+			esc_html__(
2227
+				'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.',
2228
+				'event_espresso'
2229
+			),
2230
+			'4.8.32.rc.000'
2231
+		);
2232
+		return '
2233 2233
 			<tr class="hide-if-no-js">
2234 2234
 				<th> </th>
2235 2235
 				<td class="reg-admin-edit-attendee-question-td">
2236 2236
 					<a class="reg-admin-edit-attendee-question-lnk" href="#" title="'
2237
-               . esc_attr__('click to edit question', 'event_espresso')
2238
-               . '">
2237
+			   . esc_attr__('click to edit question', 'event_espresso')
2238
+			   . '">
2239 2239
 						<span class="reg-admin-edit-question-group-spn lt-grey-txt">'
2240
-               . esc_html__('edit the above question group', 'event_espresso')
2241
-               . '</span>
2240
+			   . esc_html__('edit the above question group', 'event_espresso')
2241
+			   . '</span>
2242 2242
 						<div class="dashicons dashicons-edit"></div>
2243 2243
 					</a>
2244 2244
 				</td>
@@ -2246,627 +2246,627 @@  discard block
 block discarded – undo
2246 2246
 		</tbody>
2247 2247
 	</table>
2248 2248
 ';
2249
-    }
2250
-
2251
-
2252
-    /**
2253
-     * form_form_field_label_wrap
2254
-     *
2255
-     * @deprecated    as of 4.8.32.rc.000
2256
-     * @access        public
2257
-     * @param        string $label
2258
-     * @return        string
2259
-     */
2260
-    public function form_form_field_label_wrap($label)
2261
-    {
2262
-        EE_Error::doing_it_wrong(
2263
-            __CLASS__ . '::' . __FUNCTION__,
2264
-            esc_html__(
2265
-                '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.',
2266
-                'event_espresso'
2267
-            ),
2268
-            '4.8.32.rc.000'
2269
-        );
2270
-        return '
2249
+	}
2250
+
2251
+
2252
+	/**
2253
+	 * form_form_field_label_wrap
2254
+	 *
2255
+	 * @deprecated    as of 4.8.32.rc.000
2256
+	 * @access        public
2257
+	 * @param        string $label
2258
+	 * @return        string
2259
+	 */
2260
+	public function form_form_field_label_wrap($label)
2261
+	{
2262
+		EE_Error::doing_it_wrong(
2263
+			__CLASS__ . '::' . __FUNCTION__,
2264
+			esc_html__(
2265
+				'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.',
2266
+				'event_espresso'
2267
+			),
2268
+			'4.8.32.rc.000'
2269
+		);
2270
+		return '
2271 2271
 			<tr>
2272 2272
 				<th>
2273 2273
 					' . $label . '
2274 2274
 				</th>';
2275
-    }
2276
-
2277
-
2278
-    /**
2279
-     * form_form_field_input__wrap
2280
-     *
2281
-     * @deprecated    as of 4.8.32.rc.000
2282
-     * @access        public
2283
-     * @param        string $input
2284
-     * @return        string
2285
-     */
2286
-    public function form_form_field_input__wrap($input)
2287
-    {
2288
-        EE_Error::doing_it_wrong(
2289
-            __CLASS__ . '::' . __FUNCTION__,
2290
-            esc_html__(
2291
-                '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.',
2292
-                'event_espresso'
2293
-            ),
2294
-            '4.8.32.rc.000'
2295
-        );
2296
-        return '
2275
+	}
2276
+
2277
+
2278
+	/**
2279
+	 * form_form_field_input__wrap
2280
+	 *
2281
+	 * @deprecated    as of 4.8.32.rc.000
2282
+	 * @access        public
2283
+	 * @param        string $input
2284
+	 * @return        string
2285
+	 */
2286
+	public function form_form_field_input__wrap($input)
2287
+	{
2288
+		EE_Error::doing_it_wrong(
2289
+			__CLASS__ . '::' . __FUNCTION__,
2290
+			esc_html__(
2291
+				'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.',
2292
+				'event_espresso'
2293
+			),
2294
+			'4.8.32.rc.000'
2295
+		);
2296
+		return '
2297 2297
 				<td class="reg-admin-attendee-questions-input-td disabled-input">
2298 2298
 					' . $input . '
2299 2299
 				</td>
2300 2300
 			</tr>';
2301
-    }
2302
-
2303
-
2304
-    /**
2305
-     * Updates the registration's custom questions according to the form info, if the form is submitted.
2306
-     * If it's not a post, the "view_registrations" route will be called next on the SAME request
2307
-     * to display the page
2308
-     *
2309
-     * @access protected
2310
-     * @return void
2311
-     * @throws EE_Error
2312
-     * @throws InvalidArgumentException
2313
-     * @throws InvalidDataTypeException
2314
-     * @throws InvalidInterfaceException
2315
-     * @throws ReflectionException
2316
-     */
2317
-    protected function _update_attendee_registration_form()
2318
-    {
2319
-        do_action('AHEE__Registrations_Admin_Page___update_attendee_registration_form__start', $this);
2320
-        if ($_SERVER['REQUEST_METHOD'] === 'POST') {
2321
-            $REG_ID = isset($this->_req_data['_REG_ID']) ? absint($this->_req_data['_REG_ID']) : false;
2322
-            $success = $this->_save_reg_custom_questions_form($REG_ID);
2323
-            if ($success) {
2324
-                $what = esc_html__('Registration Form', 'event_espresso');
2325
-                $route = $REG_ID ? array('action' => 'view_registration', '_REG_ID' => $REG_ID)
2326
-                    : array('action' => 'default');
2327
-                $this->_redirect_after_action($success, $what, esc_html__('updated', 'event_espresso'), $route);
2328
-            }
2329
-        }
2330
-    }
2331
-
2332
-
2333
-    /**
2334
-     * Gets the form for saving registrations custom questions (if done
2335
-     * previously retrieves the cached form object, which may have validation errors in it)
2336
-     *
2337
-     * @param int $REG_ID
2338
-     * @return EE_Registration_Custom_Questions_Form
2339
-     * @throws EE_Error
2340
-     * @throws InvalidArgumentException
2341
-     * @throws InvalidDataTypeException
2342
-     * @throws InvalidInterfaceException
2343
-     */
2344
-    protected function _get_reg_custom_questions_form($REG_ID)
2345
-    {
2346
-        if (! $this->_reg_custom_questions_form) {
2347
-            require_once(REG_ADMIN . 'form_sections/EE_Registration_Custom_Questions_Form.form.php');
2348
-            $this->_reg_custom_questions_form = new EE_Registration_Custom_Questions_Form(
2349
-                $this->getRegistrationModel()->get_one_by_ID($REG_ID)
2350
-            );
2351
-            $this->_reg_custom_questions_form->_construct_finalize(null, null);
2352
-        }
2353
-        return $this->_reg_custom_questions_form;
2354
-    }
2355
-
2356
-
2357
-    /**
2358
-     * Saves
2359
-     *
2360
-     * @access private
2361
-     * @param bool $REG_ID
2362
-     * @return bool
2363
-     * @throws EE_Error
2364
-     * @throws InvalidArgumentException
2365
-     * @throws InvalidDataTypeException
2366
-     * @throws InvalidInterfaceException
2367
-     * @throws ReflectionException
2368
-     */
2369
-    private function _save_reg_custom_questions_form($REG_ID = false)
2370
-    {
2371
-        if (! $REG_ID) {
2372
-            EE_Error::add_error(
2373
-                esc_html__(
2374
-                    'An error occurred. No registration ID was received.',
2375
-                    'event_espresso'
2376
-                ),
2377
-                __FILE__,
2378
-                __FUNCTION__,
2379
-                __LINE__
2380
-            );
2381
-        }
2382
-        $form = $this->_get_reg_custom_questions_form($REG_ID);
2383
-        $form->receive_form_submission($this->_req_data);
2384
-        $success = false;
2385
-        if ($form->is_valid()) {
2386
-            foreach ($form->subforms() as $question_group_id => $question_group_form) {
2387
-                foreach ($question_group_form->inputs() as $question_id => $input) {
2388
-                    $where_conditions = array(
2389
-                        'QST_ID' => $question_id,
2390
-                        'REG_ID' => $REG_ID,
2391
-                    );
2392
-                    $possibly_new_values = array(
2393
-                        'ANS_value' => $input->normalized_value(),
2394
-                    );
2395
-                    $answer = EEM_Answer::instance()->get_one(array($where_conditions));
2396
-                    if ($answer instanceof EE_Answer) {
2397
-                        $success = $answer->save($possibly_new_values);
2398
-                    } else {
2399
-                        // insert it then
2400
-                        $cols_n_vals = array_merge($where_conditions, $possibly_new_values);
2401
-                        $answer = EE_Answer::new_instance($cols_n_vals);
2402
-                        $success = $answer->save();
2403
-                    }
2404
-                }
2405
-            }
2406
-        } else {
2407
-            EE_Error::add_error($form->get_validation_error_string(), __FILE__, __FUNCTION__, __LINE__);
2408
-        }
2409
-        return $success;
2410
-    }
2411
-
2412
-
2413
-    /**
2414
-     *        generates HTML for the Registration main meta box
2415
-     *
2416
-     * @access public
2417
-     * @return void
2418
-     * @throws DomainException
2419
-     * @throws EE_Error
2420
-     * @throws InvalidArgumentException
2421
-     * @throws InvalidDataTypeException
2422
-     * @throws InvalidInterfaceException
2423
-     * @throws ReflectionException
2424
-     */
2425
-    public function _reg_attendees_meta_box()
2426
-    {
2427
-        $REG = $this->getRegistrationModel();
2428
-        // get all other registrations on this transaction, and cache
2429
-        // the attendees for them so we don't have to run another query using force_join
2430
-        $registrations = $REG->get_all(
2431
-            array(
2432
-                array(
2433
-                    'TXN_ID' => $this->_registration->transaction_ID(),
2434
-                    'REG_ID' => array('!=', $this->_registration->ID()),
2435
-                ),
2436
-                'force_join' => array('Attendee'),
2437
-                'default_where_conditions' => 'other_models_only',
2438
-            )
2439
-        );
2440
-        $this->_template_args['attendees'] = array();
2441
-        $this->_template_args['attendee_notice'] = '';
2442
-        if (empty($registrations)
2443
-            || (is_array($registrations)
2444
-                && ! EEH_Array::get_one_item_from_array($registrations))
2445
-        ) {
2446
-            EE_Error::add_error(
2447
-                esc_html__(
2448
-                    'There are no records attached to this registration. Something may have gone wrong with the registration',
2449
-                    'event_espresso'
2450
-                ),
2451
-                __FILE__,
2452
-                __FUNCTION__,
2453
-                __LINE__
2454
-            );
2455
-            $this->_template_args['attendee_notice'] = EE_Error::get_notices();
2456
-        } else {
2457
-            $att_nmbr = 1;
2458
-            foreach ($registrations as $registration) {
2459
-                /* @var $registration EE_Registration */
2460
-                $attendee = $registration->attendee()
2461
-                    ? $registration->attendee()
2462
-                    : $this->getAttendeeModel()->create_default_object();
2463
-                $this->_template_args['attendees'][ $att_nmbr ]['STS_ID'] = $registration->status_ID();
2464
-                $this->_template_args['attendees'][ $att_nmbr ]['fname'] = $attendee->fname();
2465
-                $this->_template_args['attendees'][ $att_nmbr ]['lname'] = $attendee->lname();
2466
-                $this->_template_args['attendees'][ $att_nmbr ]['email'] = $attendee->email();
2467
-                $this->_template_args['attendees'][ $att_nmbr ]['final_price'] = $registration->final_price();
2468
-                $this->_template_args['attendees'][ $att_nmbr ]['address'] = implode(
2469
-                    ', ',
2470
-                    $attendee->full_address_as_array()
2471
-                );
2472
-                $this->_template_args['attendees'][ $att_nmbr ]['att_link'] = self::add_query_args_and_nonce(
2473
-                    array(
2474
-                        'action' => 'edit_attendee',
2475
-                        'post'   => $attendee->ID(),
2476
-                    ),
2477
-                    REG_ADMIN_URL
2478
-                );
2479
-                $this->_template_args['attendees'][ $att_nmbr ]['event_name'] = $registration->event_obj() instanceof EE_Event
2480
-                    ? $registration->event_obj()->name()
2481
-                    : '';
2482
-                $att_nmbr++;
2483
-            }
2484
-            $this->_template_args['currency_sign'] = EE_Registry::instance()->CFG->currency->sign;
2485
-        }
2486
-        $template_path = REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_attendees.template.php';
2487
-        echo EEH_Template::display_template($template_path, $this->_template_args, true);
2488
-    }
2489
-
2490
-
2491
-    /**
2492
-     *        generates HTML for the Edit Registration side meta box
2493
-     *
2494
-     * @access public
2495
-     * @return void
2496
-     * @throws DomainException
2497
-     * @throws EE_Error
2498
-     * @throws InvalidArgumentException
2499
-     * @throws InvalidDataTypeException
2500
-     * @throws InvalidInterfaceException
2501
-     * @throws ReflectionException
2502
-     */
2503
-    public function _reg_registrant_side_meta_box()
2504
-    {
2505
-        /*@var $attendee EE_Attendee */
2506
-        $att_check = $this->_registration->attendee();
2507
-        $attendee = $att_check instanceof EE_Attendee
2508
-            ? $att_check
2509
-            : $this->getAttendeeModel()->create_default_object();
2510
-        // now let's determine if this is not the primary registration.  If it isn't then we set the
2511
-        // primary_registration object for reference BUT ONLY if the Attendee object loaded is not the same as the
2512
-        // primary registration object (that way we know if we need to show create button or not)
2513
-        if (! $this->_registration->is_primary_registrant()) {
2514
-            $primary_registration = $this->_registration->get_primary_registration();
2515
-            $primary_attendee = $primary_registration instanceof EE_Registration ? $primary_registration->attendee()
2516
-                : null;
2517
-            if (! $primary_attendee instanceof EE_Attendee || $attendee->ID() !== $primary_attendee->ID()) {
2518
-                // in here?  This means the displayed registration is not the primary registrant but ALREADY HAS its own
2519
-                // custom attendee object so let's not worry about the primary reg.
2520
-                $primary_registration = null;
2521
-            }
2522
-        } else {
2523
-            $primary_registration = null;
2524
-        }
2525
-        $this->_template_args['ATT_ID'] = $attendee->ID();
2526
-        $this->_template_args['fname'] = $attendee->fname();
2527
-        $this->_template_args['lname'] = $attendee->lname();
2528
-        $this->_template_args['email'] = $attendee->email();
2529
-        $this->_template_args['phone'] = $attendee->phone();
2530
-        $this->_template_args['formatted_address'] = EEH_Address::format($attendee);
2531
-        // edit link
2532
-        $this->_template_args['att_edit_link'] = EE_Admin_Page::add_query_args_and_nonce(
2533
-            array(
2534
-                'action' => 'edit_attendee',
2535
-                'post'   => $attendee->ID(),
2536
-            ),
2537
-            REG_ADMIN_URL
2538
-        );
2539
-        $this->_template_args['att_edit_label'] = esc_html__('View/Edit Contact', 'event_espresso');
2540
-        // create link
2541
-        $this->_template_args['create_link'] = $primary_registration instanceof EE_Registration
2542
-            ? EE_Admin_Page::add_query_args_and_nonce(
2543
-                array(
2544
-                    'action'  => 'duplicate_attendee',
2545
-                    '_REG_ID' => $this->_registration->ID(),
2546
-                ),
2547
-                REG_ADMIN_URL
2548
-            ) : '';
2549
-        $this->_template_args['create_label'] = esc_html__('Create Contact', 'event_espresso');
2550
-        $this->_template_args['att_check'] = $att_check;
2551
-        $template_path = REG_TEMPLATE_PATH . 'reg_admin_details_side_meta_box_registrant.template.php';
2552
-        echo EEH_Template::display_template($template_path, $this->_template_args, true);
2553
-    }
2554
-
2555
-
2556
-    /**
2557
-     * trash or restore registrations
2558
-     *
2559
-     * @param  boolean $trash whether to archive or restore
2560
-     * @return void
2561
-     * @throws EE_Error
2562
-     * @throws InvalidArgumentException
2563
-     * @throws InvalidDataTypeException
2564
-     * @throws InvalidInterfaceException
2565
-     * @throws RuntimeException
2566
-     * @access protected
2567
-     */
2568
-    protected function _trash_or_restore_registrations($trash = true)
2569
-    {
2570
-        // if empty _REG_ID then get out because there's nothing to do
2571
-        if (empty($this->_req_data['_REG_ID'])) {
2572
-            EE_Error::add_error(
2573
-                sprintf(
2574
-                    esc_html__(
2575
-                        'In order to %1$s registrations you must select which ones you wish to %1$s by clicking the checkboxes.',
2576
-                        'event_espresso'
2577
-                    ),
2578
-                    $trash ? 'trash' : 'restore'
2579
-                ),
2580
-                __FILE__,
2581
-                __LINE__,
2582
-                __FUNCTION__
2583
-            );
2584
-            $this->_redirect_after_action(false, '', '', array(), true);
2585
-        }
2586
-        $success = 0;
2587
-        $overwrite_msgs = false;
2588
-        // Checkboxes
2589
-        if (! is_array($this->_req_data['_REG_ID'])) {
2590
-            $this->_req_data['_REG_ID'] = array($this->_req_data['_REG_ID']);
2591
-        }
2592
-        $reg_count = count($this->_req_data['_REG_ID']);
2593
-        // cycle thru checkboxes
2594
-        foreach ($this->_req_data['_REG_ID'] as $REG_ID) {
2595
-            /** @var EE_Registration $REG */
2596
-            $REG = $this->getRegistrationModel()->get_one_by_ID($REG_ID);
2597
-            $payments = $REG->registration_payments();
2598
-            if (! empty($payments)) {
2599
-                $name = $REG->attendee() instanceof EE_Attendee
2600
-                    ? $REG->attendee()->full_name()
2601
-                    : esc_html__('Unknown Attendee', 'event_espresso');
2602
-                $overwrite_msgs = true;
2603
-                EE_Error::add_error(
2604
-                    sprintf(
2605
-                        esc_html__(
2606
-                            '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.',
2607
-                            'event_espresso'
2608
-                        ),
2609
-                        $name
2610
-                    ),
2611
-                    __FILE__,
2612
-                    __FUNCTION__,
2613
-                    __LINE__
2614
-                );
2615
-                // can't trash this registration because it has payments.
2616
-                continue;
2617
-            }
2618
-            $updated = $trash ? $REG->delete() : $REG->restore();
2619
-            if ($updated) {
2620
-                $success++;
2621
-            }
2622
-        }
2623
-        $this->_redirect_after_action(
2624
-            $success === $reg_count, // were ALL registrations affected?
2625
-            $success > 1
2626
-                ? esc_html__('Registrations', 'event_espresso')
2627
-                : esc_html__('Registration', 'event_espresso'),
2628
-            $trash
2629
-                ? esc_html__('moved to the trash', 'event_espresso')
2630
-                : esc_html__('restored', 'event_espresso'),
2631
-            $this->mergeExistingRequestParamsWithRedirectArgs(array('action' => 'default')),
2632
-            $overwrite_msgs
2633
-        );
2634
-    }
2635
-
2636
-
2637
-    /**
2638
-     * This is used to permanently delete registrations.  Note, this will handle not only deleting permanently the
2639
-     * registration but also.
2640
-     * 1. Removing relations to EE_Attendee
2641
-     * 2. Deleting permanently the related transaction, but ONLY if all related registrations to the transaction are
2642
-     * ALSO trashed.
2643
-     * 3. Deleting permanently any related Line items but only if the above conditions are met.
2644
-     * 4. Removing relationships between all tickets and the related registrations
2645
-     * 5. Deleting permanently any related Answers (and the answers for other related registrations that were deleted.)
2646
-     * 6. Deleting permanently any related Checkins.
2647
-     *
2648
-     * @return void
2649
-     * @throws EE_Error
2650
-     * @throws InvalidArgumentException
2651
-     * @throws InvalidDataTypeException
2652
-     * @throws InvalidInterfaceException
2653
-     * @throws ReflectionException
2654
-     */
2655
-    protected function _delete_registrations()
2656
-    {
2657
-        $REG_MDL = $this->getRegistrationModel();
2658
-        $success = 1;
2659
-        // Checkboxes
2660
-        if (! empty($this->_req_data['_REG_ID']) && is_array($this->_req_data['_REG_ID'])) {
2661
-            // if array has more than one element than success message should be plural
2662
-            $success = count($this->_req_data['_REG_ID']) > 1 ? 2 : 1;
2663
-            // cycle thru checkboxes
2664
-            foreach ($this->_req_data['_REG_ID'] as $REG_ID) {
2665
-                $REG = $REG_MDL->get_one_by_ID($REG_ID);
2666
-                if (! $REG instanceof EE_Registration) {
2667
-                    continue;
2668
-                }
2669
-                $deleted = $this->_delete_registration($REG);
2670
-                if (! $deleted) {
2671
-                    $success = 0;
2672
-                }
2673
-            }
2674
-        } else {
2675
-            // grab single id and delete
2676
-            $REG_ID = $this->_req_data['_REG_ID'];
2677
-            /** @var EE_Registration $REG */
2678
-            $REG = $REG_MDL->get_one_by_ID($REG_ID);
2679
-            $deleted = $this->_delete_registration($REG);
2680
-            if (! $deleted) {
2681
-                $success = 0;
2682
-            }
2683
-        }
2684
-        $what = $success > 1
2685
-            ? esc_html__('Registrations', 'event_espresso')
2686
-            : esc_html__('Registration', 'event_espresso');
2687
-        $action_desc = esc_html__('permanently deleted.', 'event_espresso');
2688
-        $this->_redirect_after_action(
2689
-            $success,
2690
-            $what,
2691
-            $action_desc,
2692
-            $this->mergeExistingRequestParamsWithRedirectArgs(['action' => 'default']),
2693
-            true
2694
-        );
2695
-    }
2696
-
2697
-
2698
-    /**
2699
-     * handles the permanent deletion of a registration.  See comments with _delete_registrations() for details on what
2700
-     * models get affected.
2701
-     *
2702
-     * @param EE_Registration $REG registration to be deleted permanently
2703
-     * @return bool true = successful deletion, false = fail.
2704
-     * @throws EE_Error
2705
-     * @throws InvalidArgumentException
2706
-     * @throws InvalidDataTypeException
2707
-     * @throws InvalidInterfaceException
2708
-     * @throws ReflectionException
2709
-     */
2710
-    protected function _delete_registration(EE_Registration $REG)
2711
-    {
2712
-        // first we start with the transaction... ultimately, we WILL not delete permanently if there are any related
2713
-        // registrations on the transaction that are NOT trashed.
2714
-        $TXN = $REG->get_first_related('Transaction');
2715
-        $REGS = $TXN->get_many_related('Registration');
2716
-        $all_trashed = true;
2717
-        foreach ($REGS as $registration) {
2718
-            if (! $registration->get('REG_deleted')) {
2719
-                $all_trashed = false;
2720
-            }
2721
-        }
2722
-        if (! $all_trashed) {
2723
-            EE_Error::add_error(
2724
-                esc_html__(
2725
-                    '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.',
2726
-                    'event_espresso'
2727
-                ),
2728
-                __FILE__,
2729
-                __FUNCTION__,
2730
-                __LINE__
2731
-            );
2732
-            return false;
2733
-        }
2734
-        // k made it here so that means we can delete all the related transactions and their answers (but let's do them
2735
-        // separately from THIS one).
2736
-        foreach ($REGS as $registration) {
2737
-            // delete related answers
2738
-            $registration->delete_related_permanently('Answer');
2739
-            // remove relationship to EE_Attendee (but we ALWAYS leave the contact record intact)
2740
-            $attendee = $registration->get_first_related('Attendee');
2741
-            if ($attendee instanceof EE_Attendee) {
2742
-                $registration->_remove_relation_to($attendee, 'Attendee');
2743
-            }
2744
-            // now remove relationships to tickets on this registration.
2745
-            $registration->_remove_relations('Ticket');
2746
-            // now delete permanently the checkins related to this registration.
2747
-            $registration->delete_related_permanently('Checkin');
2748
-            if ($registration->ID() === $REG->ID()) {
2749
-                continue;
2750
-            } //we don't want to delete permanently the existing registration just yet.
2751
-            // remove relation to transaction for these registrations if NOT the existing registrations
2752
-            $registration->_remove_relations('Transaction');
2753
-            // delete permanently any related messages.
2754
-            $registration->delete_related_permanently('Message');
2755
-            // now delete this registration permanently
2756
-            $registration->delete_permanently();
2757
-        }
2758
-        // now all related registrations on the transaction are handled.  So let's just handle this registration itself
2759
-        // (the transaction and line items should be all that's left).
2760
-        // delete the line items related to the transaction for this registration.
2761
-        $TXN->delete_related_permanently('Line_Item');
2762
-        // we need to remove all the relationships on the transaction
2763
-        $TXN->delete_related_permanently('Payment');
2764
-        $TXN->delete_related_permanently('Extra_Meta');
2765
-        $TXN->delete_related_permanently('Message');
2766
-        // now we can delete this REG permanently (and the transaction of course)
2767
-        $REG->delete_related_permanently('Transaction');
2768
-        return $REG->delete_permanently();
2769
-    }
2770
-
2771
-
2772
-    /**
2773
-     *    generates HTML for the Register New Attendee Admin page
2774
-     *
2775
-     * @access private
2776
-     * @throws DomainException
2777
-     * @throws EE_Error
2778
-     * @throws InvalidArgumentException
2779
-     * @throws InvalidDataTypeException
2780
-     * @throws InvalidInterfaceException
2781
-     * @throws ReflectionException
2782
-     */
2783
-    public function new_registration()
2784
-    {
2785
-        if (! $this->_set_reg_event()) {
2786
-            throw new EE_Error(
2787
-                esc_html__(
2788
-                    'Unable to continue with registering because there is no Event ID in the request',
2789
-                    'event_espresso'
2790
-                )
2791
-            );
2792
-        }
2793
-        EE_Registry::instance()->REQ->set_espresso_page(true);
2794
-        // gotta start with a clean slate if we're not coming here via ajax
2795
-        if (! defined('DOING_AJAX')
2796
-            && (! isset($this->_req_data['processing_registration']) || isset($this->_req_data['step_error']))
2797
-        ) {
2798
-            EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
2799
-        }
2800
-        $this->_template_args['event_name'] = '';
2801
-        // event name
2802
-        if ($this->_reg_event) {
2803
-            $this->_template_args['event_name'] = $this->_reg_event->name();
2804
-            $edit_event_url = self::add_query_args_and_nonce(
2805
-                array(
2806
-                    'action' => 'edit',
2807
-                    'post'   => $this->_reg_event->ID(),
2808
-                ),
2809
-                EVENTS_ADMIN_URL
2810
-            );
2811
-            $edit_event_lnk = '<a href="'
2812
-                              . $edit_event_url
2813
-                              . '" title="'
2814
-                              . esc_attr__('Edit ', 'event_espresso')
2815
-                              . $this->_reg_event->name()
2816
-                              . '">'
2817
-                              . esc_html__('Edit Event', 'event_espresso')
2818
-                              . '</a>';
2819
-            $this->_template_args['event_name'] .= ' <span class="admin-page-header-edit-lnk not-bold">'
2820
-                                                   . $edit_event_lnk
2821
-                                                   . '</span>';
2822
-        }
2823
-        $this->_template_args['step_content'] = $this->_get_registration_step_content();
2824
-        if (defined('DOING_AJAX')) {
2825
-            $this->_return_json();
2826
-        }
2827
-        // grab header
2828
-        $template_path =
2829
-            REG_TEMPLATE_PATH . 'reg_admin_register_new_attendee.template.php';
2830
-        $this->_template_args['admin_page_content'] = EEH_Template::display_template(
2831
-            $template_path,
2832
-            $this->_template_args,
2833
-            true
2834
-        );
2835
-        // $this->_set_publish_post_box_vars( NULL, FALSE, FALSE, NULL, FALSE );
2836
-        // the details template wrapper
2837
-        $this->display_admin_page_with_sidebar();
2838
-    }
2839
-
2840
-
2841
-    /**
2842
-     * This returns the content for a registration step
2843
-     *
2844
-     * @access protected
2845
-     * @return string html
2846
-     * @throws DomainException
2847
-     * @throws EE_Error
2848
-     * @throws InvalidArgumentException
2849
-     * @throws InvalidDataTypeException
2850
-     * @throws InvalidInterfaceException
2851
-     */
2852
-    protected function _get_registration_step_content()
2853
-    {
2854
-        if (isset($_COOKIE['ee_registration_added']) && $_COOKIE['ee_registration_added']) {
2855
-            $warning_msg = sprintf(
2856
-                esc_html__(
2857
-                    '%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',
2858
-                    'event_espresso'
2859
-                ),
2860
-                '<br />',
2861
-                '<h3 class="important-notice">',
2862
-                '</h3>',
2863
-                '<div class="float-right">',
2864
-                '<span id="redirect_timer" class="important-notice">30</span>',
2865
-                '</div>',
2866
-                '<b>',
2867
-                '</b>'
2868
-            );
2869
-            return '
2301
+	}
2302
+
2303
+
2304
+	/**
2305
+	 * Updates the registration's custom questions according to the form info, if the form is submitted.
2306
+	 * If it's not a post, the "view_registrations" route will be called next on the SAME request
2307
+	 * to display the page
2308
+	 *
2309
+	 * @access protected
2310
+	 * @return void
2311
+	 * @throws EE_Error
2312
+	 * @throws InvalidArgumentException
2313
+	 * @throws InvalidDataTypeException
2314
+	 * @throws InvalidInterfaceException
2315
+	 * @throws ReflectionException
2316
+	 */
2317
+	protected function _update_attendee_registration_form()
2318
+	{
2319
+		do_action('AHEE__Registrations_Admin_Page___update_attendee_registration_form__start', $this);
2320
+		if ($_SERVER['REQUEST_METHOD'] === 'POST') {
2321
+			$REG_ID = isset($this->_req_data['_REG_ID']) ? absint($this->_req_data['_REG_ID']) : false;
2322
+			$success = $this->_save_reg_custom_questions_form($REG_ID);
2323
+			if ($success) {
2324
+				$what = esc_html__('Registration Form', 'event_espresso');
2325
+				$route = $REG_ID ? array('action' => 'view_registration', '_REG_ID' => $REG_ID)
2326
+					: array('action' => 'default');
2327
+				$this->_redirect_after_action($success, $what, esc_html__('updated', 'event_espresso'), $route);
2328
+			}
2329
+		}
2330
+	}
2331
+
2332
+
2333
+	/**
2334
+	 * Gets the form for saving registrations custom questions (if done
2335
+	 * previously retrieves the cached form object, which may have validation errors in it)
2336
+	 *
2337
+	 * @param int $REG_ID
2338
+	 * @return EE_Registration_Custom_Questions_Form
2339
+	 * @throws EE_Error
2340
+	 * @throws InvalidArgumentException
2341
+	 * @throws InvalidDataTypeException
2342
+	 * @throws InvalidInterfaceException
2343
+	 */
2344
+	protected function _get_reg_custom_questions_form($REG_ID)
2345
+	{
2346
+		if (! $this->_reg_custom_questions_form) {
2347
+			require_once(REG_ADMIN . 'form_sections/EE_Registration_Custom_Questions_Form.form.php');
2348
+			$this->_reg_custom_questions_form = new EE_Registration_Custom_Questions_Form(
2349
+				$this->getRegistrationModel()->get_one_by_ID($REG_ID)
2350
+			);
2351
+			$this->_reg_custom_questions_form->_construct_finalize(null, null);
2352
+		}
2353
+		return $this->_reg_custom_questions_form;
2354
+	}
2355
+
2356
+
2357
+	/**
2358
+	 * Saves
2359
+	 *
2360
+	 * @access private
2361
+	 * @param bool $REG_ID
2362
+	 * @return bool
2363
+	 * @throws EE_Error
2364
+	 * @throws InvalidArgumentException
2365
+	 * @throws InvalidDataTypeException
2366
+	 * @throws InvalidInterfaceException
2367
+	 * @throws ReflectionException
2368
+	 */
2369
+	private function _save_reg_custom_questions_form($REG_ID = false)
2370
+	{
2371
+		if (! $REG_ID) {
2372
+			EE_Error::add_error(
2373
+				esc_html__(
2374
+					'An error occurred. No registration ID was received.',
2375
+					'event_espresso'
2376
+				),
2377
+				__FILE__,
2378
+				__FUNCTION__,
2379
+				__LINE__
2380
+			);
2381
+		}
2382
+		$form = $this->_get_reg_custom_questions_form($REG_ID);
2383
+		$form->receive_form_submission($this->_req_data);
2384
+		$success = false;
2385
+		if ($form->is_valid()) {
2386
+			foreach ($form->subforms() as $question_group_id => $question_group_form) {
2387
+				foreach ($question_group_form->inputs() as $question_id => $input) {
2388
+					$where_conditions = array(
2389
+						'QST_ID' => $question_id,
2390
+						'REG_ID' => $REG_ID,
2391
+					);
2392
+					$possibly_new_values = array(
2393
+						'ANS_value' => $input->normalized_value(),
2394
+					);
2395
+					$answer = EEM_Answer::instance()->get_one(array($where_conditions));
2396
+					if ($answer instanceof EE_Answer) {
2397
+						$success = $answer->save($possibly_new_values);
2398
+					} else {
2399
+						// insert it then
2400
+						$cols_n_vals = array_merge($where_conditions, $possibly_new_values);
2401
+						$answer = EE_Answer::new_instance($cols_n_vals);
2402
+						$success = $answer->save();
2403
+					}
2404
+				}
2405
+			}
2406
+		} else {
2407
+			EE_Error::add_error($form->get_validation_error_string(), __FILE__, __FUNCTION__, __LINE__);
2408
+		}
2409
+		return $success;
2410
+	}
2411
+
2412
+
2413
+	/**
2414
+	 *        generates HTML for the Registration main meta box
2415
+	 *
2416
+	 * @access public
2417
+	 * @return void
2418
+	 * @throws DomainException
2419
+	 * @throws EE_Error
2420
+	 * @throws InvalidArgumentException
2421
+	 * @throws InvalidDataTypeException
2422
+	 * @throws InvalidInterfaceException
2423
+	 * @throws ReflectionException
2424
+	 */
2425
+	public function _reg_attendees_meta_box()
2426
+	{
2427
+		$REG = $this->getRegistrationModel();
2428
+		// get all other registrations on this transaction, and cache
2429
+		// the attendees for them so we don't have to run another query using force_join
2430
+		$registrations = $REG->get_all(
2431
+			array(
2432
+				array(
2433
+					'TXN_ID' => $this->_registration->transaction_ID(),
2434
+					'REG_ID' => array('!=', $this->_registration->ID()),
2435
+				),
2436
+				'force_join' => array('Attendee'),
2437
+				'default_where_conditions' => 'other_models_only',
2438
+			)
2439
+		);
2440
+		$this->_template_args['attendees'] = array();
2441
+		$this->_template_args['attendee_notice'] = '';
2442
+		if (empty($registrations)
2443
+			|| (is_array($registrations)
2444
+				&& ! EEH_Array::get_one_item_from_array($registrations))
2445
+		) {
2446
+			EE_Error::add_error(
2447
+				esc_html__(
2448
+					'There are no records attached to this registration. Something may have gone wrong with the registration',
2449
+					'event_espresso'
2450
+				),
2451
+				__FILE__,
2452
+				__FUNCTION__,
2453
+				__LINE__
2454
+			);
2455
+			$this->_template_args['attendee_notice'] = EE_Error::get_notices();
2456
+		} else {
2457
+			$att_nmbr = 1;
2458
+			foreach ($registrations as $registration) {
2459
+				/* @var $registration EE_Registration */
2460
+				$attendee = $registration->attendee()
2461
+					? $registration->attendee()
2462
+					: $this->getAttendeeModel()->create_default_object();
2463
+				$this->_template_args['attendees'][ $att_nmbr ]['STS_ID'] = $registration->status_ID();
2464
+				$this->_template_args['attendees'][ $att_nmbr ]['fname'] = $attendee->fname();
2465
+				$this->_template_args['attendees'][ $att_nmbr ]['lname'] = $attendee->lname();
2466
+				$this->_template_args['attendees'][ $att_nmbr ]['email'] = $attendee->email();
2467
+				$this->_template_args['attendees'][ $att_nmbr ]['final_price'] = $registration->final_price();
2468
+				$this->_template_args['attendees'][ $att_nmbr ]['address'] = implode(
2469
+					', ',
2470
+					$attendee->full_address_as_array()
2471
+				);
2472
+				$this->_template_args['attendees'][ $att_nmbr ]['att_link'] = self::add_query_args_and_nonce(
2473
+					array(
2474
+						'action' => 'edit_attendee',
2475
+						'post'   => $attendee->ID(),
2476
+					),
2477
+					REG_ADMIN_URL
2478
+				);
2479
+				$this->_template_args['attendees'][ $att_nmbr ]['event_name'] = $registration->event_obj() instanceof EE_Event
2480
+					? $registration->event_obj()->name()
2481
+					: '';
2482
+				$att_nmbr++;
2483
+			}
2484
+			$this->_template_args['currency_sign'] = EE_Registry::instance()->CFG->currency->sign;
2485
+		}
2486
+		$template_path = REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_attendees.template.php';
2487
+		echo EEH_Template::display_template($template_path, $this->_template_args, true);
2488
+	}
2489
+
2490
+
2491
+	/**
2492
+	 *        generates HTML for the Edit Registration side meta box
2493
+	 *
2494
+	 * @access public
2495
+	 * @return void
2496
+	 * @throws DomainException
2497
+	 * @throws EE_Error
2498
+	 * @throws InvalidArgumentException
2499
+	 * @throws InvalidDataTypeException
2500
+	 * @throws InvalidInterfaceException
2501
+	 * @throws ReflectionException
2502
+	 */
2503
+	public function _reg_registrant_side_meta_box()
2504
+	{
2505
+		/*@var $attendee EE_Attendee */
2506
+		$att_check = $this->_registration->attendee();
2507
+		$attendee = $att_check instanceof EE_Attendee
2508
+			? $att_check
2509
+			: $this->getAttendeeModel()->create_default_object();
2510
+		// now let's determine if this is not the primary registration.  If it isn't then we set the
2511
+		// primary_registration object for reference BUT ONLY if the Attendee object loaded is not the same as the
2512
+		// primary registration object (that way we know if we need to show create button or not)
2513
+		if (! $this->_registration->is_primary_registrant()) {
2514
+			$primary_registration = $this->_registration->get_primary_registration();
2515
+			$primary_attendee = $primary_registration instanceof EE_Registration ? $primary_registration->attendee()
2516
+				: null;
2517
+			if (! $primary_attendee instanceof EE_Attendee || $attendee->ID() !== $primary_attendee->ID()) {
2518
+				// in here?  This means the displayed registration is not the primary registrant but ALREADY HAS its own
2519
+				// custom attendee object so let's not worry about the primary reg.
2520
+				$primary_registration = null;
2521
+			}
2522
+		} else {
2523
+			$primary_registration = null;
2524
+		}
2525
+		$this->_template_args['ATT_ID'] = $attendee->ID();
2526
+		$this->_template_args['fname'] = $attendee->fname();
2527
+		$this->_template_args['lname'] = $attendee->lname();
2528
+		$this->_template_args['email'] = $attendee->email();
2529
+		$this->_template_args['phone'] = $attendee->phone();
2530
+		$this->_template_args['formatted_address'] = EEH_Address::format($attendee);
2531
+		// edit link
2532
+		$this->_template_args['att_edit_link'] = EE_Admin_Page::add_query_args_and_nonce(
2533
+			array(
2534
+				'action' => 'edit_attendee',
2535
+				'post'   => $attendee->ID(),
2536
+			),
2537
+			REG_ADMIN_URL
2538
+		);
2539
+		$this->_template_args['att_edit_label'] = esc_html__('View/Edit Contact', 'event_espresso');
2540
+		// create link
2541
+		$this->_template_args['create_link'] = $primary_registration instanceof EE_Registration
2542
+			? EE_Admin_Page::add_query_args_and_nonce(
2543
+				array(
2544
+					'action'  => 'duplicate_attendee',
2545
+					'_REG_ID' => $this->_registration->ID(),
2546
+				),
2547
+				REG_ADMIN_URL
2548
+			) : '';
2549
+		$this->_template_args['create_label'] = esc_html__('Create Contact', 'event_espresso');
2550
+		$this->_template_args['att_check'] = $att_check;
2551
+		$template_path = REG_TEMPLATE_PATH . 'reg_admin_details_side_meta_box_registrant.template.php';
2552
+		echo EEH_Template::display_template($template_path, $this->_template_args, true);
2553
+	}
2554
+
2555
+
2556
+	/**
2557
+	 * trash or restore registrations
2558
+	 *
2559
+	 * @param  boolean $trash whether to archive or restore
2560
+	 * @return void
2561
+	 * @throws EE_Error
2562
+	 * @throws InvalidArgumentException
2563
+	 * @throws InvalidDataTypeException
2564
+	 * @throws InvalidInterfaceException
2565
+	 * @throws RuntimeException
2566
+	 * @access protected
2567
+	 */
2568
+	protected function _trash_or_restore_registrations($trash = true)
2569
+	{
2570
+		// if empty _REG_ID then get out because there's nothing to do
2571
+		if (empty($this->_req_data['_REG_ID'])) {
2572
+			EE_Error::add_error(
2573
+				sprintf(
2574
+					esc_html__(
2575
+						'In order to %1$s registrations you must select which ones you wish to %1$s by clicking the checkboxes.',
2576
+						'event_espresso'
2577
+					),
2578
+					$trash ? 'trash' : 'restore'
2579
+				),
2580
+				__FILE__,
2581
+				__LINE__,
2582
+				__FUNCTION__
2583
+			);
2584
+			$this->_redirect_after_action(false, '', '', array(), true);
2585
+		}
2586
+		$success = 0;
2587
+		$overwrite_msgs = false;
2588
+		// Checkboxes
2589
+		if (! is_array($this->_req_data['_REG_ID'])) {
2590
+			$this->_req_data['_REG_ID'] = array($this->_req_data['_REG_ID']);
2591
+		}
2592
+		$reg_count = count($this->_req_data['_REG_ID']);
2593
+		// cycle thru checkboxes
2594
+		foreach ($this->_req_data['_REG_ID'] as $REG_ID) {
2595
+			/** @var EE_Registration $REG */
2596
+			$REG = $this->getRegistrationModel()->get_one_by_ID($REG_ID);
2597
+			$payments = $REG->registration_payments();
2598
+			if (! empty($payments)) {
2599
+				$name = $REG->attendee() instanceof EE_Attendee
2600
+					? $REG->attendee()->full_name()
2601
+					: esc_html__('Unknown Attendee', 'event_espresso');
2602
+				$overwrite_msgs = true;
2603
+				EE_Error::add_error(
2604
+					sprintf(
2605
+						esc_html__(
2606
+							'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.',
2607
+							'event_espresso'
2608
+						),
2609
+						$name
2610
+					),
2611
+					__FILE__,
2612
+					__FUNCTION__,
2613
+					__LINE__
2614
+				);
2615
+				// can't trash this registration because it has payments.
2616
+				continue;
2617
+			}
2618
+			$updated = $trash ? $REG->delete() : $REG->restore();
2619
+			if ($updated) {
2620
+				$success++;
2621
+			}
2622
+		}
2623
+		$this->_redirect_after_action(
2624
+			$success === $reg_count, // were ALL registrations affected?
2625
+			$success > 1
2626
+				? esc_html__('Registrations', 'event_espresso')
2627
+				: esc_html__('Registration', 'event_espresso'),
2628
+			$trash
2629
+				? esc_html__('moved to the trash', 'event_espresso')
2630
+				: esc_html__('restored', 'event_espresso'),
2631
+			$this->mergeExistingRequestParamsWithRedirectArgs(array('action' => 'default')),
2632
+			$overwrite_msgs
2633
+		);
2634
+	}
2635
+
2636
+
2637
+	/**
2638
+	 * This is used to permanently delete registrations.  Note, this will handle not only deleting permanently the
2639
+	 * registration but also.
2640
+	 * 1. Removing relations to EE_Attendee
2641
+	 * 2. Deleting permanently the related transaction, but ONLY if all related registrations to the transaction are
2642
+	 * ALSO trashed.
2643
+	 * 3. Deleting permanently any related Line items but only if the above conditions are met.
2644
+	 * 4. Removing relationships between all tickets and the related registrations
2645
+	 * 5. Deleting permanently any related Answers (and the answers for other related registrations that were deleted.)
2646
+	 * 6. Deleting permanently any related Checkins.
2647
+	 *
2648
+	 * @return void
2649
+	 * @throws EE_Error
2650
+	 * @throws InvalidArgumentException
2651
+	 * @throws InvalidDataTypeException
2652
+	 * @throws InvalidInterfaceException
2653
+	 * @throws ReflectionException
2654
+	 */
2655
+	protected function _delete_registrations()
2656
+	{
2657
+		$REG_MDL = $this->getRegistrationModel();
2658
+		$success = 1;
2659
+		// Checkboxes
2660
+		if (! empty($this->_req_data['_REG_ID']) && is_array($this->_req_data['_REG_ID'])) {
2661
+			// if array has more than one element than success message should be plural
2662
+			$success = count($this->_req_data['_REG_ID']) > 1 ? 2 : 1;
2663
+			// cycle thru checkboxes
2664
+			foreach ($this->_req_data['_REG_ID'] as $REG_ID) {
2665
+				$REG = $REG_MDL->get_one_by_ID($REG_ID);
2666
+				if (! $REG instanceof EE_Registration) {
2667
+					continue;
2668
+				}
2669
+				$deleted = $this->_delete_registration($REG);
2670
+				if (! $deleted) {
2671
+					$success = 0;
2672
+				}
2673
+			}
2674
+		} else {
2675
+			// grab single id and delete
2676
+			$REG_ID = $this->_req_data['_REG_ID'];
2677
+			/** @var EE_Registration $REG */
2678
+			$REG = $REG_MDL->get_one_by_ID($REG_ID);
2679
+			$deleted = $this->_delete_registration($REG);
2680
+			if (! $deleted) {
2681
+				$success = 0;
2682
+			}
2683
+		}
2684
+		$what = $success > 1
2685
+			? esc_html__('Registrations', 'event_espresso')
2686
+			: esc_html__('Registration', 'event_espresso');
2687
+		$action_desc = esc_html__('permanently deleted.', 'event_espresso');
2688
+		$this->_redirect_after_action(
2689
+			$success,
2690
+			$what,
2691
+			$action_desc,
2692
+			$this->mergeExistingRequestParamsWithRedirectArgs(['action' => 'default']),
2693
+			true
2694
+		);
2695
+	}
2696
+
2697
+
2698
+	/**
2699
+	 * handles the permanent deletion of a registration.  See comments with _delete_registrations() for details on what
2700
+	 * models get affected.
2701
+	 *
2702
+	 * @param EE_Registration $REG registration to be deleted permanently
2703
+	 * @return bool true = successful deletion, false = fail.
2704
+	 * @throws EE_Error
2705
+	 * @throws InvalidArgumentException
2706
+	 * @throws InvalidDataTypeException
2707
+	 * @throws InvalidInterfaceException
2708
+	 * @throws ReflectionException
2709
+	 */
2710
+	protected function _delete_registration(EE_Registration $REG)
2711
+	{
2712
+		// first we start with the transaction... ultimately, we WILL not delete permanently if there are any related
2713
+		// registrations on the transaction that are NOT trashed.
2714
+		$TXN = $REG->get_first_related('Transaction');
2715
+		$REGS = $TXN->get_many_related('Registration');
2716
+		$all_trashed = true;
2717
+		foreach ($REGS as $registration) {
2718
+			if (! $registration->get('REG_deleted')) {
2719
+				$all_trashed = false;
2720
+			}
2721
+		}
2722
+		if (! $all_trashed) {
2723
+			EE_Error::add_error(
2724
+				esc_html__(
2725
+					'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.',
2726
+					'event_espresso'
2727
+				),
2728
+				__FILE__,
2729
+				__FUNCTION__,
2730
+				__LINE__
2731
+			);
2732
+			return false;
2733
+		}
2734
+		// k made it here so that means we can delete all the related transactions and their answers (but let's do them
2735
+		// separately from THIS one).
2736
+		foreach ($REGS as $registration) {
2737
+			// delete related answers
2738
+			$registration->delete_related_permanently('Answer');
2739
+			// remove relationship to EE_Attendee (but we ALWAYS leave the contact record intact)
2740
+			$attendee = $registration->get_first_related('Attendee');
2741
+			if ($attendee instanceof EE_Attendee) {
2742
+				$registration->_remove_relation_to($attendee, 'Attendee');
2743
+			}
2744
+			// now remove relationships to tickets on this registration.
2745
+			$registration->_remove_relations('Ticket');
2746
+			// now delete permanently the checkins related to this registration.
2747
+			$registration->delete_related_permanently('Checkin');
2748
+			if ($registration->ID() === $REG->ID()) {
2749
+				continue;
2750
+			} //we don't want to delete permanently the existing registration just yet.
2751
+			// remove relation to transaction for these registrations if NOT the existing registrations
2752
+			$registration->_remove_relations('Transaction');
2753
+			// delete permanently any related messages.
2754
+			$registration->delete_related_permanently('Message');
2755
+			// now delete this registration permanently
2756
+			$registration->delete_permanently();
2757
+		}
2758
+		// now all related registrations on the transaction are handled.  So let's just handle this registration itself
2759
+		// (the transaction and line items should be all that's left).
2760
+		// delete the line items related to the transaction for this registration.
2761
+		$TXN->delete_related_permanently('Line_Item');
2762
+		// we need to remove all the relationships on the transaction
2763
+		$TXN->delete_related_permanently('Payment');
2764
+		$TXN->delete_related_permanently('Extra_Meta');
2765
+		$TXN->delete_related_permanently('Message');
2766
+		// now we can delete this REG permanently (and the transaction of course)
2767
+		$REG->delete_related_permanently('Transaction');
2768
+		return $REG->delete_permanently();
2769
+	}
2770
+
2771
+
2772
+	/**
2773
+	 *    generates HTML for the Register New Attendee Admin page
2774
+	 *
2775
+	 * @access private
2776
+	 * @throws DomainException
2777
+	 * @throws EE_Error
2778
+	 * @throws InvalidArgumentException
2779
+	 * @throws InvalidDataTypeException
2780
+	 * @throws InvalidInterfaceException
2781
+	 * @throws ReflectionException
2782
+	 */
2783
+	public function new_registration()
2784
+	{
2785
+		if (! $this->_set_reg_event()) {
2786
+			throw new EE_Error(
2787
+				esc_html__(
2788
+					'Unable to continue with registering because there is no Event ID in the request',
2789
+					'event_espresso'
2790
+				)
2791
+			);
2792
+		}
2793
+		EE_Registry::instance()->REQ->set_espresso_page(true);
2794
+		// gotta start with a clean slate if we're not coming here via ajax
2795
+		if (! defined('DOING_AJAX')
2796
+			&& (! isset($this->_req_data['processing_registration']) || isset($this->_req_data['step_error']))
2797
+		) {
2798
+			EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
2799
+		}
2800
+		$this->_template_args['event_name'] = '';
2801
+		// event name
2802
+		if ($this->_reg_event) {
2803
+			$this->_template_args['event_name'] = $this->_reg_event->name();
2804
+			$edit_event_url = self::add_query_args_and_nonce(
2805
+				array(
2806
+					'action' => 'edit',
2807
+					'post'   => $this->_reg_event->ID(),
2808
+				),
2809
+				EVENTS_ADMIN_URL
2810
+			);
2811
+			$edit_event_lnk = '<a href="'
2812
+							  . $edit_event_url
2813
+							  . '" title="'
2814
+							  . esc_attr__('Edit ', 'event_espresso')
2815
+							  . $this->_reg_event->name()
2816
+							  . '">'
2817
+							  . esc_html__('Edit Event', 'event_espresso')
2818
+							  . '</a>';
2819
+			$this->_template_args['event_name'] .= ' <span class="admin-page-header-edit-lnk not-bold">'
2820
+												   . $edit_event_lnk
2821
+												   . '</span>';
2822
+		}
2823
+		$this->_template_args['step_content'] = $this->_get_registration_step_content();
2824
+		if (defined('DOING_AJAX')) {
2825
+			$this->_return_json();
2826
+		}
2827
+		// grab header
2828
+		$template_path =
2829
+			REG_TEMPLATE_PATH . 'reg_admin_register_new_attendee.template.php';
2830
+		$this->_template_args['admin_page_content'] = EEH_Template::display_template(
2831
+			$template_path,
2832
+			$this->_template_args,
2833
+			true
2834
+		);
2835
+		// $this->_set_publish_post_box_vars( NULL, FALSE, FALSE, NULL, FALSE );
2836
+		// the details template wrapper
2837
+		$this->display_admin_page_with_sidebar();
2838
+	}
2839
+
2840
+
2841
+	/**
2842
+	 * This returns the content for a registration step
2843
+	 *
2844
+	 * @access protected
2845
+	 * @return string html
2846
+	 * @throws DomainException
2847
+	 * @throws EE_Error
2848
+	 * @throws InvalidArgumentException
2849
+	 * @throws InvalidDataTypeException
2850
+	 * @throws InvalidInterfaceException
2851
+	 */
2852
+	protected function _get_registration_step_content()
2853
+	{
2854
+		if (isset($_COOKIE['ee_registration_added']) && $_COOKIE['ee_registration_added']) {
2855
+			$warning_msg = sprintf(
2856
+				esc_html__(
2857
+					'%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',
2858
+					'event_espresso'
2859
+				),
2860
+				'<br />',
2861
+				'<h3 class="important-notice">',
2862
+				'</h3>',
2863
+				'<div class="float-right">',
2864
+				'<span id="redirect_timer" class="important-notice">30</span>',
2865
+				'</div>',
2866
+				'<b>',
2867
+				'</b>'
2868
+			);
2869
+			return '
2870 2870
 	<div id="ee-add-reg-back-button-dv"><p>' . $warning_msg . '</p></div>
2871 2871
 	<script >
2872 2872
 		// WHOAH !!! it appears that someone is using the back button from the Transaction admin page
@@ -2879,868 +2879,868 @@  discard block
 block discarded – undo
2879 2879
 	        }
2880 2880
 	    }, 800 );
2881 2881
 	</script >';
2882
-        }
2883
-        $template_args = array(
2884
-            'title'                    => '',
2885
-            'content'                  => '',
2886
-            'step_button_text'         => '',
2887
-            'show_notification_toggle' => false,
2888
-        );
2889
-        // to indicate we're processing a new registration
2890
-        $hidden_fields = array(
2891
-            'processing_registration' => array(
2892
-                'type'  => 'hidden',
2893
-                'value' => 0,
2894
-            ),
2895
-            'event_id'                => array(
2896
-                'type'  => 'hidden',
2897
-                'value' => $this->_reg_event->ID(),
2898
-            ),
2899
-        );
2900
-        // if the cart is empty then we know we're at step one so we'll display ticket selector
2901
-        $cart = EE_Registry::instance()->SSN->cart();
2902
-        $step = ! $cart instanceof EE_Cart ? 'ticket' : 'questions';
2903
-        switch ($step) {
2904
-            case 'ticket':
2905
-                $hidden_fields['processing_registration']['value'] = 1;
2906
-                $template_args['title'] = esc_html__(
2907
-                    'Step One: Select the Ticket for this registration',
2908
-                    'event_espresso'
2909
-                );
2910
-                $template_args['content'] =
2911
-                    EED_Ticket_Selector::instance()->display_ticket_selector($this->_reg_event);
2912
-                $template_args['content'] .= '</div>';
2913
-                $template_args['step_button_text'] = esc_html__(
2914
-                    'Add Tickets and Continue to Registrant Details',
2915
-                    'event_espresso'
2916
-                );
2917
-                $template_args['show_notification_toggle'] = false;
2918
-                break;
2919
-            case 'questions':
2920
-                $hidden_fields['processing_registration']['value'] = 2;
2921
-                $template_args['title'] = esc_html__(
2922
-                    'Step Two: Add Registrant Details for this Registration',
2923
-                    'event_espresso'
2924
-                );
2925
-                // in theory we should be able to run EED_SPCO at this point because the cart should have been setup
2926
-                // properly by the first process_reg_step run.
2927
-                $template_args['content'] =
2928
-                    EED_Single_Page_Checkout::registration_checkout_for_admin();
2929
-                $template_args['step_button_text'] = esc_html__(
2930
-                    'Save Registration and Continue to Details',
2931
-                    'event_espresso'
2932
-                );
2933
-                $template_args['show_notification_toggle'] = true;
2934
-                break;
2935
-        }
2936
-        // we come back to the process_registration_step route.
2937
-        $this->_set_add_edit_form_tags('process_reg_step', $hidden_fields);
2938
-        return EEH_Template::display_template(
2939
-            REG_TEMPLATE_PATH . 'reg_admin_register_new_attendee_step_content.template.php',
2940
-            $template_args,
2941
-            true
2942
-        );
2943
-    }
2944
-
2945
-
2946
-    /**
2947
-     *        set_reg_event
2948
-     *
2949
-     * @access private
2950
-     * @return bool
2951
-     * @throws EE_Error
2952
-     * @throws InvalidArgumentException
2953
-     * @throws InvalidDataTypeException
2954
-     * @throws InvalidInterfaceException
2955
-     */
2956
-    private function _set_reg_event()
2957
-    {
2958
-        if (is_object($this->_reg_event)) {
2959
-            return true;
2960
-        }
2961
-        $EVT_ID = (! empty($this->_req_data['event_id'])) ? absint($this->_req_data['event_id']) : false;
2962
-        if (! $EVT_ID) {
2963
-            return false;
2964
-        }
2965
-        $this->_reg_event = $this->getEventModel()->get_one_by_ID($EVT_ID);
2966
-        return true;
2967
-    }
2968
-
2969
-
2970
-    /**
2971
-     * process_reg_step
2972
-     *
2973
-     * @access        public
2974
-     * @return string
2975
-     * @throws DomainException
2976
-     * @throws EE_Error
2977
-     * @throws InvalidArgumentException
2978
-     * @throws InvalidDataTypeException
2979
-     * @throws InvalidInterfaceException
2980
-     * @throws ReflectionException
2981
-     * @throws RuntimeException
2982
-     */
2983
-    public function process_reg_step()
2984
-    {
2985
-        EE_System::do_not_cache();
2986
-        $this->_set_reg_event();
2987
-        EE_Registry::instance()->REQ->set_espresso_page(true);
2988
-        EE_Registry::instance()->REQ->set('uts', time());
2989
-        // what step are we on?
2990
-        $cart = EE_Registry::instance()->SSN->cart();
2991
-        $step = ! $cart instanceof EE_Cart ? 'ticket' : 'questions';
2992
-        // if doing ajax then we need to verify the nonce
2993
-        if (defined('DOING_AJAX')) {
2994
-            $nonce = isset($this->_req_data[ $this->_req_nonce ])
2995
-                ? sanitize_text_field($this->_req_data[ $this->_req_nonce ]) : '';
2996
-            $this->_verify_nonce($nonce, $this->_req_nonce);
2997
-        }
2998
-        switch ($step) {
2999
-            case 'ticket':
3000
-                // process ticket selection
3001
-                $success = EED_Ticket_Selector::instance()->process_ticket_selections();
3002
-                if ($success) {
3003
-                    EE_Error::add_success(
3004
-                        esc_html__(
3005
-                            'Tickets Selected. Now complete the registration.',
3006
-                            'event_espresso'
3007
-                        )
3008
-                    );
3009
-                } else {
3010
-                    $query_args['step_error'] = $this->_req_data['step_error'] = true;
3011
-                }
3012
-                if (defined('DOING_AJAX')) {
3013
-                    $this->new_registration(); // display next step
3014
-                } else {
3015
-                    $query_args = array(
3016
-                        'action'                  => 'new_registration',
3017
-                        'processing_registration' => 1,
3018
-                        'event_id'                => $this->_reg_event->ID(),
3019
-                        'uts'                     => time(),
3020
-                    );
3021
-                    $this->_redirect_after_action(
3022
-                        false,
3023
-                        '',
3024
-                        '',
3025
-                        $query_args,
3026
-                        true
3027
-                    );
3028
-                }
3029
-                break;
3030
-            case 'questions':
3031
-                if (! isset(
3032
-                    $this->_req_data['txn_reg_status_change'],
3033
-                    $this->_req_data['txn_reg_status_change']['send_notifications']
3034
-                )
3035
-                ) {
3036
-                    add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_false', 15);
3037
-                }
3038
-                // process registration
3039
-                $transaction = EED_Single_Page_Checkout::instance()->process_registration_from_admin();
3040
-                if ($cart instanceof EE_Cart) {
3041
-                    $grand_total = $cart->get_cart_grand_total();
3042
-                    if ($grand_total instanceof EE_Line_Item) {
3043
-                        $grand_total->save_this_and_descendants_to_txn();
3044
-                    }
3045
-                }
3046
-                if (! $transaction instanceof EE_Transaction) {
3047
-                    $query_args = array(
3048
-                        'action'                  => 'new_registration',
3049
-                        'processing_registration' => 2,
3050
-                        'event_id'                => $this->_reg_event->ID(),
3051
-                        'uts'                     => time(),
3052
-                    );
3053
-                    if (defined('DOING_AJAX')) {
3054
-                        // display registration form again because there are errors (maybe validation?)
3055
-                        $this->new_registration();
3056
-                        return;
3057
-                    }
3058
-                    $this->_redirect_after_action(
3059
-                        false,
3060
-                        '',
3061
-                        '',
3062
-                        $query_args,
3063
-                        true
3064
-                    );
3065
-                    return;
3066
-                }
3067
-                // maybe update status, and make sure to save transaction if not done already
3068
-                if (! $transaction->update_status_based_on_total_paid()) {
3069
-                    $transaction->save();
3070
-                }
3071
-                EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
3072
-                $this->_req_data = array();
3073
-                $query_args = array(
3074
-                    'action'        => 'redirect_to_txn',
3075
-                    'TXN_ID'        => $transaction->ID(),
3076
-                    'EVT_ID'        => $this->_reg_event->ID(),
3077
-                    'event_name'    => urlencode($this->_reg_event->name()),
3078
-                    'redirect_from' => 'new_registration',
3079
-                );
3080
-                $this->_redirect_after_action(false, '', '', $query_args, true);
3081
-                break;
3082
-        }
3083
-        // what are you looking here for?  Should be nothing to do at this point.
3084
-    }
3085
-
3086
-
3087
-    /**
3088
-     * redirect_to_txn
3089
-     *
3090
-     * @access public
3091
-     * @return void
3092
-     * @throws EE_Error
3093
-     * @throws InvalidArgumentException
3094
-     * @throws InvalidDataTypeException
3095
-     * @throws InvalidInterfaceException
3096
-     * @throws ReflectionException
3097
-     */
3098
-    public function redirect_to_txn()
3099
-    {
3100
-        EE_System::do_not_cache();
3101
-        EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
3102
-        $query_args = array(
3103
-            'action' => 'view_transaction',
3104
-            'TXN_ID' => isset($this->_req_data['TXN_ID']) ? absint($this->_req_data['TXN_ID']) : 0,
3105
-            'page'   => 'espresso_transactions',
3106
-        );
3107
-        if (isset($this->_req_data['EVT_ID'], $this->_req_data['redirect_from'])) {
3108
-            $query_args['EVT_ID'] = $this->_req_data['EVT_ID'];
3109
-            $query_args['event_name'] = urlencode($this->_req_data['event_name']);
3110
-            $query_args['redirect_from'] = $this->_req_data['redirect_from'];
3111
-        }
3112
-        EE_Error::add_success(
3113
-            esc_html__(
3114
-                'Registration Created.  Please review the transaction and add any payments as necessary',
3115
-                'event_espresso'
3116
-            )
3117
-        );
3118
-        $this->_redirect_after_action(false, '', '', $query_args, true);
3119
-    }
3120
-
3121
-
3122
-    /**
3123
-     *        generates HTML for the Attendee Contact List
3124
-     *
3125
-     * @access protected
3126
-     * @return void
3127
-     * @throws DomainException
3128
-     * @throws EE_Error
3129
-     */
3130
-    protected function _attendee_contact_list_table()
3131
-    {
3132
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
3133
-        $this->_search_btn_label = esc_html__('Contacts', 'event_espresso');
3134
-        $this->display_admin_list_table_page_with_no_sidebar();
3135
-    }
3136
-
3137
-
3138
-    /**
3139
-     *        get_attendees
3140
-     *
3141
-     * @param      $per_page
3142
-     * @param bool $count whether to return count or data.
3143
-     * @param bool $trash
3144
-     * @return array
3145
-     * @throws EE_Error
3146
-     * @throws InvalidArgumentException
3147
-     * @throws InvalidDataTypeException
3148
-     * @throws InvalidInterfaceException
3149
-     * @access public
3150
-     */
3151
-    public function get_attendees($per_page, $count = false, $trash = false)
3152
-    {
3153
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
3154
-        require_once(REG_ADMIN . 'EE_Attendee_Contact_List_Table.class.php');
3155
-        $this->_req_data['orderby'] = ! empty($this->_req_data['orderby']) ? $this->_req_data['orderby'] : '';
3156
-        switch ($this->_req_data['orderby']) {
3157
-            case 'ATT_ID':
3158
-                $orderby = 'ATT_ID';
3159
-                break;
3160
-            case 'ATT_fname':
3161
-                $orderby = 'ATT_fname';
3162
-                break;
3163
-            case 'ATT_email':
3164
-                $orderby = 'ATT_email';
3165
-                break;
3166
-            case 'ATT_city':
3167
-                $orderby = 'ATT_city';
3168
-                break;
3169
-            case 'STA_ID':
3170
-                $orderby = 'STA_ID';
3171
-                break;
3172
-            case 'CNT_ID':
3173
-                $orderby = 'CNT_ID';
3174
-                break;
3175
-            case 'Registration_Count':
3176
-                $orderby = 'Registration_Count';
3177
-                break;
3178
-            default:
3179
-                $orderby = 'ATT_lname';
3180
-        }
3181
-        $sort = (isset($this->_req_data['order']) && ! empty($this->_req_data['order']))
3182
-            ? $this->_req_data['order']
3183
-            : 'ASC';
3184
-        $current_page = isset($this->_req_data['paged']) && ! empty($this->_req_data['paged'])
3185
-            ? $this->_req_data['paged']
3186
-            : 1;
3187
-        $per_page = isset($per_page) && ! empty($per_page) ? $per_page : 10;
3188
-        $per_page = isset($this->_req_data['perpage']) && ! empty($this->_req_data['perpage'])
3189
-            ? $this->_req_data['perpage']
3190
-            : $per_page;
3191
-        $_where = array();
3192
-        if (! empty($this->_req_data['s'])) {
3193
-            $sstr = '%' . $this->_req_data['s'] . '%';
3194
-            $_where['OR'] = array(
3195
-                'Registration.Event.EVT_name'       => array('LIKE', $sstr),
3196
-                'Registration.Event.EVT_desc'       => array('LIKE', $sstr),
3197
-                'Registration.Event.EVT_short_desc' => array('LIKE', $sstr),
3198
-                'ATT_fname'                         => array('LIKE', $sstr),
3199
-                'ATT_lname'                         => array('LIKE', $sstr),
3200
-                'ATT_short_bio'                     => array('LIKE', $sstr),
3201
-                'ATT_email'                         => array('LIKE', $sstr),
3202
-                'ATT_address'                       => array('LIKE', $sstr),
3203
-                'ATT_address2'                      => array('LIKE', $sstr),
3204
-                'ATT_city'                          => array('LIKE', $sstr),
3205
-                'Country.CNT_name'                  => array('LIKE', $sstr),
3206
-                'State.STA_name'                    => array('LIKE', $sstr),
3207
-                'ATT_phone'                         => array('LIKE', $sstr),
3208
-                'Registration.REG_final_price'      => array('LIKE', $sstr),
3209
-                'Registration.REG_code'             => array('LIKE', $sstr),
3210
-                'Registration.REG_group_size'       => array('LIKE', $sstr),
3211
-            );
3212
-        }
3213
-        $offset = ($current_page - 1) * $per_page;
3214
-        $limit = $count ? null : array($offset, $per_page);
3215
-        $query_args = array(
3216
-            $_where,
3217
-            'extra_selects' => array('Registration_Count' => array('Registration.REG_ID', 'count', '%d')),
3218
-            'limit'         => $limit,
3219
-        );
3220
-        if (! $count) {
3221
-            $query_args['order_by'] = array($orderby => $sort);
3222
-        }
3223
-        if ($trash) {
3224
-            $query_args[0]['status'] = array('!=', 'publish');
3225
-            $all_attendees = $count
3226
-                ? $this->getAttendeeModel()->count($query_args, 'ATT_ID', true)
3227
-                : $this->getAttendeeModel()->get_all($query_args);
3228
-        } else {
3229
-            $query_args[0]['status'] = array('IN', array('publish'));
3230
-            $all_attendees = $count
3231
-                ? $this->getAttendeeModel()->count($query_args, 'ATT_ID', true)
3232
-                : $this->getAttendeeModel()->get_all($query_args);
3233
-        }
3234
-        return $all_attendees;
3235
-    }
3236
-
3237
-
3238
-    /**
3239
-     * This is just taking care of resending the registration confirmation
3240
-     *
3241
-     * @access protected
3242
-     * @return void
3243
-     * @throws EE_Error
3244
-     * @throws InvalidArgumentException
3245
-     * @throws InvalidDataTypeException
3246
-     * @throws InvalidInterfaceException
3247
-     * @throws ReflectionException
3248
-     */
3249
-    protected function _resend_registration()
3250
-    {
3251
-        $this->_process_resend_registration();
3252
-        $query_args = isset($this->_req_data['redirect_to'])
3253
-            ? array('action' => $this->_req_data['redirect_to'], '_REG_ID' => $this->_req_data['_REG_ID'])
3254
-            : array('action' => 'default');
3255
-        $this->_redirect_after_action(false, '', '', $query_args, true);
3256
-    }
3257
-
3258
-    /**
3259
-     * Creates a registration report, but accepts the name of a method to use for preparing the query parameters
3260
-     * to use when selecting registrations
3261
-     *
3262
-     * @param string $method_name_for_getting_query_params the name of the method (on this class) to use for preparing
3263
-     *                                                     the query parameters from the request
3264
-     * @return void ends the request with a redirect or download
3265
-     */
3266
-    public function _registrations_report_base($method_name_for_getting_query_params)
3267
-    {
3268
-        if (! defined('EE_USE_OLD_CSV_REPORT_CLASS')) {
3269
-            wp_redirect(
3270
-                EE_Admin_Page::add_query_args_and_nonce(
3271
-                    array(
3272
-                        'page'        => 'espresso_batch',
3273
-                        'batch'       => 'file',
3274
-                        'EVT_ID'      => isset($this->_req_data['EVT_ID']) ? $this->_req_data['EVT_ID'] : null,
3275
-                        'filters'     => urlencode(
3276
-                            serialize(
3277
-                                $this->$method_name_for_getting_query_params(
3278
-                                    EEH_Array::is_set(
3279
-                                        $this->_req_data,
3280
-                                        'filters',
3281
-                                        array()
3282
-                                    )
3283
-                                )
3284
-                            )
3285
-                        ),
3286
-                        'use_filters' => EEH_Array::is_set($this->_req_data, 'use_filters', false),
3287
-                        'job_handler' => urlencode('EventEspressoBatchRequest\JobHandlers\RegistrationsReport'),
3288
-                        'return_url'  => urlencode($this->_req_data['return_url']),
3289
-                    )
3290
-                )
3291
-            );
3292
-        } else {
3293
-            $new_request_args = array(
3294
-                'export' => 'report',
3295
-                'action' => 'registrations_report_for_event',
3296
-                'EVT_ID' => isset($this->_req_data['EVT_ID']) ? $this->_req_data['EVT_ID'] : null,
3297
-            );
3298
-            $this->_req_data = array_merge($this->_req_data, $new_request_args);
3299
-            if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3300
-                require_once(EE_CLASSES . 'EE_Export.class.php');
3301
-                $EE_Export = EE_Export::instance($this->_req_data);
3302
-                $EE_Export->export();
3303
-            }
3304
-        }
3305
-    }
3306
-
3307
-
3308
-    /**
3309
-     * Creates a registration report using only query parameters in the request
3310
-     *
3311
-     * @return void
3312
-     */
3313
-    public function _registrations_report()
3314
-    {
3315
-        $this->_registrations_report_base('_get_registration_query_parameters');
3316
-    }
3317
-
3318
-
3319
-    public function _contact_list_export()
3320
-    {
3321
-        if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3322
-            require_once(EE_CLASSES . 'EE_Export.class.php');
3323
-            $EE_Export = EE_Export::instance($this->_req_data);
3324
-            $EE_Export->export_attendees();
3325
-        }
3326
-    }
3327
-
3328
-
3329
-    public function _contact_list_report()
3330
-    {
3331
-        if (! defined('EE_USE_OLD_CSV_REPORT_CLASS')) {
3332
-            wp_redirect(
3333
-                EE_Admin_Page::add_query_args_and_nonce(
3334
-                    array(
3335
-                        'page'        => 'espresso_batch',
3336
-                        'batch'       => 'file',
3337
-                        'job_handler' => urlencode('EventEspressoBatchRequest\JobHandlers\AttendeesReport'),
3338
-                        'return_url'  => urlencode($this->_req_data['return_url']),
3339
-                    )
3340
-                )
3341
-            );
3342
-        } else {
3343
-            if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3344
-                require_once(EE_CLASSES . 'EE_Export.class.php');
3345
-                $EE_Export = EE_Export::instance($this->_req_data);
3346
-                $EE_Export->report_attendees();
3347
-            }
3348
-        }
3349
-    }
3350
-
3351
-
3352
-
3353
-
3354
-
3355
-    /***************************************        ATTENDEE DETAILS        ***************************************/
3356
-    /**
3357
-     * This duplicates the attendee object for the given incoming registration id and attendee_id.
3358
-     *
3359
-     * @return void
3360
-     * @throws EE_Error
3361
-     * @throws InvalidArgumentException
3362
-     * @throws InvalidDataTypeException
3363
-     * @throws InvalidInterfaceException
3364
-     * @throws ReflectionException
3365
-     */
3366
-    protected function _duplicate_attendee()
3367
-    {
3368
-        $action = ! empty($this->_req_data['return']) ? $this->_req_data['return'] : 'default';
3369
-        // verify we have necessary info
3370
-        if (empty($this->_req_data['_REG_ID'])) {
3371
-            EE_Error::add_error(
3372
-                esc_html__(
3373
-                    'Unable to create the contact for the registration because the required parameters are not present (_REG_ID )',
3374
-                    'event_espresso'
3375
-                ),
3376
-                __FILE__,
3377
-                __LINE__,
3378
-                __FUNCTION__
3379
-            );
3380
-            $query_args = array('action' => $action);
3381
-            $this->_redirect_after_action('', '', '', $query_args, true);
3382
-        }
3383
-        // okay necessary deets present... let's dupe the incoming attendee and attach to incoming registration.
3384
-        $registration = $this->getRegistrationModel()->get_one_by_ID($this->_req_data['_REG_ID']);
3385
-        $attendee = $registration->attendee();
3386
-        // remove relation of existing attendee on registration
3387
-        $registration->_remove_relation_to($attendee, 'Attendee');
3388
-        // new attendee
3389
-        $new_attendee = clone $attendee;
3390
-        $new_attendee->set('ATT_ID', 0);
3391
-        $new_attendee->save();
3392
-        // add new attendee to reg
3393
-        $registration->_add_relation_to($new_attendee, 'Attendee');
3394
-        EE_Error::add_success(
3395
-            esc_html__(
3396
-                'New Contact record created.  Now make any edits you wish to make for this contact.',
3397
-                'event_espresso'
3398
-            )
3399
-        );
3400
-        // redirect to edit page for attendee
3401
-        $query_args = array('post' => $new_attendee->ID(), 'action' => 'edit_attendee');
3402
-        $this->_redirect_after_action('', '', '', $query_args, true);
3403
-    }
3404
-
3405
-
3406
-    /**
3407
-     * Callback invoked by parent EE_Admin_CPT class hooked in on `save_post` wp hook.
3408
-     *
3409
-     * @param int     $post_id
3410
-     * @param WP_POST $post
3411
-     * @throws DomainException
3412
-     * @throws EE_Error
3413
-     * @throws InvalidArgumentException
3414
-     * @throws InvalidDataTypeException
3415
-     * @throws InvalidInterfaceException
3416
-     * @throws LogicException
3417
-     * @throws InvalidFormSubmissionException
3418
-     * @throws ReflectionException
3419
-     */
3420
-    protected function _insert_update_cpt_item($post_id, $post)
3421
-    {
3422
-        $success = true;
3423
-        $attendee = $post instanceof WP_Post && $post->post_type === 'espresso_attendees'
3424
-            ? $this->getAttendeeModel()->get_one_by_ID($post_id)
3425
-            : null;
3426
-        // for attendee updates
3427
-        if ($attendee instanceof EE_Attendee) {
3428
-            // note we should only be UPDATING attendees at this point.
3429
-            $updated_fields = array(
3430
-                'ATT_fname'     => $this->_req_data['ATT_fname'],
3431
-                'ATT_lname'     => $this->_req_data['ATT_lname'],
3432
-                'ATT_full_name' => $this->_req_data['ATT_fname'] . ' ' . $this->_req_data['ATT_lname'],
3433
-                'ATT_address'   => isset($this->_req_data['ATT_address']) ? $this->_req_data['ATT_address'] : '',
3434
-                'ATT_address2'  => isset($this->_req_data['ATT_address2']) ? $this->_req_data['ATT_address2'] : '',
3435
-                'ATT_city'      => isset($this->_req_data['ATT_city']) ? $this->_req_data['ATT_city'] : '',
3436
-                'STA_ID'        => isset($this->_req_data['STA_ID']) ? $this->_req_data['STA_ID'] : '',
3437
-                'CNT_ISO'       => isset($this->_req_data['CNT_ISO']) ? $this->_req_data['CNT_ISO'] : '',
3438
-                'ATT_zip'       => isset($this->_req_data['ATT_zip']) ? $this->_req_data['ATT_zip'] : '',
3439
-            );
3440
-            foreach ($updated_fields as $field => $value) {
3441
-                $attendee->set($field, $value);
3442
-            }
3443
-
3444
-            // process contact details metabox form handler (which will also save the attendee)
3445
-            $contact_details_form = $this->getAttendeeContactDetailsMetaboxFormHandler($attendee);
3446
-            $success = $contact_details_form->process($this->_req_data);
3447
-
3448
-            $attendee_update_callbacks = apply_filters(
3449
-                'FHEE__Registrations_Admin_Page__insert_update_cpt_item__attendee_update',
3450
-                array()
3451
-            );
3452
-            foreach ($attendee_update_callbacks as $a_callback) {
3453
-                if (false === call_user_func_array($a_callback, array($attendee, $this->_req_data))) {
3454
-                    throw new EE_Error(
3455
-                        sprintf(
3456
-                            esc_html__(
3457
-                                '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.',
3458
-                                'event_espresso'
3459
-                            ),
3460
-                            $a_callback
3461
-                        )
3462
-                    );
3463
-                }
3464
-            }
3465
-        }
3466
-
3467
-        if ($success === false) {
3468
-            EE_Error::add_error(
3469
-                esc_html__(
3470
-                    'Something went wrong with updating the meta table data for the registration.',
3471
-                    'event_espresso'
3472
-                ),
3473
-                __FILE__,
3474
-                __FUNCTION__,
3475
-                __LINE__
3476
-            );
3477
-        }
3478
-    }
3479
-
3480
-
3481
-    public function trash_cpt_item($post_id)
3482
-    {
3483
-    }
3484
-
3485
-
3486
-    public function delete_cpt_item($post_id)
3487
-    {
3488
-    }
3489
-
3490
-
3491
-    public function restore_cpt_item($post_id)
3492
-    {
3493
-    }
3494
-
3495
-
3496
-    protected function _restore_cpt_item($post_id, $revision_id)
3497
-    {
3498
-    }
3499
-
3500
-
3501
-    /**
3502
-     * @throws EE_Error
3503
-     * @since $VID:$
3504
-     */
3505
-    public function attendee_editor_metaboxes()
3506
-    {
3507
-        $this->verify_cpt_object();
3508
-        remove_meta_box(
3509
-            'postexcerpt',
3510
-            $this->_cpt_routes[ $this->_req_action ],
3511
-            'normal'
3512
-        );
3513
-        remove_meta_box('commentstatusdiv', $this->_cpt_routes[ $this->_req_action ], 'normal', 'core');
3514
-        if (post_type_supports('espresso_attendees', 'excerpt')) {
3515
-            add_meta_box(
3516
-                'postexcerpt',
3517
-                esc_html__('Short Biography', 'event_espresso'),
3518
-                'post_excerpt_meta_box',
3519
-                $this->_cpt_routes[ $this->_req_action ],
3520
-                'normal'
3521
-            );
3522
-        }
3523
-        if (post_type_supports('espresso_attendees', 'comments')) {
3524
-            add_meta_box(
3525
-                'commentsdiv',
3526
-                esc_html__('Notes on the Contact', 'event_espresso'),
3527
-                'post_comment_meta_box',
3528
-                $this->_cpt_routes[ $this->_req_action ],
3529
-                'normal',
3530
-                'core'
3531
-            );
3532
-        }
3533
-        add_meta_box(
3534
-            'attendee_contact_info',
3535
-            esc_html__('Contact Info', 'event_espresso'),
3536
-            array($this, 'attendee_contact_info'),
3537
-            $this->_cpt_routes[ $this->_req_action ],
3538
-            'side',
3539
-            'core'
3540
-        );
3541
-        add_meta_box(
3542
-            'attendee_details_address',
3543
-            esc_html__('Address Details', 'event_espresso'),
3544
-            array($this, 'attendee_address_details'),
3545
-            $this->_cpt_routes[ $this->_req_action ],
3546
-            'normal',
3547
-            'core'
3548
-        );
3549
-        add_meta_box(
3550
-            'attendee_registrations',
3551
-            esc_html__('Registrations for this Contact', 'event_espresso'),
3552
-            array($this, 'attendee_registrations_meta_box'),
3553
-            $this->_cpt_routes[ $this->_req_action ],
3554
-            'normal',
3555
-            'high'
3556
-        );
3557
-    }
3558
-
3559
-
3560
-    /**
3561
-     * Metabox for attendee contact info
3562
-     *
3563
-     * @param  WP_Post $post wp post object
3564
-     * @return string attendee contact info ( and form )
3565
-     * @throws EE_Error
3566
-     * @throws InvalidArgumentException
3567
-     * @throws InvalidDataTypeException
3568
-     * @throws InvalidInterfaceException
3569
-     * @throws LogicException
3570
-     * @throws DomainException
3571
-     */
3572
-    public function attendee_contact_info($post)
3573
-    {
3574
-        // get attendee object ( should already have it )
3575
-        $form = $this->getAttendeeContactDetailsMetaboxFormHandler($this->_cpt_model_obj);
3576
-        $form->enqueueStylesAndScripts();
3577
-        echo $form->display();
3578
-    }
3579
-
3580
-
3581
-    /**
3582
-     * Return form handler for the contact details metabox
3583
-     *
3584
-     * @param EE_Attendee $attendee
3585
-     * @return AttendeeContactDetailsMetaboxFormHandler
3586
-     * @throws DomainException
3587
-     * @throws InvalidArgumentException
3588
-     * @throws InvalidDataTypeException
3589
-     * @throws InvalidInterfaceException
3590
-     */
3591
-    protected function getAttendeeContactDetailsMetaboxFormHandler(EE_Attendee $attendee)
3592
-    {
3593
-        return new AttendeeContactDetailsMetaboxFormHandler($attendee, EE_Registry::instance());
3594
-    }
3595
-
3596
-
3597
-    /**
3598
-     * Metabox for attendee details
3599
-     *
3600
-     * @param  WP_Post $post wp post object
3601
-     * @throws DomainException
3602
-     */
3603
-    public function attendee_address_details($post)
3604
-    {
3605
-        // get attendee object (should already have it)
3606
-        $this->_template_args['attendee'] = $this->_cpt_model_obj;
3607
-        $this->_template_args['state_html'] = EEH_Form_Fields::generate_form_input(
3608
-            new EE_Question_Form_Input(
3609
-                EE_Question::new_instance(
3610
-                    array(
3611
-                        'QST_ID'           => 0,
3612
-                        'QST_display_text' => esc_html__('State/Province', 'event_espresso'),
3613
-                        'QST_system'       => 'admin-state',
3614
-                    )
3615
-                ),
3616
-                EE_Answer::new_instance(
3617
-                    array(
3618
-                        'ANS_ID'    => 0,
3619
-                        'ANS_value' => $this->_cpt_model_obj->state_ID(),
3620
-                    )
3621
-                ),
3622
-                array(
3623
-                    'input_id'       => 'STA_ID',
3624
-                    'input_name'     => 'STA_ID',
3625
-                    'input_prefix'   => '',
3626
-                    'append_qstn_id' => false,
3627
-                )
3628
-            )
3629
-        );
3630
-        $this->_template_args['country_html'] = EEH_Form_Fields::generate_form_input(
3631
-            new EE_Question_Form_Input(
3632
-                EE_Question::new_instance(
3633
-                    array(
3634
-                        'QST_ID'           => 0,
3635
-                        'QST_display_text' => esc_html__('Country', 'event_espresso'),
3636
-                        'QST_system'       => 'admin-country',
3637
-                    )
3638
-                ),
3639
-                EE_Answer::new_instance(
3640
-                    array(
3641
-                        'ANS_ID'    => 0,
3642
-                        'ANS_value' => $this->_cpt_model_obj->country_ID(),
3643
-                    )
3644
-                ),
3645
-                array(
3646
-                    'input_id'       => 'CNT_ISO',
3647
-                    'input_name'     => 'CNT_ISO',
3648
-                    'input_prefix'   => '',
3649
-                    'append_qstn_id' => false,
3650
-                )
3651
-            )
3652
-        );
3653
-        $template =
3654
-            REG_TEMPLATE_PATH . 'attendee_address_details_metabox_content.template.php';
3655
-        EEH_Template::display_template($template, $this->_template_args);
3656
-    }
3657
-
3658
-
3659
-    /**
3660
-     *        _attendee_details
3661
-     *
3662
-     * @access protected
3663
-     * @param $post
3664
-     * @return void
3665
-     * @throws DomainException
3666
-     * @throws EE_Error
3667
-     * @throws InvalidArgumentException
3668
-     * @throws InvalidDataTypeException
3669
-     * @throws InvalidInterfaceException
3670
-     * @throws ReflectionException
3671
-     */
3672
-    public function attendee_registrations_meta_box($post)
3673
-    {
3674
-        $this->_template_args['attendee'] = $this->_cpt_model_obj;
3675
-        $this->_template_args['registrations'] = $this->_cpt_model_obj->get_many_related('Registration');
3676
-        $template =
3677
-            REG_TEMPLATE_PATH . 'attendee_registrations_main_meta_box.template.php';
3678
-        EEH_Template::display_template($template, $this->_template_args);
3679
-    }
3680
-
3681
-
3682
-    /**
3683
-     * add in the form fields for the attendee edit
3684
-     *
3685
-     * @param  WP_Post $post wp post object
3686
-     * @return string html for new form.
3687
-     * @throws DomainException
3688
-     */
3689
-    public function after_title_form_fields($post)
3690
-    {
3691
-        if ($post->post_type === 'espresso_attendees') {
3692
-            $template = REG_TEMPLATE_PATH . 'attendee_details_after_title_form_fields.template.php';
3693
-            $template_args['attendee'] = $this->_cpt_model_obj;
3694
-            EEH_Template::display_template($template, $template_args);
3695
-        }
3696
-    }
3697
-
3698
-
3699
-    /**
3700
-     *        _trash_or_restore_attendee
3701
-     *
3702
-     * @param boolean $trash - whether to move item to trash (TRUE) or restore it (FALSE)
3703
-     * @return void
3704
-     * @throws EE_Error
3705
-     * @throws InvalidArgumentException
3706
-     * @throws InvalidDataTypeException
3707
-     * @throws InvalidInterfaceException
3708
-     * @throws ReflectionException
3709
-     * @access protected
3710
-     */
3711
-    protected function _trash_or_restore_attendees($trash = true)
3712
-    {
3713
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
3714
-        $success = 1;
3715
-        // Checkboxes
3716
-        if (! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
3717
-            // if array has more than one element than success message should be plural
3718
-            $success = count($this->_req_data['checkbox']) > 1 ? 2 : 1;
3719
-            // cycle thru checkboxes
3720
-            foreach ($this->_req_data['checkbox'] as $ATT_ID) {
3721
-                $updated = $trash ? $this->getAttendeeModel()->update_by_ID(array('status' => 'trash'), $ATT_ID)
3722
-                    : $this->getAttendeeModel()->update_by_ID(array('status' => 'publish'), $ATT_ID);
3723
-                if (! $updated) {
3724
-                    $success = 0;
3725
-                }
3726
-            }
3727
-        } else {
3728
-            // grab single id and delete
3729
-            $ATT_ID = absint($this->_req_data['ATT_ID']);
3730
-            // get attendee
3731
-            $att = $this->getAttendeeModel()->get_one_by_ID($ATT_ID);
3732
-            $updated = $trash ? $att->set_status('trash') : $att->set_status('publish');
3733
-            $updated = $att->save() && $updated;
3734
-            if (! $updated) {
3735
-                $success = 0;
3736
-            }
3737
-        }
3738
-        $what = $success > 1
3739
-            ? esc_html__('Contacts', 'event_espresso')
3740
-            : esc_html__('Contact', 'event_espresso');
3741
-        $action_desc = $trash
3742
-            ? esc_html__('moved to the trash', 'event_espresso')
3743
-            : esc_html__('restored', 'event_espresso');
3744
-        $this->_redirect_after_action($success, $what, $action_desc, array('action' => 'contact_list'));
3745
-    }
2882
+		}
2883
+		$template_args = array(
2884
+			'title'                    => '',
2885
+			'content'                  => '',
2886
+			'step_button_text'         => '',
2887
+			'show_notification_toggle' => false,
2888
+		);
2889
+		// to indicate we're processing a new registration
2890
+		$hidden_fields = array(
2891
+			'processing_registration' => array(
2892
+				'type'  => 'hidden',
2893
+				'value' => 0,
2894
+			),
2895
+			'event_id'                => array(
2896
+				'type'  => 'hidden',
2897
+				'value' => $this->_reg_event->ID(),
2898
+			),
2899
+		);
2900
+		// if the cart is empty then we know we're at step one so we'll display ticket selector
2901
+		$cart = EE_Registry::instance()->SSN->cart();
2902
+		$step = ! $cart instanceof EE_Cart ? 'ticket' : 'questions';
2903
+		switch ($step) {
2904
+			case 'ticket':
2905
+				$hidden_fields['processing_registration']['value'] = 1;
2906
+				$template_args['title'] = esc_html__(
2907
+					'Step One: Select the Ticket for this registration',
2908
+					'event_espresso'
2909
+				);
2910
+				$template_args['content'] =
2911
+					EED_Ticket_Selector::instance()->display_ticket_selector($this->_reg_event);
2912
+				$template_args['content'] .= '</div>';
2913
+				$template_args['step_button_text'] = esc_html__(
2914
+					'Add Tickets and Continue to Registrant Details',
2915
+					'event_espresso'
2916
+				);
2917
+				$template_args['show_notification_toggle'] = false;
2918
+				break;
2919
+			case 'questions':
2920
+				$hidden_fields['processing_registration']['value'] = 2;
2921
+				$template_args['title'] = esc_html__(
2922
+					'Step Two: Add Registrant Details for this Registration',
2923
+					'event_espresso'
2924
+				);
2925
+				// in theory we should be able to run EED_SPCO at this point because the cart should have been setup
2926
+				// properly by the first process_reg_step run.
2927
+				$template_args['content'] =
2928
+					EED_Single_Page_Checkout::registration_checkout_for_admin();
2929
+				$template_args['step_button_text'] = esc_html__(
2930
+					'Save Registration and Continue to Details',
2931
+					'event_espresso'
2932
+				);
2933
+				$template_args['show_notification_toggle'] = true;
2934
+				break;
2935
+		}
2936
+		// we come back to the process_registration_step route.
2937
+		$this->_set_add_edit_form_tags('process_reg_step', $hidden_fields);
2938
+		return EEH_Template::display_template(
2939
+			REG_TEMPLATE_PATH . 'reg_admin_register_new_attendee_step_content.template.php',
2940
+			$template_args,
2941
+			true
2942
+		);
2943
+	}
2944
+
2945
+
2946
+	/**
2947
+	 *        set_reg_event
2948
+	 *
2949
+	 * @access private
2950
+	 * @return bool
2951
+	 * @throws EE_Error
2952
+	 * @throws InvalidArgumentException
2953
+	 * @throws InvalidDataTypeException
2954
+	 * @throws InvalidInterfaceException
2955
+	 */
2956
+	private function _set_reg_event()
2957
+	{
2958
+		if (is_object($this->_reg_event)) {
2959
+			return true;
2960
+		}
2961
+		$EVT_ID = (! empty($this->_req_data['event_id'])) ? absint($this->_req_data['event_id']) : false;
2962
+		if (! $EVT_ID) {
2963
+			return false;
2964
+		}
2965
+		$this->_reg_event = $this->getEventModel()->get_one_by_ID($EVT_ID);
2966
+		return true;
2967
+	}
2968
+
2969
+
2970
+	/**
2971
+	 * process_reg_step
2972
+	 *
2973
+	 * @access        public
2974
+	 * @return string
2975
+	 * @throws DomainException
2976
+	 * @throws EE_Error
2977
+	 * @throws InvalidArgumentException
2978
+	 * @throws InvalidDataTypeException
2979
+	 * @throws InvalidInterfaceException
2980
+	 * @throws ReflectionException
2981
+	 * @throws RuntimeException
2982
+	 */
2983
+	public function process_reg_step()
2984
+	{
2985
+		EE_System::do_not_cache();
2986
+		$this->_set_reg_event();
2987
+		EE_Registry::instance()->REQ->set_espresso_page(true);
2988
+		EE_Registry::instance()->REQ->set('uts', time());
2989
+		// what step are we on?
2990
+		$cart = EE_Registry::instance()->SSN->cart();
2991
+		$step = ! $cart instanceof EE_Cart ? 'ticket' : 'questions';
2992
+		// if doing ajax then we need to verify the nonce
2993
+		if (defined('DOING_AJAX')) {
2994
+			$nonce = isset($this->_req_data[ $this->_req_nonce ])
2995
+				? sanitize_text_field($this->_req_data[ $this->_req_nonce ]) : '';
2996
+			$this->_verify_nonce($nonce, $this->_req_nonce);
2997
+		}
2998
+		switch ($step) {
2999
+			case 'ticket':
3000
+				// process ticket selection
3001
+				$success = EED_Ticket_Selector::instance()->process_ticket_selections();
3002
+				if ($success) {
3003
+					EE_Error::add_success(
3004
+						esc_html__(
3005
+							'Tickets Selected. Now complete the registration.',
3006
+							'event_espresso'
3007
+						)
3008
+					);
3009
+				} else {
3010
+					$query_args['step_error'] = $this->_req_data['step_error'] = true;
3011
+				}
3012
+				if (defined('DOING_AJAX')) {
3013
+					$this->new_registration(); // display next step
3014
+				} else {
3015
+					$query_args = array(
3016
+						'action'                  => 'new_registration',
3017
+						'processing_registration' => 1,
3018
+						'event_id'                => $this->_reg_event->ID(),
3019
+						'uts'                     => time(),
3020
+					);
3021
+					$this->_redirect_after_action(
3022
+						false,
3023
+						'',
3024
+						'',
3025
+						$query_args,
3026
+						true
3027
+					);
3028
+				}
3029
+				break;
3030
+			case 'questions':
3031
+				if (! isset(
3032
+					$this->_req_data['txn_reg_status_change'],
3033
+					$this->_req_data['txn_reg_status_change']['send_notifications']
3034
+				)
3035
+				) {
3036
+					add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_false', 15);
3037
+				}
3038
+				// process registration
3039
+				$transaction = EED_Single_Page_Checkout::instance()->process_registration_from_admin();
3040
+				if ($cart instanceof EE_Cart) {
3041
+					$grand_total = $cart->get_cart_grand_total();
3042
+					if ($grand_total instanceof EE_Line_Item) {
3043
+						$grand_total->save_this_and_descendants_to_txn();
3044
+					}
3045
+				}
3046
+				if (! $transaction instanceof EE_Transaction) {
3047
+					$query_args = array(
3048
+						'action'                  => 'new_registration',
3049
+						'processing_registration' => 2,
3050
+						'event_id'                => $this->_reg_event->ID(),
3051
+						'uts'                     => time(),
3052
+					);
3053
+					if (defined('DOING_AJAX')) {
3054
+						// display registration form again because there are errors (maybe validation?)
3055
+						$this->new_registration();
3056
+						return;
3057
+					}
3058
+					$this->_redirect_after_action(
3059
+						false,
3060
+						'',
3061
+						'',
3062
+						$query_args,
3063
+						true
3064
+					);
3065
+					return;
3066
+				}
3067
+				// maybe update status, and make sure to save transaction if not done already
3068
+				if (! $transaction->update_status_based_on_total_paid()) {
3069
+					$transaction->save();
3070
+				}
3071
+				EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
3072
+				$this->_req_data = array();
3073
+				$query_args = array(
3074
+					'action'        => 'redirect_to_txn',
3075
+					'TXN_ID'        => $transaction->ID(),
3076
+					'EVT_ID'        => $this->_reg_event->ID(),
3077
+					'event_name'    => urlencode($this->_reg_event->name()),
3078
+					'redirect_from' => 'new_registration',
3079
+				);
3080
+				$this->_redirect_after_action(false, '', '', $query_args, true);
3081
+				break;
3082
+		}
3083
+		// what are you looking here for?  Should be nothing to do at this point.
3084
+	}
3085
+
3086
+
3087
+	/**
3088
+	 * redirect_to_txn
3089
+	 *
3090
+	 * @access public
3091
+	 * @return void
3092
+	 * @throws EE_Error
3093
+	 * @throws InvalidArgumentException
3094
+	 * @throws InvalidDataTypeException
3095
+	 * @throws InvalidInterfaceException
3096
+	 * @throws ReflectionException
3097
+	 */
3098
+	public function redirect_to_txn()
3099
+	{
3100
+		EE_System::do_not_cache();
3101
+		EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
3102
+		$query_args = array(
3103
+			'action' => 'view_transaction',
3104
+			'TXN_ID' => isset($this->_req_data['TXN_ID']) ? absint($this->_req_data['TXN_ID']) : 0,
3105
+			'page'   => 'espresso_transactions',
3106
+		);
3107
+		if (isset($this->_req_data['EVT_ID'], $this->_req_data['redirect_from'])) {
3108
+			$query_args['EVT_ID'] = $this->_req_data['EVT_ID'];
3109
+			$query_args['event_name'] = urlencode($this->_req_data['event_name']);
3110
+			$query_args['redirect_from'] = $this->_req_data['redirect_from'];
3111
+		}
3112
+		EE_Error::add_success(
3113
+			esc_html__(
3114
+				'Registration Created.  Please review the transaction and add any payments as necessary',
3115
+				'event_espresso'
3116
+			)
3117
+		);
3118
+		$this->_redirect_after_action(false, '', '', $query_args, true);
3119
+	}
3120
+
3121
+
3122
+	/**
3123
+	 *        generates HTML for the Attendee Contact List
3124
+	 *
3125
+	 * @access protected
3126
+	 * @return void
3127
+	 * @throws DomainException
3128
+	 * @throws EE_Error
3129
+	 */
3130
+	protected function _attendee_contact_list_table()
3131
+	{
3132
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
3133
+		$this->_search_btn_label = esc_html__('Contacts', 'event_espresso');
3134
+		$this->display_admin_list_table_page_with_no_sidebar();
3135
+	}
3136
+
3137
+
3138
+	/**
3139
+	 *        get_attendees
3140
+	 *
3141
+	 * @param      $per_page
3142
+	 * @param bool $count whether to return count or data.
3143
+	 * @param bool $trash
3144
+	 * @return array
3145
+	 * @throws EE_Error
3146
+	 * @throws InvalidArgumentException
3147
+	 * @throws InvalidDataTypeException
3148
+	 * @throws InvalidInterfaceException
3149
+	 * @access public
3150
+	 */
3151
+	public function get_attendees($per_page, $count = false, $trash = false)
3152
+	{
3153
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
3154
+		require_once(REG_ADMIN . 'EE_Attendee_Contact_List_Table.class.php');
3155
+		$this->_req_data['orderby'] = ! empty($this->_req_data['orderby']) ? $this->_req_data['orderby'] : '';
3156
+		switch ($this->_req_data['orderby']) {
3157
+			case 'ATT_ID':
3158
+				$orderby = 'ATT_ID';
3159
+				break;
3160
+			case 'ATT_fname':
3161
+				$orderby = 'ATT_fname';
3162
+				break;
3163
+			case 'ATT_email':
3164
+				$orderby = 'ATT_email';
3165
+				break;
3166
+			case 'ATT_city':
3167
+				$orderby = 'ATT_city';
3168
+				break;
3169
+			case 'STA_ID':
3170
+				$orderby = 'STA_ID';
3171
+				break;
3172
+			case 'CNT_ID':
3173
+				$orderby = 'CNT_ID';
3174
+				break;
3175
+			case 'Registration_Count':
3176
+				$orderby = 'Registration_Count';
3177
+				break;
3178
+			default:
3179
+				$orderby = 'ATT_lname';
3180
+		}
3181
+		$sort = (isset($this->_req_data['order']) && ! empty($this->_req_data['order']))
3182
+			? $this->_req_data['order']
3183
+			: 'ASC';
3184
+		$current_page = isset($this->_req_data['paged']) && ! empty($this->_req_data['paged'])
3185
+			? $this->_req_data['paged']
3186
+			: 1;
3187
+		$per_page = isset($per_page) && ! empty($per_page) ? $per_page : 10;
3188
+		$per_page = isset($this->_req_data['perpage']) && ! empty($this->_req_data['perpage'])
3189
+			? $this->_req_data['perpage']
3190
+			: $per_page;
3191
+		$_where = array();
3192
+		if (! empty($this->_req_data['s'])) {
3193
+			$sstr = '%' . $this->_req_data['s'] . '%';
3194
+			$_where['OR'] = array(
3195
+				'Registration.Event.EVT_name'       => array('LIKE', $sstr),
3196
+				'Registration.Event.EVT_desc'       => array('LIKE', $sstr),
3197
+				'Registration.Event.EVT_short_desc' => array('LIKE', $sstr),
3198
+				'ATT_fname'                         => array('LIKE', $sstr),
3199
+				'ATT_lname'                         => array('LIKE', $sstr),
3200
+				'ATT_short_bio'                     => array('LIKE', $sstr),
3201
+				'ATT_email'                         => array('LIKE', $sstr),
3202
+				'ATT_address'                       => array('LIKE', $sstr),
3203
+				'ATT_address2'                      => array('LIKE', $sstr),
3204
+				'ATT_city'                          => array('LIKE', $sstr),
3205
+				'Country.CNT_name'                  => array('LIKE', $sstr),
3206
+				'State.STA_name'                    => array('LIKE', $sstr),
3207
+				'ATT_phone'                         => array('LIKE', $sstr),
3208
+				'Registration.REG_final_price'      => array('LIKE', $sstr),
3209
+				'Registration.REG_code'             => array('LIKE', $sstr),
3210
+				'Registration.REG_group_size'       => array('LIKE', $sstr),
3211
+			);
3212
+		}
3213
+		$offset = ($current_page - 1) * $per_page;
3214
+		$limit = $count ? null : array($offset, $per_page);
3215
+		$query_args = array(
3216
+			$_where,
3217
+			'extra_selects' => array('Registration_Count' => array('Registration.REG_ID', 'count', '%d')),
3218
+			'limit'         => $limit,
3219
+		);
3220
+		if (! $count) {
3221
+			$query_args['order_by'] = array($orderby => $sort);
3222
+		}
3223
+		if ($trash) {
3224
+			$query_args[0]['status'] = array('!=', 'publish');
3225
+			$all_attendees = $count
3226
+				? $this->getAttendeeModel()->count($query_args, 'ATT_ID', true)
3227
+				: $this->getAttendeeModel()->get_all($query_args);
3228
+		} else {
3229
+			$query_args[0]['status'] = array('IN', array('publish'));
3230
+			$all_attendees = $count
3231
+				? $this->getAttendeeModel()->count($query_args, 'ATT_ID', true)
3232
+				: $this->getAttendeeModel()->get_all($query_args);
3233
+		}
3234
+		return $all_attendees;
3235
+	}
3236
+
3237
+
3238
+	/**
3239
+	 * This is just taking care of resending the registration confirmation
3240
+	 *
3241
+	 * @access protected
3242
+	 * @return void
3243
+	 * @throws EE_Error
3244
+	 * @throws InvalidArgumentException
3245
+	 * @throws InvalidDataTypeException
3246
+	 * @throws InvalidInterfaceException
3247
+	 * @throws ReflectionException
3248
+	 */
3249
+	protected function _resend_registration()
3250
+	{
3251
+		$this->_process_resend_registration();
3252
+		$query_args = isset($this->_req_data['redirect_to'])
3253
+			? array('action' => $this->_req_data['redirect_to'], '_REG_ID' => $this->_req_data['_REG_ID'])
3254
+			: array('action' => 'default');
3255
+		$this->_redirect_after_action(false, '', '', $query_args, true);
3256
+	}
3257
+
3258
+	/**
3259
+	 * Creates a registration report, but accepts the name of a method to use for preparing the query parameters
3260
+	 * to use when selecting registrations
3261
+	 *
3262
+	 * @param string $method_name_for_getting_query_params the name of the method (on this class) to use for preparing
3263
+	 *                                                     the query parameters from the request
3264
+	 * @return void ends the request with a redirect or download
3265
+	 */
3266
+	public function _registrations_report_base($method_name_for_getting_query_params)
3267
+	{
3268
+		if (! defined('EE_USE_OLD_CSV_REPORT_CLASS')) {
3269
+			wp_redirect(
3270
+				EE_Admin_Page::add_query_args_and_nonce(
3271
+					array(
3272
+						'page'        => 'espresso_batch',
3273
+						'batch'       => 'file',
3274
+						'EVT_ID'      => isset($this->_req_data['EVT_ID']) ? $this->_req_data['EVT_ID'] : null,
3275
+						'filters'     => urlencode(
3276
+							serialize(
3277
+								$this->$method_name_for_getting_query_params(
3278
+									EEH_Array::is_set(
3279
+										$this->_req_data,
3280
+										'filters',
3281
+										array()
3282
+									)
3283
+								)
3284
+							)
3285
+						),
3286
+						'use_filters' => EEH_Array::is_set($this->_req_data, 'use_filters', false),
3287
+						'job_handler' => urlencode('EventEspressoBatchRequest\JobHandlers\RegistrationsReport'),
3288
+						'return_url'  => urlencode($this->_req_data['return_url']),
3289
+					)
3290
+				)
3291
+			);
3292
+		} else {
3293
+			$new_request_args = array(
3294
+				'export' => 'report',
3295
+				'action' => 'registrations_report_for_event',
3296
+				'EVT_ID' => isset($this->_req_data['EVT_ID']) ? $this->_req_data['EVT_ID'] : null,
3297
+			);
3298
+			$this->_req_data = array_merge($this->_req_data, $new_request_args);
3299
+			if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3300
+				require_once(EE_CLASSES . 'EE_Export.class.php');
3301
+				$EE_Export = EE_Export::instance($this->_req_data);
3302
+				$EE_Export->export();
3303
+			}
3304
+		}
3305
+	}
3306
+
3307
+
3308
+	/**
3309
+	 * Creates a registration report using only query parameters in the request
3310
+	 *
3311
+	 * @return void
3312
+	 */
3313
+	public function _registrations_report()
3314
+	{
3315
+		$this->_registrations_report_base('_get_registration_query_parameters');
3316
+	}
3317
+
3318
+
3319
+	public function _contact_list_export()
3320
+	{
3321
+		if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3322
+			require_once(EE_CLASSES . 'EE_Export.class.php');
3323
+			$EE_Export = EE_Export::instance($this->_req_data);
3324
+			$EE_Export->export_attendees();
3325
+		}
3326
+	}
3327
+
3328
+
3329
+	public function _contact_list_report()
3330
+	{
3331
+		if (! defined('EE_USE_OLD_CSV_REPORT_CLASS')) {
3332
+			wp_redirect(
3333
+				EE_Admin_Page::add_query_args_and_nonce(
3334
+					array(
3335
+						'page'        => 'espresso_batch',
3336
+						'batch'       => 'file',
3337
+						'job_handler' => urlencode('EventEspressoBatchRequest\JobHandlers\AttendeesReport'),
3338
+						'return_url'  => urlencode($this->_req_data['return_url']),
3339
+					)
3340
+				)
3341
+			);
3342
+		} else {
3343
+			if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3344
+				require_once(EE_CLASSES . 'EE_Export.class.php');
3345
+				$EE_Export = EE_Export::instance($this->_req_data);
3346
+				$EE_Export->report_attendees();
3347
+			}
3348
+		}
3349
+	}
3350
+
3351
+
3352
+
3353
+
3354
+
3355
+	/***************************************        ATTENDEE DETAILS        ***************************************/
3356
+	/**
3357
+	 * This duplicates the attendee object for the given incoming registration id and attendee_id.
3358
+	 *
3359
+	 * @return void
3360
+	 * @throws EE_Error
3361
+	 * @throws InvalidArgumentException
3362
+	 * @throws InvalidDataTypeException
3363
+	 * @throws InvalidInterfaceException
3364
+	 * @throws ReflectionException
3365
+	 */
3366
+	protected function _duplicate_attendee()
3367
+	{
3368
+		$action = ! empty($this->_req_data['return']) ? $this->_req_data['return'] : 'default';
3369
+		// verify we have necessary info
3370
+		if (empty($this->_req_data['_REG_ID'])) {
3371
+			EE_Error::add_error(
3372
+				esc_html__(
3373
+					'Unable to create the contact for the registration because the required parameters are not present (_REG_ID )',
3374
+					'event_espresso'
3375
+				),
3376
+				__FILE__,
3377
+				__LINE__,
3378
+				__FUNCTION__
3379
+			);
3380
+			$query_args = array('action' => $action);
3381
+			$this->_redirect_after_action('', '', '', $query_args, true);
3382
+		}
3383
+		// okay necessary deets present... let's dupe the incoming attendee and attach to incoming registration.
3384
+		$registration = $this->getRegistrationModel()->get_one_by_ID($this->_req_data['_REG_ID']);
3385
+		$attendee = $registration->attendee();
3386
+		// remove relation of existing attendee on registration
3387
+		$registration->_remove_relation_to($attendee, 'Attendee');
3388
+		// new attendee
3389
+		$new_attendee = clone $attendee;
3390
+		$new_attendee->set('ATT_ID', 0);
3391
+		$new_attendee->save();
3392
+		// add new attendee to reg
3393
+		$registration->_add_relation_to($new_attendee, 'Attendee');
3394
+		EE_Error::add_success(
3395
+			esc_html__(
3396
+				'New Contact record created.  Now make any edits you wish to make for this contact.',
3397
+				'event_espresso'
3398
+			)
3399
+		);
3400
+		// redirect to edit page for attendee
3401
+		$query_args = array('post' => $new_attendee->ID(), 'action' => 'edit_attendee');
3402
+		$this->_redirect_after_action('', '', '', $query_args, true);
3403
+	}
3404
+
3405
+
3406
+	/**
3407
+	 * Callback invoked by parent EE_Admin_CPT class hooked in on `save_post` wp hook.
3408
+	 *
3409
+	 * @param int     $post_id
3410
+	 * @param WP_POST $post
3411
+	 * @throws DomainException
3412
+	 * @throws EE_Error
3413
+	 * @throws InvalidArgumentException
3414
+	 * @throws InvalidDataTypeException
3415
+	 * @throws InvalidInterfaceException
3416
+	 * @throws LogicException
3417
+	 * @throws InvalidFormSubmissionException
3418
+	 * @throws ReflectionException
3419
+	 */
3420
+	protected function _insert_update_cpt_item($post_id, $post)
3421
+	{
3422
+		$success = true;
3423
+		$attendee = $post instanceof WP_Post && $post->post_type === 'espresso_attendees'
3424
+			? $this->getAttendeeModel()->get_one_by_ID($post_id)
3425
+			: null;
3426
+		// for attendee updates
3427
+		if ($attendee instanceof EE_Attendee) {
3428
+			// note we should only be UPDATING attendees at this point.
3429
+			$updated_fields = array(
3430
+				'ATT_fname'     => $this->_req_data['ATT_fname'],
3431
+				'ATT_lname'     => $this->_req_data['ATT_lname'],
3432
+				'ATT_full_name' => $this->_req_data['ATT_fname'] . ' ' . $this->_req_data['ATT_lname'],
3433
+				'ATT_address'   => isset($this->_req_data['ATT_address']) ? $this->_req_data['ATT_address'] : '',
3434
+				'ATT_address2'  => isset($this->_req_data['ATT_address2']) ? $this->_req_data['ATT_address2'] : '',
3435
+				'ATT_city'      => isset($this->_req_data['ATT_city']) ? $this->_req_data['ATT_city'] : '',
3436
+				'STA_ID'        => isset($this->_req_data['STA_ID']) ? $this->_req_data['STA_ID'] : '',
3437
+				'CNT_ISO'       => isset($this->_req_data['CNT_ISO']) ? $this->_req_data['CNT_ISO'] : '',
3438
+				'ATT_zip'       => isset($this->_req_data['ATT_zip']) ? $this->_req_data['ATT_zip'] : '',
3439
+			);
3440
+			foreach ($updated_fields as $field => $value) {
3441
+				$attendee->set($field, $value);
3442
+			}
3443
+
3444
+			// process contact details metabox form handler (which will also save the attendee)
3445
+			$contact_details_form = $this->getAttendeeContactDetailsMetaboxFormHandler($attendee);
3446
+			$success = $contact_details_form->process($this->_req_data);
3447
+
3448
+			$attendee_update_callbacks = apply_filters(
3449
+				'FHEE__Registrations_Admin_Page__insert_update_cpt_item__attendee_update',
3450
+				array()
3451
+			);
3452
+			foreach ($attendee_update_callbacks as $a_callback) {
3453
+				if (false === call_user_func_array($a_callback, array($attendee, $this->_req_data))) {
3454
+					throw new EE_Error(
3455
+						sprintf(
3456
+							esc_html__(
3457
+								'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.',
3458
+								'event_espresso'
3459
+							),
3460
+							$a_callback
3461
+						)
3462
+					);
3463
+				}
3464
+			}
3465
+		}
3466
+
3467
+		if ($success === false) {
3468
+			EE_Error::add_error(
3469
+				esc_html__(
3470
+					'Something went wrong with updating the meta table data for the registration.',
3471
+					'event_espresso'
3472
+				),
3473
+				__FILE__,
3474
+				__FUNCTION__,
3475
+				__LINE__
3476
+			);
3477
+		}
3478
+	}
3479
+
3480
+
3481
+	public function trash_cpt_item($post_id)
3482
+	{
3483
+	}
3484
+
3485
+
3486
+	public function delete_cpt_item($post_id)
3487
+	{
3488
+	}
3489
+
3490
+
3491
+	public function restore_cpt_item($post_id)
3492
+	{
3493
+	}
3494
+
3495
+
3496
+	protected function _restore_cpt_item($post_id, $revision_id)
3497
+	{
3498
+	}
3499
+
3500
+
3501
+	/**
3502
+	 * @throws EE_Error
3503
+	 * @since $VID:$
3504
+	 */
3505
+	public function attendee_editor_metaboxes()
3506
+	{
3507
+		$this->verify_cpt_object();
3508
+		remove_meta_box(
3509
+			'postexcerpt',
3510
+			$this->_cpt_routes[ $this->_req_action ],
3511
+			'normal'
3512
+		);
3513
+		remove_meta_box('commentstatusdiv', $this->_cpt_routes[ $this->_req_action ], 'normal', 'core');
3514
+		if (post_type_supports('espresso_attendees', 'excerpt')) {
3515
+			add_meta_box(
3516
+				'postexcerpt',
3517
+				esc_html__('Short Biography', 'event_espresso'),
3518
+				'post_excerpt_meta_box',
3519
+				$this->_cpt_routes[ $this->_req_action ],
3520
+				'normal'
3521
+			);
3522
+		}
3523
+		if (post_type_supports('espresso_attendees', 'comments')) {
3524
+			add_meta_box(
3525
+				'commentsdiv',
3526
+				esc_html__('Notes on the Contact', 'event_espresso'),
3527
+				'post_comment_meta_box',
3528
+				$this->_cpt_routes[ $this->_req_action ],
3529
+				'normal',
3530
+				'core'
3531
+			);
3532
+		}
3533
+		add_meta_box(
3534
+			'attendee_contact_info',
3535
+			esc_html__('Contact Info', 'event_espresso'),
3536
+			array($this, 'attendee_contact_info'),
3537
+			$this->_cpt_routes[ $this->_req_action ],
3538
+			'side',
3539
+			'core'
3540
+		);
3541
+		add_meta_box(
3542
+			'attendee_details_address',
3543
+			esc_html__('Address Details', 'event_espresso'),
3544
+			array($this, 'attendee_address_details'),
3545
+			$this->_cpt_routes[ $this->_req_action ],
3546
+			'normal',
3547
+			'core'
3548
+		);
3549
+		add_meta_box(
3550
+			'attendee_registrations',
3551
+			esc_html__('Registrations for this Contact', 'event_espresso'),
3552
+			array($this, 'attendee_registrations_meta_box'),
3553
+			$this->_cpt_routes[ $this->_req_action ],
3554
+			'normal',
3555
+			'high'
3556
+		);
3557
+	}
3558
+
3559
+
3560
+	/**
3561
+	 * Metabox for attendee contact info
3562
+	 *
3563
+	 * @param  WP_Post $post wp post object
3564
+	 * @return string attendee contact info ( and form )
3565
+	 * @throws EE_Error
3566
+	 * @throws InvalidArgumentException
3567
+	 * @throws InvalidDataTypeException
3568
+	 * @throws InvalidInterfaceException
3569
+	 * @throws LogicException
3570
+	 * @throws DomainException
3571
+	 */
3572
+	public function attendee_contact_info($post)
3573
+	{
3574
+		// get attendee object ( should already have it )
3575
+		$form = $this->getAttendeeContactDetailsMetaboxFormHandler($this->_cpt_model_obj);
3576
+		$form->enqueueStylesAndScripts();
3577
+		echo $form->display();
3578
+	}
3579
+
3580
+
3581
+	/**
3582
+	 * Return form handler for the contact details metabox
3583
+	 *
3584
+	 * @param EE_Attendee $attendee
3585
+	 * @return AttendeeContactDetailsMetaboxFormHandler
3586
+	 * @throws DomainException
3587
+	 * @throws InvalidArgumentException
3588
+	 * @throws InvalidDataTypeException
3589
+	 * @throws InvalidInterfaceException
3590
+	 */
3591
+	protected function getAttendeeContactDetailsMetaboxFormHandler(EE_Attendee $attendee)
3592
+	{
3593
+		return new AttendeeContactDetailsMetaboxFormHandler($attendee, EE_Registry::instance());
3594
+	}
3595
+
3596
+
3597
+	/**
3598
+	 * Metabox for attendee details
3599
+	 *
3600
+	 * @param  WP_Post $post wp post object
3601
+	 * @throws DomainException
3602
+	 */
3603
+	public function attendee_address_details($post)
3604
+	{
3605
+		// get attendee object (should already have it)
3606
+		$this->_template_args['attendee'] = $this->_cpt_model_obj;
3607
+		$this->_template_args['state_html'] = EEH_Form_Fields::generate_form_input(
3608
+			new EE_Question_Form_Input(
3609
+				EE_Question::new_instance(
3610
+					array(
3611
+						'QST_ID'           => 0,
3612
+						'QST_display_text' => esc_html__('State/Province', 'event_espresso'),
3613
+						'QST_system'       => 'admin-state',
3614
+					)
3615
+				),
3616
+				EE_Answer::new_instance(
3617
+					array(
3618
+						'ANS_ID'    => 0,
3619
+						'ANS_value' => $this->_cpt_model_obj->state_ID(),
3620
+					)
3621
+				),
3622
+				array(
3623
+					'input_id'       => 'STA_ID',
3624
+					'input_name'     => 'STA_ID',
3625
+					'input_prefix'   => '',
3626
+					'append_qstn_id' => false,
3627
+				)
3628
+			)
3629
+		);
3630
+		$this->_template_args['country_html'] = EEH_Form_Fields::generate_form_input(
3631
+			new EE_Question_Form_Input(
3632
+				EE_Question::new_instance(
3633
+					array(
3634
+						'QST_ID'           => 0,
3635
+						'QST_display_text' => esc_html__('Country', 'event_espresso'),
3636
+						'QST_system'       => 'admin-country',
3637
+					)
3638
+				),
3639
+				EE_Answer::new_instance(
3640
+					array(
3641
+						'ANS_ID'    => 0,
3642
+						'ANS_value' => $this->_cpt_model_obj->country_ID(),
3643
+					)
3644
+				),
3645
+				array(
3646
+					'input_id'       => 'CNT_ISO',
3647
+					'input_name'     => 'CNT_ISO',
3648
+					'input_prefix'   => '',
3649
+					'append_qstn_id' => false,
3650
+				)
3651
+			)
3652
+		);
3653
+		$template =
3654
+			REG_TEMPLATE_PATH . 'attendee_address_details_metabox_content.template.php';
3655
+		EEH_Template::display_template($template, $this->_template_args);
3656
+	}
3657
+
3658
+
3659
+	/**
3660
+	 *        _attendee_details
3661
+	 *
3662
+	 * @access protected
3663
+	 * @param $post
3664
+	 * @return void
3665
+	 * @throws DomainException
3666
+	 * @throws EE_Error
3667
+	 * @throws InvalidArgumentException
3668
+	 * @throws InvalidDataTypeException
3669
+	 * @throws InvalidInterfaceException
3670
+	 * @throws ReflectionException
3671
+	 */
3672
+	public function attendee_registrations_meta_box($post)
3673
+	{
3674
+		$this->_template_args['attendee'] = $this->_cpt_model_obj;
3675
+		$this->_template_args['registrations'] = $this->_cpt_model_obj->get_many_related('Registration');
3676
+		$template =
3677
+			REG_TEMPLATE_PATH . 'attendee_registrations_main_meta_box.template.php';
3678
+		EEH_Template::display_template($template, $this->_template_args);
3679
+	}
3680
+
3681
+
3682
+	/**
3683
+	 * add in the form fields for the attendee edit
3684
+	 *
3685
+	 * @param  WP_Post $post wp post object
3686
+	 * @return string html for new form.
3687
+	 * @throws DomainException
3688
+	 */
3689
+	public function after_title_form_fields($post)
3690
+	{
3691
+		if ($post->post_type === 'espresso_attendees') {
3692
+			$template = REG_TEMPLATE_PATH . 'attendee_details_after_title_form_fields.template.php';
3693
+			$template_args['attendee'] = $this->_cpt_model_obj;
3694
+			EEH_Template::display_template($template, $template_args);
3695
+		}
3696
+	}
3697
+
3698
+
3699
+	/**
3700
+	 *        _trash_or_restore_attendee
3701
+	 *
3702
+	 * @param boolean $trash - whether to move item to trash (TRUE) or restore it (FALSE)
3703
+	 * @return void
3704
+	 * @throws EE_Error
3705
+	 * @throws InvalidArgumentException
3706
+	 * @throws InvalidDataTypeException
3707
+	 * @throws InvalidInterfaceException
3708
+	 * @throws ReflectionException
3709
+	 * @access protected
3710
+	 */
3711
+	protected function _trash_or_restore_attendees($trash = true)
3712
+	{
3713
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
3714
+		$success = 1;
3715
+		// Checkboxes
3716
+		if (! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
3717
+			// if array has more than one element than success message should be plural
3718
+			$success = count($this->_req_data['checkbox']) > 1 ? 2 : 1;
3719
+			// cycle thru checkboxes
3720
+			foreach ($this->_req_data['checkbox'] as $ATT_ID) {
3721
+				$updated = $trash ? $this->getAttendeeModel()->update_by_ID(array('status' => 'trash'), $ATT_ID)
3722
+					: $this->getAttendeeModel()->update_by_ID(array('status' => 'publish'), $ATT_ID);
3723
+				if (! $updated) {
3724
+					$success = 0;
3725
+				}
3726
+			}
3727
+		} else {
3728
+			// grab single id and delete
3729
+			$ATT_ID = absint($this->_req_data['ATT_ID']);
3730
+			// get attendee
3731
+			$att = $this->getAttendeeModel()->get_one_by_ID($ATT_ID);
3732
+			$updated = $trash ? $att->set_status('trash') : $att->set_status('publish');
3733
+			$updated = $att->save() && $updated;
3734
+			if (! $updated) {
3735
+				$success = 0;
3736
+			}
3737
+		}
3738
+		$what = $success > 1
3739
+			? esc_html__('Contacts', 'event_espresso')
3740
+			: esc_html__('Contact', 'event_espresso');
3741
+		$action_desc = $trash
3742
+			? esc_html__('moved to the trash', 'event_espresso')
3743
+			: esc_html__('restored', 'event_espresso');
3744
+		$this->_redirect_after_action($success, $what, $action_desc, array('action' => 'contact_list'));
3745
+	}
3746 3746
 }
Please login to merge, or discard this patch.
Spacing   +96 added lines, -96 removed lines patch added patch discarded remove patch
@@ -87,7 +87,7 @@  discard block
 block discarded – undo
87 87
      */
88 88
     protected function getRegistrationModel()
89 89
     {
90
-        if (! $this->registration_model instanceof EEM_Registration) {
90
+        if ( ! $this->registration_model instanceof EEM_Registration) {
91 91
             $this->registration_model = $this->getLoader()->getShared('EEM_Registration');
92 92
         }
93 93
         return $this->registration_model;
@@ -102,7 +102,7 @@  discard block
 block discarded – undo
102 102
      */
103 103
     protected function getAttendeeModel()
104 104
     {
105
-        if (! $this->attendee_model instanceof EEM_Attendee) {
105
+        if ( ! $this->attendee_model instanceof EEM_Attendee) {
106 106
             $this->attendee_model = $this->getLoader()->getShared('EEM_Attendee');
107 107
         }
108 108
         return $this->attendee_model;
@@ -118,7 +118,7 @@  discard block
 block discarded – undo
118 118
      */
119 119
     protected function getEventModel()
120 120
     {
121
-        if (! $this->event_model instanceof EEM_Event) {
121
+        if ( ! $this->event_model instanceof EEM_Event) {
122 122
             $this->event_model = $this->getLoader()->getShared('EEM_Event');
123 123
         }
124 124
         return $this->event_model;
@@ -133,7 +133,7 @@  discard block
 block discarded – undo
133 133
      */
134 134
     protected function getStatusModel()
135 135
     {
136
-        if (! $this->status_model instanceof EEM_Status) {
136
+        if ( ! $this->status_model instanceof EEM_Status) {
137 137
             $this->status_model = $this->getLoader()->getShared('EEM_Status');
138 138
         }
139 139
         return $this->status_model;
@@ -145,7 +145,7 @@  discard block
 block discarded – undo
145 145
         // when adding a new registration...
146 146
         if (isset($this->_req_data['action']) && $this->_req_data['action'] === 'new_registration') {
147 147
             EE_System::do_not_cache();
148
-            if (! isset($this->_req_data['processing_registration'])
148
+            if ( ! isset($this->_req_data['processing_registration'])
149 149
                 || absint($this->_req_data['processing_registration']) !== 1
150 150
             ) {
151 151
                 // and it's NOT the attendee information reg step
@@ -751,7 +751,7 @@  discard block
 block discarded – undo
751 751
         // style
752 752
         wp_register_style(
753 753
             'espresso_reg',
754
-            REG_ASSETS_URL . 'espresso_registrations_admin.css',
754
+            REG_ASSETS_URL.'espresso_registrations_admin.css',
755 755
             array('ee-admin-css'),
756 756
             EVENT_ESPRESSO_VERSION
757 757
         );
@@ -759,7 +759,7 @@  discard block
 block discarded – undo
759 759
         // script
760 760
         wp_register_script(
761 761
             'espresso_reg',
762
-            REG_ASSETS_URL . 'espresso_registrations_admin.js',
762
+            REG_ASSETS_URL.'espresso_registrations_admin.js',
763 763
             array('jquery-ui-datepicker', 'jquery-ui-draggable', 'ee_admin_js'),
764 764
             EVENT_ESPRESSO_VERSION,
765 765
             true
@@ -783,7 +783,7 @@  discard block
 block discarded – undo
783 783
             'att_publish_text' => sprintf(
784 784
                 /* translators: The date and time */
785 785
                 wp_strip_all_tags(__('Created on: %s', 'event_espresso')),
786
-                '<b>' . $this->_cpt_model_obj->get_datetime('ATT_created') . '</b>'
786
+                '<b>'.$this->_cpt_model_obj->get_datetime('ATT_created').'</b>'
787 787
             ),
788 788
         );
789 789
         wp_localize_script('espresso_reg', 'ATTENDEE_DETAILS', $attendee_details_translations);
@@ -814,7 +814,7 @@  discard block
 block discarded – undo
814 814
         wp_dequeue_style('espresso_reg');
815 815
         wp_register_style(
816 816
             'espresso_att',
817
-            REG_ASSETS_URL . 'espresso_attendees_admin.css',
817
+            REG_ASSETS_URL.'espresso_attendees_admin.css',
818 818
             array('ee-admin-css'),
819 819
             EVENT_ESPRESSO_VERSION
820 820
         );
@@ -826,7 +826,7 @@  discard block
 block discarded – undo
826 826
     {
827 827
         wp_register_script(
828 828
             'ee-spco-for-admin',
829
-            REG_ASSETS_URL . 'spco_for_admin.js',
829
+            REG_ASSETS_URL.'spco_for_admin.js',
830 830
             array('underscore', 'jquery'),
831 831
             EVENT_ESPRESSO_VERSION,
832 832
             true
@@ -1068,7 +1068,7 @@  discard block
 block discarded – undo
1068 1068
         }
1069 1069
         $sc_items = array(
1070 1070
             'approved_status'   => array(
1071
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_approved,
1071
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_approved,
1072 1072
                 'desc'  => EEH_Template::pretty_status(
1073 1073
                     EEM_Registration::status_id_approved,
1074 1074
                     false,
@@ -1076,7 +1076,7 @@  discard block
 block discarded – undo
1076 1076
                 ),
1077 1077
             ),
1078 1078
             'pending_status'    => array(
1079
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_pending_payment,
1079
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_pending_payment,
1080 1080
                 'desc'  => EEH_Template::pretty_status(
1081 1081
                     EEM_Registration::status_id_pending_payment,
1082 1082
                     false,
@@ -1084,7 +1084,7 @@  discard block
 block discarded – undo
1084 1084
                 ),
1085 1085
             ),
1086 1086
             'wait_list'         => array(
1087
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_wait_list,
1087
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_wait_list,
1088 1088
                 'desc'  => EEH_Template::pretty_status(
1089 1089
                     EEM_Registration::status_id_wait_list,
1090 1090
                     false,
@@ -1092,7 +1092,7 @@  discard block
 block discarded – undo
1092 1092
                 ),
1093 1093
             ),
1094 1094
             'incomplete_status' => array(
1095
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_incomplete,
1095
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_incomplete,
1096 1096
                 'desc'  => EEH_Template::pretty_status(
1097 1097
                     EEM_Registration::status_id_incomplete,
1098 1098
                     false,
@@ -1100,7 +1100,7 @@  discard block
 block discarded – undo
1100 1100
                 ),
1101 1101
             ),
1102 1102
             'not_approved'      => array(
1103
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_not_approved,
1103
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_not_approved,
1104 1104
                 'desc'  => EEH_Template::pretty_status(
1105 1105
                     EEM_Registration::status_id_not_approved,
1106 1106
                     false,
@@ -1108,7 +1108,7 @@  discard block
 block discarded – undo
1108 1108
                 ),
1109 1109
             ),
1110 1110
             'declined_status'   => array(
1111
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_declined,
1111
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_declined,
1112 1112
                 'desc'  => EEH_Template::pretty_status(
1113 1113
                     EEM_Registration::status_id_declined,
1114 1114
                     false,
@@ -1116,7 +1116,7 @@  discard block
 block discarded – undo
1116 1116
                 ),
1117 1117
             ),
1118 1118
             'cancelled_status'  => array(
1119
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_cancelled,
1119
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_cancelled,
1120 1120
                 'desc'  => EEH_Template::pretty_status(
1121 1121
                     EEM_Registration::status_id_cancelled,
1122 1122
                     false,
@@ -1179,7 +1179,7 @@  discard block
 block discarded – undo
1179 1179
                 $EVT_ID
1180 1180
             )
1181 1181
         ) {
1182
-            $this->_admin_page_title .= ' ' . $this->get_action_link_or_button(
1182
+            $this->_admin_page_title .= ' '.$this->get_action_link_or_button(
1183 1183
                 'new_registration',
1184 1184
                 'add-registrant',
1185 1185
                 array('event_id' => $EVT_ID),
@@ -1205,7 +1205,7 @@  discard block
 block discarded – undo
1205 1205
         if ($this->_registration instanceof EE_Registration) {
1206 1206
             return true;
1207 1207
         }
1208
-        $REG_ID = (! empty($this->_req_data['_REG_ID'])) ? absint($this->_req_data['_REG_ID']) : false;
1208
+        $REG_ID = ( ! empty($this->_req_data['_REG_ID'])) ? absint($this->_req_data['_REG_ID']) : false;
1209 1209
         if ($this->_registration = $this->getRegistrationModel()->get_one_by_ID($REG_ID)) {
1210 1210
             return true;
1211 1211
         }
@@ -1286,7 +1286,7 @@  discard block
 block discarded – undo
1286 1286
         /** @var EventEspresso\core\domain\services\admin\registrations\list_table\QueryBuilder $list_table_query_builder */
1287 1287
         $list_table_query_builder = $this->getLoader()->getNew(
1288 1288
             'EventEspresso\core\domain\services\admin\registrations\list_table\QueryBuilder',
1289
-            [ $request ]
1289
+            [$request]
1290 1290
         );
1291 1291
         return $list_table_query_builder->getQueryParams($per_page, $count);
1292 1292
     }
@@ -1392,7 +1392,7 @@  discard block
 block discarded – undo
1392 1392
                 )
1393 1393
                 : '';
1394 1394
             // grab header
1395
-            $template_path = REG_TEMPLATE_PATH . 'reg_admin_details_header.template.php';
1395
+            $template_path = REG_TEMPLATE_PATH.'reg_admin_details_header.template.php';
1396 1396
             $this->_template_args['REG_ID'] = $this->_registration->ID();
1397 1397
             $this->_template_args['admin_page_header'] = EEH_Template::display_template(
1398 1398
                 $template_path,
@@ -1544,7 +1544,7 @@  discard block
 block discarded – undo
1544 1544
                                 EEH_HTML::strong(
1545 1545
                                     $this->_registration->pretty_status(),
1546 1546
                                     '',
1547
-                                    'status-' . $this->_registration->status_ID(),
1547
+                                    'status-'.$this->_registration->status_ID(),
1548 1548
                                     'line-height: 1em; font-size: 1.5em; font-weight: bold;'
1549 1549
                                 )
1550 1550
                             )
@@ -1600,14 +1600,14 @@  discard block
 block discarded – undo
1600 1600
     protected function _get_reg_statuses()
1601 1601
     {
1602 1602
         $reg_status_array = $this->getRegistrationModel()->reg_status_array();
1603
-        unset($reg_status_array[ EEM_Registration::status_id_incomplete ]);
1603
+        unset($reg_status_array[EEM_Registration::status_id_incomplete]);
1604 1604
         // get current reg status
1605 1605
         $current_status = $this->_registration->status_ID();
1606 1606
         // is registration for free event? This will determine whether to display the pending payment option
1607 1607
         if ($current_status !== EEM_Registration::status_id_pending_payment
1608 1608
             && EEH_Money::compare_floats($this->_registration->ticket()->price(), 0.00)
1609 1609
         ) {
1610
-            unset($reg_status_array[ EEM_Registration::status_id_pending_payment ]);
1610
+            unset($reg_status_array[EEM_Registration::status_id_pending_payment]);
1611 1611
         }
1612 1612
         return $this->getStatusModel()->localized_status($reg_status_array, false, 'sentence');
1613 1613
     }
@@ -1701,7 +1701,7 @@  discard block
 block discarded – undo
1701 1701
         $success = false;
1702 1702
         // typecast $REG_IDs
1703 1703
         $REG_IDs = (array) $REG_IDs;
1704
-        if (! empty($REG_IDs)) {
1704
+        if ( ! empty($REG_IDs)) {
1705 1705
             $success = true;
1706 1706
             // set default status if none is passed
1707 1707
             $status = $status ? $status : EEM_Registration::status_id_pending_payment;
@@ -1864,7 +1864,7 @@  discard block
 block discarded – undo
1864 1864
             $action,
1865 1865
             $notify
1866 1866
         );
1867
-        $method = $action . '_registration';
1867
+        $method = $action.'_registration';
1868 1868
         if (method_exists($this, $method)) {
1869 1869
             $this->$method($notify);
1870 1870
         }
@@ -2143,7 +2143,7 @@  discard block
 block discarded – undo
2143 2143
         $this->_template_args['REG_ID'] = $this->_registration->ID();
2144 2144
         $this->_template_args['event_id'] = $this->_registration->event_ID();
2145 2145
         $template_path =
2146
-            REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_reg_details.template.php';
2146
+            REG_TEMPLATE_PATH.'reg_admin_details_main_meta_box_reg_details.template.php';
2147 2147
         echo EEH_Template::display_template($template_path, $this->_template_args, true);
2148 2148
     }
2149 2149
 
@@ -2180,7 +2180,7 @@  discard block
 block discarded – undo
2180 2180
             $this->_template_args['reg_questions_form_action'] = 'edit_registration';
2181 2181
             $this->_template_args['REG_ID'] = $this->_registration->ID();
2182 2182
             $template_path =
2183
-                REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_reg_questions.template.php';
2183
+                REG_TEMPLATE_PATH.'reg_admin_details_main_meta_box_reg_questions.template.php';
2184 2184
             echo EEH_Template::display_template($template_path, $this->_template_args, true);
2185 2185
         }
2186 2186
     }
@@ -2197,7 +2197,7 @@  discard block
 block discarded – undo
2197 2197
     public function form_before_question_group($output)
2198 2198
     {
2199 2199
         EE_Error::doing_it_wrong(
2200
-            __CLASS__ . '::' . __FUNCTION__,
2200
+            __CLASS__.'::'.__FUNCTION__,
2201 2201
             esc_html__(
2202 2202
                 '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.',
2203 2203
                 'event_espresso'
@@ -2222,7 +2222,7 @@  discard block
 block discarded – undo
2222 2222
     public function form_after_question_group($output)
2223 2223
     {
2224 2224
         EE_Error::doing_it_wrong(
2225
-            __CLASS__ . '::' . __FUNCTION__,
2225
+            __CLASS__.'::'.__FUNCTION__,
2226 2226
             esc_html__(
2227 2227
                 '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.',
2228 2228
                 'event_espresso'
@@ -2260,7 +2260,7 @@  discard block
 block discarded – undo
2260 2260
     public function form_form_field_label_wrap($label)
2261 2261
     {
2262 2262
         EE_Error::doing_it_wrong(
2263
-            __CLASS__ . '::' . __FUNCTION__,
2263
+            __CLASS__.'::'.__FUNCTION__,
2264 2264
             esc_html__(
2265 2265
                 '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.',
2266 2266
                 'event_espresso'
@@ -2270,7 +2270,7 @@  discard block
 block discarded – undo
2270 2270
         return '
2271 2271
 			<tr>
2272 2272
 				<th>
2273
-					' . $label . '
2273
+					' . $label.'
2274 2274
 				</th>';
2275 2275
     }
2276 2276
 
@@ -2286,7 +2286,7 @@  discard block
 block discarded – undo
2286 2286
     public function form_form_field_input__wrap($input)
2287 2287
     {
2288 2288
         EE_Error::doing_it_wrong(
2289
-            __CLASS__ . '::' . __FUNCTION__,
2289
+            __CLASS__.'::'.__FUNCTION__,
2290 2290
             esc_html__(
2291 2291
                 '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.',
2292 2292
                 'event_espresso'
@@ -2295,7 +2295,7 @@  discard block
 block discarded – undo
2295 2295
         );
2296 2296
         return '
2297 2297
 				<td class="reg-admin-attendee-questions-input-td disabled-input">
2298
-					' . $input . '
2298
+					' . $input.'
2299 2299
 				</td>
2300 2300
 			</tr>';
2301 2301
     }
@@ -2343,8 +2343,8 @@  discard block
 block discarded – undo
2343 2343
      */
2344 2344
     protected function _get_reg_custom_questions_form($REG_ID)
2345 2345
     {
2346
-        if (! $this->_reg_custom_questions_form) {
2347
-            require_once(REG_ADMIN . 'form_sections/EE_Registration_Custom_Questions_Form.form.php');
2346
+        if ( ! $this->_reg_custom_questions_form) {
2347
+            require_once(REG_ADMIN.'form_sections/EE_Registration_Custom_Questions_Form.form.php');
2348 2348
             $this->_reg_custom_questions_form = new EE_Registration_Custom_Questions_Form(
2349 2349
                 $this->getRegistrationModel()->get_one_by_ID($REG_ID)
2350 2350
             );
@@ -2368,7 +2368,7 @@  discard block
 block discarded – undo
2368 2368
      */
2369 2369
     private function _save_reg_custom_questions_form($REG_ID = false)
2370 2370
     {
2371
-        if (! $REG_ID) {
2371
+        if ( ! $REG_ID) {
2372 2372
             EE_Error::add_error(
2373 2373
                 esc_html__(
2374 2374
                     'An error occurred. No registration ID was received.',
@@ -2460,30 +2460,30 @@  discard block
 block discarded – undo
2460 2460
                 $attendee = $registration->attendee()
2461 2461
                     ? $registration->attendee()
2462 2462
                     : $this->getAttendeeModel()->create_default_object();
2463
-                $this->_template_args['attendees'][ $att_nmbr ]['STS_ID'] = $registration->status_ID();
2464
-                $this->_template_args['attendees'][ $att_nmbr ]['fname'] = $attendee->fname();
2465
-                $this->_template_args['attendees'][ $att_nmbr ]['lname'] = $attendee->lname();
2466
-                $this->_template_args['attendees'][ $att_nmbr ]['email'] = $attendee->email();
2467
-                $this->_template_args['attendees'][ $att_nmbr ]['final_price'] = $registration->final_price();
2468
-                $this->_template_args['attendees'][ $att_nmbr ]['address'] = implode(
2463
+                $this->_template_args['attendees'][$att_nmbr]['STS_ID'] = $registration->status_ID();
2464
+                $this->_template_args['attendees'][$att_nmbr]['fname'] = $attendee->fname();
2465
+                $this->_template_args['attendees'][$att_nmbr]['lname'] = $attendee->lname();
2466
+                $this->_template_args['attendees'][$att_nmbr]['email'] = $attendee->email();
2467
+                $this->_template_args['attendees'][$att_nmbr]['final_price'] = $registration->final_price();
2468
+                $this->_template_args['attendees'][$att_nmbr]['address'] = implode(
2469 2469
                     ', ',
2470 2470
                     $attendee->full_address_as_array()
2471 2471
                 );
2472
-                $this->_template_args['attendees'][ $att_nmbr ]['att_link'] = self::add_query_args_and_nonce(
2472
+                $this->_template_args['attendees'][$att_nmbr]['att_link'] = self::add_query_args_and_nonce(
2473 2473
                     array(
2474 2474
                         'action' => 'edit_attendee',
2475 2475
                         'post'   => $attendee->ID(),
2476 2476
                     ),
2477 2477
                     REG_ADMIN_URL
2478 2478
                 );
2479
-                $this->_template_args['attendees'][ $att_nmbr ]['event_name'] = $registration->event_obj() instanceof EE_Event
2479
+                $this->_template_args['attendees'][$att_nmbr]['event_name'] = $registration->event_obj() instanceof EE_Event
2480 2480
                     ? $registration->event_obj()->name()
2481 2481
                     : '';
2482 2482
                 $att_nmbr++;
2483 2483
             }
2484 2484
             $this->_template_args['currency_sign'] = EE_Registry::instance()->CFG->currency->sign;
2485 2485
         }
2486
-        $template_path = REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_attendees.template.php';
2486
+        $template_path = REG_TEMPLATE_PATH.'reg_admin_details_main_meta_box_attendees.template.php';
2487 2487
         echo EEH_Template::display_template($template_path, $this->_template_args, true);
2488 2488
     }
2489 2489
 
@@ -2510,11 +2510,11 @@  discard block
 block discarded – undo
2510 2510
         // now let's determine if this is not the primary registration.  If it isn't then we set the
2511 2511
         // primary_registration object for reference BUT ONLY if the Attendee object loaded is not the same as the
2512 2512
         // primary registration object (that way we know if we need to show create button or not)
2513
-        if (! $this->_registration->is_primary_registrant()) {
2513
+        if ( ! $this->_registration->is_primary_registrant()) {
2514 2514
             $primary_registration = $this->_registration->get_primary_registration();
2515 2515
             $primary_attendee = $primary_registration instanceof EE_Registration ? $primary_registration->attendee()
2516 2516
                 : null;
2517
-            if (! $primary_attendee instanceof EE_Attendee || $attendee->ID() !== $primary_attendee->ID()) {
2517
+            if ( ! $primary_attendee instanceof EE_Attendee || $attendee->ID() !== $primary_attendee->ID()) {
2518 2518
                 // in here?  This means the displayed registration is not the primary registrant but ALREADY HAS its own
2519 2519
                 // custom attendee object so let's not worry about the primary reg.
2520 2520
                 $primary_registration = null;
@@ -2548,7 +2548,7 @@  discard block
 block discarded – undo
2548 2548
             ) : '';
2549 2549
         $this->_template_args['create_label'] = esc_html__('Create Contact', 'event_espresso');
2550 2550
         $this->_template_args['att_check'] = $att_check;
2551
-        $template_path = REG_TEMPLATE_PATH . 'reg_admin_details_side_meta_box_registrant.template.php';
2551
+        $template_path = REG_TEMPLATE_PATH.'reg_admin_details_side_meta_box_registrant.template.php';
2552 2552
         echo EEH_Template::display_template($template_path, $this->_template_args, true);
2553 2553
     }
2554 2554
 
@@ -2586,7 +2586,7 @@  discard block
 block discarded – undo
2586 2586
         $success = 0;
2587 2587
         $overwrite_msgs = false;
2588 2588
         // Checkboxes
2589
-        if (! is_array($this->_req_data['_REG_ID'])) {
2589
+        if ( ! is_array($this->_req_data['_REG_ID'])) {
2590 2590
             $this->_req_data['_REG_ID'] = array($this->_req_data['_REG_ID']);
2591 2591
         }
2592 2592
         $reg_count = count($this->_req_data['_REG_ID']);
@@ -2595,7 +2595,7 @@  discard block
 block discarded – undo
2595 2595
             /** @var EE_Registration $REG */
2596 2596
             $REG = $this->getRegistrationModel()->get_one_by_ID($REG_ID);
2597 2597
             $payments = $REG->registration_payments();
2598
-            if (! empty($payments)) {
2598
+            if ( ! empty($payments)) {
2599 2599
                 $name = $REG->attendee() instanceof EE_Attendee
2600 2600
                     ? $REG->attendee()->full_name()
2601 2601
                     : esc_html__('Unknown Attendee', 'event_espresso');
@@ -2657,17 +2657,17 @@  discard block
 block discarded – undo
2657 2657
         $REG_MDL = $this->getRegistrationModel();
2658 2658
         $success = 1;
2659 2659
         // Checkboxes
2660
-        if (! empty($this->_req_data['_REG_ID']) && is_array($this->_req_data['_REG_ID'])) {
2660
+        if ( ! empty($this->_req_data['_REG_ID']) && is_array($this->_req_data['_REG_ID'])) {
2661 2661
             // if array has more than one element than success message should be plural
2662 2662
             $success = count($this->_req_data['_REG_ID']) > 1 ? 2 : 1;
2663 2663
             // cycle thru checkboxes
2664 2664
             foreach ($this->_req_data['_REG_ID'] as $REG_ID) {
2665 2665
                 $REG = $REG_MDL->get_one_by_ID($REG_ID);
2666
-                if (! $REG instanceof EE_Registration) {
2666
+                if ( ! $REG instanceof EE_Registration) {
2667 2667
                     continue;
2668 2668
                 }
2669 2669
                 $deleted = $this->_delete_registration($REG);
2670
-                if (! $deleted) {
2670
+                if ( ! $deleted) {
2671 2671
                     $success = 0;
2672 2672
                 }
2673 2673
             }
@@ -2677,7 +2677,7 @@  discard block
 block discarded – undo
2677 2677
             /** @var EE_Registration $REG */
2678 2678
             $REG = $REG_MDL->get_one_by_ID($REG_ID);
2679 2679
             $deleted = $this->_delete_registration($REG);
2680
-            if (! $deleted) {
2680
+            if ( ! $deleted) {
2681 2681
                 $success = 0;
2682 2682
             }
2683 2683
         }
@@ -2715,11 +2715,11 @@  discard block
 block discarded – undo
2715 2715
         $REGS = $TXN->get_many_related('Registration');
2716 2716
         $all_trashed = true;
2717 2717
         foreach ($REGS as $registration) {
2718
-            if (! $registration->get('REG_deleted')) {
2718
+            if ( ! $registration->get('REG_deleted')) {
2719 2719
                 $all_trashed = false;
2720 2720
             }
2721 2721
         }
2722
-        if (! $all_trashed) {
2722
+        if ( ! $all_trashed) {
2723 2723
             EE_Error::add_error(
2724 2724
                 esc_html__(
2725 2725
                     '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.',
@@ -2782,7 +2782,7 @@  discard block
 block discarded – undo
2782 2782
      */
2783 2783
     public function new_registration()
2784 2784
     {
2785
-        if (! $this->_set_reg_event()) {
2785
+        if ( ! $this->_set_reg_event()) {
2786 2786
             throw new EE_Error(
2787 2787
                 esc_html__(
2788 2788
                     'Unable to continue with registering because there is no Event ID in the request',
@@ -2792,8 +2792,8 @@  discard block
 block discarded – undo
2792 2792
         }
2793 2793
         EE_Registry::instance()->REQ->set_espresso_page(true);
2794 2794
         // gotta start with a clean slate if we're not coming here via ajax
2795
-        if (! defined('DOING_AJAX')
2796
-            && (! isset($this->_req_data['processing_registration']) || isset($this->_req_data['step_error']))
2795
+        if ( ! defined('DOING_AJAX')
2796
+            && ( ! isset($this->_req_data['processing_registration']) || isset($this->_req_data['step_error']))
2797 2797
         ) {
2798 2798
             EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
2799 2799
         }
@@ -2826,7 +2826,7 @@  discard block
 block discarded – undo
2826 2826
         }
2827 2827
         // grab header
2828 2828
         $template_path =
2829
-            REG_TEMPLATE_PATH . 'reg_admin_register_new_attendee.template.php';
2829
+            REG_TEMPLATE_PATH.'reg_admin_register_new_attendee.template.php';
2830 2830
         $this->_template_args['admin_page_content'] = EEH_Template::display_template(
2831 2831
             $template_path,
2832 2832
             $this->_template_args,
@@ -2867,7 +2867,7 @@  discard block
 block discarded – undo
2867 2867
                 '</b>'
2868 2868
             );
2869 2869
             return '
2870
-	<div id="ee-add-reg-back-button-dv"><p>' . $warning_msg . '</p></div>
2870
+	<div id="ee-add-reg-back-button-dv"><p>' . $warning_msg.'</p></div>
2871 2871
 	<script >
2872 2872
 		// WHOAH !!! it appears that someone is using the back button from the Transaction admin page
2873 2873
 		// after just adding a new registration... we gotta try to put a stop to that !!!
@@ -2936,7 +2936,7 @@  discard block
 block discarded – undo
2936 2936
         // we come back to the process_registration_step route.
2937 2937
         $this->_set_add_edit_form_tags('process_reg_step', $hidden_fields);
2938 2938
         return EEH_Template::display_template(
2939
-            REG_TEMPLATE_PATH . 'reg_admin_register_new_attendee_step_content.template.php',
2939
+            REG_TEMPLATE_PATH.'reg_admin_register_new_attendee_step_content.template.php',
2940 2940
             $template_args,
2941 2941
             true
2942 2942
         );
@@ -2958,8 +2958,8 @@  discard block
 block discarded – undo
2958 2958
         if (is_object($this->_reg_event)) {
2959 2959
             return true;
2960 2960
         }
2961
-        $EVT_ID = (! empty($this->_req_data['event_id'])) ? absint($this->_req_data['event_id']) : false;
2962
-        if (! $EVT_ID) {
2961
+        $EVT_ID = ( ! empty($this->_req_data['event_id'])) ? absint($this->_req_data['event_id']) : false;
2962
+        if ( ! $EVT_ID) {
2963 2963
             return false;
2964 2964
         }
2965 2965
         $this->_reg_event = $this->getEventModel()->get_one_by_ID($EVT_ID);
@@ -2991,8 +2991,8 @@  discard block
 block discarded – undo
2991 2991
         $step = ! $cart instanceof EE_Cart ? 'ticket' : 'questions';
2992 2992
         // if doing ajax then we need to verify the nonce
2993 2993
         if (defined('DOING_AJAX')) {
2994
-            $nonce = isset($this->_req_data[ $this->_req_nonce ])
2995
-                ? sanitize_text_field($this->_req_data[ $this->_req_nonce ]) : '';
2994
+            $nonce = isset($this->_req_data[$this->_req_nonce])
2995
+                ? sanitize_text_field($this->_req_data[$this->_req_nonce]) : '';
2996 2996
             $this->_verify_nonce($nonce, $this->_req_nonce);
2997 2997
         }
2998 2998
         switch ($step) {
@@ -3028,7 +3028,7 @@  discard block
 block discarded – undo
3028 3028
                 }
3029 3029
                 break;
3030 3030
             case 'questions':
3031
-                if (! isset(
3031
+                if ( ! isset(
3032 3032
                     $this->_req_data['txn_reg_status_change'],
3033 3033
                     $this->_req_data['txn_reg_status_change']['send_notifications']
3034 3034
                 )
@@ -3043,7 +3043,7 @@  discard block
 block discarded – undo
3043 3043
                         $grand_total->save_this_and_descendants_to_txn();
3044 3044
                     }
3045 3045
                 }
3046
-                if (! $transaction instanceof EE_Transaction) {
3046
+                if ( ! $transaction instanceof EE_Transaction) {
3047 3047
                     $query_args = array(
3048 3048
                         'action'                  => 'new_registration',
3049 3049
                         'processing_registration' => 2,
@@ -3065,7 +3065,7 @@  discard block
 block discarded – undo
3065 3065
                     return;
3066 3066
                 }
3067 3067
                 // maybe update status, and make sure to save transaction if not done already
3068
-                if (! $transaction->update_status_based_on_total_paid()) {
3068
+                if ( ! $transaction->update_status_based_on_total_paid()) {
3069 3069
                     $transaction->save();
3070 3070
                 }
3071 3071
                 EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
@@ -3151,7 +3151,7 @@  discard block
 block discarded – undo
3151 3151
     public function get_attendees($per_page, $count = false, $trash = false)
3152 3152
     {
3153 3153
         do_action('AHEE_log', __FILE__, __FUNCTION__, '');
3154
-        require_once(REG_ADMIN . 'EE_Attendee_Contact_List_Table.class.php');
3154
+        require_once(REG_ADMIN.'EE_Attendee_Contact_List_Table.class.php');
3155 3155
         $this->_req_data['orderby'] = ! empty($this->_req_data['orderby']) ? $this->_req_data['orderby'] : '';
3156 3156
         switch ($this->_req_data['orderby']) {
3157 3157
             case 'ATT_ID':
@@ -3189,8 +3189,8 @@  discard block
 block discarded – undo
3189 3189
             ? $this->_req_data['perpage']
3190 3190
             : $per_page;
3191 3191
         $_where = array();
3192
-        if (! empty($this->_req_data['s'])) {
3193
-            $sstr = '%' . $this->_req_data['s'] . '%';
3192
+        if ( ! empty($this->_req_data['s'])) {
3193
+            $sstr = '%'.$this->_req_data['s'].'%';
3194 3194
             $_where['OR'] = array(
3195 3195
                 'Registration.Event.EVT_name'       => array('LIKE', $sstr),
3196 3196
                 'Registration.Event.EVT_desc'       => array('LIKE', $sstr),
@@ -3217,7 +3217,7 @@  discard block
 block discarded – undo
3217 3217
             'extra_selects' => array('Registration_Count' => array('Registration.REG_ID', 'count', '%d')),
3218 3218
             'limit'         => $limit,
3219 3219
         );
3220
-        if (! $count) {
3220
+        if ( ! $count) {
3221 3221
             $query_args['order_by'] = array($orderby => $sort);
3222 3222
         }
3223 3223
         if ($trash) {
@@ -3265,7 +3265,7 @@  discard block
 block discarded – undo
3265 3265
      */
3266 3266
     public function _registrations_report_base($method_name_for_getting_query_params)
3267 3267
     {
3268
-        if (! defined('EE_USE_OLD_CSV_REPORT_CLASS')) {
3268
+        if ( ! defined('EE_USE_OLD_CSV_REPORT_CLASS')) {
3269 3269
             wp_redirect(
3270 3270
                 EE_Admin_Page::add_query_args_and_nonce(
3271 3271
                     array(
@@ -3296,8 +3296,8 @@  discard block
 block discarded – undo
3296 3296
                 'EVT_ID' => isset($this->_req_data['EVT_ID']) ? $this->_req_data['EVT_ID'] : null,
3297 3297
             );
3298 3298
             $this->_req_data = array_merge($this->_req_data, $new_request_args);
3299
-            if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3300
-                require_once(EE_CLASSES . 'EE_Export.class.php');
3299
+            if (is_readable(EE_CLASSES.'EE_Export.class.php')) {
3300
+                require_once(EE_CLASSES.'EE_Export.class.php');
3301 3301
                 $EE_Export = EE_Export::instance($this->_req_data);
3302 3302
                 $EE_Export->export();
3303 3303
             }
@@ -3318,8 +3318,8 @@  discard block
 block discarded – undo
3318 3318
 
3319 3319
     public function _contact_list_export()
3320 3320
     {
3321
-        if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3322
-            require_once(EE_CLASSES . 'EE_Export.class.php');
3321
+        if (is_readable(EE_CLASSES.'EE_Export.class.php')) {
3322
+            require_once(EE_CLASSES.'EE_Export.class.php');
3323 3323
             $EE_Export = EE_Export::instance($this->_req_data);
3324 3324
             $EE_Export->export_attendees();
3325 3325
         }
@@ -3328,7 +3328,7 @@  discard block
 block discarded – undo
3328 3328
 
3329 3329
     public function _contact_list_report()
3330 3330
     {
3331
-        if (! defined('EE_USE_OLD_CSV_REPORT_CLASS')) {
3331
+        if ( ! defined('EE_USE_OLD_CSV_REPORT_CLASS')) {
3332 3332
             wp_redirect(
3333 3333
                 EE_Admin_Page::add_query_args_and_nonce(
3334 3334
                     array(
@@ -3340,8 +3340,8 @@  discard block
 block discarded – undo
3340 3340
                 )
3341 3341
             );
3342 3342
         } else {
3343
-            if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3344
-                require_once(EE_CLASSES . 'EE_Export.class.php');
3343
+            if (is_readable(EE_CLASSES.'EE_Export.class.php')) {
3344
+                require_once(EE_CLASSES.'EE_Export.class.php');
3345 3345
                 $EE_Export = EE_Export::instance($this->_req_data);
3346 3346
                 $EE_Export->report_attendees();
3347 3347
             }
@@ -3429,7 +3429,7 @@  discard block
 block discarded – undo
3429 3429
             $updated_fields = array(
3430 3430
                 'ATT_fname'     => $this->_req_data['ATT_fname'],
3431 3431
                 'ATT_lname'     => $this->_req_data['ATT_lname'],
3432
-                'ATT_full_name' => $this->_req_data['ATT_fname'] . ' ' . $this->_req_data['ATT_lname'],
3432
+                'ATT_full_name' => $this->_req_data['ATT_fname'].' '.$this->_req_data['ATT_lname'],
3433 3433
                 'ATT_address'   => isset($this->_req_data['ATT_address']) ? $this->_req_data['ATT_address'] : '',
3434 3434
                 'ATT_address2'  => isset($this->_req_data['ATT_address2']) ? $this->_req_data['ATT_address2'] : '',
3435 3435
                 'ATT_city'      => isset($this->_req_data['ATT_city']) ? $this->_req_data['ATT_city'] : '',
@@ -3507,16 +3507,16 @@  discard block
 block discarded – undo
3507 3507
         $this->verify_cpt_object();
3508 3508
         remove_meta_box(
3509 3509
             'postexcerpt',
3510
-            $this->_cpt_routes[ $this->_req_action ],
3510
+            $this->_cpt_routes[$this->_req_action],
3511 3511
             'normal'
3512 3512
         );
3513
-        remove_meta_box('commentstatusdiv', $this->_cpt_routes[ $this->_req_action ], 'normal', 'core');
3513
+        remove_meta_box('commentstatusdiv', $this->_cpt_routes[$this->_req_action], 'normal', 'core');
3514 3514
         if (post_type_supports('espresso_attendees', 'excerpt')) {
3515 3515
             add_meta_box(
3516 3516
                 'postexcerpt',
3517 3517
                 esc_html__('Short Biography', 'event_espresso'),
3518 3518
                 'post_excerpt_meta_box',
3519
-                $this->_cpt_routes[ $this->_req_action ],
3519
+                $this->_cpt_routes[$this->_req_action],
3520 3520
                 'normal'
3521 3521
             );
3522 3522
         }
@@ -3525,7 +3525,7 @@  discard block
 block discarded – undo
3525 3525
                 'commentsdiv',
3526 3526
                 esc_html__('Notes on the Contact', 'event_espresso'),
3527 3527
                 'post_comment_meta_box',
3528
-                $this->_cpt_routes[ $this->_req_action ],
3528
+                $this->_cpt_routes[$this->_req_action],
3529 3529
                 'normal',
3530 3530
                 'core'
3531 3531
             );
@@ -3534,7 +3534,7 @@  discard block
 block discarded – undo
3534 3534
             'attendee_contact_info',
3535 3535
             esc_html__('Contact Info', 'event_espresso'),
3536 3536
             array($this, 'attendee_contact_info'),
3537
-            $this->_cpt_routes[ $this->_req_action ],
3537
+            $this->_cpt_routes[$this->_req_action],
3538 3538
             'side',
3539 3539
             'core'
3540 3540
         );
@@ -3542,7 +3542,7 @@  discard block
 block discarded – undo
3542 3542
             'attendee_details_address',
3543 3543
             esc_html__('Address Details', 'event_espresso'),
3544 3544
             array($this, 'attendee_address_details'),
3545
-            $this->_cpt_routes[ $this->_req_action ],
3545
+            $this->_cpt_routes[$this->_req_action],
3546 3546
             'normal',
3547 3547
             'core'
3548 3548
         );
@@ -3550,7 +3550,7 @@  discard block
 block discarded – undo
3550 3550
             'attendee_registrations',
3551 3551
             esc_html__('Registrations for this Contact', 'event_espresso'),
3552 3552
             array($this, 'attendee_registrations_meta_box'),
3553
-            $this->_cpt_routes[ $this->_req_action ],
3553
+            $this->_cpt_routes[$this->_req_action],
3554 3554
             'normal',
3555 3555
             'high'
3556 3556
         );
@@ -3651,7 +3651,7 @@  discard block
 block discarded – undo
3651 3651
             )
3652 3652
         );
3653 3653
         $template =
3654
-            REG_TEMPLATE_PATH . 'attendee_address_details_metabox_content.template.php';
3654
+            REG_TEMPLATE_PATH.'attendee_address_details_metabox_content.template.php';
3655 3655
         EEH_Template::display_template($template, $this->_template_args);
3656 3656
     }
3657 3657
 
@@ -3674,7 +3674,7 @@  discard block
 block discarded – undo
3674 3674
         $this->_template_args['attendee'] = $this->_cpt_model_obj;
3675 3675
         $this->_template_args['registrations'] = $this->_cpt_model_obj->get_many_related('Registration');
3676 3676
         $template =
3677
-            REG_TEMPLATE_PATH . 'attendee_registrations_main_meta_box.template.php';
3677
+            REG_TEMPLATE_PATH.'attendee_registrations_main_meta_box.template.php';
3678 3678
         EEH_Template::display_template($template, $this->_template_args);
3679 3679
     }
3680 3680
 
@@ -3689,7 +3689,7 @@  discard block
 block discarded – undo
3689 3689
     public function after_title_form_fields($post)
3690 3690
     {
3691 3691
         if ($post->post_type === 'espresso_attendees') {
3692
-            $template = REG_TEMPLATE_PATH . 'attendee_details_after_title_form_fields.template.php';
3692
+            $template = REG_TEMPLATE_PATH.'attendee_details_after_title_form_fields.template.php';
3693 3693
             $template_args['attendee'] = $this->_cpt_model_obj;
3694 3694
             EEH_Template::display_template($template, $template_args);
3695 3695
         }
@@ -3713,14 +3713,14 @@  discard block
 block discarded – undo
3713 3713
         do_action('AHEE_log', __FILE__, __FUNCTION__, '');
3714 3714
         $success = 1;
3715 3715
         // Checkboxes
3716
-        if (! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
3716
+        if ( ! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
3717 3717
             // if array has more than one element than success message should be plural
3718 3718
             $success = count($this->_req_data['checkbox']) > 1 ? 2 : 1;
3719 3719
             // cycle thru checkboxes
3720 3720
             foreach ($this->_req_data['checkbox'] as $ATT_ID) {
3721 3721
                 $updated = $trash ? $this->getAttendeeModel()->update_by_ID(array('status' => 'trash'), $ATT_ID)
3722 3722
                     : $this->getAttendeeModel()->update_by_ID(array('status' => 'publish'), $ATT_ID);
3723
-                if (! $updated) {
3723
+                if ( ! $updated) {
3724 3724
                     $success = 0;
3725 3725
                 }
3726 3726
             }
@@ -3731,7 +3731,7 @@  discard block
 block discarded – undo
3731 3731
             $att = $this->getAttendeeModel()->get_one_by_ID($ATT_ID);
3732 3732
             $updated = $trash ? $att->set_status('trash') : $att->set_status('publish');
3733 3733
             $updated = $att->save() && $updated;
3734
-            if (! $updated) {
3734
+            if ( ! $updated) {
3735 3735
                 $success = 0;
3736 3736
             }
3737 3737
         }
Please login to merge, or discard this patch.
services/admin/registrations/list_table/page_header/EventFilterHeader.php 1 patch
Indentation   +55 added lines, -55 removed lines patch added patch discarded remove patch
@@ -24,63 +24,63 @@
 block discarded – undo
24 24
 class EventFilterHeader extends AdminPageHeaderDecorator
25 25
 {
26 26
 
27
-    /**
28
-     * @var EEM_Event $event_model
29
-     */
30
-    private $event_model;
27
+	/**
28
+	 * @var EEM_Event $event_model
29
+	 */
30
+	private $event_model;
31 31
 
32 32
 
33
-    /**
34
-     * EventFilterHeader constructor.
35
-     *
36
-     * @param RequestInterface $request
37
-     * @param EEM_Event        $event_model
38
-     */
39
-    public function __construct(RequestInterface $request, EEM_Event $event_model)
40
-    {
41
-        parent::__construct($request);
42
-        $this->event_model = $event_model;
43
-    }
33
+	/**
34
+	 * EventFilterHeader constructor.
35
+	 *
36
+	 * @param RequestInterface $request
37
+	 * @param EEM_Event        $event_model
38
+	 */
39
+	public function __construct(RequestInterface $request, EEM_Event $event_model)
40
+	{
41
+		parent::__construct($request);
42
+		$this->event_model = $event_model;
43
+	}
44 44
 
45 45
 
46
-    /**
47
-     * @param string $text
48
-     * @return string
49
-     * @throws EE_Error
50
-     * @throws InvalidDataTypeException
51
-     * @throws InvalidInterfaceException
52
-     * @throws InvalidArgumentException
53
-     * @throws ReflectionException
54
-     * @since $VID:$
55
-     */
56
-    public function getHeaderText($text = '')
57
-    {
58
-        $EVT_ID = $this->request->getRequestParam('EVT_ID');
59
-        $EVT_ID = $this->request->getRequestParam('event_id', $EVT_ID);
60
-        $EVT_ID = absint($EVT_ID);
61
-        if ($EVT_ID) {
62
-            $event = $this->event_model->get_one_by_ID($EVT_ID);
63
-            if ($event instanceof EE_Event) {
64
-                $text .= sprintf(
65
-                    /* translators: %s: <h3>  %s: <a href>Event Name</a>  %s: </h3> */
66
-                    // phpcs:ignore WordPress.WP.I18n.UnorderedPlaceholdersText
67
-                    esc_html__('%s Viewing registrations for the event: %s%s', 'event_espresso'),
68
-                    '<h3 style="line-height:1.5em;">',
69
-                    '&nbsp;<a href="'
70
-                    . EE_Admin_Page::add_query_args_and_nonce(
71
-                        array(
72
-                            'action' => 'edit',
73
-                            'post'   => $event->ID(),
74
-                        ),
75
-                        EVENTS_ADMIN_URL
76
-                    )
77
-                    . '">'
78
-                    . $event->get('EVT_name')
79
-                    . '</a>&nbsp;',
80
-                    '</h3>'
81
-                );
82
-            }
83
-        }
84
-        return $text;
85
-    }
46
+	/**
47
+	 * @param string $text
48
+	 * @return string
49
+	 * @throws EE_Error
50
+	 * @throws InvalidDataTypeException
51
+	 * @throws InvalidInterfaceException
52
+	 * @throws InvalidArgumentException
53
+	 * @throws ReflectionException
54
+	 * @since $VID:$
55
+	 */
56
+	public function getHeaderText($text = '')
57
+	{
58
+		$EVT_ID = $this->request->getRequestParam('EVT_ID');
59
+		$EVT_ID = $this->request->getRequestParam('event_id', $EVT_ID);
60
+		$EVT_ID = absint($EVT_ID);
61
+		if ($EVT_ID) {
62
+			$event = $this->event_model->get_one_by_ID($EVT_ID);
63
+			if ($event instanceof EE_Event) {
64
+				$text .= sprintf(
65
+					/* translators: %s: <h3>  %s: <a href>Event Name</a>  %s: </h3> */
66
+					// phpcs:ignore WordPress.WP.I18n.UnorderedPlaceholdersText
67
+					esc_html__('%s Viewing registrations for the event: %s%s', 'event_espresso'),
68
+					'<h3 style="line-height:1.5em;">',
69
+					'&nbsp;<a href="'
70
+					. EE_Admin_Page::add_query_args_and_nonce(
71
+						array(
72
+							'action' => 'edit',
73
+							'post'   => $event->ID(),
74
+						),
75
+						EVENTS_ADMIN_URL
76
+					)
77
+					. '">'
78
+					. $event->get('EVT_name')
79
+					. '</a>&nbsp;',
80
+					'</h3>'
81
+				);
82
+			}
83
+		}
84
+		return $text;
85
+	}
86 86
 }
Please login to merge, or discard this patch.
caffeinated/payment_methods/Paypal_Pro/EEG_Paypal_Pro.gateway.php 1 patch
Indentation   +602 added lines, -602 removed lines patch added patch discarded remove patch
@@ -11,606 +11,606 @@
 block discarded – undo
11 11
 class EEG_Paypal_Pro extends EE_Onsite_Gateway
12 12
 {
13 13
 
14
-    /**
15
-     * @var $_paypal_api_username string
16
-     */
17
-    protected $_api_username = null;
18
-
19
-    /**
20
-     * @var $_api_password string
21
-     */
22
-    protected $_api_password = null;
23
-
24
-    /**
25
-     * @var $_api_signature string
26
-     */
27
-    protected $_api_signature = null;
28
-
29
-    /**
30
-     * @var $_credit_card_types array with the keys for credit card types accepted on this account
31
-     */
32
-    protected $_credit_card_types    = null;
33
-
34
-    protected $_currencies_supported = array(
35
-        'USD',
36
-        'GBP',
37
-        'CAD',
38
-        'AUD',
39
-        'BRL',
40
-        'CHF',
41
-        'CZK',
42
-        'DKK',
43
-        'EUR',
44
-        'HKD',
45
-        'HUF',
46
-        'ILS',
47
-        'JPY',
48
-        'MXN',
49
-        'MYR',
50
-        'NOK',
51
-        'NZD',
52
-        'PHP',
53
-        'PLN',
54
-        'SEK',
55
-        'SGD',
56
-        'THB',
57
-        'TRY',
58
-        'TWD',
59
-        'RUB',
60
-        'INR',
61
-    );
62
-
63
-
64
-
65
-    /**
66
-     * @param EEI_Payment $payment
67
-     * @param array       $billing_info {
68
-     * @type string $credit_card
69
-     * @type string $credit_card_type
70
-     * @type string $exp_month always 2 characters
71
-     * @type string $exp_year always 4 characters
72
-     * @type string $cvv
73
-     * }
74
-     * @see      parent::do_direct_payment for more info
75
-     * @return EE_Payment|EEI_Payment
76
-     * @throws EE_Error
77
-     */
78
-    public function do_direct_payment($payment, $billing_info = null)
79
-    {
80
-        $transaction = $payment->transaction();
81
-        if (! $transaction instanceof EEI_Transaction) {
82
-            throw new EE_Error(
83
-                esc_html__('No transaction for payment while paying with PayPal Pro.', 'event_espresso')
84
-            );
85
-        }
86
-        $primary_registrant = $transaction->primary_registration();
87
-        if (! $primary_registrant instanceof EEI_Registration) {
88
-            throw new EE_Error(
89
-                esc_html__(
90
-                    'No primary registration on transaction while paying with PayPal Pro.',
91
-                    'event_espresso'
92
-                )
93
-            );
94
-        }
95
-        $attendee = $primary_registrant->attendee();
96
-        if (! $attendee instanceof EEI_Attendee) {
97
-            throw new EE_Error(
98
-                esc_html__(
99
-                    'No attendee on primary registration while paying with PayPal Pro.',
100
-                    'event_espresso'
101
-                )
102
-            );
103
-        }
104
-        $gateway_formatter = $this->_get_gateway_formatter();
105
-        $order_description = substr($gateway_formatter->formatOrderDescription($payment), 0, 127);
106
-        // charge for the full amount. Show itemized list
107
-        if ($this->_money->compare_floats($payment->amount(), $transaction->total(), '==')) {
108
-            $item_num = 1;
109
-            $total_line_item = $transaction->total_line_item();
110
-            $order_items = array();
111
-            foreach ($total_line_item->get_items() as $line_item) {
112
-                // ignore line items with a quantity of 0
113
-                if ($line_item->quantity() == 0) {
114
-                    continue;
115
-                }
116
-                // For percent items, whose unit_price is 0, use the total instead.
117
-                if ($line_item->is_percent()) {
118
-                    $unit_price = $line_item->total();
119
-                    $line_item_quantity = 1;
120
-                } else {
121
-                    $unit_price = $line_item->unit_price();
122
-                    $line_item_quantity = $line_item->quantity();
123
-                }
124
-                $item = array(
125
-                    // Item Name.  127 char max.
126
-                    'l_name'                 => substr(
127
-                        $gateway_formatter->formatLineItemName($line_item, $payment),
128
-                        0,
129
-                        127
130
-                    ),
131
-                    // Item description.  127 char max.
132
-                    'l_desc'                 => substr(
133
-                        $gateway_formatter->formatLineItemDesc($line_item, $payment),
134
-                        0,
135
-                        127
136
-                    ),
137
-                    // Cost of individual item.
138
-                    'l_amt'                  => $unit_price,
139
-                    // Item Number.  127 char max.
140
-                    'l_number'               => $item_num++,
141
-                    // Item quantity.  Must be any positive integer.
142
-                    'l_qty'                  => $line_item_quantity,
143
-                    // Item's sales tax amount.
144
-                    'l_taxamt'               => '',
145
-                    // eBay auction number of item.
146
-                    'l_ebayitemnumber'       => '',
147
-                    // eBay transaction ID of purchased item.
148
-                    'l_ebayitemauctiontxnid' => '',
149
-                    // eBay order ID for the item.
150
-                    'l_ebayitemorderid'      => '',
151
-                );
152
-                // add to array of all items
153
-                array_push($order_items, $item);
154
-            }
155
-            $item_amount = $total_line_item->get_items_total();
156
-            $tax_amount = $total_line_item->get_total_tax();
157
-        } else {
158
-            $order_items = array();
159
-            $item_amount = $payment->amount();
160
-            $tax_amount = 0;
161
-            array_push($order_items, array(
162
-                // Item Name.  127 char max.
163
-                'l_name'   => substr(
164
-                    $gateway_formatter->formatPartialPaymentLineItemName($payment),
165
-                    0,
166
-                    127
167
-                ),
168
-                // Item description.  127 char max.
169
-                'l_desc'   => substr(
170
-                    $gateway_formatter->formatPartialPaymentLineItemDesc($payment),
171
-                    0,
172
-                    127
173
-                ),
174
-                // Cost of individual item.
175
-                'l_amt'    => $payment->amount(),
176
-                // Item Number.  127 char max.
177
-                'l_number' => 1,
178
-                // Item quantity.  Must be any positive integer.
179
-                'l_qty'    => 1,
180
-            ));
181
-        }
182
-        // Populate data arrays with order data.
183
-        $DPFields = array(
184
-            // How you want to obtain payment ?
185
-            // Authorization indicates the payment is a basic auth subject to settlement with Auth & Capture.
186
-            // Sale indicates that this is a final sale for which you are requesting payment.  Default is Sale.
187
-            'paymentaction'    => 'Sale',
188
-            // Required.  IP address of the payer's browser.
189
-            'ipaddress'        => $_SERVER['REMOTE_ADDR'],
190
-            // Flag to determine whether you want the results returned by FMF.  1 or 0.  Default is 0.
191
-            'returnfmfdetails' => '1',
192
-        );
193
-        $CCDetails = array(
194
-            // Required. Type of credit card.  Visa, MasterCard, Discover, Amex, Maestro, Solo.
195
-            // If Maestro or Solo, the currency code must be GBP.
196
-            //  In addition, either start date or issue number must be specified.
197
-            'creditcardtype' => $billing_info['credit_card_type'],
198
-            // Required.  Credit card number.  No spaces or punctuation.
199
-            'acct'           => $billing_info['credit_card'],
200
-            // Required.  Credit card expiration date.  Format is MMYYYY
201
-            'expdate'        => $billing_info['exp_month'] . $billing_info['exp_year'],
202
-            // Requirements determined by your PayPal account settings.  Security digits for credit card.
203
-            'cvv2'           => $billing_info['cvv'],
204
-        );
205
-        $PayerInfo = array(
206
-            // Email address of payer.
207
-            'email'       => $billing_info['email'],
208
-            // Unique PayPal customer ID for payer.
209
-            'payerid'     => '',
210
-            // Status of payer.  Values are verified or unverified
211
-            'payerstatus' => '',
212
-            // Payer's business name.
213
-            'business'    => '',
214
-        );
215
-        $PayerName = array(
216
-            // Payer's salutation.  20 char max.
217
-            'salutation' => '',
218
-            // Payer's first name.  25 char max.
219
-            'firstname'  => substr($billing_info['first_name'], 0, 25),
220
-            // Payer's middle name.  25 char max.
221
-            'middlename' => '',
222
-            // Payer's last name.  25 char max.
223
-            'lastname'   => substr($billing_info['last_name'], 0, 25),
224
-            // Payer's suffix.  12 char max.
225
-            'suffix'     => '',
226
-        );
227
-        $BillingAddress = array(
228
-            // Required.  First street address.
229
-            'street'      => $billing_info['address'],
230
-            // Second street address.
231
-            'street2'     => $billing_info['address2'],
232
-            // Required.  Name of City.
233
-            'city'        => $billing_info['city'],
234
-            // Required. Name of State or Province.
235
-            'state'       => substr($billing_info['state'], 0, 40),
236
-            // Required.  Country code.
237
-            'countrycode' => $billing_info['country'],
238
-            // Required.  Postal code of payer.
239
-            'zip'         => $billing_info['zip'],
240
-        );
241
-        // check if the registration info contains the needed fields for paypal pro
242
-        // (see https://developer.paypal.com/docs/classic/api/merchant/DoDirectPayment_API_Operation_NVP/)
243
-        if ($attendee->address() && $attendee->city() && $attendee->country_ID()) {
244
-            $use_registration_address_info = true;
245
-        } else {
246
-            $use_registration_address_info = false;
247
-        }
248
-        // so if the attendee has enough data to fill out PayPal Pro's shipping info, use it.
249
-        // If not, use the billing info again
250
-        $ShippingAddress = array(
251
-            'shiptoname'     => substr($use_registration_address_info
252
-                ? $attendee->full_name()
253
-                : $billing_info['first_name'] . ' ' . $billing_info['last_name'], 0, 32),
254
-            'shiptostreet'   => substr($use_registration_address_info
255
-                ? $attendee->address()
256
-                : $billing_info['address'], 0, 100),
257
-            'shiptostreet2'  => substr($use_registration_address_info
258
-                ? $attendee->address2() : $billing_info['address2'], 0, 100),
259
-            'shiptocity'     => substr($use_registration_address_info
260
-                ? $attendee->city()
261
-                : $billing_info['city'], 0, 40),
262
-            'shiptostate'          => substr($use_registration_address_info
263
-                ? $attendee->state_name()
264
-                : $billing_info['state'], 0, 40),
265
-            'shiptocountry'  => $use_registration_address_info
266
-                ? $attendee->country_ID()
267
-                : $billing_info['country'],
268
-            'shiptozip'      => substr($use_registration_address_info
269
-                ? $attendee->zip()
270
-                : $billing_info['zip'], 0, 20),
271
-            'shiptophonenum' => substr($use_registration_address_info
272
-                ? $attendee->phone()
273
-                : $billing_info['phone'], 0, 20),
274
-        );
275
-        $PaymentDetails = array(
276
-            // Required.  Total amount of order, including shipping, handling, and tax.
277
-            'amt'          => $gateway_formatter->formatCurrency($payment->amount()),
278
-            // Required.  Three-letter currency code.  Default is USD.
279
-            'currencycode' => $payment->currency_code(),
280
-            // Required if you include itemized cart details. (L_AMTn, etc.)
281
-            // Subtotal of items not including S&H, or tax.
282
-            'itemamt'      => $gateway_formatter->formatCurrency($item_amount),//
283
-            // Total shipping costs for the order.  If you specify shippingamt, you must also specify itemamt.
284
-            'shippingamt'  => '',
285
-            // Total handling costs for the order.  If you specify handlingamt, you must also specify itemamt.
286
-            'handlingamt'  => '',
287
-            // Required if you specify itemized cart tax details.
288
-            // Sum of tax for all items on the order.  Total sales tax.
289
-            'taxamt'       => $gateway_formatter->formatCurrency($tax_amount),
290
-            // Description of the order the customer is purchasing.  127 char max.
291
-            'desc'         => $order_description,
292
-            // Free-form field for your own use.  256 char max.
293
-            'custom'       => $primary_registrant ? $primary_registrant->ID() : '',
294
-            // Your own invoice or tracking number
295
-            'invnum'       => wp_generate_password(12, false),// $transaction->ID(),
296
-            // URL for receiving Instant Payment Notifications.  This overrides what your profile is set to use.
297
-            'notifyurl'    => '',
298
-            'buttonsource' => 'EventEspresso_SP',// EE will blow up if you change this
299
-        );
300
-        // Wrap all data arrays into a single, "master" array which will be passed into the class function.
301
-        $PayPalRequestData = array(
302
-            'DPFields'        => $DPFields,
303
-            'CCDetails'       => $CCDetails,
304
-            'PayerInfo'       => $PayerInfo,
305
-            'PayerName'       => $PayerName,
306
-            'BillingAddress'  => $BillingAddress,
307
-            'ShippingAddress' => $ShippingAddress,
308
-            'PaymentDetails'  => $PaymentDetails,
309
-            'OrderItems'      => $order_items,
310
-        );
311
-        $this->_log_clean_request($PayPalRequestData, $payment);
312
-        try {
313
-            $PayPalResult = $this->prep_and_curl_request($PayPalRequestData);
314
-            // remove PCI-sensitive data so it doesn't get stored
315
-            $PayPalResult = $this->_log_clean_response($PayPalResult, $payment);
316
-            if (isset($PayPalResult['L_ERRORCODE0']) && $PayPalResult['L_ERRORCODE0'] === '10002') {
317
-                $message = esc_html__('PayPal did not accept your API username, password, or signature. Please double-check these credentials and if debug mode is on.', 'event_espresso');
318
-            } elseif (isset($PayPalResult['L_LONGMESSAGE0'])) {
319
-                $message = $PayPalResult['L_LONGMESSAGE0'];
320
-            } else {
321
-                $message = $PayPalResult['ACK'];
322
-            }
323
-            if (empty($PayPalResult['RAWRESPONSE'])) {
324
-                $payment->set_status($this->_pay_model->failed_status());
325
-                $payment->set_gateway_response(esc_html__('No response received from Paypal Pro', 'event_espresso'));
326
-                $payment->set_details($PayPalResult);
327
-            } else {
328
-                if ($this->_APICallSuccessful($PayPalResult)) {
329
-                    $payment->set_status($this->_pay_model->approved_status());
330
-                } else {
331
-                    $payment->set_status($this->_pay_model->declined_status());
332
-                }
333
-                // make sure we interpret the AMT as a float, not an international string
334
-                // (where periods are thousand separators)
335
-                $payment->set_amount(isset($PayPalResult['AMT']) ? floatval($PayPalResult['AMT']) : 0);
336
-                $payment->set_gateway_response($message);
337
-                $payment->set_txn_id_chq_nmbr(isset($PayPalResult['TRANSACTIONID'])
338
-                    ? $PayPalResult['TRANSACTIONID']
339
-                    : null);
340
-                $primary_registration_code = $primary_registrant instanceof EE_Registration
341
-                    ? $primary_registrant->reg_code()
342
-                    : '';
343
-                $payment->set_extra_accntng($primary_registration_code);
344
-                $payment->set_details($PayPalResult);
345
-            }
346
-        } catch (Exception $e) {
347
-            $payment->set_status($this->_pay_model->failed_status());
348
-            $payment->set_gateway_response($e->getMessage());
349
-        }
350
-        // $payment->set_status( $this->_pay_model->declined_status() );
351
-        // $payment->set_gateway_response( '' );
352
-        return $payment;
353
-    }
354
-
355
-
356
-
357
-    /**
358
-     * CLeans out sensitive CC data and then logs it, and returns the cleaned request
359
-     *
360
-     * @param array       $request
361
-     * @param EEI_Payment $payment
362
-     * @return void
363
-     */
364
-    private function _log_clean_request($request, $payment)
365
-    {
366
-        $cleaned_request_data = $request;
367
-        unset($cleaned_request_data['CCDetails']['acct']);
368
-        unset($cleaned_request_data['CCDetails']['cvv2']);
369
-        unset($cleaned_request_data['CCDetails']['expdate']);
370
-        $this->log(array('Paypal Request' => $cleaned_request_data), $payment);
371
-    }
372
-
373
-
374
-
375
-    /**
376
-     * Cleans the response, logs it, and returns it
377
-     *
378
-     * @param array       $response
379
-     * @param EEI_Payment $payment
380
-     * @return array cleaned
381
-     */
382
-    private function _log_clean_response($response, $payment)
383
-    {
384
-        unset($response['REQUESTDATA']['CREDITCARDTYPE']);
385
-        unset($response['REQUESTDATA']['ACCT']);
386
-        unset($response['REQUESTDATA']['EXPDATE']);
387
-        unset($response['REQUESTDATA']['CVV2']);
388
-        unset($response['RAWREQUEST']);
389
-        $this->log(array('Paypal Response' => $response), $payment);
390
-        return $response;
391
-    }
392
-
393
-
394
-
395
-    /**
396
-     * @param $DataArray
397
-     * @return array
398
-     */
399
-    private function prep_and_curl_request($DataArray)
400
-    {
401
-        // Create empty holders for each portion of the NVP string
402
-        $DPFieldsNVP = '&METHOD=DoDirectPayment&BUTTONSOURCE=AngellEYE_PHP_Class_DDP';
403
-        $CCDetailsNVP = '';
404
-        $PayerInfoNVP = '';
405
-        $PayerNameNVP = '';
406
-        $BillingAddressNVP = '';
407
-        $ShippingAddressNVP = '';
408
-        $PaymentDetailsNVP = '';
409
-        $OrderItemsNVP = '';
410
-        $Secure3DNVP = '';
411
-        // DP Fields
412
-        $DPFields = isset($DataArray['DPFields']) ? $DataArray['DPFields'] : array();
413
-        foreach ($DPFields as $DPFieldsVar => $DPFieldsVal) {
414
-            $DPFieldsNVP .= '&' . strtoupper($DPFieldsVar) . '=' . urlencode($DPFieldsVal);
415
-        }
416
-        // CC Details Fields
417
-        $CCDetails = isset($DataArray['CCDetails']) ? $DataArray['CCDetails'] : array();
418
-        foreach ($CCDetails as $CCDetailsVar => $CCDetailsVal) {
419
-            $CCDetailsNVP .= '&' . strtoupper($CCDetailsVar) . '=' . urlencode($CCDetailsVal);
420
-        }
421
-        // PayerInfo Type Fields
422
-        $PayerInfo = isset($DataArray['PayerInfo']) ? $DataArray['PayerInfo'] : array();
423
-        foreach ($PayerInfo as $PayerInfoVar => $PayerInfoVal) {
424
-            $PayerInfoNVP .= '&' . strtoupper($PayerInfoVar) . '=' . urlencode($PayerInfoVal);
425
-        }
426
-        // Payer Name Fields
427
-        $PayerName = isset($DataArray['PayerName']) ? $DataArray['PayerName'] : array();
428
-        foreach ($PayerName as $PayerNameVar => $PayerNameVal) {
429
-            $PayerNameNVP .= '&' . strtoupper($PayerNameVar) . '=' . urlencode($PayerNameVal);
430
-        }
431
-        // Address Fields (Billing)
432
-        $BillingAddress = isset($DataArray['BillingAddress']) ? $DataArray['BillingAddress'] : array();
433
-        foreach ($BillingAddress as $BillingAddressVar => $BillingAddressVal) {
434
-            $BillingAddressNVP .= '&' . strtoupper($BillingAddressVar) . '=' . urlencode($BillingAddressVal);
435
-        }
436
-        // Payment Details Type Fields
437
-        $PaymentDetails = isset($DataArray['PaymentDetails']) ? $DataArray['PaymentDetails'] : array();
438
-        foreach ($PaymentDetails as $PaymentDetailsVar => $PaymentDetailsVal) {
439
-            $PaymentDetailsNVP .= '&' . strtoupper($PaymentDetailsVar) . '=' . urlencode($PaymentDetailsVal);
440
-        }
441
-        // Payment Details Item Type Fields
442
-        $OrderItems = isset($DataArray['OrderItems']) ? $DataArray['OrderItems'] : array();
443
-        $n = 0;
444
-        foreach ($OrderItems as $OrderItemsVar => $OrderItemsVal) {
445
-            $CurrentItem = $OrderItems[ $OrderItemsVar ];
446
-            foreach ($CurrentItem as $CurrentItemVar => $CurrentItemVal) {
447
-                $OrderItemsNVP .= '&' . strtoupper($CurrentItemVar) . $n . '=' . urlencode($CurrentItemVal);
448
-            }
449
-            $n++;
450
-        }
451
-        // Ship To Address Fields
452
-        $ShippingAddress = isset($DataArray['ShippingAddress']) ? $DataArray['ShippingAddress'] : array();
453
-        foreach ($ShippingAddress as $ShippingAddressVar => $ShippingAddressVal) {
454
-            $ShippingAddressNVP .= '&' . strtoupper($ShippingAddressVar) . '=' . urlencode($ShippingAddressVal);
455
-        }
456
-        // 3D Secure Fields
457
-        $Secure3D = isset($DataArray['Secure3D']) ? $DataArray['Secure3D'] : array();
458
-        foreach ($Secure3D as $Secure3DVar => $Secure3DVal) {
459
-            $Secure3DNVP .= '&' . strtoupper($Secure3DVar) . '=' . urlencode($Secure3DVal);
460
-        }
461
-        // Now that we have each chunk we need to go ahead and append them all together for our entire NVP string
462
-        $NVPRequest = 'USER='
463
-                      . $this->_api_username
464
-                      . '&PWD='
465
-                      . $this->_api_password
466
-                      . '&VERSION=64.0'
467
-                      . '&SIGNATURE='
468
-                      . $this->_api_signature
469
-                      . $DPFieldsNVP
470
-                      . $CCDetailsNVP
471
-                      . $PayerInfoNVP
472
-                      . $PayerNameNVP
473
-                      . $BillingAddressNVP
474
-                      . $PaymentDetailsNVP
475
-                      . $OrderItemsNVP
476
-                      . $ShippingAddressNVP
477
-                      . $Secure3DNVP;
478
-        $NVPResponse = $this->_CURLRequest($NVPRequest);
479
-        $NVPRequestArray = $this->_NVPToArray($NVPRequest);
480
-        $NVPResponseArray = $this->_NVPToArray($NVPResponse);
481
-        $Errors = $this->_GetErrors($NVPResponseArray);
482
-        $NVPResponseArray['ERRORS'] = $Errors;
483
-        $NVPResponseArray['REQUESTDATA'] = $NVPRequestArray;
484
-        $NVPResponseArray['RAWREQUEST'] = $NVPRequest;
485
-        $NVPResponseArray['RAWRESPONSE'] = $NVPResponse;
486
-        return $NVPResponseArray;
487
-    }
488
-
489
-
490
-
491
-    /**
492
-     * @param $Request
493
-     * @return mixed
494
-     */
495
-    private function _CURLRequest($Request)
496
-    {
497
-        $EndPointURL = $this->_debug_mode ? 'https://api-3t.sandbox.paypal.com/nvp' : 'https://api-3t.paypal.com/nvp';
498
-        $curl = curl_init();
499
-        curl_setopt($curl, CURLOPT_VERBOSE, apply_filters('FHEE__EEG_Paypal_Pro__CurlRequest__CURLOPT_VERBOSE', true));
500
-        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
501
-        curl_setopt($curl, CURLOPT_TIMEOUT, 60);
502
-        curl_setopt($curl, CURLOPT_URL, $EndPointURL);
503
-        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
504
-        curl_setopt($curl, CURLOPT_POSTFIELDS, $Request);
505
-        curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
506
-        // execute the curl POST
507
-        $Response = curl_exec($curl);
508
-        curl_close($curl);
509
-        return $Response;
510
-    }
511
-
512
-
513
-
514
-    /**
515
-     * @param $NVPString
516
-     * @return array
517
-     */
518
-    private function _NVPToArray($NVPString)
519
-    {
520
-        // prepare responses into array
521
-        $proArray = array();
522
-        while (strlen($NVPString)) {
523
-            // name
524
-            $keypos = strpos($NVPString, '=');
525
-            $keyval = substr($NVPString, 0, $keypos);
526
-            // value
527
-            $valuepos = strpos($NVPString, '&') ? strpos($NVPString, '&') : strlen($NVPString);
528
-            $valval = substr($NVPString, $keypos + 1, $valuepos - $keypos - 1);
529
-            // decoding the response
530
-            $proArray[ $keyval ] = urldecode($valval);
531
-            $NVPString = substr($NVPString, $valuepos + 1, strlen($NVPString));
532
-        }
533
-        return $proArray;
534
-    }
535
-
536
-
537
-
538
-    /**
539
-     * @param array $PayPalResult
540
-     * @return bool
541
-     */
542
-    private function _APICallSuccessful($PayPalResult)
543
-    {
544
-        $approved = false;
545
-        // check main response message from PayPal
546
-        if (isset($PayPalResult['ACK']) && ! empty($PayPalResult['ACK'])) {
547
-            $ack = strtoupper($PayPalResult['ACK']);
548
-            $approved = ($ack == 'SUCCESS' || $ack == 'SUCCESSWITHWARNING' || $ack == 'PARTIALSUCCESS') ? true : false;
549
-        }
550
-        return $approved;
551
-    }
552
-
553
-
554
-
555
-    /**
556
-     * @param $DataArray
557
-     * @return array
558
-     */
559
-    private function _GetErrors($DataArray)
560
-    {
561
-        $Errors = array();
562
-        $n = 0;
563
-        while (isset($DataArray[ 'L_ERRORCODE' . $n . '' ])) {
564
-            $LErrorCode = isset($DataArray[ 'L_ERRORCODE' . $n . '' ]) ? $DataArray[ 'L_ERRORCODE' . $n . '' ] : '';
565
-            $LShortMessage = isset($DataArray[ 'L_SHORTMESSAGE' . $n . '' ])
566
-                ? $DataArray[ 'L_SHORTMESSAGE' . $n . '' ]
567
-                : '';
568
-            $LLongMessage = isset($DataArray[ 'L_LONGMESSAGE' . $n . '' ])
569
-                ? $DataArray[ 'L_LONGMESSAGE' . $n . '' ]
570
-                : '';
571
-            $LSeverityCode = isset($DataArray[ 'L_SEVERITYCODE' . $n . '' ])
572
-                ? $DataArray[ 'L_SEVERITYCODE' . $n . '' ]
573
-                : '';
574
-            $CurrentItem = array(
575
-                'L_ERRORCODE'    => $LErrorCode,
576
-                'L_SHORTMESSAGE' => $LShortMessage,
577
-                'L_LONGMESSAGE'  => $LLongMessage,
578
-                'L_SEVERITYCODE' => $LSeverityCode,
579
-            );
580
-            array_push($Errors, $CurrentItem);
581
-            $n++;
582
-        }
583
-        return $Errors;
584
-    }
585
-
586
-
587
-
588
-    /**
589
-     *        nothing to see here...  move along....
590
-     *
591
-     * @access protected
592
-     * @param $Errors
593
-     * @return string
594
-     */
595
-    private function _DisplayErrors($Errors)
596
-    {
597
-        $error = '';
598
-        foreach ($Errors as $ErrorVar => $ErrorVal) {
599
-            $CurrentError = $Errors[ $ErrorVar ];
600
-            foreach ($CurrentError as $CurrentErrorVar => $CurrentErrorVal) {
601
-                $CurrentVarName = '';
602
-                if ($CurrentErrorVar == 'L_ERRORCODE') {
603
-                    $CurrentVarName = 'Error Code';
604
-                } elseif ($CurrentErrorVar == 'L_SHORTMESSAGE') {
605
-                    $CurrentVarName = 'Short Message';
606
-                } elseif ($CurrentErrorVar == 'L_LONGMESSAGE') {
607
-                    $CurrentVarName = 'Long Message';
608
-                } elseif ($CurrentErrorVar == 'L_SEVERITYCODE') {
609
-                    $CurrentVarName = 'Severity Code';
610
-                }
611
-                $error .= '<br />' . $CurrentVarName . ': ' . $CurrentErrorVal;
612
-            }
613
-        }
614
-        return $error;
615
-    }
14
+	/**
15
+	 * @var $_paypal_api_username string
16
+	 */
17
+	protected $_api_username = null;
18
+
19
+	/**
20
+	 * @var $_api_password string
21
+	 */
22
+	protected $_api_password = null;
23
+
24
+	/**
25
+	 * @var $_api_signature string
26
+	 */
27
+	protected $_api_signature = null;
28
+
29
+	/**
30
+	 * @var $_credit_card_types array with the keys for credit card types accepted on this account
31
+	 */
32
+	protected $_credit_card_types    = null;
33
+
34
+	protected $_currencies_supported = array(
35
+		'USD',
36
+		'GBP',
37
+		'CAD',
38
+		'AUD',
39
+		'BRL',
40
+		'CHF',
41
+		'CZK',
42
+		'DKK',
43
+		'EUR',
44
+		'HKD',
45
+		'HUF',
46
+		'ILS',
47
+		'JPY',
48
+		'MXN',
49
+		'MYR',
50
+		'NOK',
51
+		'NZD',
52
+		'PHP',
53
+		'PLN',
54
+		'SEK',
55
+		'SGD',
56
+		'THB',
57
+		'TRY',
58
+		'TWD',
59
+		'RUB',
60
+		'INR',
61
+	);
62
+
63
+
64
+
65
+	/**
66
+	 * @param EEI_Payment $payment
67
+	 * @param array       $billing_info {
68
+	 * @type string $credit_card
69
+	 * @type string $credit_card_type
70
+	 * @type string $exp_month always 2 characters
71
+	 * @type string $exp_year always 4 characters
72
+	 * @type string $cvv
73
+	 * }
74
+	 * @see      parent::do_direct_payment for more info
75
+	 * @return EE_Payment|EEI_Payment
76
+	 * @throws EE_Error
77
+	 */
78
+	public function do_direct_payment($payment, $billing_info = null)
79
+	{
80
+		$transaction = $payment->transaction();
81
+		if (! $transaction instanceof EEI_Transaction) {
82
+			throw new EE_Error(
83
+				esc_html__('No transaction for payment while paying with PayPal Pro.', 'event_espresso')
84
+			);
85
+		}
86
+		$primary_registrant = $transaction->primary_registration();
87
+		if (! $primary_registrant instanceof EEI_Registration) {
88
+			throw new EE_Error(
89
+				esc_html__(
90
+					'No primary registration on transaction while paying with PayPal Pro.',
91
+					'event_espresso'
92
+				)
93
+			);
94
+		}
95
+		$attendee = $primary_registrant->attendee();
96
+		if (! $attendee instanceof EEI_Attendee) {
97
+			throw new EE_Error(
98
+				esc_html__(
99
+					'No attendee on primary registration while paying with PayPal Pro.',
100
+					'event_espresso'
101
+				)
102
+			);
103
+		}
104
+		$gateway_formatter = $this->_get_gateway_formatter();
105
+		$order_description = substr($gateway_formatter->formatOrderDescription($payment), 0, 127);
106
+		// charge for the full amount. Show itemized list
107
+		if ($this->_money->compare_floats($payment->amount(), $transaction->total(), '==')) {
108
+			$item_num = 1;
109
+			$total_line_item = $transaction->total_line_item();
110
+			$order_items = array();
111
+			foreach ($total_line_item->get_items() as $line_item) {
112
+				// ignore line items with a quantity of 0
113
+				if ($line_item->quantity() == 0) {
114
+					continue;
115
+				}
116
+				// For percent items, whose unit_price is 0, use the total instead.
117
+				if ($line_item->is_percent()) {
118
+					$unit_price = $line_item->total();
119
+					$line_item_quantity = 1;
120
+				} else {
121
+					$unit_price = $line_item->unit_price();
122
+					$line_item_quantity = $line_item->quantity();
123
+				}
124
+				$item = array(
125
+					// Item Name.  127 char max.
126
+					'l_name'                 => substr(
127
+						$gateway_formatter->formatLineItemName($line_item, $payment),
128
+						0,
129
+						127
130
+					),
131
+					// Item description.  127 char max.
132
+					'l_desc'                 => substr(
133
+						$gateway_formatter->formatLineItemDesc($line_item, $payment),
134
+						0,
135
+						127
136
+					),
137
+					// Cost of individual item.
138
+					'l_amt'                  => $unit_price,
139
+					// Item Number.  127 char max.
140
+					'l_number'               => $item_num++,
141
+					// Item quantity.  Must be any positive integer.
142
+					'l_qty'                  => $line_item_quantity,
143
+					// Item's sales tax amount.
144
+					'l_taxamt'               => '',
145
+					// eBay auction number of item.
146
+					'l_ebayitemnumber'       => '',
147
+					// eBay transaction ID of purchased item.
148
+					'l_ebayitemauctiontxnid' => '',
149
+					// eBay order ID for the item.
150
+					'l_ebayitemorderid'      => '',
151
+				);
152
+				// add to array of all items
153
+				array_push($order_items, $item);
154
+			}
155
+			$item_amount = $total_line_item->get_items_total();
156
+			$tax_amount = $total_line_item->get_total_tax();
157
+		} else {
158
+			$order_items = array();
159
+			$item_amount = $payment->amount();
160
+			$tax_amount = 0;
161
+			array_push($order_items, array(
162
+				// Item Name.  127 char max.
163
+				'l_name'   => substr(
164
+					$gateway_formatter->formatPartialPaymentLineItemName($payment),
165
+					0,
166
+					127
167
+				),
168
+				// Item description.  127 char max.
169
+				'l_desc'   => substr(
170
+					$gateway_formatter->formatPartialPaymentLineItemDesc($payment),
171
+					0,
172
+					127
173
+				),
174
+				// Cost of individual item.
175
+				'l_amt'    => $payment->amount(),
176
+				// Item Number.  127 char max.
177
+				'l_number' => 1,
178
+				// Item quantity.  Must be any positive integer.
179
+				'l_qty'    => 1,
180
+			));
181
+		}
182
+		// Populate data arrays with order data.
183
+		$DPFields = array(
184
+			// How you want to obtain payment ?
185
+			// Authorization indicates the payment is a basic auth subject to settlement with Auth & Capture.
186
+			// Sale indicates that this is a final sale for which you are requesting payment.  Default is Sale.
187
+			'paymentaction'    => 'Sale',
188
+			// Required.  IP address of the payer's browser.
189
+			'ipaddress'        => $_SERVER['REMOTE_ADDR'],
190
+			// Flag to determine whether you want the results returned by FMF.  1 or 0.  Default is 0.
191
+			'returnfmfdetails' => '1',
192
+		);
193
+		$CCDetails = array(
194
+			// Required. Type of credit card.  Visa, MasterCard, Discover, Amex, Maestro, Solo.
195
+			// If Maestro or Solo, the currency code must be GBP.
196
+			//  In addition, either start date or issue number must be specified.
197
+			'creditcardtype' => $billing_info['credit_card_type'],
198
+			// Required.  Credit card number.  No spaces or punctuation.
199
+			'acct'           => $billing_info['credit_card'],
200
+			// Required.  Credit card expiration date.  Format is MMYYYY
201
+			'expdate'        => $billing_info['exp_month'] . $billing_info['exp_year'],
202
+			// Requirements determined by your PayPal account settings.  Security digits for credit card.
203
+			'cvv2'           => $billing_info['cvv'],
204
+		);
205
+		$PayerInfo = array(
206
+			// Email address of payer.
207
+			'email'       => $billing_info['email'],
208
+			// Unique PayPal customer ID for payer.
209
+			'payerid'     => '',
210
+			// Status of payer.  Values are verified or unverified
211
+			'payerstatus' => '',
212
+			// Payer's business name.
213
+			'business'    => '',
214
+		);
215
+		$PayerName = array(
216
+			// Payer's salutation.  20 char max.
217
+			'salutation' => '',
218
+			// Payer's first name.  25 char max.
219
+			'firstname'  => substr($billing_info['first_name'], 0, 25),
220
+			// Payer's middle name.  25 char max.
221
+			'middlename' => '',
222
+			// Payer's last name.  25 char max.
223
+			'lastname'   => substr($billing_info['last_name'], 0, 25),
224
+			// Payer's suffix.  12 char max.
225
+			'suffix'     => '',
226
+		);
227
+		$BillingAddress = array(
228
+			// Required.  First street address.
229
+			'street'      => $billing_info['address'],
230
+			// Second street address.
231
+			'street2'     => $billing_info['address2'],
232
+			// Required.  Name of City.
233
+			'city'        => $billing_info['city'],
234
+			// Required. Name of State or Province.
235
+			'state'       => substr($billing_info['state'], 0, 40),
236
+			// Required.  Country code.
237
+			'countrycode' => $billing_info['country'],
238
+			// Required.  Postal code of payer.
239
+			'zip'         => $billing_info['zip'],
240
+		);
241
+		// check if the registration info contains the needed fields for paypal pro
242
+		// (see https://developer.paypal.com/docs/classic/api/merchant/DoDirectPayment_API_Operation_NVP/)
243
+		if ($attendee->address() && $attendee->city() && $attendee->country_ID()) {
244
+			$use_registration_address_info = true;
245
+		} else {
246
+			$use_registration_address_info = false;
247
+		}
248
+		// so if the attendee has enough data to fill out PayPal Pro's shipping info, use it.
249
+		// If not, use the billing info again
250
+		$ShippingAddress = array(
251
+			'shiptoname'     => substr($use_registration_address_info
252
+				? $attendee->full_name()
253
+				: $billing_info['first_name'] . ' ' . $billing_info['last_name'], 0, 32),
254
+			'shiptostreet'   => substr($use_registration_address_info
255
+				? $attendee->address()
256
+				: $billing_info['address'], 0, 100),
257
+			'shiptostreet2'  => substr($use_registration_address_info
258
+				? $attendee->address2() : $billing_info['address2'], 0, 100),
259
+			'shiptocity'     => substr($use_registration_address_info
260
+				? $attendee->city()
261
+				: $billing_info['city'], 0, 40),
262
+			'shiptostate'          => substr($use_registration_address_info
263
+				? $attendee->state_name()
264
+				: $billing_info['state'], 0, 40),
265
+			'shiptocountry'  => $use_registration_address_info
266
+				? $attendee->country_ID()
267
+				: $billing_info['country'],
268
+			'shiptozip'      => substr($use_registration_address_info
269
+				? $attendee->zip()
270
+				: $billing_info['zip'], 0, 20),
271
+			'shiptophonenum' => substr($use_registration_address_info
272
+				? $attendee->phone()
273
+				: $billing_info['phone'], 0, 20),
274
+		);
275
+		$PaymentDetails = array(
276
+			// Required.  Total amount of order, including shipping, handling, and tax.
277
+			'amt'          => $gateway_formatter->formatCurrency($payment->amount()),
278
+			// Required.  Three-letter currency code.  Default is USD.
279
+			'currencycode' => $payment->currency_code(),
280
+			// Required if you include itemized cart details. (L_AMTn, etc.)
281
+			// Subtotal of items not including S&H, or tax.
282
+			'itemamt'      => $gateway_formatter->formatCurrency($item_amount),//
283
+			// Total shipping costs for the order.  If you specify shippingamt, you must also specify itemamt.
284
+			'shippingamt'  => '',
285
+			// Total handling costs for the order.  If you specify handlingamt, you must also specify itemamt.
286
+			'handlingamt'  => '',
287
+			// Required if you specify itemized cart tax details.
288
+			// Sum of tax for all items on the order.  Total sales tax.
289
+			'taxamt'       => $gateway_formatter->formatCurrency($tax_amount),
290
+			// Description of the order the customer is purchasing.  127 char max.
291
+			'desc'         => $order_description,
292
+			// Free-form field for your own use.  256 char max.
293
+			'custom'       => $primary_registrant ? $primary_registrant->ID() : '',
294
+			// Your own invoice or tracking number
295
+			'invnum'       => wp_generate_password(12, false),// $transaction->ID(),
296
+			// URL for receiving Instant Payment Notifications.  This overrides what your profile is set to use.
297
+			'notifyurl'    => '',
298
+			'buttonsource' => 'EventEspresso_SP',// EE will blow up if you change this
299
+		);
300
+		// Wrap all data arrays into a single, "master" array which will be passed into the class function.
301
+		$PayPalRequestData = array(
302
+			'DPFields'        => $DPFields,
303
+			'CCDetails'       => $CCDetails,
304
+			'PayerInfo'       => $PayerInfo,
305
+			'PayerName'       => $PayerName,
306
+			'BillingAddress'  => $BillingAddress,
307
+			'ShippingAddress' => $ShippingAddress,
308
+			'PaymentDetails'  => $PaymentDetails,
309
+			'OrderItems'      => $order_items,
310
+		);
311
+		$this->_log_clean_request($PayPalRequestData, $payment);
312
+		try {
313
+			$PayPalResult = $this->prep_and_curl_request($PayPalRequestData);
314
+			// remove PCI-sensitive data so it doesn't get stored
315
+			$PayPalResult = $this->_log_clean_response($PayPalResult, $payment);
316
+			if (isset($PayPalResult['L_ERRORCODE0']) && $PayPalResult['L_ERRORCODE0'] === '10002') {
317
+				$message = esc_html__('PayPal did not accept your API username, password, or signature. Please double-check these credentials and if debug mode is on.', 'event_espresso');
318
+			} elseif (isset($PayPalResult['L_LONGMESSAGE0'])) {
319
+				$message = $PayPalResult['L_LONGMESSAGE0'];
320
+			} else {
321
+				$message = $PayPalResult['ACK'];
322
+			}
323
+			if (empty($PayPalResult['RAWRESPONSE'])) {
324
+				$payment->set_status($this->_pay_model->failed_status());
325
+				$payment->set_gateway_response(esc_html__('No response received from Paypal Pro', 'event_espresso'));
326
+				$payment->set_details($PayPalResult);
327
+			} else {
328
+				if ($this->_APICallSuccessful($PayPalResult)) {
329
+					$payment->set_status($this->_pay_model->approved_status());
330
+				} else {
331
+					$payment->set_status($this->_pay_model->declined_status());
332
+				}
333
+				// make sure we interpret the AMT as a float, not an international string
334
+				// (where periods are thousand separators)
335
+				$payment->set_amount(isset($PayPalResult['AMT']) ? floatval($PayPalResult['AMT']) : 0);
336
+				$payment->set_gateway_response($message);
337
+				$payment->set_txn_id_chq_nmbr(isset($PayPalResult['TRANSACTIONID'])
338
+					? $PayPalResult['TRANSACTIONID']
339
+					: null);
340
+				$primary_registration_code = $primary_registrant instanceof EE_Registration
341
+					? $primary_registrant->reg_code()
342
+					: '';
343
+				$payment->set_extra_accntng($primary_registration_code);
344
+				$payment->set_details($PayPalResult);
345
+			}
346
+		} catch (Exception $e) {
347
+			$payment->set_status($this->_pay_model->failed_status());
348
+			$payment->set_gateway_response($e->getMessage());
349
+		}
350
+		// $payment->set_status( $this->_pay_model->declined_status() );
351
+		// $payment->set_gateway_response( '' );
352
+		return $payment;
353
+	}
354
+
355
+
356
+
357
+	/**
358
+	 * CLeans out sensitive CC data and then logs it, and returns the cleaned request
359
+	 *
360
+	 * @param array       $request
361
+	 * @param EEI_Payment $payment
362
+	 * @return void
363
+	 */
364
+	private function _log_clean_request($request, $payment)
365
+	{
366
+		$cleaned_request_data = $request;
367
+		unset($cleaned_request_data['CCDetails']['acct']);
368
+		unset($cleaned_request_data['CCDetails']['cvv2']);
369
+		unset($cleaned_request_data['CCDetails']['expdate']);
370
+		$this->log(array('Paypal Request' => $cleaned_request_data), $payment);
371
+	}
372
+
373
+
374
+
375
+	/**
376
+	 * Cleans the response, logs it, and returns it
377
+	 *
378
+	 * @param array       $response
379
+	 * @param EEI_Payment $payment
380
+	 * @return array cleaned
381
+	 */
382
+	private function _log_clean_response($response, $payment)
383
+	{
384
+		unset($response['REQUESTDATA']['CREDITCARDTYPE']);
385
+		unset($response['REQUESTDATA']['ACCT']);
386
+		unset($response['REQUESTDATA']['EXPDATE']);
387
+		unset($response['REQUESTDATA']['CVV2']);
388
+		unset($response['RAWREQUEST']);
389
+		$this->log(array('Paypal Response' => $response), $payment);
390
+		return $response;
391
+	}
392
+
393
+
394
+
395
+	/**
396
+	 * @param $DataArray
397
+	 * @return array
398
+	 */
399
+	private function prep_and_curl_request($DataArray)
400
+	{
401
+		// Create empty holders for each portion of the NVP string
402
+		$DPFieldsNVP = '&METHOD=DoDirectPayment&BUTTONSOURCE=AngellEYE_PHP_Class_DDP';
403
+		$CCDetailsNVP = '';
404
+		$PayerInfoNVP = '';
405
+		$PayerNameNVP = '';
406
+		$BillingAddressNVP = '';
407
+		$ShippingAddressNVP = '';
408
+		$PaymentDetailsNVP = '';
409
+		$OrderItemsNVP = '';
410
+		$Secure3DNVP = '';
411
+		// DP Fields
412
+		$DPFields = isset($DataArray['DPFields']) ? $DataArray['DPFields'] : array();
413
+		foreach ($DPFields as $DPFieldsVar => $DPFieldsVal) {
414
+			$DPFieldsNVP .= '&' . strtoupper($DPFieldsVar) . '=' . urlencode($DPFieldsVal);
415
+		}
416
+		// CC Details Fields
417
+		$CCDetails = isset($DataArray['CCDetails']) ? $DataArray['CCDetails'] : array();
418
+		foreach ($CCDetails as $CCDetailsVar => $CCDetailsVal) {
419
+			$CCDetailsNVP .= '&' . strtoupper($CCDetailsVar) . '=' . urlencode($CCDetailsVal);
420
+		}
421
+		// PayerInfo Type Fields
422
+		$PayerInfo = isset($DataArray['PayerInfo']) ? $DataArray['PayerInfo'] : array();
423
+		foreach ($PayerInfo as $PayerInfoVar => $PayerInfoVal) {
424
+			$PayerInfoNVP .= '&' . strtoupper($PayerInfoVar) . '=' . urlencode($PayerInfoVal);
425
+		}
426
+		// Payer Name Fields
427
+		$PayerName = isset($DataArray['PayerName']) ? $DataArray['PayerName'] : array();
428
+		foreach ($PayerName as $PayerNameVar => $PayerNameVal) {
429
+			$PayerNameNVP .= '&' . strtoupper($PayerNameVar) . '=' . urlencode($PayerNameVal);
430
+		}
431
+		// Address Fields (Billing)
432
+		$BillingAddress = isset($DataArray['BillingAddress']) ? $DataArray['BillingAddress'] : array();
433
+		foreach ($BillingAddress as $BillingAddressVar => $BillingAddressVal) {
434
+			$BillingAddressNVP .= '&' . strtoupper($BillingAddressVar) . '=' . urlencode($BillingAddressVal);
435
+		}
436
+		// Payment Details Type Fields
437
+		$PaymentDetails = isset($DataArray['PaymentDetails']) ? $DataArray['PaymentDetails'] : array();
438
+		foreach ($PaymentDetails as $PaymentDetailsVar => $PaymentDetailsVal) {
439
+			$PaymentDetailsNVP .= '&' . strtoupper($PaymentDetailsVar) . '=' . urlencode($PaymentDetailsVal);
440
+		}
441
+		// Payment Details Item Type Fields
442
+		$OrderItems = isset($DataArray['OrderItems']) ? $DataArray['OrderItems'] : array();
443
+		$n = 0;
444
+		foreach ($OrderItems as $OrderItemsVar => $OrderItemsVal) {
445
+			$CurrentItem = $OrderItems[ $OrderItemsVar ];
446
+			foreach ($CurrentItem as $CurrentItemVar => $CurrentItemVal) {
447
+				$OrderItemsNVP .= '&' . strtoupper($CurrentItemVar) . $n . '=' . urlencode($CurrentItemVal);
448
+			}
449
+			$n++;
450
+		}
451
+		// Ship To Address Fields
452
+		$ShippingAddress = isset($DataArray['ShippingAddress']) ? $DataArray['ShippingAddress'] : array();
453
+		foreach ($ShippingAddress as $ShippingAddressVar => $ShippingAddressVal) {
454
+			$ShippingAddressNVP .= '&' . strtoupper($ShippingAddressVar) . '=' . urlencode($ShippingAddressVal);
455
+		}
456
+		// 3D Secure Fields
457
+		$Secure3D = isset($DataArray['Secure3D']) ? $DataArray['Secure3D'] : array();
458
+		foreach ($Secure3D as $Secure3DVar => $Secure3DVal) {
459
+			$Secure3DNVP .= '&' . strtoupper($Secure3DVar) . '=' . urlencode($Secure3DVal);
460
+		}
461
+		// Now that we have each chunk we need to go ahead and append them all together for our entire NVP string
462
+		$NVPRequest = 'USER='
463
+					  . $this->_api_username
464
+					  . '&PWD='
465
+					  . $this->_api_password
466
+					  . '&VERSION=64.0'
467
+					  . '&SIGNATURE='
468
+					  . $this->_api_signature
469
+					  . $DPFieldsNVP
470
+					  . $CCDetailsNVP
471
+					  . $PayerInfoNVP
472
+					  . $PayerNameNVP
473
+					  . $BillingAddressNVP
474
+					  . $PaymentDetailsNVP
475
+					  . $OrderItemsNVP
476
+					  . $ShippingAddressNVP
477
+					  . $Secure3DNVP;
478
+		$NVPResponse = $this->_CURLRequest($NVPRequest);
479
+		$NVPRequestArray = $this->_NVPToArray($NVPRequest);
480
+		$NVPResponseArray = $this->_NVPToArray($NVPResponse);
481
+		$Errors = $this->_GetErrors($NVPResponseArray);
482
+		$NVPResponseArray['ERRORS'] = $Errors;
483
+		$NVPResponseArray['REQUESTDATA'] = $NVPRequestArray;
484
+		$NVPResponseArray['RAWREQUEST'] = $NVPRequest;
485
+		$NVPResponseArray['RAWRESPONSE'] = $NVPResponse;
486
+		return $NVPResponseArray;
487
+	}
488
+
489
+
490
+
491
+	/**
492
+	 * @param $Request
493
+	 * @return mixed
494
+	 */
495
+	private function _CURLRequest($Request)
496
+	{
497
+		$EndPointURL = $this->_debug_mode ? 'https://api-3t.sandbox.paypal.com/nvp' : 'https://api-3t.paypal.com/nvp';
498
+		$curl = curl_init();
499
+		curl_setopt($curl, CURLOPT_VERBOSE, apply_filters('FHEE__EEG_Paypal_Pro__CurlRequest__CURLOPT_VERBOSE', true));
500
+		curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
501
+		curl_setopt($curl, CURLOPT_TIMEOUT, 60);
502
+		curl_setopt($curl, CURLOPT_URL, $EndPointURL);
503
+		curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
504
+		curl_setopt($curl, CURLOPT_POSTFIELDS, $Request);
505
+		curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
506
+		// execute the curl POST
507
+		$Response = curl_exec($curl);
508
+		curl_close($curl);
509
+		return $Response;
510
+	}
511
+
512
+
513
+
514
+	/**
515
+	 * @param $NVPString
516
+	 * @return array
517
+	 */
518
+	private function _NVPToArray($NVPString)
519
+	{
520
+		// prepare responses into array
521
+		$proArray = array();
522
+		while (strlen($NVPString)) {
523
+			// name
524
+			$keypos = strpos($NVPString, '=');
525
+			$keyval = substr($NVPString, 0, $keypos);
526
+			// value
527
+			$valuepos = strpos($NVPString, '&') ? strpos($NVPString, '&') : strlen($NVPString);
528
+			$valval = substr($NVPString, $keypos + 1, $valuepos - $keypos - 1);
529
+			// decoding the response
530
+			$proArray[ $keyval ] = urldecode($valval);
531
+			$NVPString = substr($NVPString, $valuepos + 1, strlen($NVPString));
532
+		}
533
+		return $proArray;
534
+	}
535
+
536
+
537
+
538
+	/**
539
+	 * @param array $PayPalResult
540
+	 * @return bool
541
+	 */
542
+	private function _APICallSuccessful($PayPalResult)
543
+	{
544
+		$approved = false;
545
+		// check main response message from PayPal
546
+		if (isset($PayPalResult['ACK']) && ! empty($PayPalResult['ACK'])) {
547
+			$ack = strtoupper($PayPalResult['ACK']);
548
+			$approved = ($ack == 'SUCCESS' || $ack == 'SUCCESSWITHWARNING' || $ack == 'PARTIALSUCCESS') ? true : false;
549
+		}
550
+		return $approved;
551
+	}
552
+
553
+
554
+
555
+	/**
556
+	 * @param $DataArray
557
+	 * @return array
558
+	 */
559
+	private function _GetErrors($DataArray)
560
+	{
561
+		$Errors = array();
562
+		$n = 0;
563
+		while (isset($DataArray[ 'L_ERRORCODE' . $n . '' ])) {
564
+			$LErrorCode = isset($DataArray[ 'L_ERRORCODE' . $n . '' ]) ? $DataArray[ 'L_ERRORCODE' . $n . '' ] : '';
565
+			$LShortMessage = isset($DataArray[ 'L_SHORTMESSAGE' . $n . '' ])
566
+				? $DataArray[ 'L_SHORTMESSAGE' . $n . '' ]
567
+				: '';
568
+			$LLongMessage = isset($DataArray[ 'L_LONGMESSAGE' . $n . '' ])
569
+				? $DataArray[ 'L_LONGMESSAGE' . $n . '' ]
570
+				: '';
571
+			$LSeverityCode = isset($DataArray[ 'L_SEVERITYCODE' . $n . '' ])
572
+				? $DataArray[ 'L_SEVERITYCODE' . $n . '' ]
573
+				: '';
574
+			$CurrentItem = array(
575
+				'L_ERRORCODE'    => $LErrorCode,
576
+				'L_SHORTMESSAGE' => $LShortMessage,
577
+				'L_LONGMESSAGE'  => $LLongMessage,
578
+				'L_SEVERITYCODE' => $LSeverityCode,
579
+			);
580
+			array_push($Errors, $CurrentItem);
581
+			$n++;
582
+		}
583
+		return $Errors;
584
+	}
585
+
586
+
587
+
588
+	/**
589
+	 *        nothing to see here...  move along....
590
+	 *
591
+	 * @access protected
592
+	 * @param $Errors
593
+	 * @return string
594
+	 */
595
+	private function _DisplayErrors($Errors)
596
+	{
597
+		$error = '';
598
+		foreach ($Errors as $ErrorVar => $ErrorVal) {
599
+			$CurrentError = $Errors[ $ErrorVar ];
600
+			foreach ($CurrentError as $CurrentErrorVar => $CurrentErrorVal) {
601
+				$CurrentVarName = '';
602
+				if ($CurrentErrorVar == 'L_ERRORCODE') {
603
+					$CurrentVarName = 'Error Code';
604
+				} elseif ($CurrentErrorVar == 'L_SHORTMESSAGE') {
605
+					$CurrentVarName = 'Short Message';
606
+				} elseif ($CurrentErrorVar == 'L_LONGMESSAGE') {
607
+					$CurrentVarName = 'Long Message';
608
+				} elseif ($CurrentErrorVar == 'L_SEVERITYCODE') {
609
+					$CurrentVarName = 'Severity Code';
610
+				}
611
+				$error .= '<br />' . $CurrentVarName . ': ' . $CurrentErrorVal;
612
+			}
613
+		}
614
+		return $error;
615
+	}
616 616
 }
Please login to merge, or discard this patch.
caffeinated/payment_methods/Paypal_Pro/EE_PMT_Paypal_Pro.pm.php 2 patches
Indentation   +178 added lines, -178 removed lines patch added patch discarded remove patch
@@ -14,182 +14,182 @@
 block discarded – undo
14 14
 class EE_PMT_Paypal_Pro extends EE_PMT_Base
15 15
 {
16 16
 
17
-    /**
18
-     * @param EE_Payment_Method $pm_instance
19
-     * @return EE_PMT_Paypal_Pro
20
-     */
21
-    public function __construct($pm_instance = null)
22
-    {
23
-        require_once($this->file_folder().'EEG_Paypal_Pro.gateway.php');
24
-        $this->_gateway = new EEG_Paypal_Pro();
25
-        $this->_pretty_name = esc_html__("Paypal Pro", 'event_espresso');
26
-        $this->_default_description = esc_html__('Please provide the following billing information.', 'event_espresso');
27
-        $this->_requires_https = true;
28
-        parent::__construct($pm_instance);
29
-    }
30
-
31
-
32
-    /**
33
-     * Gets the form for all the settings related to this payment method type
34
-     * @return EE_Payment_Method_Form
35
-     * @throws InvalidArgumentException
36
-     * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
37
-     * @throws \EventEspresso\core\exceptions\InvalidInterfaceException
38
-     */
39
-    public function generate_new_settings_form()
40
-    {
41
-        return new PayPalProSettingsForm(array(), $this->get_help_tab_link());
42
-    }
43
-
44
-
45
-    /**
46
-     * Creates the billing form for this payment method type
47
-     * @param \EE_Transaction $transaction
48
-     * @throws \EE_Error
49
-     * @return EE_Billing_Info_Form
50
-     */
51
-    public function generate_new_billing_form(EE_Transaction $transaction = null)
52
-    {
53
-        $allowed_types = $this->_pm_instance->get_extra_meta('credit_card_types', true);
54
-        // if allowed types is a string or empty array or null...
55
-        if (empty($allowed_types)) {
56
-            $allowed_types = array();
57
-        }
58
-
59
-        $billing_form = new EE_Billing_Attendee_Info_Form(
60
-            $this->_pm_instance,
61
-            array(
62
-                'name'=> 'Paypal_Pro_Billing_Form',
63
-            //              'html_id'=> 'ee-Paypal_Pro-billing-form',
64
-                'subsections'=>array(
65
-                    'credit_card'=>new EE_Credit_Card_Input(
66
-                        array( 'required'=>true, 'html_class' => 'ee-billing-qstn', 'html_label_text' => esc_html__('Card Number', 'event_espresso'))
67
-                    ),
68
-                    'credit_card_type'=>new EE_Select_Input(
69
-                        // the options are set dynamically
70
-                        array_intersect_key(EE_PMT_Paypal_Pro::card_types_supported(), array_flip($allowed_types)),
71
-                        array( 'required'=>true, 'html_class' => 'ee-billing-qstn', 'html_label_text' => esc_html__('Card Type', 'event_espresso'))
72
-                    ),
73
-                    'exp_month'=>new EE_Credit_Card_Month_Input(
74
-                        true,
75
-                        array( 'required'=>true, 'html_class' => 'ee-billing-qstn', 'html_label_text' =>  esc_html__('Expiry Month', 'event_espresso')  )
76
-                    ),
77
-                    'exp_year'=>new EE_Credit_Card_Year_Input(
78
-                        array( 'required'=>true, 'html_class' => 'ee-billing-qstn', 'html_label_text' => esc_html__('Expiry Year', 'event_espresso')  )
79
-                    ),
80
-                    'cvv'=>new EE_CVV_Input(
81
-                        array( 'required'=>true, 'html_class' => 'ee-billing-qstn', 'html_label_text' => esc_html__('CVV', 'event_espresso') )
82
-                    ),
83
-                )
84
-            )
85
-        );
86
-        return $this->apply_billing_form_debug_settings($billing_form);
87
-    }
88
-
89
-
90
-
91
-    /**
92
-     * apply_billing_form_debug_settings
93
-     * applies debug data to the form
94
-     *
95
-     * @param \EE_Billing_Info_Form $billing_form
96
-     * @return \EE_Billing_Info_Form
97
-     */
98
-    public function apply_billing_form_debug_settings(EE_Billing_Info_Form $billing_form)
99
-    {
100
-        if ($this->_pm_instance->debug_mode()) {
101
-            $billing_form->add_subsections(
102
-                array( 'fyi_about_autofill' => $billing_form->payment_fields_autofilled_notice_html() ),
103
-                'credit_card'
104
-            );
105
-            $billing_form->add_subsections(
106
-                array( 'debug_content' => new EE_Form_Section_HTML_From_Template(dirname(__FILE__).'/templates/paypal_pro_debug_info.template.php')),
107
-                'first_name'
108
-            );
109
-            $billing_form->get_input('credit_card_type')->set_default('Visa');
110
-            $billing_form->get_input('exp_year')->set_default(2018);
111
-            $billing_form->get_input('cvv')->set_default('115');
112
-        }
113
-        return $billing_form;
114
-    }
115
-
116
-
117
-
118
-    /**
119
-     * Returns an array of all the payment cards possibly supported by paypal pro.
120
-     * Keys are their values, values are their pretty names.
121
-     * @return array
122
-     */
123
-    public static function card_types_supported()
124
-    {
125
-        return array(
126
-            'Visa'=>  esc_html__("Visa", 'event_espresso'),
127
-            'MasterCard'=>  esc_html__("MasterCard", 'event_espresso'),
128
-            'Amex'=>  esc_html__("American Express", 'event_espresso'),
129
-            'Discover'=>  esc_html__("Discover", 'event_espresso')
130
-            );
131
-    }
132
-
133
-
134
-
135
-    /**
136
-     * Adds the help tab
137
-     * @see EE_PMT_Base::help_tabs_config()
138
-     * @return array
139
-     */
140
-    public function help_tabs_config()
141
-    {
142
-        return array(
143
-            $this->get_help_tab_name() => array(
144
-                        'title' => esc_html__('PayPal Pro Settings', 'event_espresso'),
145
-                        'filename' => 'payment_methods_overview_paypalpro'
146
-                        ),
147
-        );
148
-    }
149
-
150
-    /**
151
-     * Overrides parent's _get_billing_values_from_form because we want to
152
-     * get the country's 2-character ISO code, not the name like most gateways
153
-     * @param EE_Billing_Info_Form $billing_form
154
-     * @return array
155
-     */
156
-    protected function _get_billing_values_from_form($billing_form)
157
-    {
158
-        $billing_values = parent::_get_billing_values_from_form($billing_form);
159
-        $billing_values['country'] = $billing_form->get_input_value('country');
160
-        $billing_values['credit_card_type'] = $billing_form->get_input_value('credit_card_type');
161
-        return $billing_values;
162
-    }
163
-
164
-    /**
165
-     * Override parent to account for a change in extra meta inputs in 4.9.75.p
166
-     * @since 4.9.79.p
167
-     * @param EE_Payment_Method $payment_method_instance
168
-     * @throws EE_Error
169
-     * @throws InvalidArgumentException
170
-     * @throws ReflectionException
171
-     * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
172
-     * @throws \EventEspresso\core\exceptions\InvalidInterfaceException
173
-     */
174
-    public function set_instance($payment_method_instance)
175
-    {
176
-        // Check for the old extra meta inputs
177
-        $old_extra_metas = EEM_Extra_Meta::instance()->get_all(
178
-            [
179
-                [
180
-                    'EXM_type' => 'Payment_Method',
181
-                    'OBJ_ID' => $payment_method_instance->ID(),
182
-                    'EXM_key' => ['IN', ['username', 'password', 'signature']],
183
-                ]
184
-            ]
185
-        );
186
-        // If they existed, set the new ones instead
187
-        if (!empty($old_extra_metas)) {
188
-            foreach ($old_extra_metas as $old_extra_meta) {
189
-                $old_extra_meta->set('EXM_key', 'api_' . $old_extra_meta->get('EXM_key'));
190
-                $old_extra_meta->save();
191
-            }
192
-        }
193
-        return parent::set_instance($payment_method_instance);
194
-    }
17
+	/**
18
+	 * @param EE_Payment_Method $pm_instance
19
+	 * @return EE_PMT_Paypal_Pro
20
+	 */
21
+	public function __construct($pm_instance = null)
22
+	{
23
+		require_once($this->file_folder().'EEG_Paypal_Pro.gateway.php');
24
+		$this->_gateway = new EEG_Paypal_Pro();
25
+		$this->_pretty_name = esc_html__("Paypal Pro", 'event_espresso');
26
+		$this->_default_description = esc_html__('Please provide the following billing information.', 'event_espresso');
27
+		$this->_requires_https = true;
28
+		parent::__construct($pm_instance);
29
+	}
30
+
31
+
32
+	/**
33
+	 * Gets the form for all the settings related to this payment method type
34
+	 * @return EE_Payment_Method_Form
35
+	 * @throws InvalidArgumentException
36
+	 * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
37
+	 * @throws \EventEspresso\core\exceptions\InvalidInterfaceException
38
+	 */
39
+	public function generate_new_settings_form()
40
+	{
41
+		return new PayPalProSettingsForm(array(), $this->get_help_tab_link());
42
+	}
43
+
44
+
45
+	/**
46
+	 * Creates the billing form for this payment method type
47
+	 * @param \EE_Transaction $transaction
48
+	 * @throws \EE_Error
49
+	 * @return EE_Billing_Info_Form
50
+	 */
51
+	public function generate_new_billing_form(EE_Transaction $transaction = null)
52
+	{
53
+		$allowed_types = $this->_pm_instance->get_extra_meta('credit_card_types', true);
54
+		// if allowed types is a string or empty array or null...
55
+		if (empty($allowed_types)) {
56
+			$allowed_types = array();
57
+		}
58
+
59
+		$billing_form = new EE_Billing_Attendee_Info_Form(
60
+			$this->_pm_instance,
61
+			array(
62
+				'name'=> 'Paypal_Pro_Billing_Form',
63
+			//              'html_id'=> 'ee-Paypal_Pro-billing-form',
64
+				'subsections'=>array(
65
+					'credit_card'=>new EE_Credit_Card_Input(
66
+						array( 'required'=>true, 'html_class' => 'ee-billing-qstn', 'html_label_text' => esc_html__('Card Number', 'event_espresso'))
67
+					),
68
+					'credit_card_type'=>new EE_Select_Input(
69
+						// the options are set dynamically
70
+						array_intersect_key(EE_PMT_Paypal_Pro::card_types_supported(), array_flip($allowed_types)),
71
+						array( 'required'=>true, 'html_class' => 'ee-billing-qstn', 'html_label_text' => esc_html__('Card Type', 'event_espresso'))
72
+					),
73
+					'exp_month'=>new EE_Credit_Card_Month_Input(
74
+						true,
75
+						array( 'required'=>true, 'html_class' => 'ee-billing-qstn', 'html_label_text' =>  esc_html__('Expiry Month', 'event_espresso')  )
76
+					),
77
+					'exp_year'=>new EE_Credit_Card_Year_Input(
78
+						array( 'required'=>true, 'html_class' => 'ee-billing-qstn', 'html_label_text' => esc_html__('Expiry Year', 'event_espresso')  )
79
+					),
80
+					'cvv'=>new EE_CVV_Input(
81
+						array( 'required'=>true, 'html_class' => 'ee-billing-qstn', 'html_label_text' => esc_html__('CVV', 'event_espresso') )
82
+					),
83
+				)
84
+			)
85
+		);
86
+		return $this->apply_billing_form_debug_settings($billing_form);
87
+	}
88
+
89
+
90
+
91
+	/**
92
+	 * apply_billing_form_debug_settings
93
+	 * applies debug data to the form
94
+	 *
95
+	 * @param \EE_Billing_Info_Form $billing_form
96
+	 * @return \EE_Billing_Info_Form
97
+	 */
98
+	public function apply_billing_form_debug_settings(EE_Billing_Info_Form $billing_form)
99
+	{
100
+		if ($this->_pm_instance->debug_mode()) {
101
+			$billing_form->add_subsections(
102
+				array( 'fyi_about_autofill' => $billing_form->payment_fields_autofilled_notice_html() ),
103
+				'credit_card'
104
+			);
105
+			$billing_form->add_subsections(
106
+				array( 'debug_content' => new EE_Form_Section_HTML_From_Template(dirname(__FILE__).'/templates/paypal_pro_debug_info.template.php')),
107
+				'first_name'
108
+			);
109
+			$billing_form->get_input('credit_card_type')->set_default('Visa');
110
+			$billing_form->get_input('exp_year')->set_default(2018);
111
+			$billing_form->get_input('cvv')->set_default('115');
112
+		}
113
+		return $billing_form;
114
+	}
115
+
116
+
117
+
118
+	/**
119
+	 * Returns an array of all the payment cards possibly supported by paypal pro.
120
+	 * Keys are their values, values are their pretty names.
121
+	 * @return array
122
+	 */
123
+	public static function card_types_supported()
124
+	{
125
+		return array(
126
+			'Visa'=>  esc_html__("Visa", 'event_espresso'),
127
+			'MasterCard'=>  esc_html__("MasterCard", 'event_espresso'),
128
+			'Amex'=>  esc_html__("American Express", 'event_espresso'),
129
+			'Discover'=>  esc_html__("Discover", 'event_espresso')
130
+			);
131
+	}
132
+
133
+
134
+
135
+	/**
136
+	 * Adds the help tab
137
+	 * @see EE_PMT_Base::help_tabs_config()
138
+	 * @return array
139
+	 */
140
+	public function help_tabs_config()
141
+	{
142
+		return array(
143
+			$this->get_help_tab_name() => array(
144
+						'title' => esc_html__('PayPal Pro Settings', 'event_espresso'),
145
+						'filename' => 'payment_methods_overview_paypalpro'
146
+						),
147
+		);
148
+	}
149
+
150
+	/**
151
+	 * Overrides parent's _get_billing_values_from_form because we want to
152
+	 * get the country's 2-character ISO code, not the name like most gateways
153
+	 * @param EE_Billing_Info_Form $billing_form
154
+	 * @return array
155
+	 */
156
+	protected function _get_billing_values_from_form($billing_form)
157
+	{
158
+		$billing_values = parent::_get_billing_values_from_form($billing_form);
159
+		$billing_values['country'] = $billing_form->get_input_value('country');
160
+		$billing_values['credit_card_type'] = $billing_form->get_input_value('credit_card_type');
161
+		return $billing_values;
162
+	}
163
+
164
+	/**
165
+	 * Override parent to account for a change in extra meta inputs in 4.9.75.p
166
+	 * @since 4.9.79.p
167
+	 * @param EE_Payment_Method $payment_method_instance
168
+	 * @throws EE_Error
169
+	 * @throws InvalidArgumentException
170
+	 * @throws ReflectionException
171
+	 * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
172
+	 * @throws \EventEspresso\core\exceptions\InvalidInterfaceException
173
+	 */
174
+	public function set_instance($payment_method_instance)
175
+	{
176
+		// Check for the old extra meta inputs
177
+		$old_extra_metas = EEM_Extra_Meta::instance()->get_all(
178
+			[
179
+				[
180
+					'EXM_type' => 'Payment_Method',
181
+					'OBJ_ID' => $payment_method_instance->ID(),
182
+					'EXM_key' => ['IN', ['username', 'password', 'signature']],
183
+				]
184
+			]
185
+		);
186
+		// If they existed, set the new ones instead
187
+		if (!empty($old_extra_metas)) {
188
+			foreach ($old_extra_metas as $old_extra_meta) {
189
+				$old_extra_meta->set('EXM_key', 'api_' . $old_extra_meta->get('EXM_key'));
190
+				$old_extra_meta->save();
191
+			}
192
+		}
193
+		return parent::set_instance($payment_method_instance);
194
+	}
195 195
 }
Please login to merge, or discard this patch.
Spacing   +9 added lines, -9 removed lines patch added patch discarded remove patch
@@ -63,22 +63,22 @@  discard block
 block discarded – undo
63 63
             //              'html_id'=> 'ee-Paypal_Pro-billing-form',
64 64
                 'subsections'=>array(
65 65
                     'credit_card'=>new EE_Credit_Card_Input(
66
-                        array( 'required'=>true, 'html_class' => 'ee-billing-qstn', 'html_label_text' => esc_html__('Card Number', 'event_espresso'))
66
+                        array('required'=>true, 'html_class' => 'ee-billing-qstn', 'html_label_text' => esc_html__('Card Number', 'event_espresso'))
67 67
                     ),
68 68
                     'credit_card_type'=>new EE_Select_Input(
69 69
                         // the options are set dynamically
70 70
                         array_intersect_key(EE_PMT_Paypal_Pro::card_types_supported(), array_flip($allowed_types)),
71
-                        array( 'required'=>true, 'html_class' => 'ee-billing-qstn', 'html_label_text' => esc_html__('Card Type', 'event_espresso'))
71
+                        array('required'=>true, 'html_class' => 'ee-billing-qstn', 'html_label_text' => esc_html__('Card Type', 'event_espresso'))
72 72
                     ),
73 73
                     'exp_month'=>new EE_Credit_Card_Month_Input(
74 74
                         true,
75
-                        array( 'required'=>true, 'html_class' => 'ee-billing-qstn', 'html_label_text' =>  esc_html__('Expiry Month', 'event_espresso')  )
75
+                        array('required'=>true, 'html_class' => 'ee-billing-qstn', 'html_label_text' =>  esc_html__('Expiry Month', 'event_espresso'))
76 76
                     ),
77 77
                     'exp_year'=>new EE_Credit_Card_Year_Input(
78
-                        array( 'required'=>true, 'html_class' => 'ee-billing-qstn', 'html_label_text' => esc_html__('Expiry Year', 'event_espresso')  )
78
+                        array('required'=>true, 'html_class' => 'ee-billing-qstn', 'html_label_text' => esc_html__('Expiry Year', 'event_espresso'))
79 79
                     ),
80 80
                     'cvv'=>new EE_CVV_Input(
81
-                        array( 'required'=>true, 'html_class' => 'ee-billing-qstn', 'html_label_text' => esc_html__('CVV', 'event_espresso') )
81
+                        array('required'=>true, 'html_class' => 'ee-billing-qstn', 'html_label_text' => esc_html__('CVV', 'event_espresso'))
82 82
                     ),
83 83
                 )
84 84
             )
@@ -99,11 +99,11 @@  discard block
 block discarded – undo
99 99
     {
100 100
         if ($this->_pm_instance->debug_mode()) {
101 101
             $billing_form->add_subsections(
102
-                array( 'fyi_about_autofill' => $billing_form->payment_fields_autofilled_notice_html() ),
102
+                array('fyi_about_autofill' => $billing_form->payment_fields_autofilled_notice_html()),
103 103
                 'credit_card'
104 104
             );
105 105
             $billing_form->add_subsections(
106
-                array( 'debug_content' => new EE_Form_Section_HTML_From_Template(dirname(__FILE__).'/templates/paypal_pro_debug_info.template.php')),
106
+                array('debug_content' => new EE_Form_Section_HTML_From_Template(dirname(__FILE__).'/templates/paypal_pro_debug_info.template.php')),
107 107
                 'first_name'
108 108
             );
109 109
             $billing_form->get_input('credit_card_type')->set_default('Visa');
@@ -184,9 +184,9 @@  discard block
 block discarded – undo
184 184
             ]
185 185
         );
186 186
         // If they existed, set the new ones instead
187
-        if (!empty($old_extra_metas)) {
187
+        if ( ! empty($old_extra_metas)) {
188 188
             foreach ($old_extra_metas as $old_extra_meta) {
189
-                $old_extra_meta->set('EXM_key', 'api_' . $old_extra_meta->get('EXM_key'));
189
+                $old_extra_meta->set('EXM_key', 'api_'.$old_extra_meta->get('EXM_key'));
190 190
                 $old_extra_meta->save();
191 191
             }
192 192
         }
Please login to merge, or discard this patch.
core/libraries/form_sections/base/EE_Form_Section_Base.form.php 2 patches
Indentation   +476 added lines, -476 removed lines patch added patch discarded remove patch
@@ -15,486 +15,486 @@
 block discarded – undo
15 15
 abstract class EE_Form_Section_Base
16 16
 {
17 17
 
18
-    /**
19
-     * the URL the form is submitted to
20
-     *
21
-     * @var string
22
-     */
23
-    protected $_action;
24
-
25
-    /**
26
-     * POST (default) or GET
27
-     *
28
-     * @var string
29
-     */
30
-    protected $_method;
31
-
32
-    /**
33
-     * html_id and html_name are derived from this by default
34
-     *
35
-     * @var string
36
-     */
37
-    protected $_name;
38
-
39
-    /**
40
-     * $_html_id
41
-     * @var string
42
-     */
43
-    protected $_html_id;
44
-
45
-    /**
46
-     * $_html_class
47
-     * @var string
48
-     */
49
-    protected $_html_class;
50
-
51
-    /**
52
-     * $_html_style
53
-     * @var string
54
-     */
55
-    protected $_html_style;
56
-
57
-    /**
58
-     * $_other_html_attributes
59
-     * @var string
60
-     */
61
-    protected $_other_html_attributes;
62
-
63
-    /**
64
-     * The form section of which this form section is a part
65
-     *
66
-     * @var EE_Form_Section_Proper
67
-     */
68
-    protected $_parent_section;
69
-
70
-    /**
71
-     * flag indicating that _construct_finalize has been called.
72
-     * If it has not been called and we try to use functions which require it, we call it
73
-     * with no parameters. But normally, _construct_finalize should be called by the instantiating class
74
-     *
75
-     * @var boolean
76
-     */
77
-    protected $_construction_finalized;
78
-
79
-    /**
80
-     * Strategy for parsing the form HTML upon display
81
-     *
82
-     * @var FormHtmlFilter
83
-     */
84
-    protected $_form_html_filter;
85
-
86
-
87
-    /**
88
-     * @param array $options_array {
89
-     * @type        $name          string the name for this form section, if you want to explicitly define it
90
-     *                             }
91
-     * @throws InvalidDataTypeException
92
-     */
93
-    public function __construct($options_array = array())
94
-    {
95
-        // used by display strategies
96
-        // assign incoming values to properties
97
-        foreach ($options_array as $key => $value) {
98
-            $key = '_' . $key;
99
-            if (property_exists($this, $key) && empty($this->{$key})) {
100
-                $this->{$key} = $value;
101
-                if ($key === '_subsections' && ! is_array($value)) {
102
-                    throw new InvalidDataTypeException($key, $value, 'array');
103
-                }
104
-            }
105
-        }
106
-        // set parser which allows the form section's rendered HTML to be filtered
107
-        if (isset($options_array['form_html_filter']) && $options_array['form_html_filter'] instanceof FormHtmlFilter) {
108
-            $this->_form_html_filter = $options_array['form_html_filter'];
109
-        }
110
-    }
111
-
112
-
113
-
114
-    /**
115
-     * @param $parent_form_section
116
-     * @param $name
117
-     * @throws \EE_Error
118
-     */
119
-    protected function _construct_finalize($parent_form_section, $name)
120
-    {
121
-        $this->_construction_finalized = true;
122
-        $this->_parent_section = $parent_form_section;
123
-        if ($name !== null) {
124
-            $this->_name = $name;
125
-        }
126
-    }
127
-
128
-
129
-
130
-    /**
131
-     * make sure construction finalized was called, otherwise children might not be ready
132
-     *
133
-     * @return void
134
-     * @throws \EE_Error
135
-     */
136
-    public function ensure_construct_finalized_called()
137
-    {
138
-        if (! $this->_construction_finalized) {
139
-            $this->_construct_finalize($this->_parent_section, $this->_name);
140
-        }
141
-    }
142
-
143
-
144
-
145
-    /**
146
-     * @return string
147
-     */
148
-    public function action()
149
-    {
150
-        return $this->_action;
151
-    }
152
-
153
-
154
-
155
-    /**
156
-     * @param string $action
157
-     */
158
-    public function set_action($action)
159
-    {
160
-        $this->_action = $action;
161
-    }
162
-
163
-
164
-
165
-    /**
166
-     * @return string
167
-     */
168
-    public function method()
169
-    {
170
-        return ! empty($this->_method) ? $this->_method : 'POST';
171
-    }
172
-
173
-
174
-
175
-    /**
176
-     * @param string $method
177
-     */
178
-    public function set_method($method)
179
-    {
180
-        switch ($method) {
181
-            case 'get':
182
-            case 'GET':
183
-                $this->_method = 'GET';
184
-                break;
185
-            default:
186
-                $this->_method = 'POST';
187
-        }
188
-    }
189
-
190
-
191
-
192
-    /**
193
-     * Sets the html_id to its default value, if none was specified in the constructor.
194
-     * Calculation involves using the name and the parent's html id
195
-     * return void
196
-     *
197
-     * @throws \EE_Error
198
-     */
199
-    protected function _set_default_html_id_if_empty()
200
-    {
201
-        if (! $this->_html_id) {
202
-            if ($this->_parent_section && $this->_parent_section instanceof EE_Form_Section_Proper) {
203
-                $this->_html_id = $this->_parent_section->html_id()
204
-                                  . '-'
205
-                                  . $this->_prep_name_for_html_id($this->name());
206
-            } else {
207
-                $this->_html_id = $this->_prep_name_for_html_id($this->name());
208
-            }
209
-        }
210
-    }
211
-
212
-
213
-
214
-    /**
215
-     * _prep_name_for_html_id
216
-     *
217
-     * @param $name
218
-     * @return string
219
-     */
220
-    private function _prep_name_for_html_id($name)
221
-    {
222
-        return sanitize_key(str_replace(array('&nbsp;', ' ', '_'), '-', $name));
223
-    }
18
+	/**
19
+	 * the URL the form is submitted to
20
+	 *
21
+	 * @var string
22
+	 */
23
+	protected $_action;
24
+
25
+	/**
26
+	 * POST (default) or GET
27
+	 *
28
+	 * @var string
29
+	 */
30
+	protected $_method;
31
+
32
+	/**
33
+	 * html_id and html_name are derived from this by default
34
+	 *
35
+	 * @var string
36
+	 */
37
+	protected $_name;
38
+
39
+	/**
40
+	 * $_html_id
41
+	 * @var string
42
+	 */
43
+	protected $_html_id;
44
+
45
+	/**
46
+	 * $_html_class
47
+	 * @var string
48
+	 */
49
+	protected $_html_class;
50
+
51
+	/**
52
+	 * $_html_style
53
+	 * @var string
54
+	 */
55
+	protected $_html_style;
56
+
57
+	/**
58
+	 * $_other_html_attributes
59
+	 * @var string
60
+	 */
61
+	protected $_other_html_attributes;
62
+
63
+	/**
64
+	 * The form section of which this form section is a part
65
+	 *
66
+	 * @var EE_Form_Section_Proper
67
+	 */
68
+	protected $_parent_section;
69
+
70
+	/**
71
+	 * flag indicating that _construct_finalize has been called.
72
+	 * If it has not been called and we try to use functions which require it, we call it
73
+	 * with no parameters. But normally, _construct_finalize should be called by the instantiating class
74
+	 *
75
+	 * @var boolean
76
+	 */
77
+	protected $_construction_finalized;
78
+
79
+	/**
80
+	 * Strategy for parsing the form HTML upon display
81
+	 *
82
+	 * @var FormHtmlFilter
83
+	 */
84
+	protected $_form_html_filter;
85
+
86
+
87
+	/**
88
+	 * @param array $options_array {
89
+	 * @type        $name          string the name for this form section, if you want to explicitly define it
90
+	 *                             }
91
+	 * @throws InvalidDataTypeException
92
+	 */
93
+	public function __construct($options_array = array())
94
+	{
95
+		// used by display strategies
96
+		// assign incoming values to properties
97
+		foreach ($options_array as $key => $value) {
98
+			$key = '_' . $key;
99
+			if (property_exists($this, $key) && empty($this->{$key})) {
100
+				$this->{$key} = $value;
101
+				if ($key === '_subsections' && ! is_array($value)) {
102
+					throw new InvalidDataTypeException($key, $value, 'array');
103
+				}
104
+			}
105
+		}
106
+		// set parser which allows the form section's rendered HTML to be filtered
107
+		if (isset($options_array['form_html_filter']) && $options_array['form_html_filter'] instanceof FormHtmlFilter) {
108
+			$this->_form_html_filter = $options_array['form_html_filter'];
109
+		}
110
+	}
111
+
112
+
113
+
114
+	/**
115
+	 * @param $parent_form_section
116
+	 * @param $name
117
+	 * @throws \EE_Error
118
+	 */
119
+	protected function _construct_finalize($parent_form_section, $name)
120
+	{
121
+		$this->_construction_finalized = true;
122
+		$this->_parent_section = $parent_form_section;
123
+		if ($name !== null) {
124
+			$this->_name = $name;
125
+		}
126
+	}
127
+
128
+
129
+
130
+	/**
131
+	 * make sure construction finalized was called, otherwise children might not be ready
132
+	 *
133
+	 * @return void
134
+	 * @throws \EE_Error
135
+	 */
136
+	public function ensure_construct_finalized_called()
137
+	{
138
+		if (! $this->_construction_finalized) {
139
+			$this->_construct_finalize($this->_parent_section, $this->_name);
140
+		}
141
+	}
142
+
143
+
144
+
145
+	/**
146
+	 * @return string
147
+	 */
148
+	public function action()
149
+	{
150
+		return $this->_action;
151
+	}
152
+
153
+
154
+
155
+	/**
156
+	 * @param string $action
157
+	 */
158
+	public function set_action($action)
159
+	{
160
+		$this->_action = $action;
161
+	}
162
+
163
+
164
+
165
+	/**
166
+	 * @return string
167
+	 */
168
+	public function method()
169
+	{
170
+		return ! empty($this->_method) ? $this->_method : 'POST';
171
+	}
172
+
173
+
174
+
175
+	/**
176
+	 * @param string $method
177
+	 */
178
+	public function set_method($method)
179
+	{
180
+		switch ($method) {
181
+			case 'get':
182
+			case 'GET':
183
+				$this->_method = 'GET';
184
+				break;
185
+			default:
186
+				$this->_method = 'POST';
187
+		}
188
+	}
189
+
190
+
191
+
192
+	/**
193
+	 * Sets the html_id to its default value, if none was specified in the constructor.
194
+	 * Calculation involves using the name and the parent's html id
195
+	 * return void
196
+	 *
197
+	 * @throws \EE_Error
198
+	 */
199
+	protected function _set_default_html_id_if_empty()
200
+	{
201
+		if (! $this->_html_id) {
202
+			if ($this->_parent_section && $this->_parent_section instanceof EE_Form_Section_Proper) {
203
+				$this->_html_id = $this->_parent_section->html_id()
204
+								  . '-'
205
+								  . $this->_prep_name_for_html_id($this->name());
206
+			} else {
207
+				$this->_html_id = $this->_prep_name_for_html_id($this->name());
208
+			}
209
+		}
210
+	}
211
+
212
+
213
+
214
+	/**
215
+	 * _prep_name_for_html_id
216
+	 *
217
+	 * @param $name
218
+	 * @return string
219
+	 */
220
+	private function _prep_name_for_html_id($name)
221
+	{
222
+		return sanitize_key(str_replace(array('&nbsp;', ' ', '_'), '-', $name));
223
+	}
224 224
 
225 225
 
226 226
 
227
-    /**
228
-     * Returns the HTML, JS, and CSS necessary to display this form section on a page.
229
-     * Note however, it's recommended that you instead call enqueue_js on the "wp_enqueue_scripts" action,
230
-     * and call get_html when you want to output the html. Calling get_html_and_js after
231
-     * "wp_enqueue_scripts" has already fired seems to work for now, but is contrary
232
-     * to the instructions on https://developer.wordpress.org/reference/functions/wp_enqueue_script/
233
-     * and so might stop working anytime.
234
-     *
235
-     * @return string
236
-     */
237
-    public function get_html_and_js()
238
-    {
239
-        return $this->get_html();
240
-    }
227
+	/**
228
+	 * Returns the HTML, JS, and CSS necessary to display this form section on a page.
229
+	 * Note however, it's recommended that you instead call enqueue_js on the "wp_enqueue_scripts" action,
230
+	 * and call get_html when you want to output the html. Calling get_html_and_js after
231
+	 * "wp_enqueue_scripts" has already fired seems to work for now, but is contrary
232
+	 * to the instructions on https://developer.wordpress.org/reference/functions/wp_enqueue_script/
233
+	 * and so might stop working anytime.
234
+	 *
235
+	 * @return string
236
+	 */
237
+	public function get_html_and_js()
238
+	{
239
+		return $this->get_html();
240
+	}
241 241
 
242 242
 
243
-
244
-    /**
245
-     * Gets the HTML for displaying this form section
246
-     *
247
-     * @return string
248
-     */
249
-    abstract public function get_html();
250
-
251
-
252
-    /**
253
-     * @param bool $add_pound_sign
254
-     * @return string
255
-     * @throws EE_Error
256
-     */
257
-    public function html_id($add_pound_sign = false)
258
-    {
259
-        $this->_set_default_html_id_if_empty();
260
-        return $add_pound_sign ? '#' . $this->_html_id : $this->_html_id;
261
-    }
262
-
263
-
264
-
265
-    /**
266
-     * @return string
267
-     */
268
-    public function html_class()
269
-    {
270
-        return $this->_html_class;
271
-    }
272
-
273
-
274
-
275
-    /**
276
-     * @return string
277
-     */
278
-    public function html_style()
279
-    {
280
-        return $this->_html_style;
281
-    }
282
-
283
-
284
-
285
-    /**
286
-     * @param mixed $html_class
287
-     */
288
-    public function set_html_class($html_class)
289
-    {
290
-        $this->_html_class = $html_class;
291
-    }
292
-
293
-
294
-
295
-    /**
296
-     * @param mixed $html_id
297
-     */
298
-    public function set_html_id($html_id)
299
-    {
300
-        $this->_html_id = $html_id;
301
-    }
302
-
303
-
304
-
305
-    /**
306
-     * @param mixed $html_style
307
-     */
308
-    public function set_html_style($html_style)
309
-    {
310
-        $this->_html_style = $html_style;
311
-    }
312
-
313
-
314
-
315
-    /**
316
-     * @param string $other_html_attributes
317
-     */
318
-    public function set_other_html_attributes($other_html_attributes)
319
-    {
320
-        $this->_other_html_attributes = $other_html_attributes;
321
-    }
322
-
323
-
324
-
325
-    /**
326
-     * @return string
327
-     */
328
-    public function other_html_attributes()
329
-    {
330
-        return ! empty($this->_other_html_attributes) ? ' ' . $this->_other_html_attributes : '';
331
-    }
332
-
333
-
334
-
335
-    /**
336
-     * Gets the name of the form section. This is not the same as the HTML name.
337
-     *
338
-     * @throws EE_Error
339
-     * @return string
340
-     */
341
-    public function name()
342
-    {
343
-        if (! $this->_construction_finalized) {
344
-            throw new EE_Error(sprintf(__(
345
-                'You cannot use the form section\s name until _construct_finalize has been called on it (when we set the name). It was called on a form section of type \'s\'',
346
-                'event_espresso'
347
-            ), get_class($this)));
348
-        }
349
-        return $this->_name;
350
-    }
351
-
352
-
353
-
354
-    /**
355
-     * Gets the parent section
356
-     *
357
-     * @return EE_Form_Section_Proper
358
-     */
359
-    public function parent_section()
360
-    {
361
-        return $this->_parent_section;
362
-    }
363
-
364
-
365
-    /**
366
-     * returns HTML for generating the opening form HTML tag (<form>)
367
-     *
368
-     * @param string $action           the URL the form is submitted to
369
-     * @param string $method           POST (default) or GET
370
-     * @param string $other_attributes anything else added to the form open tag, MUST BE VALID HTML
371
-     * @return string
372
-     * @throws EE_Error
373
-     */
374
-    public function form_open($action = '', $method = '', $other_attributes = '')
375
-    {
376
-        if (! empty($action)) {
377
-            $this->set_action($action);
378
-        }
379
-        if (! empty($method)) {
380
-            $this->set_method($method);
381
-        }
382
-        $html = EEH_HTML::nl(1, 'form') . '<form';
383
-        $html .= $this->html_id() !== '' ? ' id="' . $this->get_html_id_for_form($this->html_id()) . '"' : '';
384
-        $html .= ' action="' . $this->action() . '"';
385
-        $html .= ' method="' . $this->method() . '"';
386
-        $html .= ' name="' . $this->name() . '"';
387
-        $html .= $other_attributes . '>';
388
-        return $html;
389
-    }
390
-
391
-
392
-
393
-    /**
394
-     * ensures that html id for form either ends in "-form" or "-frm"
395
-     * so that id doesn't conflict/collide with other elements
396
-     *
397
-     * @param string $html_id
398
-     * @return string
399
-     */
400
-    protected function get_html_id_for_form($html_id)
401
-    {
402
-        $strlen = strlen($html_id);
403
-        $html_id = strpos($html_id, '-form') === $strlen-5 || strpos($html_id, '-frm') === $strlen - 4
404
-            ? $html_id
405
-            : $html_id . '-frm';
406
-        return $html_id;
407
-    }
408
-
409
-
410
-    /**
411
-     * returns HTML for generating the closing form HTML tag (</form>)
412
-     *
413
-     * @return string
414
-     * @throws EE_Error
415
-     */
416
-    public function form_close()
417
-    {
418
-        return EEH_HTML::nl(-1, 'form')
419
-               . '</form>'
420
-               . EEH_HTML::nl()
421
-               . '<!-- end of ee-'
422
-               . $this->html_id()
423
-               . '-form -->'
424
-               . EEH_HTML::nl();
425
-    }
426
-
427
-
428
-
429
-    /**
430
-     * enqueues JS (and CSS) for the form (ie immediately call wp_enqueue_script and
431
-     * wp_enqueue_style; the scripts could have optionally been registered earlier)
432
-     * Default does nothing, but child classes can override
433
-     *
434
-     * @return void
435
-     */
436
-    public function enqueue_js()
437
-    {
438
-        // defaults to enqueue NO js or css
439
-    }
440
-
441
-
442
-
443
-    /**
444
-     * Adds any extra data needed by js. Eventually we'll call wp_localize_script
445
-     * with it, and it will be on each form section's 'other_data' property.
446
-     * By default nothing is added, but child classes can extend this method to add something.
447
-     * Eg, if you have an input that will cause a modal dialog to appear,
448
-     * here you could add an entry like 'modal_dialog_inputs' to this array
449
-     * to map between the input's html ID and the modal dialogue's ID, so that
450
-     * your JS code will know where to find the modal dialog when the input is pressed.
451
-     * Eg $form_other_js_data['modal_dialog_inputs']['some-input-id']='modal-dialog-id';
452
-     *
453
-     * @param array $form_other_js_data
454
-     * @return array
455
-     */
456
-    public function get_other_js_data($form_other_js_data = array())
457
-    {
458
-        return $form_other_js_data;
459
-    }
460
-
461
-
462
-
463
-    /**
464
-     * This isn't just the name of an input, it's a path pointing to an input. The
465
-     * path is similar to a folder path: slash (/) means to descend into a subsection,
466
-     * dot-dot-slash (../) means to ascend into the parent section.
467
-     * After a series of slashes and dot-dot-slashes, there should be the name of an input,
468
-     * which will be returned.
469
-     * Eg, if you want the related input to be conditional on a sibling input name 'foobar'
470
-     * just use 'foobar'. If you want it to be conditional on an aunt/uncle input name
471
-     * 'baz', use '../baz'. If you want it to be conditional on a cousin input,
472
-     * the child of 'baz_section' named 'baz_child', use '../baz_section/baz_child'.
473
-     * Etc
474
-     *
475
-     * @param string|false $form_section_path we accept false also because substr( '../', '../' ) = false
476
-     * @return EE_Form_Section_Base
477
-     */
478
-    public function find_section_from_path($form_section_path)
479
-    {
480
-        if (strpos($form_section_path, '/') === 0) {
481
-            $form_section_path = substr($form_section_path, strlen('/'));
482
-        }
483
-        if (empty($form_section_path)) {
484
-            return $this;
485
-        }
486
-        if (strpos($form_section_path, '../') === 0) {
487
-            $parent = $this->parent_section();
488
-            $form_section_path = substr($form_section_path, strlen('../'));
489
-            if ($parent instanceof EE_Form_Section_Base) {
490
-                return $parent->find_section_from_path($form_section_path);
491
-            }
492
-            if (empty($form_section_path)) {
493
-                return $this;
494
-            }
495
-        }
496
-        // couldn't find it using simple parent following
497
-        return null;
498
-    }
243
+
244
+	/**
245
+	 * Gets the HTML for displaying this form section
246
+	 *
247
+	 * @return string
248
+	 */
249
+	abstract public function get_html();
250
+
251
+
252
+	/**
253
+	 * @param bool $add_pound_sign
254
+	 * @return string
255
+	 * @throws EE_Error
256
+	 */
257
+	public function html_id($add_pound_sign = false)
258
+	{
259
+		$this->_set_default_html_id_if_empty();
260
+		return $add_pound_sign ? '#' . $this->_html_id : $this->_html_id;
261
+	}
262
+
263
+
264
+
265
+	/**
266
+	 * @return string
267
+	 */
268
+	public function html_class()
269
+	{
270
+		return $this->_html_class;
271
+	}
272
+
273
+
274
+
275
+	/**
276
+	 * @return string
277
+	 */
278
+	public function html_style()
279
+	{
280
+		return $this->_html_style;
281
+	}
282
+
283
+
284
+
285
+	/**
286
+	 * @param mixed $html_class
287
+	 */
288
+	public function set_html_class($html_class)
289
+	{
290
+		$this->_html_class = $html_class;
291
+	}
292
+
293
+
294
+
295
+	/**
296
+	 * @param mixed $html_id
297
+	 */
298
+	public function set_html_id($html_id)
299
+	{
300
+		$this->_html_id = $html_id;
301
+	}
302
+
303
+
304
+
305
+	/**
306
+	 * @param mixed $html_style
307
+	 */
308
+	public function set_html_style($html_style)
309
+	{
310
+		$this->_html_style = $html_style;
311
+	}
312
+
313
+
314
+
315
+	/**
316
+	 * @param string $other_html_attributes
317
+	 */
318
+	public function set_other_html_attributes($other_html_attributes)
319
+	{
320
+		$this->_other_html_attributes = $other_html_attributes;
321
+	}
322
+
323
+
324
+
325
+	/**
326
+	 * @return string
327
+	 */
328
+	public function other_html_attributes()
329
+	{
330
+		return ! empty($this->_other_html_attributes) ? ' ' . $this->_other_html_attributes : '';
331
+	}
332
+
333
+
334
+
335
+	/**
336
+	 * Gets the name of the form section. This is not the same as the HTML name.
337
+	 *
338
+	 * @throws EE_Error
339
+	 * @return string
340
+	 */
341
+	public function name()
342
+	{
343
+		if (! $this->_construction_finalized) {
344
+			throw new EE_Error(sprintf(__(
345
+				'You cannot use the form section\s name until _construct_finalize has been called on it (when we set the name). It was called on a form section of type \'s\'',
346
+				'event_espresso'
347
+			), get_class($this)));
348
+		}
349
+		return $this->_name;
350
+	}
351
+
352
+
353
+
354
+	/**
355
+	 * Gets the parent section
356
+	 *
357
+	 * @return EE_Form_Section_Proper
358
+	 */
359
+	public function parent_section()
360
+	{
361
+		return $this->_parent_section;
362
+	}
363
+
364
+
365
+	/**
366
+	 * returns HTML for generating the opening form HTML tag (<form>)
367
+	 *
368
+	 * @param string $action           the URL the form is submitted to
369
+	 * @param string $method           POST (default) or GET
370
+	 * @param string $other_attributes anything else added to the form open tag, MUST BE VALID HTML
371
+	 * @return string
372
+	 * @throws EE_Error
373
+	 */
374
+	public function form_open($action = '', $method = '', $other_attributes = '')
375
+	{
376
+		if (! empty($action)) {
377
+			$this->set_action($action);
378
+		}
379
+		if (! empty($method)) {
380
+			$this->set_method($method);
381
+		}
382
+		$html = EEH_HTML::nl(1, 'form') . '<form';
383
+		$html .= $this->html_id() !== '' ? ' id="' . $this->get_html_id_for_form($this->html_id()) . '"' : '';
384
+		$html .= ' action="' . $this->action() . '"';
385
+		$html .= ' method="' . $this->method() . '"';
386
+		$html .= ' name="' . $this->name() . '"';
387
+		$html .= $other_attributes . '>';
388
+		return $html;
389
+	}
390
+
391
+
392
+
393
+	/**
394
+	 * ensures that html id for form either ends in "-form" or "-frm"
395
+	 * so that id doesn't conflict/collide with other elements
396
+	 *
397
+	 * @param string $html_id
398
+	 * @return string
399
+	 */
400
+	protected function get_html_id_for_form($html_id)
401
+	{
402
+		$strlen = strlen($html_id);
403
+		$html_id = strpos($html_id, '-form') === $strlen-5 || strpos($html_id, '-frm') === $strlen - 4
404
+			? $html_id
405
+			: $html_id . '-frm';
406
+		return $html_id;
407
+	}
408
+
409
+
410
+	/**
411
+	 * returns HTML for generating the closing form HTML tag (</form>)
412
+	 *
413
+	 * @return string
414
+	 * @throws EE_Error
415
+	 */
416
+	public function form_close()
417
+	{
418
+		return EEH_HTML::nl(-1, 'form')
419
+			   . '</form>'
420
+			   . EEH_HTML::nl()
421
+			   . '<!-- end of ee-'
422
+			   . $this->html_id()
423
+			   . '-form -->'
424
+			   . EEH_HTML::nl();
425
+	}
426
+
427
+
428
+
429
+	/**
430
+	 * enqueues JS (and CSS) for the form (ie immediately call wp_enqueue_script and
431
+	 * wp_enqueue_style; the scripts could have optionally been registered earlier)
432
+	 * Default does nothing, but child classes can override
433
+	 *
434
+	 * @return void
435
+	 */
436
+	public function enqueue_js()
437
+	{
438
+		// defaults to enqueue NO js or css
439
+	}
440
+
441
+
442
+
443
+	/**
444
+	 * Adds any extra data needed by js. Eventually we'll call wp_localize_script
445
+	 * with it, and it will be on each form section's 'other_data' property.
446
+	 * By default nothing is added, but child classes can extend this method to add something.
447
+	 * Eg, if you have an input that will cause a modal dialog to appear,
448
+	 * here you could add an entry like 'modal_dialog_inputs' to this array
449
+	 * to map between the input's html ID and the modal dialogue's ID, so that
450
+	 * your JS code will know where to find the modal dialog when the input is pressed.
451
+	 * Eg $form_other_js_data['modal_dialog_inputs']['some-input-id']='modal-dialog-id';
452
+	 *
453
+	 * @param array $form_other_js_data
454
+	 * @return array
455
+	 */
456
+	public function get_other_js_data($form_other_js_data = array())
457
+	{
458
+		return $form_other_js_data;
459
+	}
460
+
461
+
462
+
463
+	/**
464
+	 * This isn't just the name of an input, it's a path pointing to an input. The
465
+	 * path is similar to a folder path: slash (/) means to descend into a subsection,
466
+	 * dot-dot-slash (../) means to ascend into the parent section.
467
+	 * After a series of slashes and dot-dot-slashes, there should be the name of an input,
468
+	 * which will be returned.
469
+	 * Eg, if you want the related input to be conditional on a sibling input name 'foobar'
470
+	 * just use 'foobar'. If you want it to be conditional on an aunt/uncle input name
471
+	 * 'baz', use '../baz'. If you want it to be conditional on a cousin input,
472
+	 * the child of 'baz_section' named 'baz_child', use '../baz_section/baz_child'.
473
+	 * Etc
474
+	 *
475
+	 * @param string|false $form_section_path we accept false also because substr( '../', '../' ) = false
476
+	 * @return EE_Form_Section_Base
477
+	 */
478
+	public function find_section_from_path($form_section_path)
479
+	{
480
+		if (strpos($form_section_path, '/') === 0) {
481
+			$form_section_path = substr($form_section_path, strlen('/'));
482
+		}
483
+		if (empty($form_section_path)) {
484
+			return $this;
485
+		}
486
+		if (strpos($form_section_path, '../') === 0) {
487
+			$parent = $this->parent_section();
488
+			$form_section_path = substr($form_section_path, strlen('../'));
489
+			if ($parent instanceof EE_Form_Section_Base) {
490
+				return $parent->find_section_from_path($form_section_path);
491
+			}
492
+			if (empty($form_section_path)) {
493
+				return $this;
494
+			}
495
+		}
496
+		// couldn't find it using simple parent following
497
+		return null;
498
+	}
499 499
 }
500 500
 // End of file EE_Form_Section_Base.form.php
Please login to merge, or discard this patch.
Spacing   +16 added lines, -16 removed lines patch added patch discarded remove patch
@@ -95,7 +95,7 @@  discard block
 block discarded – undo
95 95
         // used by display strategies
96 96
         // assign incoming values to properties
97 97
         foreach ($options_array as $key => $value) {
98
-            $key = '_' . $key;
98
+            $key = '_'.$key;
99 99
             if (property_exists($this, $key) && empty($this->{$key})) {
100 100
                 $this->{$key} = $value;
101 101
                 if ($key === '_subsections' && ! is_array($value)) {
@@ -135,7 +135,7 @@  discard block
 block discarded – undo
135 135
      */
136 136
     public function ensure_construct_finalized_called()
137 137
     {
138
-        if (! $this->_construction_finalized) {
138
+        if ( ! $this->_construction_finalized) {
139 139
             $this->_construct_finalize($this->_parent_section, $this->_name);
140 140
         }
141 141
     }
@@ -198,7 +198,7 @@  discard block
 block discarded – undo
198 198
      */
199 199
     protected function _set_default_html_id_if_empty()
200 200
     {
201
-        if (! $this->_html_id) {
201
+        if ( ! $this->_html_id) {
202 202
             if ($this->_parent_section && $this->_parent_section instanceof EE_Form_Section_Proper) {
203 203
                 $this->_html_id = $this->_parent_section->html_id()
204 204
                                   . '-'
@@ -257,7 +257,7 @@  discard block
 block discarded – undo
257 257
     public function html_id($add_pound_sign = false)
258 258
     {
259 259
         $this->_set_default_html_id_if_empty();
260
-        return $add_pound_sign ? '#' . $this->_html_id : $this->_html_id;
260
+        return $add_pound_sign ? '#'.$this->_html_id : $this->_html_id;
261 261
     }
262 262
 
263 263
 
@@ -327,7 +327,7 @@  discard block
 block discarded – undo
327 327
      */
328 328
     public function other_html_attributes()
329 329
     {
330
-        return ! empty($this->_other_html_attributes) ? ' ' . $this->_other_html_attributes : '';
330
+        return ! empty($this->_other_html_attributes) ? ' '.$this->_other_html_attributes : '';
331 331
     }
332 332
 
333 333
 
@@ -340,7 +340,7 @@  discard block
 block discarded – undo
340 340
      */
341 341
     public function name()
342 342
     {
343
-        if (! $this->_construction_finalized) {
343
+        if ( ! $this->_construction_finalized) {
344 344
             throw new EE_Error(sprintf(__(
345 345
                 'You cannot use the form section\s name until _construct_finalize has been called on it (when we set the name). It was called on a form section of type \'s\'',
346 346
                 'event_espresso'
@@ -373,18 +373,18 @@  discard block
 block discarded – undo
373 373
      */
374 374
     public function form_open($action = '', $method = '', $other_attributes = '')
375 375
     {
376
-        if (! empty($action)) {
376
+        if ( ! empty($action)) {
377 377
             $this->set_action($action);
378 378
         }
379
-        if (! empty($method)) {
379
+        if ( ! empty($method)) {
380 380
             $this->set_method($method);
381 381
         }
382
-        $html = EEH_HTML::nl(1, 'form') . '<form';
383
-        $html .= $this->html_id() !== '' ? ' id="' . $this->get_html_id_for_form($this->html_id()) . '"' : '';
384
-        $html .= ' action="' . $this->action() . '"';
385
-        $html .= ' method="' . $this->method() . '"';
386
-        $html .= ' name="' . $this->name() . '"';
387
-        $html .= $other_attributes . '>';
382
+        $html = EEH_HTML::nl(1, 'form').'<form';
383
+        $html .= $this->html_id() !== '' ? ' id="'.$this->get_html_id_for_form($this->html_id()).'"' : '';
384
+        $html .= ' action="'.$this->action().'"';
385
+        $html .= ' method="'.$this->method().'"';
386
+        $html .= ' name="'.$this->name().'"';
387
+        $html .= $other_attributes.'>';
388 388
         return $html;
389 389
     }
390 390
 
@@ -400,9 +400,9 @@  discard block
 block discarded – undo
400 400
     protected function get_html_id_for_form($html_id)
401 401
     {
402 402
         $strlen = strlen($html_id);
403
-        $html_id = strpos($html_id, '-form') === $strlen-5 || strpos($html_id, '-frm') === $strlen - 4
403
+        $html_id = strpos($html_id, '-form') === $strlen - 5 || strpos($html_id, '-frm') === $strlen - 4
404 404
             ? $html_id
405
-            : $html_id . '-frm';
405
+            : $html_id.'-frm';
406 406
         return $html_id;
407 407
     }
408 408
 
Please login to merge, or discard this patch.
attendee_information/EE_SPCO_Reg_Step_Attendee_Information.class.php 2 patches
Spacing   +81 added lines, -81 removed lines patch added patch discarded remove patch
@@ -49,7 +49,7 @@  discard block
 block discarded – undo
49 49
     {
50 50
         $this->_slug = 'attendee_information';
51 51
         $this->_name = esc_html__('Attendee Information', 'event_espresso');
52
-        $this->_template = SPCO_REG_STEPS_PATH . $this->_slug . '/attendee_info_main.template.php';
52
+        $this->_template = SPCO_REG_STEPS_PATH.$this->_slug.'/attendee_info_main.template.php';
53 53
         $this->checkout = $checkout;
54 54
         $this->_reset_success_message();
55 55
         $this->set_instructions(
@@ -143,7 +143,7 @@  discard block
 block discarded – undo
143 143
         );
144 144
 
145 145
         // if this isn't a revisit, and they have the privacy consent box enalbed, add it
146
-        if (! $this->checkout->revisit && $reg_config->isConsentCheckboxEnabled()) {
146
+        if ( ! $this->checkout->revisit && $reg_config->isConsentCheckboxEnabled()) {
147 147
             $extra_inputs_section->add_subsections(
148 148
                 array(
149 149
                     'consent_box' => new EE_Form_Section_Proper(
@@ -151,7 +151,7 @@  discard block
 block discarded – undo
151 151
                             'layout_strategy' =>
152 152
                                 new EE_Template_Layout(
153 153
                                     array(
154
-                                        'input_template_file' => SPCO_REG_STEPS_PATH . $this->_slug . '/privacy_consent.template.php',
154
+                                        'input_template_file' => SPCO_REG_STEPS_PATH.$this->_slug.'/privacy_consent.template.php',
155 155
                                     )
156 156
                                 ),
157 157
                             'subsections'     => array(
@@ -189,12 +189,12 @@  discard block
 block discarded – undo
189 189
                 if ($registration instanceof EE_Registration
190 190
                     && $this->checkout->visit_allows_processing_of_this_registration($registration)
191 191
                 ) {
192
-                    $subsections[ $registration->reg_url_link() ] = $this->_registrations_reg_form($registration);
193
-                    $template_args['registrations'][ $registration->reg_url_link() ] = $registration;
194
-                    $template_args['ticket_count'][ $registration->ticket()->ID() ] = isset(
195
-                        $template_args['ticket_count'][ $registration->ticket()->ID() ]
192
+                    $subsections[$registration->reg_url_link()] = $this->_registrations_reg_form($registration);
193
+                    $template_args['registrations'][$registration->reg_url_link()] = $registration;
194
+                    $template_args['ticket_count'][$registration->ticket()->ID()] = isset(
195
+                        $template_args['ticket_count'][$registration->ticket()->ID()]
196 196
                     )
197
-                        ? $template_args['ticket_count'][ $registration->ticket()->ID() ] + 1
197
+                        ? $template_args['ticket_count'][$registration->ticket()->ID()] + 1
198 198
                         : 1;
199 199
                     $ticket_line_item = EEH_Line_Item::get_line_items_by_object_type_and_IDs(
200 200
                         $this->checkout->cart->get_grand_total(),
@@ -204,7 +204,7 @@  discard block
 block discarded – undo
204 204
                     $ticket_line_item = is_array($ticket_line_item)
205 205
                         ? reset($ticket_line_item)
206 206
                         : $ticket_line_item;
207
-                    $template_args['ticket_line_item'][ $registration->ticket()->ID() ] =
207
+                    $template_args['ticket_line_item'][$registration->ticket()->ID()] =
208 208
                         $Line_Item_Display->display_line_item($ticket_line_item);
209 209
                     if ($registration->is_primary_registrant()) {
210 210
                         $primary_registrant = $registration->reg_url_link();
@@ -216,10 +216,10 @@  discard block
 block discarded – undo
216 216
                     ? $this->_copy_attendee_info_form()
217 217
                     : $this->_auto_copy_attendee_info();
218 218
                 // generate hidden input
219
-                if (isset($subsections[ $primary_registrant ])
220
-                    && $subsections[ $primary_registrant ] instanceof EE_Form_Section_Proper
219
+                if (isset($subsections[$primary_registrant])
220
+                    && $subsections[$primary_registrant] instanceof EE_Form_Section_Proper
221 221
                 ) {
222
-                    $subsections[ $primary_registrant ]->add_subsections(
222
+                    $subsections[$primary_registrant]->add_subsections(
223 223
                         $copy_options,
224 224
                         'primary_registrant',
225 225
                         false
@@ -282,7 +282,7 @@  discard block
 block discarded – undo
282 282
             if ($question_groups) {
283 283
                 // array of params to pass to parent constructor
284 284
                 $form_args = array(
285
-                    'html_id'         => 'ee-registration-' . $registration->reg_url_link(),
285
+                    'html_id'         => 'ee-registration-'.$registration->reg_url_link(),
286 286
                     'html_class'      => 'ee-reg-form-attendee-dv',
287 287
                     'html_style'      => $this->checkout->admin_request
288 288
                         ? 'padding:0em 2em 1em; margin:3em 0 0; border:1px solid #ddd;'
@@ -304,7 +304,7 @@  discard block
 block discarded – undo
304 304
                 );
305 305
                 foreach ($question_groups as $question_group) {
306 306
                     if ($question_group instanceof EE_Question_Group) {
307
-                        $form_args['subsections'][ $question_group->identifier() ] = $this->_question_group_reg_form(
307
+                        $form_args['subsections'][$question_group->identifier()] = $this->_question_group_reg_form(
308 308
                             $registration,
309 309
                             $question_group
310 310
                         );
@@ -350,7 +350,7 @@  discard block
 block discarded – undo
350 350
         // generate hidden input
351 351
         return new EE_Hidden_Input(
352 352
             array(
353
-                'html_id' => 'additional-attendee-reg-info-' . $registration->reg_url_link(),
353
+                'html_id' => 'additional-attendee-reg-info-'.$registration->reg_url_link(),
354 354
                 'default' => $additional_attendee_reg_info,
355 355
             )
356 356
         );
@@ -371,12 +371,12 @@  discard block
 block discarded – undo
371 371
     {
372 372
         // array of params to pass to parent constructor
373 373
         $form_args = array(
374
-            'html_id'         => 'ee-reg-form-qstn-grp-' . $question_group->identifier() . '-' . $registration->ID(),
374
+            'html_id'         => 'ee-reg-form-qstn-grp-'.$question_group->identifier().'-'.$registration->ID(),
375 375
             'html_class'      => $this->checkout->admin_request
376 376
                 ? 'form-table ee-reg-form-qstn-grp-dv'
377 377
                 : 'ee-reg-form-qstn-grp-dv',
378
-            'html_label_id'   => 'ee-reg-form-qstn-grp-' . $question_group->identifier() . '-'
379
-                                 . $registration->ID() . '-lbl',
378
+            'html_label_id'   => 'ee-reg-form-qstn-grp-'.$question_group->identifier().'-'
379
+                                 . $registration->ID().'-lbl',
380 380
             'subsections'     => array(
381 381
                 'reg_form_qstn_grp_hdr' => $this->_question_group_header($question_group),
382 382
             ),
@@ -387,7 +387,7 @@  discard block
 block discarded – undo
387 387
         // where params
388 388
         $query_params = array('QST_deleted' => 0);
389 389
         // don't load admin only questions on the frontend
390
-        if (! $this->checkout->admin_request) {
390
+        if ( ! $this->checkout->admin_request) {
391 391
             $query_params['QST_admin_only'] = array('!=', true);
392 392
         }
393 393
         $questions = $question_group->get_many_related(
@@ -421,7 +421,7 @@  discard block
 block discarded – undo
421 421
                 $identifier = $question->is_system_question()
422 422
                     ? $question->system_ID()
423 423
                     : $question->ID();
424
-                $form_args['subsections'][ $identifier ] = $this->reg_form_question($registration, $question);
424
+                $form_args['subsections'][$identifier] = $this->reg_form_question($registration, $question);
425 425
             }
426 426
         }
427 427
         $form_args['subsections'] = apply_filters(
@@ -533,7 +533,7 @@  discard block
 block discarded – undo
533 533
     {
534 534
         return new EE_Form_Section_HTML(
535 535
             EEH_Template::locate_template(
536
-                SPCO_REG_STEPS_PATH . $this->_slug . '/_auto_copy_attendee_info.template.php',
536
+                SPCO_REG_STEPS_PATH.$this->_slug.'/_auto_copy_attendee_info.template.php',
537 537
                 apply_filters(
538 538
                     'FHEE__EE_SPCO_Reg_Step_Attendee_Information__auto_copy_attendee_info__template_args',
539 539
                     array()
@@ -566,17 +566,17 @@  discard block
 block discarded – undo
566 566
                 if ($registration->ticket()->ID() !== $prev_ticket) {
567 567
                     $item_name = $registration->ticket()->name();
568 568
                     $item_name .= $registration->ticket()->description() !== ''
569
-                        ? ' - ' . $registration->ticket()->description()
569
+                        ? ' - '.$registration->ticket()->description()
570 570
                         : '';
571
-                    $copy_attendee_info_inputs[ 'spco_copy_attendee_chk[ticket-' . $registration->ticket()->ID(
572
-                    ) . ']' ] =
571
+                    $copy_attendee_info_inputs['spco_copy_attendee_chk[ticket-'.$registration->ticket()->ID(
572
+                    ).']'] =
573 573
                         new EE_Form_Section_HTML(
574
-                            '<h6 class="spco-copy-attendee-event-hdr">' . $item_name . '</h6>'
574
+                            '<h6 class="spco-copy-attendee-event-hdr">'.$item_name.'</h6>'
575 575
                         );
576 576
                     $prev_ticket = $registration->ticket()->ID();
577 577
                 }
578 578
 
579
-                $copy_attendee_info_inputs[ 'spco_copy_attendee_chk[' . $registration->ID() . ']' ] =
579
+                $copy_attendee_info_inputs['spco_copy_attendee_chk['.$registration->ID().']'] =
580 580
                     new EE_Checkbox_Multi_Input(
581 581
                         array(
582 582
                             $registration->ID() => sprintf(
@@ -585,7 +585,7 @@  discard block
 block discarded – undo
585 585
                             ),
586 586
                         ),
587 587
                         array(
588
-                            'html_id'                 => 'spco-copy-attendee-chk-' . $registration->reg_url_link(),
588
+                            'html_id'                 => 'spco-copy-attendee-chk-'.$registration->reg_url_link(),
589 589
                             'html_class'              => 'spco-copy-attendee-chk ee-do-not-validate',
590 590
                             'display_html_label_text' => false,
591 591
                         )
@@ -650,14 +650,14 @@  discard block
 block discarded – undo
650 650
         }
651 651
         // verify instance
652 652
         if ($answer instanceof EE_Answer) {
653
-            if (! empty($answer_value)) {
653
+            if ( ! empty($answer_value)) {
654 654
                 $answer->set('ANS_value', $answer_value);
655 655
             }
656 656
             $answer->cache('Question', $question);
657 657
             // remember system ID had a bug where sometimes it could be null
658 658
             $answer_cache_id = $question->is_system_question()
659
-                ? $question->system_ID() . '-' . $registration->reg_url_link()
660
-                : $question->ID() . '-' . $registration->reg_url_link();
659
+                ? $question->system_ID().'-'.$registration->reg_url_link()
660
+                : $question->ID().'-'.$registration->reg_url_link();
661 661
             $registration->cache('Answer', $answer, $answer_cache_id);
662 662
         }
663 663
         return $this->_generate_question_input($registration, $question, $answer);
@@ -680,7 +680,7 @@  discard block
 block discarded – undo
680 680
         $identifier = $question->is_system_question()
681 681
             ? $question->system_ID()
682 682
             : $question->ID();
683
-        $this->_required_questions[ $identifier ] = $question->required() ? true : false;
683
+        $this->_required_questions[$identifier] = $question->required() ? true : false;
684 684
         add_filter(
685 685
             'FHEE__EE_Question__generate_form_input__country_options',
686 686
             array($this, 'use_cached_countries_for_form_input'),
@@ -694,17 +694,17 @@  discard block
 block discarded – undo
694 694
             4
695 695
         );
696 696
         $input_constructor_args = array(
697
-            'html_name'        => 'ee_reg_qstn[' . $registration->ID() . '][' . $identifier . ']',
698
-            'html_id'          => 'ee_reg_qstn-' . $registration->ID() . '-' . $identifier,
699
-            'html_class'       => 'ee-reg-qstn ee-reg-qstn-' . $identifier,
700
-            'html_label_id'    => 'ee_reg_qstn-' . $registration->ID() . '-' . $identifier,
697
+            'html_name'        => 'ee_reg_qstn['.$registration->ID().']['.$identifier.']',
698
+            'html_id'          => 'ee_reg_qstn-'.$registration->ID().'-'.$identifier,
699
+            'html_class'       => 'ee-reg-qstn ee-reg-qstn-'.$identifier,
700
+            'html_label_id'    => 'ee_reg_qstn-'.$registration->ID().'-'.$identifier,
701 701
             'html_label_class' => 'ee-reg-qstn',
702 702
         );
703 703
         $input_constructor_args['html_label_id'] .= '-lbl';
704 704
         if ($answer instanceof EE_Answer && $answer->ID()) {
705
-            $input_constructor_args['html_name'] .= '[' . $answer->ID() . ']';
706
-            $input_constructor_args['html_id'] .= '-' . $answer->ID();
707
-            $input_constructor_args['html_label_id'] .= '-' . $answer->ID();
705
+            $input_constructor_args['html_name'] .= '['.$answer->ID().']';
706
+            $input_constructor_args['html_id'] .= '-'.$answer->ID();
707
+            $input_constructor_args['html_label_id'] .= '-'.$answer->ID();
708 708
         }
709 709
         $form_input = $question->generate_form_input(
710 710
             $registration,
@@ -748,10 +748,10 @@  discard block
 block discarded – undo
748 748
         $countries = $this->checkout->action === 'process_reg_step'
749 749
             ? EEM_Country::instance()->get_all_countries()
750 750
             : EEM_Country::instance()->get_all_active_countries();
751
-        if (! empty($countries)) {
751
+        if ( ! empty($countries)) {
752 752
             foreach ($countries as $country) {
753 753
                 if ($country instanceof EE_Country) {
754
-                    $country_options[ $country->ID() ] = $country->name();
754
+                    $country_options[$country->ID()] = $country->name();
755 755
                 }
756 756
             }
757 757
         }
@@ -798,10 +798,10 @@  discard block
 block discarded – undo
798 798
         $states = $this->checkout->action === 'process_reg_step'
799 799
             ? EEM_State::instance()->get_all_states()
800 800
             : EEM_State::instance()->get_all_active_states();
801
-        if (! empty($states)) {
801
+        if ( ! empty($states)) {
802 802
             foreach ($states as $state) {
803 803
                 if ($state instanceof EE_State) {
804
-                    $state_options[ $state->country()->name() ][ $state->ID() ] = $state->name();
804
+                    $state_options[$state->country()->name()][$state->ID()] = $state->name();
805 805
                 }
806 806
             }
807 807
         }
@@ -848,7 +848,7 @@  discard block
 block discarded – undo
848 848
             );
849 849
             return false;
850 850
         }
851
-        if (! $this->checkout->transaction instanceof EE_Transaction || ! $this->checkout->continue_reg) {
851
+        if ( ! $this->checkout->transaction instanceof EE_Transaction || ! $this->checkout->continue_reg) {
852 852
             EE_Error::add_error(
853 853
                 esc_html__(
854 854
                     'A valid transaction could not be initiated for processing your registrations.',
@@ -875,7 +875,7 @@  discard block
 block discarded – undo
875 875
                     '(line break)This can sometimes happen if too much time has been taken to complete the registration process.(line break)Please return to the (link)Event List(end link) and reselect your tickets. If the problem continues, please contact the site administrator.',
876 876
                     'event_espresso'
877 877
                 ),
878
-                '<a href="' . get_post_type_archive_link('espresso_events') . '" >',
878
+                '<a href="'.get_post_type_archive_link('espresso_events').'" >',
879 879
                 '</a>',
880 880
                 '<br />'
881 881
             );
@@ -895,7 +895,7 @@  discard block
 block discarded – undo
895 895
             // but return immediately if the previous step exited early due to errors
896 896
             return false;
897 897
         }
898
-        if (! $this->checkout->revisit && $registrations_processed !== $this->checkout->total_ticket_count) {
898
+        if ( ! $this->checkout->revisit && $registrations_processed !== $this->checkout->total_ticket_count) {
899 899
             // generate a correctly translated string for all possible singular/plural combinations
900 900
             if ($this->checkout->total_ticket_count === 1 && $registrations_processed !== 1) {
901 901
                 $error_msg = sprintf(
@@ -978,7 +978,7 @@  discard block
 block discarded – undo
978 978
         // grab the saved registrations from the transaction
979 979
         foreach ($registrations as $registration) {
980 980
             // verify EE_Registration object
981
-            if (! $registration instanceof EE_Registration) {
981
+            if ( ! $registration instanceof EE_Registration) {
982 982
                 EE_Error::add_error(
983 983
                     esc_html__(
984 984
                         'An invalid Registration object was discovered when attempting to process your registration information.',
@@ -993,12 +993,12 @@  discard block
 block discarded – undo
993 993
             /** @var string $reg_url_link */
994 994
             $reg_url_link = $registration->reg_url_link();
995 995
             // reg_url_link exists ?
996
-            if (! empty($reg_url_link)) {
996
+            if ( ! empty($reg_url_link)) {
997 997
                 // should this registration be processed during this visit ?
998 998
                 if ($this->checkout->visit_allows_processing_of_this_registration($registration)) {
999 999
                     // if NOT revisiting, then let's save the registration now,
1000 1000
                     // so that we have a REG_ID to use when generating other objects
1001
-                    if (! $this->checkout->revisit) {
1001
+                    if ( ! $this->checkout->revisit) {
1002 1002
                         $registration->save();
1003 1003
                     }
1004 1004
                     /**
@@ -1022,18 +1022,18 @@  discard block
 block discarded – undo
1022 1022
 
1023 1023
                     // Houston, we have a registration!
1024 1024
                     $att_nmbr++;
1025
-                    $this->_attendee_data[ $reg_url_link ] = array();
1025
+                    $this->_attendee_data[$reg_url_link] = array();
1026 1026
                     // grab any existing related answer objects
1027 1027
                     $this->_registration_answers = $registration->answers();
1028 1028
                     // unset( $valid_data[ $reg_url_link ]['additional_attendee_reg_info'] );
1029
-                    if (isset($valid_data[ $reg_url_link ])) {
1029
+                    if (isset($valid_data[$reg_url_link])) {
1030 1030
                         // do we need to copy basic info from primary attendee ?
1031
-                        $copy_primary = isset($valid_data[ $reg_url_link ]['additional_attendee_reg_info'])
1032
-                                        && absint($valid_data[ $reg_url_link ]['additional_attendee_reg_info']) === 0;
1031
+                        $copy_primary = isset($valid_data[$reg_url_link]['additional_attendee_reg_info'])
1032
+                                        && absint($valid_data[$reg_url_link]['additional_attendee_reg_info']) === 0;
1033 1033
                         // filter form input data for this registration
1034
-                        $valid_data[ $reg_url_link ] = (array) apply_filters(
1034
+                        $valid_data[$reg_url_link] = (array) apply_filters(
1035 1035
                             'FHEE__EE_Single_Page_Checkout__process_attendee_information__valid_data_line_item',
1036
-                            $valid_data[ $reg_url_link ]
1036
+                            $valid_data[$reg_url_link]
1037 1037
                         );
1038 1038
                         if (isset($valid_data['primary_attendee'])) {
1039 1039
                             $primary_registrant['line_item_id'] = ! empty($valid_data['primary_attendee'])
@@ -1042,12 +1042,12 @@  discard block
 block discarded – undo
1042 1042
                             unset($valid_data['primary_attendee']);
1043 1043
                         }
1044 1044
                         // now loop through our array of valid post data && process attendee reg forms
1045
-                        foreach ($valid_data[ $reg_url_link ] as $form_section => $form_inputs) {
1046
-                            if (! in_array($form_section, $non_input_form_sections, true)) {
1045
+                        foreach ($valid_data[$reg_url_link] as $form_section => $form_inputs) {
1046
+                            if ( ! in_array($form_section, $non_input_form_sections, true)) {
1047 1047
                                 foreach ($form_inputs as $form_input => $input_value) {
1048 1048
                                     // \EEH_Debug_Tools::printr( $input_value, $form_input, __FILE__, __LINE__ );
1049 1049
                                     // check for critical inputs
1050
-                                    if (! $this->_verify_critical_attendee_details_are_set_and_validate_email(
1050
+                                    if ( ! $this->_verify_critical_attendee_details_are_set_and_validate_email(
1051 1051
                                         $form_input,
1052 1052
                                         $input_value
1053 1053
                                     )
@@ -1059,15 +1059,15 @@  discard block
 block discarded – undo
1059 1059
                                         && ! empty($input_value)
1060 1060
                                         && $reg_url_link === $primary_registrant['line_item_id']
1061 1061
                                     ) {
1062
-                                        $primary_registrant[ $form_input ] = $input_value;
1062
+                                        $primary_registrant[$form_input] = $input_value;
1063 1063
                                     } elseif ($copy_primary
1064 1064
                                               && $input_value === null
1065
-                                              && isset($primary_registrant[ $form_input ])
1065
+                                              && isset($primary_registrant[$form_input])
1066 1066
                                     ) {
1067
-                                        $input_value = $primary_registrant[ $form_input ];
1067
+                                        $input_value = $primary_registrant[$form_input];
1068 1068
                                     }
1069 1069
                                     // now attempt to save the input data
1070
-                                    if (! $this->_save_registration_form_input(
1070
+                                    if ( ! $this->_save_registration_form_input(
1071 1071
                                         $registration,
1072 1072
                                         $form_input,
1073 1073
                                         $input_value
@@ -1103,15 +1103,15 @@  discard block
 block discarded – undo
1103 1103
                         $attendee = $this->checkout->primary_attendee_obj;
1104 1104
                     } else {
1105 1105
                         // ensure critical details are set for additional attendees
1106
-                        $this->_attendee_data[ $reg_url_link ] = $att_nmbr > 1
1106
+                        $this->_attendee_data[$reg_url_link] = $att_nmbr > 1
1107 1107
                             ? $this->_copy_critical_attendee_details_from_primary_registrant(
1108
-                                $this->_attendee_data[ $reg_url_link ]
1108
+                                $this->_attendee_data[$reg_url_link]
1109 1109
                             )
1110
-                            : $this->_attendee_data[ $reg_url_link ];
1110
+                            : $this->_attendee_data[$reg_url_link];
1111 1111
                         // execute create attendee command (which may return an existing attendee)
1112 1112
                         $attendee = EE_Registry::instance()->BUS->execute(
1113 1113
                             new CreateAttendeeCommand(
1114
-                                $this->_attendee_data[ $reg_url_link ],
1114
+                                $this->_attendee_data[$reg_url_link],
1115 1115
                                 $registration
1116 1116
                             )
1117 1117
                         );
@@ -1124,7 +1124,7 @@  discard block
 block discarded – undo
1124 1124
                     // add relation to registration, set attendee ID, and cache attendee
1125 1125
                     $this->_associate_attendee_with_registration($registration, $attendee);
1126 1126
                     // \EEH_Debug_Tools::printr( $registration, '$registration', __FILE__, __LINE__ );
1127
-                    if (! $registration->attendee() instanceof EE_Attendee) {
1127
+                    if ( ! $registration->attendee() instanceof EE_Attendee) {
1128 1128
                         EE_Error::add_error(
1129 1129
                             sprintf(
1130 1130
                                 esc_html_x(
@@ -1174,7 +1174,7 @@  discard block
 block discarded – undo
1174 1174
                     __LINE__
1175 1175
                 );
1176 1176
                 // remove malformed data
1177
-                unset($valid_data[ $reg_url_link ]);
1177
+                unset($valid_data[$reg_url_link]);
1178 1178
                 return false;
1179 1179
             }
1180 1180
         } // end of foreach ( $this->checkout->transaction->registrations()  as $registration )
@@ -1220,10 +1220,10 @@  discard block
 block discarded – undo
1220 1220
          * @see https://events.codebasehq.com/projects/event-espresso/tickets/10477
1221 1221
          */
1222 1222
         $answer_cache_id = $this->checkout->reg_url_link
1223
-            ? $form_input . '-' . $registration->reg_url_link()
1223
+            ? $form_input.'-'.$registration->reg_url_link()
1224 1224
             : $form_input;
1225
-        $answer_is_obj = isset($this->_registration_answers[ $answer_cache_id ])
1226
-                         && $this->_registration_answers[ $answer_cache_id ] instanceof EE_Answer;
1225
+        $answer_is_obj = isset($this->_registration_answers[$answer_cache_id])
1226
+                         && $this->_registration_answers[$answer_cache_id] instanceof EE_Answer;
1227 1227
         // rename form_inputs if they are EE_Attendee properties
1228 1228
         switch ((string) $form_input) {
1229 1229
             case 'state':
@@ -1239,28 +1239,28 @@  discard block
 block discarded – undo
1239 1239
                 break;
1240 1240
 
1241 1241
             default:
1242
-                $ATT_input = 'ATT_' . $form_input;
1242
+                $ATT_input = 'ATT_'.$form_input;
1243 1243
                 // EEH_Debug_Tools::printr( $ATT_input, '$ATT_input', __FILE__, __LINE__ );
1244 1244
                 $attendee_property = EEM_Attendee::instance()->has_field($ATT_input) ? true : false;
1245
-                $form_input = $attendee_property ? 'ATT_' . $form_input : $form_input;
1245
+                $form_input = $attendee_property ? 'ATT_'.$form_input : $form_input;
1246 1246
         }
1247 1247
         // EEH_Debug_Tools::printr( $answer_cache_id, '$answer_cache_id', __FILE__, __LINE__ );
1248 1248
         // EEH_Debug_Tools::printr( $attendee_property, '$attendee_property', __FILE__, __LINE__ );
1249 1249
         // EEH_Debug_Tools::printr( $answer_is_obj, '$answer_is_obj', __FILE__, __LINE__ );
1250 1250
         // if this form input has a corresponding attendee property
1251 1251
         if ($attendee_property) {
1252
-            $this->_attendee_data[ $registration->reg_url_link() ][ $form_input ] = $input_value;
1252
+            $this->_attendee_data[$registration->reg_url_link()][$form_input] = $input_value;
1253 1253
             if ($answer_is_obj) {
1254 1254
                 // and delete the corresponding answer since we won't be storing this data in that object
1255
-                $registration->_remove_relation_to($this->_registration_answers[ $answer_cache_id ], 'Answer');
1256
-                $this->_registration_answers[ $answer_cache_id ]->delete_permanently();
1255
+                $registration->_remove_relation_to($this->_registration_answers[$answer_cache_id], 'Answer');
1256
+                $this->_registration_answers[$answer_cache_id]->delete_permanently();
1257 1257
             }
1258 1258
             return true;
1259 1259
         }
1260 1260
         if ($answer_is_obj) {
1261 1261
             // save this data to the answer object
1262
-            $this->_registration_answers[ $answer_cache_id ]->set_value($input_value);
1263
-            $result = $this->_registration_answers[ $answer_cache_id ]->save();
1262
+            $this->_registration_answers[$answer_cache_id]->set_value($input_value);
1263
+            $result = $this->_registration_answers[$answer_cache_id]->save();
1264 1264
             return $result !== false;
1265 1265
         }
1266 1266
         foreach ($this->_registration_answers as $answer) {
@@ -1287,7 +1287,7 @@  discard block
 block discarded – undo
1287 1287
     ) {
1288 1288
         if (empty($input_value)) {
1289 1289
             // if the form input isn't marked as being required, then just return
1290
-            if (! isset($this->_required_questions[ $form_input ]) || ! $this->_required_questions[ $form_input ]) {
1290
+            if ( ! isset($this->_required_questions[$form_input]) || ! $this->_required_questions[$form_input]) {
1291 1291
                 return true;
1292 1292
             }
1293 1293
             switch ($form_input) {
@@ -1398,10 +1398,10 @@  discard block
 block discarded – undo
1398 1398
             $critical_attendee_details = array_merge($critical_attendee_details, $address_details);
1399 1399
         }
1400 1400
         foreach ($critical_attendee_details as $critical_attendee_detail) {
1401
-            if (! isset($attendee_data[ $critical_attendee_detail ])
1402
-                || empty($attendee_data[ $critical_attendee_detail ])
1401
+            if ( ! isset($attendee_data[$critical_attendee_detail])
1402
+                || empty($attendee_data[$critical_attendee_detail])
1403 1403
             ) {
1404
-                $attendee_data[ $critical_attendee_detail ] = $this->checkout->primary_attendee_obj->get(
1404
+                $attendee_data[$critical_attendee_detail] = $this->checkout->primary_attendee_obj->get(
1405 1405
                     $critical_attendee_detail
1406 1406
                 );
1407 1407
             }
Please login to merge, or discard this patch.
Indentation   +1425 added lines, -1425 removed lines patch added patch discarded remove patch
@@ -18,1433 +18,1433 @@
 block discarded – undo
18 18
 class EE_SPCO_Reg_Step_Attendee_Information extends EE_SPCO_Reg_Step
19 19
 {
20 20
 
21
-    /**
22
-     * @type bool $_print_copy_info
23
-     */
24
-    private $_print_copy_info = false;
25
-
26
-    /**
27
-     * @type array $_attendee_data
28
-     */
29
-    private $_attendee_data = array();
30
-
31
-    /**
32
-     * @type array $_required_questions
33
-     */
34
-    private $_required_questions = array();
35
-
36
-    /**
37
-     * @type array $_registration_answers
38
-     */
39
-    private $_registration_answers = array();
40
-
41
-
42
-    /**
43
-     *    class constructor
44
-     *
45
-     * @access    public
46
-     * @param    EE_Checkout $checkout
47
-     */
48
-    public function __construct(EE_Checkout $checkout)
49
-    {
50
-        $this->_slug = 'attendee_information';
51
-        $this->_name = esc_html__('Attendee Information', 'event_espresso');
52
-        $this->_template = SPCO_REG_STEPS_PATH . $this->_slug . '/attendee_info_main.template.php';
53
-        $this->checkout = $checkout;
54
-        $this->_reset_success_message();
55
-        $this->set_instructions(
56
-            esc_html__('Please answer the following registration questions before proceeding.', 'event_espresso')
57
-        );
58
-    }
59
-
60
-
61
-    public function translate_js_strings()
62
-    {
63
-        EE_Registry::$i18n_js_strings['required_field'] = esc_html__(
64
-            ' is a required question.',
65
-            'event_espresso'
66
-        );
67
-        EE_Registry::$i18n_js_strings['required_multi_field'] = esc_html__(
68
-            ' is a required question. Please enter a value for at least one of the options.',
69
-            'event_espresso'
70
-        );
71
-        EE_Registry::$i18n_js_strings['answer_required_questions'] = esc_html__(
72
-            'Please answer all required questions correctly before proceeding.',
73
-            'event_espresso'
74
-        );
75
-        EE_Registry::$i18n_js_strings['attendee_info_copied'] = sprintf(
76
-            esc_html_x(
77
-                'The attendee information was successfully copied.%sPlease ensure the rest of the registration form is completed before proceeding.',
78
-                'The attendee information was successfully copied.(line break)Please ensure the rest of the registration form is completed before proceeding.',
79
-                'event_espresso'
80
-            ),
81
-            '<br/>'
82
-        );
83
-        EE_Registry::$i18n_js_strings['attendee_info_copy_error'] = esc_html__(
84
-            'An unknown error occurred on the server while attempting to copy the attendee information. Please refresh the page and try again.',
85
-            'event_espresso'
86
-        );
87
-        EE_Registry::$i18n_js_strings['enter_valid_email'] = esc_html__(
88
-            'You must enter a valid email address.',
89
-            'event_espresso'
90
-        );
91
-        EE_Registry::$i18n_js_strings['valid_email_and_questions'] = esc_html__(
92
-            'You must enter a valid email address and answer all other required questions before you can proceed.',
93
-            'event_espresso'
94
-        );
95
-    }
96
-
97
-
98
-    public function enqueue_styles_and_scripts()
99
-    {
100
-    }
101
-
102
-
103
-    /**
104
-     * @return boolean
105
-     */
106
-    public function initialize_reg_step()
107
-    {
108
-        return true;
109
-    }
110
-
111
-
112
-    /**
113
-     * @return EE_Form_Section_Proper
114
-     * @throws DomainException
115
-     * @throws EE_Error
116
-     * @throws InvalidArgumentException
117
-     * @throws ReflectionException
118
-     * @throws EntityNotFoundException
119
-     * @throws InvalidDataTypeException
120
-     * @throws InvalidInterfaceException
121
-     */
122
-    public function generate_reg_form()
123
-    {
124
-        /**
125
-         * @var $reg_config EE_Registration_Config
126
-         */
127
-        $reg_config = LoaderFactory::getLoader()->getShared('EE_Registration_Config');
21
+	/**
22
+	 * @type bool $_print_copy_info
23
+	 */
24
+	private $_print_copy_info = false;
25
+
26
+	/**
27
+	 * @type array $_attendee_data
28
+	 */
29
+	private $_attendee_data = array();
30
+
31
+	/**
32
+	 * @type array $_required_questions
33
+	 */
34
+	private $_required_questions = array();
35
+
36
+	/**
37
+	 * @type array $_registration_answers
38
+	 */
39
+	private $_registration_answers = array();
40
+
41
+
42
+	/**
43
+	 *    class constructor
44
+	 *
45
+	 * @access    public
46
+	 * @param    EE_Checkout $checkout
47
+	 */
48
+	public function __construct(EE_Checkout $checkout)
49
+	{
50
+		$this->_slug = 'attendee_information';
51
+		$this->_name = esc_html__('Attendee Information', 'event_espresso');
52
+		$this->_template = SPCO_REG_STEPS_PATH . $this->_slug . '/attendee_info_main.template.php';
53
+		$this->checkout = $checkout;
54
+		$this->_reset_success_message();
55
+		$this->set_instructions(
56
+			esc_html__('Please answer the following registration questions before proceeding.', 'event_espresso')
57
+		);
58
+	}
59
+
60
+
61
+	public function translate_js_strings()
62
+	{
63
+		EE_Registry::$i18n_js_strings['required_field'] = esc_html__(
64
+			' is a required question.',
65
+			'event_espresso'
66
+		);
67
+		EE_Registry::$i18n_js_strings['required_multi_field'] = esc_html__(
68
+			' is a required question. Please enter a value for at least one of the options.',
69
+			'event_espresso'
70
+		);
71
+		EE_Registry::$i18n_js_strings['answer_required_questions'] = esc_html__(
72
+			'Please answer all required questions correctly before proceeding.',
73
+			'event_espresso'
74
+		);
75
+		EE_Registry::$i18n_js_strings['attendee_info_copied'] = sprintf(
76
+			esc_html_x(
77
+				'The attendee information was successfully copied.%sPlease ensure the rest of the registration form is completed before proceeding.',
78
+				'The attendee information was successfully copied.(line break)Please ensure the rest of the registration form is completed before proceeding.',
79
+				'event_espresso'
80
+			),
81
+			'<br/>'
82
+		);
83
+		EE_Registry::$i18n_js_strings['attendee_info_copy_error'] = esc_html__(
84
+			'An unknown error occurred on the server while attempting to copy the attendee information. Please refresh the page and try again.',
85
+			'event_espresso'
86
+		);
87
+		EE_Registry::$i18n_js_strings['enter_valid_email'] = esc_html__(
88
+			'You must enter a valid email address.',
89
+			'event_espresso'
90
+		);
91
+		EE_Registry::$i18n_js_strings['valid_email_and_questions'] = esc_html__(
92
+			'You must enter a valid email address and answer all other required questions before you can proceed.',
93
+			'event_espresso'
94
+		);
95
+	}
96
+
97
+
98
+	public function enqueue_styles_and_scripts()
99
+	{
100
+	}
101
+
102
+
103
+	/**
104
+	 * @return boolean
105
+	 */
106
+	public function initialize_reg_step()
107
+	{
108
+		return true;
109
+	}
110
+
111
+
112
+	/**
113
+	 * @return EE_Form_Section_Proper
114
+	 * @throws DomainException
115
+	 * @throws EE_Error
116
+	 * @throws InvalidArgumentException
117
+	 * @throws ReflectionException
118
+	 * @throws EntityNotFoundException
119
+	 * @throws InvalidDataTypeException
120
+	 * @throws InvalidInterfaceException
121
+	 */
122
+	public function generate_reg_form()
123
+	{
124
+		/**
125
+		 * @var $reg_config EE_Registration_Config
126
+		 */
127
+		$reg_config = LoaderFactory::getLoader()->getShared('EE_Registration_Config');
128 128
  
129
-        $this->_print_copy_info = $reg_config->copyAttendeeInfo();
130
-
131
-        $primary_registrant = null;
132
-        // autoload Line_Item_Display classes
133
-        EEH_Autoloader::register_line_item_display_autoloaders();
134
-        $Line_Item_Display = new EE_Line_Item_Display();
135
-        // calculate taxes
136
-        $Line_Item_Display->display_line_item(
137
-            $this->checkout->cart->get_grand_total(),
138
-            array('set_tax_rate' => true)
139
-        );
140
-        /** @var $subsections EE_Form_Section_Proper[] */
141
-        $extra_inputs_section = $this->reg_step_hidden_inputs();
142
-        $subsections = array(
143
-            'default_hidden_inputs' => $extra_inputs_section,
144
-        );
145
-
146
-        // if this isn't a revisit, and they have the privacy consent box enalbed, add it
147
-        if (! $this->checkout->revisit && $reg_config->isConsentCheckboxEnabled()) {
148
-            $extra_inputs_section->add_subsections(
149
-                array(
150
-                    'consent_box' => new EE_Form_Section_Proper(
151
-                        array(
152
-                            'layout_strategy' =>
153
-                                new EE_Template_Layout(
154
-                                    array(
155
-                                        'input_template_file' => SPCO_REG_STEPS_PATH . $this->_slug . '/privacy_consent.template.php',
156
-                                    )
157
-                                ),
158
-                            'subsections'     => array(
159
-                                'consent' => new EE_Checkbox_Multi_Input(
160
-                                    array(
161
-                                        'consent' => $reg_config->getConsentCheckboxLabelText(),
162
-                                    ),
163
-                                    array(
164
-                                        'required'                          => true,
165
-                                        'required_validation_error_message' => esc_html__(
166
-                                            'You must consent to these terms in order to register.',
167
-                                            'event_espresso'
168
-                                        ),
169
-                                        'html_label_text'                   => '',
170
-                                    )
171
-                                ),
172
-                            ),
173
-                        )
174
-                    ),
175
-                ),
176
-                null,
177
-                false
178
-            );
179
-        }
180
-        $template_args = array(
181
-            'revisit'       => $this->checkout->revisit,
182
-            'registrations' => array(),
183
-            'ticket_count'  => array(),
184
-        );
185
-        // grab the saved registrations from the transaction
186
-        $registrations = $this->checkout->transaction->registrations($this->checkout->reg_cache_where_params);
187
-        if ($registrations) {
188
-            foreach ($registrations as $registration) {
189
-                // can this registration be processed during this visit ?
190
-                if ($registration instanceof EE_Registration
191
-                    && $this->checkout->visit_allows_processing_of_this_registration($registration)
192
-                ) {
193
-                    $subsections[ $registration->reg_url_link() ] = $this->_registrations_reg_form($registration);
194
-                    $template_args['registrations'][ $registration->reg_url_link() ] = $registration;
195
-                    $template_args['ticket_count'][ $registration->ticket()->ID() ] = isset(
196
-                        $template_args['ticket_count'][ $registration->ticket()->ID() ]
197
-                    )
198
-                        ? $template_args['ticket_count'][ $registration->ticket()->ID() ] + 1
199
-                        : 1;
200
-                    $ticket_line_item = EEH_Line_Item::get_line_items_by_object_type_and_IDs(
201
-                        $this->checkout->cart->get_grand_total(),
202
-                        'Ticket',
203
-                        array($registration->ticket()->ID())
204
-                    );
205
-                    $ticket_line_item = is_array($ticket_line_item)
206
-                        ? reset($ticket_line_item)
207
-                        : $ticket_line_item;
208
-                    $template_args['ticket_line_item'][ $registration->ticket()->ID() ] =
209
-                        $Line_Item_Display->display_line_item($ticket_line_item);
210
-                    if ($registration->is_primary_registrant()) {
211
-                        $primary_registrant = $registration->reg_url_link();
212
-                    }
213
-                }
214
-            }
215
-
216
-            if ($primary_registrant && count($registrations) > 1) {
217
-                $copy_options['spco_copy_attendee_chk'] = $this->_print_copy_info
218
-                    ? $this->_copy_attendee_info_form()
219
-                    : $this->_auto_copy_attendee_info();
220
-                // generate hidden input
221
-                if (isset($subsections[ $primary_registrant ])
222
-                    && $subsections[ $primary_registrant ] instanceof EE_Form_Section_Proper
223
-                ) {
224
-                    $subsections[ $primary_registrant ]->add_subsections(
225
-                        $copy_options,
226
-                        'primary_registrant',
227
-                        false
228
-                    );
229
-                }
230
-            }
231
-        }
232
-        return new EE_Form_Section_Proper(
233
-            array(
234
-                'name'            => $this->reg_form_name(),
235
-                'html_id'         => $this->reg_form_name(),
236
-                'subsections'     => $subsections,
237
-                'layout_strategy' => new EE_Template_Layout(
238
-                    array(
239
-                        'layout_template_file' => $this->_template, // layout_template
240
-                        'template_args'        => $template_args,
241
-                    )
242
-                ),
243
-            )
244
-        );
245
-    }
246
-
247
-
248
-    /**
249
-     * @param EE_Registration $registration
250
-     * @return EE_Form_Section_Base
251
-     * @throws EE_Error
252
-     * @throws InvalidArgumentException
253
-     * @throws EntityNotFoundException
254
-     * @throws InvalidDataTypeException
255
-     * @throws InvalidInterfaceException
256
-     * @throws ReflectionException
257
-     */
258
-    private function _registrations_reg_form(EE_Registration $registration)
259
-    {
260
-        static $attendee_nmbr = 1;
261
-        $form_args = array();
262
-        // verify that registration has valid event
263
-        if ($registration->event() instanceof EE_Event) {
264
-            $field_name = 'Event_Question_Group.'
265
-                . EEM_Event_Question_Group::instance()->fieldNameForContext(
266
-                    $registration->is_primary_registrant()
267
-                );
268
-            $question_groups = $registration->event()->question_groups(
269
-                apply_filters(
270
-                    // @codingStandardsIgnoreStart
271
-                    'FHEE__EE_SPCO_Reg_Step_Attendee_Information___registrations_reg_form__question_groups_query_parameters',
272
-                    // @codingStandardsIgnoreEnd
273
-                    [
274
-                        [
275
-                            'Event.EVT_ID'                     => $registration->event()->ID(),
276
-                            $field_name => true,
277
-                        ],
278
-                        'order_by' => ['QSG_order' => 'ASC'],
279
-                    ],
280
-                    $registration,
281
-                    $this
282
-                )
283
-            );
284
-            if ($question_groups) {
285
-                // array of params to pass to parent constructor
286
-                $form_args = array(
287
-                    'html_id'         => 'ee-registration-' . $registration->reg_url_link(),
288
-                    'html_class'      => 'ee-reg-form-attendee-dv',
289
-                    'html_style'      => $this->checkout->admin_request
290
-                        ? 'padding:0em 2em 1em; margin:3em 0 0; border:1px solid #ddd;'
291
-                        : '',
292
-                    'subsections'     => array(),
293
-                    'layout_strategy' => new EE_Fieldset_Section_Layout(
294
-                        array(
295
-                            'legend_class' => 'spco-attendee-lgnd smaller-text lt-grey-text',
296
-                            'legend_text'  => sprintf(
297
-                                esc_html_x(
298
-                                    'Attendee %d',
299
-                                    'Attendee 123',
300
-                                    'event_espresso'
301
-                                ),
302
-                                $attendee_nmbr
303
-                            ),
304
-                        )
305
-                    ),
306
-                );
307
-                foreach ($question_groups as $question_group) {
308
-                    if ($question_group instanceof EE_Question_Group) {
309
-                        $form_args['subsections'][ $question_group->identifier() ] = $this->_question_group_reg_form(
310
-                            $registration,
311
-                            $question_group
312
-                        );
313
-                    }
314
-                }
315
-                // add hidden input
316
-                $form_args['subsections']['additional_attendee_reg_info'] = $this->_additional_attendee_reg_info_input(
317
-                    $registration
318
-                );
319
-
320
-                /**
321
-                 * @var $reg_config EE_Registration_Config
322
-                 */
323
-                $reg_config = LoaderFactory::getLoader()->getShared('EE_Registration_Config');
324
-
325
-                // If we have question groups for additional attendees, then display the copy options
326
-                $this->_print_copy_info = apply_filters(
327
-                    'FHEE__EE_SPCO_Reg_Step_Attendee_Information___registrations_reg_form___printCopyInfo',
328
-                    $attendee_nmbr > 1 ? $reg_config->copyAttendeeInfo() : false,
329
-                    $attendee_nmbr
330
-                );
331
-
332
-                if ($registration->is_primary_registrant()) {
333
-                    // generate hidden input
334
-                    $form_args['subsections']['primary_registrant'] = $this->_additional_primary_registrant_inputs(
335
-                        $registration
336
-                    );
337
-                }
338
-            }
339
-        }
340
-        $attendee_nmbr++;
341
-        return ! empty($form_args)
342
-            ? new EE_Form_Section_Proper($form_args)
343
-            : new EE_Form_Section_HTML();
344
-    }
345
-
346
-
347
-    /**
348
-     * @param EE_Registration $registration
349
-     * @param bool            $additional_attendee_reg_info
350
-     * @return EE_Form_Input_Base
351
-     * @throws EE_Error
352
-     */
353
-    private function _additional_attendee_reg_info_input(
354
-        EE_Registration $registration,
355
-        $additional_attendee_reg_info = true
356
-    ) {
357
-        // generate hidden input
358
-        return new EE_Hidden_Input(
359
-            array(
360
-                'html_id' => 'additional-attendee-reg-info-' . $registration->reg_url_link(),
361
-                'default' => $additional_attendee_reg_info,
362
-            )
363
-        );
364
-    }
365
-
366
-
367
-    /**
368
-     * @param EE_Registration   $registration
369
-     * @param EE_Question_Group $question_group
370
-     * @return EE_Form_Section_Proper
371
-     * @throws EE_Error
372
-     * @throws InvalidArgumentException
373
-     * @throws InvalidDataTypeException
374
-     * @throws InvalidInterfaceException
375
-     * @throws ReflectionException
376
-     */
377
-    private function _question_group_reg_form(EE_Registration $registration, EE_Question_Group $question_group)
378
-    {
379
-        // array of params to pass to parent constructor
380
-        $form_args = array(
381
-            'html_id'         => 'ee-reg-form-qstn-grp-' . $question_group->identifier() . '-' . $registration->ID(),
382
-            'html_class'      => $this->checkout->admin_request
383
-                ? 'form-table ee-reg-form-qstn-grp-dv'
384
-                : 'ee-reg-form-qstn-grp-dv',
385
-            'html_label_id'   => 'ee-reg-form-qstn-grp-' . $question_group->identifier() . '-'
386
-                                 . $registration->ID() . '-lbl',
387
-            'subsections'     => array(
388
-                'reg_form_qstn_grp_hdr' => $this->_question_group_header($question_group),
389
-            ),
390
-            'layout_strategy' => $this->checkout->admin_request
391
-                ? new EE_Admin_Two_Column_Layout()
392
-                : new EE_Div_Per_Section_Layout(),
393
-        );
394
-        // where params
395
-        $query_params = array('QST_deleted' => 0);
396
-        // don't load admin only questions on the frontend
397
-        if (! $this->checkout->admin_request) {
398
-            $query_params['QST_admin_only'] = array('!=', true);
399
-        }
400
-        $questions = $question_group->get_many_related(
401
-            'Question',
402
-            apply_filters(
403
-                'FHEE__EE_SPCO_Reg_Step_Attendee_Information___question_group_reg_form__related_questions_query_params',
404
-                array(
405
-                    $query_params,
406
-                    'order_by' => array(
407
-                        'Question_Group_Question.QGQ_order' => 'ASC',
408
-                    ),
409
-                ),
410
-                $question_group,
411
-                $registration,
412
-                $this
413
-            )
414
-        );
415
-        // filter for additional content before questions
416
-        $form_args['subsections']['reg_form_questions_before'] = new EE_Form_Section_HTML(
417
-            apply_filters(
418
-                'FHEE__EEH_Form_Fields__generate_question_groups_html__before_question_group_questions',
419
-                '',
420
-                $registration,
421
-                $question_group,
422
-                $this
423
-            )
424
-        );
425
-        // loop thru questions
426
-        foreach ($questions as $question) {
427
-            if ($question instanceof EE_Question) {
428
-                $identifier = $question->is_system_question()
429
-                    ? $question->system_ID()
430
-                    : $question->ID();
431
-                $form_args['subsections'][ $identifier ] = $this->reg_form_question($registration, $question);
432
-            }
433
-        }
434
-        $form_args['subsections'] = apply_filters(
435
-            'FHEE__EE_SPCO_Reg_Step_Attendee_Information__question_group_reg_form__subsections_array',
436
-            $form_args['subsections'],
437
-            $registration,
438
-            $question_group,
439
-            $this
440
-        );
441
-        // filter for additional content after questions
442
-        $form_args['subsections']['reg_form_questions_after'] = new EE_Form_Section_HTML(
443
-            apply_filters(
444
-                'FHEE__EEH_Form_Fields__generate_question_groups_html__after_question_group_questions',
445
-                '',
446
-                $registration,
447
-                $question_group,
448
-                $this
449
-            )
450
-        );
451
-        // d($form_args);
452
-        $question_group_reg_form = new EE_Form_Section_Proper($form_args);
453
-        return apply_filters(
454
-            'FHEE__EE_SPCO_Reg_Step_Attendee_Information___question_group_reg_form__question_group_reg_form',
455
-            $question_group_reg_form,
456
-            $registration,
457
-            $question_group,
458
-            $this
459
-        );
460
-    }
461
-
462
-
463
-    /**
464
-     * @param EE_Question_Group $question_group
465
-     * @return    EE_Form_Section_HTML
466
-     */
467
-    private function _question_group_header(EE_Question_Group $question_group)
468
-    {
469
-        $html = '';
470
-        // group_name
471
-        if ($question_group->show_group_name() && $question_group->name() !== '') {
472
-            if ($this->checkout->admin_request) {
473
-                $html .= EEH_HTML::br();
474
-                $html .= EEH_HTML::h3(
475
-                    $question_group->name(),
476
-                    '',
477
-                    'ee-reg-form-qstn-grp-title title',
478
-                    'font-size: 1.3em; padding-left:0;'
479
-                );
480
-            } else {
481
-                $html .= EEH_HTML::h4(
482
-                    $question_group->name(),
483
-                    '',
484
-                    'ee-reg-form-qstn-grp-title section-title'
485
-                );
486
-            }
487
-        }
488
-        // group_desc
489
-        if ($question_group->show_group_desc() && $question_group->desc() !== '') {
490
-            $html .= EEH_HTML::p(
491
-                $question_group->desc(),
492
-                '',
493
-                $this->checkout->admin_request
494
-                    ? 'ee-reg-form-qstn-grp-desc-pg'
495
-                    : 'ee-reg-form-qstn-grp-desc-pg small-text lt-grey-text'
496
-            );
497
-        }
498
-        return new EE_Form_Section_HTML($html);
499
-    }
500
-
501
-
502
-    /**
503
-     * @return    EE_Form_Section_Proper
504
-     * @throws EE_Error
505
-     * @throws InvalidArgumentException
506
-     * @throws ReflectionException
507
-     * @throws InvalidDataTypeException
508
-     * @throws InvalidInterfaceException
509
-     */
510
-    private function _copy_attendee_info_form()
511
-    {
512
-        // array of params to pass to parent constructor
513
-        return new EE_Form_Section_Proper(
514
-            array(
515
-                'subsections'     => $this->_copy_attendee_info_inputs(),
516
-                'layout_strategy' => new EE_Template_Layout(
517
-                    array(
518
-                        'layout_template_file'     => SPCO_REG_STEPS_PATH
519
-                                                      . $this->_slug
520
-                                                      . '/copy_attendee_info.template.php',
521
-                        'begin_template_file'      => null,
522
-                        'input_template_file'      => null,
523
-                        'subsection_template_file' => null,
524
-                        'end_template_file'        => null,
525
-                    )
526
-                ),
527
-            )
528
-        );
529
-    }
530
-
531
-
532
-    /**
533
-     * @return EE_Form_Section_HTML
534
-     * @throws DomainException
535
-     * @throws InvalidArgumentException
536
-     * @throws InvalidDataTypeException
537
-     * @throws InvalidInterfaceException
538
-     */
539
-    private function _auto_copy_attendee_info()
540
-    {
541
-        return new EE_Form_Section_HTML(
542
-            EEH_Template::locate_template(
543
-                SPCO_REG_STEPS_PATH . $this->_slug . '/_auto_copy_attendee_info.template.php',
544
-                apply_filters(
545
-                    'FHEE__EE_SPCO_Reg_Step_Attendee_Information__auto_copy_attendee_info__template_args',
546
-                    array()
547
-                ),
548
-                true,
549
-                true
550
-            )
551
-        );
552
-    }
553
-
554
-
555
-    /**
556
-     * @return array
557
-     * @throws EE_Error
558
-     * @throws InvalidArgumentException
559
-     * @throws ReflectionException
560
-     * @throws InvalidDataTypeException
561
-     * @throws InvalidInterfaceException
562
-     */
563
-    private function _copy_attendee_info_inputs()
564
-    {
565
-        $copy_attendee_info_inputs = array();
566
-        $prev_ticket = null;
567
-        // grab the saved registrations from the transaction
568
-        $registrations = $this->checkout->transaction->registrations($this->checkout->reg_cache_where_params);
569
-        foreach ($registrations as $registration) {
570
-            // for all  attendees other than the primary attendee
571
-            if ($registration instanceof EE_Registration && ! $registration->is_primary_registrant()) {
572
-                // if this is a new ticket OR if this is the very first additional attendee after the primary attendee
573
-                if ($registration->ticket()->ID() !== $prev_ticket) {
574
-                    $item_name = $registration->ticket()->name();
575
-                    $item_name .= $registration->ticket()->description() !== ''
576
-                        ? ' - ' . $registration->ticket()->description()
577
-                        : '';
578
-                    $copy_attendee_info_inputs[ 'spco_copy_attendee_chk[ticket-' . $registration->ticket()->ID(
579
-                    ) . ']' ] =
580
-                        new EE_Form_Section_HTML(
581
-                            '<h6 class="spco-copy-attendee-event-hdr">' . $item_name . '</h6>'
582
-                        );
583
-                    $prev_ticket = $registration->ticket()->ID();
584
-                }
585
-
586
-                $copy_attendee_info_inputs[ 'spco_copy_attendee_chk[' . $registration->ID() . ']' ] =
587
-                    new EE_Checkbox_Multi_Input(
588
-                        array(
589
-                            $registration->ID() => sprintf(
590
-                                esc_html_x('Attendee #%s', 'Attendee #123', 'event_espresso'),
591
-                                $registration->count()
592
-                            ),
593
-                        ),
594
-                        array(
595
-                            'html_id'                 => 'spco-copy-attendee-chk-' . $registration->reg_url_link(),
596
-                            'html_class'              => 'spco-copy-attendee-chk ee-do-not-validate',
597
-                            'display_html_label_text' => false,
598
-                        )
599
-                    );
600
-            }
601
-        }
602
-        return $copy_attendee_info_inputs;
603
-    }
604
-
605
-
606
-    /**
607
-     * @param EE_Registration $registration
608
-     * @return    EE_Form_Input_Base
609
-     * @throws EE_Error
610
-     */
611
-    private function _additional_primary_registrant_inputs(EE_Registration $registration)
612
-    {
613
-        // generate hidden input
614
-        return new EE_Hidden_Input(
615
-            array(
616
-                'html_id' => 'primary_registrant',
617
-                'default' => $registration->reg_url_link(),
618
-            )
619
-        );
620
-    }
621
-
622
-
623
-    /**
624
-     * @param EE_Registration $registration
625
-     * @param EE_Question     $question
626
-     * @return EE_Form_Input_Base
627
-     * @throws EE_Error
628
-     * @throws InvalidArgumentException
629
-     * @throws InvalidDataTypeException
630
-     * @throws InvalidInterfaceException
631
-     * @throws ReflectionException
632
-     */
633
-    public function reg_form_question(EE_Registration $registration, EE_Question $question)
634
-    {
635
-
636
-        // if this question was for an attendee detail, then check for that answer
637
-        $answer_value = EEM_Answer::instance()->get_attendee_property_answer_value(
638
-            $registration,
639
-            $question->system_ID()
640
-        );
641
-        $answer = $answer_value === null
642
-            ? EEM_Answer::instance()->get_one(
643
-                array(array('QST_ID' => $question->ID(), 'REG_ID' => $registration->ID()))
644
-            )
645
-            : null;
646
-        // if NOT returning to edit an existing registration
647
-        // OR if this question is for an attendee property
648
-        // OR we still don't have an EE_Answer object
649
-        if ($answer_value || ! $answer instanceof EE_Answer || ! $registration->reg_url_link()) {
650
-            // create an EE_Answer object for storing everything in
651
-            $answer = EE_Answer::new_instance(
652
-                array(
653
-                    'QST_ID' => $question->ID(),
654
-                    'REG_ID' => $registration->ID(),
655
-                )
656
-            );
657
-        }
658
-        // verify instance
659
-        if ($answer instanceof EE_Answer) {
660
-            if (! empty($answer_value)) {
661
-                $answer->set('ANS_value', $answer_value);
662
-            }
663
-            $answer->cache('Question', $question);
664
-            // remember system ID had a bug where sometimes it could be null
665
-            $answer_cache_id = $question->is_system_question()
666
-                ? $question->system_ID() . '-' . $registration->reg_url_link()
667
-                : $question->ID() . '-' . $registration->reg_url_link();
668
-            $registration->cache('Answer', $answer, $answer_cache_id);
669
-        }
670
-        return $this->_generate_question_input($registration, $question, $answer);
671
-    }
672
-
673
-
674
-    /**
675
-     * @param EE_Registration $registration
676
-     * @param EE_Question     $question
677
-     * @param                 $answer
678
-     * @return EE_Form_Input_Base
679
-     * @throws EE_Error
680
-     * @throws InvalidArgumentException
681
-     * @throws ReflectionException
682
-     * @throws InvalidDataTypeException
683
-     * @throws InvalidInterfaceException
684
-     */
685
-    private function _generate_question_input(EE_Registration $registration, EE_Question $question, $answer)
686
-    {
687
-        $identifier = $question->is_system_question()
688
-            ? $question->system_ID()
689
-            : $question->ID();
690
-        $this->_required_questions[ $identifier ] = $question->required() ? true : false;
691
-        add_filter(
692
-            'FHEE__EE_Question__generate_form_input__country_options',
693
-            array($this, 'use_cached_countries_for_form_input'),
694
-            10,
695
-            4
696
-        );
697
-        add_filter(
698
-            'FHEE__EE_Question__generate_form_input__state_options',
699
-            array($this, 'use_cached_states_for_form_input'),
700
-            10,
701
-            4
702
-        );
703
-        $input_constructor_args = array(
704
-            'html_name'        => 'ee_reg_qstn[' . $registration->ID() . '][' . $identifier . ']',
705
-            'html_id'          => 'ee_reg_qstn-' . $registration->ID() . '-' . $identifier,
706
-            'html_class'       => 'ee-reg-qstn ee-reg-qstn-' . $identifier,
707
-            'html_label_id'    => 'ee_reg_qstn-' . $registration->ID() . '-' . $identifier,
708
-            'html_label_class' => 'ee-reg-qstn',
709
-        );
710
-        $input_constructor_args['html_label_id'] .= '-lbl';
711
-        if ($answer instanceof EE_Answer && $answer->ID()) {
712
-            $input_constructor_args['html_name'] .= '[' . $answer->ID() . ']';
713
-            $input_constructor_args['html_id'] .= '-' . $answer->ID();
714
-            $input_constructor_args['html_label_id'] .= '-' . $answer->ID();
715
-        }
716
-        $form_input = $question->generate_form_input(
717
-            $registration,
718
-            $answer,
719
-            $input_constructor_args
720
-        );
721
-        remove_filter(
722
-            'FHEE__EE_Question__generate_form_input__country_options',
723
-            array($this, 'use_cached_countries_for_form_input')
724
-        );
725
-        remove_filter(
726
-            'FHEE__EE_Question__generate_form_input__state_options',
727
-            array($this, 'use_cached_states_for_form_input')
728
-        );
729
-        return $form_input;
730
-    }
731
-
732
-
733
-    /**
734
-     * Gets the list of countries for the form input
735
-     *
736
-     * @param array|null      $countries_list
737
-     * @param EE_Question     $question
738
-     * @param EE_Registration $registration
739
-     * @param EE_Answer       $answer
740
-     * @return array 2d keys are country IDs, values are their names
741
-     * @throws EE_Error
742
-     * @throws InvalidArgumentException
743
-     * @throws InvalidDataTypeException
744
-     * @throws InvalidInterfaceException
745
-     * @throws ReflectionException
746
-     */
747
-    public function use_cached_countries_for_form_input(
748
-        $countries_list,
749
-        EE_Question $question = null,
750
-        EE_Registration $registration = null,
751
-        EE_Answer $answer = null
752
-    ) {
753
-        $country_options = array('' => '');
754
-        // get possibly cached list of countries
755
-        $countries = $this->checkout->action === 'process_reg_step'
756
-            ? EEM_Country::instance()->get_all_countries()
757
-            : EEM_Country::instance()->get_all_active_countries();
758
-        if (! empty($countries)) {
759
-            foreach ($countries as $country) {
760
-                if ($country instanceof EE_Country) {
761
-                    $country_options[ $country->ID() ] = $country->name();
762
-                }
763
-            }
764
-        }
765
-        if ($question instanceof EE_Question && $registration instanceof EE_Registration) {
766
-            $answer = EEM_Answer::instance()->get_one(
767
-                array(array('QST_ID' => $question->ID(), 'REG_ID' => $registration->ID()))
768
-            );
769
-        } else {
770
-            $answer = EE_Answer::new_instance();
771
-        }
772
-        $country_options = apply_filters(
773
-            'FHEE__EE_SPCO_Reg_Step_Attendee_Information___generate_question_input__country_options',
774
-            $country_options,
775
-            $this,
776
-            $registration,
777
-            $question,
778
-            $answer
779
-        );
780
-        return $country_options;
781
-    }
782
-
783
-
784
-    /**
785
-     * Gets the list of states for the form input
786
-     *
787
-     * @param array|null      $states_list
788
-     * @param EE_Question     $question
789
-     * @param EE_Registration $registration
790
-     * @param EE_Answer       $answer
791
-     * @return array 2d keys are state IDs, values are their names
792
-     * @throws EE_Error
793
-     * @throws InvalidArgumentException
794
-     * @throws InvalidDataTypeException
795
-     * @throws InvalidInterfaceException
796
-     * @throws ReflectionException
797
-     */
798
-    public function use_cached_states_for_form_input(
799
-        $states_list,
800
-        EE_Question $question = null,
801
-        EE_Registration $registration = null,
802
-        EE_Answer $answer = null
803
-    ) {
804
-        $state_options = array('' => array('' => ''));
805
-        $states = $this->checkout->action === 'process_reg_step'
806
-            ? EEM_State::instance()->get_all_states()
807
-            : EEM_State::instance()->get_all_active_states();
808
-        if (! empty($states)) {
809
-            foreach ($states as $state) {
810
-                if ($state instanceof EE_State) {
811
-                    $state_options[ $state->country()->name() ][ $state->ID() ] = $state->name();
812
-                }
813
-            }
814
-        }
815
-        $state_options = apply_filters(
816
-            'FHEE__EE_SPCO_Reg_Step_Attendee_Information___generate_question_input__state_options',
817
-            $state_options,
818
-            $this,
819
-            $registration,
820
-            $question,
821
-            $answer
822
-        );
823
-        return $state_options;
824
-    }
825
-
826
-
827
-    /********************************************************************************************************/
828
-    /****************************************  PROCESS REG STEP  ****************************************/
829
-    /********************************************************************************************************/
830
-
831
-
832
-    /**
833
-     * @return bool
834
-     * @throws EE_Error
835
-     * @throws InvalidArgumentException
836
-     * @throws ReflectionException
837
-     * @throws RuntimeException
838
-     * @throws InvalidDataTypeException
839
-     * @throws InvalidInterfaceException
840
-     */
841
-    public function process_reg_step()
842
-    {
843
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
844
-        // grab validated data from form
845
-        $valid_data = $this->checkout->current_step->valid_data();
846
-        // EEH_Debug_Tools::printr( $_REQUEST, '$_REQUEST', __FILE__, __LINE__ );
847
-        // EEH_Debug_Tools::printr( $valid_data, '$valid_data', __FILE__, __LINE__ );
848
-        // if we don't have any $valid_data then something went TERRIBLY WRONG !!!
849
-        if (empty($valid_data)) {
850
-            EE_Error::add_error(
851
-                esc_html__('No valid question responses were received.', 'event_espresso'),
852
-                __FILE__,
853
-                __FUNCTION__,
854
-                __LINE__
855
-            );
856
-            return false;
857
-        }
858
-        if (! $this->checkout->transaction instanceof EE_Transaction || ! $this->checkout->continue_reg) {
859
-            EE_Error::add_error(
860
-                esc_html__(
861
-                    'A valid transaction could not be initiated for processing your registrations.',
862
-                    'event_espresso'
863
-                ),
864
-                __FILE__,
865
-                __FUNCTION__,
866
-                __LINE__
867
-            );
868
-            return false;
869
-        }
870
-        // get cached registrations
871
-        $registrations = $this->checkout->transaction->registrations($this->checkout->reg_cache_where_params);
872
-        // verify we got the goods
873
-        if (empty($registrations)) {
874
-            // combine the old translated string with a new one, in order to not break translations
875
-            $error_message = esc_html__(
876
-                'Your form data could not be applied to any valid registrations.',
877
-                'event_espresso'
878
-            )
879
-            . sprintf(
880
-                esc_html_x(
881
-                    '%3$sThis can sometimes happen if too much time has been taken to complete the registration process.%3$sPlease return to the %1$sEvent List%2$s and reselect your tickets. If the problem continues, please contact the site administrator.',
882
-                    '(line break)This can sometimes happen if too much time has been taken to complete the registration process.(line break)Please return to the (link)Event List(end link) and reselect your tickets. If the problem continues, please contact the site administrator.',
883
-                    'event_espresso'
884
-                ),
885
-                '<a href="' . get_post_type_archive_link('espresso_events') . '" >',
886
-                '</a>',
887
-                '<br />'
888
-            );
889
-            EE_Error::add_error(
890
-                $error_message,
891
-                __FILE__,
892
-                __FUNCTION__,
893
-                __LINE__
894
-            );
895
-            return false;
896
-        }
897
-        // extract attendee info from form data and save to model objects
898
-        $registrations_processed = $this->_process_registrations($registrations, $valid_data);
899
-        // if first pass thru SPCO,
900
-        // then let's check processed registrations against the total number of tickets in the cart
901
-        if ($registrations_processed === false) {
902
-            // but return immediately if the previous step exited early due to errors
903
-            return false;
904
-        }
905
-        if (! $this->checkout->revisit && $registrations_processed !== $this->checkout->total_ticket_count) {
906
-            // generate a correctly translated string for all possible singular/plural combinations
907
-            if ($this->checkout->total_ticket_count === 1 && $registrations_processed !== 1) {
908
-                $error_msg = sprintf(
909
-                    esc_html_x(
910
-                        'There was %1$d ticket in the Event Queue, but %2$ds registrations were processed',
911
-                        'There was 1 ticket in the Event Queue, but 2 registrations were processed',
912
-                        'event_espresso'
913
-                    ),
914
-                    $this->checkout->total_ticket_count,
915
-                    $registrations_processed
916
-                );
917
-            } elseif ($this->checkout->total_ticket_count !== 1 && $registrations_processed === 1) {
918
-                $error_msg = sprintf(
919
-                    esc_html_x(
920
-                        'There was a total of %1$d tickets in the Event Queue, but only %2$ds registration was processed',
921
-                        'There was a total of 2 tickets in the Event Queue, but only 1 registration was processed',
922
-                        'event_espresso'
923
-                    ),
924
-                    $this->checkout->total_ticket_count,
925
-                    $registrations_processed
926
-                );
927
-            } else {
928
-                $error_msg = sprintf(
929
-                    esc_html__(
930
-                        'There was a total of 2 tickets in the Event Queue, but 2 registrations were processed',
931
-                        'event_espresso'
932
-                    ),
933
-                    $this->checkout->total_ticket_count,
934
-                    $registrations_processed
935
-                );
936
-            }
937
-            EE_Error::add_error($error_msg, __FILE__, __FUNCTION__, __LINE__);
938
-            return false;
939
-        }
940
-        // mark this reg step as completed
941
-        $this->set_completed();
942
-        $this->_set_success_message(
943
-            esc_html__('The Attendee Information Step has been successfully completed.', 'event_espresso')
944
-        );
945
-        // do action in case a plugin wants to do something with the data submitted in step 1.
946
-        // passes EE_Single_Page_Checkout, and it's posted data
947
-        do_action('AHEE__EE_Single_Page_Checkout__process_attendee_information__end', $this, $valid_data);
948
-        return true;
949
-    }
950
-
951
-
952
-    /**
953
-     *    _process_registrations
954
-     *
955
-     * @param EE_Registration[] $registrations
956
-     * @param array[][]         $valid_data
957
-     * @return bool|int
958
-     * @throws EntityNotFoundException
959
-     * @throws EE_Error
960
-     * @throws InvalidArgumentException
961
-     * @throws ReflectionException
962
-     * @throws RuntimeException
963
-     * @throws InvalidDataTypeException
964
-     * @throws InvalidInterfaceException
965
-     */
966
-    private function _process_registrations($registrations = array(), $valid_data = array())
967
-    {
968
-        // load resources and set some defaults
969
-        EE_Registry::instance()->load_model('Attendee');
970
-        // holder for primary registrant attendee object
971
-        $this->checkout->primary_attendee_obj = null;
972
-        // array for tracking reg form data for the primary registrant
973
-        $primary_registrant = array(
974
-            'line_item_id' => null,
975
-        );
976
-        $copy_primary = false;
977
-        // reg form sections that do not contain inputs
978
-        $non_input_form_sections = array(
979
-            'primary_registrant',
980
-            'additional_attendee_reg_info',
981
-            'spco_copy_attendee_chk',
982
-        );
983
-        // attendee counter
984
-        $att_nmbr = 0;
985
-        // grab the saved registrations from the transaction
986
-        foreach ($registrations as $registration) {
987
-            // verify EE_Registration object
988
-            if (! $registration instanceof EE_Registration) {
989
-                EE_Error::add_error(
990
-                    esc_html__(
991
-                        'An invalid Registration object was discovered when attempting to process your registration information.',
992
-                        'event_espresso'
993
-                    ),
994
-                    __FILE__,
995
-                    __FUNCTION__,
996
-                    __LINE__
997
-                );
998
-                return false;
999
-            }
1000
-            /** @var string $reg_url_link */
1001
-            $reg_url_link = $registration->reg_url_link();
1002
-            // reg_url_link exists ?
1003
-            if (! empty($reg_url_link)) {
1004
-                // should this registration be processed during this visit ?
1005
-                if ($this->checkout->visit_allows_processing_of_this_registration($registration)) {
1006
-                    // if NOT revisiting, then let's save the registration now,
1007
-                    // so that we have a REG_ID to use when generating other objects
1008
-                    if (! $this->checkout->revisit) {
1009
-                        $registration->save();
1010
-                    }
1011
-                    /**
1012
-                     * This allows plugins to trigger a fail on processing of a
1013
-                     * registration for any conditions they may have for it to pass.
1014
-                     *
1015
-                     * @var bool   if true is returned by the plugin then the
1016
-                     *            registration processing is halted.
1017
-                     */
1018
-                    if (apply_filters(
1019
-                        'FHEE__EE_SPCO_Reg_Step_Attendee_Information___process_registrations__pre_registration_process',
1020
-                        false,
1021
-                        $att_nmbr,
1022
-                        $registration,
1023
-                        $registrations,
1024
-                        $valid_data,
1025
-                        $this
1026
-                    )) {
1027
-                        return false;
1028
-                    }
1029
-
1030
-                    // Houston, we have a registration!
1031
-                    $att_nmbr++;
1032
-                    $this->_attendee_data[ $reg_url_link ] = array();
1033
-                    // grab any existing related answer objects
1034
-                    $this->_registration_answers = $registration->answers();
1035
-                    // unset( $valid_data[ $reg_url_link ]['additional_attendee_reg_info'] );
1036
-                    if (isset($valid_data[ $reg_url_link ])) {
1037
-                        // do we need to copy basic info from primary attendee ?
1038
-                        $copy_primary = isset($valid_data[ $reg_url_link ]['additional_attendee_reg_info'])
1039
-                                        && absint($valid_data[ $reg_url_link ]['additional_attendee_reg_info']) === 0;
1040
-                        // filter form input data for this registration
1041
-                        $valid_data[ $reg_url_link ] = (array) apply_filters(
1042
-                            'FHEE__EE_Single_Page_Checkout__process_attendee_information__valid_data_line_item',
1043
-                            $valid_data[ $reg_url_link ]
1044
-                        );
1045
-                        if (isset($valid_data['primary_attendee'])) {
1046
-                            $primary_registrant['line_item_id'] = ! empty($valid_data['primary_attendee'])
1047
-                                ? $valid_data['primary_attendee']
1048
-                                : false;
1049
-                            unset($valid_data['primary_attendee']);
1050
-                        }
1051
-                        // now loop through our array of valid post data && process attendee reg forms
1052
-                        foreach ($valid_data[ $reg_url_link ] as $form_section => $form_inputs) {
1053
-                            if (! in_array($form_section, $non_input_form_sections, true)) {
1054
-                                foreach ($form_inputs as $form_input => $input_value) {
1055
-                                    // \EEH_Debug_Tools::printr( $input_value, $form_input, __FILE__, __LINE__ );
1056
-                                    // check for critical inputs
1057
-                                    if (! $this->_verify_critical_attendee_details_are_set_and_validate_email(
1058
-                                        $form_input,
1059
-                                        $input_value
1060
-                                    )
1061
-                                    ) {
1062
-                                        return false;
1063
-                                    }
1064
-                                    // store a bit of data about the primary attendee
1065
-                                    if ($att_nmbr === 1
1066
-                                        && ! empty($input_value)
1067
-                                        && $reg_url_link === $primary_registrant['line_item_id']
1068
-                                    ) {
1069
-                                        $primary_registrant[ $form_input ] = $input_value;
1070
-                                    } elseif ($copy_primary
1071
-                                              && $input_value === null
1072
-                                              && isset($primary_registrant[ $form_input ])
1073
-                                    ) {
1074
-                                        $input_value = $primary_registrant[ $form_input ];
1075
-                                    }
1076
-                                    // now attempt to save the input data
1077
-                                    if (! $this->_save_registration_form_input(
1078
-                                        $registration,
1079
-                                        $form_input,
1080
-                                        $input_value
1081
-                                    )
1082
-                                    ) {
1083
-                                        EE_Error::add_error(
1084
-                                            sprintf(
1085
-                                                esc_html_x(
1086
-                                                    'Unable to save registration form data for the form input: "%1$s" with the submitted value: "%2$s"',
1087
-                                                    'Unable to save registration form data for the form input: "form input name" with the submitted value: "form input value"',
1088
-                                                    'event_espresso'
1089
-                                                ),
1090
-                                                $form_input,
1091
-                                                $input_value
1092
-                                            ),
1093
-                                            __FILE__,
1094
-                                            __FUNCTION__,
1095
-                                            __LINE__
1096
-                                        );
1097
-                                        return false;
1098
-                                    }
1099
-                                }
1100
-                            }
1101
-                        }  // end of foreach ( $valid_data[ $reg_url_link ] as $form_section => $form_inputs )
1102
-                    }
1103
-                    // EEH_Debug_Tools::printr( $this->_attendee_data, '$this->_attendee_data', __FILE__, __LINE__ );
1104
-                    // this registration does not require additional attendee information ?
1105
-                    if ($copy_primary
1106
-                        && $att_nmbr > 1
1107
-                        && $this->checkout->primary_attendee_obj instanceof EE_Attendee
1108
-                    ) {
1109
-                        // just copy the primary registrant
1110
-                        $attendee = $this->checkout->primary_attendee_obj;
1111
-                    } else {
1112
-                        // ensure critical details are set for additional attendees
1113
-                        $this->_attendee_data[ $reg_url_link ] = $att_nmbr > 1
1114
-                            ? $this->_copy_critical_attendee_details_from_primary_registrant(
1115
-                                $this->_attendee_data[ $reg_url_link ]
1116
-                            )
1117
-                            : $this->_attendee_data[ $reg_url_link ];
1118
-                        // execute create attendee command (which may return an existing attendee)
1119
-                        $attendee = EE_Registry::instance()->BUS->execute(
1120
-                            new CreateAttendeeCommand(
1121
-                                $this->_attendee_data[ $reg_url_link ],
1122
-                                $registration
1123
-                            )
1124
-                        );
1125
-                        // who's #1 ?
1126
-                        if ($att_nmbr === 1) {
1127
-                            $this->checkout->primary_attendee_obj = $attendee;
1128
-                        }
1129
-                    }
1130
-                    // EEH_Debug_Tools::printr( $attendee, '$attendee', __FILE__, __LINE__ );
1131
-                    // add relation to registration, set attendee ID, and cache attendee
1132
-                    $this->_associate_attendee_with_registration($registration, $attendee);
1133
-                    // \EEH_Debug_Tools::printr( $registration, '$registration', __FILE__, __LINE__ );
1134
-                    if (! $registration->attendee() instanceof EE_Attendee) {
1135
-                        EE_Error::add_error(
1136
-                            sprintf(
1137
-                                esc_html_x(
1138
-                                    'Registration %s has an invalid or missing Attendee object.',
1139
-                                    'Registration 123-456-789 has an invalid or missing Attendee object.',
1140
-                                    'event_espresso'
1141
-                                ),
1142
-                                $reg_url_link
1143
-                            ),
1144
-                            __FILE__,
1145
-                            __FUNCTION__,
1146
-                            __LINE__
1147
-                        );
1148
-                        return false;
1149
-                    }
1150
-                    /** @type EE_Registration_Processor $registration_processor */
1151
-                    $registration_processor = EE_Registry::instance()->load_class('Registration_Processor');
1152
-                    // at this point, we should have enough details about the registrant to consider the registration
1153
-                    // NOT incomplete
1154
-                    $registration_processor->toggle_incomplete_registration_status_to_default(
1155
-                        $registration,
1156
-                        false,
1157
-                        new Context(
1158
-                            'spco_reg_step_attendee_information_process_registrations',
1159
-                            esc_html__(
1160
-                                'Finished populating registration with details from the registration form after submitting the Attendee Information Reg Step.',
1161
-                                'event_espresso'
1162
-                            )
1163
-                        )
1164
-                    );
1165
-                    // we can also consider the TXN to not have been failed, so temporarily upgrade it's status to
1166
-                    // abandoned
1167
-                    $this->checkout->transaction->toggle_failed_transaction_status();
1168
-                    // if we've gotten this far, then let's save what we have
1169
-                    $registration->save();
1170
-                    // add relation between TXN and registration
1171
-                    $this->_associate_registration_with_transaction($registration);
1172
-                }
1173
-            } else {
1174
-                EE_Error::add_error(
1175
-                    esc_html__(
1176
-                        'An invalid or missing line item ID was encountered while attempting to process the registration form.',
1177
-                        'event_espresso'
1178
-                    ),
1179
-                    __FILE__,
1180
-                    __FUNCTION__,
1181
-                    __LINE__
1182
-                );
1183
-                // remove malformed data
1184
-                unset($valid_data[ $reg_url_link ]);
1185
-                return false;
1186
-            }
1187
-        } // end of foreach ( $this->checkout->transaction->registrations()  as $registration )
1188
-        return $att_nmbr;
1189
-    }
1190
-
1191
-
1192
-    /**
1193
-     *    _save_registration_form_input
1194
-     *
1195
-     * @param EE_Registration $registration
1196
-     * @param string          $form_input
1197
-     * @param string          $input_value
1198
-     * @return bool
1199
-     * @throws EE_Error
1200
-     * @throws InvalidArgumentException
1201
-     * @throws InvalidDataTypeException
1202
-     * @throws InvalidInterfaceException
1203
-     * @throws ReflectionException
1204
-     */
1205
-    private function _save_registration_form_input(
1206
-        EE_Registration $registration,
1207
-        $form_input = '',
1208
-        $input_value = ''
1209
-    ) {
1210
-        // \EEH_Debug_Tools::printr( __FUNCTION__, __CLASS__, __FILE__, __LINE__, 2 );
1211
-        // \EEH_Debug_Tools::printr( $form_input, '$form_input', __FILE__, __LINE__ );
1212
-        // \EEH_Debug_Tools::printr( $input_value, '$input_value', __FILE__, __LINE__ );
1213
-        // allow for plugins to hook in and do their own processing of the form input.
1214
-        // For plugins to bypass normal processing here, they just need to return a boolean value.
1215
-        if (apply_filters(
1216
-            'FHEE__EE_SPCO_Reg_Step_Attendee_Information___save_registration_form_input',
1217
-            false,
1218
-            $registration,
1219
-            $form_input,
1220
-            $input_value,
1221
-            $this
1222
-        )) {
1223
-            return true;
1224
-        }
1225
-        /*
129
+		$this->_print_copy_info = $reg_config->copyAttendeeInfo();
130
+
131
+		$primary_registrant = null;
132
+		// autoload Line_Item_Display classes
133
+		EEH_Autoloader::register_line_item_display_autoloaders();
134
+		$Line_Item_Display = new EE_Line_Item_Display();
135
+		// calculate taxes
136
+		$Line_Item_Display->display_line_item(
137
+			$this->checkout->cart->get_grand_total(),
138
+			array('set_tax_rate' => true)
139
+		);
140
+		/** @var $subsections EE_Form_Section_Proper[] */
141
+		$extra_inputs_section = $this->reg_step_hidden_inputs();
142
+		$subsections = array(
143
+			'default_hidden_inputs' => $extra_inputs_section,
144
+		);
145
+
146
+		// if this isn't a revisit, and they have the privacy consent box enalbed, add it
147
+		if (! $this->checkout->revisit && $reg_config->isConsentCheckboxEnabled()) {
148
+			$extra_inputs_section->add_subsections(
149
+				array(
150
+					'consent_box' => new EE_Form_Section_Proper(
151
+						array(
152
+							'layout_strategy' =>
153
+								new EE_Template_Layout(
154
+									array(
155
+										'input_template_file' => SPCO_REG_STEPS_PATH . $this->_slug . '/privacy_consent.template.php',
156
+									)
157
+								),
158
+							'subsections'     => array(
159
+								'consent' => new EE_Checkbox_Multi_Input(
160
+									array(
161
+										'consent' => $reg_config->getConsentCheckboxLabelText(),
162
+									),
163
+									array(
164
+										'required'                          => true,
165
+										'required_validation_error_message' => esc_html__(
166
+											'You must consent to these terms in order to register.',
167
+											'event_espresso'
168
+										),
169
+										'html_label_text'                   => '',
170
+									)
171
+								),
172
+							),
173
+						)
174
+					),
175
+				),
176
+				null,
177
+				false
178
+			);
179
+		}
180
+		$template_args = array(
181
+			'revisit'       => $this->checkout->revisit,
182
+			'registrations' => array(),
183
+			'ticket_count'  => array(),
184
+		);
185
+		// grab the saved registrations from the transaction
186
+		$registrations = $this->checkout->transaction->registrations($this->checkout->reg_cache_where_params);
187
+		if ($registrations) {
188
+			foreach ($registrations as $registration) {
189
+				// can this registration be processed during this visit ?
190
+				if ($registration instanceof EE_Registration
191
+					&& $this->checkout->visit_allows_processing_of_this_registration($registration)
192
+				) {
193
+					$subsections[ $registration->reg_url_link() ] = $this->_registrations_reg_form($registration);
194
+					$template_args['registrations'][ $registration->reg_url_link() ] = $registration;
195
+					$template_args['ticket_count'][ $registration->ticket()->ID() ] = isset(
196
+						$template_args['ticket_count'][ $registration->ticket()->ID() ]
197
+					)
198
+						? $template_args['ticket_count'][ $registration->ticket()->ID() ] + 1
199
+						: 1;
200
+					$ticket_line_item = EEH_Line_Item::get_line_items_by_object_type_and_IDs(
201
+						$this->checkout->cart->get_grand_total(),
202
+						'Ticket',
203
+						array($registration->ticket()->ID())
204
+					);
205
+					$ticket_line_item = is_array($ticket_line_item)
206
+						? reset($ticket_line_item)
207
+						: $ticket_line_item;
208
+					$template_args['ticket_line_item'][ $registration->ticket()->ID() ] =
209
+						$Line_Item_Display->display_line_item($ticket_line_item);
210
+					if ($registration->is_primary_registrant()) {
211
+						$primary_registrant = $registration->reg_url_link();
212
+					}
213
+				}
214
+			}
215
+
216
+			if ($primary_registrant && count($registrations) > 1) {
217
+				$copy_options['spco_copy_attendee_chk'] = $this->_print_copy_info
218
+					? $this->_copy_attendee_info_form()
219
+					: $this->_auto_copy_attendee_info();
220
+				// generate hidden input
221
+				if (isset($subsections[ $primary_registrant ])
222
+					&& $subsections[ $primary_registrant ] instanceof EE_Form_Section_Proper
223
+				) {
224
+					$subsections[ $primary_registrant ]->add_subsections(
225
+						$copy_options,
226
+						'primary_registrant',
227
+						false
228
+					);
229
+				}
230
+			}
231
+		}
232
+		return new EE_Form_Section_Proper(
233
+			array(
234
+				'name'            => $this->reg_form_name(),
235
+				'html_id'         => $this->reg_form_name(),
236
+				'subsections'     => $subsections,
237
+				'layout_strategy' => new EE_Template_Layout(
238
+					array(
239
+						'layout_template_file' => $this->_template, // layout_template
240
+						'template_args'        => $template_args,
241
+					)
242
+				),
243
+			)
244
+		);
245
+	}
246
+
247
+
248
+	/**
249
+	 * @param EE_Registration $registration
250
+	 * @return EE_Form_Section_Base
251
+	 * @throws EE_Error
252
+	 * @throws InvalidArgumentException
253
+	 * @throws EntityNotFoundException
254
+	 * @throws InvalidDataTypeException
255
+	 * @throws InvalidInterfaceException
256
+	 * @throws ReflectionException
257
+	 */
258
+	private function _registrations_reg_form(EE_Registration $registration)
259
+	{
260
+		static $attendee_nmbr = 1;
261
+		$form_args = array();
262
+		// verify that registration has valid event
263
+		if ($registration->event() instanceof EE_Event) {
264
+			$field_name = 'Event_Question_Group.'
265
+				. EEM_Event_Question_Group::instance()->fieldNameForContext(
266
+					$registration->is_primary_registrant()
267
+				);
268
+			$question_groups = $registration->event()->question_groups(
269
+				apply_filters(
270
+					// @codingStandardsIgnoreStart
271
+					'FHEE__EE_SPCO_Reg_Step_Attendee_Information___registrations_reg_form__question_groups_query_parameters',
272
+					// @codingStandardsIgnoreEnd
273
+					[
274
+						[
275
+							'Event.EVT_ID'                     => $registration->event()->ID(),
276
+							$field_name => true,
277
+						],
278
+						'order_by' => ['QSG_order' => 'ASC'],
279
+					],
280
+					$registration,
281
+					$this
282
+				)
283
+			);
284
+			if ($question_groups) {
285
+				// array of params to pass to parent constructor
286
+				$form_args = array(
287
+					'html_id'         => 'ee-registration-' . $registration->reg_url_link(),
288
+					'html_class'      => 'ee-reg-form-attendee-dv',
289
+					'html_style'      => $this->checkout->admin_request
290
+						? 'padding:0em 2em 1em; margin:3em 0 0; border:1px solid #ddd;'
291
+						: '',
292
+					'subsections'     => array(),
293
+					'layout_strategy' => new EE_Fieldset_Section_Layout(
294
+						array(
295
+							'legend_class' => 'spco-attendee-lgnd smaller-text lt-grey-text',
296
+							'legend_text'  => sprintf(
297
+								esc_html_x(
298
+									'Attendee %d',
299
+									'Attendee 123',
300
+									'event_espresso'
301
+								),
302
+								$attendee_nmbr
303
+							),
304
+						)
305
+					),
306
+				);
307
+				foreach ($question_groups as $question_group) {
308
+					if ($question_group instanceof EE_Question_Group) {
309
+						$form_args['subsections'][ $question_group->identifier() ] = $this->_question_group_reg_form(
310
+							$registration,
311
+							$question_group
312
+						);
313
+					}
314
+				}
315
+				// add hidden input
316
+				$form_args['subsections']['additional_attendee_reg_info'] = $this->_additional_attendee_reg_info_input(
317
+					$registration
318
+				);
319
+
320
+				/**
321
+				 * @var $reg_config EE_Registration_Config
322
+				 */
323
+				$reg_config = LoaderFactory::getLoader()->getShared('EE_Registration_Config');
324
+
325
+				// If we have question groups for additional attendees, then display the copy options
326
+				$this->_print_copy_info = apply_filters(
327
+					'FHEE__EE_SPCO_Reg_Step_Attendee_Information___registrations_reg_form___printCopyInfo',
328
+					$attendee_nmbr > 1 ? $reg_config->copyAttendeeInfo() : false,
329
+					$attendee_nmbr
330
+				);
331
+
332
+				if ($registration->is_primary_registrant()) {
333
+					// generate hidden input
334
+					$form_args['subsections']['primary_registrant'] = $this->_additional_primary_registrant_inputs(
335
+						$registration
336
+					);
337
+				}
338
+			}
339
+		}
340
+		$attendee_nmbr++;
341
+		return ! empty($form_args)
342
+			? new EE_Form_Section_Proper($form_args)
343
+			: new EE_Form_Section_HTML();
344
+	}
345
+
346
+
347
+	/**
348
+	 * @param EE_Registration $registration
349
+	 * @param bool            $additional_attendee_reg_info
350
+	 * @return EE_Form_Input_Base
351
+	 * @throws EE_Error
352
+	 */
353
+	private function _additional_attendee_reg_info_input(
354
+		EE_Registration $registration,
355
+		$additional_attendee_reg_info = true
356
+	) {
357
+		// generate hidden input
358
+		return new EE_Hidden_Input(
359
+			array(
360
+				'html_id' => 'additional-attendee-reg-info-' . $registration->reg_url_link(),
361
+				'default' => $additional_attendee_reg_info,
362
+			)
363
+		);
364
+	}
365
+
366
+
367
+	/**
368
+	 * @param EE_Registration   $registration
369
+	 * @param EE_Question_Group $question_group
370
+	 * @return EE_Form_Section_Proper
371
+	 * @throws EE_Error
372
+	 * @throws InvalidArgumentException
373
+	 * @throws InvalidDataTypeException
374
+	 * @throws InvalidInterfaceException
375
+	 * @throws ReflectionException
376
+	 */
377
+	private function _question_group_reg_form(EE_Registration $registration, EE_Question_Group $question_group)
378
+	{
379
+		// array of params to pass to parent constructor
380
+		$form_args = array(
381
+			'html_id'         => 'ee-reg-form-qstn-grp-' . $question_group->identifier() . '-' . $registration->ID(),
382
+			'html_class'      => $this->checkout->admin_request
383
+				? 'form-table ee-reg-form-qstn-grp-dv'
384
+				: 'ee-reg-form-qstn-grp-dv',
385
+			'html_label_id'   => 'ee-reg-form-qstn-grp-' . $question_group->identifier() . '-'
386
+								 . $registration->ID() . '-lbl',
387
+			'subsections'     => array(
388
+				'reg_form_qstn_grp_hdr' => $this->_question_group_header($question_group),
389
+			),
390
+			'layout_strategy' => $this->checkout->admin_request
391
+				? new EE_Admin_Two_Column_Layout()
392
+				: new EE_Div_Per_Section_Layout(),
393
+		);
394
+		// where params
395
+		$query_params = array('QST_deleted' => 0);
396
+		// don't load admin only questions on the frontend
397
+		if (! $this->checkout->admin_request) {
398
+			$query_params['QST_admin_only'] = array('!=', true);
399
+		}
400
+		$questions = $question_group->get_many_related(
401
+			'Question',
402
+			apply_filters(
403
+				'FHEE__EE_SPCO_Reg_Step_Attendee_Information___question_group_reg_form__related_questions_query_params',
404
+				array(
405
+					$query_params,
406
+					'order_by' => array(
407
+						'Question_Group_Question.QGQ_order' => 'ASC',
408
+					),
409
+				),
410
+				$question_group,
411
+				$registration,
412
+				$this
413
+			)
414
+		);
415
+		// filter for additional content before questions
416
+		$form_args['subsections']['reg_form_questions_before'] = new EE_Form_Section_HTML(
417
+			apply_filters(
418
+				'FHEE__EEH_Form_Fields__generate_question_groups_html__before_question_group_questions',
419
+				'',
420
+				$registration,
421
+				$question_group,
422
+				$this
423
+			)
424
+		);
425
+		// loop thru questions
426
+		foreach ($questions as $question) {
427
+			if ($question instanceof EE_Question) {
428
+				$identifier = $question->is_system_question()
429
+					? $question->system_ID()
430
+					: $question->ID();
431
+				$form_args['subsections'][ $identifier ] = $this->reg_form_question($registration, $question);
432
+			}
433
+		}
434
+		$form_args['subsections'] = apply_filters(
435
+			'FHEE__EE_SPCO_Reg_Step_Attendee_Information__question_group_reg_form__subsections_array',
436
+			$form_args['subsections'],
437
+			$registration,
438
+			$question_group,
439
+			$this
440
+		);
441
+		// filter for additional content after questions
442
+		$form_args['subsections']['reg_form_questions_after'] = new EE_Form_Section_HTML(
443
+			apply_filters(
444
+				'FHEE__EEH_Form_Fields__generate_question_groups_html__after_question_group_questions',
445
+				'',
446
+				$registration,
447
+				$question_group,
448
+				$this
449
+			)
450
+		);
451
+		// d($form_args);
452
+		$question_group_reg_form = new EE_Form_Section_Proper($form_args);
453
+		return apply_filters(
454
+			'FHEE__EE_SPCO_Reg_Step_Attendee_Information___question_group_reg_form__question_group_reg_form',
455
+			$question_group_reg_form,
456
+			$registration,
457
+			$question_group,
458
+			$this
459
+		);
460
+	}
461
+
462
+
463
+	/**
464
+	 * @param EE_Question_Group $question_group
465
+	 * @return    EE_Form_Section_HTML
466
+	 */
467
+	private function _question_group_header(EE_Question_Group $question_group)
468
+	{
469
+		$html = '';
470
+		// group_name
471
+		if ($question_group->show_group_name() && $question_group->name() !== '') {
472
+			if ($this->checkout->admin_request) {
473
+				$html .= EEH_HTML::br();
474
+				$html .= EEH_HTML::h3(
475
+					$question_group->name(),
476
+					'',
477
+					'ee-reg-form-qstn-grp-title title',
478
+					'font-size: 1.3em; padding-left:0;'
479
+				);
480
+			} else {
481
+				$html .= EEH_HTML::h4(
482
+					$question_group->name(),
483
+					'',
484
+					'ee-reg-form-qstn-grp-title section-title'
485
+				);
486
+			}
487
+		}
488
+		// group_desc
489
+		if ($question_group->show_group_desc() && $question_group->desc() !== '') {
490
+			$html .= EEH_HTML::p(
491
+				$question_group->desc(),
492
+				'',
493
+				$this->checkout->admin_request
494
+					? 'ee-reg-form-qstn-grp-desc-pg'
495
+					: 'ee-reg-form-qstn-grp-desc-pg small-text lt-grey-text'
496
+			);
497
+		}
498
+		return new EE_Form_Section_HTML($html);
499
+	}
500
+
501
+
502
+	/**
503
+	 * @return    EE_Form_Section_Proper
504
+	 * @throws EE_Error
505
+	 * @throws InvalidArgumentException
506
+	 * @throws ReflectionException
507
+	 * @throws InvalidDataTypeException
508
+	 * @throws InvalidInterfaceException
509
+	 */
510
+	private function _copy_attendee_info_form()
511
+	{
512
+		// array of params to pass to parent constructor
513
+		return new EE_Form_Section_Proper(
514
+			array(
515
+				'subsections'     => $this->_copy_attendee_info_inputs(),
516
+				'layout_strategy' => new EE_Template_Layout(
517
+					array(
518
+						'layout_template_file'     => SPCO_REG_STEPS_PATH
519
+													  . $this->_slug
520
+													  . '/copy_attendee_info.template.php',
521
+						'begin_template_file'      => null,
522
+						'input_template_file'      => null,
523
+						'subsection_template_file' => null,
524
+						'end_template_file'        => null,
525
+					)
526
+				),
527
+			)
528
+		);
529
+	}
530
+
531
+
532
+	/**
533
+	 * @return EE_Form_Section_HTML
534
+	 * @throws DomainException
535
+	 * @throws InvalidArgumentException
536
+	 * @throws InvalidDataTypeException
537
+	 * @throws InvalidInterfaceException
538
+	 */
539
+	private function _auto_copy_attendee_info()
540
+	{
541
+		return new EE_Form_Section_HTML(
542
+			EEH_Template::locate_template(
543
+				SPCO_REG_STEPS_PATH . $this->_slug . '/_auto_copy_attendee_info.template.php',
544
+				apply_filters(
545
+					'FHEE__EE_SPCO_Reg_Step_Attendee_Information__auto_copy_attendee_info__template_args',
546
+					array()
547
+				),
548
+				true,
549
+				true
550
+			)
551
+		);
552
+	}
553
+
554
+
555
+	/**
556
+	 * @return array
557
+	 * @throws EE_Error
558
+	 * @throws InvalidArgumentException
559
+	 * @throws ReflectionException
560
+	 * @throws InvalidDataTypeException
561
+	 * @throws InvalidInterfaceException
562
+	 */
563
+	private function _copy_attendee_info_inputs()
564
+	{
565
+		$copy_attendee_info_inputs = array();
566
+		$prev_ticket = null;
567
+		// grab the saved registrations from the transaction
568
+		$registrations = $this->checkout->transaction->registrations($this->checkout->reg_cache_where_params);
569
+		foreach ($registrations as $registration) {
570
+			// for all  attendees other than the primary attendee
571
+			if ($registration instanceof EE_Registration && ! $registration->is_primary_registrant()) {
572
+				// if this is a new ticket OR if this is the very first additional attendee after the primary attendee
573
+				if ($registration->ticket()->ID() !== $prev_ticket) {
574
+					$item_name = $registration->ticket()->name();
575
+					$item_name .= $registration->ticket()->description() !== ''
576
+						? ' - ' . $registration->ticket()->description()
577
+						: '';
578
+					$copy_attendee_info_inputs[ 'spco_copy_attendee_chk[ticket-' . $registration->ticket()->ID(
579
+					) . ']' ] =
580
+						new EE_Form_Section_HTML(
581
+							'<h6 class="spco-copy-attendee-event-hdr">' . $item_name . '</h6>'
582
+						);
583
+					$prev_ticket = $registration->ticket()->ID();
584
+				}
585
+
586
+				$copy_attendee_info_inputs[ 'spco_copy_attendee_chk[' . $registration->ID() . ']' ] =
587
+					new EE_Checkbox_Multi_Input(
588
+						array(
589
+							$registration->ID() => sprintf(
590
+								esc_html_x('Attendee #%s', 'Attendee #123', 'event_espresso'),
591
+								$registration->count()
592
+							),
593
+						),
594
+						array(
595
+							'html_id'                 => 'spco-copy-attendee-chk-' . $registration->reg_url_link(),
596
+							'html_class'              => 'spco-copy-attendee-chk ee-do-not-validate',
597
+							'display_html_label_text' => false,
598
+						)
599
+					);
600
+			}
601
+		}
602
+		return $copy_attendee_info_inputs;
603
+	}
604
+
605
+
606
+	/**
607
+	 * @param EE_Registration $registration
608
+	 * @return    EE_Form_Input_Base
609
+	 * @throws EE_Error
610
+	 */
611
+	private function _additional_primary_registrant_inputs(EE_Registration $registration)
612
+	{
613
+		// generate hidden input
614
+		return new EE_Hidden_Input(
615
+			array(
616
+				'html_id' => 'primary_registrant',
617
+				'default' => $registration->reg_url_link(),
618
+			)
619
+		);
620
+	}
621
+
622
+
623
+	/**
624
+	 * @param EE_Registration $registration
625
+	 * @param EE_Question     $question
626
+	 * @return EE_Form_Input_Base
627
+	 * @throws EE_Error
628
+	 * @throws InvalidArgumentException
629
+	 * @throws InvalidDataTypeException
630
+	 * @throws InvalidInterfaceException
631
+	 * @throws ReflectionException
632
+	 */
633
+	public function reg_form_question(EE_Registration $registration, EE_Question $question)
634
+	{
635
+
636
+		// if this question was for an attendee detail, then check for that answer
637
+		$answer_value = EEM_Answer::instance()->get_attendee_property_answer_value(
638
+			$registration,
639
+			$question->system_ID()
640
+		);
641
+		$answer = $answer_value === null
642
+			? EEM_Answer::instance()->get_one(
643
+				array(array('QST_ID' => $question->ID(), 'REG_ID' => $registration->ID()))
644
+			)
645
+			: null;
646
+		// if NOT returning to edit an existing registration
647
+		// OR if this question is for an attendee property
648
+		// OR we still don't have an EE_Answer object
649
+		if ($answer_value || ! $answer instanceof EE_Answer || ! $registration->reg_url_link()) {
650
+			// create an EE_Answer object for storing everything in
651
+			$answer = EE_Answer::new_instance(
652
+				array(
653
+					'QST_ID' => $question->ID(),
654
+					'REG_ID' => $registration->ID(),
655
+				)
656
+			);
657
+		}
658
+		// verify instance
659
+		if ($answer instanceof EE_Answer) {
660
+			if (! empty($answer_value)) {
661
+				$answer->set('ANS_value', $answer_value);
662
+			}
663
+			$answer->cache('Question', $question);
664
+			// remember system ID had a bug where sometimes it could be null
665
+			$answer_cache_id = $question->is_system_question()
666
+				? $question->system_ID() . '-' . $registration->reg_url_link()
667
+				: $question->ID() . '-' . $registration->reg_url_link();
668
+			$registration->cache('Answer', $answer, $answer_cache_id);
669
+		}
670
+		return $this->_generate_question_input($registration, $question, $answer);
671
+	}
672
+
673
+
674
+	/**
675
+	 * @param EE_Registration $registration
676
+	 * @param EE_Question     $question
677
+	 * @param                 $answer
678
+	 * @return EE_Form_Input_Base
679
+	 * @throws EE_Error
680
+	 * @throws InvalidArgumentException
681
+	 * @throws ReflectionException
682
+	 * @throws InvalidDataTypeException
683
+	 * @throws InvalidInterfaceException
684
+	 */
685
+	private function _generate_question_input(EE_Registration $registration, EE_Question $question, $answer)
686
+	{
687
+		$identifier = $question->is_system_question()
688
+			? $question->system_ID()
689
+			: $question->ID();
690
+		$this->_required_questions[ $identifier ] = $question->required() ? true : false;
691
+		add_filter(
692
+			'FHEE__EE_Question__generate_form_input__country_options',
693
+			array($this, 'use_cached_countries_for_form_input'),
694
+			10,
695
+			4
696
+		);
697
+		add_filter(
698
+			'FHEE__EE_Question__generate_form_input__state_options',
699
+			array($this, 'use_cached_states_for_form_input'),
700
+			10,
701
+			4
702
+		);
703
+		$input_constructor_args = array(
704
+			'html_name'        => 'ee_reg_qstn[' . $registration->ID() . '][' . $identifier . ']',
705
+			'html_id'          => 'ee_reg_qstn-' . $registration->ID() . '-' . $identifier,
706
+			'html_class'       => 'ee-reg-qstn ee-reg-qstn-' . $identifier,
707
+			'html_label_id'    => 'ee_reg_qstn-' . $registration->ID() . '-' . $identifier,
708
+			'html_label_class' => 'ee-reg-qstn',
709
+		);
710
+		$input_constructor_args['html_label_id'] .= '-lbl';
711
+		if ($answer instanceof EE_Answer && $answer->ID()) {
712
+			$input_constructor_args['html_name'] .= '[' . $answer->ID() . ']';
713
+			$input_constructor_args['html_id'] .= '-' . $answer->ID();
714
+			$input_constructor_args['html_label_id'] .= '-' . $answer->ID();
715
+		}
716
+		$form_input = $question->generate_form_input(
717
+			$registration,
718
+			$answer,
719
+			$input_constructor_args
720
+		);
721
+		remove_filter(
722
+			'FHEE__EE_Question__generate_form_input__country_options',
723
+			array($this, 'use_cached_countries_for_form_input')
724
+		);
725
+		remove_filter(
726
+			'FHEE__EE_Question__generate_form_input__state_options',
727
+			array($this, 'use_cached_states_for_form_input')
728
+		);
729
+		return $form_input;
730
+	}
731
+
732
+
733
+	/**
734
+	 * Gets the list of countries for the form input
735
+	 *
736
+	 * @param array|null      $countries_list
737
+	 * @param EE_Question     $question
738
+	 * @param EE_Registration $registration
739
+	 * @param EE_Answer       $answer
740
+	 * @return array 2d keys are country IDs, values are their names
741
+	 * @throws EE_Error
742
+	 * @throws InvalidArgumentException
743
+	 * @throws InvalidDataTypeException
744
+	 * @throws InvalidInterfaceException
745
+	 * @throws ReflectionException
746
+	 */
747
+	public function use_cached_countries_for_form_input(
748
+		$countries_list,
749
+		EE_Question $question = null,
750
+		EE_Registration $registration = null,
751
+		EE_Answer $answer = null
752
+	) {
753
+		$country_options = array('' => '');
754
+		// get possibly cached list of countries
755
+		$countries = $this->checkout->action === 'process_reg_step'
756
+			? EEM_Country::instance()->get_all_countries()
757
+			: EEM_Country::instance()->get_all_active_countries();
758
+		if (! empty($countries)) {
759
+			foreach ($countries as $country) {
760
+				if ($country instanceof EE_Country) {
761
+					$country_options[ $country->ID() ] = $country->name();
762
+				}
763
+			}
764
+		}
765
+		if ($question instanceof EE_Question && $registration instanceof EE_Registration) {
766
+			$answer = EEM_Answer::instance()->get_one(
767
+				array(array('QST_ID' => $question->ID(), 'REG_ID' => $registration->ID()))
768
+			);
769
+		} else {
770
+			$answer = EE_Answer::new_instance();
771
+		}
772
+		$country_options = apply_filters(
773
+			'FHEE__EE_SPCO_Reg_Step_Attendee_Information___generate_question_input__country_options',
774
+			$country_options,
775
+			$this,
776
+			$registration,
777
+			$question,
778
+			$answer
779
+		);
780
+		return $country_options;
781
+	}
782
+
783
+
784
+	/**
785
+	 * Gets the list of states for the form input
786
+	 *
787
+	 * @param array|null      $states_list
788
+	 * @param EE_Question     $question
789
+	 * @param EE_Registration $registration
790
+	 * @param EE_Answer       $answer
791
+	 * @return array 2d keys are state IDs, values are their names
792
+	 * @throws EE_Error
793
+	 * @throws InvalidArgumentException
794
+	 * @throws InvalidDataTypeException
795
+	 * @throws InvalidInterfaceException
796
+	 * @throws ReflectionException
797
+	 */
798
+	public function use_cached_states_for_form_input(
799
+		$states_list,
800
+		EE_Question $question = null,
801
+		EE_Registration $registration = null,
802
+		EE_Answer $answer = null
803
+	) {
804
+		$state_options = array('' => array('' => ''));
805
+		$states = $this->checkout->action === 'process_reg_step'
806
+			? EEM_State::instance()->get_all_states()
807
+			: EEM_State::instance()->get_all_active_states();
808
+		if (! empty($states)) {
809
+			foreach ($states as $state) {
810
+				if ($state instanceof EE_State) {
811
+					$state_options[ $state->country()->name() ][ $state->ID() ] = $state->name();
812
+				}
813
+			}
814
+		}
815
+		$state_options = apply_filters(
816
+			'FHEE__EE_SPCO_Reg_Step_Attendee_Information___generate_question_input__state_options',
817
+			$state_options,
818
+			$this,
819
+			$registration,
820
+			$question,
821
+			$answer
822
+		);
823
+		return $state_options;
824
+	}
825
+
826
+
827
+	/********************************************************************************************************/
828
+	/****************************************  PROCESS REG STEP  ****************************************/
829
+	/********************************************************************************************************/
830
+
831
+
832
+	/**
833
+	 * @return bool
834
+	 * @throws EE_Error
835
+	 * @throws InvalidArgumentException
836
+	 * @throws ReflectionException
837
+	 * @throws RuntimeException
838
+	 * @throws InvalidDataTypeException
839
+	 * @throws InvalidInterfaceException
840
+	 */
841
+	public function process_reg_step()
842
+	{
843
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
844
+		// grab validated data from form
845
+		$valid_data = $this->checkout->current_step->valid_data();
846
+		// EEH_Debug_Tools::printr( $_REQUEST, '$_REQUEST', __FILE__, __LINE__ );
847
+		// EEH_Debug_Tools::printr( $valid_data, '$valid_data', __FILE__, __LINE__ );
848
+		// if we don't have any $valid_data then something went TERRIBLY WRONG !!!
849
+		if (empty($valid_data)) {
850
+			EE_Error::add_error(
851
+				esc_html__('No valid question responses were received.', 'event_espresso'),
852
+				__FILE__,
853
+				__FUNCTION__,
854
+				__LINE__
855
+			);
856
+			return false;
857
+		}
858
+		if (! $this->checkout->transaction instanceof EE_Transaction || ! $this->checkout->continue_reg) {
859
+			EE_Error::add_error(
860
+				esc_html__(
861
+					'A valid transaction could not be initiated for processing your registrations.',
862
+					'event_espresso'
863
+				),
864
+				__FILE__,
865
+				__FUNCTION__,
866
+				__LINE__
867
+			);
868
+			return false;
869
+		}
870
+		// get cached registrations
871
+		$registrations = $this->checkout->transaction->registrations($this->checkout->reg_cache_where_params);
872
+		// verify we got the goods
873
+		if (empty($registrations)) {
874
+			// combine the old translated string with a new one, in order to not break translations
875
+			$error_message = esc_html__(
876
+				'Your form data could not be applied to any valid registrations.',
877
+				'event_espresso'
878
+			)
879
+			. sprintf(
880
+				esc_html_x(
881
+					'%3$sThis can sometimes happen if too much time has been taken to complete the registration process.%3$sPlease return to the %1$sEvent List%2$s and reselect your tickets. If the problem continues, please contact the site administrator.',
882
+					'(line break)This can sometimes happen if too much time has been taken to complete the registration process.(line break)Please return to the (link)Event List(end link) and reselect your tickets. If the problem continues, please contact the site administrator.',
883
+					'event_espresso'
884
+				),
885
+				'<a href="' . get_post_type_archive_link('espresso_events') . '" >',
886
+				'</a>',
887
+				'<br />'
888
+			);
889
+			EE_Error::add_error(
890
+				$error_message,
891
+				__FILE__,
892
+				__FUNCTION__,
893
+				__LINE__
894
+			);
895
+			return false;
896
+		}
897
+		// extract attendee info from form data and save to model objects
898
+		$registrations_processed = $this->_process_registrations($registrations, $valid_data);
899
+		// if first pass thru SPCO,
900
+		// then let's check processed registrations against the total number of tickets in the cart
901
+		if ($registrations_processed === false) {
902
+			// but return immediately if the previous step exited early due to errors
903
+			return false;
904
+		}
905
+		if (! $this->checkout->revisit && $registrations_processed !== $this->checkout->total_ticket_count) {
906
+			// generate a correctly translated string for all possible singular/plural combinations
907
+			if ($this->checkout->total_ticket_count === 1 && $registrations_processed !== 1) {
908
+				$error_msg = sprintf(
909
+					esc_html_x(
910
+						'There was %1$d ticket in the Event Queue, but %2$ds registrations were processed',
911
+						'There was 1 ticket in the Event Queue, but 2 registrations were processed',
912
+						'event_espresso'
913
+					),
914
+					$this->checkout->total_ticket_count,
915
+					$registrations_processed
916
+				);
917
+			} elseif ($this->checkout->total_ticket_count !== 1 && $registrations_processed === 1) {
918
+				$error_msg = sprintf(
919
+					esc_html_x(
920
+						'There was a total of %1$d tickets in the Event Queue, but only %2$ds registration was processed',
921
+						'There was a total of 2 tickets in the Event Queue, but only 1 registration was processed',
922
+						'event_espresso'
923
+					),
924
+					$this->checkout->total_ticket_count,
925
+					$registrations_processed
926
+				);
927
+			} else {
928
+				$error_msg = sprintf(
929
+					esc_html__(
930
+						'There was a total of 2 tickets in the Event Queue, but 2 registrations were processed',
931
+						'event_espresso'
932
+					),
933
+					$this->checkout->total_ticket_count,
934
+					$registrations_processed
935
+				);
936
+			}
937
+			EE_Error::add_error($error_msg, __FILE__, __FUNCTION__, __LINE__);
938
+			return false;
939
+		}
940
+		// mark this reg step as completed
941
+		$this->set_completed();
942
+		$this->_set_success_message(
943
+			esc_html__('The Attendee Information Step has been successfully completed.', 'event_espresso')
944
+		);
945
+		// do action in case a plugin wants to do something with the data submitted in step 1.
946
+		// passes EE_Single_Page_Checkout, and it's posted data
947
+		do_action('AHEE__EE_Single_Page_Checkout__process_attendee_information__end', $this, $valid_data);
948
+		return true;
949
+	}
950
+
951
+
952
+	/**
953
+	 *    _process_registrations
954
+	 *
955
+	 * @param EE_Registration[] $registrations
956
+	 * @param array[][]         $valid_data
957
+	 * @return bool|int
958
+	 * @throws EntityNotFoundException
959
+	 * @throws EE_Error
960
+	 * @throws InvalidArgumentException
961
+	 * @throws ReflectionException
962
+	 * @throws RuntimeException
963
+	 * @throws InvalidDataTypeException
964
+	 * @throws InvalidInterfaceException
965
+	 */
966
+	private function _process_registrations($registrations = array(), $valid_data = array())
967
+	{
968
+		// load resources and set some defaults
969
+		EE_Registry::instance()->load_model('Attendee');
970
+		// holder for primary registrant attendee object
971
+		$this->checkout->primary_attendee_obj = null;
972
+		// array for tracking reg form data for the primary registrant
973
+		$primary_registrant = array(
974
+			'line_item_id' => null,
975
+		);
976
+		$copy_primary = false;
977
+		// reg form sections that do not contain inputs
978
+		$non_input_form_sections = array(
979
+			'primary_registrant',
980
+			'additional_attendee_reg_info',
981
+			'spco_copy_attendee_chk',
982
+		);
983
+		// attendee counter
984
+		$att_nmbr = 0;
985
+		// grab the saved registrations from the transaction
986
+		foreach ($registrations as $registration) {
987
+			// verify EE_Registration object
988
+			if (! $registration instanceof EE_Registration) {
989
+				EE_Error::add_error(
990
+					esc_html__(
991
+						'An invalid Registration object was discovered when attempting to process your registration information.',
992
+						'event_espresso'
993
+					),
994
+					__FILE__,
995
+					__FUNCTION__,
996
+					__LINE__
997
+				);
998
+				return false;
999
+			}
1000
+			/** @var string $reg_url_link */
1001
+			$reg_url_link = $registration->reg_url_link();
1002
+			// reg_url_link exists ?
1003
+			if (! empty($reg_url_link)) {
1004
+				// should this registration be processed during this visit ?
1005
+				if ($this->checkout->visit_allows_processing_of_this_registration($registration)) {
1006
+					// if NOT revisiting, then let's save the registration now,
1007
+					// so that we have a REG_ID to use when generating other objects
1008
+					if (! $this->checkout->revisit) {
1009
+						$registration->save();
1010
+					}
1011
+					/**
1012
+					 * This allows plugins to trigger a fail on processing of a
1013
+					 * registration for any conditions they may have for it to pass.
1014
+					 *
1015
+					 * @var bool   if true is returned by the plugin then the
1016
+					 *            registration processing is halted.
1017
+					 */
1018
+					if (apply_filters(
1019
+						'FHEE__EE_SPCO_Reg_Step_Attendee_Information___process_registrations__pre_registration_process',
1020
+						false,
1021
+						$att_nmbr,
1022
+						$registration,
1023
+						$registrations,
1024
+						$valid_data,
1025
+						$this
1026
+					)) {
1027
+						return false;
1028
+					}
1029
+
1030
+					// Houston, we have a registration!
1031
+					$att_nmbr++;
1032
+					$this->_attendee_data[ $reg_url_link ] = array();
1033
+					// grab any existing related answer objects
1034
+					$this->_registration_answers = $registration->answers();
1035
+					// unset( $valid_data[ $reg_url_link ]['additional_attendee_reg_info'] );
1036
+					if (isset($valid_data[ $reg_url_link ])) {
1037
+						// do we need to copy basic info from primary attendee ?
1038
+						$copy_primary = isset($valid_data[ $reg_url_link ]['additional_attendee_reg_info'])
1039
+										&& absint($valid_data[ $reg_url_link ]['additional_attendee_reg_info']) === 0;
1040
+						// filter form input data for this registration
1041
+						$valid_data[ $reg_url_link ] = (array) apply_filters(
1042
+							'FHEE__EE_Single_Page_Checkout__process_attendee_information__valid_data_line_item',
1043
+							$valid_data[ $reg_url_link ]
1044
+						);
1045
+						if (isset($valid_data['primary_attendee'])) {
1046
+							$primary_registrant['line_item_id'] = ! empty($valid_data['primary_attendee'])
1047
+								? $valid_data['primary_attendee']
1048
+								: false;
1049
+							unset($valid_data['primary_attendee']);
1050
+						}
1051
+						// now loop through our array of valid post data && process attendee reg forms
1052
+						foreach ($valid_data[ $reg_url_link ] as $form_section => $form_inputs) {
1053
+							if (! in_array($form_section, $non_input_form_sections, true)) {
1054
+								foreach ($form_inputs as $form_input => $input_value) {
1055
+									// \EEH_Debug_Tools::printr( $input_value, $form_input, __FILE__, __LINE__ );
1056
+									// check for critical inputs
1057
+									if (! $this->_verify_critical_attendee_details_are_set_and_validate_email(
1058
+										$form_input,
1059
+										$input_value
1060
+									)
1061
+									) {
1062
+										return false;
1063
+									}
1064
+									// store a bit of data about the primary attendee
1065
+									if ($att_nmbr === 1
1066
+										&& ! empty($input_value)
1067
+										&& $reg_url_link === $primary_registrant['line_item_id']
1068
+									) {
1069
+										$primary_registrant[ $form_input ] = $input_value;
1070
+									} elseif ($copy_primary
1071
+											  && $input_value === null
1072
+											  && isset($primary_registrant[ $form_input ])
1073
+									) {
1074
+										$input_value = $primary_registrant[ $form_input ];
1075
+									}
1076
+									// now attempt to save the input data
1077
+									if (! $this->_save_registration_form_input(
1078
+										$registration,
1079
+										$form_input,
1080
+										$input_value
1081
+									)
1082
+									) {
1083
+										EE_Error::add_error(
1084
+											sprintf(
1085
+												esc_html_x(
1086
+													'Unable to save registration form data for the form input: "%1$s" with the submitted value: "%2$s"',
1087
+													'Unable to save registration form data for the form input: "form input name" with the submitted value: "form input value"',
1088
+													'event_espresso'
1089
+												),
1090
+												$form_input,
1091
+												$input_value
1092
+											),
1093
+											__FILE__,
1094
+											__FUNCTION__,
1095
+											__LINE__
1096
+										);
1097
+										return false;
1098
+									}
1099
+								}
1100
+							}
1101
+						}  // end of foreach ( $valid_data[ $reg_url_link ] as $form_section => $form_inputs )
1102
+					}
1103
+					// EEH_Debug_Tools::printr( $this->_attendee_data, '$this->_attendee_data', __FILE__, __LINE__ );
1104
+					// this registration does not require additional attendee information ?
1105
+					if ($copy_primary
1106
+						&& $att_nmbr > 1
1107
+						&& $this->checkout->primary_attendee_obj instanceof EE_Attendee
1108
+					) {
1109
+						// just copy the primary registrant
1110
+						$attendee = $this->checkout->primary_attendee_obj;
1111
+					} else {
1112
+						// ensure critical details are set for additional attendees
1113
+						$this->_attendee_data[ $reg_url_link ] = $att_nmbr > 1
1114
+							? $this->_copy_critical_attendee_details_from_primary_registrant(
1115
+								$this->_attendee_data[ $reg_url_link ]
1116
+							)
1117
+							: $this->_attendee_data[ $reg_url_link ];
1118
+						// execute create attendee command (which may return an existing attendee)
1119
+						$attendee = EE_Registry::instance()->BUS->execute(
1120
+							new CreateAttendeeCommand(
1121
+								$this->_attendee_data[ $reg_url_link ],
1122
+								$registration
1123
+							)
1124
+						);
1125
+						// who's #1 ?
1126
+						if ($att_nmbr === 1) {
1127
+							$this->checkout->primary_attendee_obj = $attendee;
1128
+						}
1129
+					}
1130
+					// EEH_Debug_Tools::printr( $attendee, '$attendee', __FILE__, __LINE__ );
1131
+					// add relation to registration, set attendee ID, and cache attendee
1132
+					$this->_associate_attendee_with_registration($registration, $attendee);
1133
+					// \EEH_Debug_Tools::printr( $registration, '$registration', __FILE__, __LINE__ );
1134
+					if (! $registration->attendee() instanceof EE_Attendee) {
1135
+						EE_Error::add_error(
1136
+							sprintf(
1137
+								esc_html_x(
1138
+									'Registration %s has an invalid or missing Attendee object.',
1139
+									'Registration 123-456-789 has an invalid or missing Attendee object.',
1140
+									'event_espresso'
1141
+								),
1142
+								$reg_url_link
1143
+							),
1144
+							__FILE__,
1145
+							__FUNCTION__,
1146
+							__LINE__
1147
+						);
1148
+						return false;
1149
+					}
1150
+					/** @type EE_Registration_Processor $registration_processor */
1151
+					$registration_processor = EE_Registry::instance()->load_class('Registration_Processor');
1152
+					// at this point, we should have enough details about the registrant to consider the registration
1153
+					// NOT incomplete
1154
+					$registration_processor->toggle_incomplete_registration_status_to_default(
1155
+						$registration,
1156
+						false,
1157
+						new Context(
1158
+							'spco_reg_step_attendee_information_process_registrations',
1159
+							esc_html__(
1160
+								'Finished populating registration with details from the registration form after submitting the Attendee Information Reg Step.',
1161
+								'event_espresso'
1162
+							)
1163
+						)
1164
+					);
1165
+					// we can also consider the TXN to not have been failed, so temporarily upgrade it's status to
1166
+					// abandoned
1167
+					$this->checkout->transaction->toggle_failed_transaction_status();
1168
+					// if we've gotten this far, then let's save what we have
1169
+					$registration->save();
1170
+					// add relation between TXN and registration
1171
+					$this->_associate_registration_with_transaction($registration);
1172
+				}
1173
+			} else {
1174
+				EE_Error::add_error(
1175
+					esc_html__(
1176
+						'An invalid or missing line item ID was encountered while attempting to process the registration form.',
1177
+						'event_espresso'
1178
+					),
1179
+					__FILE__,
1180
+					__FUNCTION__,
1181
+					__LINE__
1182
+				);
1183
+				// remove malformed data
1184
+				unset($valid_data[ $reg_url_link ]);
1185
+				return false;
1186
+			}
1187
+		} // end of foreach ( $this->checkout->transaction->registrations()  as $registration )
1188
+		return $att_nmbr;
1189
+	}
1190
+
1191
+
1192
+	/**
1193
+	 *    _save_registration_form_input
1194
+	 *
1195
+	 * @param EE_Registration $registration
1196
+	 * @param string          $form_input
1197
+	 * @param string          $input_value
1198
+	 * @return bool
1199
+	 * @throws EE_Error
1200
+	 * @throws InvalidArgumentException
1201
+	 * @throws InvalidDataTypeException
1202
+	 * @throws InvalidInterfaceException
1203
+	 * @throws ReflectionException
1204
+	 */
1205
+	private function _save_registration_form_input(
1206
+		EE_Registration $registration,
1207
+		$form_input = '',
1208
+		$input_value = ''
1209
+	) {
1210
+		// \EEH_Debug_Tools::printr( __FUNCTION__, __CLASS__, __FILE__, __LINE__, 2 );
1211
+		// \EEH_Debug_Tools::printr( $form_input, '$form_input', __FILE__, __LINE__ );
1212
+		// \EEH_Debug_Tools::printr( $input_value, '$input_value', __FILE__, __LINE__ );
1213
+		// allow for plugins to hook in and do their own processing of the form input.
1214
+		// For plugins to bypass normal processing here, they just need to return a boolean value.
1215
+		if (apply_filters(
1216
+			'FHEE__EE_SPCO_Reg_Step_Attendee_Information___save_registration_form_input',
1217
+			false,
1218
+			$registration,
1219
+			$form_input,
1220
+			$input_value,
1221
+			$this
1222
+		)) {
1223
+			return true;
1224
+		}
1225
+		/*
1226 1226
          * $answer_cache_id is the key used to find the EE_Answer we want
1227 1227
          * @see https://events.codebasehq.com/projects/event-espresso/tickets/10477
1228 1228
          */
1229
-        $answer_cache_id = $this->checkout->reg_url_link
1230
-            ? $form_input . '-' . $registration->reg_url_link()
1231
-            : $form_input;
1232
-        $answer_is_obj = isset($this->_registration_answers[ $answer_cache_id ])
1233
-                         && $this->_registration_answers[ $answer_cache_id ] instanceof EE_Answer;
1234
-        // rename form_inputs if they are EE_Attendee properties
1235
-        switch ((string) $form_input) {
1236
-            case 'state':
1237
-            case 'STA_ID':
1238
-                $attendee_property = true;
1239
-                $form_input = 'STA_ID';
1240
-                break;
1241
-
1242
-            case 'country':
1243
-            case 'CNT_ISO':
1244
-                $attendee_property = true;
1245
-                $form_input = 'CNT_ISO';
1246
-                break;
1247
-
1248
-            default:
1249
-                $ATT_input = 'ATT_' . $form_input;
1250
-                // EEH_Debug_Tools::printr( $ATT_input, '$ATT_input', __FILE__, __LINE__ );
1251
-                $attendee_property = EEM_Attendee::instance()->has_field($ATT_input) ? true : false;
1252
-                $form_input = $attendee_property ? 'ATT_' . $form_input : $form_input;
1253
-        }
1254
-        // EEH_Debug_Tools::printr( $answer_cache_id, '$answer_cache_id', __FILE__, __LINE__ );
1255
-        // EEH_Debug_Tools::printr( $attendee_property, '$attendee_property', __FILE__, __LINE__ );
1256
-        // EEH_Debug_Tools::printr( $answer_is_obj, '$answer_is_obj', __FILE__, __LINE__ );
1257
-        // if this form input has a corresponding attendee property
1258
-        if ($attendee_property) {
1259
-            $this->_attendee_data[ $registration->reg_url_link() ][ $form_input ] = $input_value;
1260
-            if ($answer_is_obj) {
1261
-                // and delete the corresponding answer since we won't be storing this data in that object
1262
-                $registration->_remove_relation_to($this->_registration_answers[ $answer_cache_id ], 'Answer');
1263
-                $this->_registration_answers[ $answer_cache_id ]->delete_permanently();
1264
-            }
1265
-            return true;
1266
-        }
1267
-        if ($answer_is_obj) {
1268
-            // save this data to the answer object
1269
-            $this->_registration_answers[ $answer_cache_id ]->set_value($input_value);
1270
-            $result = $this->_registration_answers[ $answer_cache_id ]->save();
1271
-            return $result !== false;
1272
-        }
1273
-        foreach ($this->_registration_answers as $answer) {
1274
-            if ($answer instanceof EE_Answer && $answer->question_ID() === $answer_cache_id) {
1275
-                $answer->set_value($input_value);
1276
-                $result = $answer->save();
1277
-                return $result !== false;
1278
-            }
1279
-        }
1280
-        return false;
1281
-    }
1282
-
1283
-
1284
-    /**
1285
-     *    _verify_critical_attendee_details_are_set
1286
-     *
1287
-     * @param string $form_input
1288
-     * @param string $input_value
1289
-     * @return boolean
1290
-     */
1291
-    private function _verify_critical_attendee_details_are_set_and_validate_email(
1292
-        $form_input = '',
1293
-        $input_value = ''
1294
-    ) {
1295
-        if (empty($input_value)) {
1296
-            // if the form input isn't marked as being required, then just return
1297
-            if (! isset($this->_required_questions[ $form_input ]) || ! $this->_required_questions[ $form_input ]) {
1298
-                return true;
1299
-            }
1300
-            switch ($form_input) {
1301
-                case 'fname':
1302
-                    EE_Error::add_error(
1303
-                        esc_html__('First Name is a required value.', 'event_espresso'),
1304
-                        __FILE__,
1305
-                        __FUNCTION__,
1306
-                        __LINE__
1307
-                    );
1308
-                    return false;
1309
-                    break;
1310
-                case 'lname':
1311
-                    EE_Error::add_error(
1312
-                        esc_html__('Last Name is a required value.', 'event_espresso'),
1313
-                        __FILE__,
1314
-                        __FUNCTION__,
1315
-                        __LINE__
1316
-                    );
1317
-                    return false;
1318
-                    break;
1319
-                case 'email':
1320
-                    EE_Error::add_error(
1321
-                        esc_html__('Please enter a valid email address.', 'event_espresso'),
1322
-                        __FILE__,
1323
-                        __FUNCTION__,
1324
-                        __LINE__
1325
-                    );
1326
-                    return false;
1327
-                    break;
1328
-            }
1329
-        }
1330
-        return true;
1331
-    }
1332
-
1333
-
1334
-    /**
1335
-     *    _associate_attendee_with_registration
1336
-     *
1337
-     * @param EE_Registration $registration
1338
-     * @param EE_Attendee     $attendee
1339
-     * @return void
1340
-     * @throws EE_Error
1341
-     * @throws InvalidArgumentException
1342
-     * @throws ReflectionException
1343
-     * @throws RuntimeException
1344
-     * @throws InvalidDataTypeException
1345
-     * @throws InvalidInterfaceException
1346
-     */
1347
-    private function _associate_attendee_with_registration(EE_Registration $registration, EE_Attendee $attendee)
1348
-    {
1349
-        // add relation to attendee
1350
-        $registration->_add_relation_to($attendee, 'Attendee');
1351
-        $registration->set_attendee_id($attendee->ID());
1352
-        $registration->update_cache_after_object_save('Attendee', $attendee);
1353
-    }
1354
-
1355
-
1356
-    /**
1357
-     *    _associate_registration_with_transaction
1358
-     *
1359
-     * @param EE_Registration $registration
1360
-     * @return void
1361
-     * @throws EE_Error
1362
-     * @throws InvalidArgumentException
1363
-     * @throws ReflectionException
1364
-     * @throws InvalidDataTypeException
1365
-     * @throws InvalidInterfaceException
1366
-     */
1367
-    private function _associate_registration_with_transaction(EE_Registration $registration)
1368
-    {
1369
-        // add relation to registration
1370
-        $this->checkout->transaction->_add_relation_to($registration, 'Registration');
1371
-        $this->checkout->transaction->update_cache_after_object_save('Registration', $registration);
1372
-    }
1373
-
1374
-
1375
-    /**
1376
-     *    _copy_critical_attendee_details_from_primary_registrant
1377
-     *    ensures that all attendees at least have data for first name, last name, and email address
1378
-     *
1379
-     * @param array $attendee_data
1380
-     * @return array
1381
-     * @throws EE_Error
1382
-     * @throws InvalidArgumentException
1383
-     * @throws ReflectionException
1384
-     * @throws InvalidDataTypeException
1385
-     * @throws InvalidInterfaceException
1386
-     */
1387
-    private function _copy_critical_attendee_details_from_primary_registrant($attendee_data = array())
1388
-    {
1389
-        // bare minimum critical details include first name, last name, email address
1390
-        $critical_attendee_details = array('ATT_fname', 'ATT_lname', 'ATT_email');
1391
-        // add address info to critical details?
1392
-        if (apply_filters(
1393
-            'FHEE__EE_SPCO_Reg_Step_Attendee_Information__merge_address_details_with_critical_attendee_details',
1394
-            false
1395
-        )) {
1396
-            $address_details = array(
1397
-                'ATT_address',
1398
-                'ATT_address2',
1399
-                'ATT_city',
1400
-                'STA_ID',
1401
-                'CNT_ISO',
1402
-                'ATT_zip',
1403
-                'ATT_phone',
1404
-            );
1405
-            $critical_attendee_details = array_merge($critical_attendee_details, $address_details);
1406
-        }
1407
-        foreach ($critical_attendee_details as $critical_attendee_detail) {
1408
-            if (! isset($attendee_data[ $critical_attendee_detail ])
1409
-                || empty($attendee_data[ $critical_attendee_detail ])
1410
-            ) {
1411
-                $attendee_data[ $critical_attendee_detail ] = $this->checkout->primary_attendee_obj->get(
1412
-                    $critical_attendee_detail
1413
-                );
1414
-            }
1415
-        }
1416
-        return $attendee_data;
1417
-    }
1418
-
1419
-
1420
-    /**
1421
-     *    update_reg_step
1422
-     *    this is the final step after a user  revisits the site to edit their attendee information
1423
-     *    this gets called AFTER the process_reg_step() method above
1424
-     *
1425
-     * @return bool
1426
-     * @throws EE_Error
1427
-     * @throws InvalidArgumentException
1428
-     * @throws ReflectionException
1429
-     * @throws RuntimeException
1430
-     * @throws InvalidDataTypeException
1431
-     * @throws InvalidInterfaceException
1432
-     */
1433
-    public function update_reg_step()
1434
-    {
1435
-        // save everything
1436
-        if ($this->process_reg_step()) {
1437
-            $this->checkout->redirect = true;
1438
-            $this->checkout->redirect_url = add_query_arg(
1439
-                array(
1440
-                    'e_reg_url_link' => $this->checkout->reg_url_link,
1441
-                    'revisit'        => true,
1442
-                ),
1443
-                $this->checkout->thank_you_page_url
1444
-            );
1445
-            $this->checkout->json_response->set_redirect_url($this->checkout->redirect_url);
1446
-            return true;
1447
-        }
1448
-        return false;
1449
-    }
1229
+		$answer_cache_id = $this->checkout->reg_url_link
1230
+			? $form_input . '-' . $registration->reg_url_link()
1231
+			: $form_input;
1232
+		$answer_is_obj = isset($this->_registration_answers[ $answer_cache_id ])
1233
+						 && $this->_registration_answers[ $answer_cache_id ] instanceof EE_Answer;
1234
+		// rename form_inputs if they are EE_Attendee properties
1235
+		switch ((string) $form_input) {
1236
+			case 'state':
1237
+			case 'STA_ID':
1238
+				$attendee_property = true;
1239
+				$form_input = 'STA_ID';
1240
+				break;
1241
+
1242
+			case 'country':
1243
+			case 'CNT_ISO':
1244
+				$attendee_property = true;
1245
+				$form_input = 'CNT_ISO';
1246
+				break;
1247
+
1248
+			default:
1249
+				$ATT_input = 'ATT_' . $form_input;
1250
+				// EEH_Debug_Tools::printr( $ATT_input, '$ATT_input', __FILE__, __LINE__ );
1251
+				$attendee_property = EEM_Attendee::instance()->has_field($ATT_input) ? true : false;
1252
+				$form_input = $attendee_property ? 'ATT_' . $form_input : $form_input;
1253
+		}
1254
+		// EEH_Debug_Tools::printr( $answer_cache_id, '$answer_cache_id', __FILE__, __LINE__ );
1255
+		// EEH_Debug_Tools::printr( $attendee_property, '$attendee_property', __FILE__, __LINE__ );
1256
+		// EEH_Debug_Tools::printr( $answer_is_obj, '$answer_is_obj', __FILE__, __LINE__ );
1257
+		// if this form input has a corresponding attendee property
1258
+		if ($attendee_property) {
1259
+			$this->_attendee_data[ $registration->reg_url_link() ][ $form_input ] = $input_value;
1260
+			if ($answer_is_obj) {
1261
+				// and delete the corresponding answer since we won't be storing this data in that object
1262
+				$registration->_remove_relation_to($this->_registration_answers[ $answer_cache_id ], 'Answer');
1263
+				$this->_registration_answers[ $answer_cache_id ]->delete_permanently();
1264
+			}
1265
+			return true;
1266
+		}
1267
+		if ($answer_is_obj) {
1268
+			// save this data to the answer object
1269
+			$this->_registration_answers[ $answer_cache_id ]->set_value($input_value);
1270
+			$result = $this->_registration_answers[ $answer_cache_id ]->save();
1271
+			return $result !== false;
1272
+		}
1273
+		foreach ($this->_registration_answers as $answer) {
1274
+			if ($answer instanceof EE_Answer && $answer->question_ID() === $answer_cache_id) {
1275
+				$answer->set_value($input_value);
1276
+				$result = $answer->save();
1277
+				return $result !== false;
1278
+			}
1279
+		}
1280
+		return false;
1281
+	}
1282
+
1283
+
1284
+	/**
1285
+	 *    _verify_critical_attendee_details_are_set
1286
+	 *
1287
+	 * @param string $form_input
1288
+	 * @param string $input_value
1289
+	 * @return boolean
1290
+	 */
1291
+	private function _verify_critical_attendee_details_are_set_and_validate_email(
1292
+		$form_input = '',
1293
+		$input_value = ''
1294
+	) {
1295
+		if (empty($input_value)) {
1296
+			// if the form input isn't marked as being required, then just return
1297
+			if (! isset($this->_required_questions[ $form_input ]) || ! $this->_required_questions[ $form_input ]) {
1298
+				return true;
1299
+			}
1300
+			switch ($form_input) {
1301
+				case 'fname':
1302
+					EE_Error::add_error(
1303
+						esc_html__('First Name is a required value.', 'event_espresso'),
1304
+						__FILE__,
1305
+						__FUNCTION__,
1306
+						__LINE__
1307
+					);
1308
+					return false;
1309
+					break;
1310
+				case 'lname':
1311
+					EE_Error::add_error(
1312
+						esc_html__('Last Name is a required value.', 'event_espresso'),
1313
+						__FILE__,
1314
+						__FUNCTION__,
1315
+						__LINE__
1316
+					);
1317
+					return false;
1318
+					break;
1319
+				case 'email':
1320
+					EE_Error::add_error(
1321
+						esc_html__('Please enter a valid email address.', 'event_espresso'),
1322
+						__FILE__,
1323
+						__FUNCTION__,
1324
+						__LINE__
1325
+					);
1326
+					return false;
1327
+					break;
1328
+			}
1329
+		}
1330
+		return true;
1331
+	}
1332
+
1333
+
1334
+	/**
1335
+	 *    _associate_attendee_with_registration
1336
+	 *
1337
+	 * @param EE_Registration $registration
1338
+	 * @param EE_Attendee     $attendee
1339
+	 * @return void
1340
+	 * @throws EE_Error
1341
+	 * @throws InvalidArgumentException
1342
+	 * @throws ReflectionException
1343
+	 * @throws RuntimeException
1344
+	 * @throws InvalidDataTypeException
1345
+	 * @throws InvalidInterfaceException
1346
+	 */
1347
+	private function _associate_attendee_with_registration(EE_Registration $registration, EE_Attendee $attendee)
1348
+	{
1349
+		// add relation to attendee
1350
+		$registration->_add_relation_to($attendee, 'Attendee');
1351
+		$registration->set_attendee_id($attendee->ID());
1352
+		$registration->update_cache_after_object_save('Attendee', $attendee);
1353
+	}
1354
+
1355
+
1356
+	/**
1357
+	 *    _associate_registration_with_transaction
1358
+	 *
1359
+	 * @param EE_Registration $registration
1360
+	 * @return void
1361
+	 * @throws EE_Error
1362
+	 * @throws InvalidArgumentException
1363
+	 * @throws ReflectionException
1364
+	 * @throws InvalidDataTypeException
1365
+	 * @throws InvalidInterfaceException
1366
+	 */
1367
+	private function _associate_registration_with_transaction(EE_Registration $registration)
1368
+	{
1369
+		// add relation to registration
1370
+		$this->checkout->transaction->_add_relation_to($registration, 'Registration');
1371
+		$this->checkout->transaction->update_cache_after_object_save('Registration', $registration);
1372
+	}
1373
+
1374
+
1375
+	/**
1376
+	 *    _copy_critical_attendee_details_from_primary_registrant
1377
+	 *    ensures that all attendees at least have data for first name, last name, and email address
1378
+	 *
1379
+	 * @param array $attendee_data
1380
+	 * @return array
1381
+	 * @throws EE_Error
1382
+	 * @throws InvalidArgumentException
1383
+	 * @throws ReflectionException
1384
+	 * @throws InvalidDataTypeException
1385
+	 * @throws InvalidInterfaceException
1386
+	 */
1387
+	private function _copy_critical_attendee_details_from_primary_registrant($attendee_data = array())
1388
+	{
1389
+		// bare minimum critical details include first name, last name, email address
1390
+		$critical_attendee_details = array('ATT_fname', 'ATT_lname', 'ATT_email');
1391
+		// add address info to critical details?
1392
+		if (apply_filters(
1393
+			'FHEE__EE_SPCO_Reg_Step_Attendee_Information__merge_address_details_with_critical_attendee_details',
1394
+			false
1395
+		)) {
1396
+			$address_details = array(
1397
+				'ATT_address',
1398
+				'ATT_address2',
1399
+				'ATT_city',
1400
+				'STA_ID',
1401
+				'CNT_ISO',
1402
+				'ATT_zip',
1403
+				'ATT_phone',
1404
+			);
1405
+			$critical_attendee_details = array_merge($critical_attendee_details, $address_details);
1406
+		}
1407
+		foreach ($critical_attendee_details as $critical_attendee_detail) {
1408
+			if (! isset($attendee_data[ $critical_attendee_detail ])
1409
+				|| empty($attendee_data[ $critical_attendee_detail ])
1410
+			) {
1411
+				$attendee_data[ $critical_attendee_detail ] = $this->checkout->primary_attendee_obj->get(
1412
+					$critical_attendee_detail
1413
+				);
1414
+			}
1415
+		}
1416
+		return $attendee_data;
1417
+	}
1418
+
1419
+
1420
+	/**
1421
+	 *    update_reg_step
1422
+	 *    this is the final step after a user  revisits the site to edit their attendee information
1423
+	 *    this gets called AFTER the process_reg_step() method above
1424
+	 *
1425
+	 * @return bool
1426
+	 * @throws EE_Error
1427
+	 * @throws InvalidArgumentException
1428
+	 * @throws ReflectionException
1429
+	 * @throws RuntimeException
1430
+	 * @throws InvalidDataTypeException
1431
+	 * @throws InvalidInterfaceException
1432
+	 */
1433
+	public function update_reg_step()
1434
+	{
1435
+		// save everything
1436
+		if ($this->process_reg_step()) {
1437
+			$this->checkout->redirect = true;
1438
+			$this->checkout->redirect_url = add_query_arg(
1439
+				array(
1440
+					'e_reg_url_link' => $this->checkout->reg_url_link,
1441
+					'revisit'        => true,
1442
+				),
1443
+				$this->checkout->thank_you_page_url
1444
+			);
1445
+			$this->checkout->json_response->set_redirect_url($this->checkout->redirect_url);
1446
+			return true;
1447
+		}
1448
+		return false;
1449
+	}
1450 1450
 }
Please login to merge, or discard this patch.
reg_steps/attendee_information/attendee_info_main.template.php 2 patches
Indentation   +32 added lines, -32 removed lines patch added patch discarded remove patch
@@ -6,16 +6,16 @@  discard block
 block discarded – undo
6 6
 <?php if (!is_admin()) : ?>
7 7
     <p id="spco-attendee_information-pg" class="spco-steps-pg small-text drk-grey-text">
8 8
         <?php echo apply_filters(
9
-            'FHEE__registration_page_attendee_information__attendee_information_pg',
10
-            sprintf(
11
-                __(
12
-                    'In order to process your registration, we ask you to provide the following information.%1$sPlease note that all fields marked with an asterisk (%2$s) are required.',
13
-                    'event_espresso'
14
-                ),
15
-                '<br />',
16
-                '<span class="asterisk">*</span>'
17
-            )
18
-        ); ?>
9
+			'FHEE__registration_page_attendee_information__attendee_information_pg',
10
+			sprintf(
11
+				__(
12
+					'In order to process your registration, we ask you to provide the following information.%1$sPlease note that all fields marked with an asterisk (%2$s) are required.',
13
+					'event_espresso'
14
+				),
15
+				'<br />',
16
+				'<span class="asterisk">*</span>'
17
+			)
18
+		); ?>
19 19
 </p>
20 20
 <?php endif; ?>
21 21
 
@@ -25,10 +25,10 @@  discard block
 block discarded – undo
25 25
 $prev_ticket = 0;
26 26
 
27 27
 if (count($registrations) > 0) {
28
-    foreach ($registrations as $registration) {
29
-        if ($registration instanceof EE_Registration) {
30
-            $att_nmbr++;
31
-            ?>
28
+	foreach ($registrations as $registration) {
29
+		if ($registration instanceof EE_Registration) {
30
+			$att_nmbr++;
31
+			?>
32 32
 
33 33
             <div id="spco-attendee-panel-dv-<?php echo $registration->reg_url_link(); ?>"
34 34
                  class="spco-attendee-panel-dv spco-attendee-ticket-<?php echo $registration->ticket()->ID(); ?>">
@@ -50,19 +50,19 @@  discard block
 block discarded – undo
50 50
                                     <th scope="col" width="" class="jst-left"><?php _e('Name and Description', 'event_espresso'); ?></th>
51 51
                                     <th scope="col" width="7.5%" class="jst-rght">
52 52
                                         <?php _e(
53
-                                            'Qty',
54
-                                            'event_espresso'
55
-                                        ); ?></th>
53
+											'Qty',
54
+											'event_espresso'
55
+										); ?></th>
56 56
                                     <th scope="col" width="17.5%" class="jst-rght">
57 57
                                         <?php _e(
58
-                                            'Price',
59
-                                            'event_espresso'
60
-                                        ); ?></th>
58
+											'Price',
59
+											'event_espresso'
60
+										); ?></th>
61 61
                                     <th scope="col" width="17.5%" class="jst-rght">
62 62
                                         <?php _e(
63
-                                            'Total',
64
-                                            'event_espresso'
65
-                                        ); ?></th>
63
+											'Total',
64
+											'event_espresso'
65
+										); ?></th>
66 66
                                 </tr>
67 67
                                 </thead>
68 68
                                 <tbody>
@@ -74,19 +74,19 @@  discard block
 block discarded – undo
74 74
                 <?php } ?>
75 75
 
76 76
                 <?php
77
-                // ATTENDEE QUESTIONS
78
-                $reg_form = EE_Template_Layout::get_subform_name($registration->reg_url_link());
79
-                echo ${$reg_form};
80
-                ?>
77
+				// ATTENDEE QUESTIONS
78
+				$reg_form = EE_Template_Layout::get_subform_name($registration->reg_url_link());
79
+				echo ${$reg_form};
80
+				?>
81 81
 
82 82
             </div>
83 83
             <?php
84
-            $prev_event = $registration->event()->ID();
85
-            $prev_ticket = $registration->ticket()->ID();
86
-        } // if ( $registration instanceof EE_Registration )
87
-    } // end foreach ( $registrations as $registration )
84
+			$prev_event = $registration->event()->ID();
85
+			$prev_ticket = $registration->ticket()->ID();
86
+		} // if ( $registration instanceof EE_Registration )
87
+	} // end foreach ( $registrations as $registration )
88 88
 
89
-    echo $default_hidden_inputs;
89
+	echo $default_hidden_inputs;
90 90
 } // end if ( count( $registrations ) > 0 )
91 91
 
92 92
 ?>
Please login to merge, or discard this patch.
Spacing   +5 added lines, -5 removed lines patch added patch discarded remove patch
@@ -3,7 +3,7 @@  discard block
 block discarded – undo
3 3
 /** @var array $ticket_line_item */
4 4
 /** @var string $default_hidden_inputs */
5 5
 ?>
6
-<?php if (!is_admin()) : ?>
6
+<?php if ( ! is_admin()) : ?>
7 7
     <p id="spco-attendee_information-pg" class="spco-steps-pg small-text drk-grey-text">
8 8
         <?php echo apply_filters(
9 9
             'FHEE__registration_page_attendee_information__attendee_information_pg',
@@ -33,15 +33,15 @@  discard block
 block discarded – undo
33 33
             <div id="spco-attendee-panel-dv-<?php echo $registration->reg_url_link(); ?>"
34 34
                  class="spco-attendee-panel-dv spco-attendee-ticket-<?php echo $registration->ticket()->ID(); ?>">
35 35
 
36
-                <?php if (!is_admin() && $registration->event()->ID() !== $prev_event) { ?>
36
+                <?php if ( ! is_admin() && $registration->event()->ID() !== $prev_event) { ?>
37 37
                     <h4 id="event_title-<?php echo $registration->event()->ID() ?>" class="big-event-title-hdr">
38 38
                         <?php echo $registration->event()->name(); ?>
39 39
                     </h4>
40 40
                 <?php } ?>
41 41
                 <?php if ($registration->ticket()->ID() !== $prev_ticket) { ?>
42
-                    <?php if (! $revisit) { ?>
42
+                    <?php if ( ! $revisit) { ?>
43 43
                         <div class="spco-ticket-info-dv small-text">
44
-                            <?php if (!is_admin()) : ?>
44
+                            <?php if ( ! is_admin()) : ?>
45 45
                                 <h5><?php _e('Details', 'event_espresso'); ?></h5>
46 46
                             <?php endif; ?>
47 47
                             <table class="spco-ticket-details">
@@ -66,7 +66,7 @@  discard block
 block discarded – undo
66 66
                                 </tr>
67 67
                                 </thead>
68 68
                                 <tbody>
69
-                                <?php echo $ticket_line_item[ $registration->ticket()->ID() ]; ?>
69
+                                <?php echo $ticket_line_item[$registration->ticket()->ID()]; ?>
70 70
                                 </tbody>
71 71
                             </table>
72 72
                         </div>
Please login to merge, or discard this patch.
core/services/assets/AssetManager.php 3 patches
Doc Comments   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -270,7 +270,7 @@
 block discarded – undo
270 270
      * @param string $asset_type
271 271
      * @param string $handle
272 272
      * @param array  $extra_dependencies
273
-     * @return array
273
+     * @return string
274 274
      * @since $VID:$
275 275
      */
276 276
     private function getAssetDetails($asset_type, $handle, $extra_dependencies = [])
Please login to merge, or discard this patch.
Indentation   +255 added lines, -255 removed lines patch added patch discarded remove patch
@@ -23,284 +23,284 @@
 block discarded – undo
23 23
 abstract class AssetManager implements AssetManagerInterface
24 24
 {
25 25
 
26
-    /**
27
-     * @var AssetCollection $assets
28
-     */
29
-    protected $assets;
26
+	/**
27
+	 * @var AssetCollection $assets
28
+	 */
29
+	protected $assets;
30 30
 
31
-    /**
32
-     * @var DomainInterface
33
-     */
34
-    protected $domain;
31
+	/**
32
+	 * @var DomainInterface
33
+	 */
34
+	protected $domain;
35 35
 
36
-    /**
37
-     * @var Registry $registry
38
-     */
39
-    protected $registry;
36
+	/**
37
+	 * @var Registry $registry
38
+	 */
39
+	protected $registry;
40 40
 
41 41
 
42
-    /**
43
-     * AssetRegister constructor.
44
-     *
45
-     * @param DomainInterface $domain
46
-     * @param AssetCollection $assets
47
-     * @param Registry        $registry
48
-     */
49
-    public function __construct(DomainInterface $domain, AssetCollection $assets, Registry $registry)
50
-    {
51
-        $this->domain = $domain;
52
-        $this->assets = $assets;
53
-        $this->registry = $registry;
54
-        add_action('wp_enqueue_scripts', array($this, 'addManifestFile'), 0);
55
-        add_action('admin_enqueue_scripts', array($this, 'addManifestFile'), 0);
56
-        add_action('wp_enqueue_scripts', array($this, 'addAssets'), 2);
57
-        add_action('admin_enqueue_scripts', array($this, 'addAssets'), 2);
58
-    }
42
+	/**
43
+	 * AssetRegister constructor.
44
+	 *
45
+	 * @param DomainInterface $domain
46
+	 * @param AssetCollection $assets
47
+	 * @param Registry        $registry
48
+	 */
49
+	public function __construct(DomainInterface $domain, AssetCollection $assets, Registry $registry)
50
+	{
51
+		$this->domain = $domain;
52
+		$this->assets = $assets;
53
+		$this->registry = $registry;
54
+		add_action('wp_enqueue_scripts', array($this, 'addManifestFile'), 0);
55
+		add_action('admin_enqueue_scripts', array($this, 'addManifestFile'), 0);
56
+		add_action('wp_enqueue_scripts', array($this, 'addAssets'), 2);
57
+		add_action('admin_enqueue_scripts', array($this, 'addAssets'), 2);
58
+	}
59 59
 
60 60
 
61
-    /**
62
-     * @since 4.9.71.p
63
-     * @return string
64
-     */
65
-    public function assetNamespace()
66
-    {
67
-        return $this->domain->assetNamespace();
68
-    }
61
+	/**
62
+	 * @since 4.9.71.p
63
+	 * @return string
64
+	 */
65
+	public function assetNamespace()
66
+	{
67
+		return $this->domain->assetNamespace();
68
+	}
69 69
 
70 70
 
71
-    /**
72
-     * @return void
73
-     * @throws DuplicateCollectionIdentifierException
74
-     * @throws InvalidDataTypeException
75
-     * @throws InvalidEntityException
76
-     * @since 4.9.62.p
77
-     */
78
-    public function addManifestFile()
79
-    {
80
-        // if a manifest file has already been added for this domain, then just return
81
-        if ($this->assets->has($this->domain->assetNamespace())) {
82
-            return;
83
-        }
84
-        $asset = new ManifestFile($this->domain);
85
-        $this->assets->add($asset, $this->domain->assetNamespace());
86
-    }
71
+	/**
72
+	 * @return void
73
+	 * @throws DuplicateCollectionIdentifierException
74
+	 * @throws InvalidDataTypeException
75
+	 * @throws InvalidEntityException
76
+	 * @since 4.9.62.p
77
+	 */
78
+	public function addManifestFile()
79
+	{
80
+		// if a manifest file has already been added for this domain, then just return
81
+		if ($this->assets->has($this->domain->assetNamespace())) {
82
+			return;
83
+		}
84
+		$asset = new ManifestFile($this->domain);
85
+		$this->assets->add($asset, $this->domain->assetNamespace());
86
+	}
87 87
 
88 88
 
89
-    /**
90
-     * @return ManifestFile[]
91
-     * @since 4.9.62.p
92
-     */
93
-    public function getManifestFile()
94
-    {
95
-        return $this->assets->getManifestFiles();
96
-    }
89
+	/**
90
+	 * @return ManifestFile[]
91
+	 * @since 4.9.62.p
92
+	 */
93
+	public function getManifestFile()
94
+	{
95
+		return $this->assets->getManifestFiles();
96
+	}
97 97
 
98 98
 
99
-    /**
100
-     * @param string $handle
101
-     * @param string $source
102
-     * @param array  $dependencies
103
-     * @param bool   $load_in_footer
104
-     * @param string $version
105
-     * @return JavascriptAsset
106
-     * @throws DuplicateCollectionIdentifierException
107
-     * @throws InvalidDataTypeException
108
-     * @throws InvalidEntityException
109
-     * @throws DomainException
110
-     * @since 4.9.62.p
111
-     */
112
-    public function addJavascript(
113
-        $handle,
114
-        $source,
115
-        array $dependencies = array(),
116
-        $load_in_footer = true,
117
-        $version = ''
118
-    ) {
119
-        $asset = new JavascriptAsset(
120
-            $handle,
121
-            $source,
122
-            array_unique($dependencies),
123
-            $load_in_footer,
124
-            $this->domain,
125
-            $version
126
-        );
127
-        $this->assets->add($asset, $handle);
128
-        return $asset;
129
-    }
99
+	/**
100
+	 * @param string $handle
101
+	 * @param string $source
102
+	 * @param array  $dependencies
103
+	 * @param bool   $load_in_footer
104
+	 * @param string $version
105
+	 * @return JavascriptAsset
106
+	 * @throws DuplicateCollectionIdentifierException
107
+	 * @throws InvalidDataTypeException
108
+	 * @throws InvalidEntityException
109
+	 * @throws DomainException
110
+	 * @since 4.9.62.p
111
+	 */
112
+	public function addJavascript(
113
+		$handle,
114
+		$source,
115
+		array $dependencies = array(),
116
+		$load_in_footer = true,
117
+		$version = ''
118
+	) {
119
+		$asset = new JavascriptAsset(
120
+			$handle,
121
+			$source,
122
+			array_unique($dependencies),
123
+			$load_in_footer,
124
+			$this->domain,
125
+			$version
126
+		);
127
+		$this->assets->add($asset, $handle);
128
+		return $asset;
129
+	}
130 130
 
131 131
 
132
-    /**
133
-     * Used to register a javascript asset where everything is dynamically derived from the given handle.
134
-     *
135
-     * @param string       $handle
136
-     * @param string|array $extra_dependencies
137
-     * @return JavascriptAsset
138
-     * @throws DuplicateCollectionIdentifierException
139
-     * @throws InvalidDataTypeException
140
-     * @throws InvalidEntityException
141
-     * @throws DomainException
142
-     */
143
-    public function addJs($handle, $extra_dependencies = [])
144
-    {
145
-        $details = $this->getAssetDetails(
146
-            Asset::TYPE_JS,
147
-            $handle,
148
-            $extra_dependencies
149
-        );
150
-        return $this->addJavascript(
151
-            $handle,
152
-            $this->registry->getJsUrl($this->domain->assetNamespace(), $handle),
153
-            $details['dependencies'],
154
-            true,
155
-            $details['version']
156
-        );
157
-    }
132
+	/**
133
+	 * Used to register a javascript asset where everything is dynamically derived from the given handle.
134
+	 *
135
+	 * @param string       $handle
136
+	 * @param string|array $extra_dependencies
137
+	 * @return JavascriptAsset
138
+	 * @throws DuplicateCollectionIdentifierException
139
+	 * @throws InvalidDataTypeException
140
+	 * @throws InvalidEntityException
141
+	 * @throws DomainException
142
+	 */
143
+	public function addJs($handle, $extra_dependencies = [])
144
+	{
145
+		$details = $this->getAssetDetails(
146
+			Asset::TYPE_JS,
147
+			$handle,
148
+			$extra_dependencies
149
+		);
150
+		return $this->addJavascript(
151
+			$handle,
152
+			$this->registry->getJsUrl($this->domain->assetNamespace(), $handle),
153
+			$details['dependencies'],
154
+			true,
155
+			$details['version']
156
+		);
157
+	}
158 158
 
159 159
 
160
-    /**
161
-     * @param string $handle
162
-     * @param array  $dependencies
163
-     * @param bool   $load_in_footer
164
-     * @param string $version
165
-     * @return JavascriptAsset
166
-     * @throws DomainException
167
-     * @throws DuplicateCollectionIdentifierException
168
-     * @throws InvalidDataTypeException
169
-     * @throws InvalidEntityException
170
-     * @since 4.9.71.p
171
-     */
172
-    public function addVendorJavascript(
173
-        $handle,
174
-        array $dependencies = array(),
175
-        $load_in_footer = true,
176
-        $version = ''
177
-    ) {
178
-        $dev_suffix = wp_scripts_get_suffix('dev');
179
-        $vendor_path = $this->domain->pluginUrl() . 'assets/vendor/';
180
-        return $this->addJavascript(
181
-            $handle,
182
-            "{$vendor_path}{$handle}{$dev_suffix}.js",
183
-            $dependencies,
184
-            $load_in_footer,
185
-            $version
186
-        );
187
-    }
160
+	/**
161
+	 * @param string $handle
162
+	 * @param array  $dependencies
163
+	 * @param bool   $load_in_footer
164
+	 * @param string $version
165
+	 * @return JavascriptAsset
166
+	 * @throws DomainException
167
+	 * @throws DuplicateCollectionIdentifierException
168
+	 * @throws InvalidDataTypeException
169
+	 * @throws InvalidEntityException
170
+	 * @since 4.9.71.p
171
+	 */
172
+	public function addVendorJavascript(
173
+		$handle,
174
+		array $dependencies = array(),
175
+		$load_in_footer = true,
176
+		$version = ''
177
+	) {
178
+		$dev_suffix = wp_scripts_get_suffix('dev');
179
+		$vendor_path = $this->domain->pluginUrl() . 'assets/vendor/';
180
+		return $this->addJavascript(
181
+			$handle,
182
+			"{$vendor_path}{$handle}{$dev_suffix}.js",
183
+			$dependencies,
184
+			$load_in_footer,
185
+			$version
186
+		);
187
+	}
188 188
 
189 189
 
190
-    /**
191
-     * @param string $handle
192
-     * @param string $source
193
-     * @param array  $dependencies
194
-     * @param string $media
195
-     * @param string $version
196
-     * @return StylesheetAsset
197
-     * @throws DomainException
198
-     * @throws DuplicateCollectionIdentifierException
199
-     * @throws InvalidDataTypeException
200
-     * @throws InvalidEntityException
201
-     * @since 4.9.62.p
202
-     */
203
-    public function addStylesheet(
204
-        $handle,
205
-        $source,
206
-        array $dependencies = array(),
207
-        $media = 'all',
208
-        $version = ''
209
-    ) {
210
-        $asset = new StylesheetAsset(
211
-            $handle,
212
-            $source,
213
-            array_unique($dependencies),
214
-            $this->domain,
215
-            $media,
216
-            $version
217
-        );
218
-        $this->assets->add($asset, $handle);
219
-        return $asset;
220
-    }
190
+	/**
191
+	 * @param string $handle
192
+	 * @param string $source
193
+	 * @param array  $dependencies
194
+	 * @param string $media
195
+	 * @param string $version
196
+	 * @return StylesheetAsset
197
+	 * @throws DomainException
198
+	 * @throws DuplicateCollectionIdentifierException
199
+	 * @throws InvalidDataTypeException
200
+	 * @throws InvalidEntityException
201
+	 * @since 4.9.62.p
202
+	 */
203
+	public function addStylesheet(
204
+		$handle,
205
+		$source,
206
+		array $dependencies = array(),
207
+		$media = 'all',
208
+		$version = ''
209
+	) {
210
+		$asset = new StylesheetAsset(
211
+			$handle,
212
+			$source,
213
+			array_unique($dependencies),
214
+			$this->domain,
215
+			$media,
216
+			$version
217
+		);
218
+		$this->assets->add($asset, $handle);
219
+		return $asset;
220
+	}
221 221
 
222 222
 
223
-    /**
224
-     * Used to register a css asset where everything is dynamically derived from the given handle.
225
-     *
226
-     * @param string       $handle
227
-     * @param string|array $extra_dependencies
228
-     * @return StylesheetAsset
229
-     * @throws DuplicateCollectionIdentifierException
230
-     * @throws InvalidDataTypeException
231
-     * @throws InvalidEntityException
232
-     * @throws DomainException
233
-     */
234
-    public function addCss($handle, $extra_dependencies = [])
235
-    {
236
-        $details = $this->getAssetDetails(
237
-            Asset::TYPE_CSS,
238
-            $handle,
239
-            $extra_dependencies
240
-        );
241
-        return $this->addStylesheet(
242
-            $handle,
243
-            $this->registry->getCssUrl($this->domain->assetNamespace(), $handle),
244
-            $details['dependencies'],
245
-            'all',
246
-            $details['version']
247
-        );
248
-    }
223
+	/**
224
+	 * Used to register a css asset where everything is dynamically derived from the given handle.
225
+	 *
226
+	 * @param string       $handle
227
+	 * @param string|array $extra_dependencies
228
+	 * @return StylesheetAsset
229
+	 * @throws DuplicateCollectionIdentifierException
230
+	 * @throws InvalidDataTypeException
231
+	 * @throws InvalidEntityException
232
+	 * @throws DomainException
233
+	 */
234
+	public function addCss($handle, $extra_dependencies = [])
235
+	{
236
+		$details = $this->getAssetDetails(
237
+			Asset::TYPE_CSS,
238
+			$handle,
239
+			$extra_dependencies
240
+		);
241
+		return $this->addStylesheet(
242
+			$handle,
243
+			$this->registry->getCssUrl($this->domain->assetNamespace(), $handle),
244
+			$details['dependencies'],
245
+			'all',
246
+			$details['version']
247
+		);
248
+	}
249 249
 
250 250
 
251
-    /**
252
-     * @param string $handle
253
-     * @return bool
254
-     * @since 4.9.62.p
255
-     */
256
-    public function enqueueAsset($handle)
257
-    {
258
-        if ($this->assets->has($handle)) {
259
-            $asset = $this->assets->get($handle);
260
-            if ($asset->isRegistered()) {
261
-                $asset->enqueueAsset();
262
-                return true;
263
-            }
264
-        }
265
-        return false;
266
-    }
251
+	/**
252
+	 * @param string $handle
253
+	 * @return bool
254
+	 * @since 4.9.62.p
255
+	 */
256
+	public function enqueueAsset($handle)
257
+	{
258
+		if ($this->assets->has($handle)) {
259
+			$asset = $this->assets->get($handle);
260
+			if ($asset->isRegistered()) {
261
+				$asset->enqueueAsset();
262
+				return true;
263
+			}
264
+		}
265
+		return false;
266
+	}
267 267
 
268 268
 
269
-    /**
270
-     * @param string $asset_type
271
-     * @param string $handle
272
-     * @param array  $extra_dependencies
273
-     * @return array
274
-     * @since $VID:$
275
-     */
276
-    private function getAssetDetails($asset_type, $handle, $extra_dependencies = [])
277
-    {
278
-        $getAssetDetails = '';
279
-        switch ($asset_type) {
280
-            case Asset::TYPE_JS :
281
-                $getAssetDetails = 'getJsAssetDetails';
282
-                break;
283
-            case Asset::TYPE_CSS :
284
-                $getAssetDetails = 'getCssAssetDetails';
285
-                break;
286
-        }
287
-        if ($getAssetDetails === '') {
288
-            return ['dependencies' => [], 'version' => ''];
289
-        }
290
-        $details = $this->registry->$getAssetDetails(
291
-            $this->domain->assetNamespace(),
292
-            $handle
293
-        );
294
-        $details['dependencies'] = isset($details['dependencies'])
295
-            ? $details['dependencies']
296
-            : [];
297
-        $details['version'] = isset($details['version'])
298
-            ? $details['version']
299
-            : '';
300
-        $details['dependencies'] = ! empty($extra_dependencies)
301
-            ? array_merge($details['dependencies'], (array) $extra_dependencies)
302
-            : $details['dependencies'];
303
-        return $details;
269
+	/**
270
+	 * @param string $asset_type
271
+	 * @param string $handle
272
+	 * @param array  $extra_dependencies
273
+	 * @return array
274
+	 * @since $VID:$
275
+	 */
276
+	private function getAssetDetails($asset_type, $handle, $extra_dependencies = [])
277
+	{
278
+		$getAssetDetails = '';
279
+		switch ($asset_type) {
280
+			case Asset::TYPE_JS :
281
+				$getAssetDetails = 'getJsAssetDetails';
282
+				break;
283
+			case Asset::TYPE_CSS :
284
+				$getAssetDetails = 'getCssAssetDetails';
285
+				break;
286
+		}
287
+		if ($getAssetDetails === '') {
288
+			return ['dependencies' => [], 'version' => ''];
289
+		}
290
+		$details = $this->registry->$getAssetDetails(
291
+			$this->domain->assetNamespace(),
292
+			$handle
293
+		);
294
+		$details['dependencies'] = isset($details['dependencies'])
295
+			? $details['dependencies']
296
+			: [];
297
+		$details['version'] = isset($details['version'])
298
+			? $details['version']
299
+			: '';
300
+		$details['dependencies'] = ! empty($extra_dependencies)
301
+			? array_merge($details['dependencies'], (array) $extra_dependencies)
302
+			: $details['dependencies'];
303
+		return $details;
304 304
 
305
-    }
305
+	}
306 306
 }
Please login to merge, or discard this patch.
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -176,7 +176,7 @@
 block discarded – undo
176 176
         $version = ''
177 177
     ) {
178 178
         $dev_suffix = wp_scripts_get_suffix('dev');
179
-        $vendor_path = $this->domain->pluginUrl() . 'assets/vendor/';
179
+        $vendor_path = $this->domain->pluginUrl().'assets/vendor/';
180 180
         return $this->addJavascript(
181 181
             $handle,
182 182
             "{$vendor_path}{$handle}{$dev_suffix}.js",
Please login to merge, or discard this patch.