@@ -24,767 +24,767 @@ |
||
24 | 24 | class EE_Registration_Processor extends EE_Processor_Base |
25 | 25 | { |
26 | 26 | |
27 | - /** |
|
28 | - * @var EE_Registration_Processor $_instance |
|
29 | - * @access private |
|
30 | - */ |
|
31 | - private static $_instance; |
|
32 | - |
|
33 | - /** |
|
34 | - * initial reg status at the beginning of this request. |
|
35 | - * indexed by registration ID |
|
36 | - * |
|
37 | - * @var array |
|
38 | - */ |
|
39 | - protected $_old_reg_status = array(); |
|
40 | - |
|
41 | - /** |
|
42 | - * reg status at the end of the request after all processing. |
|
43 | - * indexed by registration ID |
|
44 | - * |
|
45 | - * @var array |
|
46 | - */ |
|
47 | - protected $_new_reg_status = array(); |
|
48 | - |
|
49 | - /** |
|
50 | - * amounts paid at the end of the request after all processing. |
|
51 | - * indexed by registration ID |
|
52 | - * |
|
53 | - * @var array |
|
54 | - */ |
|
55 | - protected static $_amount_paid = array(); |
|
56 | - |
|
57 | - /** |
|
58 | - * Cache of the reg final price for registrations corresponding to a ticket line item |
|
59 | - * |
|
60 | - * @deprecated |
|
61 | - * @var array @see EEH_Line_Item::calculate_reg_final_prices_per_line_item()'s return value |
|
62 | - */ |
|
63 | - protected $_reg_final_price_per_tkt_line_item; |
|
64 | - |
|
65 | - /** |
|
66 | - * @var EE_Request $request |
|
67 | - */ |
|
68 | - protected $request; |
|
69 | - |
|
70 | - |
|
71 | - /** |
|
72 | - * @singleton method used to instantiate class object |
|
73 | - * @param EE_Request|null $request |
|
74 | - * @return EE_Registration_Processor instance |
|
75 | - * @throws \InvalidArgumentException |
|
76 | - * @throws \EventEspresso\core\exceptions\InvalidInterfaceException |
|
77 | - * @throws \EventEspresso\core\exceptions\InvalidDataTypeException |
|
78 | - */ |
|
79 | - public static function instance(EE_Request $request = null) |
|
80 | - { |
|
81 | - // check if class object is instantiated |
|
82 | - if (! self::$_instance instanceof EE_Registration_Processor) { |
|
83 | - if (! $request instanceof EE_Request) { |
|
84 | - $request = LoaderFactory::getLoader()->getShared('EE_Request'); |
|
85 | - } |
|
86 | - self::$_instance = new self($request); |
|
87 | - } |
|
88 | - return self::$_instance; |
|
89 | - } |
|
90 | - |
|
91 | - |
|
92 | - /** |
|
93 | - * EE_Registration_Processor constructor. |
|
94 | - * |
|
95 | - * @param EE_Request $request |
|
96 | - */ |
|
97 | - public function __construct(EE_Request $request) |
|
98 | - { |
|
99 | - $this->request = $request; |
|
100 | - } |
|
101 | - |
|
102 | - |
|
103 | - /** |
|
104 | - * @param int $REG_ID |
|
105 | - * @return string |
|
106 | - */ |
|
107 | - public function old_reg_status($REG_ID) |
|
108 | - { |
|
109 | - return isset($this->_old_reg_status[ $REG_ID ]) ? $this->_old_reg_status[ $REG_ID ] : null; |
|
110 | - } |
|
111 | - |
|
112 | - |
|
113 | - /** |
|
114 | - * @param int $REG_ID |
|
115 | - * @param string $old_reg_status |
|
116 | - */ |
|
117 | - public function set_old_reg_status($REG_ID, $old_reg_status) |
|
118 | - { |
|
119 | - // only set the first time |
|
120 | - if (! isset($this->_old_reg_status[ $REG_ID ])) { |
|
121 | - $this->_old_reg_status[ $REG_ID ] = $old_reg_status; |
|
122 | - } |
|
123 | - } |
|
124 | - |
|
125 | - |
|
126 | - /** |
|
127 | - * @param int $REG_ID |
|
128 | - * @return string |
|
129 | - */ |
|
130 | - public function new_reg_status($REG_ID) |
|
131 | - { |
|
132 | - return isset($this->_new_reg_status[ $REG_ID ]) ? $this->_new_reg_status[ $REG_ID ] : null; |
|
133 | - } |
|
134 | - |
|
135 | - |
|
136 | - /** |
|
137 | - * @param int $REG_ID |
|
138 | - * @param string $new_reg_status |
|
139 | - */ |
|
140 | - public function set_new_reg_status($REG_ID, $new_reg_status) |
|
141 | - { |
|
142 | - $this->_new_reg_status[ $REG_ID ] = $new_reg_status; |
|
143 | - } |
|
144 | - |
|
145 | - |
|
146 | - /** |
|
147 | - * reg_status_updated |
|
148 | - * |
|
149 | - * @param int $REG_ID |
|
150 | - * @return bool |
|
151 | - */ |
|
152 | - public function reg_status_updated($REG_ID) |
|
153 | - { |
|
154 | - return $this->new_reg_status($REG_ID) !== $this->old_reg_status($REG_ID); |
|
155 | - } |
|
156 | - |
|
157 | - |
|
158 | - /** |
|
159 | - * @param EE_Registration $registration |
|
160 | - * @throws EE_Error |
|
161 | - * @throws EntityNotFoundException |
|
162 | - * @throws InvalidArgumentException |
|
163 | - * @throws InvalidDataTypeException |
|
164 | - * @throws InvalidInterfaceException |
|
165 | - * @throws ReflectionException |
|
166 | - * @throws RuntimeException |
|
167 | - */ |
|
168 | - public function update_registration_status_and_trigger_notifications(EE_Registration $registration) |
|
169 | - { |
|
170 | - $this->toggle_incomplete_registration_status_to_default($registration, false); |
|
171 | - $this->toggle_registration_status_for_default_approved_events($registration, false); |
|
172 | - $this->toggle_registration_status_if_no_monies_owing($registration, false); |
|
173 | - $registration->save(); |
|
174 | - // trigger notifications |
|
175 | - $this->trigger_registration_update_notifications($registration); |
|
176 | - } |
|
177 | - |
|
178 | - |
|
179 | - /** |
|
180 | - * manually_update_registration_status |
|
181 | - * |
|
182 | - * @access public |
|
183 | - * @param EE_Registration $registration |
|
184 | - * @param string $new_reg_status |
|
185 | - * @param bool $save TRUE will save the registration if the status is updated, FALSE will leave that up |
|
186 | - * to client code |
|
187 | - * @return bool |
|
188 | - * @throws EE_Error |
|
189 | - * @throws EntityNotFoundException |
|
190 | - * @throws InvalidArgumentException |
|
191 | - * @throws InvalidDataTypeException |
|
192 | - * @throws InvalidInterfaceException |
|
193 | - * @throws ReflectionException |
|
194 | - * @throws RuntimeException |
|
195 | - */ |
|
196 | - public function manually_update_registration_status( |
|
197 | - EE_Registration $registration, |
|
198 | - $new_reg_status = '', |
|
199 | - $save = true |
|
200 | - ) { |
|
201 | - // set initial REG_Status |
|
202 | - $this->set_old_reg_status($registration->ID(), $registration->status_ID()); |
|
203 | - // set incoming REG_Status |
|
204 | - $this->set_new_reg_status($registration->ID(), $new_reg_status); |
|
205 | - // toggle reg status but only if it has changed and the user can do so |
|
206 | - if ($this->reg_status_updated($registration->ID()) |
|
207 | - && ( |
|
208 | - (! $this->request->isAdmin() || $this->request->isFrontAjax()) |
|
209 | - || EE_Registry::instance()->CAP->current_user_can( |
|
210 | - 'ee_edit_registration', |
|
211 | - 'toggle_registration_status', |
|
212 | - $registration->ID() |
|
213 | - ) |
|
214 | - ) |
|
215 | - ) { |
|
216 | - // change status to new value |
|
217 | - $updated = $registration->set_status($this->new_reg_status($registration->ID())); |
|
218 | - if ($updated && $save) { |
|
219 | - $registration->save(); |
|
220 | - } |
|
221 | - return true; |
|
222 | - } |
|
223 | - return false; |
|
224 | - } |
|
225 | - |
|
226 | - |
|
227 | - /** |
|
228 | - * toggle_incomplete_registration_status_to_default |
|
229 | - * changes any incomplete registrations to either the event or global default registration status |
|
230 | - * |
|
231 | - * @access public |
|
232 | - * @param EE_Registration $registration |
|
233 | - * @param bool $save TRUE will save the registration if the status is updated, FALSE will leave |
|
234 | - * that up to client code |
|
235 | - * @param ContextInterface|null $context |
|
236 | - * @return void |
|
237 | - * @throws EE_Error |
|
238 | - * @throws InvalidArgumentException |
|
239 | - * @throws ReflectionException |
|
240 | - * @throws RuntimeException |
|
241 | - * @throws EntityNotFoundException |
|
242 | - * @throws InvalidDataTypeException |
|
243 | - * @throws InvalidInterfaceException |
|
244 | - */ |
|
245 | - public function toggle_incomplete_registration_status_to_default( |
|
246 | - EE_Registration $registration, |
|
247 | - $save = true, |
|
248 | - ContextInterface $context = null |
|
249 | - ) { |
|
250 | - $existing_reg_status = $registration->status_ID(); |
|
251 | - // set initial REG_Status |
|
252 | - $this->set_old_reg_status($registration->ID(), $existing_reg_status); |
|
253 | - // is the registration currently incomplete ? |
|
254 | - if ($registration->status_ID() === EEM_Registration::status_id_incomplete) { |
|
255 | - // grab default reg status for the event, if set |
|
256 | - $event_default_registration_status = $registration->event()->default_registration_status(); |
|
257 | - // if no default reg status is set for the event, then use the global value |
|
258 | - $STS_ID = ! empty($event_default_registration_status) |
|
259 | - ? $event_default_registration_status |
|
260 | - : EE_Registry::instance()->CFG->registration->default_STS_ID; |
|
261 | - // if the event default reg status is approved, then downgrade temporarily to payment pending to ensure that payments are triggered |
|
262 | - $STS_ID = $STS_ID === EEM_Registration::status_id_approved ? EEM_Registration::status_id_pending_payment |
|
263 | - : $STS_ID; |
|
264 | - // set incoming REG_Status |
|
265 | - $this->set_new_reg_status($registration->ID(), $STS_ID); |
|
266 | - $registration->set_status($STS_ID, false, $context); |
|
267 | - if ($save) { |
|
268 | - $registration->save(); |
|
269 | - } |
|
270 | - // don't trigger notifications during IPNs because they will get triggered by EE_Payment_Processor |
|
271 | - if (! EE_Processor_Base::$IPN) { |
|
272 | - // otherwise, send out notifications |
|
273 | - add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10); |
|
274 | - } |
|
275 | - // DEBUG LOG |
|
276 | - // $this->log( |
|
277 | - // __CLASS__, |
|
278 | - // __FUNCTION__, |
|
279 | - // __LINE__, |
|
280 | - // $registration->transaction(), |
|
281 | - // array( |
|
282 | - // 'IPN' => EE_Processor_Base::$IPN, |
|
283 | - // 'deliver_notifications' => has_filter( |
|
284 | - // 'FHEE__EED_Messages___maybe_registration__deliver_notifications' |
|
285 | - // ), |
|
286 | - // ) |
|
287 | - // ); |
|
288 | - } |
|
289 | - } |
|
290 | - |
|
291 | - |
|
292 | - /** |
|
293 | - * toggle_registration_status_for_default_approved_events |
|
294 | - * |
|
295 | - * @access public |
|
296 | - * @param EE_Registration $registration |
|
297 | - * @param bool $save TRUE will save the registration if the status is updated, FALSE will leave that up |
|
298 | - * to client code |
|
299 | - * @return bool |
|
300 | - * @throws EE_Error |
|
301 | - * @throws EntityNotFoundException |
|
302 | - * @throws InvalidArgumentException |
|
303 | - * @throws InvalidDataTypeException |
|
304 | - * @throws InvalidInterfaceException |
|
305 | - * @throws ReflectionException |
|
306 | - * @throws RuntimeException |
|
307 | - */ |
|
308 | - public function toggle_registration_status_for_default_approved_events(EE_Registration $registration, $save = true) |
|
309 | - { |
|
310 | - $reg_status = $registration->status_ID(); |
|
311 | - // set initial REG_Status |
|
312 | - $this->set_old_reg_status($registration->ID(), $reg_status); |
|
313 | - // if not already, toggle reg status to approved IF the event default reg status is approved |
|
314 | - // ( as long as the registration wasn't cancelled or declined at some point ) |
|
315 | - if ($reg_status !== EEM_Registration::status_id_cancelled |
|
316 | - && $reg_status |
|
317 | - !== EEM_Registration::status_id_declined |
|
318 | - && $reg_status !== EEM_Registration::status_id_approved |
|
319 | - && $registration->event()->default_registration_status() === EEM_Registration::status_id_approved |
|
320 | - ) { |
|
321 | - // set incoming REG_Status |
|
322 | - $this->set_new_reg_status($registration->ID(), EEM_Registration::status_id_approved); |
|
323 | - // toggle status to approved |
|
324 | - $registration->set_status(EEM_Registration::status_id_approved); |
|
325 | - if ($save) { |
|
326 | - $registration->save(); |
|
327 | - } |
|
328 | - // don't trigger notifications during IPNs because they will get triggered by EE_Payment_Processor |
|
329 | - if (! EE_Processor_Base::$IPN) { |
|
330 | - // otherwise, send out notifications |
|
331 | - add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10); |
|
332 | - } |
|
333 | - // DEBUG LOG |
|
334 | - // $this->log( |
|
335 | - // __CLASS__, |
|
336 | - // __FUNCTION__, |
|
337 | - // __LINE__, |
|
338 | - // $registration->transaction(), |
|
339 | - // array( |
|
340 | - // 'IPN' => EE_Processor_Base::$IPN, |
|
341 | - // 'deliver_notifications' => has_filter( |
|
342 | - // 'FHEE__EED_Messages___maybe_registration__deliver_notifications' |
|
343 | - // ), |
|
344 | - // ) |
|
345 | - // ); |
|
346 | - return true; |
|
347 | - } |
|
348 | - return false; |
|
349 | - } |
|
350 | - |
|
351 | - |
|
352 | - /** |
|
353 | - * toggle_registration_statuses_if_no_monies_owing |
|
354 | - * |
|
355 | - * @access public |
|
356 | - * @param EE_Registration $registration |
|
357 | - * @param bool $save TRUE will save the registration if the status is updated, FALSE will leave that up |
|
358 | - * to client code |
|
359 | - * @param array $additional_details |
|
360 | - * @return bool |
|
361 | - * @throws EE_Error |
|
362 | - * @throws EntityNotFoundException |
|
363 | - * @throws InvalidArgumentException |
|
364 | - * @throws InvalidDataTypeException |
|
365 | - * @throws InvalidInterfaceException |
|
366 | - * @throws ReflectionException |
|
367 | - * @throws RuntimeException |
|
368 | - */ |
|
369 | - public function toggle_registration_status_if_no_monies_owing( |
|
370 | - EE_Registration $registration, |
|
371 | - $save = true, |
|
372 | - array $additional_details = array() |
|
373 | - ) { |
|
374 | - // set initial REG_Status |
|
375 | - $this->set_old_reg_status($registration->ID(), $registration->status_ID()); |
|
376 | - // was a payment just made ? |
|
377 | - $payment = isset($additional_details['payment_updates'], $additional_details['last_payment']) |
|
378 | - && $additional_details['payment_updates'] |
|
379 | - && $additional_details['last_payment'] instanceof EE_Payment |
|
380 | - ? $additional_details['last_payment'] |
|
381 | - : null; |
|
382 | - $total_paid = array_sum(self::$_amount_paid); |
|
383 | - // toggle reg status to approved IF |
|
384 | - if (// REG status is pending payment |
|
385 | - $registration->status_ID() === EEM_Registration::status_id_pending_payment |
|
386 | - // AND no monies are owing |
|
387 | - && ( |
|
388 | - ( |
|
389 | - $registration->transaction()->is_completed() |
|
390 | - || $registration->transaction()->is_overpaid() |
|
391 | - || $registration->transaction()->is_free() |
|
392 | - || apply_filters( |
|
393 | - 'FHEE__EE_Registration_Processor__toggle_registration_status_if_no_monies_owing', |
|
394 | - false, |
|
395 | - $registration |
|
396 | - ) |
|
397 | - ) |
|
398 | - || ( |
|
399 | - $payment instanceof EE_Payment && $payment->is_approved() |
|
400 | - && // this specific registration has not yet been paid for |
|
401 | - ! isset(self::$_amount_paid[ $registration->ID() ]) |
|
402 | - && // payment amount, less what we have already attributed to other registrations, is greater than this reg's final price |
|
403 | - $payment->amount() - $total_paid >= $registration->final_price() |
|
404 | - ) |
|
405 | - ) |
|
406 | - ) { |
|
407 | - // mark as paid |
|
408 | - self::$_amount_paid[ $registration->ID() ] = $registration->final_price(); |
|
409 | - // track new REG_Status |
|
410 | - $this->set_new_reg_status($registration->ID(), EEM_Registration::status_id_approved); |
|
411 | - // toggle status to approved |
|
412 | - $registration->set_status(EEM_Registration::status_id_approved); |
|
413 | - if ($save) { |
|
414 | - $registration->save(); |
|
415 | - } |
|
416 | - // don't trigger notifications during IPNs because they will get triggered by EE_Payment_Processor |
|
417 | - if (! EE_Processor_Base::$IPN) { |
|
418 | - // otherwise, send out notifications |
|
419 | - add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10); |
|
420 | - } |
|
421 | - // DEBUG LOG |
|
422 | - // $this->log( |
|
423 | - // __CLASS__, |
|
424 | - // __FUNCTION__, |
|
425 | - // __LINE__, |
|
426 | - // $registration->transaction(), |
|
427 | - // array( |
|
428 | - // 'IPN' => EE_Processor_Base::$IPN, |
|
429 | - // 'deliver_notifications' => has_filter( |
|
430 | - // 'FHEE__EED_Messages___maybe_registration__deliver_notifications' |
|
431 | - // ), |
|
432 | - // ) |
|
433 | - // ); |
|
434 | - return true; |
|
435 | - } |
|
436 | - return false; |
|
437 | - } |
|
438 | - |
|
439 | - |
|
440 | - /** |
|
441 | - * registration_status_changed |
|
442 | - * |
|
443 | - * @access public |
|
444 | - * @param EE_Registration $registration |
|
445 | - * @param array $additional_details |
|
446 | - * @return void |
|
447 | - */ |
|
448 | - public function trigger_registration_update_notifications($registration, array $additional_details = array()) |
|
449 | - { |
|
450 | - try { |
|
451 | - if (! $registration instanceof EE_Registration) { |
|
452 | - throw new EE_Error( |
|
453 | - esc_html__('An invalid registration was received.', 'event_espresso') |
|
454 | - ); |
|
455 | - } |
|
456 | - // EE_Registry::instance()->load_helper('Debug_Tools'); |
|
457 | - // EEH_Debug_Tools::log( |
|
458 | - // __CLASS__, |
|
459 | - // __FUNCTION__, |
|
460 | - // __LINE__, |
|
461 | - // array($registration->transaction(), $additional_details), |
|
462 | - // false, |
|
463 | - // 'EE_Transaction: ' . $registration->transaction()->ID() |
|
464 | - // ); |
|
465 | - if (! $registration->is_primary_registrant()) { |
|
466 | - return; |
|
467 | - } |
|
468 | - do_action( |
|
469 | - 'AHEE__EE_Registration_Processor__trigger_registration_update_notifications', |
|
470 | - $registration, |
|
471 | - $additional_details |
|
472 | - ); |
|
473 | - } catch (Exception $e) { |
|
474 | - EE_Error::add_error($e->getMessage(), $e->getFile(), 'unknown_function_from_exception', $e->getLine()); |
|
475 | - } |
|
476 | - } |
|
477 | - |
|
478 | - |
|
479 | - /** |
|
480 | - * sets reg status based either on passed param or on transaction status and event pre-approval setting |
|
481 | - * |
|
482 | - * @param EE_Registration $registration |
|
483 | - * @param array $additional_details |
|
484 | - * @return bool |
|
485 | - * @throws EE_Error |
|
486 | - * @throws EntityNotFoundException |
|
487 | - * @throws InvalidArgumentException |
|
488 | - * @throws InvalidDataTypeException |
|
489 | - * @throws InvalidInterfaceException |
|
490 | - * @throws ReflectionException |
|
491 | - * @throws RuntimeException |
|
492 | - */ |
|
493 | - public function update_registration_after_checkout_or_payment( |
|
494 | - EE_Registration $registration, |
|
495 | - array $additional_details = array() |
|
496 | - ) { |
|
497 | - // set initial REG_Status |
|
498 | - $this->set_old_reg_status($registration->ID(), $registration->status_ID()); |
|
499 | - // if the registration status gets updated, then save the registration |
|
500 | - if ($this->toggle_registration_status_for_default_approved_events($registration, false) |
|
501 | - || $this->toggle_registration_status_if_no_monies_owing( |
|
502 | - $registration, |
|
503 | - false, |
|
504 | - $additional_details |
|
505 | - ) |
|
506 | - ) { |
|
507 | - $registration->save(); |
|
508 | - } |
|
509 | - // set new REG_Status |
|
510 | - $this->set_new_reg_status($registration->ID(), $registration->status_ID()); |
|
511 | - return $this->reg_status_updated($registration->ID()) |
|
512 | - && $this->new_reg_status($registration->ID()) === EEM_Registration::status_id_approved; |
|
513 | - } |
|
514 | - |
|
515 | - |
|
516 | - /** |
|
517 | - * Updates the registration' final prices based on the current line item tree (taking into account |
|
518 | - * discounts, taxes, and other line items unrelated to tickets.) |
|
519 | - * |
|
520 | - * @param EE_Transaction $transaction |
|
521 | - * @param boolean $save_regs whether to immediately save registrations in this function or not |
|
522 | - * @return void |
|
523 | - * @throws EE_Error |
|
524 | - * @throws InvalidArgumentException |
|
525 | - * @throws InvalidDataTypeException |
|
526 | - * @throws InvalidInterfaceException |
|
527 | - * @throws RuntimeException |
|
528 | - */ |
|
529 | - public function update_registration_final_prices($transaction, $save_regs = true) |
|
530 | - { |
|
531 | - $reg_final_price_per_ticket_line_item = EEH_Line_Item::calculate_reg_final_prices_per_line_item( |
|
532 | - $transaction->total_line_item() |
|
533 | - ); |
|
534 | - foreach ($transaction->registrations() as $registration) { |
|
535 | - /** @var EE_Line_Item $line_item */ |
|
536 | - $line_item = EEM_Line_Item::instance()->get_line_item_for_registration($registration); |
|
537 | - if (isset($reg_final_price_per_ticket_line_item[ $line_item->ID() ])) { |
|
538 | - $registration->set_final_price($reg_final_price_per_ticket_line_item[ $line_item->ID() ]); |
|
539 | - if ($save_regs) { |
|
540 | - $registration->save(); |
|
541 | - } |
|
542 | - } |
|
543 | - } |
|
544 | - // and make sure there's no rounding problem |
|
545 | - $this->fix_reg_final_price_rounding_issue($transaction); |
|
546 | - } |
|
547 | - |
|
548 | - |
|
549 | - /** |
|
550 | - * Makes sure there is no rounding errors for the REG_final_prices. |
|
551 | - * Eg, if we have 3 registrations for $1, and there is a $0.01 discount between the three of them, |
|
552 | - * they will each be for $0.99333333, which gets rounded to $1 again. |
|
553 | - * So the transaction total will be $2.99, but each registration will be for $1, |
|
554 | - * so if each registrant paid individually they will have overpaid by $0.01. |
|
555 | - * So in order to overcome this, we check for any difference, and if there is a difference |
|
556 | - * we just grab one registrant at random and make them responsible for it. |
|
557 | - * This should be used after setting REG_final_prices (it's done automatically as part of |
|
558 | - * EE_Registration_Processor::update_registration_final_prices()) |
|
559 | - * |
|
560 | - * @param EE_Transaction $transaction |
|
561 | - * @return bool success verifying that there is NO difference after this method is done |
|
562 | - * @throws EE_Error |
|
563 | - * @throws InvalidArgumentException |
|
564 | - * @throws InvalidDataTypeException |
|
565 | - * @throws InvalidInterfaceException |
|
566 | - */ |
|
567 | - public function fix_reg_final_price_rounding_issue($transaction) |
|
568 | - { |
|
569 | - $reg_final_price_sum = EEM_Registration::instance()->sum( |
|
570 | - array( |
|
571 | - array( |
|
572 | - 'TXN_ID' => $transaction->ID(), |
|
573 | - ), |
|
574 | - ), |
|
575 | - 'REG_final_price' |
|
576 | - ); |
|
577 | - $diff = $transaction->total() - $reg_final_price_sum; |
|
578 | - // ok then, just grab one of the registrations |
|
579 | - if ($diff !== 0) { |
|
580 | - $a_reg = EEM_Registration::instance()->get_one( |
|
581 | - array( |
|
582 | - array( |
|
583 | - 'TXN_ID' => $transaction->ID(), |
|
584 | - ), |
|
585 | - ) |
|
586 | - ); |
|
587 | - return $a_reg instanceof EE_Registration |
|
588 | - ? (bool) $a_reg->save(array('REG_final_price' => $a_reg->final_price() + $diff)) |
|
589 | - : false; |
|
590 | - } |
|
591 | - return true; |
|
592 | - } |
|
593 | - |
|
594 | - |
|
595 | - /** |
|
596 | - * update_registration_after_being_canceled_or_declined |
|
597 | - * |
|
598 | - * @param EE_Registration $registration |
|
599 | - * @param array $closed_reg_statuses |
|
600 | - * @param bool $update_reg |
|
601 | - * @return bool |
|
602 | - * @throws EE_Error |
|
603 | - * @throws RuntimeException |
|
604 | - */ |
|
605 | - public function update_registration_after_being_canceled_or_declined( |
|
606 | - EE_Registration $registration, |
|
607 | - array $closed_reg_statuses = array(), |
|
608 | - $update_reg = true |
|
609 | - ) { |
|
610 | - // these reg statuses should not be considered in any calculations involving monies owing |
|
611 | - $closed_reg_statuses = ! empty($closed_reg_statuses) |
|
612 | - ? $closed_reg_statuses |
|
613 | - : EEM_Registration::closed_reg_statuses(); |
|
614 | - if (! in_array($registration->status_ID(), $closed_reg_statuses, true)) { |
|
615 | - return false; |
|
616 | - } |
|
617 | - // release a reserved ticket by decrementing ticket and datetime reserved values |
|
618 | - $registration->release_reserved_ticket(true, 'RegProcessor:' . __LINE__); |
|
619 | - $registration->set_final_price(0); |
|
620 | - if ($update_reg) { |
|
621 | - $registration->save(); |
|
622 | - } |
|
623 | - return true; |
|
624 | - } |
|
625 | - |
|
626 | - |
|
627 | - /** |
|
628 | - * update_canceled_or_declined_registration_after_being_reinstated |
|
629 | - * |
|
630 | - * @param EE_Registration $registration |
|
631 | - * @param array $closed_reg_statuses |
|
632 | - * @param bool $update_reg |
|
633 | - * @return bool |
|
634 | - * @throws EE_Error |
|
635 | - * @throws RuntimeException |
|
636 | - */ |
|
637 | - public function update_canceled_or_declined_registration_after_being_reinstated( |
|
638 | - EE_Registration $registration, |
|
639 | - array $closed_reg_statuses = array(), |
|
640 | - $update_reg = true |
|
641 | - ) { |
|
642 | - // these reg statuses should not be considered in any calculations involving monies owing |
|
643 | - $closed_reg_statuses = ! empty($closed_reg_statuses) ? $closed_reg_statuses |
|
644 | - : EEM_Registration::closed_reg_statuses(); |
|
645 | - if (in_array($registration->status_ID(), $closed_reg_statuses, true)) { |
|
646 | - return false; |
|
647 | - } |
|
648 | - $ticket = $registration->ticket(); |
|
649 | - if (! $ticket instanceof EE_Ticket) { |
|
650 | - throw new EE_Error( |
|
651 | - sprintf( |
|
652 | - esc_html__( |
|
653 | - 'The Ticket for Registration %1$d was not found or is invalid.', |
|
654 | - 'event_espresso' |
|
655 | - ), |
|
656 | - $registration->ticket_ID() |
|
657 | - ) |
|
658 | - ); |
|
659 | - } |
|
660 | - $registration->set_final_price($ticket->price()); |
|
661 | - if ($update_reg) { |
|
662 | - $registration->save(); |
|
663 | - } |
|
664 | - return true; |
|
665 | - } |
|
666 | - |
|
667 | - |
|
668 | - /** |
|
669 | - * generate_ONE_registration_from_line_item |
|
670 | - * Although a ticket line item may have a quantity greater than 1, |
|
671 | - * this method will ONLY CREATE ONE REGISTRATION !!! |
|
672 | - * Regardless of the ticket line item quantity. |
|
673 | - * This means that any code calling this method is responsible for ensuring |
|
674 | - * that the final registration count matches the ticket line item quantity. |
|
675 | - * This was done to make it easier to match the number of registrations |
|
676 | - * to the number of tickets in the cart, when the cart has been edited |
|
677 | - * after SPCO has already been initialized. So if an additional ticket was added to the cart, you can simply pass |
|
678 | - * the line item to this method to add a second ticket, and in this case, you would not want to add 2 tickets. |
|
679 | - * |
|
680 | - * @deprecated |
|
681 | - * @since 4.9.1 |
|
682 | - * @param EE_Line_Item $line_item |
|
683 | - * @param \EE_Transaction $transaction |
|
684 | - * @param int $att_nmbr |
|
685 | - * @param int $total_ticket_count |
|
686 | - * @return EE_Registration | null |
|
687 | - * @throws \OutOfRangeException |
|
688 | - * @throws \EventEspresso\core\exceptions\UnexpectedEntityException |
|
689 | - * @throws \EE_Error |
|
690 | - */ |
|
691 | - public function generate_ONE_registration_from_line_item( |
|
692 | - EE_Line_Item $line_item, |
|
693 | - EE_Transaction $transaction, |
|
694 | - $att_nmbr = 1, |
|
695 | - $total_ticket_count = 1 |
|
696 | - ) { |
|
697 | - EE_Error::doing_it_wrong( |
|
698 | - __CLASS__ . '::' . __FUNCTION__, |
|
699 | - sprintf( |
|
700 | - esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'), |
|
701 | - '\EventEspresso\core\domain\services\registration\CreateRegistrationService::create()' |
|
702 | - ), |
|
703 | - '4.9.1', |
|
704 | - '5.0.0' |
|
705 | - ); |
|
706 | - // grab the related ticket object for this line_item |
|
707 | - $ticket = $line_item->ticket(); |
|
708 | - if (! $ticket instanceof EE_Ticket) { |
|
709 | - EE_Error::add_error( |
|
710 | - sprintf( |
|
711 | - esc_html__('Line item %s did not contain a valid ticket', 'event_espresso'), |
|
712 | - $line_item->ID() |
|
713 | - ), |
|
714 | - __FILE__, |
|
715 | - __FUNCTION__, |
|
716 | - __LINE__ |
|
717 | - ); |
|
718 | - return null; |
|
719 | - } |
|
720 | - $registration_service = new CreateRegistrationService(); |
|
721 | - // then generate a new registration from that |
|
722 | - return $registration_service->create( |
|
723 | - $ticket->get_related_event(), |
|
724 | - $transaction, |
|
725 | - $ticket, |
|
726 | - $line_item, |
|
727 | - $att_nmbr, |
|
728 | - $total_ticket_count |
|
729 | - ); |
|
730 | - } |
|
731 | - |
|
732 | - |
|
733 | - /** |
|
734 | - * generates reg_url_link |
|
735 | - * |
|
736 | - * @deprecated |
|
737 | - * @since 4.9.1 |
|
738 | - * @param int $att_nmbr |
|
739 | - * @param EE_Line_Item | string $item |
|
740 | - * @return string |
|
741 | - * @throws InvalidArgumentException |
|
742 | - */ |
|
743 | - public function generate_reg_url_link($att_nmbr, $item) |
|
744 | - { |
|
745 | - EE_Error::doing_it_wrong( |
|
746 | - __CLASS__ . '::' . __FUNCTION__, |
|
747 | - sprintf( |
|
748 | - esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'), |
|
749 | - 'EventEspresso\core\domain\entities\RegUrlLink' |
|
750 | - ), |
|
751 | - '4.9.1', |
|
752 | - '5.0.0' |
|
753 | - ); |
|
754 | - return new RegUrlLink($att_nmbr, $item); |
|
755 | - } |
|
756 | - |
|
757 | - |
|
758 | - /** |
|
759 | - * generates reg code |
|
760 | - * |
|
761 | - * @deprecated |
|
762 | - * @since 4.9.1 |
|
763 | - * @param EE_Registration $registration |
|
764 | - * @return string |
|
765 | - * @throws EE_Error |
|
766 | - * @throws EntityNotFoundException |
|
767 | - * @throws InvalidArgumentException |
|
768 | - */ |
|
769 | - public function generate_reg_code(EE_Registration $registration) |
|
770 | - { |
|
771 | - EE_Error::doing_it_wrong( |
|
772 | - __CLASS__ . '::' . __FUNCTION__, |
|
773 | - sprintf( |
|
774 | - esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'), |
|
775 | - 'EventEspresso\core\domain\entities\RegCode' |
|
776 | - ), |
|
777 | - '4.9.1', |
|
778 | - '5.0.0' |
|
779 | - ); |
|
780 | - return apply_filters( |
|
781 | - 'FHEE__EE_Registration_Processor___generate_reg_code__new_reg_code', |
|
782 | - new RegCode( |
|
783 | - RegUrlLink::fromRegistration($registration), |
|
784 | - $registration->transaction(), |
|
785 | - $registration->ticket() |
|
786 | - ), |
|
787 | - $registration |
|
788 | - ); |
|
789 | - } |
|
27 | + /** |
|
28 | + * @var EE_Registration_Processor $_instance |
|
29 | + * @access private |
|
30 | + */ |
|
31 | + private static $_instance; |
|
32 | + |
|
33 | + /** |
|
34 | + * initial reg status at the beginning of this request. |
|
35 | + * indexed by registration ID |
|
36 | + * |
|
37 | + * @var array |
|
38 | + */ |
|
39 | + protected $_old_reg_status = array(); |
|
40 | + |
|
41 | + /** |
|
42 | + * reg status at the end of the request after all processing. |
|
43 | + * indexed by registration ID |
|
44 | + * |
|
45 | + * @var array |
|
46 | + */ |
|
47 | + protected $_new_reg_status = array(); |
|
48 | + |
|
49 | + /** |
|
50 | + * amounts paid at the end of the request after all processing. |
|
51 | + * indexed by registration ID |
|
52 | + * |
|
53 | + * @var array |
|
54 | + */ |
|
55 | + protected static $_amount_paid = array(); |
|
56 | + |
|
57 | + /** |
|
58 | + * Cache of the reg final price for registrations corresponding to a ticket line item |
|
59 | + * |
|
60 | + * @deprecated |
|
61 | + * @var array @see EEH_Line_Item::calculate_reg_final_prices_per_line_item()'s return value |
|
62 | + */ |
|
63 | + protected $_reg_final_price_per_tkt_line_item; |
|
64 | + |
|
65 | + /** |
|
66 | + * @var EE_Request $request |
|
67 | + */ |
|
68 | + protected $request; |
|
69 | + |
|
70 | + |
|
71 | + /** |
|
72 | + * @singleton method used to instantiate class object |
|
73 | + * @param EE_Request|null $request |
|
74 | + * @return EE_Registration_Processor instance |
|
75 | + * @throws \InvalidArgumentException |
|
76 | + * @throws \EventEspresso\core\exceptions\InvalidInterfaceException |
|
77 | + * @throws \EventEspresso\core\exceptions\InvalidDataTypeException |
|
78 | + */ |
|
79 | + public static function instance(EE_Request $request = null) |
|
80 | + { |
|
81 | + // check if class object is instantiated |
|
82 | + if (! self::$_instance instanceof EE_Registration_Processor) { |
|
83 | + if (! $request instanceof EE_Request) { |
|
84 | + $request = LoaderFactory::getLoader()->getShared('EE_Request'); |
|
85 | + } |
|
86 | + self::$_instance = new self($request); |
|
87 | + } |
|
88 | + return self::$_instance; |
|
89 | + } |
|
90 | + |
|
91 | + |
|
92 | + /** |
|
93 | + * EE_Registration_Processor constructor. |
|
94 | + * |
|
95 | + * @param EE_Request $request |
|
96 | + */ |
|
97 | + public function __construct(EE_Request $request) |
|
98 | + { |
|
99 | + $this->request = $request; |
|
100 | + } |
|
101 | + |
|
102 | + |
|
103 | + /** |
|
104 | + * @param int $REG_ID |
|
105 | + * @return string |
|
106 | + */ |
|
107 | + public function old_reg_status($REG_ID) |
|
108 | + { |
|
109 | + return isset($this->_old_reg_status[ $REG_ID ]) ? $this->_old_reg_status[ $REG_ID ] : null; |
|
110 | + } |
|
111 | + |
|
112 | + |
|
113 | + /** |
|
114 | + * @param int $REG_ID |
|
115 | + * @param string $old_reg_status |
|
116 | + */ |
|
117 | + public function set_old_reg_status($REG_ID, $old_reg_status) |
|
118 | + { |
|
119 | + // only set the first time |
|
120 | + if (! isset($this->_old_reg_status[ $REG_ID ])) { |
|
121 | + $this->_old_reg_status[ $REG_ID ] = $old_reg_status; |
|
122 | + } |
|
123 | + } |
|
124 | + |
|
125 | + |
|
126 | + /** |
|
127 | + * @param int $REG_ID |
|
128 | + * @return string |
|
129 | + */ |
|
130 | + public function new_reg_status($REG_ID) |
|
131 | + { |
|
132 | + return isset($this->_new_reg_status[ $REG_ID ]) ? $this->_new_reg_status[ $REG_ID ] : null; |
|
133 | + } |
|
134 | + |
|
135 | + |
|
136 | + /** |
|
137 | + * @param int $REG_ID |
|
138 | + * @param string $new_reg_status |
|
139 | + */ |
|
140 | + public function set_new_reg_status($REG_ID, $new_reg_status) |
|
141 | + { |
|
142 | + $this->_new_reg_status[ $REG_ID ] = $new_reg_status; |
|
143 | + } |
|
144 | + |
|
145 | + |
|
146 | + /** |
|
147 | + * reg_status_updated |
|
148 | + * |
|
149 | + * @param int $REG_ID |
|
150 | + * @return bool |
|
151 | + */ |
|
152 | + public function reg_status_updated($REG_ID) |
|
153 | + { |
|
154 | + return $this->new_reg_status($REG_ID) !== $this->old_reg_status($REG_ID); |
|
155 | + } |
|
156 | + |
|
157 | + |
|
158 | + /** |
|
159 | + * @param EE_Registration $registration |
|
160 | + * @throws EE_Error |
|
161 | + * @throws EntityNotFoundException |
|
162 | + * @throws InvalidArgumentException |
|
163 | + * @throws InvalidDataTypeException |
|
164 | + * @throws InvalidInterfaceException |
|
165 | + * @throws ReflectionException |
|
166 | + * @throws RuntimeException |
|
167 | + */ |
|
168 | + public function update_registration_status_and_trigger_notifications(EE_Registration $registration) |
|
169 | + { |
|
170 | + $this->toggle_incomplete_registration_status_to_default($registration, false); |
|
171 | + $this->toggle_registration_status_for_default_approved_events($registration, false); |
|
172 | + $this->toggle_registration_status_if_no_monies_owing($registration, false); |
|
173 | + $registration->save(); |
|
174 | + // trigger notifications |
|
175 | + $this->trigger_registration_update_notifications($registration); |
|
176 | + } |
|
177 | + |
|
178 | + |
|
179 | + /** |
|
180 | + * manually_update_registration_status |
|
181 | + * |
|
182 | + * @access public |
|
183 | + * @param EE_Registration $registration |
|
184 | + * @param string $new_reg_status |
|
185 | + * @param bool $save TRUE will save the registration if the status is updated, FALSE will leave that up |
|
186 | + * to client code |
|
187 | + * @return bool |
|
188 | + * @throws EE_Error |
|
189 | + * @throws EntityNotFoundException |
|
190 | + * @throws InvalidArgumentException |
|
191 | + * @throws InvalidDataTypeException |
|
192 | + * @throws InvalidInterfaceException |
|
193 | + * @throws ReflectionException |
|
194 | + * @throws RuntimeException |
|
195 | + */ |
|
196 | + public function manually_update_registration_status( |
|
197 | + EE_Registration $registration, |
|
198 | + $new_reg_status = '', |
|
199 | + $save = true |
|
200 | + ) { |
|
201 | + // set initial REG_Status |
|
202 | + $this->set_old_reg_status($registration->ID(), $registration->status_ID()); |
|
203 | + // set incoming REG_Status |
|
204 | + $this->set_new_reg_status($registration->ID(), $new_reg_status); |
|
205 | + // toggle reg status but only if it has changed and the user can do so |
|
206 | + if ($this->reg_status_updated($registration->ID()) |
|
207 | + && ( |
|
208 | + (! $this->request->isAdmin() || $this->request->isFrontAjax()) |
|
209 | + || EE_Registry::instance()->CAP->current_user_can( |
|
210 | + 'ee_edit_registration', |
|
211 | + 'toggle_registration_status', |
|
212 | + $registration->ID() |
|
213 | + ) |
|
214 | + ) |
|
215 | + ) { |
|
216 | + // change status to new value |
|
217 | + $updated = $registration->set_status($this->new_reg_status($registration->ID())); |
|
218 | + if ($updated && $save) { |
|
219 | + $registration->save(); |
|
220 | + } |
|
221 | + return true; |
|
222 | + } |
|
223 | + return false; |
|
224 | + } |
|
225 | + |
|
226 | + |
|
227 | + /** |
|
228 | + * toggle_incomplete_registration_status_to_default |
|
229 | + * changes any incomplete registrations to either the event or global default registration status |
|
230 | + * |
|
231 | + * @access public |
|
232 | + * @param EE_Registration $registration |
|
233 | + * @param bool $save TRUE will save the registration if the status is updated, FALSE will leave |
|
234 | + * that up to client code |
|
235 | + * @param ContextInterface|null $context |
|
236 | + * @return void |
|
237 | + * @throws EE_Error |
|
238 | + * @throws InvalidArgumentException |
|
239 | + * @throws ReflectionException |
|
240 | + * @throws RuntimeException |
|
241 | + * @throws EntityNotFoundException |
|
242 | + * @throws InvalidDataTypeException |
|
243 | + * @throws InvalidInterfaceException |
|
244 | + */ |
|
245 | + public function toggle_incomplete_registration_status_to_default( |
|
246 | + EE_Registration $registration, |
|
247 | + $save = true, |
|
248 | + ContextInterface $context = null |
|
249 | + ) { |
|
250 | + $existing_reg_status = $registration->status_ID(); |
|
251 | + // set initial REG_Status |
|
252 | + $this->set_old_reg_status($registration->ID(), $existing_reg_status); |
|
253 | + // is the registration currently incomplete ? |
|
254 | + if ($registration->status_ID() === EEM_Registration::status_id_incomplete) { |
|
255 | + // grab default reg status for the event, if set |
|
256 | + $event_default_registration_status = $registration->event()->default_registration_status(); |
|
257 | + // if no default reg status is set for the event, then use the global value |
|
258 | + $STS_ID = ! empty($event_default_registration_status) |
|
259 | + ? $event_default_registration_status |
|
260 | + : EE_Registry::instance()->CFG->registration->default_STS_ID; |
|
261 | + // if the event default reg status is approved, then downgrade temporarily to payment pending to ensure that payments are triggered |
|
262 | + $STS_ID = $STS_ID === EEM_Registration::status_id_approved ? EEM_Registration::status_id_pending_payment |
|
263 | + : $STS_ID; |
|
264 | + // set incoming REG_Status |
|
265 | + $this->set_new_reg_status($registration->ID(), $STS_ID); |
|
266 | + $registration->set_status($STS_ID, false, $context); |
|
267 | + if ($save) { |
|
268 | + $registration->save(); |
|
269 | + } |
|
270 | + // don't trigger notifications during IPNs because they will get triggered by EE_Payment_Processor |
|
271 | + if (! EE_Processor_Base::$IPN) { |
|
272 | + // otherwise, send out notifications |
|
273 | + add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10); |
|
274 | + } |
|
275 | + // DEBUG LOG |
|
276 | + // $this->log( |
|
277 | + // __CLASS__, |
|
278 | + // __FUNCTION__, |
|
279 | + // __LINE__, |
|
280 | + // $registration->transaction(), |
|
281 | + // array( |
|
282 | + // 'IPN' => EE_Processor_Base::$IPN, |
|
283 | + // 'deliver_notifications' => has_filter( |
|
284 | + // 'FHEE__EED_Messages___maybe_registration__deliver_notifications' |
|
285 | + // ), |
|
286 | + // ) |
|
287 | + // ); |
|
288 | + } |
|
289 | + } |
|
290 | + |
|
291 | + |
|
292 | + /** |
|
293 | + * toggle_registration_status_for_default_approved_events |
|
294 | + * |
|
295 | + * @access public |
|
296 | + * @param EE_Registration $registration |
|
297 | + * @param bool $save TRUE will save the registration if the status is updated, FALSE will leave that up |
|
298 | + * to client code |
|
299 | + * @return bool |
|
300 | + * @throws EE_Error |
|
301 | + * @throws EntityNotFoundException |
|
302 | + * @throws InvalidArgumentException |
|
303 | + * @throws InvalidDataTypeException |
|
304 | + * @throws InvalidInterfaceException |
|
305 | + * @throws ReflectionException |
|
306 | + * @throws RuntimeException |
|
307 | + */ |
|
308 | + public function toggle_registration_status_for_default_approved_events(EE_Registration $registration, $save = true) |
|
309 | + { |
|
310 | + $reg_status = $registration->status_ID(); |
|
311 | + // set initial REG_Status |
|
312 | + $this->set_old_reg_status($registration->ID(), $reg_status); |
|
313 | + // if not already, toggle reg status to approved IF the event default reg status is approved |
|
314 | + // ( as long as the registration wasn't cancelled or declined at some point ) |
|
315 | + if ($reg_status !== EEM_Registration::status_id_cancelled |
|
316 | + && $reg_status |
|
317 | + !== EEM_Registration::status_id_declined |
|
318 | + && $reg_status !== EEM_Registration::status_id_approved |
|
319 | + && $registration->event()->default_registration_status() === EEM_Registration::status_id_approved |
|
320 | + ) { |
|
321 | + // set incoming REG_Status |
|
322 | + $this->set_new_reg_status($registration->ID(), EEM_Registration::status_id_approved); |
|
323 | + // toggle status to approved |
|
324 | + $registration->set_status(EEM_Registration::status_id_approved); |
|
325 | + if ($save) { |
|
326 | + $registration->save(); |
|
327 | + } |
|
328 | + // don't trigger notifications during IPNs because they will get triggered by EE_Payment_Processor |
|
329 | + if (! EE_Processor_Base::$IPN) { |
|
330 | + // otherwise, send out notifications |
|
331 | + add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10); |
|
332 | + } |
|
333 | + // DEBUG LOG |
|
334 | + // $this->log( |
|
335 | + // __CLASS__, |
|
336 | + // __FUNCTION__, |
|
337 | + // __LINE__, |
|
338 | + // $registration->transaction(), |
|
339 | + // array( |
|
340 | + // 'IPN' => EE_Processor_Base::$IPN, |
|
341 | + // 'deliver_notifications' => has_filter( |
|
342 | + // 'FHEE__EED_Messages___maybe_registration__deliver_notifications' |
|
343 | + // ), |
|
344 | + // ) |
|
345 | + // ); |
|
346 | + return true; |
|
347 | + } |
|
348 | + return false; |
|
349 | + } |
|
350 | + |
|
351 | + |
|
352 | + /** |
|
353 | + * toggle_registration_statuses_if_no_monies_owing |
|
354 | + * |
|
355 | + * @access public |
|
356 | + * @param EE_Registration $registration |
|
357 | + * @param bool $save TRUE will save the registration if the status is updated, FALSE will leave that up |
|
358 | + * to client code |
|
359 | + * @param array $additional_details |
|
360 | + * @return bool |
|
361 | + * @throws EE_Error |
|
362 | + * @throws EntityNotFoundException |
|
363 | + * @throws InvalidArgumentException |
|
364 | + * @throws InvalidDataTypeException |
|
365 | + * @throws InvalidInterfaceException |
|
366 | + * @throws ReflectionException |
|
367 | + * @throws RuntimeException |
|
368 | + */ |
|
369 | + public function toggle_registration_status_if_no_monies_owing( |
|
370 | + EE_Registration $registration, |
|
371 | + $save = true, |
|
372 | + array $additional_details = array() |
|
373 | + ) { |
|
374 | + // set initial REG_Status |
|
375 | + $this->set_old_reg_status($registration->ID(), $registration->status_ID()); |
|
376 | + // was a payment just made ? |
|
377 | + $payment = isset($additional_details['payment_updates'], $additional_details['last_payment']) |
|
378 | + && $additional_details['payment_updates'] |
|
379 | + && $additional_details['last_payment'] instanceof EE_Payment |
|
380 | + ? $additional_details['last_payment'] |
|
381 | + : null; |
|
382 | + $total_paid = array_sum(self::$_amount_paid); |
|
383 | + // toggle reg status to approved IF |
|
384 | + if (// REG status is pending payment |
|
385 | + $registration->status_ID() === EEM_Registration::status_id_pending_payment |
|
386 | + // AND no monies are owing |
|
387 | + && ( |
|
388 | + ( |
|
389 | + $registration->transaction()->is_completed() |
|
390 | + || $registration->transaction()->is_overpaid() |
|
391 | + || $registration->transaction()->is_free() |
|
392 | + || apply_filters( |
|
393 | + 'FHEE__EE_Registration_Processor__toggle_registration_status_if_no_monies_owing', |
|
394 | + false, |
|
395 | + $registration |
|
396 | + ) |
|
397 | + ) |
|
398 | + || ( |
|
399 | + $payment instanceof EE_Payment && $payment->is_approved() |
|
400 | + && // this specific registration has not yet been paid for |
|
401 | + ! isset(self::$_amount_paid[ $registration->ID() ]) |
|
402 | + && // payment amount, less what we have already attributed to other registrations, is greater than this reg's final price |
|
403 | + $payment->amount() - $total_paid >= $registration->final_price() |
|
404 | + ) |
|
405 | + ) |
|
406 | + ) { |
|
407 | + // mark as paid |
|
408 | + self::$_amount_paid[ $registration->ID() ] = $registration->final_price(); |
|
409 | + // track new REG_Status |
|
410 | + $this->set_new_reg_status($registration->ID(), EEM_Registration::status_id_approved); |
|
411 | + // toggle status to approved |
|
412 | + $registration->set_status(EEM_Registration::status_id_approved); |
|
413 | + if ($save) { |
|
414 | + $registration->save(); |
|
415 | + } |
|
416 | + // don't trigger notifications during IPNs because they will get triggered by EE_Payment_Processor |
|
417 | + if (! EE_Processor_Base::$IPN) { |
|
418 | + // otherwise, send out notifications |
|
419 | + add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10); |
|
420 | + } |
|
421 | + // DEBUG LOG |
|
422 | + // $this->log( |
|
423 | + // __CLASS__, |
|
424 | + // __FUNCTION__, |
|
425 | + // __LINE__, |
|
426 | + // $registration->transaction(), |
|
427 | + // array( |
|
428 | + // 'IPN' => EE_Processor_Base::$IPN, |
|
429 | + // 'deliver_notifications' => has_filter( |
|
430 | + // 'FHEE__EED_Messages___maybe_registration__deliver_notifications' |
|
431 | + // ), |
|
432 | + // ) |
|
433 | + // ); |
|
434 | + return true; |
|
435 | + } |
|
436 | + return false; |
|
437 | + } |
|
438 | + |
|
439 | + |
|
440 | + /** |
|
441 | + * registration_status_changed |
|
442 | + * |
|
443 | + * @access public |
|
444 | + * @param EE_Registration $registration |
|
445 | + * @param array $additional_details |
|
446 | + * @return void |
|
447 | + */ |
|
448 | + public function trigger_registration_update_notifications($registration, array $additional_details = array()) |
|
449 | + { |
|
450 | + try { |
|
451 | + if (! $registration instanceof EE_Registration) { |
|
452 | + throw new EE_Error( |
|
453 | + esc_html__('An invalid registration was received.', 'event_espresso') |
|
454 | + ); |
|
455 | + } |
|
456 | + // EE_Registry::instance()->load_helper('Debug_Tools'); |
|
457 | + // EEH_Debug_Tools::log( |
|
458 | + // __CLASS__, |
|
459 | + // __FUNCTION__, |
|
460 | + // __LINE__, |
|
461 | + // array($registration->transaction(), $additional_details), |
|
462 | + // false, |
|
463 | + // 'EE_Transaction: ' . $registration->transaction()->ID() |
|
464 | + // ); |
|
465 | + if (! $registration->is_primary_registrant()) { |
|
466 | + return; |
|
467 | + } |
|
468 | + do_action( |
|
469 | + 'AHEE__EE_Registration_Processor__trigger_registration_update_notifications', |
|
470 | + $registration, |
|
471 | + $additional_details |
|
472 | + ); |
|
473 | + } catch (Exception $e) { |
|
474 | + EE_Error::add_error($e->getMessage(), $e->getFile(), 'unknown_function_from_exception', $e->getLine()); |
|
475 | + } |
|
476 | + } |
|
477 | + |
|
478 | + |
|
479 | + /** |
|
480 | + * sets reg status based either on passed param or on transaction status and event pre-approval setting |
|
481 | + * |
|
482 | + * @param EE_Registration $registration |
|
483 | + * @param array $additional_details |
|
484 | + * @return bool |
|
485 | + * @throws EE_Error |
|
486 | + * @throws EntityNotFoundException |
|
487 | + * @throws InvalidArgumentException |
|
488 | + * @throws InvalidDataTypeException |
|
489 | + * @throws InvalidInterfaceException |
|
490 | + * @throws ReflectionException |
|
491 | + * @throws RuntimeException |
|
492 | + */ |
|
493 | + public function update_registration_after_checkout_or_payment( |
|
494 | + EE_Registration $registration, |
|
495 | + array $additional_details = array() |
|
496 | + ) { |
|
497 | + // set initial REG_Status |
|
498 | + $this->set_old_reg_status($registration->ID(), $registration->status_ID()); |
|
499 | + // if the registration status gets updated, then save the registration |
|
500 | + if ($this->toggle_registration_status_for_default_approved_events($registration, false) |
|
501 | + || $this->toggle_registration_status_if_no_monies_owing( |
|
502 | + $registration, |
|
503 | + false, |
|
504 | + $additional_details |
|
505 | + ) |
|
506 | + ) { |
|
507 | + $registration->save(); |
|
508 | + } |
|
509 | + // set new REG_Status |
|
510 | + $this->set_new_reg_status($registration->ID(), $registration->status_ID()); |
|
511 | + return $this->reg_status_updated($registration->ID()) |
|
512 | + && $this->new_reg_status($registration->ID()) === EEM_Registration::status_id_approved; |
|
513 | + } |
|
514 | + |
|
515 | + |
|
516 | + /** |
|
517 | + * Updates the registration' final prices based on the current line item tree (taking into account |
|
518 | + * discounts, taxes, and other line items unrelated to tickets.) |
|
519 | + * |
|
520 | + * @param EE_Transaction $transaction |
|
521 | + * @param boolean $save_regs whether to immediately save registrations in this function or not |
|
522 | + * @return void |
|
523 | + * @throws EE_Error |
|
524 | + * @throws InvalidArgumentException |
|
525 | + * @throws InvalidDataTypeException |
|
526 | + * @throws InvalidInterfaceException |
|
527 | + * @throws RuntimeException |
|
528 | + */ |
|
529 | + public function update_registration_final_prices($transaction, $save_regs = true) |
|
530 | + { |
|
531 | + $reg_final_price_per_ticket_line_item = EEH_Line_Item::calculate_reg_final_prices_per_line_item( |
|
532 | + $transaction->total_line_item() |
|
533 | + ); |
|
534 | + foreach ($transaction->registrations() as $registration) { |
|
535 | + /** @var EE_Line_Item $line_item */ |
|
536 | + $line_item = EEM_Line_Item::instance()->get_line_item_for_registration($registration); |
|
537 | + if (isset($reg_final_price_per_ticket_line_item[ $line_item->ID() ])) { |
|
538 | + $registration->set_final_price($reg_final_price_per_ticket_line_item[ $line_item->ID() ]); |
|
539 | + if ($save_regs) { |
|
540 | + $registration->save(); |
|
541 | + } |
|
542 | + } |
|
543 | + } |
|
544 | + // and make sure there's no rounding problem |
|
545 | + $this->fix_reg_final_price_rounding_issue($transaction); |
|
546 | + } |
|
547 | + |
|
548 | + |
|
549 | + /** |
|
550 | + * Makes sure there is no rounding errors for the REG_final_prices. |
|
551 | + * Eg, if we have 3 registrations for $1, and there is a $0.01 discount between the three of them, |
|
552 | + * they will each be for $0.99333333, which gets rounded to $1 again. |
|
553 | + * So the transaction total will be $2.99, but each registration will be for $1, |
|
554 | + * so if each registrant paid individually they will have overpaid by $0.01. |
|
555 | + * So in order to overcome this, we check for any difference, and if there is a difference |
|
556 | + * we just grab one registrant at random and make them responsible for it. |
|
557 | + * This should be used after setting REG_final_prices (it's done automatically as part of |
|
558 | + * EE_Registration_Processor::update_registration_final_prices()) |
|
559 | + * |
|
560 | + * @param EE_Transaction $transaction |
|
561 | + * @return bool success verifying that there is NO difference after this method is done |
|
562 | + * @throws EE_Error |
|
563 | + * @throws InvalidArgumentException |
|
564 | + * @throws InvalidDataTypeException |
|
565 | + * @throws InvalidInterfaceException |
|
566 | + */ |
|
567 | + public function fix_reg_final_price_rounding_issue($transaction) |
|
568 | + { |
|
569 | + $reg_final_price_sum = EEM_Registration::instance()->sum( |
|
570 | + array( |
|
571 | + array( |
|
572 | + 'TXN_ID' => $transaction->ID(), |
|
573 | + ), |
|
574 | + ), |
|
575 | + 'REG_final_price' |
|
576 | + ); |
|
577 | + $diff = $transaction->total() - $reg_final_price_sum; |
|
578 | + // ok then, just grab one of the registrations |
|
579 | + if ($diff !== 0) { |
|
580 | + $a_reg = EEM_Registration::instance()->get_one( |
|
581 | + array( |
|
582 | + array( |
|
583 | + 'TXN_ID' => $transaction->ID(), |
|
584 | + ), |
|
585 | + ) |
|
586 | + ); |
|
587 | + return $a_reg instanceof EE_Registration |
|
588 | + ? (bool) $a_reg->save(array('REG_final_price' => $a_reg->final_price() + $diff)) |
|
589 | + : false; |
|
590 | + } |
|
591 | + return true; |
|
592 | + } |
|
593 | + |
|
594 | + |
|
595 | + /** |
|
596 | + * update_registration_after_being_canceled_or_declined |
|
597 | + * |
|
598 | + * @param EE_Registration $registration |
|
599 | + * @param array $closed_reg_statuses |
|
600 | + * @param bool $update_reg |
|
601 | + * @return bool |
|
602 | + * @throws EE_Error |
|
603 | + * @throws RuntimeException |
|
604 | + */ |
|
605 | + public function update_registration_after_being_canceled_or_declined( |
|
606 | + EE_Registration $registration, |
|
607 | + array $closed_reg_statuses = array(), |
|
608 | + $update_reg = true |
|
609 | + ) { |
|
610 | + // these reg statuses should not be considered in any calculations involving monies owing |
|
611 | + $closed_reg_statuses = ! empty($closed_reg_statuses) |
|
612 | + ? $closed_reg_statuses |
|
613 | + : EEM_Registration::closed_reg_statuses(); |
|
614 | + if (! in_array($registration->status_ID(), $closed_reg_statuses, true)) { |
|
615 | + return false; |
|
616 | + } |
|
617 | + // release a reserved ticket by decrementing ticket and datetime reserved values |
|
618 | + $registration->release_reserved_ticket(true, 'RegProcessor:' . __LINE__); |
|
619 | + $registration->set_final_price(0); |
|
620 | + if ($update_reg) { |
|
621 | + $registration->save(); |
|
622 | + } |
|
623 | + return true; |
|
624 | + } |
|
625 | + |
|
626 | + |
|
627 | + /** |
|
628 | + * update_canceled_or_declined_registration_after_being_reinstated |
|
629 | + * |
|
630 | + * @param EE_Registration $registration |
|
631 | + * @param array $closed_reg_statuses |
|
632 | + * @param bool $update_reg |
|
633 | + * @return bool |
|
634 | + * @throws EE_Error |
|
635 | + * @throws RuntimeException |
|
636 | + */ |
|
637 | + public function update_canceled_or_declined_registration_after_being_reinstated( |
|
638 | + EE_Registration $registration, |
|
639 | + array $closed_reg_statuses = array(), |
|
640 | + $update_reg = true |
|
641 | + ) { |
|
642 | + // these reg statuses should not be considered in any calculations involving monies owing |
|
643 | + $closed_reg_statuses = ! empty($closed_reg_statuses) ? $closed_reg_statuses |
|
644 | + : EEM_Registration::closed_reg_statuses(); |
|
645 | + if (in_array($registration->status_ID(), $closed_reg_statuses, true)) { |
|
646 | + return false; |
|
647 | + } |
|
648 | + $ticket = $registration->ticket(); |
|
649 | + if (! $ticket instanceof EE_Ticket) { |
|
650 | + throw new EE_Error( |
|
651 | + sprintf( |
|
652 | + esc_html__( |
|
653 | + 'The Ticket for Registration %1$d was not found or is invalid.', |
|
654 | + 'event_espresso' |
|
655 | + ), |
|
656 | + $registration->ticket_ID() |
|
657 | + ) |
|
658 | + ); |
|
659 | + } |
|
660 | + $registration->set_final_price($ticket->price()); |
|
661 | + if ($update_reg) { |
|
662 | + $registration->save(); |
|
663 | + } |
|
664 | + return true; |
|
665 | + } |
|
666 | + |
|
667 | + |
|
668 | + /** |
|
669 | + * generate_ONE_registration_from_line_item |
|
670 | + * Although a ticket line item may have a quantity greater than 1, |
|
671 | + * this method will ONLY CREATE ONE REGISTRATION !!! |
|
672 | + * Regardless of the ticket line item quantity. |
|
673 | + * This means that any code calling this method is responsible for ensuring |
|
674 | + * that the final registration count matches the ticket line item quantity. |
|
675 | + * This was done to make it easier to match the number of registrations |
|
676 | + * to the number of tickets in the cart, when the cart has been edited |
|
677 | + * after SPCO has already been initialized. So if an additional ticket was added to the cart, you can simply pass |
|
678 | + * the line item to this method to add a second ticket, and in this case, you would not want to add 2 tickets. |
|
679 | + * |
|
680 | + * @deprecated |
|
681 | + * @since 4.9.1 |
|
682 | + * @param EE_Line_Item $line_item |
|
683 | + * @param \EE_Transaction $transaction |
|
684 | + * @param int $att_nmbr |
|
685 | + * @param int $total_ticket_count |
|
686 | + * @return EE_Registration | null |
|
687 | + * @throws \OutOfRangeException |
|
688 | + * @throws \EventEspresso\core\exceptions\UnexpectedEntityException |
|
689 | + * @throws \EE_Error |
|
690 | + */ |
|
691 | + public function generate_ONE_registration_from_line_item( |
|
692 | + EE_Line_Item $line_item, |
|
693 | + EE_Transaction $transaction, |
|
694 | + $att_nmbr = 1, |
|
695 | + $total_ticket_count = 1 |
|
696 | + ) { |
|
697 | + EE_Error::doing_it_wrong( |
|
698 | + __CLASS__ . '::' . __FUNCTION__, |
|
699 | + sprintf( |
|
700 | + esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'), |
|
701 | + '\EventEspresso\core\domain\services\registration\CreateRegistrationService::create()' |
|
702 | + ), |
|
703 | + '4.9.1', |
|
704 | + '5.0.0' |
|
705 | + ); |
|
706 | + // grab the related ticket object for this line_item |
|
707 | + $ticket = $line_item->ticket(); |
|
708 | + if (! $ticket instanceof EE_Ticket) { |
|
709 | + EE_Error::add_error( |
|
710 | + sprintf( |
|
711 | + esc_html__('Line item %s did not contain a valid ticket', 'event_espresso'), |
|
712 | + $line_item->ID() |
|
713 | + ), |
|
714 | + __FILE__, |
|
715 | + __FUNCTION__, |
|
716 | + __LINE__ |
|
717 | + ); |
|
718 | + return null; |
|
719 | + } |
|
720 | + $registration_service = new CreateRegistrationService(); |
|
721 | + // then generate a new registration from that |
|
722 | + return $registration_service->create( |
|
723 | + $ticket->get_related_event(), |
|
724 | + $transaction, |
|
725 | + $ticket, |
|
726 | + $line_item, |
|
727 | + $att_nmbr, |
|
728 | + $total_ticket_count |
|
729 | + ); |
|
730 | + } |
|
731 | + |
|
732 | + |
|
733 | + /** |
|
734 | + * generates reg_url_link |
|
735 | + * |
|
736 | + * @deprecated |
|
737 | + * @since 4.9.1 |
|
738 | + * @param int $att_nmbr |
|
739 | + * @param EE_Line_Item | string $item |
|
740 | + * @return string |
|
741 | + * @throws InvalidArgumentException |
|
742 | + */ |
|
743 | + public function generate_reg_url_link($att_nmbr, $item) |
|
744 | + { |
|
745 | + EE_Error::doing_it_wrong( |
|
746 | + __CLASS__ . '::' . __FUNCTION__, |
|
747 | + sprintf( |
|
748 | + esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'), |
|
749 | + 'EventEspresso\core\domain\entities\RegUrlLink' |
|
750 | + ), |
|
751 | + '4.9.1', |
|
752 | + '5.0.0' |
|
753 | + ); |
|
754 | + return new RegUrlLink($att_nmbr, $item); |
|
755 | + } |
|
756 | + |
|
757 | + |
|
758 | + /** |
|
759 | + * generates reg code |
|
760 | + * |
|
761 | + * @deprecated |
|
762 | + * @since 4.9.1 |
|
763 | + * @param EE_Registration $registration |
|
764 | + * @return string |
|
765 | + * @throws EE_Error |
|
766 | + * @throws EntityNotFoundException |
|
767 | + * @throws InvalidArgumentException |
|
768 | + */ |
|
769 | + public function generate_reg_code(EE_Registration $registration) |
|
770 | + { |
|
771 | + EE_Error::doing_it_wrong( |
|
772 | + __CLASS__ . '::' . __FUNCTION__, |
|
773 | + sprintf( |
|
774 | + esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'), |
|
775 | + 'EventEspresso\core\domain\entities\RegCode' |
|
776 | + ), |
|
777 | + '4.9.1', |
|
778 | + '5.0.0' |
|
779 | + ); |
|
780 | + return apply_filters( |
|
781 | + 'FHEE__EE_Registration_Processor___generate_reg_code__new_reg_code', |
|
782 | + new RegCode( |
|
783 | + RegUrlLink::fromRegistration($registration), |
|
784 | + $registration->transaction(), |
|
785 | + $registration->ticket() |
|
786 | + ), |
|
787 | + $registration |
|
788 | + ); |
|
789 | + } |
|
790 | 790 | } |
@@ -79,8 +79,8 @@ discard block |
||
79 | 79 | public static function instance(EE_Request $request = null) |
80 | 80 | { |
81 | 81 | // check if class object is instantiated |
82 | - if (! self::$_instance instanceof EE_Registration_Processor) { |
|
83 | - if (! $request instanceof EE_Request) { |
|
82 | + if ( ! self::$_instance instanceof EE_Registration_Processor) { |
|
83 | + if ( ! $request instanceof EE_Request) { |
|
84 | 84 | $request = LoaderFactory::getLoader()->getShared('EE_Request'); |
85 | 85 | } |
86 | 86 | self::$_instance = new self($request); |
@@ -106,7 +106,7 @@ discard block |
||
106 | 106 | */ |
107 | 107 | public function old_reg_status($REG_ID) |
108 | 108 | { |
109 | - return isset($this->_old_reg_status[ $REG_ID ]) ? $this->_old_reg_status[ $REG_ID ] : null; |
|
109 | + return isset($this->_old_reg_status[$REG_ID]) ? $this->_old_reg_status[$REG_ID] : null; |
|
110 | 110 | } |
111 | 111 | |
112 | 112 | |
@@ -117,8 +117,8 @@ discard block |
||
117 | 117 | public function set_old_reg_status($REG_ID, $old_reg_status) |
118 | 118 | { |
119 | 119 | // only set the first time |
120 | - if (! isset($this->_old_reg_status[ $REG_ID ])) { |
|
121 | - $this->_old_reg_status[ $REG_ID ] = $old_reg_status; |
|
120 | + if ( ! isset($this->_old_reg_status[$REG_ID])) { |
|
121 | + $this->_old_reg_status[$REG_ID] = $old_reg_status; |
|
122 | 122 | } |
123 | 123 | } |
124 | 124 | |
@@ -129,7 +129,7 @@ discard block |
||
129 | 129 | */ |
130 | 130 | public function new_reg_status($REG_ID) |
131 | 131 | { |
132 | - return isset($this->_new_reg_status[ $REG_ID ]) ? $this->_new_reg_status[ $REG_ID ] : null; |
|
132 | + return isset($this->_new_reg_status[$REG_ID]) ? $this->_new_reg_status[$REG_ID] : null; |
|
133 | 133 | } |
134 | 134 | |
135 | 135 | |
@@ -139,7 +139,7 @@ discard block |
||
139 | 139 | */ |
140 | 140 | public function set_new_reg_status($REG_ID, $new_reg_status) |
141 | 141 | { |
142 | - $this->_new_reg_status[ $REG_ID ] = $new_reg_status; |
|
142 | + $this->_new_reg_status[$REG_ID] = $new_reg_status; |
|
143 | 143 | } |
144 | 144 | |
145 | 145 | |
@@ -205,7 +205,7 @@ discard block |
||
205 | 205 | // toggle reg status but only if it has changed and the user can do so |
206 | 206 | if ($this->reg_status_updated($registration->ID()) |
207 | 207 | && ( |
208 | - (! $this->request->isAdmin() || $this->request->isFrontAjax()) |
|
208 | + ( ! $this->request->isAdmin() || $this->request->isFrontAjax()) |
|
209 | 209 | || EE_Registry::instance()->CAP->current_user_can( |
210 | 210 | 'ee_edit_registration', |
211 | 211 | 'toggle_registration_status', |
@@ -268,7 +268,7 @@ discard block |
||
268 | 268 | $registration->save(); |
269 | 269 | } |
270 | 270 | // don't trigger notifications during IPNs because they will get triggered by EE_Payment_Processor |
271 | - if (! EE_Processor_Base::$IPN) { |
|
271 | + if ( ! EE_Processor_Base::$IPN) { |
|
272 | 272 | // otherwise, send out notifications |
273 | 273 | add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10); |
274 | 274 | } |
@@ -326,7 +326,7 @@ discard block |
||
326 | 326 | $registration->save(); |
327 | 327 | } |
328 | 328 | // don't trigger notifications during IPNs because they will get triggered by EE_Payment_Processor |
329 | - if (! EE_Processor_Base::$IPN) { |
|
329 | + if ( ! EE_Processor_Base::$IPN) { |
|
330 | 330 | // otherwise, send out notifications |
331 | 331 | add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10); |
332 | 332 | } |
@@ -398,14 +398,14 @@ discard block |
||
398 | 398 | || ( |
399 | 399 | $payment instanceof EE_Payment && $payment->is_approved() |
400 | 400 | && // this specific registration has not yet been paid for |
401 | - ! isset(self::$_amount_paid[ $registration->ID() ]) |
|
401 | + ! isset(self::$_amount_paid[$registration->ID()]) |
|
402 | 402 | && // payment amount, less what we have already attributed to other registrations, is greater than this reg's final price |
403 | 403 | $payment->amount() - $total_paid >= $registration->final_price() |
404 | 404 | ) |
405 | 405 | ) |
406 | 406 | ) { |
407 | 407 | // mark as paid |
408 | - self::$_amount_paid[ $registration->ID() ] = $registration->final_price(); |
|
408 | + self::$_amount_paid[$registration->ID()] = $registration->final_price(); |
|
409 | 409 | // track new REG_Status |
410 | 410 | $this->set_new_reg_status($registration->ID(), EEM_Registration::status_id_approved); |
411 | 411 | // toggle status to approved |
@@ -414,7 +414,7 @@ discard block |
||
414 | 414 | $registration->save(); |
415 | 415 | } |
416 | 416 | // don't trigger notifications during IPNs because they will get triggered by EE_Payment_Processor |
417 | - if (! EE_Processor_Base::$IPN) { |
|
417 | + if ( ! EE_Processor_Base::$IPN) { |
|
418 | 418 | // otherwise, send out notifications |
419 | 419 | add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10); |
420 | 420 | } |
@@ -448,7 +448,7 @@ discard block |
||
448 | 448 | public function trigger_registration_update_notifications($registration, array $additional_details = array()) |
449 | 449 | { |
450 | 450 | try { |
451 | - if (! $registration instanceof EE_Registration) { |
|
451 | + if ( ! $registration instanceof EE_Registration) { |
|
452 | 452 | throw new EE_Error( |
453 | 453 | esc_html__('An invalid registration was received.', 'event_espresso') |
454 | 454 | ); |
@@ -462,7 +462,7 @@ discard block |
||
462 | 462 | // false, |
463 | 463 | // 'EE_Transaction: ' . $registration->transaction()->ID() |
464 | 464 | // ); |
465 | - if (! $registration->is_primary_registrant()) { |
|
465 | + if ( ! $registration->is_primary_registrant()) { |
|
466 | 466 | return; |
467 | 467 | } |
468 | 468 | do_action( |
@@ -534,8 +534,8 @@ discard block |
||
534 | 534 | foreach ($transaction->registrations() as $registration) { |
535 | 535 | /** @var EE_Line_Item $line_item */ |
536 | 536 | $line_item = EEM_Line_Item::instance()->get_line_item_for_registration($registration); |
537 | - if (isset($reg_final_price_per_ticket_line_item[ $line_item->ID() ])) { |
|
538 | - $registration->set_final_price($reg_final_price_per_ticket_line_item[ $line_item->ID() ]); |
|
537 | + if (isset($reg_final_price_per_ticket_line_item[$line_item->ID()])) { |
|
538 | + $registration->set_final_price($reg_final_price_per_ticket_line_item[$line_item->ID()]); |
|
539 | 539 | if ($save_regs) { |
540 | 540 | $registration->save(); |
541 | 541 | } |
@@ -611,11 +611,11 @@ discard block |
||
611 | 611 | $closed_reg_statuses = ! empty($closed_reg_statuses) |
612 | 612 | ? $closed_reg_statuses |
613 | 613 | : EEM_Registration::closed_reg_statuses(); |
614 | - if (! in_array($registration->status_ID(), $closed_reg_statuses, true)) { |
|
614 | + if ( ! in_array($registration->status_ID(), $closed_reg_statuses, true)) { |
|
615 | 615 | return false; |
616 | 616 | } |
617 | 617 | // release a reserved ticket by decrementing ticket and datetime reserved values |
618 | - $registration->release_reserved_ticket(true, 'RegProcessor:' . __LINE__); |
|
618 | + $registration->release_reserved_ticket(true, 'RegProcessor:'.__LINE__); |
|
619 | 619 | $registration->set_final_price(0); |
620 | 620 | if ($update_reg) { |
621 | 621 | $registration->save(); |
@@ -646,7 +646,7 @@ discard block |
||
646 | 646 | return false; |
647 | 647 | } |
648 | 648 | $ticket = $registration->ticket(); |
649 | - if (! $ticket instanceof EE_Ticket) { |
|
649 | + if ( ! $ticket instanceof EE_Ticket) { |
|
650 | 650 | throw new EE_Error( |
651 | 651 | sprintf( |
652 | 652 | esc_html__( |
@@ -695,7 +695,7 @@ discard block |
||
695 | 695 | $total_ticket_count = 1 |
696 | 696 | ) { |
697 | 697 | EE_Error::doing_it_wrong( |
698 | - __CLASS__ . '::' . __FUNCTION__, |
|
698 | + __CLASS__.'::'.__FUNCTION__, |
|
699 | 699 | sprintf( |
700 | 700 | esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'), |
701 | 701 | '\EventEspresso\core\domain\services\registration\CreateRegistrationService::create()' |
@@ -705,7 +705,7 @@ discard block |
||
705 | 705 | ); |
706 | 706 | // grab the related ticket object for this line_item |
707 | 707 | $ticket = $line_item->ticket(); |
708 | - if (! $ticket instanceof EE_Ticket) { |
|
708 | + if ( ! $ticket instanceof EE_Ticket) { |
|
709 | 709 | EE_Error::add_error( |
710 | 710 | sprintf( |
711 | 711 | esc_html__('Line item %s did not contain a valid ticket', 'event_espresso'), |
@@ -743,7 +743,7 @@ discard block |
||
743 | 743 | public function generate_reg_url_link($att_nmbr, $item) |
744 | 744 | { |
745 | 745 | EE_Error::doing_it_wrong( |
746 | - __CLASS__ . '::' . __FUNCTION__, |
|
746 | + __CLASS__.'::'.__FUNCTION__, |
|
747 | 747 | sprintf( |
748 | 748 | esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'), |
749 | 749 | 'EventEspresso\core\domain\entities\RegUrlLink' |
@@ -769,7 +769,7 @@ discard block |
||
769 | 769 | public function generate_reg_code(EE_Registration $registration) |
770 | 770 | { |
771 | 771 | EE_Error::doing_it_wrong( |
772 | - __CLASS__ . '::' . __FUNCTION__, |
|
772 | + __CLASS__.'::'.__FUNCTION__, |
|
773 | 773 | sprintf( |
774 | 774 | esc_html__('This method is deprecated. Please use "%s" instead', 'event_espresso'), |
775 | 775 | 'EventEspresso\core\domain\entities\RegCode' |
@@ -14,71 +14,71 @@ |
||
14 | 14 | class EE_Processor_Base |
15 | 15 | { |
16 | 16 | |
17 | - /** |
|
18 | - * Used to indicate whether current request is for an IPN or not. |
|
19 | - * |
|
20 | - * @var bool |
|
21 | - */ |
|
22 | - protected static $IPN = false; |
|
17 | + /** |
|
18 | + * Used to indicate whether current request is for an IPN or not. |
|
19 | + * |
|
20 | + * @var bool |
|
21 | + */ |
|
22 | + protected static $IPN = false; |
|
23 | 23 | |
24 | - /** |
|
25 | - * Used to indicate whether SPCO is being revisited by registrant or not. |
|
26 | - * |
|
27 | - * @var bool |
|
28 | - */ |
|
29 | - protected $_revisit = false; |
|
24 | + /** |
|
25 | + * Used to indicate whether SPCO is being revisited by registrant or not. |
|
26 | + * |
|
27 | + * @var bool |
|
28 | + */ |
|
29 | + protected $_revisit = false; |
|
30 | 30 | |
31 | 31 | |
32 | - /** |
|
33 | - * @param boolean $IPN |
|
34 | - */ |
|
35 | - public static function set_IPN($IPN) |
|
36 | - { |
|
37 | - self::$IPN = filter_var($IPN, FILTER_VALIDATE_BOOLEAN); |
|
38 | - } |
|
32 | + /** |
|
33 | + * @param boolean $IPN |
|
34 | + */ |
|
35 | + public static function set_IPN($IPN) |
|
36 | + { |
|
37 | + self::$IPN = filter_var($IPN, FILTER_VALIDATE_BOOLEAN); |
|
38 | + } |
|
39 | 39 | |
40 | 40 | |
41 | - /** |
|
42 | - * Allows external class (usually checkout) to set whether SPCO is being revisited by registrant or not. |
|
43 | - * |
|
44 | - * @param bool $revisit |
|
45 | - * @return void |
|
46 | - */ |
|
47 | - public function set_revisit($revisit = false) |
|
48 | - { |
|
49 | - $this->_revisit = filter_var($revisit, FILTER_VALIDATE_BOOLEAN); |
|
50 | - } |
|
41 | + /** |
|
42 | + * Allows external class (usually checkout) to set whether SPCO is being revisited by registrant or not. |
|
43 | + * |
|
44 | + * @param bool $revisit |
|
45 | + * @return void |
|
46 | + */ |
|
47 | + public function set_revisit($revisit = false) |
|
48 | + { |
|
49 | + $this->_revisit = filter_var($revisit, FILTER_VALIDATE_BOOLEAN); |
|
50 | + } |
|
51 | 51 | |
52 | 52 | |
53 | - /** |
|
54 | - * debug |
|
55 | - * |
|
56 | - * @param string $class |
|
57 | - * @param string $func |
|
58 | - * @param string $line |
|
59 | - * @param \EE_Transaction $transaction |
|
60 | - * @param array $info |
|
61 | - * @param bool $display_request |
|
62 | - */ |
|
63 | - protected function log( |
|
64 | - $class = '', |
|
65 | - $func = '', |
|
66 | - $line = '', |
|
67 | - EE_Transaction $transaction, |
|
68 | - $info = array(), |
|
69 | - $display_request = false |
|
70 | - ) { |
|
71 | - if (WP_DEBUG && false) { |
|
72 | - if ($transaction instanceof EE_Transaction) { |
|
73 | - // don't serialize objects |
|
74 | - $info = EEH_Debug_Tools::strip_objects($info); |
|
75 | - if ($transaction->ID()) { |
|
76 | - $info['TXN_status'] = $transaction->status_ID(); |
|
77 | - $info['TXN_reg_steps'] = $transaction->reg_steps(); |
|
78 | - $index = 'EE_Transaction: ' . $transaction->ID(); |
|
79 | - EEH_Debug_Tools::log($class, $func, $line, $info, $display_request, $index); |
|
80 | - } |
|
81 | - } |
|
82 | - } |
|
83 | - } |
|
53 | + /** |
|
54 | + * debug |
|
55 | + * |
|
56 | + * @param string $class |
|
57 | + * @param string $func |
|
58 | + * @param string $line |
|
59 | + * @param \EE_Transaction $transaction |
|
60 | + * @param array $info |
|
61 | + * @param bool $display_request |
|
62 | + */ |
|
63 | + protected function log( |
|
64 | + $class = '', |
|
65 | + $func = '', |
|
66 | + $line = '', |
|
67 | + EE_Transaction $transaction, |
|
68 | + $info = array(), |
|
69 | + $display_request = false |
|
70 | + ) { |
|
71 | + if (WP_DEBUG && false) { |
|
72 | + if ($transaction instanceof EE_Transaction) { |
|
73 | + // don't serialize objects |
|
74 | + $info = EEH_Debug_Tools::strip_objects($info); |
|
75 | + if ($transaction->ID()) { |
|
76 | + $info['TXN_status'] = $transaction->status_ID(); |
|
77 | + $info['TXN_reg_steps'] = $transaction->reg_steps(); |
|
78 | + $index = 'EE_Transaction: ' . $transaction->ID(); |
|
79 | + EEH_Debug_Tools::log($class, $func, $line, $info, $display_request, $index); |
|
80 | + } |
|
81 | + } |
|
82 | + } |
|
83 | + } |
|
84 | 84 | } |
@@ -75,7 +75,7 @@ |
||
75 | 75 | if ($transaction->ID()) { |
76 | 76 | $info['TXN_status'] = $transaction->status_ID(); |
77 | 77 | $info['TXN_reg_steps'] = $transaction->reg_steps(); |
78 | - $index = 'EE_Transaction: ' . $transaction->ID(); |
|
78 | + $index = 'EE_Transaction: '.$transaction->ID(); |
|
79 | 79 | EEH_Debug_Tools::log($class, $func, $line, $info, $display_request, $index); |
80 | 80 | } |
81 | 81 | } |
@@ -16,423 +16,423 @@ |
||
16 | 16 | class EE_Transaction_Payments |
17 | 17 | { |
18 | 18 | |
19 | - /** |
|
20 | - * @var EE_Transaction_Payments $_instance |
|
21 | - * @access private |
|
22 | - */ |
|
23 | - private static $_instance; |
|
24 | - |
|
25 | - /** |
|
26 | - * @deprecated |
|
27 | - * @var string |
|
28 | - */ |
|
29 | - protected $_old_txn_status; |
|
30 | - |
|
31 | - /** |
|
32 | - * @deprecated |
|
33 | - * @var string |
|
34 | - */ |
|
35 | - protected $_new_txn_status; |
|
36 | - |
|
37 | - |
|
38 | - /** |
|
39 | - * @singleton method used to instantiate class object |
|
40 | - * @access public |
|
41 | - * @return EE_Transaction_Payments instance |
|
42 | - */ |
|
43 | - public static function instance() |
|
44 | - { |
|
45 | - // check if class object is instantiated |
|
46 | - if (! self::$_instance instanceof EE_Transaction_Payments) { |
|
47 | - self::$_instance = new self(); |
|
48 | - } |
|
49 | - return self::$_instance; |
|
50 | - } |
|
51 | - |
|
52 | - |
|
53 | - /** |
|
54 | - * recalculate_transaction_total |
|
55 | - * |
|
56 | - * @access private |
|
57 | - * @param EE_Transaction $transaction |
|
58 | - * @param bool $update_txn |
|
59 | - * @return bool true if TXN total was updated, false if not |
|
60 | - * @throws \EE_Error |
|
61 | - */ |
|
62 | - public function recalculate_transaction_total(EE_Transaction $transaction, $update_txn = true) |
|
63 | - { |
|
64 | - $total_line_item = $transaction->total_line_item(); |
|
65 | - if (! $total_line_item instanceof EE_Line_Item) { |
|
66 | - EE_Error::add_error( |
|
67 | - sprintf( |
|
68 | - __('The Total Line Item for Transaction %1$d\'s was not found or is invalid.', 'event_espresso'), |
|
69 | - $transaction->ID() |
|
70 | - ), |
|
71 | - __FILE__, |
|
72 | - __FUNCTION__, |
|
73 | - __LINE__ |
|
74 | - ); |
|
75 | - return false; |
|
76 | - } |
|
77 | - $new_total = $total_line_item->recalculate_total_including_taxes(); |
|
78 | - $transaction->set_total($new_total); |
|
79 | - if ($update_txn) { |
|
80 | - return $transaction->save() ? true : false; |
|
81 | - } |
|
82 | - return false; |
|
83 | - } |
|
84 | - |
|
85 | - |
|
86 | - /** |
|
87 | - * Updates the provided EE_Transaction with all the applicable payments |
|
88 | - * returns a boolean for whether the TXN was saved to the db |
|
89 | - * (meaning a status change occurred) |
|
90 | - * or not saved (which could **still** mean that |
|
91 | - * the TXN status changed, but just was not yet saved). |
|
92 | - * So if passing a value of false for the $update_txn param, |
|
93 | - * then client code needs to take responsibility for saving the TXN |
|
94 | - * regardless of what happens within EE_Transaction_Payments; |
|
95 | - * |
|
96 | - * @param EE_Transaction /int $transaction_obj_or_id EE_Transaction or its ID |
|
97 | - * @param boolean $update_txn whether to save the TXN |
|
98 | - * @return boolean whether the TXN was saved |
|
99 | - * @throws \EE_Error |
|
100 | - */ |
|
101 | - public function calculate_total_payments_and_update_status(EE_Transaction $transaction, $update_txn = true) |
|
102 | - { |
|
103 | - // verify transaction |
|
104 | - if (! $transaction instanceof EE_Transaction) { |
|
105 | - EE_Error::add_error( |
|
106 | - __('Please provide a valid EE_Transaction object.', 'event_espresso'), |
|
107 | - __FILE__, |
|
108 | - __FUNCTION__, |
|
109 | - __LINE__ |
|
110 | - ); |
|
111 | - return false; |
|
112 | - } |
|
113 | - // calculate total paid |
|
114 | - $total_paid = $this->recalculate_total_payments_for_transaction($transaction); |
|
115 | - // if total paid has changed |
|
116 | - if ($total_paid !== false && (float) $total_paid !== $transaction->paid()) { |
|
117 | - $transaction->set_paid($total_paid); |
|
118 | - // maybe update status, and make sure to save transaction if not done already |
|
119 | - if (! $transaction->update_status_based_on_total_paid($update_txn)) { |
|
120 | - if ($update_txn) { |
|
121 | - return $transaction->save() ? true : false; |
|
122 | - } |
|
123 | - } else { |
|
124 | - // the status got updated and was saved by |
|
125 | - // update_transaction_status_based_on_total_paid() |
|
126 | - return true; |
|
127 | - } |
|
128 | - } |
|
129 | - return false; |
|
130 | - } |
|
131 | - |
|
132 | - |
|
133 | - /** |
|
134 | - * recalculate_total_payments_for_transaction |
|
135 | - * |
|
136 | - * @access public |
|
137 | - * @param EE_Transaction $transaction |
|
138 | - * @param string $payment_status One of EEM_Payment's statuses, like 'PAP' (Approved). |
|
139 | - * By default, searches for approved payments |
|
140 | - * @return float|false float on success, false on fail |
|
141 | - * @throws \EE_Error |
|
142 | - */ |
|
143 | - public function recalculate_total_payments_for_transaction( |
|
144 | - EE_Transaction $transaction, |
|
145 | - $payment_status = EEM_Payment::status_id_approved |
|
146 | - ) { |
|
147 | - // verify transaction |
|
148 | - if (! $transaction instanceof EE_Transaction) { |
|
149 | - EE_Error::add_error( |
|
150 | - __('Please provide a valid EE_Transaction object.', 'event_espresso'), |
|
151 | - __FILE__, |
|
152 | - __FUNCTION__, |
|
153 | - __LINE__ |
|
154 | - ); |
|
155 | - return false; |
|
156 | - } |
|
157 | - // ensure Payment model is loaded |
|
158 | - EE_Registry::instance()->load_model('Payment'); |
|
159 | - // calls EEM_Base::sum() |
|
160 | - return EEM_Payment::instance()->sum( |
|
161 | - // query params |
|
162 | - array(array('TXN_ID' => $transaction->ID(), 'STS_ID' => $payment_status)), |
|
163 | - // field to sum |
|
164 | - 'PAY_amount' |
|
165 | - ); |
|
166 | - } |
|
167 | - |
|
168 | - |
|
169 | - /** |
|
170 | - * delete_payment_and_update_transaction |
|
171 | - * Before deleting the selected payment, we fetch it's transaction, |
|
172 | - * then delete the payment, and update the transactions' amount paid. |
|
173 | - * |
|
174 | - * @param EE_Payment $payment |
|
175 | - * @return boolean |
|
176 | - * @throws \EE_Error |
|
177 | - */ |
|
178 | - public function delete_payment_and_update_transaction(EE_Payment $payment) |
|
179 | - { |
|
180 | - // verify payment |
|
181 | - if (! $payment instanceof EE_Payment) { |
|
182 | - EE_Error::add_error( |
|
183 | - __('A valid Payment object was not received.', 'event_espresso'), |
|
184 | - __FILE__, |
|
185 | - __FUNCTION__, |
|
186 | - __LINE__ |
|
187 | - ); |
|
188 | - return false; |
|
189 | - } |
|
190 | - if (! $this->delete_registration_payments_and_update_registrations($payment)) { |
|
191 | - return false; |
|
192 | - } |
|
193 | - if (! $payment->delete()) { |
|
194 | - EE_Error::add_error( |
|
195 | - __('The payment could not be deleted.', 'event_espresso'), |
|
196 | - __FILE__, |
|
197 | - __FUNCTION__, |
|
198 | - __LINE__ |
|
199 | - ); |
|
200 | - return false; |
|
201 | - } |
|
202 | - |
|
203 | - $transaction = $payment->transaction(); |
|
204 | - $TXN_status = $transaction->status_ID(); |
|
205 | - if ($TXN_status === EEM_Transaction::abandoned_status_code |
|
206 | - || $TXN_status === EEM_Transaction::failed_status_code |
|
207 | - || $payment->amount() === 0 |
|
208 | - ) { |
|
209 | - EE_Error::add_success(__('The Payment was successfully deleted.', 'event_espresso')); |
|
210 | - return true; |
|
211 | - } |
|
212 | - |
|
213 | - |
|
214 | - // if this fails, that just means that the transaction didn't get its status changed and/or updated. |
|
215 | - // however the payment was still deleted. |
|
216 | - if (! $this->calculate_total_payments_and_update_status($transaction)) { |
|
217 | - EE_Error::add_attention( |
|
218 | - __( |
|
219 | - 'It appears that the Payment was deleted but no change was recorded for the Transaction for an unknown reason. Please verify that all data for this Transaction looks correct..', |
|
220 | - 'event_espresso' |
|
221 | - ), |
|
222 | - __FILE__, |
|
223 | - __FUNCTION__, |
|
224 | - __LINE__ |
|
225 | - ); |
|
226 | - return true; |
|
227 | - } |
|
228 | - |
|
229 | - EE_Error::add_success( |
|
230 | - __( |
|
231 | - 'The Payment was successfully deleted, and the Transaction has been updated accordingly.', |
|
232 | - 'event_espresso' |
|
233 | - ) |
|
234 | - ); |
|
235 | - return true; |
|
236 | - } |
|
237 | - |
|
238 | - |
|
239 | - /** |
|
240 | - * delete_registration_payments_and_update_registrations |
|
241 | - * |
|
242 | - * removes all registration payment records associated with a payment |
|
243 | - * and subtracts their amounts from the corresponding registrations REG_paid field |
|
244 | - * |
|
245 | - * @param EE_Payment $payment |
|
246 | - * @param array $reg_payment_query_params |
|
247 | - * @return bool |
|
248 | - * @throws \EE_Error |
|
249 | - */ |
|
250 | - public function delete_registration_payments_and_update_registrations( |
|
251 | - EE_Payment $payment, |
|
252 | - $reg_payment_query_params = array() |
|
253 | - ) { |
|
254 | - $save_payment = false; |
|
255 | - $reg_payment_query_params = ! empty($reg_payment_query_params) ? $reg_payment_query_params |
|
256 | - : array(array('PAY_ID' => $payment->ID())); |
|
257 | - $registration_payments = EEM_Registration_Payment::instance()->get_all($reg_payment_query_params); |
|
258 | - if (! empty($registration_payments)) { |
|
259 | - foreach ($registration_payments as $registration_payment) { |
|
260 | - if ($registration_payment instanceof EE_Registration_Payment) { |
|
261 | - $amount_paid = $registration_payment->amount(); |
|
262 | - $registration = $registration_payment->registration(); |
|
263 | - if ($registration instanceof EE_Registration) { |
|
264 | - $registration->set_paid($registration->paid() - $amount_paid); |
|
265 | - if ($registration->save() !== false) { |
|
266 | - $registration_payment->delete_permanently(); |
|
267 | - $save_payment = true; |
|
268 | - } |
|
269 | - } else { |
|
270 | - EE_Error::add_error( |
|
271 | - sprintf( |
|
272 | - __( |
|
273 | - 'An invalid Registration object was associated with Registration Payment ID# %1$d.', |
|
274 | - 'event_espresso' |
|
275 | - ), |
|
276 | - $registration_payment->ID() |
|
277 | - ), |
|
278 | - __FILE__, |
|
279 | - __FUNCTION__, |
|
280 | - __LINE__ |
|
281 | - ); |
|
282 | - return false; |
|
283 | - } |
|
284 | - } else { |
|
285 | - EE_Error::add_error( |
|
286 | - sprintf( |
|
287 | - __( |
|
288 | - 'An invalid Registration Payment object was associated with payment ID# %1$d.', |
|
289 | - 'event_espresso' |
|
290 | - ), |
|
291 | - $payment->ID() |
|
292 | - ), |
|
293 | - __FILE__, |
|
294 | - __FUNCTION__, |
|
295 | - __LINE__ |
|
296 | - ); |
|
297 | - return false; |
|
298 | - } |
|
299 | - } |
|
300 | - } |
|
301 | - if ($save_payment) { |
|
302 | - $payment->save(); |
|
303 | - } |
|
304 | - return true; |
|
305 | - } |
|
306 | - |
|
307 | - |
|
308 | - |
|
309 | - /********************************** DEPRECATED METHODS **********************************/ |
|
310 | - |
|
311 | - |
|
312 | - /** |
|
313 | - * possibly toggles TXN status |
|
314 | - * |
|
315 | - * @deprecated 4.9.1 |
|
316 | - * @param EE_Transaction $transaction |
|
317 | - * @param boolean $update_txn whether to save the TXN |
|
318 | - * @return boolean whether the TXN was saved |
|
319 | - * @throws \EE_Error |
|
320 | - */ |
|
321 | - public function update_transaction_status_based_on_total_paid(EE_Transaction $transaction, $update_txn = true) |
|
322 | - { |
|
323 | - EE_Error::doing_it_wrong( |
|
324 | - __CLASS__ . '::' . __FUNCTION__, |
|
325 | - sprintf( |
|
326 | - __('This method is deprecated. Please use "%s" instead', 'event_espresso'), |
|
327 | - 'EE_Transaction::update_status_based_on_total_paid()' |
|
328 | - ), |
|
329 | - '4.9.1', |
|
330 | - '5.0.0' |
|
331 | - ); |
|
332 | - // verify transaction |
|
333 | - if (! $transaction instanceof EE_Transaction) { |
|
334 | - EE_Error::add_error( |
|
335 | - __('Please provide a valid EE_Transaction object.', 'event_espresso'), |
|
336 | - __FILE__, |
|
337 | - __FUNCTION__, |
|
338 | - __LINE__ |
|
339 | - ); |
|
340 | - return false; |
|
341 | - } |
|
342 | - // set transaction status based on comparison of TXN_paid vs TXN_total |
|
343 | - return $transaction->update_status_based_on_total_paid($update_txn); |
|
344 | - } |
|
345 | - |
|
346 | - |
|
347 | - /** |
|
348 | - * @deprecated 4.9.12 |
|
349 | - * @return string |
|
350 | - */ |
|
351 | - public function old_txn_status() |
|
352 | - { |
|
353 | - EE_Error::doing_it_wrong( |
|
354 | - __METHOD__, |
|
355 | - esc_html__( |
|
356 | - 'This logic has been moved into \EE_Transaction::old_txn_status(), please use that method instead.', |
|
357 | - 'event_espresso' |
|
358 | - ), |
|
359 | - '4.9.12' |
|
360 | - ); |
|
361 | - return $this->_old_txn_status; |
|
362 | - } |
|
363 | - |
|
364 | - |
|
365 | - /** |
|
366 | - * @deprecated 4.9.12 |
|
367 | - * @param string $old_txn_status |
|
368 | - */ |
|
369 | - public function set_old_txn_status($old_txn_status) |
|
370 | - { |
|
371 | - EE_Error::doing_it_wrong( |
|
372 | - __METHOD__, |
|
373 | - esc_html__( |
|
374 | - 'This logic has been moved into \EE_Transaction::set_old_txn_status(), please use that method instead.', |
|
375 | - 'event_espresso' |
|
376 | - ), |
|
377 | - '4.9.12' |
|
378 | - ); |
|
379 | - // only set the first time |
|
380 | - if ($this->_old_txn_status === null) { |
|
381 | - $this->_old_txn_status = $old_txn_status; |
|
382 | - } |
|
383 | - } |
|
384 | - |
|
385 | - |
|
386 | - /** |
|
387 | - * @deprecated 4.9.12 |
|
388 | - * @return string |
|
389 | - */ |
|
390 | - public function new_txn_status() |
|
391 | - { |
|
392 | - EE_Error::doing_it_wrong( |
|
393 | - __METHOD__, |
|
394 | - esc_html__( |
|
395 | - 'This logic has been removed. Please just use \EE_Transaction::status_ID() instead.', |
|
396 | - 'event_espresso' |
|
397 | - ), |
|
398 | - '4.9.12' |
|
399 | - ); |
|
400 | - return $this->_new_txn_status; |
|
401 | - } |
|
402 | - |
|
403 | - |
|
404 | - /** |
|
405 | - * @deprecated 4.9.12 |
|
406 | - * @param string $new_txn_status |
|
407 | - */ |
|
408 | - public function set_new_txn_status($new_txn_status) |
|
409 | - { |
|
410 | - EE_Error::doing_it_wrong( |
|
411 | - __METHOD__, |
|
412 | - esc_html__( |
|
413 | - 'This logic has been removed. Please just use \EE_Transaction::set_status() instead.', |
|
414 | - 'event_espresso' |
|
415 | - ), |
|
416 | - '4.9.12' |
|
417 | - ); |
|
418 | - $this->_new_txn_status = $new_txn_status; |
|
419 | - } |
|
420 | - |
|
421 | - |
|
422 | - /** |
|
423 | - * @deprecated 4.9.12 |
|
424 | - * @return bool |
|
425 | - */ |
|
426 | - public function txn_status_updated() |
|
427 | - { |
|
428 | - EE_Error::doing_it_wrong( |
|
429 | - __METHOD__, |
|
430 | - esc_html__( |
|
431 | - 'This logic has been moved into \EE_Transaction::txn_status_updated(), please use that method instead.', |
|
432 | - 'event_espresso' |
|
433 | - ), |
|
434 | - '4.9.12' |
|
435 | - ); |
|
436 | - return $this->_new_txn_status !== $this->_old_txn_status && $this->_old_txn_status !== null ? true : false; |
|
437 | - } |
|
19 | + /** |
|
20 | + * @var EE_Transaction_Payments $_instance |
|
21 | + * @access private |
|
22 | + */ |
|
23 | + private static $_instance; |
|
24 | + |
|
25 | + /** |
|
26 | + * @deprecated |
|
27 | + * @var string |
|
28 | + */ |
|
29 | + protected $_old_txn_status; |
|
30 | + |
|
31 | + /** |
|
32 | + * @deprecated |
|
33 | + * @var string |
|
34 | + */ |
|
35 | + protected $_new_txn_status; |
|
36 | + |
|
37 | + |
|
38 | + /** |
|
39 | + * @singleton method used to instantiate class object |
|
40 | + * @access public |
|
41 | + * @return EE_Transaction_Payments instance |
|
42 | + */ |
|
43 | + public static function instance() |
|
44 | + { |
|
45 | + // check if class object is instantiated |
|
46 | + if (! self::$_instance instanceof EE_Transaction_Payments) { |
|
47 | + self::$_instance = new self(); |
|
48 | + } |
|
49 | + return self::$_instance; |
|
50 | + } |
|
51 | + |
|
52 | + |
|
53 | + /** |
|
54 | + * recalculate_transaction_total |
|
55 | + * |
|
56 | + * @access private |
|
57 | + * @param EE_Transaction $transaction |
|
58 | + * @param bool $update_txn |
|
59 | + * @return bool true if TXN total was updated, false if not |
|
60 | + * @throws \EE_Error |
|
61 | + */ |
|
62 | + public function recalculate_transaction_total(EE_Transaction $transaction, $update_txn = true) |
|
63 | + { |
|
64 | + $total_line_item = $transaction->total_line_item(); |
|
65 | + if (! $total_line_item instanceof EE_Line_Item) { |
|
66 | + EE_Error::add_error( |
|
67 | + sprintf( |
|
68 | + __('The Total Line Item for Transaction %1$d\'s was not found or is invalid.', 'event_espresso'), |
|
69 | + $transaction->ID() |
|
70 | + ), |
|
71 | + __FILE__, |
|
72 | + __FUNCTION__, |
|
73 | + __LINE__ |
|
74 | + ); |
|
75 | + return false; |
|
76 | + } |
|
77 | + $new_total = $total_line_item->recalculate_total_including_taxes(); |
|
78 | + $transaction->set_total($new_total); |
|
79 | + if ($update_txn) { |
|
80 | + return $transaction->save() ? true : false; |
|
81 | + } |
|
82 | + return false; |
|
83 | + } |
|
84 | + |
|
85 | + |
|
86 | + /** |
|
87 | + * Updates the provided EE_Transaction with all the applicable payments |
|
88 | + * returns a boolean for whether the TXN was saved to the db |
|
89 | + * (meaning a status change occurred) |
|
90 | + * or not saved (which could **still** mean that |
|
91 | + * the TXN status changed, but just was not yet saved). |
|
92 | + * So if passing a value of false for the $update_txn param, |
|
93 | + * then client code needs to take responsibility for saving the TXN |
|
94 | + * regardless of what happens within EE_Transaction_Payments; |
|
95 | + * |
|
96 | + * @param EE_Transaction /int $transaction_obj_or_id EE_Transaction or its ID |
|
97 | + * @param boolean $update_txn whether to save the TXN |
|
98 | + * @return boolean whether the TXN was saved |
|
99 | + * @throws \EE_Error |
|
100 | + */ |
|
101 | + public function calculate_total_payments_and_update_status(EE_Transaction $transaction, $update_txn = true) |
|
102 | + { |
|
103 | + // verify transaction |
|
104 | + if (! $transaction instanceof EE_Transaction) { |
|
105 | + EE_Error::add_error( |
|
106 | + __('Please provide a valid EE_Transaction object.', 'event_espresso'), |
|
107 | + __FILE__, |
|
108 | + __FUNCTION__, |
|
109 | + __LINE__ |
|
110 | + ); |
|
111 | + return false; |
|
112 | + } |
|
113 | + // calculate total paid |
|
114 | + $total_paid = $this->recalculate_total_payments_for_transaction($transaction); |
|
115 | + // if total paid has changed |
|
116 | + if ($total_paid !== false && (float) $total_paid !== $transaction->paid()) { |
|
117 | + $transaction->set_paid($total_paid); |
|
118 | + // maybe update status, and make sure to save transaction if not done already |
|
119 | + if (! $transaction->update_status_based_on_total_paid($update_txn)) { |
|
120 | + if ($update_txn) { |
|
121 | + return $transaction->save() ? true : false; |
|
122 | + } |
|
123 | + } else { |
|
124 | + // the status got updated and was saved by |
|
125 | + // update_transaction_status_based_on_total_paid() |
|
126 | + return true; |
|
127 | + } |
|
128 | + } |
|
129 | + return false; |
|
130 | + } |
|
131 | + |
|
132 | + |
|
133 | + /** |
|
134 | + * recalculate_total_payments_for_transaction |
|
135 | + * |
|
136 | + * @access public |
|
137 | + * @param EE_Transaction $transaction |
|
138 | + * @param string $payment_status One of EEM_Payment's statuses, like 'PAP' (Approved). |
|
139 | + * By default, searches for approved payments |
|
140 | + * @return float|false float on success, false on fail |
|
141 | + * @throws \EE_Error |
|
142 | + */ |
|
143 | + public function recalculate_total_payments_for_transaction( |
|
144 | + EE_Transaction $transaction, |
|
145 | + $payment_status = EEM_Payment::status_id_approved |
|
146 | + ) { |
|
147 | + // verify transaction |
|
148 | + if (! $transaction instanceof EE_Transaction) { |
|
149 | + EE_Error::add_error( |
|
150 | + __('Please provide a valid EE_Transaction object.', 'event_espresso'), |
|
151 | + __FILE__, |
|
152 | + __FUNCTION__, |
|
153 | + __LINE__ |
|
154 | + ); |
|
155 | + return false; |
|
156 | + } |
|
157 | + // ensure Payment model is loaded |
|
158 | + EE_Registry::instance()->load_model('Payment'); |
|
159 | + // calls EEM_Base::sum() |
|
160 | + return EEM_Payment::instance()->sum( |
|
161 | + // query params |
|
162 | + array(array('TXN_ID' => $transaction->ID(), 'STS_ID' => $payment_status)), |
|
163 | + // field to sum |
|
164 | + 'PAY_amount' |
|
165 | + ); |
|
166 | + } |
|
167 | + |
|
168 | + |
|
169 | + /** |
|
170 | + * delete_payment_and_update_transaction |
|
171 | + * Before deleting the selected payment, we fetch it's transaction, |
|
172 | + * then delete the payment, and update the transactions' amount paid. |
|
173 | + * |
|
174 | + * @param EE_Payment $payment |
|
175 | + * @return boolean |
|
176 | + * @throws \EE_Error |
|
177 | + */ |
|
178 | + public function delete_payment_and_update_transaction(EE_Payment $payment) |
|
179 | + { |
|
180 | + // verify payment |
|
181 | + if (! $payment instanceof EE_Payment) { |
|
182 | + EE_Error::add_error( |
|
183 | + __('A valid Payment object was not received.', 'event_espresso'), |
|
184 | + __FILE__, |
|
185 | + __FUNCTION__, |
|
186 | + __LINE__ |
|
187 | + ); |
|
188 | + return false; |
|
189 | + } |
|
190 | + if (! $this->delete_registration_payments_and_update_registrations($payment)) { |
|
191 | + return false; |
|
192 | + } |
|
193 | + if (! $payment->delete()) { |
|
194 | + EE_Error::add_error( |
|
195 | + __('The payment could not be deleted.', 'event_espresso'), |
|
196 | + __FILE__, |
|
197 | + __FUNCTION__, |
|
198 | + __LINE__ |
|
199 | + ); |
|
200 | + return false; |
|
201 | + } |
|
202 | + |
|
203 | + $transaction = $payment->transaction(); |
|
204 | + $TXN_status = $transaction->status_ID(); |
|
205 | + if ($TXN_status === EEM_Transaction::abandoned_status_code |
|
206 | + || $TXN_status === EEM_Transaction::failed_status_code |
|
207 | + || $payment->amount() === 0 |
|
208 | + ) { |
|
209 | + EE_Error::add_success(__('The Payment was successfully deleted.', 'event_espresso')); |
|
210 | + return true; |
|
211 | + } |
|
212 | + |
|
213 | + |
|
214 | + // if this fails, that just means that the transaction didn't get its status changed and/or updated. |
|
215 | + // however the payment was still deleted. |
|
216 | + if (! $this->calculate_total_payments_and_update_status($transaction)) { |
|
217 | + EE_Error::add_attention( |
|
218 | + __( |
|
219 | + 'It appears that the Payment was deleted but no change was recorded for the Transaction for an unknown reason. Please verify that all data for this Transaction looks correct..', |
|
220 | + 'event_espresso' |
|
221 | + ), |
|
222 | + __FILE__, |
|
223 | + __FUNCTION__, |
|
224 | + __LINE__ |
|
225 | + ); |
|
226 | + return true; |
|
227 | + } |
|
228 | + |
|
229 | + EE_Error::add_success( |
|
230 | + __( |
|
231 | + 'The Payment was successfully deleted, and the Transaction has been updated accordingly.', |
|
232 | + 'event_espresso' |
|
233 | + ) |
|
234 | + ); |
|
235 | + return true; |
|
236 | + } |
|
237 | + |
|
238 | + |
|
239 | + /** |
|
240 | + * delete_registration_payments_and_update_registrations |
|
241 | + * |
|
242 | + * removes all registration payment records associated with a payment |
|
243 | + * and subtracts their amounts from the corresponding registrations REG_paid field |
|
244 | + * |
|
245 | + * @param EE_Payment $payment |
|
246 | + * @param array $reg_payment_query_params |
|
247 | + * @return bool |
|
248 | + * @throws \EE_Error |
|
249 | + */ |
|
250 | + public function delete_registration_payments_and_update_registrations( |
|
251 | + EE_Payment $payment, |
|
252 | + $reg_payment_query_params = array() |
|
253 | + ) { |
|
254 | + $save_payment = false; |
|
255 | + $reg_payment_query_params = ! empty($reg_payment_query_params) ? $reg_payment_query_params |
|
256 | + : array(array('PAY_ID' => $payment->ID())); |
|
257 | + $registration_payments = EEM_Registration_Payment::instance()->get_all($reg_payment_query_params); |
|
258 | + if (! empty($registration_payments)) { |
|
259 | + foreach ($registration_payments as $registration_payment) { |
|
260 | + if ($registration_payment instanceof EE_Registration_Payment) { |
|
261 | + $amount_paid = $registration_payment->amount(); |
|
262 | + $registration = $registration_payment->registration(); |
|
263 | + if ($registration instanceof EE_Registration) { |
|
264 | + $registration->set_paid($registration->paid() - $amount_paid); |
|
265 | + if ($registration->save() !== false) { |
|
266 | + $registration_payment->delete_permanently(); |
|
267 | + $save_payment = true; |
|
268 | + } |
|
269 | + } else { |
|
270 | + EE_Error::add_error( |
|
271 | + sprintf( |
|
272 | + __( |
|
273 | + 'An invalid Registration object was associated with Registration Payment ID# %1$d.', |
|
274 | + 'event_espresso' |
|
275 | + ), |
|
276 | + $registration_payment->ID() |
|
277 | + ), |
|
278 | + __FILE__, |
|
279 | + __FUNCTION__, |
|
280 | + __LINE__ |
|
281 | + ); |
|
282 | + return false; |
|
283 | + } |
|
284 | + } else { |
|
285 | + EE_Error::add_error( |
|
286 | + sprintf( |
|
287 | + __( |
|
288 | + 'An invalid Registration Payment object was associated with payment ID# %1$d.', |
|
289 | + 'event_espresso' |
|
290 | + ), |
|
291 | + $payment->ID() |
|
292 | + ), |
|
293 | + __FILE__, |
|
294 | + __FUNCTION__, |
|
295 | + __LINE__ |
|
296 | + ); |
|
297 | + return false; |
|
298 | + } |
|
299 | + } |
|
300 | + } |
|
301 | + if ($save_payment) { |
|
302 | + $payment->save(); |
|
303 | + } |
|
304 | + return true; |
|
305 | + } |
|
306 | + |
|
307 | + |
|
308 | + |
|
309 | + /********************************** DEPRECATED METHODS **********************************/ |
|
310 | + |
|
311 | + |
|
312 | + /** |
|
313 | + * possibly toggles TXN status |
|
314 | + * |
|
315 | + * @deprecated 4.9.1 |
|
316 | + * @param EE_Transaction $transaction |
|
317 | + * @param boolean $update_txn whether to save the TXN |
|
318 | + * @return boolean whether the TXN was saved |
|
319 | + * @throws \EE_Error |
|
320 | + */ |
|
321 | + public function update_transaction_status_based_on_total_paid(EE_Transaction $transaction, $update_txn = true) |
|
322 | + { |
|
323 | + EE_Error::doing_it_wrong( |
|
324 | + __CLASS__ . '::' . __FUNCTION__, |
|
325 | + sprintf( |
|
326 | + __('This method is deprecated. Please use "%s" instead', 'event_espresso'), |
|
327 | + 'EE_Transaction::update_status_based_on_total_paid()' |
|
328 | + ), |
|
329 | + '4.9.1', |
|
330 | + '5.0.0' |
|
331 | + ); |
|
332 | + // verify transaction |
|
333 | + if (! $transaction instanceof EE_Transaction) { |
|
334 | + EE_Error::add_error( |
|
335 | + __('Please provide a valid EE_Transaction object.', 'event_espresso'), |
|
336 | + __FILE__, |
|
337 | + __FUNCTION__, |
|
338 | + __LINE__ |
|
339 | + ); |
|
340 | + return false; |
|
341 | + } |
|
342 | + // set transaction status based on comparison of TXN_paid vs TXN_total |
|
343 | + return $transaction->update_status_based_on_total_paid($update_txn); |
|
344 | + } |
|
345 | + |
|
346 | + |
|
347 | + /** |
|
348 | + * @deprecated 4.9.12 |
|
349 | + * @return string |
|
350 | + */ |
|
351 | + public function old_txn_status() |
|
352 | + { |
|
353 | + EE_Error::doing_it_wrong( |
|
354 | + __METHOD__, |
|
355 | + esc_html__( |
|
356 | + 'This logic has been moved into \EE_Transaction::old_txn_status(), please use that method instead.', |
|
357 | + 'event_espresso' |
|
358 | + ), |
|
359 | + '4.9.12' |
|
360 | + ); |
|
361 | + return $this->_old_txn_status; |
|
362 | + } |
|
363 | + |
|
364 | + |
|
365 | + /** |
|
366 | + * @deprecated 4.9.12 |
|
367 | + * @param string $old_txn_status |
|
368 | + */ |
|
369 | + public function set_old_txn_status($old_txn_status) |
|
370 | + { |
|
371 | + EE_Error::doing_it_wrong( |
|
372 | + __METHOD__, |
|
373 | + esc_html__( |
|
374 | + 'This logic has been moved into \EE_Transaction::set_old_txn_status(), please use that method instead.', |
|
375 | + 'event_espresso' |
|
376 | + ), |
|
377 | + '4.9.12' |
|
378 | + ); |
|
379 | + // only set the first time |
|
380 | + if ($this->_old_txn_status === null) { |
|
381 | + $this->_old_txn_status = $old_txn_status; |
|
382 | + } |
|
383 | + } |
|
384 | + |
|
385 | + |
|
386 | + /** |
|
387 | + * @deprecated 4.9.12 |
|
388 | + * @return string |
|
389 | + */ |
|
390 | + public function new_txn_status() |
|
391 | + { |
|
392 | + EE_Error::doing_it_wrong( |
|
393 | + __METHOD__, |
|
394 | + esc_html__( |
|
395 | + 'This logic has been removed. Please just use \EE_Transaction::status_ID() instead.', |
|
396 | + 'event_espresso' |
|
397 | + ), |
|
398 | + '4.9.12' |
|
399 | + ); |
|
400 | + return $this->_new_txn_status; |
|
401 | + } |
|
402 | + |
|
403 | + |
|
404 | + /** |
|
405 | + * @deprecated 4.9.12 |
|
406 | + * @param string $new_txn_status |
|
407 | + */ |
|
408 | + public function set_new_txn_status($new_txn_status) |
|
409 | + { |
|
410 | + EE_Error::doing_it_wrong( |
|
411 | + __METHOD__, |
|
412 | + esc_html__( |
|
413 | + 'This logic has been removed. Please just use \EE_Transaction::set_status() instead.', |
|
414 | + 'event_espresso' |
|
415 | + ), |
|
416 | + '4.9.12' |
|
417 | + ); |
|
418 | + $this->_new_txn_status = $new_txn_status; |
|
419 | + } |
|
420 | + |
|
421 | + |
|
422 | + /** |
|
423 | + * @deprecated 4.9.12 |
|
424 | + * @return bool |
|
425 | + */ |
|
426 | + public function txn_status_updated() |
|
427 | + { |
|
428 | + EE_Error::doing_it_wrong( |
|
429 | + __METHOD__, |
|
430 | + esc_html__( |
|
431 | + 'This logic has been moved into \EE_Transaction::txn_status_updated(), please use that method instead.', |
|
432 | + 'event_espresso' |
|
433 | + ), |
|
434 | + '4.9.12' |
|
435 | + ); |
|
436 | + return $this->_new_txn_status !== $this->_old_txn_status && $this->_old_txn_status !== null ? true : false; |
|
437 | + } |
|
438 | 438 | } |
@@ -43,7 +43,7 @@ discard block |
||
43 | 43 | public static function instance() |
44 | 44 | { |
45 | 45 | // check if class object is instantiated |
46 | - if (! self::$_instance instanceof EE_Transaction_Payments) { |
|
46 | + if ( ! self::$_instance instanceof EE_Transaction_Payments) { |
|
47 | 47 | self::$_instance = new self(); |
48 | 48 | } |
49 | 49 | return self::$_instance; |
@@ -62,7 +62,7 @@ discard block |
||
62 | 62 | public function recalculate_transaction_total(EE_Transaction $transaction, $update_txn = true) |
63 | 63 | { |
64 | 64 | $total_line_item = $transaction->total_line_item(); |
65 | - if (! $total_line_item instanceof EE_Line_Item) { |
|
65 | + if ( ! $total_line_item instanceof EE_Line_Item) { |
|
66 | 66 | EE_Error::add_error( |
67 | 67 | sprintf( |
68 | 68 | __('The Total Line Item for Transaction %1$d\'s was not found or is invalid.', 'event_espresso'), |
@@ -101,7 +101,7 @@ discard block |
||
101 | 101 | public function calculate_total_payments_and_update_status(EE_Transaction $transaction, $update_txn = true) |
102 | 102 | { |
103 | 103 | // verify transaction |
104 | - if (! $transaction instanceof EE_Transaction) { |
|
104 | + if ( ! $transaction instanceof EE_Transaction) { |
|
105 | 105 | EE_Error::add_error( |
106 | 106 | __('Please provide a valid EE_Transaction object.', 'event_espresso'), |
107 | 107 | __FILE__, |
@@ -116,7 +116,7 @@ discard block |
||
116 | 116 | if ($total_paid !== false && (float) $total_paid !== $transaction->paid()) { |
117 | 117 | $transaction->set_paid($total_paid); |
118 | 118 | // maybe update status, and make sure to save transaction if not done already |
119 | - if (! $transaction->update_status_based_on_total_paid($update_txn)) { |
|
119 | + if ( ! $transaction->update_status_based_on_total_paid($update_txn)) { |
|
120 | 120 | if ($update_txn) { |
121 | 121 | return $transaction->save() ? true : false; |
122 | 122 | } |
@@ -145,7 +145,7 @@ discard block |
||
145 | 145 | $payment_status = EEM_Payment::status_id_approved |
146 | 146 | ) { |
147 | 147 | // verify transaction |
148 | - if (! $transaction instanceof EE_Transaction) { |
|
148 | + if ( ! $transaction instanceof EE_Transaction) { |
|
149 | 149 | EE_Error::add_error( |
150 | 150 | __('Please provide a valid EE_Transaction object.', 'event_espresso'), |
151 | 151 | __FILE__, |
@@ -178,7 +178,7 @@ discard block |
||
178 | 178 | public function delete_payment_and_update_transaction(EE_Payment $payment) |
179 | 179 | { |
180 | 180 | // verify payment |
181 | - if (! $payment instanceof EE_Payment) { |
|
181 | + if ( ! $payment instanceof EE_Payment) { |
|
182 | 182 | EE_Error::add_error( |
183 | 183 | __('A valid Payment object was not received.', 'event_espresso'), |
184 | 184 | __FILE__, |
@@ -187,10 +187,10 @@ discard block |
||
187 | 187 | ); |
188 | 188 | return false; |
189 | 189 | } |
190 | - if (! $this->delete_registration_payments_and_update_registrations($payment)) { |
|
190 | + if ( ! $this->delete_registration_payments_and_update_registrations($payment)) { |
|
191 | 191 | return false; |
192 | 192 | } |
193 | - if (! $payment->delete()) { |
|
193 | + if ( ! $payment->delete()) { |
|
194 | 194 | EE_Error::add_error( |
195 | 195 | __('The payment could not be deleted.', 'event_espresso'), |
196 | 196 | __FILE__, |
@@ -213,7 +213,7 @@ discard block |
||
213 | 213 | |
214 | 214 | // if this fails, that just means that the transaction didn't get its status changed and/or updated. |
215 | 215 | // however the payment was still deleted. |
216 | - if (! $this->calculate_total_payments_and_update_status($transaction)) { |
|
216 | + if ( ! $this->calculate_total_payments_and_update_status($transaction)) { |
|
217 | 217 | EE_Error::add_attention( |
218 | 218 | __( |
219 | 219 | 'It appears that the Payment was deleted but no change was recorded for the Transaction for an unknown reason. Please verify that all data for this Transaction looks correct..', |
@@ -255,7 +255,7 @@ discard block |
||
255 | 255 | $reg_payment_query_params = ! empty($reg_payment_query_params) ? $reg_payment_query_params |
256 | 256 | : array(array('PAY_ID' => $payment->ID())); |
257 | 257 | $registration_payments = EEM_Registration_Payment::instance()->get_all($reg_payment_query_params); |
258 | - if (! empty($registration_payments)) { |
|
258 | + if ( ! empty($registration_payments)) { |
|
259 | 259 | foreach ($registration_payments as $registration_payment) { |
260 | 260 | if ($registration_payment instanceof EE_Registration_Payment) { |
261 | 261 | $amount_paid = $registration_payment->amount(); |
@@ -321,7 +321,7 @@ discard block |
||
321 | 321 | public function update_transaction_status_based_on_total_paid(EE_Transaction $transaction, $update_txn = true) |
322 | 322 | { |
323 | 323 | EE_Error::doing_it_wrong( |
324 | - __CLASS__ . '::' . __FUNCTION__, |
|
324 | + __CLASS__.'::'.__FUNCTION__, |
|
325 | 325 | sprintf( |
326 | 326 | __('This method is deprecated. Please use "%s" instead', 'event_espresso'), |
327 | 327 | 'EE_Transaction::update_status_based_on_total_paid()' |
@@ -330,7 +330,7 @@ discard block |
||
330 | 330 | '5.0.0' |
331 | 331 | ); |
332 | 332 | // verify transaction |
333 | - if (! $transaction instanceof EE_Transaction) { |
|
333 | + if ( ! $transaction instanceof EE_Transaction) { |
|
334 | 334 | EE_Error::add_error( |
335 | 335 | __('Please provide a valid EE_Transaction object.', 'event_espresso'), |
336 | 336 | __FILE__, |
@@ -17,948 +17,948 @@ |
||
17 | 17 | class EE_Transaction_Processor extends EE_Processor_Base |
18 | 18 | { |
19 | 19 | |
20 | - /** |
|
21 | - * @var EE_Registration_Processor $_instance |
|
22 | - * @access private |
|
23 | - */ |
|
24 | - private static $_instance; |
|
25 | - |
|
26 | - /** |
|
27 | - * array of query WHERE params to use when retrieving cached registrations from a transaction |
|
28 | - * |
|
29 | - * @var array $registration_query_params |
|
30 | - * @access private |
|
31 | - */ |
|
32 | - private $_registration_query_params = array(); |
|
33 | - |
|
34 | - /** |
|
35 | - * @deprecated |
|
36 | - * @var string |
|
37 | - */ |
|
38 | - protected $_old_txn_status; |
|
39 | - |
|
40 | - /** |
|
41 | - * @deprecated |
|
42 | - * @var string |
|
43 | - */ |
|
44 | - protected $_new_txn_status; |
|
45 | - |
|
46 | - |
|
47 | - /** |
|
48 | - * @singleton method used to instantiate class object |
|
49 | - * @access public |
|
50 | - * @param array $registration_query_params |
|
51 | - * @return EE_Transaction_Processor instance |
|
52 | - */ |
|
53 | - public static function instance($registration_query_params = array()) |
|
54 | - { |
|
55 | - // check if class object is instantiated |
|
56 | - if (! self::$_instance instanceof EE_Transaction_Processor) { |
|
57 | - self::$_instance = new self($registration_query_params); |
|
58 | - } |
|
59 | - return self::$_instance; |
|
60 | - } |
|
61 | - |
|
62 | - |
|
63 | - /** |
|
64 | - * @param array $registration_query_params |
|
65 | - */ |
|
66 | - private function __construct($registration_query_params = array()) |
|
67 | - { |
|
68 | - // make sure some query params are set for retrieving registrations |
|
69 | - $this->_set_registration_query_params($registration_query_params); |
|
70 | - } |
|
71 | - |
|
72 | - |
|
73 | - /** |
|
74 | - * @access private |
|
75 | - * @param array $registration_query_params |
|
76 | - */ |
|
77 | - private function _set_registration_query_params($registration_query_params) |
|
78 | - { |
|
79 | - $this->_registration_query_params = ! empty($registration_query_params) ? $registration_query_params |
|
80 | - : array('order_by' => array('REG_count' => 'ASC')); |
|
81 | - } |
|
82 | - |
|
83 | - |
|
84 | - /** |
|
85 | - * manually_update_registration_statuses |
|
86 | - * |
|
87 | - * @access public |
|
88 | - * @param EE_Transaction $transaction |
|
89 | - * @param string $new_reg_status |
|
90 | - * @param array $registration_query_params array of query WHERE params to use |
|
91 | - * when retrieving cached registrations from a transaction |
|
92 | - * @return boolean |
|
93 | - * @throws \EE_Error |
|
94 | - */ |
|
95 | - public function manually_update_registration_statuses( |
|
96 | - EE_Transaction $transaction, |
|
97 | - $new_reg_status = '', |
|
98 | - $registration_query_params = array() |
|
99 | - ) { |
|
100 | - $status_updates = $this->_call_method_on_registrations_via_Registration_Processor( |
|
101 | - 'manually_update_registration_status', |
|
102 | - $transaction, |
|
103 | - $registration_query_params, |
|
104 | - $new_reg_status |
|
105 | - ); |
|
106 | - // send messages |
|
107 | - /** @type EE_Registration_Processor $registration_processor */ |
|
108 | - $registration_processor = EE_Registry::instance()->load_class('Registration_Processor'); |
|
109 | - $registration_processor->trigger_registration_update_notifications( |
|
110 | - $transaction->primary_registration(), |
|
111 | - array('manually_updated' => true) |
|
112 | - ); |
|
113 | - do_action( |
|
114 | - 'AHEE__EE_Transaction_Processor__manually_update_registration_statuses', |
|
115 | - $transaction, |
|
116 | - $status_updates |
|
117 | - ); |
|
118 | - return $status_updates; |
|
119 | - } |
|
120 | - |
|
121 | - |
|
122 | - /** |
|
123 | - * toggle_registration_statuses_for_default_approved_events |
|
124 | - * |
|
125 | - * @access public |
|
126 | - * @param EE_Transaction $transaction |
|
127 | - * @param array $registration_query_params array of query WHERE params to use |
|
128 | - * when retrieving cached registrations from a transaction |
|
129 | - * @return boolean |
|
130 | - * @throws \EE_Error |
|
131 | - */ |
|
132 | - public function toggle_registration_statuses_for_default_approved_events( |
|
133 | - EE_Transaction $transaction, |
|
134 | - $registration_query_params = array() |
|
135 | - ) { |
|
136 | - $status_updates = $this->_call_method_on_registrations_via_Registration_Processor( |
|
137 | - 'toggle_registration_status_for_default_approved_events', |
|
138 | - $transaction, |
|
139 | - $registration_query_params |
|
140 | - ); |
|
141 | - do_action( |
|
142 | - 'AHEE__EE_Transaction_Processor__toggle_registration_statuses_for_default_approved_events', |
|
143 | - $transaction, |
|
144 | - $status_updates |
|
145 | - ); |
|
146 | - return $status_updates; |
|
147 | - } |
|
148 | - |
|
149 | - |
|
150 | - /** |
|
151 | - * toggle_registration_statuses_if_no_monies_owing |
|
152 | - * |
|
153 | - * @access public |
|
154 | - * @param EE_Transaction $transaction |
|
155 | - * @param array $registration_query_params array of query WHERE params to use |
|
156 | - * when retrieving cached registrations from a transaction |
|
157 | - * @return boolean |
|
158 | - * @throws \EE_Error |
|
159 | - */ |
|
160 | - public function toggle_registration_statuses_if_no_monies_owing( |
|
161 | - EE_Transaction $transaction, |
|
162 | - $registration_query_params = array() |
|
163 | - ) { |
|
164 | - $status_updates = $this->_call_method_on_registrations_via_Registration_Processor( |
|
165 | - 'toggle_registration_status_if_no_monies_owing', |
|
166 | - $transaction, |
|
167 | - $registration_query_params |
|
168 | - ); |
|
169 | - do_action( |
|
170 | - 'AHEE__EE_Transaction_Processor__toggle_registration_statuses_if_no_monies_owing', |
|
171 | - $transaction, |
|
172 | - $status_updates |
|
173 | - ); |
|
174 | - return $status_updates; |
|
175 | - } |
|
176 | - |
|
177 | - |
|
178 | - /** |
|
179 | - * update_transaction_and_registrations_after_checkout_or_payment |
|
180 | - * cycles thru related registrations and calls update_registration_after_checkout_or_payment() on each |
|
181 | - * |
|
182 | - * @param EE_Transaction $transaction |
|
183 | - * @param \EE_Payment | NULL $payment |
|
184 | - * @param array $registration_query_params array of query WHERE params to use |
|
185 | - * when retrieving cached registrations from a transaction |
|
186 | - * @param bool $trigger_notifications whether or not to call |
|
187 | - * \EE_Registration_Processor::trigger_registration_update_notifications() |
|
188 | - * @return array |
|
189 | - * @throws \EE_Error |
|
190 | - */ |
|
191 | - public function update_transaction_and_registrations_after_checkout_or_payment( |
|
192 | - EE_Transaction $transaction, |
|
193 | - $payment = null, |
|
194 | - $registration_query_params = array(), |
|
195 | - $trigger_notifications = true |
|
196 | - ) { |
|
197 | - // make sure some query params are set for retrieving registrations |
|
198 | - $this->_set_registration_query_params($registration_query_params); |
|
199 | - // get final reg step status |
|
200 | - $finalized = $transaction->final_reg_step_completed(); |
|
201 | - // if the 'finalize_registration' step has been initiated (has a timestamp) |
|
202 | - // but has not yet been fully completed (TRUE) |
|
203 | - if (is_int($finalized) && $finalized !== false && $finalized !== true) { |
|
204 | - $transaction->set_reg_step_completed('finalize_registration'); |
|
205 | - $finalized = true; |
|
206 | - } |
|
207 | - $transaction->save(); |
|
208 | - // array of details to aid in decision making by systems |
|
209 | - $update_params = array( |
|
210 | - 'old_txn_status' => $transaction->old_txn_status(), |
|
211 | - 'new_txn_status' => $transaction->status_ID(), |
|
212 | - 'finalized' => $finalized, |
|
213 | - 'revisit' => $this->_revisit, |
|
214 | - 'payment_updates' => $payment instanceof EE_Payment ? true : false, |
|
215 | - 'last_payment' => $payment, |
|
216 | - ); |
|
217 | - // now update the registrations and add the results to our $update_params |
|
218 | - $update_params['status_updates'] = $this->_call_method_on_registrations_via_Registration_Processor( |
|
219 | - 'update_registration_after_checkout_or_payment', |
|
220 | - $transaction, |
|
221 | - $this->_registration_query_params, |
|
222 | - $update_params |
|
223 | - ); |
|
224 | - if ($trigger_notifications) { |
|
225 | - // send messages |
|
226 | - /** @type EE_Registration_Processor $registration_processor */ |
|
227 | - $registration_processor = EE_Registry::instance()->load_class('Registration_Processor'); |
|
228 | - $registration_processor->trigger_registration_update_notifications( |
|
229 | - $transaction->primary_registration(), |
|
230 | - $update_params |
|
231 | - ); |
|
232 | - } |
|
233 | - do_action( |
|
234 | - 'AHEE__EE_Transaction_Processor__update_transaction_and_registrations_after_checkout_or_payment', |
|
235 | - $transaction, |
|
236 | - $update_params |
|
237 | - ); |
|
238 | - return $update_params; |
|
239 | - } |
|
240 | - |
|
241 | - |
|
242 | - /** |
|
243 | - * update_transaction_after_registration_reopened |
|
244 | - * readjusts TXN and Line Item totals after a registration is changed from |
|
245 | - * cancelled or declined to another reg status such as pending payment or approved |
|
246 | - * |
|
247 | - * @param \EE_Registration $registration |
|
248 | - * @param array $closed_reg_statuses |
|
249 | - * @param bool $update_txn |
|
250 | - * @return bool |
|
251 | - * @throws \EE_Error |
|
252 | - */ |
|
253 | - public function update_transaction_after_reinstating_canceled_registration( |
|
254 | - EE_Registration $registration, |
|
255 | - $closed_reg_statuses = array(), |
|
256 | - $update_txn = true |
|
257 | - ) { |
|
258 | - // these reg statuses should not be considered in any calculations involving monies owing |
|
259 | - $closed_reg_statuses = ! empty($closed_reg_statuses) ? $closed_reg_statuses |
|
260 | - : EEM_Registration::closed_reg_statuses(); |
|
261 | - if (in_array($registration->status_ID(), $closed_reg_statuses, true)) { |
|
262 | - return false; |
|
263 | - } |
|
264 | - try { |
|
265 | - $transaction = $this->get_transaction_for_registration($registration); |
|
266 | - $ticket_line_item = $this->get_ticket_line_item_for_transaction_registration( |
|
267 | - $transaction, |
|
268 | - $registration |
|
269 | - ); |
|
270 | - // un-cancel the ticket |
|
271 | - $success = EEH_Line_Item::reinstate_canceled_ticket_line_item($ticket_line_item); |
|
272 | - } catch (EE_Error $e) { |
|
273 | - EE_Error::add_error( |
|
274 | - sprintf( |
|
275 | - __( |
|
276 | - 'The Ticket Line Item for Registration %1$d could not be reinstated because :%2$s%3$s', |
|
277 | - 'event_espresso' |
|
278 | - ), |
|
279 | - $registration->ID(), |
|
280 | - '<br />', |
|
281 | - $e->getMessage() |
|
282 | - ), |
|
283 | - __FILE__, |
|
284 | - __FUNCTION__, |
|
285 | - __LINE__ |
|
286 | - ); |
|
287 | - return false; |
|
288 | - } |
|
289 | - if ($update_txn) { |
|
290 | - return $transaction->save() ? $success : false; |
|
291 | - } |
|
292 | - return $success; |
|
293 | - } |
|
294 | - |
|
295 | - |
|
296 | - /** |
|
297 | - * update_transaction_after_canceled_or_declined_registration |
|
298 | - * readjusts TXN and Line Item totals after a registration is cancelled or declined |
|
299 | - * |
|
300 | - * @param \EE_Registration $registration |
|
301 | - * @param array $closed_reg_statuses |
|
302 | - * @param bool $update_txn |
|
303 | - * @return bool |
|
304 | - * @throws \EE_Error |
|
305 | - */ |
|
306 | - public function update_transaction_after_canceled_or_declined_registration( |
|
307 | - EE_Registration $registration, |
|
308 | - $closed_reg_statuses = array(), |
|
309 | - $update_txn = true |
|
310 | - ) { |
|
311 | - // these reg statuses should not be considered in any calculations involving monies owing |
|
312 | - $closed_reg_statuses = ! empty($closed_reg_statuses) ? $closed_reg_statuses |
|
313 | - : EEM_Registration::closed_reg_statuses(); |
|
314 | - if (! in_array($registration->status_ID(), $closed_reg_statuses, true)) { |
|
315 | - return false; |
|
316 | - } |
|
317 | - try { |
|
318 | - $transaction = $this->get_transaction_for_registration($registration); |
|
319 | - if (apply_filters( |
|
320 | - 'FHEE__EE_Transaction_Processor__update_transaction_after_canceled_or_declined_registration__cancel_ticket_line_item', |
|
321 | - true, |
|
322 | - $registration, |
|
323 | - $transaction |
|
324 | - )) { |
|
325 | - $ticket_line_item = $this->get_ticket_line_item_for_transaction_registration( |
|
326 | - $transaction, |
|
327 | - $registration |
|
328 | - ); |
|
329 | - EEH_Line_Item::cancel_ticket_line_item($ticket_line_item); |
|
330 | - } |
|
331 | - } catch (EE_Error $e) { |
|
332 | - EE_Error::add_error( |
|
333 | - sprintf( |
|
334 | - __( |
|
335 | - 'The Ticket Line Item for Registration %1$d could not be cancelled because :%2$s%3$s', |
|
336 | - 'event_espresso' |
|
337 | - ), |
|
338 | - $registration->ID(), |
|
339 | - '<br />', |
|
340 | - $e->getMessage() |
|
341 | - ), |
|
342 | - __FILE__, |
|
343 | - __FUNCTION__, |
|
344 | - __LINE__ |
|
345 | - ); |
|
346 | - return false; |
|
347 | - } |
|
348 | - if ($update_txn) { |
|
349 | - return $transaction->save() ? true : false; |
|
350 | - } |
|
351 | - return true; |
|
352 | - } |
|
353 | - |
|
354 | - |
|
355 | - /** |
|
356 | - * get_transaction_for_registration |
|
357 | - * |
|
358 | - * @access public |
|
359 | - * @param EE_Registration $registration |
|
360 | - * @return EE_Transaction |
|
361 | - * @throws EE_Error |
|
362 | - */ |
|
363 | - public function get_transaction_for_registration(EE_Registration $registration) |
|
364 | - { |
|
365 | - $transaction = $registration->transaction(); |
|
366 | - if (! $transaction instanceof EE_Transaction) { |
|
367 | - throw new EE_Error( |
|
368 | - sprintf( |
|
369 | - __('The Transaction for Registration %1$d was not found or is invalid.', 'event_espresso'), |
|
370 | - $registration->ID() |
|
371 | - ) |
|
372 | - ); |
|
373 | - } |
|
374 | - return $transaction; |
|
375 | - } |
|
376 | - |
|
377 | - |
|
378 | - /** |
|
379 | - * get_ticket_line_item_for_transaction_registration |
|
380 | - * |
|
381 | - * @access public |
|
382 | - * @param EE_Transaction $transaction |
|
383 | - * @param EE_Registration $registration |
|
384 | - * @return EE_Line_Item |
|
385 | - * @throws EE_Error |
|
386 | - */ |
|
387 | - public function get_ticket_line_item_for_transaction_registration( |
|
388 | - EE_Transaction $transaction, |
|
389 | - EE_Registration $registration |
|
390 | - ) { |
|
391 | - EE_Registry::instance()->load_helper('Line_Item'); |
|
392 | - $ticket_line_item = EEM_Line_Item::instance()->get_ticket_line_item_for_transaction( |
|
393 | - $transaction->ID(), |
|
394 | - $registration->ticket_ID() |
|
395 | - ); |
|
396 | - if (! $ticket_line_item instanceof EE_Line_Item) { |
|
397 | - throw new EE_Error( |
|
398 | - sprintf( |
|
399 | - __( |
|
400 | - 'The Line Item for Transaction %1$d and Ticket %2$d was not found or is invalid.', |
|
401 | - 'event_espresso' |
|
402 | - ), |
|
403 | - $transaction->ID(), |
|
404 | - $registration->ticket_ID() |
|
405 | - ) |
|
406 | - ); |
|
407 | - } |
|
408 | - return $ticket_line_item; |
|
409 | - } |
|
410 | - |
|
411 | - |
|
412 | - /** |
|
413 | - * cancel_transaction_if_all_registrations_canceled |
|
414 | - * cycles thru related registrations and checks their statuses |
|
415 | - * if ALL registrations are Cancelled or Declined, then this sets the TXN status to |
|
416 | - * |
|
417 | - * @access public |
|
418 | - * @param EE_Transaction $transaction |
|
419 | - * @param string $new_TXN_status |
|
420 | - * @param array $registration_query_params - array of query WHERE params to use when |
|
421 | - * retrieving cached registrations from a transaction |
|
422 | - * @param array $closed_reg_statuses |
|
423 | - * @param bool $update_txn |
|
424 | - * @return bool true if TXN status was updated, false if not |
|
425 | - */ |
|
426 | - public function toggle_transaction_status_if_all_registrations_canceled_or_declined( |
|
427 | - EE_Transaction $transaction, |
|
428 | - $new_TXN_status = '', |
|
429 | - $registration_query_params = array(), |
|
430 | - $closed_reg_statuses = array(), |
|
431 | - $update_txn = true |
|
432 | - ) { |
|
433 | - // make sure some query params are set for retrieving registrations |
|
434 | - $this->_set_registration_query_params($registration_query_params); |
|
435 | - // these reg statuses should not be considered in any calculations involving monies owing |
|
436 | - $closed_reg_statuses = ! empty($closed_reg_statuses) ? $closed_reg_statuses |
|
437 | - : EEM_Registration::closed_reg_statuses(); |
|
438 | - // loop through cached registrations |
|
439 | - foreach ($transaction->registrations($this->_registration_query_params) as $registration) { |
|
440 | - if ($registration instanceof EE_Registration |
|
441 | - && ! in_array($registration->status_ID(), $closed_reg_statuses) |
|
442 | - ) { |
|
443 | - return false; |
|
444 | - } |
|
445 | - } |
|
446 | - if (in_array($new_TXN_status, EEM_Transaction::txn_status_array())) { |
|
447 | - $transaction->set_status($new_TXN_status); |
|
448 | - } |
|
449 | - if ($update_txn) { |
|
450 | - return $transaction->save() ? true : false; |
|
451 | - } |
|
452 | - return true; |
|
453 | - } |
|
454 | - |
|
455 | - |
|
456 | - /** |
|
457 | - * _call_method_on_registrations_via_Registration_Processor |
|
458 | - * cycles thru related registrations and calls the requested method on each |
|
459 | - * |
|
460 | - * @access private |
|
461 | - * @param string $method_name |
|
462 | - * @param EE_Transaction $transaction |
|
463 | - * @param array $registration_query_params array of query WHERE params to use |
|
464 | - * when retrieving cached registrations from a transaction |
|
465 | - * @param string $additional_param |
|
466 | - * @throws \EE_Error |
|
467 | - * @return boolean |
|
468 | - */ |
|
469 | - private function _call_method_on_registrations_via_Registration_Processor( |
|
470 | - $method_name, |
|
471 | - EE_Transaction $transaction, |
|
472 | - $registration_query_params = array(), |
|
473 | - $additional_param = null |
|
474 | - ) { |
|
475 | - $response = false; |
|
476 | - /** @type EE_Registration_Processor $registration_processor */ |
|
477 | - $registration_processor = EE_Registry::instance()->load_class('Registration_Processor'); |
|
478 | - // check that method exists |
|
479 | - if (! method_exists($registration_processor, $method_name)) { |
|
480 | - throw new EE_Error(__('Method does not exist.', 'event_espresso')); |
|
481 | - } |
|
482 | - // make sure some query params are set for retrieving registrations |
|
483 | - $this->_set_registration_query_params($registration_query_params); |
|
484 | - // loop through cached registrations |
|
485 | - foreach ($transaction->registrations($this->_registration_query_params) as $registration) { |
|
486 | - if ($registration instanceof EE_Registration) { |
|
487 | - if ($additional_param) { |
|
488 | - $response = $registration_processor->{$method_name}($registration, $additional_param) |
|
489 | - ? true |
|
490 | - : $response; |
|
491 | - } else { |
|
492 | - $response = $registration_processor->{$method_name}($registration) |
|
493 | - ? true |
|
494 | - : $response; |
|
495 | - } |
|
496 | - } |
|
497 | - } |
|
498 | - return $response; |
|
499 | - } |
|
500 | - |
|
501 | - |
|
502 | - /** |
|
503 | - * set_transaction_payment_method_based_on_registration_statuses |
|
504 | - * sets or unsets the PMD_ID field on the TXN based on the related REG statuses |
|
505 | - * basically if ALL Registrations are "Not Approved", then the EE_Transaction.PMD_ID is set to null, |
|
506 | - * but if any Registration has a different status, then EE_Transaction.PMD_ID is set to either: |
|
507 | - * the first "default" Payment Method |
|
508 | - * the first active Payment Method |
|
509 | - * whichever is found first. |
|
510 | - * |
|
511 | - * @param EE_Registration $edited_registration |
|
512 | - * @return void |
|
513 | - * @throws \EE_Error |
|
514 | - */ |
|
515 | - public function set_transaction_payment_method_based_on_registration_statuses( |
|
516 | - EE_Registration $edited_registration |
|
517 | - ) { |
|
518 | - if ($edited_registration instanceof EE_Registration) { |
|
519 | - $transaction = $edited_registration->transaction(); |
|
520 | - if ($transaction instanceof EE_Transaction) { |
|
521 | - $all_not_approved = true; |
|
522 | - foreach ($transaction->registrations() as $registration) { |
|
523 | - if ($registration instanceof EE_Registration) { |
|
524 | - // if any REG != "Not Approved" then toggle to false |
|
525 | - $all_not_approved = $registration->is_not_approved() ? $all_not_approved : false; |
|
526 | - } |
|
527 | - } |
|
528 | - // if ALL Registrations are "Not Approved" |
|
529 | - if ($all_not_approved) { |
|
530 | - $transaction->set_payment_method_ID(null); |
|
531 | - $transaction->save(); |
|
532 | - } else { |
|
533 | - $available_payment_methods = EEM_Payment_Method::instance()->get_all_for_transaction( |
|
534 | - $transaction, |
|
535 | - EEM_Payment_Method::scope_cart |
|
536 | - ); |
|
537 | - if (! empty($available_payment_methods)) { |
|
538 | - $PMD_ID = 0; |
|
539 | - foreach ($available_payment_methods as $available_payment_method) { |
|
540 | - if ($available_payment_method instanceof EE_Payment_Method |
|
541 | - && $available_payment_method->open_by_default() |
|
542 | - ) { |
|
543 | - $PMD_ID = $available_payment_method->ID(); |
|
544 | - break; |
|
545 | - } |
|
546 | - } |
|
547 | - if (! $PMD_ID) { |
|
548 | - $first_payment_method = reset($available_payment_methods); |
|
549 | - if ($first_payment_method instanceof EE_Payment_Method) { |
|
550 | - $PMD_ID = $first_payment_method->ID(); |
|
551 | - } else { |
|
552 | - EE_Error::add_error( |
|
553 | - __( |
|
554 | - 'A valid Payment Method could not be determined. Please ensure that at least one Payment Method is activated.', |
|
555 | - 'event_espresso' |
|
556 | - ), |
|
557 | - __FILE__, |
|
558 | - __LINE__, |
|
559 | - __FUNCTION__ |
|
560 | - ); |
|
561 | - } |
|
562 | - } |
|
563 | - $transaction->set_payment_method_ID($PMD_ID); |
|
564 | - $transaction->save(); |
|
565 | - } else { |
|
566 | - EE_Error::add_error( |
|
567 | - __( |
|
568 | - 'Please activate at least one Payment Method in order for things to operate correctly.', |
|
569 | - 'event_espresso' |
|
570 | - ), |
|
571 | - __FILE__, |
|
572 | - __LINE__, |
|
573 | - __FUNCTION__ |
|
574 | - ); |
|
575 | - } |
|
576 | - } |
|
577 | - } |
|
578 | - } |
|
579 | - } |
|
580 | - |
|
581 | - |
|
582 | - |
|
583 | - /********************************** DEPRECATED METHODS **********************************/ |
|
584 | - |
|
585 | - |
|
586 | - /** |
|
587 | - * @deprecated 4.9.12 |
|
588 | - * @return string |
|
589 | - */ |
|
590 | - public function old_txn_status() |
|
591 | - { |
|
592 | - EE_Error::doing_it_wrong( |
|
593 | - __METHOD__, |
|
594 | - esc_html__( |
|
595 | - 'This logic has been moved into \EE_Transaction::old_txn_status(), please use that method instead.', |
|
596 | - 'event_espresso' |
|
597 | - ), |
|
598 | - '4.9.12' |
|
599 | - ); |
|
600 | - return $this->_old_txn_status; |
|
601 | - } |
|
602 | - |
|
603 | - |
|
604 | - /** |
|
605 | - * @deprecated 4.9.12 |
|
606 | - * @param string $old_txn_status |
|
607 | - */ |
|
608 | - public function set_old_txn_status($old_txn_status) |
|
609 | - { |
|
610 | - EE_Error::doing_it_wrong( |
|
611 | - __METHOD__, |
|
612 | - esc_html__( |
|
613 | - 'This logic has been moved into \EE_Transaction::set_old_txn_status(), please use that method instead.', |
|
614 | - 'event_espresso' |
|
615 | - ), |
|
616 | - '4.9.12' |
|
617 | - ); |
|
618 | - // only set the first time |
|
619 | - if ($this->_old_txn_status === null) { |
|
620 | - $this->_old_txn_status = $old_txn_status; |
|
621 | - } |
|
622 | - } |
|
623 | - |
|
624 | - |
|
625 | - /** |
|
626 | - * @deprecated 4.9.12 |
|
627 | - * @return string |
|
628 | - */ |
|
629 | - public function new_txn_status() |
|
630 | - { |
|
631 | - EE_Error::doing_it_wrong( |
|
632 | - __METHOD__, |
|
633 | - esc_html__( |
|
634 | - 'This logic has been removed. Please just use \EE_Transaction::status_ID() instead.', |
|
635 | - 'event_espresso' |
|
636 | - ), |
|
637 | - '4.9.12' |
|
638 | - ); |
|
639 | - return $this->_new_txn_status; |
|
640 | - } |
|
641 | - |
|
642 | - |
|
643 | - /** |
|
644 | - * @deprecated 4.9.12 |
|
645 | - * @param string $new_txn_status |
|
646 | - */ |
|
647 | - public function set_new_txn_status($new_txn_status) |
|
648 | - { |
|
649 | - EE_Error::doing_it_wrong( |
|
650 | - __METHOD__, |
|
651 | - esc_html__( |
|
652 | - 'This logic has been removed. Please just use \EE_Transaction::set_status() instead.', |
|
653 | - 'event_espresso' |
|
654 | - ), |
|
655 | - '4.9.12' |
|
656 | - ); |
|
657 | - $this->_new_txn_status = $new_txn_status; |
|
658 | - } |
|
659 | - |
|
660 | - |
|
661 | - /** |
|
662 | - * reg_status_updated |
|
663 | - * |
|
664 | - * @deprecated 4.9.12 |
|
665 | - * @return bool |
|
666 | - */ |
|
667 | - public function txn_status_updated() |
|
668 | - { |
|
669 | - EE_Error::doing_it_wrong( |
|
670 | - __METHOD__, |
|
671 | - esc_html__( |
|
672 | - 'This logic has been moved into \EE_Transaction::txn_status_updated(), please use that method instead.', |
|
673 | - 'event_espresso' |
|
674 | - ), |
|
675 | - '4.9.12' |
|
676 | - ); |
|
677 | - return $this->_new_txn_status !== $this->_old_txn_status && $this->_old_txn_status !== null ? true : false; |
|
678 | - } |
|
679 | - |
|
680 | - |
|
681 | - /** |
|
682 | - * all_reg_steps_completed |
|
683 | - * returns: |
|
684 | - * true if ALL reg steps have been marked as completed |
|
685 | - * or false if any step is not completed |
|
686 | - * |
|
687 | - * @deprecated 4.9.12 |
|
688 | - * @param EE_Transaction $transaction |
|
689 | - * @return boolean |
|
690 | - */ |
|
691 | - public function all_reg_steps_completed(EE_Transaction $transaction) |
|
692 | - { |
|
693 | - EE_Error::doing_it_wrong( |
|
694 | - __METHOD__, |
|
695 | - esc_html__( |
|
696 | - 'This logic has been moved into \EE_Transaction::all_reg_steps_completed(), please use that method instead.', |
|
697 | - 'event_espresso' |
|
698 | - ), |
|
699 | - '4.9.12', |
|
700 | - '5.0.0' |
|
701 | - ); |
|
702 | - return $transaction->all_reg_steps_completed(); |
|
703 | - } |
|
704 | - |
|
705 | - |
|
706 | - /** |
|
707 | - * all_reg_steps_completed_except |
|
708 | - * returns: |
|
709 | - * true if ALL reg steps, except a particular step that you wish to skip over, have been marked as completed |
|
710 | - * or false if any other step is not completed |
|
711 | - * or false if ALL steps are completed including the exception you are testing !!! |
|
712 | - * |
|
713 | - * @deprecated 4.9.12 |
|
714 | - * @param EE_Transaction $transaction |
|
715 | - * @param string $exception |
|
716 | - * @return boolean |
|
717 | - */ |
|
718 | - public function all_reg_steps_completed_except(EE_Transaction $transaction, $exception = '') |
|
719 | - { |
|
720 | - EE_Error::doing_it_wrong( |
|
721 | - __METHOD__, |
|
722 | - esc_html__( |
|
723 | - 'This logic has been moved into \EE_Transaction::all_reg_steps_completed_except(), please use that method instead.', |
|
724 | - 'event_espresso' |
|
725 | - ), |
|
726 | - '4.9.12', |
|
727 | - '5.0.0' |
|
728 | - ); |
|
729 | - return $transaction->all_reg_steps_completed_except($exception); |
|
730 | - } |
|
731 | - |
|
732 | - |
|
733 | - /** |
|
734 | - * all_reg_steps_completed_except |
|
735 | - * returns: |
|
736 | - * true if ALL reg steps, except the final step, have been marked as completed |
|
737 | - * or false if any step is not completed |
|
738 | - * or false if ALL steps are completed including the final step !!! |
|
739 | - * |
|
740 | - * @deprecated 4.9.12 |
|
741 | - * @param EE_Transaction $transaction |
|
742 | - * @return boolean |
|
743 | - */ |
|
744 | - public function all_reg_steps_completed_except_final_step(EE_Transaction $transaction) |
|
745 | - { |
|
746 | - EE_Error::doing_it_wrong( |
|
747 | - __METHOD__, |
|
748 | - esc_html__( |
|
749 | - 'This logic has been moved into \EE_Transaction::all_reg_steps_completed_except_final_step(), please use that method instead.', |
|
750 | - 'event_espresso' |
|
751 | - ), |
|
752 | - '4.9.12', |
|
753 | - '5.0.0' |
|
754 | - ); |
|
755 | - return $transaction->all_reg_steps_completed_except_final_step(); |
|
756 | - } |
|
757 | - |
|
758 | - |
|
759 | - /** |
|
760 | - * reg_step_completed |
|
761 | - * returns: |
|
762 | - * true if a specific reg step has been marked as completed |
|
763 | - * a Unix timestamp if it has been initialized but not yet completed, |
|
764 | - * or false if it has not yet been initialized |
|
765 | - * |
|
766 | - * @deprecated 4.9.12 |
|
767 | - * @param EE_Transaction $transaction |
|
768 | - * @param string $reg_step_slug |
|
769 | - * @return boolean | int |
|
770 | - */ |
|
771 | - public function reg_step_completed(EE_Transaction $transaction, $reg_step_slug) |
|
772 | - { |
|
773 | - EE_Error::doing_it_wrong( |
|
774 | - __METHOD__, |
|
775 | - esc_html__( |
|
776 | - 'This logic has been moved into \EE_Transaction::reg_step_completed(), please use that method instead.', |
|
777 | - 'event_espresso' |
|
778 | - ), |
|
779 | - '4.9.12', |
|
780 | - '5.0.0' |
|
781 | - ); |
|
782 | - return $transaction->reg_step_completed($reg_step_slug); |
|
783 | - } |
|
784 | - |
|
785 | - |
|
786 | - /** |
|
787 | - * completed_final_reg_step |
|
788 | - * returns: |
|
789 | - * true if the finalize_registration reg step has been marked as completed |
|
790 | - * a Unix timestamp if it has been initialized but not yet completed, |
|
791 | - * or false if it has not yet been initialized |
|
792 | - * |
|
793 | - * @deprecated 4.9.12 |
|
794 | - * @param EE_Transaction $transaction |
|
795 | - * @return boolean | int |
|
796 | - */ |
|
797 | - public function final_reg_step_completed(EE_Transaction $transaction) |
|
798 | - { |
|
799 | - EE_Error::doing_it_wrong( |
|
800 | - __METHOD__, |
|
801 | - esc_html__( |
|
802 | - 'This logic has been moved into \EE_Transaction::final_reg_step_completed(), please use that method instead.', |
|
803 | - 'event_espresso' |
|
804 | - ), |
|
805 | - '4.9.12', |
|
806 | - '5.0.0' |
|
807 | - ); |
|
808 | - return $transaction->final_reg_step_completed(); |
|
809 | - } |
|
810 | - |
|
811 | - |
|
812 | - /** |
|
813 | - * set_reg_step_initiated |
|
814 | - * given a valid TXN_reg_step, this sets it's value to a unix timestamp |
|
815 | - * |
|
816 | - * @deprecated 4.9.12 |
|
817 | - * @access public |
|
818 | - * @param \EE_Transaction $transaction |
|
819 | - * @param string $reg_step_slug |
|
820 | - * @return boolean |
|
821 | - * @throws \EE_Error |
|
822 | - */ |
|
823 | - public function set_reg_step_initiated(EE_Transaction $transaction, $reg_step_slug) |
|
824 | - { |
|
825 | - EE_Error::doing_it_wrong( |
|
826 | - __METHOD__, |
|
827 | - esc_html__( |
|
828 | - 'This logic has been moved into \EE_Transaction::set_reg_step_initiated(), please use that method instead.', |
|
829 | - 'event_espresso' |
|
830 | - ), |
|
831 | - '4.9.12', |
|
832 | - '5.0.0' |
|
833 | - ); |
|
834 | - return $transaction->set_reg_step_initiated($reg_step_slug); |
|
835 | - } |
|
836 | - |
|
837 | - |
|
838 | - /** |
|
839 | - * set_reg_step_completed |
|
840 | - * given a valid TXN_reg_step, this sets the step as completed |
|
841 | - * |
|
842 | - * @deprecated 4.9.12 |
|
843 | - * @access public |
|
844 | - * @param \EE_Transaction $transaction |
|
845 | - * @param string $reg_step_slug |
|
846 | - * @return boolean |
|
847 | - * @throws \EE_Error |
|
848 | - */ |
|
849 | - public function set_reg_step_completed(EE_Transaction $transaction, $reg_step_slug) |
|
850 | - { |
|
851 | - EE_Error::doing_it_wrong( |
|
852 | - __METHOD__, |
|
853 | - esc_html__( |
|
854 | - 'This logic has been moved into \EE_Transaction::set_reg_step_completed(), please use that method instead.', |
|
855 | - 'event_espresso' |
|
856 | - ), |
|
857 | - '4.9.12', |
|
858 | - '5.0.0' |
|
859 | - ); |
|
860 | - return $transaction->set_reg_step_completed($reg_step_slug); |
|
861 | - } |
|
862 | - |
|
863 | - |
|
864 | - /** |
|
865 | - * set_reg_step_completed |
|
866 | - * given a valid TXN_reg_step slug, this sets the step as NOT completed |
|
867 | - * |
|
868 | - * @deprecated 4.9.12 |
|
869 | - * @access public |
|
870 | - * @param \EE_Transaction $transaction |
|
871 | - * @param string $reg_step_slug |
|
872 | - * @return boolean |
|
873 | - * @throws \EE_Error |
|
874 | - */ |
|
875 | - public function set_reg_step_not_completed(EE_Transaction $transaction, $reg_step_slug) |
|
876 | - { |
|
877 | - EE_Error::doing_it_wrong( |
|
878 | - __METHOD__, |
|
879 | - esc_html__( |
|
880 | - 'This logic has been moved into \EE_Transaction::set_reg_step_not_completed(), please use that method instead.', |
|
881 | - 'event_espresso' |
|
882 | - ), |
|
883 | - '4.9.12', |
|
884 | - '5.0.0' |
|
885 | - ); |
|
886 | - return $transaction->set_reg_step_not_completed($reg_step_slug); |
|
887 | - } |
|
888 | - |
|
889 | - |
|
890 | - /** |
|
891 | - * remove_reg_step |
|
892 | - * given a valid TXN_reg_step slug, this will remove (unset) |
|
893 | - * the reg step from the TXN reg step array |
|
894 | - * |
|
895 | - * @deprecated 4.9.12 |
|
896 | - * @access public |
|
897 | - * @param \EE_Transaction $transaction |
|
898 | - * @param string $reg_step_slug |
|
899 | - * @return void |
|
900 | - */ |
|
901 | - public function remove_reg_step(EE_Transaction $transaction, $reg_step_slug) |
|
902 | - { |
|
903 | - EE_Error::doing_it_wrong( |
|
904 | - __METHOD__, |
|
905 | - esc_html__( |
|
906 | - 'This logic has been moved into \EE_Transaction::remove_reg_step(), please use that method instead.', |
|
907 | - 'event_espresso' |
|
908 | - ), |
|
909 | - '4.9.12', |
|
910 | - '5.0.0' |
|
911 | - ); |
|
912 | - $transaction->remove_reg_step($reg_step_slug); |
|
913 | - } |
|
914 | - |
|
915 | - |
|
916 | - /** |
|
917 | - * toggle_failed_transaction_status |
|
918 | - * upgrades a TXNs status from failed to abandoned, |
|
919 | - * meaning that contact information has been captured for at least one registrant |
|
920 | - * |
|
921 | - * @deprecated 4.9.12 |
|
922 | - * @access public |
|
923 | - * @param EE_Transaction $transaction |
|
924 | - * @return boolean |
|
925 | - * @throws \EE_Error |
|
926 | - */ |
|
927 | - public function toggle_failed_transaction_status(EE_Transaction $transaction) |
|
928 | - { |
|
929 | - EE_Error::doing_it_wrong( |
|
930 | - __METHOD__, |
|
931 | - esc_html__( |
|
932 | - 'This logic has been moved into \EE_Transaction::toggle_failed_transaction_status(), please use that method instead.', |
|
933 | - 'event_espresso' |
|
934 | - ), |
|
935 | - '4.9.12', |
|
936 | - '5.0.0' |
|
937 | - ); |
|
938 | - return $transaction->toggle_failed_transaction_status(); |
|
939 | - } |
|
940 | - |
|
941 | - |
|
942 | - /** |
|
943 | - * toggle_abandoned_transaction_status |
|
944 | - * upgrades a TXNs status from failed or abandoned to incomplete |
|
945 | - * |
|
946 | - * @deprecated 4.9.12 |
|
947 | - * @access public |
|
948 | - * @param EE_Transaction $transaction |
|
949 | - * @return boolean |
|
950 | - */ |
|
951 | - public function toggle_abandoned_transaction_status(EE_Transaction $transaction) |
|
952 | - { |
|
953 | - EE_Error::doing_it_wrong( |
|
954 | - __METHOD__, |
|
955 | - esc_html__( |
|
956 | - 'This logic has been moved into \EE_Transaction::toggle_abandoned_transaction_status(), please use that method instead.', |
|
957 | - 'event_espresso' |
|
958 | - ), |
|
959 | - '4.9.12', |
|
960 | - '5.0.0' |
|
961 | - ); |
|
962 | - return $transaction->toggle_abandoned_transaction_status(); |
|
963 | - } |
|
20 | + /** |
|
21 | + * @var EE_Registration_Processor $_instance |
|
22 | + * @access private |
|
23 | + */ |
|
24 | + private static $_instance; |
|
25 | + |
|
26 | + /** |
|
27 | + * array of query WHERE params to use when retrieving cached registrations from a transaction |
|
28 | + * |
|
29 | + * @var array $registration_query_params |
|
30 | + * @access private |
|
31 | + */ |
|
32 | + private $_registration_query_params = array(); |
|
33 | + |
|
34 | + /** |
|
35 | + * @deprecated |
|
36 | + * @var string |
|
37 | + */ |
|
38 | + protected $_old_txn_status; |
|
39 | + |
|
40 | + /** |
|
41 | + * @deprecated |
|
42 | + * @var string |
|
43 | + */ |
|
44 | + protected $_new_txn_status; |
|
45 | + |
|
46 | + |
|
47 | + /** |
|
48 | + * @singleton method used to instantiate class object |
|
49 | + * @access public |
|
50 | + * @param array $registration_query_params |
|
51 | + * @return EE_Transaction_Processor instance |
|
52 | + */ |
|
53 | + public static function instance($registration_query_params = array()) |
|
54 | + { |
|
55 | + // check if class object is instantiated |
|
56 | + if (! self::$_instance instanceof EE_Transaction_Processor) { |
|
57 | + self::$_instance = new self($registration_query_params); |
|
58 | + } |
|
59 | + return self::$_instance; |
|
60 | + } |
|
61 | + |
|
62 | + |
|
63 | + /** |
|
64 | + * @param array $registration_query_params |
|
65 | + */ |
|
66 | + private function __construct($registration_query_params = array()) |
|
67 | + { |
|
68 | + // make sure some query params are set for retrieving registrations |
|
69 | + $this->_set_registration_query_params($registration_query_params); |
|
70 | + } |
|
71 | + |
|
72 | + |
|
73 | + /** |
|
74 | + * @access private |
|
75 | + * @param array $registration_query_params |
|
76 | + */ |
|
77 | + private function _set_registration_query_params($registration_query_params) |
|
78 | + { |
|
79 | + $this->_registration_query_params = ! empty($registration_query_params) ? $registration_query_params |
|
80 | + : array('order_by' => array('REG_count' => 'ASC')); |
|
81 | + } |
|
82 | + |
|
83 | + |
|
84 | + /** |
|
85 | + * manually_update_registration_statuses |
|
86 | + * |
|
87 | + * @access public |
|
88 | + * @param EE_Transaction $transaction |
|
89 | + * @param string $new_reg_status |
|
90 | + * @param array $registration_query_params array of query WHERE params to use |
|
91 | + * when retrieving cached registrations from a transaction |
|
92 | + * @return boolean |
|
93 | + * @throws \EE_Error |
|
94 | + */ |
|
95 | + public function manually_update_registration_statuses( |
|
96 | + EE_Transaction $transaction, |
|
97 | + $new_reg_status = '', |
|
98 | + $registration_query_params = array() |
|
99 | + ) { |
|
100 | + $status_updates = $this->_call_method_on_registrations_via_Registration_Processor( |
|
101 | + 'manually_update_registration_status', |
|
102 | + $transaction, |
|
103 | + $registration_query_params, |
|
104 | + $new_reg_status |
|
105 | + ); |
|
106 | + // send messages |
|
107 | + /** @type EE_Registration_Processor $registration_processor */ |
|
108 | + $registration_processor = EE_Registry::instance()->load_class('Registration_Processor'); |
|
109 | + $registration_processor->trigger_registration_update_notifications( |
|
110 | + $transaction->primary_registration(), |
|
111 | + array('manually_updated' => true) |
|
112 | + ); |
|
113 | + do_action( |
|
114 | + 'AHEE__EE_Transaction_Processor__manually_update_registration_statuses', |
|
115 | + $transaction, |
|
116 | + $status_updates |
|
117 | + ); |
|
118 | + return $status_updates; |
|
119 | + } |
|
120 | + |
|
121 | + |
|
122 | + /** |
|
123 | + * toggle_registration_statuses_for_default_approved_events |
|
124 | + * |
|
125 | + * @access public |
|
126 | + * @param EE_Transaction $transaction |
|
127 | + * @param array $registration_query_params array of query WHERE params to use |
|
128 | + * when retrieving cached registrations from a transaction |
|
129 | + * @return boolean |
|
130 | + * @throws \EE_Error |
|
131 | + */ |
|
132 | + public function toggle_registration_statuses_for_default_approved_events( |
|
133 | + EE_Transaction $transaction, |
|
134 | + $registration_query_params = array() |
|
135 | + ) { |
|
136 | + $status_updates = $this->_call_method_on_registrations_via_Registration_Processor( |
|
137 | + 'toggle_registration_status_for_default_approved_events', |
|
138 | + $transaction, |
|
139 | + $registration_query_params |
|
140 | + ); |
|
141 | + do_action( |
|
142 | + 'AHEE__EE_Transaction_Processor__toggle_registration_statuses_for_default_approved_events', |
|
143 | + $transaction, |
|
144 | + $status_updates |
|
145 | + ); |
|
146 | + return $status_updates; |
|
147 | + } |
|
148 | + |
|
149 | + |
|
150 | + /** |
|
151 | + * toggle_registration_statuses_if_no_monies_owing |
|
152 | + * |
|
153 | + * @access public |
|
154 | + * @param EE_Transaction $transaction |
|
155 | + * @param array $registration_query_params array of query WHERE params to use |
|
156 | + * when retrieving cached registrations from a transaction |
|
157 | + * @return boolean |
|
158 | + * @throws \EE_Error |
|
159 | + */ |
|
160 | + public function toggle_registration_statuses_if_no_monies_owing( |
|
161 | + EE_Transaction $transaction, |
|
162 | + $registration_query_params = array() |
|
163 | + ) { |
|
164 | + $status_updates = $this->_call_method_on_registrations_via_Registration_Processor( |
|
165 | + 'toggle_registration_status_if_no_monies_owing', |
|
166 | + $transaction, |
|
167 | + $registration_query_params |
|
168 | + ); |
|
169 | + do_action( |
|
170 | + 'AHEE__EE_Transaction_Processor__toggle_registration_statuses_if_no_monies_owing', |
|
171 | + $transaction, |
|
172 | + $status_updates |
|
173 | + ); |
|
174 | + return $status_updates; |
|
175 | + } |
|
176 | + |
|
177 | + |
|
178 | + /** |
|
179 | + * update_transaction_and_registrations_after_checkout_or_payment |
|
180 | + * cycles thru related registrations and calls update_registration_after_checkout_or_payment() on each |
|
181 | + * |
|
182 | + * @param EE_Transaction $transaction |
|
183 | + * @param \EE_Payment | NULL $payment |
|
184 | + * @param array $registration_query_params array of query WHERE params to use |
|
185 | + * when retrieving cached registrations from a transaction |
|
186 | + * @param bool $trigger_notifications whether or not to call |
|
187 | + * \EE_Registration_Processor::trigger_registration_update_notifications() |
|
188 | + * @return array |
|
189 | + * @throws \EE_Error |
|
190 | + */ |
|
191 | + public function update_transaction_and_registrations_after_checkout_or_payment( |
|
192 | + EE_Transaction $transaction, |
|
193 | + $payment = null, |
|
194 | + $registration_query_params = array(), |
|
195 | + $trigger_notifications = true |
|
196 | + ) { |
|
197 | + // make sure some query params are set for retrieving registrations |
|
198 | + $this->_set_registration_query_params($registration_query_params); |
|
199 | + // get final reg step status |
|
200 | + $finalized = $transaction->final_reg_step_completed(); |
|
201 | + // if the 'finalize_registration' step has been initiated (has a timestamp) |
|
202 | + // but has not yet been fully completed (TRUE) |
|
203 | + if (is_int($finalized) && $finalized !== false && $finalized !== true) { |
|
204 | + $transaction->set_reg_step_completed('finalize_registration'); |
|
205 | + $finalized = true; |
|
206 | + } |
|
207 | + $transaction->save(); |
|
208 | + // array of details to aid in decision making by systems |
|
209 | + $update_params = array( |
|
210 | + 'old_txn_status' => $transaction->old_txn_status(), |
|
211 | + 'new_txn_status' => $transaction->status_ID(), |
|
212 | + 'finalized' => $finalized, |
|
213 | + 'revisit' => $this->_revisit, |
|
214 | + 'payment_updates' => $payment instanceof EE_Payment ? true : false, |
|
215 | + 'last_payment' => $payment, |
|
216 | + ); |
|
217 | + // now update the registrations and add the results to our $update_params |
|
218 | + $update_params['status_updates'] = $this->_call_method_on_registrations_via_Registration_Processor( |
|
219 | + 'update_registration_after_checkout_or_payment', |
|
220 | + $transaction, |
|
221 | + $this->_registration_query_params, |
|
222 | + $update_params |
|
223 | + ); |
|
224 | + if ($trigger_notifications) { |
|
225 | + // send messages |
|
226 | + /** @type EE_Registration_Processor $registration_processor */ |
|
227 | + $registration_processor = EE_Registry::instance()->load_class('Registration_Processor'); |
|
228 | + $registration_processor->trigger_registration_update_notifications( |
|
229 | + $transaction->primary_registration(), |
|
230 | + $update_params |
|
231 | + ); |
|
232 | + } |
|
233 | + do_action( |
|
234 | + 'AHEE__EE_Transaction_Processor__update_transaction_and_registrations_after_checkout_or_payment', |
|
235 | + $transaction, |
|
236 | + $update_params |
|
237 | + ); |
|
238 | + return $update_params; |
|
239 | + } |
|
240 | + |
|
241 | + |
|
242 | + /** |
|
243 | + * update_transaction_after_registration_reopened |
|
244 | + * readjusts TXN and Line Item totals after a registration is changed from |
|
245 | + * cancelled or declined to another reg status such as pending payment or approved |
|
246 | + * |
|
247 | + * @param \EE_Registration $registration |
|
248 | + * @param array $closed_reg_statuses |
|
249 | + * @param bool $update_txn |
|
250 | + * @return bool |
|
251 | + * @throws \EE_Error |
|
252 | + */ |
|
253 | + public function update_transaction_after_reinstating_canceled_registration( |
|
254 | + EE_Registration $registration, |
|
255 | + $closed_reg_statuses = array(), |
|
256 | + $update_txn = true |
|
257 | + ) { |
|
258 | + // these reg statuses should not be considered in any calculations involving monies owing |
|
259 | + $closed_reg_statuses = ! empty($closed_reg_statuses) ? $closed_reg_statuses |
|
260 | + : EEM_Registration::closed_reg_statuses(); |
|
261 | + if (in_array($registration->status_ID(), $closed_reg_statuses, true)) { |
|
262 | + return false; |
|
263 | + } |
|
264 | + try { |
|
265 | + $transaction = $this->get_transaction_for_registration($registration); |
|
266 | + $ticket_line_item = $this->get_ticket_line_item_for_transaction_registration( |
|
267 | + $transaction, |
|
268 | + $registration |
|
269 | + ); |
|
270 | + // un-cancel the ticket |
|
271 | + $success = EEH_Line_Item::reinstate_canceled_ticket_line_item($ticket_line_item); |
|
272 | + } catch (EE_Error $e) { |
|
273 | + EE_Error::add_error( |
|
274 | + sprintf( |
|
275 | + __( |
|
276 | + 'The Ticket Line Item for Registration %1$d could not be reinstated because :%2$s%3$s', |
|
277 | + 'event_espresso' |
|
278 | + ), |
|
279 | + $registration->ID(), |
|
280 | + '<br />', |
|
281 | + $e->getMessage() |
|
282 | + ), |
|
283 | + __FILE__, |
|
284 | + __FUNCTION__, |
|
285 | + __LINE__ |
|
286 | + ); |
|
287 | + return false; |
|
288 | + } |
|
289 | + if ($update_txn) { |
|
290 | + return $transaction->save() ? $success : false; |
|
291 | + } |
|
292 | + return $success; |
|
293 | + } |
|
294 | + |
|
295 | + |
|
296 | + /** |
|
297 | + * update_transaction_after_canceled_or_declined_registration |
|
298 | + * readjusts TXN and Line Item totals after a registration is cancelled or declined |
|
299 | + * |
|
300 | + * @param \EE_Registration $registration |
|
301 | + * @param array $closed_reg_statuses |
|
302 | + * @param bool $update_txn |
|
303 | + * @return bool |
|
304 | + * @throws \EE_Error |
|
305 | + */ |
|
306 | + public function update_transaction_after_canceled_or_declined_registration( |
|
307 | + EE_Registration $registration, |
|
308 | + $closed_reg_statuses = array(), |
|
309 | + $update_txn = true |
|
310 | + ) { |
|
311 | + // these reg statuses should not be considered in any calculations involving monies owing |
|
312 | + $closed_reg_statuses = ! empty($closed_reg_statuses) ? $closed_reg_statuses |
|
313 | + : EEM_Registration::closed_reg_statuses(); |
|
314 | + if (! in_array($registration->status_ID(), $closed_reg_statuses, true)) { |
|
315 | + return false; |
|
316 | + } |
|
317 | + try { |
|
318 | + $transaction = $this->get_transaction_for_registration($registration); |
|
319 | + if (apply_filters( |
|
320 | + 'FHEE__EE_Transaction_Processor__update_transaction_after_canceled_or_declined_registration__cancel_ticket_line_item', |
|
321 | + true, |
|
322 | + $registration, |
|
323 | + $transaction |
|
324 | + )) { |
|
325 | + $ticket_line_item = $this->get_ticket_line_item_for_transaction_registration( |
|
326 | + $transaction, |
|
327 | + $registration |
|
328 | + ); |
|
329 | + EEH_Line_Item::cancel_ticket_line_item($ticket_line_item); |
|
330 | + } |
|
331 | + } catch (EE_Error $e) { |
|
332 | + EE_Error::add_error( |
|
333 | + sprintf( |
|
334 | + __( |
|
335 | + 'The Ticket Line Item for Registration %1$d could not be cancelled because :%2$s%3$s', |
|
336 | + 'event_espresso' |
|
337 | + ), |
|
338 | + $registration->ID(), |
|
339 | + '<br />', |
|
340 | + $e->getMessage() |
|
341 | + ), |
|
342 | + __FILE__, |
|
343 | + __FUNCTION__, |
|
344 | + __LINE__ |
|
345 | + ); |
|
346 | + return false; |
|
347 | + } |
|
348 | + if ($update_txn) { |
|
349 | + return $transaction->save() ? true : false; |
|
350 | + } |
|
351 | + return true; |
|
352 | + } |
|
353 | + |
|
354 | + |
|
355 | + /** |
|
356 | + * get_transaction_for_registration |
|
357 | + * |
|
358 | + * @access public |
|
359 | + * @param EE_Registration $registration |
|
360 | + * @return EE_Transaction |
|
361 | + * @throws EE_Error |
|
362 | + */ |
|
363 | + public function get_transaction_for_registration(EE_Registration $registration) |
|
364 | + { |
|
365 | + $transaction = $registration->transaction(); |
|
366 | + if (! $transaction instanceof EE_Transaction) { |
|
367 | + throw new EE_Error( |
|
368 | + sprintf( |
|
369 | + __('The Transaction for Registration %1$d was not found or is invalid.', 'event_espresso'), |
|
370 | + $registration->ID() |
|
371 | + ) |
|
372 | + ); |
|
373 | + } |
|
374 | + return $transaction; |
|
375 | + } |
|
376 | + |
|
377 | + |
|
378 | + /** |
|
379 | + * get_ticket_line_item_for_transaction_registration |
|
380 | + * |
|
381 | + * @access public |
|
382 | + * @param EE_Transaction $transaction |
|
383 | + * @param EE_Registration $registration |
|
384 | + * @return EE_Line_Item |
|
385 | + * @throws EE_Error |
|
386 | + */ |
|
387 | + public function get_ticket_line_item_for_transaction_registration( |
|
388 | + EE_Transaction $transaction, |
|
389 | + EE_Registration $registration |
|
390 | + ) { |
|
391 | + EE_Registry::instance()->load_helper('Line_Item'); |
|
392 | + $ticket_line_item = EEM_Line_Item::instance()->get_ticket_line_item_for_transaction( |
|
393 | + $transaction->ID(), |
|
394 | + $registration->ticket_ID() |
|
395 | + ); |
|
396 | + if (! $ticket_line_item instanceof EE_Line_Item) { |
|
397 | + throw new EE_Error( |
|
398 | + sprintf( |
|
399 | + __( |
|
400 | + 'The Line Item for Transaction %1$d and Ticket %2$d was not found or is invalid.', |
|
401 | + 'event_espresso' |
|
402 | + ), |
|
403 | + $transaction->ID(), |
|
404 | + $registration->ticket_ID() |
|
405 | + ) |
|
406 | + ); |
|
407 | + } |
|
408 | + return $ticket_line_item; |
|
409 | + } |
|
410 | + |
|
411 | + |
|
412 | + /** |
|
413 | + * cancel_transaction_if_all_registrations_canceled |
|
414 | + * cycles thru related registrations and checks their statuses |
|
415 | + * if ALL registrations are Cancelled or Declined, then this sets the TXN status to |
|
416 | + * |
|
417 | + * @access public |
|
418 | + * @param EE_Transaction $transaction |
|
419 | + * @param string $new_TXN_status |
|
420 | + * @param array $registration_query_params - array of query WHERE params to use when |
|
421 | + * retrieving cached registrations from a transaction |
|
422 | + * @param array $closed_reg_statuses |
|
423 | + * @param bool $update_txn |
|
424 | + * @return bool true if TXN status was updated, false if not |
|
425 | + */ |
|
426 | + public function toggle_transaction_status_if_all_registrations_canceled_or_declined( |
|
427 | + EE_Transaction $transaction, |
|
428 | + $new_TXN_status = '', |
|
429 | + $registration_query_params = array(), |
|
430 | + $closed_reg_statuses = array(), |
|
431 | + $update_txn = true |
|
432 | + ) { |
|
433 | + // make sure some query params are set for retrieving registrations |
|
434 | + $this->_set_registration_query_params($registration_query_params); |
|
435 | + // these reg statuses should not be considered in any calculations involving monies owing |
|
436 | + $closed_reg_statuses = ! empty($closed_reg_statuses) ? $closed_reg_statuses |
|
437 | + : EEM_Registration::closed_reg_statuses(); |
|
438 | + // loop through cached registrations |
|
439 | + foreach ($transaction->registrations($this->_registration_query_params) as $registration) { |
|
440 | + if ($registration instanceof EE_Registration |
|
441 | + && ! in_array($registration->status_ID(), $closed_reg_statuses) |
|
442 | + ) { |
|
443 | + return false; |
|
444 | + } |
|
445 | + } |
|
446 | + if (in_array($new_TXN_status, EEM_Transaction::txn_status_array())) { |
|
447 | + $transaction->set_status($new_TXN_status); |
|
448 | + } |
|
449 | + if ($update_txn) { |
|
450 | + return $transaction->save() ? true : false; |
|
451 | + } |
|
452 | + return true; |
|
453 | + } |
|
454 | + |
|
455 | + |
|
456 | + /** |
|
457 | + * _call_method_on_registrations_via_Registration_Processor |
|
458 | + * cycles thru related registrations and calls the requested method on each |
|
459 | + * |
|
460 | + * @access private |
|
461 | + * @param string $method_name |
|
462 | + * @param EE_Transaction $transaction |
|
463 | + * @param array $registration_query_params array of query WHERE params to use |
|
464 | + * when retrieving cached registrations from a transaction |
|
465 | + * @param string $additional_param |
|
466 | + * @throws \EE_Error |
|
467 | + * @return boolean |
|
468 | + */ |
|
469 | + private function _call_method_on_registrations_via_Registration_Processor( |
|
470 | + $method_name, |
|
471 | + EE_Transaction $transaction, |
|
472 | + $registration_query_params = array(), |
|
473 | + $additional_param = null |
|
474 | + ) { |
|
475 | + $response = false; |
|
476 | + /** @type EE_Registration_Processor $registration_processor */ |
|
477 | + $registration_processor = EE_Registry::instance()->load_class('Registration_Processor'); |
|
478 | + // check that method exists |
|
479 | + if (! method_exists($registration_processor, $method_name)) { |
|
480 | + throw new EE_Error(__('Method does not exist.', 'event_espresso')); |
|
481 | + } |
|
482 | + // make sure some query params are set for retrieving registrations |
|
483 | + $this->_set_registration_query_params($registration_query_params); |
|
484 | + // loop through cached registrations |
|
485 | + foreach ($transaction->registrations($this->_registration_query_params) as $registration) { |
|
486 | + if ($registration instanceof EE_Registration) { |
|
487 | + if ($additional_param) { |
|
488 | + $response = $registration_processor->{$method_name}($registration, $additional_param) |
|
489 | + ? true |
|
490 | + : $response; |
|
491 | + } else { |
|
492 | + $response = $registration_processor->{$method_name}($registration) |
|
493 | + ? true |
|
494 | + : $response; |
|
495 | + } |
|
496 | + } |
|
497 | + } |
|
498 | + return $response; |
|
499 | + } |
|
500 | + |
|
501 | + |
|
502 | + /** |
|
503 | + * set_transaction_payment_method_based_on_registration_statuses |
|
504 | + * sets or unsets the PMD_ID field on the TXN based on the related REG statuses |
|
505 | + * basically if ALL Registrations are "Not Approved", then the EE_Transaction.PMD_ID is set to null, |
|
506 | + * but if any Registration has a different status, then EE_Transaction.PMD_ID is set to either: |
|
507 | + * the first "default" Payment Method |
|
508 | + * the first active Payment Method |
|
509 | + * whichever is found first. |
|
510 | + * |
|
511 | + * @param EE_Registration $edited_registration |
|
512 | + * @return void |
|
513 | + * @throws \EE_Error |
|
514 | + */ |
|
515 | + public function set_transaction_payment_method_based_on_registration_statuses( |
|
516 | + EE_Registration $edited_registration |
|
517 | + ) { |
|
518 | + if ($edited_registration instanceof EE_Registration) { |
|
519 | + $transaction = $edited_registration->transaction(); |
|
520 | + if ($transaction instanceof EE_Transaction) { |
|
521 | + $all_not_approved = true; |
|
522 | + foreach ($transaction->registrations() as $registration) { |
|
523 | + if ($registration instanceof EE_Registration) { |
|
524 | + // if any REG != "Not Approved" then toggle to false |
|
525 | + $all_not_approved = $registration->is_not_approved() ? $all_not_approved : false; |
|
526 | + } |
|
527 | + } |
|
528 | + // if ALL Registrations are "Not Approved" |
|
529 | + if ($all_not_approved) { |
|
530 | + $transaction->set_payment_method_ID(null); |
|
531 | + $transaction->save(); |
|
532 | + } else { |
|
533 | + $available_payment_methods = EEM_Payment_Method::instance()->get_all_for_transaction( |
|
534 | + $transaction, |
|
535 | + EEM_Payment_Method::scope_cart |
|
536 | + ); |
|
537 | + if (! empty($available_payment_methods)) { |
|
538 | + $PMD_ID = 0; |
|
539 | + foreach ($available_payment_methods as $available_payment_method) { |
|
540 | + if ($available_payment_method instanceof EE_Payment_Method |
|
541 | + && $available_payment_method->open_by_default() |
|
542 | + ) { |
|
543 | + $PMD_ID = $available_payment_method->ID(); |
|
544 | + break; |
|
545 | + } |
|
546 | + } |
|
547 | + if (! $PMD_ID) { |
|
548 | + $first_payment_method = reset($available_payment_methods); |
|
549 | + if ($first_payment_method instanceof EE_Payment_Method) { |
|
550 | + $PMD_ID = $first_payment_method->ID(); |
|
551 | + } else { |
|
552 | + EE_Error::add_error( |
|
553 | + __( |
|
554 | + 'A valid Payment Method could not be determined. Please ensure that at least one Payment Method is activated.', |
|
555 | + 'event_espresso' |
|
556 | + ), |
|
557 | + __FILE__, |
|
558 | + __LINE__, |
|
559 | + __FUNCTION__ |
|
560 | + ); |
|
561 | + } |
|
562 | + } |
|
563 | + $transaction->set_payment_method_ID($PMD_ID); |
|
564 | + $transaction->save(); |
|
565 | + } else { |
|
566 | + EE_Error::add_error( |
|
567 | + __( |
|
568 | + 'Please activate at least one Payment Method in order for things to operate correctly.', |
|
569 | + 'event_espresso' |
|
570 | + ), |
|
571 | + __FILE__, |
|
572 | + __LINE__, |
|
573 | + __FUNCTION__ |
|
574 | + ); |
|
575 | + } |
|
576 | + } |
|
577 | + } |
|
578 | + } |
|
579 | + } |
|
580 | + |
|
581 | + |
|
582 | + |
|
583 | + /********************************** DEPRECATED METHODS **********************************/ |
|
584 | + |
|
585 | + |
|
586 | + /** |
|
587 | + * @deprecated 4.9.12 |
|
588 | + * @return string |
|
589 | + */ |
|
590 | + public function old_txn_status() |
|
591 | + { |
|
592 | + EE_Error::doing_it_wrong( |
|
593 | + __METHOD__, |
|
594 | + esc_html__( |
|
595 | + 'This logic has been moved into \EE_Transaction::old_txn_status(), please use that method instead.', |
|
596 | + 'event_espresso' |
|
597 | + ), |
|
598 | + '4.9.12' |
|
599 | + ); |
|
600 | + return $this->_old_txn_status; |
|
601 | + } |
|
602 | + |
|
603 | + |
|
604 | + /** |
|
605 | + * @deprecated 4.9.12 |
|
606 | + * @param string $old_txn_status |
|
607 | + */ |
|
608 | + public function set_old_txn_status($old_txn_status) |
|
609 | + { |
|
610 | + EE_Error::doing_it_wrong( |
|
611 | + __METHOD__, |
|
612 | + esc_html__( |
|
613 | + 'This logic has been moved into \EE_Transaction::set_old_txn_status(), please use that method instead.', |
|
614 | + 'event_espresso' |
|
615 | + ), |
|
616 | + '4.9.12' |
|
617 | + ); |
|
618 | + // only set the first time |
|
619 | + if ($this->_old_txn_status === null) { |
|
620 | + $this->_old_txn_status = $old_txn_status; |
|
621 | + } |
|
622 | + } |
|
623 | + |
|
624 | + |
|
625 | + /** |
|
626 | + * @deprecated 4.9.12 |
|
627 | + * @return string |
|
628 | + */ |
|
629 | + public function new_txn_status() |
|
630 | + { |
|
631 | + EE_Error::doing_it_wrong( |
|
632 | + __METHOD__, |
|
633 | + esc_html__( |
|
634 | + 'This logic has been removed. Please just use \EE_Transaction::status_ID() instead.', |
|
635 | + 'event_espresso' |
|
636 | + ), |
|
637 | + '4.9.12' |
|
638 | + ); |
|
639 | + return $this->_new_txn_status; |
|
640 | + } |
|
641 | + |
|
642 | + |
|
643 | + /** |
|
644 | + * @deprecated 4.9.12 |
|
645 | + * @param string $new_txn_status |
|
646 | + */ |
|
647 | + public function set_new_txn_status($new_txn_status) |
|
648 | + { |
|
649 | + EE_Error::doing_it_wrong( |
|
650 | + __METHOD__, |
|
651 | + esc_html__( |
|
652 | + 'This logic has been removed. Please just use \EE_Transaction::set_status() instead.', |
|
653 | + 'event_espresso' |
|
654 | + ), |
|
655 | + '4.9.12' |
|
656 | + ); |
|
657 | + $this->_new_txn_status = $new_txn_status; |
|
658 | + } |
|
659 | + |
|
660 | + |
|
661 | + /** |
|
662 | + * reg_status_updated |
|
663 | + * |
|
664 | + * @deprecated 4.9.12 |
|
665 | + * @return bool |
|
666 | + */ |
|
667 | + public function txn_status_updated() |
|
668 | + { |
|
669 | + EE_Error::doing_it_wrong( |
|
670 | + __METHOD__, |
|
671 | + esc_html__( |
|
672 | + 'This logic has been moved into \EE_Transaction::txn_status_updated(), please use that method instead.', |
|
673 | + 'event_espresso' |
|
674 | + ), |
|
675 | + '4.9.12' |
|
676 | + ); |
|
677 | + return $this->_new_txn_status !== $this->_old_txn_status && $this->_old_txn_status !== null ? true : false; |
|
678 | + } |
|
679 | + |
|
680 | + |
|
681 | + /** |
|
682 | + * all_reg_steps_completed |
|
683 | + * returns: |
|
684 | + * true if ALL reg steps have been marked as completed |
|
685 | + * or false if any step is not completed |
|
686 | + * |
|
687 | + * @deprecated 4.9.12 |
|
688 | + * @param EE_Transaction $transaction |
|
689 | + * @return boolean |
|
690 | + */ |
|
691 | + public function all_reg_steps_completed(EE_Transaction $transaction) |
|
692 | + { |
|
693 | + EE_Error::doing_it_wrong( |
|
694 | + __METHOD__, |
|
695 | + esc_html__( |
|
696 | + 'This logic has been moved into \EE_Transaction::all_reg_steps_completed(), please use that method instead.', |
|
697 | + 'event_espresso' |
|
698 | + ), |
|
699 | + '4.9.12', |
|
700 | + '5.0.0' |
|
701 | + ); |
|
702 | + return $transaction->all_reg_steps_completed(); |
|
703 | + } |
|
704 | + |
|
705 | + |
|
706 | + /** |
|
707 | + * all_reg_steps_completed_except |
|
708 | + * returns: |
|
709 | + * true if ALL reg steps, except a particular step that you wish to skip over, have been marked as completed |
|
710 | + * or false if any other step is not completed |
|
711 | + * or false if ALL steps are completed including the exception you are testing !!! |
|
712 | + * |
|
713 | + * @deprecated 4.9.12 |
|
714 | + * @param EE_Transaction $transaction |
|
715 | + * @param string $exception |
|
716 | + * @return boolean |
|
717 | + */ |
|
718 | + public function all_reg_steps_completed_except(EE_Transaction $transaction, $exception = '') |
|
719 | + { |
|
720 | + EE_Error::doing_it_wrong( |
|
721 | + __METHOD__, |
|
722 | + esc_html__( |
|
723 | + 'This logic has been moved into \EE_Transaction::all_reg_steps_completed_except(), please use that method instead.', |
|
724 | + 'event_espresso' |
|
725 | + ), |
|
726 | + '4.9.12', |
|
727 | + '5.0.0' |
|
728 | + ); |
|
729 | + return $transaction->all_reg_steps_completed_except($exception); |
|
730 | + } |
|
731 | + |
|
732 | + |
|
733 | + /** |
|
734 | + * all_reg_steps_completed_except |
|
735 | + * returns: |
|
736 | + * true if ALL reg steps, except the final step, have been marked as completed |
|
737 | + * or false if any step is not completed |
|
738 | + * or false if ALL steps are completed including the final step !!! |
|
739 | + * |
|
740 | + * @deprecated 4.9.12 |
|
741 | + * @param EE_Transaction $transaction |
|
742 | + * @return boolean |
|
743 | + */ |
|
744 | + public function all_reg_steps_completed_except_final_step(EE_Transaction $transaction) |
|
745 | + { |
|
746 | + EE_Error::doing_it_wrong( |
|
747 | + __METHOD__, |
|
748 | + esc_html__( |
|
749 | + 'This logic has been moved into \EE_Transaction::all_reg_steps_completed_except_final_step(), please use that method instead.', |
|
750 | + 'event_espresso' |
|
751 | + ), |
|
752 | + '4.9.12', |
|
753 | + '5.0.0' |
|
754 | + ); |
|
755 | + return $transaction->all_reg_steps_completed_except_final_step(); |
|
756 | + } |
|
757 | + |
|
758 | + |
|
759 | + /** |
|
760 | + * reg_step_completed |
|
761 | + * returns: |
|
762 | + * true if a specific reg step has been marked as completed |
|
763 | + * a Unix timestamp if it has been initialized but not yet completed, |
|
764 | + * or false if it has not yet been initialized |
|
765 | + * |
|
766 | + * @deprecated 4.9.12 |
|
767 | + * @param EE_Transaction $transaction |
|
768 | + * @param string $reg_step_slug |
|
769 | + * @return boolean | int |
|
770 | + */ |
|
771 | + public function reg_step_completed(EE_Transaction $transaction, $reg_step_slug) |
|
772 | + { |
|
773 | + EE_Error::doing_it_wrong( |
|
774 | + __METHOD__, |
|
775 | + esc_html__( |
|
776 | + 'This logic has been moved into \EE_Transaction::reg_step_completed(), please use that method instead.', |
|
777 | + 'event_espresso' |
|
778 | + ), |
|
779 | + '4.9.12', |
|
780 | + '5.0.0' |
|
781 | + ); |
|
782 | + return $transaction->reg_step_completed($reg_step_slug); |
|
783 | + } |
|
784 | + |
|
785 | + |
|
786 | + /** |
|
787 | + * completed_final_reg_step |
|
788 | + * returns: |
|
789 | + * true if the finalize_registration reg step has been marked as completed |
|
790 | + * a Unix timestamp if it has been initialized but not yet completed, |
|
791 | + * or false if it has not yet been initialized |
|
792 | + * |
|
793 | + * @deprecated 4.9.12 |
|
794 | + * @param EE_Transaction $transaction |
|
795 | + * @return boolean | int |
|
796 | + */ |
|
797 | + public function final_reg_step_completed(EE_Transaction $transaction) |
|
798 | + { |
|
799 | + EE_Error::doing_it_wrong( |
|
800 | + __METHOD__, |
|
801 | + esc_html__( |
|
802 | + 'This logic has been moved into \EE_Transaction::final_reg_step_completed(), please use that method instead.', |
|
803 | + 'event_espresso' |
|
804 | + ), |
|
805 | + '4.9.12', |
|
806 | + '5.0.0' |
|
807 | + ); |
|
808 | + return $transaction->final_reg_step_completed(); |
|
809 | + } |
|
810 | + |
|
811 | + |
|
812 | + /** |
|
813 | + * set_reg_step_initiated |
|
814 | + * given a valid TXN_reg_step, this sets it's value to a unix timestamp |
|
815 | + * |
|
816 | + * @deprecated 4.9.12 |
|
817 | + * @access public |
|
818 | + * @param \EE_Transaction $transaction |
|
819 | + * @param string $reg_step_slug |
|
820 | + * @return boolean |
|
821 | + * @throws \EE_Error |
|
822 | + */ |
|
823 | + public function set_reg_step_initiated(EE_Transaction $transaction, $reg_step_slug) |
|
824 | + { |
|
825 | + EE_Error::doing_it_wrong( |
|
826 | + __METHOD__, |
|
827 | + esc_html__( |
|
828 | + 'This logic has been moved into \EE_Transaction::set_reg_step_initiated(), please use that method instead.', |
|
829 | + 'event_espresso' |
|
830 | + ), |
|
831 | + '4.9.12', |
|
832 | + '5.0.0' |
|
833 | + ); |
|
834 | + return $transaction->set_reg_step_initiated($reg_step_slug); |
|
835 | + } |
|
836 | + |
|
837 | + |
|
838 | + /** |
|
839 | + * set_reg_step_completed |
|
840 | + * given a valid TXN_reg_step, this sets the step as completed |
|
841 | + * |
|
842 | + * @deprecated 4.9.12 |
|
843 | + * @access public |
|
844 | + * @param \EE_Transaction $transaction |
|
845 | + * @param string $reg_step_slug |
|
846 | + * @return boolean |
|
847 | + * @throws \EE_Error |
|
848 | + */ |
|
849 | + public function set_reg_step_completed(EE_Transaction $transaction, $reg_step_slug) |
|
850 | + { |
|
851 | + EE_Error::doing_it_wrong( |
|
852 | + __METHOD__, |
|
853 | + esc_html__( |
|
854 | + 'This logic has been moved into \EE_Transaction::set_reg_step_completed(), please use that method instead.', |
|
855 | + 'event_espresso' |
|
856 | + ), |
|
857 | + '4.9.12', |
|
858 | + '5.0.0' |
|
859 | + ); |
|
860 | + return $transaction->set_reg_step_completed($reg_step_slug); |
|
861 | + } |
|
862 | + |
|
863 | + |
|
864 | + /** |
|
865 | + * set_reg_step_completed |
|
866 | + * given a valid TXN_reg_step slug, this sets the step as NOT completed |
|
867 | + * |
|
868 | + * @deprecated 4.9.12 |
|
869 | + * @access public |
|
870 | + * @param \EE_Transaction $transaction |
|
871 | + * @param string $reg_step_slug |
|
872 | + * @return boolean |
|
873 | + * @throws \EE_Error |
|
874 | + */ |
|
875 | + public function set_reg_step_not_completed(EE_Transaction $transaction, $reg_step_slug) |
|
876 | + { |
|
877 | + EE_Error::doing_it_wrong( |
|
878 | + __METHOD__, |
|
879 | + esc_html__( |
|
880 | + 'This logic has been moved into \EE_Transaction::set_reg_step_not_completed(), please use that method instead.', |
|
881 | + 'event_espresso' |
|
882 | + ), |
|
883 | + '4.9.12', |
|
884 | + '5.0.0' |
|
885 | + ); |
|
886 | + return $transaction->set_reg_step_not_completed($reg_step_slug); |
|
887 | + } |
|
888 | + |
|
889 | + |
|
890 | + /** |
|
891 | + * remove_reg_step |
|
892 | + * given a valid TXN_reg_step slug, this will remove (unset) |
|
893 | + * the reg step from the TXN reg step array |
|
894 | + * |
|
895 | + * @deprecated 4.9.12 |
|
896 | + * @access public |
|
897 | + * @param \EE_Transaction $transaction |
|
898 | + * @param string $reg_step_slug |
|
899 | + * @return void |
|
900 | + */ |
|
901 | + public function remove_reg_step(EE_Transaction $transaction, $reg_step_slug) |
|
902 | + { |
|
903 | + EE_Error::doing_it_wrong( |
|
904 | + __METHOD__, |
|
905 | + esc_html__( |
|
906 | + 'This logic has been moved into \EE_Transaction::remove_reg_step(), please use that method instead.', |
|
907 | + 'event_espresso' |
|
908 | + ), |
|
909 | + '4.9.12', |
|
910 | + '5.0.0' |
|
911 | + ); |
|
912 | + $transaction->remove_reg_step($reg_step_slug); |
|
913 | + } |
|
914 | + |
|
915 | + |
|
916 | + /** |
|
917 | + * toggle_failed_transaction_status |
|
918 | + * upgrades a TXNs status from failed to abandoned, |
|
919 | + * meaning that contact information has been captured for at least one registrant |
|
920 | + * |
|
921 | + * @deprecated 4.9.12 |
|
922 | + * @access public |
|
923 | + * @param EE_Transaction $transaction |
|
924 | + * @return boolean |
|
925 | + * @throws \EE_Error |
|
926 | + */ |
|
927 | + public function toggle_failed_transaction_status(EE_Transaction $transaction) |
|
928 | + { |
|
929 | + EE_Error::doing_it_wrong( |
|
930 | + __METHOD__, |
|
931 | + esc_html__( |
|
932 | + 'This logic has been moved into \EE_Transaction::toggle_failed_transaction_status(), please use that method instead.', |
|
933 | + 'event_espresso' |
|
934 | + ), |
|
935 | + '4.9.12', |
|
936 | + '5.0.0' |
|
937 | + ); |
|
938 | + return $transaction->toggle_failed_transaction_status(); |
|
939 | + } |
|
940 | + |
|
941 | + |
|
942 | + /** |
|
943 | + * toggle_abandoned_transaction_status |
|
944 | + * upgrades a TXNs status from failed or abandoned to incomplete |
|
945 | + * |
|
946 | + * @deprecated 4.9.12 |
|
947 | + * @access public |
|
948 | + * @param EE_Transaction $transaction |
|
949 | + * @return boolean |
|
950 | + */ |
|
951 | + public function toggle_abandoned_transaction_status(EE_Transaction $transaction) |
|
952 | + { |
|
953 | + EE_Error::doing_it_wrong( |
|
954 | + __METHOD__, |
|
955 | + esc_html__( |
|
956 | + 'This logic has been moved into \EE_Transaction::toggle_abandoned_transaction_status(), please use that method instead.', |
|
957 | + 'event_espresso' |
|
958 | + ), |
|
959 | + '4.9.12', |
|
960 | + '5.0.0' |
|
961 | + ); |
|
962 | + return $transaction->toggle_abandoned_transaction_status(); |
|
963 | + } |
|
964 | 964 | } |
@@ -53,7 +53,7 @@ discard block |
||
53 | 53 | public static function instance($registration_query_params = array()) |
54 | 54 | { |
55 | 55 | // check if class object is instantiated |
56 | - if (! self::$_instance instanceof EE_Transaction_Processor) { |
|
56 | + if ( ! self::$_instance instanceof EE_Transaction_Processor) { |
|
57 | 57 | self::$_instance = new self($registration_query_params); |
58 | 58 | } |
59 | 59 | return self::$_instance; |
@@ -311,7 +311,7 @@ discard block |
||
311 | 311 | // these reg statuses should not be considered in any calculations involving monies owing |
312 | 312 | $closed_reg_statuses = ! empty($closed_reg_statuses) ? $closed_reg_statuses |
313 | 313 | : EEM_Registration::closed_reg_statuses(); |
314 | - if (! in_array($registration->status_ID(), $closed_reg_statuses, true)) { |
|
314 | + if ( ! in_array($registration->status_ID(), $closed_reg_statuses, true)) { |
|
315 | 315 | return false; |
316 | 316 | } |
317 | 317 | try { |
@@ -363,7 +363,7 @@ discard block |
||
363 | 363 | public function get_transaction_for_registration(EE_Registration $registration) |
364 | 364 | { |
365 | 365 | $transaction = $registration->transaction(); |
366 | - if (! $transaction instanceof EE_Transaction) { |
|
366 | + if ( ! $transaction instanceof EE_Transaction) { |
|
367 | 367 | throw new EE_Error( |
368 | 368 | sprintf( |
369 | 369 | __('The Transaction for Registration %1$d was not found or is invalid.', 'event_espresso'), |
@@ -393,7 +393,7 @@ discard block |
||
393 | 393 | $transaction->ID(), |
394 | 394 | $registration->ticket_ID() |
395 | 395 | ); |
396 | - if (! $ticket_line_item instanceof EE_Line_Item) { |
|
396 | + if ( ! $ticket_line_item instanceof EE_Line_Item) { |
|
397 | 397 | throw new EE_Error( |
398 | 398 | sprintf( |
399 | 399 | __( |
@@ -476,7 +476,7 @@ discard block |
||
476 | 476 | /** @type EE_Registration_Processor $registration_processor */ |
477 | 477 | $registration_processor = EE_Registry::instance()->load_class('Registration_Processor'); |
478 | 478 | // check that method exists |
479 | - if (! method_exists($registration_processor, $method_name)) { |
|
479 | + if ( ! method_exists($registration_processor, $method_name)) { |
|
480 | 480 | throw new EE_Error(__('Method does not exist.', 'event_espresso')); |
481 | 481 | } |
482 | 482 | // make sure some query params are set for retrieving registrations |
@@ -534,7 +534,7 @@ discard block |
||
534 | 534 | $transaction, |
535 | 535 | EEM_Payment_Method::scope_cart |
536 | 536 | ); |
537 | - if (! empty($available_payment_methods)) { |
|
537 | + if ( ! empty($available_payment_methods)) { |
|
538 | 538 | $PMD_ID = 0; |
539 | 539 | foreach ($available_payment_methods as $available_payment_method) { |
540 | 540 | if ($available_payment_method instanceof EE_Payment_Method |
@@ -544,7 +544,7 @@ discard block |
||
544 | 544 | break; |
545 | 545 | } |
546 | 546 | } |
547 | - if (! $PMD_ID) { |
|
547 | + if ( ! $PMD_ID) { |
|
548 | 548 | $first_payment_method = reset($available_payment_methods); |
549 | 549 | if ($first_payment_method instanceof EE_Payment_Method) { |
550 | 550 | $PMD_ID = $first_payment_method->ID(); |
@@ -15,51 +15,51 @@ |
||
15 | 15 | class EE_Help_Tour_final_stop extends EE_Help_Tour |
16 | 16 | { |
17 | 17 | |
18 | - protected function _set_tour_properties() |
|
19 | - { |
|
20 | - $this->_label = __('Final Stop Tour', 'event_espresso'); |
|
21 | - $this->_slug = 'final-stop-tour'; |
|
22 | - } |
|
18 | + protected function _set_tour_properties() |
|
19 | + { |
|
20 | + $this->_label = __('Final Stop Tour', 'event_espresso'); |
|
21 | + $this->_slug = 'final-stop-tour'; |
|
22 | + } |
|
23 | 23 | |
24 | 24 | |
25 | - protected function _set_tour_stops() |
|
26 | - { |
|
27 | - $this->_stops = array( |
|
28 | - 10 => array( |
|
29 | - 'id' => 'contextual-help-link', |
|
30 | - 'content' => $this->_end(), |
|
31 | - 'button_text' => __('Quit', 'event_espresso'), |
|
32 | - 'options' => array( |
|
33 | - 'tipLocation' => 'left', |
|
34 | - 'tipAdjustmentY' => -20, |
|
35 | - 'tipAdjustmentX' => 10, |
|
36 | - ), |
|
37 | - ), |
|
38 | - ); |
|
39 | - } |
|
25 | + protected function _set_tour_stops() |
|
26 | + { |
|
27 | + $this->_stops = array( |
|
28 | + 10 => array( |
|
29 | + 'id' => 'contextual-help-link', |
|
30 | + 'content' => $this->_end(), |
|
31 | + 'button_text' => __('Quit', 'event_espresso'), |
|
32 | + 'options' => array( |
|
33 | + 'tipLocation' => 'left', |
|
34 | + 'tipAdjustmentY' => -20, |
|
35 | + 'tipAdjustmentX' => 10, |
|
36 | + ), |
|
37 | + ), |
|
38 | + ); |
|
39 | + } |
|
40 | 40 | |
41 | 41 | |
42 | - /** |
|
43 | - * This is the default last stop for all tours that is displayed at the end of a tour OR when a tour is exited for |
|
44 | - * the first time. |
|
45 | - * |
|
46 | - * @return string |
|
47 | - */ |
|
48 | - protected function _end() |
|
49 | - { |
|
50 | - $query_args = array( |
|
51 | - 'action' => 'admin_option_settings', |
|
52 | - 'page' => 'espresso_general_settings', |
|
53 | - ); |
|
54 | - return '<p>' |
|
55 | - . sprintf( |
|
56 | - __( |
|
57 | - 'That\'s it for the tour! At any time you can restart a tour by clicking on this help dropdown and then clicking one of the Tour buttons. There are help tours available on all Event Espresso Admin pages. If you want to turn off help tours for all pages, %sgo here%s. All the best with your events!', |
|
58 | - 'event_espresso' |
|
59 | - ), |
|
60 | - '<a href="' . EE_Admin_Page::add_query_args_and_nonce($query_args, admin_url('admin.php')) . '">', |
|
61 | - '</a>' |
|
62 | - ) |
|
63 | - . '</p>'; |
|
64 | - } |
|
42 | + /** |
|
43 | + * This is the default last stop for all tours that is displayed at the end of a tour OR when a tour is exited for |
|
44 | + * the first time. |
|
45 | + * |
|
46 | + * @return string |
|
47 | + */ |
|
48 | + protected function _end() |
|
49 | + { |
|
50 | + $query_args = array( |
|
51 | + 'action' => 'admin_option_settings', |
|
52 | + 'page' => 'espresso_general_settings', |
|
53 | + ); |
|
54 | + return '<p>' |
|
55 | + . sprintf( |
|
56 | + __( |
|
57 | + 'That\'s it for the tour! At any time you can restart a tour by clicking on this help dropdown and then clicking one of the Tour buttons. There are help tours available on all Event Espresso Admin pages. If you want to turn off help tours for all pages, %sgo here%s. All the best with your events!', |
|
58 | + 'event_espresso' |
|
59 | + ), |
|
60 | + '<a href="' . EE_Admin_Page::add_query_args_and_nonce($query_args, admin_url('admin.php')) . '">', |
|
61 | + '</a>' |
|
62 | + ) |
|
63 | + . '</p>'; |
|
64 | + } |
|
65 | 65 | } |
@@ -57,7 +57,7 @@ |
||
57 | 57 | 'That\'s it for the tour! At any time you can restart a tour by clicking on this help dropdown and then clicking one of the Tour buttons. There are help tours available on all Event Espresso Admin pages. If you want to turn off help tours for all pages, %sgo here%s. All the best with your events!', |
58 | 58 | 'event_espresso' |
59 | 59 | ), |
60 | - '<a href="' . EE_Admin_Page::add_query_args_and_nonce($query_args, admin_url('admin.php')) . '">', |
|
60 | + '<a href="'.EE_Admin_Page::add_query_args_and_nonce($query_args, admin_url('admin.php')).'">', |
|
61 | 61 | '</a>' |
62 | 62 | ) |
63 | 63 | . '</p>'; |
@@ -12,631 +12,631 @@ |
||
12 | 12 | abstract class EE_SPCO_Reg_Step |
13 | 13 | { |
14 | 14 | |
15 | - /** |
|
16 | - * $_completed - TRUE if this step has fully completed it's duties |
|
17 | - * |
|
18 | - * @access protected |
|
19 | - * @type bool $_completed |
|
20 | - */ |
|
21 | - protected $_completed = false; |
|
22 | - |
|
23 | - /** |
|
24 | - * $_is_current_step - TRUE if this is the current step |
|
25 | - * |
|
26 | - * @access protected |
|
27 | - * @type bool $_is_current_step |
|
28 | - */ |
|
29 | - protected $_is_current_step = false; |
|
30 | - |
|
31 | - /** |
|
32 | - * $_order - when the reg step should be run relative to other steps |
|
33 | - * |
|
34 | - * @access protected |
|
35 | - * @type int $_template |
|
36 | - */ |
|
37 | - protected $_order = 0; |
|
38 | - |
|
39 | - /** |
|
40 | - * $_slug - URL param for this step |
|
41 | - * |
|
42 | - * @access protected |
|
43 | - * @type string $_slug |
|
44 | - */ |
|
45 | - protected $_slug; |
|
46 | - |
|
47 | - /** |
|
48 | - * $_name - Step Name - translatable string |
|
49 | - * |
|
50 | - * @access protected |
|
51 | - * @type string $_slug |
|
52 | - */ |
|
53 | - protected $_name; |
|
54 | - |
|
55 | - /** |
|
56 | - * $_submit_button_text - translatable string that appears on this step's submit button |
|
57 | - * |
|
58 | - * @access protected |
|
59 | - * @type string $_slug |
|
60 | - */ |
|
61 | - protected $_submit_button_text; |
|
62 | - |
|
63 | - /** |
|
64 | - * $_template - template name |
|
65 | - * |
|
66 | - * @access protected |
|
67 | - * @type string $_template |
|
68 | - */ |
|
69 | - protected $_template; |
|
70 | - |
|
71 | - /** |
|
72 | - * $_reg_form_name - the form input name and id attribute |
|
73 | - * |
|
74 | - * @access protected |
|
75 | - * @var string $_reg_form_name |
|
76 | - */ |
|
77 | - protected $_reg_form_name; |
|
78 | - |
|
79 | - /** |
|
80 | - * $_success_message - text to display upon successful form submission |
|
81 | - * |
|
82 | - * @access private |
|
83 | - * @var string $_success_message |
|
84 | - */ |
|
85 | - protected $_success_message; |
|
86 | - |
|
87 | - /** |
|
88 | - * $_instructions - a brief description of how to complete the reg step. |
|
89 | - * Usually displayed in conjunction with the previous step's success message. |
|
90 | - * |
|
91 | - * @access private |
|
92 | - * @var string $_instructions |
|
93 | - */ |
|
94 | - protected $_instructions; |
|
95 | - |
|
96 | - /** |
|
97 | - * $_valid_data - the normalized and validated data for this step |
|
98 | - * |
|
99 | - * @access public |
|
100 | - * @var array $_valid_data |
|
101 | - */ |
|
102 | - protected $_valid_data = array(); |
|
103 | - |
|
104 | - /** |
|
105 | - * $reg_form - the registration form for this step |
|
106 | - * |
|
107 | - * @access public |
|
108 | - * @var EE_Form_Section_Proper $reg_form |
|
109 | - */ |
|
110 | - public $reg_form; |
|
111 | - |
|
112 | - /** |
|
113 | - * $checkout - EE_Checkout object for handling the properties of the current checkout process |
|
114 | - * |
|
115 | - * @access public |
|
116 | - * @var EE_Checkout $checkout |
|
117 | - */ |
|
118 | - public $checkout; |
|
119 | - |
|
120 | - |
|
121 | - /** |
|
122 | - * @return void |
|
123 | - */ |
|
124 | - abstract public function translate_js_strings(); |
|
125 | - |
|
126 | - |
|
127 | - /** |
|
128 | - * @return void |
|
129 | - */ |
|
130 | - abstract public function enqueue_styles_and_scripts(); |
|
131 | - |
|
132 | - |
|
133 | - /** |
|
134 | - * @return boolean |
|
135 | - */ |
|
136 | - abstract public function initialize_reg_step(); |
|
137 | - |
|
138 | - |
|
139 | - /** |
|
140 | - * @return string |
|
141 | - */ |
|
142 | - abstract public function generate_reg_form(); |
|
143 | - |
|
144 | - |
|
145 | - /** |
|
146 | - * @return boolean |
|
147 | - */ |
|
148 | - abstract public function process_reg_step(); |
|
149 | - |
|
150 | - |
|
151 | - /** |
|
152 | - * @return boolean |
|
153 | - */ |
|
154 | - abstract public function update_reg_step(); |
|
155 | - |
|
156 | - |
|
157 | - /** |
|
158 | - * @return boolean |
|
159 | - */ |
|
160 | - public function completed() |
|
161 | - { |
|
162 | - return $this->_completed; |
|
163 | - } |
|
164 | - |
|
165 | - |
|
166 | - /** |
|
167 | - * set_completed - toggles $_completed to TRUE |
|
168 | - */ |
|
169 | - public function set_completed() |
|
170 | - { |
|
171 | - // DEBUG LOG |
|
172 | - // $this->checkout->log( __CLASS__, __FUNCTION__, __LINE__ ); |
|
173 | - $this->_completed = apply_filters('FHEE__EE_SPCO_Reg_Step__set_completed___completed', true, $this); |
|
174 | - } |
|
175 | - |
|
176 | - |
|
177 | - /** |
|
178 | - * set_completed - toggles $_completed to FALSE |
|
179 | - */ |
|
180 | - public function set_not_completed() |
|
181 | - { |
|
182 | - $this->_completed = false; |
|
183 | - } |
|
184 | - |
|
185 | - |
|
186 | - /** |
|
187 | - * @return string |
|
188 | - */ |
|
189 | - public function name() |
|
190 | - { |
|
191 | - return $this->_name; |
|
192 | - } |
|
193 | - |
|
194 | - |
|
195 | - /** |
|
196 | - * @return string |
|
197 | - */ |
|
198 | - public function slug() |
|
199 | - { |
|
200 | - return $this->_slug; |
|
201 | - } |
|
202 | - |
|
203 | - |
|
204 | - /** |
|
205 | - * submit_button_text |
|
206 | - * the text that appears on the reg step form submit button |
|
207 | - * |
|
208 | - * @return string |
|
209 | - */ |
|
210 | - public function submit_button_text() |
|
211 | - { |
|
212 | - return $this->_submit_button_text; |
|
213 | - } |
|
214 | - |
|
215 | - |
|
216 | - /** |
|
217 | - * set_submit_button_text |
|
218 | - * sets the text that appears on the reg step form submit button |
|
219 | - * |
|
220 | - * @param string $submit_button_text |
|
221 | - */ |
|
222 | - public function set_submit_button_text($submit_button_text = '') |
|
223 | - { |
|
224 | - if (! empty($submit_button_text)) { |
|
225 | - $this->_submit_button_text = $submit_button_text; |
|
226 | - } elseif ($this->checkout->next_step instanceof EE_SPCO_Reg_Step) { |
|
227 | - if ($this->checkout->revisit) { |
|
228 | - $this->_submit_button_text = sprintf( |
|
229 | - __('Update %s', 'event_espresso'), |
|
230 | - $this->checkout->current_step->name() |
|
231 | - ); |
|
232 | - } else { |
|
233 | - $this->_submit_button_text = sprintf( |
|
234 | - __('Proceed to %s', 'event_espresso'), |
|
235 | - $this->checkout->next_step->name() |
|
236 | - ); |
|
237 | - } |
|
238 | - } |
|
239 | - // filters the submit button text |
|
240 | - $this->_submit_button_text = apply_filters( |
|
241 | - 'FHEE__EE_SPCO_Reg_Step__set_submit_button_text___submit_button_text', |
|
242 | - $this->_submit_button_text, |
|
243 | - $this->checkout |
|
244 | - ); |
|
245 | - } |
|
246 | - |
|
247 | - |
|
248 | - /** |
|
249 | - * @param boolean $is_current_step |
|
250 | - */ |
|
251 | - public function set_is_current_step($is_current_step) |
|
252 | - { |
|
253 | - $this->_is_current_step = $is_current_step; |
|
254 | - } |
|
255 | - |
|
256 | - |
|
257 | - /** |
|
258 | - * @return boolean |
|
259 | - */ |
|
260 | - public function is_current_step() |
|
261 | - { |
|
262 | - return $this->_is_current_step; |
|
263 | - } |
|
264 | - |
|
265 | - |
|
266 | - /** |
|
267 | - * @return boolean |
|
268 | - */ |
|
269 | - public function is_final_step() |
|
270 | - { |
|
271 | - return $this instanceof EE_SPCO_Reg_Step_Finalize_Registration ? true : false; |
|
272 | - } |
|
273 | - |
|
274 | - |
|
275 | - /** |
|
276 | - * @param int $order |
|
277 | - */ |
|
278 | - public function set_order($order) |
|
279 | - { |
|
280 | - $this->_order = $order; |
|
281 | - } |
|
282 | - |
|
283 | - |
|
284 | - /** |
|
285 | - * @return int |
|
286 | - */ |
|
287 | - public function order() |
|
288 | - { |
|
289 | - return $this->_order; |
|
290 | - } |
|
291 | - |
|
292 | - |
|
293 | - /** |
|
294 | - * @return string |
|
295 | - */ |
|
296 | - public function template() |
|
297 | - { |
|
298 | - return $this->_template; |
|
299 | - } |
|
300 | - |
|
301 | - |
|
302 | - /** |
|
303 | - * @return string |
|
304 | - */ |
|
305 | - public function success_message() |
|
306 | - { |
|
307 | - return $this->_success_message; |
|
308 | - } |
|
309 | - |
|
310 | - |
|
311 | - /** |
|
312 | - * _set_success_message |
|
313 | - * |
|
314 | - * @param string $success_message |
|
315 | - */ |
|
316 | - protected function _set_success_message($success_message) |
|
317 | - { |
|
318 | - $this->_success_message = $success_message; |
|
319 | - } |
|
320 | - |
|
321 | - |
|
322 | - /** |
|
323 | - * _reset_success_message |
|
324 | - * |
|
325 | - * @return void |
|
326 | - */ |
|
327 | - protected function _reset_success_message() |
|
328 | - { |
|
329 | - $this->_success_message = ''; |
|
330 | - } |
|
331 | - |
|
332 | - |
|
333 | - /** |
|
334 | - * @return string |
|
335 | - */ |
|
336 | - public function _instructions() |
|
337 | - { |
|
338 | - return $this->_instructions; |
|
339 | - } |
|
340 | - |
|
341 | - |
|
342 | - /** |
|
343 | - * @param string $instructions |
|
344 | - */ |
|
345 | - public function set_instructions($instructions) |
|
346 | - { |
|
347 | - $this->_instructions = apply_filters( |
|
348 | - 'FHEE__EE_SPCO_Reg_Step__set_instructions__instructions', |
|
349 | - $instructions, |
|
350 | - $this |
|
351 | - ); |
|
352 | - } |
|
353 | - |
|
354 | - |
|
355 | - /** |
|
356 | - * @param array $valid_data |
|
357 | - */ |
|
358 | - public function set_valid_data($valid_data) |
|
359 | - { |
|
360 | - $this->_valid_data = $valid_data; |
|
361 | - } |
|
362 | - |
|
363 | - |
|
364 | - /** |
|
365 | - * @return array |
|
366 | - */ |
|
367 | - public function valid_data() |
|
368 | - { |
|
369 | - if (empty($this->_valid_data)) { |
|
370 | - $this->_valid_data = $this->reg_form->valid_data(); |
|
371 | - } |
|
372 | - return $this->_valid_data; |
|
373 | - } |
|
374 | - |
|
375 | - |
|
376 | - /** |
|
377 | - * @return string |
|
378 | - */ |
|
379 | - public function reg_form_name() |
|
380 | - { |
|
381 | - if (empty($this->_reg_form_name)) { |
|
382 | - $this->set_reg_form_name('ee-spco-' . $this->slug() . '-reg-step-form'); |
|
383 | - } |
|
384 | - return $this->_reg_form_name; |
|
385 | - } |
|
386 | - |
|
387 | - |
|
388 | - /** |
|
389 | - * @param string $reg_form_name |
|
390 | - */ |
|
391 | - protected function set_reg_form_name($reg_form_name) |
|
392 | - { |
|
393 | - $this->_reg_form_name = $reg_form_name; |
|
394 | - } |
|
395 | - |
|
396 | - |
|
397 | - /** |
|
398 | - * reg_step_url |
|
399 | - * |
|
400 | - * @param string $action |
|
401 | - * @return string |
|
402 | - */ |
|
403 | - public function reg_step_url($action = '') |
|
404 | - { |
|
405 | - $query_args = array('step' => $this->slug()); |
|
406 | - if (! empty($action)) { |
|
407 | - $query_args['action'] = $action; |
|
408 | - } |
|
409 | - // final step has no display |
|
410 | - if ($this instanceof EE_SPCO_Reg_Step_Finalize_Registration && $action === 'display_spco_reg_step') { |
|
411 | - $query_args['action'] = 'process_reg_step'; |
|
412 | - } |
|
413 | - if ($this->checkout->revisit) { |
|
414 | - $query_args['revisit'] = true; |
|
415 | - } |
|
416 | - if ($this->checkout->reg_url_link) { |
|
417 | - $query_args['e_reg_url_link'] = $this->checkout->reg_url_link; |
|
418 | - } |
|
419 | - return add_query_arg($query_args, $this->checkout->reg_page_base_url); |
|
420 | - } |
|
421 | - |
|
422 | - |
|
423 | - /** |
|
424 | - * creates the default hidden inputs section |
|
425 | - * |
|
426 | - * @return EE_Form_Section_Proper |
|
427 | - * @throws \EE_Error |
|
428 | - */ |
|
429 | - public function reg_step_hidden_inputs() |
|
430 | - { |
|
431 | - // hidden inputs for admin registrations |
|
432 | - if ($this->checkout->admin_request) { |
|
433 | - return new EE_Form_Section_Proper( |
|
434 | - array( |
|
435 | - 'layout_strategy' => new EE_Div_Per_Section_Layout(), |
|
436 | - 'html_id' => 'ee-' . $this->slug() . '-hidden-inputs', |
|
437 | - 'subsections' => array( |
|
438 | - 'next_step' => new EE_Fixed_Hidden_Input( |
|
439 | - array( |
|
440 | - 'html_name' => 'next_step', |
|
441 | - 'html_id' => 'spco-' . $this->slug() . '-next-step', |
|
442 | - 'default' => $this->checkout->next_step instanceof EE_SPCO_Reg_Step |
|
443 | - ? $this->checkout->next_step->slug() |
|
444 | - : '', |
|
445 | - ) |
|
446 | - ), |
|
447 | - ), |
|
448 | - ) |
|
449 | - ); |
|
450 | - } |
|
451 | - // hidden inputs for frontend registrations |
|
452 | - return new EE_Form_Section_Proper( |
|
453 | - array( |
|
454 | - 'layout_strategy' => new EE_Div_Per_Section_Layout(), |
|
455 | - 'html_id' => 'ee-' . $this->slug() . '-hidden-inputs', |
|
456 | - 'subsections' => array( |
|
457 | - 'action' => new EE_Fixed_Hidden_Input( |
|
458 | - array( |
|
459 | - 'html_name' => 'action', |
|
460 | - 'html_id' => 'spco-' . $this->slug() . '-action', |
|
461 | - 'default' => apply_filters( |
|
462 | - 'FHEE__EE_SPCO_Reg_Step__reg_step_hidden_inputs__default_form_action', |
|
463 | - empty($this->checkout->reg_url_link) |
|
464 | - ? 'process_reg_step' |
|
465 | - : 'update_reg_step', |
|
466 | - $this |
|
467 | - ), |
|
468 | - ) |
|
469 | - ), |
|
470 | - 'next_step' => new EE_Fixed_Hidden_Input( |
|
471 | - array( |
|
472 | - 'html_name' => 'next_step', |
|
473 | - 'html_id' => 'spco-' . $this->slug() . '-next-step', |
|
474 | - 'default' => $this->checkout->next_step instanceof EE_SPCO_Reg_Step |
|
475 | - ? $this->checkout->next_step->slug() |
|
476 | - : '', |
|
477 | - ) |
|
478 | - ), |
|
479 | - 'e_reg_url_link' => new EE_Fixed_Hidden_Input( |
|
480 | - array( |
|
481 | - 'html_name' => 'e_reg_url_link', |
|
482 | - 'html_id' => 'spco-reg_url_link', |
|
483 | - 'default' => $this->checkout->reg_url_link, |
|
484 | - ) |
|
485 | - ), |
|
486 | - 'revisit' => new EE_Fixed_Hidden_Input( |
|
487 | - array( |
|
488 | - 'html_name' => 'revisit', |
|
489 | - 'html_id' => 'spco-revisit', |
|
490 | - 'default' => $this->checkout->revisit, |
|
491 | - ) |
|
492 | - ), |
|
493 | - ), |
|
494 | - ) |
|
495 | - ); |
|
496 | - } |
|
497 | - |
|
498 | - |
|
499 | - /** |
|
500 | - * generate_reg_form_for_actions |
|
501 | - * |
|
502 | - * @param array $actions |
|
503 | - * @return void |
|
504 | - */ |
|
505 | - public function generate_reg_form_for_actions($actions = array()) |
|
506 | - { |
|
507 | - $actions = array_merge( |
|
508 | - array( |
|
509 | - 'generate_reg_form', |
|
510 | - 'display_spco_reg_step', |
|
511 | - 'process_reg_step', |
|
512 | - 'update_reg_step', |
|
513 | - ), |
|
514 | - $actions |
|
515 | - ); |
|
516 | - $this->checkout->generate_reg_form = in_array($this->checkout->action, $actions, true) ? true : false; |
|
517 | - } |
|
518 | - |
|
519 | - |
|
520 | - /** |
|
521 | - * @return string |
|
522 | - * @throws \EE_Error |
|
523 | - */ |
|
524 | - public function display_reg_form() |
|
525 | - { |
|
526 | - $html = ''; |
|
527 | - if ($this->reg_form instanceof EE_Form_Section_Proper) { |
|
528 | - do_action('AHEE__EE_SPCO_Reg_Step__display_reg_form__reg_form', $this->reg_form, $this); |
|
529 | - $html .= ! $this->checkout->admin_request ? $this->reg_form->form_open($this->reg_step_url()) : ''; |
|
530 | - if (EE_Registry::instance()->REQ->ajax) { |
|
531 | - $this->reg_form->localize_validation_rules(); |
|
532 | - $this->checkout->json_response->add_validation_rules(EE_Form_Section_Proper::js_localization()); |
|
533 | - } |
|
534 | - $html .= $this->reg_form->get_html(); |
|
535 | - $html .= ! $this->checkout->admin_request ? $this->reg_step_submit_button() : ''; |
|
536 | - $html .= ! $this->checkout->admin_request ? $this->reg_form->form_close() : ''; |
|
537 | - } |
|
538 | - return $html; |
|
539 | - } |
|
540 | - |
|
541 | - |
|
542 | - /** |
|
543 | - * div_class - returns nothing for current step, but a css class of "hidden" for others |
|
544 | - * |
|
545 | - * @return string |
|
546 | - * @throws \EE_Error |
|
547 | - */ |
|
548 | - public function reg_step_submit_button() |
|
549 | - { |
|
550 | - if (! $this->checkout->next_step instanceof EE_SPCO_Reg_Step) { |
|
551 | - return ''; |
|
552 | - } |
|
553 | - ob_start(); |
|
554 | - do_action( |
|
555 | - 'AHEE__before_spco_whats_next_buttons', |
|
556 | - $this->slug(), |
|
557 | - $this->checkout->next_step->slug(), |
|
558 | - $this->checkout |
|
559 | - ); |
|
560 | - $html = ob_get_clean(); |
|
561 | - // generate submit button |
|
562 | - $sbmt_btn = new EE_Submit_Input( |
|
563 | - array( |
|
564 | - 'html_name' => 'spco-go-to-step-' . $this->checkout->next_step->slug(), |
|
565 | - 'html_id' => 'spco-go-to-step-' . $this->checkout->next_step->slug(), |
|
566 | - 'html_class' => 'spco-next-step-btn', |
|
567 | - 'other_html_attributes' => ' rel="' . $this->slug() . '"', |
|
568 | - 'default' => $this->submit_button_text(), |
|
569 | - ) |
|
570 | - ); |
|
571 | - $sbmt_btn->set_button_css_attributes(true, 'large'); |
|
572 | - $sbmt_btn_html = $sbmt_btn->get_html_for_input(); |
|
573 | - $html .= EEH_HTML::div( |
|
574 | - apply_filters('FHEE__EE_SPCO_Reg_Step__reg_step_submit_button__sbmt_btn_html', $sbmt_btn_html, $this), |
|
575 | - 'spco-' . $this->slug() . '-whats-next-buttons-dv', |
|
576 | - 'spco-whats-next-buttons' |
|
577 | - ); |
|
578 | - return $html; |
|
579 | - } |
|
580 | - |
|
581 | - |
|
582 | - /** |
|
583 | - * div_class - returns nothing for current step, but a css class of "hidden" for others |
|
584 | - * |
|
585 | - * @return string |
|
586 | - */ |
|
587 | - public function div_class() |
|
588 | - { |
|
589 | - return $this->is_current_step() ? '' : ' hidden'; |
|
590 | - } |
|
591 | - |
|
592 | - |
|
593 | - /** |
|
594 | - * div_class - returns a css class of "hidden" for current step, but nothing for others |
|
595 | - * |
|
596 | - * @return string |
|
597 | - */ |
|
598 | - public function edit_lnk_url() |
|
599 | - { |
|
600 | - return add_query_arg(array('step' => $this->slug()), $this->checkout->reg_page_base_url); |
|
601 | - } |
|
602 | - |
|
603 | - |
|
604 | - /** |
|
605 | - * div_class - returns a css class of "hidden" for current step, but nothing for others |
|
606 | - * |
|
607 | - * @return string |
|
608 | - */ |
|
609 | - public function edit_link_class() |
|
610 | - { |
|
611 | - return $this->is_current_step() ? ' hidden' : ''; |
|
612 | - } |
|
613 | - |
|
614 | - |
|
615 | - /** |
|
616 | - * update_checkout with changes that have been made to the cart |
|
617 | - * |
|
618 | - * @return void |
|
619 | - * @throws \EE_Error |
|
620 | - */ |
|
621 | - public function update_checkout() |
|
622 | - { |
|
623 | - // grab the cart grand total and reset TXN total |
|
624 | - $this->checkout->transaction->set_total($this->checkout->cart->get_cart_grand_total()); |
|
625 | - $this->checkout->stash_transaction_and_checkout(); |
|
626 | - } |
|
627 | - |
|
628 | - |
|
629 | - /** |
|
630 | - * __sleep |
|
631 | - * to conserve db space, let's remove the reg_form and the EE_Checkout object from EE_SPCO_Reg_Step objects upon |
|
632 | - * serialization EE_Checkout will handle the reimplementation of itself upon waking, but we won't bother with the |
|
633 | - * reg form, because if needed, it will be regenerated anyways |
|
634 | - * |
|
635 | - * @return array |
|
636 | - */ |
|
637 | - public function __sleep() |
|
638 | - { |
|
639 | - // remove the reg form and the checkout |
|
640 | - return array_diff(array_keys(get_object_vars($this)), array('reg_form', 'checkout')); |
|
641 | - } |
|
15 | + /** |
|
16 | + * $_completed - TRUE if this step has fully completed it's duties |
|
17 | + * |
|
18 | + * @access protected |
|
19 | + * @type bool $_completed |
|
20 | + */ |
|
21 | + protected $_completed = false; |
|
22 | + |
|
23 | + /** |
|
24 | + * $_is_current_step - TRUE if this is the current step |
|
25 | + * |
|
26 | + * @access protected |
|
27 | + * @type bool $_is_current_step |
|
28 | + */ |
|
29 | + protected $_is_current_step = false; |
|
30 | + |
|
31 | + /** |
|
32 | + * $_order - when the reg step should be run relative to other steps |
|
33 | + * |
|
34 | + * @access protected |
|
35 | + * @type int $_template |
|
36 | + */ |
|
37 | + protected $_order = 0; |
|
38 | + |
|
39 | + /** |
|
40 | + * $_slug - URL param for this step |
|
41 | + * |
|
42 | + * @access protected |
|
43 | + * @type string $_slug |
|
44 | + */ |
|
45 | + protected $_slug; |
|
46 | + |
|
47 | + /** |
|
48 | + * $_name - Step Name - translatable string |
|
49 | + * |
|
50 | + * @access protected |
|
51 | + * @type string $_slug |
|
52 | + */ |
|
53 | + protected $_name; |
|
54 | + |
|
55 | + /** |
|
56 | + * $_submit_button_text - translatable string that appears on this step's submit button |
|
57 | + * |
|
58 | + * @access protected |
|
59 | + * @type string $_slug |
|
60 | + */ |
|
61 | + protected $_submit_button_text; |
|
62 | + |
|
63 | + /** |
|
64 | + * $_template - template name |
|
65 | + * |
|
66 | + * @access protected |
|
67 | + * @type string $_template |
|
68 | + */ |
|
69 | + protected $_template; |
|
70 | + |
|
71 | + /** |
|
72 | + * $_reg_form_name - the form input name and id attribute |
|
73 | + * |
|
74 | + * @access protected |
|
75 | + * @var string $_reg_form_name |
|
76 | + */ |
|
77 | + protected $_reg_form_name; |
|
78 | + |
|
79 | + /** |
|
80 | + * $_success_message - text to display upon successful form submission |
|
81 | + * |
|
82 | + * @access private |
|
83 | + * @var string $_success_message |
|
84 | + */ |
|
85 | + protected $_success_message; |
|
86 | + |
|
87 | + /** |
|
88 | + * $_instructions - a brief description of how to complete the reg step. |
|
89 | + * Usually displayed in conjunction with the previous step's success message. |
|
90 | + * |
|
91 | + * @access private |
|
92 | + * @var string $_instructions |
|
93 | + */ |
|
94 | + protected $_instructions; |
|
95 | + |
|
96 | + /** |
|
97 | + * $_valid_data - the normalized and validated data for this step |
|
98 | + * |
|
99 | + * @access public |
|
100 | + * @var array $_valid_data |
|
101 | + */ |
|
102 | + protected $_valid_data = array(); |
|
103 | + |
|
104 | + /** |
|
105 | + * $reg_form - the registration form for this step |
|
106 | + * |
|
107 | + * @access public |
|
108 | + * @var EE_Form_Section_Proper $reg_form |
|
109 | + */ |
|
110 | + public $reg_form; |
|
111 | + |
|
112 | + /** |
|
113 | + * $checkout - EE_Checkout object for handling the properties of the current checkout process |
|
114 | + * |
|
115 | + * @access public |
|
116 | + * @var EE_Checkout $checkout |
|
117 | + */ |
|
118 | + public $checkout; |
|
119 | + |
|
120 | + |
|
121 | + /** |
|
122 | + * @return void |
|
123 | + */ |
|
124 | + abstract public function translate_js_strings(); |
|
125 | + |
|
126 | + |
|
127 | + /** |
|
128 | + * @return void |
|
129 | + */ |
|
130 | + abstract public function enqueue_styles_and_scripts(); |
|
131 | + |
|
132 | + |
|
133 | + /** |
|
134 | + * @return boolean |
|
135 | + */ |
|
136 | + abstract public function initialize_reg_step(); |
|
137 | + |
|
138 | + |
|
139 | + /** |
|
140 | + * @return string |
|
141 | + */ |
|
142 | + abstract public function generate_reg_form(); |
|
143 | + |
|
144 | + |
|
145 | + /** |
|
146 | + * @return boolean |
|
147 | + */ |
|
148 | + abstract public function process_reg_step(); |
|
149 | + |
|
150 | + |
|
151 | + /** |
|
152 | + * @return boolean |
|
153 | + */ |
|
154 | + abstract public function update_reg_step(); |
|
155 | + |
|
156 | + |
|
157 | + /** |
|
158 | + * @return boolean |
|
159 | + */ |
|
160 | + public function completed() |
|
161 | + { |
|
162 | + return $this->_completed; |
|
163 | + } |
|
164 | + |
|
165 | + |
|
166 | + /** |
|
167 | + * set_completed - toggles $_completed to TRUE |
|
168 | + */ |
|
169 | + public function set_completed() |
|
170 | + { |
|
171 | + // DEBUG LOG |
|
172 | + // $this->checkout->log( __CLASS__, __FUNCTION__, __LINE__ ); |
|
173 | + $this->_completed = apply_filters('FHEE__EE_SPCO_Reg_Step__set_completed___completed', true, $this); |
|
174 | + } |
|
175 | + |
|
176 | + |
|
177 | + /** |
|
178 | + * set_completed - toggles $_completed to FALSE |
|
179 | + */ |
|
180 | + public function set_not_completed() |
|
181 | + { |
|
182 | + $this->_completed = false; |
|
183 | + } |
|
184 | + |
|
185 | + |
|
186 | + /** |
|
187 | + * @return string |
|
188 | + */ |
|
189 | + public function name() |
|
190 | + { |
|
191 | + return $this->_name; |
|
192 | + } |
|
193 | + |
|
194 | + |
|
195 | + /** |
|
196 | + * @return string |
|
197 | + */ |
|
198 | + public function slug() |
|
199 | + { |
|
200 | + return $this->_slug; |
|
201 | + } |
|
202 | + |
|
203 | + |
|
204 | + /** |
|
205 | + * submit_button_text |
|
206 | + * the text that appears on the reg step form submit button |
|
207 | + * |
|
208 | + * @return string |
|
209 | + */ |
|
210 | + public function submit_button_text() |
|
211 | + { |
|
212 | + return $this->_submit_button_text; |
|
213 | + } |
|
214 | + |
|
215 | + |
|
216 | + /** |
|
217 | + * set_submit_button_text |
|
218 | + * sets the text that appears on the reg step form submit button |
|
219 | + * |
|
220 | + * @param string $submit_button_text |
|
221 | + */ |
|
222 | + public function set_submit_button_text($submit_button_text = '') |
|
223 | + { |
|
224 | + if (! empty($submit_button_text)) { |
|
225 | + $this->_submit_button_text = $submit_button_text; |
|
226 | + } elseif ($this->checkout->next_step instanceof EE_SPCO_Reg_Step) { |
|
227 | + if ($this->checkout->revisit) { |
|
228 | + $this->_submit_button_text = sprintf( |
|
229 | + __('Update %s', 'event_espresso'), |
|
230 | + $this->checkout->current_step->name() |
|
231 | + ); |
|
232 | + } else { |
|
233 | + $this->_submit_button_text = sprintf( |
|
234 | + __('Proceed to %s', 'event_espresso'), |
|
235 | + $this->checkout->next_step->name() |
|
236 | + ); |
|
237 | + } |
|
238 | + } |
|
239 | + // filters the submit button text |
|
240 | + $this->_submit_button_text = apply_filters( |
|
241 | + 'FHEE__EE_SPCO_Reg_Step__set_submit_button_text___submit_button_text', |
|
242 | + $this->_submit_button_text, |
|
243 | + $this->checkout |
|
244 | + ); |
|
245 | + } |
|
246 | + |
|
247 | + |
|
248 | + /** |
|
249 | + * @param boolean $is_current_step |
|
250 | + */ |
|
251 | + public function set_is_current_step($is_current_step) |
|
252 | + { |
|
253 | + $this->_is_current_step = $is_current_step; |
|
254 | + } |
|
255 | + |
|
256 | + |
|
257 | + /** |
|
258 | + * @return boolean |
|
259 | + */ |
|
260 | + public function is_current_step() |
|
261 | + { |
|
262 | + return $this->_is_current_step; |
|
263 | + } |
|
264 | + |
|
265 | + |
|
266 | + /** |
|
267 | + * @return boolean |
|
268 | + */ |
|
269 | + public function is_final_step() |
|
270 | + { |
|
271 | + return $this instanceof EE_SPCO_Reg_Step_Finalize_Registration ? true : false; |
|
272 | + } |
|
273 | + |
|
274 | + |
|
275 | + /** |
|
276 | + * @param int $order |
|
277 | + */ |
|
278 | + public function set_order($order) |
|
279 | + { |
|
280 | + $this->_order = $order; |
|
281 | + } |
|
282 | + |
|
283 | + |
|
284 | + /** |
|
285 | + * @return int |
|
286 | + */ |
|
287 | + public function order() |
|
288 | + { |
|
289 | + return $this->_order; |
|
290 | + } |
|
291 | + |
|
292 | + |
|
293 | + /** |
|
294 | + * @return string |
|
295 | + */ |
|
296 | + public function template() |
|
297 | + { |
|
298 | + return $this->_template; |
|
299 | + } |
|
300 | + |
|
301 | + |
|
302 | + /** |
|
303 | + * @return string |
|
304 | + */ |
|
305 | + public function success_message() |
|
306 | + { |
|
307 | + return $this->_success_message; |
|
308 | + } |
|
309 | + |
|
310 | + |
|
311 | + /** |
|
312 | + * _set_success_message |
|
313 | + * |
|
314 | + * @param string $success_message |
|
315 | + */ |
|
316 | + protected function _set_success_message($success_message) |
|
317 | + { |
|
318 | + $this->_success_message = $success_message; |
|
319 | + } |
|
320 | + |
|
321 | + |
|
322 | + /** |
|
323 | + * _reset_success_message |
|
324 | + * |
|
325 | + * @return void |
|
326 | + */ |
|
327 | + protected function _reset_success_message() |
|
328 | + { |
|
329 | + $this->_success_message = ''; |
|
330 | + } |
|
331 | + |
|
332 | + |
|
333 | + /** |
|
334 | + * @return string |
|
335 | + */ |
|
336 | + public function _instructions() |
|
337 | + { |
|
338 | + return $this->_instructions; |
|
339 | + } |
|
340 | + |
|
341 | + |
|
342 | + /** |
|
343 | + * @param string $instructions |
|
344 | + */ |
|
345 | + public function set_instructions($instructions) |
|
346 | + { |
|
347 | + $this->_instructions = apply_filters( |
|
348 | + 'FHEE__EE_SPCO_Reg_Step__set_instructions__instructions', |
|
349 | + $instructions, |
|
350 | + $this |
|
351 | + ); |
|
352 | + } |
|
353 | + |
|
354 | + |
|
355 | + /** |
|
356 | + * @param array $valid_data |
|
357 | + */ |
|
358 | + public function set_valid_data($valid_data) |
|
359 | + { |
|
360 | + $this->_valid_data = $valid_data; |
|
361 | + } |
|
362 | + |
|
363 | + |
|
364 | + /** |
|
365 | + * @return array |
|
366 | + */ |
|
367 | + public function valid_data() |
|
368 | + { |
|
369 | + if (empty($this->_valid_data)) { |
|
370 | + $this->_valid_data = $this->reg_form->valid_data(); |
|
371 | + } |
|
372 | + return $this->_valid_data; |
|
373 | + } |
|
374 | + |
|
375 | + |
|
376 | + /** |
|
377 | + * @return string |
|
378 | + */ |
|
379 | + public function reg_form_name() |
|
380 | + { |
|
381 | + if (empty($this->_reg_form_name)) { |
|
382 | + $this->set_reg_form_name('ee-spco-' . $this->slug() . '-reg-step-form'); |
|
383 | + } |
|
384 | + return $this->_reg_form_name; |
|
385 | + } |
|
386 | + |
|
387 | + |
|
388 | + /** |
|
389 | + * @param string $reg_form_name |
|
390 | + */ |
|
391 | + protected function set_reg_form_name($reg_form_name) |
|
392 | + { |
|
393 | + $this->_reg_form_name = $reg_form_name; |
|
394 | + } |
|
395 | + |
|
396 | + |
|
397 | + /** |
|
398 | + * reg_step_url |
|
399 | + * |
|
400 | + * @param string $action |
|
401 | + * @return string |
|
402 | + */ |
|
403 | + public function reg_step_url($action = '') |
|
404 | + { |
|
405 | + $query_args = array('step' => $this->slug()); |
|
406 | + if (! empty($action)) { |
|
407 | + $query_args['action'] = $action; |
|
408 | + } |
|
409 | + // final step has no display |
|
410 | + if ($this instanceof EE_SPCO_Reg_Step_Finalize_Registration && $action === 'display_spco_reg_step') { |
|
411 | + $query_args['action'] = 'process_reg_step'; |
|
412 | + } |
|
413 | + if ($this->checkout->revisit) { |
|
414 | + $query_args['revisit'] = true; |
|
415 | + } |
|
416 | + if ($this->checkout->reg_url_link) { |
|
417 | + $query_args['e_reg_url_link'] = $this->checkout->reg_url_link; |
|
418 | + } |
|
419 | + return add_query_arg($query_args, $this->checkout->reg_page_base_url); |
|
420 | + } |
|
421 | + |
|
422 | + |
|
423 | + /** |
|
424 | + * creates the default hidden inputs section |
|
425 | + * |
|
426 | + * @return EE_Form_Section_Proper |
|
427 | + * @throws \EE_Error |
|
428 | + */ |
|
429 | + public function reg_step_hidden_inputs() |
|
430 | + { |
|
431 | + // hidden inputs for admin registrations |
|
432 | + if ($this->checkout->admin_request) { |
|
433 | + return new EE_Form_Section_Proper( |
|
434 | + array( |
|
435 | + 'layout_strategy' => new EE_Div_Per_Section_Layout(), |
|
436 | + 'html_id' => 'ee-' . $this->slug() . '-hidden-inputs', |
|
437 | + 'subsections' => array( |
|
438 | + 'next_step' => new EE_Fixed_Hidden_Input( |
|
439 | + array( |
|
440 | + 'html_name' => 'next_step', |
|
441 | + 'html_id' => 'spco-' . $this->slug() . '-next-step', |
|
442 | + 'default' => $this->checkout->next_step instanceof EE_SPCO_Reg_Step |
|
443 | + ? $this->checkout->next_step->slug() |
|
444 | + : '', |
|
445 | + ) |
|
446 | + ), |
|
447 | + ), |
|
448 | + ) |
|
449 | + ); |
|
450 | + } |
|
451 | + // hidden inputs for frontend registrations |
|
452 | + return new EE_Form_Section_Proper( |
|
453 | + array( |
|
454 | + 'layout_strategy' => new EE_Div_Per_Section_Layout(), |
|
455 | + 'html_id' => 'ee-' . $this->slug() . '-hidden-inputs', |
|
456 | + 'subsections' => array( |
|
457 | + 'action' => new EE_Fixed_Hidden_Input( |
|
458 | + array( |
|
459 | + 'html_name' => 'action', |
|
460 | + 'html_id' => 'spco-' . $this->slug() . '-action', |
|
461 | + 'default' => apply_filters( |
|
462 | + 'FHEE__EE_SPCO_Reg_Step__reg_step_hidden_inputs__default_form_action', |
|
463 | + empty($this->checkout->reg_url_link) |
|
464 | + ? 'process_reg_step' |
|
465 | + : 'update_reg_step', |
|
466 | + $this |
|
467 | + ), |
|
468 | + ) |
|
469 | + ), |
|
470 | + 'next_step' => new EE_Fixed_Hidden_Input( |
|
471 | + array( |
|
472 | + 'html_name' => 'next_step', |
|
473 | + 'html_id' => 'spco-' . $this->slug() . '-next-step', |
|
474 | + 'default' => $this->checkout->next_step instanceof EE_SPCO_Reg_Step |
|
475 | + ? $this->checkout->next_step->slug() |
|
476 | + : '', |
|
477 | + ) |
|
478 | + ), |
|
479 | + 'e_reg_url_link' => new EE_Fixed_Hidden_Input( |
|
480 | + array( |
|
481 | + 'html_name' => 'e_reg_url_link', |
|
482 | + 'html_id' => 'spco-reg_url_link', |
|
483 | + 'default' => $this->checkout->reg_url_link, |
|
484 | + ) |
|
485 | + ), |
|
486 | + 'revisit' => new EE_Fixed_Hidden_Input( |
|
487 | + array( |
|
488 | + 'html_name' => 'revisit', |
|
489 | + 'html_id' => 'spco-revisit', |
|
490 | + 'default' => $this->checkout->revisit, |
|
491 | + ) |
|
492 | + ), |
|
493 | + ), |
|
494 | + ) |
|
495 | + ); |
|
496 | + } |
|
497 | + |
|
498 | + |
|
499 | + /** |
|
500 | + * generate_reg_form_for_actions |
|
501 | + * |
|
502 | + * @param array $actions |
|
503 | + * @return void |
|
504 | + */ |
|
505 | + public function generate_reg_form_for_actions($actions = array()) |
|
506 | + { |
|
507 | + $actions = array_merge( |
|
508 | + array( |
|
509 | + 'generate_reg_form', |
|
510 | + 'display_spco_reg_step', |
|
511 | + 'process_reg_step', |
|
512 | + 'update_reg_step', |
|
513 | + ), |
|
514 | + $actions |
|
515 | + ); |
|
516 | + $this->checkout->generate_reg_form = in_array($this->checkout->action, $actions, true) ? true : false; |
|
517 | + } |
|
518 | + |
|
519 | + |
|
520 | + /** |
|
521 | + * @return string |
|
522 | + * @throws \EE_Error |
|
523 | + */ |
|
524 | + public function display_reg_form() |
|
525 | + { |
|
526 | + $html = ''; |
|
527 | + if ($this->reg_form instanceof EE_Form_Section_Proper) { |
|
528 | + do_action('AHEE__EE_SPCO_Reg_Step__display_reg_form__reg_form', $this->reg_form, $this); |
|
529 | + $html .= ! $this->checkout->admin_request ? $this->reg_form->form_open($this->reg_step_url()) : ''; |
|
530 | + if (EE_Registry::instance()->REQ->ajax) { |
|
531 | + $this->reg_form->localize_validation_rules(); |
|
532 | + $this->checkout->json_response->add_validation_rules(EE_Form_Section_Proper::js_localization()); |
|
533 | + } |
|
534 | + $html .= $this->reg_form->get_html(); |
|
535 | + $html .= ! $this->checkout->admin_request ? $this->reg_step_submit_button() : ''; |
|
536 | + $html .= ! $this->checkout->admin_request ? $this->reg_form->form_close() : ''; |
|
537 | + } |
|
538 | + return $html; |
|
539 | + } |
|
540 | + |
|
541 | + |
|
542 | + /** |
|
543 | + * div_class - returns nothing for current step, but a css class of "hidden" for others |
|
544 | + * |
|
545 | + * @return string |
|
546 | + * @throws \EE_Error |
|
547 | + */ |
|
548 | + public function reg_step_submit_button() |
|
549 | + { |
|
550 | + if (! $this->checkout->next_step instanceof EE_SPCO_Reg_Step) { |
|
551 | + return ''; |
|
552 | + } |
|
553 | + ob_start(); |
|
554 | + do_action( |
|
555 | + 'AHEE__before_spco_whats_next_buttons', |
|
556 | + $this->slug(), |
|
557 | + $this->checkout->next_step->slug(), |
|
558 | + $this->checkout |
|
559 | + ); |
|
560 | + $html = ob_get_clean(); |
|
561 | + // generate submit button |
|
562 | + $sbmt_btn = new EE_Submit_Input( |
|
563 | + array( |
|
564 | + 'html_name' => 'spco-go-to-step-' . $this->checkout->next_step->slug(), |
|
565 | + 'html_id' => 'spco-go-to-step-' . $this->checkout->next_step->slug(), |
|
566 | + 'html_class' => 'spco-next-step-btn', |
|
567 | + 'other_html_attributes' => ' rel="' . $this->slug() . '"', |
|
568 | + 'default' => $this->submit_button_text(), |
|
569 | + ) |
|
570 | + ); |
|
571 | + $sbmt_btn->set_button_css_attributes(true, 'large'); |
|
572 | + $sbmt_btn_html = $sbmt_btn->get_html_for_input(); |
|
573 | + $html .= EEH_HTML::div( |
|
574 | + apply_filters('FHEE__EE_SPCO_Reg_Step__reg_step_submit_button__sbmt_btn_html', $sbmt_btn_html, $this), |
|
575 | + 'spco-' . $this->slug() . '-whats-next-buttons-dv', |
|
576 | + 'spco-whats-next-buttons' |
|
577 | + ); |
|
578 | + return $html; |
|
579 | + } |
|
580 | + |
|
581 | + |
|
582 | + /** |
|
583 | + * div_class - returns nothing for current step, but a css class of "hidden" for others |
|
584 | + * |
|
585 | + * @return string |
|
586 | + */ |
|
587 | + public function div_class() |
|
588 | + { |
|
589 | + return $this->is_current_step() ? '' : ' hidden'; |
|
590 | + } |
|
591 | + |
|
592 | + |
|
593 | + /** |
|
594 | + * div_class - returns a css class of "hidden" for current step, but nothing for others |
|
595 | + * |
|
596 | + * @return string |
|
597 | + */ |
|
598 | + public function edit_lnk_url() |
|
599 | + { |
|
600 | + return add_query_arg(array('step' => $this->slug()), $this->checkout->reg_page_base_url); |
|
601 | + } |
|
602 | + |
|
603 | + |
|
604 | + /** |
|
605 | + * div_class - returns a css class of "hidden" for current step, but nothing for others |
|
606 | + * |
|
607 | + * @return string |
|
608 | + */ |
|
609 | + public function edit_link_class() |
|
610 | + { |
|
611 | + return $this->is_current_step() ? ' hidden' : ''; |
|
612 | + } |
|
613 | + |
|
614 | + |
|
615 | + /** |
|
616 | + * update_checkout with changes that have been made to the cart |
|
617 | + * |
|
618 | + * @return void |
|
619 | + * @throws \EE_Error |
|
620 | + */ |
|
621 | + public function update_checkout() |
|
622 | + { |
|
623 | + // grab the cart grand total and reset TXN total |
|
624 | + $this->checkout->transaction->set_total($this->checkout->cart->get_cart_grand_total()); |
|
625 | + $this->checkout->stash_transaction_and_checkout(); |
|
626 | + } |
|
627 | + |
|
628 | + |
|
629 | + /** |
|
630 | + * __sleep |
|
631 | + * to conserve db space, let's remove the reg_form and the EE_Checkout object from EE_SPCO_Reg_Step objects upon |
|
632 | + * serialization EE_Checkout will handle the reimplementation of itself upon waking, but we won't bother with the |
|
633 | + * reg form, because if needed, it will be regenerated anyways |
|
634 | + * |
|
635 | + * @return array |
|
636 | + */ |
|
637 | + public function __sleep() |
|
638 | + { |
|
639 | + // remove the reg form and the checkout |
|
640 | + return array_diff(array_keys(get_object_vars($this)), array('reg_form', 'checkout')); |
|
641 | + } |
|
642 | 642 | } |
@@ -221,7 +221,7 @@ discard block |
||
221 | 221 | */ |
222 | 222 | public function set_submit_button_text($submit_button_text = '') |
223 | 223 | { |
224 | - if (! empty($submit_button_text)) { |
|
224 | + if ( ! empty($submit_button_text)) { |
|
225 | 225 | $this->_submit_button_text = $submit_button_text; |
226 | 226 | } elseif ($this->checkout->next_step instanceof EE_SPCO_Reg_Step) { |
227 | 227 | if ($this->checkout->revisit) { |
@@ -379,7 +379,7 @@ discard block |
||
379 | 379 | public function reg_form_name() |
380 | 380 | { |
381 | 381 | if (empty($this->_reg_form_name)) { |
382 | - $this->set_reg_form_name('ee-spco-' . $this->slug() . '-reg-step-form'); |
|
382 | + $this->set_reg_form_name('ee-spco-'.$this->slug().'-reg-step-form'); |
|
383 | 383 | } |
384 | 384 | return $this->_reg_form_name; |
385 | 385 | } |
@@ -403,7 +403,7 @@ discard block |
||
403 | 403 | public function reg_step_url($action = '') |
404 | 404 | { |
405 | 405 | $query_args = array('step' => $this->slug()); |
406 | - if (! empty($action)) { |
|
406 | + if ( ! empty($action)) { |
|
407 | 407 | $query_args['action'] = $action; |
408 | 408 | } |
409 | 409 | // final step has no display |
@@ -433,12 +433,12 @@ discard block |
||
433 | 433 | return new EE_Form_Section_Proper( |
434 | 434 | array( |
435 | 435 | 'layout_strategy' => new EE_Div_Per_Section_Layout(), |
436 | - 'html_id' => 'ee-' . $this->slug() . '-hidden-inputs', |
|
436 | + 'html_id' => 'ee-'.$this->slug().'-hidden-inputs', |
|
437 | 437 | 'subsections' => array( |
438 | 438 | 'next_step' => new EE_Fixed_Hidden_Input( |
439 | 439 | array( |
440 | 440 | 'html_name' => 'next_step', |
441 | - 'html_id' => 'spco-' . $this->slug() . '-next-step', |
|
441 | + 'html_id' => 'spco-'.$this->slug().'-next-step', |
|
442 | 442 | 'default' => $this->checkout->next_step instanceof EE_SPCO_Reg_Step |
443 | 443 | ? $this->checkout->next_step->slug() |
444 | 444 | : '', |
@@ -452,12 +452,12 @@ discard block |
||
452 | 452 | return new EE_Form_Section_Proper( |
453 | 453 | array( |
454 | 454 | 'layout_strategy' => new EE_Div_Per_Section_Layout(), |
455 | - 'html_id' => 'ee-' . $this->slug() . '-hidden-inputs', |
|
455 | + 'html_id' => 'ee-'.$this->slug().'-hidden-inputs', |
|
456 | 456 | 'subsections' => array( |
457 | 457 | 'action' => new EE_Fixed_Hidden_Input( |
458 | 458 | array( |
459 | 459 | 'html_name' => 'action', |
460 | - 'html_id' => 'spco-' . $this->slug() . '-action', |
|
460 | + 'html_id' => 'spco-'.$this->slug().'-action', |
|
461 | 461 | 'default' => apply_filters( |
462 | 462 | 'FHEE__EE_SPCO_Reg_Step__reg_step_hidden_inputs__default_form_action', |
463 | 463 | empty($this->checkout->reg_url_link) |
@@ -470,7 +470,7 @@ discard block |
||
470 | 470 | 'next_step' => new EE_Fixed_Hidden_Input( |
471 | 471 | array( |
472 | 472 | 'html_name' => 'next_step', |
473 | - 'html_id' => 'spco-' . $this->slug() . '-next-step', |
|
473 | + 'html_id' => 'spco-'.$this->slug().'-next-step', |
|
474 | 474 | 'default' => $this->checkout->next_step instanceof EE_SPCO_Reg_Step |
475 | 475 | ? $this->checkout->next_step->slug() |
476 | 476 | : '', |
@@ -547,7 +547,7 @@ discard block |
||
547 | 547 | */ |
548 | 548 | public function reg_step_submit_button() |
549 | 549 | { |
550 | - if (! $this->checkout->next_step instanceof EE_SPCO_Reg_Step) { |
|
550 | + if ( ! $this->checkout->next_step instanceof EE_SPCO_Reg_Step) { |
|
551 | 551 | return ''; |
552 | 552 | } |
553 | 553 | ob_start(); |
@@ -561,10 +561,10 @@ discard block |
||
561 | 561 | // generate submit button |
562 | 562 | $sbmt_btn = new EE_Submit_Input( |
563 | 563 | array( |
564 | - 'html_name' => 'spco-go-to-step-' . $this->checkout->next_step->slug(), |
|
565 | - 'html_id' => 'spco-go-to-step-' . $this->checkout->next_step->slug(), |
|
564 | + 'html_name' => 'spco-go-to-step-'.$this->checkout->next_step->slug(), |
|
565 | + 'html_id' => 'spco-go-to-step-'.$this->checkout->next_step->slug(), |
|
566 | 566 | 'html_class' => 'spco-next-step-btn', |
567 | - 'other_html_attributes' => ' rel="' . $this->slug() . '"', |
|
567 | + 'other_html_attributes' => ' rel="'.$this->slug().'"', |
|
568 | 568 | 'default' => $this->submit_button_text(), |
569 | 569 | ) |
570 | 570 | ); |
@@ -572,7 +572,7 @@ discard block |
||
572 | 572 | $sbmt_btn_html = $sbmt_btn->get_html_for_input(); |
573 | 573 | $html .= EEH_HTML::div( |
574 | 574 | apply_filters('FHEE__EE_SPCO_Reg_Step__reg_step_submit_button__sbmt_btn_html', $sbmt_btn_html, $this), |
575 | - 'spco-' . $this->slug() . '-whats-next-buttons-dv', |
|
575 | + 'spco-'.$this->slug().'-whats-next-buttons-dv', |
|
576 | 576 | 'spco-whats-next-buttons' |
577 | 577 | ); |
578 | 578 | return $html; |
@@ -15,1429 +15,1429 @@ |
||
15 | 15 | class EE_Checkout |
16 | 16 | { |
17 | 17 | |
18 | - /** |
|
19 | - * whether current request originated from the EE admin |
|
20 | - * |
|
21 | - * @type bool |
|
22 | - */ |
|
23 | - public $admin_request = false; |
|
24 | - |
|
25 | - /** |
|
26 | - * whether returning to edit attendee information or to retry a payment |
|
27 | - * |
|
28 | - * @type bool |
|
29 | - */ |
|
30 | - public $revisit = false; |
|
31 | - |
|
32 | - /** |
|
33 | - * whether the primary registrant is returning to edit attendee information or to retry a payment |
|
34 | - * |
|
35 | - * @type bool |
|
36 | - */ |
|
37 | - public $primary_revisit = false; |
|
38 | - |
|
39 | - /** |
|
40 | - * is registration allowed to progress or halted for some reason such as failing to pass recaptcha? |
|
41 | - * |
|
42 | - * @type bool |
|
43 | - */ |
|
44 | - public $continue_reg = true; |
|
45 | - |
|
46 | - /** |
|
47 | - * redirect to thank you page ? |
|
48 | - * |
|
49 | - * @type bool |
|
50 | - */ |
|
51 | - public $redirect = false; |
|
52 | - |
|
53 | - /** |
|
54 | - * generate the reg form or not ? |
|
55 | - * |
|
56 | - * @type bool |
|
57 | - */ |
|
58 | - public $generate_reg_form = true; |
|
59 | - |
|
60 | - /** |
|
61 | - * process a reg form submission or not ? |
|
62 | - * |
|
63 | - * @type bool |
|
64 | - */ |
|
65 | - public $process_form_submission = false; |
|
66 | - |
|
67 | - /** |
|
68 | - * tracks whether the TXN status modified during this checkout |
|
69 | - * |
|
70 | - * @type bool |
|
71 | - */ |
|
72 | - public $txn_status_updated = false; |
|
73 | - |
|
74 | - /** |
|
75 | - * only triggered to true after absolutely everything has finished. |
|
76 | - * |
|
77 | - * @type bool |
|
78 | - */ |
|
79 | - protected $exit_spco = false; |
|
80 | - |
|
81 | - /** |
|
82 | - * tracks whether any of the TXN's Registrations statuses modified during this checkout |
|
83 | - * indexed by registration ID |
|
84 | - * |
|
85 | - * @type array |
|
86 | - */ |
|
87 | - protected $reg_status_updated = array(); |
|
88 | - |
|
89 | - /** |
|
90 | - * timestamp when redirected from Ticket Selector to the checkout |
|
91 | - * |
|
92 | - * @type int |
|
93 | - */ |
|
94 | - public $uts = 0; |
|
95 | - |
|
96 | - /** |
|
97 | - * total number of tickets that were in the cart |
|
98 | - * |
|
99 | - * @type int |
|
100 | - */ |
|
101 | - public $total_ticket_count = 0; |
|
102 | - |
|
103 | - /** |
|
104 | - * corresponds loosely to EE_Transaction::remaining() |
|
105 | - * but can be modified by SPCO |
|
106 | - * |
|
107 | - * @type float |
|
108 | - */ |
|
109 | - public $amount_owing = 0; |
|
110 | - |
|
111 | - /** |
|
112 | - * the reg step slug from the incoming request |
|
113 | - * |
|
114 | - * @type string |
|
115 | - */ |
|
116 | - public $step = ''; |
|
117 | - |
|
118 | - /** |
|
119 | - * the reg step slug for a step being edited |
|
120 | - * |
|
121 | - * @type string |
|
122 | - */ |
|
123 | - public $edit_step = ''; |
|
124 | - |
|
125 | - /** |
|
126 | - * the action being performed on the current step |
|
127 | - * |
|
128 | - * @type string |
|
129 | - */ |
|
130 | - public $action = ''; |
|
131 | - |
|
132 | - /** |
|
133 | - * reg_url_link for a previously saved registration |
|
134 | - * |
|
135 | - * @type string |
|
136 | - */ |
|
137 | - public $reg_url_link = ''; |
|
138 | - |
|
139 | - /** |
|
140 | - * string slug for the payment method that was selected during the payment options step |
|
141 | - * |
|
142 | - * @type string |
|
143 | - */ |
|
144 | - public $selected_method_of_payment = ''; |
|
145 | - |
|
146 | - /** |
|
147 | - * base url for the site's registration checkout page - additional url params will be added to this |
|
148 | - * |
|
149 | - * @type string |
|
150 | - */ |
|
151 | - public $reg_page_base_url = ''; |
|
152 | - |
|
153 | - /** |
|
154 | - * base url for the site's registration cancelled page - additional url params will be added to this |
|
155 | - * |
|
156 | - * @type string |
|
157 | - */ |
|
158 | - public $cancel_page_url = ''; |
|
159 | - |
|
160 | - /** |
|
161 | - * base url for the site's thank you page - additional url params will be added to this |
|
162 | - * |
|
163 | - * @type string |
|
164 | - */ |
|
165 | - public $thank_you_page_url = ''; |
|
166 | - |
|
167 | - /** |
|
168 | - * base url for any redirects - additional url params will be added to this |
|
169 | - * |
|
170 | - * @type string |
|
171 | - */ |
|
172 | - public $redirect_url = ''; |
|
173 | - |
|
174 | - /** |
|
175 | - * form of POST data for use with off-site gateways |
|
176 | - * |
|
177 | - * @type string |
|
178 | - */ |
|
179 | - public $redirect_form = ''; |
|
180 | - |
|
181 | - /** |
|
182 | - * array of query where params to use when retrieving cached registrations from $this->checkout->transaction |
|
183 | - * |
|
184 | - * @type array |
|
185 | - */ |
|
186 | - public $reg_cache_where_params = array(); |
|
187 | - |
|
188 | - /** |
|
189 | - * a class for managing and creating the JSON encoded array of data that gets passed back to the client during AJAX |
|
190 | - * requests |
|
191 | - * |
|
192 | - * @type EE_SPCO_JSON_Response |
|
193 | - */ |
|
194 | - public $json_response; |
|
195 | - |
|
196 | - /** |
|
197 | - * where we are going next in the reg process |
|
198 | - * |
|
199 | - * @type EE_SPCO_Reg_Step |
|
200 | - */ |
|
201 | - public $next_step; |
|
202 | - |
|
203 | - /** |
|
204 | - * where we are in the reg process |
|
205 | - * |
|
206 | - * @type EE_SPCO_Reg_Step |
|
207 | - */ |
|
208 | - public $current_step; |
|
209 | - |
|
210 | - /** |
|
211 | - * $_cart - the current cart object |
|
212 | - * |
|
213 | - * @var EE_CART |
|
214 | - */ |
|
215 | - public $cart; |
|
216 | - |
|
217 | - /** |
|
218 | - * $_transaction - the current transaction object |
|
219 | - * |
|
220 | - * @var EE_Transaction |
|
221 | - */ |
|
222 | - public $transaction; |
|
223 | - |
|
224 | - /** |
|
225 | - * the related attendee object for the primary registrant |
|
226 | - * |
|
227 | - * @type EE_Attendee |
|
228 | - */ |
|
229 | - public $primary_attendee_obj; |
|
230 | - |
|
231 | - /** |
|
232 | - * $payment_method - the payment method object for the selected method of payment |
|
233 | - * |
|
234 | - * @type EE_Payment_Method |
|
235 | - */ |
|
236 | - public $payment_method; |
|
237 | - |
|
238 | - /** |
|
239 | - * $payment - if a payment was successfully made during the reg process, |
|
240 | - * then here it is !!! |
|
241 | - * |
|
242 | - * @type EE_Payment |
|
243 | - */ |
|
244 | - public $payment; |
|
245 | - |
|
246 | - /** |
|
247 | - * if a payment method was selected that uses an on-site gateway, then this is the billing form |
|
248 | - * |
|
249 | - * @type EE_Billing_Info_Form | EE_Billing_Attendee_Info_Form |
|
250 | - */ |
|
251 | - public $billing_form; |
|
252 | - |
|
253 | - /** |
|
254 | - * the entire registration form composed of ALL of the subsections generated by the various reg steps |
|
255 | - * |
|
256 | - * @type EE_Form_Section_Proper |
|
257 | - */ |
|
258 | - public $registration_form; |
|
259 | - |
|
260 | - /** |
|
261 | - * array of EE_SPCO_Reg_Step objects |
|
262 | - * |
|
263 | - * @type EE_SPCO_Reg_Step[] |
|
264 | - */ |
|
265 | - public $reg_steps = array(); |
|
266 | - |
|
267 | - /** |
|
268 | - * array of EE_Payment_Method objects |
|
269 | - * |
|
270 | - * @type EE_Payment_Method[] |
|
271 | - */ |
|
272 | - public $available_payment_methods = array(); |
|
273 | - |
|
274 | - |
|
275 | - /** |
|
276 | - * class constructor |
|
277 | - * |
|
278 | - * @access public |
|
279 | - */ |
|
280 | - public function __construct() |
|
281 | - { |
|
282 | - $this->reg_page_base_url = EE_Registry::instance()->CFG->core->reg_page_url(); |
|
283 | - $this->thank_you_page_url = EE_Registry::instance()->CFG->core->thank_you_page_url(); |
|
284 | - $this->cancel_page_url = EE_Registry::instance()->CFG->core->cancel_page_url(); |
|
285 | - $this->continue_reg = apply_filters('FHEE__EE_Checkout___construct___continue_reg', true); |
|
286 | - $this->admin_request = is_admin() && ! EE_Registry::instance()->REQ->ajax; |
|
287 | - $this->reg_cache_where_params = array( |
|
288 | - 0 => array('REG_deleted' => false), |
|
289 | - 'order_by' => array('REG_count' => 'ASC'), |
|
290 | - ); |
|
291 | - } |
|
292 | - |
|
293 | - |
|
294 | - /** |
|
295 | - * returns true if ANY reg status was updated during checkout |
|
296 | - * |
|
297 | - * @return boolean |
|
298 | - */ |
|
299 | - public function any_reg_status_updated() |
|
300 | - { |
|
301 | - foreach ($this->reg_status_updated as $reg_status) { |
|
302 | - if ($reg_status) { |
|
303 | - return true; |
|
304 | - } |
|
305 | - } |
|
306 | - return false; |
|
307 | - } |
|
308 | - |
|
309 | - |
|
310 | - /** |
|
311 | - * @param $REG_ID |
|
312 | - * @return boolean |
|
313 | - */ |
|
314 | - public function reg_status_updated($REG_ID) |
|
315 | - { |
|
316 | - return isset($this->reg_status_updated[ $REG_ID ]) ? $this->reg_status_updated[ $REG_ID ] : false; |
|
317 | - } |
|
318 | - |
|
319 | - |
|
320 | - /** |
|
321 | - * @param $REG_ID |
|
322 | - * @param $reg_status |
|
323 | - */ |
|
324 | - public function set_reg_status_updated($REG_ID, $reg_status) |
|
325 | - { |
|
326 | - $this->reg_status_updated[ $REG_ID ] = filter_var($reg_status, FILTER_VALIDATE_BOOLEAN); |
|
327 | - } |
|
328 | - |
|
329 | - |
|
330 | - /** |
|
331 | - * exit_spco |
|
332 | - * |
|
333 | - * @return bool |
|
334 | - */ |
|
335 | - public function exit_spco() |
|
336 | - { |
|
337 | - return $this->exit_spco; |
|
338 | - } |
|
339 | - |
|
340 | - |
|
341 | - /** |
|
342 | - * set_exit_spco |
|
343 | - * can ONLY be set by the Finalize_Registration reg step |
|
344 | - */ |
|
345 | - public function set_exit_spco() |
|
346 | - { |
|
347 | - if ($this->current_step instanceof EE_SPCO_Reg_Step_Finalize_Registration) { |
|
348 | - $this->exit_spco = true; |
|
349 | - } |
|
350 | - } |
|
351 | - |
|
352 | - |
|
353 | - /** |
|
354 | - * reset_for_current_request |
|
355 | - * |
|
356 | - * @access public |
|
357 | - * @return void |
|
358 | - */ |
|
359 | - public function reset_for_current_request() |
|
360 | - { |
|
361 | - $this->process_form_submission = false; |
|
362 | - $this->continue_reg = apply_filters('FHEE__EE_Checkout___construct___continue_reg', true); |
|
363 | - $this->admin_request = is_admin() && ! EE_Registry::instance()->REQ->front_ajax; |
|
364 | - $this->continue_reg = true; |
|
365 | - $this->redirect = false; |
|
366 | - // don't reset the cached redirect form if we're about to be asked to display it !!! |
|
367 | - if (EE_Registry::instance()->REQ->get('action', 'display_spco_reg_step') !== 'redirect_form') { |
|
368 | - $this->redirect_form = ''; |
|
369 | - } |
|
370 | - $this->redirect_url = ''; |
|
371 | - $this->json_response = new EE_SPCO_JSON_Response(); |
|
372 | - EE_Form_Section_Proper::reset_js_localization(); |
|
373 | - } |
|
374 | - |
|
375 | - |
|
376 | - /** |
|
377 | - * add_reg_step |
|
378 | - * |
|
379 | - * @access public |
|
380 | - * @param EE_SPCO_Reg_Step $reg_step_obj |
|
381 | - * @return void |
|
382 | - */ |
|
383 | - public function add_reg_step(EE_SPCO_Reg_Step $reg_step_obj) |
|
384 | - { |
|
385 | - $this->reg_steps[ $reg_step_obj->slug() ] = $reg_step_obj; |
|
386 | - } |
|
387 | - |
|
388 | - |
|
389 | - /** |
|
390 | - * skip_reg_step |
|
391 | - * if the current reg step does not need to run for some reason, |
|
392 | - * then this will advance SPCO to the next reg step, |
|
393 | - * and mark the skipped step as completed |
|
394 | - * |
|
395 | - * @access public |
|
396 | - * @param string $reg_step_slug |
|
397 | - * @return void |
|
398 | - * @throws \EE_Error |
|
399 | - */ |
|
400 | - public function skip_reg_step($reg_step_slug = '') |
|
401 | - { |
|
402 | - $step_to_skip = $this->find_reg_step($reg_step_slug); |
|
403 | - if ($step_to_skip instanceof EE_SPCO_Reg_Step && $step_to_skip->is_current_step()) { |
|
404 | - $step_to_skip->set_is_current_step(false); |
|
405 | - $step_to_skip->set_completed(); |
|
406 | - // advance to the next step |
|
407 | - $this->set_current_step($this->next_step->slug()); |
|
408 | - // also reset the step param in the request in case any other code references that directly |
|
409 | - EE_Registry::instance()->REQ->set('step', $this->current_step->slug()); |
|
410 | - // since we are skipping a step and setting the current step to be what was previously the next step, |
|
411 | - // we need to check that the next step is now correct, and not still set to the current step. |
|
412 | - if ($this->current_step->slug() === $this->next_step->slug()) { |
|
413 | - // correctly setup the next step |
|
414 | - $this->set_next_step(); |
|
415 | - } |
|
416 | - $this->set_reg_step_initiated($this->current_step); |
|
417 | - } |
|
418 | - } |
|
419 | - |
|
420 | - |
|
421 | - /** |
|
422 | - * remove_reg_step |
|
423 | - * |
|
424 | - * @access public |
|
425 | - * @param string $reg_step_slug |
|
426 | - * @param bool $reset whether to reset reg steps after removal |
|
427 | - * @throws EE_Error |
|
428 | - */ |
|
429 | - public function remove_reg_step($reg_step_slug = '', $reset = true) |
|
430 | - { |
|
431 | - unset($this->reg_steps[ $reg_step_slug ]); |
|
432 | - if ($this->transaction instanceof EE_Transaction) { |
|
433 | - // now remove reg step from TXN and save |
|
434 | - $this->transaction->remove_reg_step($reg_step_slug); |
|
435 | - $this->transaction->save(); |
|
436 | - } |
|
437 | - if ($reset) { |
|
438 | - $this->reset_reg_steps(); |
|
439 | - } |
|
440 | - } |
|
441 | - |
|
442 | - |
|
443 | - /** |
|
444 | - * set_reg_step_order |
|
445 | - * |
|
446 | - * @access public |
|
447 | - * @param string $reg_step_slug |
|
448 | - * @param int $order |
|
449 | - * @return void |
|
450 | - */ |
|
451 | - public function set_reg_step_order($reg_step_slug = '', $order = 100) |
|
452 | - { |
|
453 | - if (isset($this->reg_steps[ $reg_step_slug ])) { |
|
454 | - $this->reg_steps[ $reg_step_slug ]->set_order($order); |
|
455 | - } |
|
456 | - } |
|
457 | - |
|
458 | - |
|
459 | - /** |
|
460 | - * set_current_step |
|
461 | - * |
|
462 | - * @access public |
|
463 | - * @param string $current_step |
|
464 | - * @return void |
|
465 | - */ |
|
466 | - public function set_current_step($current_step) |
|
467 | - { |
|
468 | - // grab what step we're on |
|
469 | - $this->current_step = isset($this->reg_steps[ $current_step ]) |
|
470 | - ? $this->reg_steps[ $current_step ] |
|
471 | - : reset( |
|
472 | - $this->reg_steps |
|
473 | - ); |
|
474 | - // verify instance |
|
475 | - if ($this->current_step instanceof EE_SPCO_Reg_Step) { |
|
476 | - // we don't want to repeat completed steps if this is the first time through SPCO |
|
477 | - if ($this->continue_reg && ! $this->revisit && $this->current_step->completed()) { |
|
478 | - // so advance to the next step |
|
479 | - $this->set_next_step(); |
|
480 | - if ($this->next_step instanceof EE_SPCO_Reg_Step) { |
|
481 | - // and attempt to set it as the current step |
|
482 | - $this->set_current_step($this->next_step->slug()); |
|
483 | - } |
|
484 | - return; |
|
485 | - } |
|
486 | - $this->current_step->set_is_current_step(true); |
|
487 | - } else { |
|
488 | - EE_Error::add_error( |
|
489 | - __('The current step could not be set.', 'event_espresso'), |
|
490 | - __FILE__, |
|
491 | - __FUNCTION__, |
|
492 | - __LINE__ |
|
493 | - ); |
|
494 | - } |
|
495 | - } |
|
496 | - |
|
497 | - |
|
498 | - /** |
|
499 | - * set_next_step |
|
500 | - * advances the reg_steps array pointer and sets the next step, then reverses pointer back to the current step |
|
501 | - * |
|
502 | - * @access public |
|
503 | - * @return void |
|
504 | - */ |
|
505 | - public function set_next_step() |
|
506 | - { |
|
507 | - // set pointer to start of array |
|
508 | - reset($this->reg_steps); |
|
509 | - // if there is more than one step |
|
510 | - if (count($this->reg_steps) > 1) { |
|
511 | - // advance to the current step and set pointer |
|
512 | - while (key($this->reg_steps) !== $this->current_step->slug() && key($this->reg_steps) !== '') { |
|
513 | - next($this->reg_steps); |
|
514 | - } |
|
515 | - } |
|
516 | - // advance one more spot ( if it exists ) |
|
517 | - $this->next_step = next($this->reg_steps); |
|
518 | - // verify instance |
|
519 | - $this->next_step = $this->next_step instanceof EE_SPCO_Reg_Step ? $this->next_step : null; |
|
520 | - // then back to current step to reset |
|
521 | - prev($this->reg_steps); |
|
522 | - } |
|
523 | - |
|
524 | - |
|
525 | - /** |
|
526 | - * get_next_reg_step |
|
527 | - * this simply returns the next step from reg_steps array |
|
528 | - * |
|
529 | - * @access public |
|
530 | - * @return EE_SPCO_Reg_Step | null |
|
531 | - */ |
|
532 | - public function get_next_reg_step() |
|
533 | - { |
|
534 | - $next = next($this->reg_steps); |
|
535 | - prev($this->reg_steps); |
|
536 | - return $next instanceof EE_SPCO_Reg_Step ? $next : null; |
|
537 | - } |
|
538 | - |
|
539 | - |
|
540 | - /** |
|
541 | - * get_prev_reg_step |
|
542 | - * this simply returns the previous step from reg_steps array |
|
543 | - * |
|
544 | - * @access public |
|
545 | - * @return EE_SPCO_Reg_Step | null |
|
546 | - */ |
|
547 | - public function get_prev_reg_step() |
|
548 | - { |
|
549 | - $prev = prev($this->reg_steps); |
|
550 | - next($this->reg_steps); |
|
551 | - return $prev instanceof EE_SPCO_Reg_Step ? $prev : null; |
|
552 | - } |
|
553 | - |
|
554 | - |
|
555 | - /** |
|
556 | - * sort_reg_steps |
|
557 | - * |
|
558 | - * @access public |
|
559 | - * @return void |
|
560 | - */ |
|
561 | - public function sort_reg_steps() |
|
562 | - { |
|
563 | - $reg_step_sorting_callback = apply_filters( |
|
564 | - 'FHEE__EE_Checkout__sort_reg_steps__reg_step_sorting_callback', |
|
565 | - 'reg_step_sorting_callback' |
|
566 | - ); |
|
567 | - uasort($this->reg_steps, array($this, $reg_step_sorting_callback)); |
|
568 | - } |
|
569 | - |
|
570 | - |
|
571 | - /** |
|
572 | - * find_reg_step |
|
573 | - * finds a reg step by the given slug |
|
574 | - * |
|
575 | - * @access public |
|
576 | - * @param string $reg_step_slug |
|
577 | - * @return EE_SPCO_Reg_Step|null |
|
578 | - */ |
|
579 | - public function find_reg_step($reg_step_slug = '') |
|
580 | - { |
|
581 | - if (! empty($reg_step_slug)) { |
|
582 | - // copy reg step array |
|
583 | - $reg_steps = $this->reg_steps; |
|
584 | - // set pointer to start of array |
|
585 | - reset($reg_steps); |
|
586 | - // if there is more than one step |
|
587 | - if (count($reg_steps) > 1) { |
|
588 | - // advance to the current step and set pointer |
|
589 | - while (key($reg_steps) !== $reg_step_slug && key($reg_steps) !== '') { |
|
590 | - next($reg_steps); |
|
591 | - } |
|
592 | - return current($reg_steps); |
|
593 | - } |
|
594 | - } |
|
595 | - return null; |
|
596 | - } |
|
597 | - |
|
598 | - |
|
599 | - /** |
|
600 | - * reg_step_sorting_callback |
|
601 | - * |
|
602 | - * @access public |
|
603 | - * @param EE_SPCO_Reg_Step $reg_step_A |
|
604 | - * @param EE_SPCO_Reg_Step $reg_step_B |
|
605 | - * @return int |
|
606 | - */ |
|
607 | - public function reg_step_sorting_callback(EE_SPCO_Reg_Step $reg_step_A, EE_SPCO_Reg_Step $reg_step_B) |
|
608 | - { |
|
609 | - // send finalize_registration step to the end of the array |
|
610 | - if ($reg_step_A->slug() === 'finalize_registration') { |
|
611 | - return 1; |
|
612 | - } elseif ($reg_step_B->slug() === 'finalize_registration') { |
|
613 | - return -1; |
|
614 | - } |
|
615 | - if ($reg_step_A->order() === $reg_step_B->order()) { |
|
616 | - return 0; |
|
617 | - } |
|
618 | - return ($reg_step_A->order() > $reg_step_B->order()) ? 1 : -1; |
|
619 | - } |
|
620 | - |
|
621 | - |
|
622 | - /** |
|
623 | - * set_reg_step_initiated |
|
624 | - * |
|
625 | - * @access public |
|
626 | - * @param EE_SPCO_Reg_Step $reg_step |
|
627 | - * @throws \EE_Error |
|
628 | - */ |
|
629 | - public function set_reg_step_initiated(EE_SPCO_Reg_Step $reg_step) |
|
630 | - { |
|
631 | - // call set_reg_step_initiated ??? |
|
632 | - if (// first time visiting SPCO ? |
|
633 | - ! $this->revisit |
|
634 | - && ( |
|
635 | - // and displaying the reg step form for the first time ? |
|
636 | - $this->action === 'display_spco_reg_step' |
|
637 | - // or initializing the final step |
|
638 | - || $reg_step instanceof EE_SPCO_Reg_Step_Finalize_Registration |
|
639 | - ) |
|
640 | - ) { |
|
641 | - // set the start time for this reg step |
|
642 | - if (! $this->transaction->set_reg_step_initiated($reg_step->slug())) { |
|
643 | - if (WP_DEBUG) { |
|
644 | - EE_Error::add_error( |
|
645 | - sprintf( |
|
646 | - __('The "%1$s" registration step was not initialized properly.', 'event_espresso'), |
|
647 | - $reg_step->name() |
|
648 | - ), |
|
649 | - __FILE__, |
|
650 | - __FUNCTION__, |
|
651 | - __LINE__ |
|
652 | - ); |
|
653 | - } |
|
654 | - } |
|
655 | - } |
|
656 | - } |
|
657 | - |
|
658 | - |
|
659 | - /** |
|
660 | - * set_reg_step_JSON_info |
|
661 | - * |
|
662 | - * @access public |
|
663 | - * @return void |
|
664 | - */ |
|
665 | - public function set_reg_step_JSON_info() |
|
666 | - { |
|
667 | - EE_Registry::$i18n_js_strings['reg_steps'] = array(); |
|
668 | - // pass basic reg step data to JS |
|
669 | - foreach ($this->reg_steps as $reg_step) { |
|
670 | - EE_Registry::$i18n_js_strings['reg_steps'][] = $reg_step->slug(); |
|
671 | - } |
|
672 | - // reset reg step html |
|
673 | - // $this->json_response->set_reg_step_html(''); |
|
674 | - } |
|
675 | - |
|
676 | - |
|
677 | - /** |
|
678 | - * reset_reg_steps |
|
679 | - * |
|
680 | - * @access public |
|
681 | - * @return void |
|
682 | - */ |
|
683 | - public function reset_reg_steps() |
|
684 | - { |
|
685 | - $this->sort_reg_steps(); |
|
686 | - $this->set_current_step(EE_Registry::instance()->REQ->get('step')); |
|
687 | - $this->set_next_step(); |
|
688 | - // the text that appears on the reg step form submit button |
|
689 | - $this->current_step->set_submit_button_text(); |
|
690 | - $this->set_reg_step_JSON_info(); |
|
691 | - } |
|
692 | - |
|
693 | - |
|
694 | - /** |
|
695 | - * get_registration_time_limit |
|
696 | - * |
|
697 | - * @access public |
|
698 | - * @return string |
|
699 | - */ |
|
700 | - public function get_registration_time_limit() |
|
701 | - { |
|
702 | - |
|
703 | - $registration_time_limit = (float) (EE_Registry::instance()->SSN->expiration() - time()); |
|
704 | - $time_limit_format = $registration_time_limit > 60 * MINUTE_IN_SECONDS ? 'H:i:s' : 'i:s'; |
|
705 | - $registration_time_limit = date($time_limit_format, $registration_time_limit); |
|
706 | - return apply_filters( |
|
707 | - 'FHEE__EE_Checkout__get_registration_time_limit__registration_time_limit', |
|
708 | - $registration_time_limit |
|
709 | - ); |
|
710 | - } |
|
711 | - |
|
712 | - |
|
713 | - /** |
|
714 | - * payment_required |
|
715 | - * |
|
716 | - * @return boolean |
|
717 | - */ |
|
718 | - public function payment_required() |
|
719 | - { |
|
720 | - // if NOT: |
|
721 | - // registration via admin |
|
722 | - // completed TXN |
|
723 | - // overpaid TXN |
|
724 | - // free TXN(total = 0.00) |
|
725 | - // then payment required is TRUE |
|
726 | - return ! ($this->admin_request |
|
727 | - || $this->transaction->is_completed() |
|
728 | - || $this->transaction->is_overpaid() |
|
729 | - || $this->transaction->is_free()) ? true : false; |
|
730 | - } |
|
731 | - |
|
732 | - |
|
733 | - /** |
|
734 | - * get_cart_for_transaction |
|
735 | - * |
|
736 | - * @access public |
|
737 | - * @param EE_Transaction $transaction |
|
738 | - * @return EE_Cart |
|
739 | - */ |
|
740 | - public function get_cart_for_transaction($transaction) |
|
741 | - { |
|
742 | - $session = EE_Registry::instance()->load_core('Session'); |
|
743 | - $cart = $transaction instanceof EE_Transaction ? EE_Cart::get_cart_from_txn($transaction, $session) : null; |
|
744 | - // verify cart |
|
745 | - if (! $cart instanceof EE_Cart) { |
|
746 | - $cart = EE_Registry::instance()->load_core('Cart'); |
|
747 | - } |
|
748 | - |
|
749 | - return $cart; |
|
750 | - } |
|
751 | - |
|
752 | - |
|
753 | - /** |
|
754 | - * initialize_txn_reg_steps_array |
|
755 | - * |
|
756 | - * @access public |
|
757 | - * @return array |
|
758 | - */ |
|
759 | - public function initialize_txn_reg_steps_array() |
|
760 | - { |
|
761 | - $txn_reg_steps_array = array(); |
|
762 | - foreach ($this->reg_steps as $reg_step) { |
|
763 | - $txn_reg_steps_array[ $reg_step->slug() ] = false; |
|
764 | - } |
|
765 | - return $txn_reg_steps_array; |
|
766 | - } |
|
767 | - |
|
768 | - |
|
769 | - /** |
|
770 | - * update_txn_reg_steps_array |
|
771 | - * |
|
772 | - * @access public |
|
773 | - * @return bool |
|
774 | - * @throws \EE_Error |
|
775 | - */ |
|
776 | - public function update_txn_reg_steps_array() |
|
777 | - { |
|
778 | - $updated = false; |
|
779 | - foreach ($this->reg_steps as $reg_step) { |
|
780 | - if ($reg_step->completed()) { |
|
781 | - $updated = $this->transaction->set_reg_step_completed($reg_step->slug()) |
|
782 | - ? true |
|
783 | - : $updated; |
|
784 | - } |
|
785 | - } |
|
786 | - if ($updated) { |
|
787 | - $this->transaction->save(); |
|
788 | - } |
|
789 | - return $updated; |
|
790 | - } |
|
791 | - |
|
792 | - |
|
793 | - /** |
|
794 | - * stash_transaction_and_checkout |
|
795 | - * |
|
796 | - * @access public |
|
797 | - * @return void |
|
798 | - * @throws \EE_Error |
|
799 | - */ |
|
800 | - public function stash_transaction_and_checkout() |
|
801 | - { |
|
802 | - if (! $this->revisit) { |
|
803 | - $this->update_txn_reg_steps_array(); |
|
804 | - } |
|
805 | - $this->track_transaction_and_registration_status_updates(); |
|
806 | - // save all data to the db, but suppress errors |
|
807 | - // $this->save_all_data( FALSE ); |
|
808 | - // cache the checkout in the session |
|
809 | - EE_Registry::instance()->SSN->set_checkout($this); |
|
810 | - } |
|
811 | - |
|
812 | - |
|
813 | - /** |
|
814 | - * track_transaction_and_registration_status_updates |
|
815 | - * stores whether any updates were made to the TXN or it's related registrations |
|
816 | - * |
|
817 | - * @access public |
|
818 | - * @return void |
|
819 | - * @throws \EE_Error |
|
820 | - */ |
|
821 | - public function track_transaction_and_registration_status_updates() |
|
822 | - { |
|
823 | - // verify the transaction |
|
824 | - if ($this->transaction instanceof EE_Transaction) { |
|
825 | - // has there been a TXN status change during this checkout? |
|
826 | - $this->txn_status_updated = $this->transaction->txn_status_updated(); |
|
827 | - /** @type EE_Registration_Processor $registration_processor */ |
|
828 | - $registration_processor = EE_Registry::instance()->load_class('Registration_Processor'); |
|
829 | - // grab the saved registrations from the transaction |
|
830 | - foreach ($this->transaction->registrations($this->reg_cache_where_params) as $registration) { |
|
831 | - if ($registration_processor->reg_status_updated($registration->ID())) { |
|
832 | - $this->set_reg_status_updated($registration->ID(), true); |
|
833 | - } |
|
834 | - } |
|
835 | - } |
|
836 | - } |
|
837 | - |
|
838 | - |
|
839 | - /** |
|
840 | - * visit_allows_processing_of_this_registration |
|
841 | - * determines if the current SPCO visit should allow the passed EE_Registration to be used in processing. |
|
842 | - * one of the following conditions must be met: |
|
843 | - * EITHER: A) first time thru SPCO -> process ALL registrations ( NOT a revisit ) |
|
844 | - * OR : B) primary registrant is editing info -> process ALL registrations ( primary_revisit ) |
|
845 | - * OR : C) another registrant is editing info -> ONLY process their registration ( revisit AND their |
|
846 | - * reg_url_link matches ) |
|
847 | - * |
|
848 | - * @access public |
|
849 | - * @param EE_Registration $registration |
|
850 | - * @return bool |
|
851 | - * @throws \EE_Error |
|
852 | - */ |
|
853 | - public function visit_allows_processing_of_this_registration(EE_Registration $registration) |
|
854 | - { |
|
855 | - return ! $this->revisit |
|
856 | - || $this->primary_revisit |
|
857 | - || ( |
|
858 | - $this->revisit && $this->reg_url_link === $registration->reg_url_link() |
|
859 | - ) |
|
860 | - ? true |
|
861 | - : false; |
|
862 | - } |
|
863 | - |
|
864 | - |
|
865 | - /** |
|
866 | - * _transaction_has_primary_registration |
|
867 | - * |
|
868 | - * @access private |
|
869 | - * @return bool |
|
870 | - */ |
|
871 | - public function transaction_has_primary_registrant() |
|
872 | - { |
|
873 | - return $this->primary_attendee_obj instanceof EE_Attendee ? true : false; |
|
874 | - } |
|
875 | - |
|
876 | - |
|
877 | - /** |
|
878 | - * save_all_data |
|
879 | - * simply loops through the current transaction and saves all data for each registration |
|
880 | - * |
|
881 | - * @access public |
|
882 | - * @param bool $show_errors |
|
883 | - * @return bool |
|
884 | - * @throws \EE_Error |
|
885 | - */ |
|
886 | - public function save_all_data($show_errors = true) |
|
887 | - { |
|
888 | - // verify the transaction |
|
889 | - if ($this->transaction instanceof EE_Transaction) { |
|
890 | - // save to ensure that TXN has ID |
|
891 | - $this->transaction->save(); |
|
892 | - // grab the saved registrations from the transaction |
|
893 | - foreach ($this->transaction->registrations($this->reg_cache_where_params) as $registration) { |
|
894 | - $this->_save_registration($registration, $show_errors); |
|
895 | - } |
|
896 | - } else { |
|
897 | - if ($show_errors) { |
|
898 | - EE_Error::add_error( |
|
899 | - __( |
|
900 | - 'A valid Transaction was not found when attempting to save your registration information.', |
|
901 | - 'event_espresso' |
|
902 | - ), |
|
903 | - __FILE__, |
|
904 | - __FUNCTION__, |
|
905 | - __LINE__ |
|
906 | - ); |
|
907 | - } |
|
908 | - return false; |
|
909 | - } |
|
910 | - return true; |
|
911 | - } |
|
912 | - |
|
913 | - |
|
914 | - /** |
|
915 | - * _save_registration_attendee |
|
916 | - * |
|
917 | - * @param EE_Registration $registration |
|
918 | - * @param bool $show_errors |
|
919 | - * @return void |
|
920 | - * @throws \EE_Error |
|
921 | - */ |
|
922 | - private function _save_registration($registration, $show_errors = true) |
|
923 | - { |
|
924 | - // verify object |
|
925 | - if ($registration instanceof EE_Registration) { |
|
926 | - // should this registration be processed during this visit ? |
|
927 | - if ($this->visit_allows_processing_of_this_registration($registration)) { |
|
928 | - // set TXN ID |
|
929 | - if (! $registration->transaction_ID()) { |
|
930 | - $registration->set_transaction_id($this->transaction->ID()); |
|
931 | - } |
|
932 | - // verify and save the attendee |
|
933 | - $this->_save_registration_attendee($registration, $show_errors); |
|
934 | - // save answers to reg form questions |
|
935 | - $this->_save_registration_answers($registration, $show_errors); |
|
936 | - // save changes |
|
937 | - $registration->save(); |
|
938 | - // update txn cache |
|
939 | - if (! $this->transaction->update_cache_after_object_save('Registration', $registration)) { |
|
940 | - if ($show_errors) { |
|
941 | - EE_Error::add_error( |
|
942 | - __( |
|
943 | - 'The newly saved Registration object could not be cached on the Transaction.', |
|
944 | - 'event_espresso' |
|
945 | - ), |
|
946 | - __FILE__, |
|
947 | - __FUNCTION__, |
|
948 | - __LINE__ |
|
949 | - ); |
|
950 | - } |
|
951 | - } |
|
952 | - } |
|
953 | - } else { |
|
954 | - if ($show_errors) { |
|
955 | - EE_Error::add_error( |
|
956 | - __( |
|
957 | - 'An invalid Registration object was discovered when attempting to save your registration information.', |
|
958 | - 'event_espresso' |
|
959 | - ), |
|
960 | - __FILE__, |
|
961 | - __FUNCTION__, |
|
962 | - __LINE__ |
|
963 | - ); |
|
964 | - } |
|
965 | - } |
|
966 | - } |
|
967 | - |
|
968 | - |
|
969 | - /** |
|
970 | - * _save_registration_attendee |
|
971 | - * |
|
972 | - * @param EE_Registration $registration |
|
973 | - * @param bool $show_errors |
|
974 | - * @return void |
|
975 | - * @throws \EE_Error |
|
976 | - */ |
|
977 | - private function _save_registration_attendee($registration, $show_errors = true) |
|
978 | - { |
|
979 | - if ($registration->attendee() instanceof EE_Attendee) { |
|
980 | - // save so that ATT has ID |
|
981 | - $registration->attendee()->save(); |
|
982 | - if (! $registration->update_cache_after_object_save('Attendee', $registration->attendee())) { |
|
983 | - if ($show_errors) { |
|
984 | - EE_Error::add_error( |
|
985 | - __( |
|
986 | - 'The newly saved Attendee object could not be cached on the registration.', |
|
987 | - 'event_espresso' |
|
988 | - ), |
|
989 | - __FILE__, |
|
990 | - __FUNCTION__, |
|
991 | - __LINE__ |
|
992 | - ); |
|
993 | - } |
|
994 | - } |
|
995 | - } else { |
|
996 | - if ($show_errors) { |
|
997 | - EE_Error::add_error( |
|
998 | - sprintf( |
|
999 | - '%1$s||%1$s $attendee = %2$s', |
|
1000 | - __( |
|
1001 | - 'Either no Attendee information was found, or an invalid Attendee object was discovered when attempting to save your registration information.', |
|
1002 | - 'event_espresso' |
|
1003 | - ), |
|
1004 | - var_export($registration->attendee(), true) |
|
1005 | - ), |
|
1006 | - __FILE__, |
|
1007 | - __FUNCTION__, |
|
1008 | - __LINE__ |
|
1009 | - ); |
|
1010 | - } |
|
1011 | - } |
|
1012 | - } |
|
1013 | - |
|
1014 | - |
|
1015 | - /** |
|
1016 | - * _save_question_answers |
|
1017 | - * |
|
1018 | - * @param EE_Registration $registration |
|
1019 | - * @param bool $show_errors |
|
1020 | - * @return void |
|
1021 | - * @throws \EE_Error |
|
1022 | - */ |
|
1023 | - private function _save_registration_answers($registration, $show_errors = true) |
|
1024 | - { |
|
1025 | - // now save the answers |
|
1026 | - foreach ($registration->answers() as $cache_key => $answer) { |
|
1027 | - // verify object |
|
1028 | - if ($answer instanceof EE_Answer) { |
|
1029 | - $answer->set_registration($registration->ID()); |
|
1030 | - $answer->save(); |
|
1031 | - if (! $registration->update_cache_after_object_save('Answer', $answer, $cache_key)) { |
|
1032 | - if ($show_errors) { |
|
1033 | - EE_Error::add_error( |
|
1034 | - __( |
|
1035 | - 'The newly saved Answer object could not be cached on the registration.', |
|
1036 | - 'event_espresso' |
|
1037 | - ), |
|
1038 | - __FILE__, |
|
1039 | - __FUNCTION__, |
|
1040 | - __LINE__ |
|
1041 | - ); |
|
1042 | - } |
|
1043 | - } |
|
1044 | - } else { |
|
1045 | - if ($show_errors) { |
|
1046 | - EE_Error::add_error( |
|
1047 | - __( |
|
1048 | - 'An invalid Answer object was discovered when attempting to save your registration information.', |
|
1049 | - 'event_espresso' |
|
1050 | - ), |
|
1051 | - __FILE__, |
|
1052 | - __FUNCTION__, |
|
1053 | - __LINE__ |
|
1054 | - ); |
|
1055 | - } |
|
1056 | - } |
|
1057 | - } |
|
1058 | - } |
|
1059 | - |
|
1060 | - |
|
1061 | - /** |
|
1062 | - * refresh_all_entities |
|
1063 | - * will either refresh the entity map with objects form the db or from the checkout cache |
|
1064 | - * |
|
1065 | - * @access public |
|
1066 | - * @param bool $from_db |
|
1067 | - * @return bool |
|
1068 | - * @throws \EE_Error |
|
1069 | - */ |
|
1070 | - public function refresh_all_entities($from_db = false) |
|
1071 | - { |
|
1072 | - $from_db = $this->current_step->is_final_step() || $this->action === 'process_gateway_response' |
|
1073 | - ? true |
|
1074 | - : $from_db; |
|
1075 | - // $this->log( |
|
1076 | - // __CLASS__, |
|
1077 | - // __FUNCTION__, |
|
1078 | - // __LINE__, |
|
1079 | - // array('from_db' => $from_db) |
|
1080 | - // ); |
|
1081 | - return $from_db ? $this->refresh_from_db() : $this->refresh_entity_map(); |
|
1082 | - } |
|
1083 | - |
|
1084 | - |
|
1085 | - /** |
|
1086 | - * refresh_entity_map |
|
1087 | - * simply loops through the current transaction and updates each |
|
1088 | - * model's entity map using EEM_Base::refresh_entity_map_from_db() |
|
1089 | - * |
|
1090 | - * @access public |
|
1091 | - * @return bool |
|
1092 | - * @throws \EE_Error |
|
1093 | - */ |
|
1094 | - protected function refresh_from_db() |
|
1095 | - { |
|
1096 | - // verify the transaction |
|
1097 | - if ($this->transaction instanceof EE_Transaction && $this->transaction->ID()) { |
|
1098 | - // pull fresh TXN data from the db |
|
1099 | - $this->transaction = $this->transaction->get_model()->refresh_entity_map_from_db($this->transaction->ID()); |
|
1100 | - // update EE_Checkout's cached primary_attendee object |
|
1101 | - $this->primary_attendee_obj = $this->_refresh_primary_attendee_obj_from_db($this->transaction); |
|
1102 | - // update EE_Checkout's cached payment object |
|
1103 | - $payment = $this->transaction->last_payment(); |
|
1104 | - $this->payment = $payment instanceof EE_Payment ? $payment : $this->payment; |
|
1105 | - // update EE_Checkout's cached payment_method object |
|
1106 | - $payment_method = $this->payment instanceof EE_Payment ? $this->payment->payment_method() : null; |
|
1107 | - $this->payment_method = $payment_method instanceof EE_Payment_Method ? $payment_method |
|
1108 | - : $this->payment_method; |
|
1109 | - // now refresh the cart, based on the TXN |
|
1110 | - $this->cart = $this->get_cart_for_transaction($this->transaction); |
|
1111 | - } else { |
|
1112 | - EE_Error::add_error( |
|
1113 | - __( |
|
1114 | - 'A valid Transaction was not found when attempting to update the model entity mapper.', |
|
1115 | - 'event_espresso' |
|
1116 | - ), |
|
1117 | - __FILE__, |
|
1118 | - __FUNCTION__, |
|
1119 | - __LINE__ |
|
1120 | - ); |
|
1121 | - return false; |
|
1122 | - } |
|
1123 | - return true; |
|
1124 | - } |
|
1125 | - |
|
1126 | - |
|
1127 | - /** |
|
1128 | - * _refresh_primary_attendee_obj_from_db |
|
1129 | - * |
|
1130 | - * @param EE_Transaction $transaction |
|
1131 | - * @return EE_Attendee | null |
|
1132 | - * @throws \EE_Error |
|
1133 | - */ |
|
1134 | - protected function _refresh_primary_attendee_obj_from_db(EE_Transaction $transaction) |
|
1135 | - { |
|
1136 | - |
|
1137 | - $primary_attendee_obj = null; |
|
1138 | - // grab the saved registrations from the transaction |
|
1139 | - foreach ($transaction->registrations($this->reg_cache_where_params, true) as $registration) { |
|
1140 | - // verify object |
|
1141 | - if ($registration instanceof EE_Registration) { |
|
1142 | - $attendee = $registration->attendee(); |
|
1143 | - // verify object && maybe cache primary_attendee_obj ? |
|
1144 | - if ($attendee instanceof EE_Attendee && $registration->is_primary_registrant()) { |
|
1145 | - $primary_attendee_obj = $attendee; |
|
1146 | - } |
|
1147 | - } else { |
|
1148 | - EE_Error::add_error( |
|
1149 | - __( |
|
1150 | - 'An invalid Registration object was discovered when attempting to update the model entity mapper.', |
|
1151 | - 'event_espresso' |
|
1152 | - ), |
|
1153 | - __FILE__, |
|
1154 | - __FUNCTION__, |
|
1155 | - __LINE__ |
|
1156 | - ); |
|
1157 | - } |
|
1158 | - } |
|
1159 | - return $primary_attendee_obj; |
|
1160 | - } |
|
1161 | - |
|
1162 | - |
|
1163 | - /** |
|
1164 | - * refresh_entity_map |
|
1165 | - * simply loops through the current transaction and updates |
|
1166 | - * each model's entity map using EEM_Base::refresh_entity_map_with() |
|
1167 | - * |
|
1168 | - * @access public |
|
1169 | - * @return bool |
|
1170 | - * @throws \EE_Error |
|
1171 | - */ |
|
1172 | - protected function refresh_entity_map() |
|
1173 | - { |
|
1174 | - // verify the transaction |
|
1175 | - if ($this->transaction instanceof EE_Transaction && $this->transaction->ID()) { |
|
1176 | - // never cache payment info |
|
1177 | - $this->transaction->clear_cache('Payment'); |
|
1178 | - // is the Payment Options Reg Step completed ? |
|
1179 | - if ($this->transaction->reg_step_completed('payment_options')) { |
|
1180 | - // then check for payments and update TXN accordingly |
|
1181 | - /** @type EE_Transaction_Payments $transaction_payments */ |
|
1182 | - $transaction_payments = EE_Registry::instance()->load_class('Transaction_Payments'); |
|
1183 | - $transaction_payments->calculate_total_payments_and_update_status($this->transaction); |
|
1184 | - } |
|
1185 | - // grab the saved registrations from the transaction |
|
1186 | - foreach ($this->transaction->registrations($this->reg_cache_where_params) as $reg_cache_ID => $registration) { |
|
1187 | - $this->_refresh_registration($reg_cache_ID, $registration); |
|
1188 | - } |
|
1189 | - // make sure our cached TXN is added to the model entity mapper |
|
1190 | - $this->transaction = $this->transaction->get_model()->refresh_entity_map_with( |
|
1191 | - $this->transaction->ID(), |
|
1192 | - $this->transaction |
|
1193 | - ); |
|
1194 | - } else { |
|
1195 | - EE_Error::add_error( |
|
1196 | - __( |
|
1197 | - 'A valid Transaction was not found when attempting to update the model entity mapper.', |
|
1198 | - 'event_espresso' |
|
1199 | - ), |
|
1200 | - __FILE__, |
|
1201 | - __FUNCTION__, |
|
1202 | - __LINE__ |
|
1203 | - ); |
|
1204 | - return false; |
|
1205 | - } |
|
1206 | - // verify and update the cart because inaccurate totals are not so much fun |
|
1207 | - if ($this->cart instanceof EE_Cart) { |
|
1208 | - $grand_total = $this->cart->get_grand_total(); |
|
1209 | - if ($grand_total instanceof EE_Line_Item && $grand_total->ID()) { |
|
1210 | - $grand_total->recalculate_total_including_taxes(); |
|
1211 | - $grand_total = $grand_total->get_model()->refresh_entity_map_with( |
|
1212 | - $this->cart->get_grand_total()->ID(), |
|
1213 | - $this->cart->get_grand_total() |
|
1214 | - ); |
|
1215 | - } |
|
1216 | - if ($grand_total instanceof EE_Line_Item) { |
|
1217 | - $this->cart = EE_Cart::instance($grand_total); |
|
1218 | - } else { |
|
1219 | - EE_Error::add_error( |
|
1220 | - __( |
|
1221 | - 'A valid Cart was not found when attempting to update the model entity mapper.', |
|
1222 | - 'event_espresso' |
|
1223 | - ), |
|
1224 | - __FILE__, |
|
1225 | - __FUNCTION__, |
|
1226 | - __LINE__ |
|
1227 | - ); |
|
1228 | - return false; |
|
1229 | - } |
|
1230 | - } |
|
1231 | - return true; |
|
1232 | - } |
|
1233 | - |
|
1234 | - |
|
1235 | - /** |
|
1236 | - * _refresh_registration |
|
1237 | - * |
|
1238 | - * @param string | int $reg_cache_ID |
|
1239 | - * @param EE_Registration $registration |
|
1240 | - * @return void |
|
1241 | - * @throws \EE_Error |
|
1242 | - */ |
|
1243 | - protected function _refresh_registration($reg_cache_ID, $registration) |
|
1244 | - { |
|
1245 | - |
|
1246 | - // verify object |
|
1247 | - if ($registration instanceof EE_Registration) { |
|
1248 | - // update the entity mapper attendee |
|
1249 | - $this->_refresh_registration_attendee($registration); |
|
1250 | - // update the entity mapper answers for reg form questions |
|
1251 | - $this->_refresh_registration_answers($registration); |
|
1252 | - // make sure the cached registration is added to the model entity mapper |
|
1253 | - $registration->get_model()->refresh_entity_map_with($reg_cache_ID, $registration); |
|
1254 | - } else { |
|
1255 | - EE_Error::add_error( |
|
1256 | - __( |
|
1257 | - 'An invalid Registration object was discovered when attempting to update the model entity mapper.', |
|
1258 | - 'event_espresso' |
|
1259 | - ), |
|
1260 | - __FILE__, |
|
1261 | - __FUNCTION__, |
|
1262 | - __LINE__ |
|
1263 | - ); |
|
1264 | - } |
|
1265 | - } |
|
1266 | - |
|
1267 | - |
|
1268 | - /** |
|
1269 | - * _save_registration_attendee |
|
1270 | - * |
|
1271 | - * @param EE_Registration $registration |
|
1272 | - * @return void |
|
1273 | - * @throws \EE_Error |
|
1274 | - */ |
|
1275 | - protected function _refresh_registration_attendee($registration) |
|
1276 | - { |
|
1277 | - |
|
1278 | - $attendee = $registration->attendee(); |
|
1279 | - // verify object |
|
1280 | - if ($attendee instanceof EE_Attendee && $attendee->ID()) { |
|
1281 | - // make sure the cached attendee is added to the model entity mapper |
|
1282 | - $registration->attendee()->get_model()->refresh_entity_map_with($attendee->ID(), $attendee); |
|
1283 | - // maybe cache primary_attendee_obj ? |
|
1284 | - if ($registration->is_primary_registrant()) { |
|
1285 | - $this->primary_attendee_obj = $attendee; |
|
1286 | - } |
|
1287 | - } |
|
1288 | - } |
|
1289 | - |
|
1290 | - |
|
1291 | - /** |
|
1292 | - * _refresh_registration_answers |
|
1293 | - * |
|
1294 | - * @param EE_Registration $registration |
|
1295 | - * @return void |
|
1296 | - * @throws \EE_Error |
|
1297 | - */ |
|
1298 | - protected function _refresh_registration_answers($registration) |
|
1299 | - { |
|
1300 | - |
|
1301 | - // now update the answers |
|
1302 | - foreach ($registration->answers() as $cache_key => $answer) { |
|
1303 | - // verify object |
|
1304 | - if ($answer instanceof EE_Answer) { |
|
1305 | - if ($answer->ID()) { |
|
1306 | - // make sure the cached answer is added to the model entity mapper |
|
1307 | - $answer->get_model()->refresh_entity_map_with($answer->ID(), $answer); |
|
1308 | - } |
|
1309 | - } else { |
|
1310 | - EE_Error::add_error( |
|
1311 | - __( |
|
1312 | - 'An invalid Answer object was discovered when attempting to update the model entity mapper.', |
|
1313 | - 'event_espresso' |
|
1314 | - ), |
|
1315 | - __FILE__, |
|
1316 | - __FUNCTION__, |
|
1317 | - __LINE__ |
|
1318 | - ); |
|
1319 | - } |
|
1320 | - } |
|
1321 | - } |
|
1322 | - |
|
1323 | - |
|
1324 | - /** |
|
1325 | - * __sleep |
|
1326 | - * to conserve db space, let's remove the reg_form and the EE_Checkout object from EE_SPCO_Reg_Step objects upon |
|
1327 | - * serialization EE_Checkout will handle the reimplementation of itself upon waking, but we won't bother with the |
|
1328 | - * reg form, because if needed, it will be regenerated anyways |
|
1329 | - * |
|
1330 | - * @return array |
|
1331 | - * @throws \EE_Error |
|
1332 | - */ |
|
1333 | - public function __sleep() |
|
1334 | - { |
|
1335 | - if ($this->primary_attendee_obj instanceof EE_Attendee && $this->primary_attendee_obj->ID()) { |
|
1336 | - $this->primary_attendee_obj = $this->primary_attendee_obj->ID(); |
|
1337 | - } // remove the reg form and the checkout |
|
1338 | - if ($this->transaction instanceof EE_Transaction && $this->transaction->ID()) { |
|
1339 | - $this->transaction = $this->transaction->ID(); |
|
1340 | - } // remove the reg form and the checkout |
|
1341 | - return array_diff(array_keys(get_object_vars($this)), array('billing_form', 'registration_form')); |
|
1342 | - } |
|
1343 | - |
|
1344 | - |
|
1345 | - /** |
|
1346 | - * __wakeup |
|
1347 | - * to conserve db space, we are removing the EE_Checkout object from EE_SPCO_Reg_Step objects upon serialization |
|
1348 | - * this will reinstate the EE_Checkout object on each EE_SPCO_Reg_Step object |
|
1349 | - */ |
|
1350 | - public function __wakeup() |
|
1351 | - { |
|
1352 | - if (! $this->primary_attendee_obj instanceof EE_Attendee && absint($this->primary_attendee_obj) !== 0) { |
|
1353 | - // $this->primary_attendee_obj is actually just an ID, so use it to get the object from the db |
|
1354 | - $this->primary_attendee_obj = EEM_Attendee::instance()->get_one_by_ID($this->primary_attendee_obj); |
|
1355 | - } |
|
1356 | - if (! $this->transaction instanceof EE_Transaction && absint($this->transaction) !== 0) { |
|
1357 | - // $this->transaction is actually just an ID, so use it to get the object from the db |
|
1358 | - $this->transaction = EEM_Transaction::instance()->get_one_by_ID($this->transaction); |
|
1359 | - } |
|
1360 | - foreach ($this->reg_steps as $reg_step) { |
|
1361 | - $reg_step->checkout = $this; |
|
1362 | - } |
|
1363 | - } |
|
1364 | - |
|
1365 | - |
|
1366 | - /** |
|
1367 | - * debug |
|
1368 | - * |
|
1369 | - * @param string $class |
|
1370 | - * @param string $func |
|
1371 | - * @param string $line |
|
1372 | - * @param array $info |
|
1373 | - * @param bool $display_request |
|
1374 | - * @throws \EE_Error |
|
1375 | - */ |
|
1376 | - public function log($class = '', $func = '', $line = '', $info = array(), $display_request = false) |
|
1377 | - { |
|
1378 | - $disabled = true; |
|
1379 | - if (WP_DEBUG && ! $disabled) { |
|
1380 | - $debug_data = get_option('EE_DEBUG_SPCO_' . EE_Session::instance()->id(), array()); |
|
1381 | - $default_data = array( |
|
1382 | - $class => $func . '() : ' . $line, |
|
1383 | - 'request->step' => $this->step, |
|
1384 | - 'request->action' => $this->action, |
|
1385 | - 'current_step->slug' => $this->current_step instanceof EE_SPCO_Reg_Step ? |
|
1386 | - $this->current_step->slug() : '', |
|
1387 | - 'current_step->completed' => $this->current_step instanceof EE_SPCO_Reg_Step ? |
|
1388 | - $this->current_step->completed() : '', |
|
1389 | - 'txn_status_updated' => $this->transaction->txn_status_updated(), |
|
1390 | - 'reg_status_updated' => $this->reg_status_updated, |
|
1391 | - 'reg_url_link' => $this->reg_url_link, |
|
1392 | - 'REQ' => $display_request ? $_REQUEST : '', |
|
1393 | - ); |
|
1394 | - if ($this->transaction instanceof EE_Transaction) { |
|
1395 | - $default_data['TXN_status'] = $this->transaction->status_ID(); |
|
1396 | - $default_data['TXN_reg_steps'] = $this->transaction->reg_steps(); |
|
1397 | - foreach ($this->transaction->registrations($this->reg_cache_where_params) as $REG_ID => $registration) { |
|
1398 | - $default_data['registrations'][ $REG_ID ] = $registration->status_ID(); |
|
1399 | - } |
|
1400 | - if ($this->transaction->ID()) { |
|
1401 | - $TXN_ID = 'EE_Transaction: ' . $this->transaction->ID(); |
|
1402 | - // don't serialize objects |
|
1403 | - $info = $this->_strip_objects($info); |
|
1404 | - if (! isset($debug_data[ $TXN_ID ])) { |
|
1405 | - $debug_data[ $TXN_ID ] = array(); |
|
1406 | - } |
|
1407 | - $debug_data[ $TXN_ID ][ microtime() ] = array_merge( |
|
1408 | - $default_data, |
|
1409 | - $info |
|
1410 | - ); |
|
1411 | - update_option('EE_DEBUG_SPCO_' . EE_Session::instance()->id(), $debug_data); |
|
1412 | - } |
|
1413 | - } |
|
1414 | - } |
|
1415 | - } |
|
1416 | - |
|
1417 | - |
|
1418 | - /** |
|
1419 | - * _strip_objects |
|
1420 | - * |
|
1421 | - * @param array $info |
|
1422 | - * @return array |
|
1423 | - */ |
|
1424 | - public function _strip_objects($info = array()) |
|
1425 | - { |
|
1426 | - foreach ((array) $info as $key => $value) { |
|
1427 | - if (is_array($value)) { |
|
1428 | - $info[ $key ] = $this->_strip_objects($value); |
|
1429 | - } elseif (is_object($value)) { |
|
1430 | - $object_class = get_class($value); |
|
1431 | - $info[ $object_class ] = array(); |
|
1432 | - $info[ $object_class ]['ID'] = method_exists($value, 'ID') ? $value->ID() : 0; |
|
1433 | - if (method_exists($value, 'status')) { |
|
1434 | - $info[ $object_class ]['status'] = $value->status(); |
|
1435 | - } elseif (method_exists($value, 'status_ID')) { |
|
1436 | - $info[ $object_class ]['status'] = $value->status_ID(); |
|
1437 | - } |
|
1438 | - unset($info[ $key ]); |
|
1439 | - } |
|
1440 | - } |
|
1441 | - return (array) $info; |
|
1442 | - } |
|
18 | + /** |
|
19 | + * whether current request originated from the EE admin |
|
20 | + * |
|
21 | + * @type bool |
|
22 | + */ |
|
23 | + public $admin_request = false; |
|
24 | + |
|
25 | + /** |
|
26 | + * whether returning to edit attendee information or to retry a payment |
|
27 | + * |
|
28 | + * @type bool |
|
29 | + */ |
|
30 | + public $revisit = false; |
|
31 | + |
|
32 | + /** |
|
33 | + * whether the primary registrant is returning to edit attendee information or to retry a payment |
|
34 | + * |
|
35 | + * @type bool |
|
36 | + */ |
|
37 | + public $primary_revisit = false; |
|
38 | + |
|
39 | + /** |
|
40 | + * is registration allowed to progress or halted for some reason such as failing to pass recaptcha? |
|
41 | + * |
|
42 | + * @type bool |
|
43 | + */ |
|
44 | + public $continue_reg = true; |
|
45 | + |
|
46 | + /** |
|
47 | + * redirect to thank you page ? |
|
48 | + * |
|
49 | + * @type bool |
|
50 | + */ |
|
51 | + public $redirect = false; |
|
52 | + |
|
53 | + /** |
|
54 | + * generate the reg form or not ? |
|
55 | + * |
|
56 | + * @type bool |
|
57 | + */ |
|
58 | + public $generate_reg_form = true; |
|
59 | + |
|
60 | + /** |
|
61 | + * process a reg form submission or not ? |
|
62 | + * |
|
63 | + * @type bool |
|
64 | + */ |
|
65 | + public $process_form_submission = false; |
|
66 | + |
|
67 | + /** |
|
68 | + * tracks whether the TXN status modified during this checkout |
|
69 | + * |
|
70 | + * @type bool |
|
71 | + */ |
|
72 | + public $txn_status_updated = false; |
|
73 | + |
|
74 | + /** |
|
75 | + * only triggered to true after absolutely everything has finished. |
|
76 | + * |
|
77 | + * @type bool |
|
78 | + */ |
|
79 | + protected $exit_spco = false; |
|
80 | + |
|
81 | + /** |
|
82 | + * tracks whether any of the TXN's Registrations statuses modified during this checkout |
|
83 | + * indexed by registration ID |
|
84 | + * |
|
85 | + * @type array |
|
86 | + */ |
|
87 | + protected $reg_status_updated = array(); |
|
88 | + |
|
89 | + /** |
|
90 | + * timestamp when redirected from Ticket Selector to the checkout |
|
91 | + * |
|
92 | + * @type int |
|
93 | + */ |
|
94 | + public $uts = 0; |
|
95 | + |
|
96 | + /** |
|
97 | + * total number of tickets that were in the cart |
|
98 | + * |
|
99 | + * @type int |
|
100 | + */ |
|
101 | + public $total_ticket_count = 0; |
|
102 | + |
|
103 | + /** |
|
104 | + * corresponds loosely to EE_Transaction::remaining() |
|
105 | + * but can be modified by SPCO |
|
106 | + * |
|
107 | + * @type float |
|
108 | + */ |
|
109 | + public $amount_owing = 0; |
|
110 | + |
|
111 | + /** |
|
112 | + * the reg step slug from the incoming request |
|
113 | + * |
|
114 | + * @type string |
|
115 | + */ |
|
116 | + public $step = ''; |
|
117 | + |
|
118 | + /** |
|
119 | + * the reg step slug for a step being edited |
|
120 | + * |
|
121 | + * @type string |
|
122 | + */ |
|
123 | + public $edit_step = ''; |
|
124 | + |
|
125 | + /** |
|
126 | + * the action being performed on the current step |
|
127 | + * |
|
128 | + * @type string |
|
129 | + */ |
|
130 | + public $action = ''; |
|
131 | + |
|
132 | + /** |
|
133 | + * reg_url_link for a previously saved registration |
|
134 | + * |
|
135 | + * @type string |
|
136 | + */ |
|
137 | + public $reg_url_link = ''; |
|
138 | + |
|
139 | + /** |
|
140 | + * string slug for the payment method that was selected during the payment options step |
|
141 | + * |
|
142 | + * @type string |
|
143 | + */ |
|
144 | + public $selected_method_of_payment = ''; |
|
145 | + |
|
146 | + /** |
|
147 | + * base url for the site's registration checkout page - additional url params will be added to this |
|
148 | + * |
|
149 | + * @type string |
|
150 | + */ |
|
151 | + public $reg_page_base_url = ''; |
|
152 | + |
|
153 | + /** |
|
154 | + * base url for the site's registration cancelled page - additional url params will be added to this |
|
155 | + * |
|
156 | + * @type string |
|
157 | + */ |
|
158 | + public $cancel_page_url = ''; |
|
159 | + |
|
160 | + /** |
|
161 | + * base url for the site's thank you page - additional url params will be added to this |
|
162 | + * |
|
163 | + * @type string |
|
164 | + */ |
|
165 | + public $thank_you_page_url = ''; |
|
166 | + |
|
167 | + /** |
|
168 | + * base url for any redirects - additional url params will be added to this |
|
169 | + * |
|
170 | + * @type string |
|
171 | + */ |
|
172 | + public $redirect_url = ''; |
|
173 | + |
|
174 | + /** |
|
175 | + * form of POST data for use with off-site gateways |
|
176 | + * |
|
177 | + * @type string |
|
178 | + */ |
|
179 | + public $redirect_form = ''; |
|
180 | + |
|
181 | + /** |
|
182 | + * array of query where params to use when retrieving cached registrations from $this->checkout->transaction |
|
183 | + * |
|
184 | + * @type array |
|
185 | + */ |
|
186 | + public $reg_cache_where_params = array(); |
|
187 | + |
|
188 | + /** |
|
189 | + * a class for managing and creating the JSON encoded array of data that gets passed back to the client during AJAX |
|
190 | + * requests |
|
191 | + * |
|
192 | + * @type EE_SPCO_JSON_Response |
|
193 | + */ |
|
194 | + public $json_response; |
|
195 | + |
|
196 | + /** |
|
197 | + * where we are going next in the reg process |
|
198 | + * |
|
199 | + * @type EE_SPCO_Reg_Step |
|
200 | + */ |
|
201 | + public $next_step; |
|
202 | + |
|
203 | + /** |
|
204 | + * where we are in the reg process |
|
205 | + * |
|
206 | + * @type EE_SPCO_Reg_Step |
|
207 | + */ |
|
208 | + public $current_step; |
|
209 | + |
|
210 | + /** |
|
211 | + * $_cart - the current cart object |
|
212 | + * |
|
213 | + * @var EE_CART |
|
214 | + */ |
|
215 | + public $cart; |
|
216 | + |
|
217 | + /** |
|
218 | + * $_transaction - the current transaction object |
|
219 | + * |
|
220 | + * @var EE_Transaction |
|
221 | + */ |
|
222 | + public $transaction; |
|
223 | + |
|
224 | + /** |
|
225 | + * the related attendee object for the primary registrant |
|
226 | + * |
|
227 | + * @type EE_Attendee |
|
228 | + */ |
|
229 | + public $primary_attendee_obj; |
|
230 | + |
|
231 | + /** |
|
232 | + * $payment_method - the payment method object for the selected method of payment |
|
233 | + * |
|
234 | + * @type EE_Payment_Method |
|
235 | + */ |
|
236 | + public $payment_method; |
|
237 | + |
|
238 | + /** |
|
239 | + * $payment - if a payment was successfully made during the reg process, |
|
240 | + * then here it is !!! |
|
241 | + * |
|
242 | + * @type EE_Payment |
|
243 | + */ |
|
244 | + public $payment; |
|
245 | + |
|
246 | + /** |
|
247 | + * if a payment method was selected that uses an on-site gateway, then this is the billing form |
|
248 | + * |
|
249 | + * @type EE_Billing_Info_Form | EE_Billing_Attendee_Info_Form |
|
250 | + */ |
|
251 | + public $billing_form; |
|
252 | + |
|
253 | + /** |
|
254 | + * the entire registration form composed of ALL of the subsections generated by the various reg steps |
|
255 | + * |
|
256 | + * @type EE_Form_Section_Proper |
|
257 | + */ |
|
258 | + public $registration_form; |
|
259 | + |
|
260 | + /** |
|
261 | + * array of EE_SPCO_Reg_Step objects |
|
262 | + * |
|
263 | + * @type EE_SPCO_Reg_Step[] |
|
264 | + */ |
|
265 | + public $reg_steps = array(); |
|
266 | + |
|
267 | + /** |
|
268 | + * array of EE_Payment_Method objects |
|
269 | + * |
|
270 | + * @type EE_Payment_Method[] |
|
271 | + */ |
|
272 | + public $available_payment_methods = array(); |
|
273 | + |
|
274 | + |
|
275 | + /** |
|
276 | + * class constructor |
|
277 | + * |
|
278 | + * @access public |
|
279 | + */ |
|
280 | + public function __construct() |
|
281 | + { |
|
282 | + $this->reg_page_base_url = EE_Registry::instance()->CFG->core->reg_page_url(); |
|
283 | + $this->thank_you_page_url = EE_Registry::instance()->CFG->core->thank_you_page_url(); |
|
284 | + $this->cancel_page_url = EE_Registry::instance()->CFG->core->cancel_page_url(); |
|
285 | + $this->continue_reg = apply_filters('FHEE__EE_Checkout___construct___continue_reg', true); |
|
286 | + $this->admin_request = is_admin() && ! EE_Registry::instance()->REQ->ajax; |
|
287 | + $this->reg_cache_where_params = array( |
|
288 | + 0 => array('REG_deleted' => false), |
|
289 | + 'order_by' => array('REG_count' => 'ASC'), |
|
290 | + ); |
|
291 | + } |
|
292 | + |
|
293 | + |
|
294 | + /** |
|
295 | + * returns true if ANY reg status was updated during checkout |
|
296 | + * |
|
297 | + * @return boolean |
|
298 | + */ |
|
299 | + public function any_reg_status_updated() |
|
300 | + { |
|
301 | + foreach ($this->reg_status_updated as $reg_status) { |
|
302 | + if ($reg_status) { |
|
303 | + return true; |
|
304 | + } |
|
305 | + } |
|
306 | + return false; |
|
307 | + } |
|
308 | + |
|
309 | + |
|
310 | + /** |
|
311 | + * @param $REG_ID |
|
312 | + * @return boolean |
|
313 | + */ |
|
314 | + public function reg_status_updated($REG_ID) |
|
315 | + { |
|
316 | + return isset($this->reg_status_updated[ $REG_ID ]) ? $this->reg_status_updated[ $REG_ID ] : false; |
|
317 | + } |
|
318 | + |
|
319 | + |
|
320 | + /** |
|
321 | + * @param $REG_ID |
|
322 | + * @param $reg_status |
|
323 | + */ |
|
324 | + public function set_reg_status_updated($REG_ID, $reg_status) |
|
325 | + { |
|
326 | + $this->reg_status_updated[ $REG_ID ] = filter_var($reg_status, FILTER_VALIDATE_BOOLEAN); |
|
327 | + } |
|
328 | + |
|
329 | + |
|
330 | + /** |
|
331 | + * exit_spco |
|
332 | + * |
|
333 | + * @return bool |
|
334 | + */ |
|
335 | + public function exit_spco() |
|
336 | + { |
|
337 | + return $this->exit_spco; |
|
338 | + } |
|
339 | + |
|
340 | + |
|
341 | + /** |
|
342 | + * set_exit_spco |
|
343 | + * can ONLY be set by the Finalize_Registration reg step |
|
344 | + */ |
|
345 | + public function set_exit_spco() |
|
346 | + { |
|
347 | + if ($this->current_step instanceof EE_SPCO_Reg_Step_Finalize_Registration) { |
|
348 | + $this->exit_spco = true; |
|
349 | + } |
|
350 | + } |
|
351 | + |
|
352 | + |
|
353 | + /** |
|
354 | + * reset_for_current_request |
|
355 | + * |
|
356 | + * @access public |
|
357 | + * @return void |
|
358 | + */ |
|
359 | + public function reset_for_current_request() |
|
360 | + { |
|
361 | + $this->process_form_submission = false; |
|
362 | + $this->continue_reg = apply_filters('FHEE__EE_Checkout___construct___continue_reg', true); |
|
363 | + $this->admin_request = is_admin() && ! EE_Registry::instance()->REQ->front_ajax; |
|
364 | + $this->continue_reg = true; |
|
365 | + $this->redirect = false; |
|
366 | + // don't reset the cached redirect form if we're about to be asked to display it !!! |
|
367 | + if (EE_Registry::instance()->REQ->get('action', 'display_spco_reg_step') !== 'redirect_form') { |
|
368 | + $this->redirect_form = ''; |
|
369 | + } |
|
370 | + $this->redirect_url = ''; |
|
371 | + $this->json_response = new EE_SPCO_JSON_Response(); |
|
372 | + EE_Form_Section_Proper::reset_js_localization(); |
|
373 | + } |
|
374 | + |
|
375 | + |
|
376 | + /** |
|
377 | + * add_reg_step |
|
378 | + * |
|
379 | + * @access public |
|
380 | + * @param EE_SPCO_Reg_Step $reg_step_obj |
|
381 | + * @return void |
|
382 | + */ |
|
383 | + public function add_reg_step(EE_SPCO_Reg_Step $reg_step_obj) |
|
384 | + { |
|
385 | + $this->reg_steps[ $reg_step_obj->slug() ] = $reg_step_obj; |
|
386 | + } |
|
387 | + |
|
388 | + |
|
389 | + /** |
|
390 | + * skip_reg_step |
|
391 | + * if the current reg step does not need to run for some reason, |
|
392 | + * then this will advance SPCO to the next reg step, |
|
393 | + * and mark the skipped step as completed |
|
394 | + * |
|
395 | + * @access public |
|
396 | + * @param string $reg_step_slug |
|
397 | + * @return void |
|
398 | + * @throws \EE_Error |
|
399 | + */ |
|
400 | + public function skip_reg_step($reg_step_slug = '') |
|
401 | + { |
|
402 | + $step_to_skip = $this->find_reg_step($reg_step_slug); |
|
403 | + if ($step_to_skip instanceof EE_SPCO_Reg_Step && $step_to_skip->is_current_step()) { |
|
404 | + $step_to_skip->set_is_current_step(false); |
|
405 | + $step_to_skip->set_completed(); |
|
406 | + // advance to the next step |
|
407 | + $this->set_current_step($this->next_step->slug()); |
|
408 | + // also reset the step param in the request in case any other code references that directly |
|
409 | + EE_Registry::instance()->REQ->set('step', $this->current_step->slug()); |
|
410 | + // since we are skipping a step and setting the current step to be what was previously the next step, |
|
411 | + // we need to check that the next step is now correct, and not still set to the current step. |
|
412 | + if ($this->current_step->slug() === $this->next_step->slug()) { |
|
413 | + // correctly setup the next step |
|
414 | + $this->set_next_step(); |
|
415 | + } |
|
416 | + $this->set_reg_step_initiated($this->current_step); |
|
417 | + } |
|
418 | + } |
|
419 | + |
|
420 | + |
|
421 | + /** |
|
422 | + * remove_reg_step |
|
423 | + * |
|
424 | + * @access public |
|
425 | + * @param string $reg_step_slug |
|
426 | + * @param bool $reset whether to reset reg steps after removal |
|
427 | + * @throws EE_Error |
|
428 | + */ |
|
429 | + public function remove_reg_step($reg_step_slug = '', $reset = true) |
|
430 | + { |
|
431 | + unset($this->reg_steps[ $reg_step_slug ]); |
|
432 | + if ($this->transaction instanceof EE_Transaction) { |
|
433 | + // now remove reg step from TXN and save |
|
434 | + $this->transaction->remove_reg_step($reg_step_slug); |
|
435 | + $this->transaction->save(); |
|
436 | + } |
|
437 | + if ($reset) { |
|
438 | + $this->reset_reg_steps(); |
|
439 | + } |
|
440 | + } |
|
441 | + |
|
442 | + |
|
443 | + /** |
|
444 | + * set_reg_step_order |
|
445 | + * |
|
446 | + * @access public |
|
447 | + * @param string $reg_step_slug |
|
448 | + * @param int $order |
|
449 | + * @return void |
|
450 | + */ |
|
451 | + public function set_reg_step_order($reg_step_slug = '', $order = 100) |
|
452 | + { |
|
453 | + if (isset($this->reg_steps[ $reg_step_slug ])) { |
|
454 | + $this->reg_steps[ $reg_step_slug ]->set_order($order); |
|
455 | + } |
|
456 | + } |
|
457 | + |
|
458 | + |
|
459 | + /** |
|
460 | + * set_current_step |
|
461 | + * |
|
462 | + * @access public |
|
463 | + * @param string $current_step |
|
464 | + * @return void |
|
465 | + */ |
|
466 | + public function set_current_step($current_step) |
|
467 | + { |
|
468 | + // grab what step we're on |
|
469 | + $this->current_step = isset($this->reg_steps[ $current_step ]) |
|
470 | + ? $this->reg_steps[ $current_step ] |
|
471 | + : reset( |
|
472 | + $this->reg_steps |
|
473 | + ); |
|
474 | + // verify instance |
|
475 | + if ($this->current_step instanceof EE_SPCO_Reg_Step) { |
|
476 | + // we don't want to repeat completed steps if this is the first time through SPCO |
|
477 | + if ($this->continue_reg && ! $this->revisit && $this->current_step->completed()) { |
|
478 | + // so advance to the next step |
|
479 | + $this->set_next_step(); |
|
480 | + if ($this->next_step instanceof EE_SPCO_Reg_Step) { |
|
481 | + // and attempt to set it as the current step |
|
482 | + $this->set_current_step($this->next_step->slug()); |
|
483 | + } |
|
484 | + return; |
|
485 | + } |
|
486 | + $this->current_step->set_is_current_step(true); |
|
487 | + } else { |
|
488 | + EE_Error::add_error( |
|
489 | + __('The current step could not be set.', 'event_espresso'), |
|
490 | + __FILE__, |
|
491 | + __FUNCTION__, |
|
492 | + __LINE__ |
|
493 | + ); |
|
494 | + } |
|
495 | + } |
|
496 | + |
|
497 | + |
|
498 | + /** |
|
499 | + * set_next_step |
|
500 | + * advances the reg_steps array pointer and sets the next step, then reverses pointer back to the current step |
|
501 | + * |
|
502 | + * @access public |
|
503 | + * @return void |
|
504 | + */ |
|
505 | + public function set_next_step() |
|
506 | + { |
|
507 | + // set pointer to start of array |
|
508 | + reset($this->reg_steps); |
|
509 | + // if there is more than one step |
|
510 | + if (count($this->reg_steps) > 1) { |
|
511 | + // advance to the current step and set pointer |
|
512 | + while (key($this->reg_steps) !== $this->current_step->slug() && key($this->reg_steps) !== '') { |
|
513 | + next($this->reg_steps); |
|
514 | + } |
|
515 | + } |
|
516 | + // advance one more spot ( if it exists ) |
|
517 | + $this->next_step = next($this->reg_steps); |
|
518 | + // verify instance |
|
519 | + $this->next_step = $this->next_step instanceof EE_SPCO_Reg_Step ? $this->next_step : null; |
|
520 | + // then back to current step to reset |
|
521 | + prev($this->reg_steps); |
|
522 | + } |
|
523 | + |
|
524 | + |
|
525 | + /** |
|
526 | + * get_next_reg_step |
|
527 | + * this simply returns the next step from reg_steps array |
|
528 | + * |
|
529 | + * @access public |
|
530 | + * @return EE_SPCO_Reg_Step | null |
|
531 | + */ |
|
532 | + public function get_next_reg_step() |
|
533 | + { |
|
534 | + $next = next($this->reg_steps); |
|
535 | + prev($this->reg_steps); |
|
536 | + return $next instanceof EE_SPCO_Reg_Step ? $next : null; |
|
537 | + } |
|
538 | + |
|
539 | + |
|
540 | + /** |
|
541 | + * get_prev_reg_step |
|
542 | + * this simply returns the previous step from reg_steps array |
|
543 | + * |
|
544 | + * @access public |
|
545 | + * @return EE_SPCO_Reg_Step | null |
|
546 | + */ |
|
547 | + public function get_prev_reg_step() |
|
548 | + { |
|
549 | + $prev = prev($this->reg_steps); |
|
550 | + next($this->reg_steps); |
|
551 | + return $prev instanceof EE_SPCO_Reg_Step ? $prev : null; |
|
552 | + } |
|
553 | + |
|
554 | + |
|
555 | + /** |
|
556 | + * sort_reg_steps |
|
557 | + * |
|
558 | + * @access public |
|
559 | + * @return void |
|
560 | + */ |
|
561 | + public function sort_reg_steps() |
|
562 | + { |
|
563 | + $reg_step_sorting_callback = apply_filters( |
|
564 | + 'FHEE__EE_Checkout__sort_reg_steps__reg_step_sorting_callback', |
|
565 | + 'reg_step_sorting_callback' |
|
566 | + ); |
|
567 | + uasort($this->reg_steps, array($this, $reg_step_sorting_callback)); |
|
568 | + } |
|
569 | + |
|
570 | + |
|
571 | + /** |
|
572 | + * find_reg_step |
|
573 | + * finds a reg step by the given slug |
|
574 | + * |
|
575 | + * @access public |
|
576 | + * @param string $reg_step_slug |
|
577 | + * @return EE_SPCO_Reg_Step|null |
|
578 | + */ |
|
579 | + public function find_reg_step($reg_step_slug = '') |
|
580 | + { |
|
581 | + if (! empty($reg_step_slug)) { |
|
582 | + // copy reg step array |
|
583 | + $reg_steps = $this->reg_steps; |
|
584 | + // set pointer to start of array |
|
585 | + reset($reg_steps); |
|
586 | + // if there is more than one step |
|
587 | + if (count($reg_steps) > 1) { |
|
588 | + // advance to the current step and set pointer |
|
589 | + while (key($reg_steps) !== $reg_step_slug && key($reg_steps) !== '') { |
|
590 | + next($reg_steps); |
|
591 | + } |
|
592 | + return current($reg_steps); |
|
593 | + } |
|
594 | + } |
|
595 | + return null; |
|
596 | + } |
|
597 | + |
|
598 | + |
|
599 | + /** |
|
600 | + * reg_step_sorting_callback |
|
601 | + * |
|
602 | + * @access public |
|
603 | + * @param EE_SPCO_Reg_Step $reg_step_A |
|
604 | + * @param EE_SPCO_Reg_Step $reg_step_B |
|
605 | + * @return int |
|
606 | + */ |
|
607 | + public function reg_step_sorting_callback(EE_SPCO_Reg_Step $reg_step_A, EE_SPCO_Reg_Step $reg_step_B) |
|
608 | + { |
|
609 | + // send finalize_registration step to the end of the array |
|
610 | + if ($reg_step_A->slug() === 'finalize_registration') { |
|
611 | + return 1; |
|
612 | + } elseif ($reg_step_B->slug() === 'finalize_registration') { |
|
613 | + return -1; |
|
614 | + } |
|
615 | + if ($reg_step_A->order() === $reg_step_B->order()) { |
|
616 | + return 0; |
|
617 | + } |
|
618 | + return ($reg_step_A->order() > $reg_step_B->order()) ? 1 : -1; |
|
619 | + } |
|
620 | + |
|
621 | + |
|
622 | + /** |
|
623 | + * set_reg_step_initiated |
|
624 | + * |
|
625 | + * @access public |
|
626 | + * @param EE_SPCO_Reg_Step $reg_step |
|
627 | + * @throws \EE_Error |
|
628 | + */ |
|
629 | + public function set_reg_step_initiated(EE_SPCO_Reg_Step $reg_step) |
|
630 | + { |
|
631 | + // call set_reg_step_initiated ??? |
|
632 | + if (// first time visiting SPCO ? |
|
633 | + ! $this->revisit |
|
634 | + && ( |
|
635 | + // and displaying the reg step form for the first time ? |
|
636 | + $this->action === 'display_spco_reg_step' |
|
637 | + // or initializing the final step |
|
638 | + || $reg_step instanceof EE_SPCO_Reg_Step_Finalize_Registration |
|
639 | + ) |
|
640 | + ) { |
|
641 | + // set the start time for this reg step |
|
642 | + if (! $this->transaction->set_reg_step_initiated($reg_step->slug())) { |
|
643 | + if (WP_DEBUG) { |
|
644 | + EE_Error::add_error( |
|
645 | + sprintf( |
|
646 | + __('The "%1$s" registration step was not initialized properly.', 'event_espresso'), |
|
647 | + $reg_step->name() |
|
648 | + ), |
|
649 | + __FILE__, |
|
650 | + __FUNCTION__, |
|
651 | + __LINE__ |
|
652 | + ); |
|
653 | + } |
|
654 | + } |
|
655 | + } |
|
656 | + } |
|
657 | + |
|
658 | + |
|
659 | + /** |
|
660 | + * set_reg_step_JSON_info |
|
661 | + * |
|
662 | + * @access public |
|
663 | + * @return void |
|
664 | + */ |
|
665 | + public function set_reg_step_JSON_info() |
|
666 | + { |
|
667 | + EE_Registry::$i18n_js_strings['reg_steps'] = array(); |
|
668 | + // pass basic reg step data to JS |
|
669 | + foreach ($this->reg_steps as $reg_step) { |
|
670 | + EE_Registry::$i18n_js_strings['reg_steps'][] = $reg_step->slug(); |
|
671 | + } |
|
672 | + // reset reg step html |
|
673 | + // $this->json_response->set_reg_step_html(''); |
|
674 | + } |
|
675 | + |
|
676 | + |
|
677 | + /** |
|
678 | + * reset_reg_steps |
|
679 | + * |
|
680 | + * @access public |
|
681 | + * @return void |
|
682 | + */ |
|
683 | + public function reset_reg_steps() |
|
684 | + { |
|
685 | + $this->sort_reg_steps(); |
|
686 | + $this->set_current_step(EE_Registry::instance()->REQ->get('step')); |
|
687 | + $this->set_next_step(); |
|
688 | + // the text that appears on the reg step form submit button |
|
689 | + $this->current_step->set_submit_button_text(); |
|
690 | + $this->set_reg_step_JSON_info(); |
|
691 | + } |
|
692 | + |
|
693 | + |
|
694 | + /** |
|
695 | + * get_registration_time_limit |
|
696 | + * |
|
697 | + * @access public |
|
698 | + * @return string |
|
699 | + */ |
|
700 | + public function get_registration_time_limit() |
|
701 | + { |
|
702 | + |
|
703 | + $registration_time_limit = (float) (EE_Registry::instance()->SSN->expiration() - time()); |
|
704 | + $time_limit_format = $registration_time_limit > 60 * MINUTE_IN_SECONDS ? 'H:i:s' : 'i:s'; |
|
705 | + $registration_time_limit = date($time_limit_format, $registration_time_limit); |
|
706 | + return apply_filters( |
|
707 | + 'FHEE__EE_Checkout__get_registration_time_limit__registration_time_limit', |
|
708 | + $registration_time_limit |
|
709 | + ); |
|
710 | + } |
|
711 | + |
|
712 | + |
|
713 | + /** |
|
714 | + * payment_required |
|
715 | + * |
|
716 | + * @return boolean |
|
717 | + */ |
|
718 | + public function payment_required() |
|
719 | + { |
|
720 | + // if NOT: |
|
721 | + // registration via admin |
|
722 | + // completed TXN |
|
723 | + // overpaid TXN |
|
724 | + // free TXN(total = 0.00) |
|
725 | + // then payment required is TRUE |
|
726 | + return ! ($this->admin_request |
|
727 | + || $this->transaction->is_completed() |
|
728 | + || $this->transaction->is_overpaid() |
|
729 | + || $this->transaction->is_free()) ? true : false; |
|
730 | + } |
|
731 | + |
|
732 | + |
|
733 | + /** |
|
734 | + * get_cart_for_transaction |
|
735 | + * |
|
736 | + * @access public |
|
737 | + * @param EE_Transaction $transaction |
|
738 | + * @return EE_Cart |
|
739 | + */ |
|
740 | + public function get_cart_for_transaction($transaction) |
|
741 | + { |
|
742 | + $session = EE_Registry::instance()->load_core('Session'); |
|
743 | + $cart = $transaction instanceof EE_Transaction ? EE_Cart::get_cart_from_txn($transaction, $session) : null; |
|
744 | + // verify cart |
|
745 | + if (! $cart instanceof EE_Cart) { |
|
746 | + $cart = EE_Registry::instance()->load_core('Cart'); |
|
747 | + } |
|
748 | + |
|
749 | + return $cart; |
|
750 | + } |
|
751 | + |
|
752 | + |
|
753 | + /** |
|
754 | + * initialize_txn_reg_steps_array |
|
755 | + * |
|
756 | + * @access public |
|
757 | + * @return array |
|
758 | + */ |
|
759 | + public function initialize_txn_reg_steps_array() |
|
760 | + { |
|
761 | + $txn_reg_steps_array = array(); |
|
762 | + foreach ($this->reg_steps as $reg_step) { |
|
763 | + $txn_reg_steps_array[ $reg_step->slug() ] = false; |
|
764 | + } |
|
765 | + return $txn_reg_steps_array; |
|
766 | + } |
|
767 | + |
|
768 | + |
|
769 | + /** |
|
770 | + * update_txn_reg_steps_array |
|
771 | + * |
|
772 | + * @access public |
|
773 | + * @return bool |
|
774 | + * @throws \EE_Error |
|
775 | + */ |
|
776 | + public function update_txn_reg_steps_array() |
|
777 | + { |
|
778 | + $updated = false; |
|
779 | + foreach ($this->reg_steps as $reg_step) { |
|
780 | + if ($reg_step->completed()) { |
|
781 | + $updated = $this->transaction->set_reg_step_completed($reg_step->slug()) |
|
782 | + ? true |
|
783 | + : $updated; |
|
784 | + } |
|
785 | + } |
|
786 | + if ($updated) { |
|
787 | + $this->transaction->save(); |
|
788 | + } |
|
789 | + return $updated; |
|
790 | + } |
|
791 | + |
|
792 | + |
|
793 | + /** |
|
794 | + * stash_transaction_and_checkout |
|
795 | + * |
|
796 | + * @access public |
|
797 | + * @return void |
|
798 | + * @throws \EE_Error |
|
799 | + */ |
|
800 | + public function stash_transaction_and_checkout() |
|
801 | + { |
|
802 | + if (! $this->revisit) { |
|
803 | + $this->update_txn_reg_steps_array(); |
|
804 | + } |
|
805 | + $this->track_transaction_and_registration_status_updates(); |
|
806 | + // save all data to the db, but suppress errors |
|
807 | + // $this->save_all_data( FALSE ); |
|
808 | + // cache the checkout in the session |
|
809 | + EE_Registry::instance()->SSN->set_checkout($this); |
|
810 | + } |
|
811 | + |
|
812 | + |
|
813 | + /** |
|
814 | + * track_transaction_and_registration_status_updates |
|
815 | + * stores whether any updates were made to the TXN or it's related registrations |
|
816 | + * |
|
817 | + * @access public |
|
818 | + * @return void |
|
819 | + * @throws \EE_Error |
|
820 | + */ |
|
821 | + public function track_transaction_and_registration_status_updates() |
|
822 | + { |
|
823 | + // verify the transaction |
|
824 | + if ($this->transaction instanceof EE_Transaction) { |
|
825 | + // has there been a TXN status change during this checkout? |
|
826 | + $this->txn_status_updated = $this->transaction->txn_status_updated(); |
|
827 | + /** @type EE_Registration_Processor $registration_processor */ |
|
828 | + $registration_processor = EE_Registry::instance()->load_class('Registration_Processor'); |
|
829 | + // grab the saved registrations from the transaction |
|
830 | + foreach ($this->transaction->registrations($this->reg_cache_where_params) as $registration) { |
|
831 | + if ($registration_processor->reg_status_updated($registration->ID())) { |
|
832 | + $this->set_reg_status_updated($registration->ID(), true); |
|
833 | + } |
|
834 | + } |
|
835 | + } |
|
836 | + } |
|
837 | + |
|
838 | + |
|
839 | + /** |
|
840 | + * visit_allows_processing_of_this_registration |
|
841 | + * determines if the current SPCO visit should allow the passed EE_Registration to be used in processing. |
|
842 | + * one of the following conditions must be met: |
|
843 | + * EITHER: A) first time thru SPCO -> process ALL registrations ( NOT a revisit ) |
|
844 | + * OR : B) primary registrant is editing info -> process ALL registrations ( primary_revisit ) |
|
845 | + * OR : C) another registrant is editing info -> ONLY process their registration ( revisit AND their |
|
846 | + * reg_url_link matches ) |
|
847 | + * |
|
848 | + * @access public |
|
849 | + * @param EE_Registration $registration |
|
850 | + * @return bool |
|
851 | + * @throws \EE_Error |
|
852 | + */ |
|
853 | + public function visit_allows_processing_of_this_registration(EE_Registration $registration) |
|
854 | + { |
|
855 | + return ! $this->revisit |
|
856 | + || $this->primary_revisit |
|
857 | + || ( |
|
858 | + $this->revisit && $this->reg_url_link === $registration->reg_url_link() |
|
859 | + ) |
|
860 | + ? true |
|
861 | + : false; |
|
862 | + } |
|
863 | + |
|
864 | + |
|
865 | + /** |
|
866 | + * _transaction_has_primary_registration |
|
867 | + * |
|
868 | + * @access private |
|
869 | + * @return bool |
|
870 | + */ |
|
871 | + public function transaction_has_primary_registrant() |
|
872 | + { |
|
873 | + return $this->primary_attendee_obj instanceof EE_Attendee ? true : false; |
|
874 | + } |
|
875 | + |
|
876 | + |
|
877 | + /** |
|
878 | + * save_all_data |
|
879 | + * simply loops through the current transaction and saves all data for each registration |
|
880 | + * |
|
881 | + * @access public |
|
882 | + * @param bool $show_errors |
|
883 | + * @return bool |
|
884 | + * @throws \EE_Error |
|
885 | + */ |
|
886 | + public function save_all_data($show_errors = true) |
|
887 | + { |
|
888 | + // verify the transaction |
|
889 | + if ($this->transaction instanceof EE_Transaction) { |
|
890 | + // save to ensure that TXN has ID |
|
891 | + $this->transaction->save(); |
|
892 | + // grab the saved registrations from the transaction |
|
893 | + foreach ($this->transaction->registrations($this->reg_cache_where_params) as $registration) { |
|
894 | + $this->_save_registration($registration, $show_errors); |
|
895 | + } |
|
896 | + } else { |
|
897 | + if ($show_errors) { |
|
898 | + EE_Error::add_error( |
|
899 | + __( |
|
900 | + 'A valid Transaction was not found when attempting to save your registration information.', |
|
901 | + 'event_espresso' |
|
902 | + ), |
|
903 | + __FILE__, |
|
904 | + __FUNCTION__, |
|
905 | + __LINE__ |
|
906 | + ); |
|
907 | + } |
|
908 | + return false; |
|
909 | + } |
|
910 | + return true; |
|
911 | + } |
|
912 | + |
|
913 | + |
|
914 | + /** |
|
915 | + * _save_registration_attendee |
|
916 | + * |
|
917 | + * @param EE_Registration $registration |
|
918 | + * @param bool $show_errors |
|
919 | + * @return void |
|
920 | + * @throws \EE_Error |
|
921 | + */ |
|
922 | + private function _save_registration($registration, $show_errors = true) |
|
923 | + { |
|
924 | + // verify object |
|
925 | + if ($registration instanceof EE_Registration) { |
|
926 | + // should this registration be processed during this visit ? |
|
927 | + if ($this->visit_allows_processing_of_this_registration($registration)) { |
|
928 | + // set TXN ID |
|
929 | + if (! $registration->transaction_ID()) { |
|
930 | + $registration->set_transaction_id($this->transaction->ID()); |
|
931 | + } |
|
932 | + // verify and save the attendee |
|
933 | + $this->_save_registration_attendee($registration, $show_errors); |
|
934 | + // save answers to reg form questions |
|
935 | + $this->_save_registration_answers($registration, $show_errors); |
|
936 | + // save changes |
|
937 | + $registration->save(); |
|
938 | + // update txn cache |
|
939 | + if (! $this->transaction->update_cache_after_object_save('Registration', $registration)) { |
|
940 | + if ($show_errors) { |
|
941 | + EE_Error::add_error( |
|
942 | + __( |
|
943 | + 'The newly saved Registration object could not be cached on the Transaction.', |
|
944 | + 'event_espresso' |
|
945 | + ), |
|
946 | + __FILE__, |
|
947 | + __FUNCTION__, |
|
948 | + __LINE__ |
|
949 | + ); |
|
950 | + } |
|
951 | + } |
|
952 | + } |
|
953 | + } else { |
|
954 | + if ($show_errors) { |
|
955 | + EE_Error::add_error( |
|
956 | + __( |
|
957 | + 'An invalid Registration object was discovered when attempting to save your registration information.', |
|
958 | + 'event_espresso' |
|
959 | + ), |
|
960 | + __FILE__, |
|
961 | + __FUNCTION__, |
|
962 | + __LINE__ |
|
963 | + ); |
|
964 | + } |
|
965 | + } |
|
966 | + } |
|
967 | + |
|
968 | + |
|
969 | + /** |
|
970 | + * _save_registration_attendee |
|
971 | + * |
|
972 | + * @param EE_Registration $registration |
|
973 | + * @param bool $show_errors |
|
974 | + * @return void |
|
975 | + * @throws \EE_Error |
|
976 | + */ |
|
977 | + private function _save_registration_attendee($registration, $show_errors = true) |
|
978 | + { |
|
979 | + if ($registration->attendee() instanceof EE_Attendee) { |
|
980 | + // save so that ATT has ID |
|
981 | + $registration->attendee()->save(); |
|
982 | + if (! $registration->update_cache_after_object_save('Attendee', $registration->attendee())) { |
|
983 | + if ($show_errors) { |
|
984 | + EE_Error::add_error( |
|
985 | + __( |
|
986 | + 'The newly saved Attendee object could not be cached on the registration.', |
|
987 | + 'event_espresso' |
|
988 | + ), |
|
989 | + __FILE__, |
|
990 | + __FUNCTION__, |
|
991 | + __LINE__ |
|
992 | + ); |
|
993 | + } |
|
994 | + } |
|
995 | + } else { |
|
996 | + if ($show_errors) { |
|
997 | + EE_Error::add_error( |
|
998 | + sprintf( |
|
999 | + '%1$s||%1$s $attendee = %2$s', |
|
1000 | + __( |
|
1001 | + 'Either no Attendee information was found, or an invalid Attendee object was discovered when attempting to save your registration information.', |
|
1002 | + 'event_espresso' |
|
1003 | + ), |
|
1004 | + var_export($registration->attendee(), true) |
|
1005 | + ), |
|
1006 | + __FILE__, |
|
1007 | + __FUNCTION__, |
|
1008 | + __LINE__ |
|
1009 | + ); |
|
1010 | + } |
|
1011 | + } |
|
1012 | + } |
|
1013 | + |
|
1014 | + |
|
1015 | + /** |
|
1016 | + * _save_question_answers |
|
1017 | + * |
|
1018 | + * @param EE_Registration $registration |
|
1019 | + * @param bool $show_errors |
|
1020 | + * @return void |
|
1021 | + * @throws \EE_Error |
|
1022 | + */ |
|
1023 | + private function _save_registration_answers($registration, $show_errors = true) |
|
1024 | + { |
|
1025 | + // now save the answers |
|
1026 | + foreach ($registration->answers() as $cache_key => $answer) { |
|
1027 | + // verify object |
|
1028 | + if ($answer instanceof EE_Answer) { |
|
1029 | + $answer->set_registration($registration->ID()); |
|
1030 | + $answer->save(); |
|
1031 | + if (! $registration->update_cache_after_object_save('Answer', $answer, $cache_key)) { |
|
1032 | + if ($show_errors) { |
|
1033 | + EE_Error::add_error( |
|
1034 | + __( |
|
1035 | + 'The newly saved Answer object could not be cached on the registration.', |
|
1036 | + 'event_espresso' |
|
1037 | + ), |
|
1038 | + __FILE__, |
|
1039 | + __FUNCTION__, |
|
1040 | + __LINE__ |
|
1041 | + ); |
|
1042 | + } |
|
1043 | + } |
|
1044 | + } else { |
|
1045 | + if ($show_errors) { |
|
1046 | + EE_Error::add_error( |
|
1047 | + __( |
|
1048 | + 'An invalid Answer object was discovered when attempting to save your registration information.', |
|
1049 | + 'event_espresso' |
|
1050 | + ), |
|
1051 | + __FILE__, |
|
1052 | + __FUNCTION__, |
|
1053 | + __LINE__ |
|
1054 | + ); |
|
1055 | + } |
|
1056 | + } |
|
1057 | + } |
|
1058 | + } |
|
1059 | + |
|
1060 | + |
|
1061 | + /** |
|
1062 | + * refresh_all_entities |
|
1063 | + * will either refresh the entity map with objects form the db or from the checkout cache |
|
1064 | + * |
|
1065 | + * @access public |
|
1066 | + * @param bool $from_db |
|
1067 | + * @return bool |
|
1068 | + * @throws \EE_Error |
|
1069 | + */ |
|
1070 | + public function refresh_all_entities($from_db = false) |
|
1071 | + { |
|
1072 | + $from_db = $this->current_step->is_final_step() || $this->action === 'process_gateway_response' |
|
1073 | + ? true |
|
1074 | + : $from_db; |
|
1075 | + // $this->log( |
|
1076 | + // __CLASS__, |
|
1077 | + // __FUNCTION__, |
|
1078 | + // __LINE__, |
|
1079 | + // array('from_db' => $from_db) |
|
1080 | + // ); |
|
1081 | + return $from_db ? $this->refresh_from_db() : $this->refresh_entity_map(); |
|
1082 | + } |
|
1083 | + |
|
1084 | + |
|
1085 | + /** |
|
1086 | + * refresh_entity_map |
|
1087 | + * simply loops through the current transaction and updates each |
|
1088 | + * model's entity map using EEM_Base::refresh_entity_map_from_db() |
|
1089 | + * |
|
1090 | + * @access public |
|
1091 | + * @return bool |
|
1092 | + * @throws \EE_Error |
|
1093 | + */ |
|
1094 | + protected function refresh_from_db() |
|
1095 | + { |
|
1096 | + // verify the transaction |
|
1097 | + if ($this->transaction instanceof EE_Transaction && $this->transaction->ID()) { |
|
1098 | + // pull fresh TXN data from the db |
|
1099 | + $this->transaction = $this->transaction->get_model()->refresh_entity_map_from_db($this->transaction->ID()); |
|
1100 | + // update EE_Checkout's cached primary_attendee object |
|
1101 | + $this->primary_attendee_obj = $this->_refresh_primary_attendee_obj_from_db($this->transaction); |
|
1102 | + // update EE_Checkout's cached payment object |
|
1103 | + $payment = $this->transaction->last_payment(); |
|
1104 | + $this->payment = $payment instanceof EE_Payment ? $payment : $this->payment; |
|
1105 | + // update EE_Checkout's cached payment_method object |
|
1106 | + $payment_method = $this->payment instanceof EE_Payment ? $this->payment->payment_method() : null; |
|
1107 | + $this->payment_method = $payment_method instanceof EE_Payment_Method ? $payment_method |
|
1108 | + : $this->payment_method; |
|
1109 | + // now refresh the cart, based on the TXN |
|
1110 | + $this->cart = $this->get_cart_for_transaction($this->transaction); |
|
1111 | + } else { |
|
1112 | + EE_Error::add_error( |
|
1113 | + __( |
|
1114 | + 'A valid Transaction was not found when attempting to update the model entity mapper.', |
|
1115 | + 'event_espresso' |
|
1116 | + ), |
|
1117 | + __FILE__, |
|
1118 | + __FUNCTION__, |
|
1119 | + __LINE__ |
|
1120 | + ); |
|
1121 | + return false; |
|
1122 | + } |
|
1123 | + return true; |
|
1124 | + } |
|
1125 | + |
|
1126 | + |
|
1127 | + /** |
|
1128 | + * _refresh_primary_attendee_obj_from_db |
|
1129 | + * |
|
1130 | + * @param EE_Transaction $transaction |
|
1131 | + * @return EE_Attendee | null |
|
1132 | + * @throws \EE_Error |
|
1133 | + */ |
|
1134 | + protected function _refresh_primary_attendee_obj_from_db(EE_Transaction $transaction) |
|
1135 | + { |
|
1136 | + |
|
1137 | + $primary_attendee_obj = null; |
|
1138 | + // grab the saved registrations from the transaction |
|
1139 | + foreach ($transaction->registrations($this->reg_cache_where_params, true) as $registration) { |
|
1140 | + // verify object |
|
1141 | + if ($registration instanceof EE_Registration) { |
|
1142 | + $attendee = $registration->attendee(); |
|
1143 | + // verify object && maybe cache primary_attendee_obj ? |
|
1144 | + if ($attendee instanceof EE_Attendee && $registration->is_primary_registrant()) { |
|
1145 | + $primary_attendee_obj = $attendee; |
|
1146 | + } |
|
1147 | + } else { |
|
1148 | + EE_Error::add_error( |
|
1149 | + __( |
|
1150 | + 'An invalid Registration object was discovered when attempting to update the model entity mapper.', |
|
1151 | + 'event_espresso' |
|
1152 | + ), |
|
1153 | + __FILE__, |
|
1154 | + __FUNCTION__, |
|
1155 | + __LINE__ |
|
1156 | + ); |
|
1157 | + } |
|
1158 | + } |
|
1159 | + return $primary_attendee_obj; |
|
1160 | + } |
|
1161 | + |
|
1162 | + |
|
1163 | + /** |
|
1164 | + * refresh_entity_map |
|
1165 | + * simply loops through the current transaction and updates |
|
1166 | + * each model's entity map using EEM_Base::refresh_entity_map_with() |
|
1167 | + * |
|
1168 | + * @access public |
|
1169 | + * @return bool |
|
1170 | + * @throws \EE_Error |
|
1171 | + */ |
|
1172 | + protected function refresh_entity_map() |
|
1173 | + { |
|
1174 | + // verify the transaction |
|
1175 | + if ($this->transaction instanceof EE_Transaction && $this->transaction->ID()) { |
|
1176 | + // never cache payment info |
|
1177 | + $this->transaction->clear_cache('Payment'); |
|
1178 | + // is the Payment Options Reg Step completed ? |
|
1179 | + if ($this->transaction->reg_step_completed('payment_options')) { |
|
1180 | + // then check for payments and update TXN accordingly |
|
1181 | + /** @type EE_Transaction_Payments $transaction_payments */ |
|
1182 | + $transaction_payments = EE_Registry::instance()->load_class('Transaction_Payments'); |
|
1183 | + $transaction_payments->calculate_total_payments_and_update_status($this->transaction); |
|
1184 | + } |
|
1185 | + // grab the saved registrations from the transaction |
|
1186 | + foreach ($this->transaction->registrations($this->reg_cache_where_params) as $reg_cache_ID => $registration) { |
|
1187 | + $this->_refresh_registration($reg_cache_ID, $registration); |
|
1188 | + } |
|
1189 | + // make sure our cached TXN is added to the model entity mapper |
|
1190 | + $this->transaction = $this->transaction->get_model()->refresh_entity_map_with( |
|
1191 | + $this->transaction->ID(), |
|
1192 | + $this->transaction |
|
1193 | + ); |
|
1194 | + } else { |
|
1195 | + EE_Error::add_error( |
|
1196 | + __( |
|
1197 | + 'A valid Transaction was not found when attempting to update the model entity mapper.', |
|
1198 | + 'event_espresso' |
|
1199 | + ), |
|
1200 | + __FILE__, |
|
1201 | + __FUNCTION__, |
|
1202 | + __LINE__ |
|
1203 | + ); |
|
1204 | + return false; |
|
1205 | + } |
|
1206 | + // verify and update the cart because inaccurate totals are not so much fun |
|
1207 | + if ($this->cart instanceof EE_Cart) { |
|
1208 | + $grand_total = $this->cart->get_grand_total(); |
|
1209 | + if ($grand_total instanceof EE_Line_Item && $grand_total->ID()) { |
|
1210 | + $grand_total->recalculate_total_including_taxes(); |
|
1211 | + $grand_total = $grand_total->get_model()->refresh_entity_map_with( |
|
1212 | + $this->cart->get_grand_total()->ID(), |
|
1213 | + $this->cart->get_grand_total() |
|
1214 | + ); |
|
1215 | + } |
|
1216 | + if ($grand_total instanceof EE_Line_Item) { |
|
1217 | + $this->cart = EE_Cart::instance($grand_total); |
|
1218 | + } else { |
|
1219 | + EE_Error::add_error( |
|
1220 | + __( |
|
1221 | + 'A valid Cart was not found when attempting to update the model entity mapper.', |
|
1222 | + 'event_espresso' |
|
1223 | + ), |
|
1224 | + __FILE__, |
|
1225 | + __FUNCTION__, |
|
1226 | + __LINE__ |
|
1227 | + ); |
|
1228 | + return false; |
|
1229 | + } |
|
1230 | + } |
|
1231 | + return true; |
|
1232 | + } |
|
1233 | + |
|
1234 | + |
|
1235 | + /** |
|
1236 | + * _refresh_registration |
|
1237 | + * |
|
1238 | + * @param string | int $reg_cache_ID |
|
1239 | + * @param EE_Registration $registration |
|
1240 | + * @return void |
|
1241 | + * @throws \EE_Error |
|
1242 | + */ |
|
1243 | + protected function _refresh_registration($reg_cache_ID, $registration) |
|
1244 | + { |
|
1245 | + |
|
1246 | + // verify object |
|
1247 | + if ($registration instanceof EE_Registration) { |
|
1248 | + // update the entity mapper attendee |
|
1249 | + $this->_refresh_registration_attendee($registration); |
|
1250 | + // update the entity mapper answers for reg form questions |
|
1251 | + $this->_refresh_registration_answers($registration); |
|
1252 | + // make sure the cached registration is added to the model entity mapper |
|
1253 | + $registration->get_model()->refresh_entity_map_with($reg_cache_ID, $registration); |
|
1254 | + } else { |
|
1255 | + EE_Error::add_error( |
|
1256 | + __( |
|
1257 | + 'An invalid Registration object was discovered when attempting to update the model entity mapper.', |
|
1258 | + 'event_espresso' |
|
1259 | + ), |
|
1260 | + __FILE__, |
|
1261 | + __FUNCTION__, |
|
1262 | + __LINE__ |
|
1263 | + ); |
|
1264 | + } |
|
1265 | + } |
|
1266 | + |
|
1267 | + |
|
1268 | + /** |
|
1269 | + * _save_registration_attendee |
|
1270 | + * |
|
1271 | + * @param EE_Registration $registration |
|
1272 | + * @return void |
|
1273 | + * @throws \EE_Error |
|
1274 | + */ |
|
1275 | + protected function _refresh_registration_attendee($registration) |
|
1276 | + { |
|
1277 | + |
|
1278 | + $attendee = $registration->attendee(); |
|
1279 | + // verify object |
|
1280 | + if ($attendee instanceof EE_Attendee && $attendee->ID()) { |
|
1281 | + // make sure the cached attendee is added to the model entity mapper |
|
1282 | + $registration->attendee()->get_model()->refresh_entity_map_with($attendee->ID(), $attendee); |
|
1283 | + // maybe cache primary_attendee_obj ? |
|
1284 | + if ($registration->is_primary_registrant()) { |
|
1285 | + $this->primary_attendee_obj = $attendee; |
|
1286 | + } |
|
1287 | + } |
|
1288 | + } |
|
1289 | + |
|
1290 | + |
|
1291 | + /** |
|
1292 | + * _refresh_registration_answers |
|
1293 | + * |
|
1294 | + * @param EE_Registration $registration |
|
1295 | + * @return void |
|
1296 | + * @throws \EE_Error |
|
1297 | + */ |
|
1298 | + protected function _refresh_registration_answers($registration) |
|
1299 | + { |
|
1300 | + |
|
1301 | + // now update the answers |
|
1302 | + foreach ($registration->answers() as $cache_key => $answer) { |
|
1303 | + // verify object |
|
1304 | + if ($answer instanceof EE_Answer) { |
|
1305 | + if ($answer->ID()) { |
|
1306 | + // make sure the cached answer is added to the model entity mapper |
|
1307 | + $answer->get_model()->refresh_entity_map_with($answer->ID(), $answer); |
|
1308 | + } |
|
1309 | + } else { |
|
1310 | + EE_Error::add_error( |
|
1311 | + __( |
|
1312 | + 'An invalid Answer object was discovered when attempting to update the model entity mapper.', |
|
1313 | + 'event_espresso' |
|
1314 | + ), |
|
1315 | + __FILE__, |
|
1316 | + __FUNCTION__, |
|
1317 | + __LINE__ |
|
1318 | + ); |
|
1319 | + } |
|
1320 | + } |
|
1321 | + } |
|
1322 | + |
|
1323 | + |
|
1324 | + /** |
|
1325 | + * __sleep |
|
1326 | + * to conserve db space, let's remove the reg_form and the EE_Checkout object from EE_SPCO_Reg_Step objects upon |
|
1327 | + * serialization EE_Checkout will handle the reimplementation of itself upon waking, but we won't bother with the |
|
1328 | + * reg form, because if needed, it will be regenerated anyways |
|
1329 | + * |
|
1330 | + * @return array |
|
1331 | + * @throws \EE_Error |
|
1332 | + */ |
|
1333 | + public function __sleep() |
|
1334 | + { |
|
1335 | + if ($this->primary_attendee_obj instanceof EE_Attendee && $this->primary_attendee_obj->ID()) { |
|
1336 | + $this->primary_attendee_obj = $this->primary_attendee_obj->ID(); |
|
1337 | + } // remove the reg form and the checkout |
|
1338 | + if ($this->transaction instanceof EE_Transaction && $this->transaction->ID()) { |
|
1339 | + $this->transaction = $this->transaction->ID(); |
|
1340 | + } // remove the reg form and the checkout |
|
1341 | + return array_diff(array_keys(get_object_vars($this)), array('billing_form', 'registration_form')); |
|
1342 | + } |
|
1343 | + |
|
1344 | + |
|
1345 | + /** |
|
1346 | + * __wakeup |
|
1347 | + * to conserve db space, we are removing the EE_Checkout object from EE_SPCO_Reg_Step objects upon serialization |
|
1348 | + * this will reinstate the EE_Checkout object on each EE_SPCO_Reg_Step object |
|
1349 | + */ |
|
1350 | + public function __wakeup() |
|
1351 | + { |
|
1352 | + if (! $this->primary_attendee_obj instanceof EE_Attendee && absint($this->primary_attendee_obj) !== 0) { |
|
1353 | + // $this->primary_attendee_obj is actually just an ID, so use it to get the object from the db |
|
1354 | + $this->primary_attendee_obj = EEM_Attendee::instance()->get_one_by_ID($this->primary_attendee_obj); |
|
1355 | + } |
|
1356 | + if (! $this->transaction instanceof EE_Transaction && absint($this->transaction) !== 0) { |
|
1357 | + // $this->transaction is actually just an ID, so use it to get the object from the db |
|
1358 | + $this->transaction = EEM_Transaction::instance()->get_one_by_ID($this->transaction); |
|
1359 | + } |
|
1360 | + foreach ($this->reg_steps as $reg_step) { |
|
1361 | + $reg_step->checkout = $this; |
|
1362 | + } |
|
1363 | + } |
|
1364 | + |
|
1365 | + |
|
1366 | + /** |
|
1367 | + * debug |
|
1368 | + * |
|
1369 | + * @param string $class |
|
1370 | + * @param string $func |
|
1371 | + * @param string $line |
|
1372 | + * @param array $info |
|
1373 | + * @param bool $display_request |
|
1374 | + * @throws \EE_Error |
|
1375 | + */ |
|
1376 | + public function log($class = '', $func = '', $line = '', $info = array(), $display_request = false) |
|
1377 | + { |
|
1378 | + $disabled = true; |
|
1379 | + if (WP_DEBUG && ! $disabled) { |
|
1380 | + $debug_data = get_option('EE_DEBUG_SPCO_' . EE_Session::instance()->id(), array()); |
|
1381 | + $default_data = array( |
|
1382 | + $class => $func . '() : ' . $line, |
|
1383 | + 'request->step' => $this->step, |
|
1384 | + 'request->action' => $this->action, |
|
1385 | + 'current_step->slug' => $this->current_step instanceof EE_SPCO_Reg_Step ? |
|
1386 | + $this->current_step->slug() : '', |
|
1387 | + 'current_step->completed' => $this->current_step instanceof EE_SPCO_Reg_Step ? |
|
1388 | + $this->current_step->completed() : '', |
|
1389 | + 'txn_status_updated' => $this->transaction->txn_status_updated(), |
|
1390 | + 'reg_status_updated' => $this->reg_status_updated, |
|
1391 | + 'reg_url_link' => $this->reg_url_link, |
|
1392 | + 'REQ' => $display_request ? $_REQUEST : '', |
|
1393 | + ); |
|
1394 | + if ($this->transaction instanceof EE_Transaction) { |
|
1395 | + $default_data['TXN_status'] = $this->transaction->status_ID(); |
|
1396 | + $default_data['TXN_reg_steps'] = $this->transaction->reg_steps(); |
|
1397 | + foreach ($this->transaction->registrations($this->reg_cache_where_params) as $REG_ID => $registration) { |
|
1398 | + $default_data['registrations'][ $REG_ID ] = $registration->status_ID(); |
|
1399 | + } |
|
1400 | + if ($this->transaction->ID()) { |
|
1401 | + $TXN_ID = 'EE_Transaction: ' . $this->transaction->ID(); |
|
1402 | + // don't serialize objects |
|
1403 | + $info = $this->_strip_objects($info); |
|
1404 | + if (! isset($debug_data[ $TXN_ID ])) { |
|
1405 | + $debug_data[ $TXN_ID ] = array(); |
|
1406 | + } |
|
1407 | + $debug_data[ $TXN_ID ][ microtime() ] = array_merge( |
|
1408 | + $default_data, |
|
1409 | + $info |
|
1410 | + ); |
|
1411 | + update_option('EE_DEBUG_SPCO_' . EE_Session::instance()->id(), $debug_data); |
|
1412 | + } |
|
1413 | + } |
|
1414 | + } |
|
1415 | + } |
|
1416 | + |
|
1417 | + |
|
1418 | + /** |
|
1419 | + * _strip_objects |
|
1420 | + * |
|
1421 | + * @param array $info |
|
1422 | + * @return array |
|
1423 | + */ |
|
1424 | + public function _strip_objects($info = array()) |
|
1425 | + { |
|
1426 | + foreach ((array) $info as $key => $value) { |
|
1427 | + if (is_array($value)) { |
|
1428 | + $info[ $key ] = $this->_strip_objects($value); |
|
1429 | + } elseif (is_object($value)) { |
|
1430 | + $object_class = get_class($value); |
|
1431 | + $info[ $object_class ] = array(); |
|
1432 | + $info[ $object_class ]['ID'] = method_exists($value, 'ID') ? $value->ID() : 0; |
|
1433 | + if (method_exists($value, 'status')) { |
|
1434 | + $info[ $object_class ]['status'] = $value->status(); |
|
1435 | + } elseif (method_exists($value, 'status_ID')) { |
|
1436 | + $info[ $object_class ]['status'] = $value->status_ID(); |
|
1437 | + } |
|
1438 | + unset($info[ $key ]); |
|
1439 | + } |
|
1440 | + } |
|
1441 | + return (array) $info; |
|
1442 | + } |
|
1443 | 1443 | } |
@@ -313,7 +313,7 @@ discard block |
||
313 | 313 | */ |
314 | 314 | public function reg_status_updated($REG_ID) |
315 | 315 | { |
316 | - return isset($this->reg_status_updated[ $REG_ID ]) ? $this->reg_status_updated[ $REG_ID ] : false; |
|
316 | + return isset($this->reg_status_updated[$REG_ID]) ? $this->reg_status_updated[$REG_ID] : false; |
|
317 | 317 | } |
318 | 318 | |
319 | 319 | |
@@ -323,7 +323,7 @@ discard block |
||
323 | 323 | */ |
324 | 324 | public function set_reg_status_updated($REG_ID, $reg_status) |
325 | 325 | { |
326 | - $this->reg_status_updated[ $REG_ID ] = filter_var($reg_status, FILTER_VALIDATE_BOOLEAN); |
|
326 | + $this->reg_status_updated[$REG_ID] = filter_var($reg_status, FILTER_VALIDATE_BOOLEAN); |
|
327 | 327 | } |
328 | 328 | |
329 | 329 | |
@@ -382,7 +382,7 @@ discard block |
||
382 | 382 | */ |
383 | 383 | public function add_reg_step(EE_SPCO_Reg_Step $reg_step_obj) |
384 | 384 | { |
385 | - $this->reg_steps[ $reg_step_obj->slug() ] = $reg_step_obj; |
|
385 | + $this->reg_steps[$reg_step_obj->slug()] = $reg_step_obj; |
|
386 | 386 | } |
387 | 387 | |
388 | 388 | |
@@ -428,7 +428,7 @@ discard block |
||
428 | 428 | */ |
429 | 429 | public function remove_reg_step($reg_step_slug = '', $reset = true) |
430 | 430 | { |
431 | - unset($this->reg_steps[ $reg_step_slug ]); |
|
431 | + unset($this->reg_steps[$reg_step_slug]); |
|
432 | 432 | if ($this->transaction instanceof EE_Transaction) { |
433 | 433 | // now remove reg step from TXN and save |
434 | 434 | $this->transaction->remove_reg_step($reg_step_slug); |
@@ -450,8 +450,8 @@ discard block |
||
450 | 450 | */ |
451 | 451 | public function set_reg_step_order($reg_step_slug = '', $order = 100) |
452 | 452 | { |
453 | - if (isset($this->reg_steps[ $reg_step_slug ])) { |
|
454 | - $this->reg_steps[ $reg_step_slug ]->set_order($order); |
|
453 | + if (isset($this->reg_steps[$reg_step_slug])) { |
|
454 | + $this->reg_steps[$reg_step_slug]->set_order($order); |
|
455 | 455 | } |
456 | 456 | } |
457 | 457 | |
@@ -466,8 +466,8 @@ discard block |
||
466 | 466 | public function set_current_step($current_step) |
467 | 467 | { |
468 | 468 | // grab what step we're on |
469 | - $this->current_step = isset($this->reg_steps[ $current_step ]) |
|
470 | - ? $this->reg_steps[ $current_step ] |
|
469 | + $this->current_step = isset($this->reg_steps[$current_step]) |
|
470 | + ? $this->reg_steps[$current_step] |
|
471 | 471 | : reset( |
472 | 472 | $this->reg_steps |
473 | 473 | ); |
@@ -578,7 +578,7 @@ discard block |
||
578 | 578 | */ |
579 | 579 | public function find_reg_step($reg_step_slug = '') |
580 | 580 | { |
581 | - if (! empty($reg_step_slug)) { |
|
581 | + if ( ! empty($reg_step_slug)) { |
|
582 | 582 | // copy reg step array |
583 | 583 | $reg_steps = $this->reg_steps; |
584 | 584 | // set pointer to start of array |
@@ -639,7 +639,7 @@ discard block |
||
639 | 639 | ) |
640 | 640 | ) { |
641 | 641 | // set the start time for this reg step |
642 | - if (! $this->transaction->set_reg_step_initiated($reg_step->slug())) { |
|
642 | + if ( ! $this->transaction->set_reg_step_initiated($reg_step->slug())) { |
|
643 | 643 | if (WP_DEBUG) { |
644 | 644 | EE_Error::add_error( |
645 | 645 | sprintf( |
@@ -742,7 +742,7 @@ discard block |
||
742 | 742 | $session = EE_Registry::instance()->load_core('Session'); |
743 | 743 | $cart = $transaction instanceof EE_Transaction ? EE_Cart::get_cart_from_txn($transaction, $session) : null; |
744 | 744 | // verify cart |
745 | - if (! $cart instanceof EE_Cart) { |
|
745 | + if ( ! $cart instanceof EE_Cart) { |
|
746 | 746 | $cart = EE_Registry::instance()->load_core('Cart'); |
747 | 747 | } |
748 | 748 | |
@@ -760,7 +760,7 @@ discard block |
||
760 | 760 | { |
761 | 761 | $txn_reg_steps_array = array(); |
762 | 762 | foreach ($this->reg_steps as $reg_step) { |
763 | - $txn_reg_steps_array[ $reg_step->slug() ] = false; |
|
763 | + $txn_reg_steps_array[$reg_step->slug()] = false; |
|
764 | 764 | } |
765 | 765 | return $txn_reg_steps_array; |
766 | 766 | } |
@@ -799,7 +799,7 @@ discard block |
||
799 | 799 | */ |
800 | 800 | public function stash_transaction_and_checkout() |
801 | 801 | { |
802 | - if (! $this->revisit) { |
|
802 | + if ( ! $this->revisit) { |
|
803 | 803 | $this->update_txn_reg_steps_array(); |
804 | 804 | } |
805 | 805 | $this->track_transaction_and_registration_status_updates(); |
@@ -926,7 +926,7 @@ discard block |
||
926 | 926 | // should this registration be processed during this visit ? |
927 | 927 | if ($this->visit_allows_processing_of_this_registration($registration)) { |
928 | 928 | // set TXN ID |
929 | - if (! $registration->transaction_ID()) { |
|
929 | + if ( ! $registration->transaction_ID()) { |
|
930 | 930 | $registration->set_transaction_id($this->transaction->ID()); |
931 | 931 | } |
932 | 932 | // verify and save the attendee |
@@ -936,7 +936,7 @@ discard block |
||
936 | 936 | // save changes |
937 | 937 | $registration->save(); |
938 | 938 | // update txn cache |
939 | - if (! $this->transaction->update_cache_after_object_save('Registration', $registration)) { |
|
939 | + if ( ! $this->transaction->update_cache_after_object_save('Registration', $registration)) { |
|
940 | 940 | if ($show_errors) { |
941 | 941 | EE_Error::add_error( |
942 | 942 | __( |
@@ -979,7 +979,7 @@ discard block |
||
979 | 979 | if ($registration->attendee() instanceof EE_Attendee) { |
980 | 980 | // save so that ATT has ID |
981 | 981 | $registration->attendee()->save(); |
982 | - if (! $registration->update_cache_after_object_save('Attendee', $registration->attendee())) { |
|
982 | + if ( ! $registration->update_cache_after_object_save('Attendee', $registration->attendee())) { |
|
983 | 983 | if ($show_errors) { |
984 | 984 | EE_Error::add_error( |
985 | 985 | __( |
@@ -1028,7 +1028,7 @@ discard block |
||
1028 | 1028 | if ($answer instanceof EE_Answer) { |
1029 | 1029 | $answer->set_registration($registration->ID()); |
1030 | 1030 | $answer->save(); |
1031 | - if (! $registration->update_cache_after_object_save('Answer', $answer, $cache_key)) { |
|
1031 | + if ( ! $registration->update_cache_after_object_save('Answer', $answer, $cache_key)) { |
|
1032 | 1032 | if ($show_errors) { |
1033 | 1033 | EE_Error::add_error( |
1034 | 1034 | __( |
@@ -1349,11 +1349,11 @@ discard block |
||
1349 | 1349 | */ |
1350 | 1350 | public function __wakeup() |
1351 | 1351 | { |
1352 | - if (! $this->primary_attendee_obj instanceof EE_Attendee && absint($this->primary_attendee_obj) !== 0) { |
|
1352 | + if ( ! $this->primary_attendee_obj instanceof EE_Attendee && absint($this->primary_attendee_obj) !== 0) { |
|
1353 | 1353 | // $this->primary_attendee_obj is actually just an ID, so use it to get the object from the db |
1354 | 1354 | $this->primary_attendee_obj = EEM_Attendee::instance()->get_one_by_ID($this->primary_attendee_obj); |
1355 | 1355 | } |
1356 | - if (! $this->transaction instanceof EE_Transaction && absint($this->transaction) !== 0) { |
|
1356 | + if ( ! $this->transaction instanceof EE_Transaction && absint($this->transaction) !== 0) { |
|
1357 | 1357 | // $this->transaction is actually just an ID, so use it to get the object from the db |
1358 | 1358 | $this->transaction = EEM_Transaction::instance()->get_one_by_ID($this->transaction); |
1359 | 1359 | } |
@@ -1377,9 +1377,9 @@ discard block |
||
1377 | 1377 | { |
1378 | 1378 | $disabled = true; |
1379 | 1379 | if (WP_DEBUG && ! $disabled) { |
1380 | - $debug_data = get_option('EE_DEBUG_SPCO_' . EE_Session::instance()->id(), array()); |
|
1380 | + $debug_data = get_option('EE_DEBUG_SPCO_'.EE_Session::instance()->id(), array()); |
|
1381 | 1381 | $default_data = array( |
1382 | - $class => $func . '() : ' . $line, |
|
1382 | + $class => $func.'() : '.$line, |
|
1383 | 1383 | 'request->step' => $this->step, |
1384 | 1384 | 'request->action' => $this->action, |
1385 | 1385 | 'current_step->slug' => $this->current_step instanceof EE_SPCO_Reg_Step ? |
@@ -1395,20 +1395,20 @@ discard block |
||
1395 | 1395 | $default_data['TXN_status'] = $this->transaction->status_ID(); |
1396 | 1396 | $default_data['TXN_reg_steps'] = $this->transaction->reg_steps(); |
1397 | 1397 | foreach ($this->transaction->registrations($this->reg_cache_where_params) as $REG_ID => $registration) { |
1398 | - $default_data['registrations'][ $REG_ID ] = $registration->status_ID(); |
|
1398 | + $default_data['registrations'][$REG_ID] = $registration->status_ID(); |
|
1399 | 1399 | } |
1400 | 1400 | if ($this->transaction->ID()) { |
1401 | - $TXN_ID = 'EE_Transaction: ' . $this->transaction->ID(); |
|
1401 | + $TXN_ID = 'EE_Transaction: '.$this->transaction->ID(); |
|
1402 | 1402 | // don't serialize objects |
1403 | 1403 | $info = $this->_strip_objects($info); |
1404 | - if (! isset($debug_data[ $TXN_ID ])) { |
|
1405 | - $debug_data[ $TXN_ID ] = array(); |
|
1404 | + if ( ! isset($debug_data[$TXN_ID])) { |
|
1405 | + $debug_data[$TXN_ID] = array(); |
|
1406 | 1406 | } |
1407 | - $debug_data[ $TXN_ID ][ microtime() ] = array_merge( |
|
1407 | + $debug_data[$TXN_ID][microtime()] = array_merge( |
|
1408 | 1408 | $default_data, |
1409 | 1409 | $info |
1410 | 1410 | ); |
1411 | - update_option('EE_DEBUG_SPCO_' . EE_Session::instance()->id(), $debug_data); |
|
1411 | + update_option('EE_DEBUG_SPCO_'.EE_Session::instance()->id(), $debug_data); |
|
1412 | 1412 | } |
1413 | 1413 | } |
1414 | 1414 | } |
@@ -1425,17 +1425,17 @@ discard block |
||
1425 | 1425 | { |
1426 | 1426 | foreach ((array) $info as $key => $value) { |
1427 | 1427 | if (is_array($value)) { |
1428 | - $info[ $key ] = $this->_strip_objects($value); |
|
1428 | + $info[$key] = $this->_strip_objects($value); |
|
1429 | 1429 | } elseif (is_object($value)) { |
1430 | 1430 | $object_class = get_class($value); |
1431 | - $info[ $object_class ] = array(); |
|
1432 | - $info[ $object_class ]['ID'] = method_exists($value, 'ID') ? $value->ID() : 0; |
|
1431 | + $info[$object_class] = array(); |
|
1432 | + $info[$object_class]['ID'] = method_exists($value, 'ID') ? $value->ID() : 0; |
|
1433 | 1433 | if (method_exists($value, 'status')) { |
1434 | - $info[ $object_class ]['status'] = $value->status(); |
|
1434 | + $info[$object_class]['status'] = $value->status(); |
|
1435 | 1435 | } elseif (method_exists($value, 'status_ID')) { |
1436 | - $info[ $object_class ]['status'] = $value->status_ID(); |
|
1436 | + $info[$object_class]['status'] = $value->status_ID(); |
|
1437 | 1437 | } |
1438 | - unset($info[ $key ]); |
|
1438 | + unset($info[$key]); |
|
1439 | 1439 | } |
1440 | 1440 | } |
1441 | 1441 | return (array) $info; |
@@ -92,14 +92,14 @@ discard block |
||
92 | 92 | $txn_update_params |
93 | 93 | ); |
94 | 94 | // check if transaction has a primary registrant and that it has a related Attendee object |
95 | - if (! $this->_validate_primary_registrant()) { |
|
95 | + if ( ! $this->_validate_primary_registrant()) { |
|
96 | 96 | return false; |
97 | 97 | } |
98 | 98 | // you don't have to go home but you can't stay here ! |
99 | 99 | $this->checkout->redirect = true; |
100 | 100 | $this->checkout->continue_reg = true; |
101 | 101 | $this->checkout->json_response->set_redirect_url($this->checkout->redirect_url); |
102 | - if (! ( |
|
102 | + if ( ! ( |
|
103 | 103 | $this->checkout->payment_method instanceof EE_Payment_Method |
104 | 104 | && $this->checkout->payment_method->is_off_site() |
105 | 105 | )) { |
@@ -210,7 +210,7 @@ discard block |
||
210 | 210 | */ |
211 | 211 | protected function _validate_primary_registrant() |
212 | 212 | { |
213 | - if (! $this->checkout->transaction_has_primary_registrant()) { |
|
213 | + if ( ! $this->checkout->transaction_has_primary_registrant()) { |
|
214 | 214 | EE_Error::add_error( |
215 | 215 | __('A valid Primary Registration for this Transaction could not be found.', 'event_espresso'), |
216 | 216 | __FILE__, |
@@ -236,7 +236,7 @@ discard block |
||
236 | 236 | public function update_reg_step() |
237 | 237 | { |
238 | 238 | EE_Error::doing_it_wrong( |
239 | - __CLASS__ . '::' . __FILE__, |
|
239 | + __CLASS__.'::'.__FILE__, |
|
240 | 240 | __( |
241 | 241 | 'Can not call update_reg_step() on the Finalize Registration reg step.', |
242 | 242 | 'event_espresso' |
@@ -12,240 +12,240 @@ |
||
12 | 12 | class EE_SPCO_Reg_Step_Finalize_Registration extends EE_SPCO_Reg_Step |
13 | 13 | { |
14 | 14 | |
15 | - /** |
|
16 | - * class constructor |
|
17 | - * |
|
18 | - * @access public |
|
19 | - * @param EE_Checkout $checkout |
|
20 | - */ |
|
21 | - public function __construct(EE_Checkout $checkout) |
|
22 | - { |
|
23 | - $this->_slug = 'finalize_registration'; |
|
24 | - $this->_name = __('Finalize Registration', 'event_espresso'); |
|
25 | - $this->_submit_button_text = $this->_name; |
|
26 | - $this->_template = ''; |
|
27 | - $this->checkout = $checkout; |
|
28 | - } |
|
29 | - |
|
30 | - |
|
31 | - public function translate_js_strings() |
|
32 | - { |
|
33 | - } |
|
34 | - |
|
35 | - |
|
36 | - public function enqueue_styles_and_scripts() |
|
37 | - { |
|
38 | - } |
|
39 | - |
|
40 | - |
|
41 | - /** |
|
42 | - * @return boolean |
|
43 | - */ |
|
44 | - public function initialize_reg_step() |
|
45 | - { |
|
46 | - // there's actually no reg form to process if this is the final step |
|
47 | - if ($this->is_current_step()) { |
|
48 | - $this->checkout->step = $_REQUEST['step'] = $this->slug(); |
|
49 | - $this->checkout->action = $_REQUEST['action'] = 'process_reg_step'; |
|
50 | - $this->checkout->generate_reg_form = false; |
|
51 | - } |
|
52 | - return true; |
|
53 | - } |
|
54 | - |
|
55 | - |
|
56 | - /** |
|
57 | - * @return string |
|
58 | - * @throws \EE_Error |
|
59 | - */ |
|
60 | - public function generate_reg_form() |
|
61 | - { |
|
62 | - // create empty form so that things don't break |
|
63 | - $this->reg_form = new EE_Form_Section_Proper(); |
|
64 | - return ''; |
|
65 | - } |
|
66 | - |
|
67 | - |
|
68 | - /** |
|
69 | - * @return boolean |
|
70 | - * @throws \RuntimeException |
|
71 | - * @throws \EE_Error |
|
72 | - */ |
|
73 | - public function process_reg_step() |
|
74 | - { |
|
75 | - // ensure all data gets refreshed from the db |
|
76 | - $this->checkout->refresh_all_entities(true); |
|
77 | - // ensures that all details and statuses for transaction, registration, and payments are updated |
|
78 | - $txn_update_params = $this->_finalize_transaction(); |
|
79 | - // maybe send messages |
|
80 | - $this->_set_notification_triggers(); |
|
81 | - // send messages |
|
82 | - /** @type EE_Registration_Processor $registration_processor */ |
|
83 | - $registration_processor = EE_Registry::instance()->load_class('Registration_Processor'); |
|
84 | - $registration_processor->trigger_registration_update_notifications( |
|
85 | - $this->checkout->transaction->primary_registration(), |
|
86 | - $txn_update_params |
|
87 | - ); |
|
88 | - // set a hook point |
|
89 | - do_action( |
|
90 | - 'AHEE__EE_SPCO_Reg_Step_Finalize_Registration__process_reg_step__completed', |
|
91 | - $this->checkout, |
|
92 | - $txn_update_params |
|
93 | - ); |
|
94 | - // check if transaction has a primary registrant and that it has a related Attendee object |
|
95 | - if (! $this->_validate_primary_registrant()) { |
|
96 | - return false; |
|
97 | - } |
|
98 | - // you don't have to go home but you can't stay here ! |
|
99 | - $this->checkout->redirect = true; |
|
100 | - $this->checkout->continue_reg = true; |
|
101 | - $this->checkout->json_response->set_redirect_url($this->checkout->redirect_url); |
|
102 | - if (! ( |
|
103 | - $this->checkout->payment_method instanceof EE_Payment_Method |
|
104 | - && $this->checkout->payment_method->is_off_site() |
|
105 | - )) { |
|
106 | - // mark this reg step as completed |
|
107 | - $this->set_completed(); |
|
108 | - } |
|
109 | - $this->checkout->set_exit_spco(); |
|
110 | - return true; |
|
111 | - } |
|
112 | - |
|
113 | - |
|
114 | - /** |
|
115 | - * _finalize_transaction |
|
116 | - * ensures that all details and statuses for transaction, registration, and payments are updated |
|
117 | - * |
|
118 | - * @return array |
|
119 | - * @throws \RuntimeException |
|
120 | - * @throws \EE_Error |
|
121 | - */ |
|
122 | - protected function _finalize_transaction() |
|
123 | - { |
|
124 | - /** @type EE_Transaction_Processor $transaction_processor */ |
|
125 | - $transaction_processor = EE_Registry::instance()->load_class('Transaction_Processor'); |
|
126 | - // set revisit flag in txn processor |
|
127 | - $transaction_processor->set_revisit($this->checkout->revisit); |
|
128 | - // at this point we'll consider a TXN to not have been abandoned |
|
129 | - $this->checkout->transaction->toggle_abandoned_transaction_status(); |
|
130 | - if ($this->checkout->cart instanceof EE_Cart) { |
|
131 | - // save TXN data to the cart |
|
132 | - $this->checkout->cart->get_grand_total()->save_this_and_descendants_to_txn( |
|
133 | - $this->checkout->transaction->ID() |
|
134 | - ); |
|
135 | - } |
|
136 | - // maybe update status, but don't save transaction just yet |
|
137 | - $this->checkout->transaction->update_status_based_on_total_paid(false); |
|
138 | - // this will result in the base session properties getting saved to the TXN_Session_data field |
|
139 | - $session_data = EE_Registry::instance()->SSN->get_session_data(null, true); |
|
140 | - // anonymize the last part of the IP address, now that the transaction is complete (we won't be using the IP address |
|
141 | - // for spam or bot detection now) |
|
142 | - if (function_exists('wp_privacy_anonymize_ip') && isset($session_data['ip_address'])) { |
|
143 | - $session_data['ip_address'] = wp_privacy_anonymize_ip($session_data['ip_address']); |
|
144 | - } |
|
145 | - $this->checkout->transaction->set_txn_session_data($session_data); |
|
146 | - // update the TXN if payment conditions have changed, but do NOT trigger notifications, |
|
147 | - // because we will do that in process_reg_step() after setting some more triggers |
|
148 | - return $transaction_processor->update_transaction_and_registrations_after_checkout_or_payment( |
|
149 | - $this->checkout->transaction, |
|
150 | - $this->checkout->payment, |
|
151 | - $this->checkout->reg_cache_where_params, |
|
152 | - false |
|
153 | - ); |
|
154 | - } |
|
155 | - |
|
156 | - |
|
157 | - /** |
|
158 | - * If request is not a revisit, and an Off-Site gateway using IPNs has NOT been selected... |
|
159 | - * OR |
|
160 | - * if it IS a revisit and the TXN and/or one or more REG statuses have changed... |
|
161 | - * then trigger notifications |
|
162 | - * |
|
163 | - * @return void |
|
164 | - * @throws \EE_Error |
|
165 | - */ |
|
166 | - protected function _set_notification_triggers() |
|
167 | - { |
|
168 | - |
|
169 | - if ($this->checkout->payment_method instanceof EE_Payment_Method) { |
|
170 | - // let's start with the assumption that we need to trigger notifications |
|
171 | - // then toggle this to false for conditions where we know we don't need to |
|
172 | - $deliver_notifications = true; |
|
173 | - if (// if SPCO revisit |
|
174 | - filter_var($this->checkout->revisit, FILTER_VALIDATE_BOOLEAN) |
|
175 | - // and TXN or REG statuses have NOT changed due to a payment |
|
176 | - && ! ( |
|
177 | - $this->checkout->transaction->txn_status_updated() |
|
178 | - || $this->checkout->any_reg_status_updated() |
|
179 | - ) |
|
180 | - ) { |
|
181 | - $deliver_notifications = false; |
|
182 | - } |
|
183 | - if ($this->checkout->payment_method->is_off_site()) { |
|
184 | - /** @var EE_Gateway $gateway */ |
|
185 | - $gateway = $this->checkout->payment_method->type_obj()->get_gateway(); |
|
186 | - // and the gateway uses a separate request to process the IPN |
|
187 | - if ($gateway instanceof EE_Offsite_Gateway |
|
188 | - && $gateway->handle_IPN_in_this_request(\EE_Registry::instance()->REQ->params(), true) |
|
189 | - ) { |
|
190 | - // IPN request will handle triggering notifications |
|
191 | - $deliver_notifications = false; |
|
192 | - // no really... don't send any notices in this request |
|
193 | - remove_all_filters('FHEE__EED_Messages___maybe_registration__deliver_notifications'); |
|
194 | - add_filter( |
|
195 | - 'FHEE__EED_Messages___maybe_registration__deliver_notifications', |
|
196 | - '__return_false', |
|
197 | - 15 |
|
198 | - ); |
|
199 | - } |
|
200 | - } |
|
201 | - if ($deliver_notifications) { |
|
202 | - // send out notifications |
|
203 | - add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10); |
|
204 | - } |
|
205 | - } |
|
206 | - } |
|
207 | - |
|
208 | - |
|
209 | - /** |
|
210 | - * check if transaction has a primary registrant and that it has a related Attendee object |
|
211 | - * |
|
212 | - * @return boolean |
|
213 | - * @throws \EE_Error |
|
214 | - */ |
|
215 | - protected function _validate_primary_registrant() |
|
216 | - { |
|
217 | - if (! $this->checkout->transaction_has_primary_registrant()) { |
|
218 | - EE_Error::add_error( |
|
219 | - __('A valid Primary Registration for this Transaction could not be found.', 'event_espresso'), |
|
220 | - __FILE__, |
|
221 | - __FUNCTION__, |
|
222 | - __LINE__ |
|
223 | - ); |
|
224 | - $this->checkout->redirect = false; |
|
225 | - $this->checkout->continue_reg = false; |
|
226 | - return false; |
|
227 | - } |
|
228 | - // setup URL for redirect |
|
229 | - $this->checkout->redirect_url = add_query_arg( |
|
230 | - array('e_reg_url_link' => $this->checkout->transaction->primary_registration()->reg_url_link()), |
|
231 | - $this->checkout->thank_you_page_url |
|
232 | - ); |
|
233 | - return true; |
|
234 | - } |
|
235 | - |
|
236 | - |
|
237 | - /** |
|
238 | - * @return void |
|
239 | - */ |
|
240 | - public function update_reg_step() |
|
241 | - { |
|
242 | - EE_Error::doing_it_wrong( |
|
243 | - __CLASS__ . '::' . __FILE__, |
|
244 | - __( |
|
245 | - 'Can not call update_reg_step() on the Finalize Registration reg step.', |
|
246 | - 'event_espresso' |
|
247 | - ), |
|
248 | - '4.6.0' |
|
249 | - ); |
|
250 | - } |
|
15 | + /** |
|
16 | + * class constructor |
|
17 | + * |
|
18 | + * @access public |
|
19 | + * @param EE_Checkout $checkout |
|
20 | + */ |
|
21 | + public function __construct(EE_Checkout $checkout) |
|
22 | + { |
|
23 | + $this->_slug = 'finalize_registration'; |
|
24 | + $this->_name = __('Finalize Registration', 'event_espresso'); |
|
25 | + $this->_submit_button_text = $this->_name; |
|
26 | + $this->_template = ''; |
|
27 | + $this->checkout = $checkout; |
|
28 | + } |
|
29 | + |
|
30 | + |
|
31 | + public function translate_js_strings() |
|
32 | + { |
|
33 | + } |
|
34 | + |
|
35 | + |
|
36 | + public function enqueue_styles_and_scripts() |
|
37 | + { |
|
38 | + } |
|
39 | + |
|
40 | + |
|
41 | + /** |
|
42 | + * @return boolean |
|
43 | + */ |
|
44 | + public function initialize_reg_step() |
|
45 | + { |
|
46 | + // there's actually no reg form to process if this is the final step |
|
47 | + if ($this->is_current_step()) { |
|
48 | + $this->checkout->step = $_REQUEST['step'] = $this->slug(); |
|
49 | + $this->checkout->action = $_REQUEST['action'] = 'process_reg_step'; |
|
50 | + $this->checkout->generate_reg_form = false; |
|
51 | + } |
|
52 | + return true; |
|
53 | + } |
|
54 | + |
|
55 | + |
|
56 | + /** |
|
57 | + * @return string |
|
58 | + * @throws \EE_Error |
|
59 | + */ |
|
60 | + public function generate_reg_form() |
|
61 | + { |
|
62 | + // create empty form so that things don't break |
|
63 | + $this->reg_form = new EE_Form_Section_Proper(); |
|
64 | + return ''; |
|
65 | + } |
|
66 | + |
|
67 | + |
|
68 | + /** |
|
69 | + * @return boolean |
|
70 | + * @throws \RuntimeException |
|
71 | + * @throws \EE_Error |
|
72 | + */ |
|
73 | + public function process_reg_step() |
|
74 | + { |
|
75 | + // ensure all data gets refreshed from the db |
|
76 | + $this->checkout->refresh_all_entities(true); |
|
77 | + // ensures that all details and statuses for transaction, registration, and payments are updated |
|
78 | + $txn_update_params = $this->_finalize_transaction(); |
|
79 | + // maybe send messages |
|
80 | + $this->_set_notification_triggers(); |
|
81 | + // send messages |
|
82 | + /** @type EE_Registration_Processor $registration_processor */ |
|
83 | + $registration_processor = EE_Registry::instance()->load_class('Registration_Processor'); |
|
84 | + $registration_processor->trigger_registration_update_notifications( |
|
85 | + $this->checkout->transaction->primary_registration(), |
|
86 | + $txn_update_params |
|
87 | + ); |
|
88 | + // set a hook point |
|
89 | + do_action( |
|
90 | + 'AHEE__EE_SPCO_Reg_Step_Finalize_Registration__process_reg_step__completed', |
|
91 | + $this->checkout, |
|
92 | + $txn_update_params |
|
93 | + ); |
|
94 | + // check if transaction has a primary registrant and that it has a related Attendee object |
|
95 | + if (! $this->_validate_primary_registrant()) { |
|
96 | + return false; |
|
97 | + } |
|
98 | + // you don't have to go home but you can't stay here ! |
|
99 | + $this->checkout->redirect = true; |
|
100 | + $this->checkout->continue_reg = true; |
|
101 | + $this->checkout->json_response->set_redirect_url($this->checkout->redirect_url); |
|
102 | + if (! ( |
|
103 | + $this->checkout->payment_method instanceof EE_Payment_Method |
|
104 | + && $this->checkout->payment_method->is_off_site() |
|
105 | + )) { |
|
106 | + // mark this reg step as completed |
|
107 | + $this->set_completed(); |
|
108 | + } |
|
109 | + $this->checkout->set_exit_spco(); |
|
110 | + return true; |
|
111 | + } |
|
112 | + |
|
113 | + |
|
114 | + /** |
|
115 | + * _finalize_transaction |
|
116 | + * ensures that all details and statuses for transaction, registration, and payments are updated |
|
117 | + * |
|
118 | + * @return array |
|
119 | + * @throws \RuntimeException |
|
120 | + * @throws \EE_Error |
|
121 | + */ |
|
122 | + protected function _finalize_transaction() |
|
123 | + { |
|
124 | + /** @type EE_Transaction_Processor $transaction_processor */ |
|
125 | + $transaction_processor = EE_Registry::instance()->load_class('Transaction_Processor'); |
|
126 | + // set revisit flag in txn processor |
|
127 | + $transaction_processor->set_revisit($this->checkout->revisit); |
|
128 | + // at this point we'll consider a TXN to not have been abandoned |
|
129 | + $this->checkout->transaction->toggle_abandoned_transaction_status(); |
|
130 | + if ($this->checkout->cart instanceof EE_Cart) { |
|
131 | + // save TXN data to the cart |
|
132 | + $this->checkout->cart->get_grand_total()->save_this_and_descendants_to_txn( |
|
133 | + $this->checkout->transaction->ID() |
|
134 | + ); |
|
135 | + } |
|
136 | + // maybe update status, but don't save transaction just yet |
|
137 | + $this->checkout->transaction->update_status_based_on_total_paid(false); |
|
138 | + // this will result in the base session properties getting saved to the TXN_Session_data field |
|
139 | + $session_data = EE_Registry::instance()->SSN->get_session_data(null, true); |
|
140 | + // anonymize the last part of the IP address, now that the transaction is complete (we won't be using the IP address |
|
141 | + // for spam or bot detection now) |
|
142 | + if (function_exists('wp_privacy_anonymize_ip') && isset($session_data['ip_address'])) { |
|
143 | + $session_data['ip_address'] = wp_privacy_anonymize_ip($session_data['ip_address']); |
|
144 | + } |
|
145 | + $this->checkout->transaction->set_txn_session_data($session_data); |
|
146 | + // update the TXN if payment conditions have changed, but do NOT trigger notifications, |
|
147 | + // because we will do that in process_reg_step() after setting some more triggers |
|
148 | + return $transaction_processor->update_transaction_and_registrations_after_checkout_or_payment( |
|
149 | + $this->checkout->transaction, |
|
150 | + $this->checkout->payment, |
|
151 | + $this->checkout->reg_cache_where_params, |
|
152 | + false |
|
153 | + ); |
|
154 | + } |
|
155 | + |
|
156 | + |
|
157 | + /** |
|
158 | + * If request is not a revisit, and an Off-Site gateway using IPNs has NOT been selected... |
|
159 | + * OR |
|
160 | + * if it IS a revisit and the TXN and/or one or more REG statuses have changed... |
|
161 | + * then trigger notifications |
|
162 | + * |
|
163 | + * @return void |
|
164 | + * @throws \EE_Error |
|
165 | + */ |
|
166 | + protected function _set_notification_triggers() |
|
167 | + { |
|
168 | + |
|
169 | + if ($this->checkout->payment_method instanceof EE_Payment_Method) { |
|
170 | + // let's start with the assumption that we need to trigger notifications |
|
171 | + // then toggle this to false for conditions where we know we don't need to |
|
172 | + $deliver_notifications = true; |
|
173 | + if (// if SPCO revisit |
|
174 | + filter_var($this->checkout->revisit, FILTER_VALIDATE_BOOLEAN) |
|
175 | + // and TXN or REG statuses have NOT changed due to a payment |
|
176 | + && ! ( |
|
177 | + $this->checkout->transaction->txn_status_updated() |
|
178 | + || $this->checkout->any_reg_status_updated() |
|
179 | + ) |
|
180 | + ) { |
|
181 | + $deliver_notifications = false; |
|
182 | + } |
|
183 | + if ($this->checkout->payment_method->is_off_site()) { |
|
184 | + /** @var EE_Gateway $gateway */ |
|
185 | + $gateway = $this->checkout->payment_method->type_obj()->get_gateway(); |
|
186 | + // and the gateway uses a separate request to process the IPN |
|
187 | + if ($gateway instanceof EE_Offsite_Gateway |
|
188 | + && $gateway->handle_IPN_in_this_request(\EE_Registry::instance()->REQ->params(), true) |
|
189 | + ) { |
|
190 | + // IPN request will handle triggering notifications |
|
191 | + $deliver_notifications = false; |
|
192 | + // no really... don't send any notices in this request |
|
193 | + remove_all_filters('FHEE__EED_Messages___maybe_registration__deliver_notifications'); |
|
194 | + add_filter( |
|
195 | + 'FHEE__EED_Messages___maybe_registration__deliver_notifications', |
|
196 | + '__return_false', |
|
197 | + 15 |
|
198 | + ); |
|
199 | + } |
|
200 | + } |
|
201 | + if ($deliver_notifications) { |
|
202 | + // send out notifications |
|
203 | + add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_true', 10); |
|
204 | + } |
|
205 | + } |
|
206 | + } |
|
207 | + |
|
208 | + |
|
209 | + /** |
|
210 | + * check if transaction has a primary registrant and that it has a related Attendee object |
|
211 | + * |
|
212 | + * @return boolean |
|
213 | + * @throws \EE_Error |
|
214 | + */ |
|
215 | + protected function _validate_primary_registrant() |
|
216 | + { |
|
217 | + if (! $this->checkout->transaction_has_primary_registrant()) { |
|
218 | + EE_Error::add_error( |
|
219 | + __('A valid Primary Registration for this Transaction could not be found.', 'event_espresso'), |
|
220 | + __FILE__, |
|
221 | + __FUNCTION__, |
|
222 | + __LINE__ |
|
223 | + ); |
|
224 | + $this->checkout->redirect = false; |
|
225 | + $this->checkout->continue_reg = false; |
|
226 | + return false; |
|
227 | + } |
|
228 | + // setup URL for redirect |
|
229 | + $this->checkout->redirect_url = add_query_arg( |
|
230 | + array('e_reg_url_link' => $this->checkout->transaction->primary_registration()->reg_url_link()), |
|
231 | + $this->checkout->thank_you_page_url |
|
232 | + ); |
|
233 | + return true; |
|
234 | + } |
|
235 | + |
|
236 | + |
|
237 | + /** |
|
238 | + * @return void |
|
239 | + */ |
|
240 | + public function update_reg_step() |
|
241 | + { |
|
242 | + EE_Error::doing_it_wrong( |
|
243 | + __CLASS__ . '::' . __FILE__, |
|
244 | + __( |
|
245 | + 'Can not call update_reg_step() on the Finalize Registration reg step.', |
|
246 | + 'event_espresso' |
|
247 | + ), |
|
248 | + '4.6.0' |
|
249 | + ); |
|
250 | + } |
|
251 | 251 | } |
@@ -12,374 +12,374 @@ |
||
12 | 12 | */ |
13 | 13 | class EE_Attendee_Contact_List_Table extends EE_Admin_List_Table |
14 | 14 | { |
15 | - /** |
|
16 | - * Initial setup of data (called by parent). |
|
17 | - */ |
|
18 | - protected function _setup_data() |
|
19 | - { |
|
20 | - $this->_data = $this->_view !== 'trash' |
|
21 | - ? $this->_admin_page->get_attendees($this->_per_page) |
|
22 | - : $this->_admin_page->get_attendees($this->_per_page, false, true); |
|
23 | - $this->_all_data_count = $this->_view !== 'trash' |
|
24 | - ? $this->_admin_page->get_attendees($this->_per_page, true) |
|
25 | - : $this->_admin_page->get_attendees($this->_per_page, true, true); |
|
26 | - } |
|
27 | - |
|
28 | - |
|
29 | - /** |
|
30 | - * Initial setup of properties. |
|
31 | - */ |
|
32 | - protected function _set_properties() |
|
33 | - { |
|
34 | - $this->_wp_list_args = array( |
|
35 | - 'singular' => esc_html__('attendee', 'event_espresso'), |
|
36 | - 'plural' => esc_html__('attendees', 'event_espresso'), |
|
37 | - 'ajax' => true, |
|
38 | - 'screen' => $this->_admin_page->get_current_screen()->id, |
|
39 | - ); |
|
40 | - |
|
41 | - $this->_columns = array( |
|
42 | - 'cb' => '<input type="checkbox" />', // Render a checkbox instead of text |
|
43 | - 'ATT_ID' => esc_html__('ID', 'event_espresso'), |
|
44 | - 'ATT_fname' => esc_html__('First Name', 'event_espresso'), |
|
45 | - 'ATT_lname' => esc_html__('Last Name', 'event_espresso'), |
|
46 | - 'ATT_email' => esc_html__('Email Address', 'event_espresso'), |
|
47 | - 'Registration_Count' => esc_html__('# Registrations', 'event_espresso'), |
|
48 | - 'ATT_phone' => esc_html__('Phone', 'event_espresso'), |
|
49 | - 'ATT_address' => esc_html__('Address', 'event_espresso'), |
|
50 | - 'ATT_city' => esc_html__('City', 'event_espresso'), |
|
51 | - 'STA_ID' => esc_html__('State/Province', 'event_espresso'), |
|
52 | - 'CNT_ISO' => esc_html__('Country', 'event_espresso'), |
|
53 | - ); |
|
54 | - |
|
55 | - $this->_sortable_columns = array( |
|
56 | - 'ATT_ID' => array('ATT_ID' => false), |
|
57 | - 'ATT_lname' => array('ATT_lname' => true), // true means its already sorted |
|
58 | - 'ATT_fname' => array('ATT_fname' => false), |
|
59 | - 'ATT_email' => array('ATT_email' => false), |
|
60 | - 'Registration_Count' => array('Registration_Count' => false), |
|
61 | - 'ATT_city' => array('ATT_city' => false), |
|
62 | - 'STA_ID' => array('STA_ID' => false), |
|
63 | - 'CNT_ISO' => array('CNT_ISO' => false), |
|
64 | - ); |
|
65 | - |
|
66 | - $this->_hidden_columns = array( |
|
67 | - 'ATT_phone', |
|
68 | - 'ATT_address', |
|
69 | - 'ATT_city', |
|
70 | - 'STA_ID', |
|
71 | - 'CNT_ISO', |
|
72 | - ); |
|
73 | - } |
|
74 | - |
|
75 | - |
|
76 | - /** |
|
77 | - * Initial setup of filters |
|
78 | - * |
|
79 | - * @return array |
|
80 | - */ |
|
81 | - protected function _get_table_filters() |
|
82 | - { |
|
83 | - return array(); |
|
84 | - } |
|
85 | - |
|
86 | - |
|
87 | - /** |
|
88 | - * Initial setup of counts for views |
|
89 | - * |
|
90 | - * @throws InvalidArgumentException |
|
91 | - * @throws InvalidDataTypeException |
|
92 | - * @throws InvalidInterfaceException |
|
93 | - */ |
|
94 | - protected function _add_view_counts() |
|
95 | - { |
|
96 | - $this->_views['in_use']['count'] = $this->_admin_page->get_attendees($this->_per_page, true); |
|
97 | - if (EE_Registry::instance()->CAP->current_user_can( |
|
98 | - 'ee_delete_contacts', |
|
99 | - 'espresso_registrations_delete_registration' |
|
100 | - )) { |
|
101 | - $this->_views['trash']['count'] = $this->_admin_page->get_attendees($this->_per_page, true, true); |
|
102 | - } |
|
103 | - } |
|
104 | - |
|
105 | - |
|
106 | - /** |
|
107 | - * Get count of attendees. |
|
108 | - * |
|
109 | - * @return int |
|
110 | - * @throws EE_Error |
|
111 | - * @throws InvalidArgumentException |
|
112 | - * @throws InvalidDataTypeException |
|
113 | - * @throws InvalidInterfaceException |
|
114 | - */ |
|
115 | - protected function _get_attendees_count() |
|
116 | - { |
|
117 | - return EEM_Attendee::instance()->count(); |
|
118 | - } |
|
119 | - |
|
120 | - |
|
121 | - /** |
|
122 | - * Checkbox column |
|
123 | - * |
|
124 | - * @param EE_Attendee $attendee Unable to typehint this method because overrides parent. |
|
125 | - * @return string |
|
126 | - * @throws EE_Error |
|
127 | - */ |
|
128 | - public function column_cb($attendee) |
|
129 | - { |
|
130 | - if (! $attendee instanceof EE_Attendee) { |
|
131 | - return ''; |
|
132 | - } |
|
133 | - return sprintf( |
|
134 | - '<input type="checkbox" name="checkbox[%1$s]" value="%1$s" />', |
|
135 | - $attendee->ID() |
|
136 | - ); |
|
137 | - } |
|
138 | - |
|
139 | - |
|
140 | - /** |
|
141 | - * ATT_ID column |
|
142 | - * |
|
143 | - * @param EE_Attendee $attendee |
|
144 | - * @return string |
|
145 | - * @throws EE_Error |
|
146 | - */ |
|
147 | - public function column_ATT_ID(EE_Attendee $attendee) |
|
148 | - { |
|
149 | - $content = $attendee->ID(); |
|
150 | - $attendee_name = $attendee instanceof EE_Attendee ? $attendee->full_name() : ''; |
|
151 | - $content .= ' <span class="show-on-mobile-view-only">' . $attendee_name . '</span>'; |
|
152 | - return $content; |
|
153 | - } |
|
154 | - |
|
155 | - |
|
156 | - /** |
|
157 | - * ATT_lname column |
|
158 | - * |
|
159 | - * @param EE_Attendee $attendee |
|
160 | - * @return string |
|
161 | - * @throws InvalidArgumentException |
|
162 | - * @throws InvalidDataTypeException |
|
163 | - * @throws InvalidInterfaceException |
|
164 | - * @throws EE_Error |
|
165 | - */ |
|
166 | - public function column_ATT_lname(EE_Attendee $attendee) |
|
167 | - { |
|
168 | - // edit attendee link |
|
169 | - $edit_lnk_url = EE_Admin_Page::add_query_args_and_nonce( |
|
170 | - array( |
|
171 | - 'action' => 'edit_attendee', |
|
172 | - 'post' => $attendee->ID(), |
|
173 | - ), |
|
174 | - REG_ADMIN_URL |
|
175 | - ); |
|
176 | - $name_link = EE_Registry::instance()->CAP->current_user_can( |
|
177 | - 'ee_edit_contacts', |
|
178 | - 'espresso_registrations_edit_attendee' |
|
179 | - ) |
|
180 | - ? '<a href="' . $edit_lnk_url . '" title="' |
|
181 | - . esc_attr__('Edit Contact', 'event_espresso') . '">' |
|
182 | - . $attendee->lname() . '</a>' |
|
183 | - : $attendee->lname(); |
|
184 | - return $name_link; |
|
185 | - } |
|
186 | - |
|
187 | - |
|
188 | - /** |
|
189 | - * ATT_fname column |
|
190 | - * |
|
191 | - * @param EE_Attendee $attendee |
|
192 | - * @return string |
|
193 | - * @throws InvalidArgumentException |
|
194 | - * @throws InvalidDataTypeException |
|
195 | - * @throws InvalidInterfaceException |
|
196 | - * @throws EE_Error |
|
197 | - */ |
|
198 | - public function column_ATT_fname(EE_Attendee $attendee) |
|
199 | - { |
|
200 | - // Build row actions |
|
201 | - $actions = array(); |
|
202 | - // edit attendee link |
|
203 | - if (EE_Registry::instance()->CAP->current_user_can( |
|
204 | - 'ee_edit_contacts', |
|
205 | - 'espresso_registrations_edit_attendee' |
|
206 | - )) { |
|
207 | - $edit_lnk_url = EE_Admin_Page::add_query_args_and_nonce( |
|
208 | - array( |
|
209 | - 'action' => 'edit_attendee', |
|
210 | - 'post' => $attendee->ID(), |
|
211 | - ), |
|
212 | - REG_ADMIN_URL |
|
213 | - ); |
|
214 | - $actions['edit'] = '<a href="' . $edit_lnk_url . '" title="' |
|
215 | - . esc_attr__('Edit Contact', 'event_espresso') . '">' |
|
216 | - . esc_html__('Edit', 'event_espresso') . '</a>'; |
|
217 | - } |
|
218 | - |
|
219 | - if ($this->_view === 'in_use') { |
|
220 | - // trash attendee link |
|
221 | - if (EE_Registry::instance()->CAP->current_user_can( |
|
222 | - 'ee_delete_contacts', |
|
223 | - 'espresso_registrations_trash_attendees' |
|
224 | - )) { |
|
225 | - $trash_lnk_url = EE_Admin_Page::add_query_args_and_nonce( |
|
226 | - array( |
|
227 | - 'action' => 'trash_attendee', |
|
228 | - 'ATT_ID' => $attendee->ID(), |
|
229 | - ), |
|
230 | - REG_ADMIN_URL |
|
231 | - ); |
|
232 | - $actions['trash'] = '<a href="' . $trash_lnk_url . '" title="' |
|
233 | - . esc_attr__('Move Contact to Trash', 'event_espresso') |
|
234 | - . '">' . esc_html__('Trash', 'event_espresso') . '</a>'; |
|
235 | - } |
|
236 | - } else { |
|
237 | - if (EE_Registry::instance()->CAP->current_user_can( |
|
238 | - 'ee_delete_contacts', |
|
239 | - 'espresso_registrations_restore_attendees' |
|
240 | - )) { |
|
241 | - // restore attendee link |
|
242 | - $restore_lnk_url = EE_Admin_Page::add_query_args_and_nonce( |
|
243 | - array( |
|
244 | - 'action' => 'restore_attendees', |
|
245 | - 'ATT_ID' => $attendee->ID(), |
|
246 | - ), |
|
247 | - REG_ADMIN_URL |
|
248 | - ); |
|
249 | - $actions['restore'] = '<a href="' . $restore_lnk_url . '" title="' |
|
250 | - . esc_attr__('Restore Contact', 'event_espresso') . '">' |
|
251 | - . esc_html__('Restore', 'event_espresso') . '</a>'; |
|
252 | - } |
|
253 | - } |
|
254 | - |
|
255 | - $edit_lnk_url = EE_Admin_Page::add_query_args_and_nonce( |
|
256 | - array( |
|
257 | - 'action' => 'edit_attendee', |
|
258 | - 'post' => $attendee->ID(), |
|
259 | - ), |
|
260 | - REG_ADMIN_URL |
|
261 | - ); |
|
262 | - $name_link = EE_Registry::instance()->CAP->current_user_can( |
|
263 | - 'ee_edit_contacts', |
|
264 | - 'espresso_registrations_edit_attendee' |
|
265 | - ) |
|
266 | - ? '<a href="' . $edit_lnk_url . '" title="' |
|
267 | - . esc_attr__('Edit Contact', 'event_espresso') . '">' . $attendee->fname() . '</a>' |
|
268 | - : $attendee->fname(); |
|
269 | - |
|
270 | - // Return the name contents |
|
271 | - return sprintf('%1$s %2$s', $name_link, $this->row_actions($actions)); |
|
272 | - } |
|
273 | - |
|
274 | - |
|
275 | - /** |
|
276 | - * Email Column |
|
277 | - * |
|
278 | - * @param EE_Attendee $attendee |
|
279 | - * @return string |
|
280 | - * @throws EE_Error |
|
281 | - */ |
|
282 | - public function column_ATT_email(EE_Attendee $attendee) |
|
283 | - { |
|
284 | - return '<a href="mailto:' . $attendee->email() . '">' . $attendee->email() . '</a>'; |
|
285 | - } |
|
286 | - |
|
287 | - |
|
288 | - /** |
|
289 | - * Column displaying count of registrations attached to Attendee. |
|
290 | - * |
|
291 | - * @param EE_Attendee $attendee |
|
292 | - * @return string |
|
293 | - * @throws EE_Error |
|
294 | - */ |
|
295 | - public function column_Registration_Count(EE_Attendee $attendee) |
|
296 | - { |
|
297 | - $link = EEH_URL::add_query_args_and_nonce( |
|
298 | - array( |
|
299 | - 'action' => 'default', |
|
300 | - 'ATT_ID' => $attendee->ID(), |
|
301 | - ), |
|
302 | - REG_ADMIN_URL |
|
303 | - ); |
|
304 | - return '<a href="' . $link . '">' . $attendee->getCustomSelect('Registration_Count') . '</a>'; |
|
305 | - } |
|
306 | - |
|
307 | - |
|
308 | - /** |
|
309 | - * ATT_address column |
|
310 | - * |
|
311 | - * @param EE_Attendee $attendee |
|
312 | - * @return mixed |
|
313 | - * @throws EE_Error |
|
314 | - */ |
|
315 | - public function column_ATT_address(EE_Attendee $attendee) |
|
316 | - { |
|
317 | - return $attendee->address(); |
|
318 | - } |
|
319 | - |
|
320 | - |
|
321 | - /** |
|
322 | - * ATT_city column |
|
323 | - * |
|
324 | - * @param EE_Attendee $attendee |
|
325 | - * @return mixed |
|
326 | - * @throws EE_Error |
|
327 | - */ |
|
328 | - public function column_ATT_city(EE_Attendee $attendee) |
|
329 | - { |
|
330 | - return $attendee->city(); |
|
331 | - } |
|
332 | - |
|
333 | - |
|
334 | - /** |
|
335 | - * State Column |
|
336 | - * |
|
337 | - * @param EE_Attendee $attendee |
|
338 | - * @return string |
|
339 | - * @throws EE_Error |
|
340 | - * @throws InvalidArgumentException |
|
341 | - * @throws InvalidDataTypeException |
|
342 | - * @throws InvalidInterfaceException |
|
343 | - */ |
|
344 | - public function column_STA_ID(EE_Attendee $attendee) |
|
345 | - { |
|
346 | - $states = EEM_State::instance()->get_all_states(); |
|
347 | - $state = isset($states[ $attendee->state_ID() ]) |
|
348 | - ? $states[ $attendee->state_ID() ]->get('STA_name') |
|
349 | - : $attendee->state_ID(); |
|
350 | - return ! is_numeric($state) ? $state : ''; |
|
351 | - } |
|
352 | - |
|
353 | - |
|
354 | - /** |
|
355 | - * Country Column |
|
356 | - * |
|
357 | - * @param EE_Attendee $attendee |
|
358 | - * @return string |
|
359 | - * @throws EE_Error |
|
360 | - * @throws InvalidArgumentException |
|
361 | - * @throws InvalidDataTypeException |
|
362 | - * @throws InvalidInterfaceException |
|
363 | - */ |
|
364 | - public function column_CNT_ISO(EE_Attendee $attendee) |
|
365 | - { |
|
366 | - $countries = EEM_Country::instance()->get_all_countries(); |
|
367 | - $country = isset($countries[ $attendee->country_ID() ]) |
|
368 | - ? $countries[ $attendee->country_ID() ]->get('CNT_name') |
|
369 | - : $attendee->country_ID(); |
|
370 | - return ! is_numeric($country) ? $country : ''; |
|
371 | - } |
|
372 | - |
|
373 | - |
|
374 | - /** |
|
375 | - * Phone Number column |
|
376 | - * |
|
377 | - * @param EE_Attendee $attendee |
|
378 | - * @return mixed |
|
379 | - * @throws EE_Error |
|
380 | - */ |
|
381 | - public function column_ATT_phone(EE_Attendee $attendee) |
|
382 | - { |
|
383 | - return $attendee->phone(); |
|
384 | - } |
|
15 | + /** |
|
16 | + * Initial setup of data (called by parent). |
|
17 | + */ |
|
18 | + protected function _setup_data() |
|
19 | + { |
|
20 | + $this->_data = $this->_view !== 'trash' |
|
21 | + ? $this->_admin_page->get_attendees($this->_per_page) |
|
22 | + : $this->_admin_page->get_attendees($this->_per_page, false, true); |
|
23 | + $this->_all_data_count = $this->_view !== 'trash' |
|
24 | + ? $this->_admin_page->get_attendees($this->_per_page, true) |
|
25 | + : $this->_admin_page->get_attendees($this->_per_page, true, true); |
|
26 | + } |
|
27 | + |
|
28 | + |
|
29 | + /** |
|
30 | + * Initial setup of properties. |
|
31 | + */ |
|
32 | + protected function _set_properties() |
|
33 | + { |
|
34 | + $this->_wp_list_args = array( |
|
35 | + 'singular' => esc_html__('attendee', 'event_espresso'), |
|
36 | + 'plural' => esc_html__('attendees', 'event_espresso'), |
|
37 | + 'ajax' => true, |
|
38 | + 'screen' => $this->_admin_page->get_current_screen()->id, |
|
39 | + ); |
|
40 | + |
|
41 | + $this->_columns = array( |
|
42 | + 'cb' => '<input type="checkbox" />', // Render a checkbox instead of text |
|
43 | + 'ATT_ID' => esc_html__('ID', 'event_espresso'), |
|
44 | + 'ATT_fname' => esc_html__('First Name', 'event_espresso'), |
|
45 | + 'ATT_lname' => esc_html__('Last Name', 'event_espresso'), |
|
46 | + 'ATT_email' => esc_html__('Email Address', 'event_espresso'), |
|
47 | + 'Registration_Count' => esc_html__('# Registrations', 'event_espresso'), |
|
48 | + 'ATT_phone' => esc_html__('Phone', 'event_espresso'), |
|
49 | + 'ATT_address' => esc_html__('Address', 'event_espresso'), |
|
50 | + 'ATT_city' => esc_html__('City', 'event_espresso'), |
|
51 | + 'STA_ID' => esc_html__('State/Province', 'event_espresso'), |
|
52 | + 'CNT_ISO' => esc_html__('Country', 'event_espresso'), |
|
53 | + ); |
|
54 | + |
|
55 | + $this->_sortable_columns = array( |
|
56 | + 'ATT_ID' => array('ATT_ID' => false), |
|
57 | + 'ATT_lname' => array('ATT_lname' => true), // true means its already sorted |
|
58 | + 'ATT_fname' => array('ATT_fname' => false), |
|
59 | + 'ATT_email' => array('ATT_email' => false), |
|
60 | + 'Registration_Count' => array('Registration_Count' => false), |
|
61 | + 'ATT_city' => array('ATT_city' => false), |
|
62 | + 'STA_ID' => array('STA_ID' => false), |
|
63 | + 'CNT_ISO' => array('CNT_ISO' => false), |
|
64 | + ); |
|
65 | + |
|
66 | + $this->_hidden_columns = array( |
|
67 | + 'ATT_phone', |
|
68 | + 'ATT_address', |
|
69 | + 'ATT_city', |
|
70 | + 'STA_ID', |
|
71 | + 'CNT_ISO', |
|
72 | + ); |
|
73 | + } |
|
74 | + |
|
75 | + |
|
76 | + /** |
|
77 | + * Initial setup of filters |
|
78 | + * |
|
79 | + * @return array |
|
80 | + */ |
|
81 | + protected function _get_table_filters() |
|
82 | + { |
|
83 | + return array(); |
|
84 | + } |
|
85 | + |
|
86 | + |
|
87 | + /** |
|
88 | + * Initial setup of counts for views |
|
89 | + * |
|
90 | + * @throws InvalidArgumentException |
|
91 | + * @throws InvalidDataTypeException |
|
92 | + * @throws InvalidInterfaceException |
|
93 | + */ |
|
94 | + protected function _add_view_counts() |
|
95 | + { |
|
96 | + $this->_views['in_use']['count'] = $this->_admin_page->get_attendees($this->_per_page, true); |
|
97 | + if (EE_Registry::instance()->CAP->current_user_can( |
|
98 | + 'ee_delete_contacts', |
|
99 | + 'espresso_registrations_delete_registration' |
|
100 | + )) { |
|
101 | + $this->_views['trash']['count'] = $this->_admin_page->get_attendees($this->_per_page, true, true); |
|
102 | + } |
|
103 | + } |
|
104 | + |
|
105 | + |
|
106 | + /** |
|
107 | + * Get count of attendees. |
|
108 | + * |
|
109 | + * @return int |
|
110 | + * @throws EE_Error |
|
111 | + * @throws InvalidArgumentException |
|
112 | + * @throws InvalidDataTypeException |
|
113 | + * @throws InvalidInterfaceException |
|
114 | + */ |
|
115 | + protected function _get_attendees_count() |
|
116 | + { |
|
117 | + return EEM_Attendee::instance()->count(); |
|
118 | + } |
|
119 | + |
|
120 | + |
|
121 | + /** |
|
122 | + * Checkbox column |
|
123 | + * |
|
124 | + * @param EE_Attendee $attendee Unable to typehint this method because overrides parent. |
|
125 | + * @return string |
|
126 | + * @throws EE_Error |
|
127 | + */ |
|
128 | + public function column_cb($attendee) |
|
129 | + { |
|
130 | + if (! $attendee instanceof EE_Attendee) { |
|
131 | + return ''; |
|
132 | + } |
|
133 | + return sprintf( |
|
134 | + '<input type="checkbox" name="checkbox[%1$s]" value="%1$s" />', |
|
135 | + $attendee->ID() |
|
136 | + ); |
|
137 | + } |
|
138 | + |
|
139 | + |
|
140 | + /** |
|
141 | + * ATT_ID column |
|
142 | + * |
|
143 | + * @param EE_Attendee $attendee |
|
144 | + * @return string |
|
145 | + * @throws EE_Error |
|
146 | + */ |
|
147 | + public function column_ATT_ID(EE_Attendee $attendee) |
|
148 | + { |
|
149 | + $content = $attendee->ID(); |
|
150 | + $attendee_name = $attendee instanceof EE_Attendee ? $attendee->full_name() : ''; |
|
151 | + $content .= ' <span class="show-on-mobile-view-only">' . $attendee_name . '</span>'; |
|
152 | + return $content; |
|
153 | + } |
|
154 | + |
|
155 | + |
|
156 | + /** |
|
157 | + * ATT_lname column |
|
158 | + * |
|
159 | + * @param EE_Attendee $attendee |
|
160 | + * @return string |
|
161 | + * @throws InvalidArgumentException |
|
162 | + * @throws InvalidDataTypeException |
|
163 | + * @throws InvalidInterfaceException |
|
164 | + * @throws EE_Error |
|
165 | + */ |
|
166 | + public function column_ATT_lname(EE_Attendee $attendee) |
|
167 | + { |
|
168 | + // edit attendee link |
|
169 | + $edit_lnk_url = EE_Admin_Page::add_query_args_and_nonce( |
|
170 | + array( |
|
171 | + 'action' => 'edit_attendee', |
|
172 | + 'post' => $attendee->ID(), |
|
173 | + ), |
|
174 | + REG_ADMIN_URL |
|
175 | + ); |
|
176 | + $name_link = EE_Registry::instance()->CAP->current_user_can( |
|
177 | + 'ee_edit_contacts', |
|
178 | + 'espresso_registrations_edit_attendee' |
|
179 | + ) |
|
180 | + ? '<a href="' . $edit_lnk_url . '" title="' |
|
181 | + . esc_attr__('Edit Contact', 'event_espresso') . '">' |
|
182 | + . $attendee->lname() . '</a>' |
|
183 | + : $attendee->lname(); |
|
184 | + return $name_link; |
|
185 | + } |
|
186 | + |
|
187 | + |
|
188 | + /** |
|
189 | + * ATT_fname column |
|
190 | + * |
|
191 | + * @param EE_Attendee $attendee |
|
192 | + * @return string |
|
193 | + * @throws InvalidArgumentException |
|
194 | + * @throws InvalidDataTypeException |
|
195 | + * @throws InvalidInterfaceException |
|
196 | + * @throws EE_Error |
|
197 | + */ |
|
198 | + public function column_ATT_fname(EE_Attendee $attendee) |
|
199 | + { |
|
200 | + // Build row actions |
|
201 | + $actions = array(); |
|
202 | + // edit attendee link |
|
203 | + if (EE_Registry::instance()->CAP->current_user_can( |
|
204 | + 'ee_edit_contacts', |
|
205 | + 'espresso_registrations_edit_attendee' |
|
206 | + )) { |
|
207 | + $edit_lnk_url = EE_Admin_Page::add_query_args_and_nonce( |
|
208 | + array( |
|
209 | + 'action' => 'edit_attendee', |
|
210 | + 'post' => $attendee->ID(), |
|
211 | + ), |
|
212 | + REG_ADMIN_URL |
|
213 | + ); |
|
214 | + $actions['edit'] = '<a href="' . $edit_lnk_url . '" title="' |
|
215 | + . esc_attr__('Edit Contact', 'event_espresso') . '">' |
|
216 | + . esc_html__('Edit', 'event_espresso') . '</a>'; |
|
217 | + } |
|
218 | + |
|
219 | + if ($this->_view === 'in_use') { |
|
220 | + // trash attendee link |
|
221 | + if (EE_Registry::instance()->CAP->current_user_can( |
|
222 | + 'ee_delete_contacts', |
|
223 | + 'espresso_registrations_trash_attendees' |
|
224 | + )) { |
|
225 | + $trash_lnk_url = EE_Admin_Page::add_query_args_and_nonce( |
|
226 | + array( |
|
227 | + 'action' => 'trash_attendee', |
|
228 | + 'ATT_ID' => $attendee->ID(), |
|
229 | + ), |
|
230 | + REG_ADMIN_URL |
|
231 | + ); |
|
232 | + $actions['trash'] = '<a href="' . $trash_lnk_url . '" title="' |
|
233 | + . esc_attr__('Move Contact to Trash', 'event_espresso') |
|
234 | + . '">' . esc_html__('Trash', 'event_espresso') . '</a>'; |
|
235 | + } |
|
236 | + } else { |
|
237 | + if (EE_Registry::instance()->CAP->current_user_can( |
|
238 | + 'ee_delete_contacts', |
|
239 | + 'espresso_registrations_restore_attendees' |
|
240 | + )) { |
|
241 | + // restore attendee link |
|
242 | + $restore_lnk_url = EE_Admin_Page::add_query_args_and_nonce( |
|
243 | + array( |
|
244 | + 'action' => 'restore_attendees', |
|
245 | + 'ATT_ID' => $attendee->ID(), |
|
246 | + ), |
|
247 | + REG_ADMIN_URL |
|
248 | + ); |
|
249 | + $actions['restore'] = '<a href="' . $restore_lnk_url . '" title="' |
|
250 | + . esc_attr__('Restore Contact', 'event_espresso') . '">' |
|
251 | + . esc_html__('Restore', 'event_espresso') . '</a>'; |
|
252 | + } |
|
253 | + } |
|
254 | + |
|
255 | + $edit_lnk_url = EE_Admin_Page::add_query_args_and_nonce( |
|
256 | + array( |
|
257 | + 'action' => 'edit_attendee', |
|
258 | + 'post' => $attendee->ID(), |
|
259 | + ), |
|
260 | + REG_ADMIN_URL |
|
261 | + ); |
|
262 | + $name_link = EE_Registry::instance()->CAP->current_user_can( |
|
263 | + 'ee_edit_contacts', |
|
264 | + 'espresso_registrations_edit_attendee' |
|
265 | + ) |
|
266 | + ? '<a href="' . $edit_lnk_url . '" title="' |
|
267 | + . esc_attr__('Edit Contact', 'event_espresso') . '">' . $attendee->fname() . '</a>' |
|
268 | + : $attendee->fname(); |
|
269 | + |
|
270 | + // Return the name contents |
|
271 | + return sprintf('%1$s %2$s', $name_link, $this->row_actions($actions)); |
|
272 | + } |
|
273 | + |
|
274 | + |
|
275 | + /** |
|
276 | + * Email Column |
|
277 | + * |
|
278 | + * @param EE_Attendee $attendee |
|
279 | + * @return string |
|
280 | + * @throws EE_Error |
|
281 | + */ |
|
282 | + public function column_ATT_email(EE_Attendee $attendee) |
|
283 | + { |
|
284 | + return '<a href="mailto:' . $attendee->email() . '">' . $attendee->email() . '</a>'; |
|
285 | + } |
|
286 | + |
|
287 | + |
|
288 | + /** |
|
289 | + * Column displaying count of registrations attached to Attendee. |
|
290 | + * |
|
291 | + * @param EE_Attendee $attendee |
|
292 | + * @return string |
|
293 | + * @throws EE_Error |
|
294 | + */ |
|
295 | + public function column_Registration_Count(EE_Attendee $attendee) |
|
296 | + { |
|
297 | + $link = EEH_URL::add_query_args_and_nonce( |
|
298 | + array( |
|
299 | + 'action' => 'default', |
|
300 | + 'ATT_ID' => $attendee->ID(), |
|
301 | + ), |
|
302 | + REG_ADMIN_URL |
|
303 | + ); |
|
304 | + return '<a href="' . $link . '">' . $attendee->getCustomSelect('Registration_Count') . '</a>'; |
|
305 | + } |
|
306 | + |
|
307 | + |
|
308 | + /** |
|
309 | + * ATT_address column |
|
310 | + * |
|
311 | + * @param EE_Attendee $attendee |
|
312 | + * @return mixed |
|
313 | + * @throws EE_Error |
|
314 | + */ |
|
315 | + public function column_ATT_address(EE_Attendee $attendee) |
|
316 | + { |
|
317 | + return $attendee->address(); |
|
318 | + } |
|
319 | + |
|
320 | + |
|
321 | + /** |
|
322 | + * ATT_city column |
|
323 | + * |
|
324 | + * @param EE_Attendee $attendee |
|
325 | + * @return mixed |
|
326 | + * @throws EE_Error |
|
327 | + */ |
|
328 | + public function column_ATT_city(EE_Attendee $attendee) |
|
329 | + { |
|
330 | + return $attendee->city(); |
|
331 | + } |
|
332 | + |
|
333 | + |
|
334 | + /** |
|
335 | + * State Column |
|
336 | + * |
|
337 | + * @param EE_Attendee $attendee |
|
338 | + * @return string |
|
339 | + * @throws EE_Error |
|
340 | + * @throws InvalidArgumentException |
|
341 | + * @throws InvalidDataTypeException |
|
342 | + * @throws InvalidInterfaceException |
|
343 | + */ |
|
344 | + public function column_STA_ID(EE_Attendee $attendee) |
|
345 | + { |
|
346 | + $states = EEM_State::instance()->get_all_states(); |
|
347 | + $state = isset($states[ $attendee->state_ID() ]) |
|
348 | + ? $states[ $attendee->state_ID() ]->get('STA_name') |
|
349 | + : $attendee->state_ID(); |
|
350 | + return ! is_numeric($state) ? $state : ''; |
|
351 | + } |
|
352 | + |
|
353 | + |
|
354 | + /** |
|
355 | + * Country Column |
|
356 | + * |
|
357 | + * @param EE_Attendee $attendee |
|
358 | + * @return string |
|
359 | + * @throws EE_Error |
|
360 | + * @throws InvalidArgumentException |
|
361 | + * @throws InvalidDataTypeException |
|
362 | + * @throws InvalidInterfaceException |
|
363 | + */ |
|
364 | + public function column_CNT_ISO(EE_Attendee $attendee) |
|
365 | + { |
|
366 | + $countries = EEM_Country::instance()->get_all_countries(); |
|
367 | + $country = isset($countries[ $attendee->country_ID() ]) |
|
368 | + ? $countries[ $attendee->country_ID() ]->get('CNT_name') |
|
369 | + : $attendee->country_ID(); |
|
370 | + return ! is_numeric($country) ? $country : ''; |
|
371 | + } |
|
372 | + |
|
373 | + |
|
374 | + /** |
|
375 | + * Phone Number column |
|
376 | + * |
|
377 | + * @param EE_Attendee $attendee |
|
378 | + * @return mixed |
|
379 | + * @throws EE_Error |
|
380 | + */ |
|
381 | + public function column_ATT_phone(EE_Attendee $attendee) |
|
382 | + { |
|
383 | + return $attendee->phone(); |
|
384 | + } |
|
385 | 385 | } |
@@ -127,7 +127,7 @@ discard block |
||
127 | 127 | */ |
128 | 128 | public function column_cb($attendee) |
129 | 129 | { |
130 | - if (! $attendee instanceof EE_Attendee) { |
|
130 | + if ( ! $attendee instanceof EE_Attendee) { |
|
131 | 131 | return ''; |
132 | 132 | } |
133 | 133 | return sprintf( |
@@ -148,7 +148,7 @@ discard block |
||
148 | 148 | { |
149 | 149 | $content = $attendee->ID(); |
150 | 150 | $attendee_name = $attendee instanceof EE_Attendee ? $attendee->full_name() : ''; |
151 | - $content .= ' <span class="show-on-mobile-view-only">' . $attendee_name . '</span>'; |
|
151 | + $content .= ' <span class="show-on-mobile-view-only">'.$attendee_name.'</span>'; |
|
152 | 152 | return $content; |
153 | 153 | } |
154 | 154 | |
@@ -177,9 +177,9 @@ discard block |
||
177 | 177 | 'ee_edit_contacts', |
178 | 178 | 'espresso_registrations_edit_attendee' |
179 | 179 | ) |
180 | - ? '<a href="' . $edit_lnk_url . '" title="' |
|
181 | - . esc_attr__('Edit Contact', 'event_espresso') . '">' |
|
182 | - . $attendee->lname() . '</a>' |
|
180 | + ? '<a href="'.$edit_lnk_url.'" title="' |
|
181 | + . esc_attr__('Edit Contact', 'event_espresso').'">' |
|
182 | + . $attendee->lname().'</a>' |
|
183 | 183 | : $attendee->lname(); |
184 | 184 | return $name_link; |
185 | 185 | } |
@@ -211,9 +211,9 @@ discard block |
||
211 | 211 | ), |
212 | 212 | REG_ADMIN_URL |
213 | 213 | ); |
214 | - $actions['edit'] = '<a href="' . $edit_lnk_url . '" title="' |
|
215 | - . esc_attr__('Edit Contact', 'event_espresso') . '">' |
|
216 | - . esc_html__('Edit', 'event_espresso') . '</a>'; |
|
214 | + $actions['edit'] = '<a href="'.$edit_lnk_url.'" title="' |
|
215 | + . esc_attr__('Edit Contact', 'event_espresso').'">' |
|
216 | + . esc_html__('Edit', 'event_espresso').'</a>'; |
|
217 | 217 | } |
218 | 218 | |
219 | 219 | if ($this->_view === 'in_use') { |
@@ -229,9 +229,9 @@ discard block |
||
229 | 229 | ), |
230 | 230 | REG_ADMIN_URL |
231 | 231 | ); |
232 | - $actions['trash'] = '<a href="' . $trash_lnk_url . '" title="' |
|
232 | + $actions['trash'] = '<a href="'.$trash_lnk_url.'" title="' |
|
233 | 233 | . esc_attr__('Move Contact to Trash', 'event_espresso') |
234 | - . '">' . esc_html__('Trash', 'event_espresso') . '</a>'; |
|
234 | + . '">'.esc_html__('Trash', 'event_espresso').'</a>'; |
|
235 | 235 | } |
236 | 236 | } else { |
237 | 237 | if (EE_Registry::instance()->CAP->current_user_can( |
@@ -246,9 +246,9 @@ discard block |
||
246 | 246 | ), |
247 | 247 | REG_ADMIN_URL |
248 | 248 | ); |
249 | - $actions['restore'] = '<a href="' . $restore_lnk_url . '" title="' |
|
250 | - . esc_attr__('Restore Contact', 'event_espresso') . '">' |
|
251 | - . esc_html__('Restore', 'event_espresso') . '</a>'; |
|
249 | + $actions['restore'] = '<a href="'.$restore_lnk_url.'" title="' |
|
250 | + . esc_attr__('Restore Contact', 'event_espresso').'">' |
|
251 | + . esc_html__('Restore', 'event_espresso').'</a>'; |
|
252 | 252 | } |
253 | 253 | } |
254 | 254 | |
@@ -263,8 +263,8 @@ discard block |
||
263 | 263 | 'ee_edit_contacts', |
264 | 264 | 'espresso_registrations_edit_attendee' |
265 | 265 | ) |
266 | - ? '<a href="' . $edit_lnk_url . '" title="' |
|
267 | - . esc_attr__('Edit Contact', 'event_espresso') . '">' . $attendee->fname() . '</a>' |
|
266 | + ? '<a href="'.$edit_lnk_url.'" title="' |
|
267 | + . esc_attr__('Edit Contact', 'event_espresso').'">'.$attendee->fname().'</a>' |
|
268 | 268 | : $attendee->fname(); |
269 | 269 | |
270 | 270 | // Return the name contents |
@@ -281,7 +281,7 @@ discard block |
||
281 | 281 | */ |
282 | 282 | public function column_ATT_email(EE_Attendee $attendee) |
283 | 283 | { |
284 | - return '<a href="mailto:' . $attendee->email() . '">' . $attendee->email() . '</a>'; |
|
284 | + return '<a href="mailto:'.$attendee->email().'">'.$attendee->email().'</a>'; |
|
285 | 285 | } |
286 | 286 | |
287 | 287 | |
@@ -301,7 +301,7 @@ discard block |
||
301 | 301 | ), |
302 | 302 | REG_ADMIN_URL |
303 | 303 | ); |
304 | - return '<a href="' . $link . '">' . $attendee->getCustomSelect('Registration_Count') . '</a>'; |
|
304 | + return '<a href="'.$link.'">'.$attendee->getCustomSelect('Registration_Count').'</a>'; |
|
305 | 305 | } |
306 | 306 | |
307 | 307 | |
@@ -344,8 +344,8 @@ discard block |
||
344 | 344 | public function column_STA_ID(EE_Attendee $attendee) |
345 | 345 | { |
346 | 346 | $states = EEM_State::instance()->get_all_states(); |
347 | - $state = isset($states[ $attendee->state_ID() ]) |
|
348 | - ? $states[ $attendee->state_ID() ]->get('STA_name') |
|
347 | + $state = isset($states[$attendee->state_ID()]) |
|
348 | + ? $states[$attendee->state_ID()]->get('STA_name') |
|
349 | 349 | : $attendee->state_ID(); |
350 | 350 | return ! is_numeric($state) ? $state : ''; |
351 | 351 | } |
@@ -364,8 +364,8 @@ discard block |
||
364 | 364 | public function column_CNT_ISO(EE_Attendee $attendee) |
365 | 365 | { |
366 | 366 | $countries = EEM_Country::instance()->get_all_countries(); |
367 | - $country = isset($countries[ $attendee->country_ID() ]) |
|
368 | - ? $countries[ $attendee->country_ID() ]->get('CNT_name') |
|
367 | + $country = isset($countries[$attendee->country_ID()]) |
|
368 | + ? $countries[$attendee->country_ID()]->get('CNT_name') |
|
369 | 369 | : $attendee->country_ID(); |
370 | 370 | return ! is_numeric($country) ? $country : ''; |
371 | 371 | } |