//Recalc all totals
 $order->set_total(WC()->cart->shipping_total, 'shipping');
 $order->set_total(WC()->cart->get_cart_discount_total(), 'cart_discount');
 $order->set_total(WC()->cart->get_cart_discount_tax_total(), 'cart_discount_tax');
 $order->set_total(WC()->cart->tax_total, 'tax');
 $order->set_total(WC()->cart->shipping_tax_total, 'shipping_tax');
 $order->set_total(WC()->cart->total);
 // Cart Contents
 if (sizeof($order->get_items()) > 0) {
     foreach ($order->get_items() as $item) {
         if ($item['qty']) {
             $_product = $order->get_product_from_item($item);
             // We manually calculate the tax percentage here
             if ($_product->is_taxable() && $order->get_line_tax($item) > 0) {
                 // Calculate tax percentage
                 $item_tax_percentage = round($order->get_item_tax($item, false) / $order->get_item_total($item, false, false), 2) * 100;
             } else {
                 $item_tax_percentage = 00;
             }
             $item_name = $item['name'];
             $item_meta = new WC_Order_Item_Meta($item);
             if ($meta = $item_meta->display(true, true)) {
                 $item_name .= ' ( ' . $meta . ' )';
             }
             // apply_filters to item price so we can filter this if needed
             $hygglig_item_price_including_tax = $order->get_item_total($item, true);
             $item_price = apply_filters('hygglig_item_price_including_tax', $hygglig_item_price_including_tax);
             // Get SKU or product id [TEMP ONLY USE ID]
             $reference = $_product->id;
             //If variation of product - add ID
             if ($item['variation_id']) {
    /**
     * Process the payment
     */
    function process_payment($order_id)
    {
        if (!session_id()) {
            session_start();
        }
        $order = new WC_Order($order_id);
        if ($this->debug) {
            $this->log->add('paypal-pro', 'Processing order #' . $order_id);
        }
        $card_type = isset($_POST['paypal_pro_card_type']) ? wc_clean($_POST['paypal_pro_card_type']) : '';
        $card_number = isset($_POST['paypal_pro_card_number']) ? wc_clean($_POST['paypal_pro_card_number']) : '';
        $card_csc = isset($_POST['paypal_pro_card_csc']) ? wc_clean($_POST['paypal_pro_card_csc']) : '';
        $card_exp_month = isset($_POST['paypal_pro_card_expiration_month']) ? wc_clean($_POST['paypal_pro_card_expiration_month']) : '';
        $card_exp_year = isset($_POST['paypal_pro_card_expiration_year']) ? wc_clean($_POST['paypal_pro_card_expiration_year']) : '';
        // Format card expiration data
        $card_exp_month = (int) $card_exp_month;
        if ($card_exp_month < 10) {
            $card_exp_month = '0' . $card_exp_month;
        }
        $card_exp_year = (int) $card_exp_year;
        $card_exp_year += 2000;
        // Format card number
        $card_number = str_replace(array(' ', '-'), '', $card_number);
        /**
         * 3D Secure Handling
         */
        if ($this->enable_3dsecure) {
            if (!class_exists('CentinelClient')) {
                include_once 'lib/CentinelClient.php';
            }
            $this->clear_centinel_session();
            $centinelClient = new CentinelClient();
            $centinelClient->add("MsgType", "cmpi_lookup");
            $centinelClient->add("Version", "1.7");
            $centinelClient->add("ProcessorId", $this->centinel_pid);
            $centinelClient->add("MerchantId", $this->centinel_mid);
            $centinelClient->add("TransactionPwd", $this->centinel_pwd);
            $centinelClient->add("UserAgent", $_SERVER["HTTP_USER_AGENT"]);
            $centinelClient->add("BrowserHeader", $_SERVER["HTTP_ACCEPT"]);
            $centinelClient->add("TransactionType", 'C');
            // Standard cmpi_lookup fields
            $centinelClient->add('OrderNumber', $order_id);
            $centinelClient->add('Amount', $order->order_total * 100);
            $centinelClient->add('CurrencyCode', $this->iso4217[get_woocommerce_currency()]);
            $centinelClient->add('TransactionMode', 'S');
            // Items
            $item_loop = 0;
            if (sizeof($order->get_items()) > 0) {
                foreach ($order->get_items() as $item) {
                    $item_loop++;
                    $centinelClient->add('Item_Name_' . $item_loop, $item['name']);
                    $centinelClient->add('Item_Price_' . $item_loop, number_format($order->get_item_total($item, true, true) * 100));
                    $centinelClient->add('Item_Quantity_' . $item_loop, $item['qty']);
                    $centinelClient->add('Item_Desc_' . $item_loop, $item['id'] . ' - ' . $item['name']);
                }
            }
            // Payer Authentication specific fields
            $centinelClient->add('CardNumber', $card_number);
            $centinelClient->add('CardExpMonth', $card_exp_month);
            $centinelClient->add('CardExpYear', $card_exp_year);
            // Send request
            $centinelClient->sendHttp($this->centinel_url, "5000", "15000");
            // Save response in session
            $_SESSION["Centinel_orderid"] = $order_id;
            // Save lookup response in session
            $_SESSION["Centinel_cmpiMessageResp"] = $centinelClient->response;
            // Save lookup response in session
            $_SESSION["Centinel_Enrolled"] = $centinelClient->getValue("Enrolled");
            $_SESSION["Centinel_TransactionId"] = $centinelClient->getValue("TransactionId");
            $_SESSION["Centinel_OrderId"] = $centinelClient->getValue("OrderId");
            $_SESSION["Centinel_ACSUrl"] = $centinelClient->getValue("ACSUrl");
            $_SESSION["Centinel_Payload"] = $centinelClient->getValue("Payload");
            $_SESSION["Centinel_ErrorNo"] = $centinelClient->getValue("ErrorNo");
            $_SESSION["Centinel_ErrorDesc"] = $centinelClient->getValue("ErrorDesc");
            $_SESSION["Centinel_EciFlag"] = $centinelClient->getValue("EciFlag");
            $_SESSION["Centinel_TransactionType"] = "C";
            $_SESSION['Centinel_TermUrl'] = str_replace('http:', 'https:', add_query_arg('wc-api', 'WC_Gateway_PayPal_Pro', home_url('/')));
            /******************************************************************************/
            /*                                                                            */
            /*                          Result Processing Logic                           */
            /*                                                                            */
            /******************************************************************************/
            if ($_SESSION['Centinel_ErrorNo'] == 0) {
                if ($_SESSION['Centinel_Enrolled'] == 'Y') {
                    @ob_clean();
                    ?>
                    <html>
                    <head>
                        <title>3DSecure Payment Authorisation</title>
                    </head>
                    <body>
                    <form name="frmLaunchACS" id="3ds_submit_form" method="POST" action="<?php 
                    echo $_SESSION["Centinel_ACSUrl"];
                    ?>
">
                        <input type="hidden" name="PaReq" value="<?php 
                    echo $_SESSION["Centinel_Payload"];
                    ?>
">
                        <input type="hidden" name="TermUrl" value="<?php 
                    echo $_SESSION['Centinel_TermUrl'];
                    ?>
">
                        <input type="hidden" name="MD" value="<?php 
                    echo urlencode(serialize(array('card' => $card_number, 'type' => $card_type, 'csc' => $card_csc, 'card_exp_month' => $card_exp_month, 'card_exp_year' => $card_exp_year)));
                    ?>
">
                        <noscript>
                            <div class="woocommerce_message"><?php 
                    _e('Processing your Payer Authentication Transaction', 'paypal-for-woocommerce');
                    ?>
 - <?php 
                    _e('Please click Submit to continue the processing of your transaction.', 'paypal-for-woocommerce');
                    ?>
  <input type="submit" class="button" id="3ds_submit" value="Submit" /></div>
                        </noscript>
                    </form>
                    <script>
                        document.frmLaunchACS.submit();
                    </script>
                    </body>
                    </html>
                    <?php 
                    exit;
                } elseif ($this->liability_shift && $_SESSION['Centinel_Enrolled'] != 'N') {
                    $pc_3d_secure_authentication_unavailable = apply_filters('angelleye_pc_process_payment_authentication_unavailable', __('Authentication unavailable. Please try a different payment method or card.', 'paypal-for-woocommerce'));
                    wc_add_notice($pc_3d_secure_authentication_unavailable, "error");
                    return;
                } else {
                    // Customer not-enrolled, so just carry on with PayPal process
                    return $this->do_payment($order, $card_number, $card_type, $card_exp_month, $card_exp_year, $card_csc, '', $_SESSION['Centinel_Enrolled'], '', $_SESSION["Centinel_EciFlag"], '');
                }
            } else {
                $pc_3d_secure_authentication = apply_filters('angelleye_pc_process_payment_authentication', __('Error in 3D secure authentication: ', 'paypal-for-woocommerce') . $_SESSION['Centinel_ErrorNo'], $_SESSION['Centinel_ErrorNo']);
                wc_add_notice($pc_3d_secure_authentication, "error");
                return;
            }
        }
        // Do payment with paypal
        return $this->do_payment($order, $card_number, $card_type, $card_exp_month, $card_exp_year, $card_csc);
    }
 /**
  * Google Analytics eCommerce tracking
  *
  * @access public
  * @param mixed $order_id
  * @return void
  */
 function ecommerce_tracking_code($order_id)
 {
     global $woocommerce;
     if ($this->ga_ecommerce_tracking_enabled == "no" || current_user_can('manage_options') || get_post_meta($order_id, '_ga_tracked', true) == 1) {
         return;
     }
     $tracking_id = $this->ga_id;
     if (!$tracking_id) {
         return;
     }
     // Doing eCommerce tracking so unhook standard tracking from the footer
     remove_action('wp_footer', array($this, 'google_tracking_code'));
     // Get the order and output tracking code
     $order = new WC_Order($order_id);
     $loggedin = is_user_logged_in() ? 'yes' : 'no';
     if (is_user_logged_in()) {
         $user_id = get_current_user_id();
         $current_user = get_user_by('id', $user_id);
         $username = $current_user->user_login;
     } else {
         $user_id = '';
         $username = __('Guest', 'woocommerce');
     }
     if (!empty($this->ga_set_domain_name)) {
         $set_domain_name = "['_setDomainName', '" . esc_js($this->ga_set_domain_name) . "'],";
     } else {
         $set_domain_name = '';
     }
     $code = "\r\n\t\t\tvar _gaq = _gaq || [];\r\n\r\n\t\t\t_gaq.push(\r\n\t\t\t\t['_setAccount', '" . esc_js($tracking_id) . "'], " . $set_domain_name . "\r\n\t\t\t\t['_setCustomVar', 1, 'logged-in', '" . esc_js($loggedin) . "', 1],\r\n\t\t\t\t['_trackPageview']\r\n\t\t\t);\r\n\r\n\t\t\t_gaq.push(['_addTrans',\r\n\t\t\t\t'" . esc_js($order->get_order_number()) . "', // order ID - required\r\n\t\t\t\t'" . esc_js(get_bloginfo('name')) . "',  \t// affiliation or store name\r\n\t\t\t\t'" . esc_js($order->get_total()) . "',   \t    // total - required\r\n\t\t\t\t'" . esc_js($order->get_total_tax()) . "',    // tax\r\n\t\t\t\t'" . esc_js($order->get_shipping()) . "',\t    // shipping\r\n\t\t\t\t'" . esc_js($order->billing_city) . "',       // city\r\n\t\t\t\t'" . esc_js($order->billing_state) . "',      // state or province\r\n\t\t\t\t'" . esc_js($order->billing_country) . "'     // country\r\n\t\t\t]);\r\n\t\t";
     // Order items
     if ($order->get_items()) {
         foreach ($order->get_items() as $item) {
             $_product = $order->get_product_from_item($item);
             $code .= "_gaq.push(['_addItem',";
             $code .= "'" . esc_js($order->get_order_number()) . "',";
             $code .= "'" . esc_js($_product->get_sku() ? __('SKU:', 'woocommerce') . ' ' . $_product->get_sku() : $_product->id) . "',";
             $code .= "'" . esc_js($item['name']) . "',";
             if (isset($_product->variation_data)) {
                 $code .= "'" . esc_js(woocommerce_get_formatted_variation($_product->variation_data, true)) . "',";
             } else {
                 $out = array();
                 $categories = get_the_terms($_product->id, 'product_cat');
                 if ($categories) {
                     foreach ($categories as $category) {
                         $out[] = $category->name;
                     }
                 }
                 $code .= "'" . esc_js(join("/", $out)) . "',";
             }
             $code .= "'" . esc_js($order->get_item_total($item, true, true)) . "',";
             $code .= "'" . esc_js($item['qty']) . "'";
             $code .= "]);";
         }
     }
     $code .= "\r\n\t\t\t_gaq.push(['_trackTrans']); \t\t\t\t\t// submits transaction to the Analytics servers\r\n\r\n\t\t\t(function() {\r\n\t\t\t\tvar ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;\r\n\t\t\t\tga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';\r\n\t\t\t\tvar s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);\r\n\t\t\t})();\r\n\t\t";
     echo '<script type="text/javascript">' . $code . '</script>';
     update_post_meta($order_id, '_ga_tracked', 1);
 }
 /**
  * Get the order data for the given ID.
  *
  * @since  2.5.0
  * @param  WC_Order $order The order instance
  * @return array
  */
 protected function get_order_data($order)
 {
     $order_post = get_post($order->id);
     $dp = wc_get_price_decimals();
     $order_data = array('id' => $order->id, 'order_number' => $order->get_order_number(), 'created_at' => $this->format_datetime($order_post->post_date_gmt), 'updated_at' => $this->format_datetime($order_post->post_modified_gmt), 'completed_at' => $this->format_datetime($order->completed_date, true), 'status' => $order->get_status(), 'currency' => $order->get_order_currency(), 'total' => wc_format_decimal($order->get_total(), $dp), 'subtotal' => wc_format_decimal($order->get_subtotal(), $dp), 'total_line_items_quantity' => $order->get_item_count(), 'total_tax' => wc_format_decimal($order->get_total_tax(), $dp), 'total_shipping' => wc_format_decimal($order->get_total_shipping(), $dp), 'cart_tax' => wc_format_decimal($order->get_cart_tax(), $dp), 'shipping_tax' => wc_format_decimal($order->get_shipping_tax(), $dp), 'total_discount' => wc_format_decimal($order->get_total_discount(), $dp), 'shipping_methods' => $order->get_shipping_method(), 'payment_details' => array('method_id' => $order->payment_method, 'method_title' => $order->payment_method_title, 'paid' => isset($order->paid_date)), 'billing_address' => array('first_name' => $order->billing_first_name, 'last_name' => $order->billing_last_name, 'company' => $order->billing_company, 'address_1' => $order->billing_address_1, 'address_2' => $order->billing_address_2, 'city' => $order->billing_city, 'state' => $order->billing_state, 'postcode' => $order->billing_postcode, 'country' => $order->billing_country, 'email' => $order->billing_email, 'phone' => $order->billing_phone), 'shipping_address' => array('first_name' => $order->shipping_first_name, 'last_name' => $order->shipping_last_name, 'company' => $order->shipping_company, 'address_1' => $order->shipping_address_1, 'address_2' => $order->shipping_address_2, 'city' => $order->shipping_city, 'state' => $order->shipping_state, 'postcode' => $order->shipping_postcode, 'country' => $order->shipping_country), 'note' => $order->customer_note, 'customer_ip' => $order->customer_ip_address, 'customer_user_agent' => $order->customer_user_agent, 'customer_id' => $order->get_user_id(), 'view_order_url' => $order->get_view_order_url(), 'line_items' => array(), 'shipping_lines' => array(), 'tax_lines' => array(), 'fee_lines' => array(), 'coupon_lines' => array());
     // add line items
     foreach ($order->get_items() as $item_id => $item) {
         $product = $order->get_product_from_item($item);
         $product_id = null;
         $product_sku = null;
         // Check if the product exists.
         if (is_object($product)) {
             $product_id = isset($product->variation_id) ? $product->variation_id : $product->id;
             $product_sku = $product->get_sku();
         }
         $meta = new WC_Order_Item_Meta($item, $product);
         $item_meta = array();
         foreach ($meta->get_formatted(null) as $meta_key => $formatted_meta) {
             $item_meta[] = array('key' => $meta_key, 'label' => $formatted_meta['label'], 'value' => $formatted_meta['value']);
         }
         $order_data['line_items'][] = array('id' => $item_id, 'subtotal' => wc_format_decimal($order->get_line_subtotal($item, false, false), $dp), 'subtotal_tax' => wc_format_decimal($item['line_subtotal_tax'], $dp), 'total' => wc_format_decimal($order->get_line_total($item, false, false), $dp), 'total_tax' => wc_format_decimal($item['line_tax'], $dp), 'price' => wc_format_decimal($order->get_item_total($item, false, false), $dp), 'quantity' => wc_stock_amount($item['qty']), 'tax_class' => !empty($item['tax_class']) ? $item['tax_class'] : null, 'name' => $item['name'], 'product_id' => $product_id, 'sku' => $product_sku, 'meta' => $item_meta);
     }
     // Add shipping.
     foreach ($order->get_shipping_methods() as $shipping_item_id => $shipping_item) {
         $order_data['shipping_lines'][] = array('id' => $shipping_item_id, 'method_id' => $shipping_item['method_id'], 'method_title' => $shipping_item['name'], 'total' => wc_format_decimal($shipping_item['cost'], $dp));
     }
     // Add taxes.
     foreach ($order->get_tax_totals() as $tax_code => $tax) {
         $order_data['tax_lines'][] = array('id' => $tax->id, 'rate_id' => $tax->rate_id, 'code' => $tax_code, 'title' => $tax->label, 'total' => wc_format_decimal($tax->amount, $dp), 'compound' => (bool) $tax->is_compound);
     }
     // Add fees.
     foreach ($order->get_fees() as $fee_item_id => $fee_item) {
         $order_data['fee_lines'][] = array('id' => $fee_item_id, 'title' => $fee_item['name'], 'tax_class' => !empty($fee_item['tax_class']) ? $fee_item['tax_class'] : null, 'total' => wc_format_decimal($order->get_line_total($fee_item), $dp), 'total_tax' => wc_format_decimal($order->get_line_tax($fee_item), $dp));
     }
     // Add coupons.
     foreach ($order->get_items('coupon') as $coupon_item_id => $coupon_item) {
         $order_data['coupon_lines'][] = array('id' => $coupon_item_id, 'code' => $coupon_item['name'], 'amount' => wc_format_decimal($coupon_item['discount_amount'], $dp));
     }
     $order_data = apply_filters('woocommerce_cli_order_data', $order_data);
     return $this->flatten_array($order_data);
 }
 /**
  * Get order items.
  *
  * @param  WC_Order $order Order data.
  *
  * @return array           Items list, extra amount and shipping cost.
  */
 protected function get_order_items($order)
 {
     $items = array();
     $extra_amount = 0;
     $shipping_cost = 0;
     // Force only one item.
     if ('yes' == $this->gateway->send_only_total) {
         $items[] = array('description' => $this->sanitize_description(sprintf(__('Order %s', 'woocommerce-pagseguro'), $order->get_order_number())), 'amount' => $this->money_format($order->get_total()), 'quantity' => 1);
     } else {
         // Products.
         if (0 < count($order->get_items())) {
             foreach ($order->get_items() as $order_item) {
                 if ($order_item['qty']) {
                     $item_name = $order_item['name'];
                     if (defined('WC_VERSION') && version_compare(WC_VERSION, '2.4.0', '<')) {
                         $item_meta = new WC_Order_Item_Meta($order_item['item_meta']);
                     } else {
                         $item_meta = new WC_Order_Item_Meta($order_item);
                     }
                     if ($meta = $item_meta->display(true, true)) {
                         $item_name .= ' - ' . $meta;
                     }
                     $items[] = array('description' => $this->sanitize_description($item_name), 'amount' => $this->money_format($order->get_item_total($order_item, false)), 'quantity' => $order_item['qty']);
                 }
             }
         }
         // Fees.
         if (0 < count($order->get_fees())) {
             foreach ($order->get_fees() as $fee) {
                 $items[] = array('description' => $this->sanitize_description($fee['name']), 'amount' => $this->money_format($fee['line_total']), 'quantity' => 1);
             }
         }
         // Taxes.
         if (0 < count($order->get_taxes())) {
             foreach ($order->get_taxes() as $tax) {
                 $items[] = array('description' => $this->sanitize_description($tax['label']), 'amount' => $this->money_format($tax['tax_amount'] + $tax['shipping_tax_amount']), 'quantity' => 1);
             }
         }
         // Shipping Cost.
         if (0 < $order->get_total_shipping()) {
             $shipping_cost = $this->money_format($order->get_total_shipping());
         }
         // Discount.
         if (defined('WC_VERSION') && version_compare(WC_VERSION, '2.3', '<')) {
             if (0 < $order->get_order_discount()) {
                 $extra_amount = '-' . $this->money_format($order->get_order_discount());
             }
         }
     }
     return array('items' => $items, 'extra_amount' => $extra_amount, 'shipping_cost' => $shipping_cost);
 }
 /**
  * Get vendor commission per item for an order
  *
  * @param int $product_id
  * @param int $variation_id
  * @param array $item
  * @param int $order_id
  *
  * @return $commission_amount
  */
 public function get_item_commission($product_id, $variation_id, $item, $order_id, $item_id = '')
 {
     global $WCMp;
     $order = new WC_Order($order_id);
     $amount = 0;
     $commission = array();
     if (isset($WCMp->vendor_caps->payment_cap['commission_include_coupon'])) {
         $line_total = $order->get_item_total($item, false, false) * $item['qty'];
     } else {
         $line_total = $order->get_item_subtotal($item, false, false) * $item['qty'];
     }
     if ($product_id && $line_total) {
         $vendor_id = $order->get_item_meta($item_id, '_vendor_id', true);
         if ($vendor_id) {
             $vendor = get_wcmp_vendor($vendor_id);
         } else {
             $vendor = get_wcmp_product_vendors($product_id);
         }
         if ($vendor) {
             $commission = $this->get_commission_amount($product_id, $vendor->term_id, $variation_id, $item_id, $order);
             if (!empty($commission)) {
                 if ($WCMp->vendor_caps->payment_cap['commission_type'] == 'fixed_with_percentage') {
                     $amount = (double) $line_total * ((double) $commission['commission_val'] / 100) + (double) $commission['commission_fixed'];
                 } else {
                     if ($WCMp->vendor_caps->payment_cap['commission_type'] == 'fixed_with_percentage_qty') {
                         $amount = (double) $line_total * ((double) $commission['commission_val'] / 100) + (double) $commission['commission_fixed'] * $item['qty'];
                     } else {
                         if ($WCMp->vendor_caps->payment_cap['commission_type'] == 'percent') {
                             $amount = (double) $line_total * ((double) $commission['commission_val'] / 100);
                         } else {
                             if ($WCMp->vendor_caps->payment_cap['commission_type'] == 'fixed') {
                                 $amount = (double) $commission['commission_val'] * $item['qty'];
                             }
                         }
                     }
                 }
                 if (isset($WCMp->vendor_caps->payment_cap['revenue_sharing_mode'])) {
                     if ($WCMp->vendor_caps->payment_cap['revenue_sharing_mode'] == 'admin') {
                         $amount = (double) $line_total - (double) $amount;
                         if ($amount < 0) {
                             $amount = 0;
                         }
                     }
                 }
                 return apply_filters('vendor_commission_amount', $amount);
             }
         }
     }
     return apply_filters('vendor_commission_amount', $amount);
 }
    /**
     * Output the order tracking code for link connector
     *
     * @param WC_Order $order
     *
     * @return string
     */
    public function output_impact_radius_order_code($order)
    {
        if (!$this->impact_radius_src) {
            return;
        }
        $code = '<script src="https://' . $this->impact_radius_src . '"></script>';
        $code .= '<script>/* <![CDATA[ */
    irEvent.setOrderId("' . esc_js($order->get_order_number()) . '");';
        if ($order->get_items()) {
            foreach ($order->get_items() as $item) {
                $_product = $order->get_product_from_item($item);
                $categories = get_the_terms($_product->id, 'product_cat');
                $category = $categories ? $category[0]->name : '';
                $sku = $_product->get_sku() ? $_product->get_sku() : $_product->id;
                $code .= '
    irEvent.addItem("' . esc_js($category) . '", "' . esc_js($sku) . '", "' . esc_js($order->get_item_total($item)) . '", "' . esc_js($item['qty']) . '");';
            }
        }
        $coupons = $order->get_used_coupons();
        $coupon = $coupons ? $coupons[0] : '';
        $code .= '
    irEvent.setPromoCode("' . esc_js($coupon) . '");
    irEvent.fire();
/* ]]> */</script>';
        echo $code;
    }
        /**
         * Generate the Google Checkout button link
         **/
        public function generate_googlecheckout_form($order_id)
        {
            global $woocommerce;
            require_once GOOGLE_CHECKOUT_LIB . 'googlecart.php';
            require_once GOOGLE_CHECKOUT_LIB . 'googleitem.php';
            require_once GOOGLE_CHECKOUT_LIB . 'googleshipping.php';
            require_once GOOGLE_CHECKOUT_LIB . 'googletax.php';
            $order = new WC_Order($order_id);
            $shipping_name = explode(' ', $order->shipping_method);
            // Check if this is a test purchase
            if ($this->testmode == 'yes') {
                $server_type = "sandbox";
            } else {
                $server_type = "checkout";
            }
            $merchant_id = $this->merchant_id;
            // Your Merchant ID
            $merchant_key = $this->merchant_key;
            // Your Merchant Key
            $currency = get_option('woocommerce_currency');
            $cart = new GoogleCart($merchant_id, $merchant_key, $server_type, $currency);
            // Specify <edit-cart-url>
            $cart->SetEditCartUrl(get_permalink(get_option('woocommerce_cart_page_id')));
            // Specify "Return to xyz" link
            $cart->SetContinueShoppingUrl(add_query_arg('key', $order->order_key, add_query_arg('order', $order_id, get_permalink(get_option('woocommerce_thanks_page_id')))));
            // Order key
            $cart->SetMerchantPrivateData(new MerchantPrivateData(array("cart-id" => $order->id)));
            // Request buyer's phone number
            $cart->SetRequestBuyerPhone(true);
            // Default tax  - for shipping, if used
            if ($order->order_shipping_tax > 0) {
                // We manually calculate the shipping tax percentage here
                $calculated_shipping_tax_percentage = $order->order_shipping_tax / $order->order_shipping;
                $tax_rule_for_shipping = new GoogleDefaultTaxRule($calculated_shipping_tax_percentage, 'true');
                $tax_rule_for_shipping->SetWorldArea(true);
                $cart->AddDefaultTaxRules($tax_rule_for_shipping);
            }
            // Shipping Cost
            if ($order->order_shipping > 0) {
                $ship_1 = new GoogleFlatRateShipping($order->shipping_method, number_format($order->order_shipping, 2));
                $restriction_1 = new GoogleShippingFilters();
                $restriction_1->SetAllowedWorldArea(true);
                $ship_1->AddShippingRestrictions($restriction_1);
                $cart->AddShipping($ship_1);
            }
            // Cart Contents
            $item_loop = 0;
            $myvat = array();
            if (sizeof($order->get_items()) > 0) {
                foreach ($order->get_items() as $item) {
                    $_product = new WC_Product($item['id']);
                    if ($_product->exists() && $item['qty']) {
                        $item_loop++;
                        // Change tax format from 25.00 to 0.25
                        $item_tax_percentage = number_format($order->get_item_tax($item, false) / $order->get_item_total($item, false, false) * 100, 2, '.', '');
                        $item_vat = $item_tax_percentage / 100;
                        $myvat[$item_loop] = $item_vat;
                        ${"item_" . $item_loop} = new GoogleItem($item['name'], "", $item['qty'], $order->get_item_total($item, false, false));
                        // Name the alternate-tax-table
                        $vat_name = "vat" . $item_vat;
                        ${"item_" . $item_loop}->SetMerchantItemId($item['id']);
                        ${"item_" . $item_loop}->SetTaxTableSelector($vat_name);
                        $cart->AddItem(${"item_" . $item_loop});
                    }
                }
            }
            // Discount
            if ($order->order_discount > 0) {
                $item_loop++;
                ${"item_" . $item_loop} = new GoogleItem(__('Discount', 'woothemes'), "", "1", -$order->order_discount);
                ${"item_" . $item_loop}->SetTaxTableSelector("no_tax");
                $cart->AddItem(${"item_" . $item_loop});
            }
            // Tax
            // Loops through all tax classes that has been added to the cart and add these as Alternate tax tables to google Checkout.
            $taxrule_loop = 1;
            $no_duplicate_vat = array_unique($myvat);
            foreach ($no_duplicate_vat as $value) {
                // Name the alternate-tax-table
                $vat_name = "vat" . $value;
                $tax_table = new GoogleAlternateTaxTable($vat_name);
                ${"tax_rule_" . $taxrule_loop} = new GoogleAlternateTaxRule($value);
                ${"tax_rule_" . $taxrule_loop}->SetWorldArea(true);
                $tax_table->AddAlternateTaxRules(${"tax_rule_" . $taxrule_loop});
                $cart->AddAlternateTaxTables($tax_table);
                $taxrule_loop++;
            }
            // The form
            return $cart->CheckoutButtonCode("SMALL") . '<script type="text/javascript">
						jQuery(function(){
							jQuery("body").block(
								{ 
									message: "<img src=\\"' . $woocommerce->plugin_url() . '/assets/images/ajax-loader.gif\\" alt=\\"Redirecting...\\" />' . __('Thank you for your order. We are now redirecting you to Google Checkout to make payment.', 'woothemes') . '", 
									overlayCSS: 
									{ 
										background: "#fff", 
										opacity: 0.6 
									},
									css: { 
                                   		padding:        20, 
                                   		textAlign:      "center", 
                                   		color:          "#555", 
                                   		border:         "3px solid #aaa", 
                                   		backgroundColor:"#fff", 
                                   		cursor:         "wait",
                                   		lineHeight:        "32px"
                               		} 
								});
							jQuery("#submit_googlecheckout_payment_form").click();
						});
					</script>';
        }
 protected function formItemsArray(\WC_Order $order)
 {
     $items = $order->get_items();
     $this->items = array();
     foreach ($items as $item) {
         $product = $order->get_product_from_item($item);
         $this->items[] = array('order_id' => $order->id, 'product_id' => $product->get_sku() ?: $item['item_meta_array']['_product_id'], 'name' => $product->get_title(), 'price' => $order->get_item_total($item), 'quantity' => !empty($item['qty']) ? $item['qty'] : 1);
     }
     return $this->items;
 }
    /**
     * Process the payment
     */
    public function process_payment($order_id)
    {
        $order = new WC_Order($order_id);
        $this->log('Processing order #' . $order_id);
        $card_number = isset($_POST['paypal_pro-card-number']) ? wc_clean($_POST['paypal_pro-card-number']) : '';
        $card_cvc = isset($_POST['paypal_pro-card-cvc']) ? wc_clean($_POST['paypal_pro-card-cvc']) : '';
        $card_expiry = isset($_POST['paypal_pro-card-expiry']) ? wc_clean($_POST['paypal_pro-card-expiry']) : '';
        // Format values
        $card_number = str_replace(array(' ', '-'), '', $card_number);
        $card_expiry = array_map('trim', explode('/', $card_expiry));
        $card_exp_month = str_pad($card_expiry[0], 2, "0", STR_PAD_LEFT);
        $card_exp_year = $card_expiry[1];
        if (isset($_POST['paypal_pro-card-start'])) {
            $card_start = wc_clean($_POST['paypal_pro-card-start']);
            $card_start = array_map('trim', explode('/', $card_start));
            $card_start_month = str_pad($card_start[0], 2, "0", STR_PAD_LEFT);
            $card_start_year = $card_start[1];
        } else {
            $card_start_month = '';
            $card_start_year = '';
        }
        if (strlen($card_exp_year) == 2) {
            $card_exp_year += 2000;
        }
        /**
         * 3D Secure Handling
         */
        if ($this->enable_3dsecure) {
            if (!class_exists('CentinelClient')) {
                include_once 'lib/CentinelClient.php';
            }
            $this->clear_centinel_session();
            $centinelClient = new CentinelClient();
            $centinelClient->add("MsgType", "cmpi_lookup");
            $centinelClient->add("Version", "1.7");
            $centinelClient->add("ProcessorId", $this->centinel_pid);
            $centinelClient->add("MerchantId", $this->centinel_mid);
            $centinelClient->add("TransactionPwd", $this->centinel_pwd);
            $centinelClient->add("UserAgent", $_SERVER["HTTP_USER_AGENT"]);
            $centinelClient->add("BrowserHeader", $_SERVER["HTTP_ACCEPT"]);
            $centinelClient->add("TransactionType", 'C');
            // Standard cmpi_lookup fields
            $centinelClient->add('OrderNumber', $order_id);
            $centinelClient->add('Amount', $order->order_total * 100);
            $centinelClient->add('CurrencyCode', $this->iso4217[$order->get_order_currency()]);
            $centinelClient->add('TransactionMode', 'S');
            // Items
            $item_loop = 0;
            if (sizeof($order->get_items()) > 0) {
                foreach ($order->get_items() as $item) {
                    $item_loop++;
                    $centinelClient->add('Item_Name_' . $item_loop, $item['name']);
                    $centinelClient->add('Item_Price_' . $item_loop, number_format($order->get_item_total($item, true, true) * 100));
                    $centinelClient->add('Item_Quantity_' . $item_loop, $item['qty']);
                    $centinelClient->add('Item_Desc_' . $item_loop, $item['name']);
                }
            }
            // Payer Authentication specific fields
            $centinelClient->add('CardNumber', $card_number);
            $centinelClient->add('CardExpMonth', $card_exp_month);
            $centinelClient->add('CardExpYear', $card_exp_year);
            // Send request
            $centinelClient->sendHttp($this->centinel_url, "5000", "15000");
            $this->log('Centinal client request: ' . print_r($centinelClient->request, true));
            $this->log('Centinal client response: ' . print_r($centinelClient->response, true));
            // Save response in session
            WC()->session->set("paypal_pro_orderid", $order_id);
            // Save lookup response in session
            WC()->session->set("Centinel_cmpiMessageResp", $centinelClient->response);
            WC()->session->set("Centinel_Enrolled", $centinelClient->getValue("Enrolled"));
            WC()->session->set("Centinel_TransactionId", $centinelClient->getValue("TransactionId"));
            WC()->session->set("Centinel_ACSUrl", $centinelClient->getValue("ACSUrl"));
            WC()->session->set("Centinel_Payload", $centinelClient->getValue("Payload"));
            WC()->session->set("Centinel_ErrorNo", $centinelClient->getValue("ErrorNo"));
            WC()->session->set("Centinel_ErrorDesc", $centinelClient->getValue("ErrorDesc"));
            WC()->session->set("Centinel_EciFlag", $centinelClient->getValue("EciFlag"));
            WC()->session->set("Centinel_TransactionType", "C");
            WC()->session->set('Centinel_TermUrl', WC()->api_request_url('WC_Gateway_PayPal_Pro', true));
            WC()->session->set('Centinel_OrderId', $centinelClient->getValue("OrderId"));
            $this->log('3dsecure Centinel_Enrolled: ' . WC()->session->get('Centinel_Enrolled'));
            /******************************************************************************/
            /*                                                                            */
            /*                          Result Processing Logic                           */
            /*                                                                            */
            /******************************************************************************/
            if (WC()->session->get('Centinel_ErrorNo') == 0) {
                if (WC()->session->get('Centinel_Enrolled') == 'Y') {
                    $this->log('Doing 3dsecure payment authorization');
                    $this->log('ASCUrl: ' . WC()->session->get("Centinel_ACSUrl"));
                    $this->log('PaReq: ' . WC()->session->get("Centinel_Payload"));
                    $this->log('TermUrl: ' . WC()->session->get("Centinel_TermUrl"));
                    @ob_clean();
                    ?>
					<html>
						<head>
							<title>3DSecure Payment Authorisation</title>
						</head>
						<body>
							<form name="frmLaunchACS" id="3ds_submit_form" method="POST" action="<?php 
                    echo WC()->session->get("Centinel_ACSUrl");
                    ?>
">
						        <input type="hidden" name="PaReq" value="<?php 
                    echo WC()->session->get("Centinel_Payload");
                    ?>
">
						        <input type="hidden" name="TermUrl" value="<?php 
                    echo WC()->session->get('Centinel_TermUrl');
                    ?>
">
						        <input type="hidden" name="MD" value="<?php 
                    echo urlencode(json_encode(array('card' => $card_number, 'csc' => $card_cvc, 'card_exp_month' => $card_exp_month, 'card_exp_year' => $card_exp_year, 'card_start_month' => $card_start_month, 'card_start_year' => $card_start_year, 'order_id' => $order_id)));
                    ?>
">
						        <noscript>
						        	<div class="woocommerce_message"><?php 
                    _e('Processing your Payer Authentication Transaction', 'woocommerce-gateway-paypal-pro');
                    ?>
 - <?php 
                    _e('Please click Submit to continue the processing of your transaction.', 'woocommerce-gateway-paypal-pro');
                    ?>
  <input type="submit" class="button" id="3ds_submit" value="Submit" /></div>
						        </noscript>
						    </form>
						    <script>
						    	document.frmLaunchACS.submit();
						    </script>
						</body>
					</html>
					<?php 
                    exit;
                } elseif ($this->liability_shift && WC()->session->get('Centinel_Enrolled') != 'N') {
                    wc_add_notice(__('Authentication unavailable. Please try a different payment method or card.', 'woocommerce-gateway-paypal-pro'), 'error');
                    return;
                } else {
                    // Customer not-enrolled, so just carry on with PayPal process
                    return $this->do_payment($order, $card_number, '', $card_exp_month, $card_exp_year, $card_cvc, $card_start_month, $card_start_year, '', WC()->session->get('Centinel_Enrolled'), '', WC()->session->get("Centinel_EciFlag"), '');
                }
            } else {
                wc_add_notice(__('Error in 3D secure authentication: ', 'woocommerce-gateway-paypal-pro') . WC()->session->get('Centinel_ErrorNo'), 'error');
                return;
            }
        }
        // Do payment with paypal
        return $this->do_payment($order, $card_number, '', $card_exp_month, $card_exp_year, $card_cvc, $card_start_month, $card_start_year);
    }
/**
 * ecommerce tracking with piwik.
 *
 * @access public
 * @param int $order_id
 * @return void
 */
function woocommerce_ecommerce_tracking_piwik($order_id)
{
    global $woocommerce;
    if (is_admin()) {
        return;
    }
    // Don't track admin
    // Call the Piwik ecommerce function if WP-Piwik is configured to add tracking codes to the page
    $wp_piwik_global_settings = get_option('wp-piwik_global-settings');
    // Return if Piwik settings are not here, or if global is not set
    if (!isset($wp_piwik_global_settings['add_tracking_code']) || !$wp_piwik_global_settings['add_tracking_code']) {
        return;
    }
    if (!isset($GLOBALS['wp_piwik'])) {
        return;
    }
    // Remove WP-Piwik from wp_footer and run it here instead, to get Piwik
    // loaded *before* we do our ecommerce tracking calls
    remove_action('wp_footer', array($GLOBALS['wp_piwik'], 'footer'));
    $GLOBALS['wp_piwik']->footer();
    // Get the order and output tracking code
    $order = new WC_Order($order_id);
    ?>
	<script type="text/javascript">
	try {
		// Add order items
		<?php 
    if ($order->get_items()) {
        foreach ($order->get_items() as $item) {
            $_product = $order->get_product_from_item($item);
            ?>
			piwikTracker.addEcommerceItem(
				"<?php 
            echo esc_js($_product->sku);
            ?>
",	// (required) SKU: Product unique identifier
				"<?php 
            echo esc_js($item['name']);
            ?>
",		// (optional) Product name
				"<?php 
            if (isset($_product->variation_data)) {
                echo esc_js(woocommerce_get_formatted_variation($_product->variation_data, true));
            }
            ?>
",	// (optional) Product category. You can also specify an array of up to 5 categories eg. ["Books", "New releases", "Biography"]
				<?php 
            echo esc_js($order->get_item_total($item));
            ?>
,		// (recommended) Product price
				<?php 
            echo esc_js($item['qty']);
            ?>
 		// (optional, default to 1) Product quantity
			);
		<?php 
        }
    }
    ?>
		// Track order
		piwikTracker.trackEcommerceOrder(
			"<?php 
    echo esc_js($order_id);
    ?>
",		// (required) Unique Order ID
			<?php 
    echo esc_js($order->order_total);
    ?>
,	// (required) Order Revenue grand total (includes tax, shipping, and subtracted discount)
			false,					// (optional) Order sub total (excludes shipping)
			<?php 
    echo esc_js($order->get_total_tax());
    ?>
,	// (optional) Tax amount
			<?php 
    echo esc_js($order->get_shipping());
    ?>
,	// (optional) Shipping amount
			false 					// (optional) Discount offered (set to false for unspecified parameter)
		);
	} catch( err ) {}
	</script>
	<?php 
}
 /**
  * Google Analytics eCommerce tracking
  *
  * @param int $order_id
  *
  * @return string
  */
 protected function get_ecommerce_tracking_code($order_id)
 {
     // Get the order and output tracking code
     $order = new WC_Order($order_id);
     $logged_in = is_user_logged_in() ? 'yes' : 'no';
     if ('yes' === $logged_in) {
         $user_id = get_current_user_id();
         $current_user = get_user_by('id', $user_id);
         $username = $current_user->user_login;
     } else {
         $user_id = '';
         $username = __('Guest', 'woocommerce-google-analytics-integration');
     }
     if ('yes' == $this->ga_use_universal_analytics) {
         if (!empty($this->ga_set_domain_name)) {
             $set_domain_name = esc_js($this->ga_set_domain_name);
         } else {
             $set_domain_name = 'auto';
         }
         $support_display_advertising = '';
         if ('yes' == $this->ga_support_display_advertising) {
             $support_display_advertising = "ga('require', 'displayfeatures');";
         }
         $anonymize_enabled = '';
         if ('yes' == $this->ga_anonymize_enabled) {
             $anonymize_enabled = "ga('set', 'anonymizeIp', true);";
         }
         $code = "\n\t(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){\n\t(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),\n\tm=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)\n\t})(window,document,'script','//www.google-analytics.com/analytics.js','ga');\n\n\tga('create', '" . esc_js($this->ga_id) . "', '" . $set_domain_name . "');" . $support_display_advertising . $anonymize_enabled . "\n\tga('set', 'dimension1', '" . $logged_in . "');\n\tga('send', 'pageview');\n\n\tga('require', 'ecommerce', 'ecommerce.js');\n\n\tga('ecommerce:addTransaction', {\n\t\t'id': '" . esc_js($order->get_order_number()) . "',         // Transaction ID. Required\n\t\t'affiliation': '" . esc_js(get_bloginfo('name')) . "',    // Affiliation or store name\n\t\t'revenue': '" . esc_js($order->get_total()) . "',           // Grand Total\n\t\t'shipping': '" . esc_js($order->get_total_shipping()) . "', // Shipping\n\t\t'tax': '" . esc_js($order->get_total_tax()) . "',           // Tax\n\t\t'currency': '" . esc_js($order->get_order_currency()) . "'  // Currency\n\t});\n";
         // Order items
         if ($order->get_items()) {
             foreach ($order->get_items() as $item) {
                 $_product = $order->get_product_from_item($item);
                 $code .= "ga('ecommerce:addItem', {";
                 $code .= "'id': '" . esc_js($order->get_order_number()) . "',";
                 $code .= "'name': '" . esc_js($item['name']) . "',";
                 $code .= "'sku': '" . esc_js($_product->get_sku() ? $_product->get_sku() : $_product->id) . "',";
                 if (isset($_product->variation_data)) {
                     $code .= "'category': '" . esc_js(woocommerce_get_formatted_variation($_product->variation_data, true)) . "',";
                 } else {
                     $out = array();
                     $categories = get_the_terms($_product->id, 'product_cat');
                     if ($categories) {
                         foreach ($categories as $category) {
                             $out[] = $category->name;
                         }
                     }
                     $code .= "'category': '" . esc_js(join("/", $out)) . "',";
                 }
                 $code .= "'price': '" . esc_js($order->get_item_total($item)) . "',";
                 $code .= "'quantity': '" . esc_js($item['qty']) . "'";
                 $code .= "});";
             }
         }
         $code .= "ga('ecommerce:send');      // Send transaction and item data to Google Analytics.";
     } else {
         if ($this->ga_support_display_advertising == 'yes') {
             $ga_url = "('https:' == document.location.protocol ? 'https://' : 'http://') + 'stats.g.doubleclick.net/dc.js'";
         } else {
             $ga_url = "('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'";
         }
         $anonymize_enabled = '';
         if ('yes' == $this->ga_anonymize_enabled) {
             $anonymize_enabled = "['_gat._anonymizeIp'],";
         }
         if (!empty($this->ga_set_domain_name)) {
             $set_domain_name = "['_setDomainName', '" . esc_js($this->ga_set_domain_name) . "'],";
         } else {
             $set_domain_name = '';
         }
         $code = "\n\tvar _gaq = _gaq || [];\n\n\t_gaq.push(\n\t\t['_setAccount', '" . esc_js($this->ga_id) . "'], " . $set_domain_name . $anonymize_enabled . "\n\t\t['_setCustomVar', 1, 'logged-in', '" . esc_js($logged_in) . "', 1],\n\t\t['_trackPageview'],\n\t\t['_set', 'currencyCode', '" . esc_js($order->get_order_currency()) . "']\n\t);\n\n\t_gaq.push(['_addTrans',\n\t\t'" . esc_js($order->get_order_number()) . "', \t// order ID - required\n\t\t'" . esc_js(get_bloginfo('name')) . "',  \t\t// affiliation or store name\n\t\t'" . esc_js($order->get_total()) . "',   \t    \t// total - required\n\t\t'" . esc_js($order->get_total_tax()) . "',    \t// tax\n\t\t'" . esc_js($order->get_total_shipping()) . "',\t// shipping\n\t\t'" . esc_js($order->billing_city) . "',       \t// city\n\t\t'" . esc_js($order->billing_state) . "',      \t// state or province\n\t\t'" . esc_js($order->billing_country) . "'     \t// country\n\t]);\n";
         // Order items
         if ($order->get_items()) {
             foreach ($order->get_items() as $item) {
                 $_product = $order->get_product_from_item($item);
                 $code .= "_gaq.push(['_addItem',";
                 $code .= "'" . esc_js($order->get_order_number()) . "',";
                 $code .= "'" . esc_js($_product->get_sku() ? $_product->get_sku() : $_product->id) . "',";
                 $code .= "'" . esc_js($item['name']) . "',";
                 if (isset($_product->variation_data)) {
                     $code .= "'" . esc_js(woocommerce_get_formatted_variation($_product->variation_data, true)) . "',";
                 } else {
                     $out = array();
                     $categories = get_the_terms($_product->id, 'product_cat');
                     if ($categories) {
                         foreach ($categories as $category) {
                             $out[] = $category->name;
                         }
                     }
                     $code .= "'" . esc_js(join("/", $out)) . "',";
                 }
                 $code .= "'" . esc_js($order->get_item_total($item)) . "',";
                 $code .= "'" . esc_js($item['qty']) . "'";
                 $code .= "]);";
             }
         }
         $code .= "\n\t_gaq.push(['_trackTrans']); // submits transaction to the Analytics servers\n\n\t(function() {\n\t\tvar ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;\n\t\tga.src = " . $ga_url . ";\n\t\tvar s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);\n\t})();\n";
     }
     // Mark the order as tracked
     update_post_meta($order_id, '_ga_tracked', 1);
     return "\n<!-- WooCommerce Google Analytics Integration -->\n" . $this->get_generic_ga_code() . "\n<script type='text/javascript'>{$code}</script>\n<!-- /WooCommerce Google Analytics Integration -->\n";
 }
Exemple #13
0
            print_r("Id: " . $order->id);
            ?>
                                    </div>

                                    <div>
                                        <?php 
            foreach ($order_items as $item) {
                print_r("Amount Paid: \$" . $order->get_line_total($item));
            }
            ?>
                                    </div>

                                    <div>
                                        <?php 
            foreach ($order_items as $item) {
                $unit_cost = $order->get_item_total($item);
                $total_cost = $order->get_line_total($item);
                $duration = $total_cost / $unit_cost;
                print_r("Reading Duration: " . $duration . ' minutes');
            }
            ?>
                                    </div>

                                    <div>
                                        <?php 
            print_r("Customer Name: " . $first_name . " " . $last_name);
            ?>
                                    </div>

                                    <div>
                                        <?php 
/**
 * ecommerce tracking with piwik.
 *
 * @access public
 * @param int $order_id
 * @return void
 */
function woocommerce_ecommerce_tracking_piwik($order_id)
{
    global $woocommerce;
    // Don't track admin
    if (current_user_can('manage_options')) {
        return;
    }
    // Call the Piwik ecommerce function if WP-Piwik is configured to add tracking codes to the page
    $wp_piwik_global_settings = get_option('wp-piwik_global-settings');
    // Return if Piwik settings are not here, or if global is not set
    if (!isset($wp_piwik_global_settings['add_tracking_code']) || !$wp_piwik_global_settings['add_tracking_code']) {
        return;
    }
    if (!isset($GLOBALS['wp_piwik'])) {
        return;
    }
    // Get the order and get tracking code
    $order = new WC_Order($order_id);
    ob_start();
    ?>
	try {
		// Add order items
		<?php 
    if ($order->get_items()) {
        foreach ($order->get_items() as $item) {
            $_product = $order->get_product_from_item($item);
            ?>

			piwikTracker.addEcommerceItem(
				"<?php 
            echo esc_js($_product->get_sku());
            ?>
",			// (required) SKU: Product unique identifier
				"<?php 
            echo esc_js($item['name']);
            ?>
",					// (optional) Product name
				"<?php 
            if (isset($_product->variation_data)) {
                echo esc_js(woocommerce_get_formatted_variation($_product->variation_data, true));
            }
            ?>
",	// (optional) Product category. You can also specify an array of up to 5 categories eg. ["Books", "New releases", "Biography"]
				<?php 
            echo esc_js($order->get_item_total($item));
            ?>
,	// (recommended) Product price
				<?php 
            echo esc_js($item['qty']);
            ?>
 						// (optional, default to 1) Product quantity
			);

		<?php 
        }
    }
    ?>

		// Track order
		piwikTracker.trackEcommerceOrder(
			"<?php 
    echo esc_js($order->get_order_number());
    ?>
",	// (required) Unique Order ID
			<?php 
    echo esc_js($order->get_total());
    ?>
,			// (required) Order Revenue grand total (includes tax, shipping, and subtracted discount)
			false,													// (optional) Order sub total (excludes shipping)
			<?php 
    echo esc_js($order->get_total_tax());
    ?>
,		// (optional) Tax amount
			<?php 
    echo esc_js($order->get_shipping());
    ?>
,		// (optional) Shipping amount
			false 													// (optional) Discount offered (set to false for unspecified parameter)
		);
	} catch( err ) {}
	<?php 
    $code = ob_get_clean();
    $woocommerce->add_inline_js($code);
}
    /**
     * Google Analytics eCommerce tracking
     *
     * @access public
     * @param mixed $order_id
     * @return void
     */
    function ecommerce_tracking_code($order_id)
    {
        global $woocommerce;
        if ($this->disable_tracking($this->ga_eeT) || current_user_can("manage_options") || get_post_meta($order_id, "_tracked", true) == 1) {
            return;
        }
        $tracking_id = $this->ga_id;
        if (!$tracking_id) {
            return;
        }
        // Doing eCommerce tracking so unhook standard tracking from the footer
        remove_action("wp_footer", array($this, "ee_settings"));
        // Get the order and output tracking code
        $order = new WC_Order($order_id);
        //Get Applied Coupon Codes
        $coupons_list = '';
        if ($order->get_used_coupons()) {
            $coupons_count = count($order->get_used_coupons());
            $i = 1;
            foreach ($order->get_used_coupons() as $coupon) {
                $coupons_list .= $coupon;
                if ($i < $coupons_count) {
                    $coupons_list .= ', ';
                }
                $i++;
            }
        }
        //get domain name if value is set
        if (!empty($this->ga_Dname)) {
            $set_domain_name = esc_js($this->ga_Dname);
        } else {
            $set_domain_name = "auto";
        }
        //add display features
        if ($this->ga_DF) {
            $ga_display_feature_code = 'ga("require", "displayfeatures");';
        } else {
            $ga_display_feature_code = "";
        }
        //add Pageview on order page if user checked Add Standard UA code
        if ($this->ga_ST) {
            $ga_pageview = 'ga("send", "pageview");';
        } else {
            $ga_pageview = "";
        }
        $code = '(function(i,s,o,g,r,a,m){i["GoogleAnalyticsObject"]=r;i[r]=i[r]||function(){
			(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
			m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
			})(window,document,"script","//www.google-analytics.com/analytics.js","ga");
                        
			ga("create", "' . esc_js($tracking_id) . '", "' . $set_domain_name . '");
                        ' . $ga_display_feature_code . '
			ga("require", "ec", "ec.js");
                        ' . $ga_pageview . '
                        ';
        // Order items
        if ($order->get_items()) {
            foreach ($order->get_items() as $item) {
                $_product = $order->get_product_from_item($item);
                if (isset($_product->variation_data)) {
                    $categories = esc_js(woocommerce_get_formatted_variation($_product->variation_data, true));
                } else {
                    $out = array();
                    $categories = get_the_terms($_product->id, "product_cat");
                    if ($categories) {
                        foreach ($categories as $category) {
                            $out[] = $category->name;
                        }
                    }
                    $categories = esc_js(join(",", $out));
                }
                //orderpage Prod json
                $orderpage_prod_Array[get_permalink($_product->id)] = array("tvc_id" => esc_html($_product->id), "tvc_i" => esc_js($_product->get_sku() ? $_product->get_sku() : $_product->id), "tvc_n" => esc_js($item["name"]), "tvc_p" => esc_js($order->get_item_total($item)), "tvc_c" => $categories, "tvc_q" => esc_js($item["qty"]));
            }
            //make json for prod meta data on order page
            $this->wc_version_compare("tvc_oc=" . json_encode($orderpage_prod_Array) . ";");
        }
        //get shipping cost based on version >2.1 get_total_shipping() < get_shipping
        if (version_compare($woocommerce->version, "2.1", ">=")) {
            $tvc_sc = $order->get_total_shipping();
        } else {
            $tvc_sc = $order->get_shipping();
        }
        //orderpage transcation data json
        $orderpage_trans_Array = array("id" => esc_js($order->get_order_number()), "affiliation" => esc_js(get_bloginfo('name')), "revenue" => esc_js($order->get_total()), "tax" => esc_js($order->get_total_tax()), "shipping" => esc_js($tvc_sc), "coupon" => $coupons_list);
        //make json for trans data on order page
        $this->wc_version_compare("tvc_td=" . json_encode($orderpage_trans_Array) . ";");
        $code .= '
                //set local currencies
            ga("set", "&cu", tvc_lc);  
            for(var t_item in tvc_oc){
                ga("ec:addProduct", { 
                    "id": tvc_oc[t_item].tvc_i,
                    "name": tvc_oc[t_item].tvc_n, 
                    "category": tvc_oc[t_item].tvc_c,
                    "price": tvc_oc[t_item].tvc_p,
                    "quantity": tvc_oc[t_item].tvc_q,
			});
            }
            ga("ec:setAction","purchase", {
				"id": tvc_td.id,
				"affiliation": tvc_td.affiliation,
				"revenue": tvc_td.revenue,
                                "tax": tvc_td.tax,
				"shipping": tvc_td.shipping,
                                "coupon": tvc_td.coupon
			});
                        
        ga("send", "event", "Enhanced-Ecommerce","load", "order_confirmation", {"nonInteraction": 1});      
    ';
        //check woocommerce version
        $this->wc_version_compare($code);
        update_post_meta($order_id, "_tracked", 1);
    }
Exemple #16
0
 /**
  * Get order line items (products) in a neatly-formatted array of objects
  * with properties:
  *
  * + id - item ID
  * + name - item name, usually product title, processed through htmlentities()
  * + description - formatted item meta (e.g. Size: Medium, Color: blue), processed through htmlentities()
  * + quantity - item quantity
  * + item_total - item total (line total divided by quantity, excluding tax & rounded)
  * + line_total - line item total (excluding tax & rounded)
  * + meta - formatted item meta array
  * + product - item product or null if getting product from item failed
  * + item - raw item array
  *
  * @since 3.0.0
  * @param \WC_Order $order
  * @return array
  */
 public static function get_order_line_items($order)
 {
     $line_items = array();
     foreach ($order->get_items() as $id => $item) {
         $line_item = new stdClass();
         $product = $order->get_product_from_item($item);
         $meta = SV_WC_Plugin_Compatibility::is_wc_version_gte_2_4() ? $item : $item['item_meta'];
         // get meta + format it
         $item_meta = new WC_Order_Item_Meta($meta);
         $item_meta = $item_meta->get_formatted();
         if (!empty($item_meta)) {
             $item_desc = array();
             foreach ($item_meta as $meta) {
                 $item_desc[] = sprintf('%s: %s', $meta['label'], $meta['value']);
             }
             $item_desc = implode(', ', $item_desc);
         } else {
             // default description to SKU
             $item_desc = is_callable(array($product, 'get_sku')) && $product->get_sku() ? sprintf('SKU: %s', $product->get_sku()) : null;
         }
         $line_item->id = $id;
         $line_item->name = htmlentities($item['name'], ENT_QUOTES, 'UTF-8', false);
         $line_item->description = htmlentities($item_desc, ENT_QUOTES, 'UTF-8', false);
         $line_item->quantity = $item['qty'];
         $line_item->item_total = isset($item['recurring_line_total']) ? $item['recurring_line_total'] : $order->get_item_total($item);
         $line_item->line_total = $order->get_line_total($item);
         $line_item->meta = $item_meta;
         $line_item->product = is_object($product) ? $product : null;
         $line_item->item = $item;
         $line_items[] = $line_item;
     }
     return $line_items;
 }
 /**
  * Get order line items (products) in a neatly-formatted array of objects
  * with properties:
  *
  * + id - item ID
  * + name - item name, usually product title, processed through htmlentities()
  * + description - formatted item meta (e.g. Size: Medium, Color: blue), processed through htmlentities()
  * + quantity - item quantity
  * + item_total - item total (line total divided by quantity, excluding tax & rounded)
  * + line_total - line item total (excluding tax & rounded)
  * + meta - formatted item meta array
  * + product - item product or null if getting product from item failed
  * + item - raw item array
  *
  * @since 3.0.0
  * @param \WC_Order $order
  * @return array
  */
 public static function get_order_line_items($order)
 {
     $line_items = array();
     foreach ($order->get_items() as $id => $item) {
         $line_item = new stdClass();
         $product = $order->get_product_from_item($item);
         $item_desc = array();
         // add SKU to description if available
         if (is_callable(array($product, 'get_sku')) && $product->get_sku()) {
             $item_desc[] = sprintf('SKU: %s', $product->get_sku());
         }
         // get meta + format it
         $item_meta = new WC_Order_Item_Meta($item);
         $item_meta = $item_meta->get_formatted();
         if (!empty($item_meta)) {
             foreach ($item_meta as $meta) {
                 $item_desc[] = sprintf('%s: %s', $meta['label'], $meta['value']);
             }
         }
         $item_desc = implode(', ', $item_desc);
         $line_item->id = $id;
         $line_item->name = htmlentities($item['name'], ENT_QUOTES, 'UTF-8', false);
         $line_item->description = htmlentities($item_desc, ENT_QUOTES, 'UTF-8', false);
         $line_item->quantity = $item['qty'];
         $line_item->item_total = isset($item['recurring_line_total']) ? $item['recurring_line_total'] : $order->get_item_total($item);
         $line_item->line_total = $order->get_line_total($item);
         $line_item->meta = $item_meta;
         $line_item->product = is_object($product) ? $product : null;
         $line_item->item = $item;
         $line_items[] = $line_item;
     }
     return $line_items;
 }