Validar NIT

Script de ejemplo de cómo validar el Número de Identificación Tributaria (NIT) utilizado en Guatemala.

HTML

<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
<div class="container">
    <h1>Validaci&oacute;n de NIT <small>utilizado en Guatemala</small></h1>
    
    <p>El <strong>N&uacute;mero de Identificaci&oacute;n Tributaria</strong> (NIT) es el n&uacute;mero con el que se identifican los contribuyentes en Guatemala para el pago de impuestos.</p>
    
    <blockquote><p class="small">El presente formulario permite <em>verificar si el NIT escrito es v&aacute;lido</em>, sin embargo la validez del n&uacute;mero no implica que exista un contribuyente que se identifique con dicho n&uacute;mero.</p></blockquote>
    
    <div class="row">
        <div class="col-md-12">
            <form role="form">
                <div class="form-group has-feedback">
                    <label for="nit" class="control-label">Nit:</label>
                    <input type="text" class="form-control" id="nit" placeholder="Ingrese Nit" />
                    <span class="glyphicon form-control-feedback"></span>
                </div>
            </form>
        </div>
    </div>
</div>

JavaScript

function nitIsValid(nit) {
    if (!nit) {
        return true;
    }

    var nitRegExp = new RegExp('[0-3]');

    if (!nitRegExp.test(nit)) {
        return false;
    }

    nit = nit.replace(/-/, '');
    var lastChar = nit.length - 1;
    var number = nit.substring(0, lastChar);
    var expectedCheker = nit.substring(lastChar, lastChar + 1).toLowerCase();

    var factor = number.length + 1;
    var total = 0;

    for (var i = 0; i < number.length; i++) {
        var character = number.substring(i, i + 1);
        var digit = parseInt(character, 10);

        total += (digit * factor);
        factor = factor - 1;
    }

    var modulus = (11 - (total % 11)) % 11;
    var computedChecker = (modulus == 10 ? "k" : modulus.toString());

    return expectedCheker === computedChecker;
}

$('#nit').bind('change paste keyup', function (e) {
    var $this = $(this);
    var $parent = $this.parent();
    var $next = $this.next();
    var nit = $this.val();

    if (nit && nitIsValid(nit)) {
        $parent.addClass('has-success');
        $next.addClass('glyphicon-ok');
        $parent.removeClass('has-error');
        $next.removeClass('glyphicon-remove');
    } else if (nit) {
        $parent.addClass('has-error');
        $next.addClass('glyphicon-remove');
        $parent.removeClass('has-success');
        $next.removeClass('glyphicon-ok');
    } else {
        $parent.removeClass('has-error');
        $next.removeClass('glyphicon-remove');
        $parent.removeClass('has-success');
        $next.removeClass('glyphicon-ok');
    }
});