ibankit
Version:
Validation, field extraction and creation of IBAN, BBAN, BIC numbers
97 lines • 8.32 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.validate = exports.hasBranchCode = exports.getBranchCode = exports.getLocationCode = exports.getCountryCode = exports.getBankCode = void 0;
const exceptions_1 = require("./exceptions");
const country_1 = require("./country");
const BIC8_LENGTH = 8;
const BIC11_LENGTH = 11;
const BANK_CODE_INDEX = 0;
const BANK_CODE_LENGTH = 4;
const COUNTRY_CODE_INDEX = BANK_CODE_INDEX + BANK_CODE_LENGTH;
const COUNTRY_CODE_LENGTH = 2;
const LOCATION_CODE_INDEX = COUNTRY_CODE_INDEX + COUNTRY_CODE_LENGTH;
const LOCATION_CODE_LENGTH = 2;
const BRANCH_CODE_INDEX = LOCATION_CODE_INDEX + LOCATION_CODE_LENGTH;
const BRANCH_CODE_LENGTH = 3;
const ucRegex = /^[A-Z]+$/;
const ucnumRegex = /^[A-Z0-9]+$/;
function getBankCode(bic) {
return bic.substring(BANK_CODE_INDEX, BANK_CODE_INDEX + BANK_CODE_LENGTH);
}
exports.getBankCode = getBankCode;
function getCountryCode(bic) {
return bic.substring(COUNTRY_CODE_INDEX, COUNTRY_CODE_INDEX + COUNTRY_CODE_LENGTH);
}
exports.getCountryCode = getCountryCode;
function getLocationCode(bic) {
return bic.substring(LOCATION_CODE_INDEX, LOCATION_CODE_INDEX + LOCATION_CODE_LENGTH);
}
exports.getLocationCode = getLocationCode;
function getBranchCode(bic) {
return bic.substring(BRANCH_CODE_INDEX, BRANCH_CODE_INDEX + BRANCH_CODE_LENGTH);
}
exports.getBranchCode = getBranchCode;
function hasBranchCode(bic) {
return bic.length === BIC11_LENGTH;
}
exports.hasBranchCode = hasBranchCode;
function validateEmpty(bic) {
if (bic == null) {
throw new exceptions_1.FormatException(exceptions_1.FormatViolation.NOT_NULL, "Null can't be a valid Bic.");
}
if (bic.length === 0) {
throw new exceptions_1.FormatException(exceptions_1.FormatViolation.NOT_EMPTY, "Empty string can't be a valid Bic.");
}
}
function validateLength(bic) {
if (bic.length !== BIC8_LENGTH && bic.length !== BIC11_LENGTH) {
throw new exceptions_1.FormatException(exceptions_1.FormatViolation.BIC_LENGTH_8_OR_11, `Bic length must be ${BIC8_LENGTH} or ${BIC11_LENGTH}`);
}
}
function validateCase(bic) {
if (bic !== bic.toUpperCase()) {
throw new exceptions_1.FormatException(exceptions_1.FormatViolation.BIC_ONLY_UPPER_CASE_LETTERS, "Bic must contain only upper case letters.");
}
}
function validateBankCode(bic) {
const bankCode = getBankCode(bic);
if (!ucnumRegex.test(bankCode)) {
throw new exceptions_1.FormatException(exceptions_1.FormatViolation.BANK_CODE_ONLY_LETTERS, "Bank code must contain only letters or digits.", bankCode);
}
}
function validateCountryCode(bic) {
const countryCode = getCountryCode(bic).trim();
if (countryCode.length < COUNTRY_CODE_LENGTH ||
countryCode !== countryCode.toUpperCase() ||
!ucRegex.test(countryCode)) {
throw new exceptions_1.FormatException(exceptions_1.FormatViolation.COUNTRY_CODE_ONLY_UPPER_CASE_LETTERS, "Bic country code must contain upper case letters", countryCode);
}
if ((0, country_1.countryByCode)(countryCode) == null) {
throw new exceptions_1.UnsupportedCountryException("Country code is not supported.", countryCode);
}
}
function validateLocationCode(bic) {
const locationCode = getLocationCode(bic);
if (!ucnumRegex.test(locationCode)) {
throw new exceptions_1.FormatException(exceptions_1.FormatViolation.LOCATION_CODE_ONLY_LETTERS_OR_DIGITS, "Location code must contain only letters or digits.", locationCode);
}
}
function validateBranchCode(bic) {
const branchCode = getBranchCode(bic);
if (!ucnumRegex.test(branchCode)) {
throw new exceptions_1.FormatException(exceptions_1.FormatViolation.BRANCH_CODE_ONLY_LETTERS_OR_DIGITS, "Branch code must contain only letters or digits.", branchCode);
}
}
function validate(bic) {
validateEmpty(bic);
validateLength(bic);
validateCase(bic);
validateBankCode(bic);
validateCountryCode(bic);
validateLocationCode(bic);
if (hasBranchCode(bic)) {
validateBranchCode(bic);
}
}
exports.validate = validate;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmljVXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaWNVdGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUE2RjtBQUM3Rix1Q0FBMEM7QUFFMUMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFDO0FBQ3RCLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQztBQUV4QixNQUFNLGVBQWUsR0FBRyxDQUFDLENBQUM7QUFDMUIsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7QUFDM0IsTUFBTSxrQkFBa0IsR0FBRyxlQUFlLEdBQUcsZ0JBQWdCLENBQUM7QUFDOUQsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLENBQUM7QUFDOUIsTUFBTSxtQkFBbUIsR0FBRyxrQkFBa0IsR0FBRyxtQkFBbUIsQ0FBQztBQUNyRSxNQUFNLG9CQUFvQixHQUFHLENBQUMsQ0FBQztBQUMvQixNQUFNLGlCQUFpQixHQUFHLG1CQUFtQixHQUFHLG9CQUFvQixDQUFDO0FBQ3JFLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO0FBRTdCLE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQztBQUMzQixNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUM7QUFFakMsU0FBZ0IsV0FBVyxDQUFDLEdBQVc7SUFDckMsT0FBTyxHQUFHLENBQUMsU0FBUyxDQUFDLGVBQWUsRUFBRSxlQUFlLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQztBQUM1RSxDQUFDO0FBRkQsa0NBRUM7QUFFRCxTQUFnQixjQUFjLENBQUMsR0FBVztJQUN4QyxPQUFPLEdBQUcsQ0FBQyxTQUFTLENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCLEdBQUcsbUJBQW1CLENBQUMsQ0FBQztBQUNyRixDQUFDO0FBRkQsd0NBRUM7QUFFRCxTQUFnQixlQUFlLENBQUMsR0FBVztJQUN6QyxPQUFPLEdBQUcsQ0FBQyxTQUFTLENBQUMsbUJBQW1CLEVBQUUsbUJBQW1CLEdBQUcsb0JBQW9CLENBQUMsQ0FBQztBQUN4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
;