@eleva-io/erp-sdk
Version:
SDK oficial para el ERP de Eleva
175 lines • 7.41 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.MAJOR_BANK_ROUTING_NUMBERS = exports.FEDERAL_RESERVE_DISTRICTS = exports.ABA_PATTERNS = void 0;
exports.formatAbaRoutingNumber = formatAbaRoutingNumber;
exports.getFederalReserveDistrict = getFederalReserveDistrict;
exports.getBankInfo = getBankInfo;
exports.isElectronicTransactionRouting = isElectronicTransactionRouting;
exports.isThriftInstitution = isThriftInstitution;
exports.validateAccountNumberABA = validateAccountNumberABA;
exports.validateRoutingNumberABA = validateRoutingNumberABA;
const errors_1 = require("../../../../../errors");
const invalid = (path, message) => errors_1.ElevaError.invalidField({
error: { validation: path, code: 'invalid_string', message, path: [path] },
});
// ABA Routing Number validation patterns and functions
exports.ABA_PATTERNS = {
// Standard ABA routing number format (9 digits)
STANDARD: /^\d{9}$/,
// Valid Federal Reserve routing symbol ranges (first 2 digits)
FEDERAL_RESERVE_RANGES: [
{ min: '01', max: '12', region: 'Primary' },
{ min: '21', max: '32', region: 'Primary' },
{ min: '61', max: '72', region: 'Primary' },
{ min: '80', max: '80', region: 'Special' },
],
};
// Federal Reserve Districts mapping
exports.FEDERAL_RESERVE_DISTRICTS = {
'01': 'Boston',
'02': 'New York',
'03': 'Philadelphia',
'04': 'Cleveland',
'05': 'Richmond',
'06': 'Atlanta',
'07': 'Chicago',
'08': 'St. Louis',
'09': 'Minneapolis',
'10': 'Kansas City',
'11': 'Dallas',
'12': 'San Francisco',
'21': 'Boston (Thrift)',
'22': 'New York (Thrift)',
'23': 'Philadelphia (Thrift)',
'24': 'Cleveland (Thrift)',
'25': 'Richmond (Thrift)',
'26': 'Atlanta (Thrift)',
'27': 'Chicago (Thrift)',
'28': 'St. Louis (Thrift)',
'29': 'Minneapolis (Thrift)',
'30': 'Kansas City (Thrift)',
'31': 'Dallas (Thrift)',
'32': 'San Francisco (Thrift)',
'61': 'Electronic Transactions',
'62': 'Electronic Transactions',
'63': 'Electronic Transactions',
'64': 'Electronic Transactions',
'65': 'Electronic Transactions',
'66': 'Electronic Transactions',
'67': 'Electronic Transactions',
'68': 'Electronic Transactions',
'69': 'Electronic Transactions',
'70': 'Electronic Transactions',
'71': 'Electronic Transactions',
'72': 'Electronic Transactions',
'80': "Traveler's Checks",
};
// Well-known ABA routing numbers for major banks
exports.MAJOR_BANK_ROUTING_NUMBERS = {
// Chase Bank
'021000021': { name: 'JPMorgan Chase Bank', city: 'Tampa', state: 'FL' },
'044000037': { name: 'JPMorgan Chase Bank', city: 'Columbus', state: 'OH' },
'267084131': { name: 'JPMorgan Chase Bank', city: 'San Antonio', state: 'TX' },
// Bank of America
'011401533': { name: 'Bank of America', city: 'Charlotte', state: 'NC' },
'053000196': { name: 'Bank of America', city: 'Charlotte', state: 'NC' },
'026009593': { name: 'Bank of America', city: 'Des Moines', state: 'IA' },
// Wells Fargo
'121000248': { name: 'Wells Fargo Bank', city: 'Minneapolis', state: 'MN' },
'091000019': { name: 'Wells Fargo Bank', city: 'San Francisco', state: 'CA' },
'107002192': { name: 'Wells Fargo Bank', city: 'Charlotte', state: 'NC' },
// Citibank
'021000089': { name: 'Citibank', city: 'New York', state: 'NY' },
'113193532': { name: 'Citibank', city: 'Las Vegas', state: 'NV' },
'271972572': { name: 'Citibank', city: 'San Antonio', state: 'TX' },
// US Bank
'091000022': { name: 'US Bank', city: 'Minneapolis', state: 'MN' },
'123103716': { name: 'US Bank', city: 'Cincinnati', state: 'OH' },
'125000024': { name: 'US Bank', city: 'St. Louis', state: 'MO' },
// PNC Bank
'043000096': { name: 'PNC Bank', city: 'Pittsburgh', state: 'PA' },
'054001725': { name: 'PNC Bank', city: 'Wilmington', state: 'DE' },
'267084199': { name: 'PNC Bank', city: 'Pittsburgh', state: 'PA' },
};
// ABA checksum validation (weighted checksum algorithm)
function validateAbaChecksum(routingNumber) {
// ABA uses a weighted checksum algorithm
// Weights: 3, 7, 1, 3, 7, 1, 3, 7, 1
const weights = [3, 7, 1, 3, 7, 1, 3, 7, 1];
let sum = 0;
for (let i = 0; i < 9; i++) {
sum += parseInt(routingNumber[i]) * weights[i];
}
return sum % 10 === 0;
}
// Check if routing number is in valid Federal Reserve range
function isValidFederalReserveRange(routingNumber) {
const firstTwoDigits = routingNumber.substring(0, 2);
return exports.ABA_PATTERNS.FEDERAL_RESERVE_RANGES.some((range) => {
return firstTwoDigits >= range.min && firstTwoDigits <= range.max;
});
}
function formatAbaRoutingNumber(routingNumber, withDashes = false) {
const cleanRouting = String(routingNumber).replace(/[\s-]/g, '');
if (!withDashes)
return cleanRouting;
if (cleanRouting.length === 9) {
return `${cleanRouting.substring(0, 3)}-${cleanRouting.substring(3, 6)}-${cleanRouting.substring(6, 9)}`;
}
return cleanRouting;
}
function getFederalReserveDistrict(routingNumber) {
const cleanRouting = String(routingNumber).replace(/[\s-]/g, '');
if (cleanRouting.length !== 9)
return null;
const federalReserveSymbol = cleanRouting.substring(0, 2);
return exports.FEDERAL_RESERVE_DISTRICTS[federalReserveSymbol] || null;
}
function getBankInfo(routingNumber) {
const cleanRouting = String(routingNumber).replace(/[\s-]/g, '');
return exports.MAJOR_BANK_ROUTING_NUMBERS[cleanRouting] || null;
}
function isElectronicTransactionRouting(routingNumber) {
const cleanRouting = String(routingNumber).replace(/[\s-]/g, '');
if (cleanRouting.length !== 9)
return false;
const firstTwo = cleanRouting.substring(0, 2);
return firstTwo >= '61' && firstTwo <= '72';
}
function isThriftInstitution(routingNumber) {
const cleanRouting = String(routingNumber).replace(/[\s-]/g, '');
if (cleanRouting.length !== 9)
return false;
const firstTwo = cleanRouting.substring(0, 2);
return firstTwo >= '21' && firstTwo <= '32';
}
function validateAccountNumberABA(accountNumber, path) {
const cleanAccount = String(accountNumber).replace(/[\s-]/g, '');
if (!cleanAccount) {
throw invalid(path, 'Account number is required');
}
// Basic validation - account numbers are typically 6-17 digits
if (!/^\d{6,17}$/.test(cleanAccount)) {
throw invalid(path, 'Invalid account number format. Must be 6-17 digits');
}
}
function validateRoutingNumberABA(routingNumber, path) {
// Convert to string and clean
const cleanRouting = String(routingNumber).replace(/[\s-]/g, '');
if (!cleanRouting) {
throw invalid(path, 'ABA routing number is required');
}
// Check basic format (9 digits)
if (!exports.ABA_PATTERNS.STANDARD.test(cleanRouting)) {
throw invalid(path, 'Invalid ABA routing number format. Must be exactly 9 digits');
}
// Check Federal Reserve range
if (!isValidFederalReserveRange(cleanRouting)) {
throw invalid(path, 'Invalid Federal Reserve routing symbol range');
}
// Validate checksum
if (!validateAbaChecksum(cleanRouting)) {
throw invalid(path, 'Invalid ABA routing number checksum');
}
}
//# sourceMappingURL=aba.js.map