Esta entrada es funcional únicamente para instalaciones sobre WooCommerce 2.0. Si buscas la forma de hacerlo bajo WooCommerce 2.1, debes visitar ¿Cómo configurar el IVA para Canarias, Ceuta y Melilla en WooCommerce 2.1?.

Impuestos en WooCommerce

Impuestos en WooCommerce

Tras haber terminado de configurar nuestra primera tienda virtual bajo el plugin WooCommerce para WordPress, y descubrir sus grandezas y sus miserias, vamos a publicar una serie de entradas donde os vamos a contar algunos pequeños trucos que os van a hacer la tarea de configurar vuestro WooCommerce mucho más sencilla.

En la documentación oficial de WooCommerce viene muy bien explicado cómo configurar los distintos tipos de impuestos (IVA) que necesitemos en nuestra tienda online, pero ya os adelantamos que para nuestro caso particular, España, no sirve absolutamente de nada y no funciona.

¿Entonces cómo configuramos el IVA?

IVA estándar en WooCommerce

IVA estándar en WooCommerce


Para hacerlo correctamente debemos seguir la ruta WooCommerce -> Ajustes -> Impuestos y, una vez allí, crear todos los tipos de IVA que necesitemos para nuestro proyecto de eCommerce.

En nuestro caso en particular, tal y como podemos ver en la captura de pantalla de la derecha, hemos necesitado y configurado tres tipos de IVA:

    IVA al 21% en WooCommerce

    IVA al 21% en WooCommerce

  • IVA al 10%: que ha sido configurado como impuesto estándar y que es el utilizado de forma predeterminada por la tienda virtual. Como podemos ver en la captura de pantalla, es un IVA universal que afecta a todos los países soportados y que no se aplica a los gastos de envío.

  • IVA al 21%: que ha sido configurado exactamente igual que el anterior, tal y como podemos ver en la captura de pantalla, aunque esta vez con una tasa del 21% y afectando a los gastos de envío, ya que este es el tipo de IVA que se va ha utilizar para calcular su importe correctamente.

  • IVA al 0% en WooCommerce

    IVA al 0% en WooCommerce

    IVA al 0%: que, al igual que en el caso anterior, ha sido configurado también para que afecte a los gastos de envío, aunque para esto funcione es necesario un plugin que hemos creado y que publicaremos en los próximos días llamado WooCommerce – APG Weight and Postcode/State/Country Shipping.

Una vez que tenemos configurados los 3 IVAs, y, dado que WooCommerce no va a saber cuando utilizarlos, necesitamos introducir un alguna modificación en el archivo functions.php de nuestro tema o hijo de WordPress. Concretamente este puñado de líneas de código:

//Cálculo de IVA en Ceuta, Melilla y Canarias
function iva_excluido( $tipo_de_iva ) {
	global $woocommerce;

	list ( $pais, $provincia, $codigo_postal, $ciudad ) = $woocommerce->customer->get_taxable_address();
	if ( $provincia == 'CE' || $provincia == 'ML' || $provincia == 'GC' || $provincia == 'TF') {
		$tipo_de_iva = 'Excluido';
	}

	return $tipo_de_iva;
}
if ( !is_admin() ) {
	add_filter('woocommerce_product_tax_class', 'iva_excluido');
}

Gracias a ellas, nuestra tienda virtual usará el tipo de IVA al 0%, llamado Excluido en nuestro caso particular, siempre que el cliente se encuentre en Canarias, Ceuta o Melilla.

¿Ya está todo hecho?

En realidad no, si queremos que todo funcione correctamente debemos configurar WooCommerce para que los productos tengan el IVA añadido, tal y como podemos ver en la primera captura de pantalla, y debemos introducir los precios netos, sin IVA, en los productos, e indicar el tipo de IVA que queremos que se aplique, en nuestro caso particular, el 10% o el 21%.

El problema surge cuando vamos a nuestra tienda virtual y nos encontramos con que los precios de los productos se muestran tal y como los hemos introducido, es decir, sin el IVA añadido. Para solucionarlo necesitamos añadir otro puñado de líneas de código en nuestro archivo functions.php:

//Precios con IVA incluido
function precio_con_iva( $precio, $producto ) {
	global $woocommerce;

	if ( $producto->price > 0 ) {
		if ( $producto->is_on_sale() && isset( $producto->regular_price ) ) {
			return $producto->get_price_html_from_to( dame_iva( $producto->regular_price, $producto ), $producto->get_price_including_tax() );
		} else {
			return woocommerce_price( $producto->get_price_including_tax() );
		}
	}

	return $precio;
}
if ( !is_admin() ) {
	add_filter( 'woocommerce_get_price_html', 'precio_con_iva', 100, 2 );
}

function dame_iva($precio, $producto, $cantidad = 1) {
	global $woocommerce;

	$iva  = new WC_Tax();

	if ( $producto->is_taxable() ) {
		if ( get_option( 'woocommerce_prices_include_tax' ) == 'no' ) {
			$tipo_de_iva = $iva->get_rates( $producto->get_tax_class() );
			$impuestos = $iva->calc_tax( $precio * $cantidad, $tipo_de_iva, false );
			$precio = round( $precio * $cantidad + $iva->get_tax_total( $impuestos ), 2 );
		}
	}

	return $precio;
}

Con estas configuraciones y pequeñas modificaciones veremos que nuestra tienda mostrará los precios con su IVA correspondiente en toda España y en Canarias, Ceuta y Melilla nos mostrará los precios sin IVA.

Por cierto, notaréis que os saldrá un mensaje que dice (incl. IGC) en lugar de (incl. IVA), para arreglarlo, cada vez que se actualice WooCommerce hay que hacerlo, debemos editar los archivos de idioma de WooCommerce: woocommerce-es_ES.po y woocommerce-es_ES.mo. Para ello podemos utilizar algún plugin como CodeStyling Localization, que os será de gran ayuda. Lo que no terminamos de entender es el porqué de que este error siga perenne, cuando es un error conocido y reportado hasta la saciedad.

Todo lo aquí explicado lo puedes ver en funcionamiento en la tienda virtual de Herves-Vida. Esperamos que os resulte útil esta entrada, y si es así, esperamos vuestros comentarios.

El próximo día os explicaremos cómo añadir un campo NIF/CIF de forma fácil y sencilla, aunque ya estamos pensando en crear plugin para hacerlo aún más simple, y, obviamente, os informaremos de la publicación de WooCommerce – APG Weight and Postcode/State/Country Shipping, pero eso será otro día.

Actualización: gracias al aviso de Jose Costa Ros hemos detectado que la función precio_con_iva no era correcta cuando el producto utilizaba precio rebajado o cualquier otra combinación. Ahora, con la nueva función que publicamos, funciona correctamente.