Completed
Branch Gutenberg/event-attendees-bloc... (dcb43c)
by
unknown
21:24 queued 19:24
created
core/db_classes/EE_Question_Group.class.php 1 patch
Indentation   +276 added lines, -276 removed lines patch added patch discarded remove patch
@@ -12,280 +12,280 @@
 block discarded – undo
12 12
 class EE_Question_Group extends EE_Soft_Delete_Base_Class
13 13
 {
14 14
 
15
-    /**
16
-     * @param array $props_n_values
17
-     * @return EE_Question_Group|mixed
18
-     */
19
-    public static function new_instance($props_n_values = array())
20
-    {
21
-        $has_object = parent::_check_for_object($props_n_values, __CLASS__);
22
-        return $has_object ? $has_object : new self($props_n_values);
23
-    }
24
-
25
-
26
-    /**
27
-     * @param array $props_n_values
28
-     * @return EE_Question_Group
29
-     */
30
-    public static function new_instance_from_db($props_n_values = array())
31
-    {
32
-        return new self($props_n_values, true);
33
-    }
34
-
35
-
36
-    /**
37
-     * gets the question group's name
38
-     *
39
-     * @access public
40
-     * @param bool $pretty
41
-     * @return string
42
-     */
43
-    public function name($pretty = false)
44
-    {
45
-        return $pretty ? $this->get_pretty('QSG_name') : $this->get('QSG_name');
46
-    }
47
-
48
-
49
-    /**
50
-     * Gets the question group's internal name
51
-     *
52
-     * @access public
53
-     * @return string
54
-     */
55
-    public function identifier()
56
-    {
57
-        return $this->get('QSG_identifier');
58
-    }
59
-
60
-
61
-    /**
62
-     * Gets the question group's description
63
-     *
64
-     * @access public
65
-     * @param bool $pretty
66
-     * @return string
67
-     */
68
-    public function desc($pretty = false)
69
-    {
70
-        return $pretty ? $this->get_pretty('QSG_desc') : $this->get('QSG_desc');
71
-    }
72
-
73
-
74
-    /**
75
-     * Gets the question group's order number in a sequence
76
-     * of other question groups
77
-     *
78
-     * @access public
79
-     * @return int
80
-     */
81
-    public function order()
82
-    {
83
-        return $this->get('QSG_order');
84
-    }
85
-
86
-
87
-    /**
88
-     * Returns whether to show the group's name on the frontend
89
-     *
90
-     * @access public
91
-     * @return boolean
92
-     */
93
-    public function show_group_name()
94
-    {
95
-        return $this->get('QSG_show_group_name');
96
-    }
97
-
98
-
99
-    /**
100
-     * Returns whether to show the group's description
101
-     * on the frontend
102
-     *
103
-     * @access public
104
-     * @return boolean
105
-     */
106
-    public function show_group_desc()
107
-    {
108
-        return $this->get('QSG_show_group_desc');
109
-    }
110
-
111
-
112
-    /**
113
-     * Returns whether this is a 'system group' (meaning
114
-     * a question group integral to the system, whose questions
115
-     * relate to the attendee table)
116
-     *
117
-     * @access public
118
-     * @return int
119
-     */
120
-    public function system_group()
121
-    {
122
-        return $this->get('QSG_system');
123
-    }
124
-
125
-
126
-    /**
127
-     * get the author of the question group.
128
-     *
129
-     * @since 4.5.0
130
-     *
131
-     * @return int
132
-     */
133
-    public function wp_user()
134
-    {
135
-        return $this->get('QSG_wp_user');
136
-    }
137
-
138
-
139
-    /**
140
-     * Returns whether this question group has
141
-     * been deleted
142
-     *
143
-     * @access public
144
-     * @return boolean
145
-     */
146
-    public function deleted()
147
-    {
148
-        return $this->get('QST_deleted');
149
-    }
150
-
151
-
152
-    /**
153
-     * Gets an array of questions with questions IN the group at the start of the array and questions NOT in the group
154
-     * at the end of the array.  Questions in the group are ordered by Question_Group_Question.QGQ_order and questions
155
-     * NOT in the group are ordered by Question.QGQ_order
156
-     *
157
-     * @return EE_Question[]
158
-     */
159
-    public function questions_in_and_not_in_group()
160
-    {
161
-        $questions_in_group = $this->questions();
162
-        $exclude_question_ids = ! empty($questions_in_group) ? array_keys($questions_in_group) : array();
163
-        $questions_not_in_group = $this->questions_not_in_group($exclude_question_ids);
164
-        return $questions_in_group + $questions_not_in_group;
165
-    }
166
-
167
-
168
-    /**
169
-     * Gets all the questions which are part of this question group (ordered Question_Group_Question.QGQ_order)
170
-     *
171
-     * @param array $query_params
172
-     * @return EE_Question[]
173
-     */
174
-    public function questions($query_params = array())
175
-    {
176
-        $query_params = ! empty($query_params) ? $query_params
177
-            : array('order_by' => array('Question_Group_Question.QGQ_order' => 'ASC'));
178
-        return $this->ID() ? $this->get_many_related('Question', $query_params) : array();
179
-    }
180
-
181
-
182
-    /**
183
-     * Gets all the questions which are NOT part of this question group.
184
-     *
185
-     * @param  mixed $question_IDS_in_group if empty array then all questions returned.  if FALSE then we first get
186
-     *                                      questions in this group and exclude them from questions get all. IF empty
187
-     *                                      array then we just return all questions.
188
-     * @return EE_Question[]
189
-     */
190
-    public function questions_not_in_group($question_IDS_in_group = false)
191
-    {
192
-        if ($question_IDS_in_group === false) {
193
-            $questions = $this->questions();
194
-            $question_IDS_in_group = ! empty($questions) ? array_keys($questions) : array();
195
-        }
196
-        $_where = ! empty($question_IDS_in_group) ? array('QST_ID' => array('not_in', $question_IDS_in_group))
197
-            : array();
198
-
199
-        return EEM_Question::instance()->get_all(array($_where, 'order_by' => array('QST_ID' => 'ASC')));
200
-    }
201
-
202
-
203
-    /**
204
-     * Gets all events which are related to this question group
205
-     *
206
-     * @return EE_Event[]
207
-     */
208
-    public function events()
209
-    {
210
-        return $this->get_many_related('Event');
211
-    }
212
-
213
-
214
-    /**
215
-     * Adds the question to this question group
216
-     *
217
-     * @param EE_Question || int $question object or ID
218
-     * @return boolean if successful
219
-     */
220
-    public function add_question($questionObjectOrID)
221
-    {
222
-        return $this->_add_relation_to($questionObjectOrID, 'Question');
223
-    }
224
-
225
-
226
-    /**
227
-     * Removes the question from this question group
228
-     *
229
-     * @param EE_Question || int $question object or ID
230
-     * @return boolean of success
231
-     */
232
-    public function remove_question($questionObjectOrID)
233
-    {
234
-        return $this->_remove_relation_to($questionObjectOrID, 'Question');
235
-    }
236
-
237
-
238
-    /**
239
-     * @param $questionObjectOrID
240
-     * @param $qst_order
241
-     * @return int
242
-     */
243
-    public function update_question_order($questionObjectOrID, $qst_order)
244
-    {
245
-        $qst_ID = $questionObjectOrID instanceof EE_Question ? $questionObjectOrID->ID() : (int) $questionObjectOrID;
246
-        return EEM_Question_Group_Question::instance()->update(
247
-            array('QGQ_order' => $qst_order),
248
-            array(
249
-                array(
250
-                    'QST_ID' => $qst_ID,
251
-                    'QSG_ID' => $this->ID(),
252
-                ),
253
-            )
254
-        );
255
-    }
256
-
257
-
258
-    /**
259
-     * Basically this is method just returns whether the question group has any questions with answers.  This is used
260
-     * by the admin currently to determine whether we should display the ui for deleting permanently or not b/c
261
-     * question groups with questions that have answers should not be possible to delete permanently
262
-     *
263
-     * @return boolean true if has questions with answers, false if not.
264
-     */
265
-    public function has_questions_with_answers()
266
-    {
267
-        $has_answers = false;
268
-        $questions = $this->get_many_related('Question');
269
-        foreach ($questions as $question) {
270
-            if ($question->count_related('Answer') > 0) {
271
-                $has_answers = true;
272
-            }
273
-        }
274
-        return $has_answers;
275
-    }
276
-
277
-
278
-    /**
279
-     * The purpose of this method is set the question group order for this question group to be the max out of all
280
-     * question groups
281
-     *
282
-     * @access public
283
-     * @return void
284
-     */
285
-    public function set_order_to_latest()
286
-    {
287
-        $latest_order = $this->get_model()->get_latest_question_group_order();
288
-        $latest_order++;
289
-        $this->set('QSG_order', $latest_order);
290
-    }
15
+	/**
16
+	 * @param array $props_n_values
17
+	 * @return EE_Question_Group|mixed
18
+	 */
19
+	public static function new_instance($props_n_values = array())
20
+	{
21
+		$has_object = parent::_check_for_object($props_n_values, __CLASS__);
22
+		return $has_object ? $has_object : new self($props_n_values);
23
+	}
24
+
25
+
26
+	/**
27
+	 * @param array $props_n_values
28
+	 * @return EE_Question_Group
29
+	 */
30
+	public static function new_instance_from_db($props_n_values = array())
31
+	{
32
+		return new self($props_n_values, true);
33
+	}
34
+
35
+
36
+	/**
37
+	 * gets the question group's name
38
+	 *
39
+	 * @access public
40
+	 * @param bool $pretty
41
+	 * @return string
42
+	 */
43
+	public function name($pretty = false)
44
+	{
45
+		return $pretty ? $this->get_pretty('QSG_name') : $this->get('QSG_name');
46
+	}
47
+
48
+
49
+	/**
50
+	 * Gets the question group's internal name
51
+	 *
52
+	 * @access public
53
+	 * @return string
54
+	 */
55
+	public function identifier()
56
+	{
57
+		return $this->get('QSG_identifier');
58
+	}
59
+
60
+
61
+	/**
62
+	 * Gets the question group's description
63
+	 *
64
+	 * @access public
65
+	 * @param bool $pretty
66
+	 * @return string
67
+	 */
68
+	public function desc($pretty = false)
69
+	{
70
+		return $pretty ? $this->get_pretty('QSG_desc') : $this->get('QSG_desc');
71
+	}
72
+
73
+
74
+	/**
75
+	 * Gets the question group's order number in a sequence
76
+	 * of other question groups
77
+	 *
78
+	 * @access public
79
+	 * @return int
80
+	 */
81
+	public function order()
82
+	{
83
+		return $this->get('QSG_order');
84
+	}
85
+
86
+
87
+	/**
88
+	 * Returns whether to show the group's name on the frontend
89
+	 *
90
+	 * @access public
91
+	 * @return boolean
92
+	 */
93
+	public function show_group_name()
94
+	{
95
+		return $this->get('QSG_show_group_name');
96
+	}
97
+
98
+
99
+	/**
100
+	 * Returns whether to show the group's description
101
+	 * on the frontend
102
+	 *
103
+	 * @access public
104
+	 * @return boolean
105
+	 */
106
+	public function show_group_desc()
107
+	{
108
+		return $this->get('QSG_show_group_desc');
109
+	}
110
+
111
+
112
+	/**
113
+	 * Returns whether this is a 'system group' (meaning
114
+	 * a question group integral to the system, whose questions
115
+	 * relate to the attendee table)
116
+	 *
117
+	 * @access public
118
+	 * @return int
119
+	 */
120
+	public function system_group()
121
+	{
122
+		return $this->get('QSG_system');
123
+	}
124
+
125
+
126
+	/**
127
+	 * get the author of the question group.
128
+	 *
129
+	 * @since 4.5.0
130
+	 *
131
+	 * @return int
132
+	 */
133
+	public function wp_user()
134
+	{
135
+		return $this->get('QSG_wp_user');
136
+	}
137
+
138
+
139
+	/**
140
+	 * Returns whether this question group has
141
+	 * been deleted
142
+	 *
143
+	 * @access public
144
+	 * @return boolean
145
+	 */
146
+	public function deleted()
147
+	{
148
+		return $this->get('QST_deleted');
149
+	}
150
+
151
+
152
+	/**
153
+	 * Gets an array of questions with questions IN the group at the start of the array and questions NOT in the group
154
+	 * at the end of the array.  Questions in the group are ordered by Question_Group_Question.QGQ_order and questions
155
+	 * NOT in the group are ordered by Question.QGQ_order
156
+	 *
157
+	 * @return EE_Question[]
158
+	 */
159
+	public function questions_in_and_not_in_group()
160
+	{
161
+		$questions_in_group = $this->questions();
162
+		$exclude_question_ids = ! empty($questions_in_group) ? array_keys($questions_in_group) : array();
163
+		$questions_not_in_group = $this->questions_not_in_group($exclude_question_ids);
164
+		return $questions_in_group + $questions_not_in_group;
165
+	}
166
+
167
+
168
+	/**
169
+	 * Gets all the questions which are part of this question group (ordered Question_Group_Question.QGQ_order)
170
+	 *
171
+	 * @param array $query_params
172
+	 * @return EE_Question[]
173
+	 */
174
+	public function questions($query_params = array())
175
+	{
176
+		$query_params = ! empty($query_params) ? $query_params
177
+			: array('order_by' => array('Question_Group_Question.QGQ_order' => 'ASC'));
178
+		return $this->ID() ? $this->get_many_related('Question', $query_params) : array();
179
+	}
180
+
181
+
182
+	/**
183
+	 * Gets all the questions which are NOT part of this question group.
184
+	 *
185
+	 * @param  mixed $question_IDS_in_group if empty array then all questions returned.  if FALSE then we first get
186
+	 *                                      questions in this group and exclude them from questions get all. IF empty
187
+	 *                                      array then we just return all questions.
188
+	 * @return EE_Question[]
189
+	 */
190
+	public function questions_not_in_group($question_IDS_in_group = false)
191
+	{
192
+		if ($question_IDS_in_group === false) {
193
+			$questions = $this->questions();
194
+			$question_IDS_in_group = ! empty($questions) ? array_keys($questions) : array();
195
+		}
196
+		$_where = ! empty($question_IDS_in_group) ? array('QST_ID' => array('not_in', $question_IDS_in_group))
197
+			: array();
198
+
199
+		return EEM_Question::instance()->get_all(array($_where, 'order_by' => array('QST_ID' => 'ASC')));
200
+	}
201
+
202
+
203
+	/**
204
+	 * Gets all events which are related to this question group
205
+	 *
206
+	 * @return EE_Event[]
207
+	 */
208
+	public function events()
209
+	{
210
+		return $this->get_many_related('Event');
211
+	}
212
+
213
+
214
+	/**
215
+	 * Adds the question to this question group
216
+	 *
217
+	 * @param EE_Question || int $question object or ID
218
+	 * @return boolean if successful
219
+	 */
220
+	public function add_question($questionObjectOrID)
221
+	{
222
+		return $this->_add_relation_to($questionObjectOrID, 'Question');
223
+	}
224
+
225
+
226
+	/**
227
+	 * Removes the question from this question group
228
+	 *
229
+	 * @param EE_Question || int $question object or ID
230
+	 * @return boolean of success
231
+	 */
232
+	public function remove_question($questionObjectOrID)
233
+	{
234
+		return $this->_remove_relation_to($questionObjectOrID, 'Question');
235
+	}
236
+
237
+
238
+	/**
239
+	 * @param $questionObjectOrID
240
+	 * @param $qst_order
241
+	 * @return int
242
+	 */
243
+	public function update_question_order($questionObjectOrID, $qst_order)
244
+	{
245
+		$qst_ID = $questionObjectOrID instanceof EE_Question ? $questionObjectOrID->ID() : (int) $questionObjectOrID;
246
+		return EEM_Question_Group_Question::instance()->update(
247
+			array('QGQ_order' => $qst_order),
248
+			array(
249
+				array(
250
+					'QST_ID' => $qst_ID,
251
+					'QSG_ID' => $this->ID(),
252
+				),
253
+			)
254
+		);
255
+	}
256
+
257
+
258
+	/**
259
+	 * Basically this is method just returns whether the question group has any questions with answers.  This is used
260
+	 * by the admin currently to determine whether we should display the ui for deleting permanently or not b/c
261
+	 * question groups with questions that have answers should not be possible to delete permanently
262
+	 *
263
+	 * @return boolean true if has questions with answers, false if not.
264
+	 */
265
+	public function has_questions_with_answers()
266
+	{
267
+		$has_answers = false;
268
+		$questions = $this->get_many_related('Question');
269
+		foreach ($questions as $question) {
270
+			if ($question->count_related('Answer') > 0) {
271
+				$has_answers = true;
272
+			}
273
+		}
274
+		return $has_answers;
275
+	}
276
+
277
+
278
+	/**
279
+	 * The purpose of this method is set the question group order for this question group to be the max out of all
280
+	 * question groups
281
+	 *
282
+	 * @access public
283
+	 * @return void
284
+	 */
285
+	public function set_order_to_latest()
286
+	{
287
+		$latest_order = $this->get_model()->get_latest_question_group_order();
288
+		$latest_order++;
289
+		$this->set('QSG_order', $latest_order);
290
+	}
291 291
 }
Please login to merge, or discard this patch.
core/db_classes/EE_Registration.class.php 2 patches
Indentation   +2067 added lines, -2067 removed lines patch added patch discarded remove patch
@@ -17,2071 +17,2071 @@
 block discarded – undo
