Algoritmo para calcular el dígito de verificación de los NIT en Colombia

A continuación presento el código “fast and dirty”, o mejor dicho “Quick-and-dirty” que calcula el dígito de verificación de los NIT en java.

No es fácil de encontrar información correcta sobre como debe ser el algoritmo en Google (claro está que haciendo una búsqueda mas bien rápida). A continuación contaré los tropiezos que tuve:

El primer código que implementé, lo hice a partir de la siguiente página método – aldiaempresarios.com confiando ciegamente que, al ser una página de Colombia iba a generar correctamente el resultado. Incluso tienen de prueba el NIT= 41261533, que según esta página determinan que el resultado es 6… pero está mal.

Hace poco encontré la siguiente página para generar en la web el dígito de verificación correcto: validanit.co y en ella se ve que el resultado para el NIT 41261533 debe ser 2. Confío en este enlace porque lo he comparado con NITs conocidos junto a dígito de verificación y todo coincide correctamente.

Cuando caí en cuenta que los NITs generados con el algoritmo de “aldiaempresarios.com” estaban mal, busqué de nuevo, encontrando la solución de la wikipedia: (enlace: wikipedia ) . Tomé y adapté el código en c# …pero… está limitado a un NIT en el formato XXX.XXX.XXX – Y, donde Y es el dígito de verificación y las X son los valores de entrada (9 dígitos) para el algoritmo. Resulta que existen NITs de 8 dígitos “X” e incluso en alguna documentación de la DIAN observé que puede ser incluso de 15 dígitos.

Finalmente, seguí buscando y buscando y encontré la información del siguiente enlace laneros.com con un código hecho para FOX PRO que me permitió ver los números primos adicionales que se utilizan para el algoritmo. Tomé esta información y analicé el orden en que deben multiplicarse los dígitos del NIT contra los números primos, teniendo en cuenta que el tamaño del NIT puede ser variable (de 8 [XXXXXXXX-Y], de 15 [XXXXXXXXXXXXXXX-Y] o el que sea entre 1 y 15) y desarrollé el algoritmo que se encuentra al final.

Mientras escribía esta entrada al blog, revisé si ya existía un algoritmo en java que se encontrara rápidamente y encontré el siguiente http://codigodepuracepa.blogspot.com.co que, según el comentario “Anónimo20 de febrero de 2014, 8:45” indica que está mal. Hice la prueba que ahí se indica con el NIT 811007991 y efectivamente, en mi algoritmo da el valor correcto 8, al igual que en la página validanit.co

Por último, confirmo que el código está hecho en Java y que falta pulirlo (como indico arriba, el desarrollo fue quick-and-dirty), solo espero que sea de utilidad para el visitante.

Agradezco tu comentario, Saludos.

public static int getDigitoDian(String nitParam) throws Exception
    {
        if( nitParam == null || ( nitParam.trim() ).isEmpty() )
        {
            throw new Exception("La cadena del NIT es nula o vacía.");
        }
        
        nitParam = nitParam.trim();
        
        int indiceRaya = nitParam.indexOf("-");
        
        String nitInterno = indiceRaya > 0 ? nitParam.substring(0, indiceRaya): nitParam;

        try
        {
            long longValidacion = Long.parseLong(nitInterno);
        }
        catch(Exception ex)
        {
            throw new Exception("El nit contiene caracteres no numéricos. Valor recibido: |" +  nitParam + "|");
        }
        

        String nitVector[] = nitInterno.split("(?<=.)");

        int valorCalculado = 0;
        int aux = nitVector.length -1;

        for( int i = 0; i < nitVector.length; i++ )
        {
            switch( i )
            {
                case 0:
                    valorCalculado += 3 * Integer.parseInt(nitVector[aux - 0]);
                    break;
                case 1:
                    valorCalculado += 7 * Integer.parseInt(nitVector[aux - 1]);
                    break;
                case 2:
                    valorCalculado += 13 * Integer.parseInt(nitVector[aux - 2]);
                    break;
                case 3:
                    valorCalculado += 17 * Integer.parseInt(nitVector[aux - 3]);
                    break;
                case 4:
                    valorCalculado += 19 * Integer.parseInt(nitVector[aux - 4]);
                    break;
                case 5:
                    valorCalculado += 23 * Integer.parseInt(nitVector[aux - 5]);
                    break;
                case 6:
                    valorCalculado += 29 * Integer.parseInt(nitVector[aux - 6]);
                    break;
                case 7:
                    valorCalculado += 37 * Integer.parseInt(nitVector[aux - 7]);
                    break;
                case 8:
                    valorCalculado += 41 * Integer.parseInt(nitVector[aux - 8]);
                    break;
                case 9:
                    valorCalculado += 43 * Integer.parseInt(nitVector[aux - 9]);
                    break;
                case 10:
                    valorCalculado += 47 * Integer.parseInt(nitVector[aux - 10]);
                    break;
                case 11:
                    valorCalculado += 53 * Integer.parseInt(nitVector[aux - 11]);
                    break;
                case 12:
                    valorCalculado += 59 * Integer.parseInt(nitVector[aux - 12]);
                    break;
                case 13:
                    valorCalculado += 67 * Integer.parseInt(nitVector[aux - 13]);
                    break;
                case 14:
                    valorCalculado += 71 * Integer.parseInt(nitVector[aux - 14]);
                    break;
            }
        }//for( int i = 0; i < nitVector.length; i++ )
        
        int modulo = valorCalculado % 11;
        
        if( modulo >= 2 )
        {
            modulo = 11 - modulo;
        }
        
        return modulo;
    }

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s