Vat exempt

<?php

// ceramic
/**
 * Add VAT (btw) number to the billing fields of WooCommerce users
 */
add_filter('woocommerce_billing_fields', function($fields){
	$fields['vat_number'] = array(
		'type' => 'text',
		'label' => __('BTW nummer', 'woocommerce'),
		'placeholder' => _x('', 'placeholder', 'woocommerce'),
		'required' => false,
		'class' => array('form-row form-row-wide', 'update_totals_on_change'),
		'clear' => true,
	);
	$fields['vat_number']['priority'] = 35;
	return $fields;
});

/**
 * Remove/set VAT if customer has own VAT number
 */
function sync_customer_vat_acf() {
  if(isset(WC()->customer)){
		$customer = WC()->customer;
		$user_id = 'user_'.$customer->get_id();
		if(get_field('vat_number', $user_id) && !empty(get_field('vat_number', $user_id)) && get_field('btw_exempt', $user_id)) {
			$customer->set_is_vat_exempt(true);
			return true;
		} else {
			$customer->set_is_vat_exempt(false);
			return false;
		}
	}
	return true;
}
add_action('woocommerce_cart_updated', __NAMESPACE__ . '\\sync_customer_vat_acf'); // executed many many times..
add_action('woocommerce_checkout_create_order', __NAMESPACE__ . '\\sync_customer_vat_acf');
add_action('woocommerce_checkout_update_order_review', __NAMESPACE__ . '\\sync_customer_vat_acf'); // ajax action when updating cart

// also execute sync_customer_vat_acf when creating a order (for backend)
add_filter('woocommerce_create_order', function($data){
	sync_customer_vat_acf();
	return $data;
});

// check customer vat when checking the order vat
// called with wp-ajax on woocommerce custom backend order recalculation totals: calculate_taxes() function
add_filter('woocommerce_order_is_vat_exempt', function($data) {
	$order_id = absint( $_POST['order_id'] );
	$order = wc_get_order( $order_id );
	if($order->get_user_id()) {
		$user_id = 'user_'.$order->get_user_id();
		if(get_field('vat_number', $user_id) && !empty(get_field('vat_number', $user_id)) && get_field('btw_exempt', $user_id)) {
			return true;
		} else {
			return false;
		}
	} else {
		echo 'Klant is niet beschikbaar'; //when in order-*create* screen, user is not available. however @ order-edit screen it is (due to it is saved)
	}
	return $data;
});
Last Updated:
Contributors: Niek Vlam, Suite Seven