ibankit
Version:
Validation, field extraction and creation of IBAN, BBAN, BIC numbers
226 lines • 18.4 kB
JavaScript
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.IBANBuilder = void 0;
const ibanUtil = __importStar(require("./ibanUtil"));
const bbanStructure_1 = require("./bbanStructure");
const structurePart_1 = require("./structurePart");
const randInt_1 = require("./randInt");
const exceptions_1 = require("./exceptions");
const iban_1 = require("./iban");
class IBANBuilder {
countryCode(countryCode) {
this.countryCodeValue = countryCode;
return this;
}
bankCode(bankCode) {
this.bankCodeValue = bankCode;
return this;
}
branchCode(branchCode) {
this.branchCodeValue = branchCode;
return this;
}
accountNumber(accountNumber) {
this.accountNumberValue = accountNumber;
return this;
}
nationalCheckDigit(nationalCheckDigit) {
this.nationalCheckDigitValue = nationalCheckDigit;
return this;
}
branchCheckDigit(branchCheckDigit) {
this.branchCheckDigitValue = branchCheckDigit;
return this;
}
accountType(accountType) {
this.accountTypeValue = accountType;
return this;
}
ownerAccountType(ownerAccountType) {
this.ownerAccountTypeValue = ownerAccountType;
return this;
}
identificationNumber(identificationNumber) {
this.identificationNumberValue = identificationNumber;
return this;
}
build(fillRandom = true, validate = true) {
if (fillRandom && this.countryCodeValue == null) {
const countryCodes = bbanStructure_1.BbanStructure.supportedCountries();
this.countryCodeValue = countryCodes[(0, randInt_1.randInt)(countryCodes.length)];
}
const structure = bbanStructure_1.BbanStructure.forCountry(this.countryCodeValue);
if (structure === null) {
throw new Error("shouldn't happen");
}
this.fillMissingFieldsRandomly(fillRandom);
const formattedIban = this.formatIban();
const checkDigit = ibanUtil.calculateCheckDigit(formattedIban);
const ibanValue = ibanUtil.replaceCheckDigit(formattedIban, checkDigit);
if (validate) {
ibanUtil.validate(ibanValue);
}
return new iban_1.IBAN(ibanValue);
}
formatBban() {
const parts = [];
const structure = bbanStructure_1.BbanStructure.forCountry(this.countryCodeValue);
if (structure === null) {
throw new exceptions_1.UnsupportedCountryException("Country code is not supported.", this.countryCodeValue);
}
for (const part of structure.getParts()) {
switch (part.getPartType()) {
case structurePart_1.PartType.BANK_CODE:
if (typeof this.bankCodeValue === "string") {
parts.push(this.bankCodeValue);
}
break;
case structurePart_1.PartType.BRANCH_CODE:
if (typeof this.branchCodeValue === "string") {
parts.push(this.branchCodeValue);
}
break;
case structurePart_1.PartType.BRANCH_CHECK_DIGIT:
if (typeof this.branchCheckDigitValue === "string") {
parts.push(this.branchCheckDigitValue);
}
break;
case structurePart_1.PartType.ACCOUNT_NUMBER:
if (typeof this.accountNumberValue === "string") {
parts.push(this.accountNumberValue);
}
break;
case structurePart_1.PartType.NATIONAL_CHECK_DIGIT:
if (typeof this.nationalCheckDigitValue === "string") {
parts.push(this.nationalCheckDigitValue);
}
break;
case structurePart_1.PartType.ACCOUNT_TYPE:
if (typeof this.accountTypeValue === "string") {
parts.push(this.accountTypeValue);
}
break;
case structurePart_1.PartType.OWNER_ACCOUNT_NUMBER:
if (typeof this.ownerAccountTypeValue === "string") {
parts.push(this.ownerAccountTypeValue);
}
break;
case structurePart_1.PartType.IDENTIFICATION_NUMBER:
if (typeof this.identificationNumberValue === "string") {
parts.push(this.identificationNumberValue);
}
break;
}
}
return parts.join("");
}
formatIban() {
return `${this.countryCodeValue}${ibanUtil.DEFAULT_CHECK_DIGIT}${this.formatBban()}`;
}
fillMissingFieldsRandomly(fillRandom) {
const structure = bbanStructure_1.BbanStructure.forCountry(this.countryCodeValue);
if (structure == null) {
throw new exceptions_1.UnsupportedCountryException("Country code is not supported.", this.countryCodeValue);
}
let needCheckDigit = false;
for (const entry of structure.getParts()) {
switch (entry.getPartType()) {
case structurePart_1.PartType.BANK_CODE:
if (!this.bankCodeValue) {
this.bankCodeValue = entry.generate("", structure);
}
else if (!fillRandom) {
throw new exceptions_1.FormatException(exceptions_1.FormatViolation.NOT_NULL, "bankCode is required; it cannot be null");
}
break;
case structurePart_1.PartType.BRANCH_CODE:
if (!this.branchCodeValue) {
this.branchCodeValue = entry.generate("", structure);
}
else if (!fillRandom) {
throw new exceptions_1.FormatException(exceptions_1.FormatViolation.NOT_NULL, "branchCode is required; it cannot be null");
}
break;
case structurePart_1.PartType.BRANCH_CHECK_DIGIT:
if (!this.branchCheckDigitValue) {
this.branchCheckDigitValue = entry.generate("", structure);
}
else if (!fillRandom) {
throw new exceptions_1.FormatException(exceptions_1.FormatViolation.NOT_NULL, "branchCheckDigit is required; it cannot be null");
}
break;
case structurePart_1.PartType.ACCOUNT_NUMBER:
if (!this.accountNumberValue) {
this.accountNumberValue = entry.generate("", structure);
}
else if (!fillRandom) {
throw new exceptions_1.FormatException(exceptions_1.FormatViolation.NOT_NULL, "accountNumber is required; it cannot be null");
}
break;
case structurePart_1.PartType.NATIONAL_CHECK_DIGIT:
if (!this.nationalCheckDigitValue) {
needCheckDigit = true;
this.nationalCheckDigitValue = "".padStart(entry.getLength(), "0");
}
break;
case structurePart_1.PartType.ACCOUNT_TYPE:
if (!this.accountTypeValue) {
this.accountTypeValue = entry.generate("", structure);
}
else if (!fillRandom) {
throw new exceptions_1.FormatException(exceptions_1.FormatViolation.NOT_NULL, "accountType is required; it cannot be null");
}
break;
case structurePart_1.PartType.OWNER_ACCOUNT_NUMBER:
if (!this.ownerAccountTypeValue) {
this.ownerAccountTypeValue = entry.generate("", structure);
}
else if (!fillRandom) {
throw new exceptions_1.FormatException(exceptions_1.FormatViolation.NOT_NULL, "ownerAccountType is required; it cannot be null");
}
break;
case structurePart_1.PartType.IDENTIFICATION_NUMBER:
if (!this.identificationNumberValue) {
this.identificationNumberValue = entry.generate("", structure);
}
else if (!fillRandom) {
throw new exceptions_1.FormatException(exceptions_1.FormatViolation.NOT_NULL, "indentificationNumber is required; it cannot be null");
}
break;
}
}
if (needCheckDigit) {
for (const entry of structure.getParts()) {
if (entry.getPartType() === structurePart_1.PartType.NATIONAL_CHECK_DIGIT) {
const bban = this.formatBban();
this.nationalCheckDigitValue = entry.generate(bban, structure);
}
}
}
}
}
exports.IBANBuilder = IBANBuilder;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWJhbkJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaWJhbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxxREFBdUM7QUFDdkMsbURBQWdEO0FBQ2hELG1EQUEyQztBQUUzQyx1Q0FBb0M7QUFDcEMsNkNBQTZGO0FBQzdGLGlDQUE4QjtBQUs5QixNQUFhLFdBQVc7SUE4QnRCLFdBQVcsQ0FBQyxXQUF3QjtRQUNsQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsV0FBVyxDQUFDO1FBQ3BDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQVFELFFBQVEsQ0FBQyxRQUFnQjtRQUN2QixJQUFJLENBQUMsYUFBYSxHQUFHLFFBQVEsQ0FBQztRQUM5QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFRRCxVQUFVLENBQUMsVUFBa0I7UUFDM0IsSUFBSSxDQUFDLGVBQWUsR0FBRyxVQUFVLENBQUM7UUFDbEMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBUUQsYUFBYSxDQUFDLGFBQXFCO1FBQ2pDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxhQUFhLENBQUM7UUFDeEMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBUUQsa0JBQWtCLENBQUMsa0JBQTBCO1FBQzNDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxrQkFBa0IsQ0FBQztRQUNsRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFRRCxnQkFBZ0IsQ0FBQyxnQkFBd0I7UUFDdkMsSUFBSSxDQUFDLHFCQUFxQixHQUFHLGdCQUFnQixDQUFDO1FBQzlDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQVFELFdBQVcsQ0FBQyxXQUFtQjtRQUM3QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsV0FBVyxDQUFDO1FBQ3BDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQVFELGdCQUFnQixDQUFDLGdCQUF3QjtRQUN2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