17 17
 {
18 18
 
19 19
 
20
-    /**
21
-     * Used to reference when a registration has never been checked in.
22
-     *
23
-     * @deprecated use \EE_Checkin::status_checked_never instead
24
-     * @type int
25
-     */
26
-    const checkin_status_never = 2;
27
-
28
-    /**
29
-     * Used to reference when a registration has been checked in.
30
-     *
31
-     * @deprecated use \EE_Checkin::status_checked_in instead
32
-     * @type int
33
-     */
34
-    const checkin_status_in = 1;
35
-
36
-
37
-    /**
38
-     * Used to reference when a registration has been checked out.
39
-     *
40
-     * @deprecated use \EE_Checkin::status_checked_out instead
41
-     * @type int
42
-     */
43
-    const checkin_status_out = 0;
44
-
45
-
46
-    /**
47
-     * extra meta key for tracking reg status os trashed registrations
48
-     *
49
-     * @type string
50
-     */
51
-    const PRE_TRASH_REG_STATUS_KEY = 'pre_trash_registration_status';
52
-
53
-
54
-    /**
55
-     * extra meta key for tracking if registration has reserved ticket
56
-     *
57
-     * @type string
58
-     */
59
-    const HAS_RESERVED_TICKET_KEY = 'has_reserved_ticket';
60
-
61
-
62
-    /**
63
-     * @param array  $props_n_values          incoming values
64
-     * @param string $timezone                incoming timezone (if not set the timezone set for the website will be
65
-     *                                        used.)
66
-     * @param array  $date_formats            incoming date_formats in an array where the first value is the
67
-     *                                        date_format and the second value is the time format
68
-     * @return EE_Registration
69
-     * @throws EE_Error
70
-     */
71
-    public static function new_instance($props_n_values = array(), $timezone = null, $date_formats = array())
72
-    {
73
-        $has_object = parent::_check_for_object($props_n_values, __CLASS__, $timezone, $date_formats);
74
-        return $has_object ? $has_object : new self($props_n_values, false, $timezone, $date_formats);
75
-    }
76
-
77
-
78
-    /**
79
-     * @param array  $props_n_values  incoming values from the database
80
-     * @param string $timezone        incoming timezone as set by the model.  If not set the timezone for
81
-     *                                the website will be used.
82
-     * @return EE_Registration
83
-     */
84
-    public static function new_instance_from_db($props_n_values = array(), $timezone = null)
85
-    {
86
-        return new self($props_n_values, true, $timezone);
87
-    }
88
-
89
-
90
-    /**
91
-     *        Set Event ID
92
-     *
93
-     * @param        int $EVT_ID Event ID
94
-     * @throws EE_Error
95
-     * @throws RuntimeException
96
-     */
97
-    public function set_event($EVT_ID = 0)
98
-    {
99
-        $this->set('EVT_ID', $EVT_ID);
100
-    }
101
-
102
-
103
-    /**
104
-     * Overrides parent set() method so that all calls to set( 'REG_code', $REG_code ) OR set( 'STS_ID', $STS_ID ) can
105
-     * be routed to internal methods
106
-     *
107
-     * @param string $field_name
108
-     * @param mixed  $field_value
109
-     * @param bool   $use_default
110
-     * @throws EE_Error
111
-     * @throws EntityNotFoundException
112
-     * @throws InvalidArgumentException
113
-     * @throws InvalidDataTypeException
114
-     * @throws InvalidInterfaceException
115
-     * @throws ReflectionException
116
-     * @throws RuntimeException
117
-     */
118
-    public function set($field_name, $field_value, $use_default = false)
119
-    {
120
-        switch ($field_name) {
121
-            case 'REG_code':
122
-                if (! empty($field_value) && $this->reg_code() === null) {
123
-                    $this->set_reg_code($field_value, $use_default);
124
-                }
125
-                break;
126
-            case 'STS_ID':
127
-                $this->set_status($field_value, $use_default);
128
-                break;
129
-            default:
130
-                parent::set($field_name, $field_value, $use_default);
131
-        }
132
-    }
133
-
134
-
135
-    /**
136
-     * Set Status ID
137
-     * updates the registration status and ALSO...
138
-     * calls reserve_registration_space() if the reg status changes TO approved from any other reg status
139
-     * calls release_registration_space() if the reg status changes FROM approved to any other reg status
140
-     *
141
-     * @param string                $new_STS_ID
142
-     * @param boolean               $use_default
143
-     * @param ContextInterface|null $context
144
-     * @return bool
145
-     * @throws EE_Error
146
-     * @throws EntityNotFoundException
147
-     * @throws InvalidArgumentException
148
-     * @throws ReflectionException
149
-     * @throws RuntimeException
150
-     * @throws InvalidDataTypeException
151
-     * @throws InvalidInterfaceException
152
-     */
153
-    public function set_status($new_STS_ID = null, $use_default = false, ContextInterface $context = null)
154
-    {
155
-        // get current REG_Status
156
-        $old_STS_ID = $this->status_ID();
157
-        // if status has changed
158
-        if ($old_STS_ID !== $new_STS_ID // and that status has actually changed
159
-            && ! empty($old_STS_ID) // and that old status is actually set
160
-            && ! empty($new_STS_ID) // as well as the new status
161
-            && $this->ID() // ensure registration is in the db
162
-        ) {
163
-            // TO approved
164
-            if ($new_STS_ID === EEM_Registration::status_id_approved) {
165
-                // reserve a space by incrementing ticket and datetime sold values
166
-                $this->_reserve_registration_space();
167
-                do_action('AHEE__EE_Registration__set_status__to_approved', $this, $old_STS_ID, $new_STS_ID, $context);
168
-                // OR FROM  approved
169
-            } elseif ($old_STS_ID === EEM_Registration::status_id_approved) {
170
-                // release a space by decrementing ticket and datetime sold values
171
-                $this->_release_registration_space();
172
-                do_action(
173
-                    'AHEE__EE_Registration__set_status__from_approved',
174
-                    $this,
175
-                    $old_STS_ID,
176
-                    $new_STS_ID,
177
-                    $context
178
-                );
179
-            }
180
-            // update status
181
-            parent::set('STS_ID', $new_STS_ID, $use_default);
182
-            $this->_update_if_canceled_or_declined($new_STS_ID, $old_STS_ID, $context);
183
-            if ($this->statusChangeUpdatesTransaction($context)) {
184
-                $this->updateTransactionAfterStatusChange();
185
-            }
186
-            do_action('AHEE__EE_Registration__set_status__after_update', $this, $old_STS_ID, $new_STS_ID, $context);
187
-            return true;
188
-        }
189
-        // even though the old value matches the new value, it's still good to
190
-        // allow the parent set method to have a say
191
-        parent::set('STS_ID', $new_STS_ID, $use_default);
192
-        return true;
193
-    }
194
-
195
-
196
-    /**
197
-     * update REGs and TXN when cancelled or declined registrations involved
198
-     *
199
-     * @param string                $new_STS_ID
200
-     * @param string                $old_STS_ID
201
-     * @param ContextInterface|null $context
202
-     * @throws EE_Error
203
-     * @throws InvalidArgumentException
204
-     * @throws InvalidDataTypeException
205
-     * @throws InvalidInterfaceException
206
-     * @throws ReflectionException
207
-     */
208
-    private function _update_if_canceled_or_declined($new_STS_ID, $old_STS_ID, ContextInterface $context = null)
209
-    {
210
-        // these reg statuses should not be considered in any calculations involving monies owing
211
-        $closed_reg_statuses = EEM_Registration::closed_reg_statuses();
212
-        // true if registration has been cancelled or declined
213
-        $this->updateIfCanceled(
214
-            $closed_reg_statuses,
215
-            $new_STS_ID,
216
-            $old_STS_ID,
217
-            $context
218
-        );
219
-        $this->updateIfDeclined(
220
-            $closed_reg_statuses,
221
-            $new_STS_ID,
222
-            $old_STS_ID,
223
-            $context
224
-        );
225
-    }
226
-
227
-
228
-    /**
229
-     * update REGs and TXN when cancelled or declined registrations involved
230
-     *
231
-     * @param array                 $closed_reg_statuses
232
-     * @param string                $new_STS_ID
233
-     * @param string                $old_STS_ID
234
-     * @param ContextInterface|null $context
235
-     * @throws EE_Error
236
-     * @throws InvalidArgumentException
237
-     * @throws InvalidDataTypeException
238
-     * @throws InvalidInterfaceException
239
-     * @throws ReflectionException
240
-     */
241
-    private function updateIfCanceled(
242
-        array $closed_reg_statuses,
243
-        $new_STS_ID,
244
-        $old_STS_ID,
245
-        ContextInterface $context = null
246
-    ) {
247
-        // true if registration has been cancelled or declined
248
-        if (in_array($new_STS_ID, $closed_reg_statuses, true)
249
-            && ! in_array($old_STS_ID, $closed_reg_statuses, true)
250
-        ) {
251
-            /** @type EE_Registration_Processor $registration_processor */
252
-            $registration_processor = EE_Registry::instance()->load_class('Registration_Processor');
253
-            /** @type EE_Transaction_Processor $transaction_processor */
254
-            $transaction_processor = EE_Registry::instance()->load_class('Transaction_Processor');
255
-            // cancelled or declined registration
256
-            $registration_processor->update_registration_after_being_canceled_or_declined(
257
-                $this,
258
-                $closed_reg_statuses
259
-            );
260
-            $transaction_processor->update_transaction_after_canceled_or_declined_registration(
261
-                $this,
262
-                $closed_reg_statuses,
263
-                false
264
-            );
265
-            do_action(
266
-                'AHEE__EE_Registration__set_status__canceled_or_declined',
267
-                $this,
268
-                $old_STS_ID,
269
-                $new_STS_ID,
270
-                $context
271
-            );
272
-            return;
273
-        }
274
-    }
275
-
276
-
277
-    /**
278
-     * update REGs and TXN when cancelled or declined registrations involved
279
-     *
280
-     * @param array                 $closed_reg_statuses
281
-     * @param string                $new_STS_ID
282
-     * @param string                $old_STS_ID
283
-     * @param ContextInterface|null $context
284
-     * @throws EE_Error
285
-     * @throws InvalidArgumentException
286
-     * @throws InvalidDataTypeException
287
-     * @throws InvalidInterfaceException
288
-     * @throws ReflectionException
289
-     */
290
-    private function updateIfDeclined(
291
-        array $closed_reg_statuses,
292
-        $new_STS_ID,
293
-        $old_STS_ID,
294
-        ContextInterface $context = null
295
-    ) {
296
-        // true if reinstating cancelled or declined registration
297
-        if (in_array($old_STS_ID, $closed_reg_statuses, true)
298
-            && ! in_array($new_STS_ID, $closed_reg_statuses, true)
299
-        ) {
300
-            /** @type EE_Registration_Processor $registration_processor */
301
-            $registration_processor = EE_Registry::instance()->load_class('Registration_Processor');
302
-            /** @type EE_Transaction_Processor $transaction_processor */
303
-            $transaction_processor = EE_Registry::instance()->load_class('Transaction_Processor');
304
-            // reinstating cancelled or declined registration
305
-            $registration_processor->update_canceled_or_declined_registration_after_being_reinstated(
306
-                $this,
307
-                $closed_reg_statuses
308
-            );
309
-            $transaction_processor->update_transaction_after_reinstating_canceled_registration(
310
-                $this,
311
-                $closed_reg_statuses,
312
-                false
313
-            );
314
-            do_action(
315
-                'AHEE__EE_Registration__set_status__after_reinstated',
316
-                $this,
317
-                $old_STS_ID,
318
-                $new_STS_ID,
319
-                $context
320
-            );
321
-        }
322
-    }
323
-
324
-
325
-    /**
326
-     * @param ContextInterface|null $context
327
-     * @return bool
328
-     */
329
-    private function statusChangeUpdatesTransaction(ContextInterface $context = null)
330
-    {
331
-        $contexts_that_do_not_update_transaction = (array) apply_filters(
332
-            'AHEE__EE_Registration__statusChangeUpdatesTransaction__contexts_that_do_not_update_transaction',
333
-            array('spco_reg_step_attendee_information_process_registrations'),
334
-            $context,
335
-            $this
336
-        );
337
-        return ! (
338
-            $context instanceof ContextInterface
339
-            && in_array($context->slug(), $contexts_that_do_not_update_transaction, true)
340
-        );
341
-    }
342
-
343
-
344
-    /**
345
-     * @throws EE_Error
346
-     * @throws EntityNotFoundException
347
-     * @throws InvalidArgumentException
348
-     * @throws InvalidDataTypeException
349
-     * @throws InvalidInterfaceException
350
-     * @throws ReflectionException
351
-     * @throws RuntimeException
352
-     */
353
-    private function updateTransactionAfterStatusChange()
354
-    {
355
-        /** @type EE_Transaction_Payments $transaction_payments */
356
-        $transaction_payments = EE_Registry::instance()->load_class('Transaction_Payments');
357
-        $transaction_payments->recalculate_transaction_total($this->transaction(), false);
358
-        $this->transaction()->update_status_based_on_total_paid(true);
359
-    }
360
-
361
-
362
-    /**
363
-     *        get Status ID
364
-     */
365
-    public function status_ID()
366
-    {
367
-        return $this->get('STS_ID');
368
-    }
369
-
370
-
371
-    /**
372
-     * Gets the ticket this registration is for
373
-     *
374
-     * @param boolean $include_archived whether to include archived tickets or not.
375
-     *
376
-     * @return EE_Ticket|EE_Base_Class
377
-     * @throws EE_Error
378
-     */
379
-    public function ticket($include_archived = true)
380
-    {
381
-        $query_params = array();
382
-        if ($include_archived) {
383
-            $query_params['default_where_conditions'] = 'none';
384
-        }
385
-        return $this->get_first_related('Ticket', $query_params);
386
-    }
387
-
388
-
389
-    /**
390
-     * Gets the event this registration is for
391
-     *
392
-     * @return EE_Event
393
-     * @throws EE_Error
394
-     * @throws EntityNotFoundException
395
-     */
396
-    public function event()
397
-    {
398
-        $event = $this->get_first_related('Event');
399
-        if (! $event instanceof \EE_Event) {
400
-            throw new EntityNotFoundException('Event ID', $this->event_ID());
401
-        }
402
-        return $event;
403
-    }
404
-
405
-
406
-    /**
407
-     * Gets the "author" of the registration.  Note that for the purposes of registrations, the author will correspond
408
-     * with the author of the event this registration is for.
409
-     *
410
-     * @since 4.5.0
411
-     * @return int
412
-     * @throws EE_Error
413
-     * @throws EntityNotFoundException
414
-     */
415
-    public function wp_user()
416
-    {
417
-        $event = $this->event();
418
-        if ($event instanceof EE_Event) {
419
-            return $event->wp_user();
420
-        }
421
-        return 0;
422
-    }
423
-
424
-
425
-    /**
426
-     * increments this registration's related ticket sold and corresponding datetime sold values
427
-     *
428
-     * @return void
429
-     * @throws DomainException
430
-     * @throws EE_Error
431
-     * @throws EntityNotFoundException
432
-     * @throws InvalidArgumentException
433
-     * @throws InvalidDataTypeException
434
-     * @throws InvalidInterfaceException
435
-     * @throws ReflectionException
436
-     * @throws UnexpectedEntityException
437
-     */
438
-    private function _reserve_registration_space()
439
-    {
440
-        // reserved ticket and datetime counts will be decremented as sold counts are incremented
441
-        // so stop tracking that this reg has a ticket reserved
442
-        $this->release_reserved_ticket(false, "REG: {$this->ID()} (ln:" . __LINE__ . ')');
443
-        $ticket = $this->ticket();
444
-        $ticket->increase_sold();
445
-        $ticket->save();
446
-        // possibly set event status to sold out
447
-        $this->event()->perform_sold_out_status_check();
448
-    }
449
-
450
-
451
-    /**
452
-     * decrements (subtracts) this registration's related ticket sold and corresponding datetime sold values
453
-     *
454
-     * @return void
455
-     * @throws DomainException
456
-     * @throws EE_Error
457
-     * @throws EntityNotFoundException
458
-     * @throws InvalidArgumentException
459
-     * @throws InvalidDataTypeException
460
-     * @throws InvalidInterfaceException
461
-     * @throws ReflectionException
462
-     * @throws UnexpectedEntityException
463
-     */
464
-    private function _release_registration_space()
465
-    {
466
-        $ticket = $this->ticket();
467
-        $ticket->decrease_sold();
468
-        $ticket->save();
469
-        // possibly change event status from sold out back to previous status
470
-        $this->event()->perform_sold_out_status_check();
471
-    }
472
-
473
-
474
-    /**
475
-     * tracks this registration's ticket reservation in extra meta
476
-     * and can increment related ticket reserved and corresponding datetime reserved values
477
-     *
478
-     * @param bool $update_ticket if true, will increment ticket and datetime reserved count
479
-     * @return void
480
-     * @throws EE_Error
481
-     * @throws InvalidArgumentException
482
-     * @throws InvalidDataTypeException
483
-     * @throws InvalidInterfaceException
484
-     * @throws ReflectionException
485
-     */
486
-    public function reserve_ticket($update_ticket = false, $source = 'unknown')
487
-    {
488
-        // only reserve ticket if space is not currently reserved
489
-        if ((bool) $this->get_extra_meta(EE_Registration::HAS_RESERVED_TICKET_KEY, true) !== true) {
490
-            $this->update_extra_meta('reserve_ticket', "{$this->ticket_ID()} from {$source}");
491
-            // IMPORTANT !!!
492
-            // although checking $update_ticket first would be more efficient,
493
-            // we NEED to ALWAYS call update_extra_meta(), which is why that is done first
494
-            if ($this->update_extra_meta(EE_Registration::HAS_RESERVED_TICKET_KEY, true)
495
-                && $update_ticket
496
-            ) {
497
-                $ticket = $this->ticket();
498
-                $ticket->increase_reserved(1, "REG: {$this->ID()} (ln:" . __LINE__ . ')');
499
-                $ticket->save();
500
-            }
501
-        }
502
-    }
503
-
504
-
505
-    /**
506
-     * stops tracking this registration's ticket reservation in extra meta
507
-     * decrements (subtracts) related ticket reserved and corresponding datetime reserved values
508
-     *
509
-     * @param bool $update_ticket if true, will decrement ticket and datetime reserved count
510
-     * @return void
511
-     * @throws EE_Error
512
-     * @throws InvalidArgumentException
513
-     * @throws InvalidDataTypeException
514
-     * @throws InvalidInterfaceException
515
-     * @throws ReflectionException
516
-     */
517
-    public function release_reserved_ticket($update_ticket = false, $source = 'unknown')
518
-    {
519
-        // only release ticket if space is currently reserved
520
-        if ((bool) $this->get_extra_meta(EE_Registration::HAS_RESERVED_TICKET_KEY, true) === true) {
521
-            $this->update_extra_meta('release_reserved_ticket', "{$this->ticket_ID()} from {$source}");
522
-            // IMPORTANT !!!
523
-            // although checking $update_ticket first would be more efficient,
524
-            // we NEED to ALWAYS call update_extra_meta(), which is why that is done first
525
-            if ($this->update_extra_meta(EE_Registration::HAS_RESERVED_TICKET_KEY, false)
526
-                && $update_ticket
527
-            ) {
528
-                $ticket = $this->ticket();
529
-                $ticket->decrease_reserved(1, true, "REG: {$this->ID()} (ln:" . __LINE__ . ')');
530
-                $ticket->save();
531
-            }
532
-        }
533
-    }
534
-
535
-
536
-    /**
537
-     * Set Attendee ID
538
-     *
539
-     * @param        int $ATT_ID Attendee ID
540
-     * @throws EE_Error
541
-     * @throws RuntimeException
542
-     */
543
-    public function set_attendee_id($ATT_ID = 0)
544
-    {
545
-        $this->set('ATT_ID', $ATT_ID);
546
-    }
547
-
548
-
549
-    /**
550
-     *        Set Transaction ID
551
-     *
552
-     * @param        int $TXN_ID Transaction ID
553
-     * @throws EE_Error
554
-     * @throws RuntimeException
555
-     */
556
-    public function set_transaction_id($TXN_ID = 0)
557
-    {
558
-        $this->set('TXN_ID', $TXN_ID);
559
-    }
560
-
561
-
562
-    /**
563
-     *        Set Session
564
-     *
565
-     * @param    string $REG_session PHP Session ID
566
-     * @throws EE_Error
567
-     * @throws RuntimeException
568
-     */
569
-    public function set_session($REG_session = '')
570
-    {
571
-        $this->set('REG_session', $REG_session);
572
-    }
573
-
574
-
575
-    /**
576
-     *        Set Registration URL Link
577
-     *
578
-     * @param    string $REG_url_link Registration URL Link
579
-     * @throws EE_Error
580
-     * @throws RuntimeException
581
-     */
582
-    public function set_reg_url_link($REG_url_link = '')
583
-    {
584
-        $this->set('REG_url_link', $REG_url_link);
585
-    }
586
-
587
-
588
-    /**
589
-     *        Set Attendee Counter
590
-     *
591
-     * @param        int $REG_count Primary Attendee
592
-     * @throws EE_Error
593
-     * @throws RuntimeException
594
-     */
595
-    public function set_count($REG_count = 1)
596
-    {
597
-        $this->set('REG_count', $REG_count);
598
-    }
599
-
600
-
601
-    /**
602
-     *        Set Group Size
603
-     *
604
-     * @param        boolean $REG_group_size Group Registration
605
-     * @throws EE_Error
606
-     * @throws RuntimeException
607
-     */
608
-    public function set_group_size($REG_group_size = false)
609
-    {
610
-        $this->set('REG_group_size', $REG_group_size);
611
-    }
612
-
613
-
614
-    /**
615
-     *    is_not_approved -  convenience method that returns TRUE if REG status ID ==
616
-     *    EEM_Registration::status_id_not_approved
617
-     *
618
-     * @return        boolean
619
-     */
620
-    public function is_not_approved()
621
-    {
622
-        return $this->status_ID() == EEM_Registration::status_id_not_approved ? true : false;
623
-    }
624
-
625
-
626
-    /**
627
-     *    is_pending_payment -  convenience method that returns TRUE if REG status ID ==
628
-     *    EEM_Registration::status_id_pending_payment
629
-     *
630
-     * @return        boolean
631
-     */
632
-    public function is_pending_payment()
633
-    {
634
-        return $this->status_ID() == EEM_Registration::status_id_pending_payment ? true : false;
635
-    }
636
-
637
-
638
-    /**
639
-     *    is_approved -  convenience method that returns TRUE if REG status ID == EEM_Registration::status_id_approved
640
-     *
641
-     * @return        boolean
642
-     */
643
-    public function is_approved()
644
-    {
645
-        return $this->status_ID() == EEM_Registration::status_id_approved ? true : false;
646
-    }
647
-
648
-
649
-    /**
650
-     *    is_cancelled -  convenience method that returns TRUE if REG status ID == EEM_Registration::status_id_cancelled
651
-     *
652
-     * @return        boolean
653
-     */
654
-    public function is_cancelled()
655
-    {
656
-        return $this->status_ID() == EEM_Registration::status_id_cancelled ? true : false;
657
-    }
658
-
659
-
660
-    /**
661
-     *    is_declined -  convenience method that returns TRUE if REG status ID == EEM_Registration::status_id_declined
662
-     *
663
-     * @return        boolean
664
-     */
665
-    public function is_declined()
666
-    {
667
-        return $this->status_ID() == EEM_Registration::status_id_declined ? true : false;
668
-    }
669
-
670
-
671
-    /**
672
-     *    is_incomplete -  convenience method that returns TRUE if REG status ID ==
673
-     *    EEM_Registration::status_id_incomplete
674
-     *
675
-     * @return        boolean
676
-     */
677
-    public function is_incomplete()
678
-    {
679
-        return $this->status_ID() == EEM_Registration::status_id_incomplete ? true : false;
680
-    }
681
-
682
-
683
-    /**
684
-     *        Set Registration Date
685
-     *
686
-     * @param        mixed ( int or string ) $REG_date Registration Date - Unix timestamp or string representation of
687
-     *                                                 Date
688
-     * @throws EE_Error
689
-     * @throws RuntimeException
690
-     */
691
-    public function set_reg_date($REG_date = false)
692
-    {
693
-        $this->set('REG_date', $REG_date);
694
-    }
695
-
696
-
697
-    /**
698
-     *    Set final price owing for this registration after all ticket/price modifications
699
-     *
700
-     * @access    public
701
-     * @param    float $REG_final_price
702
-     * @throws EE_Error
703
-     * @throws RuntimeException
704
-     */
705
-    public function set_final_price($REG_final_price = 0.00)
706
-    {
707
-        $this->set('REG_final_price', $REG_final_price);
708
-    }
709
-
710
-
711
-    /**
712
-     *    Set amount paid towards this registration's final price
713
-     *
714
-     * @access    public
715
-     * @param    float $REG_paid
716
-     * @throws EE_Error
717
-     * @throws RuntimeException
718
-     */
719
-    public function set_paid($REG_paid = 0.00)
720
-    {
721
-        $this->set('REG_paid', $REG_paid);
722
-    }
723
-
724
-
725
-    /**
726
-     *        Attendee Is Going
727
-     *
728
-     * @param        boolean $REG_att_is_going Attendee Is Going
729
-     * @throws EE_Error
730
-     * @throws RuntimeException
731
-     */
732
-    public function set_att_is_going($REG_att_is_going = false)
733
-    {
734
-        $this->set('REG_att_is_going', $REG_att_is_going);
735
-    }
736
-
737
-
738
-    /**
739
-     * Gets the related attendee
740
-     *
741
-     * @return EE_Attendee
742
-     * @throws EE_Error
743
-     */
744
-    public function attendee()
745
-    {
746
-        return $this->get_first_related('Attendee');
747
-    }
748
-
749
-
750
-    /**
751
-     *        get Event ID
752
-     */
753
-    public function event_ID()
754
-    {
755
-        return $this->get('EVT_ID');
756
-    }
757
-
758
-
759
-    /**
760
-     *        get Event ID
761
-     */
762
-    public function event_name()
763
-    {
764
-        $event = $this->event_obj();
765
-        if ($event) {
766
-            return $event->name();
767
-        } else {
768
-            return null;
769
-        }
770
-    }
771
-
772
-
773
-    /**
774
-     * Fetches the event this registration is for
775
-     *
776
-     * @return EE_Event
777
-     * @throws EE_Error
778
-     */
779
-    public function event_obj()
780
-    {
781
-        return $this->get_first_related('Event');
782
-    }
783
-
784
-
785
-    /**
786
-     *        get Attendee ID
787
-     */
788
-    public function attendee_ID()
789
-    {
790
-        return $this->get('ATT_ID');
791
-    }
792
-
793
-
794
-    /**
795
-     *        get PHP Session ID
796
-     */
797
-    public function session_ID()
798
-    {
799
-        return $this->get('REG_session');
800
-    }
801
-
802
-
803
-    /**
804
-     * Gets the string which represents the URL trigger for the receipt template in the message template system.
805
-     *
806
-     * @param string $messenger 'pdf' or 'html'.  Default 'html'.
807
-     * @return string
808
-     */
809
-    public function receipt_url($messenger = 'html')
810
-    {
811
-
812
-        /**
813
-         * The below will be deprecated one version after this.  We check first if there is a custom receipt template
814
-         * already in use on old system.  If there is then we just return the standard url for it.
815
-         *
816
-         * @since 4.5.0
817
-         */
818
-        $template_relative_path = 'modules/gateways/Invoice/lib/templates/receipt_body.template.php';
819
-        $has_custom = EEH_Template::locate_template(
820
-            $template_relative_path,
821
-            array(),
822
-            true,
823
-            true,
824
-            true
825
-        );
826
-
827
-        if ($has_custom) {
828
-            return add_query_arg(array('receipt' => 'true'), $this->invoice_url('launch'));
829
-        }
830
-        return apply_filters('FHEE__EE_Registration__receipt_url__receipt_url', '', $this, $messenger, 'receipt');
831
-    }
832
-
833
-
834
-    /**
835
-     * Gets the string which represents the URL trigger for the invoice template in the message template system.
836
-     *
837
-     * @param string $messenger 'pdf' or 'html'.  Default 'html'.
838
-     * @return string
839
-     * @throws EE_Error
840
-     */
841
-    public function invoice_url($messenger = 'html')
842
-    {
843
-        /**
844
-         * The below will be deprecated one version after this.  We check first if there is a custom invoice template
845
-         * already in use on old system.  If there is then we just return the standard url for it.
846
-         *
847
-         * @since 4.5.0
848
-         */
849
-        $template_relative_path = 'modules/gateways/Invoice/lib/templates/invoice_body.template.php';
850
-        $has_custom = EEH_Template::locate_template(
851
-            $template_relative_path,
852
-            array(),
853
-            true,
854
-            true,
855
-            true
856
-        );
857
-
858
-        if ($has_custom) {
859
-            if ($messenger == 'html') {
860
-                return $this->invoice_url('launch');
861
-            }
862
-            $route = $messenger == 'download' || $messenger == 'pdf' ? 'download_invoice' : 'launch_invoice';
863
-
864
-            $query_args = array('ee' => $route, 'id' => $this->reg_url_link());
865
-            if ($messenger == 'html') {
866
-                $query_args['html'] = true;
867
-            }
868
-            return add_query_arg($query_args, get_permalink(EE_Registry::instance()->CFG->core->thank_you_page_id));
869
-        }
870
-        return apply_filters('FHEE__EE_Registration__invoice_url__invoice_url', '', $this, $messenger, 'invoice');
871
-    }
872
-
873
-
874
-    /**
875
-     * get Registration URL Link
876
-     *
877
-     * @access public
878
-     * @return string
879
-     * @throws EE_Error
880
-     */
881
-    public function reg_url_link()
882
-    {
883
-        return (string) $this->get('REG_url_link');
884
-    }
885
-
886
-
887
-    /**
888
-     * Echoes out invoice_url()
889
-     *
890
-     * @param string $type 'download','launch', or 'html' (default is 'launch')
891
-     * @return void
892
-     * @throws EE_Error
893
-     */
894
-    public function e_invoice_url($type = 'launch')
895
-    {
896
-        echo $this->invoice_url($type);
897
-    }
898
-
899
-
900
-    /**
901
-     * Echoes out payment_overview_url
902
-     */
903
-    public function e_payment_overview_url()
904
-    {
905
-        echo $this->payment_overview_url();
906
-    }
907
-
908
-
909
-    /**
910
-     * Gets the URL for the checkout payment options reg step
911
-     * with this registration's REG_url_link added as a query parameter
912
-     *
913
-     * @param bool $clear_session Set to true when you want to clear the session on revisiting the
914
-     *                            payment overview url.
915
-     * @return string
916
-     * @throws InvalidInterfaceException
917
-     * @throws InvalidDataTypeException
918
-     * @throws EE_Error
919
-     * @throws InvalidArgumentException
920
-     */
921
-    public function payment_overview_url($clear_session = false)
922
-    {
923
-        return add_query_arg(
924
-            (array) apply_filters(
925
-                'FHEE__EE_Registration__payment_overview_url__query_args',
926
-                array(
927
-                    'e_reg_url_link' => $this->reg_url_link(),
928
-                    'step'           => 'payment_options',
929
-                    'revisit'        => true,
930
-                    'clear_session'  => (bool) $clear_session,
931
-                ),
932
-                $this
933
-            ),
934
-            EE_Registry::instance()->CFG->core->reg_page_url()
935
-        );
936
-    }
937
-
938
-
939
-    /**
940
-     * Gets the URL for the checkout attendee information reg step
941
-     * with this registration's REG_url_link added as a query parameter
942
-     *
943
-     * @return string
944
-     * @throws InvalidInterfaceException
945
-     * @throws InvalidDataTypeException
946
-     * @throws EE_Error
947
-     * @throws InvalidArgumentException
948
-     */
949
-    public function edit_attendee_information_url()
950
-    {
951
-        return add_query_arg(
952
-            (array) apply_filters(
953
-                'FHEE__EE_Registration__edit_attendee_information_url__query_args',
954
-                array(
955
-                    'e_reg_url_link' => $this->reg_url_link(),
956
-                    'step'           => 'attendee_information',
957
-                    'revisit'        => true,
958
-                ),
959
-                $this
960
-            ),
961
-            EE_Registry::instance()->CFG->core->reg_page_url()
962
-        );
963
-    }
964
-
965
-
966
-    /**
967
-     * Simply generates and returns the appropriate admin_url link to edit this registration
968
-     *
969
-     * @return string
970
-     * @throws EE_Error
971
-     */
972
-    public function get_admin_edit_url()
973
-    {
974
-        return EEH_URL::add_query_args_and_nonce(
975
-            array(
976
-                'page'    => 'espresso_registrations',
977
-                'action'  => 'view_registration',
978
-                '_REG_ID' => $this->ID(),
979
-            ),
980
-            admin_url('admin.php')
981
-        );
982
-    }
983
-
984
-
985
-    /**
986
-     *    is_primary_registrant?
987
-     */
988
-    public function is_primary_registrant()
989
-    {
990
-        return $this->get('REG_count') == 1 ? true : false;
991
-    }
992
-
993
-
994
-    /**
995
-     * This returns the primary registration object for this registration group (which may be this object).
996
-     *
997
-     * @return EE_Registration
998
-     * @throws EE_Error
999
-     */
1000
-    public function get_primary_registration()
1001
-    {
1002
-        if ($this->is_primary_registrant()) {
1003
-            return $this;
1004
-        }
1005
-
1006
-        // k reg_count !== 1 so let's get the EE_Registration object matching this txn_id and reg_count == 1
1007
-        /** @var EE_Registration $primary_registrant */
1008
-        $primary_registrant = EEM_Registration::instance()->get_one(
1009
-            array(
1010
-                array(
1011
-                    'TXN_ID'    => $this->transaction_ID(),
1012
-                    'REG_count' => 1,
1013
-                ),
1014
-            )
1015
-        );
1016
-        return $primary_registrant;
1017
-    }
1018
-
1019
-
1020
-    /**
1021
-     *        get  Attendee Number
1022
-     *
1023
-     * @access        public
1024
-     */
1025
-    public function count()
1026
-    {
1027
-        return $this->get('REG_count');
1028
-    }
1029
-
1030
-
1031
-    /**
1032
-     *        get Group Size
1033
-     */
1034
-    public function group_size()
1035
-    {
1036
-        return $this->get('REG_group_size');
1037
-    }
1038
-
1039
-
1040
-    /**
1041
-     *        get Registration Date
1042
-     */
1043
-    public function date()
1044
-    {
1045
-        return $this->get('REG_date');
1046
-    }
1047
-
1048
-
1049
-    /**
1050
-     * gets a pretty date
1051
-     *
1052
-     * @param string $date_format
1053
-     * @param string $time_format
1054
-     * @return string
1055
-     * @throws EE_Error
1056
-     */
1057
-    public function pretty_date($date_format = null, $time_format = null)
1058
-    {
1059
-        return $this->get_datetime('REG_date', $date_format, $time_format);
1060
-    }
1061
-
1062
-
1063
-    /**
1064
-     * final_price
1065
-     * the registration's share of the transaction total, so that the
1066
-     * sum of all the transaction's REG_final_prices equal the transaction's total
1067
-     *
1068
-     * @return float
1069
-     * @throws EE_Error
1070
-     */
1071
-    public function final_price()
1072
-    {
1073
-        return $this->get('REG_final_price');
1074
-    }
1075
-
1076
-
1077
-    /**
1078
-     * pretty_final_price
1079
-     *  final price as formatted string, with correct decimal places and currency symbol
1080
-     *
1081
-     * @return string
1082
-     * @throws EE_Error
1083
-     */
1084
-    public function pretty_final_price()
1085
-    {
1086
-        return $this->get_pretty('REG_final_price');
1087
-    }
1088
-
1089
-
1090
-    /**
1091
-     * get paid (yeah)
1092
-     *
1093
-     * @return float
1094
-     * @throws EE_Error
1095
-     */
1096
-    public function paid()
1097
-    {
1098
-        return $this->get('REG_paid');
1099
-    }
1100
-
1101
-
1102
-    /**
1103
-     * pretty_paid
1104
-     *
1105
-     * @return float
1106
-     * @throws EE_Error
1107
-     */
1108
-    public function pretty_paid()
1109
-    {
1110
-        return $this->get_pretty('REG_paid');
1111
-    }
1112
-
1113
-
1114
-    /**
1115
-     * owes_monies_and_can_pay
1116
-     * whether or not this registration has monies owing and it's' status allows payment
1117
-     *
1118
-     * @param array $requires_payment
1119
-     * @return bool
1120
-     * @throws EE_Error
1121
-     */
1122
-    public function owes_monies_and_can_pay($requires_payment = array())
1123
-    {
1124
-        // these reg statuses require payment (if event is not free)
1125
-        $requires_payment = ! empty($requires_payment)
1126
-            ? $requires_payment
1127
-            : EEM_Registration::reg_statuses_that_allow_payment();
1128
-        if (in_array($this->status_ID(), $requires_payment) &&
1129
-            $this->final_price() != 0 &&
1130
-            $this->final_price() != $this->paid()
1131
-        ) {
1132
-            return true;
1133
-        } else {
1134
-            return false;
1135
-        }
1136
-    }
1137
-
1138
-
1139
-    /**
1140
-     * Prints out the return value of $this->pretty_status()
1141
-     *
1142
-     * @param bool $show_icons
1143
-     * @return void
1144
-     * @throws EE_Error
1145
-     */
1146
-    public function e_pretty_status($show_icons = false)
1147
-    {
1148
-        echo $this->pretty_status($show_icons);
1149
-    }
1150
-
1151
-
1152
-    /**
1153
-     * Returns a nice version of the status for displaying to customers
1154
-     *
1155
-     * @param bool $show_icons
1156
-     * @return string
1157
-     * @throws EE_Error
1158
-     */
1159
-    public function pretty_status($show_icons = false)
1160
-    {
1161
-        $status = EEM_Status::instance()->localized_status(
1162
-            array($this->status_ID() => esc_html__('unknown', 'event_espresso')),
1163
-            false,
1164
-            'sentence'
1165
-        );
1166
-        $icon = '';
1167
-        switch ($this->status_ID()) {
1168
-            case EEM_Registration::status_id_approved:
1169
-                $icon = $show_icons
1170
-                    ? '<span class="dashicons dashicons-star-filled ee-icon-size-16 green-text"></span>'
1171
-                    : '';
1172
-                break;
1173
-            case EEM_Registration::status_id_pending_payment:
1174
-                $icon = $show_icons
1175
-                    ? '<span class="dashicons dashicons-star-half ee-icon-size-16 orange-text"></span>'
1176
-                    : '';
1177
-                break;
1178
-            case EEM_Registration::status_id_not_approved:
1179
-                $icon = $show_icons
1180
-                    ? '<span class="dashicons dashicons-marker ee-icon-size-16 orange-text"></span>'
1181
-                    : '';
1182
-                break;
1183
-            case EEM_Registration::status_id_cancelled:
1184
-                $icon = $show_icons
1185
-                    ? '<span class="dashicons dashicons-no ee-icon-size-16 lt-grey-text"></span>'
1186
-                    : '';
1187
-                break;
1188
-            case EEM_Registration::status_id_incomplete:
1189
-                $icon = $show_icons
1190
-                    ? '<span class="dashicons dashicons-no ee-icon-size-16 lt-orange-text"></span>'
1191
-                    : '';
1192
-                break;
1193
-            case EEM_Registration::status_id_declined:
1194
-                $icon = $show_icons
1195
-                    ? '<span class="dashicons dashicons-no ee-icon-size-16 red-text"></span>'
1196
-                    : '';
1197
-                break;
1198
-            case EEM_Registration::status_id_wait_list:
1199
-                $icon = $show_icons
1200
-                    ? '<span class="dashicons dashicons-clipboard ee-icon-size-16 purple-text"></span>'
1201
-                    : '';
1202
-                break;
1203
-        }
1204
-        return $icon . $status[ $this->status_ID() ];
1205
-    }
1206
-
1207
-
1208
-    /**
1209
-     *        get Attendee Is Going
1210
-     */
1211
-    public function att_is_going()
1212
-    {
1213
-        return $this->get('REG_att_is_going');
1214
-    }
1215
-
1216
-
1217
-    /**
1218
-     * Gets related answers
1219
-     *
1220
-     * @param array $query_params like EEM_Base::get_all
1221
-     * @return EE_Answer[]
1222
-     * @throws EE_Error
1223
-     */
1224
-    public function answers($query_params = null)
1225
-    {
1226
-        return $this->get_many_related('Answer', $query_params);
1227
-    }
1228
-
1229
-
1230
-    /**
1231
-     * Gets the registration's answer value to the specified question
1232
-     * (either the question's ID or a question object)
1233
-     *
1234
-     * @param EE_Question|int $question
1235
-     * @param bool            $pretty_value
1236
-     * @return array|string if pretty_value= true, the result will always be a string
1237
-     * (because the answer might be an array of answer values, so passing pretty_value=true
1238
-     * will convert it into some kind of string)
1239
-     * @throws EE_Error
1240
-     */
1241
-    public function answer_value_to_question($question, $pretty_value = true)
1242
-    {
1243
-        $question_id = EEM_Question::instance()->ensure_is_ID($question);
1244
-        return EEM_Answer::instance()->get_answer_value_to_question($this, $question_id, $pretty_value);
1245
-    }
1246
-
1247
-
1248
-    /**
1249
-     * question_groups
1250
-     * returns an array of EE_Question_Group objects for this registration
1251
-     *
1252
-     * @return EE_Question_Group[]
1253
-     * @throws EE_Error
1254
-     * @throws EntityNotFoundException
1255
-     */
1256
-    public function question_groups()
1257
-    {
1258
-        $question_groups = array();
1259
-        if ($this->event() instanceof EE_Event) {
1260
-            $question_groups = $this->event()->question_groups(
1261
-                array(
1262
-                    array(
1263
-                        'Event_Question_Group.EQG_primary' => $this->count() == 1 ? true : false,
1264
-                    ),
1265
-                    'order_by' => array('QSG_order' => 'ASC'),
1266
-                )
1267
-            );
1268
-        }
1269
-        return $question_groups;
1270
-    }
1271
-
1272
-
1273
-    /**
1274
-     * count_question_groups
1275
-     * returns a count of the number of EE_Question_Group objects for this registration
1276
-     *
1277
-     * @return int
1278
-     * @throws EE_Error
1279
-     * @throws EntityNotFoundException
1280
-     */
1281
-    public function count_question_groups()
1282
-    {
1283
-        $qg_count = 0;
1284
-        if ($this->event() instanceof EE_Event) {
1285
-            $qg_count = $this->event()->count_related(
1286
-                'Question_Group',
1287
-                array(
1288
-                    array(
1289
-                        'Event_Question_Group.EQG_primary' => $this->count() == 1 ? true : false,
1290
-                    ),
1291
-                )
1292
-            );
1293
-        }
1294
-        return $qg_count;
1295
-    }
1296
-
1297
-
1298
-    /**
1299
-     * Returns the registration date in the 'standard' string format
1300
-     * (function may be improved in the future to allow for different formats and timezones)
1301
-     *
1302
-     * @return string
1303
-     * @throws EE_Error
1304
-     */
1305
-    public function reg_date()
1306
-    {
1307
-        return $this->get_datetime('REG_date');
1308
-    }
1309
-
1310
-
1311
-    /**
1312
-     * Gets the datetime-ticket for this registration (ie, it can be used to isolate
1313
-     * the ticket this registration purchased, or the datetime they have registered
1314
-     * to attend)
1315
-     *
1316
-     * @return EE_Datetime_Ticket
1317
-     * @throws EE_Error
1318
-     */
1319
-    public function datetime_ticket()
1320
-    {
1321
-        return $this->get_first_related('Datetime_Ticket');
1322
-    }
1323
-
1324
-
1325
-    /**
1326
-     * Sets the registration's datetime_ticket.
1327
-     *
1328
-     * @param EE_Datetime_Ticket $datetime_ticket
1329
-     * @return EE_Datetime_Ticket
1330
-     * @throws EE_Error
1331
-     */
1332
-    public function set_datetime_ticket($datetime_ticket)
1333
-    {
1334
-        return $this->_add_relation_to($datetime_ticket, 'Datetime_Ticket');
1335
-    }
1336
-
1337
-    /**
1338
-     * Gets deleted
1339
-     *
1340
-     * @return bool
1341
-     * @throws EE_Error
1342
-     */
1343
-    public function deleted()
1344
-    {
1345
-        return $this->get('REG_deleted');
1346
-    }
1347
-
1348
-    /**
1349
-     * Sets deleted
1350
-     *
1351
-     * @param boolean $deleted
1352
-     * @return bool
1353
-     * @throws EE_Error
1354
-     * @throws RuntimeException
1355
-     */
1356
-    public function set_deleted($deleted)
1357
-    {
1358
-        if ($deleted) {
1359
-            $this->delete();
1360
-        } else {
1361
-            $this->restore();
1362
-        }
1363
-    }
1364
-
1365
-
1366
-    /**
1367
-     * Get the status object of this object
1368
-     *
1369
-     * @return EE_Status
1370
-     * @throws EE_Error
1371
-     */
1372
-    public function status_obj()
1373
-    {
1374
-        return $this->get_first_related('Status');
1375
-    }
1376
-
1377
-
1378
-    /**
1379
-     * Returns the number of times this registration has checked into any of the datetimes
1380
-     * its available for
1381
-     *
1382
-     * @return int
1383
-     * @throws EE_Error
1384
-     */
1385
-    public function count_checkins()
1386
-    {
1387
-        return $this->get_model()->count_related($this, 'Checkin');
1388
-    }
1389
-
1390
-
1391
-    /**
1392
-     * Returns the number of current Check-ins this registration is checked into for any of the datetimes the
1393
-     * registration is for.  Note, this is ONLY checked in (does not include checkedout)
1394
-     *
1395
-     * @return int
1396
-     * @throws EE_Error
1397
-     */
1398
-    public function count_checkins_not_checkedout()
1399
-    {
1400
-        return $this->get_model()->count_related($this, 'Checkin', array(array('CHK_in' => 1)));
1401
-    }
1402
-
1403
-
1404
-    /**
1405
-     * The purpose of this method is simply to check whether this registration can checkin to the given datetime.
1406
-     *
1407
-     * @param int | EE_Datetime $DTT_OR_ID      The datetime the registration is being checked against
1408
-     * @param bool              $check_approved This is used to indicate whether the caller wants can_checkin to also
1409
-     *                                          consider registration status as well as datetime access.
1410
-     * @return bool
1411
-     * @throws EE_Error
1412
-     */
1413
-    public function can_checkin($DTT_OR_ID, $check_approved = true)
1414
-    {
1415
-        $DTT_ID = EEM_Datetime::instance()->ensure_is_ID($DTT_OR_ID);
1416
-
1417
-        // first check registration status
1418
-        if (($check_approved && ! $this->is_approved()) || ! $DTT_ID) {
1419
-            return false;
1420
-        }
1421
-        // is there a datetime ticket that matches this dtt_ID?
1422
-        if (! (EEM_Datetime_Ticket::instance()->exists(
1423
-            array(
1424
-                array(
1425
-                    'TKT_ID' => $this->get('TKT_ID'),
1426
-                    'DTT_ID' => $DTT_ID,
1427
-                ),
1428
-            )
1429
-        ))
1430
-        ) {
1431
-            return false;
1432
-        }
1433
-
1434
-        // final check is against TKT_uses
1435
-        return $this->verify_can_checkin_against_TKT_uses($DTT_ID);
1436
-    }
1437
-
1438
-
1439
-    /**
1440
-     * This method verifies whether the user can checkin for the given datetime considering the max uses value set on
1441
-     * the ticket. To do this,  a query is done to get the count of the datetime records already checked into.  If the
1442
-     * datetime given does not have a check-in record and checking in for that datetime will exceed the allowed uses,
1443
-     * then return false.  Otherwise return true.
1444
-     *
1445
-     * @param int | EE_Datetime $DTT_OR_ID The datetime the registration is being checked against
1446
-     * @return bool true means can checkin.  false means cannot checkin.
1447
-     * @throws EE_Error
1448
-     */
1449
-    public function verify_can_checkin_against_TKT_uses($DTT_OR_ID)
1450
-    {
1451
-        $DTT_ID = EEM_Datetime::instance()->ensure_is_ID($DTT_OR_ID);
1452
-
1453
-        if (! $DTT_ID) {
1454
-            return false;
1455
-        }
1456
-
1457
-        $max_uses = $this->ticket() instanceof EE_Ticket ? $this->ticket()->uses() : EE_INF;
1458
-
1459
-        // if max uses is not set or equals infinity then return true cause its not a factor for whether user can
1460
-        // check-in or not.
1461
-        if (! $max_uses || $max_uses === EE_INF) {
1462
-            return true;
1463
-        }
1464
-
1465
-        // does this datetime have a checkin record?  If so, then the dtt count has already been verified so we can just
1466
-        // go ahead and toggle.
1467
-        if (EEM_Checkin::instance()->exists(array(array('REG_ID' => $this->ID(), 'DTT_ID' => $DTT_ID)))) {
1468
-            return true;
1469
-        }
1470
-
1471
-        // made it here so the last check is whether the number of checkins per unique datetime on this registration
1472
-        // disallows further check-ins.
1473
-        $count_unique_dtt_checkins = EEM_Checkin::instance()->count(
1474
-            array(
1475
-                array(
1476
-                    'REG_ID' => $this->ID(),
1477
-                    'CHK_in' => true,
1478
-                ),
1479
-            ),
1480
-            'DTT_ID',
1481
-            true
1482
-        );
1483
-        // checkins have already reached their max number of uses
1484
-        // so registrant can NOT checkin
1485
-        if ($count_unique_dtt_checkins >= $max_uses) {
1486
-            EE_Error::add_error(
1487
-                esc_html__(
1488
-                    'Check-in denied because number of datetime uses for the ticket has been reached or exceeded.',
1489
-                    'event_espresso'
1490
-                ),
1491
-                __FILE__,
1492
-                __FUNCTION__,
1493
-                __LINE__
1494
-            );
1495
-            return false;
1496
-        }
1497
-        return true;
1498
-    }
1499
-
1500
-
1501
-    /**
1502
-     * toggle Check-in status for this registration
1503
-     * Check-ins are toggled in the following order:
1504
-     * never checked in -> checked in
1505
-     * checked in -> checked out
1506
-     * checked out -> checked in
1507
-     *
1508
-     * @param  int $DTT_ID  include specific datetime to toggle Check-in for.
1509
-     *                      If not included or null, then it is assumed latest datetime is being toggled.
1510
-     * @param bool $verify  If true then can_checkin() is used to verify whether the person
1511
-     *                      can be checked in or not.  Otherwise this forces change in checkin status.
1512
-     * @return bool|int     the chk_in status toggled to OR false if nothing got changed.
1513
-     * @throws EE_Error
1514
-     */
1515
-    public function toggle_checkin_status($DTT_ID = null, $verify = false)
1516
-    {
1517
-        if (empty($DTT_ID)) {
1518
-            $datetime = $this->get_latest_related_datetime();
1519
-            $DTT_ID = $datetime instanceof EE_Datetime ? $datetime->ID() : 0;
1520
-            // verify the registration can checkin for the given DTT_ID
1521
-        } elseif (! $this->can_checkin($DTT_ID, $verify)) {
1522
-            EE_Error::add_error(
1523
-                sprintf(
1524
-                    esc_html__(
1525
-                        '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',
1526
-                        'event_espresso'
1527
-                    ),
1528
-                    $this->ID(),
1529
-                    $DTT_ID
1530
-                ),
1531
-                __FILE__,
1532
-                __FUNCTION__,
1533
-                __LINE__
1534
-            );
1535
-            return false;
1536
-        }
1537
-        $status_paths = array(
1538
-            EE_Checkin::status_checked_never => EE_Checkin::status_checked_in,
1539
-            EE_Checkin::status_checked_in    => EE_Checkin::status_checked_out,
1540
-            EE_Checkin::status_checked_out   => EE_Checkin::status_checked_in,
1541
-        );
1542
-        // start by getting the current status so we know what status we'll be changing to.
1543
-        $cur_status = $this->check_in_status_for_datetime($DTT_ID, null);
1544
-        $status_to = $status_paths[ $cur_status ];
1545
-        // database only records true for checked IN or false for checked OUT
1546
-        // no record ( null ) means checked in NEVER, but we obviously don't save that
1547
-        $new_status = $status_to === EE_Checkin::status_checked_in ? true : false;
1548
-        // add relation - note Check-ins are always creating new rows
1549
-        // because we are keeping track of Check-ins over time.
1550
-        // Eventually we'll probably want to show a list table
1551
-        // for the individual Check-ins so that they can be managed.
1552
-        $checkin = EE_Checkin::new_instance(
1553
-            array(
1554
-                'REG_ID' => $this->ID(),
1555
-                'DTT_ID' => $DTT_ID,
1556
-                'CHK_in' => $new_status,
1557
-            )
1558
-        );
1559
-        // if the record could not be saved then return false
1560
-        if ($checkin->save() === 0) {
1561
-            if (WP_DEBUG) {
1562
-                global $wpdb;
1563
-                $error = sprintf(
1564
-                    esc_html__(
1565
-                        'Registration check in update failed because of the following database error: %1$s%2$s',
1566
-                        'event_espresso'
1567
-                    ),
1568
-                    '<br />',
1569
-                    $wpdb->last_error
1570
-                );
1571
-            } else {
1572
-                $error = esc_html__(
1573
-                    'Registration check in update failed because of an unknown database error',
1574
-                    'event_espresso'
1575
-                );
1576
-            }
1577
-            EE_Error::add_error($error, __FILE__, __FUNCTION__, __LINE__);
1578
-            return false;
1579
-        }
1580
-        return $status_to;
1581
-    }
1582
-
1583
-
1584
-    /**
1585
-     * Returns the latest datetime related to this registration (via the ticket attached to the registration).
1586
-     * "Latest" is defined by the `DTT_EVT_start` column.
1587
-     *
1588
-     * @return EE_Datetime|null
1589
-     * @throws EE_Error
1590
-     */
1591
-    public function get_latest_related_datetime()
1592
-    {
1593
-        return EEM_Datetime::instance()->get_one(
1594
-            array(
1595
-                array(
1596
-                    'Ticket.Registration.REG_ID' => $this->ID(),
1597
-                ),
1598
-                'order_by' => array('DTT_EVT_start' => 'DESC'),
1599
-            )
1600
-        );
1601
-    }
1602
-
1603
-
1604
-    /**
1605
-     * Returns the earliest datetime related to this registration (via the ticket attached to the registration).
1606
-     * "Earliest" is defined by the `DTT_EVT_start` column.
1607
-     *
1608
-     * @throws EE_Error
1609
-     */
1610
-    public function get_earliest_related_datetime()
1611
-    {
1612
-        return EEM_Datetime::instance()->get_one(
1613
-            array(
1614
-                array(
1615
-                    'Ticket.Registration.REG_ID' => $this->ID(),
1616
-                ),
1617
-                'order_by' => array('DTT_EVT_start' => 'ASC'),
1618
-            )
1619
-        );
1620
-    }
1621
-
1622
-
1623
-    /**
1624
-     * This method simply returns the check-in status for this registration and the given datetime.
1625
-     * If neither the datetime nor the checkin values are provided as arguments,
1626
-     * then this will return the LATEST check-in status for the registration across all datetimes it belongs to.
1627
-     *
1628
-     * @param  int       $DTT_ID  The ID of the datetime we're checking against
1629
-     *                            (if empty we'll get the primary datetime for
1630
-     *                            this registration (via event) and use it's ID);
1631
-     * @param EE_Checkin $checkin If present, we use the given checkin object rather than the dtt_id.
1632
-     *
1633
-     * @return int                Integer representing Check-in status.
1634
-     * @throws EE_Error
1635
-     */
1636
-    public function check_in_status_for_datetime($DTT_ID = 0, $checkin = null)
1637
-    {
1638
-        $checkin_query_params = array(
1639
-            'order_by' => array('CHK_timestamp' => 'DESC'),
1640
-        );
1641
-
1642
-        if ($DTT_ID > 0) {
1643
-            $checkin_query_params[0] = array('DTT_ID' => $DTT_ID);
1644
-        }
1645
-
1646
-        // get checkin object (if exists)
1647
-        $checkin = $checkin instanceof EE_Checkin
1648
-            ? $checkin
1649
-            : $this->get_first_related('Checkin', $checkin_query_params);
1650
-        if ($checkin instanceof EE_Checkin) {
1651
-            if ($checkin->get('CHK_in')) {
1652
-                return EE_Checkin::status_checked_in; // checked in
1653
-            }
1654
-            return EE_Checkin::status_checked_out; // had checked in but is now checked out.
1655
-        }
1656
-        return EE_Checkin::status_checked_never; // never been checked in
1657
-    }
1658
-
1659
-
1660
-    /**
1661
-     * This method returns a localized message for the toggled Check-in message.
1662
-     *
1663
-     * @param  int $DTT_ID include specific datetime to get the correct Check-in message.  If not included or null,
1664
-     *                     then it is assumed Check-in for primary datetime was toggled.
1665
-     * @param bool $error  This just flags that you want an error message returned. This is put in so that the error
1666
-     *                     message can be customized with the attendee name.
1667
-     * @return string internationalized message
1668
-     * @throws EE_Error
1669
-     */
1670
-    public function get_checkin_msg($DTT_ID, $error = false)
1671
-    {
1672
-        // let's get the attendee first so we can include the name of the attendee
1673
-        $attendee = $this->get_first_related('Attendee');
1674
-        if ($attendee instanceof EE_Attendee) {
1675
-            if ($error) {
1676
-                return sprintf(__("%s's check-in status was not changed.", "event_espresso"), $attendee->full_name());
1677
-            }
1678
-            $cur_status = $this->check_in_status_for_datetime($DTT_ID);
1679
-            // what is the status message going to be?
1680
-            switch ($cur_status) {
1681
-                case EE_Checkin::status_checked_never:
1682
-                    return sprintf(
1683
-                        __("%s has been removed from Check-in records", "event_espresso"),
1684
-                        $attendee->full_name()
1685
-                    );
1686
-                    break;
1687
-                case EE_Checkin::status_checked_in:
1688
-                    return sprintf(__('%s has been checked in', 'event_espresso'), $attendee->full_name());
1689
-                    break;
1690
-                case EE_Checkin::status_checked_out:
1691
-                    return sprintf(__('%s has been checked out', 'event_espresso'), $attendee->full_name());
1692
-                    break;
1693
-            }
1694
-        }
1695
-        return esc_html__("The check-in status could not be determined.", "event_espresso");
1696
-    }
1697
-
1698
-
1699
-    /**
1700
-     * Returns the related EE_Transaction to this registration
1701
-     *
1702
-     * @return EE_Transaction
1703
-     * @throws EE_Error
1704
-     * @throws EntityNotFoundException
1705
-     */
1706
-    public function transaction()
1707
-    {
1708
-        $transaction = $this->get_first_related('Transaction');
1709
-        if (! $transaction instanceof \EE_Transaction) {
1710
-            throw new EntityNotFoundException('Transaction ID', $this->transaction_ID());
1711
-        }
1712
-        return $transaction;
1713
-    }
1714
-
1715
-
1716
-    /**
1717
-     *        get Registration Code
1718
-     */
1719
-    public function reg_code()
1720
-    {
1721
-        return $this->get('REG_code');
1722
-    }
1723
-
1724
-
1725
-    /**
1726
-     *        get Transaction ID
1727
-     */
1728
-    public function transaction_ID()
1729
-    {
1730
-        return $this->get('TXN_ID');
1731
-    }
1732
-
1733
-
1734
-    /**
1735
-     * @return int
1736
-     * @throws EE_Error
1737
-     */
1738
-    public function ticket_ID()
1739
-    {
1740
-        return $this->get('TKT_ID');
1741
-    }
1742
-
1743
-
1744
-    /**
1745
-     *        Set Registration Code
1746
-     *
1747
-     * @access    public
1748
-     * @param    string  $REG_code Registration Code
1749
-     * @param    boolean $use_default
1750
-     * @throws EE_Error
1751
-     */
1752
-    public function set_reg_code($REG_code, $use_default = false)
1753
-    {
1754
-        if (empty($REG_code)) {
1755
-            EE_Error::add_error(
1756
-                esc_html__('REG_code can not be empty.', 'event_espresso'),
1757
-                __FILE__,
1758
-                __FUNCTION__,
1759
-                __LINE__
1760
-            );
1761
-            return;
1762
-        }
1763
-        if (! $this->reg_code()) {
1764
-            parent::set('REG_code', $REG_code, $use_default);
1765
-        } else {
1766
-            EE_Error::doing_it_wrong(
1767
-                __CLASS__ . '::' . __FUNCTION__,
1768
-                esc_html__('Can not change a registration REG_code once it has been set.', 'event_espresso'),
1769
-                '4.6.0'
1770
-            );
1771
-        }
1772
-    }
1773
-
1774
-
1775
-    /**
1776
-     * Returns all other registrations in the same group as this registrant who have the same ticket option.
1777
-     * Note, if you want to just get all registrations in the same transaction (group), use:
1778
-     *    $registration->transaction()->registrations();
1779
-     *
1780
-     * @since 4.5.0
1781
-     * @return EE_Registration[] or empty array if this isn't a group registration.
1782
-     * @throws EE_Error
1783
-     */
1784
-    public function get_all_other_registrations_in_group()
1785
-    {
1786
-        if ($this->group_size() < 2) {
1787
-            return array();
1788
-        }
1789
-
1790
-        $query[0] = array(
1791
-            'TXN_ID' => $this->transaction_ID(),
1792
-            'REG_ID' => array('!=', $this->ID()),
1793
-            'TKT_ID' => $this->ticket_ID(),
1794
-        );
1795
-        /** @var EE_Registration[] $registrations */
1796
-        $registrations = $this->get_model()->get_all($query);
1797
-        return $registrations;
1798
-    }
1799
-
1800
-    /**
1801
-     * Return the link to the admin details for the object.
1802
-     *
1803
-     * @return string
1804
-     * @throws EE_Error
1805
-     */
1806
-    public function get_admin_details_link()
1807
-    {
1808
-        EE_Registry::instance()->load_helper('URL');
1809
-        return EEH_URL::add_query_args_and_nonce(
1810
-            array(
1811
-                'page'    => 'espresso_registrations',
1812
-                'action'  => 'view_registration',
1813
-                '_REG_ID' => $this->ID(),
1814
-            ),
1815
-            admin_url('admin.php')
1816
-        );
1817
-    }
1818
-
1819
-    /**
1820
-     * Returns the link to the editor for the object.  Sometimes this is the same as the details.
1821
-     *
1822
-     * @return string
1823
-     * @throws EE_Error
1824
-     */
1825
-    public function get_admin_edit_link()
1826
-    {
1827
-        return $this->get_admin_details_link();
1828
-    }
1829
-
1830
-    /**
1831
-     * Returns the link to a settings page for the object.
1832
-     *
1833
-     * @return string
1834
-     * @throws EE_Error
1835
-     */
1836
-    public function get_admin_settings_link()
1837
-    {
1838
-        return $this->get_admin_details_link();
1839
-    }
1840
-
1841
-    /**
1842
-     * Returns the link to the "overview" for the object (typically the "list table" view).
1843
-     *
1844
-     * @return string
1845
-     */
1846
-    public function get_admin_overview_link()
1847
-    {
1848
-        EE_Registry::instance()->load_helper('URL');
1849
-        return EEH_URL::add_query_args_and_nonce(
1850
-            array(
1851
-                'page' => 'espresso_registrations',
1852
-            ),
1853
-            admin_url('admin.php')
1854
-        );
1855
-    }
1856
-
1857
-
1858
-    /**
1859
-     * @param array $query_params
1860
-     *
1861
-     * @return \EE_Registration[]
1862
-     * @throws EE_Error
1863
-     */
1864
-    public function payments($query_params = array())
1865
-    {
1866
-        return $this->get_many_related('Payment', $query_params);
1867
-    }
1868
-
1869
-
1870
-    /**
1871
-     * @param array $query_params
1872
-     *
1873
-     * @return \EE_Registration_Payment[]
1874
-     * @throws EE_Error
1875
-     */
1876
-    public function registration_payments($query_params = array())
1877
-    {
1878
-        return $this->get_many_related('Registration_Payment', $query_params);
1879
-    }
1880
-
1881
-
1882
-    /**
1883
-     * This grabs the payment method corresponding to the last payment made for the amount owing on the registration.
1884
-     * Note: if there are no payments on the registration there will be no payment method returned.
1885
-     *
1886
-     * @return EE_Payment_Method|null
1887
-     */
1888
-    public function payment_method()
1889
-    {
1890
-        return EEM_Payment_Method::instance()->get_last_used_for_registration($this);
1891
-    }
1892
-
1893
-
1894
-    /**
1895
-     * @return \EE_Line_Item
1896
-     * @throws EntityNotFoundException
1897
-     * @throws EE_Error
1898
-     */
1899
-    public function ticket_line_item()
1900
-    {
1901
-        $ticket = $this->ticket();
1902
-        $transaction = $this->transaction();
1903
-        $line_item = null;
1904
-        $ticket_line_items = \EEH_Line_Item::get_line_items_by_object_type_and_IDs(
1905
-            $transaction->total_line_item(),
1906
-            'Ticket',
1907
-            array($ticket->ID())
1908
-        );
1909
-        foreach ($ticket_line_items as $ticket_line_item) {
1910
-            if ($ticket_line_item instanceof \EE_Line_Item
1911
-                && $ticket_line_item->OBJ_type() === 'Ticket'
1912
-                && $ticket_line_item->OBJ_ID() === $ticket->ID()
1913
-            ) {
1914
-                $line_item = $ticket_line_item;
1915
-                break;
1916
-            }
1917
-        }
1918
-        if (! ($line_item instanceof \EE_Line_Item && $line_item->OBJ_type() === 'Ticket')) {
1919
-            throw new EntityNotFoundException('Line Item Ticket ID', $ticket->ID());
1920
-        }
1921
-        return $line_item;
1922
-    }
1923
-
1924
-
1925
-    /**
1926
-     * Soft Deletes this model object.
1927
-     *
1928
-     * @return boolean | int
1929
-     * @throws RuntimeException
1930
-     * @throws EE_Error
1931
-     */
1932
-    public function delete()
1933
-    {
1934
-        if ($this->update_extra_meta(EE_Registration::PRE_TRASH_REG_STATUS_KEY, $this->status_ID()) === true) {
1935
-            $this->set_status(EEM_Registration::status_id_cancelled);
1936
-        }
1937
-        return parent::delete();
1938
-    }
1939
-
1940
-
1941
-    /**
1942
-     * Restores whatever the previous status was on a registration before it was trashed (if possible)
1943
-     *
1944
-     * @throws EE_Error
1945
-     * @throws RuntimeException
1946
-     */
1947
-    public function restore()
1948
-    {
1949
-        $previous_status = $this->get_extra_meta(
1950
-            EE_Registration::PRE_TRASH_REG_STATUS_KEY,
1951
-            true,
1952
-            EEM_Registration::status_id_cancelled
1953
-        );
1954
-        if ($previous_status) {
1955
-            $this->delete_extra_meta(EE_Registration::PRE_TRASH_REG_STATUS_KEY);
1956
-            $this->set_status($previous_status);
1957
-        }
1958
-        return parent::restore();
1959
-    }
1960
-
1961
-
1962
-    /**
1963
-     * possibly toggle Registration status based on comparison of REG_paid vs REG_final_price
1964
-     *
1965
-     * @param  boolean $trigger_set_status_logic EE_Registration::set_status() can trigger additional logic
1966
-     *                                           depending on whether the reg status changes to or from "Approved"
1967
-     * @return boolean whether the Registration status was updated
1968
-     * @throws EE_Error
1969
-     * @throws RuntimeException
1970
-     */
1971
-    public function updateStatusBasedOnTotalPaid($trigger_set_status_logic = true)
1972
-    {
1973
-        $paid = $this->paid();
1974
-        $price = $this->final_price();
1975
-        switch (true) {
1976
-            // overpaid or paid
1977
-            case EEH_Money::compare_floats($paid, $price, '>'):
1978
-            case EEH_Money::compare_floats($paid, $price):
1979
-                $new_status = EEM_Registration::status_id_approved;
1980
-                break;
1981
-            //  underpaid
1982
-            case EEH_Money::compare_floats($paid, $price, '<'):
1983
-                $new_status = EEM_Registration::status_id_pending_payment;
1984
-                break;
1985
-            // uhhh Houston...
1986
-            default:
1987
-                throw new RuntimeException(
1988
-                    esc_html__('The total paid calculation for this registration is inaccurate.', 'event_espresso')
1989
-                );
1990
-        }
1991
-        if ($new_status !== $this->status_ID()) {
1992
-            if ($trigger_set_status_logic) {
1993
-                return $this->set_status($new_status);
1994
-            }
1995
-            parent::set('STS_ID', $new_status);
1996
-            return true;
1997
-        }
1998
-        return false;
1999
-    }
2000
-
2001
-
2002
-    /*************************** DEPRECATED ***************************/
2003
-
2004
-
2005
-    /**
2006
-     * @deprecated
2007
-     * @since     4.7.0
2008
-     * @access    public
2009
-     */
2010
-    public function price_paid()
2011
-    {
2012
-        EE_Error::doing_it_wrong(
2013
-            'EE_Registration::price_paid()',
2014
-            esc_html__(
2015
-                'This method is deprecated, please use EE_Registration::final_price() instead.',
2016
-                'event_espresso'
2017
-            ),
2018
-            '4.7.0'
2019
-        );
2020
-        return $this->final_price();
2021
-    }
2022
-
2023
-
2024
-    /**
2025
-     * @deprecated
2026
-     * @since     4.7.0
2027
-     * @access    public
2028
-     * @param    float $REG_final_price
2029
-     * @throws EE_Error
2030
-     * @throws RuntimeException
2031
-     */
2032
-    public function set_price_paid($REG_final_price = 0.00)
2033
-    {
2034
-        EE_Error::doing_it_wrong(
2035
-            'EE_Registration::set_price_paid()',
2036
-            esc_html__(
2037
-                'This method is deprecated, please use EE_Registration::set_final_price() instead.',
2038
-                'event_espresso'
2039
-            ),
2040
-            '4.7.0'
2041
-        );
2042
-        $this->set_final_price($REG_final_price);
2043
-    }
2044
-
2045
-
2046
-    /**
2047
-     * @deprecated
2048
-     * @since 4.7.0
2049
-     * @return string
2050
-     * @throws EE_Error
2051
-     */
2052
-    public function pretty_price_paid()
2053
-    {
2054
-        EE_Error::doing_it_wrong(
2055
-            'EE_Registration::pretty_price_paid()',
2056
-            esc_html__(
2057
-                'This method is deprecated, please use EE_Registration::pretty_final_price() instead.',
2058
-                'event_espresso'
2059
-            ),
2060
-            '4.7.0'
2061
-        );
2062
-        return $this->pretty_final_price();
2063
-    }
2064
-
2065
-
2066
-    /**
2067
-     * Gets the primary datetime related to this registration via the related Event to this registration
2068
-     *
2069
-     * @deprecated 4.9.17
2070
-     * @return EE_Datetime
2071
-     * @throws EE_Error
2072
-     * @throws EntityNotFoundException
2073
-     */
2074
-    public function get_related_primary_datetime()
2075
-    {
2076
-        EE_Error::doing_it_wrong(
2077
-            __METHOD__,
2078
-            esc_html__(
2079
-                'Use EE_Registration::get_latest_related_datetime() or EE_Registration::get_earliest_related_datetime()',
2080
-                'event_espresso'
2081
-            ),
2082
-            '4.9.17',
2083
-            '5.0.0'
2084
-        );
2085
-        return $this->event()->primary_datetime();
2086
-    }
20
+	/**
21
+	 * Used to reference when a registration has never been checked in.
22
+	 *
23
+	 * @deprecated use \EE_Checkin::status_checked_never instead
24
+	 * @type int
25
+	 */
26
+	const checkin_status_never = 2;
27
+
28
+	/**
29
+	 * Used to reference when a registration has been checked in.
30
+	 *
31
+	 * @deprecated use \EE_Checkin::status_checked_in instead
32
+	 * @type int
33
+	 */
34
+	const checkin_status_in = 1;
35
+
36
+
37
+	/**
38
+	 * Used to reference when a registration has been checked out.
39
+	 *
40
+	 * @deprecated use \EE_Checkin::status_checked_out instead
41
+	 * @type int
42
+	 */
43
+	const checkin_status_out = 0;
44
+
45
+
46
+	/**
47
+	 * extra meta key for tracking reg status os trashed registrations
48
+	 *
49
+	 * @type string
50
+	 */
51
+	const PRE_TRASH_REG_STATUS_KEY = 'pre_trash_registration_status';
52
+
53
+
54
+	/**
55
+	 * extra meta key for tracking if registration has reserved ticket
56
+	 *
57
+	 * @type string
58
+	 */
59
+	const HAS_RESERVED_TICKET_KEY = 'has_reserved_ticket';
60
+
61
+
62
+	/**
63
+	 * @param array  $props_n_values          incoming values
64
+	 * @param string $timezone                incoming timezone (if not set the timezone set for the website will be
65
+	 *                                        used.)
66
+	 * @param array  $date_formats            incoming date_formats in an array where the first value is the
67
+	 *                                        date_format and the second value is the time format
68
+	 * @return EE_Registration
69
+	 * @throws EE_Error
70
+	 */
71
+	public static function new_instance($props_n_values = array(), $timezone = null, $date_formats = array())
72
+	{
73
+		$has_object = parent::_check_for_object($props_n_values, __CLASS__, $timezone, $date_formats);
74
+		return $has_object ? $has_object : new self($props_n_values, false, $timezone, $date_formats);
75
+	}
76
+
77
+
78
+	/**
79
+	 * @param array  $props_n_values  incoming values from the database
80
+	 * @param string $timezone        incoming timezone as set by the model.  If not set the timezone for
81
+	 *                                the website will be used.
82
+	 * @return EE_Registration
83
+	 */
84
+	public static function new_instance_from_db($props_n_values = array(), $timezone = null)
85
+	{
86
+		return new self($props_n_values, true, $timezone);
87
+	}
88
+
89
+
90
+	/**
91
+	 *        Set Event ID
92
+	 *
93
+	 * @param        int $EVT_ID Event ID
94
+	 * @throws EE_Error
95
+	 * @throws RuntimeException
96
+	 */
97
+	public function set_event($EVT_ID = 0)
98
+	{
99
+		$this->set('EVT_ID', $EVT_ID);
100
+	}
101
+
102
+
103
+	/**
104
+	 * Overrides parent set() method so that all calls to set( 'REG_code', $REG_code ) OR set( 'STS_ID', $STS_ID ) can
105
+	 * be routed to internal methods
106
+	 *
107
+	 * @param string $field_name
108
+	 * @param mixed  $field_value
109
+	 * @param bool   $use_default
110
+	 * @throws EE_Error
111
+	 * @throws EntityNotFoundException
112
+	 * @throws InvalidArgumentException
113
+	 * @throws InvalidDataTypeException
114
+	 * @throws InvalidInterfaceException
115
+	 * @throws ReflectionException
116
+	 * @throws RuntimeException
117
+	 */
118
+	public function set($field_name, $field_value, $use_default = false)
119
+	{
120
+		switch ($field_name) {
121
+			case 'REG_code':
122
+				if (! empty($field_value) && $this->reg_code() === null) {
123
+					$this->set_reg_code($field_value, $use_default);
124
+				}
125
+				break;
126
+			case 'STS_ID':
127
+				$this->set_status($field_value, $use_default);
128
+				break;
129
+			default:
130
+				parent::set($field_name, $field_value, $use_default);
131
+		}
132
+	}
133
+
134
+
135
+	/**
136
+	 * Set Status ID
137
+	 * updates the registration status and ALSO...
138
+	 * calls reserve_registration_space() if the reg status changes TO approved from any other reg status
139
+	 * calls release_registration_space() if the reg status changes FROM approved to any other reg status
140
+	 *
141
+	 * @param string                $new_STS_ID
142
+	 * @param boolean               $use_default
143
+	 * @param ContextInterface|null $context
144
+	 * @return bool
145
+	 * @throws EE_Error
146
+	 * @throws EntityNotFoundException
147
+	 * @throws InvalidArgumentException
148
+	 * @throws ReflectionException
149
+	 * @throws RuntimeException
150
+	 * @throws InvalidDataTypeException
151
+	 * @throws InvalidInterfaceException
152
+	 */
153
+	public function set_status($new_STS_ID = null, $use_default = false, ContextInterface $context = null)
154
+	{
155
+		// get current REG_Status
156
+		$old_STS_ID = $this->status_ID();
157
+		// if status has changed
158
+		if ($old_STS_ID !== $new_STS_ID // and that status has actually changed
159
+			&& ! empty($old_STS_ID) // and that old status is actually set
160
+			&& ! empty($new_STS_ID) // as well as the new status
161
+			&& $this->ID() // ensure registration is in the db
162
+		) {
163
+			// TO approved
164
+			if ($new_STS_ID === EEM_Registration::status_id_approved) {
165
+				// reserve a space by incrementing ticket and datetime sold values
166
+				$this->_reserve_registration_space();
167
+				do_action('AHEE__EE_Registration__set_status__to_approved', $this, $old_STS_ID, $new_STS_ID, $context);
168
+				// OR FROM  approved
169
+			} elseif ($old_STS_ID === EEM_Registration::status_id_approved) {
170
+				// release a space by decrementing ticket and datetime sold values
171
+				$this->_release_registration_space();
172
+				do_action(
173
+					'AHEE__EE_Registration__set_status__from_approved',
174
+					$this,
175
+					$old_STS_ID,
176
+					$new_STS_ID,
177
+					$context
178
+				);
179
+			}
180
+			// update status
181
+			parent::set('STS_ID', $new_STS_ID, $use_default);
182
+			$this->_update_if_canceled_or_declined($new_STS_ID, $old_STS_ID, $context);
183
+			if ($this->statusChangeUpdatesTransaction($context)) {
184
+				$this->updateTransactionAfterStatusChange();
185
+			}
186
+			do_action('AHEE__EE_Registration__set_status__after_update', $this, $old_STS_ID, $new_STS_ID, $context);
187
+			return true;
188
+		}
189
+		// even though the old value matches the new value, it's still good to
190
+		// allow the parent set method to have a say
191
+		parent::set('STS_ID', $new_STS_ID, $use_default);
192
+		return true;
193
+	}
194
+
195
+
196
+	/**
197
+	 * update REGs and TXN when cancelled or declined registrations involved
198
+	 *
199
+	 * @param string                $new_STS_ID
200
+	 * @param string                $old_STS_ID
201
+	 * @param ContextInterface|null $context
202
+	 * @throws EE_Error
203
+	 * @throws InvalidArgumentException
204
+	 * @throws InvalidDataTypeException
205
+	 * @throws InvalidInterfaceException
206
+	 * @throws ReflectionException
207
+	 */
208
+	private function _update_if_canceled_or_declined($new_STS_ID, $old_STS_ID, ContextInterface $context = null)
209
+	{
210
+		// these reg statuses should not be considered in any calculations involving monies owing
211
+		$closed_reg_statuses = EEM_Registration::closed_reg_statuses();
212
+		// true if registration has been cancelled or declined
213
+		$this->updateIfCanceled(
214
+			$closed_reg_statuses,
215
+			$new_STS_ID,
216
+			$old_STS_ID,
217
+			$context
218
+		);
219
+		$this->updateIfDeclined(
220
+			$closed_reg_statuses,
221
+			$new_STS_ID,
222
+			$old_STS_ID,
223
+			$context
224
+		);
225
+	}
226
+
227
+
228
+	/**
229
+	 * update REGs and TXN when cancelled or declined registrations involved
230
+	 *
231
+	 * @param array                 $closed_reg_statuses
232
+	 * @param string                $new_STS_ID
233
+	 * @param string                $old_STS_ID
234
+	 * @param ContextInterface|null $context
235
+	 * @throws EE_Error
236
+	 * @throws InvalidArgumentException
237
+	 * @throws InvalidDataTypeException
238
+	 * @throws InvalidInterfaceException
239
+	 * @throws ReflectionException
240
+	 */
241
+	private function updateIfCanceled(
242
+		array $closed_reg_statuses,
243
+		$new_STS_ID,
244
+		$old_STS_ID,
245
+		ContextInterface $context = null
246
+	) {
247
+		// true if registration has been cancelled or declined
248
+		if (in_array($new_STS_ID, $closed_reg_statuses, true)
249
+			&& ! in_array($old_STS_ID, $closed_reg_statuses, true)
250
+		) {
251
+			/** @type EE_Registration_Processor $registration_processor */
252
+			$registration_processor = EE_Registry::instance()->load_class('Registration_Processor');
253
+			/** @type EE_Transaction_Processor $transaction_processor */
254
+			$transaction_processor = EE_Registry::instance()->load_class('Transaction_Processor');
255
+			// cancelled or declined registration
256
+			$registration_processor->update_registration_after_being_canceled_or_declined(
257
+				$this,
258
+				$closed_reg_statuses
259
+			);
260
+			$transaction_processor->update_transaction_after_canceled_or_declined_registration(
261
+				$this,
262
+				$closed_reg_statuses,
263
+				false
264
+			);
265
+			do_action(
266
+				'AHEE__EE_Registration__set_status__canceled_or_declined',
267
+				$this,
268
+				$old_STS_ID,
269
+				$new_STS_ID,
270
+				$context
271
+			);
272
+			return;
273
+		}
274
+	}
275
+
276
+
277
+	/**
278
+	 * update REGs and TXN when cancelled or declined registrations involved
279
+	 *
280
+	 * @param array                 $closed_reg_statuses
281
+	 * @param string                $new_STS_ID
282
+	 * @param string                $old_STS_ID
283
+	 * @param ContextInterface|null $context
284
+	 * @throws EE_Error
285
+	 * @throws InvalidArgumentException
286
+	 * @throws InvalidDataTypeException
287
+	 * @throws InvalidInterfaceException
288
+	 * @throws ReflectionException
289
+	 */
290
+	private function updateIfDeclined(
291
+		array $closed_reg_statuses,
292
+		$new_STS_ID,
293
+		$old_STS_ID,
294
+		ContextInterface $context = null
295
+	) {
296
+		// true if reinstating cancelled or declined registration
297
+		if (in_array($old_STS_ID, $closed_reg_statuses, true)
298
+			&& ! in_array($new_STS_ID, $closed_reg_statuses, true)
299
+		) {
300
+			/** @type EE_Registration_Processor $registration_processor */
301
+			$registration_processor = EE_Registry::instance()->load_class('Registration_Processor');
302
+			/** @type EE_Transaction_Processor $transaction_processor */
303
+			$transaction_processor = EE_Registry::instance()->load_class('Transaction_Processor');
304
+			// reinstating cancelled or declined registration
305
+			$registration_processor->update_canceled_or_declined_registration_after_being_reinstated(
306
+				$this,
307
+				$closed_reg_statuses
308
+			);
309
+			$transaction_processor->update_transaction_after_reinstating_canceled_registration(
310
+				$this,
311
+				$closed_reg_statuses,
312
+				false
313
+			);
314
+			do_action(
315
+				'AHEE__EE_Registration__set_status__after_reinstated',
316
+				$this,
317
+				$old_STS_ID,
318
+				$new_STS_ID,
319
+				$context
320
+			);
321
+		}
322
+	}
323
+
324
+
325
+	/**
326
+	 * @param ContextInterface|null $context
327
+	 * @return bool
328
+	 */
329
+	private function statusChangeUpdatesTransaction(ContextInterface $context = null)
330
+	{
331
+		$contexts_that_do_not_update_transaction = (array) apply_filters(
332
+			'AHEE__EE_Registration__statusChangeUpdatesTransaction__contexts_that_do_not_update_transaction',
333
+			array('spco_reg_step_attendee_information_process_registrations'),
334
+			$context,
335
+			$this
336
+		);
337
+		return ! (
338
+			$context instanceof ContextInterface
339
+			&& in_array($context->slug(), $contexts_that_do_not_update_transaction, true)
340
+		);
341
+	}
342
+
343
+
344
+	/**
345
+	 * @throws EE_Error
346
+	 * @throws EntityNotFoundException
347
+	 * @throws InvalidArgumentException
348
+	 * @throws InvalidDataTypeException
349
+	 * @throws InvalidInterfaceException
350
+	 * @throws ReflectionException
351
+	 * @throws RuntimeException
352
+	 */
353
+	private function updateTransactionAfterStatusChange()
354
+	{
355
+		/** @type EE_Transaction_Payments $transaction_payments */
356
+		$transaction_payments = EE_Registry::instance()->load_class('Transaction_Payments');
357
+		$transaction_payments->recalculate_transaction_total($this->transaction(), false);
358
+		$this->transaction()->update_status_based_on_total_paid(true);
359
+	}
360
+
361
+
362
+	/**
363
+	 *        get Status ID
364
+	 */
365
+	public function status_ID()
366
+	{
367
+		return $this->get('STS_ID');
368
+	}
369
+
370
+
371
+	/**
372
+	 * Gets the ticket this registration is for
373
+	 *
374
+	 * @param boolean $include_archived whether to include archived tickets or not.
375
+	 *
376
+	 * @return EE_Ticket|EE_Base_Class
377
+	 * @throws EE_Error
378
+	 */
379
+	public function ticket($include_archived = true)
380
+	{
381
+		$query_params = array();
382
+		if ($include_archived) {
383
+			$query_params['default_where_conditions'] = 'none';
384
+		}
385
+		return $this->get_first_related('Ticket', $query_params);
386
+	}
387
+
388
+
389
+	/**
390
+	 * Gets the event this registration is for
391
+	 *
392
+	 * @return EE_Event
393
+	 * @throws EE_Error
394
+	 * @throws EntityNotFoundException
395
+	 */
396
+	public function event()
397
+	{
398
+		$event = $this->get_first_related('Event');
399
+		if (! $event instanceof \EE_Event) {
400
+			throw new EntityNotFoundException('Event ID', $this->event_ID());
401
+		}
402
+		return $event;
403
+	}
404
+
405
+
406
+	/**
407
+	 * Gets the "author" of the registration.  Note that for the purposes of registrations, the author will correspond
408
+	 * with the author of the event this registration is for.
409
+	 *
410
+	 * @since 4.5.0
411
+	 * @return int
412
+	 * @throws EE_Error
413
+	 * @throws EntityNotFoundException
414
+	 */
415
+	public function wp_user()
416
+	{
417
+		$event = $this->event();
418
+		if ($event instanceof EE_Event) {
419
+			return $event->wp_user();
420
+		}
421
+		return 0;
422
+	}
423
+
424
+
425
+	/**
426
+	 * increments this registration's related ticket sold and corresponding datetime sold values
427
+	 *
428
+	 * @return void
429
+	 * @throws DomainException
430
+	 * @throws EE_Error
431
+	 * @throws EntityNotFoundException
432
+	 * @throws InvalidArgumentException
433
+	 * @throws InvalidDataTypeException
434
+	 * @throws InvalidInterfaceException
435
+	 * @throws ReflectionException
436
+	 * @throws UnexpectedEntityException
437
+	 */
438
+	private function _reserve_registration_space()
439
+	{
440
+		// reserved ticket and datetime counts will be decremented as sold counts are incremented
441
+		// so stop tracking that this reg has a ticket reserved
442
+		$this->release_reserved_ticket(false, "REG: {$this->ID()} (ln:" . __LINE__ . ')');
443
+		$ticket = $this->ticket();
444
+		$ticket->increase_sold();
445
+		$ticket->save();
446
+		// possibly set event status to sold out
447
+		$this->event()->perform_sold_out_status_check();
448
+	}
449
+
450
+
451
+	/**
452
+	 * decrements (subtracts) this registration's related ticket sold and corresponding datetime sold values
453
+	 *
454
+	 * @return void
455
+	 * @throws DomainException
456
+	 * @throws EE_Error
457
+	 * @throws EntityNotFoundException
458
+	 * @throws InvalidArgumentException
459
+	 * @throws InvalidDataTypeException
460
+	 * @throws InvalidInterfaceException
461
+	 * @throws ReflectionException
462
+	 * @throws UnexpectedEntityException
463
+	 */
464
+	private function _release_registration_space()
465
+	{
466
+		$ticket = $this->ticket();
467
+		$ticket->decrease_sold();
468
+		$ticket->save();
469
+		// possibly change event status from sold out back to previous status
470
+		$this->event()->perform_sold_out_status_check();
471
+	}
472
+
473
+
474
+	/**
475
+	 * tracks this registration's ticket reservation in extra meta
476
+	 * and can increment related ticket reserved and corresponding datetime reserved values
477
+	 *
478
+	 * @param bool $update_ticket if true, will increment ticket and datetime reserved count
479
+	 * @return void
480
+	 * @throws EE_Error
481
+	 * @throws InvalidArgumentException
482
+	 * @throws InvalidDataTypeException
483
+	 * @throws InvalidInterfaceException
484
+	 * @throws ReflectionException
485
+	 */
486
+	public function reserve_ticket($update_ticket = false, $source = 'unknown')
487
+	{
488
+		// only reserve ticket if space is not currently reserved
489
+		if ((bool) $this->get_extra_meta(EE_Registration::HAS_RESERVED_TICKET_KEY, true) !== true) {
490
+			$this->update_extra_meta('reserve_ticket', "{$this->ticket_ID()} from {$source}");
491
+			// IMPORTANT !!!
492
+			// although checking $update_ticket first would be more efficient,
493
+			// we NEED to ALWAYS call update_extra_meta(), which is why that is done first
494
+			if ($this->update_extra_meta(EE_Registration::HAS_RESERVED_TICKET_KEY, true)
495
+				&& $update_ticket
496
+			) {
497
+				$ticket = $this->ticket();
498
+				$ticket->increase_reserved(1, "REG: {$this->ID()} (ln:" . __LINE__ . ')');
499
+				$ticket->save();
500
+			}
501
+		}
502
+	}
503
+
504
+
505
+	/**
506
+	 * stops tracking this registration's ticket reservation in extra meta
507
+	 * decrements (subtracts) related ticket reserved and corresponding datetime reserved values
508
+	 *
509
+	 * @param bool $update_ticket if true, will decrement ticket and datetime reserved count
510
+	 * @return void
511
+	 * @throws EE_Error
512
+	 * @throws InvalidArgumentException
513
+	 * @throws InvalidDataTypeException
514
+	 * @throws InvalidInterfaceException
515
+	 * @throws ReflectionException
516
+	 */
517
+	public function release_reserved_ticket($update_ticket = false, $source = 'unknown')
518
+	{
519
+		// only release ticket if space is currently reserved
520
+		if ((bool) $this->get_extra_meta(EE_Registration::HAS_RESERVED_TICKET_KEY, true) === true) {
521
+			$this->update_extra_meta('release_reserved_ticket', "{$this->ticket_ID()} from {$source}");
522
+			// IMPORTANT !!!
523
+			// although checking $update_ticket first would be more efficient,
524
+			// we NEED to ALWAYS call update_extra_meta(), which is why that is done first
525
+			if ($this->update_extra_meta(EE_Registration::HAS_RESERVED_TICKET_KEY, false)
526
+				&& $update_ticket
527
+			) {
528
+				$ticket = $this->ticket();
529
+				$ticket->decrease_reserved(1, true, "REG: {$this->ID()} (ln:" . __LINE__ . ')');
530
+				$ticket->save();
531
+			}
532
+		}
533
+	}
534
+
535
+
536
+	/**
537
+	 * Set Attendee ID
538
+	 *
539
+	 * @param        int $ATT_ID Attendee ID
540
+	 * @throws EE_Error
541
+	 * @throws RuntimeException
542
+	 */
543
+	public function set_attendee_id($ATT_ID = 0)
544
+	{
545
+		$this->set('ATT_ID', $ATT_ID);
546
+	}
547
+
548
+
549
+	/**
550
+	 *        Set Transaction ID
551
+	 *
552
+	 * @param        int $TXN_ID Transaction ID
553
+	 * @throws EE_Error
554
+	 * @throws RuntimeException
555
+	 */
556
+	public function set_transaction_id($TXN_ID = 0)
557
+	{
558
+		$this->set('TXN_ID', $TXN_ID);
559
+	}
560
+
561
+
562
+	/**
563
+	 *        Set Session
564
+	 *
565
+	 * @param    string $REG_session PHP Session ID
566
+	 * @throws EE_Error
567
+	 * @throws RuntimeException
568
+	 */
569
+	public function set_session($REG_session = '')
570
+	{
571
+		$this->set('REG_session', $REG_session);
572
+	}
573
+
574
+
575
+	/**
576
+	 *        Set Registration URL Link
577
+	 *
578
+	 * @param    string $REG_url_link Registration URL Link
579
+	 * @throws EE_Error
580
+	 * @throws RuntimeException
581
+	 */
582
+	public function set_reg_url_link($REG_url_link = '')
583
+	{
584
+		$this->set('REG_url_link', $REG_url_link);
585
+	}
586
+
587
+
588
+	/**
589
+	 *        Set Attendee Counter
590
+	 *
591
+	 * @param        int $REG_count Primary Attendee
592
+	 * @throws EE_Error
593
+	 * @throws RuntimeException
594
+	 */
595
+	public function set_count($REG_count = 1)
596
+	{
597
+		$this->set('REG_count', $REG_count);
598
+	}
599
+
600
+
601
+	/**
602
+	 *        Set Group Size
603
+	 *
604
+	 * @param        boolean $REG_group_size Group Registration
605
+	 * @throws EE_Error
606
+	 * @throws RuntimeException
607
+	 */
608
+	public function set_group_size($REG_group_size = false)
609
+	{
610
+		$this->set('REG_group_size', $REG_group_size);
611
+	}
612
+
613
+
614
+	/**
615
+	 *    is_not_approved -  convenience method that returns TRUE if REG status ID ==
616
+	 *    EEM_Registration::status_id_not_approved
617
+	 *
618
+	 * @return        boolean
619
+	 */
620
+	public function is_not_approved()
621
+	{
622
+		return $this->status_ID() == EEM_Registration::status_id_not_approved ? true : false;
623
+	}
624
+
625
+
626
+	/**
627
+	 *    is_pending_payment -  convenience method that returns TRUE if REG status ID ==
628
+	 *    EEM_Registration::status_id_pending_payment
629
+	 *
630
+	 * @return        boolean
631
+	 */
632
+	public function is_pending_payment()
633
+	{
634
+		return $this->status_ID() == EEM_Registration::status_id_pending_payment ? true : false;
635
+	}
636
+
637
+
638
+	/**
639
+	 *    is_approved -  convenience method that returns TRUE if REG status ID == EEM_Registration::status_id_approved
640
+	 *
641
+	 * @return        boolean
642
+	 */
643
+	public function is_approved()
644
+	{
645
+		return $this->status_ID() == EEM_Registration::status_id_approved ? true : false;
646
+	}
647
+
648
+
649
+	/**
650
+	 *    is_cancelled -  convenience method that returns TRUE if REG status ID == EEM_Registration::status_id_cancelled
651
+	 *
652
+	 * @return        boolean
653
+	 */
654
+	public function is_cancelled()
655
+	{
656
+		return $this->status_ID() == EEM_Registration::status_id_cancelled ? true : false;
657
+	}
658
+
659
+
660
+	/**
661
+	 *    is_declined -  convenience method that returns TRUE if REG status ID == EEM_Registration::status_id_declined
662
+	 *
663
+	 * @return        boolean
664
+	 */
665
+	public function is_declined()
666
+	{
667
+		return $this->status_ID() == EEM_Registration::status_id_declined ? true : false;
668
+	}
669
+
670
+
671
+	/**
672
+	 *    is_incomplete -  convenience method that returns TRUE if REG status ID ==
673
+	 *    EEM_Registration::status_id_incomplete
674
+	 *
675
+	 * @return        boolean
676
+	 */
677
+	public function is_incomplete()
678
+	{
679
+		return $this->status_ID() == EEM_Registration::status_id_incomplete ? true : false;
680
+	}
681
+
682
+
683
+	/**
684
+	 *        Set Registration Date
685
+	 *
686
+	 * @param        mixed ( int or string ) $REG_date Registration Date - Unix timestamp or string representation of
687
+	 *                                                 Date
688
+	 * @throws EE_Error
689
+	 * @throws RuntimeException
690
+	 */
691
+	public function set_reg_date($REG_date = false)
692
+	{
693
+		$this->set('REG_date', $REG_date);
694
+	}
695
+
696
+
697
+	/**
698
+	 *    Set final price owing for this registration after all ticket/price modifications
699
+	 *
700
+	 * @access    public
701
+	 * @param    float $REG_final_price
702
+	 * @throws EE_Error
703
+	 * @throws RuntimeException
704
+	 */
705
+	public function set_final_price($REG_final_price = 0.00)
706
+	{
707
+		$this->set('REG_final_price', $REG_final_price);
708
+	}
709
+
710
+
711
+	/**
712
+	 *    Set amount paid towards this registration's final price
713
+	 *
714
+	 * @access    public
715
+	 * @param    float $REG_paid
716
+	 * @throws EE_Error
717
+	 * @throws RuntimeException
718
+	 */
719
+	public function set_paid($REG_paid = 0.00)
720
+	{
721
+		$this->set('REG_paid', $REG_paid);
722
+	}
723
+
724
+
725
+	/**
726
+	 *        Attendee Is Going
727
+	 *
728
+	 * @param        boolean $REG_att_is_going Attendee Is Going
729
+	 * @throws EE_Error
730
+	 * @throws RuntimeException
731
+	 */
732
+	public function set_att_is_going($REG_att_is_going = false)
733
+	{
734
+		$this->set('REG_att_is_going', $REG_att_is_going);
735
+	}
736
+
737
+
738
+	/**
739
+	 * Gets the related attendee
740
+	 *
741
+	 * @return EE_Attendee
742
+	 * @throws EE_Error
743
+	 */
744
+	public function attendee()
745
+	{
746
+		return $this->get_first_related('Attendee');
747
+	}
748
+
749
+
750
+	/**
751
+	 *        get Event ID
752
+	 */
753
+	public function event_ID()
754
+	{
755
+		return $this->get('EVT_ID');
756
+	}
757
+
758
+
759
+	/**
760
+	 *        get Event ID
761
+	 */
762
+	public function event_name()
763
+	{
764
+		$event = $this->event_obj();
765
+		if ($event) {
766
+			return $event->name();
767
+		} else {
768
+			return null;
769
+		}
770
+	}
771
+
772
+
773
+	/**
774
+	 * Fetches the event this registration is for
775
+	 *
776
+	 * @return EE_Event
777
+	 * @throws EE_Error
778
+	 */
779
+	public function event_obj()
780
+	{
781
+		return $this->get_first_related('Event');
782
+	}
783
+
784
+
785
+	/**
786
+	 *        get Attendee ID
787
+	 */
788
+	public function attendee_ID()
789
+	{
790
+		return $this->get('ATT_ID');
791
+	}
792
+
793
+
794
+	/**
795
+	 *        get PHP Session ID
796
+	 */
797
+	public function session_ID()
798
+	{
799
+		return $this->get('REG_session');
800
+	}
801
+
802
+
803
+	/**
804
+	 * Gets the string which represents the URL trigger for the receipt template in the message template system.
805
+	 *
806
+	 * @param string $messenger 'pdf' or 'html'.  Default 'html'.
807
+	 * @return string
808
+	 */
809
+	public function receipt_url($messenger = 'html')
810
+	{
811
+
812
+		/**
813
+		 * The below will be deprecated one version after this.  We check first if there is a custom receipt template
814
+		 * already in use on old system.  If there is then we just return the standard url for it.
815
+		 *
816
+		 * @since 4.5.0
817
+		 */
818
+		$template_relative_path = 'modules/gateways/Invoice/lib/templates/receipt_body.template.php';
819
+		$has_custom = EEH_Template::locate_template(
820
+			$template_relative_path,
821
+			array(),
822
+			true,
823
+			true,
824
+			true
825
+		);
826
+
827
+		if ($has_custom) {
828
+			return add_query_arg(array('receipt' => 'true'), $this->invoice_url('launch'));
829
+		}
830
+		return apply_filters('FHEE__EE_Registration__receipt_url__receipt_url', '', $this, $messenger, 'receipt');
831
+	}
832
+
833
+
834
+	/**
835
+	 * Gets the string which represents the URL trigger for the invoice template in the message template system.
836
+	 *
837
+	 * @param string $messenger 'pdf' or 'html'.  Default 'html'.
838
+	 * @return string
839
+	 * @throws EE_Error
840
+	 */
841
+	public function invoice_url($messenger = 'html')
842
+	{
843
+		/**
844
+		 * The below will be deprecated one version after this.  We check first if there is a custom invoice template
845
+		 * already in use on old system.  If there is then we just return the standard url for it.
846
+		 *
847
+		 * @since 4.5.0
848
+		 */
849
+		$template_relative_path = 'modules/gateways/Invoice/lib/templates/invoice_body.template.php';
850
+		$has_custom = EEH_Template::locate_template(
851
+			$template_relative_path,
852
+			array(),
853
+			true,
854
+			true,
855
+			true
856
+		);
857
+
858
+		if ($has_custom) {
859
+			if ($messenger == 'html') {
860
+				return $this->invoice_url('launch');
861
+			}
862
+			$route = $messenger == 'download' || $messenger == 'pdf' ? 'download_invoice' : 'launch_invoice';
863
+
864
+			$query_args = array('ee' => $route, 'id' => $this->reg_url_link());
865
+			if ($messenger == 'html') {
866
+				$query_args['html'] = true;
867
+			}
868
+			return add_query_arg($query_args, get_permalink(EE_Registry::instance()->CFG->core->thank_you_page_id));
869
+		}
870
+		return apply_filters('FHEE__EE_Registration__invoice_url__invoice_url', '', $this, $messenger, 'invoice');
871
+	}
872
+
873
+
874
+	/**
875
+	 * get Registration URL Link
876
+	 *
877
+	 * @access public
878
+	 * @return string
879
+	 * @throws EE_Error
880
+	 */
881
+	public function reg_url_link()
882
+	{
883
+		return (string) $this->get('REG_url_link');
884
+	}
885
+
886
+
887
+	/**
888
+	 * Echoes out invoice_url()
889
+	 *
890
+	 * @param string $type 'download','launch', or 'html' (default is 'launch')
891
+	 * @return void
892
+	 * @throws EE_Error
893
+	 */
894
+	public function e_invoice_url($type = 'launch')
895
+	{
896
+		echo $this->invoice_url($type);
897
+	}
898
+
899
+
900
+	/**
901
+	 * Echoes out payment_overview_url
902
+	 */
903
+	public function e_payment_overview_url()
904
+	{
905
+		echo $this->payment_overview_url();
906
+	}
907
+
908
+
909
+	/**
910
+	 * Gets the URL for the checkout payment options reg step
911
+	 * with this registration's REG_url_link added as a query parameter
912
+	 *
913
+	 * @param bool $clear_session Set to true when you want to clear the session on revisiting the
914
+	 *                            payment overview url.
915
+	 * @return string
916
+	 * @throws InvalidInterfaceException
917
+	 * @throws InvalidDataTypeException
918
+	 * @throws EE_Error
919
+	 * @throws InvalidArgumentException
920
+	 */
921
+	public function payment_overview_url($clear_session = false)
922
+	{
923
+		return add_query_arg(
924
+			(array) apply_filters(
925
+				'FHEE__EE_Registration__payment_overview_url__query_args',
926
+				array(
927
+					'e_reg_url_link' => $this->reg_url_link(),
928
+					'step'           => 'payment_options',
929
+					'revisit'        => true,
930
+					'clear_session'  => (bool) $clear_session,
931
+				),
932
+				$this
933
+			),
934
+			EE_Registry::instance()->CFG->core->reg_page_url()
935
+		);
936
+	}
937
+
938
+
939
+	/**
940
+	 * Gets the URL for the checkout attendee information reg step
941
+	 * with this registration's REG_url_link added as a query parameter
942
+	 *
943
+	 * @return string
944
+	 * @throws InvalidInterfaceException
945
+	 * @throws InvalidDataTypeException
946
+	 * @throws EE_Error
947
+	 * @throws InvalidArgumentException
948
+	 */
949
+	public function edit_attendee_information_url()
950
+	{
951
+		return add_query_arg(
952
+			(array) apply_filters(
953
+				'FHEE__EE_Registration__edit_attendee_information_url__query_args',
954
+				array(
955
+					'e_reg_url_link' => $this->reg_url_link(),
956
+					'step'           => 'attendee_information',
957
+					'revisit'        => true,
958
+				),
959
+				$this
960
+			),
961
+			EE_Registry::instance()->CFG->core->reg_page_url()
962
+		);
963
+	}
964
+
965
+
966
+	/**
967
+	 * Simply generates and returns the appropriate admin_url link to edit this registration
968
+	 *
969
+	 * @return string
970
+	 * @throws EE_Error
971
+	 */
972
+	public function get_admin_edit_url()
973
+	{
974
+		return EEH_URL::add_query_args_and_nonce(
975
+			array(
976
+				'page'    => 'espresso_registrations',
977
+				'action'  => 'view_registration',
978
+				'_REG_ID' => $this->ID(),
979
+			),
980
+			admin_url('admin.php')
981
+		);
982
+	}
983
+
984
+
985
+	/**
986
+	 *    is_primary_registrant?
987
+	 */
988
+	public function is_primary_registrant()
989
+	{
990
+		return $this->get('REG_count') == 1 ? true : false;
991
+	}
992
+
993
+
994
+	/**
995
+	 * This returns the primary registration object for this registration group (which may be this object).
996
+	 *
997
+	 * @return EE_Registration
998
+	 * @throws EE_Error
999
+	 */
1000
+	public function get_primary_registration()
1001
+	{
1002
+		if ($this->is_primary_registrant()) {
1003
+			return $this;
1004
+		}
1005
+
1006
+		// k reg_count !== 1 so let's get the EE_Registration object matching this txn_id and reg_count == 1
1007
+		/** @var EE_Registration $primary_registrant */
1008
+		$primary_registrant = EEM_Registration::instance()->get_one(
1009
+			array(
1010
+				array(
1011
+					'TXN_ID'    => $this->transaction_ID(),
1012
+					'REG_count' => 1,
1013
+				),
1014
+			)
1015
+		);
1016
+		return $primary_registrant;
1017
+	}
1018
+
1019
+
1020
+	/**
1021
+	 *        get  Attendee Number
1022
+	 *
1023
+	 * @access        public
1024
+	 */
1025
+	public function count()
1026
+	{
1027
+		return $this->get('REG_count');
1028
+	}
1029
+
1030
+
1031
+	/**
1032
+	 *        get Group Size
1033
+	 */
1034
+	public function group_size()
1035
+	{
1036
+		return $this->get('REG_group_size');
1037
+	}
1038
+
1039
+
1040
+	/**
1041
+	 *        get Registration Date
1042
+	 */
1043
+	public function date()
1044
+	{
1045
+		return $this->get('REG_date');
1046
+	}
1047
+
1048
+
1049
+	/**
1050
+	 * gets a pretty date
1051
+	 *
1052
+	 * @param string $date_format
1053
+	 * @param string $time_format
1054
+	 * @return string
1055
+	 * @throws EE_Error
1056
+	 */
1057
+	public function pretty_date($date_format = null, $time_format = null)
1058
+	{
1059
+		return $this->get_datetime('REG_date', $date_format, $time_format);
1060
+	}
1061
+
1062
+
1063
+	/**
1064
+	 * final_price
1065
+	 * the registration's share of the transaction total, so that the
1066
+	 * sum of all the transaction's REG_final_prices equal the transaction's total
1067
+	 *
1068
+	 * @return float
1069
+	 * @throws EE_Error
1070
+	 */
1071
+	public function final_price()
1072
+	{
1073
+		return $this->get('REG_final_price');
1074
+	}
1075
+
1076
+
1077
+	/**
1078
+	 * pretty_final_price
1079
+	 *  final price as formatted string, with correct decimal places and currency symbol
1080
+	 *
1081
+	 * @return string
1082
+	 * @throws EE_Error
1083
+	 */
1084
+	public function pretty_final_price()
1085
+	{
1086
+		return $this->get_pretty('REG_final_price');
1087
+	}
1088
+
1089
+
1090
+	/**
1091
+	 * get paid (yeah)
1092
+	 *
1093
+	 * @return float
1094
+	 * @throws EE_Error
1095
+	 */
1096
+	public function paid()
1097
+	{
1098
+		return $this->get('REG_paid');
1099
+	}
1100
+
1101
+
1102
+	/**
1103
+	 * pretty_paid
1104
+	 *
1105
+	 * @return float
1106
+	 * @throws EE_Error
1107
+	 */
1108
+	public function pretty_paid()
1109
+	{
1110
+		return $this->get_pretty('REG_paid');
1111
+	}
1112
+
1113
+
1114
+	/**
1115
+	 * owes_monies_and_can_pay
1116
+	 * whether or not this registration has monies owing and it's' status allows payment
1117
+	 *
1118
+	 * @param array $requires_payment
1119
+	 * @return bool
1120
+	 * @throws EE_Error
1121
+	 */
1122
+	public function owes_monies_and_can_pay($requires_payment = array())
1123
+	{
1124
+		// these reg statuses require payment (if event is not free)
1125
+		$requires_payment = ! empty($requires_payment)
1126
+			? $requires_payment
1127
+			: EEM_Registration::reg_statuses_that_allow_payment();
1128
+		if (in_array($this->status_ID(), $requires_payment) &&
1129
+			$this->final_price() != 0 &&
1130
+			$this->final_price() != $this->paid()
1131
+		) {
1132
+			return true;
1133
+		} else {
1134
+			return false;
1135
+		}
1136
+	}
1137
+
1138
+
1139
+	/**
1140
+	 * Prints out the return value of $this->pretty_status()
1141
+	 *
1142
+	 * @param bool $show_icons
1143
+	 * @return void
1144
+	 * @throws EE_Error
1145
+	 */
1146
+	public function e_pretty_status($show_icons = false)
1147
+	{
1148
+		echo $this->pretty_status($show_icons);
1149
+	}
1150
+
1151
+
1152
+	/**
1153
+	 * Returns a nice version of the status for displaying to customers
1154
+	 *
1155
+	 * @param bool $show_icons
1156
+	 * @return string
1157
+	 * @throws EE_Error
1158
+	 */
1159
+	public function pretty_status($show_icons = false)
1160
+	{
1161
+		$status = EEM_Status::instance()->localized_status(
1162
+			array($this->status_ID() => esc_html__('unknown', 'event_espresso')),
1163
+			false,
1164
+			'sentence'
1165
+		);
1166
+		$icon = '';
1167
+		switch ($this->status_ID()) {
1168
+			case EEM_Registration::status_id_approved:
1169
+				$icon = $show_icons
1170
+					? '<span class="dashicons dashicons-star-filled ee-icon-size-16 green-text"></span>'
1171
+					: '';
1172
+				break;
1173
+			case EEM_Registration::status_id_pending_payment:
1174
+				$icon = $show_icons
1175
+					? '<span class="dashicons dashicons-star-half ee-icon-size-16 orange-text"></span>'
1176
+					: '';
1177
+				break;
1178
+			case EEM_Registration::status_id_not_approved:
1179
+				$icon = $show_icons
1180
+					? '<span class="dashicons dashicons-marker ee-icon-size-16 orange-text"></span>'
1181
+					: '';
1182
+				break;
1183
+			case EEM_Registration::status_id_cancelled:
1184
+				$icon = $show_icons
1185
+					? '<span class="dashicons dashicons-no ee-icon-size-16 lt-grey-text"></span>'
1186
+					: '';
1187
+				break;
1188
+			case EEM_Registration::status_id_incomplete:
1189
+				$icon = $show_icons
1190
+					? '<span class="dashicons dashicons-no ee-icon-size-16 lt-orange-text"></span>'
1191
+					: '';
1192
+				break;
1193
+			case EEM_Registration::status_id_declined:
1194
+				$icon = $show_icons
1195
+					? '<span class="dashicons dashicons-no ee-icon-size-16 red-text"></span>'
1196
+					: '';
1197
+				break;
1198
+			case EEM_Registration::status_id_wait_list:
1199
+				$icon = $show_icons
1200
+					? '<span class="dashicons dashicons-clipboard ee-icon-size-16 purple-text"></span>'
1201
+					: '';
1202
+				break;
1203
+		}
1204
+		return $icon . $status[ $this->status_ID() ];
1205
+	}
1206
+
1207
+
1208
+	/**
1209
+	 *        get Attendee Is Going
1210
+	 */
1211
+	public function att_is_going()
1212
+	{
1213
+		return $this->get('REG_att_is_going');
1214
+	}
1215
+
1216
+
1217
+	/**
1218
+	 * Gets related answers
1219
+	 *
1220
+	 * @param array $query_params like EEM_Base::get_all
1221
+	 * @return EE_Answer[]
1222
+	 * @throws EE_Error
1223
+	 */
1224
+	public function answers($query_params = null)
1225
+	{
1226
+		return $this->get_many_related('Answer', $query_params);
1227
+	}
1228
+
1229
+
1230
+	/**
1231
+	 * Gets the registration's answer value to the specified question
1232
+	 * (either the question's ID or a question object)
1233
+	 *
1234
+	 * @param EE_Question|int $question
1235
+	 * @param bool            $pretty_value
1236
+	 * @return array|string if pretty_value= true, the result will always be a string
1237
+	 * (because the answer might be an array of answer values, so passing pretty_value=true
1238
+	 * will convert it into some kind of string)
1239
+	 * @throws EE_Error
1240
+	 */
1241
+	public function answer_value_to_question($question, $pretty_value = true)
1242
+	{
1243
+		$question_id = EEM_Question::instance()->ensure_is_ID($question);
1244
+		return EEM_Answer::instance()->get_answer_value_to_question($this, $question_id, $pretty_value);
1245
+	}
1246
+
1247
+
1248
+	/**
1249
+	 * question_groups
1250
+	 * returns an array of EE_Question_Group objects for this registration
1251
+	 *
1252
+	 * @return EE_Question_Group[]
1253
+	 * @throws EE_Error
1254
+	 * @throws EntityNotFoundException
1255
+	 */
1256
+	public function question_groups()
1257
+	{
1258
+		$question_groups = array();
1259
+		if ($this->event() instanceof EE_Event) {
1260
+			$question_groups = $this->event()->question_groups(
1261
+				array(
1262
+					array(
1263
+						'Event_Question_Group.EQG_primary' => $this->count() == 1 ? true : false,
1264
+					),
1265
+					'order_by' => array('QSG_order' => 'ASC'),
1266
+				)
1267
+			);
1268
+		}
1269
+		return $question_groups;
1270
+	}
1271
+
1272
+
1273
+	/**
1274
+	 * count_question_groups
1275
+	 * returns a count of the number of EE_Question_Group objects for this registration
1276
+	 *
1277
+	 * @return int
1278
+	 * @throws EE_Error
1279
+	 * @throws EntityNotFoundException
1280
+	 */
1281
+	public function count_question_groups()
1282
+	{
1283
+		$qg_count = 0;
1284
+		if ($this->event() instanceof EE_Event) {
1285
+			$qg_count = $this->event()->count_related(
1286
+				'Question_Group',
1287
+				array(
1288
+					array(
1289
+						'Event_Question_Group.EQG_primary' => $this->count() == 1 ? true : false,
1290
+					),
1291
+				)
1292
+			);
1293
+		}
1294
+		return $qg_count;
1295
+	}
1296
+
1297
+
1298
+	/**
1299
+	 * Returns the registration date in the 'standard' string format
1300
+	 * (function may be improved in the future to allow for different formats and timezones)
1301
+	 *
1302
+	 * @return string
1303
+	 * @throws EE_Error
1304
+	 */
1305
+	public function reg_date()
1306
+	{
1307
+		return $this->get_datetime('REG_date');
1308
+	}
1309
+
1310
+
1311
+	/**
1312
+	 * Gets the datetime-ticket for this registration (ie, it can be used to isolate
1313
+	 * the ticket this registration purchased, or the datetime they have registered
1314
+	 * to attend)
1315
+	 *
1316
+	 * @return EE_Datetime_Ticket
1317
+	 * @throws EE_Error
1318
+	 */
1319
+	public function datetime_ticket()
1320
+	{
1321
+		return $this->get_first_related('Datetime_Ticket');
1322
+	}
1323
+
1324
+
1325
+	/**
1326
+	 * Sets the registration's datetime_ticket.
1327
+	 *
1328
+	 * @param EE_Datetime_Ticket $datetime_ticket
1329
+	 * @return EE_Datetime_Ticket
1330
+	 * @throws EE_Error
1331
+	 */
1332
+	public function set_datetime_ticket($datetime_ticket)
1333
+	{
1334
+		return $this->_add_relation_to($datetime_ticket, 'Datetime_Ticket');
1335
+	}
1336
+
1337
+	/**
1338
+	 * Gets deleted
1339
+	 *
1340
+	 * @return bool
1341
+	 * @throws EE_Error
1342
+	 */
1343
+	public function deleted()
1344
+	{
1345
+		return $this->get('REG_deleted');
1346
+	}
1347
+
1348
+	/**
1349
+	 * Sets deleted
1350
+	 *
1351
+	 * @param boolean $deleted
1352
+	 * @return bool
1353
+	 * @throws EE_Error
1354
+	 * @throws RuntimeException
1355
+	 */
1356
+	public function set_deleted($deleted)
1357
+	{
1358
+		if ($deleted) {
1359
+			$this->delete();
1360
+		} else {
1361
+			$this->restore();
1362
+		}
1363
+	}
1364
+
1365
+
1366
+	/**
1367
+	 * Get the status object of this object
1368
+	 *
1369
+	 * @return EE_Status
1370
+	 * @throws EE_Error
1371
+	 */
1372
+	public function status_obj()
1373
+	{
1374
+		return $this->get_first_related('Status');
1375
+	}
1376
+
1377
+
1378
+	/**
1379
+	 * Returns the number of times this registration has checked into any of the datetimes
1380
+	 * its available for
1381
+	 *
1382
+	 * @return int
1383
+	 * @throws EE_Error
1384
+	 */
1385
+	public function count_checkins()
1386
+	{
1387
+		return $this->get_model()->count_related($this, 'Checkin');
1388
+	}
1389
+
1390
+
1391
+	/**
1392
+	 * Returns the number of current Check-ins this registration is checked into for any of the datetimes the
1393
+	 * registration is for.  Note, this is ONLY checked in (does not include checkedout)
1394
+	 *
1395
+	 * @return int
1396
+	 * @throws EE_Error
1397
+	 */
1398
+	public function count_checkins_not_checkedout()
1399
+	{
1400
+		return $this->get_model()->count_related($this, 'Checkin', array(array('CHK_in' => 1)));
1401
+	}
1402
+
1403
+
1404
+	/**
1405
+	 * The purpose of this method is simply to check whether this registration can checkin to the given datetime.
1406
+	 *
1407
+	 * @param int | EE_Datetime $DTT_OR_ID      The datetime the registration is being checked against
1408
+	 * @param bool              $check_approved This is used to indicate whether the caller wants can_checkin to also
1409
+	 *                                          consider registration status as well as datetime access.
1410
+	 * @return bool
1411
+	 * @throws EE_Error
1412
+	 */
1413
+	public function can_checkin($DTT_OR_ID, $check_approved = true)
1414
+	{
1415
+		$DTT_ID = EEM_Datetime::instance()->ensure_is_ID($DTT_OR_ID);
1416
+
1417
+		// first check registration status
1418
+		if (($check_approved && ! $this->is_approved()) || ! $DTT_ID) {
1419
+			return false;
1420
+		}
1421
+		// is there a datetime ticket that matches this dtt_ID?
1422
+		if (! (EEM_Datetime_Ticket::instance()->exists(
1423
+			array(
1424
+				array(
1425
+					'TKT_ID' => $this->get('TKT_ID'),
1426
+					'DTT_ID' => $DTT_ID,
1427
+				),
1428
+			)
1429
+		))
1430
+		) {
1431
+			return false;
1432
+		}
1433
+
1434
+		// final check is against TKT_uses
1435
+		return $this->verify_can_checkin_against_TKT_uses($DTT_ID);
1436
+	}
1437
+
1438
+
1439
+	/**
1440
+	 * This method verifies whether the user can checkin for the given datetime considering the max uses value set on
1441
+	 * the ticket. To do this,  a query is done to get the count of the datetime records already checked into.  If the
1442
+	 * datetime given does not have a check-in record and checking in for that datetime will exceed the allowed uses,
1443
+	 * then return false.  Otherwise return true.
1444
+	 *
1445
+	 * @param int | EE_Datetime $DTT_OR_ID The datetime the registration is being checked against
1446
+	 * @return bool true means can checkin.  false means cannot checkin.
1447
+	 * @throws EE_Error
1448
+	 */
1449
+	public function verify_can_checkin_against_TKT_uses($DTT_OR_ID)
1450
+	{
1451
+		$DTT_ID = EEM_Datetime::instance()->ensure_is_ID($DTT_OR_ID);
1452
+
1453
+		if (! $DTT_ID) {
1454
+			return false;
1455
+		}
1456
+
1457
+		$max_uses = $this->ticket() instanceof EE_Ticket ? $this->ticket()->uses() : EE_INF;
1458
+
1459
+		// if max uses is not set or equals infinity then return true cause its not a factor for whether user can
1460
+		// check-in or not.
1461
+		if (! $max_uses || $max_uses === EE_INF) {
1462
+			return true;
1463
+		}
1464
+
1465
+		// does this datetime have a checkin record?  If so, then the dtt count has already been verified so we can just
1466
+		// go ahead and toggle.
1467
+		if (EEM_Checkin::instance()->exists(array(array('REG_ID' => $this->ID(), 'DTT_ID' => $DTT_ID)))) {
1468
+			return true;
1469
+		}
1470
+
1471
+		// made it here so the last check is whether the number of checkins per unique datetime on this registration
1472
+		// disallows further check-ins.
1473
+		$count_unique_dtt_checkins = EEM_Checkin::instance()->count(
1474
+			array(
1475
+				array(
1476
+					'REG_ID' => $this->ID(),
1477
+					'CHK_in' => true,
1478
+				),
1479
+			),
1480
+			'DTT_ID',
1481
+			true
1482
+		);
1483
+		// checkins have already reached their max number of uses
1484
+		// so registrant can NOT checkin
1485
+		if ($count_unique_dtt_checkins >= $max_uses) {
1486
+			EE_Error::add_error(
1487
+				esc_html__(
1488
+					'Check-in denied because number of datetime uses for the ticket has been reached or exceeded.',
1489
+					'event_espresso'
1490
+				),
1491
+				__FILE__,
1492
+				__FUNCTION__,
1493
+				__LINE__
1494
+			);
1495
+			return false;
1496
+		}
1497
+		return true;
1498
+	}
1499
+
1500
+
1501
+	/**
1502
+	 * toggle Check-in status for this registration
1503
+	 * Check-ins are toggled in the following order:
1504
+	 * never checked in -> checked in
1505
+	 * checked in -> checked out
1506
+	 * checked out -> checked in
1507
+	 *
1508
+	 * @param  int $DTT_ID  include specific datetime to toggle Check-in for.
1509
+	 *                      If not included or null, then it is assumed latest datetime is being toggled.
1510
+	 * @param bool $verify  If true then can_checkin() is used to verify whether the person
1511
+	 *                      can be checked in or not.  Otherwise this forces change in checkin status.
1512
+	 * @return bool|int     the chk_in status toggled to OR false if nothing got changed.
1513
+	 * @throws EE_Error
1514
+	 */
1515
+	public function toggle_checkin_status($DTT_ID = null, $verify = false)
1516
+	{
1517
+		if (empty($DTT_ID)) {
1518
+			$datetime = $this->get_latest_related_datetime();
1519
+			$DTT_ID = $datetime instanceof EE_Datetime ? $datetime->ID() : 0;
1520
+			// verify the registration can checkin for the given DTT_ID
1521
+		} elseif (! $this->can_checkin($DTT_ID, $verify)) {
1522
+			EE_Error::add_error(
1523
+				sprintf(
1524
+					esc_html__(
1525
+						'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',
1526
+						'event_espresso'
1527
+					),
1528
+					$this->ID(),
1529
+					$DTT_ID
1530
+				),
1531
+				__FILE__,
1532
+				__FUNCTION__,
1533
+				__LINE__
1534
+			);
1535
+			return false;
1536
+		}
1537
+		$status_paths = array(
1538
+			EE_Checkin::status_checked_never => EE_Checkin::status_checked_in,
1539
+			EE_Checkin::status_checked_in    => EE_Checkin::status_checked_out,
1540
+			EE_Checkin::status_checked_out   => EE_Checkin::status_checked_in,
1541
+		);
1542
+		// start by getting the current status so we know what status we'll be changing to.
1543
+		$cur_status = $this->check_in_status_for_datetime($DTT_ID, null);
1544
+		$status_to = $status_paths[ $cur_status ];
1545
+		// database only records true for checked IN or false for checked OUT
1546
+		// no record ( null ) means checked in NEVER, but we obviously don't save that
1547
+		$new_status = $status_to === EE_Checkin::status_checked_in ? true : false;
1548
+		// add relation - note Check-ins are always creating new rows
1549
+		// because we are keeping track of Check-ins over time.
1550
+		// Eventually we'll probably want to show a list table
1551
+		// for the individual Check-ins so that they can be managed.
1552
+		$checkin = EE_Checkin::new_instance(
1553
+			array(
1554
+				'REG_ID' => $this->ID(),
1555
+				'DTT_ID' => $DTT_ID,
1556
+				'CHK_in' => $new_status,
1557
+			)
1558
+		);
1559
+		// if the record could not be saved then return false
1560
+		if ($checkin->save() === 0) {
1561
+			if (WP_DEBUG) {
1562
+				global $wpdb;
1563
+				$error = sprintf(
1564
+					esc_html__(
1565
+						'Registration check in update failed because of the following database error: %1$s%2$s',
1566
+						'event_espresso'
1567
+					),
1568
+					'<br />',
1569
+					$wpdb->last_error
1570
+				);
1571
+			} else {
1572
+				$error = esc_html__(
1573
+					'Registration check in update failed because of an unknown database error',
1574
+					'event_espresso'
1575
+				);
1576
+			}
1577
+			EE_Error::add_error($error, __FILE__, __FUNCTION__, __LINE__);
1578
+			return false;
1579
+		}
1580
+		return $status_to;
1581
+	}
1582
+
1583
+
1584
+	/**
1585
+	 * Returns the latest datetime related to this registration (via the ticket attached to the registration).
1586
+	 * "Latest" is defined by the `DTT_EVT_start` column.
1587
+	 *
1588
+	 * @return EE_Datetime|null
1589
+	 * @throws EE_Error
1590
+	 */
1591
+	public function get_latest_related_datetime()
1592
+	{
1593
+		return EEM_Datetime::instance()->get_one(
1594
+			array(
1595
+				array(
1596
+					'Ticket.Registration.REG_ID' => $this->ID(),
1597
+				),
1598
+				'order_by' => array('DTT_EVT_start' => 'DESC'),
1599
+			)
1600
+		);
1601
+	}
1602
+
1603
+
1604
+	/**
1605
+	 * Returns the earliest datetime related to this registration (via the ticket attached to the registration).
1606
+	 * "Earliest" is defined by the `DTT_EVT_start` column.
1607
+	 *
1608
+	 * @throws EE_Error
1609
+	 */
1610
+	public function get_earliest_related_datetime()
1611
+	{
1612
+		return EEM_Datetime::instance()->get_one(
1613
+			array(
1614
+				array(
1615
+					'Ticket.Registration.REG_ID' => $this->ID(),
1616
+				),
1617
+				'order_by' => array('DTT_EVT_start' => 'ASC'),
1618
+			)
1619
+		);
1620
+	}
1621
+
1622
+
1623
+	/**
1624
+	 * This method simply returns the check-in status for this registration and the given datetime.
1625
+	 * If neither the datetime nor the checkin values are provided as arguments,
1626
+	 * then this will return the LATEST check-in status for the registration across all datetimes it belongs to.
1627
+	 *
1628
+	 * @param  int       $DTT_ID  The ID of the datetime we're checking against
1629
+	 *                            (if empty we'll get the primary datetime for
1630
+	 *                            this registration (via event) and use it's ID);
1631
+	 * @param EE_Checkin $checkin If present, we use the given checkin object rather than the dtt_id.
1632
+	 *
1633
+	 * @return int                Integer representing Check-in status.
1634
+	 * @throws EE_Error
1635
+	 */
1636
+	public function check_in_status_for_datetime($DTT_ID = 0, $checkin = null)
1637
+	{
1638
+		$checkin_query_params = array(
1639
+			'order_by' => array('CHK_timestamp' => 'DESC'),
1640
+		);
1641
+
1642
+		if ($DTT_ID > 0) {
1643
+			$checkin_query_params[0] = array('DTT_ID' => $DTT_ID);
1644
+		}
1645
+
1646
+		// get checkin object (if exists)
1647
+		$checkin = $checkin instanceof EE_Checkin
1648
+			? $checkin
1649
+			: $this->get_first_related('Checkin', $checkin_query_params);
1650
+		if ($checkin instanceof EE_Checkin) {
1651
+			if ($checkin->get('CHK_in')) {
1652
+				return EE_Checkin::status_checked_in; // checked in
1653
+			}
1654
+			return EE_Checkin::status_checked_out; // had checked in but is now checked out.
1655
+		}
1656
+		return EE_Checkin::status_checked_never; // never been checked in
1657
+	}
1658
+
1659
+
1660
+	/**
1661
+	 * This method returns a localized message for the toggled Check-in message.
1662
+	 *
1663
+	 * @param  int $DTT_ID include specific datetime to get the correct Check-in message.  If not included or null,
1664
+	 *                     then it is assumed Check-in for primary datetime was toggled.
1665
+	 * @param bool $error  This just flags that you want an error message returned. This is put in so that the error
1666
+	 *                     message can be customized with the attendee name.
1667
+	 * @return string internationalized message
1668
+	 * @throws EE_Error
1669
+	 */
1670
+	public function get_checkin_msg($DTT_ID, $error = false)
1671
+	{
1672
+		// let's get the attendee first so we can include the name of the attendee
1673
+		$attendee = $this->get_first_related('Attendee');
1674
+		if ($attendee instanceof EE_Attendee) {
1675
+			if ($error) {
1676
+				return sprintf(__("%s's check-in status was not changed.", "event_espresso"), $attendee->full_name());
1677
+			}
1678
+			$cur_status = $this->check_in_status_for_datetime($DTT_ID);
1679
+			// what is the status message going to be?
1680
+			switch ($cur_status) {
1681
+				case EE_Checkin::status_checked_never:
1682
+					return sprintf(
1683
+						__("%s has been removed from Check-in records", "event_espresso"),
1684
+						$attendee->full_name()
1685
+					);
1686
+					break;
1687
+				case EE_Checkin::status_checked_in:
1688
+					return sprintf(__('%s has been checked in', 'event_espresso'), $attendee->full_name());
1689
+					break;
1690
+				case EE_Checkin::status_checked_out:
1691
+					return sprintf(__('%s has been checked out', 'event_espresso'), $attendee->full_name());
1692
+					break;
1693
+			}
1694
+		}
1695
+		return esc_html__("The check-in status could not be determined.", "event_espresso");
1696
+	}
1697
+
1698
+
1699
+	/**
1700
+	 * Returns the related EE_Transaction to this registration
1701
+	 *
1702
+	 * @return EE_Transaction
1703
+	 * @throws EE_Error
1704
+	 * @throws EntityNotFoundException
1705
+	 */
1706
+	public function transaction()
1707
+	{
1708
+		$transaction = $this->get_first_related('Transaction');
1709
+		if (! $transaction instanceof \EE_Transaction) {
1710
+			throw new EntityNotFoundException('Transaction ID', $this->transaction_ID());
1711
+		}
1712
+		return $transaction;
1713
+	}
1714
+
1715
+
1716
+	/**
1717
+	 *        get Registration Code
1718
+	 */
1719
+	public function reg_code()
1720
+	{
1721
+		return $this->get('REG_code');
1722
+	}
1723
+
1724
+
1725
+	/**
1726
+	 *        get Transaction ID
1727
+	 */
1728
+	public function transaction_ID()
1729
+	{
1730
+		return $this->get('TXN_ID');
1731
+	}
1732
+
1733
+
1734
+	/**
1735
+	 * @return int
1736
+	 * @throws EE_Error
1737
+	 */
1738
+	public function ticket_ID()
1739
+	{
1740
+		return $this->get('TKT_ID');
1741
+	}
1742
+
1743
+
1744
+	/**
1745
+	 *        Set Registration Code
1746
+	 *
1747
+	 * @access    public
1748
+	 * @param    string  $REG_code Registration Code
1749
+	 * @param    boolean $use_default
1750
+	 * @throws EE_Error
1751
+	 */
1752
+	public function set_reg_code($REG_code, $use_default = false)
1753
+	{
1754
+		if (empty($REG_code)) {
1755
+			EE_Error::add_error(
1756
+				esc_html__('REG_code can not be empty.', 'event_espresso'),
1757
+				__FILE__,
1758
+				__FUNCTION__,
1759
+				__LINE__
1760
+			);
1761
+			return;
1762
+		}
1763
+		if (! $this->reg_code()) {
1764
+			parent::set('REG_code', $REG_code, $use_default);
1765
+		} else {
1766
+			EE_Error::doing_it_wrong(
1767
+				__CLASS__ . '::' . __FUNCTION__,
1768
+				esc_html__('Can not change a registration REG_code once it has been set.', 'event_espresso'),
1769
+				'4.6.0'
1770
+			);
1771
+		}
1772
+	}
1773
+
1774
+
1775
+	/**
1776
+	 * Returns all other registrations in the same group as this registrant who have the same ticket option.
1777
+	 * Note, if you want to just get all registrations in the same transaction (group), use:
1778
+	 *    $registration->transaction()->registrations();
1779
+	 *
1780
+	 * @since 4.5.0
1781
+	 * @return EE_Registration[] or empty array if this isn't a group registration.
1782
+	 * @throws EE_Error
1783
+	 */
1784
+	public function get_all_other_registrations_in_group()
1785
+	{
1786
+		if ($this->group_size() < 2) {
1787
+			return array();
1788
+		}
1789
+
1790
+		$query[0] = array(
1791
+			'TXN_ID' => $this->transaction_ID(),
1792
+			'REG_ID' => array('!=', $this->ID()),
1793
+			'TKT_ID' => $this->ticket_ID(),
1794
+		);
1795
+		/** @var EE_Registration[] $registrations */
1796
+		$registrations = $this->get_model()->get_all($query);
1797
+		return $registrations;
1798
+	}
1799
+
1800
+	/**
1801
+	 * Return the link to the admin details for the object.
1802
+	 *
1803
+	 * @return string
1804
+	 * @throws EE_Error
1805
+	 */
1806
+	public function get_admin_details_link()
1807
+	{
1808
+		EE_Registry::instance()->load_helper('URL');
1809
+		return EEH_URL::add_query_args_and_nonce(
1810
+			array(
1811
+				'page'    => 'espresso_registrations',
1812
+				'action'  => 'view_registration',
1813
+				'_REG_ID' => $this->ID(),
1814
+			),
1815
+			admin_url('admin.php')
1816
+		);
1817
+	}
1818
+
1819
+	/**
1820
+	 * Returns the link to the editor for the object.  Sometimes this is the same as the details.
1821
+	 *
1822
+	 * @return string
1823
+	 * @throws EE_Error
1824
+	 */
1825
+	public function get_admin_edit_link()
1826
+	{
1827
+		return $this->get_admin_details_link();
1828
+	}
1829
+
1830
+	/**
1831
+	 * Returns the link to a settings page for the object.
1832
+	 *
1833
+	 * @return string
1834
+	 * @throws EE_Error
1835
+	 */
1836
+	public function get_admin_settings_link()
1837
+	{
1838
+		return $this->get_admin_details_link();
1839
+	}
1840
+
1841
+	/**
1842
+	 * Returns the link to the "overview" for the object (typically the "list table" view).
1843
+	 *
1844
+	 * @return string
1845
+	 */
1846
+	public function get_admin_overview_link()
1847
+	{
1848
+		EE_Registry::instance()->load_helper('URL');
1849
+		return EEH_URL::add_query_args_and_nonce(
1850
+			array(
1851
+				'page' => 'espresso_registrations',
1852
+			),
1853
+			admin_url('admin.php')
1854
+		);
1855
+	}
1856
+
1857
+
1858
+	/**
1859
+	 * @param array $query_params
1860
+	 *
1861
+	 * @return \EE_Registration[]
1862
+	 * @throws EE_Error
1863
+	 */
1864
+	public function payments($query_params = array())
1865
+	{
1866
+		return $this->get_many_related('Payment', $query_params);
1867
+	}
1868
+
1869
+
1870
+	/**
1871
+	 * @param array $query_params
1872
+	 *
1873
+	 * @return \EE_Registration_Payment[]
1874
+	 * @throws EE_Error
1875
+	 */
1876
+	public function registration_payments($query_params = array())
1877
+	{
1878
+		return $this->get_many_related('Registration_Payment', $query_params);
1879
+	}
1880
+
1881
+
1882
+	/**
1883
+	 * This grabs the payment method corresponding to the last payment made for the amount owing on the registration.
1884
+	 * Note: if there are no payments on the registration there will be no payment method returned.
1885
+	 *
1886
+	 * @return EE_Payment_Method|null
1887
+	 */
1888
+	public function payment_method()
1889
+	{
1890
+		return EEM_Payment_Method::instance()->get_last_used_for_registration($this);
1891
+	}
1892
+
1893
+
1894
+	/**
1895
+	 * @return \EE_Line_Item
1896
+	 * @throws EntityNotFoundException
1897
+	 * @throws EE_Error
1898
+	 */
1899
+	public function ticket_line_item()
1900
+	{
1901
+		$ticket = $this->ticket();
1902
+		$transaction = $this->transaction();
1903
+		$line_item = null;
1904
+		$ticket_line_items = \EEH_Line_Item::get_line_items_by_object_type_and_IDs(
1905
+			$transaction->total_line_item(),
1906
+			'Ticket',
1907
+			array($ticket->ID())
1908
+		);
1909
+		foreach ($ticket_line_items as $ticket_line_item) {
1910
+			if ($ticket_line_item instanceof \EE_Line_Item
1911
+				&& $ticket_line_item->OBJ_type() === 'Ticket'
1912
+				&& $ticket_line_item->OBJ_ID() === $ticket->ID()
1913
+			) {
1914
+				$line_item = $ticket_line_item;
1915
+				break;
1916
+			}
1917
+		}
1918
+		if (! ($line_item instanceof \EE_Line_Item && $line_item->OBJ_type() === 'Ticket')) {
1919
+			throw new EntityNotFoundException('Line Item Ticket ID', $ticket->ID());
1920
+		}
1921
+		return $line_item;
1922
+	}
1923
+
1924
+
1925
+	/**
1926
+	 * Soft Deletes this model object.
1927
+	 *
1928
+	 * @return boolean | int
1929
+	 * @throws RuntimeException
1930
+	 * @throws EE_Error
1931
+	 */
1932
+	public function delete()
1933
+	{
1934
+		if ($this->update_extra_meta(EE_Registration::PRE_TRASH_REG_STATUS_KEY, $this->status_ID()) === true) {
1935
+			$this->set_status(EEM_Registration::status_id_cancelled);
1936
+		}
1937
+		return parent::delete();
1938
+	}
1939
+
1940
+
1941
+	/**
1942
+	 * Restores whatever the previous status was on a registration before it was trashed (if possible)
1943
+	 *
1944
+	 * @throws EE_Error
1945
+	 * @throws RuntimeException
1946
+	 */
1947
+	public function restore()
1948
+	{
1949
+		$previous_status = $this->get_extra_meta(
1950
+			EE_Registration::PRE_TRASH_REG_STATUS_KEY,
1951
+			true,
1952
+			EEM_Registration::status_id_cancelled
1953
+		);
1954
+		if ($previous_status) {
1955
+			$this->delete_extra_meta(EE_Registration::PRE_TRASH_REG_STATUS_KEY);
1956
+			$this->set_status($previous_status);
1957
+		}
1958
+		return parent::restore();
1959
+	}
1960
+
1961
+
1962
+	/**
1963
+	 * possibly toggle Registration status based on comparison of REG_paid vs REG_final_price
1964
+	 *
1965
+	 * @param  boolean $trigger_set_status_logic EE_Registration::set_status() can trigger additional logic
1966
+	 *                                           depending on whether the reg status changes to or from "Approved"
1967
+	 * @return boolean whether the Registration status was updated
1968
+	 * @throws EE_Error
1969
+	 * @throws RuntimeException
1970
+	 */
1971
+	public function updateStatusBasedOnTotalPaid($trigger_set_status_logic = true)
1972
+	{
1973
+		$paid = $this->paid();
1974
+		$price = $this->final_price();
1975
+		switch (true) {
1976
+			// overpaid or paid
1977
+			case EEH_Money::compare_floats($paid, $price, '>'):
1978
+			case EEH_Money::compare_floats($paid, $price):
1979
+				$new_status = EEM_Registration::status_id_approved;
1980
+				break;
1981
+			//  underpaid
1982
+			case EEH_Money::compare_floats($paid, $price, '<'):
1983
+				$new_status = EEM_Registration::status_id_pending_payment;
1984
+				break;
1985
+			// uhhh Houston...
1986
+			default:
1987
+				throw new RuntimeException(
1988
+					esc_html__('The total paid calculation for this registration is inaccurate.', 'event_espresso')
1989
+				);
1990
+		}
1991
+		if ($new_status !== $this->status_ID()) {
1992
+			if ($trigger_set_status_logic) {
1993
+				return $this->set_status($new_status);
1994
+			}
1995
+			parent::set('STS_ID', $new_status);
1996
+			return true;
1997
+		}
1998
+		return false;
1999
+	}
2000
+
2001
+
2002
+	/*************************** DEPRECATED ***************************/
2003
+
2004
+
2005
+	/**
2006
+	 * @deprecated
2007
+	 * @since     4.7.0
2008
+	 * @access    public
2009
+	 */
2010
+	public function price_paid()
2011
+	{
2012
+		EE_Error::doing_it_wrong(
2013
+			'EE_Registration::price_paid()',
2014
+			esc_html__(
2015
+				'This method is deprecated, please use EE_Registration::final_price() instead.',
2016
+				'event_espresso'
2017
+			),
2018
+			'4.7.0'
2019
+		);
2020
+		return $this->final_price();
2021
+	}
2022
+
2023
+
2024
+	/**
2025
+	 * @deprecated
2026
+	 * @since     4.7.0
2027
+	 * @access    public
2028
+	 * @param    float $REG_final_price
2029
+	 * @throws EE_Error
2030
+	 * @throws RuntimeException
2031
+	 */
2032
+	public function set_price_paid($REG_final_price = 0.00)
2033
+	{
2034
+		EE_Error::doing_it_wrong(
2035
+			'EE_Registration::set_price_paid()',
2036
+			esc_html__(
2037
+				'This method is deprecated, please use EE_Registration::set_final_price() instead.',
2038
+				'event_espresso'
2039
+			),
2040
+			'4.7.0'
2041
+		);
2042
+		$this->set_final_price($REG_final_price);
2043
+	}
2044
+
2045
+
2046
+	/**
2047
+	 * @deprecated
2048
+	 * @since 4.7.0
2049
+	 * @return string
2050
+	 * @throws EE_Error
2051
+	 */
2052
+	public function pretty_price_paid()
2053
+	{
2054
+		EE_Error::doing_it_wrong(
2055
+			'EE_Registration::pretty_price_paid()',
2056
+			esc_html__(
2057
+				'This method is deprecated, please use EE_Registration::pretty_final_price() instead.',
2058
+				'event_espresso'
2059
+			),
2060
+			'4.7.0'
2061
+		);
2062
+		return $this->pretty_final_price();
2063
+	}
2064
+
2065
+
2066
+	/**
2067
+	 * Gets the primary datetime related to this registration via the related Event to this registration
2068
+	 *
2069
+	 * @deprecated 4.9.17
2070
+	 * @return EE_Datetime
2071
+	 * @throws EE_Error
2072
+	 * @throws EntityNotFoundException
2073
+	 */
2074
+	public function get_related_primary_datetime()
2075
+	{
2076
+		EE_Error::doing_it_wrong(
2077
+			__METHOD__,
2078
+			esc_html__(
2079
+				'Use EE_Registration::get_latest_related_datetime() or EE_Registration::get_earliest_related_datetime()',
2080
+				'event_espresso'
2081
+			),
2082
+			'4.9.17',
2083
+			'5.0.0'
2084
+		);
2085
+		return $this->event()->primary_datetime();
2086
+	}
2087 2087
 }
