UNPKG

@eleva-io/erp-sdk

Version:

SDK oficial para el ERP de Eleva

175 lines 7.41 kB
"use strict"; 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