Completed
Branch BUG-10951-check-in-icons (7a6f93)
by
unknown
117:28 queued 104:17
created
admin/extend/registrations/EE_Event_Registrations_List_Table.class.php 2 patches
Indentation   +77 added lines, -77 removed lines patch added patch discarded remove patch
@@ -90,7 +90,7 @@  discard block
 block discarded – undo
90 90
 		$this->_columns = array_merge( $columns, $this->_columns );
91 91
 		$this->_primary_column = '_REG_att_checked_in';
92 92
 		if ( ! empty( $evt_id )
93
-		     && EE_Registry::instance()->CAP->current_user_can(
93
+			 && EE_Registry::instance()->CAP->current_user_can(
94 94
 				'ee_read_registrations',
95 95
 				'espresso_registrations_registrations_reports',
96 96
 				$evt_id
@@ -107,44 +107,44 @@  discard block
 block discarded – undo
107 107
 				),
108 108
 			);
109 109
 		}
110
-        $this->_bottom_buttons['report_filtered'] = array(
111
-            'route'         => 'registrations_checkin_report',
112
-            'extra_request' => array(
113
-                'use_filters' => true,
114
-                'filters'     => array_merge(
115
-                    array(
116
-                        'EVT_ID' => $evt_id,
117
-                    ),
118
-                    array_diff_key(
119
-                        $this->_req_data,
120
-                        array_flip(
121
-                            array(
122
-                                'page',
123
-                                'action',
124
-                                'default_nonce',
125
-                            )
126
-                        )
127
-                    )
128
-                ),
129
-                'return_url'  => urlencode("//{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}"),
130
-            ),
131
-        );
110
+		$this->_bottom_buttons['report_filtered'] = array(
111
+			'route'         => 'registrations_checkin_report',
112
+			'extra_request' => array(
113
+				'use_filters' => true,
114
+				'filters'     => array_merge(
115
+					array(
116
+						'EVT_ID' => $evt_id,
117
+					),
118
+					array_diff_key(
119
+						$this->_req_data,
120
+						array_flip(
121
+							array(
122
+								'page',
123
+								'action',
124
+								'default_nonce',
125
+							)
126
+						)
127
+					)
128
+				),
129
+				'return_url'  => urlencode("//{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}"),
130
+			),
131
+		);
132 132
 		$this->_sortable_columns = array(
133
-            /**
134
-             * Allows users to change the default sort if they wish.
135
-             * Returning a falsey on this filter will result in the default sort to be by firstname rather than last name.
136
-             *
137
-             * Note: usual naming conventions for filters aren't followed here so that just one filter can be used to
138
-             * change the sorts on any list table involving registration contacts.  If you want to only change the filter
139
-             * for a specific list table you can use the provided reference to this object instance.
140
-             */
133
+			/**
134
+			 * Allows users to change the default sort if they wish.
135
+			 * Returning a falsey on this filter will result in the default sort to be by firstname rather than last name.
136
+			 *
137
+			 * Note: usual naming conventions for filters aren't followed here so that just one filter can be used to
138
+			 * change the sorts on any list table involving registration contacts.  If you want to only change the filter
139
+			 * for a specific list table you can use the provided reference to this object instance.
140
+			 */
141 141
 			'ATT_name' => array(
142
-                    'FHEE__EE_Registrations_List_Table___set_properties__default_sort_by_registration_last_name',
143
-                    true,
144
-                    $this
145
-                )
146
-                ? array( 'ATT_lname' => true )
147
-                : array( 'ATT_fname' => true ),
142
+					'FHEE__EE_Registrations_List_Table___set_properties__default_sort_by_registration_last_name',
143
+					true,
144
+					$this
145
+				)
146
+				? array( 'ATT_lname' => true )
147
+				: array( 'ATT_fname' => true ),
148 148
 			'Event'    => array( 'Event.EVT.Name' => false ),
149 149
 		);
150 150
 		$this->_hidden_columns = array();
@@ -203,7 +203,7 @@  discard block
 block discarded – undo
203 203
 				if ( ! $evt->get_count_of_all_registrations() ) {
204 204
 					continue;
205 205
 				}
206
-                                $evts[] = array(
206
+								$evts[] = array(
207 207
 					'id'    => $evt->ID(),
208 208
 					'text'  => apply_filters('FHEE__EE_Event_Registrations___get_table_filters__event_name', $evt->get( 'EVT_name' ), $evt),
209 209
 					'class' => $evt->is_expired() ? 'ee-expired-event' : '',
@@ -227,8 +227,8 @@  discard block
 block discarded – undo
227 227
 			if ( count( $this->_dtts_for_event ) > 1 ) {
228 228
 				$dtts[0] = __( 'To toggle check-in status, select a datetime.', 'event_espresso' );
229 229
 				foreach ( $this->_dtts_for_event as $dtt ) {
230
-                    $datetime_string = $dtt->name();
231
-                    $datetime_string = ! empty($datetime_string ) ? ' (' . $datetime_string . ')' : '';
230
+					$datetime_string = $dtt->name();
231
+					$datetime_string = ! empty($datetime_string ) ? ' (' . $datetime_string . ')' : '';
232 232
 					$datetime_string = $dtt->start_date_and_time() . ' - ' . $dtt->end_date_and_time() . $datetime_string;
233 233
 					$dtts[ $dtt->ID() ] = $datetime_string;
234 234
 				}
@@ -301,16 +301,16 @@  discard block
 block discarded – undo
301 301
 
302 302
 
303 303
 
304
-    /**
305
-     * column_REG_att_checked_in
306
-     *
307
-     * @param EE_Registration $item
308
-     * @return string
309
-     * @throws EE_Error
310
-     * @throws InvalidArgumentException
311
-     * @throws InvalidDataTypeException
312
-     * @throws InvalidInterfaceException
313
-     */
304
+	/**
305
+	 * column_REG_att_checked_in
306
+	 *
307
+	 * @param EE_Registration $item
308
+	 * @return string
309
+	 * @throws EE_Error
310
+	 * @throws InvalidArgumentException
311
+	 * @throws InvalidDataTypeException
312
+	 * @throws InvalidInterfaceException
313
+	 */
314 314
 	public function column__REG_att_checked_in( EE_Registration $item ) {
315 315
 		$attendee = $item->attendee();
316 316
 		$attendee_name = $attendee instanceof EE_Attendee ? $attendee->full_name() : '';
@@ -321,13 +321,13 @@  discard block
 block discarded – undo
321 321
 				$this->_cur_dtt_id = $latest_related_datetime->ID();
322 322
 			}
323 323
 		}
324
-        $checkin_status_dashicon = CheckinStatusDashicon::fromRegistrationAndDatetimeId(
325
-		    $item,
326
-            $this->_cur_dtt_id
327
-        );
324
+		$checkin_status_dashicon = CheckinStatusDashicon::fromRegistrationAndDatetimeId(
325
+			$item,
326
+			$this->_cur_dtt_id
327
+		);
328 328
 		$nonce = wp_create_nonce( 'checkin_nonce' );
329 329
 		$toggle_active = ! empty ( $this->_cur_dtt_id )
330
-		                 && EE_Registry::instance()->CAP->current_user_can(
330
+						 && EE_Registry::instance()->CAP->current_user_can(
331 331
 			'ee_edit_checkin',
332 332
 			'espresso_registrations_toggle_checkin_status',
333 333
 			$item->ID()
@@ -336,11 +336,11 @@  discard block
 block discarded – undo
336 336
 			: '';
337 337
 		$mobile_view_content = ' <span class="show-on-mobile-view-only">' . $attendee_name . '</span>';
338 338
 		return '<span class="' . $checkin_status_dashicon->cssClasses() . $toggle_active . '"'
339
-		       . ' data-_regid="' . $item->ID() . '"'
340
-		       . ' data-dttid="' . $this->_cur_dtt_id . '"'
341
-		       . ' data-nonce="' . $nonce . '">'
342
-		       . '</span>'
343
-		       . $mobile_view_content;
339
+			   . ' data-_regid="' . $item->ID() . '"'
340
+			   . ' data-dttid="' . $this->_cur_dtt_id . '"'
341
+			   . ' data-nonce="' . $nonce . '">'
342
+			   . '</span>'
343
+			   . $mobile_view_content;
344 344
 	}
345 345
 
346 346
 
@@ -365,8 +365,8 @@  discard block
 block discarded – undo
365 365
 			'espresso_registrations_edit_attendee'
366 366
 		)
367 367
 			? '<a href="' . $edit_lnk_url . '" title="' . esc_attr__( 'View Registration Details', 'event_espresso' ) . '">'
368
-			    . $item->attendee()->full_name()
369
-			    . '</a>'
368
+				. $item->attendee()->full_name()
369
+				. '</a>'
370 370
 			: $item->attendee()->full_name();
371 371
 		$name_link .= $item->count() === 1
372 372
 			? '&nbsp;<sup><div class="dashicons dashicons-star-filled lt-blue-icon ee-icon-size-8"></div></sup>	'
@@ -401,7 +401,7 @@  discard block
 block discarded – undo
401 401
 			? $latest_related_datetime->ID()
402 402
 			: $DTT_ID;
403 403
 		if ( ! empty( $DTT_ID )
404
-		     && EE_Registry::instance()->CAP->current_user_can(
404
+			 && EE_Registry::instance()->CAP->current_user_can(
405 405
 				'ee_read_checkins',
406 406
 				'espresso_registrations_registration_checkins'
407 407
 			)
@@ -515,15 +515,15 @@  discard block
 block discarded – undo
515 515
 				) ? '
516 516
 				<span class="reg-pad-rght">
517 517
 					<a class="status-'
518
-				    . $item->transaction()->status_ID()
519
-				    . '" href="'
520
-				    . $view_txn_lnk_url
521
-				    . '"  title="'
522
-				    . esc_attr__( 'View Transaction', 'event_espresso' )
523
-				    . '">
518
+					. $item->transaction()->status_ID()
519
+					. '" href="'
520
+					. $view_txn_lnk_url
521
+					. '"  title="'
522
+					. esc_attr__( 'View Transaction', 'event_espresso' )
523
+					. '">
524 524
 						'
525
-				    . $item->transaction()->pretty_paid()
526
-				    . '
525
+					. $item->transaction()->pretty_paid()
526
+					. '
527 527
 					</a>
528 528
 				<span>' : '<span class="reg-pad-rght">' . $item->transaction()->pretty_paid() . '</span>';
529 529
 			}
@@ -556,12 +556,12 @@  discard block
 block discarded – undo
556 556
 				'ee_read_transaction',
557 557
 				'espresso_transactions_view_transaction'
558 558
 			) ? '<a href="'
559
-			    . $view_txn_url
560
-			    . '" title="'
561
-			    . esc_attr__( 'View Transaction', 'event_espresso' )
562
-			    . '"><span class="reg-pad-rght">'
563
-			    . $txn_total
564
-			    . '</span></a>' : '<span class="reg-pad-rght">' . $txn_total . '</span>';
559
+				. $view_txn_url
560
+				. '" title="'
561
+				. esc_attr__( 'View Transaction', 'event_espresso' )
562
+				. '"><span class="reg-pad-rght">'
563
+				. $txn_total
564
+				. '</span></a>' : '<span class="reg-pad-rght">' . $txn_total . '</span>';
565 565
 		} else {
566 566
 			return '<span class="reg-pad-rght"></span>';
567 567
 		}
Please login to merge, or discard this patch.
Spacing   +116 added lines, -116 removed lines patch added patch discarded remove patch
@@ -45,51 +45,51 @@  discard block
 block discarded – undo
45 45
 	 *
46 46
 	 * @param \Registrations_Admin_Page $admin_page
47 47
 	 */
48
-	public function __construct( $admin_page ) {
49
-		parent::__construct( $admin_page );
48
+	public function __construct($admin_page) {
49
+		parent::__construct($admin_page);
50 50
 		$this->_status = $this->_admin_page->get_registration_status_array();
51 51
 	}
52 52
 
53 53
 
54 54
 
55 55
 	protected function _setup_data() {
56
-		$this->_data = $this->_view !== 'trash' ? $this->_admin_page->get_event_attendees( $this->_per_page )
57
-			: $this->_admin_page->get_event_attendees( $this->_per_page, false, true );
56
+		$this->_data = $this->_view !== 'trash' ? $this->_admin_page->get_event_attendees($this->_per_page)
57
+			: $this->_admin_page->get_event_attendees($this->_per_page, false, true);
58 58
 		$this->_all_data_count = $this->_view !== 'trash' ? $this->_admin_page->get_event_attendees(
59 59
 			$this->_per_page,
60 60
 			true
61
-		) : $this->_admin_page->get_event_attendees( $this->_per_page, true, true );
61
+		) : $this->_admin_page->get_event_attendees($this->_per_page, true, true);
62 62
 	}
63 63
 
64 64
 
65 65
 
66 66
 	protected function _set_properties() {
67
-		$evt_id = isset( $this->_req_data['event_id'] ) ? $this->_req_data['event_id'] : null;
67
+		$evt_id = isset($this->_req_data['event_id']) ? $this->_req_data['event_id'] : null;
68 68
 		$this->_wp_list_args = array(
69
-			'singular' => __( 'registrant', 'event_espresso' ),
70
-			'plural'   => __( 'registrants', 'event_espresso' ),
69
+			'singular' => __('registrant', 'event_espresso'),
70
+			'plural'   => __('registrants', 'event_espresso'),
71 71
 			'ajax'     => true,
72 72
 			'screen'   => $this->_admin_page->get_current_screen()->id,
73 73
 		);
74 74
 		$columns = array();
75 75
 		//$columns['_Reg_Status'] = '';
76
-		if ( ! empty( $evt_id ) ) {
76
+		if ( ! empty($evt_id)) {
77 77
 			$columns['cb'] = '<input type="checkbox" />'; //Render a checkbox instead of text
78 78
 			$this->_has_checkbox_column = true;
79 79
 		}
80 80
 		$this->_columns = array(
81 81
 			'_REG_att_checked_in' => '<span class="dashicons dashicons-yes ee-icon-size-18"></span>',
82
-			'ATT_name'            => __( 'Registrant', 'event_espresso' ),
83
-			'ATT_email'           => __( 'Email Address', 'event_espresso' ),
84
-			'Event'               => __( 'Event', 'event_espresso' ),
85
-			'PRC_name'            => __( 'TKT Option', 'event_espresso' ),
86
-			'_REG_final_price'    => __( 'Price', 'event_espresso' ),
87
-			'TXN_paid'            => __( 'Paid', 'event_espresso' ),
88
-			'TXN_total'           => __( 'Total', 'event_espresso' ),
82
+			'ATT_name'            => __('Registrant', 'event_espresso'),
83
+			'ATT_email'           => __('Email Address', 'event_espresso'),
84
+			'Event'               => __('Event', 'event_espresso'),
85
+			'PRC_name'            => __('TKT Option', 'event_espresso'),
86
+			'_REG_final_price'    => __('Price', 'event_espresso'),
87
+			'TXN_paid'            => __('Paid', 'event_espresso'),
88
+			'TXN_total'           => __('Total', 'event_espresso'),
89 89
 		);
90
-		$this->_columns = array_merge( $columns, $this->_columns );
90
+		$this->_columns = array_merge($columns, $this->_columns);
91 91
 		$this->_primary_column = '_REG_att_checked_in';
92
-		if ( ! empty( $evt_id )
92
+		if ( ! empty($evt_id)
93 93
 		     && EE_Registry::instance()->CAP->current_user_can(
94 94
 				'ee_read_registrations',
95 95
 				'espresso_registrations_registrations_reports',
@@ -102,7 +102,7 @@  discard block
 block discarded – undo
102 102
 					'extra_request' =>
103 103
 						array(
104 104
 							'EVT_ID'     => $evt_id,
105
-							'return_url' => urlencode( "//{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}" ),
105
+							'return_url' => urlencode("//{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}"),
106 106
 						),
107 107
 				),
108 108
 			);
@@ -143,12 +143,12 @@  discard block
 block discarded – undo
143 143
                     true,
144 144
                     $this
145 145
                 )
146
-                ? array( 'ATT_lname' => true )
147
-                : array( 'ATT_fname' => true ),
148
-			'Event'    => array( 'Event.EVT.Name' => false ),
146
+                ? array('ATT_lname' => true)
147
+                : array('ATT_fname' => true),
148
+			'Event'    => array('Event.EVT.Name' => false),
149 149
 		);
150 150
 		$this->_hidden_columns = array();
151
-		$this->_evt = EEM_Event::instance()->get_one_by_ID( $evt_id );
151
+		$this->_evt = EEM_Event::instance()->get_one_by_ID($evt_id);
152 152
 		$this->_dtts_for_event = $this->_evt instanceof EE_Event ? $this->_evt->datetimes_ordered() : array();
153 153
 	}
154 154
 
@@ -158,11 +158,11 @@  discard block
 block discarded – undo
158 158
 	 * @param \EE_Registration $item
159 159
 	 * @return string
160 160
 	 */
