Por cuestiones de trabajo, investigue como validar el NIT utilizando el algoritmo de Modulo 11 que utiliza la SAT en Guatemala pero buscando en google solo encontre un medio codigo en VBScript y uno en C# pero como lo queria en Javascript encontre una manera fácil de hacerlo.
El algoritmo consiste en lo siguiente, tenemos el siguiente NIT:
42932-5
Entonces multiplicamos:
4 * 6 = 24
2 * 5 = 10
9 * 4 = 36
3 * 3 = 9
2 * 2 = 4
En pocas palabras multiplicamos cada letra en su posicion. Lo que no multiplicamos es la ultima posicion que nos va a servir mas adelante.
El resultado nos da 83 aplicamos el modulo 11 de la siguiente manera:
83 mod 11 = 6
Seguidamente el resultado es el siguiente:
11 - 6 = 5
Este resultado debe ser identico al ultimo digito despues del guion que se le llama digito verificador y asi nos damos cuenta si un NIT es valido.
A cotinuacion les pongo el algoritmo hecho en JavaScript:
function ValidarNITMod11(){
var pos = txtNIT.value.indexOf("-");
var correlativo = txtNIT.value.substring(0, pos);
var digitoverificador = txtNIT.value.substring(pos + 1, txtNIT.value.length);
var factor = correlativo.length + 1;
var valor = 0;
for(i = 0; i < style="font-style: italic; font-weight: bold;">var residuo = valor % 11;
var resultado = 11 - residuo;
if(resultado == 10){
if(digitoverificador.toUpperCase() == "K"){
alert("El NIT es valido");
return true;
}
}
else{
if(digitoverificador == resultado){
alert("El NIT es valido");
return true;
}
}
alert("El NIT es invalido");
return false;
}
La variable txtNIT es el id del input de tipo text.
Ver Ejemplo
Au revoir à tous....




10 comentarios:
¡Oh! No tenía la más mímina idea de que así se realiza la validación.
Ta mas facil con expresiones regulares :)
Bueno... ahora averiguate porque la letra "k" si el resultado es 10. ¿Porque no escogieron la ñ? o ¿porque no escogieron otra letra? Talvez...¿la que se invento el algoritmo se llamaba Karla? Y..¿será que Karla estaba buena? Y si estaba buena...¿Cuál es su número?
Dicen que si uno llama a la SAT te pueden mandar esta función hecha en Java.
Huy, hay un error en el método que explican aquí.
Yo sé que existe el NIT 1510972-0. Aplicando el método aquí explicado, multiplico y sumo
2 * 2 = 4
7 * 3 = 21
9 * 4 = 36
0 * 5 = 0
1 * 6 = 6
5 * 7 = 35
1 * 8 = 8
Eso me da 110.
Al aplicar 110 % 11 me da 0, y al hacer 11 - 0 = 11. ¿Ven que no funciona?
Lo que falta es que al resultado de la resta hay que aplicarle de nuevo el módulo de 11, de esta forma 11 % 11 sí me da el cero de este NIT.
Gracias por la aclaración muy buena tu observación
muchas gracias fue de gran ayuda, por si les interesa envio esta misma funcion el PL
FUNCTION FValidationNit(
iNit IN VARCHAR2
) RETURN VARCHAR2 IS
wNumberOne NUMBER;
wSum NUMBER := 0;
wDV NUMBER;
wLength NUMBER;
BEGIN
wLength := LENGTH(iNit);
FOR i IN 2..LENGTH(iNit) LOOP
wNumberOne := SUBSTR(iNit,i-1,1) * wLength;
wSum := wSum + wNumberOne ;
wLength := wLength - 1;
END LOOP; /*i IN 2..LENGTH(iNit) LOOP*/
wDV := (11-(wSum MOD 11)) MOD 11;
IF (((wDV = 10) AND (UPPER(SUBSTR(iNit,LENGTH(iNit), 1)) = 'K')))
OR (wDV = SUBSTR(iNit,LENGTH(iNit))) THEN
RETURN('T');
ELSE
RETURN('F');
END IF; /*(((wDV = 10) AND (SUBSTR(iNit,LENGTH(iNit), 1) = 'K')))*/
END;
por si les sirve, si alguien lo mejora alli se pasa copia.
Public Function ValidarNIT(ByVal Nit As String) As Boolean
Dim pos As Integer = Nit.IndexOf("-")
Dim Correlativo As String = Nit.Substring(0, pos)
Dim DigitoVerificador As String = Nit.Substring(pos + 1)
Dim Factor As Integer = Correlativo.Length + 1
Dim Suma As Integer = 0
Dim Valor As Integer = 0
For x As Integer = 0 To Nit.IndexOf("-") - 1
Valor = CInt(Nit.Substring(x, 1))
Suma = Suma + (Valor * Factor)
Factor = Factor - 1
Next
Dim xMOd11 As Double
xMOd11 = (11 - (Suma Mod 11)) Mod 11
Dim s As String = Str(xMOd11)
If (xMOd11 = 10 And DigitoVerificador = "K") Or (s.Trim = DigitoVerificador) Then
Return True
End If
Return False
End Function
Excelente función, funciona perfectamente!!! gracias
Excelente función, funciona perfectamente!!! gracias
Publicar un comentario en la entrada