NIF, DNI o NIE obligatorio y validado en WooCommerce

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!

Te puede interesar

¿Necesitas ayuda más avanzada para solucionar tus problemas?

Contáctanos o echa un vistazo a nuestros servicios, entre los cuales podrás encontrar varios planes de mantenimiento de Prestahop.

Nuestros servicios

Impulsa la venta online y haz crecer tu negocio en poco tiempo.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *