Montar una pequeña tienda online en WordPress con WooCommerce para vender nuestros productos o servicios es una tarea relativamente sencilla y ágil. Utilizando este plugin, en pocas horas, podemos tener un comercio electrónico totalmente operativo y listo para vender. Está claro que las funcionalidades que nos ofrece WooCommerce a la hora de lanzar nuestros negocios son increíbles, pero todavía anda «cojo» con algunos apartados importantes de la venta online, o directamente, no los tiene.
Si necesitas hacerlo para una tienda online PrestaShop, mira esta otra entrada: Cómo validar el campo de DNI obligatorio en PrestaShop
Uno de estos apartados de los que carece WooCommerce es la facturación. WooCommerce no tiene incorporado un sistema de emisión y gestión de facturas. Para ello, nos tenemos que apoyar en plugins o módulos desarrollados por terceros. Uno de los más utilizados es WooCommerce PDF Invoices & Packing Slips, que es justamente el que utilizamos para implementar nuestra solución TicketBAI / Batuz para los comercios de Euskadi.
Otra carencia importante (que vamos a resolver en esta entrada), es la necesidad de pedir a nuestros clientes que nos faciliten su Número de identificación Fiscal para poder emitir facturas legales. Aparte de mostraros cómo hacerlo, vamos a incorporar otra funcionalidad extra: comprobar que el NIF, DNI o NIE introducido esté en el formato correcto. Se recomienda que lo explicado a continuación sea llevado a cabo con cuidado y por una persona que tenga los conocimientos técnicos para, al menos poder deshacer los cambios en caso de que algo no funcione como se esperaba. Vamos a ver paso a paso cómo hacerlo:
Tenemos que editar el archivo functions.php de nuestro theme activo, incluyendo los siguientes fragmentos de código:
1 – Incluir el campo NIF/DNI/NIE en los datos de la dirección de facturación utilizando el filter WooCommerce_checkout_fields.
add_filter( 'WooCommerce_checkout_fields' , 'add_dni_field' );
function add_dni_field( $fields ) {
if (get_option('solicitar_nif')) {
$fields['billing']['ticketprest_dni'] = array(
'label' => __('NIF/DNI/NIE', 'WooCommerce'),
'required' => true,
'clear' => true
);
if (get_current_user_id()) {
$fields['billing']['ticketprest_dni']['default'] = get_post_meta( get_current_user_id(), '_billing_ticketprest_dni', true);
}
}
return $fields;
}
2 – A través de WooCommerce_checkout_update_order_meta almacenamos el campo que hemos llamado _billing_ticketprest_dni, así guardamos el NIF asociando el mismo al pedido en concreto, así como al id del usuario para poder utilizarlo en futuros pedidos.
add_action( 'WooCommerce_checkout_update_order_meta', 'save_dni_field' );
function save_dni_field( $order_id ) {
if ( ! empty( $_POST['ticketprest_dni'] ) ) {
$order = wc_get_order( (int)$order_id );
$customer = $order->get_user_id();
delete_post_meta( $order_id, '_billing_ticketprest_dni', $meta_value = '' );
delete_post_meta( $customer, '_billing_ticketprest_dni', $meta_value = '' );
add_post_meta( $order_id, '_billing_ticketprest_dni', sanitize_text_field( $_POST['ticketprest_dni'] ) );
add_post_meta( $customer, '_billing_ticketprest_dni', sanitize_text_field( $_POST['ticketprest_dni'] ) );
}
}
3 – Utilizando WooCommerce_admin_order_data_after_billing_address hacemos que se muestre el campo _billing_ticketprest_dni en la ficha de pedido de nuestro backoffice:
add_action( 'WooCommerce_admin_order_data_after_billing_address', 'show_nif_in_admin', 10, 1 );
function show_nif_in_admin($order){
echo '<p><strong>'.__('NIF/DNI/NIE').':</strong> ' . get_post_meta( $order->id, '_billing_ticketprest_dni', true ) . '</p>';
}
4 – Validar el NIF/DNI/NIE utilizando WooCommerce_checkout_process y la función validDniCifNie. Esta función hace que el dato introducido en _billing_ticketprest_dni sea obligatorio y que cumpla con el formato correcto de un número fiscal identificativo español.
add_action('WooCommerce_checkout_process', 'validar_dni_field');
function validar_dni_field() {
// Check if set, if its not set add an error.
if ( $_POST['ticketprest_dni'] ) {
if (!validDniCifNie($_POST['ticketprest_dni'])) {
wc_add_notice( __( 'El campo NIF/DNI/NIE no es válido' ), 'error' );
}
}
}
function validDniCifNie($dni){
$cif = strtoupper($dni);
for ($i = 0; $i < 9; $i ++){
$num[$i] = substr($cif, $i, 1);
}
// Si no tiene un formato valido devuelve error
if (!preg_match('/((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)/', $cif)){
return false;
}
// Comprobacion de NIFs estandar
if (preg_match('/(^[0-9]{8}[A-Z]{1}$)/', $cif)){
if ($num[8] == substr('TRWAGMYFPDXBNJZSQVHLCKE', substr($cif, 0, 8) % 23, 1)){
return true;
}else{
return false;
}
}
// Algoritmo para comprobacion de codigos tipo CIF
$suma = $num[2] + $num[4] + $num[6];
for ($i = 1; $i < 8; $i += 2){
$suma += (int)substr((2 * $num[$i]),0,1) + (int)substr((2 * $num[$i]), 1, 1);
}
$n = 10 - substr($suma, strlen($suma) - 1, 1);
// Comprobacion de NIFs especiales (se calculan como CIFs o como NIFs)
if (preg_match('/^[KLM]{1}/', $cif)){
if ($num[8] == chr(64 + $n) || $num[8] == substr('TRWAGMYFPDXBNJZSQVHLCKE', substr($cif, 1, 8) % 23, 1)){
return true;
}else{
return false;
}
}
// Comprobacion de CIFs
if (preg_match('/^[ABCDEFGHJNPQRSUVW]{1}/', $cif)){
if ($num[8] == chr(64 + $n) || $num[8] == substr($n, strlen($n) - 1, 1)){
return true;
}else{
return false;
}
}
// Comprobacion de NIEs
// T
if (preg_match('/^[T]{1}/', $cif)){
if ($num[8] == preg_match('/^[T]{1}[A-Z0-9]{8}$/', $cif)){
return true;
}else{
return false;
}
}
// XYZ
if (preg_match('/^[XYZ]{1}/', $cif)){
if ($num[8] == substr('TRWAGMYFPDXBNJZSQVHLCKE', substr(str_replace(array('X','Y','Z'), array('0','1','2'), $cif), 0, 8) % 23, 1)){
return true;
}else{
return false;
}
}
// Si todavía no se ha verificado devuelve error
return false;
}
5 – Mostrar el campo NIF/DNI/NIE en la dirección de facturación de la propia factura, para ello utilizamos el filtro wpo_wcpdf_billing_address del plugin WooCommerce PDF Invoices & Packing Slips que hemos mencionado anteriormente:
add_filter( 'wpo_wcpdf_billing_address', 'incluir_nif_en_factura', 99, 2 );
function incluir_nif_en_factura( $address, $document = null ) {
$nif = get_post_meta( (int)$_GET['order_ids'], '_billing_ticketprest_dni', true );
if ($nif ) {
$address = $address . "<p>{$nif}</p>";
}
return $address;
}
Con estos sencillos pasos podremos emitir facturas totalmente legales en España y la Unión Europea, utilizando nuestra tienda online desarrollada con WooCommerce.
Con esto y más ¡tu tienda online siempre preparada!