/** * @ngdoc fbPersonnummerSpec * @name fasit.directiveTest.#fbPersonnummerSpec * @fbPersonnummerSpec * * @description * Directive som validerar input för att se om inputen innehåller ett giltigt personnummer eller inte * */ angular.module('fasit') .directive('fbPersonnummer', [function () { var link = function ( scope: fb.IFbPersonnummerScope, elm: fb.IRootElementService, attrs: ng.IAttributes, ctrl: ng.INgModelController ) { scope.valideraPersonnummer = function (value: string): boolean { var nonNumbers = new RegExp('[^0-9]'); if (nonNumbers.test(value)) { return false; } if (value.length !== 12) { return false; } var aar: number = parseInt(value.substring(0, 4)); var maanad: number = parseInt(value.substring(4, 6)); var dag: number = parseInt(value.substring(6, 8)); var max_aar: number = new Date().getFullYear(); // kontrollera år och månad if (1900 > aar || aar > max_aar || 1 > maanad || maanad > 12) { return false; } // kontrollera dag var dagarPerMaanad: number[] = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; if (aar % 400 === 0 || (aar % 100 !== 0 && aar % 4 === 0)) { dagarPerMaanad[1] = 29; } if (1 > dag || dag > dagarPerMaanad[maanad - 1]) { return false; } // Beräkna och kontrollera kontroll-siffran var controlValidation = [0, 0, 2, 1, 2, 1, 2, 1, 2, 1, 2]; var sum: number = 0; for (var i: number = 0; i < controlValidation.length; i++) { var str: string = '' + controlValidation[i] * parseInt(value.charAt(i)); if (str.length === 1) { sum += parseInt(str); } else { sum += parseInt(str.charAt(0)); sum += parseInt(str.charAt(1)); } } var num = (10 - (sum % 10)) % 10; if (num !== parseInt(value.charAt(11))) { return false; } return true; }; ctrl.$parsers.unshift(function (viewValue) { if (scope.valideraPersonnummer(viewValue)) { // it is valid ctrl.$setValidity('personnummer', true); return viewValue; } else { // it is invalid, return undefined (no model update) ctrl.$setValidity('personnummer', false); return undefined; } }); } return { restrict: 'A', require: 'ngModel', link: link }; }]);