En Tiendaprest nos gusta desarrollar tiendas online en PrestaShop, porque es una plataforma muy completa y preparada para el comercio electrónico, y además, es sencilla de utilizar.
Si tu problema es en una tienda online WordPress, mira esta otra entrada: Cómo poner el campo de DNI obligatorio en WooCommerce
Una de las muchas características que ofrece PrestaShop es que nos permite, en un par de clics, hacer que el campo NIF, DNI o NIE sea obligatorio en la dirección de facturación, dependiendo de la configuración que establezcamos en cada país desde el backoffice o gestor de la tienda:
Desde Internacional > Ubicaciones geográficas > Países podemos gestionar los países y ubicaciones geográficas en los que vende nuestra tienda online y dentro de cada ficha de país podemos establecer si el campo número de identificación fiscal es obligatorio o no marcando en SI o NO el campo: ¿Necesita un número de identificación fiscal?

Si marcamos este campo como obligatorio, PrestaShop, por defecto, simplemente comprueba que no esté en blanco y que además tenga una longitud entre 2 y 16 caracteres entre letras y números. Para ampliar esta información puedes echar un vistazo a la documentación oficial de PrestaShop.
Pero además de esto, lo ideal es que también podamos comprobar que el formato introducido para ese NIF, DNI o NIE, sea válido. Y para esto, os facilitamos el siguiente fragmento de código que hay que insertar como un override de classes/Validate.php
class Validate extends ValidateCore
{
public static function isDniLite($dni)
{
if (!Validate::validDniCifNie($dni)) {
return false;
}
return empty($dni) || (bool) preg_match('/^[0-9A-Za-z-.]{1,16}$/U', $dni);
}
public static 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;
}
}
Si necesitas ayuda para insertar un override en PrestaShop, puedes echar un vistazo a nuestra entrada Como hacer un override en PrestaShop o también puedes contar con nuestro servicio de soporte especializado PrestaShop.
Esperamos que esta entrada os sea de utilidad.
Con esto y más ¡tu tienda online siempre preparada!