Completed
Branch EDTR/master (af42c6)
by
unknown
50:36 queued 42:13
created
payment_methods/Paypal_Standard/EE_Paypal_Standard_Form.form.php 2 patches
Indentation   +70 added lines, -70 removed lines patch added patch discarded remove patch
@@ -16,77 +16,77 @@
 block discarded – undo
16 16
 
17 17
 
18 18
 
19
-    /**
20
-     * @param EE_PMT_Paypal_Standard $payment_method_type
21
-     */
22
-    public function __construct($payment_method_type)
23
-    {
24
-        parent::__construct(
25
-            array(
26
-                'payment_method_type'          => $payment_method_type,
27
-                'extra_meta_inputs'            => array(
28
-                    'paypal_id'        => new EE_Text_Input(array(
29
-                        'html_label_text' => sprintf(__("Paypal Email %s", 'event_espresso'), $payment_method_type->get_help_tab_link()),
30
-                        'html_help_text'  => __("Typically [email protected]", 'event_espresso'),
31
-                        'required'        => true
32
-                    )),
33
-                    'image_url'        => new EE_Admin_File_Uploader_Input(array(
34
-                        'html_help_text'  => __("Used for your business/personal logo on the PayPal page", 'event_espresso'),
35
-                        'html_label_text' => __('Image URL', 'event_espresso')
36
-                    )),
37
-                    'paypal_taxes'     => new EE_Yes_No_Input(array(
38
-                        'html_label_text' => sprintf(__('Paypal Calculates Taxes %s', 'event_espresso'), $payment_method_type->get_help_tab_link()),
39
-                        'html_help_text'  => __('Whether Paypal should add taxes to the order', 'event_espresso'),
40
-                        'default'         => false
41
-                    )),
42
-                    'paypal_shipping'  => new EE_Yes_No_Input(array(
43
-                        'html_label_text' => sprintf(__('Paypal Calculates Shipping %s', 'event_espresso'), $payment_method_type->get_help_tab_link()),
44
-                        'html_help_text'  => __('Whether Paypal should add shipping surcharges', 'event_espresso'),
45
-                        'default'         => false
46
-                    )),
47
-                    'shipping_details' => new EE_Select_Input(array(
48
-                        EE_PMT_Paypal_Standard::shipping_info_none     => __("Do not prompt for an address", 'event_espresso'),
49
-                        EE_PMT_Paypal_Standard::shipping_info_optional => __("Prompt for an address, but do not require it", 'event_espresso'),
50
-                        EE_PMT_Paypal_Standard::shipping_info_required => __("Prompt for an address, and require it", 'event_espresso')
51
-                    ))
52
-                )
53
-            )
54
-        );
55
-    }
19
+	/**
20
+	 * @param EE_PMT_Paypal_Standard $payment_method_type
21
+	 */
22
+	public function __construct($payment_method_type)
23
+	{
24
+		parent::__construct(
25
+			array(
26
+				'payment_method_type'          => $payment_method_type,
27
+				'extra_meta_inputs'            => array(
28
+					'paypal_id'        => new EE_Text_Input(array(
29
+						'html_label_text' => sprintf(__("Paypal Email %s", 'event_espresso'), $payment_method_type->get_help_tab_link()),
30
+						'html_help_text'  => __("Typically [email protected]", 'event_espresso'),
31
+						'required'        => true
32
+					)),
33
+					'image_url'        => new EE_Admin_File_Uploader_Input(array(
34
+						'html_help_text'  => __("Used for your business/personal logo on the PayPal page", 'event_espresso'),
35
+						'html_label_text' => __('Image URL', 'event_espresso')
36
+					)),
37
+					'paypal_taxes'     => new EE_Yes_No_Input(array(
38
+						'html_label_text' => sprintf(__('Paypal Calculates Taxes %s', 'event_espresso'), $payment_method_type->get_help_tab_link()),
39
+						'html_help_text'  => __('Whether Paypal should add taxes to the order', 'event_espresso'),
40
+						'default'         => false
41
+					)),
42
+					'paypal_shipping'  => new EE_Yes_No_Input(array(
43
+						'html_label_text' => sprintf(__('Paypal Calculates Shipping %s', 'event_espresso'), $payment_method_type->get_help_tab_link()),
44
+						'html_help_text'  => __('Whether Paypal should add shipping surcharges', 'event_espresso'),
45
+						'default'         => false
46
+					)),
47
+					'shipping_details' => new EE_Select_Input(array(
48
+						EE_PMT_Paypal_Standard::shipping_info_none     => __("Do not prompt for an address", 'event_espresso'),
49
+						EE_PMT_Paypal_Standard::shipping_info_optional => __("Prompt for an address, but do not require it", 'event_espresso'),
50
+						EE_PMT_Paypal_Standard::shipping_info_required => __("Prompt for an address, and require it", 'event_espresso')
51
+					))
52
+				)
53
+			)
54
+		);
55
+	}
56 56
 
57 57
 
58 58
 
59
-    /**
60
-     * @param array $req_data
61
-     * @throws EE_Error
62
-     */
63
-    public function _normalize($req_data)
64
-    {
65
-        parent::_normalize($req_data);
66
-        $paypal_calculates_shipping = $this->get_input_value('paypal_shipping');
67
-        $paypal_calculates_taxes = $this->get_input_value('paypal_taxes');
68
-        $paypal_requests_address_info = $this->get_input_value('shipping_details');
69
-        if (( $paypal_calculates_shipping || $paypal_calculates_taxes ) &&
70
-            $paypal_requests_address_info == EE_PMT_Paypal_Standard::shipping_info_none
71
-        ) {
72
-            // they want paypal to calculate taxes or shipping. They need to ask for
73
-            // address info, otherwise paypal can't calculate taxes or shipping
74
-            /** @type EE_Select_Input $shipping_details_input */
75
-            $shipping_details_input = $this->get_input('shipping_details');
76
-            $shipping_details_input->set_default(EE_PMT_Paypal_Standard::shipping_info_optional);
77
-            $shipping_details_input_options = $shipping_details_input->options();
78
-            EE_Error::add_attention(
79
-                sprintf(
80
-                    __('Automatically set "%s" to "%s" because Paypal requires address info in order to calculate shipping or taxes.', 'event_espresso'),
81
-                    strip_tags($shipping_details_input->html_label_text()),
82
-                    isset($shipping_details_input_options[ EE_PMT_Paypal_Standard::shipping_info_optional ])
83
-                        ? $shipping_details_input_options[ EE_PMT_Paypal_Standard::shipping_info_optional ]
84
-                        : __('Unknown', 'event_espresso')
85
-                ),
86
-                __FILE__,
87
-                __FUNCTION__,
88
-                __LINE__
89
-            );
90
-        }
91
-    }
59
+	/**
60
+	 * @param array $req_data
61
+	 * @throws EE_Error
62
+	 */
63
+	public function _normalize($req_data)
64
+	{
65
+		parent::_normalize($req_data);
66
+		$paypal_calculates_shipping = $this->get_input_value('paypal_shipping');
67
+		$paypal_calculates_taxes = $this->get_input_value('paypal_taxes');
68
+		$paypal_requests_address_info = $this->get_input_value('shipping_details');
69
+		if (( $paypal_calculates_shipping || $paypal_calculates_taxes ) &&
70
+			$paypal_requests_address_info == EE_PMT_Paypal_Standard::shipping_info_none
71
+		) {
72
+			// they want paypal to calculate taxes or shipping. They need to ask for
73
+			// address info, otherwise paypal can't calculate taxes or shipping
74
+			/** @type EE_Select_Input $shipping_details_input */
75
+			$shipping_details_input = $this->get_input('shipping_details');
76
+			$shipping_details_input->set_default(EE_PMT_Paypal_Standard::shipping_info_optional);
77
+			$shipping_details_input_options = $shipping_details_input->options();
78
+			EE_Error::add_attention(
79
+				sprintf(
80
+					__('Automatically set "%s" to "%s" because Paypal requires address info in order to calculate shipping or taxes.', 'event_espresso'),
81
+					strip_tags($shipping_details_input->html_label_text()),
82
+					isset($shipping_details_input_options[ EE_PMT_Paypal_Standard::shipping_info_optional ])
83
+						? $shipping_details_input_options[ EE_PMT_Paypal_Standard::shipping_info_optional ]
84
+						: __('Unknown', 'event_espresso')
85
+				),
86
+				__FILE__,
87
+				__FUNCTION__,
88
+				__LINE__
89
+			);
90
+		}
91
+	}
92 92
 }
Please login to merge, or discard this patch.
Spacing   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -66,7 +66,7 @@  discard block
 block discarded – undo
66 66
         $paypal_calculates_shipping = $this->get_input_value('paypal_shipping');
67 67
         $paypal_calculates_taxes = $this->get_input_value('paypal_taxes');
68 68
         $paypal_requests_address_info = $this->get_input_value('shipping_details');
69
-        if (( $paypal_calculates_shipping || $paypal_calculates_taxes ) &&
69
+        if (($paypal_calculates_shipping || $paypal_calculates_taxes) &&
70 70
             $paypal_requests_address_info == EE_PMT_Paypal_Standard::shipping_info_none
71 71
         ) {
72 72
             // they want paypal to calculate taxes or shipping. They need to ask for
@@ -79,8 +79,8 @@  discard block
 block discarded – undo
79 79
                 sprintf(
80 80
                     __('Automatically set "%s" to "%s" because Paypal requires address info in order to calculate shipping or taxes.', 'event_espresso'),
81 81
                     strip_tags($shipping_details_input->html_label_text()),
82
-                    isset($shipping_details_input_options[ EE_PMT_Paypal_Standard::shipping_info_optional ])
83
-                        ? $shipping_details_input_options[ EE_PMT_Paypal_Standard::shipping_info_optional ]
82
+                    isset($shipping_details_input_options[EE_PMT_Paypal_Standard::shipping_info_optional])
83
+                        ? $shipping_details_input_options[EE_PMT_Paypal_Standard::shipping_info_optional]
84 84
                         : __('Unknown', 'event_espresso')
85 85
                 ),
86 86
                 __FILE__,
Please login to merge, or discard this patch.
payment_methods/Paypal_Standard/EE_PMT_Paypal_Standard.pm.php 2 patches
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -63,8 +63,8 @@
 block discarded – undo
63 63
      */
64 64
     public function generate_new_settings_form()
65 65
     {
66
-        require_once($this->file_folder() . 'EE_Paypal_Standard_Form.form.php');
67
-        $form =  new EE_Paypal_Standard_Form($this);
66
+        require_once($this->file_folder().'EE_Paypal_Standard_Form.form.php');
67
+        $form = new EE_Paypal_Standard_Form($this);
68 68
         $form->get_input('PMD_debug_mode')->set_html_label_text(
69 69
             sprintf(__("Use PayPal Sandbox %s", 'event_espresso'), $this->get_help_tab_link())
70 70
         );
Please login to merge, or discard this patch.
Indentation   +101 added lines, -101 removed lines patch added patch discarded remove patch
@@ -13,105 +13,105 @@
 block discarded – undo
13 13
 class EE_PMT_Paypal_Standard extends EE_PMT_Base
14 14
 {
15 15
 
16
-    const shipping_info_none = 1;
17
-    const shipping_info_optional = 0;
18
-    const shipping_info_required = 2;
19
-
20
-
21
-
22
-    /**
23
-     * @param null $pm_instance
24
-     * @return \EE_PMT_Paypal_Standard
25
-     * @throws \EE_Error
26
-     */
27
-    public function __construct($pm_instance = null)
28
-    {
29
-        require_once($this->file_folder().'EEG_Paypal_Standard.gateway.php');
30
-        $this->_gateway = new EEG_Paypal_Standard();
31
-        $this->_pretty_name = __("PayPal Standard", 'event_espresso');
32
-        $this->_default_description = sprintf(
33
-            __(
34
-                'Upon submitting this form, you will be forwarded to PayPal to make your payment. %1$sMake sure you return to this site in order to properly finalize your registration.%2$s',
35
-                'event_espresso'
36
-            ),
37
-            '<strong>',
38
-            '</strong>'
39
-        );
40
-        parent::__construct($pm_instance);
41
-        $this->_default_button_url = $this->file_url().'lib/paypal-logo.png';
42
-    }
43
-
44
-
45
-
46
-    /**
47
-     * Creates the billing form for this payment method type
48
-     * @param \EE_Transaction $transaction
49
-     * @return NULL
50
-     */
51
-    public function generate_new_billing_form(EE_Transaction $transaction = null)
52
-    {
53
-        return null;
54
-    }
55
-
56
-
57
-
58
-    /**
59
-     * Gets the form for all the settings related to this payment method type
60
-     *
61
-     * @return EE_Payment_Method_Form
62
-     * @throws \EE_Error
63
-     */
64
-    public function generate_new_settings_form()
65
-    {
66
-        require_once($this->file_folder() . 'EE_Paypal_Standard_Form.form.php');
67
-        $form =  new EE_Paypal_Standard_Form($this);
68
-        $form->get_input('PMD_debug_mode')->set_html_label_text(
69
-            sprintf(__("Use PayPal Sandbox %s", 'event_espresso'), $this->get_help_tab_link())
70
-        );
71
-        $form->get_input('shipping_details')->set_html_label_text(
72
-            sprintf(__("Shipping Address Options %s", "event_espresso"), $this->get_help_tab_link())
73
-        );
74
-        return $form;
75
-    }
76
-
77
-
78
-
79
-    /**
80
-     * Adds the help tab
81
-     * @see EE_PMT_Base::help_tabs_config()
82
-     * @return array
83
-     */
84
-    public function help_tabs_config()
85
-    {
86
-        return array(
87
-            $this->get_help_tab_name() => array(
88
-                'title'=>  __("PayPal Standard Settings", 'event_espresso'),
89
-                'filename'=>'payment_methods_overview_paypalstandard'
90
-            )
91
-        );
92
-    }
93
-
94
-
95
-
96
-    /**
97
-     * Logic to be accomplished when the payment attempt is complete.
98
-     * Most payment methods don't need to do anything at this point; but some, like Mijireh, do.
99
-     * (Mijireh was an offsite gateway which doesn't send an IPN. So when the user returns to EE from
100
-     * Mijireh, this method needs to be called so the Mijireh PM can ping Mijireh to know the status
101
-     * of the payment). Fed a transaction because it's always assumed to be the last payment that
102
-     *
103
-     * @param EE_Transaction $transaction
104
-     * @return EE_Payment
105
-     * @throws \EE_Error
106
-     */
107
-    public function finalize_payment_for($transaction)
108
-    {
109
-        // PayPal standard actually sends the IPN info along with the user when they return to our site
110
-        // so in case the IPN is arriving later, let's try to process an IPN!
111
-        if ($_SERVER['REQUEST_METHOD'] === 'POST') {
112
-            return $this->handle_ipn($_POST, $transaction);
113
-        } else {
114
-            return parent::finalize_payment_for($transaction);
115
-        }
116
-    }
16
+	const shipping_info_none = 1;
17
+	const shipping_info_optional = 0;
18
+	const shipping_info_required = 2;
19
+
20
+
21
+
22
+	/**
23
+	 * @param null $pm_instance
24
+	 * @return \EE_PMT_Paypal_Standard
25
+	 * @throws \EE_Error
26
+	 */
27
+	public function __construct($pm_instance = null)
28
+	{
29
+		require_once($this->file_folder().'EEG_Paypal_Standard.gateway.php');
30
+		$this->_gateway = new EEG_Paypal_Standard();
31
+		$this->_pretty_name = __("PayPal Standard", 'event_espresso');
32
+		$this->_default_description = sprintf(
33
+			__(
34
+				'Upon submitting this form, you will be forwarded to PayPal to make your payment. %1$sMake sure you return to this site in order to properly finalize your registration.%2$s',
35
+				'event_espresso'
36
+			),
37
+			'<strong>',
38
+			'</strong>'
39
+		);
40
+		parent::__construct($pm_instance);
41
+		$this->_default_button_url = $this->file_url().'lib/paypal-logo.png';
42
+	}
43
+
44
+
45
+
46
+	/**
47
+	 * Creates the billing form for this payment method type
48
+	 * @param \EE_Transaction $transaction
49
+	 * @return NULL
50
+	 */
51
+	public function generate_new_billing_form(EE_Transaction $transaction = null)
52
+	{
53
+		return null;
54
+	}
55
+
56
+
57
+
58
+	/**
59
+	 * Gets the form for all the settings related to this payment method type
60
+	 *
61
+	 * @return EE_Payment_Method_Form
62
+	 * @throws \EE_Error
63
+	 */
64
+	public function generate_new_settings_form()
65
+	{
66
+		require_once($this->file_folder() . 'EE_Paypal_Standard_Form.form.php');
67
+		$form =  new EE_Paypal_Standard_Form($this);
68
+		$form->get_input('PMD_debug_mode')->set_html_label_text(
69
+			sprintf(__("Use PayPal Sandbox %s", 'event_espresso'), $this->get_help_tab_link())
70
+		);
71
+		$form->get_input('shipping_details')->set_html_label_text(
72
+			sprintf(__("Shipping Address Options %s", "event_espresso"), $this->get_help_tab_link())
73
+		);
74
+		return $form;
75
+	}
76
+
77
+
78
+
79
+	/**
80
+	 * Adds the help tab
81
+	 * @see EE_PMT_Base::help_tabs_config()
82
+	 * @return array
83
+	 */
84
+	public function help_tabs_config()
85
+	{
86
+		return array(
87
+			$this->get_help_tab_name() => array(
88
+				'title'=>  __("PayPal Standard Settings", 'event_espresso'),
89
+				'filename'=>'payment_methods_overview_paypalstandard'
90
+			)
91
+		);
92
+	}
93
+
94
+
95
+
96
+	/**
97
+	 * Logic to be accomplished when the payment attempt is complete.
98
+	 * Most payment methods don't need to do anything at this point; but some, like Mijireh, do.
99
+	 * (Mijireh was an offsite gateway which doesn't send an IPN. So when the user returns to EE from
100
+	 * Mijireh, this method needs to be called so the Mijireh PM can ping Mijireh to know the status
101
+	 * of the payment). Fed a transaction because it's always assumed to be the last payment that
102
+	 *
103
+	 * @param EE_Transaction $transaction
104
+	 * @return EE_Payment
105
+	 * @throws \EE_Error
106
+	 */
107
+	public function finalize_payment_for($transaction)
108
+	{
109
+		// PayPal standard actually sends the IPN info along with the user when they return to our site
110
+		// so in case the IPN is arriving later, let's try to process an IPN!
111
+		if ($_SERVER['REQUEST_METHOD'] === 'POST') {
112
+			return $this->handle_ipn($_POST, $transaction);
113
+		} else {
114
+			return parent::finalize_payment_for($transaction);
115
+		}
116
+	}
117 117
 }
Please login to merge, or discard this patch.
payment_methods/Paypal_Standard/EEG_Paypal_Standard.gateway.php 2 patches
Indentation   +600 added lines, -600 removed lines patch added patch discarded remove patch
@@ -19,605 +19,605 @@
 block discarded – undo
19 19
 class EEG_Paypal_Standard extends EE_Offsite_Gateway
20 20
 {
21 21
 
22
-    /**
23
-     * Name for the wp option used to save the itemized payment
24
-     */
25
-    const itemized_payment_option_name = '_itemized_payment';
26
-
27
-    protected $_paypal_id;
28
-
29
-    protected $_image_url;
30
-
31
-    protected $_shipping_details;
32
-
33
-    protected $_paypal_shipping;
34
-
35
-    protected $_paypal_taxes;
36
-
37
-    protected $_gateway_url;
38
-
39
-    protected $_currencies_supported = array(
40
-        'USD',
41
-        'GBP',
42
-        'CAD',
43
-        'AUD',
44
-        'BRL',
45
-        'CHF',
46
-        'CZK',
47
-        'DKK',
48
-        'EUR',
49
-        'HKD',
50
-        'HUF',
51
-        'ILS',
52
-        'JPY',
53
-        'MXN',
54
-        'MYR',
55
-        'NOK',
56
-        'NZD',
57
-        'PHP',
58
-        'PLN',
59
-        'SEK',
60
-        'SGD',
61
-        'THB',
62
-        'TRY',
63
-        'TWD',
64
-        'RUB'
65
-    );
66
-
67
-
68
-    /**
69
-     * EEG_Paypal_Standard constructor.
70
-     *
71
-     * @return EEG_Paypal_Standard
72
-     */
73
-    public function __construct()
74
-    {
75
-        $this->set_uses_separate_IPN_request(true);
76
-        parent::__construct();
77
-    }
78
-
79
-
80
-    /**
81
-     * Also sets the gateway url class variable based on whether debug mode is enabled or not.
82
-     *
83
-     * @param array $settings_array
84
-     */
85
-    public function set_settings($settings_array)
86
-    {
87
-        parent::set_settings($settings_array);
88
-        $this->_gateway_url = $this->_debug_mode
89
-            ? 'https://www.sandbox.paypal.com/cgi-bin/webscr'
90
-            : 'https://www.paypal.com/cgi-bin/webscr';
91
-    }
92
-
93
-
94
-    /**
95
-     * @param EEI_Payment $payment      the payment to process
96
-     * @param array       $billing_info but should be empty for this gateway
97
-     * @param string      $return_url   URL to send the user to after payment on the payment provider's website
98
-     * @param string      $notify_url   URL to send the instant payment notification
99
-     * @param string      $cancel_url   URL to send the user to after a cancelled payment attempt
100
-     *                                  on the payment provider's website
101
-     * @return EEI_Payment
102
-     * @throws \EE_Error
103
-     */
104
-    public function set_redirection_info(
105
-        $payment,
106
-        $billing_info = array(),
107
-        $return_url = null,
108
-        $notify_url = null,
109
-        $cancel_url = null
110
-    ) {
111
-        $redirect_args = array();
112
-        $transaction = $payment->transaction();
113
-        $gateway_formatter = $this->_get_gateway_formatter();
114
-        $item_num = 1;
115
-        /** @type EE_Line_Item $total_line_item */
116
-        $total_line_item = $transaction->total_line_item();
117
-
118
-        $total_discounts_to_cart_total = $transaction->paid();
119
-        // only itemize the order if we're paying for the rest of the order's amount
120
-        if (EEH_Money::compare_floats($payment->amount(), $transaction->total(), '==')) {
121
-            $payment->update_extra_meta(EEG_Paypal_Standard::itemized_payment_option_name, true);
122
-            // this payment is for the remaining transaction amount,
123
-            // keep track of exactly how much the itemized order amount equals
124
-            $itemized_sum = 0;
125
-            $shipping_previously_added = 0;
126
-            // so let's show all the line items
127
-            foreach ($total_line_item->get_items() as $line_item) {
128
-                if ($line_item instanceof EE_Line_Item) {
129
-                    // it's some kind of discount
130
-                    if ($line_item->total() < 0) {
131
-                        $total_discounts_to_cart_total += abs($line_item->total());
132
-                        $itemized_sum += $line_item->total();
133
-                        continue;
134
-                    }
135
-                    // dont include shipping again.
136
-                    if (strpos($line_item->code(), 'paypal_shipping_') === 0) {
137
-                        $shipping_previously_added = $line_item->total();
138
-                        continue;
139
-                    }
140
-                    $redirect_args[ 'item_name_' . $item_num ] = substr(
141
-                        $gateway_formatter->formatLineItemName($line_item, $payment),
142
-                        0,
143
-                        127
144
-                    );
145
-                    $redirect_args[ 'amount_' . $item_num ] = $line_item->unit_price();
146
-                    $redirect_args[ 'quantity_' . $item_num ] = $line_item->quantity();
147
-                    // if we're not letting PayPal calculate shipping, tell them its 0
148
-                    if (! $this->_paypal_shipping) {
149
-                        $redirect_args[ 'shipping_' . $item_num ] = '0';
150
-                        $redirect_args[ 'shipping2_' . $item_num ] = '0';
151
-                    }
152
-                    $item_num++;
153
-                    $itemized_sum += $line_item->total();
154
-                }
155
-            }
156
-            $taxes_li = $this->_line_item->get_taxes_subtotal($total_line_item);
157
-            // ideally itemized sum equals the transaction total. but if not (which is weird)
158
-            // and the itemized sum is LESS than the transaction total
159
-            // add another line item
160
-            // if the itemized sum is MORE than the transaction total,
161
-            // add the difference it to the discounts
162
-            $itemized_sum_diff_from_txn_total = round(
163
-                $transaction->total() - $itemized_sum - $taxes_li->total() - $shipping_previously_added,
164
-                2
165
-            );
166
-            if ($itemized_sum_diff_from_txn_total < 0) {
167
-                // itemized sum is too big
168
-                $total_discounts_to_cart_total += abs($itemized_sum_diff_from_txn_total);
169
-            } elseif ($itemized_sum_diff_from_txn_total > 0) {
170
-                $redirect_args[ 'item_name_' . $item_num ] = substr(
171
-                    __('Other charges', 'event_espresso'),
172
-                    0,
173
-                    127
174
-                );
175
-                $redirect_args[ 'amount_' . $item_num ] = $gateway_formatter->formatCurrency(
176
-                    $itemized_sum_diff_from_txn_total
177
-                );
178
-                $redirect_args[ 'quantity_' . $item_num ] = 1;
179
-                $item_num++;
180
-            }
181
-            if ($total_discounts_to_cart_total > 0) {
182
-                $redirect_args['discount_amount_cart'] = $gateway_formatter->formatCurrency(
183
-                    $total_discounts_to_cart_total
184
-                );
185
-            }
186
-            // add our taxes to the order if we're NOT using PayPal's
187
-            if (! $this->_paypal_taxes) {
188
-                $redirect_args['tax_cart'] = $total_line_item->get_total_tax();
189
-            }
190
-        } else {
191
-            $payment->update_extra_meta(EEG_Paypal_Standard::itemized_payment_option_name, false);
192
-            // partial payment that's not for the remaining amount, so we can't send an itemized list
193
-            $redirect_args[ 'item_name_' . $item_num ] = substr(
194
-                $gateway_formatter->formatPartialPaymentLineItemName($payment),
195
-                0,
196
-                127
197
-            );
198
-            $redirect_args[ 'amount_' . $item_num ] = $payment->amount();
199
-            $redirect_args[ 'shipping_' . $item_num ] = '0';
200
-            $redirect_args[ 'shipping2_' . $item_num ] = '0';
201
-            $redirect_args['tax_cart'] = '0';
202
-            $item_num++;
203
-        }
204
-
205
-        if ($this->_debug_mode) {
206
-            $redirect_args[ 'item_name_' . $item_num ] = 'DEBUG INFO (this item only added in sandbox mode';
207
-            $redirect_args[ 'amount_' . $item_num ] = 0;
208
-            $redirect_args[ 'on0_'.$item_num ] = 'NOTIFY URL';
209
-            $redirect_args[ 'os0_' . $item_num ] = $notify_url;
210
-            $redirect_args[ 'on1_'.$item_num ] = 'RETURN URL';
211
-            $redirect_args[ 'os1_' . $item_num ] = $return_url;
22
+	/**
23
+	 * Name for the wp option used to save the itemized payment
24
+	 */
25
+	const itemized_payment_option_name = '_itemized_payment';
26
+
27
+	protected $_paypal_id;
28
+
29
+	protected $_image_url;
30
+
31
+	protected $_shipping_details;
32
+
33
+	protected $_paypal_shipping;
34
+
35
+	protected $_paypal_taxes;
36
+
37
+	protected $_gateway_url;
38
+
39
+	protected $_currencies_supported = array(
40
+		'USD',
41
+		'GBP',
42
+		'CAD',
43
+		'AUD',
44
+		'BRL',
45
+		'CHF',
46
+		'CZK',
47
+		'DKK',
48
+		'EUR',
49
+		'HKD',
50
+		'HUF',
51
+		'ILS',
52
+		'JPY',
53
+		'MXN',
54
+		'MYR',
55
+		'NOK',
56
+		'NZD',
57
+		'PHP',
58
+		'PLN',
59
+		'SEK',
60
+		'SGD',
61
+		'THB',
62
+		'TRY',
63
+		'TWD',
64
+		'RUB'
65
+	);
66
+
67
+
68
+	/**
69
+	 * EEG_Paypal_Standard constructor.
70
+	 *
71
+	 * @return EEG_Paypal_Standard
72
+	 */
73
+	public function __construct()
74
+	{
75
+		$this->set_uses_separate_IPN_request(true);
76
+		parent::__construct();
77
+	}
78
+
79
+
80
+	/**
81
+	 * Also sets the gateway url class variable based on whether debug mode is enabled or not.
82
+	 *
83
+	 * @param array $settings_array
84
+	 */
85
+	public function set_settings($settings_array)
86
+	{
87
+		parent::set_settings($settings_array);
88
+		$this->_gateway_url = $this->_debug_mode
89
+			? 'https://www.sandbox.paypal.com/cgi-bin/webscr'
90
+			: 'https://www.paypal.com/cgi-bin/webscr';
91
+	}
92
+
93
+
94
+	/**
95
+	 * @param EEI_Payment $payment      the payment to process
96
+	 * @param array       $billing_info but should be empty for this gateway
97
+	 * @param string      $return_url   URL to send the user to after payment on the payment provider's website
98
+	 * @param string      $notify_url   URL to send the instant payment notification
99
+	 * @param string      $cancel_url   URL to send the user to after a cancelled payment attempt
100
+	 *                                  on the payment provider's website
101
+	 * @return EEI_Payment
102
+	 * @throws \EE_Error
103
+	 */
104
+	public function set_redirection_info(
105
+		$payment,
106
+		$billing_info = array(),
107
+		$return_url = null,
108
+		$notify_url = null,
109
+		$cancel_url = null
110
+	) {
111
+		$redirect_args = array();
112
+		$transaction = $payment->transaction();
113
+		$gateway_formatter = $this->_get_gateway_formatter();
114
+		$item_num = 1;
115
+		/** @type EE_Line_Item $total_line_item */
116
+		$total_line_item = $transaction->total_line_item();
117
+
118
+		$total_discounts_to_cart_total = $transaction->paid();
119
+		// only itemize the order if we're paying for the rest of the order's amount
120
+		if (EEH_Money::compare_floats($payment->amount(), $transaction->total(), '==')) {
121
+			$payment->update_extra_meta(EEG_Paypal_Standard::itemized_payment_option_name, true);
122
+			// this payment is for the remaining transaction amount,
123
+			// keep track of exactly how much the itemized order amount equals
124
+			$itemized_sum = 0;
125
+			$shipping_previously_added = 0;
126
+			// so let's show all the line items
127
+			foreach ($total_line_item->get_items() as $line_item) {
128
+				if ($line_item instanceof EE_Line_Item) {
129
+					// it's some kind of discount
130
+					if ($line_item->total() < 0) {
131
+						$total_discounts_to_cart_total += abs($line_item->total());
132
+						$itemized_sum += $line_item->total();
133
+						continue;
134
+					}
135
+					// dont include shipping again.
136
+					if (strpos($line_item->code(), 'paypal_shipping_') === 0) {
137
+						$shipping_previously_added = $line_item->total();
138
+						continue;
139
+					}
140
+					$redirect_args[ 'item_name_' . $item_num ] = substr(
141
+						$gateway_formatter->formatLineItemName($line_item, $payment),
142
+						0,
143
+						127
144
+					);
145
+					$redirect_args[ 'amount_' . $item_num ] = $line_item->unit_price();
146
+					$redirect_args[ 'quantity_' . $item_num ] = $line_item->quantity();
147
+					// if we're not letting PayPal calculate shipping, tell them its 0
148
+					if (! $this->_paypal_shipping) {
149
+						$redirect_args[ 'shipping_' . $item_num ] = '0';
150
+						$redirect_args[ 'shipping2_' . $item_num ] = '0';
151
+					}
152
+					$item_num++;
153
+					$itemized_sum += $line_item->total();
154
+				}
155
+			}
156
+			$taxes_li = $this->_line_item->get_taxes_subtotal($total_line_item);
157
+			// ideally itemized sum equals the transaction total. but if not (which is weird)
158
+			// and the itemized sum is LESS than the transaction total
159
+			// add another line item
160
+			// if the itemized sum is MORE than the transaction total,
161
+			// add the difference it to the discounts
162
+			$itemized_sum_diff_from_txn_total = round(
163
+				$transaction->total() - $itemized_sum - $taxes_li->total() - $shipping_previously_added,
164
+				2
165
+			);
166
+			if ($itemized_sum_diff_from_txn_total < 0) {
167
+				// itemized sum is too big
168
+				$total_discounts_to_cart_total += abs($itemized_sum_diff_from_txn_total);
169
+			} elseif ($itemized_sum_diff_from_txn_total > 0) {
170
+				$redirect_args[ 'item_name_' . $item_num ] = substr(
171
+					__('Other charges', 'event_espresso'),
172
+					0,
173
+					127
174
+				);
175
+				$redirect_args[ 'amount_' . $item_num ] = $gateway_formatter->formatCurrency(
176
+					$itemized_sum_diff_from_txn_total
177
+				);
178
+				$redirect_args[ 'quantity_' . $item_num ] = 1;
179
+				$item_num++;
180
+			}
181
+			if ($total_discounts_to_cart_total > 0) {
182
+				$redirect_args['discount_amount_cart'] = $gateway_formatter->formatCurrency(
183
+					$total_discounts_to_cart_total
184
+				);
185
+			}
186
+			// add our taxes to the order if we're NOT using PayPal's
187
+			if (! $this->_paypal_taxes) {
188
+				$redirect_args['tax_cart'] = $total_line_item->get_total_tax();
189
+			}
190
+		} else {
191
+			$payment->update_extra_meta(EEG_Paypal_Standard::itemized_payment_option_name, false);
192
+			// partial payment that's not for the remaining amount, so we can't send an itemized list
193
+			$redirect_args[ 'item_name_' . $item_num ] = substr(
194
+				$gateway_formatter->formatPartialPaymentLineItemName($payment),
195
+				0,
196
+				127
197
+			);
198
+			$redirect_args[ 'amount_' . $item_num ] = $payment->amount();
199
+			$redirect_args[ 'shipping_' . $item_num ] = '0';
200
+			$redirect_args[ 'shipping2_' . $item_num ] = '0';
201
+			$redirect_args['tax_cart'] = '0';
202
+			$item_num++;
203
+		}
204
+
205
+		if ($this->_debug_mode) {
206
+			$redirect_args[ 'item_name_' . $item_num ] = 'DEBUG INFO (this item only added in sandbox mode';
207
+			$redirect_args[ 'amount_' . $item_num ] = 0;
208
+			$redirect_args[ 'on0_'.$item_num ] = 'NOTIFY URL';
209
+			$redirect_args[ 'os0_' . $item_num ] = $notify_url;
210
+			$redirect_args[ 'on1_'.$item_num ] = 'RETURN URL';
211
+			$redirect_args[ 'os1_' . $item_num ] = $return_url;
212 212
 //          $redirect_args['option_index_' . $item_num] = 1; // <-- dunno if this is needed ?
213
-            $redirect_args[ 'shipping_' . $item_num ] = '0';
214
-            $redirect_args[ 'shipping2_' . $item_num ] = '0';
215
-        }
216
-
217
-        $redirect_args['business'] = $this->_paypal_id;
218
-        $redirect_args['return'] = $return_url;
219
-        $redirect_args['cancel_return'] = $cancel_url;
220
-        $redirect_args['notify_url'] = $notify_url;
221
-        $redirect_args['cmd'] = '_cart';
222
-        $redirect_args['upload'] = 1;
223
-        $redirect_args['currency_code'] = $payment->currency_code();
224
-        $redirect_args['rm'] = 2;// makes the user return with method=POST
225
-        if ($this->_image_url) {
226
-            $redirect_args['image_url'] = $this->_image_url;
227
-        }
228
-        $redirect_args['no_shipping'] = $this->_shipping_details;
229
-        $redirect_args['bn'] = 'EventEspresso_SP';// EE will blow up if you change this
230
-
231
-        $redirect_args = apply_filters("FHEE__EEG_Paypal_Standard__set_redirection_info__arguments", $redirect_args, $this);
232
-
233
-        $payment->set_redirect_url($this->_gateway_url);
234
-        $payment->set_redirect_args($redirect_args);
235
-        // log the results
236
-        $this->log(
237
-            array(
238
-                'message'     => sprintf(
239
-                    __('PayPal payment request initiated.', 'event_espresso')
240
-                ),
241
-                'transaction' => $transaction->model_field_array(),
242
-            ),
243
-            $payment
244
-        );
245
-        return $payment;
246
-    }
247
-
248
-
249
-    /**
250
-     * Often used for IPNs. But applies the info in $update_info to the payment.
251
-     * What is $update_info? Often the contents of $_REQUEST, but not necessarily. Whatever
252
-     * the payment method passes in.
253
-     *
254
-     * @param array $update_info like $_POST
255
-     * @param EEI_Transaction $transaction
256
-     * @return \EEI_Payment updated
257
-     * @throws \EE_Error, IpnException
258
-     */
259
-    public function handle_payment_update($update_info, $transaction)
260
-    {
261
-        // verify there's payment data that's been sent
262
-        if (empty($update_info['payment_status']) || empty($update_info['txn_id'])) {
263
-            // log the results
264
-            $this->log(
265
-                array(
266
-                    'message'     => sprintf(
267
-                        // @codingStandardsIgnoreStart
268
-                        __('PayPal IPN response is missing critical payment data. This may indicate a PDT request and require your PayPal account settings to be corrected.', 'event_espresso')
269
-                        // @codingStandardsIgnoreEnd
270
-                    ),
271
-                    'update_info' => $update_info,
272
-                ),
273
-                $transaction
274
-            );
275
-            // waaaait... is this a PDT request? (see https://developer.paypal.com/docs/classic/products/payment-data-transfer/)
276
-            // indicated by the "tx" argument? If so, we don't need it. We'll just use the IPN data when it comes
277
-            if (isset($update_info['tx'])) {
278
-                return $transaction->last_payment();
279
-            } else {
280
-                return null;
281
-            }
282
-        }
283
-        $payment = $this->_pay_model->get_payment_by_txn_id_chq_nmbr($update_info['txn_id']);
284
-        if (! $payment instanceof EEI_Payment) {
285
-            $payment = $transaction->last_payment();
286
-        }
287
-        // ok, then validate the IPN. Even if we've already processed this payment,
288
-        // let PayPal know we don't want to hear from them anymore!
289
-        if (! $this->validate_ipn($update_info, $payment)) {
290
-            return $payment;
291
-        }
292
-        // kill request here if this is a refund, we don't support them yet (we'd need to adjust the transaction,
293
-        // registrations, ticket counts, etc)
294
-        if ((
295
-                $update_info['payment_status'] === 'Refunded'
296
-                || $update_info['payment_status'] === 'Partially_Refunded'
297
-            )
298
-            && apply_filters('FHEE__EEG_Paypal_Standard__handle_payment_update__kill_refund_request', true)
299
-        ) {
300
-            throw new EventEspresso\core\exceptions\IpnException(
301
-                sprintf(
302
-                    esc_html__('Event Espresso does not yet support %1$s IPNs from PayPal', 'event_espresso'),
303
-                    $update_info['payment_status']
304
-                ),
305
-                EventEspresso\core\exceptions\IpnException::UNSUPPORTED,
306
-                null,
307
-                $payment,
308
-                $update_info
309
-            );
310
-        }
311
-        // ok, well let's process this payment then!
312
-        switch ($update_info['payment_status']) {
313
-            case 'Completed':
314
-                $status = $this->_pay_model->approved_status();
315
-                $gateway_response = esc_html__('The payment is approved.', 'event_espresso');
316
-                break;
317
-
318
-            case 'Pending':
319
-                $status = $this->_pay_model->pending_status();
320
-                $gateway_response = esc_html__(
321
-                    'The payment is in progress. Another message will be sent when payment is approved.',
322
-                    'event_espresso'
323
-                );
324
-                break;
325
-
326
-            case 'Denied':
327
-                $status = $this->_pay_model->declined_status();
328
-                $gateway_response = esc_html__('The payment has been declined.', 'event_espresso');
329
-                break;
330
-
331
-            case 'Expired':
332
-            case 'Failed':
333
-                $status = $this->_pay_model->failed_status();
334
-                $gateway_response = esc_html__('The payment failed for technical reasons or expired.', 'event_espresso');
335
-                break;
336
-
337
-            case 'Refunded':
338
-            case 'Partially_Refunded':
339
-                // even though it's a refund, we consider the payment as approved, it just has a negative value
340
-                $status = $this->_pay_model->approved_status();
341
-                $gateway_response = esc_html__(
342
-                    'The payment has been refunded. Please update registrations accordingly.',
343
-                    'event_espresso'
344
-                );
345
-                break;
346
-
347
-            case 'Voided':
348
-            case 'Reversed':
349
-            case 'Canceled_Reversal':
350
-            default:
351
-                $status = $this->_pay_model->cancelled_status();
352
-                $gateway_response = esc_html__(
353
-                    'The payment was cancelled, reversed, or voided. Please update registrations accordingly.',
354
-                    'event_espresso'
355
-                );
356
-                break;
357
-        }
358
-
359
-        // check if we've already processed this payment
360
-        if ($payment instanceof EEI_Payment) {
361
-            // payment exists. if this has the exact same status and amount, don't bother updating. just return
362
-            if ($payment->status() === $status && (float) $payment->amount() === (float) $update_info['mc_gross']) {
363
-                // DUPLICATED IPN! don't bother updating transaction
364
-                throw new IpnException(
365
-                    sprintf(
366
-                        esc_html__(
367
-                            'It appears we have received a duplicate IPN from PayPal for payment %d',
368
-                            'event_espresso'
369
-                        ),
370
-                        $payment->ID()
371
-                    ),
372
-                    IpnException::DUPLICATE,
373
-                    null,
374
-                    $payment,
375
-                    $update_info
376
-                );
377
-            } else {
378
-                // new payment yippee !!!
379
-                $payment->set_status($status);
380
-                $payment->set_amount((float) $update_info['mc_gross']);
381
-                $payment->set_gateway_response($gateway_response);
382
-                $payment->set_details($update_info);
383
-                $payment->set_txn_id_chq_nmbr($update_info['txn_id']);
384
-                $this->log(
385
-                    array(
386
-                        'message'  => esc_html__(
387
-                            'Updated payment either from IPN or as part of POST from PayPal',
388
-                            'event_espresso'
389
-                        ),
390
-                        'url'      => $this->_process_response_url(),
391
-                        'payment'  => $payment->model_field_array(),
392
-                        'IPN_data' => $update_info
393
-                    ),
394
-                    $payment
395
-                );
396
-            }
397
-        }
398
-        do_action('FHEE__EEG_Paypal_Standard__handle_payment_update__payment_processed', $payment, $this);
399
-        return $payment;
400
-    }
401
-
402
-
403
-    /**
404
-     * Validate the IPN notification.
405
-     *
406
-     * @param array                  $update_info like $_REQUEST
407
-     * @param EE_Payment|EEI_Payment $payment
408
-     * @return boolean
409
-     * @throws \EE_Error
410
-     */
411
-    public function validate_ipn($update_info, $payment)
412
-    {
413
-        // allow us to skip validating IPNs with PayPal (useful for testing)
414
-        if (apply_filters('FHEE__EEG_Paypal_Standard__validate_ipn__skip', false)) {
415
-            return true;
416
-        }
417
-        // ...otherwise, we actually don't care what the $update_info is, we need to look
418
-        // at the request directly because we can't use $update_info because it has issues with quotes
419
-        // Reading POSTed data directly from $_POST causes serialization issues with array data in the POST.
420
-        // Instead, read raw POST data from the input stream.
421
-        // @see https://gist.github.com/xcommerce-gists/3440401
422
-        $raw_post_data = file_get_contents('php://input');
423
-        $raw_post_array = explode('&', $raw_post_data);
424
-        $update_info = array();
425
-        foreach ($raw_post_array as $keyval) {
426
-            $keyval = explode('=', $keyval);
427
-            if (count($keyval) === 2) {
428
-                $update_info[ $keyval[0] ] = urldecode($keyval[1]);
429
-            }
430
-        }
431
-        // read the IPN message sent from PayPal and prepend 'cmd=_notify-validate'
432
-        $req = 'cmd=_notify-validate';
433
-        $uses_get_magic_quotes = function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc() === 1
434
-            ? true
435
-            : false;
436
-        foreach ($update_info as $key => $value) {
437
-            $value = $uses_get_magic_quotes ? urlencode(stripslashes($value)) : urlencode($value);
438
-            $req .= "&$key=$value";
439
-        }
440
-        // HTTP POST the complete, unaltered IPN back to PayPal
441
-        $response = wp_remote_post(
442
-            $this->_gateway_url,
443
-            array(
444
-                'body'              => $req,
445
-                'sslverify'         => false,
446
-                'timeout'           => 60,
447
-                // make sure to set a site specific unique "user-agent" string since the WordPres default gets declined by PayPal
448
-                // plz see: https://github.com/websharks/s2member/issues/610
449
-                'user-agent'        => 'Event Espresso v' . EVENT_ESPRESSO_VERSION . '; ' . home_url(),
450
-                'httpversion'       => '1.1'
451
-            )
452
-        );
453
-        // then check the response
454
-        if (array_key_exists('body', $response)
455
-            && ! is_wp_error($response)
456
-            && strcmp($response['body'], "VERIFIED") === 0
457
-        ) {
458
-            return true;
459
-        }
460
-        // huh, something's wack... the IPN didn't validate. We must have replied to the IPN incorrectly,
461
-        // or their API must have changed: http://www.paypalobjects.com/en_US/ebook/PP_OrderManagement_IntegrationGuide/ipn.html
462
-        if ($response instanceof WP_Error) {
463
-            $error_msg = sprintf(
464
-                esc_html__('WP Error. Code: "%1$s", Message: "%2$s", Data: "%3$s"', 'event_espresso'),
465
-                $response->get_error_code(),
466
-                $response->get_error_message(),
467
-                print_r($response->get_error_data(), true)
468
-            );
469
-        } elseif (is_array($response) && isset($response['body'])) {
470
-            $error_msg = $response['body'];
471
-        } else {
472
-            $error_msg = print_r($response, true);
473
-        }
474
-        $payment->set_gateway_response(
475
-            sprintf(
476
-                esc_html__("IPN Validation failed! Paypal responded with '%s'", "event_espresso"),
477
-                $error_msg
478
-            )
479
-        );
480
-        $payment->set_details(array('REQUEST' => $update_info, 'VALIDATION_RESPONSE' => $response));
481
-        $payment->set_status(EEM_Payment::status_id_failed);
482
-        // log the results
483
-        $this->log(
484
-            array(
485
-                'url'     => $this->_process_response_url(),
486
-                'message' => $payment->gateway_response(),
487
-                'details' => $payment->details(),
488
-            ),
489
-            $payment
490
-        );
491
-        return false;
492
-    }
493
-
494
-
495
-    /**
496
-     * _process_response_url
497
-     * @return string
498
-     */
499
-    protected function _process_response_url()
500
-    {
501
-        if (isset($_SERVER['HTTP_HOST'], $_SERVER['REQUEST_URI'])) {
502
-            $url = is_ssl() ? 'https://' : 'http://';
503
-            $url .= EEH_URL::filter_input_server_url('HTTP_HOST');
504
-            $url .= EEH_URL::filter_input_server_url();
505
-        } else {
506
-            $url = 'unknown';
507
-        }
508
-        return $url;
509
-    }
510
-
511
-
512
-    /**
513
-     * Updates the transaction and line items based on the payment IPN data from PayPal,
514
-     * like the taxes or shipping
515
-     *
516
-     * @param EEI_Payment $payment
517
-     * @throws \EE_Error
518
-     */
519
-    public function update_txn_based_on_payment($payment)
520
-    {
521
-        $update_info = $payment->details();
522
-        /** @var EE_Transaction $transaction */
523
-        $transaction = $payment->transaction();
524
-        $payment_was_itemized = $payment->get_extra_meta(EEG_Paypal_Standard::itemized_payment_option_name, true, false);
525
-        if (! $transaction) {
526
-            $this->log(
527
-                esc_html__(
528
-                    // @codingStandardsIgnoreStart
529
-                    'Payment with ID %d has no related transaction, and so update_txn_based_on_payment couldn\'t be executed properly',
530
-                    // @codingStandardsIgnoreEnd
531
-                    'event_espresso'
532
-                ),
533
-                $payment
534
-            );
535
-            return;
536
-        }
537
-        if (! is_array($update_info)
538
-            || ! isset($update_info['mc_shipping'])
539
-            || ! isset($update_info['tax'])
540
-        ) {
541
-            $this->log(
542
-                array(
543
-                    'message' => esc_html__(
544
-                        // @codingStandardsIgnoreStart
545
-                        'Could not update transaction based on payment because the payment details have not yet been put on the payment. This normally happens during the IPN or returning from PayPal',
546
-                        // @codingStandardsIgnoreEnd
547
-                        'event_espresso'
548
-                    ),
549
-                    'url'     => $this->_process_response_url(),
550
-                    'payment' => $payment->model_field_array()
551
-                ),
552
-                $payment
553
-            );
554
-            return;
555
-        }
556
-        if ($payment->status() !== $this->_pay_model->approved_status()) {
557
-            $this->log(
558
-                array(
559
-                    'message' => esc_html__(
560
-                        'We shouldn\'t update transactions taxes or shipping data from non-approved payments',
561
-                        'event_espresso'
562
-                    ),
563
-                    'url'     => $this->_process_response_url(),
564
-                    'payment' => $payment->model_field_array()
565
-                ),
566
-                $payment
567
-            );
568
-            return;
569
-        }
570
-        $grand_total_needs_resaving = false;
571
-        /** @var EE_Line_Item $transaction_total_line_item */
572
-        $transaction_total_line_item = $transaction->total_line_item();
573
-
574
-        // might paypal have changed the taxes?
575
-        if ($this->_paypal_taxes && $payment_was_itemized) {
576
-            // note that we're doing this BEFORE adding shipping;
577
-            // we actually want PayPal's shipping to remain non-taxable
578
-            $this->_line_item->set_line_items_taxable($transaction_total_line_item, true, 'paypal_shipping');
579
-            $this->_line_item->set_total_tax_to(
580
-                $transaction_total_line_item,
581
-                (float) $update_info['tax'],
582
-                esc_html__('Taxes', 'event_espresso'),
583
-                esc_html__('Calculated by Paypal', 'event_espresso'),
584
-                'paypal_tax'
585
-            );
586
-            $grand_total_needs_resaving = true;
587
-        }
588
-
589
-        $shipping_amount = (float) $update_info['mc_shipping'];
590
-        // might paypal have added shipping?
591
-        if ($this->_paypal_shipping && $shipping_amount && $payment_was_itemized) {
592
-            $this->_line_item->add_unrelated_item(
593
-                $transaction_total_line_item,
594
-                sprintf(esc_html__('Shipping for transaction %1$s', 'event_espresso'), $transaction->ID()),
595
-                $shipping_amount,
596
-                esc_html__('Shipping charges calculated by Paypal', 'event_espresso'),
597
-                1,
598
-                false,
599
-                'paypal_shipping_' . $transaction->ID()
600
-            );
601
-            $grand_total_needs_resaving = true;
602
-        }
603
-
604
-        if ($grand_total_needs_resaving) {
605
-            $transaction_total_line_item->save_this_and_descendants_to_txn($transaction->ID());
606
-            /** @var EE_Registration_Processor $registration_processor */
607
-            $registration_processor = EE_Registry::instance()->load_class('Registration_Processor');
608
-            $registration_processor->update_registration_final_prices($transaction);
609
-        }
610
-        $this->log(
611
-            array(
612
-                'message'                     => esc_html__('Updated transaction related to payment', 'event_espresso'),
613
-                'url'                         => $this->_process_response_url(),
614
-                'transaction (updated)'       => $transaction->model_field_array(),
615
-                'payment (updated)'           => $payment->model_field_array(),
616
-                'use_paypal_shipping'         => $this->_paypal_shipping,
617
-                'use_paypal_tax'              => $this->_paypal_taxes,
618
-                'grand_total_needed_resaving' => $grand_total_needs_resaving,
619
-            ),
620
-            $payment
621
-        );
622
-    }
213
+			$redirect_args[ 'shipping_' . $item_num ] = '0';
214
+			$redirect_args[ 'shipping2_' . $item_num ] = '0';
215
+		}
216
+
217
+		$redirect_args['business'] = $this->_paypal_id;
218
+		$redirect_args['return'] = $return_url;
219
+		$redirect_args['cancel_return'] = $cancel_url;
220
+		$redirect_args['notify_url'] = $notify_url;
221
+		$redirect_args['cmd'] = '_cart';
222
+		$redirect_args['upload'] = 1;
223
+		$redirect_args['currency_code'] = $payment->currency_code();
224
+		$redirect_args['rm'] = 2;// makes the user return with method=POST
225
+		if ($this->_image_url) {
226
+			$redirect_args['image_url'] = $this->_image_url;
227
+		}
228
+		$redirect_args['no_shipping'] = $this->_shipping_details;
229
+		$redirect_args['bn'] = 'EventEspresso_SP';// EE will blow up if you change this
230
+
231
+		$redirect_args = apply_filters("FHEE__EEG_Paypal_Standard__set_redirection_info__arguments", $redirect_args, $this);
232
+
233
+		$payment->set_redirect_url($this->_gateway_url);
234
+		$payment->set_redirect_args($redirect_args);
235
+		// log the results
236
+		$this->log(
237
+			array(
238
+				'message'     => sprintf(
239
+					__('PayPal payment request initiated.', 'event_espresso')
240
+				),
241
+				'transaction' => $transaction->model_field_array(),
242
+			),
243
+			$payment
244
+		);
245
+		return $payment;
246
+	}
247
+
248
+
249
+	/**
250
+	 * Often used for IPNs. But applies the info in $update_info to the payment.
251
+	 * What is $update_info? Often the contents of $_REQUEST, but not necessarily. Whatever
252
+	 * the payment method passes in.
253
+	 *
254
+	 * @param array $update_info like $_POST
255
+	 * @param EEI_Transaction $transaction
256
+	 * @return \EEI_Payment updated
257
+	 * @throws \EE_Error, IpnException
258
+	 */
259
+	public function handle_payment_update($update_info, $transaction)
260
+	{
261
+		// verify there's payment data that's been sent
262
+		if (empty($update_info['payment_status']) || empty($update_info['txn_id'])) {
263
+			// log the results
264
+			$this->log(
265
+				array(
266
+					'message'     => sprintf(
267
+						// @codingStandardsIgnoreStart
268
+						__('PayPal IPN response is missing critical payment data. This may indicate a PDT request and require your PayPal account settings to be corrected.', 'event_espresso')
269
+						// @codingStandardsIgnoreEnd
270
+					),
271
+					'update_info' => $update_info,
272
+				),
273
+				$transaction
274
+			);
275
+			// waaaait... is this a PDT request? (see https://developer.paypal.com/docs/classic/products/payment-data-transfer/)
276
+			// indicated by the "tx" argument? If so, we don't need it. We'll just use the IPN data when it comes
277
+			if (isset($update_info['tx'])) {
278
+				return $transaction->last_payment();
279
+			} else {
280
+				return null;
281
+			}
282
+		}
283
+		$payment = $this->_pay_model->get_payment_by_txn_id_chq_nmbr($update_info['txn_id']);
284
+		if (! $payment instanceof EEI_Payment) {
285
+			$payment = $transaction->last_payment();
286
+		}
287
+		// ok, then validate the IPN. Even if we've already processed this payment,
288
+		// let PayPal know we don't want to hear from them anymore!
289
+		if (! $this->validate_ipn($update_info, $payment)) {
290
+			return $payment;
291
+		}
292
+		// kill request here if this is a refund, we don't support them yet (we'd need to adjust the transaction,
293
+		// registrations, ticket counts, etc)
294
+		if ((
295
+				$update_info['payment_status'] === 'Refunded'
296
+				|| $update_info['payment_status'] === 'Partially_Refunded'
297
+			)
298
+			&& apply_filters('FHEE__EEG_Paypal_Standard__handle_payment_update__kill_refund_request', true)
299
+		) {
300
+			throw new EventEspresso\core\exceptions\IpnException(
301
+				sprintf(
302
+					esc_html__('Event Espresso does not yet support %1$s IPNs from PayPal', 'event_espresso'),
303
+					$update_info['payment_status']
304
+				),
305
+				EventEspresso\core\exceptions\IpnException::UNSUPPORTED,
306
+				null,
307
+				$payment,
308
+				$update_info
309
+			);
310
+		}
311
+		// ok, well let's process this payment then!
312
+		switch ($update_info['payment_status']) {
313
+			case 'Completed':
314
+				$status = $this->_pay_model->approved_status();
315
+				$gateway_response = esc_html__('The payment is approved.', 'event_espresso');
316
+				break;
317
+
318
+			case 'Pending':
319
+				$status = $this->_pay_model->pending_status();
320
+				$gateway_response = esc_html__(
321
+					'The payment is in progress. Another message will be sent when payment is approved.',
322
+					'event_espresso'
323
+				);
324
+				break;
325
+
326
+			case 'Denied':
327
+				$status = $this->_pay_model->declined_status();
328
+				$gateway_response = esc_html__('The payment has been declined.', 'event_espresso');
329
+				break;
330
+
331
+			case 'Expired':
332
+			case 'Failed':
333
+				$status = $this->_pay_model->failed_status();
334
+				$gateway_response = esc_html__('The payment failed for technical reasons or expired.', 'event_espresso');
335
+				break;
336
+
337
+			case 'Refunded':
338
+			case 'Partially_Refunded':
339
+				// even though it's a refund, we consider the payment as approved, it just has a negative value
340
+				$status = $this->_pay_model->approved_status();
341
+				$gateway_response = esc_html__(
342
+					'The payment has been refunded. Please update registrations accordingly.',
343
+					'event_espresso'
344
+				);
345
+				break;
346
+
347
+			case 'Voided':
348
+			case 'Reversed':
349
+			case 'Canceled_Reversal':
350
+			default:
351
+				$status = $this->_pay_model->cancelled_status();
352
+				$gateway_response = esc_html__(
353
+					'The payment was cancelled, reversed, or voided. Please update registrations accordingly.',
354
+					'event_espresso'
355
+				);
356
+				break;
357
+		}
358
+
359
+		// check if we've already processed this payment
360
+		if ($payment instanceof EEI_Payment) {
361
+			// payment exists. if this has the exact same status and amount, don't bother updating. just return
362
+			if ($payment->status() === $status && (float) $payment->amount() === (float) $update_info['mc_gross']) {
363
+				// DUPLICATED IPN! don't bother updating transaction
364
+				throw new IpnException(
365
+					sprintf(
366
+						esc_html__(
367
+							'It appears we have received a duplicate IPN from PayPal for payment %d',
368
+							'event_espresso'
369
+						),
370
+						$payment->ID()
371
+					),
372
+					IpnException::DUPLICATE,
373
+					null,
374
+					$payment,
375
+					$update_info
376
+				);
377
+			} else {
378
+				// new payment yippee !!!
379
+				$payment->set_status($status);
380
+				$payment->set_amount((float) $update_info['mc_gross']);
381
+				$payment->set_gateway_response($gateway_response);
382
+				$payment->set_details($update_info);
383
+				$payment->set_txn_id_chq_nmbr($update_info['txn_id']);
384
+				$this->log(
385
+					array(
386
+						'message'  => esc_html__(
387
+							'Updated payment either from IPN or as part of POST from PayPal',
388
+							'event_espresso'
389
+						),
390
+						'url'      => $this->_process_response_url(),
391
+						'payment'  => $payment->model_field_array(),
392
+						'IPN_data' => $update_info
393
+					),
394
+					$payment
395
+				);
396
+			}
397
+		}
398
+		do_action('FHEE__EEG_Paypal_Standard__handle_payment_update__payment_processed', $payment, $this);
399
+		return $payment;
400
+	}
401
+
402
+
403
+	/**
404
+	 * Validate the IPN notification.
405
+	 *
406
+	 * @param array                  $update_info like $_REQUEST
407
+	 * @param EE_Payment|EEI_Payment $payment
408
+	 * @return boolean
409
+	 * @throws \EE_Error
410
+	 */
411
+	public function validate_ipn($update_info, $payment)
412
+	{
413
+		// allow us to skip validating IPNs with PayPal (useful for testing)
414
+		if (apply_filters('FHEE__EEG_Paypal_Standard__validate_ipn__skip', false)) {
415
+			return true;
416
+		}
417
+		// ...otherwise, we actually don't care what the $update_info is, we need to look
418
+		// at the request directly because we can't use $update_info because it has issues with quotes
419
+		// Reading POSTed data directly from $_POST causes serialization issues with array data in the POST.
420
+		// Instead, read raw POST data from the input stream.
421
+		// @see https://gist.github.com/xcommerce-gists/3440401
422
+		$raw_post_data = file_get_contents('php://input');
423
+		$raw_post_array = explode('&', $raw_post_data);
424
+		$update_info = array();
425
+		foreach ($raw_post_array as $keyval) {
426
+			$keyval = explode('=', $keyval);
427
+			if (count($keyval) === 2) {
428
+				$update_info[ $keyval[0] ] = urldecode($keyval[1]);
429
+			}
430
+		}
431
+		// read the IPN message sent from PayPal and prepend 'cmd=_notify-validate'
432
+		$req = 'cmd=_notify-validate';
433
+		$uses_get_magic_quotes = function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc() === 1
434
+			? true
435
+			: false;
436
+		foreach ($update_info as $key => $value) {
437
+			$value = $uses_get_magic_quotes ? urlencode(stripslashes($value)) : urlencode($value);
438
+			$req .= "&$key=$value";
439
+		}
440
+		// HTTP POST the complete, unaltered IPN back to PayPal
441
+		$response = wp_remote_post(
442
+			$this->_gateway_url,
443
+			array(
444
+				'body'              => $req,
445
+				'sslverify'         => false,
446
+				'timeout'           => 60,
447
+				// make sure to set a site specific unique "user-agent" string since the WordPres default gets declined by PayPal
448
+				// plz see: https://github.com/websharks/s2member/issues/610
449
+				'user-agent'        => 'Event Espresso v' . EVENT_ESPRESSO_VERSION . '; ' . home_url(),
450
+				'httpversion'       => '1.1'
451
+			)
452
+		);
453
+		// then check the response
454
+		if (array_key_exists('body', $response)
455
+			&& ! is_wp_error($response)
456
+			&& strcmp($response['body'], "VERIFIED") === 0
457
+		) {
458
+			return true;
459
+		}
460
+		// huh, something's wack... the IPN didn't validate. We must have replied to the IPN incorrectly,
461
+		// or their API must have changed: http://www.paypalobjects.com/en_US/ebook/PP_OrderManagement_IntegrationGuide/ipn.html
462
+		if ($response instanceof WP_Error) {
463
+			$error_msg = sprintf(
464
+				esc_html__('WP Error. Code: "%1$s", Message: "%2$s", Data: "%3$s"', 'event_espresso'),
465
+				$response->get_error_code(),
466
+				$response->get_error_message(),
467
+				print_r($response->get_error_data(), true)
468
+			);
469
+		} elseif (is_array($response) && isset($response['body'])) {
470
+			$error_msg = $response['body'];
471
+		} else {
472
+			$error_msg = print_r($response, true);
473
+		}
474
+		$payment->set_gateway_response(
475
+			sprintf(
476
+				esc_html__("IPN Validation failed! Paypal responded with '%s'", "event_espresso"),
477
+				$error_msg
478
+			)
479
+		);
480
+		$payment->set_details(array('REQUEST' => $update_info, 'VALIDATION_RESPONSE' => $response));
481
+		$payment->set_status(EEM_Payment::status_id_failed);
482
+		// log the results
483
+		$this->log(
484
+			array(
485
+				'url'     => $this->_process_response_url(),
486
+				'message' => $payment->gateway_response(),
487
+				'details' => $payment->details(),
488
+			),
489
+			$payment
490
+		);
491
+		return false;
492
+	}
493
+
494
+
495
+	/**
496
+	 * _process_response_url
497
+	 * @return string
498
+	 */
499
+	protected function _process_response_url()
500
+	{
501
+		if (isset($_SERVER['HTTP_HOST'], $_SERVER['REQUEST_URI'])) {
502
+			$url = is_ssl() ? 'https://' : 'http://';
503
+			$url .= EEH_URL::filter_input_server_url('HTTP_HOST');
504
+			$url .= EEH_URL::filter_input_server_url();
505
+		} else {
506
+			$url = 'unknown';
507
+		}
508
+		return $url;
509
+	}
510
+
511
+
512
+	/**
513
+	 * Updates the transaction and line items based on the payment IPN data from PayPal,
514
+	 * like the taxes or shipping
515
+	 *
516
+	 * @param EEI_Payment $payment
517
+	 * @throws \EE_Error
518
+	 */
519
+	public function update_txn_based_on_payment($payment)
520
+	{
521
+		$update_info = $payment->details();
522
+		/** @var EE_Transaction $transaction */
523
+		$transaction = $payment->transaction();
524
+		$payment_was_itemized = $payment->get_extra_meta(EEG_Paypal_Standard::itemized_payment_option_name, true, false);
525
+		if (! $transaction) {
526
+			$this->log(
527
+				esc_html__(
528
+					// @codingStandardsIgnoreStart
529
+					'Payment with ID %d has no related transaction, and so update_txn_based_on_payment couldn\'t be executed properly',
530
+					// @codingStandardsIgnoreEnd
531
+					'event_espresso'
532
+				),
533
+				$payment
534
+			);
535
+			return;
536
+		}
537
+		if (! is_array($update_info)
538
+			|| ! isset($update_info['mc_shipping'])
539
+			|| ! isset($update_info['tax'])
540
+		) {
541
+			$this->log(
542
+				array(
543
+					'message' => esc_html__(
544
+						// @codingStandardsIgnoreStart
545
+						'Could not update transaction based on payment because the payment details have not yet been put on the payment. This normally happens during the IPN or returning from PayPal',
546
+						// @codingStandardsIgnoreEnd
547
+						'event_espresso'
548
+					),
549
+					'url'     => $this->_process_response_url(),
550
+					'payment' => $payment->model_field_array()
551
+				),
552
+				$payment
553
+			);
554
+			return;
555
+		}
556
+		if ($payment->status() !== $this->_pay_model->approved_status()) {
557
+			$this->log(
558
+				array(
559
+					'message' => esc_html__(
560
+						'We shouldn\'t update transactions taxes or shipping data from non-approved payments',
561
+						'event_espresso'
562
+					),
563
+					'url'     => $this->_process_response_url(),
564
+					'payment' => $payment->model_field_array()
565
+				),
566
+				$payment
567
+			);
568
+			return;
569
+		}
570
+		$grand_total_needs_resaving = false;
571
+		/** @var EE_Line_Item $transaction_total_line_item */
572
+		$transaction_total_line_item = $transaction->total_line_item();
573
+
574
+		// might paypal have changed the taxes?
575
+		if ($this->_paypal_taxes && $payment_was_itemized) {
576
+			// note that we're doing this BEFORE adding shipping;
577
+			// we actually want PayPal's shipping to remain non-taxable
578
+			$this->_line_item->set_line_items_taxable($transaction_total_line_item, true, 'paypal_shipping');
579
+			$this->_line_item->set_total_tax_to(
580
+				$transaction_total_line_item,
581
+				(float) $update_info['tax'],
582
+				esc_html__('Taxes', 'event_espresso'),
583
+				esc_html__('Calculated by Paypal', 'event_espresso'),
584
+				'paypal_tax'
585
+			);
586
+			$grand_total_needs_resaving = true;
587
+		}
588
+
589
+		$shipping_amount = (float) $update_info['mc_shipping'];
590
+		// might paypal have added shipping?
591
+		if ($this->_paypal_shipping && $shipping_amount && $payment_was_itemized) {
592
+			$this->_line_item->add_unrelated_item(
593
+				$transaction_total_line_item,
594
+				sprintf(esc_html__('Shipping for transaction %1$s', 'event_espresso'), $transaction->ID()),
595
+				$shipping_amount,
596
+				esc_html__('Shipping charges calculated by Paypal', 'event_espresso'),
597
+				1,
598
+				false,
599
+				'paypal_shipping_' . $transaction->ID()
600
+			);
601
+			$grand_total_needs_resaving = true;
602
+		}
603
+
604
+		if ($grand_total_needs_resaving) {
605
+			$transaction_total_line_item->save_this_and_descendants_to_txn($transaction->ID());
606
+			/** @var EE_Registration_Processor $registration_processor */
607
+			$registration_processor = EE_Registry::instance()->load_class('Registration_Processor');
608
+			$registration_processor->update_registration_final_prices($transaction);
609
+		}
610
+		$this->log(
611
+			array(
612
+				'message'                     => esc_html__('Updated transaction related to payment', 'event_espresso'),
613
+				'url'                         => $this->_process_response_url(),
614
+				'transaction (updated)'       => $transaction->model_field_array(),
615
+				'payment (updated)'           => $payment->model_field_array(),
616
+				'use_paypal_shipping'         => $this->_paypal_shipping,
617
+				'use_paypal_tax'              => $this->_paypal_taxes,
618
+				'grand_total_needed_resaving' => $grand_total_needs_resaving,
619
+			),
620
+			$payment
621
+		);
622
+	}
623 623
 }
Please login to merge, or discard this patch.
Spacing   +31 added lines, -31 removed lines patch added patch discarded remove patch
@@ -137,17 +137,17 @@  discard block
 block discarded – undo
137 137
                         $shipping_previously_added = $line_item->total();
138 138
                         continue;
139 139
                     }
140
-                    $redirect_args[ 'item_name_' . $item_num ] = substr(
140
+                    $redirect_args['item_name_'.$item_num] = substr(
141 141
                         $gateway_formatter->formatLineItemName($line_item, $payment),
142 142
                         0,
143 143
                         127
144 144
                     );
145
-                    $redirect_args[ 'amount_' . $item_num ] = $line_item->unit_price();
146
-                    $redirect_args[ 'quantity_' . $item_num ] = $line_item->quantity();
145
+                    $redirect_args['amount_'.$item_num] = $line_item->unit_price();
146
+                    $redirect_args['quantity_'.$item_num] = $line_item->quantity();
147 147
                     // if we're not letting PayPal calculate shipping, tell them its 0
148
-                    if (! $this->_paypal_shipping) {
149
-                        $redirect_args[ 'shipping_' . $item_num ] = '0';
150
-                        $redirect_args[ 'shipping2_' . $item_num ] = '0';
148
+                    if ( ! $this->_paypal_shipping) {
149
+                        $redirect_args['shipping_'.$item_num] = '0';
150
+                        $redirect_args['shipping2_'.$item_num] = '0';
151 151
                     }
152 152
                     $item_num++;
153 153
                     $itemized_sum += $line_item->total();
@@ -167,15 +167,15 @@  discard block
 block discarded – undo
167 167
                 // itemized sum is too big
168 168
                 $total_discounts_to_cart_total += abs($itemized_sum_diff_from_txn_total);
169 169
             } elseif ($itemized_sum_diff_from_txn_total > 0) {
170
-                $redirect_args[ 'item_name_' . $item_num ] = substr(
170
+                $redirect_args['item_name_'.$item_num] = substr(
171 171
                     __('Other charges', 'event_espresso'),
172 172
                     0,
173 173
                     127
174 174
                 );
175
-                $redirect_args[ 'amount_' . $item_num ] = $gateway_formatter->formatCurrency(
175
+                $redirect_args['amount_'.$item_num] = $gateway_formatter->formatCurrency(
176 176
                     $itemized_sum_diff_from_txn_total
177 177
                 );
178
-                $redirect_args[ 'quantity_' . $item_num ] = 1;
178
+                $redirect_args['quantity_'.$item_num] = 1;
179 179
                 $item_num++;
180 180
             }
181 181
             if ($total_discounts_to_cart_total > 0) {
@@ -184,34 +184,34 @@  discard block
 block discarded – undo
184 184
                 );
185 185
             }
186 186
             // add our taxes to the order if we're NOT using PayPal's
187
-            if (! $this->_paypal_taxes) {
187
+            if ( ! $this->_paypal_taxes) {
188 188
                 $redirect_args['tax_cart'] = $total_line_item->get_total_tax();
189 189
             }
190 190
         } else {
191 191
             $payment->update_extra_meta(EEG_Paypal_Standard::itemized_payment_option_name, false);
192 192
             // partial payment that's not for the remaining amount, so we can't send an itemized list
193
-            $redirect_args[ 'item_name_' . $item_num ] = substr(
193
+            $redirect_args['item_name_'.$item_num] = substr(
194 194
                 $gateway_formatter->formatPartialPaymentLineItemName($payment),
195 195
                 0,
196 196
                 127
197 197
             );
198
-            $redirect_args[ 'amount_' . $item_num ] = $payment->amount();
199
-            $redirect_args[ 'shipping_' . $item_num ] = '0';
200
-            $redirect_args[ 'shipping2_' . $item_num ] = '0';
198
+            $redirect_args['amount_'.$item_num] = $payment->amount();
199
+            $redirect_args['shipping_'.$item_num] = '0';
200
+            $redirect_args['shipping2_'.$item_num] = '0';
201 201
             $redirect_args['tax_cart'] = '0';
202 202
             $item_num++;
203 203
         }
204 204
 
205 205
         if ($this->_debug_mode) {
206
-            $redirect_args[ 'item_name_' . $item_num ] = 'DEBUG INFO (this item only added in sandbox mode';
207
-            $redirect_args[ 'amount_' . $item_num ] = 0;
208
-            $redirect_args[ 'on0_'.$item_num ] = 'NOTIFY URL';
209
-            $redirect_args[ 'os0_' . $item_num ] = $notify_url;
210
-            $redirect_args[ 'on1_'.$item_num ] = 'RETURN URL';
211
-            $redirect_args[ 'os1_' . $item_num ] = $return_url;
206
+            $redirect_args['item_name_'.$item_num] = 'DEBUG INFO (this item only added in sandbox mode';
207
+            $redirect_args['amount_'.$item_num] = 0;
208
+            $redirect_args['on0_'.$item_num] = 'NOTIFY URL';
209
+            $redirect_args['os0_'.$item_num] = $notify_url;
210
+            $redirect_args['on1_'.$item_num] = 'RETURN URL';
211
+            $redirect_args['os1_'.$item_num] = $return_url;
212 212
 //          $redirect_args['option_index_' . $item_num] = 1; // <-- dunno if this is needed ?
213
-            $redirect_args[ 'shipping_' . $item_num ] = '0';
214
-            $redirect_args[ 'shipping2_' . $item_num ] = '0';
213
+            $redirect_args['shipping_'.$item_num] = '0';
214
+            $redirect_args['shipping2_'.$item_num] = '0';
215 215
         }
216 216
 
217 217
         $redirect_args['business'] = $this->_paypal_id;
@@ -221,12 +221,12 @@  discard block
 block discarded – undo
221 221
         $redirect_args['cmd'] = '_cart';
222 222
         $redirect_args['upload'] = 1;
223 223
         $redirect_args['currency_code'] = $payment->currency_code();
224
-        $redirect_args['rm'] = 2;// makes the user return with method=POST
224
+        $redirect_args['rm'] = 2; // makes the user return with method=POST
225 225
         if ($this->_image_url) {
226 226
             $redirect_args['image_url'] = $this->_image_url;
227 227
         }
228 228
         $redirect_args['no_shipping'] = $this->_shipping_details;
229
-        $redirect_args['bn'] = 'EventEspresso_SP';// EE will blow up if you change this
229
+        $redirect_args['bn'] = 'EventEspresso_SP'; // EE will blow up if you change this
230 230
 
231 231
         $redirect_args = apply_filters("FHEE__EEG_Paypal_Standard__set_redirection_info__arguments", $redirect_args, $this);
232 232
 
@@ -281,12 +281,12 @@  discard block
 block discarded – undo
281 281
             }
282 282
         }
283 283
         $payment = $this->_pay_model->get_payment_by_txn_id_chq_nmbr($update_info['txn_id']);
284
-        if (! $payment instanceof EEI_Payment) {
284
+        if ( ! $payment instanceof EEI_Payment) {
285 285
             $payment = $transaction->last_payment();
286 286
         }
287 287
         // ok, then validate the IPN. Even if we've already processed this payment,
288 288
         // let PayPal know we don't want to hear from them anymore!
289
-        if (! $this->validate_ipn($update_info, $payment)) {
289
+        if ( ! $this->validate_ipn($update_info, $payment)) {
290 290
             return $payment;
291 291
         }
292 292
         // kill request here if this is a refund, we don't support them yet (we'd need to adjust the transaction,
@@ -425,7 +425,7 @@  discard block
 block discarded – undo
425 425
         foreach ($raw_post_array as $keyval) {
426 426
             $keyval = explode('=', $keyval);
427 427
             if (count($keyval) === 2) {
428
-                $update_info[ $keyval[0] ] = urldecode($keyval[1]);
428
+                $update_info[$keyval[0]] = urldecode($keyval[1]);
429 429
             }
430 430
         }
431 431
         // read the IPN message sent from PayPal and prepend 'cmd=_notify-validate'
@@ -446,7 +446,7 @@  discard block
 block discarded – undo
446 446
                 'timeout'           => 60,
447 447
                 // make sure to set a site specific unique "user-agent" string since the WordPres default gets declined by PayPal
448 448
                 // plz see: https://github.com/websharks/s2member/issues/610
449
-                'user-agent'        => 'Event Espresso v' . EVENT_ESPRESSO_VERSION . '; ' . home_url(),
449
+                'user-agent'        => 'Event Espresso v'.EVENT_ESPRESSO_VERSION.'; '.home_url(),
450 450
                 'httpversion'       => '1.1'
451 451
             )
452 452
         );
@@ -522,7 +522,7 @@  discard block
 block discarded – undo
522 522
         /** @var EE_Transaction $transaction */
523 523
         $transaction = $payment->transaction();
524 524
         $payment_was_itemized = $payment->get_extra_meta(EEG_Paypal_Standard::itemized_payment_option_name, true, false);
525
-        if (! $transaction) {
525
+        if ( ! $transaction) {
526 526
             $this->log(
527 527
                 esc_html__(
528 528
                     // @codingStandardsIgnoreStart
@@ -534,7 +534,7 @@  discard block
 block discarded – undo
534 534
             );
535 535
             return;
536 536
         }
537
-        if (! is_array($update_info)
537
+        if ( ! is_array($update_info)
538 538
             || ! isset($update_info['mc_shipping'])
539 539
             || ! isset($update_info['tax'])
540 540
         ) {
@@ -596,7 +596,7 @@  discard block
 block discarded – undo
596 596
                 esc_html__('Shipping charges calculated by Paypal', 'event_espresso'),
597 597
                 1,
598 598
                 false,
599
-                'paypal_shipping_' . $transaction->ID()
599
+                'paypal_shipping_'.$transaction->ID()
600 600
             );
601 601
             $grand_total_needs_resaving = true;
602 602
         }
Please login to merge, or discard this patch.
Paypal_Standard/templates/paypal_standard_intro.template.php 1 patch
Indentation   +7 added lines, -7 removed lines patch added patch discarded remove patch
@@ -3,13 +3,13 @@
 block discarded – undo
3 3
 // if this is decaf, which is put on WordPress.org, we need to inform users that
4 4
 // we just put an affiliate link there. See https://developer.wordpress.org/plugins/wordpress-org/detailed-plugin-guidelines/ section 12
5 5
 if (apply_filters('FHEE__ee_show_affiliate_links', true)) {
6
-    $closing_tag .= esc_html__(' (affiliate link)', 'event_espresso');
6
+	$closing_tag .= esc_html__(' (affiliate link)', 'event_espresso');
7 7
 }
8 8
 printf(
9
-    esc_html__(
10
-        'PayPal Standard (PayPal Payments Standard) is an off-site payment method and is available to event organizers in many countries. A PayPal premier or business account is needed to accept payments. Need a PayPal account? Call 1-855-456-1338 or %1$sclick here to sign up for a merchant account%2$s.',
11
-        'event_espresso'
12
-    ),
13
-    '<a href="https://eventespresso.com/go/paypalstandard/" target="_blank">',
14
-    $closing_tag
9
+	esc_html__(
10
+		'PayPal Standard (PayPal Payments Standard) is an off-site payment method and is available to event organizers in many countries. A PayPal premier or business account is needed to accept payments. Need a PayPal account? Call 1-855-456-1338 or %1$sclick here to sign up for a merchant account%2$s.',
11
+		'event_espresso'
12
+	),
13
+	'<a href="https://eventespresso.com/go/paypalstandard/" target="_blank">',
14
+	$closing_tag
15 15
 );
Please login to merge, or discard this patch.
payment_methods/Check/templates/check_intro.template.php 1 patch
Indentation   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -1,4 +1,4 @@
 block discarded – undo
1 1
 <?php esc_html_e(
2
-    'Check is an offline payment method for accepting payments. Payments are processed manually by providing your registrants/attendees with information on how to pay with a check.',
3
-    'event_espresso'
2
+	'Check is an offline payment method for accepting payments. Payments are processed manually by providing your registrants/attendees with information on how to pay with a check.',
3
+	'event_espresso'
4 4
 );
Please login to merge, or discard this patch.
payment_methods/Admin_Only/EE_PMT_Admin_Only.pm.php 1 patch
Indentation   +34 added lines, -34 removed lines patch added patch discarded remove patch
@@ -16,38 +16,38 @@
 block discarded – undo
16 16
 
17 17
 
18 18
 
19
-    /**
20
-     *
21
-     * @param EE_Payment_Method $pm_instance
22
-     * @return EE_PMT_Admin_Only
23
-     */
24
-    public function __construct($pm_instance = null)
25
-    {
26
-        $this->_pretty_name = __("Admin Only", 'event_espresso');
27
-        $this->_default_button_url = '';
28
-        parent::__construct($pm_instance);
29
-    }
30
-
31
-
32
-
33
-    /**
34
-     * Creates the billing form for this payment method type
35
-     * @param \EE_Transaction $transaction
36
-     * @return NULL
37
-     */
38
-    public function generate_new_billing_form(EE_Transaction $transaction = null)
39
-    {
40
-        return null;
41
-    }
42
-
43
-
44
-
45
-    /**
46
-     * Gets the form for all the settings related to this payment method type
47
-     * @return EE_Payment_Method_Form
48
-     */
49
-    public function generate_new_settings_form()
50
-    {
51
-        return new EE_Payment_Method_Form();
52
-    }
19
+	/**
20
+	 *
21
+	 * @param EE_Payment_Method $pm_instance
22
+	 * @return EE_PMT_Admin_Only
23
+	 */
24
+	public function __construct($pm_instance = null)
25
+	{
26
+		$this->_pretty_name = __("Admin Only", 'event_espresso');
27
+		$this->_default_button_url = '';
28
+		parent::__construct($pm_instance);
29
+	}
30
+
31
+
32
+
33
+	/**
34
+	 * Creates the billing form for this payment method type
35
+	 * @param \EE_Transaction $transaction
36
+	 * @return NULL
37
+	 */
38
+	public function generate_new_billing_form(EE_Transaction $transaction = null)
39
+	{
40
+		return null;
41
+	}
42
+
43
+
44
+
45
+	/**
46
+	 * Gets the form for all the settings related to this payment method type
47
+	 * @return EE_Payment_Method_Form
48
+	 */
49
+	public function generate_new_settings_form()
50
+	{
51
+		return new EE_Payment_Method_Form();
52
+	}
53 53
 }
Please login to merge, or discard this patch.
payment_methods/Bank/templates/bank_intro.template.php 1 patch
Indentation   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -1,4 +1,4 @@
 block discarded – undo
1 1
 <?php esc_html_e(
2
-    'Bank is an offline payment method for accepting payments. Payments are processed manually by providing your registrants/attendees with information on how to pay with a bank transfer.',
3
-    'event_espresso'
2
+	'Bank is an offline payment method for accepting payments. Payments are processed manually by providing your registrants/attendees with information on how to pay with a bank transfer.',
3
+	'event_espresso'
4 4
 );
Please login to merge, or discard this patch.
caffeinated/admin/new/pricing/Pricing_Admin_Page.core.php 2 patches
Indentation   +1412 added lines, -1412 removed lines patch added patch discarded remove patch
@@ -12,1420 +12,1420 @@
 block discarded – undo
12 12
 class Pricing_Admin_Page extends EE_Admin_Page
13 13
 {
14 14
 
15
-    /**
16
-     *    constructor
17
-     *
18
-     * @Constructor
19
-     * @access public
20
-     * @param bool $routing
21
-     * @return Pricing_Admin_Page
22
-     */
23
-    public function __construct($routing = true)
24
-    {
25
-        parent::__construct($routing);
26
-    }
27
-
28
-
29
-    protected function _init_page_props()
30
-    {
31
-        $this->page_slug = PRICING_PG_SLUG;
32
-        $this->page_label = PRICING_LABEL;
33
-        $this->_admin_base_url = PRICING_ADMIN_URL;
34
-        $this->_admin_base_path = PRICING_ADMIN;
35
-    }
36
-
37
-
38
-    protected function _ajax_hooks()
39
-    {
40
-        add_action('wp_ajax_espresso_update_prices_order', array($this, 'update_price_order'));
41
-    }
42
-
43
-
44
-    protected function _define_page_props()
45
-    {
46
-        $this->_admin_page_title = PRICING_LABEL;
47
-        $this->_labels = array(
48
-            'buttons' => array(
49
-                'add'         => __('Add New Default Price', 'event_espresso'),
50
-                'edit'        => __('Edit Default Price', 'event_espresso'),
51
-                'delete'      => __('Delete Default Price', 'event_espresso'),
52
-                'add_type'    => __('Add New Default Price Type', 'event_espresso'),
53
-                'edit_type'   => __('Edit Price Type', 'event_espresso'),
54
-                'delete_type' => __('Delete Price Type', 'event_espresso'),
55
-            ),
56
-        );
57
-    }
58
-
59
-
60
-    /**
61
-     *        an array for storing request actions and their corresponding methods
62
-     *
63
-     * @access private
64
-     * @return void
65
-     */
66
-    protected function _set_page_routes()
67
-    {
68
-        $prc_id = ! empty($this->_req_data['PRC_ID']) && ! is_array($this->_req_data['PRC_ID'])
69
-            ? $this->_req_data['PRC_ID'] : 0;
70
-        $prt_id = ! empty($this->_req_data['PRT_ID']) && ! is_array($this->_req_data['PRT_ID'])
71
-            ? $this->_req_data['PRT_ID'] : 0;
72
-        $this->_page_routes = array(
73
-            'default'                     => array(
74
-                'func'       => '_price_overview_list_table',
75
-                'capability' => 'ee_read_default_prices',
76
-            ),
77
-            'add_new_price'               => array(
78
-                'func'       => '_edit_price_details',
79
-                'args'       => array('new_price' => true),
80
-                'capability' => 'ee_edit_default_prices',
81
-            ),
82
-            'edit_price'                  => array(
83
-                'func'       => '_edit_price_details',
84
-                'args'       => array('new_price' => false),
85
-                'capability' => 'ee_edit_default_price',
86
-                'obj_id'     => $prc_id,
87
-            ),
88
-            'insert_price'                => array(
89
-                'func'       => '_insert_or_update_price',
90
-                'args'       => array('new_price' => true),
91
-                'noheader'   => true,
92
-                'capability' => 'ee_edit_default_prices',
93
-            ),
94
-            'update_price'                => array(
95
-                'func'       => '_insert_or_update_price',
96
-                'args'       => array('new_price' => false),
97
-                'noheader'   => true,
98
-                'capability' => 'ee_edit_default_price',
99
-                'obj_id'     => $prc_id,
100
-            ),
101
-            'trash_price'                 => array(
102
-                'func'       => '_trash_or_restore_price',
103
-                'args'       => array('trash' => true),
104
-                'noheader'   => true,
105
-                'capability' => 'ee_delete_default_price',
106
-                'obj_id'     => $prc_id,
107
-            ),
108
-            'restore_price'               => array(
109
-                'func'       => '_trash_or_restore_price',
110
-                'args'       => array('trash' => false),
111
-                'noheader'   => true,
112
-                'capability' => 'ee_delete_default_price',
113
-                'obj_id'     => $prc_id,
114
-            ),
115
-            'delete_price'                => array(
116
-                'func'       => '_delete_price',
117
-                'noheader'   => true,
118
-                'capability' => 'ee_delete_default_price',
119
-                'obj_id'     => $prc_id,
120
-            ),
121
-            'espresso_update_price_order' => array(
122
-                'func'       => 'update_price_order',
123
-                'noheader'   => true,
124
-                'capability' => 'ee_edit_default_prices',
125
-            ),
126
-            // price types
127
-            'price_types'                 => array(
128
-                'func'       => '_price_types_overview_list_table',
129
-                'capability' => 'ee_read_default_price_types',
130
-            ),
131
-            'add_new_price_type'          => array(
132
-                'func'       => '_edit_price_type_details',
133
-                'capability' => 'ee_edit_default_price_types',
134
-            ),
135
-            'edit_price_type'             => array(
136
-                'func'       => '_edit_price_type_details',
137
-                'capability' => 'ee_edit_default_price_type',
138
-                'obj_id'     => $prt_id,
139
-            ),
140
-            'insert_price_type'           => array(
141
-                'func'       => '_insert_or_update_price_type',
142
-                'args'       => array('new_price_type' => true),
143
-                'noheader'   => true,
144
-                'capability' => 'ee_edit_default_price_types',
145
-            ),
146
-            'update_price_type'           => array(
147
-                'func'       => '_insert_or_update_price_type',
148
-                'args'       => array('new_price_type' => false),
149
-                'noheader'   => true,
150
-                'capability' => 'ee_edit_default_price_type',
151
-                'obj_id'     => $prt_id,
152
-            ),
153
-            'trash_price_type'            => array(
154
-                'func'       => '_trash_or_restore_price_type',
155
-                'args'       => array('trash' => true),
156
-                'noheader'   => true,
157
-                'capability' => 'ee_delete_default_price_type',
158
-                'obj_id'     => $prt_id,
159
-            ),
160
-            'restore_price_type'          => array(
161
-                'func'       => '_trash_or_restore_price_type',
162
-                'args'       => array('trash' => false),
163
-                'noheader'   => true,
164
-                'capability' => 'ee_delete_default_price_type',
165
-                'obj_id'     => $prt_id,
166
-            ),
167
-            'delete_price_type'           => array(
168
-                'func'       => '_delete_price_type',
169
-                'noheader'   => true,
170
-                'capability' => 'ee_delete_default_price_type',
171
-                'obj_id'     => $prt_id,
172
-            ),
173
-            'tax_settings'                => array(
174
-                'func'       => '_tax_settings',
175
-                'capability' => 'manage_options',
176
-            ),
177
-            'update_tax_settings'         => array(
178
-                'func'       => '_update_tax_settings',
179
-                'capability' => 'manage_options',
180
-                'noheader'   => true,
181
-            ),
182
-        );
183
-    }
184
-
185
-
186
-    protected function _set_page_config()
187
-    {
188
-
189
-        $this->_page_config = array(
190
-            'default'            => array(
191
-                'nav'           => array(
192
-                    'label' => __('Default Pricing', 'event_espresso'),
193
-                    'order' => 10,
194
-                ),
195
-                'list_table'    => 'Prices_List_Table',
196
-                'help_tabs'     => array(
197
-                    'pricing_default_pricing_help_tab'                           => array(
198
-                        'title'    => __('Default Pricing', 'event_espresso'),
199
-                        'filename' => 'pricing_default_pricing',
200
-                    ),
201
-                    'pricing_default_pricing_table_column_headings_help_tab'     => array(
202
-                        'title'    => __('Default Pricing Table Column Headings', 'event_espresso'),
203
-                        'filename' => 'pricing_default_pricing_table_column_headings',
204
-                    ),
205
-                    'pricing_default_pricing_views_bulk_actions_search_help_tab' => array(
206
-                        'title'    => __('Default Pricing Views & Bulk Actions & Search', 'event_espresso'),
207
-                        'filename' => 'pricing_default_pricing_views_bulk_actions_search',
208
-                    ),
209
-                ),
210
-                'help_tour'     => array('Pricing_Default_Prices_Help_Tour'),
211
-                'require_nonce' => false,
212
-            ),
213
-            'add_new_price'      => array(
214
-                'nav'           => array(
215
-                    'label'      => __('Add New Default Price', 'event_espresso'),
216
-                    'order'      => 20,
217
-                    'persistent' => false,
218
-                ),
219
-                'help_tabs'     => array(
220
-                    'add_new_default_price_help_tab' => array(
221
-                        'title'    => __('Add New Default Price', 'event_espresso'),
222
-                        'filename' => 'pricing_add_new_default_price',
223
-                    ),
224
-                ),
225
-                'help_tour'     => array('Pricing_Add_New_Default_Price_Help_Tour'),
226
-                'metaboxes'     => array('_publish_post_box', '_espresso_news_post_box', '_price_details_meta_boxes'),
227
-                'require_nonce' => false,
228
-            ),
229
-            'edit_price'         => array(
230
-                'nav'           => array(
231
-                    'label'      => __('Edit Default Price', 'event_espresso'),
232
-                    'order'      => 20,
233
-                    'url'        => isset($this->_req_data['id']) ? add_query_arg(
234
-                        array('id' => $this->_req_data['id']),
235
-                        $this->_current_page_view_url
236
-                    ) : $this->_admin_base_url,
237
-                    'persistent' => false,
238
-                ),
239
-                'metaboxes'     => array('_publish_post_box', '_espresso_news_post_box', '_price_details_meta_boxes'),
240
-                'help_tabs'     => array(
241
-                    'edit_default_price_help_tab' => array(
242
-                        'title'    => __('Edit Default Price', 'event_espresso'),
243
-                        'filename' => 'pricing_edit_default_price',
244
-                    ),
245
-                ),
246
-                'help_tour'     => array('Pricing_Edit_Default_Price_Help_Tour'),
247
-                'require_nonce' => false,
248
-            ),
249
-            'price_types'        => array(
250
-                'nav'           => array(
251
-                    'label' => __('Price Types', 'event_espresso'),
252
-                    'order' => 30,
253
-                ),
254
-                'list_table'    => 'Price_Types_List_Table',
255
-                'help_tabs'     => array(
256
-                    'pricing_price_types_help_tab'                           => array(
257
-                        'title'    => __('Price Types', 'event_espresso'),
258
-                        'filename' => 'pricing_price_types',
259
-                    ),
260
-                    'pricing_price_types_table_column_headings_help_tab'     => array(
261
-                        'title'    => __('Price Types Table Column Headings', 'event_espresso'),
262
-                        'filename' => 'pricing_price_types_table_column_headings',
263
-                    ),
264
-                    'pricing_price_types_views_bulk_actions_search_help_tab' => array(
265
-                        'title'    => __('Price Types Views & Bulk Actions & Search', 'event_espresso'),
266
-                        'filename' => 'pricing_price_types_views_bulk_actions_search',
267
-                    ),
268
-                ),
269
-                'help_tour'     => array('Pricing_Price_Types_Default_Help_Tour'),
270
-                'metaboxes'     => array('_espresso_news_post_box', '_espresso_links_post_box'),
271
-                'require_nonce' => false,
272
-            ),
273
-            'add_new_price_type' => array(
274
-                'nav'           => array(
275
-                    'label'      => __('Add New Price Type', 'event_espresso'),
276
-                    'order'      => 40,
277
-                    'persistent' => false,
278
-                ),
279
-                'help_tabs'     => array(
280
-                    'add_new_price_type_help_tab' => array(
281
-                        'title'    => __('Add New Price Type', 'event_espresso'),
282
-                        'filename' => 'pricing_add_new_price_type',
283
-                    ),
284
-                ),
285
-                'help_tour'     => array('Pricing_Add_New_Price_Type_Help_Tour'),
286
-                'metaboxes'     => array(
287
-                    '_publish_post_box',
288
-                    '_espresso_news_post_box',
289
-                    '_price_type_details_meta_boxes',
290
-                ),
291
-                'require_nonce' => false,
292
-            ),
293
-            'edit_price_type'    => array(
294
-                'nav'       => array(
295
-                    'label'      => __('Edit Price Type', 'event_espresso'),
296
-                    'order'      => 40,
297
-                    'persistent' => false,
298
-                ),
299
-                'help_tabs' => array(
300
-                    'edit_price_type_help_tab' => array(
301
-                        'title'    => __('Edit Price Type', 'event_espresso'),
302
-                        'filename' => 'pricing_edit_price_type',
303
-                    ),
304
-                ),
305
-                'help_tour' => array('Pricing_Edit_Price_Type_Help_Tour'),
306
-                'metaboxes' => array('_publish_post_box', '_espresso_news_post_box', '_price_type_details_meta_boxes'),
307
-
308
-                'require_nonce' => false,
309
-            ),
310
-            'tax_settings'       => array(
311
-                'nav'           => array(
312
-                    'label' => esc_html__('Tax Settings', 'event_espresso'),
313
-                    'order' => 40,
314
-                ),
315
-                'labels'        => array(
316
-                    'publishbox' => esc_html__('Update Tax Settings', 'event_espresso'),
317
-                ),
318
-                'metaboxes'     => array_merge($this->_default_espresso_metaboxes, array('_publish_post_box')),
319
-                // 'help_tabs'     => array(
320
-                //     'registration_form_reg_form_settings_help_tab' => array(
321
-                //         'title'    => esc_html__('Registration Form Settings', 'event_espresso'),
322
-                //         'filename' => 'registration_form_reg_form_settings'
323
-                //     ),
324
-                // ),
325
-                // 'help_tour'     => array('Registration_Form_Settings_Help_Tour'),
326
-                'require_nonce' => true,
327
-            ),
328
-        );
329
-    }
330
-
331
-
332
-    protected function _add_screen_options()
333
-    {
334
-        // todo
335
-    }
336
-
337
-
338
-    protected function _add_screen_options_default()
339
-    {
340
-        $this->_per_page_screen_option();
341
-    }
342
-
343
-
344
-    protected function _add_screen_options_price_types()
345
-    {
346
-        $page_title = $this->_admin_page_title;
347
-        $this->_admin_page_title = __('Price Types', 'event_espresso');
348
-        $this->_per_page_screen_option();
349
-        $this->_admin_page_title = $page_title;
350
-    }
351
-
352
-
353
-    protected function _add_feature_pointers()
354
-    {
355
-    }
356
-
357
-
358
-    public function load_scripts_styles()
359
-    {
360
-        // styles
361
-        wp_enqueue_style('espresso-ui-theme');
362
-        wp_register_style(
363
-            'espresso_PRICING',
364
-            PRICING_ASSETS_URL . 'espresso_pricing_admin.css',
365
-            array(),
366
-            EVENT_ESPRESSO_VERSION
367
-        );
368
-        wp_enqueue_style('espresso_PRICING');
369
-
370
-        // scripts
371
-        wp_enqueue_script('ee_admin_js');
372
-        wp_enqueue_script('jquery-ui-position');
373
-        wp_enqueue_script('jquery-ui-widget');
374
-        // wp_enqueue_script('jquery-ui-dialog');
375
-        // wp_enqueue_script('jquery-ui-draggable');
376
-        // wp_enqueue_script('jquery-ui-datepicker');
377
-        wp_register_script(
378
-            'espresso_PRICING',
379
-            PRICING_ASSETS_URL . 'espresso_pricing_admin.js',
380
-            array('jquery'),
381
-            EVENT_ESPRESSO_VERSION,
382
-            true
383
-        );
384
-        wp_enqueue_script('espresso_PRICING');
385
-    }
386
-
387
-
388
-    public function load_scripts_styles_default()
389
-    {
390
-        wp_enqueue_script('espresso_ajax_table_sorting');
391
-    }
392
-
393
-
394
-    public function admin_footer_scripts()
395
-    {
396
-    }
397
-
398
-    public function admin_init()
399
-    {
400
-    }
401
-
402
-    public function admin_notices()
403
-    {
404
-    }
405
-
406
-
407
-    protected function _set_list_table_views_default()
408
-    {
409
-        $this->_views = array(
410
-            'all' => array(
411
-                'slug'        => 'all',
412
-                'label'       => __('View All Default Pricing', 'event_espresso'),
413
-                'count'       => 0,
414
-                'bulk_action' => array(
415
-                    'trash_price' => __('Move to Trash', 'event_espresso'),
416
-                ),
417
-            ),
418
-        );
419
-
420
-        if (EE_Registry::instance()->CAP->current_user_can('ee_delete_default_prices', 'pricing_trash_price')) {
421
-            $this->_views['trashed'] = array(
422
-                'slug'        => 'trashed',
423
-                'label'       => __('Trash', 'event_espresso'),
424
-                'count'       => 0,
425
-                'bulk_action' => array(
426
-                    'restore_price' => __('Restore from Trash', 'event_espresso'),
427
-                    'delete_price'  => __('Delete Permanently', 'event_espresso'),
428
-                ),
429
-            );
430
-        }
431
-    }
432
-
433
-
434
-    protected function _set_list_table_views_price_types()
435
-    {
436
-        $this->_views = array(
437
-            'all' => array(
438
-                'slug'        => 'all',
439
-                'label'       => __('All', 'event_espresso'),
440
-                'count'       => 0,
441
-                'bulk_action' => array(
442
-                    'trash_price_type' => __('Move to Trash', 'event_espresso'),
443
-                ),
444
-            ),
445
-        );
446
-
447
-        if (EE_Registry::instance()->CAP->current_user_can(
448
-            'ee_delete_default_price_types',
449
-            'pricing_trash_price_type'
450
-        )) {
451
-            $this->_views['trashed'] = array(
452
-                'slug'        => 'trashed',
453
-                'label'       => __('Trash', 'event_espresso'),
454
-                'count'       => 0,
455
-                'bulk_action' => array(
456
-                    'restore_price_type' => __('Restore from Trash', 'event_espresso'),
457
-                    'delete_price_type'  => __('Delete Permanently', 'event_espresso'),
458
-                ),
459
-            );
460
-        }
461
-    }
462
-
463
-
464
-    /**
465
-     *        generates HTML for main Prices Admin page
466
-     *
467
-     * @access protected
468
-     * @return void
469
-     */
470
-    protected function _price_overview_list_table()
471
-    {
472
-        $this->_admin_page_title .= ' ' . $this->get_action_link_or_button(
473
-            'add_new_price',
474
-            'add',
475
-            array(),
476
-            'add-new-h2'
477
-        );
478
-        $this->admin_page_title .= $this->_learn_more_about_pricing_link();
479
-        $this->_search_btn_label = __('Default Prices', 'event_espresso');
480
-        $this->display_admin_list_table_page_with_no_sidebar();
481
-    }
482
-
483
-
484
-    /**
485
-     *    retrieve data for Prices List table
486
-     *
487
-     * @access public
488
-     * @param  int     $per_page how many prices displayed per page
489
-     * @param  boolean $count    return the count or objects
490
-     * @param  boolean $trashed  whether the current view is of the trash can - eww yuck!
491
-     * @return mixed (int|array)  int = count || array of price objects
492
-     */
493
-    public function get_prices_overview_data($per_page = 10, $count = false, $trashed = false)
494
-    {
495
-
496
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
497
-        // start with an empty array
498
-        $event_pricing = array();
499
-
500
-        require_once(PRICING_ADMIN . 'Prices_List_Table.class.php');
501
-        require_once(EE_MODELS . 'EEM_Price.model.php');
502
-        // $PRC = EEM_Price::instance();
503
-
504
-        $this->_req_data['orderby'] = empty($this->_req_data['orderby']) ? '' : $this->_req_data['orderby'];
505
-        $order = (isset($this->_req_data['order']) && ! empty($this->_req_data['order'])) ? $this->_req_data['order']
506
-            : 'ASC';
507
-
508
-        switch ($this->_req_data['orderby']) {
509
-            case 'name':
510
-                $orderby = array('PRC_name' => $order);
511
-                break;
512
-            case 'type':
513
-                $orderby = array('Price_Type.PRT_name' => $order);
514
-                break;
515
-            case 'amount':
516
-                $orderby = array('PRC_amount' => $order);
517
-                break;
518
-            default:
519
-                $orderby = array('PRC_order' => $order, 'Price_Type.PRT_order' => $order, 'PRC_ID' => $order);
520
-        }
521
-
522
-        $current_page = isset($this->_req_data['paged']) && ! empty($this->_req_data['paged'])
523
-            ? $this->_req_data['paged'] : 1;
524
-        $per_page = isset($this->_req_data['perpage']) && ! empty($this->_req_data['perpage'])
525
-            ? $this->_req_data['perpage'] : $per_page;
526
-
527
-        $_where = array(
528
-            'PRC_is_default' => 1,
529
-            'PRC_deleted'    => $trashed,
530
-        );
531
-
532
-        $offset = ($current_page - 1) * $per_page;
533
-        $limit = array($offset, $per_page);
534
-
535
-        if (isset($this->_req_data['s'])) {
536
-            $sstr = '%' . $this->_req_data['s'] . '%';
537
-            $_where['OR'] = array(
538
-                'PRC_name'            => array('LIKE', $sstr),
539
-                'PRC_desc'            => array('LIKE', $sstr),
540
-                'PRC_amount'          => array('LIKE', $sstr),
541
-                'Price_Type.PRT_name' => array('LIKE', $sstr),
542
-            );
543
-        }
544
-
545
-        $query_params = array(
546
-            $_where,
547
-            'order_by' => $orderby,
548
-            'limit'    => $limit,
549
-            'group_by' => 'PRC_ID',
550
-        );
551
-
552
-        if ($count) {
553
-            return $trashed ? EEM_Price::instance()->count(array($_where))
554
-                : EEM_Price::instance()->count_deleted_and_undeleted(array($_where));
555
-        } else {
556
-            return EEM_Price::instance()->get_all_deleted_and_undeleted($query_params);
557
-        }
558
-    }
559
-
560
-
561
-    /**
562
-     *        _price_details
563
-     *
564
-     * @access protected
565
-     * @return void
566
-     */
567
-    protected function _edit_price_details()
568
-    {
569
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
570
-        // grab price ID
571
-        $PRC_ID = isset($this->_req_data['id']) && ! empty($this->_req_data['id']) ? absint($this->_req_data['id'])
572
-            : false;
573
-        // change page title based on request action
574
-        switch ($this->_req_action) {
575
-            case 'add_new_price':
576
-                $this->_admin_page_title = esc_html__('Add New Price', 'event_espresso');
577
-                break;
578
-            case 'edit_price':
579
-                $this->_admin_page_title = esc_html__('Edit Price', 'event_espresso');
580
-                break;
581
-            default:
582
-                $this->_admin_page_title = ucwords(str_replace('_', ' ', $this->_req_action));
583
-        }
584
-        // add PRC_ID to title if editing
585
-        $this->_admin_page_title = $PRC_ID ? $this->_admin_page_title . ' # ' . $PRC_ID : $this->_admin_page_title;
586
-
587
-        // get prices
588
-        require_once(EE_MODELS . 'EEM_Price.model.php');
589
-        $PRC = EEM_Price::instance();
590
-
591
-        if ($PRC_ID) {
592
-            $price = $PRC->get_one_by_ID($PRC_ID);
593
-            $additional_hidden_fields = array(
594
-                'PRC_ID' => array('type' => 'hidden', 'value' => $PRC_ID),
595
-            );
596
-            $this->_set_add_edit_form_tags('update_price', $additional_hidden_fields);
597
-        } else {
598
-            $price = $PRC->get_new_price();
599
-            $this->_set_add_edit_form_tags('insert_price');
600
-        }
601
-
602
-        $this->_template_args['PRC_ID'] = $PRC_ID;
603
-        $this->_template_args['price'] = $price;
604
-
605
-        // get price types
606
-        require_once(EE_MODELS . 'EEM_Price_Type.model.php');
607
-        $PRT = EEM_Price_Type::instance();
608
-        $price_types = $PRT->get_all(array(array('PBT_ID' => array('!=', 1))));
609
-        $price_type_names = array();
610
-        if (empty($price_types)) {
611
-            $msg = __(
612
-                'You have no price types defined. Please add a price type before adding a price.',
613
-                'event_espresso'
614
-            );
615
-            EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
616
-            exit();
617
-        } else {
618
-            foreach ($price_types as $type) {
619
-                // if ($type->is_global()) {
620
-                $price_type_names[] = array('id' => $type->ID(), 'text' => $type->name());
621
-            // }
622
-            }
623
-        }
624
-
625
-        $this->_template_args['price_types'] = $price_type_names;
626
-        $this->_template_args['learn_more_about_pricing_link'] = $this->_learn_more_about_pricing_link();
627
-
628
-        $this->_set_publish_post_box_vars('id', $PRC_ID);
629
-        // the details template wrapper
630
-        $this->display_admin_page_with_sidebar();
631
-    }
632
-
633
-
634
-    /**
635
-     *        declare price details page metaboxes
636
-     *
637
-     * @access protected
638
-     * @return void
639
-     */
640
-    protected function _price_details_meta_boxes()
641
-    {
642
-        add_meta_box(
643
-            'edit-price-details-mbox',
644
-            __('Default Price Details', 'event_espresso'),
645
-            array($this, '_edit_price_details_meta_box'),
646
-            $this->wp_page_slug,
647
-            'normal',
648
-            'high'
649
-        );
650
-    }
651
-
652
-
653
-    /**
654
-     *        _edit_price_details_meta_box
655
-     *
656
-     * @access public
657
-     * @return void
658
-     */
659
-    public function _edit_price_details_meta_box()
660
-    {
661
-        echo EEH_Template::display_template(
662
-            PRICING_TEMPLATE_PATH . 'pricing_details_main_meta_box.template.php',
663
-            $this->_template_args,
664
-            true
665
-        );
666
-    }
667
-
668
-
669
-    /**
670
-     *        set_price_column_values
671
-     *
672
-     * @access protected
673
-     * @return array
674
-     */
675
-    protected function set_price_column_values()
676
-    {
677
-
678
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
679
-
680
-        $set_column_values = array(
681
-            'PRT_ID'         => absint($this->_req_data['PRT_ID']),
682
-            'PRC_amount'     => $this->_req_data['PRC_amount'],
683
-            'PRC_name'       => $this->_req_data['PRC_name'],
684
-            'PRC_desc'       => $this->_req_data['PRC_desc'],
685
-            'PRC_is_default' => 1,
686
-            'PRC_overrides'  => null,
687
-            'PRC_order'      => 0,
688
-            'PRC_deleted'    => 0,
689
-            'PRC_parent'     => 0,
690
-        );
691
-        return $set_column_values;
692
-    }
693
-
694
-
695
-    /**
696
-     *        insert_or_update_price
697
-     *
698
-     * @param boolean $insert - whether to insert or update
699
-     * @access protected
700
-     * @return void
701
-     */
702
-    protected function _insert_or_update_price($insert = false)
703
-    {
704
-
705
-        // echo '<h3>'. __CLASS__ . '->' . __FUNCTION__ . ' <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span></h3>';
706
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
707
-
708
-        require_once(EE_MODELS . 'EEM_Price.model.php');
709
-        $PRC = EEM_Price::instance();
710
-
711
-        // why be so pessimistic ???  : (
712
-        $success = 0;
713
-
714
-        $set_column_values = $this->set_price_column_values();
715
-        // is this a new Price ?
716
-        if ($insert) {
717
-            // run the insert
718
-            if ($PRC_ID = $PRC->insert($set_column_values)) {
719
-                // make sure this new price modifier is attached to the ticket but ONLY if it is not a tax type
720
-                $PR = EEM_price::instance()->get_one_by_ID($PRC_ID);
721
-                if ($PR->type_obj()->base_type() !== EEM_Price_Type::base_type_tax) {
722
-                    $ticket = EEM_Ticket::instance()->get_one_by_ID(1);
723
-                    $ticket->_add_relation_to($PR, 'Price');
724
-                    $ticket->save();
725
-                }
726
-                $success = 1;
727
-            } else {
728
-                $PRC_ID = false;
729
-                $success = 0;
730
-            }
731
-            $action_desc = 'created';
732
-        } else {
733
-            $PRC_ID = absint($this->_req_data['PRC_ID']);
734
-            // run the update
735
-            $where_cols_n_values = array('PRC_ID' => $PRC_ID);
736
-            if ($PRC->update($set_column_values, array($where_cols_n_values))) {
737
-                $success = 1;
738
-            }
739
-
740
-            $PR = EEM_Price::instance()->get_one_by_ID($PRC_ID);
741
-            if ($PR->type_obj()->base_type() !== EEM_Price_Type::base_type_tax) {
742
-                // if this is $PRC_ID == 1, then we need to update the default ticket attached to this price so the TKT_price value is updated.
743
-                if ($PRC_ID === 1) {
744
-                    $ticket = $PR->get_first_related('Ticket');
745
-                    if ($ticket) {
746
-                        $ticket->set('TKT_price', $PR->get('PRC_amount'));
747
-                        $ticket->set('TKT_name', $PR->get('PRC_name'));
748
-                        $ticket->set('TKT_description', $PR->get('PRC_desc'));
749
-                        $ticket->save();
750
-                    }
751
-                } else {
752
-                    // we make sure this price is attached to base ticket. but ONLY if its not a tax ticket type.
753
-                    $ticket = EEM_Ticket::instance()->get_one_by_ID(1);
754
-                    $ticket->_add_relation_to($PRC_ID, 'Price');
755
-                    $ticket->save();
756
-                }
757
-            }
758
-
759
-            $action_desc = 'updated';
760
-        }
761
-
762
-        $query_args = array('action' => 'edit_price', 'id' => $PRC_ID);
763
-
764
-        $this->_redirect_after_action($success, 'Prices', $action_desc, $query_args);
765
-    }
766
-
767
-
768
-    /**
769
-     *        _trash_or_restore_price
770
-     *
771
-     * @param boolean $trash - whether to move item to trash (TRUE) or restore it (FALSE)
772
-     * @access protected
773
-     * @return void
774
-     */
775
-    protected function _trash_or_restore_price($trash = true)
776
-    {
777
-
778
-        // echo '<h3>'. __CLASS__ . '->' . __FUNCTION__ . ' <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span></h3>';
779
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
780
-
781
-        require_once(EE_MODELS . 'EEM_Price.model.php');
782
-        $PRC = EEM_Price::instance();
783
-
784
-        $success = 1;
785
-        $PRC_deleted = $trash ? true : false;
786
-
787
-        // get base ticket for updating
788
-        $ticket = EEM_Ticket::instance()->get_one_by_ID(1);
789
-        // Checkboxes
790
-        if (! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
791
-            // if array has more than one element than success message should be plural
792
-            $success = count($this->_req_data['checkbox']) > 1 ? 2 : 1;
793
-            // cycle thru checkboxes
794
-            while (list($PRC_ID, $value) = each($this->_req_data['checkbox'])) {
795
-                if (! $PRC->update_by_ID(array('PRC_deleted' => $PRC_deleted), absint($PRC_ID))) {
796
-                    $success = 0;
797
-                } else {
798
-                    $PR = EEM_Price::instance()->get_one_by_ID($PRC_ID);
799
-                    if ($PR->type_obj()->base_type() !== EEM_Price_Type::base_type_tax) {
800
-                        // if trashing then remove relations to base default ticket.  If restoring then add back to base default ticket
801
-                        if ($PRC_deleted) {
802
-                            $ticket->_remove_relation_to($PRC_ID, 'Price');
803
-                        } else {
804
-                            $ticket->_add_relation_to($PRC_ID, 'Price');
805
-                        }
806
-                        $ticket->save();
807
-                    }
808
-                }
809
-            }
810
-        } else {
811
-            // grab single id and delete
812
-            $PRC_ID = isset($this->_req_data['id']) ? absint($this->_req_data['id']) : 0;
813
-            if (empty($PRC_ID) || ! $PRC->update_by_ID(array('PRC_deleted' => $PRC_deleted), $PRC_ID)) {
814
-                $success = 0;
815
-            } else {
816
-                $PR = EEM_Price::instance()->get_one_by_ID($PRC_ID);
817
-                if ($PR->type_obj()->base_type() !== EEM_Price_Type::base_type_tax) {
818
-                    // if trashing then remove relations to base default ticket.  If restoring then add back to base default ticket
819
-                    if ($PRC_deleted) {
820
-                        $ticket->_remove_relation_to($PRC_ID, 'Price');
821
-                    } else {
822
-                        $ticket->_add_relation_to($PRC_ID, 'Price');
823
-                    }
824
-                    $ticket->save();
825
-                }
826
-            }
827
-        }
828
-        $query_args = array(
829
-            'action' => 'default',
830
-        );
831
-
832
-        if ($success) {
833
-            if ($trash) {
834
-                $msg = $success == 2
835
-                    ? __('The Prices have been trashed.', 'event_espresso')
836
-                    : __(
837
-                        'The Price has been trashed.',
838
-                        'event_espresso'
839
-                    );
840
-            } else {
841
-                $msg = $success == 2
842
-                    ? __('The Prices have been restored.', 'event_espresso')
843
-                    : __(
844
-                        'The Price has been restored.',
845
-                        'event_espresso'
846
-                    );
847
-            }
848
-
849
-            EE_Error::add_success($msg);
850
-        }
851
-
852
-        $this->_redirect_after_action(false, '', '', $query_args, true);
853
-    }
854
-
855
-
856
-    /**
857
-     *        _delete_price
858
-     *
859
-     * @access protected
860
-     * @return void
861
-     */
862
-    protected function _delete_price()
863
-    {
864
-
865
-        // echo '<h3>'. __CLASS__ . '->' . __FUNCTION__ . ' <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span></h3>';
866
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
867
-
868
-        require_once(EE_MODELS . 'EEM_Price.model.php');
869
-        $PRC = EEM_Price::instance();
870
-
871
-        $success = 1;
872
-        // Checkboxes
873
-        if (! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
874
-            // if array has more than one element than success message should be plural
875
-            $success = count($this->_req_data['checkbox']) > 1 ? 2 : 1;
876
-            // cycle thru bulk action checkboxes
877
-            while (list($PRC_ID, $value) = each($this->_req_data['checkbox'])) {
878
-                if (! $PRC->delete_permanently_by_ID(absint($PRC_ID))) {
879
-                    $success = 0;
880
-                }
881
-            }
882
-        } else {
883
-            // grab single id and delete
884
-            $PRC_ID = absint($this->_req_data['id']);
885
-            if (! $PRC->delete_permanently_by_ID($PRC_ID)) {
886
-                $success = 0;
887
-            }
888
-        }
889
-
890
-        $this->_redirect_after_action($success, 'Prices', 'deleted', array());
891
-    }
892
-
893
-
894
-    public function update_price_order()
895
-    {
896
-        $success = __('Price order was updated successfully.', 'event_espresso');
897
-
898
-        // grab our row IDs
899
-        $row_ids = isset($this->_req_data['row_ids']) && ! empty($this->_req_data['row_ids']) ? explode(
900
-            ',',
901
-            rtrim(
902
-                $this->_req_data['row_ids'],
903
-                ','
904
-            )
905
-        ) : false;
906
-
907
-        if (is_array($row_ids)) {
908
-            for ($i = 0; $i < count($row_ids); $i++) {
909
-                // Update the prices when re-ordering
910
-                $id = absint($row_ids[ $i ]);
911
-                if (EEM_Price::instance()->update(
912
-                    array('PRC_order' => $i + 1),
913
-                    array(array('PRC_ID' => $id))
914
-                ) === false) {
915
-                    $success = false;
916
-                }
917
-            }
918
-        } else {
919
-            $success = false;
920
-        }
921
-
922
-        $errors = ! $success ? __('An error occurred. The price order was not updated.', 'event_espresso') : false;
923
-
924
-        echo wp_json_encode(array('return_data' => false, 'success' => $success, 'errors' => $errors));
925
-        die();
926
-    }
927
-
928
-
929
-
930
-
931
-
932
-
933
-    /**************************************************************************************************************************************************************
15
+	/**
16
+	 *    constructor
17
+	 *
18
+	 * @Constructor
19
+	 * @access public
20
+	 * @param bool $routing
21
+	 * @return Pricing_Admin_Page
22
+	 */
23
+	public function __construct($routing = true)
24
+	{
25
+		parent::__construct($routing);
26
+	}
27
+
28
+
29
+	protected function _init_page_props()
30
+	{
31
+		$this->page_slug = PRICING_PG_SLUG;
32
+		$this->page_label = PRICING_LABEL;
33
+		$this->_admin_base_url = PRICING_ADMIN_URL;
34
+		$this->_admin_base_path = PRICING_ADMIN;
35
+	}
36
+
37
+
38
+	protected function _ajax_hooks()
39
+	{
40
+		add_action('wp_ajax_espresso_update_prices_order', array($this, 'update_price_order'));
41
+	}
42
+
43
+
44
+	protected function _define_page_props()
45
+	{
46
+		$this->_admin_page_title = PRICING_LABEL;
47
+		$this->_labels = array(
48
+			'buttons' => array(
49
+				'add'         => __('Add New Default Price', 'event_espresso'),
50
+				'edit'        => __('Edit Default Price', 'event_espresso'),
51
+				'delete'      => __('Delete Default Price', 'event_espresso'),
52
+				'add_type'    => __('Add New Default Price Type', 'event_espresso'),
53
+				'edit_type'   => __('Edit Price Type', 'event_espresso'),
54
+				'delete_type' => __('Delete Price Type', 'event_espresso'),
55
+			),
56
+		);
57
+	}
58
+
59
+
60
+	/**
61
+	 *        an array for storing request actions and their corresponding methods
62
+	 *
63
+	 * @access private
64
+	 * @return void
65
+	 */
66
+	protected function _set_page_routes()
67
+	{
68
+		$prc_id = ! empty($this->_req_data['PRC_ID']) && ! is_array($this->_req_data['PRC_ID'])
69
+			? $this->_req_data['PRC_ID'] : 0;
70
+		$prt_id = ! empty($this->_req_data['PRT_ID']) && ! is_array($this->_req_data['PRT_ID'])
71
+			? $this->_req_data['PRT_ID'] : 0;
72
+		$this->_page_routes = array(
73
+			'default'                     => array(
74
+				'func'       => '_price_overview_list_table',
75
+				'capability' => 'ee_read_default_prices',
76
+			),
77
+			'add_new_price'               => array(
78
+				'func'       => '_edit_price_details',
79
+				'args'       => array('new_price' => true),
80
+				'capability' => 'ee_edit_default_prices',
81
+			),
82
+			'edit_price'                  => array(
83
+				'func'       => '_edit_price_details',
84
+				'args'       => array('new_price' => false),
85
+				'capability' => 'ee_edit_default_price',
86
+				'obj_id'     => $prc_id,
87
+			),
88
+			'insert_price'                => array(
89
+				'func'       => '_insert_or_update_price',
90
+				'args'       => array('new_price' => true),
91
+				'noheader'   => true,
92
+				'capability' => 'ee_edit_default_prices',
93
+			),
94
+			'update_price'                => array(
95
+				'func'       => '_insert_or_update_price',
96
+				'args'       => array('new_price' => false),
97
+				'noheader'   => true,
98
+				'capability' => 'ee_edit_default_price',
99
+				'obj_id'     => $prc_id,
100
+			),
101
+			'trash_price'                 => array(
102
+				'func'       => '_trash_or_restore_price',
103
+				'args'       => array('trash' => true),
104
+				'noheader'   => true,
105
+				'capability' => 'ee_delete_default_price',
106
+				'obj_id'     => $prc_id,
107
+			),
108
+			'restore_price'               => array(
109
+				'func'       => '_trash_or_restore_price',
110
+				'args'       => array('trash' => false),
111
+				'noheader'   => true,
112
+				'capability' => 'ee_delete_default_price',
113
+				'obj_id'     => $prc_id,
114
+			),
115
+			'delete_price'                => array(
116
+				'func'       => '_delete_price',
117
+				'noheader'   => true,
118
+				'capability' => 'ee_delete_default_price',
119
+				'obj_id'     => $prc_id,
120
+			),
121
+			'espresso_update_price_order' => array(
122
+				'func'       => 'update_price_order',
123
+				'noheader'   => true,
124
+				'capability' => 'ee_edit_default_prices',
125
+			),
126
+			// price types
127
+			'price_types'                 => array(
128
+				'func'       => '_price_types_overview_list_table',
129
+				'capability' => 'ee_read_default_price_types',
130
+			),
131
+			'add_new_price_type'          => array(
132
+				'func'       => '_edit_price_type_details',
133
+				'capability' => 'ee_edit_default_price_types',
134
+			),
135
+			'edit_price_type'             => array(
136
+				'func'       => '_edit_price_type_details',
137
+				'capability' => 'ee_edit_default_price_type',
138
+				'obj_id'     => $prt_id,
139
+			),
140
+			'insert_price_type'           => array(
141
+				'func'       => '_insert_or_update_price_type',
142
+				'args'       => array('new_price_type' => true),
143
+				'noheader'   => true,
144
+				'capability' => 'ee_edit_default_price_types',
145
+			),
146
+			'update_price_type'           => array(
147
+				'func'       => '_insert_or_update_price_type',
148
+				'args'       => array('new_price_type' => false),
149
+				'noheader'   => true,
150
+				'capability' => 'ee_edit_default_price_type',
151
+				'obj_id'     => $prt_id,
152
+			),
153
+			'trash_price_type'            => array(
154
+				'func'       => '_trash_or_restore_price_type',
155
+				'args'       => array('trash' => true),
156
+				'noheader'   => true,
157
+				'capability' => 'ee_delete_default_price_type',
158
+				'obj_id'     => $prt_id,
159
+			),
160
+			'restore_price_type'          => array(
161
+				'func'       => '_trash_or_restore_price_type',
162
+				'args'       => array('trash' => false),
163
+				'noheader'   => true,
164
+				'capability' => 'ee_delete_default_price_type',
165
+				'obj_id'     => $prt_id,
166
+			),
167
+			'delete_price_type'           => array(
168
+				'func'       => '_delete_price_type',
169
+				'noheader'   => true,
170
+				'capability' => 'ee_delete_default_price_type',
171
+				'obj_id'     => $prt_id,
172
+			),
173
+			'tax_settings'                => array(
174
+				'func'       => '_tax_settings',
175
+				'capability' => 'manage_options',
176
+			),
177
+			'update_tax_settings'         => array(
178
+				'func'       => '_update_tax_settings',
179
+				'capability' => 'manage_options',
180
+				'noheader'   => true,
181
+			),
182
+		);
183
+	}
184
+
185
+
186
+	protected function _set_page_config()
187
+	{
188
+
189
+		$this->_page_config = array(
190
+			'default'            => array(
191
+				'nav'           => array(
192
+					'label' => __('Default Pricing', 'event_espresso'),
193
+					'order' => 10,
194
+				),
195
+				'list_table'    => 'Prices_List_Table',
196
+				'help_tabs'     => array(
197
+					'pricing_default_pricing_help_tab'                           => array(
198
+						'title'    => __('Default Pricing', 'event_espresso'),
199
+						'filename' => 'pricing_default_pricing',
200
+					),
201
+					'pricing_default_pricing_table_column_headings_help_tab'     => array(
202
+						'title'    => __('Default Pricing Table Column Headings', 'event_espresso'),
203
+						'filename' => 'pricing_default_pricing_table_column_headings',
204
+					),
205
+					'pricing_default_pricing_views_bulk_actions_search_help_tab' => array(
206
+						'title'    => __('Default Pricing Views & Bulk Actions & Search', 'event_espresso'),
207
+						'filename' => 'pricing_default_pricing_views_bulk_actions_search',
208
+					),
209
+				),
210
+				'help_tour'     => array('Pricing_Default_Prices_Help_Tour'),
211
+				'require_nonce' => false,
212
+			),
213
+			'add_new_price'      => array(
214
+				'nav'           => array(
215
+					'label'      => __('Add New Default Price', 'event_espresso'),
216
+					'order'      => 20,
217
+					'persistent' => false,
218
+				),
219
+				'help_tabs'     => array(
220
+					'add_new_default_price_help_tab' => array(
221
+						'title'    => __('Add New Default Price', 'event_espresso'),
222
+						'filename' => 'pricing_add_new_default_price',
223
+					),
224
+				),
225
+				'help_tour'     => array('Pricing_Add_New_Default_Price_Help_Tour'),
226
+				'metaboxes'     => array('_publish_post_box', '_espresso_news_post_box', '_price_details_meta_boxes'),
227
+				'require_nonce' => false,
228
+			),
229
+			'edit_price'         => array(
230
+				'nav'           => array(
231
+					'label'      => __('Edit Default Price', 'event_espresso'),
232
+					'order'      => 20,
233
+					'url'        => isset($this->_req_data['id']) ? add_query_arg(
234
+						array('id' => $this->_req_data['id']),
235
+						$this->_current_page_view_url
236
+					) : $this->_admin_base_url,
237
+					'persistent' => false,
238
+				),
239
+				'metaboxes'     => array('_publish_post_box', '_espresso_news_post_box', '_price_details_meta_boxes'),
240
+				'help_tabs'     => array(
241
+					'edit_default_price_help_tab' => array(
242
+						'title'    => __('Edit Default Price', 'event_espresso'),
243
+						'filename' => 'pricing_edit_default_price',
244
+					),
245
+				),
246
+				'help_tour'     => array('Pricing_Edit_Default_Price_Help_Tour'),
247
+				'require_nonce' => false,
248
+			),
249
+			'price_types'        => array(
250
+				'nav'           => array(
251
+					'label' => __('Price Types', 'event_espresso'),
252
+					'order' => 30,
253
+				),
254
+				'list_table'    => 'Price_Types_List_Table',
255
+				'help_tabs'     => array(
256
+					'pricing_price_types_help_tab'                           => array(
257
+						'title'    => __('Price Types', 'event_espresso'),
258
+						'filename' => 'pricing_price_types',
259
+					),
260
+					'pricing_price_types_table_column_headings_help_tab'     => array(
261
+						'title'    => __('Price Types Table Column Headings', 'event_espresso'),
262
+						'filename' => 'pricing_price_types_table_column_headings',
263
+					),
264
+					'pricing_price_types_views_bulk_actions_search_help_tab' => array(
265
+						'title'    => __('Price Types Views & Bulk Actions & Search', 'event_espresso'),
266
+						'filename' => 'pricing_price_types_views_bulk_actions_search',
267
+					),
268
+				),
269
+				'help_tour'     => array('Pricing_Price_Types_Default_Help_Tour'),
270
+				'metaboxes'     => array('_espresso_news_post_box', '_espresso_links_post_box'),
271
+				'require_nonce' => false,
272
+			),
273
+			'add_new_price_type' => array(
274
+				'nav'           => array(
275
+					'label'      => __('Add New Price Type', 'event_espresso'),
276
+					'order'      => 40,
277
+					'persistent' => false,
278
+				),
279
+				'help_tabs'     => array(
280
+					'add_new_price_type_help_tab' => array(
281
+						'title'    => __('Add New Price Type', 'event_espresso'),
282
+						'filename' => 'pricing_add_new_price_type',
283
+					),
284
+				),
285
+				'help_tour'     => array('Pricing_Add_New_Price_Type_Help_Tour'),
286
+				'metaboxes'     => array(
287
+					'_publish_post_box',
288
+					'_espresso_news_post_box',
289
+					'_price_type_details_meta_boxes',
290
+				),
291
+				'require_nonce' => false,
292
+			),
293
+			'edit_price_type'    => array(
294
+				'nav'       => array(
295
+					'label'      => __('Edit Price Type', 'event_espresso'),
296
+					'order'      => 40,
297
+					'persistent' => false,
298
+				),
299
+				'help_tabs' => array(
300
+					'edit_price_type_help_tab' => array(
301
+						'title'    => __('Edit Price Type', 'event_espresso'),
302
+						'filename' => 'pricing_edit_price_type',
303
+					),
304
+				),
305
+				'help_tour' => array('Pricing_Edit_Price_Type_Help_Tour'),
306
+				'metaboxes' => array('_publish_post_box', '_espresso_news_post_box', '_price_type_details_meta_boxes'),
307
+
308
+				'require_nonce' => false,
309
+			),
310
+			'tax_settings'       => array(
311
+				'nav'           => array(
312
+					'label' => esc_html__('Tax Settings', 'event_espresso'),
313
+					'order' => 40,
314
+				),
315
+				'labels'        => array(
316
+					'publishbox' => esc_html__('Update Tax Settings', 'event_espresso'),
317
+				),
318
+				'metaboxes'     => array_merge($this->_default_espresso_metaboxes, array('_publish_post_box')),
319
+				// 'help_tabs'     => array(
320
+				//     'registration_form_reg_form_settings_help_tab' => array(
321
+				//         'title'    => esc_html__('Registration Form Settings', 'event_espresso'),
322
+				//         'filename' => 'registration_form_reg_form_settings'
323
+				//     ),
324
+				// ),
325
+				// 'help_tour'     => array('Registration_Form_Settings_Help_Tour'),
326
+				'require_nonce' => true,
327
+			),
328
+		);
329
+	}
330
+
331
+
332
+	protected function _add_screen_options()
333
+	{
334
+		// todo
335
+	}
336
+
337
+
338
+	protected function _add_screen_options_default()
339
+	{
340
+		$this->_per_page_screen_option();
341
+	}
342
+
343
+
344
+	protected function _add_screen_options_price_types()
345
+	{
346
+		$page_title = $this->_admin_page_title;
347
+		$this->_admin_page_title = __('Price Types', 'event_espresso');
348
+		$this->_per_page_screen_option();
349
+		$this->_admin_page_title = $page_title;
350
+	}
351
+
352
+
353
+	protected function _add_feature_pointers()
354
+	{
355
+	}
356
+
357
+
358
+	public function load_scripts_styles()
359
+	{
360
+		// styles
361
+		wp_enqueue_style('espresso-ui-theme');
362
+		wp_register_style(
363
+			'espresso_PRICING',
364
+			PRICING_ASSETS_URL . 'espresso_pricing_admin.css',
365
+			array(),
366
+			EVENT_ESPRESSO_VERSION
367
+		);
368
+		wp_enqueue_style('espresso_PRICING');
369
+
370
+		// scripts
371
+		wp_enqueue_script('ee_admin_js');
372
+		wp_enqueue_script('jquery-ui-position');
373
+		wp_enqueue_script('jquery-ui-widget');
374
+		// wp_enqueue_script('jquery-ui-dialog');
375
+		// wp_enqueue_script('jquery-ui-draggable');
376
+		// wp_enqueue_script('jquery-ui-datepicker');
377
+		wp_register_script(
378
+			'espresso_PRICING',
379
+			PRICING_ASSETS_URL . 'espresso_pricing_admin.js',
380
+			array('jquery'),
381
+			EVENT_ESPRESSO_VERSION,
382
+			true
383
+		);
384
+		wp_enqueue_script('espresso_PRICING');
385
+	}
386
+
387
+
388
+	public function load_scripts_styles_default()
389
+	{
390
+		wp_enqueue_script('espresso_ajax_table_sorting');
391
+	}
392
+
393
+
394
+	public function admin_footer_scripts()
395
+	{
396
+	}
397
+
398
+	public function admin_init()
399
+	{
400
+	}
401
+
402
+	public function admin_notices()
403
+	{
404
+	}
405
+
406
+
407
+	protected function _set_list_table_views_default()
408
+	{
409
+		$this->_views = array(
410
+			'all' => array(
411
+				'slug'        => 'all',
412
+				'label'       => __('View All Default Pricing', 'event_espresso'),
413
+				'count'       => 0,
414
+				'bulk_action' => array(
415
+					'trash_price' => __('Move to Trash', 'event_espresso'),
416
+				),
417
+			),
418
+		);
419
+
420
+		if (EE_Registry::instance()->CAP->current_user_can('ee_delete_default_prices', 'pricing_trash_price')) {
421
+			$this->_views['trashed'] = array(
422
+				'slug'        => 'trashed',
423
+				'label'       => __('Trash', 'event_espresso'),
424
+				'count'       => 0,
425
+				'bulk_action' => array(
426
+					'restore_price' => __('Restore from Trash', 'event_espresso'),
427
+					'delete_price'  => __('Delete Permanently', 'event_espresso'),
428
+				),
429
+			);
430
+		}
431
+	}
432
+
433
+
434
+	protected function _set_list_table_views_price_types()
435
+	{
436
+		$this->_views = array(
437
+			'all' => array(
438
+				'slug'        => 'all',
439
+				'label'       => __('All', 'event_espresso'),
440
+				'count'       => 0,
441
+				'bulk_action' => array(
442
+					'trash_price_type' => __('Move to Trash', 'event_espresso'),
443
+				),
444
+			),
445
+		);
446
+
447
+		if (EE_Registry::instance()->CAP->current_user_can(
448
+			'ee_delete_default_price_types',
449
+			'pricing_trash_price_type'
450
+		)) {
451
+			$this->_views['trashed'] = array(
452
+				'slug'        => 'trashed',
453
+				'label'       => __('Trash', 'event_espresso'),
454
+				'count'       => 0,
455
+				'bulk_action' => array(
456
+					'restore_price_type' => __('Restore from Trash', 'event_espresso'),
457
+					'delete_price_type'  => __('Delete Permanently', 'event_espresso'),
458
+				),
459
+			);
460
+		}
461
+	}
462
+
463
+
464
+	/**
465
+	 *        generates HTML for main Prices Admin page
466
+	 *
467
+	 * @access protected
468
+	 * @return void
469
+	 */
470
+	protected function _price_overview_list_table()
471
+	{
472
+		$this->_admin_page_title .= ' ' . $this->get_action_link_or_button(
473
+			'add_new_price',
474
+			'add',
475
+			array(),
476
+			'add-new-h2'
477
+		);
478
+		$this->admin_page_title .= $this->_learn_more_about_pricing_link();
479
+		$this->_search_btn_label = __('Default Prices', 'event_espresso');
480
+		$this->display_admin_list_table_page_with_no_sidebar();
481
+	}
482
+
483
+
484
+	/**
485
+	 *    retrieve data for Prices List table
486
+	 *
487
+	 * @access public
488
+	 * @param  int     $per_page how many prices displayed per page
489
+	 * @param  boolean $count    return the count or objects
490
+	 * @param  boolean $trashed  whether the current view is of the trash can - eww yuck!
491
+	 * @return mixed (int|array)  int = count || array of price objects
492
+	 */
493
+	public function get_prices_overview_data($per_page = 10, $count = false, $trashed = false)
494
+	{
495
+
496
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
497
+		// start with an empty array
498
+		$event_pricing = array();
499
+
500
+		require_once(PRICING_ADMIN . 'Prices_List_Table.class.php');
501
+		require_once(EE_MODELS . 'EEM_Price.model.php');
502
+		// $PRC = EEM_Price::instance();
503
+
504
+		$this->_req_data['orderby'] = empty($this->_req_data['orderby']) ? '' : $this->_req_data['orderby'];
505
+		$order = (isset($this->_req_data['order']) && ! empty($this->_req_data['order'])) ? $this->_req_data['order']
506
+			: 'ASC';
507
+
508
+		switch ($this->_req_data['orderby']) {
509
+			case 'name':
510
+				$orderby = array('PRC_name' => $order);
511
+				break;
512
+			case 'type':
513
+				$orderby = array('Price_Type.PRT_name' => $order);
514
+				break;
515
+			case 'amount':
516
+				$orderby = array('PRC_amount' => $order);
517
+				break;
518
+			default:
519
+				$orderby = array('PRC_order' => $order, 'Price_Type.PRT_order' => $order, 'PRC_ID' => $order);
520
+		}
521
+
522
+		$current_page = isset($this->_req_data['paged']) && ! empty($this->_req_data['paged'])
523
+			? $this->_req_data['paged'] : 1;
524
+		$per_page = isset($this->_req_data['perpage']) && ! empty($this->_req_data['perpage'])
525
+			? $this->_req_data['perpage'] : $per_page;
526
+
527
+		$_where = array(
528
+			'PRC_is_default' => 1,
529
+			'PRC_deleted'    => $trashed,
530
+		);
531
+
532
+		$offset = ($current_page - 1) * $per_page;
533
+		$limit = array($offset, $per_page);
534
+
535
+		if (isset($this->_req_data['s'])) {
536
+			$sstr = '%' . $this->_req_data['s'] . '%';
537
+			$_where['OR'] = array(
538
+				'PRC_name'            => array('LIKE', $sstr),
539
+				'PRC_desc'            => array('LIKE', $sstr),
540
+				'PRC_amount'          => array('LIKE', $sstr),
541
+				'Price_Type.PRT_name' => array('LIKE', $sstr),
542
+			);
543
+		}
544
+
545
+		$query_params = array(
546
+			$_where,
547
+			'order_by' => $orderby,
548
+			'limit'    => $limit,
549
+			'group_by' => 'PRC_ID',
550
+		);
551
+
552
+		if ($count) {
553
+			return $trashed ? EEM_Price::instance()->count(array($_where))
554
+				: EEM_Price::instance()->count_deleted_and_undeleted(array($_where));
555
+		} else {
556
+			return EEM_Price::instance()->get_all_deleted_and_undeleted($query_params);
557
+		}
558
+	}
559
+
560
+
561
+	/**
562
+	 *        _price_details
563
+	 *
564
+	 * @access protected
565
+	 * @return void
566
+	 */
567
+	protected function _edit_price_details()
568
+	{
569
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
570
+		// grab price ID
571
+		$PRC_ID = isset($this->_req_data['id']) && ! empty($this->_req_data['id']) ? absint($this->_req_data['id'])
572
+			: false;
573
+		// change page title based on request action
574
+		switch ($this->_req_action) {
575
+			case 'add_new_price':
576
+				$this->_admin_page_title = esc_html__('Add New Price', 'event_espresso');
577
+				break;
578
+			case 'edit_price':
579
+				$this->_admin_page_title = esc_html__('Edit Price', 'event_espresso');
580
+				break;
581
+			default:
582
+				$this->_admin_page_title = ucwords(str_replace('_', ' ', $this->_req_action));
583
+		}
584
+		// add PRC_ID to title if editing
585
+		$this->_admin_page_title = $PRC_ID ? $this->_admin_page_title . ' # ' . $PRC_ID : $this->_admin_page_title;
586
+
587
+		// get prices
588
+		require_once(EE_MODELS . 'EEM_Price.model.php');
589
+		$PRC = EEM_Price::instance();
590
+
591
+		if ($PRC_ID) {
592
+			$price = $PRC->get_one_by_ID($PRC_ID);
593
+			$additional_hidden_fields = array(
594
+				'PRC_ID' => array('type' => 'hidden', 'value' => $PRC_ID),
595
+			);
596
+			$this->_set_add_edit_form_tags('update_price', $additional_hidden_fields);
597
+		} else {
598
+			$price = $PRC->get_new_price();
599
+			$this->_set_add_edit_form_tags('insert_price');
600
+		}
601
+
602
+		$this->_template_args['PRC_ID'] = $PRC_ID;
603
+		$this->_template_args['price'] = $price;
604
+
605
+		// get price types
606
+		require_once(EE_MODELS . 'EEM_Price_Type.model.php');
607
+		$PRT = EEM_Price_Type::instance();
608
+		$price_types = $PRT->get_all(array(array('PBT_ID' => array('!=', 1))));
609
+		$price_type_names = array();
610
+		if (empty($price_types)) {
611
+			$msg = __(
612
+				'You have no price types defined. Please add a price type before adding a price.',
613
+				'event_espresso'
614
+			);
615
+			EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
616
+			exit();
617
+		} else {
618
+			foreach ($price_types as $type) {
619
+				// if ($type->is_global()) {
620
+				$price_type_names[] = array('id' => $type->ID(), 'text' => $type->name());
621
+			// }
622
+			}
623
+		}
624
+
625
+		$this->_template_args['price_types'] = $price_type_names;
626
+		$this->_template_args['learn_more_about_pricing_link'] = $this->_learn_more_about_pricing_link();
627
+
628
+		$this->_set_publish_post_box_vars('id', $PRC_ID);
629
+		// the details template wrapper
630
+		$this->display_admin_page_with_sidebar();
631
+	}
632
+
633
+
634
+	/**
635
+	 *        declare price details page metaboxes
636
+	 *
637
+	 * @access protected
638
+	 * @return void
639
+	 */
640
+	protected function _price_details_meta_boxes()
641
+	{
642
+		add_meta_box(
643
+			'edit-price-details-mbox',
644
+			__('Default Price Details', 'event_espresso'),
645
+			array($this, '_edit_price_details_meta_box'),
646
+			$this->wp_page_slug,
647
+			'normal',
648
+			'high'
649
+		);
650
+	}
651
+
652
+
653
+	/**
654
+	 *        _edit_price_details_meta_box
655
+	 *
656
+	 * @access public
657
+	 * @return void
658
+	 */
659
+	public function _edit_price_details_meta_box()
660
+	{
661
+		echo EEH_Template::display_template(
662
+			PRICING_TEMPLATE_PATH . 'pricing_details_main_meta_box.template.php',
663
+			$this->_template_args,
664
+			true
665
+		);
666
+	}
667
+
668
+
669
+	/**
670
+	 *        set_price_column_values
671
+	 *
672
+	 * @access protected
673
+	 * @return array
674
+	 */
675
+	protected function set_price_column_values()
676
+	{
677
+
678
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
679
+
680
+		$set_column_values = array(
681
+			'PRT_ID'         => absint($this->_req_data['PRT_ID']),
682
+			'PRC_amount'     => $this->_req_data['PRC_amount'],
683
+			'PRC_name'       => $this->_req_data['PRC_name'],
684
+			'PRC_desc'       => $this->_req_data['PRC_desc'],
685
+			'PRC_is_default' => 1,
686
+			'PRC_overrides'  => null,
687
+			'PRC_order'      => 0,
688
+			'PRC_deleted'    => 0,
689
+			'PRC_parent'     => 0,
690
+		);
691
+		return $set_column_values;
692
+	}
693
+
694
+
695
+	/**
696
+	 *        insert_or_update_price
697
+	 *
698
+	 * @param boolean $insert - whether to insert or update
699
+	 * @access protected
700
+	 * @return void
701
+	 */
702
+	protected function _insert_or_update_price($insert = false)
703
+	{
704
+
705
+		// echo '<h3>'. __CLASS__ . '->' . __FUNCTION__ . ' <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span></h3>';
706
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
707
+
708
+		require_once(EE_MODELS . 'EEM_Price.model.php');
709
+		$PRC = EEM_Price::instance();
710
+
711
+		// why be so pessimistic ???  : (
712
+		$success = 0;
713
+
714
+		$set_column_values = $this->set_price_column_values();
715
+		// is this a new Price ?
716
+		if ($insert) {
717
+			// run the insert
718
+			if ($PRC_ID = $PRC->insert($set_column_values)) {
719
+				// make sure this new price modifier is attached to the ticket but ONLY if it is not a tax type
720
+				$PR = EEM_price::instance()->get_one_by_ID($PRC_ID);
721
+				if ($PR->type_obj()->base_type() !== EEM_Price_Type::base_type_tax) {
722
+					$ticket = EEM_Ticket::instance()->get_one_by_ID(1);
723
+					$ticket->_add_relation_to($PR, 'Price');
724
+					$ticket->save();
725
+				}
726
+				$success = 1;
727
+			} else {
728
+				$PRC_ID = false;
729
+				$success = 0;
730
+			}
731
+			$action_desc = 'created';
732
+		} else {
733
+			$PRC_ID = absint($this->_req_data['PRC_ID']);
734
+			// run the update
735
+			$where_cols_n_values = array('PRC_ID' => $PRC_ID);
736
+			if ($PRC->update($set_column_values, array($where_cols_n_values))) {
737
+				$success = 1;
738
+			}
739
+
740
+			$PR = EEM_Price::instance()->get_one_by_ID($PRC_ID);
741
+			if ($PR->type_obj()->base_type() !== EEM_Price_Type::base_type_tax) {
742
+				// if this is $PRC_ID == 1, then we need to update the default ticket attached to this price so the TKT_price value is updated.
743
+				if ($PRC_ID === 1) {
744
+					$ticket = $PR->get_first_related('Ticket');
745
+					if ($ticket) {
746
+						$ticket->set('TKT_price', $PR->get('PRC_amount'));
747
+						$ticket->set('TKT_name', $PR->get('PRC_name'));
748
+						$ticket->set('TKT_description', $PR->get('PRC_desc'));
749
+						$ticket->save();
750
+					}
751
+				} else {
752
+					// we make sure this price is attached to base ticket. but ONLY if its not a tax ticket type.
753
+					$ticket = EEM_Ticket::instance()->get_one_by_ID(1);
754
+					$ticket->_add_relation_to($PRC_ID, 'Price');
755
+					$ticket->save();
756
+				}
757
+			}
758
+
759
+			$action_desc = 'updated';
760
+		}
761
+
762
+		$query_args = array('action' => 'edit_price', 'id' => $PRC_ID);
763
+
764
+		$this->_redirect_after_action($success, 'Prices', $action_desc, $query_args);
765
+	}
766
+
767
+
768
+	/**
769
+	 *        _trash_or_restore_price
770
+	 *
771
+	 * @param boolean $trash - whether to move item to trash (TRUE) or restore it (FALSE)
772
+	 * @access protected
773
+	 * @return void
774
+	 */
775
+	protected function _trash_or_restore_price($trash = true)
776
+	{
777
+
778
+		// echo '<h3>'. __CLASS__ . '->' . __FUNCTION__ . ' <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span></h3>';
779
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
780
+
781
+		require_once(EE_MODELS . 'EEM_Price.model.php');
782
+		$PRC = EEM_Price::instance();
783
+
784
+		$success = 1;
785
+		$PRC_deleted = $trash ? true : false;
786
+
787
+		// get base ticket for updating
788
+		$ticket = EEM_Ticket::instance()->get_one_by_ID(1);
789
+		// Checkboxes
790
+		if (! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
791
+			// if array has more than one element than success message should be plural
792
+			$success = count($this->_req_data['checkbox']) > 1 ? 2 : 1;
793
+			// cycle thru checkboxes
794
+			while (list($PRC_ID, $value) = each($this->_req_data['checkbox'])) {
795
+				if (! $PRC->update_by_ID(array('PRC_deleted' => $PRC_deleted), absint($PRC_ID))) {
796
+					$success = 0;
797
+				} else {
798
+					$PR = EEM_Price::instance()->get_one_by_ID($PRC_ID);
799
+					if ($PR->type_obj()->base_type() !== EEM_Price_Type::base_type_tax) {
800
+						// if trashing then remove relations to base default ticket.  If restoring then add back to base default ticket
801
+						if ($PRC_deleted) {
802
+							$ticket->_remove_relation_to($PRC_ID, 'Price');
803
+						} else {
804
+							$ticket->_add_relation_to($PRC_ID, 'Price');
805
+						}
806
+						$ticket->save();
807
+					}
808
+				}
809
+			}
810
+		} else {
811
+			// grab single id and delete
812
+			$PRC_ID = isset($this->_req_data['id']) ? absint($this->_req_data['id']) : 0;
813
+			if (empty($PRC_ID) || ! $PRC->update_by_ID(array('PRC_deleted' => $PRC_deleted), $PRC_ID)) {
814
+				$success = 0;
815
+			} else {
816
+				$PR = EEM_Price::instance()->get_one_by_ID($PRC_ID);
817
+				if ($PR->type_obj()->base_type() !== EEM_Price_Type::base_type_tax) {
818
+					// if trashing then remove relations to base default ticket.  If restoring then add back to base default ticket
819
+					if ($PRC_deleted) {
820
+						$ticket->_remove_relation_to($PRC_ID, 'Price');
821
+					} else {
822
+						$ticket->_add_relation_to($PRC_ID, 'Price');
823
+					}
824
+					$ticket->save();
825
+				}
826
+			}
827
+		}
828
+		$query_args = array(
829
+			'action' => 'default',
830
+		);
831
+
832
+		if ($success) {
833
+			if ($trash) {
834
+				$msg = $success == 2
835
+					? __('The Prices have been trashed.', 'event_espresso')
836
+					: __(
837
+						'The Price has been trashed.',
838
+						'event_espresso'
839
+					);
840
+			} else {
841
+				$msg = $success == 2
842
+					? __('The Prices have been restored.', 'event_espresso')
843
+					: __(
844
+						'The Price has been restored.',
845
+						'event_espresso'
846
+					);
847
+			}
848
+
849
+			EE_Error::add_success($msg);
850
+		}
851
+
852
+		$this->_redirect_after_action(false, '', '', $query_args, true);
853
+	}
854
+
855
+
856
+	/**
857
+	 *        _delete_price
858
+	 *
859
+	 * @access protected
860
+	 * @return void
861
+	 */
862
+	protected function _delete_price()
863
+	{
864
+
865
+		// echo '<h3>'. __CLASS__ . '->' . __FUNCTION__ . ' <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span></h3>';
866
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
867
+
868
+		require_once(EE_MODELS . 'EEM_Price.model.php');
869
+		$PRC = EEM_Price::instance();
870
+
871
+		$success = 1;
872
+		// Checkboxes
873
+		if (! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
874
+			// if array has more than one element than success message should be plural
875
+			$success = count($this->_req_data['checkbox']) > 1 ? 2 : 1;
876
+			// cycle thru bulk action checkboxes
877
+			while (list($PRC_ID, $value) = each($this->_req_data['checkbox'])) {
878
+				if (! $PRC->delete_permanently_by_ID(absint($PRC_ID))) {
879
+					$success = 0;
880
+				}
881
+			}
882
+		} else {
883
+			// grab single id and delete
884
+			$PRC_ID = absint($this->_req_data['id']);
885
+			if (! $PRC->delete_permanently_by_ID($PRC_ID)) {
886
+				$success = 0;
887
+			}
888
+		}
889
+
890
+		$this->_redirect_after_action($success, 'Prices', 'deleted', array());
891
+	}
892
+
893
+
894
+	public function update_price_order()
895
+	{
896
+		$success = __('Price order was updated successfully.', 'event_espresso');
897
+
898
+		// grab our row IDs
899
+		$row_ids = isset($this->_req_data['row_ids']) && ! empty($this->_req_data['row_ids']) ? explode(
900
+			',',
901
+			rtrim(
902
+				$this->_req_data['row_ids'],
903
+				','
904
+			)
905
+		) : false;
906
+
907
+		if (is_array($row_ids)) {
908
+			for ($i = 0; $i < count($row_ids); $i++) {
909
+				// Update the prices when re-ordering
910
+				$id = absint($row_ids[ $i ]);
911
+				if (EEM_Price::instance()->update(
912
+					array('PRC_order' => $i + 1),
913
+					array(array('PRC_ID' => $id))
914
+				) === false) {
915
+					$success = false;
916
+				}
917
+			}
918
+		} else {
919
+			$success = false;
920
+		}
921
+
922
+		$errors = ! $success ? __('An error occurred. The price order was not updated.', 'event_espresso') : false;
923
+
924
+		echo wp_json_encode(array('return_data' => false, 'success' => $success, 'errors' => $errors));
925
+		die();
926
+	}
927
+
928
+
929
+
930
+
931
+
932
+
933
+	/**************************************************************************************************************************************************************
934 934
      ********************************************************************  TICKET PRICE TYPES  ******************************************************************
935 935
      **************************************************************************************************************************************************************/
936 936
 
937 937
 
938
-    /**
939
-     *        generates HTML for main Prices Admin page
940
-     *
941
-     * @access protected
942
-     * @return void
943
-     */
944
-    protected function _price_types_overview_list_table()
945
-    {
946
-        $this->_admin_page_title .= ' ' . $this->get_action_link_or_button(
947
-            'add_new_price_type',
948
-            'add_type',
949
-            array(),
950
-            'add-new-h2'
951
-        );
952
-        $this->admin_page_title .= $this->_learn_more_about_pricing_link();
953
-        $this->_search_btn_label = __('Price Types', 'event_espresso');
954
-        $this->display_admin_list_table_page_with_no_sidebar();
955
-    }
956
-
957
-
958
-    /**
959
-     *    retrieve data for Price Types List table
960
-     *
961
-     * @access public
962
-     * @param  int     $per_page how many prices displayed per page
963
-     * @param  boolean $count    return the count or objects
964
-     * @param  boolean $trashed  whether the current view is of the trash can - eww yuck!
965
-     * @return mixed (int|array)  int = count || array of price objects
966
-     */
967
-    public function get_price_types_overview_data($per_page = 10, $count = false, $trashed = false)
968
-    {
969
-
970
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
971
-        // start with an empty array
972
-
973
-        require_once(PRICING_ADMIN . 'Price_Types_List_Table.class.php');
974
-        require_once(EE_MODELS . 'EEM_Price_Type.model.php');
975
-
976
-        $this->_req_data['orderby'] = empty($this->_req_data['orderby']) ? '' : $this->_req_data['orderby'];
977
-        $order = (isset($this->_req_data['order']) && ! empty($this->_req_data['order'])) ? $this->_req_data['order']
978
-            : 'ASC';
979
-        switch ($this->_req_data['orderby']) {
980
-            case 'name':
981
-                $orderby = array('PRT_name' => $order);
982
-                break;
983
-            default:
984
-                $orderby = array('PRT_order' => $order);
985
-        }
986
-
987
-
988
-        $current_page = isset($this->_req_data['paged']) && ! empty($this->_req_data['paged'])
989
-            ? $this->_req_data['paged'] : 1;
990
-        $per_page = isset($this->_req_data['perpage']) && ! empty($this->_req_data['perpage'])
991
-            ? $this->_req_data['perpage'] : $per_page;
992
-
993
-        $offset = ($current_page - 1) * $per_page;
994
-        $limit = array($offset, $per_page);
995
-
996
-        $_where = array('PRT_deleted' => $trashed, 'PBT_ID' => array('!=', 1));
997
-
998
-        if (isset($this->_req_data['s'])) {
999
-            $sstr = '%' . $this->_req_data['s'] . '%';
1000
-            $_where['OR'] = array(
1001
-                'PRT_name' => array('LIKE', $sstr),
1002
-            );
1003
-        }
1004
-        $query_params = array(
1005
-            $_where,
1006
-            'order_by' => $orderby,
1007
-            'limit'    => $limit,
1008
-        );
1009
-        if ($count) {
1010
-            return EEM_Price_Type::instance()->count_deleted_and_undeleted($query_params);
1011
-        } else {
1012
-            return EEM_Price_Type::instance()->get_all_deleted_and_undeleted($query_params);
1013
-        }
1014
-
1015
-        // EEH_Debug_Tools::printr( $price_types, '$price_types  <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span>', 'auto' );
1016
-    }
1017
-
1018
-
1019
-    /**
1020
-     *        _edit_price_type_details
1021
-     *
1022
-     * @access protected
1023
-     * @return void
1024
-     */
1025
-    protected function _edit_price_type_details()
1026
-    {
1027
-
1028
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
1029
-
1030
-
1031
-        // grab price type ID
1032
-        $PRT_ID = isset($this->_req_data['id']) && ! empty($this->_req_data['id']) ? absint($this->_req_data['id'])
1033
-            : false;
1034
-        // change page title based on request action
1035
-        switch ($this->_req_action) {
1036
-            case 'add_new_price_type':
1037
-                $this->_admin_page_title = esc_html__('Add New Price Type', 'event_espresso');
1038
-                break;
1039
-            case 'edit_price_type':
1040
-                $this->_admin_page_title = esc_html__('Edit Price Type', 'event_espresso');
1041
-                break;
1042
-            default:
1043
-                $this->_admin_page_title = ucwords(str_replace('_', ' ', $this->_req_action));
1044
-        }
1045
-        // add PRT_ID to title if editing
1046
-        $this->_admin_page_title = $PRT_ID ? $this->_admin_page_title . ' # ' . $PRT_ID : $this->_admin_page_title;
1047
-
1048
-        if ($PRT_ID) {
1049
-            $price_type = EEM_Price_Type::instance()->get_one_by_ID($PRT_ID);
1050
-            $additional_hidden_fields = array('PRT_ID' => array('type' => 'hidden', 'value' => $PRT_ID));
1051
-            $this->_set_add_edit_form_tags('update_price_type', $additional_hidden_fields);
1052
-        } else {
1053
-            $price_type = EEM_Price_Type::instance()->get_new_price_type();
1054
-            $this->_set_add_edit_form_tags('insert_price_type');
1055
-        }
1056
-
1057
-        $this->_template_args['PRT_ID'] = $PRT_ID;
1058
-        $this->_template_args['price_type'] = $price_type;
1059
-
1060
-
1061
-        $base_types = EEM_Price_Type::instance()->get_base_types();
1062
-        $select_values = array();
1063
-        foreach ($base_types as $ref => $text) {
1064
-            if ($ref == EEM_Price_Type::base_type_base_price) {
1065
-                // do not allow creation of base_type_base_prices because that's a system only base type.
1066
-                continue;
1067
-            }
1068
-            $values[] = array('id' => $ref, 'text' => $text);
1069
-        }
1070
-
1071
-
1072
-        $this->_template_args['base_type_select'] = EEH_Form_Fields::select_input(
1073
-            'base_type',
1074
-            $values,
1075
-            $price_type->base_type(),
1076
-            'id="price-type-base-type-slct"'
1077
-        );
1078
-        $this->_template_args['learn_more_about_pricing_link'] = $this->_learn_more_about_pricing_link();
1079
-        $redirect_URL = add_query_arg(array('action' => 'price_types'), $this->_admin_base_url);
1080
-        $this->_set_publish_post_box_vars('id', $PRT_ID, false, $redirect_URL);
1081
-        // the details template wrapper
1082
-        $this->display_admin_page_with_sidebar();
1083
-    }
1084
-
1085
-
1086
-    /**
1087
-     *        declare price type details page metaboxes
1088
-     *
1089
-     * @access protected
1090
-     * @return void
1091
-     */
1092
-    protected function _price_type_details_meta_boxes()
1093
-    {
1094
-        add_meta_box(
1095
-            'edit-price-details-mbox',
1096
-            __('Price Type Details', 'event_espresso'),
1097
-            array($this, '_edit_price_type_details_meta_box'),
1098
-            $this->wp_page_slug,
1099
-            'normal',
1100
-            'high'
1101
-        );
1102
-    }
1103
-
1104
-
1105
-    /**
1106
-     *        _edit_price_type_details_meta_box
1107
-     *
1108
-     * @access public
1109
-     * @return void
1110
-     */
1111
-    public function _edit_price_type_details_meta_box()
1112
-    {
1113
-        echo EEH_Template::display_template(
1114
-            PRICING_TEMPLATE_PATH . 'pricing_type_details_main_meta_box.template.php',
1115
-            $this->_template_args,
1116
-            true
1117
-        );
1118
-    }
1119
-
1120
-
1121
-    /**
1122
-     *        set_price_type_column_values
1123
-     *
1124
-     * @access protected
1125
-     * @return void
1126
-     */
1127
-    protected function set_price_type_column_values()
1128
-    {
1129
-
1130
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
1131
-
1132
-        $base_type = ! empty($this->_req_data['base_type']) ? $this->_req_data['base_type']
1133
-            : EEM_Price_Type::base_type_base_price;
1134
-
1135
-        switch ($base_type) {
1136
-            case EEM_Price_Type::base_type_base_price:
1137
-                $this->_req_data['PBT_ID'] = EEM_Price_Type::base_type_base_price;
1138
-                $this->_req_data['PRT_is_percent'] = 0;
1139
-                $this->_req_data['PRT_order'] = 0;
1140
-                break;
1141
-
1142
-            case EEM_Price_Type::base_type_discount:
1143
-                $this->_req_data['PBT_ID'] = EEM_Price_Type::base_type_discount;
1144
-                break;
1145
-
1146
-            case EEM_Price_Type::base_type_surcharge:
1147
-                $this->_req_data['PBT_ID'] = EEM_Price_Type::base_type_surcharge;
1148
-                break;
1149
-
1150
-            case EEM_Price_Type::base_type_tax:
1151
-                $this->_req_data['PBT_ID'] = EEM_Price_Type::base_type_tax;
1152
-                $this->_req_data['PRT_is_percent'] = 1;
1153
-                break;
1154
-        }/**/
1155
-
1156
-        $set_column_values = array(
1157
-            'PRT_name'       => $this->_req_data['PRT_name'],
1158
-            'PBT_ID'         => absint($this->_req_data['PBT_ID']),
1159
-            'PRT_is_percent' => absint($this->_req_data['PRT_is_percent']),
1160
-            'PRT_order'      => absint($this->_req_data['PRT_order']),
1161
-            'PRT_deleted'    => 0,
1162
-        );
1163
-
1164
-        return $set_column_values;
1165
-    }
1166
-
1167
-
1168
-    /**
1169
-     *        _insert_or_update_price_type
1170
-     *
1171
-     * @param boolean $new_price_type - whether to insert or update
1172
-     * @access protected
1173
-     * @return void
1174
-     */
1175
-    protected function _insert_or_update_price_type($new_price_type = false)
1176
-    {
1177
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
1178
-
1179
-        require_once(EE_MODELS . 'EEM_Price_Type.model.php');
1180
-        $PRT = EEM_Price_Type::instance();
1181
-
1182
-        // why be so pessimistic ???  : (
1183
-        $success = 0;
1184
-
1185
-        $set_column_values = $this->set_price_type_column_values();
1186
-        // is this a new Price ?
1187
-        if ($new_price_type) {
1188
-            // run the insert
1189
-            if ($PRT_ID = $PRT->insert($set_column_values)) {
1190
-                $success = 1;
1191
-            }
1192
-            $action_desc = 'created';
1193
-        } else {
1194
-            $PRT_ID = absint($this->_req_data['PRT_ID']);
1195
-            // run the update
1196
-            $where_cols_n_values = array('PRT_ID' => $PRT_ID);
1197
-            if ($PRT->update($set_column_values, array($where_cols_n_values))) {
1198
-                $success = 1;
1199
-            }
1200
-            $action_desc = 'updated';
1201
-        }
1202
-
1203
-        $query_args = array('action' => 'edit_price_type', 'id' => $PRT_ID);
1204
-        $this->_redirect_after_action($success, 'Price Type', $action_desc, $query_args);
1205
-    }
1206
-
1207
-
1208
-    /**
1209
-     *        _trash_or_restore_price_type
1210
-     *
1211
-     * @param boolean $trash - whether to move item to trash (TRUE) or restore it (FALSE)
1212
-     * @access protected
1213
-     * @return void
1214
-     */
1215
-    protected function _trash_or_restore_price_type($trash = true)
1216
-    {
1217
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
1218
-
1219
-        require_once(EE_MODELS . 'EEM_Price_Type.model.php');
1220
-        $PRT = EEM_Price_Type::instance();
1221
-
1222
-        $success = 1;
1223
-        $PRT_deleted = $trash ? true : false;
1224
-        // Checkboxes
1225
-        if (! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
1226
-            // if array has more than one element than success message should be plural
1227
-            $success = count($this->_req_data['checkbox']) > 1 ? 2 : 1;
1228
-            $what = count($this->_req_data['checkbox']) > 1 ? 'Price Types' : 'Price Type';
1229
-            // cycle thru checkboxes
1230
-            while (list($PRT_ID, $value) = each($this->_req_data['checkbox'])) {
1231
-                if (! $PRT->update_by_ID(array('PRT_deleted' => $PRT_deleted), $PRT_ID)) {
1232
-                    $success = 0;
1233
-                }
1234
-            }
1235
-        } else {
1236
-            // grab single id and delete
1237
-            $PRT_ID = isset($this->_req_data['id']) ? absint($this->_req_data['id']) : 0;
1238
-            if (empty($PRT_ID) || ! $PRT->update_by_ID(array('PRT_deleted' => $PRT_deleted), $PRT_ID)) {
1239
-                $success = 0;
1240
-            }
1241
-            $what = 'Price Type';
1242
-        }
1243
-
1244
-        $query_args = array('action' => 'price_types');
1245
-        if ($success) {
1246
-            if ($trash) {
1247
-                $msg = $success > 1
1248
-                    ? __('The Price Types have been trashed.', 'event_espresso')
1249
-                    : __(
1250
-                        'The Price Type has been trashed.',
1251
-                        'event_espresso'
1252
-                    );
1253
-            } else {
1254
-                $msg = $success > 1
1255
-                    ? __('The Price Types have been restored.', 'event_espresso')
1256
-                    : __(
1257
-                        'The Price Type has been restored.',
1258
-                        'event_espresso'
1259
-                    );
1260
-            }
1261
-            EE_Error::add_success($msg);
1262
-        }
1263
-
1264
-        $this->_redirect_after_action(false, '', '', $query_args, true);
1265
-    }
1266
-
1267
-
1268
-    /**
1269
-     *        _delete_price_type
1270
-     *
1271
-     * @access protected
1272
-     * @return void
1273
-     */
1274
-    protected function _delete_price_type()
1275
-    {
1276
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
1277
-
1278
-        $PRT = EEM_Price_Type::instance();
1279
-
1280
-        $success = 1;
1281
-        // Checkboxes
1282
-        if (! empty($this->_req_data['checkbox'])) {
1283
-            // if array has more than one element than success message should be plural
1284
-            $success = count($this->_req_data['checkbox']) > 1 ? 2 : 1;
1285
-            $what = $PRT->item_name($success);
1286
-            // cycle thru bulk action checkboxes
1287
-            while (list($PRT_ID, $value) = each($this->_req_data['checkbox'])) {
1288
-                if (! $PRT->delete_permanently_by_ID($PRT_ID)) {
1289
-                    $success = 0;
1290
-                }
1291
-            }
1292
-        }
1293
-
1294
-
1295
-        $query_args = array('action' => 'price_types');
1296
-        $this->_redirect_after_action($success, $what, 'deleted', $query_args);
1297
-    }
1298
-
1299
-
1300
-    /**
1301
-     *        _learn_more_about_pricing_link
1302
-     *
1303
-     * @access protected
1304
-     * @return string
1305
-     */
1306
-    protected function _learn_more_about_pricing_link()
1307
-    {
1308
-        return '<a class="hidden" style="margin:0 20px; cursor:pointer; font-size:12px;" >' . __(
1309
-            'learn more about how pricing works',
1310
-            'event_espresso'
1311
-        ) . '</a>';
1312
-    }
1313
-
1314
-
1315
-    protected function _tax_settings()
1316
-    {
1317
-        $this->_set_add_edit_form_tags('update_tax_settings');
1318
-        $this->_set_publish_post_box_vars(null, false, false, null, false);
1319
-        $this->_template_args['admin_page_content'] = $this->tax_settings_form()->get_html();
1320
-        $this->display_admin_page_with_sidebar();
1321
-    }
1322
-
1323
-
1324
-    /**
1325
-     * @return \EE_Form_Section_Proper
1326
-     * @throws \EE_Error
1327
-     */
1328
-    protected function tax_settings_form()
1329
-    {
1330
-        return new EE_Form_Section_Proper(
1331
-            array(
1332
-                'name'            => 'tax_settings_form',
1333
-                'html_id'         => 'tax_settings_form',
1334
-                'layout_strategy' => new EE_Div_Per_Section_Layout(),
1335
-                'subsections'     => apply_filters(
1336
-                    'FHEE__Pricing_Admin_Page__tax_settings_form__form_subsections',
1337
-                    array(
1338
-                        'tax_settings' => new EE_Form_Section_Proper(
1339
-                            array(
1340
-                                'name'            => 'tax_settings_tbl',
1341
-                                'html_id'         => 'tax_settings_tbl',
1342
-                                'html_class'      => 'form-table',
1343
-                                'layout_strategy' => new EE_Admin_Two_Column_Layout(),
1344
-                                'subsections'     => array(
1345
-                                    'prices_displayed_including_taxes' => new EE_Yes_No_Input(
1346
-                                        array(
1347
-                                            'html_label_text'         => __(
1348
-                                                "Show Prices With Taxes Included?",
1349
-                                                'event_espresso'
1350
-                                            ),
1351
-                                            'html_help_text'          => __(
1352
-                                                'Indicates whether or not to display prices with the taxes included',
1353
-                                                'event_espresso'
1354
-                                            ),
1355
-                                            'default'                 => isset(
1356
-                                                EE_Registry::instance()
1357
-                                                    ->CFG
1358
-                                                    ->tax_settings
1359
-                                                    ->prices_displayed_including_taxes
1360
-                                            )
1361
-                                                ? EE_Registry::instance()
1362
-                                                    ->CFG
1363
-                                                    ->tax_settings
1364
-                                                    ->prices_displayed_including_taxes
1365
-                                                : true,
1366
-                                            'display_html_label_text' => false,
1367
-                                        )
1368
-                                    ),
1369
-                                ),
1370
-                            )
1371
-                        ),
1372
-                    )
1373
-                ),
1374
-            )
1375
-        );
1376
-    }
1377
-
1378
-
1379
-    /**
1380
-     * _update_tax_settings
1381
-     *
1382
-     * @since 4.9.13
1383
-     * @return void
1384
-     */
1385
-    public function _update_tax_settings()
1386
-    {
1387
-        if (! isset(EE_Registry::instance()->CFG->tax_settings)) {
1388
-            EE_Registry::instance()->CFG->tax_settings = new EE_Tax_Config();
1389
-        }
1390
-        try {
1391
-            $tax_form = $this->tax_settings_form();
1392
-            // check for form submission
1393
-            if ($tax_form->was_submitted()) {
1394
-                // capture form data
1395
-                $tax_form->receive_form_submission();
1396
-                // validate form data
1397
-                if ($tax_form->is_valid()) {
1398
-                    // grab validated data from form
1399
-                    $valid_data = $tax_form->valid_data();
1400
-                    // set data on config
1401
-                    EE_Registry::instance()
1402
-                        ->CFG
1403
-                        ->tax_settings
1404
-                        ->prices_displayed_including_taxes
1405
-                        = $valid_data['tax_settings']['prices_displayed_including_taxes'];
1406
-                } else {
1407
-                    if ($tax_form->submission_error_message() !== '') {
1408
-                        EE_Error::add_error(
1409
-                            $tax_form->submission_error_message(),
1410
-                            __FILE__,
1411
-                            __FUNCTION__,
1412
-                            __LINE__
1413
-                        );
1414
-                    }
1415
-                }
1416
-            }
1417
-        } catch (EE_Error $e) {
1418
-            EE_Error::add_error($e->get_error(), __FILE__, __FUNCTION__, __LINE__);
1419
-        }
1420
-
1421
-        $what = 'Tax Settings';
1422
-        $success = $this->_update_espresso_configuration(
1423
-            $what,
1424
-            EE_Registry::instance()->CFG->tax_settings,
1425
-            __FILE__,
1426
-            __FUNCTION__,
1427
-            __LINE__
1428
-        );
1429
-        $this->_redirect_after_action($success, $what, 'updated', array('action' => 'tax_settings'));
1430
-    }
938
+	/**
939
+	 *        generates HTML for main Prices Admin page
940
+	 *
941
+	 * @access protected
942
+	 * @return void
943
+	 */
944
+	protected function _price_types_overview_list_table()
945
+	{
946
+		$this->_admin_page_title .= ' ' . $this->get_action_link_or_button(
947
+			'add_new_price_type',
948
+			'add_type',
949
+			array(),
950
+			'add-new-h2'
951
+		);
952
+		$this->admin_page_title .= $this->_learn_more_about_pricing_link();
953
+		$this->_search_btn_label = __('Price Types', 'event_espresso');
954
+		$this->display_admin_list_table_page_with_no_sidebar();
955
+	}
956
+
957
+
958
+	/**
959
+	 *    retrieve data for Price Types List table
960
+	 *
961
+	 * @access public
962
+	 * @param  int     $per_page how many prices displayed per page
963
+	 * @param  boolean $count    return the count or objects
964
+	 * @param  boolean $trashed  whether the current view is of the trash can - eww yuck!
965
+	 * @return mixed (int|array)  int = count || array of price objects
966
+	 */
967
+	public function get_price_types_overview_data($per_page = 10, $count = false, $trashed = false)
968
+	{
969
+
970
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
971
+		// start with an empty array
972
+
973
+		require_once(PRICING_ADMIN . 'Price_Types_List_Table.class.php');
974
+		require_once(EE_MODELS . 'EEM_Price_Type.model.php');
975
+
976
+		$this->_req_data['orderby'] = empty($this->_req_data['orderby']) ? '' : $this->_req_data['orderby'];
977
+		$order = (isset($this->_req_data['order']) && ! empty($this->_req_data['order'])) ? $this->_req_data['order']
978
+			: 'ASC';
979
+		switch ($this->_req_data['orderby']) {
980
+			case 'name':
981
+				$orderby = array('PRT_name' => $order);
982
+				break;
983
+			default:
984
+				$orderby = array('PRT_order' => $order);
985
+		}
986
+
987
+
988
+		$current_page = isset($this->_req_data['paged']) && ! empty($this->_req_data['paged'])
989
+			? $this->_req_data['paged'] : 1;
990
+		$per_page = isset($this->_req_data['perpage']) && ! empty($this->_req_data['perpage'])
991
+			? $this->_req_data['perpage'] : $per_page;
992
+
993
+		$offset = ($current_page - 1) * $per_page;
994
+		$limit = array($offset, $per_page);
995
+
996
+		$_where = array('PRT_deleted' => $trashed, 'PBT_ID' => array('!=', 1));
997
+
998
+		if (isset($this->_req_data['s'])) {
999
+			$sstr = '%' . $this->_req_data['s'] . '%';
1000
+			$_where['OR'] = array(
1001
+				'PRT_name' => array('LIKE', $sstr),
1002
+			);
1003
+		}
1004
+		$query_params = array(
1005
+			$_where,
1006
+			'order_by' => $orderby,
1007
+			'limit'    => $limit,
1008
+		);
1009
+		if ($count) {
1010
+			return EEM_Price_Type::instance()->count_deleted_and_undeleted($query_params);
1011
+		} else {
1012
+			return EEM_Price_Type::instance()->get_all_deleted_and_undeleted($query_params);
1013
+		}
1014
+
1015
+		// EEH_Debug_Tools::printr( $price_types, '$price_types  <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span>', 'auto' );
1016
+	}
1017
+
1018
+
1019
+	/**
1020
+	 *        _edit_price_type_details
1021
+	 *
1022
+	 * @access protected
1023
+	 * @return void
1024
+	 */
1025
+	protected function _edit_price_type_details()
1026
+	{
1027
+
1028
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
1029
+
1030
+
1031
+		// grab price type ID
1032
+		$PRT_ID = isset($this->_req_data['id']) && ! empty($this->_req_data['id']) ? absint($this->_req_data['id'])
1033
+			: false;
1034
+		// change page title based on request action
1035
+		switch ($this->_req_action) {
1036
+			case 'add_new_price_type':
1037
+				$this->_admin_page_title = esc_html__('Add New Price Type', 'event_espresso');
1038
+				break;
1039
+			case 'edit_price_type':
1040
+				$this->_admin_page_title = esc_html__('Edit Price Type', 'event_espresso');
1041
+				break;
1042
+			default:
1043
+				$this->_admin_page_title = ucwords(str_replace('_', ' ', $this->_req_action));
1044
+		}
1045
+		// add PRT_ID to title if editing
1046
+		$this->_admin_page_title = $PRT_ID ? $this->_admin_page_title . ' # ' . $PRT_ID : $this->_admin_page_title;
1047
+
1048
+		if ($PRT_ID) {
1049
+			$price_type = EEM_Price_Type::instance()->get_one_by_ID($PRT_ID);
1050
+			$additional_hidden_fields = array('PRT_ID' => array('type' => 'hidden', 'value' => $PRT_ID));
1051
+			$this->_set_add_edit_form_tags('update_price_type', $additional_hidden_fields);
1052
+		} else {
1053
+			$price_type = EEM_Price_Type::instance()->get_new_price_type();
1054
+			$this->_set_add_edit_form_tags('insert_price_type');
1055
+		}
1056
+
1057
+		$this->_template_args['PRT_ID'] = $PRT_ID;
1058
+		$this->_template_args['price_type'] = $price_type;
1059
+
1060
+
1061
+		$base_types = EEM_Price_Type::instance()->get_base_types();
1062
+		$select_values = array();
1063
+		foreach ($base_types as $ref => $text) {
1064
+			if ($ref == EEM_Price_Type::base_type_base_price) {
1065
+				// do not allow creation of base_type_base_prices because that's a system only base type.
1066
+				continue;
1067
+			}
1068
+			$values[] = array('id' => $ref, 'text' => $text);
1069
+		}
1070
+
1071
+
1072
+		$this->_template_args['base_type_select'] = EEH_Form_Fields::select_input(
1073
+			'base_type',
1074
+			$values,
1075
+			$price_type->base_type(),
1076
+			'id="price-type-base-type-slct"'
1077
+		);
1078
+		$this->_template_args['learn_more_about_pricing_link'] = $this->_learn_more_about_pricing_link();
1079
+		$redirect_URL = add_query_arg(array('action' => 'price_types'), $this->_admin_base_url);
1080
+		$this->_set_publish_post_box_vars('id', $PRT_ID, false, $redirect_URL);
1081
+		// the details template wrapper
1082
+		$this->display_admin_page_with_sidebar();
1083
+	}
1084
+
1085
+
1086
+	/**
1087
+	 *        declare price type details page metaboxes
1088
+	 *
1089
+	 * @access protected
1090
+	 * @return void
1091
+	 */
1092
+	protected function _price_type_details_meta_boxes()
1093
+	{
1094
+		add_meta_box(
1095
+			'edit-price-details-mbox',
1096
+			__('Price Type Details', 'event_espresso'),
1097
+			array($this, '_edit_price_type_details_meta_box'),
1098
+			$this->wp_page_slug,
1099
+			'normal',
1100
+			'high'
1101
+		);
1102
+	}
1103
+
1104
+
1105
+	/**
1106
+	 *        _edit_price_type_details_meta_box
1107
+	 *
1108
+	 * @access public
1109
+	 * @return void
1110
+	 */
1111
+	public function _edit_price_type_details_meta_box()
1112
+	{
1113
+		echo EEH_Template::display_template(
1114
+			PRICING_TEMPLATE_PATH . 'pricing_type_details_main_meta_box.template.php',
1115
+			$this->_template_args,
1116
+			true
1117
+		);
1118
+	}
1119
+
1120
+
1121
+	/**
1122
+	 *        set_price_type_column_values
1123
+	 *
1124
+	 * @access protected
1125
+	 * @return void
1126
+	 */
1127
+	protected function set_price_type_column_values()
1128
+	{
1129
+
1130
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
1131
+
1132
+		$base_type = ! empty($this->_req_data['base_type']) ? $this->_req_data['base_type']
1133
+			: EEM_Price_Type::base_type_base_price;
1134
+
1135
+		switch ($base_type) {
1136
+			case EEM_Price_Type::base_type_base_price:
1137
+				$this->_req_data['PBT_ID'] = EEM_Price_Type::base_type_base_price;
1138
+				$this->_req_data['PRT_is_percent'] = 0;
1139
+				$this->_req_data['PRT_order'] = 0;
1140
+				break;
1141
+
1142
+			case EEM_Price_Type::base_type_discount:
1143
+				$this->_req_data['PBT_ID'] = EEM_Price_Type::base_type_discount;
1144
+				break;
1145
+
1146
+			case EEM_Price_Type::base_type_surcharge:
1147
+				$this->_req_data['PBT_ID'] = EEM_Price_Type::base_type_surcharge;
1148
+				break;
1149
+
1150
+			case EEM_Price_Type::base_type_tax:
1151
+				$this->_req_data['PBT_ID'] = EEM_Price_Type::base_type_tax;
1152
+				$this->_req_data['PRT_is_percent'] = 1;
1153
+				break;
1154
+		}/**/
1155
+
1156
+		$set_column_values = array(
1157
+			'PRT_name'       => $this->_req_data['PRT_name'],
1158
+			'PBT_ID'         => absint($this->_req_data['PBT_ID']),
1159
+			'PRT_is_percent' => absint($this->_req_data['PRT_is_percent']),
1160
+			'PRT_order'      => absint($this->_req_data['PRT_order']),
1161
+			'PRT_deleted'    => 0,
1162
+		);
1163
+
1164
+		return $set_column_values;
1165
+	}
1166
+
1167
+
1168
+	/**
1169
+	 *        _insert_or_update_price_type
1170
+	 *
1171
+	 * @param boolean $new_price_type - whether to insert or update
1172
+	 * @access protected
1173
+	 * @return void
1174
+	 */
1175
+	protected function _insert_or_update_price_type($new_price_type = false)
1176
+	{
1177
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
1178
+
1179
+		require_once(EE_MODELS . 'EEM_Price_Type.model.php');
1180
+		$PRT = EEM_Price_Type::instance();
1181
+
1182
+		// why be so pessimistic ???  : (
1183
+		$success = 0;
1184
+
1185
+		$set_column_values = $this->set_price_type_column_values();
1186
+		// is this a new Price ?
1187
+		if ($new_price_type) {
1188
+			// run the insert
1189
+			if ($PRT_ID = $PRT->insert($set_column_values)) {
1190
+				$success = 1;
1191
+			}
1192
+			$action_desc = 'created';
1193
+		} else {
1194
+			$PRT_ID = absint($this->_req_data['PRT_ID']);
1195
+			// run the update
1196
+			$where_cols_n_values = array('PRT_ID' => $PRT_ID);
1197
+			if ($PRT->update($set_column_values, array($where_cols_n_values))) {
1198
+				$success = 1;
1199
+			}
1200
+			$action_desc = 'updated';
1201
+		}
1202
+
1203
+		$query_args = array('action' => 'edit_price_type', 'id' => $PRT_ID);
1204
+		$this->_redirect_after_action($success, 'Price Type', $action_desc, $query_args);
1205
+	}
1206
+
1207
+
1208
+	/**
1209
+	 *        _trash_or_restore_price_type
1210
+	 *
1211
+	 * @param boolean $trash - whether to move item to trash (TRUE) or restore it (FALSE)
1212
+	 * @access protected
1213
+	 * @return void
1214
+	 */
1215
+	protected function _trash_or_restore_price_type($trash = true)
1216
+	{
1217
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
1218
+
1219
+		require_once(EE_MODELS . 'EEM_Price_Type.model.php');
1220
+		$PRT = EEM_Price_Type::instance();
1221
+
1222
+		$success = 1;
1223
+		$PRT_deleted = $trash ? true : false;
1224
+		// Checkboxes
1225
+		if (! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
1226
+			// if array has more than one element than success message should be plural
1227
+			$success = count($this->_req_data['checkbox']) > 1 ? 2 : 1;
1228
+			$what = count($this->_req_data['checkbox']) > 1 ? 'Price Types' : 'Price Type';
1229
+			// cycle thru checkboxes
1230
+			while (list($PRT_ID, $value) = each($this->_req_data['checkbox'])) {
1231
+				if (! $PRT->update_by_ID(array('PRT_deleted' => $PRT_deleted), $PRT_ID)) {
1232
+					$success = 0;
1233
+				}
1234
+			}
1235
+		} else {
1236
+			// grab single id and delete
1237
+			$PRT_ID = isset($this->_req_data['id']) ? absint($this->_req_data['id']) : 0;
1238
+			if (empty($PRT_ID) || ! $PRT->update_by_ID(array('PRT_deleted' => $PRT_deleted), $PRT_ID)) {
1239
+				$success = 0;
1240
+			}
1241
+			$what = 'Price Type';
1242
+		}
1243
+
1244
+		$query_args = array('action' => 'price_types');
1245
+		if ($success) {
1246
+			if ($trash) {
1247
+				$msg = $success > 1
1248
+					? __('The Price Types have been trashed.', 'event_espresso')
1249
+					: __(
1250
+						'The Price Type has been trashed.',
1251
+						'event_espresso'
1252
+					);
1253
+			} else {
1254
+				$msg = $success > 1
1255
+					? __('The Price Types have been restored.', 'event_espresso')
1256
+					: __(
1257
+						'The Price Type has been restored.',
1258
+						'event_espresso'
1259
+					);
1260
+			}
1261
+			EE_Error::add_success($msg);
1262
+		}
1263
+
1264
+		$this->_redirect_after_action(false, '', '', $query_args, true);
1265
+	}
1266
+
1267
+
1268
+	/**
1269
+	 *        _delete_price_type
1270
+	 *
1271
+	 * @access protected
1272
+	 * @return void
1273
+	 */
1274
+	protected function _delete_price_type()
1275
+	{
1276
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
1277
+
1278
+		$PRT = EEM_Price_Type::instance();
1279
+
1280
+		$success = 1;
1281
+		// Checkboxes
1282
+		if (! empty($this->_req_data['checkbox'])) {
1283
+			// if array has more than one element than success message should be plural
1284
+			$success = count($this->_req_data['checkbox']) > 1 ? 2 : 1;
1285
+			$what = $PRT->item_name($success);
1286
+			// cycle thru bulk action checkboxes
1287
+			while (list($PRT_ID, $value) = each($this->_req_data['checkbox'])) {
1288
+				if (! $PRT->delete_permanently_by_ID($PRT_ID)) {
1289
+					$success = 0;
1290
+				}
1291
+			}
1292
+		}
1293
+
1294
+
1295
+		$query_args = array('action' => 'price_types');
1296
+		$this->_redirect_after_action($success, $what, 'deleted', $query_args);
1297
+	}
1298
+
1299
+
1300
+	/**
1301
+	 *        _learn_more_about_pricing_link
1302
+	 *
1303
+	 * @access protected
1304
+	 * @return string
1305
+	 */
1306
+	protected function _learn_more_about_pricing_link()
1307
+	{
1308
+		return '<a class="hidden" style="margin:0 20px; cursor:pointer; font-size:12px;" >' . __(
1309
+			'learn more about how pricing works',
1310
+			'event_espresso'
1311
+		) . '</a>';
1312
+	}
1313
+
1314
+
1315
+	protected function _tax_settings()
1316
+	{
1317
+		$this->_set_add_edit_form_tags('update_tax_settings');
1318
+		$this->_set_publish_post_box_vars(null, false, false, null, false);
1319
+		$this->_template_args['admin_page_content'] = $this->tax_settings_form()->get_html();
1320
+		$this->display_admin_page_with_sidebar();
1321
+	}
1322
+
1323
+
1324
+	/**
1325
+	 * @return \EE_Form_Section_Proper
1326
+	 * @throws \EE_Error
1327
+	 */
1328
+	protected function tax_settings_form()
1329
+	{
1330
+		return new EE_Form_Section_Proper(
1331
+			array(
1332
+				'name'            => 'tax_settings_form',
1333
+				'html_id'         => 'tax_settings_form',
1334
+				'layout_strategy' => new EE_Div_Per_Section_Layout(),
1335
+				'subsections'     => apply_filters(
1336
+					'FHEE__Pricing_Admin_Page__tax_settings_form__form_subsections',
1337
+					array(
1338
+						'tax_settings' => new EE_Form_Section_Proper(
1339
+							array(
1340
+								'name'            => 'tax_settings_tbl',
1341
+								'html_id'         => 'tax_settings_tbl',
1342
+								'html_class'      => 'form-table',
1343
+								'layout_strategy' => new EE_Admin_Two_Column_Layout(),
1344
+								'subsections'     => array(
1345
+									'prices_displayed_including_taxes' => new EE_Yes_No_Input(
1346
+										array(
1347
+											'html_label_text'         => __(
1348
+												"Show Prices With Taxes Included?",
1349
+												'event_espresso'
1350
+											),
1351
+											'html_help_text'          => __(
1352
+												'Indicates whether or not to display prices with the taxes included',
1353
+												'event_espresso'
1354
+											),
1355
+											'default'                 => isset(
1356
+												EE_Registry::instance()
1357
+													->CFG
1358
+													->tax_settings
1359
+													->prices_displayed_including_taxes
1360
+											)
1361
+												? EE_Registry::instance()
1362
+													->CFG
1363
+													->tax_settings
1364
+													->prices_displayed_including_taxes
1365
+												: true,
1366
+											'display_html_label_text' => false,
1367
+										)
1368
+									),
1369
+								),
1370
+							)
1371
+						),
1372
+					)
1373
+				),
1374
+			)
1375
+		);
1376
+	}
1377
+
1378
+
1379
+	/**
1380
+	 * _update_tax_settings
1381
+	 *
1382
+	 * @since 4.9.13
1383
+	 * @return void
1384
+	 */
1385
+	public function _update_tax_settings()
1386
+	{
1387
+		if (! isset(EE_Registry::instance()->CFG->tax_settings)) {
1388
+			EE_Registry::instance()->CFG->tax_settings = new EE_Tax_Config();
1389
+		}
1390
+		try {
1391
+			$tax_form = $this->tax_settings_form();
1392
+			// check for form submission
1393
+			if ($tax_form->was_submitted()) {
1394
+				// capture form data
1395
+				$tax_form->receive_form_submission();
1396
+				// validate form data
1397
+				if ($tax_form->is_valid()) {
1398
+					// grab validated data from form
1399
+					$valid_data = $tax_form->valid_data();
1400
+					// set data on config
1401
+					EE_Registry::instance()
1402
+						->CFG
1403
+						->tax_settings
1404
+						->prices_displayed_including_taxes
1405
+						= $valid_data['tax_settings']['prices_displayed_including_taxes'];
1406
+				} else {
1407
+					if ($tax_form->submission_error_message() !== '') {
1408
+						EE_Error::add_error(
1409
+							$tax_form->submission_error_message(),
1410
+							__FILE__,
1411
+							__FUNCTION__,
1412
+							__LINE__
1413
+						);
1414
+					}
1415
+				}
1416
+			}
1417
+		} catch (EE_Error $e) {
1418
+			EE_Error::add_error($e->get_error(), __FILE__, __FUNCTION__, __LINE__);
1419
+		}
1420
+
1421
+		$what = 'Tax Settings';
1422
+		$success = $this->_update_espresso_configuration(
1423
+			$what,
1424
+			EE_Registry::instance()->CFG->tax_settings,
1425
+			__FILE__,
1426
+			__FUNCTION__,
1427
+			__LINE__
1428
+		);
1429
+		$this->_redirect_after_action($success, $what, 'updated', array('action' => 'tax_settings'));
1430
+	}
1431 1431
 }
Please login to merge, or discard this patch.
Spacing   +34 added lines, -34 removed lines patch added patch discarded remove patch
@@ -361,7 +361,7 @@  discard block
 block discarded – undo
361 361
         wp_enqueue_style('espresso-ui-theme');
362 362
         wp_register_style(
363 363
             'espresso_PRICING',
364
-            PRICING_ASSETS_URL . 'espresso_pricing_admin.css',
364
+            PRICING_ASSETS_URL.'espresso_pricing_admin.css',
365 365
             array(),
366 366
             EVENT_ESPRESSO_VERSION
367 367
         );
@@ -376,7 +376,7 @@  discard block
 block discarded – undo
376 376
         // wp_enqueue_script('jquery-ui-datepicker');
377 377
         wp_register_script(
378 378
             'espresso_PRICING',
379
-            PRICING_ASSETS_URL . 'espresso_pricing_admin.js',
379
+            PRICING_ASSETS_URL.'espresso_pricing_admin.js',
380 380
             array('jquery'),
381 381
             EVENT_ESPRESSO_VERSION,
382 382
             true
@@ -469,7 +469,7 @@  discard block
 block discarded – undo
469 469
      */
470 470
     protected function _price_overview_list_table()
471 471
     {
472
-        $this->_admin_page_title .= ' ' . $this->get_action_link_or_button(
472
+        $this->_admin_page_title .= ' '.$this->get_action_link_or_button(
473 473
             'add_new_price',
474 474
             'add',
475 475
             array(),
@@ -497,8 +497,8 @@  discard block
 block discarded – undo
497 497
         // start with an empty array
498 498
         $event_pricing = array();
499 499
 
500
-        require_once(PRICING_ADMIN . 'Prices_List_Table.class.php');
501
-        require_once(EE_MODELS . 'EEM_Price.model.php');
500
+        require_once(PRICING_ADMIN.'Prices_List_Table.class.php');
501
+        require_once(EE_MODELS.'EEM_Price.model.php');
502 502
         // $PRC = EEM_Price::instance();
503 503
 
504 504
         $this->_req_data['orderby'] = empty($this->_req_data['orderby']) ? '' : $this->_req_data['orderby'];
@@ -533,7 +533,7 @@  discard block
 block discarded – undo
533 533
         $limit = array($offset, $per_page);
534 534
 
535 535
         if (isset($this->_req_data['s'])) {
536
-            $sstr = '%' . $this->_req_data['s'] . '%';
536
+            $sstr = '%'.$this->_req_data['s'].'%';
537 537
             $_where['OR'] = array(
538 538
                 'PRC_name'            => array('LIKE', $sstr),
539 539
                 'PRC_desc'            => array('LIKE', $sstr),
@@ -582,10 +582,10 @@  discard block
 block discarded – undo
582 582
                 $this->_admin_page_title = ucwords(str_replace('_', ' ', $this->_req_action));
583 583
         }
584 584
         // add PRC_ID to title if editing
585
-        $this->_admin_page_title = $PRC_ID ? $this->_admin_page_title . ' # ' . $PRC_ID : $this->_admin_page_title;
585
+        $this->_admin_page_title = $PRC_ID ? $this->_admin_page_title.' # '.$PRC_ID : $this->_admin_page_title;
586 586
 
587 587
         // get prices
588
-        require_once(EE_MODELS . 'EEM_Price.model.php');
588
+        require_once(EE_MODELS.'EEM_Price.model.php');
589 589
         $PRC = EEM_Price::instance();
590 590
 
591 591
         if ($PRC_ID) {
@@ -603,7 +603,7 @@  discard block
 block discarded – undo
603 603
         $this->_template_args['price'] = $price;
604 604
 
605 605
         // get price types
606
-        require_once(EE_MODELS . 'EEM_Price_Type.model.php');
606
+        require_once(EE_MODELS.'EEM_Price_Type.model.php');
607 607
         $PRT = EEM_Price_Type::instance();
608 608
         $price_types = $PRT->get_all(array(array('PBT_ID' => array('!=', 1))));
609 609
         $price_type_names = array();
@@ -659,7 +659,7 @@  discard block
 block discarded – undo
659 659
     public function _edit_price_details_meta_box()
660 660
     {
661 661
         echo EEH_Template::display_template(
662
-            PRICING_TEMPLATE_PATH . 'pricing_details_main_meta_box.template.php',
662
+            PRICING_TEMPLATE_PATH.'pricing_details_main_meta_box.template.php',
663 663
             $this->_template_args,
664 664
             true
665 665
         );
@@ -705,7 +705,7 @@  discard block
 block discarded – undo
705 705
         // echo '<h3>'. __CLASS__ . '->' . __FUNCTION__ . ' <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span></h3>';
706 706
         do_action('AHEE_log', __FILE__, __FUNCTION__, '');
707 707
 
708
-        require_once(EE_MODELS . 'EEM_Price.model.php');
708
+        require_once(EE_MODELS.'EEM_Price.model.php');
709 709
         $PRC = EEM_Price::instance();
710 710
 
711 711
         // why be so pessimistic ???  : (
@@ -778,7 +778,7 @@  discard block
 block discarded – undo
778 778
         // echo '<h3>'. __CLASS__ . '->' . __FUNCTION__ . ' <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span></h3>';
779 779
         do_action('AHEE_log', __FILE__, __FUNCTION__, '');
780 780
 
781
-        require_once(EE_MODELS . 'EEM_Price.model.php');
781
+        require_once(EE_MODELS.'EEM_Price.model.php');
782 782
         $PRC = EEM_Price::instance();
783 783
 
784 784
         $success = 1;
@@ -787,12 +787,12 @@  discard block
 block discarded – undo
787 787
         // get base ticket for updating
788 788
         $ticket = EEM_Ticket::instance()->get_one_by_ID(1);
789 789
         // Checkboxes
790
-        if (! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
790
+        if ( ! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
791 791
             // if array has more than one element than success message should be plural
792 792
             $success = count($this->_req_data['checkbox']) > 1 ? 2 : 1;
793 793
             // cycle thru checkboxes
794 794
             while (list($PRC_ID, $value) = each($this->_req_data['checkbox'])) {
795
-                if (! $PRC->update_by_ID(array('PRC_deleted' => $PRC_deleted), absint($PRC_ID))) {
795
+                if ( ! $PRC->update_by_ID(array('PRC_deleted' => $PRC_deleted), absint($PRC_ID))) {
796 796
                     $success = 0;
797 797
                 } else {
798 798
                     $PR = EEM_Price::instance()->get_one_by_ID($PRC_ID);
@@ -865,24 +865,24 @@  discard block
 block discarded – undo
865 865
         // echo '<h3>'. __CLASS__ . '->' . __FUNCTION__ . ' <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span></h3>';
866 866
         do_action('AHEE_log', __FILE__, __FUNCTION__, '');
867 867
 
868
-        require_once(EE_MODELS . 'EEM_Price.model.php');
868
+        require_once(EE_MODELS.'EEM_Price.model.php');
869 869
         $PRC = EEM_Price::instance();
870 870
 
871 871
         $success = 1;
872 872
         // Checkboxes
873
-        if (! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
873
+        if ( ! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
874 874
             // if array has more than one element than success message should be plural
875 875
             $success = count($this->_req_data['checkbox']) > 1 ? 2 : 1;
876 876
             // cycle thru bulk action checkboxes
877 877
             while (list($PRC_ID, $value) = each($this->_req_data['checkbox'])) {
878
-                if (! $PRC->delete_permanently_by_ID(absint($PRC_ID))) {
878
+                if ( ! $PRC->delete_permanently_by_ID(absint($PRC_ID))) {
879 879
                     $success = 0;
880 880
                 }
881 881
             }
882 882
         } else {
883 883
             // grab single id and delete
884 884
             $PRC_ID = absint($this->_req_data['id']);
885
-            if (! $PRC->delete_permanently_by_ID($PRC_ID)) {
885
+            if ( ! $PRC->delete_permanently_by_ID($PRC_ID)) {
886 886
                 $success = 0;
887 887
             }
888 888
         }
@@ -907,7 +907,7 @@  discard block
 block discarded – undo
907 907
         if (is_array($row_ids)) {
908 908
             for ($i = 0; $i < count($row_ids); $i++) {
909 909
                 // Update the prices when re-ordering
910
-                $id = absint($row_ids[ $i ]);
910
+                $id = absint($row_ids[$i]);
911 911
                 if (EEM_Price::instance()->update(
912 912
                     array('PRC_order' => $i + 1),
913 913
                     array(array('PRC_ID' => $id))
@@ -943,7 +943,7 @@  discard block
 block discarded – undo
943 943
      */
944 944
     protected function _price_types_overview_list_table()
945 945
     {
946
-        $this->_admin_page_title .= ' ' . $this->get_action_link_or_button(
946
+        $this->_admin_page_title .= ' '.$this->get_action_link_or_button(
947 947
             'add_new_price_type',
948 948
             'add_type',
949 949
             array(),
@@ -970,8 +970,8 @@  discard block
 block discarded – undo
970 970
         do_action('AHEE_log', __FILE__, __FUNCTION__, '');
971 971
         // start with an empty array
972 972
 
973
-        require_once(PRICING_ADMIN . 'Price_Types_List_Table.class.php');
974
-        require_once(EE_MODELS . 'EEM_Price_Type.model.php');
973
+        require_once(PRICING_ADMIN.'Price_Types_List_Table.class.php');
974
+        require_once(EE_MODELS.'EEM_Price_Type.model.php');
975 975
 
976 976
         $this->_req_data['orderby'] = empty($this->_req_data['orderby']) ? '' : $this->_req_data['orderby'];
977 977
         $order = (isset($this->_req_data['order']) && ! empty($this->_req_data['order'])) ? $this->_req_data['order']
@@ -996,7 +996,7 @@  discard block
 block discarded – undo
996 996
         $_where = array('PRT_deleted' => $trashed, 'PBT_ID' => array('!=', 1));
997 997
 
998 998
         if (isset($this->_req_data['s'])) {
999
-            $sstr = '%' . $this->_req_data['s'] . '%';
999
+            $sstr = '%'.$this->_req_data['s'].'%';
1000 1000
             $_where['OR'] = array(
1001 1001
                 'PRT_name' => array('LIKE', $sstr),
1002 1002
             );
@@ -1043,7 +1043,7 @@  discard block
 block discarded – undo
1043 1043
                 $this->_admin_page_title = ucwords(str_replace('_', ' ', $this->_req_action));
1044 1044
         }
1045 1045
         // add PRT_ID to title if editing
1046
-        $this->_admin_page_title = $PRT_ID ? $this->_admin_page_title . ' # ' . $PRT_ID : $this->_admin_page_title;
1046
+        $this->_admin_page_title = $PRT_ID ? $this->_admin_page_title.' # '.$PRT_ID : $this->_admin_page_title;
1047 1047
 
1048 1048
         if ($PRT_ID) {
1049 1049
             $price_type = EEM_Price_Type::instance()->get_one_by_ID($PRT_ID);
@@ -1111,7 +1111,7 @@  discard block
 block discarded – undo
1111 1111
     public function _edit_price_type_details_meta_box()
1112 1112
     {
1113 1113
         echo EEH_Template::display_template(
1114
-            PRICING_TEMPLATE_PATH . 'pricing_type_details_main_meta_box.template.php',
1114
+            PRICING_TEMPLATE_PATH.'pricing_type_details_main_meta_box.template.php',
1115 1115
             $this->_template_args,
1116 1116
             true
1117 1117
         );
@@ -1176,7 +1176,7 @@  discard block
 block discarded – undo
1176 1176
     {
1177 1177
         do_action('AHEE_log', __FILE__, __FUNCTION__, '');
1178 1178
 
1179
-        require_once(EE_MODELS . 'EEM_Price_Type.model.php');
1179
+        require_once(EE_MODELS.'EEM_Price_Type.model.php');
1180 1180
         $PRT = EEM_Price_Type::instance();
1181 1181
 
1182 1182
         // why be so pessimistic ???  : (
@@ -1216,19 +1216,19 @@  discard block
 block discarded – undo
1216 1216
     {
1217 1217
         do_action('AHEE_log', __FILE__, __FUNCTION__, '');
1218 1218
 
1219
-        require_once(EE_MODELS . 'EEM_Price_Type.model.php');
1219
+        require_once(EE_MODELS.'EEM_Price_Type.model.php');
1220 1220
         $PRT = EEM_Price_Type::instance();
1221 1221
 
1222 1222
         $success = 1;
1223 1223
         $PRT_deleted = $trash ? true : false;
1224 1224
         // Checkboxes
1225
-        if (! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
1225
+        if ( ! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
1226 1226
             // if array has more than one element than success message should be plural
1227 1227
             $success = count($this->_req_data['checkbox']) > 1 ? 2 : 1;
1228 1228
             $what = count($this->_req_data['checkbox']) > 1 ? 'Price Types' : 'Price Type';
1229 1229
             // cycle thru checkboxes
1230 1230
             while (list($PRT_ID, $value) = each($this->_req_data['checkbox'])) {
1231
-                if (! $PRT->update_by_ID(array('PRT_deleted' => $PRT_deleted), $PRT_ID)) {
1231
+                if ( ! $PRT->update_by_ID(array('PRT_deleted' => $PRT_deleted), $PRT_ID)) {
1232 1232
                     $success = 0;
1233 1233
                 }
1234 1234
             }
@@ -1279,13 +1279,13 @@  discard block
 block discarded – undo
1279 1279
 
1280 1280
         $success = 1;
1281 1281
         // Checkboxes
1282
-        if (! empty($this->_req_data['checkbox'])) {
1282
+        if ( ! empty($this->_req_data['checkbox'])) {
1283 1283
             // if array has more than one element than success message should be plural
1284 1284
             $success = count($this->_req_data['checkbox']) > 1 ? 2 : 1;
1285 1285
             $what = $PRT->item_name($success);
1286 1286
             // cycle thru bulk action checkboxes
1287 1287
             while (list($PRT_ID, $value) = each($this->_req_data['checkbox'])) {
1288
-                if (! $PRT->delete_permanently_by_ID($PRT_ID)) {
1288
+                if ( ! $PRT->delete_permanently_by_ID($PRT_ID)) {
1289 1289
                     $success = 0;
1290 1290
                 }
1291 1291
             }
@@ -1305,10 +1305,10 @@  discard block
 block discarded – undo
1305 1305
      */
1306 1306
     protected function _learn_more_about_pricing_link()
1307 1307
     {
1308
-        return '<a class="hidden" style="margin:0 20px; cursor:pointer; font-size:12px;" >' . __(
1308
+        return '<a class="hidden" style="margin:0 20px; cursor:pointer; font-size:12px;" >'.__(
1309 1309
             'learn more about how pricing works',
1310 1310
             'event_espresso'
1311
-        ) . '</a>';
1311
+        ).'</a>';
1312 1312
     }
1313 1313
 
1314 1314
 
@@ -1384,7 +1384,7 @@  discard block
 block discarded – undo
1384 1384
      */
1385 1385
     public function _update_tax_settings()
1386 1386
     {
1387
-        if (! isset(EE_Registry::instance()->CFG->tax_settings)) {
1387
+        if ( ! isset(EE_Registry::instance()->CFG->tax_settings)) {
1388 1388
             EE_Registry::instance()->CFG->tax_settings = new EE_Tax_Config();
1389 1389
         }
1390 1390
         try {
Please login to merge, or discard this patch.
new/pricing/templates/event_tickets_datetime_ticket_price_row.template.php 1 patch
Braces   +10 added lines, -4 removed lines patch added patch discarded remove patch
@@ -33,9 +33,12 @@  discard block
 block discarded – undo
33 33
             <input type="text" size="1" class="edit-price-PRC_amount ee-numeric"
34 34
                    name="prices_archive[<?php echo $tkt_row; ?>][<?php echo $PRC_order; ?>][PRC_amount]"
35 35
                    value="<?php echo $PRC_amount; ?>" disabled>
36
-        <?php else : ?>
36
+        <?php else {
37
+	: ?>
37 38
             <input type="text" size="1" class="edit-price-PRC_amount ee-numeric"
38
-                   name="<?php echo $edit_prices_name; ?>[<?php echo $tkt_row; ?>][<?php echo $PRC_order; ?>][PRC_amount]"
39
+                   name="<?php echo $edit_prices_name;
40
+}
41
+?>[<?php echo $tkt_row; ?>][<?php echo $PRC_order; ?>][PRC_amount]"
39 42
                    value="<?php echo $PRC_amount; ?>">
40 43
         <?php endif; ?>
41 44
     </td>
@@ -46,8 +49,11 @@  discard block
 block discarded – undo
46 49
     <td>
47 50
         <?php if ($disabled) : ?>
48 51
             <span class="ee-lock-icon"></span>
49
-        <?php else : ?>
50
-            <!-- <span class="gear-icon dashicons dashicons-admin-generic clickable" data-ticket-row="<?php echo $tkt_row; ?>" data-context="price" data-price-row="<?php echo $PRC_order; ?>"></span> -->
52
+        <?php else {
53
+	: ?>
54
+            <!-- <span class="gear-icon dashicons dashicons-admin-generic clickable" data-ticket-row="<?php echo $tkt_row;
55
+}
56
+?>" data-context="price" data-price-row="<?php echo $PRC_order; ?>"></span> -->
51 57
             <span class="trash-icon dashicons dashicons-post-trash clickable" data-ticket-row="<?php echo $tkt_row; ?>"
52 58
                   data-context="price" data-price-row="<?php echo $PRC_order; ?>"<?php echo $show_trash_icon; ?>></span>
53 59
             <button data-ticket-row="<?php echo $tkt_row; ?>" data-price-row="<?php echo $PRC_order; ?>"
Please login to merge, or discard this patch.