WC_Abstract_Order::update_taxes()publicWC 1.0

Update tax lines for the order based on the line item taxes themselves.

Method of the class: WC_Abstract_Order{}

No Hooks.

Return

null. Nothing (null).

Usage

$WC_Abstract_Order = new WC_Abstract_Order();
$WC_Abstract_Order->update_taxes();

WC_Abstract_Order::update_taxes() code WC 8.7.0

public function update_taxes() {
	$cart_taxes     = array();
	$shipping_taxes = array();
	$existing_taxes = $this->get_taxes();
	$saved_rate_ids = 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 ) {
			$tax_amount = (float) $this->round_line_tax( $tax, false );

			$cart_taxes[ $tax_rate_id ] = isset( $cart_taxes[ $tax_rate_id ] ) ? (float) $cart_taxes[ $tax_rate_id ] + $tax_amount : $tax_amount;
		}
	}

	foreach ( $this->get_shipping_methods() as $item_id => $item ) {
		$taxes = $item->get_taxes();
		foreach ( $taxes['total'] as $tax_rate_id => $tax ) {
			$tax_amount = (float) $tax;

			if ( 'yes' !== get_option( 'woocommerce_tax_round_at_subtotal' ) ) {
				$tax_amount = wc_round_tax_total( $tax_amount );
			}

			$shipping_taxes[ $tax_rate_id ] = isset( $shipping_taxes[ $tax_rate_id ] ) ? (float) $shipping_taxes[ $tax_rate_id ] + $tax_amount : $tax_amount;
		}
	}

	foreach ( $existing_taxes as $tax ) {
		// Remove taxes which no longer exist for cart/shipping.
		if ( ( ! array_key_exists( $tax->get_rate_id(), $cart_taxes ) && ! array_key_exists( $tax->get_rate_id(), $shipping_taxes ) ) || in_array( $tax->get_rate_id(), $saved_rate_ids, true ) ) {
			$this->remove_item( $tax->get_id() );
			continue;
		}
		$saved_rate_ids[] = $tax->get_rate_id();
		$tax->set_rate( $tax->get_rate_id() );
		$tax->set_tax_total( isset( $cart_taxes[ $tax->get_rate_id() ] ) ? $cart_taxes[ $tax->get_rate_id() ] : 0 );
		$tax->set_label( WC_Tax::get_rate_label( $tax->get_rate_id() ) );
		$tax->set_shipping_tax_total( ! empty( $shipping_taxes[ $tax->get_rate_id() ] ) ? $shipping_taxes[ $tax->get_rate_id() ] : 0 );
		$tax->save();
	}

	$new_rate_ids = wp_parse_id_list( array_diff( array_keys( $cart_taxes + $shipping_taxes ), $saved_rate_ids ) );

	// New taxes.
	foreach ( $new_rate_ids 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( ! empty( $shipping_taxes[ $tax_rate_id ] ) ? $shipping_taxes[ $tax_rate_id ] : 0 );
		$this->add_item( $item );
	}

	$this->set_shipping_tax( array_sum( $shipping_taxes ) );
	$this->set_cart_tax( array_sum( $cart_taxes ) );
	$this->save();
}