File "class-wc-order-item-fee.php"
Full path: /home/kosmetik/public_html/wp-content/plugins/woocommerce/includes/class-wc-order-item-fee.php
File
size: 6.03 B
MIME-type: text/x-php
Charset: utf-8
Download Open Edit Advanced Editor Back
<?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);
}
}