UNPKG

shaba

Version:

JavaScript utilities to validate Iranian bank cards and IBAN (Sheba) codes, convert Persian numerals, and detect bank info.

136 lines (123 loc) 6.93 kB
/** * shaba.js * Utility functions for validating Iranian card numbers and IBAN (Sheba) codes, * and identifying banks based on card prefix or Shaba bank code. * By SMH Abedy * Note: 'shaba' is an incorrect spelling of 'sheba'. */ (function (global) { const shaba = { convertPersianToEnglishDigits(str) { const persian = ["۰", "۱", "۲", "۳", "۴", "۵", "۶", "۷", "۸", "۹"]; const arabic = ["٠", "١", "٢", "٣", "٤", "٥", "٦", "٧", "٨", "٩"]; const english = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]; for (let i = 0; i < 10; i++) { str = str.replace(new RegExp(persian[i], 'g'), english[i]) .replace(new RegExp(arabic[i], 'g'), english[i]); } return str; }, iso13616Prepare(iban) { iban = "IR" + iban iban = iban.toUpperCase(); iban = iban.slice(4) + iban.slice(0, 4); return iban.split('').map(char => { const code = char.charCodeAt(0); return code >= 65 && code <= 90 ? (code - 55).toString() : char; }).join(''); }, iso7064Mod97_10(preparedIban) { let remainder = preparedIban; while (remainder.length > 2) { const block = remainder.slice(0, 9); remainder = parseInt(block, 10) % 97 + remainder.slice(block.length); } return parseInt(remainder, 10) % 97; }, validateCard(cardNumber) { cardNumber = shaba.convertPersianToEnglishDigits(cardNumber); if (!/^\d{16}$/.test(cardNumber)) return false; const digits = cardNumber.split('').map(Number); const checkSum = digits.reduce((sum, digit, index) => { let num = digit * (index % 2 === 0 ? 2 : 1); return sum + (num > 9 ? num - 9 : num); }, 0); return checkSum % 10 === 0; }, getBankFromCard(prefix) { const map = { '636795': ["markazi", "636795", "بانک مرکزی"], '603799': ["meli", "603799", "بانک ملی"], '589210': ["sepah", "589210", "بانک سپه"], '627961': ["sanatmadan", "627961", "بانک صنعت و معدن"], '603770': ["keshavarsi", "603770", "بانک کشاورزی"], '628023': ["maskan", "628023", "بانک مسکن"], '627760': ["postbank", "627760", "پست بانک"], '502908': ["tosehe", "502908", "بانک توسعه"], '627412': ["eghtesad", "627412", "بانک اقتصاد"], '622106': ["parsian", "622106", "بانک پارسیان"], '502229': ["pasargad", "502229", "بانک پاسارگاد"], '627488': ["karafarin", "627488", "بانک کارآفرین"], '621986': ["saman", "621986", "بانک سامان"], '639346': ["sina", "639346", "بانک سینا"], '639607': ["sarmaye", "639607", "بانک سرمایه"], '502806': ["shahr", "502806", "بانک شهر"], '504706': ["shahr", "504706", "بانک شهر"], '502938': ["day", "502938", "بانک دی"], '603769': ["saderat", "603769", "بانک صادرات"], '610433': ["mellat", "610433", "بانک ملت"], '627353': ["tejarat", "627353", "بانک تجارت"], '585983': ["tejarat", "585983", "بانک تجارت"], '589463': ["refah", "589463", "بانک رفاه"], '627381': ["ansar", "627381", "بانک انصار"], '639370': ["sepah", "639370", " بانک مهراقتصاد"], '606373': ["mehreqtesad", "606373", "بانک قرض الحسنه مهر"], '639599': ["ghavamin", "639599", "بانک قوامین"], '504172': ["resalat", "504172", "بانک رسالت"], '636214': ["ayandeh", "636214", "بانک آینده"], '505785': ["iranzamin", "505785", "بانک ایران زمین"], }; return map[prefix] || ["no-img", null, "نامشخص"]; }, getBankFromShaba(code) { const map = { '010': ["markazi", "بانک مرکزی", "010"], '011': ["sanatmadan", "بانک صنعت و معدن", "011"], '012': ["mellat", "بانک ملت", "012"], '013': ["refah", "بانک رفاه", "013"], '014': ["maskan", "بانک مسکن", "014"], '015': ["sepah", "بانک سپه", "015"], '016': ["keshavarsi", "بانک کشاورزی", "016"], '017': ["meli", "بانک ملی ایران", "017"], '018': ["tejarat", "بانک تجارت", "018"], '019': ["saderat", "بانک صادرات", "019"], '020': ["tooseesaderat", "بانک توسعه صادرات", "020"], '021': ["postbank", "پست بانک ایران", "021"], '022': ["toosetaavon", "بانک توسعه تعاون", "022"], '051': ["etebaritosee", "موسسه اعتباری توسعه", "051"], '053': ["karafarin", "بانک کارآفرین", "053"], '054': ["parsian", "بانک پارسیان", "054"], '055': ["eghtesad", "بانک اقتصاد نوین", "055"], '056': ["saman", "بانک سامان", "056"], '057': ["pasargad", "بانک پاسارگاد", "057"], '058': ["sarmaye", "بانک سرمایه", "058"], '059': ["sina", "بانک سینا", "059"], '060': ["mehreqtesad", "بانک قرض الحسنه مهر", "060"], '061': ["shahr", "بانک شهر", "061"], '062': ["ayandeh", "بانک آینده", "062"], '063': ["ansar", "بانک انصار", "063"], '064': ["gardeshgari", "بانک گردشگری", "064"], '065': ["hekmat", "بانک حکمت ایرانیان", "065"], '066': ["day", "بانک دی", "066"], '069': ["iranzamin", "بانک ایران زمین", "069"], '070': ["resalat", "بانک رسالت", "070"] }; return map[code] || ["no-img", "نامشخص", "000"]; } }; if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') { module.exports = shaba; } else { global.shaba = shaba; } })(typeof window !== 'undefined' ? window : global);