Create New Item
×
Item Type
File
Folder
Item Name
×
Search file in folder and subfolders...
File Manager
/
wp-content
/
plugins
/
woocommerce
/
includes
Advanced Search
Upload
New Item
Settings
Back
Back Up
Advanced Editor
Save
<?php defined('ABSPATH') || exit; class WC_Order_Item_Fee extends WC_Order_Item { protected $extra_data = array('tax_class' => '', 'tax_status' => 'taxable', 'amount' => '', 'total' => '', 'total_tax' => '', 'taxes' => array('total' => array())); protected function get_tax_class_costs($order) { $order_item_tax_classes = $order->get_items_tax_classes(); $costs = array_fill_keys($order_item_tax_classes, 0); $costs['non-taxable'] = 0; foreach ($order->get_items(array('line_item', 'fee', 'shipping')) as $item) { if (0 > $item->get_total()) { continue; } if ('taxable' !== $item->get_tax_status()) { $costs['non-taxable'] += $item->get_total(); } elseif ('inherit' === $item->get_tax_class()) { $inherit_class = reset($order_item_tax_classes); $costs[$inherit_class] += $item->get_total(); } else { $costs[$item->get_tax_class()] += $item->get_total(); } } return array_filter($costs); } public function calculate_taxes($calculate_tax_for = array()) { if (!isset($calculate_tax_for['country'], $calculate_tax_for['state'], $calculate_tax_for['postcode'], $calculate_tax_for['city'])) { return false; } if (0 <= $this->get_total()) { return parent::calculate_taxes($calculate_tax_for); } if (wc_tax_enabled() && $this->get_order()) { $order = $this->get_order(); $tax_class_costs = $this->get_tax_class_costs($order); $total_costs = array_sum($tax_class_costs); $discount_taxes = array(); if ($total_costs) { foreach ($tax_class_costs as $tax_class => $tax_class_cost) { if ('non-taxable' === $tax_class) { continue; } $proportion = $tax_class_cost / $total_costs; $cart_discount_proportion = $this->get_total() * $proportion; $calculate_tax_for['tax_class'] = $tax_class; $tax_rates = WC_Tax::find_rates($calculate_tax_for); $discount_taxes = wc_array_merge_recursive_numeric($discount_taxes, WC_Tax::calc_tax($cart_discount_proportion, $tax_rates)); } } $this->set_taxes(array('total' => $discount_taxes)); } else { $this->set_taxes(false); } do_action('woocommerce_order_item_fee_after_calculate_taxes', $this, $calculate_tax_for); return true; } public function set_amount($value) { $this->set_prop('amount', wc_format_decimal($value)); } public function set_tax_class($value) { if ($value && !in_array($value, WC_Tax::get_tax_class_slugs(), true)) { $this->error('order_item_fee_invalid_tax_class', __('Invalid tax class', 'woocommerce')); } $this->set_prop('tax_class', $value); } public function set_tax_status($value) { if (in_array($value, array('taxable', 'none'), true)) { $this->set_prop('tax_status', $value); } else { $this->set_prop('tax_status', 'taxable'); } } public function set_total($amount) { $this->set_prop('total', wc_format_decimal($amount)); } public function set_total_tax($amount) { $this->set_prop('total_tax', wc_format_decimal($amount)); } public function set_taxes($raw_tax_data) { $raw_tax_data = maybe_unserialize($raw_tax_data); $tax_data = array('total' => array()); if (!empty($raw_tax_data['total'])) { $tax_data['total'] = array_map('wc_format_decimal', $raw_tax_data['total']); } $this->set_prop('taxes', $tax_data); if ('yes' === get_option('woocommerce_tax_round_at_subtotal')) { $this->set_total_tax(array_sum($tax_data['total'])); } else { $this->set_total_tax(array_sum(array_map('wc_round_tax_total', $tax_data['total']))); } } public function get_amount($context = 'view') { return $this->get_prop('amount', $context); } public function get_name($context = 'view') { $name = $this->get_prop('name', $context); if ('view' === $context) { return $name ? $name : __('Fee', 'woocommerce'); } else { return $name; } } public function get_type() { return 'fee'; } public function get_tax_class($context = 'view') { return $this->get_prop('tax_class', $context); } public function get_tax_status($context = 'view') { return $this->get_prop('tax_status', $context); } public function get_total($context = 'view') { return $this->get_prop('total', $context); } public function get_total_tax($context = 'view') { return $this->get_prop('total_tax', $context); } public function get_taxes($context = 'view') { return $this->get_prop('taxes', $context); } public function offsetGet($offset) { if ('line_total' === $offset) { $offset = 'total'; } elseif ('line_tax' === $offset) { $offset = 'total_tax'; } elseif ('line_tax_data' === $offset) { $offset = 'taxes'; } return parent::offsetGet($offset); } public function offsetSet($offset, $value) { wc_deprecated_function('WC_Order_Item_Fee::offsetSet', '4.4.0', ''); if ('line_total' === $offset) { $offset = 'total'; } elseif ('line_tax' === $offset) { $offset = 'total_tax'; } elseif ('line_tax_data' === $offset) { $offset = 'taxes'; } parent::offsetSet($offset, $value); } public function offsetExists($offset) { if (in_array($offset, array('line_total', 'line_tax', 'line_tax_data'), true)) { return true; } return parent::offsetExists($offset); } }