Hola todos
Quiero compartir con ustedes estas líneas de código, que suelen ser útiles en aplicaciones que manipulan NITs y requieren validar el digito de verificación de ese número.
El algoritmo es bien simple, pero cabe tener a la mano esto cuando se necesite y no gastarle mucho tiempo.
Buscando en internet, se ecunetra por ahi la implementación en FoxPro, en VB 6.0, pero nada actualizado para .NET, y adicionalmente coloco el código para PL/SQL que es lo mismo pero para ORACLE.
public string ValidarDigitoVerificacion(string unNit)
{
string miTemp;
int miContador;
int miResiduo;
int miChequeo;
int[] miArregloPA = new int[15];
miArregloPA[0] = 3;
miArregloPA[1] = 7;
miArregloPA[2] = 13;
miArregloPA[3] = 17;
miArregloPA[4] = 19;
miArregloPA[5] = 23;
miArregloPA[6] = 29;
miArregloPA[7] = 37;
miArregloPA[8] = 41;
miArregloPA[9] = 43;
miArregloPA[10] = 47;
miArregloPA[11] = 53;
miArregloPA[12] = 59;
miArregloPA[13] = 67;
miArregloPA[14] = 71;
miChequeo = 0;
miResiduo = 0;
for(miContador = 0; miContador<unNit.Length;miContador++)
{
miTemp = unNit[(unNit.Length-1) - miContador].ToString();
miChequeo = miChequeo + (Convert.ToInt32(miTemp) * miArregloPA[miContador]);
}
miResiduo = miChequeo % 11;
if(miResiduo > 1)
return Convert.ToString(11 - miResiduo);
return miResiduo.ToString();
}
El método recibe el NIT, cálcula el digito de evrificación y lo retorna. El algoritmo se llama el Modulo 11, porque si notan lo que se hace finalmente con lo cálculado es obtener el modulo 11 de ese valor. El arreglo miArregloPA, lo que contiene son una serie de números primos requeridos por el algoritmo.Si se fijan, el arreglo miTemp, almacena el NIT de atras para adelante, y se genera una sumatoria del producto de cada valor del arreglo miTemp con cada número de miArregloPA.
Bueno y ahora en PL:
CREATE OR REPLACE FUNCTION ValidarDigitoChequeoNIT(chrNIT VARCHAR2) RETURN VARCHAR2 IS
BEGIN
DECLARE
intContador NUMBER;
intACUM NUMBER;
intRESTO NUMBER;
intLongIden NUMBER; --Longitud de la cadena identificación}
-- Arreglo
TYPE arregloPA IS TABLE OF NUMBER(2)
INDEX BY BINARY_INTEGER;
-- Variable de tipo arreglo
arrPA arregloPA;
arrDA arregloPA;
BEGIN
-- Válida el dígito de chequeo
SELECT Length(chrNIT) + 1
INTO intLongIden
FROM DUAL;
-- Llenar el arreglo PA, estos son números primos, según loe stablece el algoritmo
arrPA(1) := 3;
arrPA(2) := 7;
arrPA(3) := 13;
arrPA(4) := 17;
arrPA(5) := 19;
arrPA(6) := 23;
arrPA(7) := 29;
arrPA(8) := 37;
arrPA(9) := 41;
arrPA(10) := 43;
arrPA(11) := 47;
arrPA(12) := 53;
arrPA(13) := 59;
arrPA(14) := 67;
arrPA(15) := 71;
intContador := 1;
-- Llena el arreglo DA con la cadena de entrada que es el NIT
FOR intContador IN 1..intLongIden - 1 LOOP
arrDA(intContador) := TO_NUMBER(substr(chrNIT,intLongIden- intContador, 1));
END LOOP;
-- Llena con ceroas el resto de posiciones del arreglo
FOR intContador IN intLongIden..15 LOOP
arrDA(intContador) := 0;
END LOOP;
intACUM := 0;
FOR intContador IN 1..15 LOOP
intACUM := intACUM + (arrDA(intContador) * arrPA(intContador));
END LOOP;
-- Obtiene el modulo 11 del acumulado
intRESTO := MOD(intACUM,11);
IF (intRESTO > 1) THEN
return TO_CHAR(11 - intRESTO);
ELSE
return TO_CHAR(intRESTO);
END IF;
END;
END F_ValidarDigitoChequeoNIT;
Como pueden ver, es una función de PL, que hace exactamente lo mismo que el método en C#.
Felices lineas de código
Att. Andres Ortiz