Source: norwegian-numbers.js

"use strict";
/**
 * Make and verify official Norwegian numbers like:
 * KID-nummer, organisasjonsnummer, fødselsnummer, kontonummer
 * @module norwegian-numbers
 */
Object.defineProperty(exports, "__esModule", { value: true });
var INVALID_CONTROL_DIGIT = 'Rejected due to invalid control digit.';
/**
 * Makes a KID-number in either MOD10 or MOD11.
 * Valid input lengths are from 1 to 24 characters, inclusive.
 * The output length will be one character longer.
 * @param {string} value The value to make the KID-number based on
 * @param {string} mode MOD10 (default) or MOD11
 * @returns {string} The resulting KID-number
 * @throws Error If invalid length, non-integer or invalid mode
 */
function makeKidNumber(value, mode) {
    if (mode === void 0) { mode = 'MOD10'; }
    validateLength(value, 1, 24);
    validateInteger(value);
    if (mode.toUpperCase() === 'MOD10') {
        var controlDigit = makeMod10ControlDigit(value);
        return value + String(controlDigit);
    }
    else if (mode.toUpperCase() === 'MOD11') {
        var controlDigit = makeMod11ControlDigit(value);
        return value + String(controlDigit);
    }
    else {
        throw Error("Invalid mode \"" + mode + "\".");
    }
}
exports.makeKidNumber = makeKidNumber;
/**
 * Verifies a KID-number in either MOD10 or MOD11.
 * @param {string} value The KID-number value to verify
 * @param {string} mode MOD10 (default) or MOD11
 * @returns {boolean} If the value is a valid KID-number or not
 */
function verifyKidNumber(value, mode) {
    if (mode === void 0) { mode = 'MOD10'; }
    try {
        return value === makeKidNumber(value.substring(0, value.length - 1), mode);
    }
    catch (err) {
        return false;
    }
}
exports.verifyKidNumber = verifyKidNumber;
/**
 * Makes a birth number.
 * Valid input length is 9 characters.
 * The output length will be 11 character.
 * @param {string} value The value to make the birth number based on
 * @returns {string} The resulting birth number
 * @throws Error If invalid length, non-integer or illegal control digits
 */
function makeBirthNumber(value) {
    validateLength(value, 9, 9);
    validateInteger(value);
    var firstControlDigit = makeMod11ControlDigit(value, [2, 5, 4, 9, 8, 1, 6, 7, 3]);
    var secondControlDigit = makeMod11ControlDigit(value + String(firstControlDigit));
    validateInteger(String(firstControlDigit), INVALID_CONTROL_DIGIT);
    validateInteger(String(secondControlDigit), INVALID_CONTROL_DIGIT);
    return value + String(firstControlDigit) + String(secondControlDigit);
}
exports.makeBirthNumber = makeBirthNumber;
/**
 * Verifies a birth number.
 * @param {string} value The birth number value to verify
 * @returns {boolean} If the value is a valid birth number or not
 */
function verifyBirthNumber(value) {
    try {
        return value === makeBirthNumber(value.substring(0, value.length - 2));
    }
    catch (err) {
        return false;
    }
}
exports.verifyBirthNumber = verifyBirthNumber;
/**
 * Makes an account number.
 * Valid input length is 10 characters.
 * The output length will be 11 character.
 * @param {string} value The value to make the account number based on
 * @returns {string} The resulting account number
 * @throws Error If invalid length, non-integer or illegal control digits
 */
function makeAccountNumber(value) {
    validateLength(value, 10, 10);
    validateInteger(value);
    var controlDigit = makeMod11ControlDigit(value);
    validateInteger(String(controlDigit), INVALID_CONTROL_DIGIT);
    return value + String(controlDigit);
}
exports.makeAccountNumber = makeAccountNumber;
/**
 * Verifies an account number.
 * @param {string} value The account number value to verify
 * @returns {boolean} If the value is a valid account number or not
 */
function verifyAccountNumber(value) {
    try {
        return value === makeAccountNumber(value.substring(0, value.length - 1));
    }
    catch (err) {
        return false;
    }
}
exports.verifyAccountNumber = verifyAccountNumber;
/**
 * Makes an organisation number.
 * Valid input length is 8 characters.
 * The output length will be 9 character.
 * @param {string} value The value to make the organisation number based on
 * @returns {string} The resulting organisation number
 * @throws Error If invalid length, non-integer or illegal control digits
 */
function makeOrganisationNumber(value) {
    validateLength(value, 8, 8);
    validateInteger(value);
    var controlDigit = makeMod11ControlDigit(value);
    validateInteger(String(controlDigit), INVALID_CONTROL_DIGIT);
    return value + String(controlDigit);
}
exports.makeOrganisationNumber = makeOrganisationNumber;
/**
 * Verifies an organisation number.
 * @param {string} value The organisation number value to verify
 * @returns {boolean} If the value is a valid organisation number or not
 */
function verifyOrganisationNumber(value) {
    try {
        return value === makeOrganisationNumber(value.substring(0, value.length - 1));
    }
    catch (err) {
        return false;
    }
}
exports.verifyOrganisationNumber = verifyOrganisationNumber;
function makeMod10ControlDigit(value, multiplicands) {
    if (multiplicands === void 0) { multiplicands = [2, 1]; }
    var control = 10 - (multiplyDigitsByWeight(value, multiplicands, sumOfDigits) % 10);
    if (control == 10) {
        return 0;
    }
    return control;
}
function makeMod11ControlDigit(value, multiplicands) {
    if (multiplicands === void 0) { multiplicands = [2, 3, 4, 5, 6, 7]; }
    var control = 11 - (multiplyDigitsByWeight(value, multiplicands, doNothing) % 11);
    if (control == 11) {
        return 0;
    }
    if (control == 10) {
        return '-';
    }
    return control;
}
// While this could be made more dense, maybe this has some hope of being readable
function multiplyDigitsByWeight(value, multiplicands, operation) {
    var number = parseInt(value);
    var digits = String(number).split('');
    var index = 0;
    var total = 0;
    for (var i = digits.length - 1; i >= 0; i--) {
        var digit = digits[i];
        var multiplicand = multiplicands[index % multiplicands.length];
        var result = parseInt(digit) * multiplicand;
        total += operation(result);
        index += 1;
    }
    return total;
}
// https://stackoverflow.com/a/10834843
function validateInteger(value, errorMessage) {
    if (errorMessage === void 0) { errorMessage = "Value \"" + value + "\" was not an integer."; }
    var result = /^[0-9]+$/.test(value);
    if (!result) {
        throw new Error(errorMessage);
    }
}
function validateLength(value, min, max) {
    if (value.length < min || value.length > max) {
        throw new Error("Invalid value length for \"" + value + "\". Must be from " + min + " to " + max + " characters, inclusive.");
    }
}
// https://stackoverflow.com/a/14940026
function sumOfDigits(n) {
    var r = 0;
    while (n > 0) {
        r += n % 10;
        n = Math.floor(n / 10);
    }
    return r;
}
function doNothing(n) {
    return n;
}