At this moment we cannot find a way how to create an order using the Orders API with tax exempt status. An additional “is_vat_exempt” API field could be used for this reason. If it is set and true then VAT is not calculated.
Additional condition for checking if tax is enabled and there is not vat exempt. If this is true, then calculate taxes on front-end, otherwise not.
TAX exempt can be filtered by a new woocommerce_ajax_calc_line_taxes_is_vat_exempt filter.
Add some additional hooks to handle custom order data
The new hooks:
woocommerce_api_create_order_item
woocommerce_api_set_order_addresses
woocommerce_api_set_line_item
The new woocommerce_api_create_order_item action contains the id-s of the new items ($new_item_id). The following functions have to be returned the item id-s to be able to pass them to the filter:
* set_item(..) function - return $item_id;
* set_line_item(..) function - return $item_id;
* set_shipping(..) function - return $shipping_id;
* set_fee(..) functuion - return $fee_id;
* set_coupon(..) functuion - return $coupon_id;
If the order has no shipping line, there must not generate an unnecessary shipping tax line with 0 value. It was happened if there is set a different tax class for shipping than tax classes of the actual product line items of the order, and the order has not got any shipping line.
The aim is to have the same tax calculation behavior if we create orders using the GUI (front end or back end), and the API.
This condition prevents to create the unnecessary tax line if there is no shipping methods of the order:
// Now calculate shipping tax
$matched_tax_rates = array();
$shipping_methods = $this->get_shipping_methods();
if ( ! empty( $shipping_methods ) ) {
......
}
This conditional solution is similar than calc_line_taxes() in WC_AJAX class:
// Get shipping taxes
if ( isset( $items['shipping_method_id'] ) ) {
.....
}