/**
  * 	init
  *
  *  @access 	public
  *  @return 	void
  */
 public function init()
 {
     $this->_get_reg_url_link();
     if (!$this->get_txn()) {
         EE_Registry::instance()->load_helper('HTML');
         echo EEH_HTML::div(EEH_HTML::h4(__('We\'re sorry...', 'event_espresso'), '', '') . sprintf(__('This is a system page for displaying transaction information after a purchase.%1$sYou are most likely seeing this notice because you have navigated to this page%1$sthrough some means other than completing a transaction.%1$sSorry for the disappointment, but you will most likely find nothing of interest here.%1$s%1$s', 'event_espresso'), '<br/>'), '', 'ee-attention');
         return NULL;
     }
     // if we've made it to the Thank You page, then let's toggle any "Failed" transactions to "Incomplete"
     if ($this->_current_txn->status_ID() == EEM_Transaction::failed_status_code) {
         $this->_current_txn->set_status(EEM_Transaction::incomplete_status_code);
         $this->_current_txn->save();
     }
     $this->_primary_registrant = $this->_current_txn->primary_registration() instanceof EE_Registration ? $this->_current_txn->primary_registration() : NULL;
     $this->_is_primary = $this->_primary_registrant->reg_url_link() == $this->_reg_url_link ? TRUE : FALSE;
     $show_try_pay_again_link_default = apply_filters('AFEE__EES_Espresso_Thank_You__init__show_try_pay_again_link_default', TRUE);
     // txn status ?
     if ($this->_current_txn->is_completed()) {
         $this->_show_try_pay_again_link = $show_try_pay_again_link_default;
     } else {
         if ($this->_current_txn->is_incomplete() && ($this->_primary_registrant->is_approved() || $this->_primary_registrant->is_pending_payment())) {
             $this->_show_try_pay_again_link = TRUE;
         } else {
             if ($this->_primary_registrant->is_approved() || $this->_primary_registrant->is_pending_payment()) {
                 // its pending
                 $this->_show_try_pay_again_link = isset(EE_Registry::instance()->CFG->registration->show_pending_payment_options) && EE_Registry::instance()->CFG->registration->show_pending_payment_options ? TRUE : $show_try_pay_again_link_default;
             } else {
                 $this->_show_try_pay_again_link = $show_try_pay_again_link_default;
             }
         }
     }
     $this->_payments_closed = !$this->_current_txn->payment_method() instanceof EE_Payment_Method ? TRUE : FALSE;
     if (!$this->_current_txn->payment_method() instanceof EE_Payment_Method || $this->_current_txn->payment_method() instanceof EE_Payment_Method && $this->_current_txn->payment_method()->is_off_line()) {
         $this->_is_offline_payment_method = true;
     } else {
         $this->_is_offline_payment_method = false;
     }
     // link to SPCO
     $revisit_spco_url = add_query_arg(array('ee' => '_register', 'revisit' => TRUE, 'e_reg_url_link' => $this->_reg_url_link), EE_Registry::instance()->CFG->core->reg_page_url());
     // link to SPCO payment_options
     $this->_SPCO_payment_options_url = $this->_primary_registrant instanceof EE_Registration ? $this->_primary_registrant->payment_overview_url() : add_query_arg(array('step' => 'payment_options'), $revisit_spco_url);
     // link to SPCO attendee_information
     $this->_SPCO_attendee_information_url = $this->_primary_registrant instanceof EE_Registration ? $this->_primary_registrant->edit_attendee_information_url() : FALSE;
     EE_Registry::instance()->load_helper('Template');
     EE_Registry::instance()->load_helper('Template_Validator');
     do_action('AHEE__EES_Espresso_Thank_You__init_end', $this->_current_txn);
     // set no cache headers and constants
     EE_System::do_not_cache();
 }
 /**
  * 	init
  *
  *  @access 	public
  *  @return 	void
  */
 public function init()
 {
     $this->_get_reg_url_link();
     if (!$this->get_txn()) {
         return NULL;
     }
     // if we've made it to the Thank You page, then let's toggle any "Failed" transactions to "Incomplete"
     if ($this->_current_txn->status_ID() == EEM_Transaction::failed_status_code) {
         $this->_current_txn->set_status(EEM_Transaction::incomplete_status_code);
         $this->_current_txn->save();
     }
     $this->_primary_registrant = $this->_current_txn->primary_registration() instanceof EE_Registration ? $this->_current_txn->primary_registration() : NULL;
     $this->_is_primary = $this->_primary_registrant->reg_url_link() == $this->_reg_url_link ? TRUE : FALSE;
     $show_try_pay_again_link_default = apply_filters('AFEE__EES_Espresso_Thank_You__init__show_try_pay_again_link_default', TRUE);
     // txn status ?
     if ($this->_current_txn->is_completed()) {
         $this->_show_try_pay_again_link = $show_try_pay_again_link_default;
     } else {
         if ($this->_current_txn->is_incomplete() && ($this->_primary_registrant->is_approved() || $this->_primary_registrant->is_pending_payment())) {
             $this->_show_try_pay_again_link = TRUE;
         } else {
             if ($this->_primary_registrant->is_approved() || $this->_primary_registrant->is_pending_payment()) {
                 // its pending
                 $this->_show_try_pay_again_link = isset(EE_Registry::instance()->CFG->registration->show_pending_payment_options) && EE_Registry::instance()->CFG->registration->show_pending_payment_options ? TRUE : $show_try_pay_again_link_default;
             } else {
                 $this->_show_try_pay_again_link = $show_try_pay_again_link_default;
             }
         }
     }
     $this->_payments_closed = !$this->_current_txn->payment_method() instanceof EE_Payment_Method ? TRUE : FALSE;
     if (!$this->_current_txn->payment_method() instanceof EE_Payment_Method || $this->_current_txn->payment_method() instanceof EE_Payment_Method && $this->_current_txn->payment_method()->is_off_line()) {
         $this->_is_offline_payment_method = true;
     } else {
         $this->_is_offline_payment_method = false;
     }
     // link to SPCO
     $revisit_spco_url = add_query_arg(array('ee' => '_register', 'revisit' => TRUE, 'e_reg_url_link' => $this->_reg_url_link), EE_Registry::instance()->CFG->core->reg_page_url());
     // link to SPCO payment_options
     $this->_SPCO_payment_options_url = $this->_primary_registrant instanceof EE_Registration ? $this->_primary_registrant->payment_overview_url() : add_query_arg(array('step' => 'payment_options'), $revisit_spco_url);
     // link to SPCO attendee_information
     $this->_SPCO_attendee_information_url = $this->_primary_registrant instanceof EE_Registration ? $this->_primary_registrant->edit_attendee_information_url() : FALSE;
     EE_Registry::instance()->load_helper('Template');
     EE_Registry::instance()->load_helper('Template_Validator');
     do_action('AHEE__EES_Espresso_Thank_You__init_end', $this->_current_txn);
     // set no cache headers and constants
     EE_System::do_not_cache();
 }
 /**
  * 	init
  *
  *  @access 	public
  *  @return 	void
  */
 public function init()
 {
     //get the transaction. yes, we may have just loaded it, but it may have been updated, or this may be via an ajax request
     $this->_current_txn = EE_Registry::instance()->load_model('Transaction')->get_transaction_from_reg_url_link($this->_reg_url_link);
     // verify TXN
     if (!$this->_current_txn instanceof EE_Transaction) {
         EE_Error::add_error(__('No transaction information could be retrieved or the transaction data is not of the correct type.', 'event_espresso'), __FILE__, __FUNCTION__, __LINE__);
         return;
     }
     // if we've made it to the Thank You page, then let's toggle any "Failed" transactions to "Incomplete"
     if ($this->_current_txn->status_ID() == EEM_Transaction::failed_status_code) {
         $this->_current_txn->set_status(EEM_Transaction::incomplete_status_code);
         $this->_current_txn->save();
     }
     $this->_primary_registrant = $this->_current_txn->primary_registration() instanceof EE_Registration ? $this->_current_txn->primary_registration() : NULL;
     $this->_is_primary = $this->_primary_registrant->reg_url_link() == $this->_reg_url_link ? TRUE : FALSE;
     // txn status ?
     if ($this->_current_txn->is_completed()) {
         $this->_show_try_pay_again_link = FALSE;
     } else {
         if ($this->_current_txn->is_incomplete() && ($this->_primary_registrant->is_approved() || $this->_primary_registrant->is_pending_payment())) {
             $this->_show_try_pay_again_link = TRUE;
         } else {
             if ($this->_primary_registrant->is_approved() || $this->_primary_registrant->is_pending_payment()) {
                 // its pending
                 $this->_show_try_pay_again_link = isset(EE_Registry::instance()->CFG->registration->show_pending_payment_options) && EE_Registry::instance()->CFG->registration->show_pending_payment_options ? TRUE : FALSE;
             } else {
                 $this->_show_try_pay_again_link = FALSE;
             }
         }
     }
     $this->_is_offline_payment_method = in_array($this->_current_txn->selected_gateway(TRUE), array('Bank', 'Check', 'Invoice'));
     if ($this->_current_txn->last_payment() instanceof EE_Payment && $this->_current_txn->last_payment()->gateway() != NULL) {
         $this->_is_offline_payment_method = in_array($this->_current_txn->last_payment()->gateway(), array('Bank', 'Check', 'Invoice'));
     }
     // link to SPCO
     $revisit_spco_url = add_query_arg(array('ee' => '_register', 'revisit' => TRUE, 'e_reg_url_link' => $this->_reg_url_link), EE_Registry::instance()->CFG->core->reg_page_url());
     // link to SPCO payment_options
     $this->_SPCO_payment_options_url = $this->_primary_registrant instanceof EE_Registration ? $this->_primary_registrant->payment_overview_url() : add_query_arg(array('step' => 'payment_options'), $revisit_spco_url);
     // link to SPCO attendee_information
     $this->_SPCO_attendee_information_url = $this->_primary_registrant instanceof EE_Registration ? $this->_primary_registrant->edit_attendee_information_url() : FALSE;
     EE_Registry::instance()->load_helper('Template');
     EE_Registry::instance()->load_helper('Template_Validator');
     do_action('AHEE__EES_Espresso_Thank_You__init_end', $this->_current_txn);
 }
 /**
  * 	_process_finalize_registration
  *
  * 	@access private
  * 	@return 	void
  */
 private function _process_finalize_registration()
 {
     do_action('AHEE_log', __FILE__, __FUNCTION__, '');
     // save everything
     if ($this->_continue_reg && $this->_save_all_registration_information()) {
         //			echo '<h2 style="color:#E76700;">_process_finalize_registration<br/><span style="font-size:9px;font-weight:normal;color:#666">' . __FILE__ . '</span>    <b style="font-size:10px;color:#333">  ' . __LINE__ . ' </b></h2>';
         // save TXN data to the cart
         $this->_cart->get_grand_total()->save_this_and_descendants_to_txn($this->_transaction->ID());
         do_action('AHEE__EE_Single_Page_Checkout__process_finalize_registration__before_gateway', $this->_transaction);
         // if Default REG Status is set to REQUIRES APPROVAL... then payments are NOT allowed
         if (EE_Registry::instance()->REQ->is_set('selected_gateway') && EE_Registry::instance()->REQ->get('selected_gateway') == 'payments_closed') {
             //				echo '<h2 style="color:#E76700;">payments_closed<br/><span style="font-size:9px;font-weight:normal;color:#666">' . __FILE__ . '</span>    <b style="font-size:10px;color:#333">  ' . __LINE__ . ' </b></h2>';
             // set TXN Status to Open
             $this->_transaction->set_status(EEM_Transaction::incomplete_status_code);
             $this->_transaction->save();
             $this->_transaction->finalize();
             $notices = EE_Error::get_notices(FALSE);
             $response = array('msg' => array('success' => isset($notices['success']) ? $notices['success'] : '', 'errors' => isset($notices['errors']) ? $notices['errors'] : ''));
             $this->_thank_you_page_url = add_query_arg(array('e_reg_url_link' => $this->_transaction->primary_registration()->reg_url_link()), get_permalink(EE_Registry::instance()->CFG->core->thank_you_page_id));
             // Default REG Status is set to PENDING PAYMENT OR APPROVED, and payments are allowed
         } else {
             // attempt to perform transaction via payment gateway
             $response = EE_Registry::instance()->load_model('Gateways')->process_payment_start($this->_cart->get_grand_total(), $this->_transaction);
             $this->_thank_you_page_url = $response['forward_url'];
         }
         if (isset($response['msg']['success'])) {
             $response_data = array('success' => $response['msg']['success'], 'return_data' => array('redirect-to-thank-you-page' => $this->_thank_you_page_url));
             $response_data = apply_filters('FHEE__EE_Single_Page_Checkout__JSON_response', $response_data);
             //				printr( $response_data, '$response_data  <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span>', 'auto' );
             //				echo '<h4>thank_you_page_url : ' . $this->_thank_you_page_url . '  <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span></h4>';
             if (EE_Registry::instance()->REQ->front_ajax) {
                 echo json_encode($response_data);
                 die;
             } else {
                 wp_safe_redirect($this->_thank_you_page_url);
                 exit;
             }
         } else {
             EE_Error::add_error($response['msg']['error'], __FILE__, __FUNCTION__, __LINE__);
         }
         //			printr( $response, '$response  <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span>', 'auto' );
     }
     $this->go_to_next_step(__FUNCTION__);
 }
 /**
  *    save_all_data
  *    simply loops through the current transaction and saves all data for each registration
  *
  * @access public
  * @param bool $show_errors
  * @return bool
  */
 public function save_all_data($show_errors = TRUE)
 {
     // verify the transaction
     if ($this->transaction instanceof EE_Transaction) {
         // save to ensure that TXN has ID
         $this->transaction->save();
         // grab the saved registrations from the transaction
         foreach ($this->transaction->registrations($this->reg_cache_where_params) as $registration) {
             $this->_save_registration($registration, $show_errors);
         }
     } else {
         if ($show_errors) {
             EE_Error::add_error(__('A valid Transaction was not found when attempting to save your registration information.', 'event_espresso'), __FILE__, __FUNCTION__, __LINE__);
         }
         return FALSE;
     }
     return TRUE;
 }
 /**
  * possibly toggles TXN status
  *
  * @param EE_Transaction $transaction
  * @param 	boolean $update_txn  	whether to save the TXN
  * @return 	boolean 	 	whether the TXN was saved
  * @throws \EE_Error
  */
 public function update_transaction_status_based_on_total_paid(EE_Transaction $transaction, $update_txn = TRUE)
 {
     // verify transaction
     if (!$transaction instanceof EE_Transaction) {
         EE_Error::add_error(__('Please provide a valid EE_Transaction object.', 'event_espresso'), __FILE__, __FUNCTION__, __LINE__);
         return FALSE;
     }
     // set incoming TXN_Status
     $this->set_old_txn_status($transaction->status_ID());
     // set transaction status based on comparison of TXN_paid vs TXN_total
     if (EEH_Money::compare_floats($transaction->paid(), $transaction->total(), '>')) {
         $new_txn_status = EEM_Transaction::overpaid_status_code;
     } else {
         if (EEH_Money::compare_floats($transaction->paid(), $transaction->total())) {
             $new_txn_status = EEM_Transaction::complete_status_code;
         } else {
             if (EEH_Money::compare_floats($transaction->paid(), $transaction->total(), '<')) {
                 $new_txn_status = EEM_Transaction::incomplete_status_code;
             } else {
                 EE_Error::add_error(__('The total paid calculation for this transaction is inaccurate.', 'event_espresso'), __FILE__, __FUNCTION__, __LINE__);
                 return FALSE;
             }
         }
     }
     if ($new_txn_status !== $transaction->status_ID()) {
         // set incoming TXN_Status
         $this->set_new_txn_status($new_txn_status);
         $transaction->set_status($new_txn_status);
         if ($update_txn) {
             return $transaction->save() ? TRUE : FALSE;
         }
     }
     return FALSE;
 }
 /**
  * Logic general to all gateways on the thank you page. Mostly just updates the transaction
  * @param EE_Transaction $transaction
  * @return boolean
  */
 public function thank_you_page_logic(EE_Transaction $transaction)
 {
     // save the transaction to the db in case anything changed
     $transaction->save();
     return true;
 }
 /**
  * set_reg_step_completed
  * given a valid reg step slug, this sets the TXN_reg_step completed status which is either:
  *
  *
  * @access private
  * @param \EE_Transaction $transaction
  * @param string          $reg_step_slug
  * @param boolean | int $status
  * @return boolean
  */
 private function _set_reg_step_completed_status(EE_Transaction $transaction, $reg_step_slug, $status)
 {
     // validate status
     $status = is_bool($status) || is_numeric($status) ? $status : false;
     // get reg steps array
     $txn_reg_steps = $transaction->reg_steps();
     // if reg step does NOT exist
     if (!isset($txn_reg_steps[$reg_step_slug])) {
         return false;
     }
     // if  we're trying to complete a step that is already completed
     if ($txn_reg_steps[$reg_step_slug] === true) {
         return true;
     }
     // if  we're trying to complete a step that hasn't even started
     if ($status === true && $txn_reg_steps[$reg_step_slug] === false) {
         return false;
     }
     // if current status value matches the incoming value (no change)
     if ($txn_reg_steps[$reg_step_slug] === $status) {
         // this will happen in cases where multiple AJAX requests occur during the same step
         return true;
     }
     // if we're trying to set a start time
     if (is_numeric($status) && is_numeric($txn_reg_steps[$reg_step_slug])) {
         // skip the update below, but don't return FALSE so that errors won't be displayed
         return true;
     }
     // update completed status
     $txn_reg_steps[$reg_step_slug] = $status;
     $transaction->set_reg_steps($txn_reg_steps);
     $transaction->save();
     // DEBUG LOG
     //$this->log(
     //	__CLASS__, __FUNCTION__, __LINE__,
     //	$transaction,
     //	array(
     //		'reg_step_slug' => $reg_step_slug,
     //		'status' => $status,
     //	)
     //);
     return true;
 }
 /**
  * Cleans the session so that it doesn't store the credit card or CVV to the DB
  * @param EE_Transaction $transaction to also update
  * @return void
  */
 protected function _clean_billing_info_in_session($transaction)
 {
     $session_data = EE_Registry::instance()->SSN->get_session_data();
     if (isset($session_data['billing_info']) && is_array($session_data['billing_info'])) {
         foreach ($session_data['billing_info'] as $name => $billing_input_array) {
             if ($billing_input_array['sanitize'] == 'ccard') {
                 $session_data['billing_info'][$name]['value'] = $this->MaskCreditCard($billing_input_array['value']);
             } elseif ($billing_input_array['sanitize'] == 'ccv') {
                 $session_data['billing_info'][$name]['value'] = '';
             }
         }
     }
     $success = EE_Registry::instance()->SSN->update($session_data);
     unset($session_data['transaction']);
     $transaction->set_txn_session_data($session_data);
     $transaction->save();
 }
 /**
  * This handles connecting a transaction to related items when the chained flag is true.
  *
  * @since 4.3.0
  *
  * @param EE_Transaction $transaction
  * @param array $args incoming arguments from caller for specifying overrides.
  *
  * @return EE_Transaction
  */
 private function _maybe_chained(EE_Transaction $transaction, $args)
 {
     if ($this->_chained) {
         if (empty($this->_status)) {
             $this->_set_repeated_relation($args, $transaction->ID());
         }
         //YES we DO want to set brand new relation objects because multiple transactions do not share the same related objects (for the purpose of tests at least)
         $this->_set_new_relations($args, $transaction->ID());
         //note relation to registration should already be set via the factory->registration_chained->create() method.
         //add relation to status
         $transaction->_add_relation_to($this->_status, 'Status');
         $transaction->save();
         return $transaction;
     }
     return $transaction;
 }
 /**
  *    toggle_failed_transaction_status
  * upgrades a TXNs status from failed to abandoned,
  * meaning that contact information has been captured for at least one registrant
  *
  * @access public
  * @param EE_Transaction $transaction
  * @return    boolean
  * @throws \EE_Error
  */
 public function toggle_failed_transaction_status(EE_Transaction $transaction)
 {
     $existing_txn_status = $transaction->status_ID();
     // set incoming TXN_Status
     $this->set_old_txn_status($existing_txn_status);
     // if TXN status is still set as "failed"...
     if ($existing_txn_status === EEM_Transaction::failed_status_code) {
         // set incoming TXN_Status
         $this->set_new_txn_status(EEM_Transaction::abandoned_status_code);
         $transaction->set_status(EEM_Transaction::abandoned_status_code);
         $transaction->save();
         return TRUE;
     }
     return FALSE;
 }