Please login to merge, or discard this patch.
Spacing   +15 added lines, -15 removed lines patch added patch discarded remove patch
@@ -119,7 +119,7 @@  discard block
 block discarded – undo
119 119
     {
120 120
         switch ($field_name) {
121 121
             case 'REG_code':
122
-                if (! empty($field_value) && $this->reg_code() === null) {
122
+                if ( ! empty($field_value) && $this->reg_code() === null) {
123 123
                     $this->set_reg_code($field_value, $use_default);
124 124
                 }
125 125
                 break;
@@ -396,7 +396,7 @@  discard block
 block discarded – undo
396 396
     public function event()
397 397
     {
398 398
         $event = $this->get_first_related('Event');
399
-        if (! $event instanceof \EE_Event) {
399
+        if ( ! $event instanceof \EE_Event) {
400 400
             throw new EntityNotFoundException('Event ID', $this->event_ID());
401 401
         }
402 402
         return $event;
@@ -439,7 +439,7 @@  discard block
 block discarded – undo
439 439
     {
440 440
         // reserved ticket and datetime counts will be decremented as sold counts are incremented
441 441
         // so stop tracking that this reg has a ticket reserved
442
-        $this->release_reserved_ticket(false, "REG: {$this->ID()} (ln:" . __LINE__ . ')');
442
+        $this->release_reserved_ticket(false, "REG: {$this->ID()} (ln:".__LINE__.')');
443 443
         $ticket = $this->ticket();
444 444
         $ticket->increase_sold();
445 445
         $ticket->save();
@@ -495,7 +495,7 @@  discard block
 block discarded – undo
495 495
                 && $update_ticket
496 496
             ) {
497 497
                 $ticket = $this->ticket();
498
-                $ticket->increase_reserved(1, "REG: {$this->ID()} (ln:" . __LINE__ . ')');
498
+                $ticket->increase_reserved(1, "REG: {$this->ID()} (ln:".__LINE__.')');
499 499
                 $ticket->save();
500 500
             }
501 501
         }
@@ -526,7 +526,7 @@  discard block
 block discarded – undo
526 526
                 && $update_ticket
527 527
             ) {
528 528
                 $ticket = $this->ticket();
529
-                $ticket->decrease_reserved(1, true, "REG: {$this->ID()} (ln:" . __LINE__ . ')');
529
+                $ticket->decrease_reserved(1, true, "REG: {$this->ID()} (ln:".__LINE__.')');
530 530
                 $ticket->save();
531 531
             }
532 532
         }
@@ -1201,7 +1201,7 @@  discard block
 block discarded – undo
1201 1201
                     : '';
1202 1202
                 break;
1203 1203
         }
1204
-        return $icon . $status[ $this->status_ID() ];
1204
+        return $icon.$status[$this->status_ID()];
1205 1205
     }
