/**
* Update tax lines for the order based on the line item taxes themselves.
*/
public function update_taxes()
{
$cart_taxes = array();
$shipping_taxes = array();
foreach ($this->get_items(array('line_item', 'fee')) as $item_id => $item) {
$taxes = $item->get_taxes();
foreach ($taxes['total'] as $tax_rate_id => $tax) {
$cart_taxes[$tax_rate_id] = isset($cart_taxes[$tax_rate_id]) ? $cart_taxes[$tax_rate_id] + $tax : $tax;
}
}
foreach ($this->get_shipping_methods() as $item_id => $item) {
$taxes = $item->get_taxes();
foreach ($taxes['total'] as $tax_rate_id => $tax) {
$shipping_taxes[$tax_rate_id] = isset($shipping_taxes[$tax_rate_id]) ? $shipping_taxes[$tax_rate_id] + $tax : $tax;
}
}
// Remove old existing tax rows.
$this->remove_order_items('tax');
// Now merge to keep tax rows.
foreach (array_keys($cart_taxes + $shipping_taxes) as $tax_rate_id) {
$item = new WC_Order_Item_Tax();
$item->set_rate($tax_rate_id);
$item->set_tax_total(isset($cart_taxes[$tax_rate_id]) ? $cart_taxes[$tax_rate_id] : 0);
$item->set_shipping_tax_total(isset($shipping_taxes[$tax_rate_id]) ? $shipping_taxes[$tax_rate_id] : 0);
$this->add_item($item);
}
// Save tax totals
$this->set_shipping_tax(WC_Tax::round(array_sum($shipping_taxes)));
$this->set_cart_tax(WC_Tax::round(array_sum($cart_taxes)));
$this->save();
}