示例#1
0
 /**
  * Save order items via ajax
  */
 public static function save_order_items()
 {
     check_ajax_referer('order-item', 'security');
     if (!current_user_can('edit_shop_orders')) {
         die(-1);
     }
     if (isset($_POST['order_id']) && isset($_POST['items'])) {
         $order_id = absint($_POST['order_id']);
         // Parse the jQuery serialized items
         $items = array();
         parse_str($_POST['items'], $items);
         // Save order items
         wc_save_order_items($order_id, $items);
         // Return HTML items
         $order = wc_get_order($order_id);
         $data = get_post_meta($order_id);
         include 'admin/meta-boxes/views/html-order-items.php';
     }
     die;
 }
示例#2
0
 public static function add_line_taxes($order_id)
 {
     global $wpdb;
     check_ajax_referer('calc-totals', 'security');
     if (!current_user_can('edit_shop_orders')) {
         die(-1);
     }
     $tax = new WC_Tax();
     $items = array();
     $country = strtoupper(esc_attr($_POST['country']));
     $state = strtoupper(esc_attr($_POST['state']));
     $postcode = strtoupper(esc_attr($_POST['postcode']));
     $city = wc_clean(esc_attr($_POST['city']));
     $order = wc_get_order(absint($order_id));
     $taxes = array();
     $shipping_taxes = array();
     // Parse the jQuery serialized items
     parse_str($_POST['items'], $items);
     // Prevent undefined warnings
     if (!isset($items['line_tax'])) {
         $items['line_tax'] = array();
     }
     if (!isset($items['line_subtotal_tax'])) {
         $items['line_subtotal_tax'] = array();
     }
     $items['order_taxes'] = array();
     // Action
     $items = apply_filters('woocommerce_ajax_calc_line_taxes', $items, $order_id, $country, $_POST);
     // Get items and fees taxes
     if (isset($items['order_item_id'])) {
         $line_total = $line_subtotal = $order_item_tax_class = array();
         foreach ($items['order_item_id'] as $parent_item_id) {
             $parent_item_id = absint($parent_item_id);
             $item_id = self::get_child_item_id($parent_item_id);
             if (empty($item_id)) {
                 //no current suborder items
                 continue;
             }
             $line_total[$item_id] = isset($items['line_total'][$parent_item_id]) ? wc_format_decimal($items['line_total'][$parent_item_id]) : 0;
             $line_subtotal[$item_id] = isset($items['line_subtotal'][$parent_item_id]) ? wc_format_decimal($items['line_subtotal'][$parent_item_id]) : $line_total[$parent_item_id];
             $order_item_tax_class[$item_id] = isset($items['order_item_tax_class'][$parent_item_id]) ? sanitize_text_field($items['order_item_tax_class'][$parent_item_id]) : '';
             $product_id = $order->get_item_meta($item_id, '_product_id', true);
             $vendor = yith_get_vendor($product_id, 'product');
             if (!$vendor->is_valid()) {
                 // no vnedor products
                 continue;
             }
             $vendor_order_ids = $vendor->get_orders('suborder');
             if (!in_array($order_id, $vendor_order_ids)) {
                 // the current product isn't in the current suborder
                 continue;
             }
             // Get product details
             if (get_post_type($product_id) == 'product') {
                 $_product = wc_get_product($product_id);
                 $item_tax_status = $_product->get_tax_status();
             } else {
                 $item_tax_status = 'taxable';
             }
             if ('0' !== $order_item_tax_class[$item_id] && 'taxable' === $item_tax_status) {
                 $tax_rates = WC_Tax::find_rates(array('country' => $country, 'state' => $state, 'postcode' => $postcode, 'city' => $city, 'tax_class' => $order_item_tax_class[$item_id]));
                 $line_taxes = WC_Tax::calc_tax($line_total[$item_id], $tax_rates, false);
                 $line_subtotal_taxes = WC_Tax::calc_tax($line_subtotal[$item_id], $tax_rates, false);
                 // Set the new line_tax
                 foreach ($line_taxes as $_tax_id => $_tax_value) {
                     $items['line_tax'][$item_id][$_tax_id] = $_tax_value;
                 }
                 // Set the new line_subtotal_tax
                 foreach ($line_subtotal_taxes as $_tax_id => $_tax_value) {
                     $items['line_subtotal_tax'][$item_id][$_tax_id] = $_tax_value;
                 }
                 // Sum the item taxes
                 foreach (array_keys($taxes + $line_taxes) as $key) {
                     $taxes[$key] = (isset($line_taxes[$key]) ? $line_taxes[$key] : 0) + (isset($taxes[$key]) ? $taxes[$key] : 0);
                 }
             }
         }
     }
     // Get shipping taxes
     if (isset($items['shipping_method_id'])) {
         $matched_tax_rates = array();
         $tax_rates = WC_Tax::find_rates(array('country' => $country, 'state' => $state, 'postcode' => $postcode, 'city' => $city, 'tax_class' => ''));
         if ($tax_rates) {
             foreach ($tax_rates as $key => $rate) {
                 if (isset($rate['shipping']) && 'yes' == $rate['shipping']) {
                     $matched_tax_rates[$key] = $rate;
                 }
             }
         }
         $shipping_cost = $shipping_taxes = array();
         foreach ($items['shipping_method_id'] as $item_id) {
             $item_id = absint($item_id);
             $shipping_cost[$item_id] = isset($items['shipping_cost'][$parent_item_id]) ? wc_format_decimal($items['shipping_cost'][$parent_item_id]) : 0;
             $_shipping_taxes = WC_Tax::calc_shipping_tax($shipping_cost[$item_id], $matched_tax_rates);
             // Set the new shipping_taxes
             foreach ($_shipping_taxes as $_tax_id => $_tax_value) {
                 $items['shipping_taxes'][$item_id][$_tax_id] = $_tax_value;
                 $shipping_taxes[$_tax_id] = isset($shipping_taxes[$_tax_id]) ? $shipping_taxes[$_tax_id] + $_tax_value : $_tax_value;
             }
         }
     }
     // Remove old tax rows
     $order->remove_order_items('tax');
     // Add tax rows
     foreach (array_keys($taxes + $shipping_taxes) as $tax_rate_id) {
         $order->add_tax($tax_rate_id, isset($taxes[$tax_rate_id]) ? $taxes[$tax_rate_id] : 0, isset($shipping_taxes[$tax_rate_id]) ? $shipping_taxes[$tax_rate_id] : 0);
     }
     // Create the new order_taxes
     foreach ($order->get_taxes() as $tax_id => $tax_item) {
         $items['order_taxes'][$tax_id] = absint($tax_item['rate_id']);
     }
     foreach ($items as $meta_key => $meta_values) {
         if (is_array($meta_values)) {
             foreach ($meta_values as $key => $meta_value) {
                 if ('order_taxes' == $meta_key) {
                     continue;
                 } else {
                     if ('order_item_id' == $meta_key) {
                         $child_item_id = self::get_child_item_id($meta_value);
                         if ($child_item_id) {
                             $items[$meta_key][$key] = $child_item_id;
                         } else {
                             unset($items[$meta_key][$key]);
                         }
                     } else {
                         if ('meta_key' == $meta_key || 'meta_value' == $meta_key) {
                             unset($items[$meta_key][$key]);
                         } else {
                             if ('line_tax' == $meta_key || 'line_subtotal_tax' == $meta_key || 'refund_line_tax' == $meta_key) {
                                 $line_tax_ids = $items[$meta_key];
                                 $child_item_ids = array_keys($order->get_items());
                                 foreach ($line_tax_ids as $line_tax_id => $line_tax_value) {
                                     if (!in_array($line_tax_id, $child_item_ids)) {
                                         unset($items[$meta_key][$line_tax_id]);
                                     }
                                 }
                             } else {
                                 $child_item_id = self::get_child_item_id($meta_value);
                                 if ($child_item_id) {
                                     $items[$meta_key][$child_item_id] = $items[$meta_key][$key];
                                     unset($items[$meta_key][$key]);
                                 }
                             }
                         }
                     }
                 }
             }
         } else {
             if ('_order_total' == $meta_key) {
                 $items['_order_total'] = $order->get_total();
             }
         }
     }
     if (!empty($items['order_item_id'])) {
         wc_save_order_items($order_id, $items);
     }
 }
 /**
  * Save meta box data
  */
 public static function save($post_id, $post)
 {
     wc_save_order_items($post_id, $_POST);
 }
 /**
  * Save meta box data
  */
 public static function save($post_id, $post)
 {
     wc_save_order_items($post_id, $_POST);
     // tell plugins order items were saved
     do_action('woocommerce_saved_order_items', $post_id, $_POST);
 }
 /**
  * Update order taxes via AJAX
  *
  * @since 4.2
  * @return JSON object with status (error | success) and status message
  */
 public static function ajax_update_order_tax()
 {
     global $wpdb;
     $order_id = absint($_POST['order_id']);
     $country = strtoupper(esc_attr($_POST['country']));
     // Get WC_WooTax_Order object
     $order = self::get_order($order_id);
     if ($country != 'US' && $country != 'United States') {
         return;
         // Returning here allows WC_AJAX::calc_line_taxes to take over for non-US orders
     } else {
         // Build items array
         if (version_compare(WOOCOMMERCE_VERSION, '2.2', '>=')) {
             parse_str($_POST['items'], $items);
         } else {
             if (version_compare(WOOCOMMERCE_VERSION, '2.1.0', '>=')) {
                 $items = array('order_item_id' => array(), 'order_item_qty' => array(), 'line_total' => array(), 'shipping_method_id' => array(), 'shipping_cost' => array());
                 // Add cart items/fees
                 foreach ($_POST['items'] as $item_id => $item) {
                     $items['order_item_id'][] = $item_id;
                     if (get_post_type($order->get_item_meta($item_id, '_product_id')) == 'product') {
                         $items['order_item_qty'][$item_id] = isset($item['quantity']) ? $item['quantity'] : 1;
                     }
                     $items['line_total'][$item_id] = $item['line_total'];
                 }
                 // Add item for shipping cost
                 if (isset($_POST['shipping']) && $_POST['shipping'] != 0) {
                     $items['shipping_cost'][WT_SHIPPING_ITEM] = $_POST['shipping'];
                     $items['shipping_method_id'][] = WT_SHIPPING_ITEM;
                 }
             }
         }
         $order_items = array();
         $final_items = array();
         // Add cart items and fees
         $order_items = array_merge($items['order_item_id'], $order_items);
         // Add shipping items
         if (isset($items['shipping_method_id'])) {
             $order_items = array_merge($items['shipping_method_id'], $order_items);
         }
         // Construct items array from POST data
         foreach ($order_items as $item_id) {
             $product_id = $order->get_item_meta($item_id, '_product_id');
             $qty = 1;
             if (is_array($items['shipping_method_id']) && in_array($item_id, $items['shipping_method_id'])) {
                 // Shipping method
                 $tic = WT_SHIPPING_TIC;
                 $cost = $items['shipping_cost'][$item_id];
                 $type = 'shipping';
             } else {
                 if (isset($items['order_item_qty'][$item_id])) {
                     // Cart item
                     $tic = get_post_meta($product_id, 'wootax_tic', true);
                     $cost = $items['line_total'][$item_id];
                     $type = 'cart';
                     $qty = WC_WooTax::get_option('tax_based_on') == 'line-subtotal' ? 1 : $items['order_item_qty'][$item_id];
                 } else {
                     // Fee
                     $tic = WT_FEE_TIC;
                     $cost = $items['line_total'][$item_id];
                     $type = 'fee';
                 }
             }
             // Calculate unit price
             $unit_price = $cost / $qty;
             // Add item to final items array
             if ($unit_price != 0) {
                 // Map item_id to item type
                 $type_array[$item_id] = $type == 'shipping' ? 'shipping' : 'cart';
                 // Add tax amount to tax array
                 $old_taxes[$item_id] = $order->get_item_tax($item_id);
                 // Add to items array
                 $item_data = array('Index' => '', 'ItemID' => $item_id, 'Qty' => $qty, 'Price' => $unit_price, 'Type' => $type);
                 if (!empty($tic) && $tic) {
                     $item_data['TIC'] = $tic;
                 }
                 $final_items[] = $item_data;
             }
         }
     }
     // Send lookup request using the generated items and mapping array
     $res = $order->do_lookup($final_items, $type_array);
     // Convert response array to be sent back to client
     // @see WC_AJAX::calc_line_taxes()
     if (is_array($res)) {
         if (version_compare(WOOCOMMERCE_VERSION, '2.2', '>=')) {
             if (!isset($items['line_tax'])) {
                 $items['line_tax'] = array();
             }
             if (!isset($items['line_subtotal_tax'])) {
                 $items['line_subtotal_tax'] = array();
             }
             $items['order_taxes'] = array();
             foreach ($res as $item) {
                 $id = $item->ItemID;
                 $tax = $item->TaxAmount;
                 if (is_array($items['shipping_method_id']) && in_array($id, $items['shipping_method_id'])) {
                     $items['shipping_taxes'][$id][WT_RATE_ID] = $tax;
                 } else {
                     $items['line_tax'][$id][WT_RATE_ID] = $tax;
                     $items['line_subtotal_tax'][$id][WT_RATE_ID] = $tax;
                 }
             }
             $items['order_taxes'][self::get_meta($order_id, 'tax_item_id')] = absint(WT_RATE_ID);
             wc_save_order_items($order_id, $items);
             // Return HTML items
             $data = get_post_meta($order_id);
             $order = $order->order;
             include ABSPATH . '/' . PLUGINDIR . '/woocommerce/includes/admin/meta-boxes/views/html-order-items.php';
             die;
         } else {
             if (version_compare(WOOCOMMERCE_VERSION, '2.1', '>=')) {
                 // We are going to send back a JSON response
                 header('Content-Type: application/json; charset=utf-8');
                 $item_tax = $shipping_tax = 0;
                 $tax_row_html = '';
                 $item_taxes = array();
                 // Update item taxes
                 foreach ($res as $item) {
                     $id = $item->ItemID;
                     $tax = $item->TaxAmount;
                     if ($id == WT_SHIPPING_ITEM) {
                         $shipping_tax += $tax;
                     } else {
                         $item_taxes[$id] = array('line_subtotal_tax' => wc_format_localized_price($tax), 'line_tax' => wc_format_localized_price($tax));
                         $item_tax += $tax;
                     }
                 }
                 // Fetch array mapping tax rate ids to tax codes
                 $tax_codes = array();
                 $taxes = $order->order->get_taxes();
                 foreach ($taxes as $item_id => $data) {
                     $code = array();
                     $rate_id = $data['rate_id'];
                     $rate_data = $wpdb->get_row("SELECT * FROM {$wpdb->prefix}woocommerce_tax_rates WHERE tax_rate_id = '{$rate_id}'");
                     $code[] = $rate_data->tax_rate_country;
                     $code[] = $rate_data->tax_rate_state;
                     $code[] = $rate_data->tax_rate_name ? sanitize_title($rate_data->tax_rate_name) : 'TAX';
                     $code[] = absint($rate_data->tax_rate_priority);
                     $tax_codes[$rate_id] = strtoupper(implode('-', array_filter($code)));
                 }
                 // Loop through tax items to build tax row HTML
                 ob_start();
                 foreach ($taxes as $item_id => $item) {
                     include ABSPATH . '/' . PLUGINDIR . '/woocommerce/includes/admin/post-types/meta-boxes/views/html-order-tax.php';
                 }
                 $tax_row_html = ob_get_clean();
                 // Return
                 echo json_encode(array('item_tax' => $item_tax, 'item_taxes' => $item_taxes, 'shipping_tax' => $shipping_tax, 'tax_row_html' => $tax_row_html));
                 // Quit out
                 die;
             }
         }
     } else {
         die(json_encode(array('status' => 'error', 'message' => $res)));
     }
 }
 /**
  * Save order items via ajax
  * exact copy from /wp-content/plugins/woocommerce/includes/class-wc-ajax.php, with change to template selection
  */
 public static function save_order_items()
 {
     check_ajax_referer('order-item', 'security');
     if (isset($_POST['order_id']) && isset($_POST['items'])) {
         $order_id = absint($_POST['order_id']);
         // Parse the jQuery serialized items
         $items = array();
         parse_str($_POST['items'], $items);
         // Save order items
         wc_save_order_items($order_id, $items);
         // Return HTML items
         $order = wc_get_order($order_id);
         $data = get_post_meta($order_id);
         //include( 'admin/meta-boxes/views/html-order-items.php' );
         //@@@@LOUSHOU - allow overtake of template
         include apply_filters('qsot-woo-template', 'meta-boxes/views/html-order-items.php', 'admin');
     }
     die;
 }