/**
  * run
  *
  * initial shortcode module setup called during "wp_loaded" hook
  * this method is primarily used for loading resources that will be required by the shortcode when it is actually processed
  *
  * @access public
  * @param  WP $WP
  * @return void
  * @throws \Exception
  * @throws \EE_Error
  */
 public function run(WP $WP)
 {
     $this->_current_txn = null;
     if (EE_Registry::instance()->REQ->is_set('e_reg_url_link')) {
         /** @var EEM_Transaction $EEM_Transaction */
         $EEM_Transaction = EE_Registry::instance()->load_model('Transaction');
         $this->_current_txn = $EEM_Transaction->get_transaction_from_reg_url_link();
     }
     if ($this->_current_txn instanceof EE_Transaction) {
         $payment_method = null;
         $payment_method_slug = EE_Registry::instance()->REQ->get('ee_payment_method', null);
         if ($payment_method_slug) {
             $payment_method = EEM_Payment_Method::instance()->get_one_by_slug($payment_method_slug);
         }
         if ($payment_method instanceof EE_Payment_Method && $payment_method->is_off_site()) {
             $gateway = $payment_method->type_obj()->get_gateway();
             if ($gateway instanceof EE_Offsite_Gateway && $gateway->handle_IPN_in_this_request(\EE_Registry::instance()->REQ->params(), true)) {
                 /** @type EE_Payment_Processor $payment_processor */
                 $payment_processor = EE_Registry::instance()->load_core('Payment_Processor');
                 $payment_processor->process_ipn($_REQUEST, $this->_current_txn, $payment_method);
             }
         }
         //allow gateways to add a filter to stop rendering the page
         if (apply_filters('FHEE__EES_Espresso_Txn_Page__run__exit', FALSE)) {
             exit;
         }
     }
 }
 /**
  * @group 7201
  */
 function test_get_one_by_slug()
 {
     $pm = $this->new_model_obj_with_dependencies('Payment_Method', array('PMD_type' => 'Invoice'));
     $this->assertNotEmpty($pm->ID());
     $this->assertEquals($pm, EEM_Payment_Method::instance()->get_one_by_ID($pm->ID()));
     $this->assertEquals($pm, EEM_Payment_Method::instance()->get_one_by_slug($pm->slug()));
 }
    /**
     * _get_table_filters
     * @return array
     */
    protected function _get_table_filters()
    {
        $filters = array();
        //todo we're currently using old functions here. We need to move things into the Events_Admin_Page() class as methods.
        EE_Registry::instance()->load_helper('Form_Fields');
        $payment_methods = EEM_Payment_Method::instance()->get_all();
        $payment_method_names = array(array('id' => 'all', 'text' => __("All", 'event_espresso')), array('id' => '0', 'text' => __("Unknown Payment Method", 'event_espresso')));
        foreach ($payment_methods as $payment_method) {
            $payment_method_names[] = array('id' => $payment_method->ID(), 'text' => $payment_method->admin_name());
        }
        $filters[] = EEH_Form_Fields::select_input('_payment_method', $payment_method_names, isset($this->_req_data['_payment_method']) ? $this->_req_data['_payment_method'] : 'all');
        $start_date = isset($this->_req_data['payment-filter-start-date']) ? wp_strip_all_tags($this->_req_data['payment-filter-start-date']) : date('m/d/Y', strtotime('-6 months'));
        $end_date = isset($this->_req_data['payment-filter-end-date']) ? wp_strip_all_tags($this->_req_data['payment-filter-end-date']) : date('m/d/Y');
        ob_start();
        ?>
		<label for="txn-filter-start-date"><?php 
        _e('Display Transactions from ', 'event_espresso');
        ?>
</label>
		<input id="payment-filter-start-date" class="datepicker" type="text" value="<?php 
        echo $start_date;
        ?>
" name="payment-filter-start-date" size="15"/>
		<label for="txn-filter-end-date"><?php 
        _e(' until ', 'event_espresso');
        ?>
</label>
		<input id="payment-filter-end-date" class="datepicker" type="text" value="<?php 
        echo $end_date;
        ?>
" name="payment-filter-end-date" size="15"/>
		<?php 
        $filters[] = ob_get_clean();
        return $filters;
    }
 public function __construct($url_link = 0)
 {
     if ($this->registration = EE_Registry::instance()->load_model('Registration')->get_registration_for_reg_url_link($url_link)) {
         $this->transaction = $this->registration->transaction();
         $payment_settings = EE_Config::instance()->gateway->payment_settings;
         //get_user_meta(EE_Registry::instance()->CFG->wp_user, 'payment_settings', TRUE);
         $this->invoice_payment_method = EEM_Payment_Method::instance()->get_one_of_type('Invoice');
     } else {
         EE_Error::add_error(__('Your request appears to be missing some required data, and no information for your transaction could be retrieved.', 'event_espresso'), __FILE__, __FUNCTION__, __LINE__);
     }
 }
    /**
     * Checks that there is at least one active gateway. If not, add a notice
     */
    public function check_payment_gateway_setup()
    {
        //ONLY do this check if models can query
        //and avoid a bug where when we nuke EE4's data that this causes a fatal error
        //because the tables are deleted just before this request runs. see https://events.codebasehq.com/projects/event-espresso/tickets/7539
        if (!EE_Maintenance_Mode::instance()->models_can_query() || !EEH_Activation::table_exists(EEM_Payment_Method::instance()->table())) {
            return;
        }
        // ensure Payment_Method model is loaded
        EE_Registry::instance()->load_model('Payment_Method');
        $actives = EEM_Payment_Method::instance()->count_active(EEM_Payment_Method::scope_cart);
        if ($actives < 1) {
            $url = EE_Admin_Page::add_query_args_and_nonce(array(), EE_PAYMENTS_ADMIN_URL);
            echo '<div class="error">
				 <p>' . sprintf(__("There are no Active Payment Methods setup for Event Espresso. Please %s activate at least one.%s", "event_espresso"), "<a href='{$url}'>", "</a>") . '</p>
			 </div>';
        }
    }
 /**
  *
  * @param array $options_array {
  *	@type string $extra_meta_inputs should be EE_Form_Section_Validatable[] which
  *		will be _subsections and will be saved as extra meta on the payment method object;
  *	@type EE_PMT_Base $payment_method_type the payment method type this form is for
  *	@see EE_Model_Form_Section::__construct() for more
  * }
  */
 public function __construct($options_array = array())
 {
     $this->_model = EEM_Payment_Method::instance();
     $this->_options_array = $options_array;
     if (isset($options_array['payment_method_type'])) {
         $this->_payment_method_type = $options_array['payment_method_type'];
     }
     $options_array = $this->_options_array;
     if (isset($options_array['extra_meta_inputs'])) {
         $this->_extra_meta_inputs = array_merge($this->_extra_meta_inputs, $options_array['extra_meta_inputs']);
     }
     if ($this->_extra_meta_inputs) {
         $this->_subsections = array_merge($this->_subsections, $this->_extra_meta_inputs);
     }
     $this->_subsections['PMD_button_url'] = new EE_Admin_File_Uploader_Input(array('html_label_text' => __('Button URL', 'event_espresso')));
     $this->_subsections['PMD_scope'] = new EE_Checkbox_Multi_Input(EEM_Payment_Method::instance()->scopes(), array('html_label_text' => $this->_model->field_settings_for('PMD_scope')->get_nicename() . EEH_Template::get_help_tab_link('payment_methods_overview')));
     //setup the currency options
     $this->_subsections['Currency'] = new EE_Select_Multi_Model_Input(EEM_Currency::instance()->get_all_currencies_usable_by($this->_payment_method_type), array('html_label_text' => __('Currencies Supported', 'event_espresso'), 'required' => TRUE));
     $this->_subsections['PMD_order'] = new EE_Text_Input(array('html_help_text' => __('Lowest numbers will be shown first', 'event_espresso'), 'normalization_strategy' => new EE_Int_Normalization(), 'validation_strategies' => array(new EE_Int_Validation_Strategy()), 'default' => 0));
     $this->_layout_strategy = new EE_Admin_Two_Column_Layout();
     parent::__construct($options_array);
 }
 /**
  * Process the IPN. Firstly, we'll hope we put the standard args into the IPN URL so
  * we can easily find what registration the IPN is for and what payment method.
  * However, if not, we'll give all payment methods a chance to claim it and process it.
  * If a payment is found for the IPN info, it is saved.
  *
  * @param array             $_req_data eg $_REQUEST
  * @param EE_Transaction|int $transaction          optional (or a transactions id)
  * @param EE_Payment_Method $payment_method       (or a slug or id of one)
  * @param boolean           $update_txn           whether or not to call
  *                                                EE_Transaction_Processor::update_transaction_and_registrations_after_checkout_or_payment()
  * @param bool              $separate_IPN_request whether the IPN uses a separate request ( true like PayPal )
  *                                                or is processed manually ( false like Mijireh )
  * @throws EE_Error
  * @throws Exception
  * @return EE_Payment
  */
 public function process_ipn($_req_data, $transaction = null, $payment_method = null, $update_txn = true, $separate_IPN_request = true)
 {
     EE_Registry::instance()->load_model('Change_Log');
     $_req_data = $this->_remove_unusable_characters_from_array((array) $_req_data);
     EE_Processor_Base::set_IPN($separate_IPN_request);
     $obj_for_log = null;
     if ($transaction instanceof EE_Transaction) {
         $obj_for_log = $transaction;
         if ($payment_method instanceof EE_Payment_Method) {
             $obj_for_log = EEM_Payment::instance()->get_one(array(array('TXN_ID' => $transaction->ID(), 'PMD_ID' => $payment_method->ID()), 'order_by' => array('PAY_timestamp' => 'desc')));
         }
     } else {
         if ($payment_method instanceof EE_Payment) {
             $obj_for_log = $payment_method;
         }
     }
     $log = EEM_Change_Log::instance()->log(EEM_Change_Log::type_gateway, array('IPN data received' => $_req_data), $obj_for_log);
     try {
         /**
          * @var EE_Payment $payment
          */
         $payment = NULL;
         if ($transaction && $payment_method) {
             /** @type EE_Transaction $transaction */
             $transaction = EEM_Transaction::instance()->ensure_is_obj($transaction);
             /** @type EE_Payment_Method $payment_method */
             $payment_method = EEM_Payment_Method::instance()->ensure_is_obj($payment_method);
             if ($payment_method->type_obj() instanceof EE_PMT_Base) {
                 $payment = $payment_method->type_obj()->handle_ipn($_req_data, $transaction);
                 $log->set_object($payment);
             } else {
                 // not a payment
                 EE_Error::add_error(sprintf(__('A valid payment method could not be determined due to a technical issue.%sPlease refresh your browser and try again or contact %s for assistance.', 'event_espresso'), '<br/>', EE_Registry::instance()->CFG->organization->get_pretty('email')), __FILE__, __FUNCTION__, __LINE__);
             }
         } else {
             //that's actually pretty ok. The IPN just wasn't able
             //to identify which transaction or payment method this was for
             // give all active payment methods a chance to claim it
             $active_payment_methods = EEM_Payment_Method::instance()->get_all_active();
             foreach ($active_payment_methods as $active_payment_method) {
                 try {
                     $payment = $active_payment_method->type_obj()->handle_unclaimed_ipn($_req_data);
                     $payment_method = $active_payment_method;
                     EEM_Change_Log::instance()->log(EEM_Change_Log::type_gateway, array('IPN data' => $_req_data), $payment);
                     break;
                 } catch (EE_Error $e) {
                     //that's fine- it apparently couldn't handle the IPN
                 }
             }
         }
         // 			EEM_Payment_Log::instance()->log("got to 7",$transaction,$payment_method);
         if ($payment instanceof EE_Payment) {
             $payment->save();
             //  update the TXN
             $this->update_txn_based_on_payment($transaction, $payment, $update_txn, $separate_IPN_request);
         } else {
             //we couldn't find the payment for this IPN... let's try and log at least SOMETHING
             if ($payment_method) {
                 EEM_Change_Log::instance()->log(EEM_Change_Log::type_gateway, array('IPN data' => $_req_data), $payment_method);
             } elseif ($transaction) {
                 EEM_Change_Log::instance()->log(EEM_Change_Log::type_gateway, array('IPN data' => $_req_data), $transaction);
             }
         }
         return $payment;
     } catch (EE_Error $e) {
         do_action('AHEE__log', __FILE__, __FUNCTION__, sprintf(__('Error occurred while receiving IPN. Transaction: %1$s, req data: %2$s. The error was "%3$s"', 'event_espresso'), print_r($transaction, TRUE), print_r($_req_data, TRUE), $e->getMessage()));
         throw $e;
     }
 }
 /**
  *   _get_active_payment_method_slug
  * 	@return string
  */
 protected function _get_active_payment_method_slug()
 {
     $payment_method_slug = FALSE;
     //decide which payment method tab to open first, as dictated by the request's 'payment_method'
     if (isset($this->_req_data['payment_method'])) {
         // if they provided the current payment method, use it
         $payment_method_slug = sanitize_key($this->_req_data['payment_method']);
     }
     $payment_method = EEM_Payment_Method::instance()->get_one(array(array('PMD_slug' => $payment_method_slug)));
     // if that didn't work or wasn't provided, find another way to select the current pm
     if (!$this->_verify_payment_method($payment_method)) {
         // like, looking for an active one
         $payment_method = EEM_Payment_Method::instance()->get_one_active('CART');
         // test that one as well
         if ($this->_verify_payment_method($payment_method)) {
             $payment_method_slug = $payment_method->slug();
         } else {
             $payment_method_slug = 'paypal_standard';
         }
     }
     return $payment_method_slug;
 }
 protected function _get_started_steps()
 {
     $steps = '<h2>' . __('Getting Started') . '</h2>';
     $step_one = '<p>' . sprintf(__('%sStep 1%s: Visit your %sOrganization Settings%s and add/update your details.', 'event_espresso'), '<strong>', '</strong>', '<a href="admin.php?page=espresso_general_settings">', '</a>') . '</strong></p>';
     $step_two = '<p>' . sprintf(__('%sStep 2%s: Setup your %sPayment Methods%s.', 'event_espresso'), '<strong>', '</strong>', '<a href="admin.php?page=espresso_payment_settings">', '</a>') . '</strong></p>';
     $step_three = '<p>' . sprintf(__('%sStep 3%s: Create your %sFirst Event%s.', 'event_espresso'), '<strong>', '</strong>', '<a href="admin.php?page=espresso_events&action=create_new">', '</a>') . '</strong></p>';
     //done?
     $done_step_one = EE_Registry::instance()->CFG->organization->address_1 == '123 Onna Road' ? FALSE : TRUE;
     $active_invoice_pm = EEM_Payment_Method::instance()->get_one_active(EEM_Payment_Method::scope_cart, array(array('PMD_type' => 'Invoice')));
     $active_pms_count = EEM_Payment_Method::instance()->count_active(EEM_Payment_Method::scope_cart);
     //done step two if a non-invoice paymetn method is active; or there is more than one PM active, or
     //if only the invoice is active but it's clearly been updated
     $done_step_two = $active_pms_count > 1 || $active_pms_count === 1 && !$active_invoice_pm || $active_invoice_pm instanceof EE_Payment_Method && ($active_invoice_pm->get_extra_meta('pdf_payee_name', TRUE, '') || $active_invoice_pm->get_extra_meta('pdf_payee_email', TRUE, '') || $active_invoice_pm->get_extra_meta('pdf_payee_tax_number', TRUE, '') || $active_invoice_pm->get_extra_meta('pdf_payee_address', TRUE, '') || $active_invoice_pm->get_extra_meta('page_extra_info', TRUE, ''));
     $done_step_three = EE_Registry::instance()->load_model('Event')->count() > 0 ? TRUE : FALSE;
     //if ALL steps are done, let's just return FALSE so we don't display anything
     if ($done_step_one && $done_step_two && $done_step_three) {
         return FALSE;
     }
     //now let's put it together
     $steps .= sprintf('%s' . $step_one . '%s', $done_step_one ? '<strike>' : '', $done_step_one ? '</strike>' : '');
     $steps .= sprintf('%s' . $step_two . '%s', $done_step_two ? '<strike>' : '', $done_step_two ? '</strike>' : '');
     $steps .= sprintf('%s' . $step_three . '%s', $done_step_three ? '<strike>' : '', $done_step_three ? '</strike>' : '');
     return $steps;
 }
 /**
  * 	_get_payment_methods
  * Gets all the payment methods available generally, or the ones that are already
  * selected on these payments (in case their payment methods are no longer active).
  * Has the side-effect of updating the template args' payment_methods item
  *	@access private
  * @param EE_Payment[] to show on this page
  *	@return void
  */
 private function _get_payment_methods($payments = array())
 {
     $payment_methods_of_payments = array();
     foreach ($payments as $payment) {
         if ($payment instanceof EE_Payment) {
             $payment_methods_of_payments[] = $payment->get('PMD_ID');
         }
     }
     if ($payment_methods_of_payments) {
         $query_args = array(array('OR*payment_method_for_payment' => array('PMD_ID' => array('IN', $payment_methods_of_payments), 'PMD_scope' => array('LIKE', '%' . EEM_Payment_Method::scope_admin . '%'))));
     } else {
         $query_args = array(array('PMD_scope' => array('LIKE', '%' . EEM_Payment_Method::scope_admin . '%')));
     }
     $this->_template_args['payment_methods'] = EEM_Payment_Method::instance()->get_all($query_args);
 }
 /**
  * initialize_reg_step
  * @return boolean
  */
 public function initialize_reg_step()
 {
     // TODO: if /when we implement donations, then this will need overriding
     if (!$this->checkout->payment_required() && !is_callable(array($this, $this->checkout->action)) && !$this->completed()) {
         // and if so, then we no longer need the Payment Options step
         if ($this->is_current_step()) {
             $this->checkout->generate_reg_form = false;
         }
         $this->checkout->remove_reg_step($this->_slug);
         // DEBUG LOG
         //$this->checkout->log( __CLASS__, __FUNCTION__, __LINE__ );
         return false;
     }
     // load EEM_Payment_Method
     EE_Registry::instance()->load_model('Payment_Method');
     // get all active payment methods
     $this->checkout->available_payment_methods = EEM_Payment_Method::instance()->get_all_for_transaction($this->checkout->transaction, EEM_Payment_Method::scope_cart);
     return true;
 }
 /**
  * Gets whether this payment method can be used anywhere at all (ie frontend cart, admin, etc)
  * @return boolean
  */
 public function active()
 {
     return array_intersect(array_keys(EEM_Payment_Method::instance()->scopes()), $this->scope());
 }
 function __construct()
 {
     $this->_subsections = array('h1' => new EE_Form_Section_HTML('hello wordl'), 'name' => new EE_Text_Input(array('required' => true, 'default' => 'your name here')), 'email' => new EE_Email_Input(array('required' => false)), 'shirt_size' => new EE_Select_Input(array('' => 'Please select...', 's' => __("Small", "event_espresso"), 'm' => __("Medium", "event_espresso"), 'l' => __("Large", "event_espresso")), array('required' => true, 'default' => 's')), 'month_normal' => new EE_Month_Input(), 'month_leading_zero' => new EE_Month_Input(true), 'year_2' => new EE_Year_Input(false, 1, 1), 'year_4' => new EE_Year_Input(true, 0, 10, array('default' => '2017')), 'yes_no' => new EE_Yes_No_Input(array('html_label_text' => __("Yes or No", "event_espresso"))), 'credit_card' => new EE_Credit_Card_Input(), 'image_1' => new EE_Admin_File_Uploader_Input(), 'image_2' => new EE_Admin_File_Uploader_Input(), 'skillz' => new EE_Checkbox_Multi_Input(array('php' => 'PHP', 'mysql' => 'MYSQL'), array('default' => array('php'))), 'float' => new EE_Float_Input(), 'essay' => new EE_Text_Area_Input(), 'amenities' => new EE_Select_Multiple_Input(array('hottub' => 'Hot Tub', 'balcony' => "Balcony", 'skylight' => 'SkyLight', 'no_axe' => 'No Axe Murderers'), array('default' => array('hottub', 'no_axe'))), 'payment_methods' => new EE_Select_Multi_Model_Input(EEM_Payment_Method::instance()->get_all()));
     $this->_layout_strategy = new EE_Div_Per_Section_Layout();
     parent::__construct();
 }
 /**
  * Makes sure the default payment method (Invoice) is active.
  * This used to be done automatically as part of constructing the old gateways config
  */
 public static function insert_default_payment_methods()
 {
     if (!EEM_Payment_Method::instance()->count_active(EEM_Payment_Method::scope_cart)) {
         EE_Registry::instance()->load_lib('Payment_Method_Manager');
         EE_Payment_Method_Manager::instance()->activate_a_payment_method_of_type('Invoice');
     } else {
         EEM_Payment_Method::instance()->verify_button_urls();
     }
 }
 /**
  * set_transaction_payment_method_based_on_registration_statuses
  *
  * sets or unsets the PMD_ID field on the TXN based on the related REG statuses
  * basically if ALL Registrations are "Not Approved", then the EE_Transaction.PMD_ID is set to null,
  * but if any Registration has a different status, then EE_Transaction.PMD_ID is set to either:
  * 		the first "default" Payment Method
  * 		the first active Payment Method
  * 	whichever is found first.
  *
  * @param  EE_Registration $edited_registration
  * @return void
  */
 public function set_transaction_payment_method_based_on_registration_statuses(EE_Registration $edited_registration)
 {
     if ($edited_registration instanceof EE_Registration) {
         $transaction = $edited_registration->transaction();
         if ($transaction instanceof EE_Transaction) {
             $all_not_approved = true;
             foreach ($transaction->registrations() as $registration) {
                 if ($registration instanceof EE_Registration) {
                     // if any REG != "Not Approved" then toggle to false
                     $all_not_approved = $registration->is_not_approved() ? $all_not_approved : false;
                 }
             }
             // if ALL Registrations are "Not Approved"
             if ($all_not_approved) {
                 $transaction->set_payment_method_ID(null);
                 $transaction->save();
             } else {
                 $available_payment_methods = EEM_Payment_Method::instance()->get_all_for_transaction($transaction, EEM_Payment_Method::scope_cart);
                 if (!empty($available_payment_methods)) {
                     $PMD_ID = 0;
                     foreach ($available_payment_methods as $available_payment_method) {
                         if ($available_payment_method instanceof EE_Payment_Method && $available_payment_method->open_by_default()) {
                             $PMD_ID = $available_payment_method->ID();
                             break;
                         }
                     }
                     if (!$PMD_ID) {
                         $first_payment_method = reset($available_payment_methods);
                         if ($first_payment_method instanceof EE_Payment_Method) {
                             $PMD_ID = $first_payment_method->ID();
                         } else {
                             EE_Error::add_error(__('A valid Payment Method could not be determined. Please ensure that at least one Payment Method is activated.', 'event_espresso'), __FILE__, __LINE__, __FUNCTION__);
                         }
                     }
                     $transaction->set_payment_method_ID($PMD_ID);
                     $transaction->save();
                 } else {
                     EE_Error::add_error(__('Please activate at least one Payment Method in order for things to operate correctly.', 'event_espresso'), __FILE__, __LINE__, __FUNCTION__);
                 }
             }
         }
     }
 }
 /**
  * Deactivates a payment method of the given payment method slug.
  *
  * @param string $payment_method_slug The slug for the payment method to deactivate.
  *
  * @return int count of rows updated.
  */
 public function deactivate_payment_method($payment_method_slug)
 {
     EE_Log::instance()->log(__FILE__, __FUNCTION__, sprintf(__('Payment method with slug %1$s is being deactivated by site admin', 'event_espresso'), $payment_method_slug), 'payment_method_change');
     $count_updated = EEM_Payment_Method::instance()->update(array('PMD_scope' => array()), array(array('PMD_slug' => $payment_method_slug)));
     return $count_updated;
 }
 /**
  * Processes a direct refund request, saves the payment, and updates the transaction appropriately.
  * @param EE_Payment_Method $payment_method
  * @param EE_Payment        $payment_to_refund
  * @param array             $refund_info
  * @internal param float $amount
  * @return EE_Payment
  */
 public function process_refund($payment_method, $payment_to_refund, $refund_info = array())
 {
     /** @type EE_Payment_Method $payment_method */
     $payment_method = EEM_Payment_Method::instance()->ensure_is_ID($payment_method);
     if ($payment_method->type_obj()->supports_sending_refunds()) {
         $payment_method->do_direct_refund($payment_to_refund, $refund_info);
         $this->update_txn_based_on_payment($payment_to_refund->transaction(), $payment_to_refund);
     }
     return $payment_to_refund;
 }
 /**
  * Deactivates a payment method of the given payment method slug.
  *
  * @param string $payment_method_slug The slug for the payment method to deactivate.
  *
  * @return int count of rows updated.
  */
 public function deactivate_payment_method($payment_method_slug)
 {
     $count_updated = EEM_Payment_Method::instance()->update(array('PMD_scope' => array()), array(array('PMD_slug' => $payment_method_slug)));
     return $count_updated;
 }
 /**
  * This grabs the payment method corresponding to the last payment made for the amount owing on the registration.
  * Note: if there are no payments on the registration there will be no payment method returned.
  *
  * @return EE_Payment_Method|null
  */
 public function payment_method()
 {
     return EEM_Payment_Method::instance()->get_last_used_for_registration($this);
 }
 /**
  * 	run - initial shortcode module setup called during "wp_loaded" hook
  * 	this method is primarily used for loading resources that will be required by the shortcode when it is actually processed
  *
  *  @access 	public
  *  @param 	 WP $WP
  *  @return 	void
  */
 public function run(WP $WP)
 {
     if (EE_Registry::instance()->REQ->is_set('e_reg_url_link')) {
         $this->_current_txn = EE_Registry::instance()->load_model('Transaction')->get_transaction_from_reg_url_link();
     } else {
         $this->_current_txn = null;
     }
     if ($this->_current_txn instanceof EE_Transaction) {
         //EE_Registry::instance()->load_helper( 'Debug_Tools' );
         //EEH_Debug_Tools::log( __CLASS__, __FUNCTION__, __LINE__, array( $this->_current_txn ), true, 	'EE_Transaction: ' . $this->_current_txn->ID() );
         $payment_method_slug = EE_Registry::instance()->REQ->get('ee_payment_method', NULL);
         if ($payment_method_slug) {
             $payment_method = EEM_Payment_Method::instance()->get_one_by_slug($payment_method_slug);
         } else {
             $payment_method = null;
         }
         /** @type EE_Payment_Processor $payment_processor */
         $payment_processor = EE_Registry::instance()->load_core('Payment_Processor');
         $payment_processor->process_ipn($_REQUEST, $this->_current_txn, $payment_method);
         //allow gateways to add a filter to stop rendering the page
         if (apply_filters('FHEE__EES_Espresso_Txn_Page__run__exit', FALSE)) {
             exit;
         }
     }
 }
 /**
  * gets the payment method for this transaction. Otherwise gets a default one.
  */
 private function _get_payment_method($transaction = null)
 {
     if ($transaction instanceof EE_Transaction) {
         $payment_method = $transaction->payment_method();
         if (empty($payment_method)) {
             return apply_filters('FHEE__EE_Transaction_Shortcodes__get_payment_method__default', EEM_Payment_Method::instance()->get_one_of_type('Invoice'));
         }
         return $payment_method;
     } else {
         //get the first payment method we can find
         return apply_filters('FHEE__EE_Transaction_Shortcodes__get_payment_method__default', EEM_Payment_Method::instance()->get_one_of_type('Invoice'));
     }
 }
 public function test_process_payment__offsite__declined_then_approved()
 {
     /** @type EE_Payment_Method $pm */
     $pm = $this->new_model_obj_with_dependencies('Payment_Method', array('PMD_type' => 'Mock_Offsite'));
     $transaction = $this->_new_typical_transaction();
     global $wp_actions;
     EE_Registry::instance()->load_helper('Array');
     $successful_payment_actions = EEH_Array::is_set($wp_actions, 'AHEE__EE_Payment_Processor__update_txn_based_on_payment__successful', 0);
     /** @type EE_Payment_Processor $payment_processor */
     $payment_processor = EE_Registry::instance()->load_core('Payment_Processor');
     $payment = $payment_processor->process_payment($pm, $transaction, NULL, NULL, 'success', 'CART', TRUE, TRUE);
     $this->assertInstanceOf('EE_Payment', $payment);
     //verify it's already been saved
     $this->assertNotEquals(0, $payment->ID());
     //assert that the payment still has its default status
     $this->assertEquals(EEM_Payment::instance()->field_settings_for('STS_ID')->get_default_value(), $payment->status());
     $this->assertEquals(EEM_Payment::instance()->field_settings_for('STS_ID')->get_default_value(), $this->_get_payment_status_in_db($payment));
     //assert that the we haven't notified of successful payment JUST yet...
     $this->assertEquals($successful_payment_actions, EEH_Array::is_set($wp_actions, 'AHEE__EE_Payment_Processor__update_txn_based_on_payment__successful', 0));
     //PENDING IPN
     $payment = $payment_processor->process_ipn(array('status' => EEM_Payment::status_id_pending, 'gateway_txn_id' => $payment->txn_id_chq_nmbr()), $transaction, $pm);
     $this->assertEquals(EEM_Payment::status_id_pending, $payment->status());
     $this->assertEquals(EEM_Payment::status_id_pending, $this->_get_payment_status_in_db($payment));
     //and the payment-approved action should have NOT been triggered
     $this->assertEquals($successful_payment_actions, EEH_Array::is_set($wp_actions, 'AHEE__EE_Payment_Processor__update_txn_based_on_payment__successful', 0));
     //APPROVED IPN
     $payment = $payment_processor->process_ipn(array('status' => EEM_Payment::status_id_approved, 'gateway_txn_id' => $payment->txn_id_chq_nmbr()), $transaction, $pm);
     //payment should be what the gateway set it to be, which was approved
     $this->assertEquals(EEM_Payment::status_id_approved, $payment->status());
     $this->assertEquals(EEM_Payment::status_id_approved, $this->_get_payment_status_in_db($payment));
     //and the payment-approved action should have been triggered
     $this->assertEquals($successful_payment_actions + 1, EEH_Array::is_set($wp_actions, 'AHEE__EE_Payment_Processor__update_txn_based_on_payment__successful', 0));
     //DUPLICATE SUCCESS IPN
     //for this, we need to reset payment model so we fetch a NEW payment object, instead of reusing the old
     //and because the payment method caches a payment method type which caches a gateway which caches the payment model,
     //we also need to reset the payment method
     EEM_Payment::reset();
     $pm = EEM_Payment_Method::reset()->get_one_by_ID($pm->ID());
     $payment = $payment_processor->process_ipn(array('status' => EEM_Payment::status_id_approved, 'gateway_txn_id' => $payment->txn_id_chq_nmbr()), $transaction, $pm);
     //payment should be what the gateway set it to be, which was failed
     $this->assertEquals(EEM_Payment::status_id_approved, $payment->status());
     //and the payment-approved action should have NOT been triggered this time because it's a duplicate
     $this->assertEquals($successful_payment_actions + 1, EEH_Array::is_set($wp_actions, 'AHEE__EE_Payment_Processor__update_txn_based_on_payment__successful', 0));
 }
 /**
  * Sends a request to mijireh to slurp the current $post, and then redirects the user back to the current page without the
  * special querystring arg indicating to slurp. Also, should temporarily make the current post published, then revert it to its previous status
  */
 public static function slurp_now()
 {
     global $post;
     if ($post->post_status != 'publish') {
         //make sure the post is published at least while slurping
         $post->post_status = 'publish';
         wp_update_post($post);
     }
     $mijireh_gateway = EEM_Payment_Method::instance()->get_one_of_type('Mijireh');
     $access_key = $mijireh_gateway->get_extra_meta('access_key', TRUE);
     // 'slurp_url'=>get_permalink($post),
     // 'page_id'=>$post->ID,
     // 'return_url'=>$return_url
     $url = 'https://secure.mijireh.com/api/1/slurps';
     $args = array('headers' => array('Authorization' => 'Basic ' . base64_encode($access_key . ':'), 'Accept' => 'application/json'), 'body' => json_encode(array('url' => get_permalink($post->ID), 'page_id' => $post->ID, 'return_url' => '')));
     $response = wp_remote_post($url, $args);
     //now redirect the user back to the same page
     $redirect_args = $_GET;
     unset($redirect_args['mijireh_slurp_now']);
     $url = add_query_arg($redirect_args, admin_url('post.php'));
     set_transient(EED_Mijireh_Slurper::slurp_started_transient_name, true);
     // echo "redirect to $url";
     wp_redirect($url);
 }