<?php
defined('ABSPATH') || exit;
final class WC_Cart_Fees
{
private $fees = array();
private $cart;
private $default_fee_props = array('id' => '', 'name' => '', 'tax_class' => '', 'taxable' => false, 'amount' => 0, 'total' => 0);
public function __construct(&$cart)
{
if (!is_a($cart, 'WC_Cart')) {
throw new Exception('A valid WC_Cart object is required');
}
$this->cart = $cart;
}
public function init()
{
}
public function add_fee($args = array())
{
$fee_props = (object) wp_parse_args($args, $this->default_fee_props);
$fee_props->name = $fee_props->name ? $fee_props->name : __('Fee', 'woocommerce');
$fee_props->tax_class = in_array($fee_props->tax_class, array_merge(WC_Tax::get_tax_classes(), WC_Tax::get_tax_class_slugs()), true) ? $fee_props->tax_class : '';
$fee_props->taxable = wc_string_to_bool($fee_props->taxable);
$fee_props->amount = wc_format_decimal($fee_props->amount);
if (empty($fee_props->id)) {
$fee_props->id = $this->generate_id($fee_props);
}
if (array_key_exists($fee_props->id, $this->fees)) {
return new WP_Error('fee_exists', __('Fee has already been added.', 'woocommerce'));
}
$this->fees[$fee_props->id] = $fee_props;
return $this->fees[$fee_props->id];
}
public function get_fees()
{
uasort($this->fees, array($this, 'sort_fees_callback'));
return $this->fees;
}
public function set_fees($raw_fees = array())
{
$this->fees = array();
foreach ($raw_fees as $raw_fee) {
$this->add_fee($raw_fee);
}
}
public function remove_all_fees()
{
$this->set_fees();
}
protected function sort_fees_callback($a, $b)
{
return apply_filters('woocommerce_sort_fees_callback', $a->amount > $b->amount ? -1 : 1, $a, $b);
}
private function generate_id($fee)
{
return sanitize_title($fee->name);
}
}