161
-	protected function _get_row_class( $item ) {
162
-		$class = parent::_get_row_class( $item );
161
+	protected function _get_row_class($item) {
162
+		$class = parent::_get_row_class($item);
163 163
 		//add status class
164
-		$class .= ' ee-status-strip reg-status-' . $item->status_ID();
165
-		if ( $this->_has_checkbox_column ) {
164
+		$class .= ' ee-status-strip reg-status-'.$item->status_ID();
165
+		if ($this->_has_checkbox_column) {
166 166
 			$class .= ' has-checkbox-column';
167 167
 		}
168 168
 		return $class;
@@ -176,61 +176,61 @@  discard block
 block discarded – undo
176 176
 	 */
177 177
 	protected function _get_table_filters() {
178 178
 		$filters = $where = array();
179
-		$current_EVT_ID = isset( $this->_req_data['event_id'] ) ? (int) $this->_req_data['event_id'] : 0;
180
-		if ( empty( $this->_dtts_for_event ) || count( $this->_dtts_for_event ) === 1 ) {
179
+		$current_EVT_ID = isset($this->_req_data['event_id']) ? (int) $this->_req_data['event_id'] : 0;
180
+		if (empty($this->_dtts_for_event) || count($this->_dtts_for_event) === 1) {
181 181
 			//this means we don't have an event so let's setup a filter dropdown for all the events to select
182 182
 			//note possible capability restrictions
183
-			if ( ! EE_Registry::instance()->CAP->current_user_can( 'ee_read_private_events', 'get_events' ) ) {
184
-				$where['status**'] = array( '!=', 'private' );
183
+			if ( ! EE_Registry::instance()->CAP->current_user_can('ee_read_private_events', 'get_events')) {
184
+				$where['status**'] = array('!=', 'private');
185 185
 			}
186
-			if ( ! EE_Registry::instance()->CAP->current_user_can( 'ee_read_others_events', 'get_events' ) ) {
186
+			if ( ! EE_Registry::instance()->CAP->current_user_can('ee_read_others_events', 'get_events')) {
187 187
 				$where['EVT_wp_user'] = get_current_user_id();
188 188
 			}
189 189
 			$events = EEM_Event::instance()->get_all(
190 190
 				array(
191 191
 					$where,
192
-					'order_by' => array( 'Datetime.DTT_EVT_start' => 'DESC' ),
192
+					'order_by' => array('Datetime.DTT_EVT_start' => 'DESC'),
193 193
 				)
194 194
 			);
195 195
 			$evts[] = array(
196 196
 				'id'   => 0,
197
-				'text' => __( 'To toggle Check-in status, select an event', 'event_espresso' ),
197
+				'text' => __('To toggle Check-in status, select an event', 'event_espresso'),
198 198
 			);
199 199
 			$checked = 'checked';
200 200
 			/** @var EE_Event $evt */
201
-			foreach ( $events as $evt ) {
201
+			foreach ($events as $evt) {
202 202
 				//any registrations for this event?
203
-				if ( ! $evt->get_count_of_all_registrations() ) {
203
+				if ( ! $evt->get_count_of_all_registrations()) {
204 204
 					continue;
205 205
 				}
206 206
                                 $evts[] = array(
207 207
 					'id'    => $evt->ID(),
208
-					'text'  => apply_filters('FHEE__EE_Event_Registrations___get_table_filters__event_name', $evt->get( 'EVT_name' ), $evt),
208
+					'text'  => apply_filters('FHEE__EE_Event_Registrations___get_table_filters__event_name', $evt->get('EVT_name'), $evt),
209 209
 					'class' => $evt->is_expired() ? 'ee-expired-event' : '',
210 210
 				);
211
-				if ( $evt->ID() === $current_EVT_ID && $evt->is_expired() ) {
211
+				if ($evt->ID() === $current_EVT_ID && $evt->is_expired()) {
212 212
 					$checked = '';
213 213
 				}
214 214
 			}
215 215
 			$event_filter = '<div class="ee-event-filter">';
216
-			$event_filter .= EEH_Form_Fields::select_input( 'event_id', $evts, $current_EVT_ID );
216
+			$event_filter .= EEH_Form_Fields::select_input('event_id', $evts, $current_EVT_ID);
217 217
 			$event_filter .= '<span class="ee-event-filter-toggle">';
218
-			$event_filter .= '<input type="checkbox" id="js-ee-hide-expired-events" ' . $checked . '> ';
219
-			$event_filter .= __( 'Hide Expired Events', 'event_espresso' );
218
+			$event_filter .= '<input type="checkbox" id="js-ee-hide-expired-events" '.$checked.'> ';
219
+			$event_filter .= __('Hide Expired Events', 'event_espresso');
220 220
 			$event_filter .= '</span>';
221 221
 			$event_filter .= '</div>';
222 222
 			$filters[] = $event_filter;
223 223
 		}
224
-		if ( ! empty( $this->_dtts_for_event ) ) {
224
+		if ( ! empty($this->_dtts_for_event)) {
225 225
 			//DTT datetimes filter
226
-			$this->_cur_dtt_id = isset( $this->_req_data['DTT_ID'] ) ? $this->_req_data['DTT_ID'] : 0;
227
-			if ( count( $this->_dtts_for_event ) > 1 ) {
228
-				$dtts[0] = __( 'To toggle check-in status, select a datetime.', 'event_espresso' );
229
-				foreach ( $this->_dtts_for_event as $dtt ) {
226
+			$this->_cur_dtt_id = isset($this->_req_data['DTT_ID']) ? $this->_req_data['DTT_ID'] : 0;
227
+			if (count($this->_dtts_for_event) > 1) {
228
+				$dtts[0] = __('To toggle check-in status, select a datetime.', 'event_espresso');
229
+				foreach ($this->_dtts_for_event as $dtt) {
230 230
                     $datetime_string = $dtt->name();
231
-                    $datetime_string = ! empty($datetime_string ) ? ' (' . $datetime_string . ')' : '';
232
-					$datetime_string = $dtt->start_date_and_time() . ' - ' . $dtt->end_date_and_time() . $datetime_string;
233
-					$dtts[ $dtt->ID() ] = $datetime_string;
231
+                    $datetime_string = ! empty($datetime_string) ? ' ('.$datetime_string.')' : '';
232
+					$datetime_string = $dtt->start_date_and_time().' - '.$dtt->end_date_and_time().$datetime_string;
233
+					$dtts[$dtt->ID()] = $datetime_string;
234 234
 				}
235 235
 				$input = new EE_Select_Input(
236 236
 					$dtts,
@@ -241,7 +241,7 @@  discard block
 block discarded – undo
241 241
 					)
242 242
 				);
243 243
 				$filters[] = $input->get_html_for_input();
244
-				$filters[] = '<input type="hidden" name="event_id" value="' . $current_EVT_ID . '">';
244
+				$filters[] = '<input type="hidden" name="event_id" value="'.$current_EVT_ID.'">';
245 245
 			}
246 246
 		}
247 247
 		return $filters;
@@ -260,22 +260,22 @@  discard block
 block discarded – undo
260 260
 	 * @throws \EE_Error
261 261
 	 */
262 262
 	protected function _get_total_event_attendees() {
263
-		$EVT_ID = isset( $this->_req_data['event_id'] ) ? absint( $this->_req_data['event_id'] ) : false;
263
+		$EVT_ID = isset($this->_req_data['event_id']) ? absint($this->_req_data['event_id']) : false;
264 264
 		$DTT_ID = $this->_cur_dtt_id;
265 265
 		$query_params = array();
266
-		if ( $EVT_ID ) {
266
+		if ($EVT_ID) {
267 267
 			$query_params[0]['EVT_ID'] = $EVT_ID;
268 268
 		}
269 269
 		//if DTT is included we only show for that datetime.  Otherwise we're showing for all datetimes (the event).
270
-		if ( $DTT_ID ) {
270
+		if ($DTT_ID) {
271 271
 			$query_params[0]['Ticket.Datetime.DTT_ID'] = $DTT_ID;
272 272
 		}
273 273
 		$status_ids_array = apply_filters(
274 274
 			'FHEE__Extend_Registrations_Admin_Page__get_event_attendees__status_ids_array',
275
-			array( EEM_Registration::status_id_pending_payment, EEM_Registration::status_id_approved )
275
+			array(EEM_Registration::status_id_pending_payment, EEM_Registration::status_id_approved)
276 276
 		);
277
-		$query_params[0]['STS_ID'] = array( 'IN', $status_ids_array );
278
-		return EEM_Registration::instance()->count( $query_params );
277
+		$query_params[0]['STS_ID'] = array('IN', $status_ids_array);
278
+		return EEM_Registration::instance()->count($query_params);
279 279
 	}
280 280
 
281 281
 
@@ -284,8 +284,8 @@  discard block
 block discarded – undo
284 284
 	 * @param \EE_Registration $item
285 285
 	 * @return string
286 286
 	 */
287
-	public function column__Reg_Status( EE_Registration $item ) {
288
-		return '<span class="ee-status-strip ee-status-strip-td reg-status-' . $item->status_ID() . '"></span>';
287
+	public function column__Reg_Status(EE_Registration $item) {
288
+		return '<span class="ee-status-strip ee-status-strip-td reg-status-'.$item->status_ID().'"></span>';
289 289
 	}
290 290
 
291 291
 
@@ -295,8 +295,8 @@  discard block
 block discarded – undo
295 295
 	 * @return string
296 296
 	 * @throws \EE_Error
297 297
 	 */
298
-	public function column_cb( $item ) {
299
-		return sprintf( '<input type="checkbox" name="checkbox[%1$s]" value="%1$s" />', $item->ID() );
298
+	public function column_cb($item) {
299
+		return sprintf('<input type="checkbox" name="checkbox[%1$s]" value="%1$s" />', $item->ID());
300 300
 	}
301 301
 
302 302
 
@@ -311,13 +311,13 @@  discard block
 block discarded – undo
311 311
      * @throws InvalidDataTypeException
312 312
      * @throws InvalidInterfaceException
313 313
      */
314
-	public function column__REG_att_checked_in( EE_Registration $item ) {
314
+	public function column__REG_att_checked_in(EE_Registration $item) {
315 315
 		$attendee = $item->attendee();
316 316
 		$attendee_name = $attendee instanceof EE_Attendee ? $attendee->full_name() : '';
317 317
 
318
-		if ( $this->_cur_dtt_id === 0 && count( $this->_dtts_for_event ) === 1 ) {
318
+		if ($this->_cur_dtt_id === 0 && count($this->_dtts_for_event) === 1) {
319 319
 			$latest_related_datetime = $item->get_latest_related_datetime();
320
-			if ( $latest_related_datetime instanceof EE_Datetime ) {
320
+			if ($latest_related_datetime instanceof EE_Datetime) {
321 321
 				$this->_cur_dtt_id = $latest_related_datetime->ID();
322 322
 			}
323 323
 		}
@@ -325,8 +325,8 @@  discard block
 block discarded – undo
325 325
 		    $item,
326 326
             $this->_cur_dtt_id
327 327
         );
328
-		$nonce = wp_create_nonce( 'checkin_nonce' );
329
-		$toggle_active = ! empty ( $this->_cur_dtt_id )
328
+		$nonce = wp_create_nonce('checkin_nonce');
329
+		$toggle_active = ! empty ($this->_cur_dtt_id)
330 330
 		                 && EE_Registry::instance()->CAP->current_user_can(
331 331
 			'ee_edit_checkin',
332 332
 			'espresso_registrations_toggle_checkin_status',
@@ -334,11 +334,11 @@  discard block
 block discarded – undo
334 334
 		)
335 335
 			? ' clickable trigger-checkin'
336 336
 			: '';
337
-		$mobile_view_content = ' <span class="show-on-mobile-view-only">' . $attendee_name . '</span>';
338
-		return '<span class="' . $checkin_status_dashicon->cssClasses() . $toggle_active . '"'
339
-		       . ' data-_regid="' . $item->ID() . '"'
340
-		       . ' data-dttid="' . $this->_cur_dtt_id . '"'
341
-		       . ' data-nonce="' . $nonce . '">'
337
+		$mobile_view_content = ' <span class="show-on-mobile-view-only">'.$attendee_name.'</span>';
338
+		return '<span class="'.$checkin_status_dashicon->cssClasses().$toggle_active.'"'
339
+		       . ' data-_regid="'.$item->ID().'"'
340
+		       . ' data-dttid="'.$this->_cur_dtt_id.'"'
341
+		       . ' data-nonce="'.$nonce.'">'
342 342
 		       . '</span>'
343 343
 		       . $mobile_view_content;
344 344
 	}
@@ -350,21 +350,21 @@  discard block
 block discarded – undo
350 350
 	 * @return mixed|string|void
351 351
 	 * @throws \EE_Error
352 352
 	 */
353
-	public function column_ATT_name( EE_Registration $item ) {
353
+	public function column_ATT_name(EE_Registration $item) {
354 354
 		$attendee = $item->attendee();
355
-		if ( ! $attendee instanceof EE_Attendee ) {
356
-			return __( 'No contact record for this registration.', 'event_espresso' );
355
+		if ( ! $attendee instanceof EE_Attendee) {
356
+			return __('No contact record for this registration.', 'event_espresso');
357 357
 		}
358 358
 		// edit attendee link
359 359
 		$edit_lnk_url = EE_Admin_Page::add_query_args_and_nonce(
360
-			array( 'action' => 'view_registration', '_REG_ID' => $item->ID() ),
360
+			array('action' => 'view_registration', '_REG_ID' => $item->ID()),
361 361
 			REG_ADMIN_URL
362 362
 		);
363 363
 		$name_link = EE_Registry::instance()->CAP->current_user_can(
364 364
 			'ee_edit_contacts',
365 365
 			'espresso_registrations_edit_attendee'
366 366
 		)
367
-			? '<a href="' . $edit_lnk_url . '" title="' . esc_attr__( 'View Registration Details', 'event_espresso' ) . '">'
367
+			? '<a href="'.$edit_lnk_url.'" title="'.esc_attr__('View Registration Details', 'event_espresso').'">'
368 368
 			    . $item->attendee()->full_name()
369 369
 			    . '</a>'
370 370
 			: $item->attendee()->full_name();
@@ -372,10 +372,10 @@  discard block
 block discarded – undo
372 372
 			? '&nbsp;<sup><div class="dashicons dashicons-star-filled lt-blue-icon ee-icon-size-8"></div></sup>	'
373 373
 			: '';
374 374
 		//add group details
375
-		$name_link .= '&nbsp;' . sprintf( __( '(%s of %s)', 'event_espresso' ), $item->count(), $item->group_size() );
375
+		$name_link .= '&nbsp;'.sprintf(__('(%s of %s)', 'event_espresso'), $item->count(), $item->group_size());
376 376
 		//add regcode
377 377
 		$link = EE_Admin_Page::add_query_args_and_nonce(
378
-			array( 'action' => 'view_registration', '_REG_ID' => $item->ID() ),
378
+			array('action' => 'view_registration', '_REG_ID' => $item->ID()),
379 379
 			REG_ADMIN_URL
380 380
 		);
381 381
 		$name_link .= '<br>';
@@ -384,50 +384,50 @@  discard block
 block discarded – undo
384 384
 			'view_registration',
385 385
 			$item->ID()
386 386
 		)
387
-			? '<a href="' . $link . '" title="' . esc_attr__( 'View Registration Details', 'event_espresso' ) . '">'
387
+			? '<a href="'.$link.'" title="'.esc_attr__('View Registration Details', 'event_espresso').'">'
388 388
 			  . $item->reg_code()
389 389
 			  . '</a>'
390 390
 			: $item->reg_code();
391 391
 		//status
392 392
 		$name_link .= '<br><span class="ee-status-text-small">';
393
-		$name_link .= EEH_Template::pretty_status( $item->status_ID(), false, 'sentence' );
393
+		$name_link .= EEH_Template::pretty_status($item->status_ID(), false, 'sentence');
394 394
 		$name_link .= '</span>';
395 395
 		$actions = array();
396 396
 		$DTT_ID = $this->_cur_dtt_id;
397
-		$latest_related_datetime = empty( $DTT_ID ) && ! empty( $this->_req_data['event_id'] ) && $item instanceof EE_Registration
397
+		$latest_related_datetime = empty($DTT_ID) && ! empty($this->_req_data['event_id']) && $item instanceof EE_Registration
398 398
 			? $item->get_latest_related_datetime()
399 399
 			: null;
400 400
 		$DTT_ID = $latest_related_datetime instanceof EE_Datetime
401 401
 			? $latest_related_datetime->ID()
402 402
 			: $DTT_ID;
403
-		if ( ! empty( $DTT_ID )
403
+		if ( ! empty($DTT_ID)
404 404
 		     && EE_Registry::instance()->CAP->current_user_can(
405 405
 				'ee_read_checkins',
406 406
 				'espresso_registrations_registration_checkins'
407 407
 			)
408 408
 		) {
409 409
 			$checkin_list_url = EE_Admin_Page::add_query_args_and_nonce(
410
-				array( 'action' => 'registration_checkins', '_REGID' => $item->ID(), 'DTT_ID' => $DTT_ID )
410
+				array('action' => 'registration_checkins', '_REGID' => $item->ID(), 'DTT_ID' => $DTT_ID)
411 411
 			);
412 412
 			// get the timestamps for this registration's checkins, related to the selected datetime
413
-			$timestamps = $item->get_many_related( 'Checkin', array( array( 'DTT_ID' => $DTT_ID ) ) );
414
-			if( ! empty( $timestamps ) ) {
413
+			$timestamps = $item->get_many_related('Checkin', array(array('DTT_ID' => $DTT_ID)));
414
+			if ( ! empty($timestamps)) {
415 415
 				// get the last timestamp
416
-				$last_timestamp = end( $timestamps );
416
+				$last_timestamp = end($timestamps);
417 417
 				// checked in or checked out?
418
-				$checkin_status = $last_timestamp->get( 'CHK_in' )
419
-					? esc_html__( 'Checked In', 'event_espresso' )
420
-					: esc_html__( 'Checked Out', 'event_espresso' );
418
+				$checkin_status = $last_timestamp->get('CHK_in')
419
+					? esc_html__('Checked In', 'event_espresso')
420
+					: esc_html__('Checked Out', 'event_espresso');
421 421
 				// get timestamp string
422
-				$timestamp_string = $last_timestamp->get_datetime( 'CHK_timestamp' );
423
-				$actions['checkin'] = '<a href="' . $checkin_list_url . '" title="' . esc_attr__(
422
+				$timestamp_string = $last_timestamp->get_datetime('CHK_timestamp');
423
+				$actions['checkin'] = '<a href="'.$checkin_list_url.'" title="'.esc_attr__(
424 424
 						'View this registrant\'s check-ins/checkouts for the datetime',
425 425
 						'event_espresso'
426
-					) . '">' . $checkin_status . ': ' . $timestamp_string . '</a>';
426
+					).'">'.$checkin_status.': '.$timestamp_string.'</a>';
427 427
 			}
428 428
 		}
429
-		return ( ! empty( $DTT_ID ) && ! empty( $timestamps ) )
430
-			? sprintf( '%1$s %2$s', $name_link, $this->row_actions( $actions, true ) )
429
+		return ( ! empty($DTT_ID) && ! empty($timestamps))
430
+			? sprintf('%1$s %2$s', $name_link, $this->row_actions($actions, true))
431 431
 			: $name_link;
432 432
 	}
433 433
 
@@ -437,7 +437,7 @@  discard block
 block discarded – undo
437 437
 	 * @param \EE_Registration $item
438 438
 	 * @return string
439 439
 	 */
440
-	public function column_ATT_email( EE_Registration $item ) {
440
+	public function column_ATT_email(EE_Registration $item) {
441 441
 		$attendee = $item->attendee();
442 442
 		return $attendee instanceof EE_Attendee ? $attendee->email() : '';
443 443
 	}
@@ -449,22 +449,22 @@  discard block
 block discarded – undo
449 449
 	 * @return bool|string
450 450
 	 * @throws \EE_Error
451 451
 	 */
452
-	public function column_Event( EE_Registration $item ) {
452
+	public function column_Event(EE_Registration $item) {
453 453
 		try {
454 454
 			$event = $this->_evt instanceof EE_Event ? $this->_evt : $item->event();
455 455
 			$chkin_lnk_url = EE_Admin_Page::add_query_args_and_nonce(
456
-				array( 'action' => 'event_registrations', 'event_id' => $event->ID() ),
456
+				array('action' => 'event_registrations', 'event_id' => $event->ID()),
457 457
 				REG_ADMIN_URL
458 458
 			);
459 459
 			$event_label = EE_Registry::instance()->CAP->current_user_can(
460 460
 				'ee_read_checkins',
461 461
 				'espresso_registrations_registration_checkins'
462
-			) ? '<a href="' . $chkin_lnk_url . '" title="' . esc_attr__(
462
+			) ? '<a href="'.$chkin_lnk_url.'" title="'.esc_attr__(
463 463
 					'View Checkins for this Event',
464 464
 					'event_espresso'
465
-				) . '">' . $event->name() . '</a>' : $event->name();
466
-		} catch ( \EventEspresso\core\exceptions\EntityNotFoundException $e ) {
467
-			$event_label = esc_html__( 'Unknown', 'event_espresso' );
465
+				).'">'.$event->name().'</a>' : $event->name();
466
+		} catch (\EventEspresso\core\exceptions\EntityNotFoundException $e) {
467
+			$event_label = esc_html__('Unknown', 'event_espresso');
468 468
 		}
469 469
 		return $event_label;
470 470
 	}
@@ -475,8 +475,8 @@  discard block
 block discarded – undo
475 475
 	 * @param \EE_Registration $item
476 476
 	 * @return mixed|string|void
477 477
 	 */
478
-	public function column_PRC_name( EE_Registration $item ) {
479
-		return $item->ticket() instanceof EE_Ticket ? $item->ticket()->name() : __( "Unknown", "event_espresso" );
478
+	public function column_PRC_name(EE_Registration $item) {
479
+		return $item->ticket() instanceof EE_Ticket ? $item->ticket()->name() : __("Unknown", "event_espresso");
480 480
 	}
481 481
 
482 482
 
@@ -487,8 +487,8 @@  discard block
 block discarded – undo
487 487
 	 * @param \EE_Registration $item
488 488
 	 * @return string
489 489
 	 */
490
-	public function column__REG_final_price( EE_Registration $item ) {
491
-		return '<span class="reg-pad-rght">' . ' ' . $item->pretty_final_price() . '</span>';
490
+	public function column__REG_final_price(EE_Registration $item) {
491
+		return '<span class="reg-pad-rght">'.' '.$item->pretty_final_price().'</span>';
492 492
 	}
493 493
 
494 494
 
@@ -500,13 +500,13 @@  discard block
 block discarded – undo
500 500
 	 * @return string
501 501
 	 * @throws \EE_Error
502 502
 	 */
503
-	public function column_TXN_paid( EE_Registration $item ) {
504
-		if ( $item->count() === 1 ) {
505
-			if ( $item->transaction()->paid() >= $item->transaction()->total() ) {
503
+	public function column_TXN_paid(EE_Registration $item) {
504
+		if ($item->count() === 1) {
505
+			if ($item->transaction()->paid() >= $item->transaction()->total()) {
506 506
 				return '<span class="reg-pad-rght"><div class="dashicons dashicons-yes green-icon"></div></span>';
507 507
 			} else {
508 508
 				$view_txn_lnk_url = EE_Admin_Page::add_query_args_and_nonce(
509
-					array( 'action' => 'view_transaction', 'TXN_ID' => $item->transaction_ID() ),
509
+					array('action' => 'view_transaction', 'TXN_ID' => $item->transaction_ID()),
510 510
 					TXN_ADMIN_URL
511 511
 				);
512 512
 				return EE_Registry::instance()->CAP->current_user_can(
@@ -519,13 +519,13 @@  discard block
 block discarded – undo
519 519
 				    . '" href="'
520 520
 				    . $view_txn_lnk_url
521 521
 				    . '"  title="'
522
-				    . esc_attr__( 'View Transaction', 'event_espresso' )
522
+				    . esc_attr__('View Transaction', 'event_espresso')
523 523
 				    . '">
524 524
 						'
525 525
 				    . $item->transaction()->pretty_paid()
526 526
 				    . '
527 527
 					</a>
528
-				<span>' : '<span class="reg-pad-rght">' . $item->transaction()->pretty_paid() . '</span>';
528
+				<span>' : '<span class="reg-pad-rght">'.$item->transaction()->pretty_paid().'</span>';
529 529
 			}
530 530
 		} else {
531 531
 			return '<span class="reg-pad-rght"></span>';
@@ -541,13 +541,13 @@  discard block
 block discarded – undo
541 541
 	 * @return string
542 542
 	 * @throws \EE_Error
543 543
 	 */
544
-	public function column_TXN_total( EE_Registration $item ) {
544
+	public function column_TXN_total(EE_Registration $item) {
545 545
 		$txn = $item->transaction();
546
-		$view_txn_url = add_query_arg( array( 'action' => 'view_transaction', 'TXN_ID' => $txn->ID() ), TXN_ADMIN_URL );
547
-		if ( $item->get( 'REG_count' ) === 1 ) {
546
+		$view_txn_url = add_query_arg(array('action' => 'view_transaction', 'TXN_ID' => $txn->ID()), TXN_ADMIN_URL);
547
+		if ($item->get('REG_count') === 1) {
548 548
 			$line_total_obj = $txn->total_line_item();
549 549
 			$txn_total = $line_total_obj instanceof EE_Line_Item
550
-				? $line_total_obj->get_pretty( 'LIN_total' )
550
+				? $line_total_obj->get_pretty('LIN_total')
551 551
 				: __(
552 552
 					'View Transaction',
553 553
 					'event_espresso'
@@ -558,10 +558,10 @@  discard block
 block discarded – undo
558 558
 			) ? '<a href="'
559 559
 			    . $view_txn_url
560 560
 			    . '" title="'
561
-			    . esc_attr__( 'View Transaction', 'event_espresso' )
561
+			    . esc_attr__('View Transaction', 'event_espresso')
562 562
 			    . '"><span class="reg-pad-rght">'
563 563
 			    . $txn_total
564
-			    . '</span></a>' : '<span class="reg-pad-rght">' . $txn_total . '</span>';
564
+			    . '</span></a>' : '<span class="reg-pad-rght">'.$txn_total.'</span>';
565 565
 		} else {
566 566
 			return '<span class="reg-pad-rght"></span>';
567 567
 		}
Please login to merge, or discard this patch.
admin/extend/registrations/EE_Registration_CheckIn_List_Table.class.php 3 patches
Indentation   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -90,8 +90,8 @@
 block discarded – undo
90 90
 
91 91
 
92 92
 	public function column_CHK_in( EE_Checkin $item ) {
93
-        $checkin_status_dashicon = CheckinStatusDashicon::fromCheckin($item);
94
-        return '<span class="' . $checkin_status_dashicon->cssClasses() . '"></span><span class="show-on-mobile-view-only">' . $item->get_datetime('CHK_timestamp') . '</span>';
93
+		$checkin_status_dashicon = CheckinStatusDashicon::fromCheckin($item);
94
+		return '<span class="' . $checkin_status_dashicon->cssClasses() . '"></span><span class="show-on-mobile-view-only">' . $item->get_datetime('CHK_timestamp') . '</span>';
95 95
 	}
96 96
 
97 97
 
Please login to merge, or discard this patch.
Spacing   +28 added lines, -28 removed lines patch added patch discarded remove patch
@@ -30,7 +30,7 @@  discard block
 block discarded – undo
30 30
 
31 31
 
32 32
 
33
-	public function __construct( $admin_page ) {
33
+	public function __construct($admin_page) {
34 34
 		parent::__construct($admin_page);
35 35
 	}
36 36
 
@@ -38,8 +38,8 @@  discard block
 block discarded – undo
38 38
 
39 39
 
40 40
 	protected function _setup_data() {
41
-		$this->_data = $this->_get_checkins( $this->_per_page );
42
-		$this->_all_data_count = $this->_get_checkins(  $this->_per_page, TRUE );
41
+		$this->_data = $this->_get_checkins($this->_per_page);
42
+		$this->_all_data_count = $this->_get_checkins($this->_per_page, TRUE);
43 43
 	}
44 44
 
45 45
 
@@ -60,7 +60,7 @@  discard block
 block discarded – undo
60 60
 			);
61 61
 
62 62
 		$this->_sortable_columns = array(
63
-			'CHK_timestamp' => array( 'CHK_timestamp' => TRUE )
63
+			'CHK_timestamp' => array('CHK_timestamp' => TRUE)
64 64
 			);
65 65
 
66 66
 		$this->_primary_column = 'CHK_in';
@@ -84,24 +84,24 @@  discard block
 block discarded – undo
84 84
 	}
85 85
 
86 86
 
87
-	function column_cb($item ) {
88
-		return sprintf( '<input type="checkbox" name="checkbox[%1$s]" />', $item->ID() );
87
+	function column_cb($item) {
88
+		return sprintf('<input type="checkbox" name="checkbox[%1$s]" />', $item->ID());
89 89
 	}
90 90
 
91 91
 
92
-	public function column_CHK_in( EE_Checkin $item ) {
92
+	public function column_CHK_in(EE_Checkin $item) {
93 93
         $checkin_status_dashicon = CheckinStatusDashicon::fromCheckin($item);
94
-        return '<span class="' . $checkin_status_dashicon->cssClasses() . '"></span><span class="show-on-mobile-view-only">' . $item->get_datetime('CHK_timestamp') . '</span>';
94
+        return '<span class="'.$checkin_status_dashicon->cssClasses().'"></span><span class="show-on-mobile-view-only">'.$item->get_datetime('CHK_timestamp').'</span>';
95 95
 	}
96 96
 
97 97
 
98 98
 
99
-	function column_CHK_timestamp( EE_Checkin $item ) {
99
+	function column_CHK_timestamp(EE_Checkin $item) {
100 100
 		$actions = array();
101
-		$delete_url = EE_Admin_Page::add_query_args_and_nonce( array('action' => 'delete_checkin_row', 'DTT_ID' => $this->_req_data['DTT_ID'], '_REGID' => $this->_req_data['_REGID'], 'CHK_ID' => $item->ID() ) );
102
-		$actions['delete_checkin'] = EE_Registry::instance()->CAP->current_user_can( 'ee_delete_checkins', 'espresso_registrations_delete_checkin_row' ) ? '<a href="' . $delete_url . '" title="' . esc_attr__('Click here to delete this check-in record', 'event_espresso') . '">' . __('Delete', 'event_espresso') . '</a>' : '';
101
+		$delete_url = EE_Admin_Page::add_query_args_and_nonce(array('action' => 'delete_checkin_row', 'DTT_ID' => $this->_req_data['DTT_ID'], '_REGID' => $this->_req_data['_REGID'], 'CHK_ID' => $item->ID()));
102
+		$actions['delete_checkin'] = EE_Registry::instance()->CAP->current_user_can('ee_delete_checkins', 'espresso_registrations_delete_checkin_row') ? '<a href="'.$delete_url.'" title="'.esc_attr__('Click here to delete this check-in record', 'event_espresso').'">'.__('Delete', 'event_espresso').'</a>' : '';
103 103
 
104
-		return sprintf( '%1$s %2$s', $item->get_datetime('CHK_timestamp'), $this->row_actions($actions) );
104
+		return sprintf('%1$s %2$s', $item->get_datetime('CHK_timestamp'), $this->row_actions($actions));
105 105
 	}
106 106
 
107 107
 
@@ -116,30 +116,30 @@  discard block
 block discarded – undo
116 116
 	 * @param bool    $count        Whether to return a count or not
117 117
 	 * @return EE_Checkin[]|int
118 118
 	 */
119
-	protected function _get_checkins( $per_page = 10, $count = FALSE ) {
120
-		$REG_ID = isset( $this->_req_data['_REGID'] ) ? $this->_req_data['_REGID'] : FALSE;
121
-		$DTT_ID = isset( $this->_req_data['DTT_ID'] ) ? $this->_req_data['DTT_ID'] : FALSE;
119
+	protected function _get_checkins($per_page = 10, $count = FALSE) {
120
+		$REG_ID = isset($this->_req_data['_REGID']) ? $this->_req_data['_REGID'] : FALSE;
121
+		$DTT_ID = isset($this->_req_data['DTT_ID']) ? $this->_req_data['DTT_ID'] : FALSE;
122 122
 
123 123
 		//if user does not have the capability for the checkins for this registration then get out!
124
-		if ( ! EE_Registry::instance()->CAP->current_user_can( 'ee_read_checkin', 'espresso_registrations_registration_checkins', $REG_ID ) ) {
124
+		if ( ! EE_Registry::instance()->CAP->current_user_can('ee_read_checkin', 'espresso_registrations_registration_checkins', $REG_ID)) {
125 125
 			return $count ? 0 : array();
126 126
 		}
127 127
 
128 128
 		//if no reg id then get out cause need a reg id
129
-		if ( empty( $REG_ID ) || empty( $DTT_ID ) )
130
-			throw new EE_Error(__('This route cannot be viewed unless registration and datetime IDs are included in the request (via REG_ID and DTT_ID parameters)', 'event_espresso') );
129
+		if (empty($REG_ID) || empty($DTT_ID))
130
+			throw new EE_Error(__('This route cannot be viewed unless registration and datetime IDs are included in the request (via REG_ID and DTT_ID parameters)', 'event_espresso'));
131 131
 
132 132
 		//set orderby
133 133
 		$orderby = 'CHK_timestamp'; //note that with this table we're only providing the option to orderby the timestamp value.
134 134
 
135
-		$order = !empty( $this->_req_data['order'] ) ? $this->_req_data['order'] : 'ASC';
135
+		$order = ! empty($this->_req_data['order']) ? $this->_req_data['order'] : 'ASC';
136 136
 
137
-		$current_page = isset( $this->_req_data['paged'] ) && !empty( $this->_req_data['paged'] ) ? $this->_req_data['paged'] : 1;
138
-		$per_page = isset( $this->_req_data['perpage'] ) && !empty( $this->_req_data['perpage'] ) ? $this->_req_data['perpage'] : $per_page;
137
+		$current_page = isset($this->_req_data['paged']) && ! empty($this->_req_data['paged']) ? $this->_req_data['paged'] : 1;
138
+		$per_page = isset($this->_req_data['perpage']) && ! empty($this->_req_data['perpage']) ? $this->_req_data['perpage'] : $per_page;
139 139
 		$limit = NULL;
140
-		if ( !$count ) {
141
-			$offset = ($current_page-1)*$per_page;
142
-			$limit = array( $offset, $per_page );
140
+		if ( ! $count) {
141
+			$offset = ($current_page - 1) * $per_page;
142
+			$limit = array($offset, $per_page);
143 143
 		}
144 144
 
145 145
 		$_where = array(
@@ -147,13 +147,13 @@  discard block
 block discarded – undo
147 147
 			'DTT_ID' => $DTT_ID
148 148
 			);
149 149
 
150
-		$query_params = array( $_where, 'order_by' => array( $orderby => $order ), 'limit' => $limit );
150
+		$query_params = array($_where, 'order_by' => array($orderby => $order), 'limit' => $limit);
151 151
 
152 152
 		//if no per_page value then we just want to return a count of all Check-ins
153
-		if ( $count )
154
-			return EEM_Checkin::instance()->count( array( $_where ) );
153
+		if ($count)
154
+			return EEM_Checkin::instance()->count(array($_where));
155 155
 
156
-		return $count ? EEM_Checkin::instance()->count( array( $_where ) ) : EEM_Checkin::instance()->get_all($query_params);
156
+		return $count ? EEM_Checkin::instance()->count(array($_where)) : EEM_Checkin::instance()->get_all($query_params);
157 157
 	}
158 158
 
159 159
 } //end class EE_Registration_CheckIn_List_Table
Please login to merge, or discard this patch.
Braces   +9 added lines, -5 removed lines patch added patch discarded remove patch
@@ -1,6 +1,8 @@  discard block
 block discarded – undo
1 1
 <?php use EventEspresso\ui\browser\checkins\entities\CheckinStatusDashicon;
2 2
 
3
-if ( ! defined('EVENT_ESPRESSO_VERSION')) exit('No direct script access allowed');
3
+if ( ! defined('EVENT_ESPRESSO_VERSION')) {
4
+	exit('No direct script access allowed');
5
+}
4 6
 /**
5 7
  * Event Espresso
6 8
  *
@@ -126,8 +128,9 @@  discard block
 block discarded – undo
126 128
 		}
127 129
 
128 130
 		//if no reg id then get out cause need a reg id
129
-		if ( empty( $REG_ID ) || empty( $DTT_ID ) )
130
-			throw new EE_Error(__('This route cannot be viewed unless registration and datetime IDs are included in the request (via REG_ID and DTT_ID parameters)', 'event_espresso') );
131
+		if ( empty( $REG_ID ) || empty( $DTT_ID ) ) {
132
+					throw new EE_Error(__('This route cannot be viewed unless registration and datetime IDs are included in the request (via REG_ID and DTT_ID parameters)', 'event_espresso') );
133
+		}
131 134
 
132 135
 		//set orderby
133 136
 		$orderby = 'CHK_timestamp'; //note that with this table we're only providing the option to orderby the timestamp value.
@@ -150,8 +153,9 @@  discard block
 block discarded – undo
150 153
 		$query_params = array( $_where, 'order_by' => array( $orderby => $order ), 'limit' => $limit );
151 154
 
152 155
 		//if no per_page value then we just want to return a count of all Check-ins
153
-		if ( $count )
154
-			return EEM_Checkin::instance()->count( array( $_where ) );
156
+		if ( $count ) {
157
+					return EEM_Checkin::instance()->count( array( $_where ) );
158
+		}
155 159
 
156 160
 		return $count ? EEM_Checkin::instance()->count( array( $_where ) ) : EEM_Checkin::instance()->get_all($query_params);
157 161
 	}
Please login to merge, or discard this patch.
admin/extend/registrations/Extend_Registrations_Admin_Page.core.php 2 patches
Indentation   +1180 added lines, -1180 removed lines patch added patch discarded remove patch
@@ -1,6 +1,6 @@  discard block
 block discarded – undo
1 1
 <?php
2 2
 if ( ! defined('EVENT_ESPRESSO_VERSION')) {
3
-    exit('NO direct script access allowed');
3
+	exit('NO direct script access allowed');
4 4
 }
5 5
 
6 6
 
@@ -17,1185 +17,1185 @@  discard block
 block discarded – undo
17 17
 {
18 18
 
19 19
 
20
-    /**
21
-     * This is used to hold the reports template data which is setup early in the request.
22
-     *
23
-     * @type array
24
-     */
25
-    protected $_reports_template_data = array();
26
-
27
-
28
-
29
-    /**
30
-     * Extend_Registrations_Admin_Page constructor.
31
-     *
32
-     * @param bool $routing
33
-     */
34
-    public function __construct($routing = true)
35
-    {
36
-        parent::__construct($routing);
37
-        if ( ! defined('REG_CAF_TEMPLATE_PATH')) {
38
-            define('REG_CAF_TEMPLATE_PATH', EE_CORE_CAF_ADMIN_EXTEND . 'registrations/templates/');
39
-            define('REG_CAF_ASSETS', EE_CORE_CAF_ADMIN_EXTEND . 'registrations/assets/');
40
-            define('REG_CAF_ASSETS_URL', EE_CORE_CAF_ADMIN_EXTEND_URL . 'registrations/assets/');
41
-        }
42
-    }
43
-
44
-
45
-
46
-    protected function _extend_page_config()
47
-    {
48
-        $this->_admin_base_path = EE_CORE_CAF_ADMIN_EXTEND . 'registrations';
49
-        $reg_id = ! empty($this->_req_data['_REG_ID']) && ! is_array($this->_req_data['_REG_ID'])
50
-            ? $this->_req_data['_REG_ID']
51
-            : 0;
52
-        // $att_id = ! empty( $this->_req_data['ATT_ID'] ) ? ! is_array( $this->_req_data['ATT_ID'] ) : 0;
53
-        // $att_id = ! empty( $this->_req_data['post'] ) && ! is_array( $this->_req_data['post'] )
54
-        // 	? $this->_req_data['post'] : $att_id;
55
-        $new_page_routes = array(
56
-            'reports'                  => array(
57
-                'func'       => '_registration_reports',
58
-                'capability' => 'ee_read_registrations',
59
-            ),
60
-            'registration_checkins'    => array(
61
-                'func'       => '_registration_checkin_list_table',
62
-                'capability' => 'ee_read_checkins',
63
-            ),
64
-            'newsletter_selected_send' => array(
65
-                'func'       => '_newsletter_selected_send',
66
-                'noheader'   => true,
67
-                'capability' => 'ee_send_message',
68
-            ),
69
-            'delete_checkin_rows'      => array(
70
-                'func'       => '_delete_checkin_rows',
71
-                'noheader'   => true,
72
-                'capability' => 'ee_delete_checkins',
73
-            ),
74
-            'delete_checkin_row'       => array(
75
-                'func'       => '_delete_checkin_row',
76
-                'noheader'   => true,
77
-                'capability' => 'ee_delete_checkin',
78
-                'obj_id'     => $reg_id,
79
-            ),
80
-            'toggle_checkin_status'    => array(
81
-                'func'       => '_toggle_checkin_status',
82
-                'noheader'   => true,
83
-                'capability' => 'ee_edit_checkin',
84
-                'obj_id'     => $reg_id,
85
-            ),
86
-            'event_registrations'      => array(
87
-                'func'       => '_event_registrations_list_table',
88
-                'capability' => 'ee_read_checkins',
89
-            ),
90
-            'registrations_checkin_report' => array(
91
-                'func'       => '_registrations_checkin_report',
92
-                'noheader'   => true,
93
-                'capability' => 'ee_read_registrations',
94
-            ),
95
-        );
96
-        $this->_page_routes = array_merge($this->_page_routes, $new_page_routes);
97
-        $new_page_config = array(
98
-            'reports'               => array(
99
-                'nav'           => array(
100
-                    'label' => __('Reports', 'event_espresso'),
101
-                    'order' => 30,
102
-                ),
103
-                'help_tabs'     => array(
104
-                    'registrations_reports_help_tab' => array(
105
-                        'title'    => __('Registration Reports', 'event_espresso'),
106
-                        'filename' => 'registrations_reports',
107
-                    ),
108
-                ),
109
-                /*'help_tour' => array( 'Registration_Reports_Help_Tour' ),*/
110
-                'require_nonce' => false,
111
-            ),
112
-            'event_registrations'   => array(
113
-                'nav'           => array(
114
-                    'label'      => __('Event Check-In', 'event_espresso'),
115
-                    'order'      => 10,
116
-                    'persistent' => true,
117
-                ),
118
-                'help_tabs'     => array(
119
-                    'registrations_event_checkin_help_tab'                       => array(
120
-                        'title'    => __('Registrations Event Check-In', 'event_espresso'),
121
-                        'filename' => 'registrations_event_checkin',
122
-                    ),
123
-                    'registrations_event_checkin_table_column_headings_help_tab' => array(
124
-                        'title'    => __('Event Check-In Table Column Headings', 'event_espresso'),
125
-                        'filename' => 'registrations_event_checkin_table_column_headings',
126
-                    ),
127
-                    'registrations_event_checkin_filters_help_tab'               => array(
128
-                        'title'    => __('Event Check-In Filters', 'event_espresso'),
129
-                        'filename' => 'registrations_event_checkin_filters',
130
-                    ),
131
-                    'registrations_event_checkin_views_help_tab'                 => array(
132
-                        'title'    => __('Event Check-In Views', 'event_espresso'),
133
-                        'filename' => 'registrations_event_checkin_views',
134
-                    ),
135
-                    'registrations_event_checkin_other_help_tab'                 => array(
136
-                        'title'    => __('Event Check-In Other', 'event_espresso'),
137
-                        'filename' => 'registrations_event_checkin_other',
138
-                    ),
139
-                ),
140
-                'help_tour'     => array('Event_Checkin_Help_Tour'),
141
-                'qtips'         => array('Registration_List_Table_Tips'),
142
-                'list_table'    => 'EE_Event_Registrations_List_Table',
143
-                'metaboxes'     => array(),
144
-                'require_nonce' => false,
145
-            ),
146
-            'registration_checkins' => array(
147
-                'nav'           => array(
148
-                    'label'      => __('Check-In Records', 'event_espresso'),
149
-                    'order'      => 15,
150
-                    'persistent' => false,
151
-                ),
152
-                'list_table'    => 'EE_Registration_CheckIn_List_Table',
153
-                //'help_tour' => array( 'Checkin_Toggle_View_Help_Tour' ),
154
-                'metaboxes'     => array(),
155
-                'require_nonce' => false,
156
-            ),
157
-        );
158
-        $this->_page_config = array_merge($this->_page_config, $new_page_config);
159
-        $this->_page_config['contact_list']['list_table'] = 'Extend_EE_Attendee_Contact_List_Table';
160
-        $this->_page_config['default']['list_table'] = 'Extend_EE_Registrations_List_Table';
161
-    }
162
-
163
-
164
-
165
-    protected function _ajax_hooks()
166
-    {
167
-        parent::_ajax_hooks();
168
-        add_action('wp_ajax_get_newsletter_form_content', array($this, 'get_newsletter_form_content'));
169
-    }
170
-
171
-
172
-
173
-    public function load_scripts_styles()
174
-    {
175
-        parent::load_scripts_styles();
176
-        //if newsletter message type is active then let's add filter and load js for it.
177
-        if (EEH_MSG_Template::is_mt_active('newsletter')) {
178
-            //enqueue newsletter js
179
-            wp_enqueue_script(
180
-                'ee-newsletter-trigger',
181
-                REG_CAF_ASSETS_URL . 'ee-newsletter-trigger.js',
182
-                array('ee-dialog'),
183
-                EVENT_ESPRESSO_VERSION,
184
-                true
185
-            );
186
-            wp_enqueue_style(
187
-                'ee-newsletter-trigger-css',
188
-                REG_CAF_ASSETS_URL . 'ee-newsletter-trigger.css',
189
-                array(),
190
-                EVENT_ESPRESSO_VERSION
191
-            );
192
-            //hook in buttons for newsletter message type trigger.
193
-            add_action(
194
-                'AHEE__EE_Admin_List_Table__extra_tablenav__after_bottom_buttons',
195
-                array($this, 'add_newsletter_action_buttons'),
196
-                10
197
-            );
198
-        }
199
-    }
200
-
201
-
202
-
203
-    public function load_scripts_styles_reports()
204
-    {
205
-        wp_register_script(
206
-            'ee-reg-reports-js',
207
-            REG_CAF_ASSETS_URL . 'ee-registration-admin-reports.js',
208
-            array('google-charts'),
209
-            EVENT_ESPRESSO_VERSION,
210
-            true
211
-        );
212
-        wp_enqueue_script('ee-reg-reports-js');
213
-        $this->_registration_reports_js_setup();
214
-    }
215
-
216
-
217
-
218
-    protected function _add_screen_options_event_registrations()
219
-    {
220
-        $this->_per_page_screen_option();
221
-    }
222
-
223
-
224
-
225
-    protected function _add_screen_options_registration_checkins()
226
-    {
227
-        $page_title = $this->_admin_page_title;
228
-        $this->_admin_page_title = __('Check-In Records', 'event_espresso');
229
-        $this->_per_page_screen_option();
230
-        $this->_admin_page_title = $page_title;
231
-    }
232
-
233
-
234
-
235
-    protected function _set_list_table_views_event_registrations()
236
-    {
237
-        $this->_views = array(
238
-            'all' => array(
239
-                'slug'        => 'all',
240
-                'label'       => __('All', 'event_espresso'),
241
-                'count'       => 0,
242
-                'bulk_action' => ! isset($this->_req_data['event_id'])
243
-                    ? array()
244
-                    : array(
245
-                        'toggle_checkin_status' => __('Toggle Check-In', 'event_espresso'),
246
-                        //'trash_registrations' => __('Trash Registrations', 'event_espresso')
247
-                    ),
248
-            ),
249
-        );
250
-    }
251
-
252
-
253
-
254
-    protected function _set_list_table_views_registration_checkins()
255
-    {
256
-        $this->_views = array(
257
-            'all' => array(
258
-                'slug'        => 'all',
259
-                'label'       => __('All', 'event_espresso'),
260
-                'count'       => 0,
261
-                'bulk_action' => array('delete_checkin_rows' => __('Delete Check-In Rows', 'event_espresso')),
262
-            ),
263
-        );
264
-    }
265
-
266
-
267
-
268
-    /**
269
-     * callback for ajax action.
270
-     *
271
-     * @since 4.3.0
272
-     * @return void (JSON)
273
-     * @throws \EE_Error
274
-     */
275
-    public function get_newsletter_form_content()
276
-    {
277
-        //do a nonce check cause we're not coming in from an normal route here.
278
-        $nonce = isset($this->_req_data['get_newsletter_form_content_nonce']) ? sanitize_text_field(
279
-            $this->_req_data['get_newsletter_form_content_nonce']
280
-        ) : '';
281
-        $nonce_ref = 'get_newsletter_form_content_nonce';
282
-        $this->_verify_nonce($nonce, $nonce_ref);
283
-        //let's get the mtp for the incoming MTP_ ID
284
-        if ( ! isset($this->_req_data['GRP_ID'])) {
285
-            EE_Error::add_error(
286
-                __(
287
-                    'There must be something broken with the js or html structure because the required data for getting a message template group is not present (need an GRP_ID).',
288
-                    'event_espresso'
289
-                ),
290
-                __FILE__,
291
-                __FUNCTION__,
292
-                __LINE__
293
-            );
294
-            $this->_template_args['success'] = false;
295
-            $this->_template_args['error'] = true;
296
-            $this->_return_json();
297
-        }
298
-        $MTPG = EEM_Message_Template_Group::instance()->get_one_by_ID($this->_req_data['GRP_ID']);
299
-        if ( ! $MTPG instanceof EE_Message_Template_Group) {
300
-            EE_Error::add_error(
301
-                sprintf(
302
-                    __(
303
-                        'The GRP_ID given (%d) does not appear to have a corresponding row in the database.',
304
-                        'event_espresso'
305
-                    ),
306
-                    $this->_req_data['GRP_ID']
307
-                ),
308
-                __FILE__,
309
-                __FUNCTION__,
310
-                __LINE__
311
-            );
312
-            $this->_template_args['success'] = false;
313
-            $this->_template_args['error'] = true;
314
-            $this->_return_json();
315
-        }
316
-        $MTPs = $MTPG->context_templates();
317
-        $MTPs = $MTPs['attendee'];
318
-        $template_fields = array();
319
-        /** @var EE_Message_Template $MTP */
320
-        foreach ($MTPs as $MTP) {
321
-            $field = $MTP->get('MTP_template_field');
322
-            if ($field === 'content') {
323
-                $content = $MTP->get('MTP_content');
324
-                if ( ! empty($content['newsletter_content'])) {
325
-                    $template_fields['newsletter_content'] = $content['newsletter_content'];
326
-                }
327
-                continue;
328
-            }
329
-            $template_fields[$MTP->get('MTP_template_field')] = $MTP->get('MTP_content');
330
-        }
331
-        $this->_template_args['success'] = true;
332
-        $this->_template_args['error'] = false;
333
-        $this->_template_args['data'] = array(
334
-            'batch_message_from'    => isset($template_fields['from'])
335
-                ? $template_fields['from']
336
-                : '',
337
-            'batch_message_subject' => isset($template_fields['subject'])
338
-                ? $template_fields['subject']
339
-                : '',
340
-            'batch_message_content' => isset($template_fields['newsletter_content'])
341
-                ? $template_fields['newsletter_content']
342
-                : '',
343
-        );
344
-        $this->_return_json();
345
-    }
346
-
347
-
348
-
349
-    /**
350
-     * callback for AHEE__EE_Admin_List_Table__extra_tablenav__after_bottom_buttons action
351
-     *
352
-     * @since 4.3.0
353
-     * @param EE_Admin_List_Table $list_table
354
-     * @return void
355
-     */
356
-    public function add_newsletter_action_buttons(EE_Admin_List_Table $list_table)
357
-    {
358
-        if ( ! EE_Registry::instance()->CAP->current_user_can(
359
-            'ee_send_message',
360
-            'espresso_registrations_newsletter_selected_send'
361
-        )
362
-        ) {
363
-            return;
364
-        }
365
-        $routes_to_add_to = array(
366
-            'contact_list',
367
-            'event_registrations',
368
-            'default',
369
-        );
370
-        if ($this->_current_page === 'espresso_registrations' && in_array($this->_req_action, $routes_to_add_to)) {
371
-            if (($this->_req_action === 'event_registrations' && empty($this->_req_data['event_id']))
372
-                || (isset($this->_req_data['status']) && $this->_req_data['status'] === 'trash')
373
-            ) {
374
-                echo '';
375
-            } else {
376
-                $button_text = sprintf(
377
-                    __('Send Batch Message (%s selected)', 'event_espresso'),
378
-                    '<span class="send-selected-newsletter-count">0</span>'
379
-                );
380
-                echo '<button id="selected-batch-send-trigger" class="button secondary-button"><span class="dashicons dashicons-email "></span>'
381
-                     . $button_text
382
-                     . '</button>';
383
-                add_action('admin_footer', array($this, 'newsletter_send_form_skeleton'));
384
-            }
385
-        }
386
-    }
387
-
388
-
389
-
390
-    public function newsletter_send_form_skeleton()
391
-    {
392
-        $list_table = $this->_list_table_object;
393
-        $codes = array();
394
-        //need to templates for the newsletter message type for the template selector.
395
-        $values[] = array('text' => __('Select Template to Use', 'event_espresso'), 'id' => 0);
396
-        $mtps = EEM_Message_Template_Group::instance()->get_all(
397
-            array(array('MTP_message_type' => 'newsletter', 'MTP_messenger' => 'email'))
398
-        );
399
-        foreach ($mtps as $mtp) {
400
-            $name = $mtp->name();
401
-            $values[] = array(
402
-                'text' => empty($name) ? __('Global', 'event_espresso') : $name,
403
-                'id'   => $mtp->ID(),
404
-            );
405
-        }
406
-        //need to get a list of shortcodes that are available for the newsletter message type.
407
-        $shortcodes = EEH_MSG_Template::get_shortcodes('newsletter', 'email', array(), 'attendee', false);
408
-        foreach ($shortcodes as $field => $shortcode_array) {
409
-            $codes[$field] = implode(', ', array_keys($shortcode_array));
410
-        }
411
-        $shortcodes = $codes;
412
-        $form_template = REG_CAF_TEMPLATE_PATH . 'newsletter-send-form.template.php';
413
-        $form_template_args = array(
414
-            'form_action'       => admin_url('admin.php?page=espresso_registrations'),
415
-            'form_route'        => 'newsletter_selected_send',
416
-            'form_nonce_name'   => 'newsletter_selected_send_nonce',
417
-            'form_nonce'        => wp_create_nonce('newsletter_selected_send_nonce'),
418
-            'redirect_back_to'  => $this->_req_action,
419
-            'ajax_nonce'        => wp_create_nonce('get_newsletter_form_content_nonce'),
420
-            'template_selector' => EEH_Form_Fields::select_input('newsletter_mtp_selected', $values),
421
-            'shortcodes'        => $shortcodes,
422
-            'id_type'           => $list_table instanceof EE_Attendee_Contact_List_Table ? 'contact' : 'registration',
423
-        );
424
-        EEH_Template::display_template($form_template, $form_template_args);
425
-    }
426
-
427
-
428
-
429
-    /**
430
-     * Handles sending selected registrations/contacts a newsletter.
431
-     *
432
-     * @since  4.3.0
433
-     * @return void
434
-     * @throws \EE_Error
435
-     */
436
-    protected function _newsletter_selected_send()
437
-    {
438
-        $success = true;
439
-        //first we need to make sure we have a GRP_ID so we know what template we're sending and updating!
440
-        if (empty($this->_req_data['newsletter_mtp_selected'])) {
441
-            EE_Error::add_error(
442
-                __(
443
-                    'In order to send a message, a Message Template GRP_ID is needed. It was not provided so messages were not sent.',
444
-                    'event_espresso'
445
-                ),
446
-                __FILE__,
447
-                __FUNCTION__,
448
-                __LINE__
449
-            );
450
-            $success = false;
451
-        }
452
-        if ($success) {
453
-            //update Message template in case there are any changes
454
-            $Message_Template_Group = EEM_Message_Template_Group::instance()->get_one_by_ID(
455
-                $this->_req_data['newsletter_mtp_selected']
456
-            );
457
-            $Message_Templates = $Message_Template_Group instanceof EE_Message_Template_Group
458
-                ? $Message_Template_Group->context_templates()
459
-                : array();
460
-            if (empty($Message_Templates)) {
461
-                EE_Error::add_error(
462
-                    __(
463
-                        'Unable to retrieve message template fields from the db. Messages not sent.',
464
-                        'event_espresso'
465
-                    ),
466
-                    __FILE__,
467
-                    __FUNCTION__,
468
-                    __LINE__
469
-                );
470
-            }
471
-            //let's just update the specific fields
472
-            foreach ($Message_Templates['attendee'] as $Message_Template) {
473
-                if ($Message_Template instanceof EE_Message_Template) {
474
-                    $field = $Message_Template->get('MTP_template_field');
475
-                    $content = $Message_Template->get('MTP_content');
476
-                    $new_content = $content;
477
-                    switch ($field) {
478
-                        case 'from' :
479
-                            $new_content = ! empty($this->_req_data['batch_message']['from'])
480
-                                ? $this->_req_data['batch_message']['from']
481
-                                : $content;
482
-                            break;
483
-                        case 'subject' :
484
-                            $new_content = ! empty($this->_req_data['batch_message']['subject'])
485
-                                ? $this->_req_data['batch_message']['subject']
486
-                                : $content;
487
-                            break;
488
-                        case 'content' :
489
-                            $new_content = $content;
490
-                            $new_content['newsletter_content'] = ! empty($this->_req_data['batch_message']['content'])
491
-                                ? $this->_req_data['batch_message']['content']
492
-                                : $content['newsletter_content'];
493
-                            break;
494
-                        default :
495
-                            //continue the foreach loop, we don't want to set $new_content nor save.
496
-                            continue 2;
497
-                    }
498
-                    $Message_Template->set('MTP_content', $new_content);
499
-                    $Message_Template->save();
500
-                }
501
-            }
502
-            //great fields are updated!  now let's make sure we just have contact objects (EE_Attendee).
503
-            $id_type = ! empty($this->_req_data['batch_message']['id_type'])
504
-                ? $this->_req_data['batch_message']['id_type']
505
-                : 'registration';
506
-            //id_type will affect how we assemble the ids.
507
-            $ids = ! empty($this->_req_data['batch_message']['ids'])
508
-                ? json_decode(stripslashes($this->_req_data['batch_message']['ids']))
509
-                : array();
510
-            $registrations_used_for_contact_data = array();
511
-            //using switch because eventually we'll have other contexts that will be used for generating messages.
512
-            switch ($id_type) {
513
-                case 'registration' :
514
-                    $registrations_used_for_contact_data = EEM_Registration::instance()->get_all(
515
-                        array(
516
-                            array(
517
-                                'REG_ID' => array('IN', $ids),
518
-                            ),
519
-                        )
520
-                    );
521
-                    break;
522
-                case 'contact' :
523
-                    $registrations_used_for_contact_data = EEM_Registration::instance()
524
-                                                                           ->get_latest_registration_for_each_of_given_contacts($ids);
525
-                    break;
526
-            }
527
-            do_action(
528
-                'AHEE__Extend_Registrations_Admin_Page___newsletter_selected_send__with_registrations',
529
-                $registrations_used_for_contact_data,
530
-                $Message_Template_Group->ID()
531
-            );
532
-            //kept for backward compat, internally we no longer use this action.
533
-            //@deprecated 4.8.36.rc.002
534
-            $contacts = $id_type === 'registration'
535
-                ? EEM_Attendee::instance()->get_array_of_contacts_from_reg_ids($ids)
536
-                : EEM_Attendee::instance()->get_all(array(array('ATT_ID' => array('in', $ids))));
537
-            do_action(
538
-                'AHEE__Extend_Registrations_Admin_Page___newsletter_selected_send',
539
-                $contacts,
540
-                $Message_Template_Group->ID()
541
-            );
542
-        }
543
-        $query_args = array(
544
-            'action' => ! empty($this->_req_data['redirect_back_to'])
545
-                ? $this->_req_data['redirect_back_to']
546
-                : 'default',
547
-        );
548
-        $this->_redirect_after_action(false, '', '', $query_args, true);
549
-    }
550
-
551
-
552
-
553
-    /**
554
-     * This is called when javascript is being enqueued to setup the various data needed for the reports js.
555
-     * Also $this->{$_reports_template_data} property is set for later usage by the _registration_reports method.
556
-     */
557
-    protected function _registration_reports_js_setup()
558
-    {
559
-        $this->_reports_template_data['admin_reports'][] = $this->_registrations_per_day_report();
560
-        $this->_reports_template_data['admin_reports'][] = $this->_registrations_per_event_report();
561
-    }
562
-
563
-
564
-
565
-    /**
566
-     *        generates Business Reports regarding Registrations
567
-     *
568
-     * @access protected
569
-     * @return void
570
-     */
571
-    protected function _registration_reports()
572
-    {
573
-        $template_path = EE_ADMIN_TEMPLATE . 'admin_reports.template.php';
574
-        $this->_template_args['admin_page_content'] = EEH_Template::display_template(
575
-            $template_path,
576
-            $this->_reports_template_data,
577
-            true
578
-        );
579
-        // the final template wrapper
580
-        $this->display_admin_page_with_no_sidebar();
581
-    }
582
-
583
-
584
-
585
-    /**
586
-     * Generates Business Report showing total registrations per day.
587
-     *
588
-     * @param string $period The period (acceptable by PHP Datetime constructor) for which the report is generated.
589
-     * @return string
590
-     */
591
-    private function _registrations_per_day_report($period = '-1 month')
592
-    {
593
-        $report_ID = 'reg-admin-registrations-per-day-report-dv';
594
-        $results = EEM_Registration::instance()->get_registrations_per_day_and_per_status_report($period);
595
-        $results = (array)$results;
596
-        $regs = array();
597
-        $subtitle = '';
598
-        if ($results) {
599
-            $column_titles = array();
600
-            $tracker = 0;
601
-            foreach ($results as $result) {
602
-                $report_column_values = array();
603
-                foreach ($result as $property_name => $property_value) {
604
-                    $property_value = $property_name === 'Registration_REG_date' ? $property_value
605
-                        : (int)$property_value;
606
-                    $report_column_values[] = $property_value;
607
-                    if ($tracker === 0) {
608
-                        if ($property_name === 'Registration_REG_date') {
609
-                            $column_titles[] = __('Date (only days with registrations are shown)', 'event_espresso');
610
-                        } else {
611
-                            $column_titles[] = EEH_Template::pretty_status($property_name, false, 'sentence');
612
-                        }
613
-                    }
614
-                }
615
-                $tracker++;
616
-                $regs[] = $report_column_values;
617
-            }
618
-            //make sure the column_titles is pushed to the beginning of the array
619
-            array_unshift($regs, $column_titles);
620
-            //setup the date range.
621
-            $DateTimeZone = new DateTimeZone(EEH_DTT_Helper::get_timezone());
622
-            $beginning_date = new DateTime("now " . $period, $DateTimeZone);
623
-            $ending_date = new DateTime("now", $DateTimeZone);
624
-            $subtitle = sprintf(
625
-                _x('For the period: %1$s to %2$s', 'Used to give date range', 'event_espresso'),
626
-                $beginning_date->format('Y-m-d'),
627
-                $ending_date->format('Y-m-d')
628
-            );
629
-        }
630
-        $report_title = __('Total Registrations per Day', 'event_espresso');
631
-        $report_params = array(
632
-            'title'     => $report_title,
633
-            'subtitle'  => $subtitle,
634
-            'id'        => $report_ID,
635
-            'regs'      => $regs,
636
-            'noResults' => empty($regs),
637
-            'noRegsMsg' => sprintf(
638
-                __(
639
-                    '%sThere are currently no registration records in the last month for this report.%s',
640
-                    'event_espresso'
641
-                ),
642
-                '<h2>' . $report_title . '</h2><p>',
643
-                '</p>'
644
-            ),
645
-        );
646
-        wp_localize_script('ee-reg-reports-js', 'regPerDay', $report_params);
647
-        return $report_ID;
648
-    }
649
-
650
-
651
-
652
-    /**
653
-     * Generates Business Report showing total registrations per event.
654
-     *
655
-     * @param string $period The period (acceptable by PHP Datetime constructor) for which the report is generated.
656
-     * @return string
657
-     */
658
-    private function _registrations_per_event_report($period = '-1 month')
659
-    {
660
-        $report_ID = 'reg-admin-registrations-per-event-report-dv';
661
-        $results = EEM_Registration::instance()->get_registrations_per_event_and_per_status_report($period);
662
-        $results = (array)$results;
663
-        $regs = array();
664
-        $subtitle = '';
665
-        if ($results) {
666
-            $column_titles = array();
667
-            $tracker = 0;
668
-            foreach ($results as $result) {
669
-                $report_column_values = array();
670
-                foreach ($result as $property_name => $property_value) {
671
-                    $property_value = $property_name === 'Registration_Event' ? wp_trim_words(
672
-                        $property_value,
673
-                        4,
674
-                        '...'
675
-                    ) : (int)$property_value;
676
-                    $report_column_values[] = $property_value;
677
-                    if ($tracker === 0) {
678
-                        if ($property_name === 'Registration_Event') {
679
-                            $column_titles[] = __('Event', 'event_espresso');
680
-                        } else {
681
-                            $column_titles[] = EEH_Template::pretty_status($property_name, false, 'sentence');
682
-                        }
683
-                    }
684
-                }
685
-                $tracker++;
686
-                $regs[] = $report_column_values;
687
-            }
688
-            //make sure the column_titles is pushed to the beginning of the array
689
-            array_unshift($regs, $column_titles);
690
-            //setup the date range.
691
-            $DateTimeZone = new DateTimeZone(EEH_DTT_Helper::get_timezone());
692
-            $beginning_date = new DateTime("now " . $period, $DateTimeZone);
693
-            $ending_date = new DateTime("now", $DateTimeZone);
694
-            $subtitle = sprintf(
695
-                _x('For the period: %1$s to %2$s', 'Used to give date range', 'event_espresso'),
696
-                $beginning_date->format('Y-m-d'),
697
-                $ending_date->format('Y-m-d')
698
-            );
699
-        }
700
-        $report_title = __('Total Registrations per Event', 'event_espresso');
701
-        $report_params = array(
702
-            'title'     => $report_title,
703
-            'subtitle'  => $subtitle,
704
-            'id'        => $report_ID,
705
-            'regs'      => $regs,
706
-            'noResults' => empty($regs),
707
-            'noRegsMsg' => sprintf(
708
-                __(
709
-                    '%sThere are currently no registration records in the last month for this report.%s',
710
-                    'event_espresso'
711
-                ),
712
-                '<h2>' . $report_title . '</h2><p>',
713
-                '</p>'
714
-            ),
715
-        );
716
-        wp_localize_script('ee-reg-reports-js', 'regPerEvent', $report_params);
717
-        return $report_ID;
718
-    }
719
-
720
-
721
-
722
-    /**
723
-     * generates HTML for the Registration Check-in list table (showing all Check-ins for a specific registration)
724
-     *
725
-     * @access protected
726
-     * @return void
727
-     * @throws \EE_Error
728
-     */
729
-    protected function _registration_checkin_list_table()
730
-    {
731
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
732
-        $reg_id = isset($this->_req_data['_REGID']) ? $this->_req_data['_REGID'] : null;
733
-        /** @var EE_Registration $registration */
734
-        $registration = EEM_Registration::instance()->get_one_by_ID($reg_id);
735
-        $attendee = $registration->attendee();
736
-        $this->_admin_page_title .= $this->get_action_link_or_button(
737
-            'new_registration',
738
-            'add-registrant',
739
-            array('event_id' => $registration->event_ID()),
740
-            'add-new-h2'
741
-        );
742
-        $legend_items = array(
743
-            'checkin'  => array(
744
-                'class' => Extend_Registrations_Admin_Page::getCheckinStatusDashicon(
745
-                    $checkin_status = EE_Checkin::status_checked_in
746
-                ),
747
-                'desc'  => __('This indicates the attendee has been checked in', 'event_espresso'),
748
-            ),
749
-            'checkout' => array(
750
-                'class' => Extend_Registrations_Admin_Page::getCheckinStatusDashicon(
751
-                    $checkin_status = EE_Checkin::status_checked_out
752
-                ),
753
-                'desc'  => __('This indicates the attendee has been checked out', 'event_espresso'),
754
-            ),
755
-        );
756
-        $this->_template_args['after_list_table'] = $this->_display_legend($legend_items);
757
-        $dtt_id = isset($this->_req_data['DTT_ID']) ? $this->_req_data['DTT_ID'] : null;
758
-        /** @var EE_Datetime $datetime */
759
-        $datetime = EEM_Datetime::instance()->get_one_by_ID($dtt_id);
760
-        $datetime_label = '';
761
-        if ($datetime instanceof EE_Datetime) {
762
-            $datetime_label = $datetime->get_dtt_display_name(true);
763
-            $datetime_label .= ! empty($datetime_label)
764
-                ? ' (' . $datetime->get_dtt_display_name() . ')'
765
-                : $datetime->get_dtt_display_name();
766
-        }
767
-        $datetime_link = ! empty($dtt_id) && $registration instanceof EE_Registration
768
-            ? EE_Admin_Page::add_query_args_and_nonce(
769
-                array(
770
-                    'action'   => 'event_registrations',
771
-                    'event_id' => $registration->event_ID(),
772
-                    'DTT_ID'   => $dtt_id,
773
-                ),
774
-                $this->_admin_base_url
775
-            )
776
-            : '';
777
-        $datetime_link = ! empty($datetime_link)
778
-            ? '<a href="' . $datetime_link . '">'
779
-              . '<span id="checkin-dtt">'
780
-              . $datetime_label
781
-              . '</span></a>'
782
-            : $datetime_label;
783
-        $attendee_name = $attendee instanceof EE_Attendee
784
-            ? $attendee->full_name()
785
-            : '';
786
-        $attendee_link = $attendee instanceof EE_Attendee
787
-            ? $attendee->get_admin_details_link()
788
-            : '';
789
-        $attendee_link = ! empty($attendee_link)
790
-            ? '<a href="' . $attendee->get_admin_details_link() . '"'
791
-              . ' title="' . esc_html__('Click for attendee details', 'event_espresso') . '">'
792
-              . '<span id="checkin-attendee-name">'
793
-              . $attendee_name
794
-              . '</span></a>'
795
-            : '';
796
-        $event_link = $registration->event() instanceof EE_Event
797
-            ? $registration->event()->get_admin_details_link()
798
-            : '';
799
-        $event_link = ! empty($event_link)
800
-            ? '<a href="' . $event_link . '"'
801
-              . ' title="' . esc_html__('Click here to edit event.', 'event_espresso') . '">'
802
-              . '<span id="checkin-event-name">'
803
-              . $registration->event_name()
804
-              . '</span>'
805
-              . '</a>'
806
-            : '';
807
-        $this->_template_args['before_list_table'] = ! empty($reg_id) && ! empty($dtt_id)
808
-            ? '<h2>' . sprintf(
809
-                esc_html__('Displaying check in records for %1$s for %2$s at the event, %3$s', 'event_espresso'),
810
-                $attendee_link,
811
-                $datetime_link,
812
-                $event_link
813
-            ) . '</h2>'
814
-            : '';
815
-        $this->_template_args['list_table_hidden_fields'] = ! empty($reg_id)
816
-            ? '<input type="hidden" name="_REGID" value="' . $reg_id . '">' : '';
817
-        $this->_template_args['list_table_hidden_fields'] .= ! empty($dtt_id)
818
-            ? '<input type="hidden" name="DTT_ID" value="' . $dtt_id . '">' : '';
819
-        $this->display_admin_list_table_page_with_no_sidebar();
820
-    }
821
-
822
-
823
-
824
-    /**
825
-     * toggle the Check-in status for the given registration (coming from ajax)
826
-     *
827
-     * @return void (JSON)
828
-     */
829
-    public function toggle_checkin_status()
830
-    {
831
-        //first make sure we have the necessary data
832
-        if ( ! isset($this->_req_data['_regid'])) {
833
-            EE_Error::add_error(
834
-                __(
835
-                    'There must be something broken with the html structure because the required data for toggling the Check-in status is not being sent via ajax',
836
-                    'event_espresso'
837
-                ),
838
-                __FILE__,
839
-                __FUNCTION__,
840
-                __LINE__
841
-            );
842
-            $this->_template_args['success'] = false;
843
-            $this->_template_args['error'] = true;
844
-            $this->_return_json();
845
-        };
846
-        //do a nonce check cause we're not coming in from an normal route here.
847
-        $nonce = isset($this->_req_data['checkinnonce']) ? sanitize_text_field($this->_req_data['checkinnonce'])
848
-            : '';
849
-        $nonce_ref = 'checkin_nonce';
850
-        $this->_verify_nonce($nonce, $nonce_ref);
851
-        //beautiful! Made it this far so let's get the status.
852
-        $new_status = Extend_Registrations_Admin_Page::getCheckinStatusDashicon(
853
-            $this->_toggle_checkin_status()
854
-        );
855
-        //setup new class to return via ajax
856
-        $this->_template_args['admin_page_content'] = 'clickable trigger-checkin ' . $new_status;
857
-        $this->_template_args['success'] = true;
858
-        $this->_return_json();
859
-    }
860
-
861
-
862
-
863
-    /**
864
-     * handles toggling the checkin status for the registration,
865
-     *
866
-     * @access protected
867
-     * @return int|void
868
-     */
869
-    protected function _toggle_checkin_status()
870
-    {
871
-        //first let's get the query args out of the way for the redirect
872
-        $query_args = array(
873
-            'action'   => 'event_registrations',
874
-            'event_id' => isset($this->_req_data['event_id']) ? $this->_req_data['event_id'] : null,
875
-            'DTT_ID'   => isset($this->_req_data['DTT_ID']) ? $this->_req_data['DTT_ID'] : null,
876
-        );
877
-        $new_status = false;
878
-        // bulk action check in toggle
879
-        if ( ! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
880
-            // cycle thru checkboxes
881
-            while (list($REG_ID, $value) = each($this->_req_data['checkbox'])) {
882
-                $DTT_ID = isset($this->_req_data['DTT_ID']) ? $this->_req_data['DTT_ID'] : null;
883
-                $new_status = $this->_toggle_checkin($REG_ID, $DTT_ID);
884
-            }
885
-        } elseif (isset($this->_req_data['_regid'])) {
886
-            //coming from ajax request
887
-            $DTT_ID = isset($this->_req_data['dttid']) ? $this->_req_data['dttid'] : null;
888
-            $query_args['DTT_ID'] = $DTT_ID;
889
-            $new_status = $this->_toggle_checkin($this->_req_data['_regid'], $DTT_ID);
890
-        } else {
891
-            EE_Error::add_error(
892
-                __('Missing some required data to toggle the Check-in', 'event_espresso'),
893
-                __FILE__,
894
-                __FUNCTION__,
895
-                __LINE__
896
-            );
897
-        }
898
-        if (defined('DOING_AJAX')) {
899
-            return $new_status;
900
-        }
901
-        $this->_redirect_after_action(false, '', '', $query_args, true);
902
-    }
903
-
904
-
905
-
906
-    /**
907
-     * This is toggles a single Check-in for the given registration and datetime.
908
-     *
909
-     * @param  int $REG_ID The registration we're toggling
910
-     * @param  int $DTT_ID The datetime we're toggling
911
-     * @return int            The new status toggled to.
912
-     * @throws \EE_Error
913
-     */
914
-    private function _toggle_checkin($REG_ID, $DTT_ID)
915
-    {
916
-        /** @var EE_Registration $REG */
917
-        $REG = EEM_Registration::instance()->get_one_by_ID($REG_ID);
918
-        $new_status = $REG->toggle_checkin_status($DTT_ID);
919
-        if ($new_status !== false) {
920
-            EE_Error::add_success($REG->get_checkin_msg($DTT_ID));
921
-        } else {
922
-            EE_Error::add_error($REG->get_checkin_msg($DTT_ID, true), __FILE__, __FUNCTION__, __LINE__);
923
-            $new_status = false;
924
-        }
925
-        return $new_status;
926
-    }
927
-
928
-
929
-
930
-    /**
931
-     * Takes care of deleting multiple EE_Checkin table rows
932
-     *
933
-     * @access protected
934
-     * @return void
935
-     * @throws \EE_Error
936
-     */
937
-    protected function _delete_checkin_rows()
938
-    {
939
-        $query_args = array(
940
-            'action' => 'registration_checkins',
941
-            'DTT_ID' => isset($this->_req_data['DTT_ID']) ? $this->_req_data['DTT_ID'] : 0,
942
-            '_REGID' => isset($this->_req_data['_REGID']) ? $this->_req_data['_REGID'] : 0,
943
-        );
944
-        $errors = 0;
945
-        if ( ! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
946
-            while (list($CHK_ID, $value) = each($this->_req_data['checkbox'])) {
947
-                if ( ! EEM_Checkin::instance()->delete_by_ID($CHK_ID)) {
948
-                    $errors++;
949
-                }
950
-            }
951
-        } else {
952
-            EE_Error::add_error(
953
-                __(
954
-                    'So, something went wrong with the bulk delete because there was no data received for instructions on WHAT to delete!',
955
-                    'event_espresso'
956
-                ),
957
-                __FILE__,
958
-                __FUNCTION__,
959
-                __LINE__
960
-            );
961
-            $this->_redirect_after_action(false, '', '', $query_args, true);
962
-        }
963
-        if ($errors > 0) {
964
-            EE_Error::add_error(
965
-                sprintf(__('There were %d records that did not delete successfully', 'event_espresso'), $errors),
966
-                __FILE__,
967
-                __FUNCTION__,
968
-                __LINE__
969
-            );
970
-        } else {
971
-            EE_Error::add_success(__('Records were successfully deleted', 'event_espresso'));
972
-        }
973
-        $this->_redirect_after_action(false, '', '', $query_args, true);
974
-    }
975
-
976
-
977
-
978
-    /**
979
-     * Deletes a single EE_Checkin row
980
-     *
981
-     * @return void
982
-     * @throws \EE_Error
983
-     */
984
-    protected function _delete_checkin_row()
985
-    {
986
-        $query_args = array(
987
-            'action' => 'registration_checkins',
988
-            'DTT_ID' => isset($this->_req_data['DTT_ID']) ? $this->_req_data['DTT_ID'] : 0,
989
-            '_REGID' => isset($this->_req_data['_REGID']) ? $this->_req_data['_REGID'] : 0,
990
-        );
991
-        if ( ! empty($this->_req_data['CHK_ID'])) {
992
-            if ( ! EEM_Checkin::instance()->delete_by_ID($this->_req_data['CHK_ID'])) {
993
-                EE_Error::add_error(
994
-                    __('Something went wrong and this check-in record was not deleted', 'event_espresso'),
995
-                    __FILE__,
996
-                    __FUNCTION__,
997
-                    __LINE__
998
-                );
999
-            } else {
1000
-                EE_Error::add_success(__('Check-In record successfully deleted', 'event_espresso'));
1001
-            }
1002
-        } else {
1003
-            EE_Error::add_error(
1004
-                __(
1005
-                    'In order to delete a Check-in record, there must be a Check-In ID available. There is not. It is not your fault, there is just a gremlin living in the code',
1006
-                    'event_espresso'
1007
-                ),
1008
-                __FILE__,
1009
-                __FUNCTION__,
1010
-                __LINE__
1011
-            );
1012
-        }
1013
-        $this->_redirect_after_action(false, '', '', $query_args, true);
1014
-    }
1015
-
1016
-
1017
-
1018
-    /**
1019
-     *        generates HTML for the Event Registrations List Table
1020
-     *
1021
-     * @access protected
1022
-     * @return void
1023
-     * @throws \EE_Error
1024
-     */
1025
-    protected function _event_registrations_list_table()
1026
-    {
1027
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
1028
-        $this->_admin_page_title .= isset($this->_req_data['event_id'])
1029
-            ? $this->get_action_link_or_button(
1030
-                'new_registration',
1031
-                'add-registrant',
1032
-                array('event_id' => $this->_req_data['event_id']),
1033
-                'add-new-h2',
1034
-                '',
1035
-                false
1036
-            )
1037
-            : '';
1038
-        $legend_items = array(
1039
-            'star-icon'        => array(
1040
-                'class' => 'dashicons dashicons-star-filled lt-blue-icon ee-icon-size-8',
1041
-                'desc'  => __('This Registrant is the Primary Registrant', 'event_espresso'),
1042
-            ),
1043
-            'checkin'          => array(
1044
-                'class' => Extend_Registrations_Admin_Page::getCheckinStatusDashicon(
1045
-                    $checkin_status = EE_Checkin::status_checked_in
1046
-                ),
1047
-                'desc'  => __('This Registrant has been Checked In', 'event_espresso'),
1048
-            ),
1049
-            'checkout'         => array(
1050
-                'class' => Extend_Registrations_Admin_Page::getCheckinStatusDashicon(
1051
-                    $checkin_status = EE_Checkin::status_checked_out
1052
-                ),
1053
-                'desc'  => __('This Registrant has been Checked Out', 'event_espresso'),
1054
-            ),
1055
-            'nocheckinrecord'  => array(
1056
-                'class' => Extend_Registrations_Admin_Page::getCheckinStatusDashicon(
1057
-                    $checkin_status = EE_Checkin::status_checked_never
1058
-                ),
1059
-                'desc'  => __('No Check-in Record has been Created for this Registrant', 'event_espresso'),
1060
-            ),
1061
-            'view_details'     => array(
1062
-                'class' => 'dashicons dashicons-search',
1063
-                'desc'  => __('View All Check-in Records for this Registrant', 'event_espresso'),
1064
-            ),
1065
-            'approved_status'  => array(
1066
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_approved,
1067
-                'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_approved, false, 'sentence'),
1068
-            ),
1069
-            'cancelled_status' => array(
1070
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_cancelled,
1071
-                'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_cancelled, false, 'sentence'),
1072
-            ),
1073
-            'declined_status'  => array(
1074
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_declined,
1075
-                'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_declined, false, 'sentence'),
1076
-            ),
1077
-            'not_approved'     => array(
1078
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_not_approved,
1079
-                'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_not_approved, false, 'sentence'),
1080
-            ),
1081
-            'pending_status'   => array(
1082
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_pending_payment,
1083
-                'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_pending_payment, false, 'sentence'),
1084
-            ),
1085
-            'wait_list'        => array(
1086
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_wait_list,
1087
-                'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_wait_list, false, 'sentence'),
1088
-            ),
1089
-        );
1090
-        $this->_template_args['after_list_table'] = $this->_display_legend($legend_items);
1091
-        $event_id = isset($this->_req_data['event_id']) ? $this->_req_data['event_id'] : null;
1092
-        $this->_template_args['before_list_table'] = ! empty($event_id)
1093
-            ? '<h2>' . sprintf(
1094
-                __('Viewing Registrations for Event: %s', 'event_espresso'),
1095
-                EEM_Event::instance()->get_one_by_ID($event_id)->get('EVT_name')
1096
-            ) . '</h2>'
1097
-            : '';
1098
-        //need to get the number of datetimes on the event and set default datetime_id if there is only one datetime on the event.
1099
-        /** @var EE_Event $event */
1100
-        $event = EEM_Event::instance()->get_one_by_ID($event_id);
1101
-        $DTT_ID = ! empty($this->_req_data['DTT_ID']) ? absint($this->_req_data['DTT_ID']) : 0;
1102
-        $datetime = null;
1103
-        if ($event instanceof EE_Event) {
1104
-            $datetimes_on_event = $event->datetimes();
1105
-            if (count($datetimes_on_event) === 1) {
1106
-                $datetime = reset($datetimes_on_event);
1107
-            }
1108
-        }
1109
-        $datetime = $datetime instanceof EE_Datetime ? $datetime : EEM_Datetime::instance()->get_one_by_ID($DTT_ID);
1110
-        if ($datetime instanceof EE_Datetime && $this->_template_args['before_list_table'] !== '') {
1111
-            $this->_template_args['before_list_table'] = substr($this->_template_args['before_list_table'], 0, -5);
1112
-            $this->_template_args['before_list_table'] .= ' &nbsp;<span class="drk-grey-text">';
1113
-            $this->_template_args['before_list_table'] .= '<span class="dashicons dashicons-calendar"></span>';
1114
-            $this->_template_args['before_list_table'] .= $datetime->name();
1115
-            $this->_template_args['before_list_table'] .= ' ( ' . $datetime->date_and_time_range() . ' )';
1116
-            $this->_template_args['before_list_table'] .= '</span></h2>';
1117
-        }
1118
-        //if no datetime, then we're on the initial view, so let's give some helpful instructions on what the status column
1119
-        //represents
1120
-        if ( ! $datetime instanceof EE_Datetime) {
1121
-            $this->_template_args['before_list_table'] .= '<br><p class="description">'
1122
-                                                          . __('In this view, the check-in status represents the latest check-in record for the registration in that row.',
1123
-                    'event_espresso')
1124
-                                                          . '</p>';
1125
-        }
1126
-        $this->display_admin_list_table_page_with_no_sidebar();
1127
-    }
1128
-
1129
-    /**
1130
-     * Download the registrations check-in report (same as the normal registration report, but with different where
1131
-     * conditions)
1132
-     *
1133
-     * @return void ends the request by a redirect or download
1134
-     */
1135
-    public function _registrations_checkin_report()
1136
-    {
1137
-        $this->_registrations_report_base('_get_checkin_query_params_from_request');
1138
-    }
1139
-
1140
-    /**
1141
-     * Gets the query params from the request, plus adds a where condition for the registration status,
1142
-     * because on the checkin page we only ever want to see approved and pending-approval registrations
1143
-     *
1144
-     * @param array     $request
1145
-     * @param int  $per_page
1146
-     * @param bool $count
1147
-     * @return array
1148
-     */
1149
-    protected function _get_checkin_query_params_from_request(
1150
-        $request,
1151
-        $per_page = 10,
1152
-        $count = false
1153
-    ) {
1154
-        $query_params = $this->_get_registration_query_parameters($request, $per_page, $count);
1155
-        //unlike the regular registrations list table,
1156
-        $status_ids_array = apply_filters(
1157
-            'FHEE__Extend_Registrations_Admin_Page__get_event_attendees__status_ids_array',
1158
-            array(EEM_Registration::status_id_pending_payment, EEM_Registration::status_id_approved)
1159
-        );
1160
-        $query_params[0]['STS_ID'] = array('IN', $status_ids_array);
1161
-        return $query_params;
1162
-    }
1163
-
1164
-
1165
-
1166
-
1167
-    /**
1168
-     * Gets registrations for an event
1169
-     *
1170
-     * @param int    $per_page
1171
-     * @param bool   $count whether to return count or data.
1172
-     * @param bool   $trash
1173
-     * @param string $orderby
1174
-     * @return EE_Registration[]|int
1175
-     * @throws \EE_Error
1176
-     */
1177
-    public function get_event_attendees($per_page = 10, $count = false, $trash = false, $orderby = 'ATT_fname')
1178
-    {
1179
-        //normalize some request params that get setup by the parent `get_registrations` method.
1180
-        $request = $this->_req_data;
1181
-        $request['orderby'] = ! empty($this->_req_data['orderby']) ? $this->_req_data['orderby'] : $orderby;
1182
-        $request['order'] =  ! empty($this->_req_data['order']) ? $this->_req_data['order'] : 'ASC';
1183
-        if($trash){
1184
-            $request['status'] = 'trash';
1185
-        }
1186
-        $query_params = $this->_get_checkin_query_params_from_request( $request, $per_page, $count );
1187
-        /**
1188
-         * Override the default groupby added by EEM_Base so that sorts with multiple order bys work as expected
1189
-         * @link https://events.codebasehq.com/projects/event-espresso/tickets/10093
1190
-         * @see EEM_Base::get_all()
1191
-         */
1192
-        $query_params['group_by'] = '';
1193
-
1194
-        return $count
1195
-            ? EEM_Registration::instance()->count($query_params)
1196
-            /** @type EE_Registration[] */
1197
-            : EEM_Registration::instance()->get_all($query_params);
1198
-    }
20
+	/**
21
+	 * This is used to hold the reports template data which is setup early in the request.
22
+	 *
23
+	 * @type array
24
+	 */
25
+	protected $_reports_template_data = array();
26
+
27
+
28
+
29
+	/**
30
+	 * Extend_Registrations_Admin_Page constructor.
31
+	 *
32
+	 * @param bool $routing
33
+	 */
34
+	public function __construct($routing = true)
35
+	{
36
+		parent::__construct($routing);
37
+		if ( ! defined('REG_CAF_TEMPLATE_PATH')) {
38
+			define('REG_CAF_TEMPLATE_PATH', EE_CORE_CAF_ADMIN_EXTEND . 'registrations/templates/');
39
+			define('REG_CAF_ASSETS', EE_CORE_CAF_ADMIN_EXTEND . 'registrations/assets/');
40
+			define('REG_CAF_ASSETS_URL', EE_CORE_CAF_ADMIN_EXTEND_URL . 'registrations/assets/');
41
+		}
42
+	}
43
+
44
+
45
+
46
+	protected function _extend_page_config()
47
+	{
48
+		$this->_admin_base_path = EE_CORE_CAF_ADMIN_EXTEND . 'registrations';
49
+		$reg_id = ! empty($this->_req_data['_REG_ID']) && ! is_array($this->_req_data['_REG_ID'])
50
+			? $this->_req_data['_REG_ID']
51
+			: 0;
52
+		// $att_id = ! empty( $this->_req_data['ATT_ID'] ) ? ! is_array( $this->_req_data['ATT_ID'] ) : 0;
53
+		// $att_id = ! empty( $this->_req_data['post'] ) && ! is_array( $this->_req_data['post'] )
54
+		// 	? $this->_req_data['post'] : $att_id;
55
+		$new_page_routes = array(
56
+			'reports'                  => array(
57
+				'func'       => '_registration_reports',
58
+				'capability' => 'ee_read_registrations',
59
+			),
60
+			'registration_checkins'    => array(
61
+				'func'       => '_registration_checkin_list_table',
62
+				'capability' => 'ee_read_checkins',
63
+			),
64
+			'newsletter_selected_send' => array(
65
+				'func'       => '_newsletter_selected_send',
66
+				'noheader'   => true,
67
+				'capability' => 'ee_send_message',
68
+			),
69
+			'delete_checkin_rows'      => array(
70
+				'func'       => '_delete_checkin_rows',
71
+				'noheader'   => true,
72
+				'capability' => 'ee_delete_checkins',
73
+			),
74
+			'delete_checkin_row'       => array(
75
+				'func'       => '_delete_checkin_row',
76
+				'noheader'   => true,
77
+				'capability' => 'ee_delete_checkin',
78
+				'obj_id'     => $reg_id,
79
+			),
80
+			'toggle_checkin_status'    => array(
81
+				'func'       => '_toggle_checkin_status',
82
+				'noheader'   => true,
83
+				'capability' => 'ee_edit_checkin',
84
+				'obj_id'     => $reg_id,
85
+			),
86
+			'event_registrations'      => array(
87
+				'func'       => '_event_registrations_list_table',
88
+				'capability' => 'ee_read_checkins',
89
+			),
90
+			'registrations_checkin_report' => array(
91
+				'func'       => '_registrations_checkin_report',
92
+				'noheader'   => true,
93
+				'capability' => 'ee_read_registrations',
94
+			),
95
+		);
96
+		$this->_page_routes = array_merge($this->_page_routes, $new_page_routes);
97
+		$new_page_config = array(
98
+			'reports'               => array(
99
+				'nav'           => array(
100
+					'label' => __('Reports', 'event_espresso'),
101
+					'order' => 30,
102
+				),
103
+				'help_tabs'     => array(
104
+					'registrations_reports_help_tab' => array(
105
+						'title'    => __('Registration Reports', 'event_espresso'),
106
+						'filename' => 'registrations_reports',
107
+					),
108
+				),
109
+				/*'help_tour' => array( 'Registration_Reports_Help_Tour' ),*/
110
+				'require_nonce' => false,
111
+			),
112
+			'event_registrations'   => array(
113
+				'nav'           => array(
114
+					'label'      => __('Event Check-In', 'event_espresso'),
115
+					'order'      => 10,
116
+					'persistent' => true,
117
+				),
118
+				'help_tabs'     => array(
119
+					'registrations_event_checkin_help_tab'                       => array(
120
+						'title'    => __('Registrations Event Check-In', 'event_espresso'),
121
+						'filename' => 'registrations_event_checkin',
122
+					),
123
+					'registrations_event_checkin_table_column_headings_help_tab' => array(
124
+						'title'    => __('Event Check-In Table Column Headings', 'event_espresso'),
125
+						'filename' => 'registrations_event_checkin_table_column_headings',
126
+					),
127
+					'registrations_event_checkin_filters_help_tab'               => array(
128
+						'title'    => __('Event Check-In Filters', 'event_espresso'),
129
+						'filename' => 'registrations_event_checkin_filters',
130
+					),
131
+					'registrations_event_checkin_views_help_tab'                 => array(
132
+						'title'    => __('Event Check-In Views', 'event_espresso'),
133
+						'filename' => 'registrations_event_checkin_views',
134
+					),
135
+					'registrations_event_checkin_other_help_tab'                 => array(
136
+						'title'    => __('Event Check-In Other', 'event_espresso'),
137
+						'filename' => 'registrations_event_checkin_other',
138
+					),
139
+				),
140
+				'help_tour'     => array('Event_Checkin_Help_Tour'),
141
+				'qtips'         => array('Registration_List_Table_Tips'),
142
+				'list_table'    => 'EE_Event_Registrations_List_Table',
143
+				'metaboxes'     => array(),
144
+				'require_nonce' => false,
145
+			),
146
+			'registration_checkins' => array(
147
+				'nav'           => array(
148
+					'label'      => __('Check-In Records', 'event_espresso'),
149
+					'order'      => 15,
150
+					'persistent' => false,
151
+				),
152
+				'list_table'    => 'EE_Registration_CheckIn_List_Table',
153
+				//'help_tour' => array( 'Checkin_Toggle_View_Help_Tour' ),
154
+				'metaboxes'     => array(),
155
+				'require_nonce' => false,
156
+			),
157
+		);
158
+		$this->_page_config = array_merge($this->_page_config, $new_page_config);
159
+		$this->_page_config['contact_list']['list_table'] = 'Extend_EE_Attendee_Contact_List_Table';
160
+		$this->_page_config['default']['list_table'] = 'Extend_EE_Registrations_List_Table';
161
+	}
162
+
163
+
164
+
165
+	protected function _ajax_hooks()
166
+	{
167
+		parent::_ajax_hooks();
168
+		add_action('wp_ajax_get_newsletter_form_content', array($this, 'get_newsletter_form_content'));
169
+	}
170
+
171
+
172
+
173
+	public function load_scripts_styles()
174
+	{
175
+		parent::load_scripts_styles();
176
+		//if newsletter message type is active then let's add filter and load js for it.
177
+		if (EEH_MSG_Template::is_mt_active('newsletter')) {
178
+			//enqueue newsletter js
179
+			wp_enqueue_script(
180
+				'ee-newsletter-trigger',
181
+				REG_CAF_ASSETS_URL . 'ee-newsletter-trigger.js',
182
+				array('ee-dialog'),
183
+				EVENT_ESPRESSO_VERSION,
184
+				true
185
+			);
186
+			wp_enqueue_style(
187
+				'ee-newsletter-trigger-css',
188
+				REG_CAF_ASSETS_URL . 'ee-newsletter-trigger.css',
189
+				array(),
190
+				EVENT_ESPRESSO_VERSION
191
+			);
192
+			//hook in buttons for newsletter message type trigger.
193
+			add_action(
194
+				'AHEE__EE_Admin_List_Table__extra_tablenav__after_bottom_buttons',
195
+				array($this, 'add_newsletter_action_buttons'),
196
+				10
197
+			);
198
+		}
199
+	}
200
+
201
+
202
+
203
+	public function load_scripts_styles_reports()
204
+	{
205
+		wp_register_script(
206
+			'ee-reg-reports-js',
207
+			REG_CAF_ASSETS_URL . 'ee-registration-admin-reports.js',
208
+			array('google-charts'),
209
+			EVENT_ESPRESSO_VERSION,
210
+			true
211
+		);
212
+		wp_enqueue_script('ee-reg-reports-js');
213
+		$this->_registration_reports_js_setup();
214
+	}
215
+
216
+
217
+
218
+	protected function _add_screen_options_event_registrations()
219
+	{
220
+		$this->_per_page_screen_option();
221
+	}
222
+
223
+
224
+
225
+	protected function _add_screen_options_registration_checkins()
226
+	{
227
+		$page_title = $this->_admin_page_title;
228
+		$this->_admin_page_title = __('Check-In Records', 'event_espresso');
229
+		$this->_per_page_screen_option();
230
+		$this->_admin_page_title = $page_title;
231
+	}
232
+
233
+
234
+
235
+	protected function _set_list_table_views_event_registrations()
236
+	{
237
+		$this->_views = array(
238
+			'all' => array(
239
+				'slug'        => 'all',
240
+				'label'       => __('All', 'event_espresso'),
241
+				'count'       => 0,
242
+				'bulk_action' => ! isset($this->_req_data['event_id'])
243
+					? array()
244
+					: array(
245
+						'toggle_checkin_status' => __('Toggle Check-In', 'event_espresso'),
246
+						//'trash_registrations' => __('Trash Registrations', 'event_espresso')
247
+					),
248
+			),
249
+		);
250
+	}
251
+
252
+
253
+
254
+	protected function _set_list_table_views_registration_checkins()
255
+	{
256
+		$this->_views = array(
257
+			'all' => array(
258
+				'slug'        => 'all',
259
+				'label'       => __('All', 'event_espresso'),
260
+				'count'       => 0,
261
+				'bulk_action' => array('delete_checkin_rows' => __('Delete Check-In Rows', 'event_espresso')),
262
+			),
263
+		);
264
+	}
265
+
266
+
267
+
268
+	/**
269
+	 * callback for ajax action.
270
+	 *
271
+	 * @since 4.3.0
272
+	 * @return void (JSON)
273
+	 * @throws \EE_Error
274
+	 */
275
+	public function get_newsletter_form_content()
276
+	{
277
+		//do a nonce check cause we're not coming in from an normal route here.
278
+		$nonce = isset($this->_req_data['get_newsletter_form_content_nonce']) ? sanitize_text_field(
279
+			$this->_req_data['get_newsletter_form_content_nonce']
280
+		) : '';
281
+		$nonce_ref = 'get_newsletter_form_content_nonce';
282
+		$this->_verify_nonce($nonce, $nonce_ref);
283
+		//let's get the mtp for the incoming MTP_ ID
284
+		if ( ! isset($this->_req_data['GRP_ID'])) {
285
+			EE_Error::add_error(
286
+				__(
287
+					'There must be something broken with the js or html structure because the required data for getting a message template group is not present (need an GRP_ID).',
288
+					'event_espresso'
289
+				),
290
+				__FILE__,
291
+				__FUNCTION__,
292
+				__LINE__
293
+			);
294
+			$this->_template_args['success'] = false;
295
+			$this->_template_args['error'] = true;
296
+			$this->_return_json();
297
+		}
298
+		$MTPG = EEM_Message_Template_Group::instance()->get_one_by_ID($this->_req_data['GRP_ID']);
299
+		if ( ! $MTPG instanceof EE_Message_Template_Group) {
300
+			EE_Error::add_error(
301
+				sprintf(
302
+					__(
303
+						'The GRP_ID given (%d) does not appear to have a corresponding row in the database.',
304
+						'event_espresso'
305
+					),
306
+					$this->_req_data['GRP_ID']
307
+				),
308
+				__FILE__,
309
+				__FUNCTION__,
310
+				__LINE__
311
+			);
312
+			$this->_template_args['success'] = false;
313
+			$this->_template_args['error'] = true;
314
+			$this->_return_json();
315
+		}
316
+		$MTPs = $MTPG->context_templates();
317
+		$MTPs = $MTPs['attendee'];
318
+		$template_fields = array();
319
+		/** @var EE_Message_Template $MTP */
320
+		foreach ($MTPs as $MTP) {
321
+			$field = $MTP->get('MTP_template_field');
322
+			if ($field === 'content') {
323
+				$content = $MTP->get('MTP_content');
324
+				if ( ! empty($content['newsletter_content'])) {
325
+					$template_fields['newsletter_content'] = $content['newsletter_content'];
326
+				}
327
+				continue;
328
+			}
329
+			$template_fields[$MTP->get('MTP_template_field')] = $MTP->get('MTP_content');
330
+		}
331
+		$this->_template_args['success'] = true;
332
+		$this->_template_args['error'] = false;
333
+		$this->_template_args['data'] = array(
334
+			'batch_message_from'    => isset($template_fields['from'])
335
+				? $template_fields['from']
336
+				: '',
337
+			'batch_message_subject' => isset($template_fields['subject'])
338
+				? $template_fields['subject']
339
+				: '',
340
+			'batch_message_content' => isset($template_fields['newsletter_content'])
341
+				? $template_fields['newsletter_content']
342
+				: '',
343
+		);
344
+		$this->_return_json();
345
+	}
346
+
347
+
348
+
349
+	/**
350
+	 * callback for AHEE__EE_Admin_List_Table__extra_tablenav__after_bottom_buttons action
351
+	 *
352
+	 * @since 4.3.0
353
+	 * @param EE_Admin_List_Table $list_table
354
+	 * @return void
355
+	 */
356
+	public function add_newsletter_action_buttons(EE_Admin_List_Table $list_table)
357
+	{
358
+		if ( ! EE_Registry::instance()->CAP->current_user_can(
359
+			'ee_send_message',
360
+			'espresso_registrations_newsletter_selected_send'
361
+		)
362
+		) {
363
+			return;
364
+		}
365
+		$routes_to_add_to = array(
366
+			'contact_list',
367
+			'event_registrations',
368
+			'default',
369
+		);
370
+		if ($this->_current_page === 'espresso_registrations' && in_array($this->_req_action, $routes_to_add_to)) {
371
+			if (($this->_req_action === 'event_registrations' && empty($this->_req_data['event_id']))
372
+				|| (isset($this->_req_data['status']) && $this->_req_data['status'] === 'trash')
373
+			) {
374
+				echo '';
375
+			} else {
376
+				$button_text = sprintf(
377
+					__('Send Batch Message (%s selected)', 'event_espresso'),
378
+					'<span class="send-selected-newsletter-count">0</span>'
379
+				);
380
+				echo '<button id="selected-batch-send-trigger" class="button secondary-button"><span class="dashicons dashicons-email "></span>'
381
+					 . $button_text
382
+					 . '</button>';
383
+				add_action('admin_footer', array($this, 'newsletter_send_form_skeleton'));
384
+			}
385
+		}
386
+	}
387
+
388
+
389
+
390
+	public function newsletter_send_form_skeleton()
391
+	{
392
+		$list_table = $this->_list_table_object;
393
+		$codes = array();
394
+		//need to templates for the newsletter message type for the template selector.
395
+		$values[] = array('text' => __('Select Template to Use', 'event_espresso'), 'id' => 0);
396
+		$mtps = EEM_Message_Template_Group::instance()->get_all(
397
+			array(array('MTP_message_type' => 'newsletter', 'MTP_messenger' => 'email'))
398
+		);
399
+		foreach ($mtps as $mtp) {
400
+			$name = $mtp->name();
401
+			$values[] = array(
402
+				'text' => empty($name) ? __('Global', 'event_espresso') : $name,
403
+				'id'   => $mtp->ID(),
404
+			);
405
+		}
406
+		//need to get a list of shortcodes that are available for the newsletter message type.
407
+		$shortcodes = EEH_MSG_Template::get_shortcodes('newsletter', 'email', array(), 'attendee', false);
408
+		foreach ($shortcodes as $field => $shortcode_array) {
409
+			$codes[$field] = implode(', ', array_keys($shortcode_array));
410
+		}
411
+		$shortcodes = $codes;
412
+		$form_template = REG_CAF_TEMPLATE_PATH . 'newsletter-send-form.template.php';
413
+		$form_template_args = array(
414
+			'form_action'       => admin_url('admin.php?page=espresso_registrations'),
415
+			'form_route'        => 'newsletter_selected_send',
416
+			'form_nonce_name'   => 'newsletter_selected_send_nonce',
417
+			'form_nonce'        => wp_create_nonce('newsletter_selected_send_nonce'),
418
+			'redirect_back_to'  => $this->_req_action,
419
+			'ajax_nonce'        => wp_create_nonce('get_newsletter_form_content_nonce'),
420
+			'template_selector' => EEH_Form_Fields::select_input('newsletter_mtp_selected', $values),
421
+			'shortcodes'        => $shortcodes,
422
+			'id_type'           => $list_table instanceof EE_Attendee_Contact_List_Table ? 'contact' : 'registration',
423
+		);
424
+		EEH_Template::display_template($form_template, $form_template_args);
425
+	}
426
+
427
+
428
+
429
+	/**
430
+	 * Handles sending selected registrations/contacts a newsletter.
431
+	 *
432
+	 * @since  4.3.0
433
+	 * @return void
434
+	 * @throws \EE_Error
435
+	 */
436
+	protected function _newsletter_selected_send()
437
+	{
438
+		$success = true;
439
+		//first we need to make sure we have a GRP_ID so we know what template we're sending and updating!
440
+		if (empty($this->_req_data['newsletter_mtp_selected'])) {
441
+			EE_Error::add_error(
442
+				__(
443
+					'In order to send a message, a Message Template GRP_ID is needed. It was not provided so messages were not sent.',
444
+					'event_espresso'
445
+				),
446
+				__FILE__,
447
+				__FUNCTION__,
448
+				__LINE__
449
+			);
450
+			$success = false;
451
+		}
452
+		if ($success) {
453
+			//update Message template in case there are any changes
454
+			$Message_Template_Group = EEM_Message_Template_Group::instance()->get_one_by_ID(
455
+				$this->_req_data['newsletter_mtp_selected']
456
+			);
457
+			$Message_Templates = $Message_Template_Group instanceof EE_Message_Template_Group
458
+				? $Message_Template_Group->context_templates()
459
+				: array();
460
+			if (empty($Message_Templates)) {
461
+				EE_Error::add_error(
462
+					__(
463
+						'Unable to retrieve message template fields from the db. Messages not sent.',
464
+						'event_espresso'
465
+					),
466
+					__FILE__,
467
+					__FUNCTION__,
468
+					__LINE__
469
+				);
470
+			}
471
+			//let's just update the specific fields
472
+			foreach ($Message_Templates['attendee'] as $Message_Template) {
473
+				if ($Message_Template instanceof EE_Message_Template) {
474
+					$field = $Message_Template->get('MTP_template_field');
475
+					$content = $Message_Template->get('MTP_content');
476
+					$new_content = $content;
477
+					switch ($field) {
478
+						case 'from' :
479
+							$new_content = ! empty($this->_req_data['batch_message']['from'])
480
+								? $this->_req_data['batch_message']['from']
481
+								: $content;
482
+							break;
483
+						case 'subject' :
484
+							$new_content = ! empty($this->_req_data['batch_message']['subject'])
485
+								? $this->_req_data['batch_message']['subject']
486
+								: $content;
487
+							break;
488
+						case 'content' :
489
+							$new_content = $content;
490
+							$new_content['newsletter_content'] = ! empty($this->_req_data['batch_message']['content'])
491
+								? $this->_req_data['batch_message']['content']
492
+								: $content['newsletter_content'];
493
+							break;
494
+						default :
495
+							//continue the foreach loop, we don't want to set $new_content nor save.
496
+							continue 2;
497
+					}
498
+					$Message_Template->set('MTP_content', $new_content);
499
+					$Message_Template->save();
500
+				}
501
+			}
502
+			//great fields are updated!  now let's make sure we just have contact objects (EE_Attendee).
503
+			$id_type = ! empty($this->_req_data['batch_message']['id_type'])
504
+				? $this->_req_data['batch_message']['id_type']
505
+				: 'registration';
506
+			//id_type will affect how we assemble the ids.
507
+			$ids = ! empty($this->_req_data['batch_message']['ids'])
508
+				? json_decode(stripslashes($this->_req_data['batch_message']['ids']))
509
+				: array();
510
+			$registrations_used_for_contact_data = array();
511
+			//using switch because eventually we'll have other contexts that will be used for generating messages.
512
+			switch ($id_type) {
513
+				case 'registration' :
514
+					$registrations_used_for_contact_data = EEM_Registration::instance()->get_all(
515
+						array(
516
+							array(
517
+								'REG_ID' => array('IN', $ids),
518
+							),
519
+						)
520
+					);
521
+					break;
522
+				case 'contact' :
523
+					$registrations_used_for_contact_data = EEM_Registration::instance()
524
+																		   ->get_latest_registration_for_each_of_given_contacts($ids);
525
+					break;
526
+			}
527
+			do_action(
528
+				'AHEE__Extend_Registrations_Admin_Page___newsletter_selected_send__with_registrations',
529
+				$registrations_used_for_contact_data,
530
+				$Message_Template_Group->ID()
531
+			);
532
+			//kept for backward compat, internally we no longer use this action.
533
+			//@deprecated 4.8.36.rc.002
534
+			$contacts = $id_type === 'registration'
535
+				? EEM_Attendee::instance()->get_array_of_contacts_from_reg_ids($ids)
536
+				: EEM_Attendee::instance()->get_all(array(array('ATT_ID' => array('in', $ids))));
537
+			do_action(
538
+				'AHEE__Extend_Registrations_Admin_Page___newsletter_selected_send',
539
+				$contacts,
540
+				$Message_Template_Group->ID()
541
+			);
542
+		}
543
+		$query_args = array(
544
+			'action' => ! empty($this->_req_data['redirect_back_to'])
545
+				? $this->_req_data['redirect_back_to']
546
+				: 'default',
547
+		);
548
+		$this->_redirect_after_action(false, '', '', $query_args, true);
549
+	}
550
+
551
+
552
+
553
+	/**
554
+	 * This is called when javascript is being enqueued to setup the various data needed for the reports js.
555
+	 * Also $this->{$_reports_template_data} property is set for later usage by the _registration_reports method.
556
+	 */
557
+	protected function _registration_reports_js_setup()
558
+	{
559
+		$this->_reports_template_data['admin_reports'][] = $this->_registrations_per_day_report();
560
+		$this->_reports_template_data['admin_reports'][] = $this->_registrations_per_event_report();
561
+	}
562
+
563
+
564
+
565
+	/**
566
+	 *        generates Business Reports regarding Registrations
567
+	 *
568
+	 * @access protected
569
+	 * @return void
570
+	 */
571
+	protected function _registration_reports()
572
+	{
573
+		$template_path = EE_ADMIN_TEMPLATE . 'admin_reports.template.php';
574
+		$this->_template_args['admin_page_content'] = EEH_Template::display_template(
575
+			$template_path,
576
+			$this->_reports_template_data,
577
+			true
578
+		);
579
+		// the final template wrapper
580
+		$this->display_admin_page_with_no_sidebar();
581
+	}
582
+
583
+
584
+
585
+	/**
586
+	 * Generates Business Report showing total registrations per day.
587
+	 *
588
+	 * @param string $period The period (acceptable by PHP Datetime constructor) for which the report is generated.
589
+	 * @return string
590
+	 */
591
+	private function _registrations_per_day_report($period = '-1 month')
592
+	{
593
+		$report_ID = 'reg-admin-registrations-per-day-report-dv';
594
+		$results = EEM_Registration::instance()->get_registrations_per_day_and_per_status_report($period);
595
+		$results = (array)$results;
596
+		$regs = array();
597
+		$subtitle = '';
598
+		if ($results) {
599
+			$column_titles = array();
600
+			$tracker = 0;
601
+			foreach ($results as $result) {
602
+				$report_column_values = array();
603
+				foreach ($result as $property_name => $property_value) {
604
+					$property_value = $property_name === 'Registration_REG_date' ? $property_value
605
+						: (int)$property_value;
606
+					$report_column_values[] = $property_value;
607
+					if ($tracker === 0) {
608
+						if ($property_name === 'Registration_REG_date') {
609
+							$column_titles[] = __('Date (only days with registrations are shown)', 'event_espresso');
610
+						} else {
611
+							$column_titles[] = EEH_Template::pretty_status($property_name, false, 'sentence');
612
+						}
613
+					}
614
+				}
615
+				$tracker++;
616
+				$regs[] = $report_column_values;
617
+			}
618
+			//make sure the column_titles is pushed to the beginning of the array
619
+			array_unshift($regs, $column_titles);
620
+			//setup the date range.
621
+			$DateTimeZone = new DateTimeZone(EEH_DTT_Helper::get_timezone());
622
+			$beginning_date = new DateTime("now " . $period, $DateTimeZone);
623
+			$ending_date = new DateTime("now", $DateTimeZone);
624
+			$subtitle = sprintf(
625
+				_x('For the period: %1$s to %2$s', 'Used to give date range', 'event_espresso'),
626
+				$beginning_date->format('Y-m-d'),
627
+				$ending_date->format('Y-m-d')
628
+			);
629
+		}
630
+		$report_title = __('Total Registrations per Day', 'event_espresso');
631
+		$report_params = array(
632
+			'title'     => $report_title,
633
+			'subtitle'  => $subtitle,
634
+			'id'        => $report_ID,
635
+			'regs'      => $regs,
636
+			'noResults' => empty($regs),
637
+			'noRegsMsg' => sprintf(
638
+				__(
639
+					'%sThere are currently no registration records in the last month for this report.%s',
640
+					'event_espresso'
641
+				),
642
+				'<h2>' . $report_title . '</h2><p>',
643
+				'</p>'
644
+			),
645
+		);
646
+		wp_localize_script('ee-reg-reports-js', 'regPerDay', $report_params);
647
+		return $report_ID;
648
+	}
649
+
650
+
651
+
652
+	/**
653
+	 * Generates Business Report showing total registrations per event.
654
+	 *
655
+	 * @param string $period The period (acceptable by PHP Datetime constructor) for which the report is generated.
656
+	 * @return string
657
+	 */
658
+	private function _registrations_per_event_report($period = '-1 month')
659
+	{
660
+		$report_ID = 'reg-admin-registrations-per-event-report-dv';
661
+		$results = EEM_Registration::instance()->get_registrations_per_event_and_per_status_report($period);
662
+		$results = (array)$results;
663
+		$regs = array();
664
+		$subtitle = '';
665
+		if ($results) {
666
+			$column_titles = array();
667
+			$tracker = 0;
668
+			foreach ($results as $result) {
669
+				$report_column_values = array();
670
+				foreach ($result as $property_name => $property_value) {
671
+					$property_value = $property_name === 'Registration_Event' ? wp_trim_words(
672
+						$property_value,
673
+						4,
674
+						'...'
675
+					) : (int)$property_value;
676
+					$report_column_values[] = $property_value;
677
+					if ($tracker === 0) {
678
+						if ($property_name === 'Registration_Event') {
679
+							$column_titles[] = __('Event', 'event_espresso');
680
+						} else {
681
+							$column_titles[] = EEH_Template::pretty_status($property_name, false, 'sentence');
682
+						}
683
+					}
684
+				}
685
+				$tracker++;
686
+				$regs[] = $report_column_values;
687
+			}
688
+			//make sure the column_titles is pushed to the beginning of the array
689
+			array_unshift($regs, $column_titles);
690
+			//setup the date range.
691
+			$DateTimeZone = new DateTimeZone(EEH_DTT_Helper::get_timezone());
692
+			$beginning_date = new DateTime("now " . $period, $DateTimeZone);
693
+			$ending_date = new DateTime("now", $DateTimeZone);
694
+			$subtitle = sprintf(
695
+				_x('For the period: %1$s to %2$s', 'Used to give date range', 'event_espresso'),
696
+				$beginning_date->format('Y-m-d'),
697
+				$ending_date->format('Y-m-d')
698
+			);
699
+		}
700
+		$report_title = __('Total Registrations per Event', 'event_espresso');
701
+		$report_params = array(
702
+			'title'     => $report_title,
703
+			'subtitle'  => $subtitle,
704
+			'id'        => $report_ID,
705
+			'regs'      => $regs,
706
+			'noResults' => empty($regs),
707
+			'noRegsMsg' => sprintf(
708
+				__(
709
+					'%sThere are currently no registration records in the last month for this report.%s',
710
+					'event_espresso'
711
+				),
712
+				'<h2>' . $report_title . '</h2><p>',
713
+				'</p>'
714
+			),
715
+		);
716
+		wp_localize_script('ee-reg-reports-js', 'regPerEvent', $report_params);
717
+		return $report_ID;
718
+	}
719
+
720
+
721
+
722
+	/**
723
+	 * generates HTML for the Registration Check-in list table (showing all Check-ins for a specific registration)
724
+	 *
725
+	 * @access protected
726
+	 * @return void
727
+	 * @throws \EE_Error
728
+	 */
729
+	protected function _registration_checkin_list_table()
730
+	{
731
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
732
+		$reg_id = isset($this->_req_data['_REGID']) ? $this->_req_data['_REGID'] : null;
733
+		/** @var EE_Registration $registration */
734
+		$registration = EEM_Registration::instance()->get_one_by_ID($reg_id);
735
+		$attendee = $registration->attendee();
736
+		$this->_admin_page_title .= $this->get_action_link_or_button(
737
+			'new_registration',
738
+			'add-registrant',
739
+			array('event_id' => $registration->event_ID()),
740
+			'add-new-h2'
741
+		);
742
+		$legend_items = array(
743
+			'checkin'  => array(
744
+				'class' => Extend_Registrations_Admin_Page::getCheckinStatusDashicon(
745
+					$checkin_status = EE_Checkin::status_checked_in
746
+				),
747
+				'desc'  => __('This indicates the attendee has been checked in', 'event_espresso'),
748
+			),
749
+			'checkout' => array(
750
+				'class' => Extend_Registrations_Admin_Page::getCheckinStatusDashicon(
751
+					$checkin_status = EE_Checkin::status_checked_out
752
+				),
753
+				'desc'  => __('This indicates the attendee has been checked out', 'event_espresso'),
754
+			),
755
+		);
756
+		$this->_template_args['after_list_table'] = $this->_display_legend($legend_items);
757
+		$dtt_id = isset($this->_req_data['DTT_ID']) ? $this->_req_data['DTT_ID'] : null;
758
+		/** @var EE_Datetime $datetime */
759
+		$datetime = EEM_Datetime::instance()->get_one_by_ID($dtt_id);
760
+		$datetime_label = '';
761
+		if ($datetime instanceof EE_Datetime) {
762
+			$datetime_label = $datetime->get_dtt_display_name(true);
763
+			$datetime_label .= ! empty($datetime_label)
764
+				? ' (' . $datetime->get_dtt_display_name() . ')'
765
+				: $datetime->get_dtt_display_name();
766
+		}
767
+		$datetime_link = ! empty($dtt_id) && $registration instanceof EE_Registration
768
+			? EE_Admin_Page::add_query_args_and_nonce(
769
+				array(
770
+					'action'   => 'event_registrations',
771
+					'event_id' => $registration->event_ID(),
772
+					'DTT_ID'   => $dtt_id,
773
+				),
774
+				$this->_admin_base_url
775
+			)
776
+			: '';
777
+		$datetime_link = ! empty($datetime_link)
778
+			? '<a href="' . $datetime_link . '">'
779
+			  . '<span id="checkin-dtt">'
780
+			  . $datetime_label
781
+			  . '</span></a>'
782
+			: $datetime_label;
783
+		$attendee_name = $attendee instanceof EE_Attendee
784
+			? $attendee->full_name()
785
+			: '';
786
+		$attendee_link = $attendee instanceof EE_Attendee
787
+			? $attendee->get_admin_details_link()
788
+			: '';
789
+		$attendee_link = ! empty($attendee_link)
790
+			? '<a href="' . $attendee->get_admin_details_link() . '"'
791
+			  . ' title="' . esc_html__('Click for attendee details', 'event_espresso') . '">'
792
+			  . '<span id="checkin-attendee-name">'
793
+			  . $attendee_name
794
+			  . '</span></a>'
795
+			: '';
796
+		$event_link = $registration->event() instanceof EE_Event
797
+			? $registration->event()->get_admin_details_link()
798
+			: '';
799
+		$event_link = ! empty($event_link)
800
+			? '<a href="' . $event_link . '"'
801
+			  . ' title="' . esc_html__('Click here to edit event.', 'event_espresso') . '">'
802
+			  . '<span id="checkin-event-name">'
803
+			  . $registration->event_name()
804
+			  . '</span>'
805
+			  . '</a>'
806
+			: '';
807
+		$this->_template_args['before_list_table'] = ! empty($reg_id) && ! empty($dtt_id)
808
+			? '<h2>' . sprintf(
809
+				esc_html__('Displaying check in records for %1$s for %2$s at the event, %3$s', 'event_espresso'),
810
+				$attendee_link,
811
+				$datetime_link,
812
+				$event_link
813
+			) . '</h2>'
814
+			: '';
815
+		$this->_template_args['list_table_hidden_fields'] = ! empty($reg_id)
816
+			? '<input type="hidden" name="_REGID" value="' . $reg_id . '">' : '';
817
+		$this->_template_args['list_table_hidden_fields'] .= ! empty($dtt_id)
818
+			? '<input type="hidden" name="DTT_ID" value="' . $dtt_id . '">' : '';
819
+		$this->display_admin_list_table_page_with_no_sidebar();
820
+	}
821
+
822
+
823
+
824
+	/**
825
+	 * toggle the Check-in status for the given registration (coming from ajax)
826
+	 *
827
+	 * @return void (JSON)
828
+	 */
829
+	public function toggle_checkin_status()
830
+	{
831
+		//first make sure we have the necessary data
832
+		if ( ! isset($this->_req_data['_regid'])) {
833
+			EE_Error::add_error(
834
+				__(
835
+					'There must be something broken with the html structure because the required data for toggling the Check-in status is not being sent via ajax',
836
+					'event_espresso'
837
+				),
838
+				__FILE__,
839
+				__FUNCTION__,
840
+				__LINE__
841
+			);
842
+			$this->_template_args['success'] = false;
843
+			$this->_template_args['error'] = true;
844
+			$this->_return_json();
845
+		};
846
+		//do a nonce check cause we're not coming in from an normal route here.
847
+		$nonce = isset($this->_req_data['checkinnonce']) ? sanitize_text_field($this->_req_data['checkinnonce'])
848
+			: '';
849
+		$nonce_ref = 'checkin_nonce';
850
+		$this->_verify_nonce($nonce, $nonce_ref);
851
+		//beautiful! Made it this far so let's get the status.
852
+		$new_status = Extend_Registrations_Admin_Page::getCheckinStatusDashicon(
853
+			$this->_toggle_checkin_status()
854
+		);
855
+		//setup new class to return via ajax
856
+		$this->_template_args['admin_page_content'] = 'clickable trigger-checkin ' . $new_status;
857
+		$this->_template_args['success'] = true;
858
+		$this->_return_json();
859
+	}
860
+
861
+
862
+
863
+	/**
864
+	 * handles toggling the checkin status for the registration,
865
+	 *
866
+	 * @access protected
867
+	 * @return int|void
868
+	 */
869
+	protected function _toggle_checkin_status()
870
+	{
871
+		//first let's get the query args out of the way for the redirect
872
+		$query_args = array(
873
+			'action'   => 'event_registrations',
874
+			'event_id' => isset($this->_req_data['event_id']) ? $this->_req_data['event_id'] : null,
875
+			'DTT_ID'   => isset($this->_req_data['DTT_ID']) ? $this->_req_data['DTT_ID'] : null,
876
+		);
877
+		$new_status = false;
878
+		// bulk action check in toggle
879
+		if ( ! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
880
+			// cycle thru checkboxes
881
+			while (list($REG_ID, $value) = each($this->_req_data['checkbox'])) {
882
+				$DTT_ID = isset($this->_req_data['DTT_ID']) ? $this->_req_data['DTT_ID'] : null;
883
+				$new_status = $this->_toggle_checkin($REG_ID, $DTT_ID);
884
+			}
885
+		} elseif (isset($this->_req_data['_regid'])) {
886
+			//coming from ajax request
887
+			$DTT_ID = isset($this->_req_data['dttid']) ? $this->_req_data['dttid'] : null;
888
+			$query_args['DTT_ID'] = $DTT_ID;
889
+			$new_status = $this->_toggle_checkin($this->_req_data['_regid'], $DTT_ID);
890
+		} else {
891
+			EE_Error::add_error(
892
+				__('Missing some required data to toggle the Check-in', 'event_espresso'),
893
+				__FILE__,
894
+				__FUNCTION__,
895
+				__LINE__
896
+			);
897
+		}
898
+		if (defined('DOING_AJAX')) {
899
+			return $new_status;
900
+		}
901
+		$this->_redirect_after_action(false, '', '', $query_args, true);
902
+	}
903
+
904
+
905
+
906
+	/**
907
+	 * This is toggles a single Check-in for the given registration and datetime.
908
+	 *
909
+	 * @param  int $REG_ID The registration we're toggling
910
+	 * @param  int $DTT_ID The datetime we're toggling
911
+	 * @return int            The new status toggled to.
912
+	 * @throws \EE_Error
913
+	 */
914
+	private function _toggle_checkin($REG_ID, $DTT_ID)
915
+	{
916
+		/** @var EE_Registration $REG */
917
+		$REG = EEM_Registration::instance()->get_one_by_ID($REG_ID);
918
+		$new_status = $REG->toggle_checkin_status($DTT_ID);
919
+		if ($new_status !== false) {
920
+			EE_Error::add_success($REG->get_checkin_msg($DTT_ID));
921
+		} else {
922
+			EE_Error::add_error($REG->get_checkin_msg($DTT_ID, true), __FILE__, __FUNCTION__, __LINE__);
923
+			$new_status = false;
924
+		}
925
+		return $new_status;
926
+	}
927
+
928
+
929
+
930
+	/**
931
+	 * Takes care of deleting multiple EE_Checkin table rows
932
+	 *
933
+	 * @access protected
934
+	 * @return void
935
+	 * @throws \EE_Error
936
+	 */
937
+	protected function _delete_checkin_rows()
938
+	{
939
+		$query_args = array(
940
+			'action' => 'registration_checkins',
941
+			'DTT_ID' => isset($this->_req_data['DTT_ID']) ? $this->_req_data['DTT_ID'] : 0,
942
+			'_REGID' => isset($this->_req_data['_REGID']) ? $this->_req_data['_REGID'] : 0,
943
+		);
944
+		$errors = 0;
945
+		if ( ! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
946
+			while (list($CHK_ID, $value) = each($this->_req_data['checkbox'])) {
947
+				if ( ! EEM_Checkin::instance()->delete_by_ID($CHK_ID)) {
948
+					$errors++;
949
+				}
950
+			}
951
+		} else {
952
+			EE_Error::add_error(
953
+				__(
954
+					'So, something went wrong with the bulk delete because there was no data received for instructions on WHAT to delete!',
955
+					'event_espresso'
956
+				),
957
+				__FILE__,
958
+				__FUNCTION__,
959
+				__LINE__
960
+			);
961
+			$this->_redirect_after_action(false, '', '', $query_args, true);
962
+		}
963
+		if ($errors > 0) {
964
+			EE_Error::add_error(
965
+				sprintf(__('There were %d records that did not delete successfully', 'event_espresso'), $errors),
966
+				__FILE__,
967
+				__FUNCTION__,
968
+				__LINE__
969
+			);
970
+		} else {
971
+			EE_Error::add_success(__('Records were successfully deleted', 'event_espresso'));
972
+		}
973
+		$this->_redirect_after_action(false, '', '', $query_args, true);
974
+	}
975
+
976
+
977
+
978
+	/**
979
+	 * Deletes a single EE_Checkin row
980
+	 *
981
+	 * @return void
982
+	 * @throws \EE_Error
983
+	 */
984
+	protected function _delete_checkin_row()
985
+	{
986
+		$query_args = array(
987
+			'action' => 'registration_checkins',
988
+			'DTT_ID' => isset($this->_req_data['DTT_ID']) ? $this->_req_data['DTT_ID'] : 0,
989
+			'_REGID' => isset($this->_req_data['_REGID']) ? $this->_req_data['_REGID'] : 0,
990
+		);
991
+		if ( ! empty($this->_req_data['CHK_ID'])) {
992
+			if ( ! EEM_Checkin::instance()->delete_by_ID($this->_req_data['CHK_ID'])) {
993
+				EE_Error::add_error(
994
+					__('Something went wrong and this check-in record was not deleted', 'event_espresso'),
995
+					__FILE__,
996
+					__FUNCTION__,
997
+					__LINE__
998
+				);
999
+			} else {
1000
+				EE_Error::add_success(__('Check-In record successfully deleted', 'event_espresso'));
1001
+			}
1002
+		} else {
1003
+			EE_Error::add_error(
1004
+				__(
1005
+					'In order to delete a Check-in record, there must be a Check-In ID available. There is not. It is not your fault, there is just a gremlin living in the code',
1006
+					'event_espresso'
1007
+				),
1008
+				__FILE__,
1009
+				__FUNCTION__,
1010
+				__LINE__
1011
+			);
1012
+		}
1013
+		$this->_redirect_after_action(false, '', '', $query_args, true);
1014
+	}
1015
+
1016
+
1017
+
1018
+	/**
1019
+	 *        generates HTML for the Event Registrations List Table
1020
+	 *
1021
+	 * @access protected
1022
+	 * @return void
1023
+	 * @throws \EE_Error
1024
+	 */
1025
+	protected function _event_registrations_list_table()
1026
+	{
1027
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
1028
+		$this->_admin_page_title .= isset($this->_req_data['event_id'])
1029
+			? $this->get_action_link_or_button(
1030
+				'new_registration',
1031
+				'add-registrant',
1032
+				array('event_id' => $this->_req_data['event_id']),
1033
+				'add-new-h2',
1034
+				'',
1035
+				false
1036
+			)
1037
+			: '';
1038
+		$legend_items = array(
1039
+			'star-icon'        => array(
1040
+				'class' => 'dashicons dashicons-star-filled lt-blue-icon ee-icon-size-8',
1041
+				'desc'  => __('This Registrant is the Primary Registrant', 'event_espresso'),
1042
+			),
1043
+			'checkin'          => array(
1044
+				'class' => Extend_Registrations_Admin_Page::getCheckinStatusDashicon(
1045
+					$checkin_status = EE_Checkin::status_checked_in
1046
+				),
1047
+				'desc'  => __('This Registrant has been Checked In', 'event_espresso'),
1048
+			),
1049
+			'checkout'         => array(
1050
+				'class' => Extend_Registrations_Admin_Page::getCheckinStatusDashicon(
1051
+					$checkin_status = EE_Checkin::status_checked_out
1052
+				),
1053
+				'desc'  => __('This Registrant has been Checked Out', 'event_espresso'),
1054
+			),
1055
+			'nocheckinrecord'  => array(
1056
+				'class' => Extend_Registrations_Admin_Page::getCheckinStatusDashicon(
1057
+					$checkin_status = EE_Checkin::status_checked_never
1058
+				),
1059
+				'desc'  => __('No Check-in Record has been Created for this Registrant', 'event_espresso'),
1060
+			),
1061
+			'view_details'     => array(
1062
+				'class' => 'dashicons dashicons-search',
1063
+				'desc'  => __('View All Check-in Records for this Registrant', 'event_espresso'),
1064
+			),
1065
+			'approved_status'  => array(
1066
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_approved,
1067
+				'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_approved, false, 'sentence'),
1068
+			),
1069
+			'cancelled_status' => array(
1070
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_cancelled,
1071
+				'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_cancelled, false, 'sentence'),
1072
+			),
1073
+			'declined_status'  => array(
1074
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_declined,
1075
+				'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_declined, false, 'sentence'),
1076
+			),
1077
+			'not_approved'     => array(
1078
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_not_approved,
1079
+				'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_not_approved, false, 'sentence'),
1080
+			),
1081
+			'pending_status'   => array(
1082
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_pending_payment,
1083
+				'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_pending_payment, false, 'sentence'),
1084
+			),
1085
+			'wait_list'        => array(
1086
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_wait_list,
1087
+				'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_wait_list, false, 'sentence'),
1088
+			),
1089
+		);
1090
+		$this->_template_args['after_list_table'] = $this->_display_legend($legend_items);
1091
+		$event_id = isset($this->_req_data['event_id']) ? $this->_req_data['event_id'] : null;
1092
+		$this->_template_args['before_list_table'] = ! empty($event_id)
1093
+			? '<h2>' . sprintf(
1094
+				__('Viewing Registrations for Event: %s', 'event_espresso'),
1095
+				EEM_Event::instance()->get_one_by_ID($event_id)->get('EVT_name')
1096
+			) . '</h2>'
1097
+			: '';
1098
+		//need to get the number of datetimes on the event and set default datetime_id if there is only one datetime on the event.
1099
+		/** @var EE_Event $event */
1100
+		$event = EEM_Event::instance()->get_one_by_ID($event_id);
1101
+		$DTT_ID = ! empty($this->_req_data['DTT_ID']) ? absint($this->_req_data['DTT_ID']) : 0;
1102
+		$datetime = null;
1103
+		if ($event instanceof EE_Event) {
1104
+			$datetimes_on_event = $event->datetimes();
1105
+			if (count($datetimes_on_event) === 1) {
1106
+				$datetime = reset($datetimes_on_event);
1107
+			}
1108
+		}
1109
+		$datetime = $datetime instanceof EE_Datetime ? $datetime : EEM_Datetime::instance()->get_one_by_ID($DTT_ID);
1110
+		if ($datetime instanceof EE_Datetime && $this->_template_args['before_list_table'] !== '') {
1111
+			$this->_template_args['before_list_table'] = substr($this->_template_args['before_list_table'], 0, -5);
1112
+			$this->_template_args['before_list_table'] .= ' &nbsp;<span class="drk-grey-text">';
1113
+			$this->_template_args['before_list_table'] .= '<span class="dashicons dashicons-calendar"></span>';
1114
+			$this->_template_args['before_list_table'] .= $datetime->name();
1115
+			$this->_template_args['before_list_table'] .= ' ( ' . $datetime->date_and_time_range() . ' )';
1116
+			$this->_template_args['before_list_table'] .= '</span></h2>';
1117
+		}
1118
+		//if no datetime, then we're on the initial view, so let's give some helpful instructions on what the status column
1119
+		//represents
1120
+		if ( ! $datetime instanceof EE_Datetime) {
1121
+			$this->_template_args['before_list_table'] .= '<br><p class="description">'
1122
+														  . __('In this view, the check-in status represents the latest check-in record for the registration in that row.',
1123
+					'event_espresso')
1124
+														  . '</p>';
1125
+		}
1126
+		$this->display_admin_list_table_page_with_no_sidebar();
1127
+	}
1128
+
1129
+	/**
1130
+	 * Download the registrations check-in report (same as the normal registration report, but with different where
1131
+	 * conditions)
1132
+	 *
1133
+	 * @return void ends the request by a redirect or download
1134
+	 */
1135
+	public function _registrations_checkin_report()
1136
+	{
1137
+		$this->_registrations_report_base('_get_checkin_query_params_from_request');
1138
+	}
1139
+
1140
+	/**
1141
+	 * Gets the query params from the request, plus adds a where condition for the registration status,
1142
+	 * because on the checkin page we only ever want to see approved and pending-approval registrations
1143
+	 *
1144
+	 * @param array     $request
1145
+	 * @param int  $per_page
1146
+	 * @param bool $count
1147
+	 * @return array
1148
+	 */
1149
+	protected function _get_checkin_query_params_from_request(
1150
+		$request,
1151
+		$per_page = 10,
1152
+		$count = false
1153
+	) {
1154
+		$query_params = $this->_get_registration_query_parameters($request, $per_page, $count);
1155
+		//unlike the regular registrations list table,
1156
+		$status_ids_array = apply_filters(
1157
+			'FHEE__Extend_Registrations_Admin_Page__get_event_attendees__status_ids_array',
1158
+			array(EEM_Registration::status_id_pending_payment, EEM_Registration::status_id_approved)
1159
+		);
1160
+		$query_params[0]['STS_ID'] = array('IN', $status_ids_array);
1161
+		return $query_params;
1162
+	}
1163
+
1164
+
1165
+
1166
+
1167
+	/**
1168
+	 * Gets registrations for an event
1169
+	 *
1170
+	 * @param int    $per_page
1171
+	 * @param bool   $count whether to return count or data.
1172
+	 * @param bool   $trash
1173
+	 * @param string $orderby
1174
+	 * @return EE_Registration[]|int
1175
+	 * @throws \EE_Error
1176
+	 */
1177
+	public function get_event_attendees($per_page = 10, $count = false, $trash = false, $orderby = 'ATT_fname')
1178
+	{
1179
+		//normalize some request params that get setup by the parent `get_registrations` method.
1180
+		$request = $this->_req_data;
1181
+		$request['orderby'] = ! empty($this->_req_data['orderby']) ? $this->_req_data['orderby'] : $orderby;
1182
+		$request['order'] =  ! empty($this->_req_data['order']) ? $this->_req_data['order'] : 'ASC';
1183
+		if($trash){
1184
+			$request['status'] = 'trash';
1185
+		}
1186
+		$query_params = $this->_get_checkin_query_params_from_request( $request, $per_page, $count );
1187
+		/**
1188
+		 * Override the default groupby added by EEM_Base so that sorts with multiple order bys work as expected
1189
+		 * @link https://events.codebasehq.com/projects/event-espresso/tickets/10093
1190
+		 * @see EEM_Base::get_all()
1191
+		 */
1192
+		$query_params['group_by'] = '';
1193
+
1194
+		return $count
1195
+			? EEM_Registration::instance()->count($query_params)
1196
+			/** @type EE_Registration[] */
1197
+			: EEM_Registration::instance()->get_all($query_params);
1198
+	}
1199 1199
 
1200 1200
 
1201 1201
 } //end class Registrations Admin Page
Please login to merge, or discard this patch.
Spacing   +40 added lines, -40 removed lines patch added patch discarded remove patch
@@ -35,9 +35,9 @@  discard block
 block discarded – undo
35 35
     {
36 36
         parent::__construct($routing);
37 37
         if ( ! defined('REG_CAF_TEMPLATE_PATH')) {
38
-            define('REG_CAF_TEMPLATE_PATH', EE_CORE_CAF_ADMIN_EXTEND . 'registrations/templates/');
39
-            define('REG_CAF_ASSETS', EE_CORE_CAF_ADMIN_EXTEND . 'registrations/assets/');
40
-            define('REG_CAF_ASSETS_URL', EE_CORE_CAF_ADMIN_EXTEND_URL . 'registrations/assets/');
38
+            define('REG_CAF_TEMPLATE_PATH', EE_CORE_CAF_ADMIN_EXTEND.'registrations/templates/');
39
+            define('REG_CAF_ASSETS', EE_CORE_CAF_ADMIN_EXTEND.'registrations/assets/');
40
+            define('REG_CAF_ASSETS_URL', EE_CORE_CAF_ADMIN_EXTEND_URL.'registrations/assets/');
41 41
         }
42 42
     }
43 43
 
@@ -45,7 +45,7 @@  discard block
 block discarded – undo
45 45
 
46 46
     protected function _extend_page_config()
47 47
     {
48
-        $this->_admin_base_path = EE_CORE_CAF_ADMIN_EXTEND . 'registrations';
48
+        $this->_admin_base_path = EE_CORE_CAF_ADMIN_EXTEND.'registrations';
49 49
         $reg_id = ! empty($this->_req_data['_REG_ID']) && ! is_array($this->_req_data['_REG_ID'])
50 50
             ? $this->_req_data['_REG_ID']
51 51
             : 0;
@@ -178,14 +178,14 @@  discard block
 block discarded – undo
178 178
             //enqueue newsletter js
179 179
             wp_enqueue_script(
180 180
                 'ee-newsletter-trigger',
181
-                REG_CAF_ASSETS_URL . 'ee-newsletter-trigger.js',
181
+                REG_CAF_ASSETS_URL.'ee-newsletter-trigger.js',
182 182
                 array('ee-dialog'),
183 183
                 EVENT_ESPRESSO_VERSION,
184 184
                 true
185 185
             );
186 186
             wp_enqueue_style(
187 187
                 'ee-newsletter-trigger-css',
188
-                REG_CAF_ASSETS_URL . 'ee-newsletter-trigger.css',
188
+                REG_CAF_ASSETS_URL.'ee-newsletter-trigger.css',
189 189
                 array(),
190 190
                 EVENT_ESPRESSO_VERSION
191 191
             );
@@ -204,7 +204,7 @@  discard block
 block discarded – undo
204 204
     {
205 205
         wp_register_script(
206 206
             'ee-reg-reports-js',
207
-            REG_CAF_ASSETS_URL . 'ee-registration-admin-reports.js',
207
+            REG_CAF_ASSETS_URL.'ee-registration-admin-reports.js',
208 208
             array('google-charts'),
209 209
             EVENT_ESPRESSO_VERSION,
210 210
             true
@@ -409,7 +409,7 @@  discard block
 block discarded – undo
409 409
             $codes[$field] = implode(', ', array_keys($shortcode_array));
410 410
         }
411 411
         $shortcodes = $codes;
412
-        $form_template = REG_CAF_TEMPLATE_PATH . 'newsletter-send-form.template.php';
412
+        $form_template = REG_CAF_TEMPLATE_PATH.'newsletter-send-form.template.php';
413 413
         $form_template_args = array(
414 414
             'form_action'       => admin_url('admin.php?page=espresso_registrations'),
415 415
             'form_route'        => 'newsletter_selected_send',
@@ -570,7 +570,7 @@  discard block
 block discarded – undo
570 570
      */
571 571
     protected function _registration_reports()
572 572
     {
573
-        $template_path = EE_ADMIN_TEMPLATE . 'admin_reports.template.php';
573
+        $template_path = EE_ADMIN_TEMPLATE.'admin_reports.template.php';
574 574
         $this->_template_args['admin_page_content'] = EEH_Template::display_template(
575 575
             $template_path,
576 576
             $this->_reports_template_data,
@@ -592,7 +592,7 @@  discard block
 block discarded – undo
592 592
     {
593 593
         $report_ID = 'reg-admin-registrations-per-day-report-dv';
594 594
         $results = EEM_Registration::instance()->get_registrations_per_day_and_per_status_report($period);
595
-        $results = (array)$results;
595
+        $results = (array) $results;
596 596
         $regs = array();
597 597
         $subtitle = '';
598 598
         if ($results) {
@@ -602,7 +602,7 @@  discard block
 block discarded – undo
602 602
                 $report_column_values = array();
603 603
                 foreach ($result as $property_name => $property_value) {
604 604
                     $property_value = $property_name === 'Registration_REG_date' ? $property_value
605
-                        : (int)$property_value;
605
+                        : (int) $property_value;
606 606
                     $report_column_values[] = $property_value;
607 607
                     if ($tracker === 0) {
608 608
                         if ($property_name === 'Registration_REG_date') {
@@ -619,7 +619,7 @@  discard block
 block discarded – undo
619 619
             array_unshift($regs, $column_titles);
620 620
             //setup the date range.
621 621
             $DateTimeZone = new DateTimeZone(EEH_DTT_Helper::get_timezone());
622
-            $beginning_date = new DateTime("now " . $period, $DateTimeZone);
622
+            $beginning_date = new DateTime("now ".$period, $DateTimeZone);
623 623
             $ending_date = new DateTime("now", $DateTimeZone);
624 624
             $subtitle = sprintf(
625 625
                 _x('For the period: %1$s to %2$s', 'Used to give date range', 'event_espresso'),
@@ -639,7 +639,7 @@  discard block
 block discarded – undo
639 639
                     '%sThere are currently no registration records in the last month for this report.%s',
640 640
                     'event_espresso'
641 641
                 ),
642
-                '<h2>' . $report_title . '</h2><p>',
642
+                '<h2>'.$report_title.'</h2><p>',
643 643
                 '</p>'
644 644
             ),
645 645
         );
@@ -659,7 +659,7 @@  discard block
 block discarded – undo
659 659
     {
660 660
         $report_ID = 'reg-admin-registrations-per-event-report-dv';
661 661
         $results = EEM_Registration::instance()->get_registrations_per_event_and_per_status_report($period);
662
-        $results = (array)$results;
662
+        $results = (array) $results;
663 663
         $regs = array();
664 664
         $subtitle = '';
665 665
         if ($results) {
@@ -672,7 +672,7 @@  discard block
 block discarded – undo
672 672
                         $property_value,
673 673
                         4,
674 674
                         '...'
675
-                    ) : (int)$property_value;
675
+                    ) : (int) $property_value;
676 676
                     $report_column_values[] = $property_value;
677 677
                     if ($tracker === 0) {
678 678
                         if ($property_name === 'Registration_Event') {
@@ -689,7 +689,7 @@  discard block
 block discarded – undo
689 689
             array_unshift($regs, $column_titles);
690 690
             //setup the date range.
691 691
             $DateTimeZone = new DateTimeZone(EEH_DTT_Helper::get_timezone());
692
-            $beginning_date = new DateTime("now " . $period, $DateTimeZone);
692
+            $beginning_date = new DateTime("now ".$period, $DateTimeZone);
693 693
             $ending_date = new DateTime("now", $DateTimeZone);
694 694
             $subtitle = sprintf(
695 695
                 _x('For the period: %1$s to %2$s', 'Used to give date range', 'event_espresso'),
@@ -709,7 +709,7 @@  discard block
 block discarded – undo
709 709
                     '%sThere are currently no registration records in the last month for this report.%s',
710 710
                     'event_espresso'
711 711
                 ),
712
-                '<h2>' . $report_title . '</h2><p>',
712
+                '<h2>'.$report_title.'</h2><p>',
713 713
                 '</p>'
714 714
             ),
715 715
         );
@@ -761,7 +761,7 @@  discard block
 block discarded – undo
761 761
         if ($datetime instanceof EE_Datetime) {
762 762
             $datetime_label = $datetime->get_dtt_display_name(true);
763 763
             $datetime_label .= ! empty($datetime_label)
764
-                ? ' (' . $datetime->get_dtt_display_name() . ')'
764
+                ? ' ('.$datetime->get_dtt_display_name().')'
765 765
                 : $datetime->get_dtt_display_name();
766 766
         }
767 767
         $datetime_link = ! empty($dtt_id) && $registration instanceof EE_Registration
@@ -775,7 +775,7 @@  discard block
 block discarded – undo
775 775
             )
776 776
             : '';
777 777
         $datetime_link = ! empty($datetime_link)
778
-            ? '<a href="' . $datetime_link . '">'
778
+            ? '<a href="'.$datetime_link.'">'
779 779
               . '<span id="checkin-dtt">'
780 780
               . $datetime_label
781 781
               . '</span></a>'
@@ -787,8 +787,8 @@  discard block
 block discarded – undo
787 787
             ? $attendee->get_admin_details_link()
788 788
             : '';
789 789
         $attendee_link = ! empty($attendee_link)
790
-            ? '<a href="' . $attendee->get_admin_details_link() . '"'
791
-              . ' title="' . esc_html__('Click for attendee details', 'event_espresso') . '">'
790
+            ? '<a href="'.$attendee->get_admin_details_link().'"'
791
+              . ' title="'.esc_html__('Click for attendee details', 'event_espresso').'">'
792 792
               . '<span id="checkin-attendee-name">'
793 793
               . $attendee_name
794 794
               . '</span></a>'
@@ -797,25 +797,25 @@  discard block
 block discarded – undo
797 797
             ? $registration->event()->get_admin_details_link()
798 798
             : '';
799 799
         $event_link = ! empty($event_link)
800
-            ? '<a href="' . $event_link . '"'
801
-              . ' title="' . esc_html__('Click here to edit event.', 'event_espresso') . '">'
800
+            ? '<a href="'.$event_link.'"'
801
+              . ' title="'.esc_html__('Click here to edit event.', 'event_espresso').'">'
802 802
               . '<span id="checkin-event-name">'
803 803
               . $registration->event_name()
804 804
               . '</span>'
805 805
               . '</a>'
806 806
             : '';
807 807
         $this->_template_args['before_list_table'] = ! empty($reg_id) && ! empty($dtt_id)
808
-            ? '<h2>' . sprintf(
808
+            ? '<h2>'.sprintf(
809 809
                 esc_html__('Displaying check in records for %1$s for %2$s at the event, %3$s', 'event_espresso'),
810 810
                 $attendee_link,
811 811
                 $datetime_link,
812 812
                 $event_link
813
-            ) . '</h2>'
813
+            ).'</h2>'
814 814
             : '';
815 815
         $this->_template_args['list_table_hidden_fields'] = ! empty($reg_id)
816
-            ? '<input type="hidden" name="_REGID" value="' . $reg_id . '">' : '';
816
+            ? '<input type="hidden" name="_REGID" value="'.$reg_id.'">' : '';
817 817
         $this->_template_args['list_table_hidden_fields'] .= ! empty($dtt_id)
818
-            ? '<input type="hidden" name="DTT_ID" value="' . $dtt_id . '">' : '';
818
+            ? '<input type="hidden" name="DTT_ID" value="'.$dtt_id.'">' : '';
819 819
         $this->display_admin_list_table_page_with_no_sidebar();
820 820
     }
821 821
 
@@ -853,7 +853,7 @@  discard block
 block discarded – undo
853 853
             $this->_toggle_checkin_status()
854 854
         );
855 855
         //setup new class to return via ajax
856
-        $this->_template_args['admin_page_content'] = 'clickable trigger-checkin ' . $new_status;
856
+        $this->_template_args['admin_page_content'] = 'clickable trigger-checkin '.$new_status;
857 857
         $this->_template_args['success'] = true;
858 858
         $this->_return_json();
859 859
     }
@@ -1063,37 +1063,37 @@  discard block
 block discarded – undo
1063 1063
                 'desc'  => __('View All Check-in Records for this Registrant', 'event_espresso'),
1064 1064
             ),
1065 1065
             'approved_status'  => array(
1066
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_approved,
1066
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_approved,
1067 1067
                 'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_approved, false, 'sentence'),
1068 1068
             ),
1069 1069
             'cancelled_status' => array(
1070
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_cancelled,
1070
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_cancelled,
1071 1071
                 'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_cancelled, false, 'sentence'),
1072 1072
             ),
1073 1073
             'declined_status'  => array(
1074
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_declined,
1074
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_declined,
1075 1075
                 'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_declined, false, 'sentence'),
1076 1076
             ),
1077 1077
             'not_approved'     => array(
1078
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_not_approved,
1078
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_not_approved,
1079 1079
                 'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_not_approved, false, 'sentence'),
1080 1080
             ),
1081 1081
             'pending_status'   => array(
1082
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_pending_payment,
1082
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_pending_payment,
1083 1083
                 'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_pending_payment, false, 'sentence'),
1084 1084
             ),
1085 1085
             'wait_list'        => array(
1086
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_wait_list,
1086
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_wait_list,
1087 1087
                 'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_wait_list, false, 'sentence'),
1088 1088
             ),
1089 1089
         );
1090 1090
         $this->_template_args['after_list_table'] = $this->_display_legend($legend_items);
1091 1091
         $event_id = isset($this->_req_data['event_id']) ? $this->_req_data['event_id'] : null;
1092 1092
         $this->_template_args['before_list_table'] = ! empty($event_id)
1093
-            ? '<h2>' . sprintf(
1093
+            ? '<h2>'.sprintf(
1094 1094
                 __('Viewing Registrations for Event: %s', 'event_espresso'),
1095 1095
                 EEM_Event::instance()->get_one_by_ID($event_id)->get('EVT_name')
1096
-            ) . '</h2>'
1096
+            ).'</h2>'
1097 1097
             : '';
1098 1098
         //need to get the number of datetimes on the event and set default datetime_id if there is only one datetime on the event.
1099 1099
         /** @var EE_Event $event */
@@ -1112,7 +1112,7 @@  discard block
 block discarded – undo
1112 1112
             $this->_template_args['before_list_table'] .= ' &nbsp;<span class="drk-grey-text">';
1113 1113
             $this->_template_args['before_list_table'] .= '<span class="dashicons dashicons-calendar"></span>';
1114 1114
             $this->_template_args['before_list_table'] .= $datetime->name();
1115
-            $this->_template_args['before_list_table'] .= ' ( ' . $datetime->date_and_time_range() . ' )';
1115
+            $this->_template_args['before_list_table'] .= ' ( '.$datetime->date_and_time_range().' )';
1116 1116
             $this->_template_args['before_list_table'] .= '</span></h2>';
1117 1117
         }
1118 1118
         //if no datetime, then we're on the initial view, so let's give some helpful instructions on what the status column
@@ -1179,11 +1179,11 @@  discard block
 block discarded – undo
1179 1179
         //normalize some request params that get setup by the parent `get_registrations` method.
1180 1180
         $request = $this->_req_data;
1181 1181
         $request['orderby'] = ! empty($this->_req_data['orderby']) ? $this->_req_data['orderby'] : $orderby;
1182
-        $request['order'] =  ! empty($this->_req_data['order']) ? $this->_req_data['order'] : 'ASC';
1183
-        if($trash){
1182
+        $request['order'] = ! empty($this->_req_data['order']) ? $this->_req_data['order'] : 'ASC';
1183
+        if ($trash) {
1184 1184
             $request['status'] = 'trash';
1185 1185
         }
1186
-        $query_params = $this->_get_checkin_query_params_from_request( $request, $per_page, $count );
1186
+        $query_params = $this->_get_checkin_query_params_from_request($request, $per_page, $count);
1187 1187
         /**
1188 1188
          * Override the default groupby added by EEM_Base so that sorts with multiple order bys work as expected
1189 1189
          * @link https://events.codebasehq.com/projects/event-espresso/tickets/10093
Please login to merge, or discard this patch.
core/db_classes/EE_Checkin.class.php 1 patch
Indentation   +84 added lines, -84 removed lines patch added patch discarded remove patch
@@ -13,88 +13,88 @@
 block discarded – undo
13 13
 {
14 14
 
15 15
 
16
-    /**
17
-     * Used to reference when a registration has been checked out.
18
-     *
19
-     * @type int
20
-     */
21
-    const status_checked_out = 0;
22
-
23
-    /**
24
-     * Used to reference when a registration has been checked in.
25
-     *
26
-     * @type int
27
-     */
28
-    const status_checked_in = 1;
29
-
30
-    /**
31
-     * Used to reference when a registration has never been checked in.
32
-     *
33
-     * @type int
34
-     */
35
-    const status_checked_never = 2;
36
-
37
-
38
-
39
-    /**
40
-     *
41
-     * @param array  $props_n_values    incoming values
42
-     * @param string $timezone          incoming timezone (if not set the timezone set for the website will be used.)
43
-     * @param array  $date_formats      incoming date_formats in an array
44
-     *                                  where the first value is the date_format
45
-     *                                  and the second value is the time format
46
-     * @return EE_Checkin
47
-     * @throws EE_Error
48
-     */
49
-    public static function new_instance($props_n_values = array(), $timezone = null, $date_formats = array())
50
-    {
51
-        $has_object = parent::_check_for_object($props_n_values, __CLASS__, $timezone, $date_formats);
52
-        return $has_object
53
-            ? $has_object
54
-            : new self($props_n_values, false, $timezone, $date_formats);
55
-    }
56
-
57
-
58
-
59
-    /**
60
-     * @param array  $props_n_values  incoming values from the database
61
-     * @param string $timezone        incoming timezone as set by the model.  If not set the timezone for
62
-     *                                the website will be used.
63
-     * @return EE_Checkin
64
-     * @throws EE_Error
65
-     */
66
-    public static function new_instance_from_db($props_n_values = array(), $timezone = null)
67
-    {
68
-        return new self($props_n_values, true, $timezone);
69
-    }
70
-
71
-
72
-    public function ID()
73
-    {
74
-        return $this->get('CHK_ID');
75
-    }
76
-
77
-
78
-    public function registration_id()
79
-    {
80
-        return $this->get('REG_ID');
81
-    }
82
-
83
-
84
-    public function datetime_id()
85
-    {
86
-        return $this->get('DTT_ID');
87
-    }
88
-
89
-
90
-    public function status()
91
-    {
92
-        return $this->get('CHK_in');
93
-    }
94
-
95
-
96
-    public function timestamp()
97
-    {
98
-        return $this->get('CHK_timestamp');
99
-    }
16
+	/**
17
+	 * Used to reference when a registration has been checked out.
18
+	 *
19
+	 * @type int
20
+	 */
21
+	const status_checked_out = 0;
22
+
23
+	/**
24
+	 * Used to reference when a registration has been checked in.
25
+	 *
26
+	 * @type int
27
+	 */
28
+	const status_checked_in = 1;
29
+
30
+	/**
31
+	 * Used to reference when a registration has never been checked in.
32
+	 *
33
+	 * @type int
34
+	 */
35
+	const status_checked_never = 2;
36
+
37
+
38
+
39
+	/**
40
+	 *
41
+	 * @param array  $props_n_values    incoming values
42
+	 * @param string $timezone          incoming timezone (if not set the timezone set for the website will be used.)
43
+	 * @param array  $date_formats      incoming date_formats in an array
44
+	 *                                  where the first value is the date_format
45
+	 *                                  and the second value is the time format
46
+	 * @return EE_Checkin
47
+	 * @throws EE_Error
48
+	 */
49
+	public static function new_instance($props_n_values = array(), $timezone = null, $date_formats = array())
50
+	{
51
+		$has_object = parent::_check_for_object($props_n_values, __CLASS__, $timezone, $date_formats);
52
+		return $has_object
53
+			? $has_object
54
+			: new self($props_n_values, false, $timezone, $date_formats);
55
+	}
56
+
57
+
58
+
59
+	/**
60
+	 * @param array  $props_n_values  incoming values from the database
61
+	 * @param string $timezone        incoming timezone as set by the model.  If not set the timezone for
62
+	 *                                the website will be used.
63
+	 * @return EE_Checkin
64
+	 * @throws EE_Error
65
+	 */
66
+	public static function new_instance_from_db($props_n_values = array(), $timezone = null)
67
+	{
68
+		return new self($props_n_values, true, $timezone);
69
+	}
70
+
71
+
72
+	public function ID()
73
+	{
74
+		return $this->get('CHK_ID');
75
+	}
76
+
77
+
78
+	public function registration_id()
79
+	{
80
+		return $this->get('REG_ID');
81
+	}
82
+
83
+
84
+	public function datetime_id()
85
+	{
86
+		return $this->get('DTT_ID');
87
+	}
88
+
89
+
90
+	public function status()
91
+	{
92
+		return $this->get('CHK_in');
93
+	}
94
+
95
+
96
+	public function timestamp()
97
+	{
98
+		return $this->get('CHK_timestamp');
99
+	}
100 100
 }
Please login to merge, or discard this patch.
core/db_classes/EE_Registration.class.php 1 patch
Indentation   +1815 added lines, -1815 removed lines patch added patch discarded remove patch
@@ -15,1821 +15,1821 @@
 block discarded – undo
15 15
 {
16 16
 
17 17
 
18
-    /**
19
-     * Used to reference when a registration has never been checked in.
20
-     *
21
-     * @deprecated use \EE_Checkin::status_checked_never instead
22
-     * @type int
23
-     */
24
-    const checkin_status_never = 2;
25
-
26
-    /**
27
-     * Used to reference when a registration has been checked in.
28
-     *
29
-     * @deprecated use \EE_Checkin::status_checked_in instead
30
-     * @type int
31
-     */
32
-    const checkin_status_in = 1;
33
-
34
-
35
-    /**
36
-     * Used to reference when a registration has been checked out.
37
-     *
38
-     * @deprecated use \EE_Checkin::status_checked_out instead
39
-     * @type int
40
-     */
41
-    const checkin_status_out = 0;
42
-
43
-
44
-    /**
45
-     * extra meta key for tracking reg status os trashed registrations
46
-     *
47
-     * @type string
48
-     */
49
-    const PRE_TRASH_REG_STATUS_KEY = 'pre_trash_registration_status';
50
-
51
-
52
-    /**
53
-     * extra meta key for tracking if registration has reserved ticket
54
-     *
55
-     * @type string
56
-     */
57
-    const HAS_RESERVED_TICKET_KEY = 'has_reserved_ticket';
58
-
59
-
60
-    /**
61
-     * @param array  $props_n_values          incoming values
62
-     * @param string $timezone                incoming timezone (if not set the timezone set for the website will be
63
-     *                                        used.)
64
-     * @param array  $date_formats            incoming date_formats in an array where the first value is the
65
-     *                                        date_format and the second value is the time format
66
-     * @return EE_Registration
67
-     * @throws EE_Error
68
-     */
69
-    public static function new_instance($props_n_values = array(), $timezone = null, $date_formats = array())
70
-    {
71
-        $has_object = parent::_check_for_object($props_n_values, __CLASS__, $timezone, $date_formats);
72
-        return $has_object ? $has_object : new self($props_n_values, false, $timezone, $date_formats);
73
-    }
74
-
75
-
76
-    /**
77
-     * @param array  $props_n_values  incoming values from the database
78
-     * @param string $timezone        incoming timezone as set by the model.  If not set the timezone for
79
-     *                                the website will be used.
80
-     * @return EE_Registration
81
-     */
82
-    public static function new_instance_from_db($props_n_values = array(), $timezone = null)
83
-    {
84
-        return new self($props_n_values, true, $timezone);
85
-    }
86
-
87
-
88
-    /**
89
-     *        Set Event ID
90
-     *
91
-     * @param        int $EVT_ID Event ID
92
-     * @throws EE_Error
93
-     * @throws RuntimeException
94
-     */
95
-    public function set_event($EVT_ID = 0)
96
-    {
97
-        $this->set('EVT_ID', $EVT_ID);
98
-    }
99
-
100
-
101
-    /**
102
-     * Overrides parent set() method so that all calls to set( 'REG_code', $REG_code ) OR set( 'STS_ID', $STS_ID ) can
103
-     * be routed to internal methods
104
-     *
105
-     * @param string $field_name
106
-     * @param mixed  $field_value
107
-     * @param bool   $use_default
108
-     * @throws \EE_Error
109
-     * @throws \RuntimeException
110
-     */
111
-    public function set($field_name, $field_value, $use_default = false)
112
-    {
113
-        switch ($field_name) {
114
-            case 'REG_code':
115
-                if (! empty($field_value) && $this->reg_code() === null) {
116
-                    $this->set_reg_code($field_value, $use_default);
117
-                }
118
-                break;
119
-            case 'STS_ID':
120
-                $this->set_status($field_value, $use_default);
121
-                break;
122
-            default:
123
-                parent::set($field_name, $field_value, $use_default);
124
-        }
125
-    }
126
-
127
-
128
-    /**
129
-     * Set Status ID
130
-     * updates the registration status and ALSO...
131
-     * calls reserve_registration_space() if the reg status changes TO approved from any other reg status
132
-     * calls release_registration_space() if the reg status changes FROM approved to any other reg status
133
-     *
134
-     * @param string  $new_STS_ID
135
-     * @param boolean $use_default
136
-     * @return bool
137
-     * @throws \RuntimeException
138
-     * @throws \EE_Error
139
-     */
140
-    public function set_status($new_STS_ID = null, $use_default = false)
141
-    {
142
-        // get current REG_Status
143
-        $old_STS_ID = $this->status_ID();
144
-        // if status has changed
145
-        if ($old_STS_ID !== $new_STS_ID // and that status has actually changed
146
-            && ! empty($old_STS_ID) // and that old status is actually set
147
-            && ! empty($new_STS_ID) // as well as the new status
148
-            && $this->ID() // ensure registration is in the db
149
-        ) {
150
-            // TO approved
151
-            if ($new_STS_ID === EEM_Registration::status_id_approved) {
152
-                // reserve a space by incrementing ticket and datetime sold values
153
-                $this->_reserve_registration_space();
154
-                do_action('AHEE__EE_Registration__set_status__to_approved', $this, $old_STS_ID, $new_STS_ID);
155
-                // OR FROM  approved
156
-            } elseif ($old_STS_ID === EEM_Registration::status_id_approved) {
157
-                // release a space by decrementing ticket and datetime sold values
158
-                $this->_release_registration_space();
159
-                do_action('AHEE__EE_Registration__set_status__from_approved', $this, $old_STS_ID, $new_STS_ID);
160
-            }
161
-            // update status
162
-            parent::set('STS_ID', $new_STS_ID, $use_default);
163
-            $this->_update_if_canceled_or_declined($new_STS_ID, $old_STS_ID);
164
-            /** @type EE_Transaction_Payments $transaction_payments */
165
-            $transaction_payments = EE_Registry::instance()->load_class('Transaction_Payments');
166
-            $transaction_payments->recalculate_transaction_total($this->transaction(), false);
167
-            $this->transaction()->update_status_based_on_total_paid(true);
168
-            do_action('AHEE__EE_Registration__set_status__after_update', $this, $old_STS_ID, $new_STS_ID);
169
-            return true;
170
-        }
171
-        //even though the old value matches the new value, it's still good to
172
-        //allow the parent set method to have a say
173
-        parent::set('STS_ID', $new_STS_ID, $use_default);
174
-        return true;
175
-    }
176
-
177
-
178
-    /**
179
-     * update REGs and TXN when cancelled or declined registrations involved
180
-     *
181
-     * @param string $new_STS_ID
182
-     * @param string $old_STS_ID
183
-     * @throws \EE_Error
184
-     */
185
-    private function _update_if_canceled_or_declined($new_STS_ID, $old_STS_ID)
186
-    {
187
-        // these reg statuses should not be considered in any calculations involving monies owing
188
-        $closed_reg_statuses = EEM_Registration::closed_reg_statuses();
189
-        // true if registration has been cancelled or declined
190
-        if (in_array($new_STS_ID, $closed_reg_statuses, true)
191
-            && ! in_array($old_STS_ID, $closed_reg_statuses, true)
192
-        ) {
193
-            /** @type EE_Registration_Processor $registration_processor */
194
-            $registration_processor = EE_Registry::instance()->load_class('Registration_Processor');
195
-            /** @type EE_Transaction_Processor $transaction_processor */
196
-            $transaction_processor = EE_Registry::instance()->load_class('Transaction_Processor');
197
-            // cancelled or declined registration
198
-            $registration_processor->update_registration_after_being_canceled_or_declined(
199
-                $this,
200
-                $closed_reg_statuses
201
-            );
202
-            $transaction_processor->update_transaction_after_canceled_or_declined_registration(
203
-                $this,
204
-                $closed_reg_statuses,
205
-                false
206
-            );
207
-            do_action('AHEE__EE_Registration__set_status__canceled_or_declined', $this, $old_STS_ID, $new_STS_ID);
208
-            return;
209
-        }
210
-        // true if reinstating cancelled or declined registration
211
-        if (in_array($old_STS_ID, $closed_reg_statuses, true)
212
-            && ! in_array($new_STS_ID, $closed_reg_statuses, true)
213
-        ) {
214
-            /** @type EE_Registration_Processor $registration_processor */
215
-            $registration_processor = EE_Registry::instance()->load_class('Registration_Processor');
216
-            /** @type EE_Transaction_Processor $transaction_processor */
217
-            $transaction_processor = EE_Registry::instance()->load_class('Transaction_Processor');
218
-            // reinstating cancelled or declined registration
219
-            $registration_processor->update_canceled_or_declined_registration_after_being_reinstated(
220
-                $this,
221
-                $closed_reg_statuses
222
-            );
223
-            $transaction_processor->update_transaction_after_reinstating_canceled_registration(
224
-                $this,
225
-                $closed_reg_statuses,
226
-                false
227
-            );
228
-            do_action('AHEE__EE_Registration__set_status__after_reinstated', $this, $old_STS_ID, $new_STS_ID);
229
-        }
230
-    }
231
-
232
-
233
-    /**
234
-     *        get Status ID
235
-     */
236
-    public function status_ID()
237
-    {
238
-        return $this->get('STS_ID');
239
-    }
240
-
241
-
242
-    /**
243
-     * increments this registration's related ticket sold and corresponding datetime sold values
244
-     *
245
-     * @return void
246
-     * @throws EE_Error
247
-     * @throws EntityNotFoundException
248
-     */
249
-    private function _reserve_registration_space()
250
-    {
251
-        // reserved ticket and datetime counts will be decremented as sold counts are incremented
252
-        // so stop tracking that this reg has a ticket reserved
253
-        $this->release_reserved_ticket();
254
-        $ticket = $this->ticket();
255
-        $ticket->increase_sold();
256
-        $ticket->save();
257
-        // possibly set event status to sold out
258
-        $this->event()->perform_sold_out_status_check();
259
-    }
260
-
261
-
262
-    /**
263
-     * Gets the ticket this registration is for
264
-     *
265
-     * @param boolean $include_archived whether to include archived tickets or not.
266
-     * @return EE_Ticket|EE_Base_Class
267
-     * @throws \EE_Error
268
-     */
269
-    public function ticket($include_archived = true)
270
-    {
271
-        $query_params = array();
272
-        if ($include_archived) {
273
-            $query_params['default_where_conditions'] = 'none';
274
-        }
275
-        return $this->get_first_related('Ticket', $query_params);
276
-    }
277
-
278
-
279
-    /**
280
-     * Gets the event this registration is for
281
-     *
282
-     * @return EE_Event
283
-     * @throws EE_Error
284
-     * @throws EntityNotFoundException
285
-     */
286
-    public function event()
287
-    {
288
-        $event = $this->get_first_related('Event');
289
-        if (! $event instanceof \EE_Event) {
290
-            throw new EntityNotFoundException('Event ID', $this->event_ID());
291
-        }
292
-        return $event;
293
-    }
294
-
295
-
296
-    /**
297
-     * Gets the "author" of the registration.  Note that for the purposes of registrations, the author will correspond
298
-     * with the author of the event this registration is for.
299
-     *
300
-     * @since 4.5.0
301
-     * @return int
302
-     * @throws EE_Error
303
-     * @throws EntityNotFoundException
304
-     */
305
-    public function wp_user()
306
-    {
307
-        $event = $this->event();
308
-        if ($event instanceof EE_Event) {
309
-            return $event->wp_user();
310
-        }
311
-        return 0;
312
-    }
313
-
314
-
315
-    /**
316
-     * decrements (subtracts) this registration's related ticket sold and corresponding datetime sold values
317
-     *
318
-     * @return void
319
-     * @throws \EE_Error
320
-     */
321
-    private function _release_registration_space()
322
-    {
323
-        $ticket = $this->ticket();
324
-        $ticket->decrease_sold();
325
-        $ticket->save();
326
-    }
327
-
328
-
329
-    /**
330
-     * tracks this registration's ticket reservation in extra meta
331
-     * and can increment related ticket reserved and corresponding datetime reserved values
332
-     *
333
-     * @param bool $update_ticket if true, will increment ticket and datetime reserved count
334
-     * @return void
335
-     * @throws \EE_Error
336
-     */
337
-    public function reserve_ticket($update_ticket = false)
338
-    {
339
-        if ($this->get_extra_meta(EE_Registration::HAS_RESERVED_TICKET_KEY, true, false) === false) {
340
-            // PLZ NOTE: although checking $update_ticket first would be more efficient,
341
-            // we NEED to ALWAYS call update_extra_meta(), which is why that is done first
342
-            if ($this->update_extra_meta(EE_Registration::HAS_RESERVED_TICKET_KEY, true, false) && $update_ticket) {
343
-                $ticket = $this->ticket();
344
-                $ticket->increase_reserved();
345
-                $ticket->save();
346
-            }
347
-        }
348
-    }
349
-
350
-
351
-    /**
352
-     * stops tracking this registration's ticket reservation in extra meta
353
-     * decrements (subtracts) related ticket reserved and corresponding datetime reserved values
354
-     *
355
-     * @param bool $update_ticket if true, will decrement ticket and datetime reserved count
356
-     * @return void
357
-     * @throws \EE_Error
358
-     */
359
-    public function release_reserved_ticket($update_ticket = false)
360
-    {
361
-        if ($this->get_extra_meta(EE_Registration::HAS_RESERVED_TICKET_KEY, true, false) !== false) {
362
-            // PLZ NOTE: although checking $update_ticket first would be more efficient,
363
-            // we NEED to ALWAYS call delete_extra_meta(), which is why that is done first
364
-            if ($this->delete_extra_meta(EE_Registration::HAS_RESERVED_TICKET_KEY) && $update_ticket) {
365
-                $ticket = $this->ticket();
366
-                $ticket->decrease_reserved();
367
-                $ticket->save();
368
-            }
369
-        }
370
-    }
371
-
372
-
373
-    /**
374
-     * Set Attendee ID
375
-     *
376
-     * @param        int $ATT_ID Attendee ID
377
-     * @throws EE_Error
378
-     * @throws RuntimeException
379
-     */
380
-    public function set_attendee_id($ATT_ID = 0)
381
-    {
382
-        $this->set('ATT_ID', $ATT_ID);
383
-    }
384
-
385
-
386
-    /**
387
-     *        Set Transaction ID
388
-     *
389
-     * @param        int $TXN_ID Transaction ID
390
-     * @throws EE_Error
391
-     * @throws RuntimeException
392
-     */
393
-    public function set_transaction_id($TXN_ID = 0)
394
-    {
395
-        $this->set('TXN_ID', $TXN_ID);
396
-    }
397
-
398
-
399
-    /**
400
-     *        Set Session
401
-     *
402
-     * @param    string $REG_session PHP Session ID
403
-     * @throws EE_Error
404
-     * @throws RuntimeException
405
-     */
406
-    public function set_session($REG_session = '')
407
-    {
408
-        $this->set('REG_session', $REG_session);
409
-    }
410
-
411
-
412
-    /**
413
-     *        Set Registration URL Link
414
-     *
415
-     * @param    string $REG_url_link Registration URL Link
416
-     * @throws EE_Error
417
-     * @throws RuntimeException
418
-     */
419
-    public function set_reg_url_link($REG_url_link = '')
420
-    {
421
-        $this->set('REG_url_link', $REG_url_link);
422
-    }
423
-
424
-
425
-    /**
426
-     *        Set Attendee Counter
427
-     *
428
-     * @param        int $REG_count Primary Attendee
429
-     * @throws EE_Error
430
-     * @throws RuntimeException
431
-     */
432
-    public function set_count($REG_count = 1)
433
-    {
434
-        $this->set('REG_count', $REG_count);
435
-    }
436
-
437
-
438
-    /**
439
-     *        Set Group Size
440
-     *
441
-     * @param        boolean $REG_group_size Group Registration
442
-     * @throws EE_Error
443
-     * @throws RuntimeException
444
-     */
445
-    public function set_group_size($REG_group_size = false)
446
-    {
447
-        $this->set('REG_group_size', $REG_group_size);
448
-    }
449
-
450
-
451
-    /**
452
-     *    is_not_approved -  convenience method that returns TRUE if REG status ID ==
453
-     *    EEM_Registration::status_id_not_approved
454
-     *
455
-     * @return        boolean
456
-     */
457
-    public function is_not_approved()
458
-    {
459
-        return $this->status_ID() == EEM_Registration::status_id_not_approved ? true : false;
460
-    }
461
-
462
-
463
-    /**
464
-     *    is_pending_payment -  convenience method that returns TRUE if REG status ID ==
465
-     *    EEM_Registration::status_id_pending_payment
466
-     *
467
-     * @return        boolean
468
-     */
469
-    public function is_pending_payment()
470
-    {
471
-        return $this->status_ID() == EEM_Registration::status_id_pending_payment ? true : false;
472
-    }
473
-
474
-
475
-    /**
476
-     *    is_approved -  convenience method that returns TRUE if REG status ID == EEM_Registration::status_id_approved
477
-     *
478
-     * @return        boolean
479
-     */
480
-    public function is_approved()
481
-    {
482
-        return $this->status_ID() == EEM_Registration::status_id_approved ? true : false;
483
-    }
484
-
485
-
486
-    /**
487
-     *    is_cancelled -  convenience method that returns TRUE if REG status ID == EEM_Registration::status_id_cancelled
488
-     *
489
-     * @return        boolean
490
-     */
491
-    public function is_cancelled()
492
-    {
493
-        return $this->status_ID() == EEM_Registration::status_id_cancelled ? true : false;
494
-    }
495
-
496
-
497
-    /**
498
-     *    is_declined -  convenience method that returns TRUE if REG status ID == EEM_Registration::status_id_declined
499
-     *
500
-     * @return        boolean
501
-     */
502
-    public function is_declined()
503
-    {
504
-        return $this->status_ID() == EEM_Registration::status_id_declined ? true : false;
505
-    }
506
-
507
-
508
-    /**
509
-     *    is_incomplete -  convenience method that returns TRUE if REG status ID ==
510
-     *    EEM_Registration::status_id_incomplete
511
-     *
512
-     * @return        boolean
513
-     */
514
-    public function is_incomplete()
515
-    {
516
-        return $this->status_ID() == EEM_Registration::status_id_incomplete ? true : false;
517
-    }
518
-
519
-
520
-    /**
521
-     *        Set Registration Date
522
-     *
523
-     * @param        mixed ( int or string ) $REG_date Registration Date - Unix timestamp or string representation of
524
-     *                                                 Date
525
-     * @throws EE_Error
526
-     * @throws RuntimeException
527
-     */
528
-    public function set_reg_date($REG_date = false)
529
-    {
530
-        $this->set('REG_date', $REG_date);
531
-    }
532
-
533
-
534
-    /**
535
-     *    Set final price owing for this registration after all ticket/price modifications
536
-     *
537
-     * @access    public
538
-     * @param    float $REG_final_price
539
-     * @throws EE_Error
540
-     * @throws RuntimeException
541
-     */
542
-    public function set_final_price($REG_final_price = 0.00)
543
-    {
544
-        $this->set('REG_final_price', $REG_final_price);
545
-    }
546
-
547
-
548
-    /**
549
-     *    Set amount paid towards this registration's final price
550
-     *
551
-     * @access    public
552
-     * @param    float $REG_paid
553
-     * @throws EE_Error
554
-     * @throws RuntimeException
555
-     */
556
-    public function set_paid($REG_paid = 0.00)
557
-    {
558
-        $this->set('REG_paid', $REG_paid);
559
-    }
560
-
561
-
562
-    /**
563
-     *        Attendee Is Going
564
-     *
565
-     * @param        boolean $REG_att_is_going Attendee Is Going
566
-     * @throws EE_Error
567
-     * @throws RuntimeException
568
-     */
569
-    public function set_att_is_going($REG_att_is_going = false)
570
-    {
571
-        $this->set('REG_att_is_going', $REG_att_is_going);
572
-    }
573
-
574
-
575
-    /**
576
-     * Gets the related attendee
577
-     *
578
-     * @return EE_Attendee
579
-     * @throws EE_Error
580
-     */
581
-    public function attendee()
582
-    {
583
-        return $this->get_first_related('Attendee');
584
-    }
585
-
586
-
587
-    /**
588
-     *        get Event ID
589
-     */
590
-    public function event_ID()
591
-    {
592
-        return $this->get('EVT_ID');
593
-    }
594
-
595
-
596
-    /**
597
-     *        get Event ID
598
-     */
599
-    public function event_name()
600
-    {
601
-        $event = $this->event_obj();
602
-        if ($event) {
603
-            return $event->name();
604
-        } else {
605
-            return null;
606
-        }
607
-    }
608
-
609
-
610
-    /**
611
-     * Fetches the event this registration is for
612
-     *
613
-     * @return EE_Event
614
-     * @throws EE_Error
615
-     */
616
-    public function event_obj()
617
-    {
618
-        return $this->get_first_related('Event');
619
-    }
620
-
621
-
622
-    /**
623
-     *        get Attendee ID
624
-     */
625
-    public function attendee_ID()
626
-    {
627
-        return $this->get('ATT_ID');
628
-    }
629
-
630
-
631
-    /**
632
-     *        get PHP Session ID
633
-     */
634
-    public function session_ID()
635
-    {
636
-        return $this->get('REG_session');
637
-    }
638
-
639
-
640
-    /**
641
-     * Gets the string which represents the URL trigger for the receipt template in the message template system.
642
-     *
643
-     * @param string $messenger 'pdf' or 'html'.  Default 'html'.
644
-     * @return string
645
-     */
646
-    public function receipt_url($messenger = 'html')
647
-    {
648
-
649
-        /**
650
-         * The below will be deprecated one version after this.  We check first if there is a custom receipt template
651
-         * already in use on old system.  If there is then we just return the standard url for it.
652
-         *
653
-         * @since 4.5.0
654
-         */
655
-        $template_relative_path = 'modules/gateways/Invoice/lib/templates/receipt_body.template.php';
656
-        $has_custom             = EEH_Template::locate_template(
657
-            $template_relative_path,
658
-            array(),
659
-            true,
660
-            true,
661
-            true
662
-        );
663
-
664
-        if ($has_custom) {
665
-            return add_query_arg(array('receipt' => 'true'), $this->invoice_url('launch'));
666
-        }
667
-        return apply_filters('FHEE__EE_Registration__receipt_url__receipt_url', '', $this, $messenger, 'receipt');
668
-    }
669
-
670
-
671
-    /**
672
-     * Gets the string which represents the URL trigger for the invoice template in the message template system.
673
-     *
674
-     * @param string $messenger 'pdf' or 'html'.  Default 'html'.
675
-     * @return string
676
-     * @throws EE_Error
677
-     */
678
-    public function invoice_url($messenger = 'html')
679
-    {
680
-        /**
681
-         * The below will be deprecated one version after this.  We check first if there is a custom invoice template
682
-         * already in use on old system.  If there is then we just return the standard url for it.
683
-         *
684
-         * @since 4.5.0
685
-         */
686
-        $template_relative_path = 'modules/gateways/Invoice/lib/templates/invoice_body.template.php';
687
-        $has_custom             = EEH_Template::locate_template(
688
-            $template_relative_path,
689
-            array(),
690
-            true,
691
-            true,
692
-            true
693
-        );
694
-
695
-        if ($has_custom) {
696
-            if ($messenger == 'html') {
697
-                return $this->invoice_url('launch');
698
-            }
699
-            $route = $messenger == 'download' || $messenger == 'pdf' ? 'download_invoice' : 'launch_invoice';
700
-
701
-            $query_args = array('ee' => $route, 'id' => $this->reg_url_link());
702
-            if ($messenger == 'html') {
703
-                $query_args['html'] = true;
704
-            }
705
-            return add_query_arg($query_args, get_permalink(EE_Registry::instance()->CFG->core->thank_you_page_id));
706
-        }
707
-        return apply_filters('FHEE__EE_Registration__invoice_url__invoice_url', '', $this, $messenger, 'invoice');
708
-    }
709
-
710
-
711
-    /**
712
-     * get Registration URL Link
713
-     *
714
-     * @access public
715
-     * @return string
716
-     * @throws \EE_Error
717
-     */
718
-    public function reg_url_link()
719
-    {
720
-        return (string) $this->get('REG_url_link');
721
-    }
722
-
723
-
724
-    /**
725
-     * Echoes out invoice_url()
726
-     *
727
-     * @param string $type 'download','launch', or 'html' (default is 'launch')
728
-     * @return void
729
-     * @throws EE_Error
730
-     */
731
-    public function e_invoice_url($type = 'launch')
732
-    {
733
-        echo $this->invoice_url($type);
734
-    }
735
-
736
-
737
-    /**
738
-     * Echoes out payment_overview_url
739
-     */
740
-    public function e_payment_overview_url()
741
-    {
742
-        echo $this->payment_overview_url();
743
-    }
744
-
745
-
746
-    /**
747
-     * Gets the URL of the thank you page with this registration REG_url_link added as
748
-     * a query parameter
749
-     *
750
-     * @param bool $clear_session Set to true when you want to clear the session on revisiting the
751
-     *                            payment overview url.
752
-     * @return string
753
-     * @throws EE_Error
754
-     */
755
-    public function payment_overview_url($clear_session = false)
756
-    {
757
-        return add_query_arg(array(
758
-            'e_reg_url_link' => $this->reg_url_link(),
759
-            'step'           => 'payment_options',
760
-            'revisit'        => true,
761
-            'clear_session' => (bool) $clear_session
762
-        ), EE_Registry::instance()->CFG->core->reg_page_url());
763
-    }
764
-
765
-
766
-    /**
767
-     * Gets the URL of the thank you page with this registration REG_url_link added as
768
-     * a query parameter
769
-     *
770
-     * @return string
771
-     * @throws EE_Error
772
-     */
773
-    public function edit_attendee_information_url()
774
-    {
775
-        return add_query_arg(array(
776
-            'e_reg_url_link' => $this->reg_url_link(),
777
-            'step'           => 'attendee_information',
778
-            'revisit'        => true,
779
-        ), EE_Registry::instance()->CFG->core->reg_page_url());
780
-    }
781
-
782
-
783
-    /**
784
-     * Simply generates and returns the appropriate admin_url link to edit this registration
785
-     *
786
-     * @return string
787
-     * @throws EE_Error
788
-     */
789
-    public function get_admin_edit_url()
790
-    {
791
-        return EEH_URL::add_query_args_and_nonce(array(
792
-            'page'    => 'espresso_registrations',
793
-            'action'  => 'view_registration',
794
-            '_REG_ID' => $this->ID(),
795
-        ), admin_url('admin.php'));
796
-    }
797
-
798
-
799
-    /**
800
-     *    is_primary_registrant?
801
-     */
802
-    public function is_primary_registrant()
803
-    {
804
-        return $this->get('REG_count') == 1 ? true : false;
805
-    }
806
-
807
-
808
-    /**
809
-     * This returns the primary registration object for this registration group (which may be this object).
810
-     *
811
-     * @return EE_Registration
812
-     * @throws EE_Error
813
-     */
814
-    public function get_primary_registration()
815
-    {
816
-        if ($this->is_primary_registrant()) {
817
-            return $this;
818
-        }
819
-
820
-        //k reg_count !== 1 so let's get the EE_Registration object matching this txn_id and reg_count == 1
821
-        /** @var EE_Registration $primary_registrant */
822
-        $primary_registrant = EEM_Registration::instance()->get_one(array(
823
-            array(
824
-                'TXN_ID'    => $this->transaction_ID(),
825
-                'REG_count' => 1,
826
-            ),
827
-        ));
828
-        return $primary_registrant;
829
-    }
830
-
831
-
832
-    /**
833
-     *        get  Attendee Number
834
-     *
835
-     * @access        public
836
-     */
837
-    public function count()
838
-    {
839
-        return $this->get('REG_count');
840
-    }
841
-
842
-
843
-    /**
844
-     *        get Group Size
845
-     */
846
-    public function group_size()
847
-    {
848
-        return $this->get('REG_group_size');
849
-    }
850
-
851
-
852
-    /**
853
-     *        get Registration Date
854
-     */
855
-    public function date()
856
-    {
857
-        return $this->get('REG_date');
858
-    }
859
-
860
-
861
-    /**
862
-     * gets a pretty date
863
-     *
864
-     * @param string $date_format
865
-     * @param string $time_format
866
-     * @return string
867
-     * @throws EE_Error
868
-     */
869
-    public function pretty_date($date_format = null, $time_format = null)
870
-    {
871
-        return $this->get_datetime('REG_date', $date_format, $time_format);
872
-    }
873
-
874
-
875
-    /**
876
-     * final_price
877
-     * the registration's share of the transaction total, so that the
878
-     * sum of all the transaction's REG_final_prices equal the transaction's total
879
-     *
880
-     * @return float
881
-     * @throws EE_Error
882
-     */
883
-    public function final_price()
884
-    {
885
-        return $this->get('REG_final_price');
886
-    }
887
-
888
-
889
-    /**
890
-     * pretty_final_price
891
-     *  final price as formatted string, with correct decimal places and currency symbol
892
-     *
893
-     * @return string
894
-     * @throws EE_Error
895
-     */
896
-    public function pretty_final_price()
897
-    {
898
-        return $this->get_pretty('REG_final_price');
899
-    }
900
-
901
-
902
-    /**
903
-     * get paid (yeah)
904
-     *
905
-     * @return float
906
-     * @throws EE_Error
907
-     */
908
-    public function paid()
909
-    {
910
-        return $this->get('REG_paid');
911
-    }
912
-
913
-
914
-    /**
915
-     * pretty_paid
916
-     *
917
-     * @return float
918
-     * @throws EE_Error
919
-     */
920
-    public function pretty_paid()
921
-    {
922
-        return $this->get_pretty('REG_paid');
923
-    }
924
-
925
-
926
-    /**
927
-     * owes_monies_and_can_pay
928
-     * whether or not this registration has monies owing and it's' status allows payment
929
-     *
930
-     * @param array $requires_payment
931
-     * @return bool
932
-     * @throws EE_Error
933
-     */
934
-    public function owes_monies_and_can_pay($requires_payment = array())
935
-    {
936
-        // these reg statuses require payment (if event is not free)
937
-        $requires_payment = ! empty($requires_payment)
938
-            ? $requires_payment
939
-            : EEM_Registration::reg_statuses_that_allow_payment();
940
-        if (in_array($this->status_ID(), $requires_payment) &&
941
-            $this->final_price() != 0 &&
942
-            $this->final_price() != $this->paid()
943
-        ) {
944
-            return true;
945
-        } else {
946
-            return false;
947
-        }
948
-    }
949
-
950
-
951
-    /**
952
-     * Prints out the return value of $this->pretty_status()
953
-     *
954
-     * @param bool $show_icons
955
-     * @return void
956
-     * @throws EE_Error
957
-     */
958
-    public function e_pretty_status($show_icons = false)
959
-    {
960
-        echo $this->pretty_status($show_icons);
961
-    }
962
-
963
-
964
-    /**
965
-     * Returns a nice version of the status for displaying to customers
966
-     *
967
-     * @param bool $show_icons
968
-     * @return string
969
-     * @throws EE_Error
970
-     */
971
-    public function pretty_status($show_icons = false)
972
-    {
973
-        $status = EEM_Status::instance()->localized_status(
974
-            array($this->status_ID() => esc_html__('unknown', 'event_espresso')),
975
-            false,
976
-            'sentence'
977
-        );
978
-        $icon   = '';
979
-        switch ($this->status_ID()) {
980
-            case EEM_Registration::status_id_approved:
981
-                $icon = $show_icons
982
-                    ? '<span class="dashicons dashicons-star-filled ee-icon-size-16 green-text"></span>'
983
-                    : '';
984
-                break;
985
-            case EEM_Registration::status_id_pending_payment:
986
-                $icon = $show_icons
987
-                    ? '<span class="dashicons dashicons-star-half ee-icon-size-16 orange-text"></span>'
988
-                    : '';
989
-                break;
990
-            case EEM_Registration::status_id_not_approved:
991
-                $icon = $show_icons
992
-                    ? '<span class="dashicons dashicons-marker ee-icon-size-16 orange-text"></span>'
993
-                    : '';
994
-                break;
995
-            case EEM_Registration::status_id_cancelled:
996
-                $icon = $show_icons
997
-                    ? '<span class="dashicons dashicons-no ee-icon-size-16 lt-grey-text"></span>'
998
-                    : '';
999
-                break;
1000
-            case EEM_Registration::status_id_incomplete:
1001
-                $icon = $show_icons
1002
-                    ? '<span class="dashicons dashicons-no ee-icon-size-16 lt-orange-text"></span>'
1003
-                    : '';
1004
-                break;
1005
-            case EEM_Registration::status_id_declined:
1006
-                $icon = $show_icons
1007
-                    ? '<span class="dashicons dashicons-no ee-icon-size-16 red-text"></span>'
1008
-                    : '';
1009
-                break;
1010
-            case EEM_Registration::status_id_wait_list:
1011
-                $icon = $show_icons
1012
-                    ? '<span class="dashicons dashicons-clipboard ee-icon-size-16 purple-text"></span>'
1013
-                    : '';
1014
-                break;
1015
-        }
1016
-        return $icon . $status[$this->status_ID()];
1017
-    }
1018
-
1019
-
1020
-    /**
1021
-     *        get Attendee Is Going
1022
-     */
1023
-    public function att_is_going()
1024
-    {
1025
-        return $this->get('REG_att_is_going');
1026
-    }
1027
-
1028
-
1029
-    /**
1030
-     * Gets related answers
1031
-     *
1032
-     * @param array $query_params like EEM_Base::get_all
1033
-     * @return EE_Answer[]
1034
-     * @throws EE_Error
1035
-     */
1036
-    public function answers($query_params = null)
1037
-    {
1038
-        return $this->get_many_related('Answer', $query_params);
1039
-    }
1040
-
1041
-
1042
-    /**
1043
-     * Gets the registration's answer value to the specified question
1044
-     * (either the question's ID or a question object)
1045
-     *
1046
-     * @param EE_Question|int $question
1047
-     * @param bool            $pretty_value
1048
-     * @return array|string if pretty_value= true, the result will always be a string
1049
-     * (because the answer might be an array of answer values, so passing pretty_value=true
1050
-     * will convert it into some kind of string)
1051
-     * @throws EE_Error
1052
-     */
1053
-    public function answer_value_to_question($question, $pretty_value = true)
1054
-    {
1055
-        $question_id = EEM_Question::instance()->ensure_is_ID($question);
1056
-        return EEM_Answer::instance()->get_answer_value_to_question($this, $question_id, $pretty_value);
1057
-    }
1058
-
1059
-
1060
-    /**
1061
-     * question_groups
1062
-     * returns an array of EE_Question_Group objects for this registration
1063
-     *
1064
-     * @return EE_Question_Group[]
1065
-     * @throws EE_Error
1066
-     * @throws EntityNotFoundException
1067
-     */
1068
-    public function question_groups()
1069
-    {
1070
-        $question_groups = array();
1071
-        if ($this->event() instanceof EE_Event) {
1072
-            $question_groups = $this->event()->question_groups(
1073
-                array(
1074
-                    array(
1075
-                        'Event_Question_Group.EQG_primary' => $this->count() == 1 ? true : false,
1076
-                    ),
1077
-                    'order_by' => array('QSG_order' => 'ASC'),
1078
-                )
1079
-            );
1080
-        }
1081
-        return $question_groups;
1082
-    }
1083
-
1084
-
1085
-    /**
1086
-     * count_question_groups
1087
-     * returns a count of the number of EE_Question_Group objects for this registration
1088
-     *
1089
-     * @return int
1090
-     * @throws EE_Error
1091
-     * @throws EntityNotFoundException
1092
-     */
1093
-    public function count_question_groups()
1094
-    {
1095
-        $qg_count = 0;
1096
-        if ($this->event() instanceof EE_Event) {
1097
-            $qg_count = $this->event()->count_related(
1098
-                'Question_Group',
1099
-                array(
1100
-                    array(
1101
-                        'Event_Question_Group.EQG_primary' => $this->count() == 1 ? true : false,
1102
-                    ),
1103
-                )
1104
-            );
1105
-        }
1106
-        return $qg_count;
1107
-    }
1108
-
1109
-
1110
-    /**
1111
-     * Returns the registration date in the 'standard' string format
1112
-     * (function may be improved in the future to allow for different formats and timezones)
1113
-     *
1114
-     * @return string
1115
-     * @throws EE_Error
1116
-     */
1117
-    public function reg_date()
1118
-    {
1119
-        return $this->get_datetime('REG_date');
1120
-    }
1121
-
1122
-
1123
-    /**
1124
-     * Gets the datetime-ticket for this registration (ie, it can be used to isolate
1125
-     * the ticket this registration purchased, or the datetime they have registered
1126
-     * to attend)
1127
-     *
1128
-     * @return EE_Datetime_Ticket
1129
-     * @throws EE_Error
1130
-     */
1131
-    public function datetime_ticket()
1132
-    {
1133
-        return $this->get_first_related('Datetime_Ticket');
1134
-    }
1135
-
1136
-
1137
-    /**
1138
-     * Sets the registration's datetime_ticket.
1139
-     *
1140
-     * @param EE_Datetime_Ticket $datetime_ticket
1141
-     * @return EE_Datetime_Ticket
1142
-     * @throws EE_Error
1143
-     */
1144
-    public function set_datetime_ticket($datetime_ticket)
1145
-    {
1146
-        return $this->_add_relation_to($datetime_ticket, 'Datetime_Ticket');
1147
-    }
1148
-
1149
-    /**
1150
-     * Gets deleted
1151
-     *
1152
-     * @return bool
1153
-     * @throws EE_Error
1154
-     */
1155
-    public function deleted()
1156
-    {
1157
-        return $this->get('REG_deleted');
1158
-    }
1159
-
1160
-    /**
1161
-     * Sets deleted
1162
-     *
1163
-     * @param boolean $deleted
1164
-     * @return bool
1165
-     * @throws EE_Error
1166
-     * @throws RuntimeException
1167
-     */
1168
-    public function set_deleted($deleted)
1169
-    {
1170
-        if ($deleted) {
1171
-            $this->delete();
1172
-        } else {
1173
-            $this->restore();
1174
-        }
1175
-    }
1176
-
1177
-
1178
-    /**
1179
-     * Get the status object of this object
1180
-     *
1181
-     * @return EE_Status
1182
-     * @throws EE_Error
1183
-     */
1184
-    public function status_obj()
1185
-    {
1186
-        return $this->get_first_related('Status');
1187
-    }
1188
-
1189
-
1190
-    /**
1191
-     * Returns the number of times this registration has checked into any of the datetimes
1192
-     * its available for
1193
-     *
1194
-     * @return int
1195
-     * @throws EE_Error
1196
-     */
1197
-    public function count_checkins()
1198
-    {
1199
-        return $this->get_model()->count_related($this, 'Checkin');
1200
-    }
1201
-
1202
-
1203
-    /**
1204
-     * Returns the number of current Check-ins this registration is checked into for any of the datetimes the
1205
-     * registration is for.  Note, this is ONLY checked in (does not include checkedout)
1206
-     *
1207
-     * @return int
1208
-     * @throws EE_Error
1209
-     */
1210
-    public function count_checkins_not_checkedout()
1211
-    {
1212
-        return $this->get_model()->count_related($this, 'Checkin', array(array('CHK_in' => 1)));
1213
-    }
1214
-
1215
-
1216
-    /**
1217
-     * The purpose of this method is simply to check whether this registration can checkin to the given datetime.
1218
-     *
1219
-     * @param int | EE_Datetime $DTT_OR_ID      The datetime the registration is being checked against
1220
-     * @param bool              $check_approved This is used to indicate whether the caller wants can_checkin to also
1221
-     *                                          consider registration status as well as datetime access.
1222
-     * @return bool
1223
-     * @throws EE_Error
1224
-     */
1225
-    public function can_checkin($DTT_OR_ID, $check_approved = true)
1226
-    {
1227
-        $DTT_ID = EEM_Datetime::instance()->ensure_is_ID($DTT_OR_ID);
1228
-
1229
-        //first check registration status
1230
-        if (($check_approved && ! $this->is_approved()) || ! $DTT_ID) {
1231
-            return false;
1232
-        }
1233
-        //is there a datetime ticket that matches this dtt_ID?
1234
-        if (! (EEM_Datetime_Ticket::instance()->exists(array(
1235
-            array(
1236
-                'TKT_ID' => $this->get('TKT_ID'),
1237
-                'DTT_ID' => $DTT_ID,
1238
-            ),
1239
-        )))
1240
-        ) {
1241
-            return false;
1242
-        }
1243
-
1244
-        //final check is against TKT_uses
1245
-        return $this->verify_can_checkin_against_TKT_uses($DTT_ID);
1246
-    }
1247
-
1248
-
1249
-    /**
1250
-     * This method verifies whether the user can checkin for the given datetime considering the max uses value set on
1251
-     * the ticket. To do this,  a query is done to get the count of the datetime records already checked into.  If the
1252
-     * datetime given does not have a check-in record and checking in for that datetime will exceed the allowed uses,
1253
-     * then return false.  Otherwise return true.
1254
-     *
1255
-     * @param int | EE_Datetime $DTT_OR_ID The datetime the registration is being checked against
1256
-     * @return bool true means can checkin.  false means cannot checkin.
1257
-     * @throws EE_Error
1258
-     */
1259
-    public function verify_can_checkin_against_TKT_uses($DTT_OR_ID)
1260
-    {
1261
-        $DTT_ID = EEM_Datetime::instance()->ensure_is_ID($DTT_OR_ID);
1262
-
1263
-        if (! $DTT_ID) {
1264
-            return false;
1265
-        }
1266
-
1267
-        $max_uses = $this->ticket() instanceof EE_Ticket ? $this->ticket()->uses() : EE_INF;
1268
-
1269
-        // if max uses is not set or equals infinity then return true cause its not a factor for whether user can
1270
-        // check-in or not.
1271
-        if (! $max_uses || $max_uses === EE_INF) {
1272
-            return true;
1273
-        }
1274
-
1275
-        //does this datetime have a checkin record?  If so, then the dtt count has already been verified so we can just
1276
-        //go ahead and toggle.
1277
-        if (EEM_Checkin::instance()->exists(array(array('REG_ID' => $this->ID(), 'DTT_ID' => $DTT_ID)))) {
1278
-            return true;
1279
-        }
1280
-
1281
-        //made it here so the last check is whether the number of checkins per unique datetime on this registration
1282
-        //disallows further check-ins.
1283
-        $count_unique_dtt_checkins = EEM_Checkin::instance()->count(array(
1284
-            array(
1285
-                'REG_ID' => $this->ID(),
1286
-                'CHK_in' => true,
1287
-            ),
1288
-        ), 'DTT_ID', true);
1289
-        // checkins have already reached their max number of uses
1290
-        // so registrant can NOT checkin
1291
-        if ($count_unique_dtt_checkins >= $max_uses) {
1292
-            EE_Error::add_error(
1293
-                esc_html__(
1294
-                    'Check-in denied because number of datetime uses for the ticket has been reached or exceeded.',
1295
-                    'event_espresso'
1296
-                ),
1297
-                __FILE__,
1298
-                __FUNCTION__,
1299
-                __LINE__
1300
-            );
1301
-            return false;
1302
-        }
1303
-        return true;
1304
-    }
1305
-
1306
-
1307
-    /**
1308
-     * toggle Check-in status for this registration
1309
-     * Check-ins are toggled in the following order:
1310
-     * never checked in -> checked in
1311
-     * checked in -> checked out
1312
-     * checked out -> checked in
1313
-     *
1314
-     * @param  int $DTT_ID  include specific datetime to toggle Check-in for.
1315
-     *                      If not included or null, then it is assumed latest datetime is being toggled.
1316
-     * @param bool $verify  If true then can_checkin() is used to verify whether the person
1317
-     *                      can be checked in or not.  Otherwise this forces change in checkin status.
1318
-     * @return bool|int     the chk_in status toggled to OR false if nothing got changed.
1319
-     * @throws EE_Error
1320
-     */
1321
-    public function toggle_checkin_status($DTT_ID = null, $verify = false)
1322
-    {
1323
-        if (empty($DTT_ID)) {
1324
-            $datetime = $this->get_latest_related_datetime();
1325
-            $DTT_ID   = $datetime instanceof EE_Datetime ? $datetime->ID() : 0;
1326
-            // verify the registration can checkin for the given DTT_ID
1327
-        } elseif (! $this->can_checkin($DTT_ID, $verify)) {
1328
-            EE_Error::add_error(
1329
-                sprintf(
1330
-                    esc_html__(
1331
-                        'The given registration (ID:%1$d) can not be checked in to the given DTT_ID (%2$d), because the registration does not have access',
1332
-                        'event_espresso'
1333
-                    ),
1334
-                    $this->ID(),
1335
-                    $DTT_ID
1336
-                ),
1337
-                __FILE__,
1338
-                __FUNCTION__,
1339
-                __LINE__
1340
-            );
1341
-            return false;
1342
-        }
1343
-        $status_paths = array(
1344
-            EE_Checkin::status_checked_never => EE_Checkin::status_checked_in,
1345
-            EE_Checkin::status_checked_in    => EE_Checkin::status_checked_out,
1346
-            EE_Checkin::status_checked_out   => EE_Checkin::status_checked_in,
1347
-        );
1348
-        //start by getting the current status so we know what status we'll be changing to.
1349
-        $cur_status = $this->check_in_status_for_datetime($DTT_ID, null);
1350
-        $status_to  = $status_paths[$cur_status];
1351
-        // database only records true for checked IN or false for checked OUT
1352
-        // no record ( null ) means checked in NEVER, but we obviously don't save that
1353
-        $new_status = $status_to === EE_Checkin::status_checked_in ? true : false;
1354
-        // add relation - note Check-ins are always creating new rows
1355
-        // because we are keeping track of Check-ins over time.
1356
-        // Eventually we'll probably want to show a list table
1357
-        // for the individual Check-ins so that they can be managed.
1358
-        $checkin = EE_Checkin::new_instance(array(
1359
-            'REG_ID' => $this->ID(),
1360
-            'DTT_ID' => $DTT_ID,
1361
-            'CHK_in' => $new_status,
1362
-        ));
1363
-        // if the record could not be saved then return false
1364
-        if ($checkin->save() === 0) {
1365
-            if (WP_DEBUG) {
1366
-                global $wpdb;
1367
-                $error = sprintf(
1368
-                    esc_html__(
1369
-                        'Registration check in update failed because of the following database error: %1$s%2$s',
1370
-                        'event_espresso'
1371
-                    ),
1372
-                    '<br />',
1373
-                    $wpdb->last_error
1374
-                );
1375
-            } else {
1376
-                $error = esc_html__(
1377
-                    'Registration check in update failed because of an unknown database error',
1378
-                    'event_espresso'
1379
-                );
1380
-            }
1381
-            EE_Error::add_error($error, __FILE__, __FUNCTION__, __LINE__);
1382
-            return false;
1383
-        }
1384
-        return $status_to;
1385
-    }
1386
-
1387
-
1388
-    /**
1389
-     * Returns the latest datetime related to this registration (via the ticket attached to the registration).
1390
-     * "Latest" is defined by the `DTT_EVT_start` column.
1391
-     *
1392
-     * @return EE_Datetime|null
1393
-     * @throws \EE_Error
1394
-     */
1395
-    public function get_latest_related_datetime()
1396
-    {
1397
-        return EEM_Datetime::instance()->get_one(
1398
-            array(
1399
-                array(
1400
-                    'Ticket.Registration.REG_ID' => $this->ID(),
1401
-                ),
1402
-                'order_by' => array('DTT_EVT_start' => 'DESC'),
1403
-            )
1404
-        );
1405
-    }
1406
-
1407
-
1408
-    /**
1409
-     * Returns the earliest datetime related to this registration (via the ticket attached to the registration).
1410
-     * "Earliest" is defined by the `DTT_EVT_start` column.
1411
-     *
1412
-     * @throws \EE_Error
1413
-     */
1414
-    public function get_earliest_related_datetime()
1415
-    {
1416
-        return EEM_Datetime::instance()->get_one(
1417
-            array(
1418
-                array(
1419
-                    'Ticket.Registration.REG_ID' => $this->ID(),
1420
-                ),
1421
-                'order_by' => array('DTT_EVT_start' => 'ASC'),
1422
-            )
1423
-        );
1424
-    }
1425
-
1426
-
1427
-    /**
1428
-     * This method simply returns the check-in status for this registration and the given datetime.
1429
-     * If neither the datetime nor the checkin values are provided as arguments,
1430
-     * then this will return the LATEST check-in status for the registration across all datetimes it belongs to.
1431
-     *
1432
-     * @param  int       $DTT_ID  The ID of the datetime we're checking against
1433
-     *                            (if empty we'll get the primary datetime for
1434
-     *                            this registration (via event) and use it's ID);
1435
-     * @param EE_Checkin $checkin If present, we use the given checkin object rather than the dtt_id.
1436
-     * @return int                Integer representing Check-in status.
1437
-     * @throws \EE_Error
1438
-     */
1439
-    public function check_in_status_for_datetime($DTT_ID = 0, $checkin = null)
1440
-    {
1441
-        $checkin_query_params = array(
1442
-            'order_by' => array('CHK_timestamp' => 'DESC'),
1443
-        );
1444
-
1445
-        if ($DTT_ID > 0) {
1446
-            $checkin_query_params[0] = array('DTT_ID' => $DTT_ID);
1447
-        }
1448
-
1449
-        //get checkin object (if exists)
1450
-        $checkin = $checkin instanceof EE_Checkin
1451
-            ? $checkin
1452
-            : $this->get_first_related('Checkin', $checkin_query_params);
1453
-        if ($checkin instanceof EE_Checkin) {
1454
-            if ($checkin->get('CHK_in')) {
1455
-                return EE_Checkin::status_checked_in; //checked in
1456
-            }
1457
-            return EE_Checkin::status_checked_out; //had checked in but is now checked out.
1458
-        }
1459
-        return EE_Checkin::status_checked_never; //never been checked in
1460
-    }
1461
-
1462
-
1463
-    /**
1464
-     * This method returns a localized message for the toggled Check-in message.
1465
-     *
1466
-     * @param  int $DTT_ID include specific datetime to get the correct Check-in message.  If not included or null,
1467
-     *                     then it is assumed Check-in for primary datetime was toggled.
1468
-     * @param bool $error  This just flags that you want an error message returned. This is put in so that the error
1469
-     *                     message can be customized with the attendee name.
1470
-     * @return string internationalized message
1471
-     * @throws EE_Error
1472
-     */
1473
-    public function get_checkin_msg($DTT_ID, $error = false)
1474
-    {
1475
-        //let's get the attendee first so we can include the name of the attendee
1476
-        $attendee = $this->get_first_related('Attendee');
1477
-        if ($attendee instanceof EE_Attendee) {
1478
-            if ($error) {
1479
-                return sprintf(__("%s's check-in status was not changed.", "event_espresso"), $attendee->full_name());
1480
-            }
1481
-            $cur_status = $this->check_in_status_for_datetime($DTT_ID);
1482
-            //what is the status message going to be?
1483
-            switch ($cur_status) {
1484
-                case EE_Checkin::status_checked_never:
1485
-                    return sprintf(__("%s has been removed from Check-in records", "event_espresso"),
1486
-                        $attendee->full_name());
1487
-                    break;
1488
-                case EE_Checkin::status_checked_in:
1489
-                    return sprintf(__('%s has been checked in', 'event_espresso'), $attendee->full_name());
1490
-                    break;
1491
-                case EE_Checkin::status_checked_out:
1492
-                    return sprintf(__('%s has been checked out', 'event_espresso'), $attendee->full_name());
1493
-                    break;
1494
-            }
1495
-        }
1496
-        return esc_html__("The check-in status could not be determined.", "event_espresso");
1497
-    }
1498
-
1499
-
1500
-    /**
1501
-     * Returns the related EE_Transaction to this registration
1502
-     *
1503
-     * @return EE_Transaction
1504
-     * @throws EE_Error
1505
-     * @throws EntityNotFoundException
1506
-     */
1507
-    public function transaction()
1508
-    {
1509
-        $transaction = $this->get_first_related('Transaction');
1510
-        if (! $transaction instanceof \EE_Transaction) {
1511
-            throw new EntityNotFoundException('Transaction ID', $this->transaction_ID());
1512
-        }
1513
-        return $transaction;
1514
-    }
1515
-
1516
-
1517
-    /**
1518
-     *        get Registration Code
1519
-     */
1520
-    public function reg_code()
1521
-    {
1522
-        return $this->get('REG_code');
1523
-    }
1524
-
1525
-
1526
-    /**
1527
-     *        get Transaction ID
1528
-     */
1529
-    public function transaction_ID()
1530
-    {
1531
-        return $this->get('TXN_ID');
1532
-    }
1533
-
1534
-
1535
-    /**
1536
-     * @return int
1537
-     * @throws EE_Error
1538
-     */
1539
-    public function ticket_ID()
1540
-    {
1541
-        return $this->get('TKT_ID');
1542
-    }
1543
-
1544
-
1545
-    /**
1546
-     *        Set Registration Code
1547
-     *
1548
-     * @access    public
1549
-     * @param    string  $REG_code Registration Code
1550
-     * @param    boolean $use_default
1551
-     * @throws EE_Error
1552
-     */
1553
-    public function set_reg_code($REG_code, $use_default = false)
1554
-    {
1555
-        if (empty($REG_code)) {
1556
-            EE_Error::add_error(
1557
-                esc_html__('REG_code can not be empty.', 'event_espresso'),
1558
-                __FILE__,
1559
-                __FUNCTION__,
1560
-                __LINE__
1561
-            );
1562
-            return;
1563
-        }
1564
-        if (! $this->reg_code()) {
1565
-            parent::set('REG_code', $REG_code, $use_default);
1566
-        } else {
1567
-            EE_Error::doing_it_wrong(
1568
-                __CLASS__ . '::' . __FUNCTION__,
1569
-                esc_html__('Can not change a registration REG_code once it has been set.', 'event_espresso'),
1570
-                '4.6.0'
1571
-            );
1572
-        }
1573
-    }
1574
-
1575
-
1576
-    /**
1577
-     * Returns all other registrations in the same group as this registrant who have the same ticket option.
1578
-     * Note, if you want to just get all registrations in the same transaction (group), use:
1579
-     *    $registration->transaction()->registrations();
1580
-     *
1581
-     * @since 4.5.0
1582
-     * @return EE_Registration[] or empty array if this isn't a group registration.
1583
-     * @throws EE_Error
1584
-     */
1585
-    public function get_all_other_registrations_in_group()
1586
-    {
1587
-        if ($this->group_size() < 2) {
1588
-            return array();
1589
-        }
1590
-
1591
-        $query[0] = array(
1592
-            'TXN_ID' => $this->transaction_ID(),
1593
-            'REG_ID' => array('!=', $this->ID()),
1594
-            'TKT_ID' => $this->ticket_ID(),
1595
-        );
1596
-        /** @var EE_Registration[] $registrations */
1597
-        $registrations = $this->get_model()->get_all($query);
1598
-        return $registrations;
1599
-    }
1600
-
1601
-    /**
1602
-     * Return the link to the admin details for the object.
1603
-     *
1604
-     * @return string
1605
-     * @throws EE_Error
1606
-     */
1607
-    public function get_admin_details_link()
1608
-    {
1609
-        EE_Registry::instance()->load_helper('URL');
1610
-        return EEH_URL::add_query_args_and_nonce(
1611
-            array(
1612
-                'page'    => 'espresso_registrations',
1613
-                'action'  => 'view_registration',
1614
-                '_REG_ID' => $this->ID(),
1615
-            ),
1616
-            admin_url('admin.php')
1617
-        );
1618
-    }
1619
-
1620
-    /**
1621
-     * Returns the link to the editor for the object.  Sometimes this is the same as the details.
1622
-     *
1623
-     * @return string
1624
-     * @throws EE_Error
1625
-     */
1626
-    public function get_admin_edit_link()
1627
-    {
1628
-        return $this->get_admin_details_link();
1629
-    }
1630
-
1631
-    /**
1632
-     * Returns the link to a settings page for the object.
1633
-     *
1634
-     * @return string
1635
-     * @throws EE_Error
1636
-     */
1637
-    public function get_admin_settings_link()
1638
-    {
1639
-        return $this->get_admin_details_link();
1640
-    }
1641
-
1642
-    /**
1643
-     * Returns the link to the "overview" for the object (typically the "list table" view).
1644
-     *
1645
-     * @return string
1646
-     */
1647
-    public function get_admin_overview_link()
1648
-    {
1649
-        EE_Registry::instance()->load_helper('URL');
1650
-        return EEH_URL::add_query_args_and_nonce(
1651
-            array(
1652
-                'page' => 'espresso_registrations',
1653
-            ),
1654
-            admin_url('admin.php')
1655
-        );
1656
-    }
1657
-
1658
-
1659
-    /**
1660
-     * @param array $query_params
1661
-     * @return \EE_Registration[]
1662
-     * @throws \EE_Error
1663
-     */
1664
-    public function payments($query_params = array())
1665
-    {
1666
-        return $this->get_many_related('Payment', $query_params);
1667
-    }
1668
-
1669
-
1670
-    /**
1671
-     * @param array $query_params
1672
-     * @return \EE_Registration_Payment[]
1673
-     * @throws \EE_Error
1674
-     */
1675
-    public function registration_payments($query_params = array())
1676
-    {
1677
-        return $this->get_many_related('Registration_Payment', $query_params);
1678
-    }
1679
-
1680
-
1681
-    /**
1682
-     * This grabs the payment method corresponding to the last payment made for the amount owing on the registration.
1683
-     * Note: if there are no payments on the registration there will be no payment method returned.
1684
-     *
1685
-     * @return EE_Payment_Method|null
1686
-     */
1687
-    public function payment_method()
1688
-    {
1689
-        return EEM_Payment_Method::instance()->get_last_used_for_registration($this);
1690
-    }
1691
-
1692
-
1693
-    /**
1694
-     * @return \EE_Line_Item
1695
-     * @throws EntityNotFoundException
1696
-     * @throws \EE_Error
1697
-     */
1698
-    public function ticket_line_item()
1699
-    {
1700
-        $ticket            = $this->ticket();
1701
-        $transaction       = $this->transaction();
1702
-        $line_item         = null;
1703
-        $ticket_line_items = \EEH_Line_Item::get_line_items_by_object_type_and_IDs(
1704
-            $transaction->total_line_item(),
1705
-            'Ticket',
1706
-            array($ticket->ID())
1707
-        );
1708
-        foreach ($ticket_line_items as $ticket_line_item) {
1709
-            if (
1710
-                $ticket_line_item instanceof \EE_Line_Item
1711
-                && $ticket_line_item->OBJ_type() === 'Ticket'
1712
-                && $ticket_line_item->OBJ_ID() === $ticket->ID()
1713
-            ) {
1714
-                $line_item = $ticket_line_item;
1715
-                break;
1716
-            }
1717
-        }
1718
-        if (! ($line_item instanceof \EE_Line_Item && $line_item->OBJ_type() === 'Ticket')) {
1719
-            throw new EntityNotFoundException('Line Item Ticket ID', $ticket->ID());
1720
-        }
1721
-        return $line_item;
1722
-    }
1723
-
1724
-
1725
-    /**
1726
-     * Soft Deletes this model object.
1727
-     *
1728
-     * @return boolean | int
1729
-     * @throws \RuntimeException
1730
-     * @throws \EE_Error
1731
-     */
1732
-    public function delete()
1733
-    {
1734
-        if ($this->update_extra_meta(EE_Registration::PRE_TRASH_REG_STATUS_KEY, $this->status_ID()) === true) {
1735
-            $this->set_status(EEM_Registration::status_id_cancelled);
1736
-        }
1737
-        return parent::delete();
1738
-    }
1739
-
1740
-
1741
-    /**
1742
-     * Restores whatever the previous status was on a registration before it was trashed (if possible)
1743
-     *
1744
-     * @throws \EE_Error
1745
-     * @throws \RuntimeException
1746
-     */
1747
-    public function restore()
1748
-    {
1749
-        $previous_status = $this->get_extra_meta(
1750
-            EE_Registration::PRE_TRASH_REG_STATUS_KEY,
1751
-            true,
1752
-            EEM_Registration::status_id_cancelled
1753
-        );
1754
-        if ($previous_status) {
1755
-            $this->delete_extra_meta(EE_Registration::PRE_TRASH_REG_STATUS_KEY);
1756
-            $this->set_status($previous_status);
1757
-        }
1758
-        return parent::restore();
1759
-    }
1760
-
1761
-
1762
-
1763
-    /*************************** DEPRECATED ***************************/
1764
-
1765
-
1766
-    /**
1767
-     * @deprecated
1768
-     * @since     4.7.0
1769
-     * @access    public
1770
-     */
1771
-    public function price_paid()
1772
-    {
1773
-        EE_Error::doing_it_wrong('EE_Registration::price_paid()',
1774
-            esc_html__('This method is deprecated, please use EE_Registration::final_price() instead.', 'event_espresso'),
1775
-            '4.7.0');
1776
-        return $this->final_price();
1777
-    }
1778
-
1779
-
1780
-    /**
1781
-     * @deprecated
1782
-     * @since     4.7.0
1783
-     * @access    public
1784
-     * @param    float $REG_final_price
1785
-     * @throws EE_Error
1786
-     * @throws RuntimeException
1787
-     */
1788
-    public function set_price_paid($REG_final_price = 0.00)
1789
-    {
1790
-        EE_Error::doing_it_wrong('EE_Registration::set_price_paid()',
1791
-            esc_html__('This method is deprecated, please use EE_Registration::set_final_price() instead.', 'event_espresso'),
1792
-            '4.7.0');
1793
-        $this->set_final_price($REG_final_price);
1794
-    }
1795
-
1796
-
1797
-    /**
1798
-     * @deprecated
1799
-     * @since 4.7.0
1800
-     * @return string
1801
-     * @throws EE_Error
1802
-     */
1803
-    public function pretty_price_paid()
1804
-    {
1805
-        EE_Error::doing_it_wrong('EE_Registration::pretty_price_paid()',
1806
-            esc_html__('This method is deprecated, please use EE_Registration::pretty_final_price() instead.',
1807
-                'event_espresso'), '4.7.0');
1808
-        return $this->pretty_final_price();
1809
-    }
1810
-
1811
-
1812
-    /**
1813
-     * Gets the primary datetime related to this registration via the related Event to this registration
1814
-     *
1815
-     * @deprecated 4.9.17
1816
-     * @return EE_Datetime
1817
-     * @throws EE_Error
1818
-     * @throws EntityNotFoundException
1819
-     */
1820
-    public function get_related_primary_datetime()
1821
-    {
1822
-        EE_Error::doing_it_wrong(
1823
-            __METHOD__,
1824
-            esc_html__(
1825
-                'Use EE_Registration::get_latest_related_datetime() or EE_Registration::get_earliest_related_datetime()',
1826
-                'event_espresso'
1827
-            ),
1828
-            '4.9.17',
1829
-            '5.0.0'
1830
-        );
1831
-        return $this->event()->primary_datetime();
1832
-    }
18
+	/**
19
+	 * Used to reference when a registration has never been checked in.
20
+	 *
21
+	 * @deprecated use \EE_Checkin::status_checked_never instead
22
+	 * @type int
23
+	 */
24
+	const checkin_status_never = 2;
25
+
26
+	/**
27
+	 * Used to reference when a registration has been checked in.
28
+	 *
29
+	 * @deprecated use \EE_Checkin::status_checked_in instead
30
+	 * @type int
31
+	 */
32
+	const checkin_status_in = 1;
33
+
34
+
35
+	/**
36
+	 * Used to reference when a registration has been checked out.
37
+	 *
38
+	 * @deprecated use \EE_Checkin::status_checked_out instead
39
+	 * @type int
40
+	 */
41
+	const checkin_status_out = 0;
42
+
43
+
44
+	/**
45
+	 * extra meta key for tracking reg status os trashed registrations
46
+	 *
47
+	 * @type string
48
+	 */
49
+	const PRE_TRASH_REG_STATUS_KEY = 'pre_trash_registration_status';
50
+
51
+
52
+	/**
53
+	 * extra meta key for tracking if registration has reserved ticket
54
+	 *
55
+	 * @type string
56
+	 */
57
+	const HAS_RESERVED_TICKET_KEY = 'has_reserved_ticket';
58
+
59
+
60
+	/**
61
+	 * @param array  $props_n_values          incoming values
62
+	 * @param string $timezone                incoming timezone (if not set the timezone set for the website will be
63
+	 *                                        used.)
64
+	 * @param array  $date_formats            incoming date_formats in an array where the first value is the
65
+	 *                                        date_format and the second value is the time format
66
+	 * @return EE_Registration
67
+	 * @throws EE_Error
68
+	 */
69
+	public static function new_instance($props_n_values = array(), $timezone = null, $date_formats = array())
70
+	{
71
+		$has_object = parent::_check_for_object($props_n_values, __CLASS__, $timezone, $date_formats);
72
+		return $has_object ? $has_object : new self($props_n_values, false, $timezone, $date_formats);
73
+	}
74
+
75
+
76
+	/**
77
+	 * @param array  $props_n_values  incoming values from the database
78
+	 * @param string $timezone        incoming timezone as set by the model.  If not set the timezone for
79
+	 *                                the website will be used.
80
+	 * @return EE_Registration
81
+	 */
82
+	public static function new_instance_from_db($props_n_values = array(), $timezone = null)
83
+	{
84
+		return new self($props_n_values, true, $timezone);
85
+	}
86
+
87
+
88
+	/**
89
+	 *        Set Event ID
90
+	 *
91
+	 * @param        int $EVT_ID Event ID
92
+	 * @throws EE_Error
93
+	 * @throws RuntimeException
94
+	 */
95
+	public function set_event($EVT_ID = 0)
96
+	{
97
+		$this->set('EVT_ID', $EVT_ID);
98
+	}
99
+
100
+
101
+	/**
102
+	 * Overrides parent set() method so that all calls to set( 'REG_code', $REG_code ) OR set( 'STS_ID', $STS_ID ) can
103
+	 * be routed to internal methods
104
+	 *
105
+	 * @param string $field_name
106
+	 * @param mixed  $field_value
107
+	 * @param bool   $use_default
108
+	 * @throws \EE_Error
109
+	 * @throws \RuntimeException
110
+	 */
111
+	public function set($field_name, $field_value, $use_default = false)
112
+	{
113
+		switch ($field_name) {
114
+			case 'REG_code':
115
+				if (! empty($field_value) && $this->reg_code() === null) {
116
+					$this->set_reg_code($field_value, $use_default);
117
+				}
118
+				break;
119
+			case 'STS_ID':
120
+				$this->set_status($field_value, $use_default);
121
+				break;
122
+			default:
123
+				parent::set($field_name, $field_value, $use_default);
124
+		}
125
+	}
126
+
127
+
128
+	/**
129
+	 * Set Status ID
130
+	 * updates the registration status and ALSO...
131
+	 * calls reserve_registration_space() if the reg status changes TO approved from any other reg status
132
+	 * calls release_registration_space() if the reg status changes FROM approved to any other reg status
133
+	 *
134
+	 * @param string  $new_STS_ID
135
+	 * @param boolean $use_default
136
+	 * @return bool
137
+	 * @throws \RuntimeException
138
+	 * @throws \EE_Error
139
+	 */
140
+	public function set_status($new_STS_ID = null, $use_default = false)
141
+	{
142
+		// get current REG_Status
143
+		$old_STS_ID = $this->status_ID();
144
+		// if status has changed
145
+		if ($old_STS_ID !== $new_STS_ID // and that status has actually changed
146
+			&& ! empty($old_STS_ID) // and that old status is actually set
147
+			&& ! empty($new_STS_ID) // as well as the new status
148
+			&& $this->ID() // ensure registration is in the db
149
+		) {
150
+			// TO approved
151
+			if ($new_STS_ID === EEM_Registration::status_id_approved) {
152
+				// reserve a space by incrementing ticket and datetime sold values
153
+				$this->_reserve_registration_space();
154
+				do_action('AHEE__EE_Registration__set_status__to_approved', $this, $old_STS_ID, $new_STS_ID);
155
+				// OR FROM  approved
156
+			} elseif ($old_STS_ID === EEM_Registration::status_id_approved) {
157
+				// release a space by decrementing ticket and datetime sold values
158
+				$this->_release_registration_space();
159
+				do_action('AHEE__EE_Registration__set_status__from_approved', $this, $old_STS_ID, $new_STS_ID);
160
+			}
161
+			// update status
162
+			parent::set('STS_ID', $new_STS_ID, $use_default);
163
+			$this->_update_if_canceled_or_declined($new_STS_ID, $old_STS_ID);
164
+			/** @type EE_Transaction_Payments $transaction_payments */
165
+			$transaction_payments = EE_Registry::instance()->load_class('Transaction_Payments');
166
+			$transaction_payments->recalculate_transaction_total($this->transaction(), false);
167
+			$this->transaction()->update_status_based_on_total_paid(true);
168
+			do_action('AHEE__EE_Registration__set_status__after_update', $this, $old_STS_ID, $new_STS_ID);
169
+			return true;
170
+		}
171
+		//even though the old value matches the new value, it's still good to
172
+		//allow the parent set method to have a say
173
+		parent::set('STS_ID', $new_STS_ID, $use_default);
174
+		return true;
175
+	}
176
+
177
+
178
+	/**
179
+	 * update REGs and TXN when cancelled or declined registrations involved
180
+	 *
181
+	 * @param string $new_STS_ID
182
+	 * @param string $old_STS_ID
183
+	 * @throws \EE_Error
184
+	 */
185
+	private function _update_if_canceled_or_declined($new_STS_ID, $old_STS_ID)
186
+	{
187
+		// these reg statuses should not be considered in any calculations involving monies owing
188
+		$closed_reg_statuses = EEM_Registration::closed_reg_statuses();
189
+		// true if registration has been cancelled or declined
190
+		if (in_array($new_STS_ID, $closed_reg_statuses, true)
191
+			&& ! in_array($old_STS_ID, $closed_reg_statuses, true)
192
+		) {
193
+			/** @type EE_Registration_Processor $registration_processor */
194
+			$registration_processor = EE_Registry::instance()->load_class('Registration_Processor');
195
+			/** @type EE_Transaction_Processor $transaction_processor */
196
+			$transaction_processor = EE_Registry::instance()->load_class('Transaction_Processor');
197
+			// cancelled or declined registration
198
+			$registration_processor->update_registration_after_being_canceled_or_declined(
199
+				$this,
200
+				$closed_reg_statuses
201
+			);
202
+			$transaction_processor->update_transaction_after_canceled_or_declined_registration(
203
+				$this,
204
+				$closed_reg_statuses,
205
+				false
206
+			);
207
+			do_action('AHEE__EE_Registration__set_status__canceled_or_declined', $this, $old_STS_ID, $new_STS_ID);
208
+			return;
209
+		}
210
+		// true if reinstating cancelled or declined registration
211
+		if (in_array($old_STS_ID, $closed_reg_statuses, true)
212
+			&& ! in_array($new_STS_ID, $closed_reg_statuses, true)
213
+		) {
214
+			/** @type EE_Registration_Processor $registration_processor */
215
+			$registration_processor = EE_Registry::instance()->load_class('Registration_Processor');
216
+			/** @type EE_Transaction_Processor $transaction_processor */
217
+			$transaction_processor = EE_Registry::instance()->load_class('Transaction_Processor');
218
+			// reinstating cancelled or declined registration
219
+			$registration_processor->update_canceled_or_declined_registration_after_being_reinstated(
220
+				$this,
221
+				$closed_reg_statuses
222
+			);
223
+			$transaction_processor->update_transaction_after_reinstating_canceled_registration(
224
+				$this,
225
+				$closed_reg_statuses,
226
+				false
227
+			);
228
+			do_action('AHEE__EE_Registration__set_status__after_reinstated', $this, $old_STS_ID, $new_STS_ID);
229
+		}
230
+	}
231
+
232
+
233
+	/**
234
+	 *        get Status ID
235
+	 */
236
+	public function status_ID()
237
+	{
238
+		return $this->get('STS_ID');
239
+	}
240
+
241
+
242
+	/**
243
+	 * increments this registration's related ticket sold and corresponding datetime sold values
244
+	 *
245
+	 * @return void
246
+	 * @throws EE_Error
247
+	 * @throws EntityNotFoundException
248
+	 */
249
+	private function _reserve_registration_space()
250
+	{
251
+		// reserved ticket and datetime counts will be decremented as sold counts are incremented
252
+		// so stop tracking that this reg has a ticket reserved
253
+		$this->release_reserved_ticket();
254
+		$ticket = $this->ticket();
255
+		$ticket->increase_sold();
256
+		$ticket->save();
257
+		// possibly set event status to sold out
258
+		$this->event()->perform_sold_out_status_check();
259
+	}
260
+
261
+
262
+	/**
263
+	 * Gets the ticket this registration is for
264
+	 *
265
+	 * @param boolean $include_archived whether to include archived tickets or not.
266
+	 * @return EE_Ticket|EE_Base_Class
267
+	 * @throws \EE_Error
268
+	 */
269
+	public function ticket($include_archived = true)
270
+	{
271
+		$query_params = array();
272
+		if ($include_archived) {
273
+			$query_params['default_where_conditions'] = 'none';
274
+		}
275
+		return $this->get_first_related('Ticket', $query_params);
276
+	}
277
+
278
+
279
+	/**
280
+	 * Gets the event this registration is for
281
+	 *
282
+	 * @return EE_Event
283
+	 * @throws EE_Error
284
+	 * @throws EntityNotFoundException
285
+	 */
286
+	public function event()
287
+	{
288
+		$event = $this->get_first_related('Event');
289
+		if (! $event instanceof \EE_Event) {
290
+			throw new EntityNotFoundException('Event ID', $this->event_ID());
291
+		}
292
+		return $event;
293
+	}
294
+
295
+
296
+	/**
297
+	 * Gets the "author" of the registration.  Note that for the purposes of registrations, the author will correspond
298
+	 * with the author of the event this registration is for.
299
+	 *
300
+	 * @since 4.5.0
301
+	 * @return int
302
+	 * @throws EE_Error
303
+	 * @throws EntityNotFoundException
304
+	 */
305
+	public function wp_user()
306
+	{
307
+		$event = $this->event();
308
+		if ($event instanceof EE_Event) {
309
+			return $event->wp_user();
310
+		}
311
+		return 0;
312
+	}
313
+
314
+
315
+	/**
316
+	 * decrements (subtracts) this registration's related ticket sold and corresponding datetime sold values
317
+	 *
318
+	 * @return void
319
+	 * @throws \EE_Error
320
+	 */
321
+	private function _release_registration_space()
322
+	{
323
+		$ticket = $this->ticket();
324
+		$ticket->decrease_sold();
325
+		$ticket->save();
326
+	}
327
+
328
+
329
+	/**
330
+	 * tracks this registration's ticket reservation in extra meta
331
+	 * and can increment related ticket reserved and corresponding datetime reserved values
332
+	 *
333
+	 * @param bool $update_ticket if true, will increment ticket and datetime reserved count
334
+	 * @return void
335
+	 * @throws \EE_Error
336
+	 */
337
+	public function reserve_ticket($update_ticket = false)
338
+	{
339
+		if ($this->get_extra_meta(EE_Registration::HAS_RESERVED_TICKET_KEY, true, false) === false) {
340
+			// PLZ NOTE: although checking $update_ticket first would be more efficient,
341
+			// we NEED to ALWAYS call update_extra_meta(), which is why that is done first
342
+			if ($this->update_extra_meta(EE_Registration::HAS_RESERVED_TICKET_KEY, true, false) && $update_ticket) {
343
+				$ticket = $this->ticket();
344
+				$ticket->increase_reserved();
345
+				$ticket->save();
346
+			}
347
+		}
348
+	}
349
+
350
+
351
+	/**
352
+	 * stops tracking this registration's ticket reservation in extra meta
353
+	 * decrements (subtracts) related ticket reserved and corresponding datetime reserved values
354
+	 *
355
+	 * @param bool $update_ticket if true, will decrement ticket and datetime reserved count
356
+	 * @return void
357
+	 * @throws \EE_Error
358
+	 */
359
+	public function release_reserved_ticket($update_ticket = false)
360
+	{
361
+		if ($this->get_extra_meta(EE_Registration::HAS_RESERVED_TICKET_KEY, true, false) !== false) {
362
+			// PLZ NOTE: although checking $update_ticket first would be more efficient,
363
+			// we NEED to ALWAYS call delete_extra_meta(), which is why that is done first
364
+			if ($this->delete_extra_meta(EE_Registration::HAS_RESERVED_TICKET_KEY) && $update_ticket) {
365
+				$ticket = $this->ticket();
366
+				$ticket->decrease_reserved();
367
+				$ticket->save();
368
+			}
369
+		}
370
+	}
371
+
372
+
373
+	/**
374
+	 * Set Attendee ID
375
+	 *
376
+	 * @param        int $ATT_ID Attendee ID
377
+	 * @throws EE_Error
378
+	 * @throws RuntimeException
379
+	 */
380
+	public function set_attendee_id($ATT_ID = 0)
381
+	{
382
+		$this->set('ATT_ID', $ATT_ID);
383
+	}
384
+
385
+
386
+	/**
387
+	 *        Set Transaction ID
388
+	 *
389
+	 * @param        int $TXN_ID Transaction ID
390
+	 * @throws EE_Error
391
+	 * @throws RuntimeException
392
+	 */
393
+	public function set_transaction_id($TXN_ID = 0)
394
+	{
395
+		$this->set('TXN_ID', $TXN_ID);
396
+	}
397
+
398
+
399
+	/**
400
+	 *        Set Session
401
+	 *
402
+	 * @param    string $REG_session PHP Session ID
403
+	 * @throws EE_Error
404
+	 * @throws RuntimeException
405
+	 */
406
+	public function set_session($REG_session = '')
407
+	{
408
+		$this->set('REG_session', $REG_session);
409
+	}
410
+
411
+
412
+	/**
413
+	 *        Set Registration URL Link
414
+	 *
415
+	 * @param    string $REG_url_link Registration URL Link
416
+	 * @throws EE_Error
417
+	 * @throws RuntimeException
418
+	 */
419
+	public function set_reg_url_link($REG_url_link = '')
420
+	{
421
+		$this->set('REG_url_link', $REG_url_link);
422
+	}
423
+
424
+
425
+	/**
426
+	 *        Set Attendee Counter
427
+	 *
428
+	 * @param        int $REG_count Primary Attendee
429
+	 * @throws EE_Error
430
+	 * @throws RuntimeException
431
+	 */
432
+	public function set_count($REG_count = 1)
433
+	{
434
+		$this->set('REG_count', $REG_count);
435
+	}
436
+
437
+
438
+	/**
439
+	 *        Set Group Size
440
+	 *
441
+	 * @param        boolean $REG_group_size Group Registration
442
+	 * @throws EE_Error
443
+	 * @throws RuntimeException
444
+	 */
445
+	public function set_group_size($REG_group_size = false)
446
+	{
447
+		$this->set('REG_group_size', $REG_group_size);
448
+	}
449
+
450
+
451
+	/**
452
+	 *    is_not_approved -  convenience method that returns TRUE if REG status ID ==
453
+	 *    EEM_Registration::status_id_not_approved
454
+	 *
455
+	 * @return        boolean
456
+	 */
457
+	public function is_not_approved()
458
+	{
459
+		return $this->status_ID() == EEM_Registration::status_id_not_approved ? true : false;
460
+	}
461
+
462
+
463
+	/**
464
+	 *    is_pending_payment -  convenience method that returns TRUE if REG status ID ==
465
+	 *    EEM_Registration::status_id_pending_payment
466
+	 *
467
+	 * @return        boolean
468
+	 */
469
+	public function is_pending_payment()
470
+	{
471
+		return $this->status_ID() == EEM_Registration::status_id_pending_payment ? true : false;
472
+	}
473
+
474
+
475
+	/**
476
+	 *    is_approved -  convenience method that returns TRUE if REG status ID == EEM_Registration::status_id_approved
477
+	 *
478
+	 * @return        boolean
479
+	 */
480
+	public function is_approved()
481
+	{
482
+		return $this->status_ID() == EEM_Registration::status_id_approved ? true : false;
483
+	}
484
+
485
+
486
+	/**
487
+	 *    is_cancelled -  convenience method that returns TRUE if REG status ID == EEM_Registration::status_id_cancelled
488
+	 *
489
+	 * @return        boolean
490
+	 */
491
+	public function is_cancelled()
492
+	{
493
+		return $this->status_ID() == EEM_Registration::status_id_cancelled ? true : false;
494
+	}
495
+
496
+
497
+	/**
498
+	 *    is_declined -  convenience method that returns TRUE if REG status ID == EEM_Registration::status_id_declined
499
+	 *
500
+	 * @return        boolean
501
+	 */
502
+	public function is_declined()
503
+	{
504
+		return $this->status_ID() == EEM_Registration::status_id_declined ? true : false;
505
+	}
506
+
507
+
508
+	/**
509
+	 *    is_incomplete -  convenience method that returns TRUE if REG status ID ==
510
+	 *    EEM_Registration::status_id_incomplete
511
+	 *
512
+	 * @return        boolean
513
+	 */
514
+	public function is_incomplete()
515
+	{
516
+		return $this->status_ID() == EEM_Registration::status_id_incomplete ? true : false;
517
+	}
518
+
519
+
520
+	/**
521
+	 *        Set Registration Date
522
+	 *
523
+	 * @param        mixed ( int or string ) $REG_date Registration Date - Unix timestamp or string representation of
524
+	 *                                                 Date
525
+	 * @throws EE_Error
526
+	 * @throws RuntimeException
527
+	 */
528
+	public function set_reg_date($REG_date = false)
529
+	{
530
+		$this->set('REG_date', $REG_date);
531
+	}
532
+
533
+
534
+	/**
535
+	 *    Set final price owing for this registration after all ticket/price modifications
536
+	 *
537
+	 * @access    public
538
+	 * @param    float $REG_final_price
539
+	 * @throws EE_Error
540
+	 * @throws RuntimeException
541
+	 */
542
+	public function set_final_price($REG_final_price = 0.00)
543
+	{
544
+		$this->set('REG_final_price', $REG_final_price);
545
+	}
546
+
547
+
548
+	/**
549
+	 *    Set amount paid towards this registration's final price
550
+	 *
551
+	 * @access    public
552
+	 * @param    float $REG_paid
553
+	 * @throws EE_Error
554
+	 * @throws RuntimeException
555
+	 */
556
+	public function set_paid($REG_paid = 0.00)
557
+	{
558
+		$this->set('REG_paid', $REG_paid);
559
+	}
560
+
561
+
562
+	/**
563
+	 *        Attendee Is Going
564
+	 *
565
+	 * @param        boolean $REG_att_is_going Attendee Is Going
566
+	 * @throws EE_Error
567
+	 * @throws RuntimeException
568
+	 */
569
+	public function set_att_is_going($REG_att_is_going = false)
570
+	{
571
+		$this->set('REG_att_is_going', $REG_att_is_going);
572
+	}
573
+
574
+
575
+	/**
576
+	 * Gets the related attendee
577
+	 *
578
+	 * @return EE_Attendee
579
+	 * @throws EE_Error
580
+	 */
581
+	public function attendee()
582
+	{
583
+		return $this->get_first_related('Attendee');
584
+	}
585
+
586
+
587
+	/**
588
+	 *        get Event ID
589
+	 */
590
+	public function event_ID()
591
+	{
592
+		return $this->get('EVT_ID');
593
+	}
594
+
595
+
596
+	/**
597
+	 *        get Event ID
598
+	 */
599
+	public function event_name()
600
+	{
601
+		$event = $this->event_obj();
602
+		if ($event) {
603
+			return $event->name();
604
+		} else {
605
+			return null;
606
+		}
607
+	}
608
+
609
+
610
+	/**
611
+	 * Fetches the event this registration is for
612
+	 *
613
+	 * @return EE_Event
614
+	 * @throws EE_Error
615
+	 */
616
+	public function event_obj()
617
+	{
618
+		return $this->get_first_related('Event');
619
+	}
620
+
621
+
622
+	/**
623
+	 *        get Attendee ID
624
+	 */
625
+	public function attendee_ID()
626
+	{
627
+		return $this->get('ATT_ID');
628
+	}
629
+
630
+
631
+	/**
632
+	 *        get PHP Session ID
633
+	 */
634
+	public function session_ID()
635
+	{
636
+		return $this->get('REG_session');
637
+	}
638
+
639
+
640
+	/**
641
+	 * Gets the string which represents the URL trigger for the receipt template in the message template system.
642
+	 *
643
+	 * @param string $messenger 'pdf' or 'html'.  Default 'html'.
644
+	 * @return string
645
+	 */
646
+	public function receipt_url($messenger = 'html')
647
+	{
648
+
649
+		/**
650
+		 * The below will be deprecated one version after this.  We check first if there is a custom receipt template
651
+		 * already in use on old system.  If there is then we just return the standard url for it.
652
+		 *
653
+		 * @since 4.5.0
654
+		 */
655
+		$template_relative_path = 'modules/gateways/Invoice/lib/templates/receipt_body.template.php';
656
+		$has_custom             = EEH_Template::locate_template(
657
+			$template_relative_path,
658
+			array(),
659
+			true,
660
+			true,
661
+			true
662
+		);
663
+
664
+		if ($has_custom) {
665
+			return add_query_arg(array('receipt' => 'true'), $this->invoice_url('launch'));
666
+		}
667
+		return apply_filters('FHEE__EE_Registration__receipt_url__receipt_url', '', $this, $messenger, 'receipt');
668
+	}
669
+
670
+
671
+	/**
672
+	 * Gets the string which represents the URL trigger for the invoice template in the message template system.
673
+	 *
674
+	 * @param string $messenger 'pdf' or 'html'.  Default 'html'.
675
+	 * @return string
676
+	 * @throws EE_Error
677
+	 */
678
+	public function invoice_url($messenger = 'html')
679
+	{
680
+		/**
681
+		 * The below will be deprecated one version after this.  We check first if there is a custom invoice template
682
+		 * already in use on old system.  If there is then we just return the standard url for it.
683
+		 *
684
+		 * @since 4.5.0
685
+		 */
686
+		$template_relative_path = 'modules/gateways/Invoice/lib/templates/invoice_body.template.php';
687
+		$has_custom             = EEH_Template::locate_template(
688
+			$template_relative_path,
689
+			array(),
690
+			true,
691
+			true,
692
+			true
693
+		);
694
+
695
+		if ($has_custom) {
696
+			if ($messenger == 'html') {
697
+				return $this->invoice_url('launch');
698
+			}
699
+			$route = $messenger == 'download' || $messenger == 'pdf' ? 'download_invoice' : 'launch_invoice';
700
+
701
+			$query_args = array('ee' => $route, 'id' => $this->reg_url_link());
702
+			if ($messenger == 'html') {
703
+				$query_args['html'] = true;
704
+			}
705
+			return add_query_arg($query_args, get_permalink(EE_Registry::instance()->CFG->core->thank_you_page_id));
706
+		}
707
+		return apply_filters('FHEE__EE_Registration__invoice_url__invoice_url', '', $this, $messenger, 'invoice');
708
+	}
709
+
710
+
711
+	/**
712
+	 * get Registration URL Link
713
+	 *
714
+	 * @access public
715
+	 * @return string
716
+	 * @throws \EE_Error
717
+	 */
718
+	public function reg_url_link()
719
+	{
720
+		return (string) $this->get('REG_url_link');
721
+	}
722
+
723
+
724
+	/**
725
+	 * Echoes out invoice_url()
726
+	 *
727
+	 * @param string $type 'download','launch', or 'html' (default is 'launch')
728
+	 * @return void
729
+	 * @throws EE_Error
730
+	 */
731
+	public function e_invoice_url($type = 'launch')
732
+	{
733
+		echo $this->invoice_url($type);
734
+	}
735
+
736
+
737
+	/**
738
+	 * Echoes out payment_overview_url
739
+	 */
740
+	public function e_payment_overview_url()
741
+	{
742
+		echo $this->payment_overview_url();
743
+	}
744
+
745
+
746
+	/**
747
+	 * Gets the URL of the thank you page with this registration REG_url_link added as
748
+	 * a query parameter
749
+	 *
750
+	 * @param bool $clear_session Set to true when you want to clear the session on revisiting the
751
+	 *                            payment overview url.
752
+	 * @return string
753
+	 * @throws EE_Error
754
+	 */
755
+	public function payment_overview_url($clear_session = false)
756
+	{
757
+		return add_query_arg(array(
758
+			'e_reg_url_link' => $this->reg_url_link(),
759
+			'step'           => 'payment_options',
760
+			'revisit'        => true,
761
+			'clear_session' => (bool) $clear_session
762
+		), EE_Registry::instance()->CFG->core->reg_page_url());
763
+	}
764
+
765
+
766
+	/**
767
+	 * Gets the URL of the thank you page with this registration REG_url_link added as
768
+	 * a query parameter
769
+	 *
770
+	 * @return string
771
+	 * @throws EE_Error
772
+	 */
773
+	public function edit_attendee_information_url()
774
+	{
775
+		return add_query_arg(array(
776
+			'e_reg_url_link' => $this->reg_url_link(),
777
+			'step'           => 'attendee_information',
778
+			'revisit'        => true,
779
+		), EE_Registry::instance()->CFG->core->reg_page_url());
780
+	}
781
+
782
+
783
+	/**
784
+	 * Simply generates and returns the appropriate admin_url link to edit this registration
785
+	 *
786
+	 * @return string
787
+	 * @throws EE_Error
788
+	 */
789
+	public function get_admin_edit_url()
790
+	{
791
+		return EEH_URL::add_query_args_and_nonce(array(
792
+			'page'    => 'espresso_registrations',
793
+			'action'  => 'view_registration',
794
+			'_REG_ID' => $this->ID(),
795
+		), admin_url('admin.php'));
796
+	}
797
+
798
+
799
+	/**
800
+	 *    is_primary_registrant?
801
+	 */
802
+	public function is_primary_registrant()
803
+	{
804
+		return $this->get('REG_count') == 1 ? true : false;
805
+	}
806
+
807
+
808
+	/**
809
+	 * This returns the primary registration object for this registration group (which may be this object).
810
+	 *
811
+	 * @return EE_Registration
812
+	 * @throws EE_Error
813
+	 */
814
+	public function get_primary_registration()
815
+	{
816
+		if ($this->is_primary_registrant()) {
817
+			return $this;
818
+		}
819
+
820
+		//k reg_count !== 1 so let's get the EE_Registration object matching this txn_id and reg_count == 1
821
+		/** @var EE_Registration $primary_registrant */
822
+		$primary_registrant = EEM_Registration::instance()->get_one(array(
823
+			array(
824
+				'TXN_ID'    => $this->transaction_ID(),
825
+				'REG_count' => 1,
826
+			),
827
+		));
828
+		return $primary_registrant;
829
+	}
830
+
831
+
832
+	/**
833
+	 *        get  Attendee Number
834
+	 *
835
+	 * @access        public
836
+	 */
837
+	public function count()
838
+	{
839
+		return $this->get('REG_count');
840
+	}
841
+
842
+
843
+	/**
844
+	 *        get Group Size
845
+	 */
846
+	public function group_size()
847
+	{
848
+		return $this->get('REG_group_size');
849
+	}
850
+
851
+
852
+	/**
853
+	 *        get Registration Date
854
+	 */
855
+	public function date()
856
+	{
857
+		return $this->get('REG_date');
858
+	}
859
+
860
+
861
+	/**
862
+	 * gets a pretty date
863
+	 *
864
+	 * @param string $date_format
865
+	 * @param string $time_format
866
+	 * @return string
867
+	 * @throws EE_Error
868
+	 */
869
+	public function pretty_date($date_format = null, $time_format = null)
870
+	{
871
+		return $this->get_datetime('REG_date', $date_format, $time_format);
872
+	}
873
+
874
+
875
+	/**
876
+	 * final_price
877
+	 * the registration's share of the transaction total, so that the
878
+	 * sum of all the transaction's REG_final_prices equal the transaction's total
879
+	 *
880
+	 * @return float
881
+	 * @throws EE_Error
882
+	 */
883
+	public function final_price()
884
+	{
885
+		return $this->get('REG_final_price');
886
+	}
887
+
888
+
889
+	/**
890
+	 * pretty_final_price
891
+	 *  final price as formatted string, with correct decimal places and currency symbol
892
+	 *
893
+	 * @return string
894
+	 * @throws EE_Error
895
+	 */
896
+	public function pretty_final_price()
897
+	{
898
+		return $this->get_pretty('REG_final_price');
899
+	}
900
+
901
+
902
+	/**
903
+	 * get paid (yeah)
904
+	 *
905
+	 * @return float
906
+	 * @throws EE_Error
907
+	 */
908
+	public function paid()
909
+	{
910
+		return $this->get('REG_paid');
911
+	}
912
+
913
+
914
+	/**
915
+	 * pretty_paid
916
+	 *
917
+	 * @return float
918
+	 * @throws EE_Error
919
+	 */
920
+	public function pretty_paid()
921
+	{
922
+		return $this->get_pretty('REG_paid');
923
+	}
924
+
925
+
926
+	/**
927
+	 * owes_monies_and_can_pay
928
+	 * whether or not this registration has monies owing and it's' status allows payment
929
+	 *
930
+	 * @param array $requires_payment
931
+	 * @return bool
932
+	 * @throws EE_Error
933
+	 */
934
+	public function owes_monies_and_can_pay($requires_payment = array())
935
+	{
936
+		// these reg statuses require payment (if event is not free)
937
+		$requires_payment = ! empty($requires_payment)
938
+			? $requires_payment
939
+			: EEM_Registration::reg_statuses_that_allow_payment();
940
+		if (in_array($this->status_ID(), $requires_payment) &&
941
+			$this->final_price() != 0 &&
942
+			$this->final_price() != $this->paid()
943
+		) {
944
+			return true;
945
+		} else {
946
+			return false;
947
+		}
948
+	}
949
+
950
+
951
+	/**
952
+	 * Prints out the return value of $this->pretty_status()
953
+	 *
954
+	 * @param bool $show_icons
955
+	 * @return void
956
+	 * @throws EE_Error
957
+	 */
958
+	public function e_pretty_status($show_icons = false)
959
+	{
960
+		echo $this->pretty_status($show_icons);
961
+	}
962
+
963
+
964
+	/**
965
+	 * Returns a nice version of the status for displaying to customers
966
+	 *
967
+	 * @param bool $show_icons
968
+	 * @return string
969
+	 * @throws EE_Error
970
+	 */
971
+	public function pretty_status($show_icons = false)
972
+	{
973
+		$status = EEM_Status::instance()->localized_status(
974
+			array($this->status_ID() => esc_html__('unknown', 'event_espresso')),
975
+			false,
976
+			'sentence'
977
+		);
978
+		$icon   = '';
979
+		switch ($this->status_ID()) {
980
+			case EEM_Registration::status_id_approved:
981
+				$icon = $show_icons
982
+					? '<span class="dashicons dashicons-star-filled ee-icon-size-16 green-text"></span>'
983
+					: '';
984
+				break;
985
+			case EEM_Registration::status_id_pending_payment:
986
+				$icon = $show_icons
987
+					? '<span class="dashicons dashicons-star-half ee-icon-size-16 orange-text"></span>'
988
+					: '';
989
+				break;
990
+			case EEM_Registration::status_id_not_approved:
991
+				$icon = $show_icons
992
+					? '<span class="dashicons dashicons-marker ee-icon-size-16 orange-text"></span>'
993
+					: '';
994
+				break;
995
+			case EEM_Registration::status_id_cancelled:
996
+				$icon = $show_icons
997
+					? '<span class="dashicons dashicons-no ee-icon-size-16 lt-grey-text"></span>'
998
+					: '';
999
+				break;
1000
+			case EEM_Registration::status_id_incomplete:
1001
+				$icon = $show_icons
1002
+					? '<span class="dashicons dashicons-no ee-icon-size-16 lt-orange-text"></span>'
1003
+					: '';
1004
+				break;
1005
+			case EEM_Registration::status_id_declined:
1006
+				$icon = $show_icons
1007
+					? '<span class="dashicons dashicons-no ee-icon-size-16 red-text"></span>'
1008
+					: '';
1009
+				break;
1010
+			case EEM_Registration::status_id_wait_list:
1011
+				$icon = $show_icons
1012
+					? '<span class="dashicons dashicons-clipboard ee-icon-size-16 purple-text"></span>'
1013
+					: '';
1014
+				break;
1015
+		}
1016
+		return $icon . $status[$this->status_ID()];
1017
+	}
1018
+
1019
+
1020
+	/**
1021
+	 *        get Attendee Is Going
1022
+	 */
1023
+	public function att_is_going()
1024
+	{
1025
+		return $this->get('REG_att_is_going');
1026
+	}
1027
+
1028
+
1029
+	/**
1030
+	 * Gets related answers
1031
+	 *
1032
+	 * @param array $query_params like EEM_Base::get_all
1033
+	 * @return EE_Answer[]
1034
+	 * @throws EE_Error
1035
+	 */
1036
+	public function answers($query_params = null)
1037
+	{
1038
+		return $this->get_many_related('Answer', $query_params);
1039
+	}
1040
+
1041
+
1042
+	/**
1043
+	 * Gets the registration's answer value to the specified question
1044
+	 * (either the question's ID or a question object)
1045
+	 *
1046
+	 * @param EE_Question|int $question
1047
+	 * @param bool            $pretty_value
1048
+	 * @return array|string if pretty_value= true, the result will always be a string
1049
+	 * (because the answer might be an array of answer values, so passing pretty_value=true
1050
+	 * will convert it into some kind of string)
1051
+	 * @throws EE_Error
1052
+	 */
1053
+	public function answer_value_to_question($question, $pretty_value = true)
1054
+	{
1055
+		$question_id = EEM_Question::instance()->ensure_is_ID($question);
1056
+		return EEM_Answer::instance()->get_answer_value_to_question($this, $question_id, $pretty_value);
1057
+	}
1058
+
1059
+
1060
+	/**
1061
+	 * question_groups
1062
+	 * returns an array of EE_Question_Group objects for this registration
1063
+	 *
1064
+	 * @return EE_Question_Group[]
1065
+	 * @throws EE_Error
1066
+	 * @throws EntityNotFoundException
1067
+	 */
1068
+	public function question_groups()
1069
+	{
1070
+		$question_groups = array();
1071
+		if ($this->event() instanceof EE_Event) {
1072
+			$question_groups = $this->event()->question_groups(
1073
+				array(
1074
+					array(
1075
+						'Event_Question_Group.EQG_primary' => $this->count() == 1 ? true : false,
1076
+					),
1077
+					'order_by' => array('QSG_order' => 'ASC'),
1078
+				)
1079
+			);
1080
+		}
1081
+		return $question_groups;
1082
+	}
1083
+
1084
+
1085
+	/**
1086
+	 * count_question_groups
1087
+	 * returns a count of the number of EE_Question_Group objects for this registration
1088
+	 *
1089
+	 * @return int
1090
+	 * @throws EE_Error
1091
+	 * @throws EntityNotFoundException
1092
+	 */
1093
+	public function count_question_groups()
1094
+	{
1095
+		$qg_count = 0;
1096
+		if ($this->event() instanceof EE_Event) {
1097
+			$qg_count = $this->event()->count_related(
1098
+				'Question_Group',
1099
+				array(
1100
+					array(
1101
+						'Event_Question_Group.EQG_primary' => $this->count() == 1 ? true : false,
1102
+					),
1103
+				)
1104
+			);
1105
+		}
1106
+		return $qg_count;
1107
+	}
1108
+
1109
+
1110
+	/**
1111
+	 * Returns the registration date in the 'standard' string format
1112
+	 * (function may be improved in the future to allow for different formats and timezones)
1113
+	 *
1114
+	 * @return string
1115
+	 * @throws EE_Error
1116
+	 */
1117
+	public function reg_date()
1118
+	{
1119
+		return $this->get_datetime('REG_date');
1120
+	}
1121
+
1122
+
1123
+	/**
1124
+	 * Gets the datetime-ticket for this registration (ie, it can be used to isolate
1125
+	 * the ticket this registration purchased, or the datetime they have registered
1126
+	 * to attend)
1127
+	 *
1128
+	 * @return EE_Datetime_Ticket
1129
+	 * @throws EE_Error
1130
+	 */
1131
+	public function datetime_ticket()
1132
+	{
1133
+		return $this->get_first_related('Datetime_Ticket');
1134
+	}
1135
+
1136
+
1137
+	/**
1138
+	 * Sets the registration's datetime_ticket.
1139
+	 *
1140
+	 * @param EE_Datetime_Ticket $datetime_ticket
1141
+	 * @return EE_Datetime_Ticket
1142
+	 * @throws EE_Error
1143
+	 */
1144
+	public function set_datetime_ticket($datetime_ticket)
1145
+	{
1146
+		return $this->_add_relation_to($datetime_ticket, 'Datetime_Ticket');
1147
+	}
1148
+
1149
+	/**
1150
+	 * Gets deleted
1151
+	 *
1152
+	 * @return bool
1153
+	 * @throws EE_Error
1154
+	 */
1155
+	public function deleted()
1156
+	{
1157
+		return $this->get('REG_deleted');
1158
+	}
1159
+
1160
+	/**
1161
+	 * Sets deleted
1162
+	 *
1163
+	 * @param boolean $deleted
1164
+	 * @return bool
1165
+	 * @throws EE_Error
1166
+	 * @throws RuntimeException
1167
+	 */
1168
+	public function set_deleted($deleted)
1169
+	{
1170
+		if ($deleted) {
1171
+			$this->delete();
1172
+		} else {
1173
+			$this->restore();
1174
+		}
1175
+	}
1176
+
1177
+
1178
+	/**
1179
+	 * Get the status object of this object
1180
+	 *
1181
+	 * @return EE_Status
1182
+	 * @throws EE_Error
1183
+	 */
1184
+	public function status_obj()
1185
+	{
1186
+		return $this->get_first_related('Status');
1187
+	}
1188
+
1189
+
1190
+	/**
1191
+	 * Returns the number of times this registration has checked into any of the datetimes
1192
+	 * its available for
1193
+	 *
1194
+	 * @return int
1195
+	 * @throws EE_Error
1196
+	 */
1197
+	public function count_checkins()
1198
+	{
1199
+		return $this->get_model()->count_related($this, 'Checkin');
1200
+	}
1201
+
1202
+
1203
+	/**
1204
+	 * Returns the number of current Check-ins this registration is checked into for any of the datetimes the
1205
+	 * registration is for.  Note, this is ONLY checked in (does not include checkedout)
1206
+	 *
1207
+	 * @return int
1208
+	 * @throws EE_Error
1209
+	 */
1210
+	public function count_checkins_not_checkedout()
1211
+	{
1212
+		return $this->get_model()->count_related($this, 'Checkin', array(array('CHK_in' => 1)));
1213
+	}
1214
+
1215
+
1216
+	/**
1217
+	 * The purpose of this method is simply to check whether this registration can checkin to the given datetime.
1218
+	 *
1219
+	 * @param int | EE_Datetime $DTT_OR_ID      The datetime the registration is being checked against
1220
+	 * @param bool              $check_approved This is used to indicate whether the caller wants can_checkin to also
1221
+	 *                                          consider registration status as well as datetime access.
1222
+	 * @return bool
1223
+	 * @throws EE_Error
1224
+	 */
1225
+	public function can_checkin($DTT_OR_ID, $check_approved = true)
1226
+	{
1227
+		$DTT_ID = EEM_Datetime::instance()->ensure_is_ID($DTT_OR_ID);
1228
+
1229
+		//first check registration status
1230
+		if (($check_approved && ! $this->is_approved()) || ! $DTT_ID) {
1231
+			return false;
1232
+		}
1233
+		//is there a datetime ticket that matches this dtt_ID?
1234
+		if (! (EEM_Datetime_Ticket::instance()->exists(array(
1235
+			array(
1236
+				'TKT_ID' => $this->get('TKT_ID'),
1237
+				'DTT_ID' => $DTT_ID,
1238
+			),
1239
+		)))
1240
+		) {
1241
+			return false;
1242
+		}
1243
+
1244
+		//final check is against TKT_uses
1245
+		return $this->verify_can_checkin_against_TKT_uses($DTT_ID);
1246
+	}
1247
+
1248
+
1249
+	/**
1250
+	 * This method verifies whether the user can checkin for the given datetime considering the max uses value set on
1251
+	 * the ticket. To do this,  a query is done to get the count of the datetime records already checked into.  If the
1252
+	 * datetime given does not have a check-in record and checking in for that datetime will exceed the allowed uses,
1253
+	 * then return false.  Otherwise return true.
1254
+	 *
1255
+	 * @param int | EE_Datetime $DTT_OR_ID The datetime the registration is being checked against
1256
+	 * @return bool true means can checkin.  false means cannot checkin.
1257
+	 * @throws EE_Error
1258
+	 */
1259
+	public function verify_can_checkin_against_TKT_uses($DTT_OR_ID)
1260
+	{
1261
+		$DTT_ID = EEM_Datetime::instance()->ensure_is_ID($DTT_OR_ID);
1262
+
1263
+		if (! $DTT_ID) {
1264
+			return false;
1265
+		}
1266
+
1267
+		$max_uses = $this->ticket() instanceof EE_Ticket ? $this->ticket()->uses() : EE_INF;
1268
+
1269
+		// if max uses is not set or equals infinity then return true cause its not a factor for whether user can
1270
+		// check-in or not.
1271
+		if (! $max_uses || $max_uses === EE_INF) {
1272
+			return true;
1273
+		}
1274
+
1275
+		//does this datetime have a checkin record?  If so, then the dtt count has already been verified so we can just
1276
+		//go ahead and toggle.
1277
+		if (EEM_Checkin::instance()->exists(array(array('REG_ID' => $this->ID(), 'DTT_ID' => $DTT_ID)))) {
1278
+			return true;
1279
+		}
1280
+
1281
+		//made it here so the last check is whether the number of checkins per unique datetime on this registration
1282
+		//disallows further check-ins.
1283
+		$count_unique_dtt_checkins = EEM_Checkin::instance()->count(array(
1284
+			array(
1285
+				'REG_ID' => $this->ID(),
1286
+				'CHK_in' => true,
1287
+			),
1288
+		), 'DTT_ID', true);
1289
+		// checkins have already reached their max number of uses
1290
+		// so registrant can NOT checkin
1291
+		if ($count_unique_dtt_checkins >= $max_uses) {
1292
+			EE_Error::add_error(
1293
+				esc_html__(
1294
+					'Check-in denied because number of datetime uses for the ticket has been reached or exceeded.',
1295
+					'event_espresso'
1296
+				),
1297
+				__FILE__,
1298
+				__FUNCTION__,
1299
+				__LINE__
1300
+			);
1301
+			return false;
1302
+		}
1303
+		return true;
1304
+	}
1305
+
1306
+
1307
+	/**
1308
+	 * toggle Check-in status for this registration
1309
+	 * Check-ins are toggled in the following order:
1310
+	 * never checked in -> checked in
1311
+	 * checked in -> checked out
1312
+	 * checked out -> checked in
1313
+	 *
1314
+	 * @param  int $DTT_ID  include specific datetime to toggle Check-in for.
1315
+	 *                      If not included or null, then it is assumed latest datetime is being toggled.
1316
+	 * @param bool $verify  If true then can_checkin() is used to verify whether the person
1317
+	 *                      can be checked in or not.  Otherwise this forces change in checkin status.
1318
+	 * @return bool|int     the chk_in status toggled to OR false if nothing got changed.
1319
+	 * @throws EE_Error
1320
+	 */
1321
+	public function toggle_checkin_status($DTT_ID = null, $verify = false)
1322
+	{
1323
+		if (empty($DTT_ID)) {
1324
+			$datetime = $this->get_latest_related_datetime();
1325
+			$DTT_ID   = $datetime instanceof EE_Datetime ? $datetime->ID() : 0;
1326
+			// verify the registration can checkin for the given DTT_ID
1327
+		} elseif (! $this->can_checkin($DTT_ID, $verify)) {
1328
+			EE_Error::add_error(
1329
+				sprintf(
1330
+					esc_html__(
1331
+						'The given registration (ID:%1$d) can not be checked in to the given DTT_ID (%2$d), because the registration does not have access',
1332
+						'event_espresso'
1333
+					),
1334
+					$this->ID(),
1335
+					$DTT_ID
1336
+				),
1337
+				__FILE__,
1338
+				__FUNCTION__,
1339
+				__LINE__
1340
+			);
1341
+			return false;
1342
+		}
1343
+		$status_paths = array(
1344
+			EE_Checkin::status_checked_never => EE_Checkin::status_checked_in,
1345
+			EE_Checkin::status_checked_in    => EE_Checkin::status_checked_out,
1346
+			EE_Checkin::status_checked_out   => EE_Checkin::status_checked_in,
1347
+		);
1348
+		//start by getting the current status so we know what status we'll be changing to.
1349
+		$cur_status = $this->check_in_status_for_datetime($DTT_ID, null);
1350
+		$status_to  = $status_paths[$cur_status];
1351
+		// database only records true for checked IN or false for checked OUT
1352
+		// no record ( null ) means checked in NEVER, but we obviously don't save that
1353
+		$new_status = $status_to === EE_Checkin::status_checked_in ? true : false;
1354
+		// add relation - note Check-ins are always creating new rows
1355
+		// because we are keeping track of Check-ins over time.
1356
+		// Eventually we'll probably want to show a list table
1357
+		// for the individual Check-ins so that they can be managed.
1358
+		$checkin = EE_Checkin::new_instance(array(
1359
+			'REG_ID' => $this->ID(),
1360
+			'DTT_ID' => $DTT_ID,
1361
+			'CHK_in' => $new_status,
1362
+		));
1363
+		// if the record could not be saved then return false
1364
+		if ($checkin->save() === 0) {
1365
+			if (WP_DEBUG) {
1366
+				global $wpdb;
1367
+				$error = sprintf(
1368
+					esc_html__(
1369
+						'Registration check in update failed because of the following database error: %1$s%2$s',
1370
+						'event_espresso'
1371
+					),
1372
+					'<br />',
1373
+					$wpdb->last_error
1374
+				);
1375
+			} else {
1376
+				$error = esc_html__(
1377
+					'Registration check in update failed because of an unknown database error',
1378
+					'event_espresso'
1379
+				);
1380
+			}
1381
+			EE_Error::add_error($error, __FILE__, __FUNCTION__, __LINE__);
1382
+			return false;
1383
+		}
1384
+		return $status_to;
1385
+	}
1386
+
1387
+
1388
+	/**
1389
+	 * Returns the latest datetime related to this registration (via the ticket attached to the registration).
1390
+	 * "Latest" is defined by the `DTT_EVT_start` column.
1391
+	 *
1392
+	 * @return EE_Datetime|null
1393
+	 * @throws \EE_Error
1394
+	 */
1395
+	public function get_latest_related_datetime()
1396
+	{
1397
+		return EEM_Datetime::instance()->get_one(
1398
+			array(
1399
+				array(
1400
+					'Ticket.Registration.REG_ID' => $this->ID(),
1401
+				),
1402
+				'order_by' => array('DTT_EVT_start' => 'DESC'),
1403
+			)
1404
+		);
1405
+	}
1406
+
1407
+
1408
+	/**
1409
+	 * Returns the earliest datetime related to this registration (via the ticket attached to the registration).
1410
+	 * "Earliest" is defined by the `DTT_EVT_start` column.
1411
+	 *
1412
+	 * @throws \EE_Error
1413
+	 */
1414
+	public function get_earliest_related_datetime()
1415
+	{
1416
+		return EEM_Datetime::instance()->get_one(
1417
+			array(
1418
+				array(
1419
+					'Ticket.Registration.REG_ID' => $this->ID(),
1420
+				),
1421
+				'order_by' => array('DTT_EVT_start' => 'ASC'),
1422
+			)
1423
+		);
1424
+	}
1425
+
1426
+
1427
+	/**
1428
+	 * This method simply returns the check-in status for this registration and the given datetime.
1429
+	 * If neither the datetime nor the checkin values are provided as arguments,
1430
+	 * then this will return the LATEST check-in status for the registration across all datetimes it belongs to.
1431
+	 *
1432
+	 * @param  int       $DTT_ID  The ID of the datetime we're checking against
1433
+	 *                            (if empty we'll get the primary datetime for
1434
+	 *                            this registration (via event) and use it's ID);
1435
+	 * @param EE_Checkin $checkin If present, we use the given checkin object rather than the dtt_id.
1436
+	 * @return int                Integer representing Check-in status.
1437
+	 * @throws \EE_Error
1438
+	 */
1439
+	public function check_in_status_for_datetime($DTT_ID = 0, $checkin = null)
1440
+	{
1441
+		$checkin_query_params = array(
1442
+			'order_by' => array('CHK_timestamp' => 'DESC'),
1443
+		);
1444
+
1445
+		if ($DTT_ID > 0) {
1446
+			$checkin_query_params[0] = array('DTT_ID' => $DTT_ID);
1447
+		}
1448
+
1449
+		//get checkin object (if exists)
1450
+		$checkin = $checkin instanceof EE_Checkin
1451
+			? $checkin
1452
+			: $this->get_first_related('Checkin', $checkin_query_params);
1453
+		if ($checkin instanceof EE_Checkin) {
1454
+			if ($checkin->get('CHK_in')) {
1455
+				return EE_Checkin::status_checked_in; //checked in
1456
+			}
1457
+			return EE_Checkin::status_checked_out; //had checked in but is now checked out.
1458
+		}
1459
+		return EE_Checkin::status_checked_never; //never been checked in
1460
+	}
1461
+
1462
+
1463
+	/**
1464
+	 * This method returns a localized message for the toggled Check-in message.
1465
+	 *
1466
+	 * @param  int $DTT_ID include specific datetime to get the correct Check-in message.  If not included or null,
1467
+	 *                     then it is assumed Check-in for primary datetime was toggled.
1468
+	 * @param bool $error  This just flags that you want an error message returned. This is put in so that the error
1469
+	 *                     message can be customized with the attendee name.
1470
+	 * @return string internationalized message
1471
+	 * @throws EE_Error
1472
+	 */
1473
+	public function get_checkin_msg($DTT_ID, $error = false)
1474
+	{
1475
+		//let's get the attendee first so we can include the name of the attendee
1476
+		$attendee = $this->get_first_related('Attendee');
1477
+		if ($attendee instanceof EE_Attendee) {
1478
+			if ($error) {
1479
+				return sprintf(__("%s's check-in status was not changed.", "event_espresso"), $attendee->full_name());
1480
+			}
1481
+			$cur_status = $this->check_in_status_for_datetime($DTT_ID);
1482
+			//what is the status message going to be?
1483
+			switch ($cur_status) {
1484
+				case EE_Checkin::status_checked_never:
1485
+					return sprintf(__("%s has been removed from Check-in records", "event_espresso"),
1486
+						$attendee->full_name());
1487
+					break;
1488
+				case EE_Checkin::status_checked_in:
1489
+					return sprintf(__('%s has been checked in', 'event_espresso'), $attendee->full_name());
1490
+					break;
1491
+				case EE_Checkin::status_checked_out:
1492
+					return sprintf(__('%s has been checked out', 'event_espresso'), $attendee->full_name());
1493
+					break;
1494
+			}
1495
+		}
1496
+		return esc_html__("The check-in status could not be determined.", "event_espresso");
1497
+	}
1498
+
1499
+
1500
+	/**
1501
+	 * Returns the related EE_Transaction to this registration
1502
+	 *
1503
+	 * @return EE_Transaction
1504
+	 * @throws EE_Error
1505
+	 * @throws EntityNotFoundException
1506
+	 */
1507
+	public function transaction()
1508
+	{
1509
+		$transaction = $this->get_first_related('Transaction');
1510
+		if (! $transaction instanceof \EE_Transaction) {
1511
+			throw new EntityNotFoundException('Transaction ID', $this->transaction_ID());
1512
+		}
1513
+		return $transaction;
1514
+	}
1515
+
1516
+
1517
+	/**
1518
+	 *        get Registration Code
1519
+	 */
1520
+	public function reg_code()
1521
+	{
1522
+		return $this->get('REG_code');
1523
+	}
1524
+
1525
+
1526
+	/**
1527
+	 *        get Transaction ID
1528
+	 */
1529
+	public function transaction_ID()
1530
+	{
1531
+		return $this->get('TXN_ID');
1532
+	}
1533
+
1534
+
1535
+	/**
1536
+	 * @return int
1537
+	 * @throws EE_Error
1538
+	 */
1539
+	public function ticket_ID()
1540
+	{
1541
+		return $this->get('TKT_ID');
1542
+	}
1543
+
1544
+
1545
+	/**
1546
+	 *        Set Registration Code
1547
+	 *
1548
+	 * @access    public
1549
+	 * @param    string  $REG_code Registration Code
1550
+	 * @param    boolean $use_default
1551
+	 * @throws EE_Error
1552
+	 */
1553
+	public function set_reg_code($REG_code, $use_default = false)
1554
+	{
1555
+		if (empty($REG_code)) {
1556
+			EE_Error::add_error(
1557
+				esc_html__('REG_code can not be empty.', 'event_espresso'),
1558
+				__FILE__,
1559
+				__FUNCTION__,
1560
+				__LINE__
1561
+			);
1562
+			return;
1563
+		}
1564
+		if (! $this->reg_code()) {
1565
+			parent::set('REG_code', $REG_code, $use_default);
1566
+		} else {
1567
+			EE_Error::doing_it_wrong(
1568
+				__CLASS__ . '::' . __FUNCTION__,
1569
+				esc_html__('Can not change a registration REG_code once it has been set.', 'event_espresso'),
1570
+				'4.6.0'
1571
+			);
1572
+		}
1573
+	}
1574
+
1575
+
1576
+	/**
1577
+	 * Returns all other registrations in the same group as this registrant who have the same ticket option.
1578
+	 * Note, if you want to just get all registrations in the same transaction (group), use:
1579
+	 *    $registration->transaction()->registrations();
1580
+	 *
1581
+	 * @since 4.5.0
1582
+	 * @return EE_Registration[] or empty array if this isn't a group registration.
1583
+	 * @throws EE_Error
1584
+	 */
1585
+	public function get_all_other_registrations_in_group()
1586
+	{
1587
+		if ($this->group_size() < 2) {
1588
+			return array();
1589
+		}
1590
+
1591
+		$query[0] = array(
1592
+			'TXN_ID' => $this->transaction_ID(),
1593
+			'REG_ID' => array('!=', $this->ID()),
1594
+			'TKT_ID' => $this->ticket_ID(),
1595
+		);
1596
+		/** @var EE_Registration[] $registrations */
1597
+		$registrations = $this->get_model()->get_all($query);
1598
+		return $registrations;
1599
+	}
1600
+
1601
+	/**
1602
+	 * Return the link to the admin details for the object.
1603
+	 *
1604
+	 * @return string
1605
+	 * @throws EE_Error
1606
+	 */
1607
+	public function get_admin_details_link()
1608
+	{
1609
+		EE_Registry::instance()->load_helper('URL');
1610
+		return EEH_URL::add_query_args_and_nonce(
1611
+			array(
1612
+				'page'    => 'espresso_registrations',
1613
+				'action'  => 'view_registration',
1614
+				'_REG_ID' => $this->ID(),
1615
+			),
1616
+			admin_url('admin.php')
1617
+		);
1618
+	}
1619
+
1620
+	/**
1621
+	 * Returns the link to the editor for the object.  Sometimes this is the same as the details.
1622
+	 *
1623
+	 * @return string
1624
+	 * @throws EE_Error
1625
+	 */
1626
+	public function get_admin_edit_link()
1627
+	{
1628
+		return $this->get_admin_details_link();
1629
+	}
1630
+
1631
+	/**
1632
+	 * Returns the link to a settings page for the object.
1633
+	 *
1634
+	 * @return string
1635
+	 * @throws EE_Error
1636
+	 */
1637
+	public function get_admin_settings_link()
1638
+	{
1639
+		return $this->get_admin_details_link();
1640
+	}
1641
+
1642
+	/**
1643
+	 * Returns the link to the "overview" for the object (typically the "list table" view).
1644
+	 *
1645
+	 * @return string
1646
+	 */
1647
+	public function get_admin_overview_link()
1648
+	{
1649
+		EE_Registry::instance()->load_helper('URL');
1650
+		return EEH_URL::add_query_args_and_nonce(
1651
+			array(
1652
+				'page' => 'espresso_registrations',
1653
+			),
1654
+			admin_url('admin.php')
1655
+		);
1656
+	}
1657
+
1658
+
1659
+	/**
1660
+	 * @param array $query_params
1661
+	 * @return \EE_Registration[]
1662
+	 * @throws \EE_Error
1663
+	 */
1664
+	public function payments($query_params = array())
1665
+	{
1666
+		return $this->get_many_related('Payment', $query_params);
1667
+	}
1668
+
1669
+
1670
+	/**
1671
+	 * @param array $query_params
1672
+	 * @return \EE_Registration_Payment[]
1673
+	 * @throws \EE_Error
1674
+	 */
1675
+	public function registration_payments($query_params = array())
1676
+	{
1677
+		return $this->get_many_related('Registration_Payment', $query_params);
1678
+	}
1679
+
1680
+
1681
+	/**
1682
+	 * This grabs the payment method corresponding to the last payment made for the amount owing on the registration.
1683
+	 * Note: if there are no payments on the registration there will be no payment method returned.
1684
+	 *
1685
+	 * @return EE_Payment_Method|null
1686
+	 */
1687
+	public function payment_method()
1688
+	{
1689
+		return EEM_Payment_Method::instance()->get_last_used_for_registration($this);
1690
+	}
1691
+
1692
+
1693
+	/**
1694
+	 * @return \EE_Line_Item
1695
+	 * @throws EntityNotFoundException
1696
+	 * @throws \EE_Error
1697
+	 */
1698
+	public function ticket_line_item()
1699
+	{
1700
+		$ticket            = $this->ticket();
1701
+		$transaction       = $this->transaction();
1702
+		$line_item         = null;
1703
+		$ticket_line_items = \EEH_Line_Item::get_line_items_by_object_type_and_IDs(
1704
+			$transaction->total_line_item(),
1705
+			'Ticket',
1706
+			array($ticket->ID())
1707
+		);
1708
+		foreach ($ticket_line_items as $ticket_line_item) {
1709
+			if (
1710
+				$ticket_line_item instanceof \EE_Line_Item
1711
+				&& $ticket_line_item->OBJ_type() === 'Ticket'
1712
+				&& $ticket_line_item->OBJ_ID() === $ticket->ID()
1713
+			) {
1714
+				$line_item = $ticket_line_item;
1715
+				break;
1716
+			}
1717
+		}
1718
+		if (! ($line_item instanceof \EE_Line_Item && $line_item->OBJ_type() === 'Ticket')) {
1719
+			throw new EntityNotFoundException('Line Item Ticket ID', $ticket->ID());
1720
+		}
1721
+		return $line_item;
1722
+	}
1723
+
1724
+
1725
+	/**
1726
+	 * Soft Deletes this model object.
1727
+	 *
1728
+	 * @return boolean | int
1729
+	 * @throws \RuntimeException
1730
+	 * @throws \EE_Error
1731
+	 */
1732
+	public function delete()
1733
+	{
1734
+		if ($this->update_extra_meta(EE_Registration::PRE_TRASH_REG_STATUS_KEY, $this->status_ID()) === true) {
1735
+			$this->set_status(EEM_Registration::status_id_cancelled);
1736
+		}
1737
+		return parent::delete();
1738
+	}
1739
+
1740
+
1741
+	/**
1742
+	 * Restores whatever the previous status was on a registration before it was trashed (if possible)
1743
+	 *
1744
+	 * @throws \EE_Error
1745
+	 * @throws \RuntimeException
1746
+	 */
1747
+	public function restore()
1748
+	{
1749
+		$previous_status = $this->get_extra_meta(
1750
+			EE_Registration::PRE_TRASH_REG_STATUS_KEY,
1751
+			true,
1752
+			EEM_Registration::status_id_cancelled
1753
+		);
1754
+		if ($previous_status) {
1755
+			$this->delete_extra_meta(EE_Registration::PRE_TRASH_REG_STATUS_KEY);
1756
+			$this->set_status($previous_status);
1757
+		}
1758
+		return parent::restore();
1759
+	}
1760
+
1761
+
1762
+
1763
+	/*************************** DEPRECATED ***************************/
1764
+
1765
+
1766
+	/**
1767
+	 * @deprecated
1768
+	 * @since     4.7.0
1769
+	 * @access    public
1770
+	 */
1771
+	public function price_paid()
1772
+	{
1773
+		EE_Error::doing_it_wrong('EE_Registration::price_paid()',
1774
+			esc_html__('This method is deprecated, please use EE_Registration::final_price() instead.', 'event_espresso'),
1775
+			'4.7.0');
1776
+		return $this->final_price();
1777
+	}
1778
+
1779
+
1780
+	/**
1781
+	 * @deprecated
1782
+	 * @since     4.7.0
1783
+	 * @access    public
1784
+	 * @param    float $REG_final_price
1785
+	 * @throws EE_Error
1786
+	 * @throws RuntimeException
1787
+	 */
1788
+	public function set_price_paid($REG_final_price = 0.00)
1789
+	{
1790
+		EE_Error::doing_it_wrong('EE_Registration::set_price_paid()',
1791
+			esc_html__('This method is deprecated, please use EE_Registration::set_final_price() instead.', 'event_espresso'),
1792
+			'4.7.0');
1793
+		$this->set_final_price($REG_final_price);
1794
+	}
1795
+
1796
+
1797
+	/**
1798
+	 * @deprecated
1799
+	 * @since 4.7.0
1800
+	 * @return string
1801
+	 * @throws EE_Error
1802
+	 */
1803
+	public function pretty_price_paid()
1804
+	{
1805
+		EE_Error::doing_it_wrong('EE_Registration::pretty_price_paid()',
1806
+			esc_html__('This method is deprecated, please use EE_Registration::pretty_final_price() instead.',
1807
+				'event_espresso'), '4.7.0');
1808
+		return $this->pretty_final_price();
1809
+	}
1810
+
1811
+
1812
+	/**
1813
+	 * Gets the primary datetime related to this registration via the related Event to this registration
1814
+	 *
1815
+	 * @deprecated 4.9.17
1816
+	 * @return EE_Datetime
1817
+	 * @throws EE_Error
1818
+	 * @throws EntityNotFoundException
1819
+	 */
1820
+	public function get_related_primary_datetime()
1821
+	{
1822
+		EE_Error::doing_it_wrong(
1823
+			__METHOD__,
1824
+			esc_html__(
1825
+				'Use EE_Registration::get_latest_related_datetime() or EE_Registration::get_earliest_related_datetime()',
1826
+				'event_espresso'
1827
+			),
1828
+			'4.9.17',
1829
+			'5.0.0'
1830
+		);
1831
+		return $this->event()->primary_datetime();
1832
+	}
1833 1833
 
1834 1834
 
1835 1835
 }
Please login to merge, or discard this patch.
core/libraries/rest_api/calculations/Registration.php 1 patch
Indentation   +59 added lines, -59 removed lines patch added patch discarded remove patch
@@ -17,7 +17,7 @@  discard block
 block discarded – undo
17 17
  * @since                 $VID:$
18 18
  */
19 19
 if (! defined('EVENT_ESPRESSO_VERSION')) {
20
-    exit('No direct script access allowed');
20
+	exit('No direct script access allowed');
21 21
 }
22 22
 
23 23
 
@@ -25,62 +25,62 @@  discard block
 block discarded – undo
25 25
 class Registration extends Calculations_Base
26 26
 {
27 27
 
28
-    /**
29
-     * Calculates the checkin status for each datetime this registration has access to
30
-     *
31
-     * @param array            $wpdb_row
32
-     * @param \WP_REST_Request $request
33
-     * @param Base             $controller
34
-     * @return array
35
-     * @throws \EE_Error
36
-     */
37
-    public static function datetimeCheckinStati($wpdb_row, $request, $controller)
38
-    {
39
-        if (is_array($wpdb_row) && isset($wpdb_row['Registration.REG_ID'])) {
40
-            $reg = EEM_Registration::instance()->get_one_by_ID($wpdb_row['Registration.REG_ID']);
41
-        } else {
42
-            $reg = null;
43
-        }
44
-        if (! $reg instanceof EE_Registration
45
-        ) {
46
-            throw new \EE_Error(
47
-                sprintf(
48
-                    __(
49
-                        // @codingStandardsIgnoreStart
50
-                        'Cannot calculate datetime_checkin_stati because the registration with ID %1$s (from database row %2$s) was not found',
51
-                        // @codingStandardsIgnoreEnd
52
-                        'event_espresso'
53
-                    ),
54
-                    $wpdb_row['Registration.REG_ID'],
55
-                    print_r($wpdb_row, true)
56
-                )
57
-            );
58
-        }
59
-        $datetime_ids = EEM_Datetime::instance()->get_col(
60
-            array(
61
-                array(
62
-                    'Ticket.TKT_ID' => $reg->ticket_ID(),
63
-                ),
64
-                'default_where_conditions' => \EEM_Base::default_where_conditions_minimum_all
65
-            )
66
-        );
67
-        $checkin_stati = array();
68
-        foreach ($datetime_ids as $datetime_id) {
69
-            $status = $reg->check_in_status_for_datetime($datetime_id);
70
-            switch ($status) {
71
-                case EE_Checkin::status_checked_out:
72
-                    $status_pretty = 'OUT';
73
-                    break;
74
-                case EE_Checkin::status_checked_in:
75
-                    $status_pretty = 'IN';
76
-                    break;
77
-                case EE_Checkin::status_checked_never:
78
-                default:
79
-                    $status_pretty = 'NEVER';
80
-                    break;
81
-            }
82
-            $checkin_stati[$datetime_id] = $status_pretty;
83
-        }
84
-        return $checkin_stati;
85
-    }
28
+	/**
29
+	 * Calculates the checkin status for each datetime this registration has access to
30
+	 *
31
+	 * @param array            $wpdb_row
32
+	 * @param \WP_REST_Request $request
33
+	 * @param Base             $controller
34
+	 * @return array
35
+	 * @throws \EE_Error
36
+	 */
37
+	public static function datetimeCheckinStati($wpdb_row, $request, $controller)
38
+	{
39
+		if (is_array($wpdb_row) && isset($wpdb_row['Registration.REG_ID'])) {
40
+			$reg = EEM_Registration::instance()->get_one_by_ID($wpdb_row['Registration.REG_ID']);
41
+		} else {
42
+			$reg = null;
43
+		}
44
+		if (! $reg instanceof EE_Registration
45
+		) {
46
+			throw new \EE_Error(
47
+				sprintf(
48
+					__(
49
+						// @codingStandardsIgnoreStart
50
+						'Cannot calculate datetime_checkin_stati because the registration with ID %1$s (from database row %2$s) was not found',
51
+						// @codingStandardsIgnoreEnd
52
+						'event_espresso'
53
+					),
54
+					$wpdb_row['Registration.REG_ID'],
55
+					print_r($wpdb_row, true)
56
+				)
57
+			);
58
+		}
59
+		$datetime_ids = EEM_Datetime::instance()->get_col(
60
+			array(
61
+				array(
62
+					'Ticket.TKT_ID' => $reg->ticket_ID(),
63
+				),
64
+				'default_where_conditions' => \EEM_Base::default_where_conditions_minimum_all
65
+			)
66
+		);
67
+		$checkin_stati = array();
68
+		foreach ($datetime_ids as $datetime_id) {
69
+			$status = $reg->check_in_status_for_datetime($datetime_id);
70
+			switch ($status) {
71
+				case EE_Checkin::status_checked_out:
72
+					$status_pretty = 'OUT';
73
+					break;
74
+				case EE_Checkin::status_checked_in:
75
+					$status_pretty = 'IN';
76
+					break;
77
+				case EE_Checkin::status_checked_never:
78
+				default:
79
+					$status_pretty = 'NEVER';
80
+					break;
81
+			}
82
+			$checkin_stati[$datetime_id] = $status_pretty;
83
+		}
84
+		return $checkin_stati;
85
+	}
86 86
 }
Please login to merge, or discard this patch.
ui/browser/checkins/entities/CheckinStatusDashicon.php 1 patch
Indentation   +69 added lines, -69 removed lines patch added patch discarded remove patch
@@ -21,83 +21,83 @@
 block discarded – undo
21 21
 class CheckinStatusDashicon
22 22
 {
23 23
 
24
-    /**
25
-     * @var int $checkin_status
26
-     */
27
-    private $checkin_status;
24
+	/**
25
+	 * @var int $checkin_status
26
+	 */
27
+	private $checkin_status;
28 28
 
29 29
 
30
-    /**
31
-     * CheckinStatusDashicon constructor.
32
-     *
33
-     * @param int $checkin_status
34
-     */
35
-    public function __construct($checkin_status = EE_Checkin::status_checked_never)
36
-    {
37
-        $this->checkin_status = $checkin_status;
38
-    }
30
+	/**
31
+	 * CheckinStatusDashicon constructor.
32
+	 *
33
+	 * @param int $checkin_status
34
+	 */
35
+	public function __construct($checkin_status = EE_Checkin::status_checked_never)
36
+	{
37
+		$this->checkin_status = $checkin_status;
38
+	}
39 39
 
40 40
 
41
-    /**
42
-     * @param EE_Checkin $checkin
43
-     * @return CheckinStatusDashicon
44
-     * @throws EE_Error
45
-     */
46
-    public static function fromCheckin(EE_Checkin $checkin)
47
-    {
48
-        return new CheckinStatusDashicon(
49
-            $checkin->status()
50
-                ? EE_Checkin::status_checked_in
51
-                : EE_Checkin::status_checked_out
52
-        );
53
-    }
41
+	/**
42
+	 * @param EE_Checkin $checkin
43
+	 * @return CheckinStatusDashicon
44
+	 * @throws EE_Error
45
+	 */
46
+	public static function fromCheckin(EE_Checkin $checkin)
47
+	{
48
+		return new CheckinStatusDashicon(
49
+			$checkin->status()
50
+				? EE_Checkin::status_checked_in
51
+				: EE_Checkin::status_checked_out
52
+		);
53
+	}
54 54
 
55 55
 
56
-    /**
57
-     * @param EE_Registration $registration
58
-     * @param EE_Datetime     $datetime
59
-     * @return CheckinStatusDashicon
60
-     * @throws EE_Error
61
-     */
62
-    public static function fromRegistrationAndDatetime(EE_Registration $registration, EE_Datetime $datetime)
63
-    {
64
-        return new CheckinStatusDashicon(
65
-            $registration->check_in_status_for_datetime(
66
-                $datetime->ID()
67
-            )
68
-        );
69
-    }
56
+	/**
57
+	 * @param EE_Registration $registration
58
+	 * @param EE_Datetime     $datetime
59
+	 * @return CheckinStatusDashicon
60
+	 * @throws EE_Error
61
+	 */
62
+	public static function fromRegistrationAndDatetime(EE_Registration $registration, EE_Datetime $datetime)
63
+	{
64
+		return new CheckinStatusDashicon(
65
+			$registration->check_in_status_for_datetime(
66
+				$datetime->ID()
67
+			)
68
+		);
69
+	}
70 70
 
71 71
 
72
-    /**
73
-     * @param EE_Registration $registration
74
-     * @param int             $DTT_ID
75
-     * @return CheckinStatusDashicon
76
-     * @throws EE_Error
77
-     */
78
-    public static function fromRegistrationAndDatetimeId(EE_Registration $registration, $DTT_ID = 0)
79
-    {
80
-        return new CheckinStatusDashicon(
81
-            $registration->check_in_status_for_datetime(
82
-                absint($DTT_ID)
83
-            )
84
-        );
85
-    }
72
+	/**
73
+	 * @param EE_Registration $registration
74
+	 * @param int             $DTT_ID
75
+	 * @return CheckinStatusDashicon
76
+	 * @throws EE_Error
77
+	 */
78
+	public static function fromRegistrationAndDatetimeId(EE_Registration $registration, $DTT_ID = 0)
79
+	{
80
+		return new CheckinStatusDashicon(
81
+			$registration->check_in_status_for_datetime(
82
+				absint($DTT_ID)
83
+			)
84
+		);
85
+	}
86 86
 
87
-    /**
88
-     * Will return the correct set of dashicon css classes for the set checkin status
89
-     *
90
-     * @return string
91
-     */
92
-    public function cssClasses()
93
-    {
94
-        if ($this->checkin_status === EE_Checkin::status_checked_in) {
95
-            return "ee-dashicons ee-icon-check-in checkin-icons checkedin-status-{$this->checkin_status}";
96
-        }
97
-        if ($this->checkin_status === EE_Checkin::status_checked_out) {
98
-            return "ee-dashicons ee-icon-check-out checkin-icons checkedin-status-{$this->checkin_status}";
99
-        }
100
-        return "dashicons dashicons-no checkin-icons checkedin-status-{$this->checkin_status}";
101
-    }
87
+	/**
88
+	 * Will return the correct set of dashicon css classes for the set checkin status
89
+	 *
90
+	 * @return string
91
+	 */
92
+	public function cssClasses()
93
+	{
94
+		if ($this->checkin_status === EE_Checkin::status_checked_in) {
95
+			return "ee-dashicons ee-icon-check-in checkin-icons checkedin-status-{$this->checkin_status}";
96
+		}
97
+		if ($this->checkin_status === EE_Checkin::status_checked_out) {
98
+			return "ee-dashicons ee-icon-check-out checkin-icons checkedin-status-{$this->checkin_status}";
99
+		}
100
+		return "dashicons dashicons-no checkin-icons checkedin-status-{$this->checkin_status}";
101
+	}
102 102
 }
103 103
 // Location: ui/browser/checkins/entities/CheckinStatusDashicon.php
Please login to merge, or discard this patch.