En Guatemala el ente recaudador de impuestos se llama SAT (Superintendencia de Administración Tributaria).
Para cada empresa o persona individual, esta entidad gubernamental asigna un número (código) único llamado NIT (Número de Identificación Tributaria). Para los que trabajamos con programación se hace necesaria la validación de los NIT's a la hora de tener que recabar información acerca de usuarios que poseen dicho número.
El NIT es un número que asigna la SAT a cada contribuyente guatemalteco.
Hace algunos días me vi en la necesidad de buscar código para validar dichos NIT's y afortunadamente me encontré una página que me dio la solución sobre el asunto, casi sin fallos, el código que encontré me funciona perfectamente.
La función está escrita en JavaScript y al menos a mí me ha funcionado muy bien, les comparto la función y espero que les sea de mucho provecho.
/****************************************
CÓDIGO DE LA FUNCIÓN
****************************************/
function validar_nit(txtN) {
// en el caso de los NIT que terminan en K, se convierte a mayúsculas
// también el NIT CF o C/F es válido (CF = consumidor final)
txtN = txtN.toUpperCase();
if (txtN == "CF" || txtN == "C/F") return true;
var nit = txtN;
var pos = nit.indexOf("-");
if (pos < 0)
{
var correlativo = txtN.substr(0, txtN.length - 1);
correlativo = correlativo + "-";
var pos2 = correlativo.length - 2;
var digito = txtN.substr(pos2 + 1);
nit = correlativo + digito;
pos = nit.indexOf("-");
txtN = nit;
}
var Correlativo = nit.substr(0, pos);
var DigitoVerificador = nit.substr(pos + 1);
DigitoVerificador.toUpperCase();
var Factor = Correlativo.length + 1;
var Suma = 0;
var Valor = 0;
for (x = 0; x <= (pos - 1); x++) {
Valor = eval(nit.substr(x, 1));
var Multiplicacion = eval(Valor * Factor);
Suma = eval(Suma + Multiplicacion);
Factor = Factor - 1;
}
var xMOd11 = 0;
xMOd11 = (11 - (Suma % 11)) % 11;
var s = xMOd11;
if ((xMOd11 == 10 && DigitoVerificador == "K") || (s == DigitoVerificador))
{
return true;
}
else
{
return false;
}
}
if (txtN == "CF" || txtN == "C/F") return true;
var nit = txtN;
var pos = nit.indexOf("-");
if (pos < 0)
{
var correlativo = txtN.substr(0, txtN.length - 1);
correlativo = correlativo + "-";
var pos2 = correlativo.length - 2;
var digito = txtN.substr(pos2 + 1);
nit = correlativo + digito;
pos = nit.indexOf("-");
txtN = nit;
}
var Correlativo = nit.substr(0, pos);
var DigitoVerificador = nit.substr(pos + 1);
DigitoVerificador.toUpperCase();
var Factor = Correlativo.length + 1;
var Suma = 0;
var Valor = 0;
for (x = 0; x <= (pos - 1); x++) {
Valor = eval(nit.substr(x, 1));
var Multiplicacion = eval(Valor * Factor);
Suma = eval(Suma + Multiplicacion);
Factor = Factor - 1;
}
var xMOd11 = 0;
xMOd11 = (11 - (Suma % 11)) % 11;
var s = xMOd11;
if ((xMOd11 == 10 && DigitoVerificador == "K") || (s == DigitoVerificador))
{
return true;
}
else
{
return false;
}
}
Espero les sirva tanto como a mí.
Las referencias pueden ubicarlas en los siguientes enlaces:
y también aquí:
Saludos.
si alguien escribe algo como 0-0 ó .-. ó a-a
ResponderEliminareste script lo toma como valido, faltaria una validacion de caracteres, he buscado pero no encuentro cuantos debe tener el nit...
Hola, comparto versión utilizando python 3
ResponderEliminarhttps://github.com/jmco0593/nit_gt