Quick actions

cmd+k|ctrl+k

Navigation

Languages

CheckInvoices

Snippet info

Language

JavaScript

Visibility

public

Author

pipitifapitifu

Created

2025-04-29T11:44:30.304035Z

Updated

2025-04-29T14:22:06.164043Z

// 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);
INFO