ngacw-dpi
Version:
Validates input as Guatemalan DPI (Documento Personal de Identificación, something like a SSN)
112 lines (92 loc) • 4.12 kB
JavaScript
(function(angular) {
angular.module('acw.directives')
.directive('dpi', DpiDirective);
DpiDirective.$inject = [];
function DpiDirective() {
return {
restrict: 'A',
require: '?ngModel',
link: dpiDirectiveLink
};
}
function dpiDirectiveLink(scope, element, attrs, ctrl) {
element.attr('placeholder', 'xxxx-xxxxx-xxxx');
ctrl.$validators.validdpi = function (modelValue) {
if (ctrl.$isEmpty(modelValue)) {
return true;
}
return validDpi(modelValue);
};
}
// Funcion basada en http://jsfiddle.net/miguelerm/tp0t481o/ por Miguel Roman @miguelerm
function validDpi(modelValue) {
// En caso de que no venga valor, no se realiza la validacion
if (!modelValue) {
return true;
}
var dpi = modelValue.toString();
var dpiRegExp = /^[0-9]{4}[\s\-]?[0-9]{5}[\s\-]?[0-9]{4}$/;
if (!dpiRegExp.test(dpi)) {
return false;
}
dpi = dpi.replace(/\s/, '').split(/\-/).join('');
var regionCode = parseInt(dpi.substring(9, 11), 10);
var cityCode = parseInt(dpi.substring(11, 13), 10);
var dpiNumber = dpi.substring(0, 8);
var verifier = parseInt(dpi.substring(8, 9), 10);
// Se asume que la codificación de Municipios y
// departamentos es la misma que esta publicada en
// http://goo.gl/EsxN1a
// Listado de municipios actualizado segun:
// http://goo.gl/QLNglm
// Este listado contiene la cantidad de municipios
// existentes en cada departamento para poder
// determinar el código máximo aceptado por cada
// uno de los departamentos.
var cityCountPerRegion = [
/* 01 - Guatemala has: */ 17 /* cities. */,
/* 02 - El Progreso has: */ 8 /* cities. */,
/* 03 - Sacatepéquez has: */ 16 /* cities. */,
/* 04 - Chimaltenango has: */ 16 /* cities. */,
/* 05 - Escuintla has: */ 13 /* cities. */,
/* 06 - Santa Rosa has: */ 14 /* cities. */,
/* 07 - Sololá has: */ 19 /* cities. */,
/* 08 - Totonicapán has: */ 8 /* cities. */,
/* 09 - Quetzaltenango has: */ 24 /* cities. */,
/* 10 - Suchitepéquez has: */ 21 /* cities. */,
/* 11 - Retalhuleu has: */ 9 /* cities. */,
/* 12 - San Marcos has: */ 30 /* cities. */,
/* 13 - Huehuetenango has: */ 32 /* cities. */,
/* 14 - Quiché has: */ 21 /* cities. */,
/* 15 - Baja Verapaz has: */ 8 /* cities. */,
/* 16 - Alta Verapaz has: */ 17 /* cities. */,
/* 17 - Petén has: */ 14 /* cities. */,
/* 18 - Izabal has: */ 5 /* cities. */,
/* 19 - Zacapa has: */ 11 /* cities. */,
/* 20 - Chiquimula has: */ 11 /* cities. */,
/* 21 - Jalapa has: */ 7 /* cities. */,
/* 22 - Jutiapa has: */ 17 /* cities. */
];
if (regionCode === 0 || cityCode === 0) {
// Departamento o municipio invalidos
return false;
}
if (regionCode > cityCountPerRegion.length) {
// CUI con código de departamento inválido.
return false;
}
if (cityCode > cityCountPerRegion[regionCode - 1]) {
// CUI con código de municipio inválido.
return false;
}
// Se verifica el correlativo con base
// en el algoritmo del complemento 11.
var total = 0;
for (var i = 0; i < dpiNumber.length; i++) {
total += parseInt(dpiNumber[i], 10) * (i + 2);
}
var modulus = (total % 11);
// console.log("CUI con módulo: " + modulo);
return modulus === verifier;
}
})(window.angular);