353 lines
9.8 KiB
JavaScript
353 lines
9.8 KiB
JavaScript
/**
|
|
* @namespace faker.finance
|
|
*/
|
|
var Finance = function (faker) {
|
|
var ibanLib = require("./iban");
|
|
var Helpers = faker.helpers,
|
|
self = this;
|
|
|
|
/**
|
|
* account
|
|
*
|
|
* @method faker.finance.account
|
|
* @param {number} length
|
|
*/
|
|
self.account = function (length) {
|
|
|
|
length = length || 8;
|
|
|
|
var template = '';
|
|
|
|
for (var i = 0; i < length; i++) {
|
|
template = template + '#';
|
|
}
|
|
length = null;
|
|
return Helpers.replaceSymbolWithNumber(template);
|
|
};
|
|
|
|
/**
|
|
* accountName
|
|
*
|
|
* @method faker.finance.accountName
|
|
*/
|
|
self.accountName = function () {
|
|
|
|
return [Helpers.randomize(faker.definitions.finance.account_type), 'Account'].join(' ');
|
|
};
|
|
|
|
/**
|
|
* routingNumber
|
|
*
|
|
* @method faker.finance.routingNumber
|
|
*/
|
|
self.routingNumber = function () {
|
|
|
|
var routingNumber = Helpers.replaceSymbolWithNumber('########');
|
|
|
|
// Modules 10 straight summation.
|
|
var sum = 0;
|
|
|
|
for (var i = 0; i < routingNumber.length; i += 3) {
|
|
sum += Number(routingNumber[i]) * 3;
|
|
sum += Number(routingNumber[i + 1]) * 7;
|
|
sum += Number(routingNumber[i + 2]) || 0;
|
|
}
|
|
|
|
return routingNumber + (Math.ceil(sum / 10) * 10 - sum);
|
|
}
|
|
|
|
/**
|
|
* mask
|
|
*
|
|
* @method faker.finance.mask
|
|
* @param {number} length
|
|
* @param {boolean} parens
|
|
* @param {boolean} ellipsis
|
|
*/
|
|
self.mask = function (length, parens, ellipsis) {
|
|
|
|
//set defaults
|
|
length = (length == 0 || !length || typeof length == 'undefined') ? 4 : length;
|
|
parens = (parens === null) ? true : parens;
|
|
ellipsis = (ellipsis === null) ? true : ellipsis;
|
|
|
|
//create a template for length
|
|
var template = '';
|
|
|
|
for (var i = 0; i < length; i++) {
|
|
template = template + '#';
|
|
}
|
|
|
|
//prefix with ellipsis
|
|
template = (ellipsis) ? ['...', template].join('') : template;
|
|
|
|
template = (parens) ? ['(', template, ')'].join('') : template;
|
|
|
|
//generate random numbers
|
|
template = Helpers.replaceSymbolWithNumber(template);
|
|
|
|
return template;
|
|
};
|
|
|
|
//min and max take in minimum and maximum amounts, dec is the decimal place you want rounded to, symbol is $, €, £, etc
|
|
//NOTE: this returns a string representation of the value, if you want a number use parseFloat and no symbol
|
|
|
|
/**
|
|
* amount
|
|
*
|
|
* @method faker.finance.amount
|
|
* @param {number} min
|
|
* @param {number} max
|
|
* @param {number} dec
|
|
* @param {string} symbol
|
|
*
|
|
* @return {string}
|
|
*/
|
|
self.amount = function (min, max, dec, symbol, autoFormat) {
|
|
|
|
min = min || 0;
|
|
max = max || 1000;
|
|
dec = dec === undefined ? 2 : dec;
|
|
symbol = symbol || '';
|
|
const randValue = faker.datatype.number({ max: max, min: min, precision: Math.pow(10, -dec) });
|
|
|
|
var formattedString;
|
|
if(autoFormat) {
|
|
formattedString = randValue.toLocaleString(undefined, {minimumFractionDigits: dec});
|
|
}
|
|
else {
|
|
formattedString = randValue.toFixed(dec);
|
|
}
|
|
|
|
return symbol + formattedString;
|
|
};
|
|
|
|
/**
|
|
* transactionType
|
|
*
|
|
* @method faker.finance.transactionType
|
|
*/
|
|
self.transactionType = function () {
|
|
return Helpers.randomize(faker.definitions.finance.transaction_type);
|
|
};
|
|
|
|
/**
|
|
* currencyCode
|
|
*
|
|
* @method faker.finance.currencyCode
|
|
*/
|
|
self.currencyCode = function () {
|
|
return faker.random.objectElement(faker.definitions.finance.currency)['code'];
|
|
};
|
|
|
|
/**
|
|
* currencyName
|
|
*
|
|
* @method faker.finance.currencyName
|
|
*/
|
|
self.currencyName = function () {
|
|
return faker.random.objectElement(faker.definitions.finance.currency, 'key');
|
|
};
|
|
|
|
/**
|
|
* currencySymbol
|
|
*
|
|
* @method faker.finance.currencySymbol
|
|
*/
|
|
self.currencySymbol = function () {
|
|
var symbol;
|
|
|
|
while (!symbol) {
|
|
symbol = faker.random.objectElement(faker.definitions.finance.currency)['symbol'];
|
|
}
|
|
return symbol;
|
|
};
|
|
|
|
/**
|
|
* bitcoinAddress
|
|
*
|
|
* @method faker.finance.bitcoinAddress
|
|
*/
|
|
self.bitcoinAddress = function () {
|
|
var addressLength = faker.datatype.number({ min: 25, max: 34 });
|
|
|
|
var address = faker.random.arrayElement(['1', '3']);
|
|
|
|
for (var i = 0; i < addressLength - 1; i++)
|
|
address += faker.random.arrayElement('123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'.split(''));
|
|
|
|
return address;
|
|
}
|
|
|
|
/**
|
|
* litecoinAddress
|
|
*
|
|
* @method faker.finance.litecoinAddress
|
|
*/
|
|
self.litecoinAddress = function () {
|
|
var addressLength = faker.datatype.number({ min: 26, max: 33 });
|
|
|
|
var address = faker.random.arrayElement(['L', 'M', '3']);
|
|
|
|
for (var i = 0; i < addressLength - 1; i++)
|
|
address += faker.random.arrayElement('123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'.split(''));
|
|
|
|
return address;
|
|
}
|
|
|
|
/**
|
|
* Credit card number
|
|
* @method faker.finance.creditCardNumber
|
|
* @param {string} provider | scheme
|
|
*/
|
|
self.creditCardNumber = function(provider){
|
|
provider = provider || "";
|
|
var format, formats;
|
|
var localeFormat = faker.definitions.finance.credit_card;
|
|
if (provider in localeFormat) {
|
|
formats = localeFormat[provider]; // there chould be multiple formats
|
|
if (typeof formats === "string") {
|
|
format = formats;
|
|
} else {
|
|
format = faker.random.arrayElement(formats);
|
|
}
|
|
} else if (provider.match(/#/)) { // The user chose an optional scheme
|
|
format = provider;
|
|
} else { // Choose a random provider
|
|
if (typeof localeFormat === 'string') {
|
|
format = localeFormat;
|
|
} else if( typeof localeFormat === "object") {
|
|
// Credit cards are in a object structure
|
|
formats = faker.random.objectElement(localeFormat, "value"); // There chould be multiple formats
|
|
if (typeof formats === "string") {
|
|
format = formats;
|
|
} else {
|
|
format = faker.random.arrayElement(formats);
|
|
}
|
|
}
|
|
}
|
|
format = format.replace(/\//g,"")
|
|
return Helpers.replaceCreditCardSymbols(format);
|
|
};
|
|
/**
|
|
* Credit card CVV
|
|
* @method faker.finance.creditCardCVV
|
|
*/
|
|
self.creditCardCVV = function() {
|
|
var cvv = "";
|
|
for (var i = 0; i < 3; i++) {
|
|
cvv += faker.datatype.number({max:9}).toString();
|
|
}
|
|
return cvv;
|
|
};
|
|
|
|
/**
|
|
* ethereumAddress
|
|
*
|
|
* @method faker.finance.ethereumAddress
|
|
*/
|
|
self.ethereumAddress = function () {
|
|
var address = faker.datatype.hexaDecimal(40).toLowerCase();
|
|
return address;
|
|
};
|
|
|
|
/**
|
|
* iban
|
|
*
|
|
* @param {boolean} [formatted=false] - Return a formatted version of the generated IBAN.
|
|
* @param {string} [countryCode] - The country code from which you want to generate an IBAN, if none is provided a random country will be used.
|
|
* @throws Will throw an error if the passed country code is not supported.
|
|
*
|
|
* @method faker.finance.iban
|
|
*/
|
|
self.iban = function (formatted, countryCode) {
|
|
var ibanFormat;
|
|
if (countryCode) {
|
|
var findFormat = function(currentFormat) { return currentFormat.country === countryCode; };
|
|
ibanFormat = ibanLib.formats.find(findFormat);
|
|
} else {
|
|
ibanFormat = faker.random.arrayElement(ibanLib.formats);
|
|
}
|
|
|
|
if (!ibanFormat) {
|
|
throw new Error('Country code ' + countryCode + ' not supported.');
|
|
}
|
|
|
|
var s = "";
|
|
var count = 0;
|
|
for (var b = 0; b < ibanFormat.bban.length; b++) {
|
|
var bban = ibanFormat.bban[b];
|
|
var c = bban.count;
|
|
count += bban.count;
|
|
while (c > 0) {
|
|
if (bban.type == "a") {
|
|
s += faker.random.arrayElement(ibanLib.alpha);
|
|
} else if (bban.type == "c") {
|
|
if (faker.datatype.number(100) < 80) {
|
|
s += faker.datatype.number(9);
|
|
} else {
|
|
s += faker.random.arrayElement(ibanLib.alpha);
|
|
}
|
|
} else {
|
|
if (c >= 3 && faker.datatype.number(100) < 30) {
|
|
if (faker.datatype.boolean()) {
|
|
s += faker.random.arrayElement(ibanLib.pattern100);
|
|
c -= 2;
|
|
} else {
|
|
s += faker.random.arrayElement(ibanLib.pattern10);
|
|
c--;
|
|
}
|
|
} else {
|
|
s += faker.datatype.number(9);
|
|
}
|
|
}
|
|
c--;
|
|
}
|
|
s = s.substring(0, count);
|
|
}
|
|
var checksum = 98 - ibanLib.mod97(ibanLib.toDigitString(s + ibanFormat.country + "00"));
|
|
if (checksum < 10) {
|
|
checksum = "0" + checksum;
|
|
}
|
|
var iban = ibanFormat.country + checksum + s;
|
|
return formatted ? iban.match(/.{1,4}/g).join(" ") : iban;
|
|
};
|
|
|
|
/**
|
|
* bic
|
|
*
|
|
* @method faker.finance.bic
|
|
*/
|
|
self.bic = function () {
|
|
var vowels = ["A", "E", "I", "O", "U"];
|
|
var prob = faker.datatype.number(100);
|
|
return Helpers.replaceSymbols("???") +
|
|
faker.random.arrayElement(vowels) +
|
|
faker.random.arrayElement(ibanLib.iso3166) +
|
|
Helpers.replaceSymbols("?") + "1" +
|
|
(prob < 10 ?
|
|
Helpers.replaceSymbols("?" + faker.random.arrayElement(vowels) + "?") :
|
|
prob < 40 ?
|
|
Helpers.replaceSymbols("###") : "");
|
|
};
|
|
|
|
/**
|
|
* description
|
|
*
|
|
* @method faker.finance.transactionDescription
|
|
*/
|
|
self.transactionDescription = function() {
|
|
var transaction = Helpers.createTransaction();
|
|
var account = transaction.account;
|
|
var amount = transaction.amount;
|
|
var transactionType = transaction.type;
|
|
var company = transaction.business;
|
|
var card = faker.finance.mask();
|
|
var currency = faker.finance.currencyCode();
|
|
return transactionType + " transaction at " + company + " using card ending with ***" + card + " for " + currency + " " + amount + " in account ***" + account
|
|
};
|
|
|
|
};
|
|
|
|
module['exports'] = Finance;
|