1206 1206
 
1207 1207
 
@@ -1419,7 +1419,7 @@  discard block
 block discarded – undo
1419 1419
             return false;
1420 1420
         }
1421 1421
         // is there a datetime ticket that matches this dtt_ID?
1422
-        if (! (EEM_Datetime_Ticket::instance()->exists(
1422
+        if ( ! (EEM_Datetime_Ticket::instance()->exists(
1423 1423
             array(
1424 1424
                 array(
1425 1425
                     'TKT_ID' => $this->get('TKT_ID'),
@@ -1450,7 +1450,7 @@  discard block
 block discarded – undo
1450 1450
     {
1451 1451
         $DTT_ID = EEM_Datetime::instance()->ensure_is_ID($DTT_OR_ID);
1452 1452
 
1453
-        if (! $DTT_ID) {
1453
+        if ( ! $DTT_ID) {
1454 1454
             return false;
1455 1455
         }
1456 1456
 
@@ -1458,7 +1458,7 @@  discard block
 block discarded – undo
1458 1458
 
1459 1459
         // if max uses is not set or equals infinity then return true cause its not a factor for whether user can
1460 1460
         // check-in or not.
1461
-        if (! $max_uses || $max_uses === EE_INF) {
1461
+        if ( ! $max_uses || $max_uses === EE_INF) {
1462 1462
             return true;
1463 1463
         }
1464 1464
 
@@ -1518,7 +1518,7 @@  discard block
 block discarded – undo
1518 1518
             $datetime = $this->get_latest_related_datetime();
1519 1519
             $DTT_ID = $datetime instanceof EE_Datetime ? $datetime->ID() : 0;
1520 1520
             // verify the registration can checkin for the given DTT_ID
1521
-        } elseif (! $this->can_checkin($DTT_ID, $verify)) {
1521
+        } elseif ( ! $this->can_checkin($DTT_ID, $verify)) {
1522 1522
             EE_Error::add_error(
1523 1523
                 sprintf(
1524 1524
                     esc_html__(
@@ -1541,7 +1541,7 @@  discard block
 block discarded – undo
1541 1541
         );
1542 1542
         // start by getting the current status so we know what status we'll be changing to.
1543 1543
         $cur_status = $this->check_in_status_for_datetime($DTT_ID, null);
1544
-        $status_to = $status_paths[ $cur_status ];
1544
+        $status_to = $status_paths[$cur_status];
1545 1545
         // database only records true for checked IN or false for checked OUT
1546 1546
         // no record ( null ) means checked in NEVER, but we obviously don't save that
1547 1547
         $new_status = $status_to === EE_Checkin::status_checked_in ? true : false;
@@ -1706,7 +1706,7 @@  discard block
 block discarded – undo
1706 1706
     public function transaction()
1707 1707
     {
1708 1708
         $transaction = $this->get_first_related('Transaction');
1709
-        if (! $transaction instanceof \EE_Transaction) {
1709
+        if ( ! $transaction instanceof \EE_Transaction) {
1710 1710
             throw new EntityNotFoundException('Transaction ID', $this->transaction_ID());
1711 1711
         }
1712 1712
         return $transaction;
@@ -1760,11 +1760,11 @@  discard block
 block discarded – undo
1760 1760
             );
1761 1761
             return;
1762 1762
         }
1763
-        if (! $this->reg_code()) {
1763
+        if ( ! $this->reg_code()) {
1764 1764
             parent::set('REG_code', $REG_code, $use_default);
1765 1765
         } else {
1766 1766
             EE_Error::doing_it_wrong(
1767
-                __CLASS__ . '::' . __FUNCTION__,
1767
+                __CLASS__.'::'.__FUNCTION__,
1768 1768
                 esc_html__('Can not change a registration REG_code once it has been set.', 'event_espresso'),
1769 1769
                 '4.6.0'
1770 1770
             );
@@ -1915,7 +1915,7 @@  discard block
 block discarded – undo
1915 1915
                 break;
1916 1916
             }
1917 1917
         }
1918
-        if (! ($line_item instanceof \EE_Line_Item && $line_item->OBJ_type() === 'Ticket')) {
1918
+        if ( ! ($line_item instanceof \EE_Line_Item && $line_item->OBJ_type() === 'Ticket')) {
1919 1919
             throw new EntityNotFoundException('Line Item Ticket ID', $ticket->ID());
1920 1920
         }
1921 1921
         return $line_item;
Please login to merge, or discard this patch.
core/db_classes/EE_Checkin.class.php 1 patch
Indentation   +82 added lines, -82 removed lines patch added patch discarded remove patch
@@ -11,86 +11,86 @@
 block discarded – undo
11 11
 {
12 12
 
13 13
 
14
-    /**
15
-     * Used to reference when a registration has been checked out.
16
-     *
17
-     * @type int
18
-     */
19
-    const status_checked_out = 0;
20
-
21
-    /**
22
-     * Used to reference when a registration has been checked in.
23
-     *
24
-     * @type int
25
-     */
26
-    const status_checked_in = 1;
27
-
28
-    /**
29
-     * Used to reference when a registration has never been checked in.
30
-     *
31
-     * @type int
32
-     */
33
-    const status_checked_never = 2;
34
-
35
-
36
-    /**
37
-     *
38
-     * @param array  $props_n_values    incoming values
39
-     * @param string $timezone          incoming timezone (if not set the timezone set for the website will be used.)
40
-     * @param array  $date_formats      incoming date_formats in an array
41
-     *                                  where the first value is the date_format
42
-     *                                  and the second value is the time format
43
-     * @return EE_Checkin
44
-     * @throws EE_Error
45
-     */
46
-    public static function new_instance($props_n_values = array(), $timezone = null, $date_formats = array())
47
-    {
48
-        $has_object = parent::_check_for_object($props_n_values, __CLASS__, $timezone, $date_formats);
49
-        return $has_object
50
-            ? $has_object
51
-            : new self($props_n_values, false, $timezone, $date_formats);
52
-    }
53
-
54
-
55
-    /**
56
-     * @param array  $props_n_values  incoming values from the database
57
-     * @param string $timezone        incoming timezone as set by the model.  If not set the timezone for
58
-     *                                the website will be used.
59
-     * @return EE_Checkin
60
-     * @throws EE_Error
61
-     */
62
-    public static function new_instance_from_db($props_n_values = array(), $timezone = null)
63
-    {
64
-        return new self($props_n_values, true, $timezone);
65
-    }
66
-
67
-
68
-    public function ID()
69
-    {
70
-        return $this->get('CHK_ID');
71
-    }
72
-
73
-
74
-    public function registration_id()
75
-    {
76
-        return $this->get('REG_ID');
77
-    }
78
-
79
-
80
-    public function datetime_id()
81
-    {
82
-        return $this->get('DTT_ID');
83
-    }
84
-
85
-
86
-    public function status()
87
-    {
88
-        return $this->get('CHK_in');
89
-    }
90
-
91
-
92
-    public function timestamp()
93
-    {
94
-        return $this->get('CHK_timestamp');
95
-    }
14
+	/**
15
+	 * Used to reference when a registration has been checked out.
16
+	 *
17
+	 * @type int
18
+	 */
19
+	const status_checked_out = 0;
20
+
21
+	/**
22
+	 * Used to reference when a registration has been checked in.
23
+	 *
24
+	 * @type int
25
+	 */
26
+	const status_checked_in = 1;
27
+
28
+	/**
29
+	 * Used to reference when a registration has never been checked in.
30
+	 *
31
+	 * @type int
32
+	 */
33
+	const status_checked_never = 2;
34
+
35
+
36
+	/**
37
+	 *
38
+	 * @param array  $props_n_values    incoming values
39
+	 * @param string $timezone          incoming timezone (if not set the timezone set for the website will be used.)
40
+	 * @param array  $date_formats      incoming date_formats in an array
41
+	 *                                  where the first value is the date_format
42
+	 *                                  and the second value is the time format
43
+	 * @return EE_Checkin
44
+	 * @throws EE_Error
45
+	 */
46
+	public static function new_instance($props_n_values = array(), $timezone = null, $date_formats = array())
47
+	{
48
+		$has_object = parent::_check_for_object($props_n_values, __CLASS__, $timezone, $date_formats);
49
+		return $has_object
50
+			? $has_object
51
+			: new self($props_n_values, false, $timezone, $date_formats);
52
+	}
53
+
54
+
55
+	/**
56
+	 * @param array  $props_n_values  incoming values from the database
57
+	 * @param string $timezone        incoming timezone as set by the model.  If not set the timezone for
58
+	 *                                the website will be used.
59
+	 * @return EE_Checkin
60
+	 * @throws EE_Error
61
+	 */
62
+	public static function new_instance_from_db($props_n_values = array(), $timezone = null)
63
+	{
64
+		return new self($props_n_values, true, $timezone);
65
+	}
66
+
67
+
68
+	public function ID()
69
+	{
70
+		return $this->get('CHK_ID');
71
+	}
72
+
73
+
74
+	public function registration_id()
75
+	{
76
+		return $this->get('REG_ID');
77
+	}
78
+
79
+
80
+	public function datetime_id()
81
+	{
82
+		return $this->get('DTT_ID');
83
+	}
84
+
85
+
86
+	public function status()
87
+	{
88
+		return $this->get('CHK_in');
89
+	}
90
+
91
+
92
+	public function timestamp()
93
+	{
94
+		return $this->get('CHK_timestamp');
95
+	}
96 96
 }
Please login to merge, or discard this patch.
core/db_classes/EE_Currency.class.php 1 patch
Indentation   +176 added lines, -176 removed lines patch added patch discarded remove patch
@@ -12,180 +12,180 @@
 block discarded – undo
12 12
 class EE_Currency extends EE_Base_Class
13 13
 {
14 14
 
15
-    /** Currency COde @var CUR_code */
16
-    protected $_CUR_code = null;
17
-    /** Currency Name Singular @var CUR_single */
18
-    protected $_CUR_single = null;
19
-    /** Currency Name Plural @var CUR_plural */
20
-    protected $_CUR_plural = null;
21
-    /** Currency Sign @var CUR_sign */
22
-    protected $_CUR_sign = null;
23
-    /** Currency Decimal Places @var CUR_dec_plc */
24
-    protected $_CUR_dec_plc = null;
25
-    /** Active? @var CUR_active */
26
-    protected $_CUR_active = null;
27
-    protected $_Payment_Method;
28
-
29
-    /**
30
-     *
31
-     * @param array  $props_n_values          incoming values
32
-     * @param string $timezone                incoming timezone (if not set the timezone set for the website will be
33
-     *                                        used.)
34
-     * @param array  $date_formats            incoming date_formats in an array where the first value is the
35
-     *                                        date_format and the second value is the time format
36
-     * @return EE_Attendee
37
-     */
38
-    public static function new_instance($props_n_values = array(), $timezone = null, $date_formats = array())
39
-    {
40
-        $has_object = parent::_check_for_object($props_n_values, __CLASS__, $timezone, $date_formats);
41
-        return $has_object ? $has_object : new self($props_n_values, false, $timezone, $date_formats);
42
-    }
43
-
44
-
45
-    /**
46
-     * @param array  $props_n_values  incoming values from the database
47
-     * @param string $timezone        incoming timezone as set by the model.  If not set the timezone for
48
-     *                                the website will be used.
49
-     * @return EE_Attendee
50
-     */
51
-    public static function new_instance_from_db($props_n_values = array(), $timezone = null)
52
-    {
53
-        return new self($props_n_values, true, $timezone);
54
-    }
55
-
56
-    /**
57
-     * Gets code
58
-     *
59
-     * @return string
60
-     */
61
-    public function code()
62
-    {
63
-        return $this->get('CUR_code');
64
-    }
65
-
66
-    /**
67
-     * Sets code
68
-     *
69
-     * @param string $code
70
-     * @return boolean
71
-     */
72
-    public function set_code($code)
73
-    {
74
-        return $this->set('CUR_code', $code);
75
-    }
76
-
77
-    /**
78
-     * Gets active
79
-     *
80
-     * @return boolean
81
-     */
82
-    public function active()
83
-    {
84
-        return $this->get('CUR_active');
85
-    }
86
-
87
-    /**
88
-     * Sets active
89
-     *
90
-     * @param boolean $active
91
-     * @return boolean
92
-     */
93
-    public function set_active($active)
94
-    {
95
-        return $this->set('CUR_active', $active);
96
-    }
97
-
98
-    /**
99
-     * Gets dec_plc
100
-     *
101
-     * @return int
102
-     */
103
-    public function dec_plc()
104
-    {
105
-        return $this->get('CUR_dec_plc');
106
-    }
107
-
108
-    /**
109
-     * Sets dec_plc
110
-     *
111
-     * @param int $dec_plc
112
-     * @return boolean
113
-     */
114
-    public function set_dec_plc($dec_plc)
115
-    {
116
-        return $this->set('CUR_dec_plc', $dec_plc);
117
-    }
118
-
119
-    /**
120
-     * Gets plural
121
-     *
122
-     * @return string
123
-     */
124
-    public function plural_name()
125
-    {
126
-        return $this->get('CUR_plural');
127
-    }
128
-
129
-    /**
130
-     * Sets plural
131
-     *
132
-     * @param string $plural
133
-     * @return boolean
134
-     */
135
-    public function set_plural_name($plural)
136
-    {
137
-        return $this->set('CUR_plural', $plural);
138
-    }
139
-
140
-    /**
141
-     * Gets sign
142
-     *
143
-     * @return string
144
-     */
145
-    public function sign()
146
-    {
147
-        return $this->get('CUR_sign');
148
-    }
149
-
150
-    /**
151
-     * Sets sign
152
-     *
153
-     * @param string $sign
154
-     * @return boolean
155
-     */
156
-    public function set_sign($sign)
157
-    {
158
-        return $this->set('CUR_sign', $sign);
159
-    }
160
-
161
-    /**
162
-     * Gets single
163
-     *
164
-     * @return string
165
-     */
166
-    public function singular_name()
167
-    {
168
-        return $this->get('CUR_single');
169
-    }
170
-
171
-    /**
172
-     * Sets single
173
-     *
174
-     * @param string $single
175
-     * @return boolean
176
-     */
177
-    public function set_singular_name($single)
178
-    {
179
-        return $this->set('CUR_single', $single);
180
-    }
181
-
182
-    /**
183
-     * Gets a prettier name
184
-     *
185
-     * @return string
186
-     */
187
-    public function name()
188
-    {
189
-        return sprintf(__("%s (%s)", "event_espresso"), $this->code(), $this->plural_name());
190
-    }
15
+	/** Currency COde @var CUR_code */
16
+	protected $_CUR_code = null;
17
+	/** Currency Name Singular @var CUR_single */
18
+	protected $_CUR_single = null;
19
+	/** Currency Name Plural @var CUR_plural */
20
+	protected $_CUR_plural = null;
21
+	/** Currency Sign @var CUR_sign */
22
+	protected $_CUR_sign = null;
23
+	/** Currency Decimal Places @var CUR_dec_plc */
24
+	protected $_CUR_dec_plc = null;
25
+	/** Active? @var CUR_active */
26
+	protected $_CUR_active = null;
27
+	protected $_Payment_Method;
28
+
29
+	/**
30
+	 *
31
+	 * @param array  $props_n_values          incoming values
32
+	 * @param string $timezone                incoming timezone (if not set the timezone set for the website will be
33
+	 *                                        used.)
34
+	 * @param array  $date_formats            incoming date_formats in an array where the first value is the
35
+	 *                                        date_format and the second value is the time format
36
+	 * @return EE_Attendee
37
+	 */
38
+	public static function new_instance($props_n_values = array(), $timezone = null, $date_formats = array())
39
+	{
40
+		$has_object = parent::_check_for_object($props_n_values, __CLASS__, $timezone, $date_formats);
41
+		return $has_object ? $has_object : new self($props_n_values, false, $timezone, $date_formats);
42
+	}
43
+
44
+
45
+	/**
46
+	 * @param array  $props_n_values  incoming values from the database
47
+	 * @param string $timezone        incoming timezone as set by the model.  If not set the timezone for
48
+	 *                                the website will be used.
49
+	 * @return EE_Attendee
50
+	 */
51
+	public static function new_instance_from_db($props_n_values = array(), $timezone = null)
52
+	{
53
+		return new self($props_n_values, true, $timezone);
54
+	}
55
+
56
+	/**
57
+	 * Gets code
58
+	 *
59
+	 * @return string
60
+	 */
61
+	public function code()
62
+	{
63
+		return $this->get('CUR_code');
64
+	}
65
+
66
+	/**
67
+	 * Sets code
68
+	 *
69
+	 * @param string $code
70
+	 * @return boolean
71
+	 */
72
+	public function set_code($code)
73
+	{
74
+		return $this->set('CUR_code', $code);
75
+	}
76
+
77
+	/**
78
+	 * Gets active
79
+	 *
80
+	 * @return boolean
81
+	 */
82
+	public function active()
83
+	{
84
+		return $this->get('CUR_active');
85
+	}
86
+
87
+	/**
88
+	 * Sets active
89
+	 *
90
+	 * @param boolean $active
91
+	 * @return boolean
92
+	 */
93
+	public function set_active($active)
94
+	{
95
+		return $this->set('CUR_active', $active);
96
+	}
97
+
98
+	/**
99
+	 * Gets dec_plc
100
+	 *
101
+	 * @return int
102
+	 */
103
+	public function dec_plc()
104
+	{
105
+		return $this->get('CUR_dec_plc');
106
+	}
107
+
108
+	/**
109
+	 * Sets dec_plc
110
+	 *
111
+	 * @param int $dec_plc
112
+	 * @return boolean
113
+	 */
114
+	public function set_dec_plc($dec_plc)
115
+	{
116
+		return $this->set('CUR_dec_plc', $dec_plc);
117
+	}
118
+
119
+	/**
120
+	 * Gets plural
121
+	 *
122
+	 * @return string
123
+	 */
124
+	public function plural_name()
125
+	{
126
+		return $this->get('CUR_plural');
127
+	}
128
+
129
+	/**
130
+	 * Sets plural
131
+	 *
132
+	 * @param string $plural
133
+	 * @return boolean
134
+	 */
135
+	public function set_plural_name($plural)
136
+	{
137
+		return $this->set('CUR_plural', $plural);
138
+	}
139
+
140
+	/**
141
+	 * Gets sign
142
+	 *
143
+	 * @return string
144
+	 */
145
+	public function sign()
146
+	{
147
+		return $this->get('CUR_sign');
148
+	}
149
+
150
+	/**
151
+	 * Sets sign
152
+	 *
153
+	 * @param string $sign
154
+	 * @return boolean
155
+	 */
156
+	public function set_sign($sign)
157
+	{
158
+		return $this->set('CUR_sign', $sign);
159
+	}
160
+
161
+	/**
162
+	 * Gets single
163
+	 *
164
+	 * @return string
165
+	 */
166
+	public function singular_name()
167
+	{
168
+		return $this->get('CUR_single');
169
+	}
170
+
171
+	/**
172
+	 * Sets single
173
+	 *
174
+	 * @param string $single
175
+	 * @return boolean
176
+	 */
177
+	public function set_singular_name($single)
178
+	{
179
+		return $this->set('CUR_single', $single);
180
+	}
181
+
182
+	/**
183
+	 * Gets a prettier name
184
+	 *
185
+	 * @return string
186
+	 */
187
+	public function name()
188
+	{
189
+		return sprintf(__("%s (%s)", "event_espresso"), $this->code(), $this->plural_name());
190
+	}
191 191
 }
Please login to merge, or discard this patch.
core/db_classes/EE_Question_Option.class.php 1 patch
Indentation   +216 added lines, -216 removed lines patch added patch discarded remove patch
@@ -10,220 +10,220 @@
 block discarded – undo
10 10
 class EE_Question_Option extends EE_Soft_Delete_Base_Class implements EEI_Duplicatable
11 11
 {
12 12
 
13
-    /**
14
-     * Question Option Opt Group Name
15
-     *
16
-     * @access protected
17
-     * @var string
18
-     */
19
-    protected $_QSO_opt_group = null;
20
-
21
-
22
-    /**
23
-     *
24
-     * @param array  $props_n_values          incoming values
25
-     * @param string $timezone                incoming timezone (if not set the timezone set for the website will be
26
-     *                                        used.)
27
-     * @param array  $date_formats            incoming date_formats in an array where the first value is the
28
-     *                                        date_format and the second value is the time format
29
-     * @return EE_Attendee
30
-     */
31
-    public static function new_instance($props_n_values = array(), $timezone = null, $date_formats = array())
32
-    {
33
-        $has_object = parent::_check_for_object($props_n_values, __CLASS__, $timezone, $date_formats);
34
-        return $has_object ? $has_object : new self($props_n_values, false, $timezone, $date_formats);
35
-    }
36
-
37
-
38
-    /**
39
-     * @param array  $props_n_values  incoming values from the database
40
-     * @param string $timezone        incoming timezone as set by the model.  If not set the timezone for
41
-     *                                the website will be used.
42
-     * @return EE_Attendee
43
-     */
44
-    public static function new_instance_from_db($props_n_values = array(), $timezone = null)
45
-    {
46
-        return new self($props_n_values, true, $timezone);
47
-    }
48
-
49
-
50
-    /**
51
-     * Sets the option's key value
52
-     *
53
-     * @param string $value
54
-     * @return bool success
55
-     */
56
-    public function set_value($value)
57
-    {
58
-        $this->set('QSO_value', $value);
59
-    }
60
-
61
-
62
-    /**
63
-     * Sets the option's Display Text
64
-     *
65
-     * @param string $text
66
-     * @return bool success
67
-     */
68
-    public function set_desc($text)
69
-    {
70
-        $this->set('QSO_desc', $text);
71
-    }
72
-
73
-
74
-    /**
75
-     * Sets the order for this option
76
-     *
77
-     * @access public
78
-     * @param integer $order
79
-     * @return bool      $success
80
-     */
81
-    public function set_order($order)
82
-    {
83
-        $this->set('QSO_order', $order);
84
-    }
85
-
86
-
87
-    /**
88
-     * Sets the ID of the related question
89
-     *
90
-     * @param int $question_ID
91
-     * @return bool success
92
-     */
93
-    public function set_question_ID($question_ID)
94
-    {
95
-        $this->set('QST_ID', $question_ID);
96
-    }
97
-
98
-
99
-    /**
100
-     * Sets the option's opt_group
101
-     *
102
-     * @param string $text
103
-     * @return bool success
104
-     */
105
-    public function set_opt_group($text)
106
-    {
107
-        return $this->_QSO_opt_group = $text;
108
-    }
109
-
110
-
111
-    /**
112
-     * Gets the option's key value
113
-     *
114
-     * @return string
115
-     */
116
-    public function value()
117
-    {
118
-        return $this->get('QSO_value');
119
-    }
120
-
121
-
122
-    /**
123
-     * Gets the option's display text
124
-     *
125
-     * @return string
126
-     */
127
-    public function desc()
128
-    {
129
-        return $this->get('QSO_desc');
130
-    }
131
-
132
-
133
-    /**
134
-     * Returns whether this option has been deleted or not
135
-     *
136
-     * @return boolean
137
-     */
138
-    public function deleted()
139
-    {
140
-        return $this->get('QSO_deleted');
141
-    }
142
-
143
-
144
-    /**
145
-     * Returns the order or the Question Option
146
-     *
147
-     * @access public
148
-     * @return integer
149
-     */
150
-    public function order()
151
-    {
152
-        return $this->get('QSO_option');
153
-    }
154
-
155
-
156
-    /**
157
-     * Gets the related question's ID
158
-     *
159
-     * @return int
160
-     */
161
-    public function question_ID()
162
-    {
163
-        return $this->get('QST_ID');
164
-    }
165
-
166
-
167
-    /**
168
-     * Returns the question related to this question option
169
-     *
170
-     * @return EE_Question
171
-     */
172
-    public function question()
173
-    {
174
-        return $this->get_first_related('Question');
175
-    }
176
-
177
-
178
-    /**
179
-     * Gets the option's opt_group
180
-     *
181
-     * @return string
182
-     */
183
-    public function opt_group()
184
-    {
185
-        return $this->_QSO_opt_group;
186
-    }
187
-
188
-    /**
189
-     * Duplicates this question option. By default the new question option will be for the same question,
190
-     * but that can be overriden by setting the 'QST_ID' option
191
-     *
192
-     * @param array $options {
193
-     * @type int    $QST_ID  the QST_ID attribute of this question option, otherwise it will be for the same question
194
-     *                       as the original
195
-     */
196
-    public function duplicate($options = array())
197
-    {
198
-        $new_question_option = clone $this;
199
-        $new_question_option->set('QSO_ID', null);
200
-        if (array_key_exists(
201
-            'QST_ID',
202
-            $options
203
-        )) {// use array_key_exists instead of isset because NULL might be a valid value
204
-            $new_question_option->set_question_ID($options['QST_ID']);
205
-        }
206
-        $new_question_option->save();
207
-    }
208
-
209
-    /**
210
-     * Gets the QSO_system value
211
-     *
212
-     * @return string|null
213
-     */
214
-    public function system()
215
-    {
216
-        return $this->get('QSO_system');
217
-    }
218
-
219
-    /**
220
-     * Sets QSO_system
221
-     *
222
-     * @param string $QSO_system
223
-     * @return bool
224
-     */
225
-    public function set_system($QSO_system)
226
-    {
227
-        return $this->set('QSO_system', $QSO_system);
228
-    }
13
+	/**
14
+	 * Question Option Opt Group Name
15
+	 *
16
+	 * @access protected
17
+	 * @var string
18
+	 */
19
+	protected $_QSO_opt_group = null;
20
+
21
+
22
+	/**
23
+	 *
24
+	 * @param array  $props_n_values          incoming values
25
+	 * @param string $timezone                incoming timezone (if not set the timezone set for the website will be
26
+	 *                                        used.)
27
+	 * @param array  $date_formats            incoming date_formats in an array where the first value is the
28
+	 *                                        date_format and the second value is the time format
29
+	 * @return EE_Attendee
30
+	 */
31
+	public static function new_instance($props_n_values = array(), $timezone = null, $date_formats = array())
32
+	{
33
+		$has_object = parent::_check_for_object($props_n_values, __CLASS__, $timezone, $date_formats);
34
+		return $has_object ? $has_object : new self($props_n_values, false, $timezone, $date_formats);
35
+	}
36
+
37
+
38
+	/**
39
+	 * @param array  $props_n_values  incoming values from the database
40
+	 * @param string $timezone        incoming timezone as set by the model.  If not set the timezone for
41
+	 *                                the website will be used.
42
+	 * @return EE_Attendee
43
+	 */
44
+	public static function new_instance_from_db($props_n_values = array(), $timezone = null)
45
+	{
46
+		return new self($props_n_values, true, $timezone);
47
+	}
48
+
49
+
50
+	/**
51
+	 * Sets the option's key value
52
+	 *
53
+	 * @param string $value
54
+	 * @return bool success
55
+	 */
56
+	public function set_value($value)
57
+	{
58
+		$this->set('QSO_value', $value);
59
+	}
60
+
61
+
62
+	/**
63
+	 * Sets the option's Display Text
64
+	 *
65
+	 * @param string $text
66
+	 * @return bool success
67
+	 */
68
+	public function set_desc($text)
69
+	{
70
+		$this->set('QSO_desc', $text);
71
+	}
72
+
73
+
74
+	/**
75
+	 * Sets the order for this option
76
+	 *
77
+	 * @access public
78
+	 * @param integer $order
79
+	 * @return bool      $success
80
+	 */
81
+	public function set_order($order)
82
+	{
83
+		$this->set('QSO_order', $order);
84
+	}
85
+
86
+
87
+	/**
88
+	 * Sets the ID of the related question
89
+	 *
90
+	 * @param int $question_ID
91
+	 * @return bool success
92
+	 */
93
+	public function set_question_ID($question_ID)
94
+	{
95
+		$this->set('QST_ID', $question_ID);
96
+	}
97
+
98
+
99
+	/**
100
+	 * Sets the option's opt_group
101
+	 *
102
+	 * @param string $text
103
+	 * @return bool success
104
+	 */
105
+	public function set_opt_group($text)
106
+	{
107
+		return $this->_QSO_opt_group = $text;
108
+	}
109
+
110
+
111
+	/**
112
+	 * Gets the option's key value
113
+	 *
114
+	 * @return string
115
+	 */
116
+	public function value()
117
+	{
118
+		return $this->get('QSO_value');
119
+	}
120
+
121
+
122
+	/**
123
+	 * Gets the option's display text
124
+	 *
125
+	 * @return string
126
+	 */
127
+	public function desc()
128
+	{
129
+		return $this->get('QSO_desc');
130
+	}
131
+
132
+
133
+	/**
134
+	 * Returns whether this option has been deleted or not
135
+	 *
136
+	 * @return boolean
137
+	 */
138
+	public function deleted()
139
+	{
140
+		return $this->get('QSO_deleted');
141
+	}
142
+
143
+
144
+	/**
145
+	 * Returns the order or the Question Option
146
+	 *
147
+	 * @access public
148
+	 * @return integer
149
+	 */
150
+	public function order()
151
+	{
152
+		return $this->get('QSO_option');
153
+	}
154
+
155
+
156
+	/**
157
+	 * Gets the related question's ID
158
+	 *
159
+	 * @return int
160
+	 */
161
+	public function question_ID()
162
+	{
163
+		return $this->get('QST_ID');
164
+	}
165
+
166
+
167
+	/**
168
+	 * Returns the question related to this question option
169
+	 *
170
+	 * @return EE_Question
171
+	 */
172
+	public function question()
173
+	{
174
+		return $this->get_first_related('Question');
175
+	}
176
+
177
+
178
+	/**
179
+	 * Gets the option's opt_group
180
+	 *
181
+	 * @return string
182
+	 */
183
+	public function opt_group()
184
+	{
185
+		return $this->_QSO_opt_group;
186
+	}
187
+
188
+	/**
189
+	 * Duplicates this question option. By default the new question option will be for the same question,
190
+	 * but that can be overriden by setting the 'QST_ID' option
191
+	 *
192
+	 * @param array $options {
193
+	 * @type int    $QST_ID  the QST_ID attribute of this question option, otherwise it will be for the same question
194
+	 *                       as the original
195
+	 */
196
+	public function duplicate($options = array())
197
+	{
198
+		$new_question_option = clone $this;
199
+		$new_question_option->set('QSO_ID', null);
200
+		if (array_key_exists(
201
+			'QST_ID',
202
+			$options
203
+		)) {// use array_key_exists instead of isset because NULL might be a valid value
204
+			$new_question_option->set_question_ID($options['QST_ID']);
205
+		}
206
+		$new_question_option->save();
207
+	}
208
+
209
+	/**
210
+	 * Gets the QSO_system value
211
+	 *
212
+	 * @return string|null
213
+	 */
214
+	public function system()
215
+	{
216
+		return $this->get('QSO_system');
217
+	}
218
+
219
+	/**
220
+	 * Sets QSO_system
221
+	 *
222
+	 * @param string $QSO_system
223
+	 * @return bool
224
+	 */
225
+	public function set_system($QSO_system)
226
+	{
227
+		return $this->set('QSO_system', $QSO_system);
228
+	}
229 229
 }
Please login to merge, or discard this patch.
core/db_classes/EE_Question_Form_Input.class.php 2 patches
Indentation   +409 added lines, -409 removed lines patch added patch discarded remove patch
@@ -14,413 +14,413 @@
 block discarded – undo
14 14
 class EE_Question_Form_Input
15 15
 {
16 16
 
17
-    /**
18
-     *    EE_Question object
19
-     *
20
-     * @access private
21
-     * @var object
22
-     */
23
-    private $_QST = null;
24
-
25
-    /**
26
-     *    EE_Answer object
27
-     *
28
-     * @access private
29
-     * @var object
30
-     */
31
-    private $_ANS = null;
32
-
33
-    /**
34
-     *    $_QST_meta
35
-     * @access private
36
-     * @var array
37
-     */
38
-    private $_QST_meta = array();
39
-
40
-    /**
41
-     *    $QST_input_name
42
-     * @access private
43
-     * @var string
44
-     */
45
-    private $QST_input_name = '';
46
-
47
-    /**
48
-     *    $QST_input_id
49
-     * @access private
50
-     * @var string
51
-     */
52
-    private $QST_input_id = '';
53
-
54
-    /**
55
-     *    $QST_input_class
56
-     * @access private
57
-     * @var string
58
-     */
59
-    private $QST_input_class = '';
60
-
61
-
62
-    /**
63
-     * constructor for questions
64
-     *
65
-     * @param \EE_Question $QST EE_Question object
66
-     * @param \EE_Answer   $ANS EE_Answer object
67
-     * @param array        $q_meta
68
-     * @access public
69
-     * @return \EE_Question_Form_Input
70
-     */
71
-    public function __construct(EE_Question $QST = null, EE_Answer $ANS = null, $q_meta = array())
72
-    {
73
-        if (empty($QST) || empty($ANS)) {
74
-            EE_Error::add_error(
75
-                __('An error occurred. A valid EE_Question or EE_Answer object was not received.', 'event_espresso'),
76
-                __FILE__,
77
-                __FUNCTION__,
78
-                __LINE__
79
-            );
80
-            return null;
81
-        }
82
-        $this->_QST = $QST;
83
-        $this->_ANS = $ANS;
84
-        $this->set_question_form_input_meta($q_meta);
85
-        $this->set_question_form_input_init();
86
-    }
87
-
88
-
89
-    /**
90
-     * sets meta data for the question form input
91
-     *
92
-     * @access public
93
-     * @param array $q_meta
94
-     * @return void
95
-     */
96
-    public function set_question_form_input_meta($q_meta = array())
97
-    {
98
-        $default_q_meta = array(
99
-            'att_nmbr'       => 1,
100
-            'ticket_id'      => '',
101
-            'date'           => '',
102
-            'time'           => '',
103
-            'input_name'     => '',
104
-            'input_id'       => '',
105
-            'input_class'    => '',
106
-            'input_prefix'   => 'qstn',
107
-            'append_qstn_id' => true,
108
-            'htmlentities'   => true,
109
-            'allow_null'     => false,
110
-        );
111
-        $this->_QST_meta = array_merge($default_q_meta, $q_meta);
112
-    }
113
-
114
-
115
-    /**
116
-     * set_question_form_input_init
117
-     *
118
-     * @access public
119
-     * @return void
120
-     */
121
-    public function set_question_form_input_init()
122
-    {
123
-        $qstn_id = $this->_QST->system_ID() ? $this->_QST->system_ID() : $this->_QST->ID();
124
-        $this->_set_input_name($qstn_id);
125
-        $this->_set_input_id($qstn_id);
126
-        $this->_set_input_class($qstn_id);
127
-        $this->set_question_form_input_answer($qstn_id);
128
-    }
129
-
130
-
131
-    /**
132
-     * set_input_name
133
-     *
134
-     * @access private
135
-     * @param $qstn_id
136
-     * @return void
137
-     */
138
-    private function _set_input_name($qstn_id)
139
-    {
140
-        if (! empty($qstn_id)) {
141
-            $ANS_ID = $this->get('ANS_ID');
142
-            $qstn_id = ! empty($ANS_ID) ? '[' . $qstn_id . '][' . $ANS_ID . ']' : '[' . $qstn_id . ']';
143
-        }
144
-        $this->QST_input_name = $this->_QST_meta['append_qstn_id'] && ! empty($qstn_id)
145
-            ? $this->_QST_meta['input_prefix'] . $this->_QST_meta['input_name'] . $qstn_id
146
-            : $this->_QST_meta['input_prefix'] . $this->_QST_meta['input_name'];
147
-    }
148
-
149
-
150
-    /**
151
-     * get property values for question form input
152
-     *
153
-     * @access public
154
-     * @param    string $property
155
-     * @return mixed
156
-     */
157
-    public function get($property = null)
158
-    {
159
-        if (! empty($property)) {
160
-            if (EEM_Question::instance()->has_field($property)) {
161
-                return $this->_QST->get($property);
162
-            } elseif (EEM_Answer::instance()->has_field($property)) {
163
-                return $this->_ANS->get($property);
164
-            } elseif ($this->_question_form_input_property_exists(__CLASS__, $property)) {
165
-                return $this->{$property};
166
-            }
167
-        }
168
-        return null;
169
-    }
170
-
171
-
172
-    /**
173
-     *    _question_form_input_property_exists
174
-     *
175
-     * @access private
176
-     * @param    string $classname
177
-     * @param    string $property
178
-     * @return boolean
179
-     */
180
-    private function _question_form_input_property_exists($classname, $property)
181
-    {
182
-        // first try regular property exists method which works as expected in PHP 5.3+
183
-        $prop = EEH_Class_Tools::has_property($classname, $property);
184
-        if (! $prop) {
185
-            // use reflection for < PHP 5.3 as a double check when property is not found, possible due to access restriction
186
-            $reflector = new ReflectionClass($classname);
187
-            $prop = $reflector->hasProperty($property);
188
-        }
189
-        return $prop;
190
-    }
191
-
192
-
193
-    /**
194
-     * set_input_id
195
-     *
196
-     * @access private
197
-     * @param $qstn_id
198
-     * @return void
199
-     */
200
-    private function _set_input_id($qstn_id)
201
-    {
202
-        $input_id = isset($this->_QST_meta['input_id']) && ! empty($this->_QST_meta['input_id'])
203
-            ? $this->_QST_meta['input_id'] : sanitize_key(strip_tags($this->_QST->get('QST_display_text')));
204
-        $this->QST_input_id = $this->_QST_meta['append_qstn_id'] && ! empty($qstn_id) ? $input_id . '-' . $qstn_id
205
-            : $input_id;
206
-    }
207
-
208
-
209
-    /**
210
-     * set_input_class
211
-     *
212
-     * @access private
213
-     * @return void
214
-     */
215
-    private function _set_input_class()
216
-    {
217
-        $this->QST_input_class = isset($this->_QST_meta['input_class']) ? $this->_QST_meta['input_class'] : '';
218
-    }
219
-
220
-
221
-    /**
222
-     * set_question_form_input_answer
223
-     *
224
-     * @access public
225
-     * @param mixed    int | string    $qstn_id
226
-     * @return void
227
-     */
228
-    public function set_question_form_input_answer($qstn_id)
229
-    {
230
-        // check for answer in $_REQUEST in case we are reprocessing a form after an error
231
-        if (isset($this->_QST_meta['EVT_ID']) && isset($this->_QST_meta['att_nmbr']) && isset($this->_QST_meta['date']) && isset($this->_QST_meta['time']) && isset($this->_QST_meta['price_id'])) {
232
-            if (isset($_REQUEST['qstn'][ $this->_QST_meta['EVT_ID'] ][ $this->_QST_meta['att_nmbr'] ][ $this->_QST_meta['date'] ][ $this->_QST_meta['time'] ][ $this->_QST_meta['price_id'] ][ $qstn_id ])) {
233
-                $answer = $_REQUEST['qstn'][ $this->_QST_meta['EVT_ID'] ][ $this->_QST_meta['att_nmbr'] ][ $this->_QST_meta['date'] ][ $this->_QST_meta['time'] ][ $this->_QST_meta['price_id'] ][ $qstn_id ];
234
-                $this->_ANS->set('ANS_value', $answer);
235
-            }
236
-        }
237
-    }
238
-
239
-
240
-    /**
241
-     *        generate_question_form_inputs_for_object
242
-     *
243
-     * @access    protected
244
-     * @param bool|object $object $object
245
-     * @param    array    $input_types
246
-     * @return        array
247
-     */
248
-    public static function generate_question_form_inputs_for_object($object = false, $input_types = array())
249
-    {
250
-        if (! is_object($object)) {
251
-            return false;
252
-        }
253
-        $inputs = array();
254
-        $fields = $object->get_model()->field_settings(false);
255
-        // $pk = $object->ID(); <<< NO!
256
-        // EEH_Debug_Tools::printr( $object, get_class( $object ) . '<br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span>', 'auto' );
257
-        // EEH_Debug_Tools::printr( $fields, '$fields  <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span>', 'auto' );
258
-        // EEH_Debug_Tools::printr( $input_types, '$input_types  <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span>', 'auto' );
259
-        foreach ($fields as $field_ID => $field) {
260
-            if ($field instanceof EE_Model_Field_Base) {
261
-                // echo '<h4>$field_ID : ' . $field_ID . '  <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span></h4>';
262
-                // EEH_Debug_Tools::printr( $field, '$field  <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span>', 'auto' );
263
-                if (isset($input_types[ $field_ID ])) {
264
-                    // get saved value for field
265
-                    $value = $object->get($field_ID);
266
-                    // echo '<h4>$value : ' . $value . '  <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span></h4>';
267
-                    // if no saved value, then use default
268
-                    $value = $value !== null ? $value : $field->get_default_value();
269
-                    // if ( $field_ID == 'CNT_active' )
270
-                    // echo '<h4>$value : ' . $value . '  <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span></h4>';
271
-                    // determine question type
272
-                    $type = isset($input_types[ $field_ID ]) ? $input_types[ $field_ID ]['type'] : 'TEXT';
273
-                    // input name
274
-                    $input_name = isset($input_types[ $field_ID ]) && isset($input_types[ $field_ID ]['input_name'])
275
-                        ? $input_types[ $field_ID ]['input_name'] . '[' . $field_ID . ']' : $field_ID;
276
-                    // css class for input
277
-                    $class = isset($input_types[ $field_ID ]['class']) && ! empty($input_types[ $field_ID ]['class'])
278
-                        ? ' ' . $input_types[ $field_ID ]['class'] : '';
279
-                    // whether to apply htmlentities to answer
280
-                    $htmlentities = isset($input_types[ $field_ID ]['htmlentities'])
281
-                        ? $input_types[ $field_ID ]['htmlentities'] : true;
282
-                    // whether to apply htmlentities to answer
283
-                    $label_b4 = isset($input_types[ $field_ID ]['label_b4']) ? $input_types[ $field_ID ]['label_b4']
284
-                        : false;
285
-                    // whether to apply htmlentities to answer
286
-                    $use_desc_4_label = isset($input_types[ $field_ID ]['use_desc_4_label'])
287
-                        ? $input_types[ $field_ID ]['use_desc_4_label'] : false;
288
-
289
-                    // create EE_Question_Form_Input object
290
-                    $QFI = new EE_Question_Form_Input(
291
-                        EE_Question::new_instance(
292
-                            array(
293
-                                'QST_ID'           => 0,
294
-                                'QST_display_text' => $field->get_nicename(),
295
-                                'QST_type'         => $type,
296
-                            )
297
-                        ),
298
-                        EE_Answer::new_instance(
299
-                            array(
300
-                                'ANS_ID'    => 0,
301
-                                'QST_ID'    => 0,
302
-                                'REG_ID'    => 0,
303
-                                'ANS_value' => $value,
304
-                            )
305
-                        ),
306
-                        array(
307
-                            'input_id'         => $field_ID . '-' . $object->ID(),
308
-                            'input_name'       => $input_name,
309
-                            'input_class'      => $field_ID . $class,
310
-                            'input_prefix'     => '',
311
-                            'append_qstn_id'   => false,
312
-                            'htmlentities'     => $htmlentities,
313
-                            'label_b4'         => $label_b4,
314
-                            'use_desc_4_label' => $use_desc_4_label,
315
-                        )
316
-                    );
317
-                    // does question type have options ?
318
-                    if (in_array($type, array('DROPDOWN', 'RADIO_BTN', 'CHECKBOX'))
319
-                        && isset($input_types[ $field_ID ])
320
-                        && isset($input_types[ $field_ID ]['options'])
321
-                    ) {
322
-                        foreach ($input_types[ $field_ID ]['options'] as $option) {
323
-                            $option = stripslashes_deep($option);
324
-                            $option_id = ! empty($option['id']) ? $option['id'] : 0;
325
-                            $QSO = EE_Question_Option::new_instance(
326
-                                array(
327
-                                    'QSO_value'   => (string) $option_id,
328
-                                    'QSO_desc'    => $option['text'],
329
-                                    'QSO_deleted' => false,
330
-                                )
331
-                            );
332
-                            // all QST (and ANS) properties can be accessed indirectly thru QFI
333
-                            $QFI->add_temp_option($QSO);
334
-                        }
335
-                    }
336
-                    // we don't want ppl manually changing primary keys cuz that would just lead to total craziness man
337
-                    if ($field_ID == $object->get_model()->primary_key_name()) {
338
-                        $QFI->set('QST_disabled', true);
339
-                    }
340
-                    // EEH_Debug_Tools::printr( $QFI, '$QFI  <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span>', 'auto' );
341
-                    $inputs[ $field_ID ] = $QFI;
342
-                    // if ( $field_ID == 'CNT_active' ) {
343
-                    // EEH_Debug_Tools::printr( $QFI, '$QFI  <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span>', 'auto' );
344
-                    // }
345
-                }
346
-            }
347
-        }
348
-        return $inputs;
349
-    }
350
-
351
-
352
-    /**
353
-     *    add_temp_option
354
-     *
355
-     * @access public
356
-     * @param \EE_Question_Option $QSO EE_Question_Option
357
-     * @return boolean
358
-     */
359
-    public function add_temp_option(EE_Question_Option $QSO)
360
-    {
361
-        $this->_QST->add_temp_option($QSO);
362
-    }
363
-
364
-
365
-    /**
366
-     * set property values for question form input
367
-     *
368
-     * @access public
369
-     * @param    string $property
370
-     * @param    mixed  $value
371
-     * @return mixed
372
-     */
373
-    public function set($property = null, $value = null)
374
-    {
375
-        if (! empty($property)) {
376
-            if (EEM_Question::instance()->has_field($property)) {
377
-                $this->_QST->set($property, $value);
378
-            } elseif (EEM_Answer::instance()->has_field($property)) {
379
-                $this->_ANS->set($property, $value);
380
-            } elseif ($this->_question_form_input_property_exists(__CLASS__, $property)) {
381
-                echo "<hr>$property is a prop of QFI";
382
-                $this->{$property} = $value;
383
-                return true;
384
-            }
385
-        }
386
-        return null;
387
-    }
388
-
389
-
390
-    /**
391
-     *    _question_form_input_property_exists
392
-     *
393
-     * @access public
394
-     * @param boolean      $notDeletedOptionsOnly            1
395
-     *                                                       whether to return ALL options, or only the ones which have
396
-     *                                                       not yet been deleted
397
-     * @param string|array $selected_value_to_always_include , when retrieving options to an ANSWERED question,
398
-     *                                                       we want to usually only show non-deleted options AND the
399
-     *                                                       value that was selected for the answer, whether it was
400
-     *                                                       trashed or not.
401
-     * @return EE_Question_Option
402
-     */
403
-    public function options($notDeletedOptionsOnly = true, $selected_value_to_always_include = null)
404
-    {
405
-        $temp_options = $this->_QST->temp_options();
406
-        return ! empty($temp_options)
407
-            ? $temp_options
408
-            : $this->_QST->options(
409
-                $notDeletedOptionsOnly,
410
-                $selected_value_to_always_include
411
-            );
412
-    }
413
-
414
-
415
-    /**
416
-     *    get_meta
417
-     *
418
-     * @access public
419
-     * @param mixed $key
420
-     * @return mixed
421
-     */
422
-    public function get_meta($key = false)
423
-    {
424
-        return $key && isset($this->_QST_meta[ $key ]) ? $this->_QST_meta[ $key ] : false;
425
-    }
17
+	/**
18
+	 *    EE_Question object
19
+	 *
20
+	 * @access private
21
+	 * @var object
22
+	 */
23
+	private $_QST = null;
24
+
25
+	/**
26
+	 *    EE_Answer object
27
+	 *
28
+	 * @access private
29
+	 * @var object
30
+	 */
31
+	private $_ANS = null;
32
+
33
+	/**
34
+	 *    $_QST_meta
35
+	 * @access private
36
+	 * @var array
37
+	 */
38
+	private $_QST_meta = array();
39
+
40
+	/**
41
+	 *    $QST_input_name
42
+	 * @access private
43
+	 * @var string
44
+	 */
45
+	private $QST_input_name = '';
46
+
47
+	/**
48
+	 *    $QST_input_id
49
+	 * @access private
50
+	 * @var string
51
+	 */
52
+	private $QST_input_id = '';
53
+
54
+	/**
55
+	 *    $QST_input_class
56
+	 * @access private
57
+	 * @var string
58
+	 */
59
+	private $QST_input_class = '';
60
+
61
+
62
+	/**
63
+	 * constructor for questions
64
+	 *
65
+	 * @param \EE_Question $QST EE_Question object
66
+	 * @param \EE_Answer   $ANS EE_Answer object
67
+	 * @param array        $q_meta
68
+	 * @access public
69
+	 * @return \EE_Question_Form_Input
70
+	 */
71
+	public function __construct(EE_Question $QST = null, EE_Answer $ANS = null, $q_meta = array())
72
+	{
73
+		if (empty($QST) || empty($ANS)) {
74
+			EE_Error::add_error(
75
+				__('An error occurred. A valid EE_Question or EE_Answer object was not received.', 'event_espresso'),
76
+				__FILE__,
77
+				__FUNCTION__,
78
+				__LINE__
79
+			);
80
+			return null;
81
+		}
82
+		$this->_QST = $QST;
83
+		$this->_ANS = $ANS;
84
+		$this->set_question_form_input_meta($q_meta);
85
+		$this->set_question_form_input_init();
86
+	}
87
+
88
+
89
+	/**
90
+	 * sets meta data for the question form input
91
+	 *
92
+	 * @access public
93
+	 * @param array $q_meta
94
+	 * @return void
95
+	 */
96
+	public function set_question_form_input_meta($q_meta = array())
97
+	{
98
+		$default_q_meta = array(
99
+			'att_nmbr'       => 1,
100
+			'ticket_id'      => '',
101
+			'date'           => '',
102
+			'time'           => '',
103
+			'input_name'     => '',
104
+			'input_id'       => '',
105
+			'input_class'    => '',
106
+			'input_prefix'   => 'qstn',
107
+			'append_qstn_id' => true,
108
+			'htmlentities'   => true,
109
+			'allow_null'     => false,
110
+		);
111
+		$this->_QST_meta = array_merge($default_q_meta, $q_meta);
112
+	}
113
+
114
+
115
+	/**
116
+	 * set_question_form_input_init
117
+	 *
118
+	 * @access public
119
+	 * @return void
120
+	 */
121
+	public function set_question_form_input_init()
122
+	{
123
+		$qstn_id = $this->_QST->system_ID() ? $this->_QST->system_ID() : $this->_QST->ID();
124
+		$this->_set_input_name($qstn_id);
125
+		$this->_set_input_id($qstn_id);
126
+		$this->_set_input_class($qstn_id);
127
+		$this->set_question_form_input_answer($qstn_id);
128
+	}
129
+
130
+
131
+	/**
132
+	 * set_input_name
133
+	 *
134
+	 * @access private
135
+	 * @param $qstn_id
136
+	 * @return void
137
+	 */
138
+	private function _set_input_name($qstn_id)
139
+	{
140
+		if (! empty($qstn_id)) {
141
+			$ANS_ID = $this->get('ANS_ID');
142
+			$qstn_id = ! empty($ANS_ID) ? '[' . $qstn_id . '][' . $ANS_ID . ']' : '[' . $qstn_id . ']';
143
+		}
144
+		$this->QST_input_name = $this->_QST_meta['append_qstn_id'] && ! empty($qstn_id)
145
+			? $this->_QST_meta['input_prefix'] . $this->_QST_meta['input_name'] . $qstn_id
146
+			: $this->_QST_meta['input_prefix'] . $this->_QST_meta['input_name'];
147
+	}
148
+
149
+
150
+	/**
151
+	 * get property values for question form input
152
+	 *
153
+	 * @access public
154
+	 * @param    string $property
155
+	 * @return mixed
156
+	 */
157
+	public function get($property = null)
158
+	{
159
+		if (! empty($property)) {
160
+			if (EEM_Question::instance()->has_field($property)) {
161
+				return $this->_QST->get($property);
162
+			} elseif (EEM_Answer::instance()->has_field($property)) {
163
+				return $this->_ANS->get($property);
164
+			} elseif ($this->_question_form_input_property_exists(__CLASS__, $property)) {
165
+				return $this->{$property};
166
+			}
167
+		}
168
+		return null;
169
+	}
170
+
171
+
172
+	/**
173
+	 *    _question_form_input_property_exists
174
+	 *
175
+	 * @access private
176
+	 * @param    string $classname
177
+	 * @param    string $property
178
+	 * @return boolean
179
+	 */
180
+	private function _question_form_input_property_exists($classname, $property)
181
+	{
182
+		// first try regular property exists method which works as expected in PHP 5.3+
183
+		$prop = EEH_Class_Tools::has_property($classname, $property);
184
+		if (! $prop) {
185
+			// use reflection for < PHP 5.3 as a double check when property is not found, possible due to access restriction
186
+			$reflector = new ReflectionClass($classname);
187
+			$prop = $reflector->hasProperty($property);
188
+		}
189
+		return $prop;
190
+	}
191
+
192
+
193
+	/**
194
+	 * set_input_id
195
+	 *
196
+	 * @access private
197
+	 * @param $qstn_id
198
+	 * @return void
199
+	 */
200
+	private function _set_input_id($qstn_id)
201
+	{
202
+		$input_id = isset($this->_QST_meta['input_id']) && ! empty($this->_QST_meta['input_id'])
203
+			? $this->_QST_meta['input_id'] : sanitize_key(strip_tags($this->_QST->get('QST_display_text')));
204
+		$this->QST_input_id = $this->_QST_meta['append_qstn_id'] && ! empty($qstn_id) ? $input_id . '-' . $qstn_id
205
+			: $input_id;
206
+	}
207
+
208
+
209
+	/**
210
+	 * set_input_class
211
+	 *
212
+	 * @access private
213
+	 * @return void
214
+	 */
215
+	private function _set_input_class()
216
+	{
217
+		$this->QST_input_class = isset($this->_QST_meta['input_class']) ? $this->_QST_meta['input_class'] : '';
218
+	}
219
+
220
+
221
+	/**
222
+	 * set_question_form_input_answer
223
+	 *
224
+	 * @access public
225
+	 * @param mixed    int | string    $qstn_id
226
+	 * @return void
227
+	 */
228
+	public function set_question_form_input_answer($qstn_id)
229
+	{
230
+		// check for answer in $_REQUEST in case we are reprocessing a form after an error
231
+		if (isset($this->_QST_meta['EVT_ID']) && isset($this->_QST_meta['att_nmbr']) && isset($this->_QST_meta['date']) && isset($this->_QST_meta['time']) && isset($this->_QST_meta['price_id'])) {
232
+			if (isset($_REQUEST['qstn'][ $this->_QST_meta['EVT_ID'] ][ $this->_QST_meta['att_nmbr'] ][ $this->_QST_meta['date'] ][ $this->_QST_meta['time'] ][ $this->_QST_meta['price_id'] ][ $qstn_id ])) {
233
+				$answer = $_REQUEST['qstn'][ $this->_QST_meta['EVT_ID'] ][ $this->_QST_meta['att_nmbr'] ][ $this->_QST_meta['date'] ][ $this->_QST_meta['time'] ][ $this->_QST_meta['price_id'] ][ $qstn_id ];
234
+				$this->_ANS->set('ANS_value', $answer);
235
+			}
236
+		}
237
+	}
238
+
239
+
240
+	/**
241
+	 *        generate_question_form_inputs_for_object
242
+	 *
243
+	 * @access    protected
244
+	 * @param bool|object $object $object
245
+	 * @param    array    $input_types
246
+	 * @return        array
247
+	 */
248
+	public static function generate_question_form_inputs_for_object($object = false, $input_types = array())
249
+	{
250
+		if (! is_object($object)) {
251
+			return false;
252
+		}
253
+		$inputs = array();
254
+		$fields = $object->get_model()->field_settings(false);
255
+		// $pk = $object->ID(); <<< NO!
256
+		// EEH_Debug_Tools::printr( $object, get_class( $object ) . '<br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span>', 'auto' );
257
+		// EEH_Debug_Tools::printr( $fields, '$fields  <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span>', 'auto' );
258
+		// EEH_Debug_Tools::printr( $input_types, '$input_types  <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span>', 'auto' );
259
+		foreach ($fields as $field_ID => $field) {
260
+			if ($field instanceof EE_Model_Field_Base) {
261
+				// echo '<h4>$field_ID : ' . $field_ID . '  <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span></h4>';
262
+				// EEH_Debug_Tools::printr( $field, '$field  <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span>', 'auto' );
263
+				if (isset($input_types[ $field_ID ])) {
264
+					// get saved value for field
265
+					$value = $object->get($field_ID);
266
+					// echo '<h4>$value : ' . $value . '  <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span></h4>';
267
+					// if no saved value, then use default
268
+					$value = $value !== null ? $value : $field->get_default_value();
269
+					// if ( $field_ID == 'CNT_active' )
270
+					// echo '<h4>$value : ' . $value . '  <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span></h4>';
271
+					// determine question type
272
+					$type = isset($input_types[ $field_ID ]) ? $input_types[ $field_ID ]['type'] : 'TEXT';
273
+					// input name
274
+					$input_name = isset($input_types[ $field_ID ]) && isset($input_types[ $field_ID ]['input_name'])
275
+						? $input_types[ $field_ID ]['input_name'] . '[' . $field_ID . ']' : $field_ID;
276
+					// css class for input
277
+					$class = isset($input_types[ $field_ID ]['class']) && ! empty($input_types[ $field_ID ]['class'])
278
+						? ' ' . $input_types[ $field_ID ]['class'] : '';
279
+					// whether to apply htmlentities to answer
280
+					$htmlentities = isset($input_types[ $field_ID ]['htmlentities'])
281
+						? $input_types[ $field_ID ]['htmlentities'] : true;
282
+					// whether to apply htmlentities to answer
283
+					$label_b4 = isset($input_types[ $field_ID ]['label_b4']) ? $input_types[ $field_ID ]['label_b4']
284
+						: false;
285
+					// whether to apply htmlentities to answer
286
+					$use_desc_4_label = isset($input_types[ $field_ID ]['use_desc_4_label'])
287
+						? $input_types[ $field_ID ]['use_desc_4_label'] : false;
288
+
289
+					// create EE_Question_Form_Input object
290
+					$QFI = new EE_Question_Form_Input(
291
+						EE_Question::new_instance(
292
+							array(
293
+								'QST_ID'           => 0,
294
+								'QST_display_text' => $field->get_nicename(),
295
+								'QST_type'         => $type,
296
+							)
297
+						),
298
+						EE_Answer::new_instance(
299
+							array(
300
+								'ANS_ID'    => 0,
301
+								'QST_ID'    => 0,
302
+								'REG_ID'    => 0,
303
+								'ANS_value' => $value,
304
+							)
305
+						),
306
+						array(
307
+							'input_id'         => $field_ID . '-' . $object->ID(),
308
+							'input_name'       => $input_name,
309
+							'input_class'      => $field_ID . $class,
310
+							'input_prefix'     => '',
311
+							'append_qstn_id'   => false,
312
+							'htmlentities'     => $htmlentities,
313
+							'label_b4'         => $label_b4,
314
+							'use_desc_4_label' => $use_desc_4_label,
315
+						)
316
+					);
317
+					// does question type have options ?
318
+					if (in_array($type, array('DROPDOWN', 'RADIO_BTN', 'CHECKBOX'))
319
+						&& isset($input_types[ $field_ID ])
320
+						&& isset($input_types[ $field_ID ]['options'])
321
+					) {
322
+						foreach ($input_types[ $field_ID ]['options'] as $option) {
323
+							$option = stripslashes_deep($option);
324
+							$option_id = ! empty($option['id']) ? $option['id'] : 0;
325
+							$QSO = EE_Question_Option::new_instance(
326
+								array(
327
+									'QSO_value'   => (string) $option_id,
328
+									'QSO_desc'    => $option['text'],
329
+									'QSO_deleted' => false,
330
+								)
331
+							);
332
+							// all QST (and ANS) properties can be accessed indirectly thru QFI
333
+							$QFI->add_temp_option($QSO);
334
+						}
335
+					}
336
+					// we don't want ppl manually changing primary keys cuz that would just lead to total craziness man
337
+					if ($field_ID == $object->get_model()->primary_key_name()) {
338
+						$QFI->set('QST_disabled', true);
339
+					}
340
+					// EEH_Debug_Tools::printr( $QFI, '$QFI  <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span>', 'auto' );
341
+					$inputs[ $field_ID ] = $QFI;
342
+					// if ( $field_ID == 'CNT_active' ) {
343
+					// EEH_Debug_Tools::printr( $QFI, '$QFI  <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span>', 'auto' );
344
+					// }
345
+				}
346
+			}
347
+		}
348
+		return $inputs;
349
+	}
350
+
351
+
352
+	/**
353
+	 *    add_temp_option
354
+	 *
355
+	 * @access public
356
+	 * @param \EE_Question_Option $QSO EE_Question_Option
357
+	 * @return boolean
358
+	 */
359
+	public function add_temp_option(EE_Question_Option $QSO)
360
+	{
361
+		$this->_QST->add_temp_option($QSO);
362
+	}
363
+
364
+
365
+	/**
366
+	 * set property values for question form input
367
+	 *
368
+	 * @access public
369
+	 * @param    string $property
370
+	 * @param    mixed  $value
371
+	 * @return mixed
372
+	 */
373
+	public function set($property = null, $value = null)
374
+	{
375
+		if (! empty($property)) {
376
+			if (EEM_Question::instance()->has_field($property)) {
377
+				$this->_QST->set($property, $value);
378
+			} elseif (EEM_Answer::instance()->has_field($property)) {
379
+				$this->_ANS->set($property, $value);
380
+			} elseif ($this->_question_form_input_property_exists(__CLASS__, $property)) {
381
+				echo "<hr>$property is a prop of QFI";
382
+				$this->{$property} = $value;
383
+				return true;
384
+			}
385
+		}
386
+		return null;
387
+	}
388
+
389
+
390
+	/**
391
+	 *    _question_form_input_property_exists
392
+	 *
393
+	 * @access public
394
+	 * @param boolean      $notDeletedOptionsOnly            1
395
+	 *                                                       whether to return ALL options, or only the ones which have
396
+	 *                                                       not yet been deleted
397
+	 * @param string|array $selected_value_to_always_include , when retrieving options to an ANSWERED question,
398
+	 *                                                       we want to usually only show non-deleted options AND the
399
+	 *                                                       value that was selected for the answer, whether it was
400
+	 *                                                       trashed or not.
401
+	 * @return EE_Question_Option
402
+	 */
403
+	public function options($notDeletedOptionsOnly = true, $selected_value_to_always_include = null)
404
+	{
405
+		$temp_options = $this->_QST->temp_options();
406
+		return ! empty($temp_options)
407
+			? $temp_options
408
+			: $this->_QST->options(
409
+				$notDeletedOptionsOnly,
410
+				$selected_value_to_always_include
411
+			);
412
+	}
413
+
414
+
415
+	/**
416
+	 *    get_meta
417
+	 *
418
+	 * @access public
419
+	 * @param mixed $key
420
+	 * @return mixed
421
+	 */
422
+	public function get_meta($key = false)
423
+	{
424
+		return $key && isset($this->_QST_meta[ $key ]) ? $this->_QST_meta[ $key ] : false;
425
+	}
426 426
 }
Please login to merge, or discard this patch.
Spacing   +29 added lines, -29 removed lines patch added patch discarded remove patch
@@ -137,13 +137,13 @@  discard block
 block discarded – undo
137 137
      */
138 138
     private function _set_input_name($qstn_id)
139 139
     {
140
-        if (! empty($qstn_id)) {
140
+        if ( ! empty($qstn_id)) {
141 141
             $ANS_ID = $this->get('ANS_ID');
142
-            $qstn_id = ! empty($ANS_ID) ? '[' . $qstn_id . '][' . $ANS_ID . ']' : '[' . $qstn_id . ']';
142
+            $qstn_id = ! empty($ANS_ID) ? '['.$qstn_id.']['.$ANS_ID.']' : '['.$qstn_id.']';
143 143
         }
144 144
         $this->QST_input_name = $this->_QST_meta['append_qstn_id'] && ! empty($qstn_id)
145
-            ? $this->_QST_meta['input_prefix'] . $this->_QST_meta['input_name'] . $qstn_id
146
-            : $this->_QST_meta['input_prefix'] . $this->_QST_meta['input_name'];
145
+            ? $this->_QST_meta['input_prefix'].$this->_QST_meta['input_name'].$qstn_id
146
+            : $this->_QST_meta['input_prefix'].$this->_QST_meta['input_name'];
147 147
     }
148 148
 
149 149
 
@@ -156,7 +156,7 @@  discard block
 block discarded – undo
156 156
      */
157 157
     public function get($property = null)
158 158
     {
159
-        if (! empty($property)) {
159
+        if ( ! empty($property)) {
160 160
             if (EEM_Question::instance()->has_field($property)) {
161 161
                 return $this->_QST->get($property);
162 162
             } elseif (EEM_Answer::instance()->has_field($property)) {
@@ -181,7 +181,7 @@  discard block
 block discarded – undo
181 181
     {
182 182
         // first try regular property exists method which works as expected in PHP 5.3+
183 183
         $prop = EEH_Class_Tools::has_property($classname, $property);
184
-        if (! $prop) {
184
+        if ( ! $prop) {
185 185
             // use reflection for < PHP 5.3 as a double check when property is not found, possible due to access restriction
186 186
             $reflector = new ReflectionClass($classname);
187 187
             $prop = $reflector->hasProperty($property);
@@ -201,7 +201,7 @@  discard block
 block discarded – undo
201 201
     {
202 202
         $input_id = isset($this->_QST_meta['input_id']) && ! empty($this->_QST_meta['input_id'])
203 203
             ? $this->_QST_meta['input_id'] : sanitize_key(strip_tags($this->_QST->get('QST_display_text')));
204
-        $this->QST_input_id = $this->_QST_meta['append_qstn_id'] && ! empty($qstn_id) ? $input_id . '-' . $qstn_id
204
+        $this->QST_input_id = $this->_QST_meta['append_qstn_id'] && ! empty($qstn_id) ? $input_id.'-'.$qstn_id
205 205
             : $input_id;
206 206
     }
207 207
 
@@ -229,8 +229,8 @@  discard block
 block discarded – undo
229 229
     {
230 230
         // check for answer in $_REQUEST in case we are reprocessing a form after an error
231 231
         if (isset($this->_QST_meta['EVT_ID']) && isset($this->_QST_meta['att_nmbr']) && isset($this->_QST_meta['date']) && isset($this->_QST_meta['time']) && isset($this->_QST_meta['price_id'])) {
232
-            if (isset($_REQUEST['qstn'][ $this->_QST_meta['EVT_ID'] ][ $this->_QST_meta['att_nmbr'] ][ $this->_QST_meta['date'] ][ $this->_QST_meta['time'] ][ $this->_QST_meta['price_id'] ][ $qstn_id ])) {
233
-                $answer = $_REQUEST['qstn'][ $this->_QST_meta['EVT_ID'] ][ $this->_QST_meta['att_nmbr'] ][ $this->_QST_meta['date'] ][ $this->_QST_meta['time'] ][ $this->_QST_meta['price_id'] ][ $qstn_id ];
232
+            if (isset($_REQUEST['qstn'][$this->_QST_meta['EVT_ID']][$this->_QST_meta['att_nmbr']][$this->_QST_meta['date']][$this->_QST_meta['time']][$this->_QST_meta['price_id']][$qstn_id])) {
233
+                $answer = $_REQUEST['qstn'][$this->_QST_meta['EVT_ID']][$this->_QST_meta['att_nmbr']][$this->_QST_meta['date']][$this->_QST_meta['time']][$this->_QST_meta['price_id']][$qstn_id];
234 234
                 $this->_ANS->set('ANS_value', $answer);
235 235
             }
236 236
         }
@@ -247,7 +247,7 @@  discard block
 block discarded – undo
247 247
      */
248 248
     public static function generate_question_form_inputs_for_object($object = false, $input_types = array())
249 249
     {
250
-        if (! is_object($object)) {
250
+        if ( ! is_object($object)) {
251 251
             return false;
252 252
         }
253 253
         $inputs = array();
@@ -260,7 +260,7 @@  discard block
 block discarded – undo
260 260
             if ($field instanceof EE_Model_Field_Base) {
261 261
                 // echo '<h4>$field_ID : ' . $field_ID . '  <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span></h4>';
262 262
                 // EEH_Debug_Tools::printr( $field, '$field  <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span>', 'auto' );
263
-                if (isset($input_types[ $field_ID ])) {
263
+                if (isset($input_types[$field_ID])) {
264 264
                     // get saved value for field
265 265
                     $value = $object->get($field_ID);
266 266
                     // echo '<h4>$value : ' . $value . '  <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span></h4>';
@@ -269,22 +269,22 @@  discard block
 block discarded – undo
269 269
                     // if ( $field_ID == 'CNT_active' )
270 270
                     // echo '<h4>$value : ' . $value . '  <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span></h4>';
271 271
                     // determine question type
272
-                    $type = isset($input_types[ $field_ID ]) ? $input_types[ $field_ID ]['type'] : 'TEXT';
272
+                    $type = isset($input_types[$field_ID]) ? $input_types[$field_ID]['type'] : 'TEXT';
273 273
                     // input name
274
-                    $input_name = isset($input_types[ $field_ID ]) && isset($input_types[ $field_ID ]['input_name'])
275
-                        ? $input_types[ $field_ID ]['input_name'] . '[' . $field_ID . ']' : $field_ID;
274
+                    $input_name = isset($input_types[$field_ID]) && isset($input_types[$field_ID]['input_name'])
275
+                        ? $input_types[$field_ID]['input_name'].'['.$field_ID.']' : $field_ID;
276 276
                     // css class for input
277
-                    $class = isset($input_types[ $field_ID ]['class']) && ! empty($input_types[ $field_ID ]['class'])
278
-                        ? ' ' . $input_types[ $field_ID ]['class'] : '';
277
+                    $class = isset($input_types[$field_ID]['class']) && ! empty($input_types[$field_ID]['class'])
278
+                        ? ' '.$input_types[$field_ID]['class'] : '';
279 279
                     // whether to apply htmlentities to answer
280
-                    $htmlentities = isset($input_types[ $field_ID ]['htmlentities'])
281
-                        ? $input_types[ $field_ID ]['htmlentities'] : true;
280
+                    $htmlentities = isset($input_types[$field_ID]['htmlentities'])
281
+                        ? $input_types[$field_ID]['htmlentities'] : true;
282 282
                     // whether to apply htmlentities to answer
283
-                    $label_b4 = isset($input_types[ $field_ID ]['label_b4']) ? $input_types[ $field_ID ]['label_b4']
283
+                    $label_b4 = isset($input_types[$field_ID]['label_b4']) ? $input_types[$field_ID]['label_b4']
284 284
                         : false;
285 285
                     // whether to apply htmlentities to answer
286
-                    $use_desc_4_label = isset($input_types[ $field_ID ]['use_desc_4_label'])
287
-                        ? $input_types[ $field_ID ]['use_desc_4_label'] : false;
286
+                    $use_desc_4_label = isset($input_types[$field_ID]['use_desc_4_label'])
287
+                        ? $input_types[$field_ID]['use_desc_4_label'] : false;
288 288
 
289 289
                     // create EE_Question_Form_Input object
290 290
                     $QFI = new EE_Question_Form_Input(
@@ -304,9 +304,9 @@  discard block
 block discarded – undo
304 304
                             )
305 305
                         ),
306 306
                         array(
307
-                            'input_id'         => $field_ID . '-' . $object->ID(),
307
+                            'input_id'         => $field_ID.'-'.$object->ID(),
308 308
                             'input_name'       => $input_name,
309
-                            'input_class'      => $field_ID . $class,
309
+                            'input_class'      => $field_ID.$class,
310 310
                             'input_prefix'     => '',
311 311
                             'append_qstn_id'   => false,
312 312
                             'htmlentities'     => $htmlentities,
@@ -316,10 +316,10 @@  discard block
 block discarded – undo
316 316
                     );
317 317
                     // does question type have options ?
318 318
                     if (in_array($type, array('DROPDOWN', 'RADIO_BTN', 'CHECKBOX'))
319
-                        && isset($input_types[ $field_ID ])
320
-                        && isset($input_types[ $field_ID ]['options'])
319
+                        && isset($input_types[$field_ID])
320
+                        && isset($input_types[$field_ID]['options'])
321 321
                     ) {
322
-                        foreach ($input_types[ $field_ID ]['options'] as $option) {
322
+                        foreach ($input_types[$field_ID]['options'] as $option) {
323 323
                             $option = stripslashes_deep($option);
324 324
                             $option_id = ! empty($option['id']) ? $option['id'] : 0;
325 325
                             $QSO = EE_Question_Option::new_instance(
@@ -338,7 +338,7 @@  discard block
 block discarded – undo
338 338
                         $QFI->set('QST_disabled', true);
339 339
                     }
340 340
                     // EEH_Debug_Tools::printr( $QFI, '$QFI  <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span>', 'auto' );
341
-                    $inputs[ $field_ID ] = $QFI;
341
+                    $inputs[$field_ID] = $QFI;
342 342
                     // if ( $field_ID == 'CNT_active' ) {
343 343
                     // EEH_Debug_Tools::printr( $QFI, '$QFI  <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span>', 'auto' );
344 344
                     // }
@@ -372,7 +372,7 @@  discard block
 block discarded – undo
372 372
      */
373 373
     public function set($property = null, $value = null)
374 374
     {
375
-        if (! empty($property)) {
375
+        if ( ! empty($property)) {
376 376
             if (EEM_Question::instance()->has_field($property)) {
377 377
                 $this->_QST->set($property, $value);
378 378
             } elseif (EEM_Answer::instance()->has_field($property)) {
@@ -421,6 +421,6 @@  discard block
 block discarded – undo
421 421
      */
422 422
     public function get_meta($key = false)
423 423
     {
424
-        return $key && isset($this->_QST_meta[ $key ]) ? $this->_QST_meta[ $key ] : false;
424
+        return $key && isset($this->_QST_meta[$key]) ? $this->_QST_meta[$key] : false;
425 425
     }
426 426
 }
Please login to merge, or discard this patch.
core/db_classes/EE_Payment_Method.class.php 2 patches
Indentation   +568 added lines, -568 removed lines patch added patch discarded remove patch
@@ -11,578 +11,578 @@
 block discarded – undo
11 11
 class EE_Payment_Method extends EE_Base_Class
12 12
 {
13 13
 
14
-    /**
15
-     * Payment Method type object, which has all the info about this type of payment method,
16
-     * including functions for processing payments, to get settings forms, etc.
17
-     *
18
-     * @var EE_PMT_Base
19
-     */
20
-    protected $_type_obj;
21
-
22
-
23
-    /**
24
-     * @param array $props_n_values
25
-     * @return EE_Payment_Method
26
-     * @throws \EE_Error
27
-     */
28
-    public static function new_instance($props_n_values = array())
29
-    {
30
-        $has_object = parent::_check_for_object($props_n_values, __CLASS__);
31
-        return $has_object ? $has_object : new self($props_n_values, false);
32
-    }
33
-
34
-
35
-    /**
36
-     * @param array $props_n_values
37
-     * @return EE_Payment_Method
38
-     * @throws \EE_Error
39
-     */
40
-    public static function new_instance_from_db($props_n_values = array())
41
-    {
42
-        return new self($props_n_values, true);
43
-    }
44
-
45
-
46
-
47
-    /**
48
-     * Checks if there is a payment method class of the given 'PMD_type', and if so returns the classname.
49
-     * Otherwise returns a normal EE_Payment_Method
50
-     *
51
-     * @param array $props_n_values where 'PMD_type' is a gateway name like 'Paypal_Standard','Invoice',etc (basically
52
-     *                              the classname minus 'EEPM_')
53
-     * @return string
54
-     */
55
-    // private static function _payment_method_type($props_n_values)
56
-    // {
57
-    //     EE_Registry::instance()->load_lib('Payment_Method_Manager');
58
-    //     $type_string = isset($props_n_values['PMD_type']) ? $props_n_values['PMD_type'] : null;
59
-    //     if (EE_Payment_Method_Manager::instance()->payment_method_type_exists($type_string)) {
60
-    //         return 'EEPM_' . $type_string;
61
-    //     } else {
62
-    //         return __CLASS__;
63
-    //     }
64
-    // }
65
-
66
-
67
-    /**
68
-     * Gets whether this payment method can be used anywhere at all (ie frontend cart, admin, etc)
69
-     *
70
-     * @return boolean
71
-     */
72
-    public function active()
73
-    {
74
-        return array_intersect(array_keys(EEM_Payment_Method::instance()->scopes()), $this->scope());
75
-    }
76
-
77
-
78
-    /**
79
-     * Sets this PM as active by making it usable within the CART scope. Offline gateways
80
-     * are also usable from the admin-scope as well. DOES NOT SAVE it
81
-     *
82
-     * @throws \EE_Error
83
-     */
84
-    public function set_active()
85
-    {
86
-        $default_scopes = array(EEM_Payment_Method::scope_cart);
87
-        if ($this->type_obj() &&
88
-            $this->type_obj()->payment_occurs() === EE_PMT_Base::offline) {
89
-            $default_scopes[] = EEM_Payment_Method::scope_admin;
90
-        }
91
-        $this->set_scope($default_scopes);
92
-    }
93
-
94
-
95
-    /**
96
-     * Makes this payment method apply to NO scopes at all. DOES NOT SAVE it.
97
-     */
98
-    public function deactivate()
99
-    {
100
-        $this->set_scope(array());
101
-    }
102
-
103
-
104
-    /**
105
-     * Gets button_url
106
-     *
107
-     * @return string
108
-     */
109
-    public function button_url()
110
-    {
111
-        return $this->get('PMD_button_url');
112
-    }
113
-
114
-
115
-    /**
116
-     * Sets button_url
117
-     *
118
-     * @param string $button_url
119
-     */
120
-    public function set_button_url($button_url)
121
-    {
122
-        $this->set('PMD_button_url', $button_url);
123
-    }
124
-
125
-
126
-    /**
127
-     * Gets debug_mode
128
-     *
129
-     * @return boolean
130
-     */
131
-    public function debug_mode()
132
-    {
133
-        return $this->get('PMD_debug_mode');
134
-    }
135
-
136
-
137
-    /**
138
-     * Sets debug_mode
139
-     *
140
-     * @param boolean $debug_mode
141
-     */
142
-    public function set_debug_mode($debug_mode)
143
-    {
144
-        $this->set('PMD_debug_mode', $debug_mode);
145
-    }
146
-
147
-
148
-    /**
149
-     * Gets description
150
-     *
151
-     * @return string
152
-     */
153
-    public function description()
154
-    {
155
-        return $this->get('PMD_desc');
156
-    }
157
-
158
-
159
-    /**
160
-     * Sets description
161
-     *
162
-     * @param string $description
163
-     */
164
-    public function set_description($description)
165
-    {
166
-        $this->set('PMD_desc', $description);
167
-    }
168
-
169
-
170
-    /**
171
-     * Gets name
172
-     *
173
-     * @return string
174
-     */
175
-    public function name()
176
-    {
177
-        return $this->get('PMD_name');
178
-    }
179
-
180
-
181
-    /**
182
-     * Sets name
183
-     *
184
-     * @param string $name
185
-     */
186
-    public function set_name($name)
187
-    {
188
-        $this->set('PMD_name', $name);
189
-    }
190
-
191
-
192
-    /**
193
-     * Gets open_by_default
194
-     *
195
-     * @return boolean
196
-     */
197
-    public function open_by_default()
198
-    {
199
-        return $this->get('PMD_open_by_default');
200
-    }
201
-
202
-
203
-    /**
204
-     * Sets open_by_default
205
-     *
206
-     * @param boolean $open_by_default
207
-     */
208
-    public function set_open_by_default($open_by_default)
209
-    {
210
-        $this->set('PMD_open_by_default', $open_by_default);
211
-    }
212
-
213
-
214
-    /**
215
-     * Gets order
216
-     *
217
-     * @return int
218
-     */
219
-    public function order()
220
-    {
221
-        return $this->get('PMD_order');
222
-    }
223
-
224
-
225
-    /**
226
-     * Sets order
227
-     *
228
-     * @param int $order
229
-     */
230
-    public function set_order($order)
231
-    {
232
-        $this->set('PMD_order', $order);
233
-    }
234
-
235
-
236
-    /**
237
-     * Gets slug
238
-     *
239
-     * @return string
240
-     */
241
-    public function slug()
242
-    {
243
-        return $this->get('PMD_slug');
244
-    }
245
-
246
-
247
-    /**
248
-     * Sets slug
249
-     *
250
-     * @param string $slug
251
-     */
252
-    public function set_slug($slug)
253
-    {
254
-        $this->set('PMD_slug', $slug);
255
-    }
256
-
257
-
258
-    /**
259
-     * Gets type
260
-     *
261
-     * @return string
262
-     */
263
-    public function type()
264
-    {
265
-        return $this->get('PMD_type');
266
-    }
267
-
268
-
269
-    /**
270
-     * Sets type
271
-     *
272
-     * @param string $type
273
-     */
274
-    public function set_type($type)
275
-    {
276
-        $this->set('PMD_type', $type);
277
-    }
278
-
279
-
280
-    /**
281
-     * Gets wp_user
282
-     *
283
-     * @return int
284
-     */
285
-    public function wp_user()
286
-    {
287
-        return $this->get('PMD_wp_user');
288
-    }
289
-
290
-
291
-    /**
292
-     * Sets wp_user
293
-     *
294
-     * @param int $wp_user_id
295
-     */
296
-    public function set_wp_user($wp_user_id)
297
-    {
298
-        $this->set('PMD_wp_user', $wp_user_id);
299
-    }
300
-
301
-    /**
302
-     * Overrides parent so when PMD_type is changed we refresh the _type_obj
303
-     *
304
-     * @param string $field_name
305
-     * @param mixed $field_value
306
-     * @param boolean $use_default
307
-     */
308
-    public function set($field_name, $field_value, $use_default = false)
309
-    {
310
-        if ($field_name === 'PMD_type') {
311
-            // the type has probably changed, so forget about its old type object
312
-            $this->_type_obj = null;
313
-        }
314
-        parent::set($field_name, $field_value, $use_default);
315
-    }
316
-
317
-
318
-    /**
319
-     * Gets admin_name
320
-     *
321
-     * @return string
322
-     */
323
-    public function admin_name()
324
-    {
325
-        return $this->get('PMD_admin_name');
326
-    }
327
-
328
-
329
-    /**
330
-     * Sets admin_name
331
-     *
332
-     * @param string $admin_name
333
-     */
334
-    public function set_admin_name($admin_name)
335
-    {
336
-        $this->set('PMD_admin_name', $admin_name);
337
-    }
338
-
339
-
340
-    /**
341
-     * Gets admin_desc
342
-     *
343
-     * @return string
344
-     */
345
-    public function admin_desc()
346
-    {
347
-        return $this->get('PMD_admin_desc');
348
-    }
349
-
350
-
351
-    /**
352
-     * Sets admin_desc
353
-     *
354
-     * @param string $admin_desc
355
-     */
356
-    public function set_admin_desc($admin_desc)
357
-    {
358
-        $this->set('PMD_admin_desc', $admin_desc);
359
-    }
360
-
361
-
362
-    /**
363
-     * Gets scope
364
-     *
365
-     * @return array
366
-     */
367
-    public function scope()
368
-    {
369
-        return $this->get('PMD_scope');
370
-    }
371
-
372
-
373
-    /**
374
-     * Sets scope
375
-     *
376
-     * @param array $scope
377
-     */
378
-    public function set_scope($scope)
379
-    {
380
-        $this->set('PMD_scope', $scope);
381
-    }
382
-
383
-
384
-    /**
385
-     * Gets the payment method type for this payment method instance
386
-     *
387
-     * @return EE_PMT_Base
388
-     * @throws EE_Error
389
-     */
390
-    public function type_obj()
391
-    {
392
-        if (! $this->_type_obj) {
393
-            EE_Registry::instance()->load_lib('Payment_Method_Manager');
394
-            if (EE_Payment_Method_Manager::instance()->payment_method_type_exists($this->type())) {
395
-                $class_name = EE_Payment_Method_Manager::instance()->payment_method_class_from_type($this->type());
396
-                if (! class_exists($class_name)) {
397
-                    throw new EE_Error(
398
-                        sprintf(
399
-                            __(
400
-                                'An attempt to use the "%1$s" payment method failed, so it was deactivated.%2$sWas the "%1$s" Plugin recently deactivated? It can be reactivated on the %3$sPlugins Admin Page%4$s',
401
-                                'event_espresso'
402
-                            ),
403
-                            $class_name,
404
-                            '<br />',
405
-                            '<a href="' . admin_url('plugins.php') . '">',
406
-                            '</a>'
407
-                        )
408
-                    );
409
-                }
410
-                $r = new ReflectionClass($class_name);
411
-                $this->_type_obj = $r->newInstanceArgs(array($this));
412
-            } else {
413
-                throw new EE_Error(
414
-                    sprintf(
415
-                        __(
416
-                            'A payment method of type "%1$s" does not exist. Only ones existing are: %2$s',
417
-                            'event_espresso'
418
-                        ),
419
-                        $this->type(),
420
-                        implode(',', EE_Payment_Method_Manager::instance()->payment_method_type_names())
421
-                    )
422
-                );
423
-            }
424
-        }
425
-        return $this->_type_obj;
426
-    }
427
-
428
-
429
-    /**
430
-     * Returns a simple array of key-value pairs combining the payment method's fields (without the 'PMD_' prefix)
431
-     * and the extra meta. Mostly used for passing off ot gateways.     *
432
-     *
433
-     * @return array
434
-     */
435
-    public function settings_array()
436
-    {
437
-        $fields = $this->model_field_array();
438
-        $extra_meta = $this->all_extra_meta_array();
439
-        // remove the model's prefix from the fields
440
-        $combined_settings_array = array();
441
-        foreach ($fields as $key => $value) {
442
-            if (strpos($key, 'PMD_') === 0) {
443
-                $key_sans_model_prefix = str_replace('PMD_', '', $key);
444
-                $combined_settings_array [ $key_sans_model_prefix ] = $value;
445
-            }
446
-        }
447
-        $combined_settings_array = array_merge($extra_meta, $combined_settings_array);
448
-        return $combined_settings_array;
449
-    }
450
-
451
-
452
-    /**
453
-     * Gets the HTML for displaying the payment method on a page.
454
-     *
455
-     * @param string $url
456
-     * @param string $css_class
457
-     * @return string of HTML for displaying the button
458
-     * @throws \EE_Error
459
-     */
460
-    public function button_html($url = '', $css_class = '')
461
-    {
462
-        $payment_occurs = $this->type_obj()->payment_occurs();
463
-        return '
14
+	/**
15
+	 * Payment Method type object, which has all the info about this type of payment method,
16
+	 * including functions for processing payments, to get settings forms, etc.
17
+	 *
18
+	 * @var EE_PMT_Base
19
+	 */
20
+	protected $_type_obj;
21
+
22
+
23
+	/**
24
+	 * @param array $props_n_values
25
+	 * @return EE_Payment_Method
26
+	 * @throws \EE_Error
27
+	 */
28
+	public static function new_instance($props_n_values = array())
29
+	{
30
+		$has_object = parent::_check_for_object($props_n_values, __CLASS__);
31
+		return $has_object ? $has_object : new self($props_n_values, false);
32
+	}
33
+
34
+
35
+	/**
36
+	 * @param array $props_n_values
37
+	 * @return EE_Payment_Method
38
+	 * @throws \EE_Error
39
+	 */
40
+	public static function new_instance_from_db($props_n_values = array())
41
+	{
42
+		return new self($props_n_values, true);
43
+	}
44
+
45
+
46
+
47
+	/**
48
+	 * Checks if there is a payment method class of the given 'PMD_type', and if so returns the classname.
49
+	 * Otherwise returns a normal EE_Payment_Method
50
+	 *
51
+	 * @param array $props_n_values where 'PMD_type' is a gateway name like 'Paypal_Standard','Invoice',etc (basically
52
+	 *                              the classname minus 'EEPM_')
53
+	 * @return string
54
+	 */
55
+	// private static function _payment_method_type($props_n_values)
56
+	// {
57
+	//     EE_Registry::instance()->load_lib('Payment_Method_Manager');
58
+	//     $type_string = isset($props_n_values['PMD_type']) ? $props_n_values['PMD_type'] : null;
59
+	//     if (EE_Payment_Method_Manager::instance()->payment_method_type_exists($type_string)) {
60
+	//         return 'EEPM_' . $type_string;
61
+	//     } else {
62
+	//         return __CLASS__;
63
+	//     }
64
+	// }
65
+
66
+
67
+	/**
68
+	 * Gets whether this payment method can be used anywhere at all (ie frontend cart, admin, etc)
69
+	 *
70
+	 * @return boolean
71
+	 */
72
+	public function active()
73
+	{
74
+		return array_intersect(array_keys(EEM_Payment_Method::instance()->scopes()), $this->scope());
75
+	}
76
+
77
+
78
+	/**
79
+	 * Sets this PM as active by making it usable within the CART scope. Offline gateways
80
+	 * are also usable from the admin-scope as well. DOES NOT SAVE it
81
+	 *
82
+	 * @throws \EE_Error
83
+	 */
84
+	public function set_active()
85
+	{
86
+		$default_scopes = array(EEM_Payment_Method::scope_cart);
87
+		if ($this->type_obj() &&
88
+			$this->type_obj()->payment_occurs() === EE_PMT_Base::offline) {
89
+			$default_scopes[] = EEM_Payment_Method::scope_admin;
90
+		}
91
+		$this->set_scope($default_scopes);
92
+	}
93
+
94
+
95
+	/**
96
+	 * Makes this payment method apply to NO scopes at all. DOES NOT SAVE it.
97
+	 */
98
+	public function deactivate()
99
+	{
100
+		$this->set_scope(array());
101
+	}
102
+
103
+
104
+	/**
105
+	 * Gets button_url
106
+	 *
107
+	 * @return string
108
+	 */
109
+	public function button_url()
110
+	{
111
+		return $this->get('PMD_button_url');
112
+	}
113
+
114
+
115
+	/**
116
+	 * Sets button_url
117
+	 *
118
+	 * @param string $button_url
119
+	 */
120
+	public function set_button_url($button_url)
121
+	{
122
+		$this->set('PMD_button_url', $button_url);
123
+	}
124
+
125
+
126
+	/**
127
+	 * Gets debug_mode
128
+	 *
129
+	 * @return boolean
130
+	 */
131
+	public function debug_mode()
132
+	{
133
+		return $this->get('PMD_debug_mode');
134
+	}
135
+
136
+
137
+	/**
138
+	 * Sets debug_mode
139
+	 *
140
+	 * @param boolean $debug_mode
141
+	 */
142
+	public function set_debug_mode($debug_mode)
143
+	{
144
+		$this->set('PMD_debug_mode', $debug_mode);
145
+	}
146
+
147
+
148
+	/**
149
+	 * Gets description
150
+	 *
151
+	 * @return string
152
+	 */
153
+	public function description()
154
+	{
155
+		return $this->get('PMD_desc');
156
+	}
157
+
158
+
159
+	/**
160
+	 * Sets description
161
+	 *
162
+	 * @param string $description
163
+	 */
164
+	public function set_description($description)
165
+	{
166
+		$this->set('PMD_desc', $description);
167
+	}
168
+
169
+
170
+	/**
171
+	 * Gets name
172
+	 *
173
+	 * @return string
174
+	 */
175
+	public function name()
176
+	{
177
+		return $this->get('PMD_name');
178
+	}
179
+
180
+
181
+	/**
182
+	 * Sets name
183
+	 *
184
+	 * @param string $name
185
+	 */
186
+	public function set_name($name)
187
+	{
188
+		$this->set('PMD_name', $name);
189
+	}
190
+
191
+
192
+	/**
193
+	 * Gets open_by_default
194
+	 *
195
+	 * @return boolean
196
+	 */
197
+	public function open_by_default()
198
+	{
199
+		return $this->get('PMD_open_by_default');
200
+	}
201
+
202
+
203
+	/**
204
+	 * Sets open_by_default
205
+	 *
206
+	 * @param boolean $open_by_default
207
+	 */
208
+	public function set_open_by_default($open_by_default)
209
+	{
210
+		$this->set('PMD_open_by_default', $open_by_default);
211
+	}
212
+
213
+
214
+	/**
215
+	 * Gets order
216
+	 *
217
+	 * @return int
218
+	 */
219
+	public function order()
220
+	{
221
+		return $this->get('PMD_order');
222
+	}
223
+
224
+
225
+	/**
226
+	 * Sets order
227
+	 *
228
+	 * @param int $order
229
+	 */
230
+	public function set_order($order)
231
+	{
232
+		$this->set('PMD_order', $order);
233
+	}
234
+
235
+
236
+	/**
237
+	 * Gets slug
238
+	 *
239
+	 * @return string
240
+	 */
241
+	public function slug()
242
+	{
243
+		return $this->get('PMD_slug');
244
+	}
245
+
246
+
247
+	/**
248
+	 * Sets slug
249
+	 *
250
+	 * @param string $slug
251
+	 */
252
+	public function set_slug($slug)
253
+	{
254
+		$this->set('PMD_slug', $slug);
255
+	}
256
+
257
+
258
+	/**
259
+	 * Gets type
260
+	 *
261
+	 * @return string
262
+	 */
263
+	public function type()
264
+	{
265
+		return $this->get('PMD_type');
266
+	}
267
+
268
+
269
+	/**
270
+	 * Sets type
271
+	 *
272
+	 * @param string $type
273
+	 */
274
+	public function set_type($type)
275
+	{
276
+		$this->set('PMD_type', $type);
277
+	}
278
+
279
+
280
+	/**
281
+	 * Gets wp_user
282
+	 *
283
+	 * @return int
284
+	 */
285
+	public function wp_user()
286
+	{
287
+		return $this->get('PMD_wp_user');
288
+	}
289
+
290
+
291
+	/**
292
+	 * Sets wp_user
293
+	 *
294
+	 * @param int $wp_user_id
295
+	 */
296
+	public function set_wp_user($wp_user_id)
297
+	{
298
+		$this->set('PMD_wp_user', $wp_user_id);
299
+	}
300
+
301
+	/**
302
+	 * Overrides parent so when PMD_type is changed we refresh the _type_obj
303
+	 *
304
+	 * @param string $field_name
305
+	 * @param mixed $field_value
306
+	 * @param boolean $use_default
307
+	 */
308
+	public function set($field_name, $field_value, $use_default = false)
309
+	{
310
+		if ($field_name === 'PMD_type') {
311
+			// the type has probably changed, so forget about its old type object
312
+			$this->_type_obj = null;
313
+		}
314
+		parent::set($field_name, $field_value, $use_default);
315
+	}
316
+
317
+
318
+	/**
319
+	 * Gets admin_name
320
+	 *
321
+	 * @return string
322
+	 */
323
+	public function admin_name()
324
+	{
325
+		return $this->get('PMD_admin_name');
326
+	}
327
+
328
+
329
+	/**
330
+	 * Sets admin_name
331
+	 *
332
+	 * @param string $admin_name
333
+	 */
334
+	public function set_admin_name($admin_name)
335
+	{
336
+		$this->set('PMD_admin_name', $admin_name);
337
+	}
338
+
339
+
340
+	/**
341
+	 * Gets admin_desc
342
+	 *
343
+	 * @return string
344
+	 */
345
+	public function admin_desc()
346
+	{
347
+		return $this->get('PMD_admin_desc');
348
+	}
349
+
350
+
351
+	/**
352
+	 * Sets admin_desc
353
+	 *
354
+	 * @param string $admin_desc
355
+	 */
356
+	public function set_admin_desc($admin_desc)
357
+	{
358
+		$this->set('PMD_admin_desc', $admin_desc);
359
+	}
360
+
361
+
362
+	/**
363
+	 * Gets scope
364
+	 *
365
+	 * @return array
366
+	 */
367
+	public function scope()
368
+	{
369
+		return $this->get('PMD_scope');
370
+	}
371
+
372
+
373
+	/**
374
+	 * Sets scope
375
+	 *
376
+	 * @param array $scope
377
+	 */
378
+	public function set_scope($scope)
379
+	{
380
+		$this->set('PMD_scope', $scope);
381
+	}
382
+
383
+
384
+	/**
385
+	 * Gets the payment method type for this payment method instance
386
+	 *
387
+	 * @return EE_PMT_Base
388
+	 * @throws EE_Error
389
+	 */
390
+	public function type_obj()
391
+	{
392
+		if (! $this->_type_obj) {
393
+			EE_Registry::instance()->load_lib('Payment_Method_Manager');
394
+			if (EE_Payment_Method_Manager::instance()->payment_method_type_exists($this->type())) {
395
+				$class_name = EE_Payment_Method_Manager::instance()->payment_method_class_from_type($this->type());
396
+				if (! class_exists($class_name)) {
397
+					throw new EE_Error(
398
+						sprintf(
399
+							__(
400
+								'An attempt to use the "%1$s" payment method failed, so it was deactivated.%2$sWas the "%1$s" Plugin recently deactivated? It can be reactivated on the %3$sPlugins Admin Page%4$s',
401
+								'event_espresso'
402
+							),
403
+							$class_name,
404
+							'<br />',
405
+							'<a href="' . admin_url('plugins.php') . '">',
406
+							'</a>'
407
+						)
408
+					);
409
+				}
410
+				$r = new ReflectionClass($class_name);
411
+				$this->_type_obj = $r->newInstanceArgs(array($this));
412
+			} else {
413
+				throw new EE_Error(
414
+					sprintf(
415
+						__(
416
+							'A payment method of type "%1$s" does not exist. Only ones existing are: %2$s',
417
+							'event_espresso'
418
+						),
419
+						$this->type(),
420
+						implode(',', EE_Payment_Method_Manager::instance()->payment_method_type_names())
421
+					)
422
+				);
423
+			}
424
+		}
425
+		return $this->_type_obj;
426
+	}
427
+
428
+
429
+	/**
430
+	 * Returns a simple array of key-value pairs combining the payment method's fields (without the 'PMD_' prefix)
431
+	 * and the extra meta. Mostly used for passing off ot gateways.     *
432
+	 *
433
+	 * @return array
434
+	 */
435
+	public function settings_array()
436
+	{
437
+		$fields = $this->model_field_array();
438
+		$extra_meta = $this->all_extra_meta_array();
439
+		// remove the model's prefix from the fields
440
+		$combined_settings_array = array();
441
+		foreach ($fields as $key => $value) {
442
+			if (strpos($key, 'PMD_') === 0) {
443
+				$key_sans_model_prefix = str_replace('PMD_', '', $key);
444
+				$combined_settings_array [ $key_sans_model_prefix ] = $value;
445
+			}
446
+		}
447
+		$combined_settings_array = array_merge($extra_meta, $combined_settings_array);
448
+		return $combined_settings_array;
449
+	}
450
+
451
+
452
+	/**
453
+	 * Gets the HTML for displaying the payment method on a page.
454
+	 *
455
+	 * @param string $url
456
+	 * @param string $css_class
457
+	 * @return string of HTML for displaying the button
458
+	 * @throws \EE_Error
459
+	 */
460
+	public function button_html($url = '', $css_class = '')
461
+	{
462
+		$payment_occurs = $this->type_obj()->payment_occurs();
463
+		return '
464 464
 		 <div id="'
465
-               . $this->slug()
466
-               . '-payment-option-dv" class="'
467
-               . $payment_occurs . '-payment-gateway reg-page-payment-option-dv' . $css_class . '">
465
+			   . $this->slug()
466
+			   . '-payment-option-dv" class="'
467
+			   . $payment_occurs . '-payment-gateway reg-page-payment-option-dv' . $css_class . '">
468 468
 			<a id="payment-gateway-button-' . $this->slug()
469
-               . '" class="reg-page-payment-option-lnk" rel="'
470
-               . $this->slug() . '" href="' . $url . '" >
469
+			   . '" class="reg-page-payment-option-lnk" rel="'
470
+			   . $this->slug() . '" href="' . $url . '" >
471 471
 				<img src="' . $this->button_url() . '" alt="' . sprintf(
472
-                   esc_attr__('Pay using %s', 'event_espresso'),
473
-                   $this->get_pretty('PMD_name', 'form_input')
474
-               ) . '" />
472
+				   esc_attr__('Pay using %s', 'event_espresso'),
473
+				   $this->get_pretty('PMD_name', 'form_input')
474
+			   ) . '" />
475 475
 			</a>
476 476
 		</div>
477 477
 ';
478
-    }
479
-
480
-
481
-    /**
482
-     * Gets all the currencies which are an option for this payment method
483
-     * (as defined by the gateway and the currently active currencies)
484
-     *
485
-     * @return EE_Currency[]
486
-     * @throws \EE_Error
487
-     */
488
-    public function get_all_usable_currencies()
489
-    {
490
-        return EEM_Currency::instance()->get_all_currencies_usable_by($this->type_obj());
491
-    }
492
-
493
-
494
-    /**
495
-     * Reports whether or not this payment method can be used for this payment method
496
-     *
497
-     * @param string $currency_code currency ID (code)
498
-     * @return boolean
499
-     * @throws \EE_Error
500
-     */
501
-    public function usable_for_currency($currency_code)
502
-    {
503
-        foreach ($this->get_all_usable_currencies() as $currency_obj) {
504
-            if ($currency_obj->ID() === $currency_code) {
505
-                return true;
506
-            }
507
-        }
508
-        return false;
509
-    }
510
-
511
-
512
-    /**
513
-     * Returns TRUE if this payment method's gateway is an instance of EE_Onsite_Gateway
514
-     *
515
-     * @return bool
516
-     * @throws \EE_Error
517
-     */
518
-    public function is_on_site()
519
-    {
520
-        return $this->type_obj()->payment_occurs() === EE_PMT_Base::onsite;
521
-    }
522
-
523
-
524
-    /**
525
-     * Returns TRUE if this payment method's gateway is an instance of EE_Offsite_Gateway
526
-     *
527
-     * @return bool
528
-     * @throws \EE_Error
529
-     */
530
-    public function is_off_site()
531
-    {
532
-        return $this->type_obj()->payment_occurs() === EE_PMT_Base::offsite;
533
-    }
534
-
535
-
536
-    /**
537
-     * Returns TRUE if this payment method does not utilize a gateway
538
-     *
539
-     * @return bool
540
-     * @throws \EE_Error
541
-     */
542
-    public function is_off_line()
543
-    {
544
-        return $this->type_obj()->payment_occurs() === EE_PMT_Base::offline;
545
-    }
546
-
547
-    /**
548
-     * Overrides default __sleep so the object type is NOT cached.
549
-     * This way we can rely on the normal EE_Payment_Method::type_obj() logic
550
-     * to load the required classes, and don't need them at the time of unserialization
551
-     *
552
-     * @return array
553
-     */
554
-    public function __sleep()
555
-    {
556
-        $properties = get_object_vars($this);
557
-        unset($properties['_type_obj']);
558
-        return array_keys($properties);
559
-    }
560
-
561
-
562
-    /**
563
-     * Overrides parent to add some logging for when payment methods get deactivated
564
-     *
565
-     * @param array $set_cols_n_values
566
-     * @return int @see EE_Base_Class::save()
567
-     * @throws \EE_Error
568
-     */
569
-    public function save($set_cols_n_values = array())
570
-    {
571
-        $results = parent::save($set_cols_n_values);
572
-        if ($this->get_original('PMD_scope') !== $this->get('PMD_scope')) {
573
-            EE_Log::instance()->log(
574
-                __FILE__,
575
-                __FUNCTION__,
576
-                sprintf(
577
-                    __('Set new scope on payment method %1$s to %2$s from %3$s on URL %4$s', 'event_espresso'),
578
-                    $this->name(),
579
-                    serialize($this->get_original('PMD_scope')),
580
-                    serialize($this->get('PMD_scope')),
581
-                    EE_Registry::instance()->REQ->get_current_page_permalink()
582
-                ),
583
-                'payment_method_change'
584
-            );
585
-        }
586
-        return $results;
587
-    }
478
+	}
479
+
480
+
481
+	/**
482
+	 * Gets all the currencies which are an option for this payment method
483
+	 * (as defined by the gateway and the currently active currencies)
484
+	 *
485
+	 * @return EE_Currency[]
486
+	 * @throws \EE_Error
487
+	 */
488
+	public function get_all_usable_currencies()
489
+	{
490
+		return EEM_Currency::instance()->get_all_currencies_usable_by($this->type_obj());
491
+	}
492
+
493
+
494
+	/**
495
+	 * Reports whether or not this payment method can be used for this payment method
496
+	 *
497
+	 * @param string $currency_code currency ID (code)
498
+	 * @return boolean
499
+	 * @throws \EE_Error
500
+	 */
501
+	public function usable_for_currency($currency_code)
502
+	{
503
+		foreach ($this->get_all_usable_currencies() as $currency_obj) {
504
+			if ($currency_obj->ID() === $currency_code) {
505
+				return true;
506
+			}
507
+		}
508
+		return false;
509
+	}
510
+
511
+
512
+	/**
513
+	 * Returns TRUE if this payment method's gateway is an instance of EE_Onsite_Gateway
514
+	 *
515
+	 * @return bool
516
+	 * @throws \EE_Error
517
+	 */
518
+	public function is_on_site()
519
+	{
520
+		return $this->type_obj()->payment_occurs() === EE_PMT_Base::onsite;
521
+	}
522
+
523
+
524
+	/**
525
+	 * Returns TRUE if this payment method's gateway is an instance of EE_Offsite_Gateway
526
+	 *
527
+	 * @return bool
528
+	 * @throws \EE_Error
529
+	 */
530
+	public function is_off_site()
531
+	{
532
+		return $this->type_obj()->payment_occurs() === EE_PMT_Base::offsite;
533
+	}
534
+
535
+
536
+	/**
537
+	 * Returns TRUE if this payment method does not utilize a gateway
538
+	 *
539
+	 * @return bool
540
+	 * @throws \EE_Error
541
+	 */
542
+	public function is_off_line()
543
+	{
544
+		return $this->type_obj()->payment_occurs() === EE_PMT_Base::offline;
545
+	}
546
+
547
+	/**
548
+	 * Overrides default __sleep so the object type is NOT cached.
549
+	 * This way we can rely on the normal EE_Payment_Method::type_obj() logic
550
+	 * to load the required classes, and don't need them at the time of unserialization
551
+	 *
552
+	 * @return array
553
+	 */
554
+	public function __sleep()
555
+	{
556
+		$properties = get_object_vars($this);
557
+		unset($properties['_type_obj']);
558
+		return array_keys($properties);
559
+	}
560
+
561
+
562
+	/**
563
+	 * Overrides parent to add some logging for when payment methods get deactivated
564
+	 *
565
+	 * @param array $set_cols_n_values
566
+	 * @return int @see EE_Base_Class::save()
567
+	 * @throws \EE_Error
568
+	 */
569
+	public function save($set_cols_n_values = array())
570
+	{
571
+		$results = parent::save($set_cols_n_values);
572
+		if ($this->get_original('PMD_scope') !== $this->get('PMD_scope')) {
573
+			EE_Log::instance()->log(
574
+				__FILE__,
575
+				__FUNCTION__,
576
+				sprintf(
577
+					__('Set new scope on payment method %1$s to %2$s from %3$s on URL %4$s', 'event_espresso'),
578
+					$this->name(),
579
+					serialize($this->get_original('PMD_scope')),
580
+					serialize($this->get('PMD_scope')),
581
+					EE_Registry::instance()->REQ->get_current_page_permalink()
582
+				),
583
+				'payment_method_change'
584
+			);
585
+		}
586
+		return $results;
587
+	}
588 588
 }
Please login to merge, or discard this patch.
Spacing   +8 added lines, -8 removed lines patch added patch discarded remove patch
@@ -389,11 +389,11 @@  discard block
 block discarded – undo
389 389
      */
390 390
     public function type_obj()
391 391
     {
392
-        if (! $this->_type_obj) {
392
+        if ( ! $this->_type_obj) {
393 393
             EE_Registry::instance()->load_lib('Payment_Method_Manager');
394 394
             if (EE_Payment_Method_Manager::instance()->payment_method_type_exists($this->type())) {
395 395
                 $class_name = EE_Payment_Method_Manager::instance()->payment_method_class_from_type($this->type());
396
-                if (! class_exists($class_name)) {
396
+                if ( ! class_exists($class_name)) {
397 397
                     throw new EE_Error(
398 398
                         sprintf(
399 399
                             __(
@@ -402,7 +402,7 @@  discard block
 block discarded – undo
402 402
                             ),
403 403
                             $class_name,
404 404
                             '<br />',
405
-                            '<a href="' . admin_url('plugins.php') . '">',
405
+                            '<a href="'.admin_url('plugins.php').'">',
406 406
                             '</a>'
407 407
                         )
408 408
                     );
@@ -441,7 +441,7 @@  discard block
 block discarded – undo
441 441
         foreach ($fields as $key => $value) {
442 442
             if (strpos($key, 'PMD_') === 0) {
443 443
                 $key_sans_model_prefix = str_replace('PMD_', '', $key);
444
-                $combined_settings_array [ $key_sans_model_prefix ] = $value;
444
+                $combined_settings_array [$key_sans_model_prefix] = $value;
445 445
             }
446 446
         }
447 447
         $combined_settings_array = array_merge($extra_meta, $combined_settings_array);
@@ -464,14 +464,14 @@  discard block
 block discarded – undo
464 464
 		 <div id="'
465 465
                . $this->slug()
466 466
                . '-payment-option-dv" class="'
467
-               . $payment_occurs . '-payment-gateway reg-page-payment-option-dv' . $css_class . '">
467
+               . $payment_occurs.'-payment-gateway reg-page-payment-option-dv'.$css_class.'">
468 468
 			<a id="payment-gateway-button-' . $this->slug()
469 469
                . '" class="reg-page-payment-option-lnk" rel="'
470
-               . $this->slug() . '" href="' . $url . '" >
471
-				<img src="' . $this->button_url() . '" alt="' . sprintf(
470
+               . $this->slug().'" href="'.$url.'" >
471
+				<img src="' . $this->button_url().'" alt="'.sprintf(
472 472
                    esc_attr__('Pay using %s', 'event_espresso'),
473 473
                    $this->get_pretty('PMD_name', 'form_input')
474
-               ) . '" />
474
+               ).'" />
475 475
 			</a>
476 476
 		</div>
477 477
 ';
Please login to merge, or discard this patch.
core/db_classes/EE_Event_Venue.class.php 1 patch
Indentation   +17 added lines, -17 removed lines patch added patch discarded remove patch
@@ -6,23 +6,23 @@
 block discarded – undo
6 6
 class EE_Event_Venue extends EE_Base_Class
7 7
 {
8 8
 
9
-    /**
10
-     * @param array $props_n_values
11
-     * @return EE_Event_Venue|mixed
12
-     */
13
-    public static function new_instance($props_n_values = array())
14
-    {
15
-        $has_object = parent::_check_for_object($props_n_values, __CLASS__);
16
-        return $has_object ? $has_object : new self($props_n_values);
17
-    }
9
+	/**
10
+	 * @param array $props_n_values
11
+	 * @return EE_Event_Venue|mixed
12
+	 */
13
+	public static function new_instance($props_n_values = array())
14
+	{
15
+		$has_object = parent::_check_for_object($props_n_values, __CLASS__);
16
+		return $has_object ? $has_object : new self($props_n_values);
17
+	}
18 18
 
19 19
 
20
-    /**
21
-     * @param array $props_n_values
22
-     * @return EE_Event_Venue
23
-     */
24
-    public static function new_instance_from_db($props_n_values = array())
25
-    {
26
-        return new self($props_n_values, true);
27
-    }
20
+	/**
21
+	 * @param array $props_n_values
22
+	 * @return EE_Event_Venue
23
+	 */
24
+	public static function new_instance_from_db($props_n_values = array())
25
+	{
26
+		return new self($props_n_values, true);
27
+	}
28 28
 }
Please login to merge, or discard this patch.
core/db_classes/EE_Soft_Delete_Base_Class.class.php 1 patch
Indentation   +45 added lines, -45 removed lines patch added patch discarded remove patch
@@ -12,53 +12,53 @@
 block discarded – undo
12 12
 {
13 13
 
14 14
 
15
-    /**
16
-     * Overrides parent _delete() so that we do soft deletes.
17
-     *
18
-     * @return bool|int
19
-     */
20
-    protected function _delete()
21
-    {
22
-        return $this->delete_or_restore();
23
-    }
15
+	/**
16
+	 * Overrides parent _delete() so that we do soft deletes.
17
+	 *
18
+	 * @return bool|int
19
+	 */
20
+	protected function _delete()
21
+	{
22
+		return $this->delete_or_restore();
23
+	}
24 24
 
25 25
 
26
-    /**
27
-     * Deletes or restores this object.
28
-     *
29
-     * @param bool $delete true=>delete, false=>restore
30
-     * @return bool|int
31
-     */
32
-    public function delete_or_restore($delete = true)
33
-    {
34
-        /**
35
-         * Called just before trashing (soft delete) or restoring a trashed item.
36
-         *
37
-         * @param EE_Base_Class $model_object about to be trashed or restored
38
-         * @param bool          $delete       true the item is being trashed, false the item is being restored.
39
-         */
40
-        do_action('AHEE__EE_Soft_Delete_Base_Class__delete_or_restore__before', $this, $delete);
41
-        $model = $this->get_model();
42
-        $result = $model->delete_or_restore_by_ID($delete, $this->ID());
43
-        /**
44
-         * Called just after trashing (soft delete) or restoring a trashed item.
45
-         *
46
-         * @param EE_Base_Class $model_object that was just trashed or restored.
47
-         * @param bool          $delete       true the item is being trashed, false the item is being restored.
48
-         * @param bool|int      $result
49
-         */
50
-        do_action('AHEE__EE_Soft_Delete_Base_Class__delete_or_restore__after', $this, $delete, $result);
51
-        return $result;
52
-    }
26
+	/**
27
+	 * Deletes or restores this object.
28
+	 *
29
+	 * @param bool $delete true=>delete, false=>restore
30
+	 * @return bool|int
31
+	 */
32
+	public function delete_or_restore($delete = true)
33
+	{
34
+		/**
35
+		 * Called just before trashing (soft delete) or restoring a trashed item.
36
+		 *
37
+		 * @param EE_Base_Class $model_object about to be trashed or restored
38
+		 * @param bool          $delete       true the item is being trashed, false the item is being restored.
39
+		 */
40
+		do_action('AHEE__EE_Soft_Delete_Base_Class__delete_or_restore__before', $this, $delete);
41
+		$model = $this->get_model();
42
+		$result = $model->delete_or_restore_by_ID($delete, $this->ID());
43
+		/**
44
+		 * Called just after trashing (soft delete) or restoring a trashed item.
45
+		 *
46
+		 * @param EE_Base_Class $model_object that was just trashed or restored.
47
+		 * @param bool          $delete       true the item is being trashed, false the item is being restored.
48
+		 * @param bool|int      $result
49
+		 */
50
+		do_action('AHEE__EE_Soft_Delete_Base_Class__delete_or_restore__after', $this, $delete, $result);
51
+		return $result;
52
+	}
53 53
 
54 54
 
55
-    /**
56
-     * Performs a restoration (un-deletes) this object
57
-     *
58
-     * @return bool|int
59
-     */
60
-    public function restore()
61
-    {
62
-        return $this->delete_or_restore(false);
63
-    }
55
+	/**
56
+	 * Performs a restoration (un-deletes) this object
57
+	 *
58
+	 * @return bool|int
59
+	 */
60
+	public function restore()
61
+	{
62
+		return $this->delete_or_restore(false);
63
+	}
64 64
 }
Please login to merge, or discard this patch.