kennitala-utility
Version:
Utility functions for icelandic social security numbers (kennitolur).
206 lines (205 loc) • 6.61 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.isKennitalaPart = exports.getAge = exports.isCompany = exports.getBirthdate = exports.isValidDate = exports.isValid = exports.clean = exports.makeKennitala = exports.makeKerfiskennitala = exports.format = void 0;
var oops_error_1 = require("oops-error");
var isMod11 = function (kt) {
// Modulus-aðferð við að sannreyna kennitölu
// https://www.skra.is/einstaklingar/eg-og-fjolskyldan/eg-i-thjodskra/um-kennitolur/
var mod11 = 11 -
((3 * Number(kt.charAt(0)) +
2 * Number(kt.charAt(1)) +
7 * Number(kt.charAt(2)) +
6 * Number(kt.charAt(3)) +
5 * Number(kt.charAt(4)) +
4 * Number(kt.charAt(5)) +
3 * Number(kt.charAt(6)) +
2 * Number(kt.charAt(7))) %
11);
if (mod11 === 11 && kt.charAt(8) === '0') {
return true;
}
if (mod11 !== Number(kt.charAt(8))) {
return false;
}
return true;
};
var isKerfiskennitala = function (kt) {
return kt[0] === '8' || kt[0] === '9';
};
function format(kt) {
kt = clean(kt);
return kt.substr(0, 6) + '-' + kt.substr(6, 10);
}
exports.format = format;
function randomDate(start, end) {
return new Date(start.getTime() + Math.random() * (end.getTime() - start.getTime()));
}
function makeKerfiskennitala() {
var rand = Math.random();
return (Math.floor(rand) + 8) * 1000000000 + Math.floor(rand * 100000000) + '';
}
exports.makeKerfiskennitala = makeKerfiskennitala;
function makeKennitala(birthdate) {
var dateOfBirth = birthdate ||
randomDate(new Date(new Date().getFullYear() - 60, 1, 1), new Date());
var digits = [
Math.floor(dateOfBirth.getDate() / 10),
dateOfBirth.getDate() % 10,
Math.floor((dateOfBirth.getMonth() + 1) / 10),
(dateOfBirth.getMonth() + 1) % 10,
Math.floor((dateOfBirth.getFullYear() % 100) / 10),
dateOfBirth.getFullYear() % 10,
2,
0,
];
var vartalafunc = function (d) {
return (11 -
((d[0] * 3 +
d[1] * 2 +
d[2] * 7 +
d[3] * 6 +
d[4] * 5 +
d[5] * 4 +
d[6] * 3 +
d[7] * 2) %
11));
};
var vartala = vartalafunc(digits);
if (vartala === 11) {
digits.push(0);
}
else if (vartala === 10) {
digits[7] = digits[7] + 1;
digits.push(vartalafunc(digits));
}
else {
digits.push(vartala);
}
digits.push(Math.floor((dateOfBirth.getFullYear() / 100) % 10));
return digits.join('');
}
exports.makeKennitala = makeKennitala;
function clean(kt) {
kt = kt || '';
if (typeof kt === 'number') {
kt = kt.toString();
}
if (kt) {
kt = kt.replace(/(\D)+/g, '');
}
if (kt.length === 9) {
kt = '0' + kt; // Stutt kennitala (eða ólögleg), bætum einu núlli fyrir framan.
}
return kt;
}
exports.clean = clean;
function isValid(kennitala) {
var kt = clean(kennitala);
if (typeof kt !== 'string' || kt.length < 9 || !kt.match(/^[\d\.]/)) {
return false;
}
if (isKerfiskennitala(kt)) {
return true;
}
if (Number(kt.substr(kt.length - 8, 2)) > 13 ||
Number(kt.substr(kt.length - 8, 2)) === 0) {
return false;
}
return isMod11(kt);
}
exports.isValid = isValid;
function isValidDate(kt) {
var stringKt = clean(kt);
var day = Number(stringKt.substring(0, 2));
// if it is company
if (day > 31) {
day = day - 40;
}
var month = Number(stringKt.substring(2, 4));
// Adding the century year
var year = (Number(stringKt.substring(9, 10)) === 0 ? 2000 : 1900) +
Number(stringKt.substring(4, 6));
var date = new Date(year, month - 1, day);
if (Object.prototype.toString.call(date) === '[object Date]') {
// exception for companies that were accidentially registered to illegal dates when the kennitala system was introduced.
if (year === 1969 || year === 1969) {
if (day > 31) {
return false;
}
if (day > 28 && month === 2 && date.getMonth() === 2) {
return true;
}
if (day > 30 &&
((month === 4 && date.getMonth() === 4) ||
(month === 6 && date.getMonth() === 6) ||
(month === 9 && date.getMonth() === 9) ||
(month === 11 && date.getMonth() === 11))) {
return true;
}
}
if (date.getMonth() === month - 1) {
return true;
}
}
return false;
}
exports.isValidDate = isValidDate;
function getBirthdate(kt) {
var stringKt = clean(kt);
var day = Number(stringKt.substring(0, 2));
// if it is company
if (day > 31) {
day = day - 40;
}
var month = Number(stringKt.substring(2, 4));
// Adding the century year
var year = (Number(stringKt.substring(9, 10)) === 0 ? 2000 : 1900) +
Number(stringKt.substring(4, 6));
if (!isValidDate(stringKt)) {
throw new oops_error_1.Oops({
message: 'Invalid date of birth. (kennitala: ' + kt + ')',
category: 'OperationalError',
context: { kt: kt },
});
}
return new Date(year, Number(month) - 1, day);
}
exports.getBirthdate = getBirthdate;
function isCompany(kt) {
var stringKt = clean(kt);
var day = Number(stringKt.substring(0, 2));
return day < 80 && day > 31;
}
exports.isCompany = isCompany;
function getAge(kt, referenceDate) {
referenceDate = referenceDate || new Date();
var ktDate = getBirthdate(kt);
var refYear = referenceDate.getFullYear();
var calcDate = new Date(ktDate);
calcDate.setFullYear(refYear);
var age = refYear - ktDate.getFullYear();
if (calcDate > referenceDate) {
age--;
}
if (age < 0) {
// þjóðskrá some times registers kennitölur with temporary last digits... add 100 to correct negative age outcome
return age + 100;
}
return age < 1
? (referenceDate.getTime() - ktDate.getTime()) /
1000 /
60 /
60 /
24 /
365.2422
: age;
}
exports.getAge = getAge;
function isKennitalaPart(str) {
if (!str) {
return false;
}
var s = str.replace(' ', '').replace('-', '').trim();
return !isNaN(parseInt(s, 10));
}
exports.isKennitalaPart = isKennitalaPart;