// Función para calcular la letra del NIF a partir de los 8 dígitos
function calcularLetraNIF(numeroDNI) {
const letras = "TRWAGMYFPDXBNJZSQVHLCKE";
const dni = parseInt(numeroDNI, 10);
if (isNaN(dni) || dni < 0 || dni > 99999999) return null;
return letras.charAt(dni % 23);
}
// Función para calcular la letra del NIE a partir del NIE sin la letra de control
function calcularLetraNIE(nieSinLetra) {
const letras = "TRWAGMYFPDXBNJZSQVHLCKE";
const mapaInicial = { X: '0', Y: '1', Z: '2' };
const primera = nieSinLetra.charAt(0);
if (!mapaInicial.hasOwnProperty(primera)) return null;
const numero = mapaInicial[primera] + nieSinLetra.slice(1);
return letras.charAt(parseInt(numero, 10) % 23);
}
// Función para calcular el dígito de control del CIF a partir de los 8 primeros caracteres
function calcularDigitoControlCIF(ochoChars) {
const letrasControl = "JABCDEFGHI";
const inicial = ochoChars.charAt(0);
const nums = ochoChars.slice(1);
let sumaPar = 0, sumaImpar = 0;
for (let i = 0; i < nums.length; i++) {
const n = parseInt(nums.charAt(i), 10);
if ((i + 1) % 2 === 0) {
sumaPar += n;
} else {
let d = n * 2;
if (d > 9) d -= 9;
sumaImpar += d;
}
}
const total = sumaPar + sumaImpar;
const unidad = total % 10;
const dig = unidad === 0 ? 0 : 10 - unidad;
// Según tipo de entidad, puede ser letra o número
if ("PQSKW".includes(inicial)) {
return letrasControl.charAt(dig);
}
if ("ABEH".includes(inicial)) {
return String(dig);
}
return letrasControl.charAt(dig);
}
// Funciones de validación que reciben el código completo y devuelven true/false
function validarNIF(nif) {
const num = nif.slice(0, 8);
const letra = nif.charAt(8);
const calc = calcularLetraNIF(num);
return calc !== null && calc === letra;
}
function validarNIE(nie) {
const sinLetra = nie.slice(0, 8);
const letra = nie.charAt(8);
const calc = calcularLetraNIE(sinLetra);
return calc !== null && calc === letra;
}
function validarCIF(cif) {
const ocho = cif.slice(0, 8);
const control = cif.charAt(8);
const calc = calcularDigitoControlCIF(ocho);
return calc !== null && calc === control;
}
// Función principal que identifica el tipo y valida
function identificarYValidar(codigo) {
const c = codigo.toUpperCase().replace(/\s|-/g, '');
let res = false;
if (/^[0-9]{8}[A-Z]$/.test(c)) {
res = validarNIF(c);
} else if (/^[XYZ][0-9]{7}[A-Z]$/.test(c)) {
res = validarNIE(c);
} else if (/^[ABCDEFGHJKLMNPQRSUVW][0-9]{7}[0-9A-J]$/.test(c)) {
res = validarCIF(c);
}
return res;
}
//return input.map(item => identificarYValidar(item.code))[0];
//console.log(identificarYValidar('12345678Z'));
function run(input) {
// identificarYValidar solo devuelve true o false
//return input.map(item => identificarYValidar(item.code))[0];
return identificarYValidar(input[0].code);
}
//const output = run([{ code: "12345678Z" }]);
//console.log(output);