const IRAN_BANKS: Record = { "010": "بانک مرکزی", "011": "بانک صنعت و معدن", "012": "بانک ملت", "013": "بانک رفاه کارگران", "014": "بانک مسکن", "015": "بانک سپه", "016": "بانک کشاورزی", "017": "بانک ملی ایران", "018": "بانک تجارت", "019": "بانک صادرات ایران", "020": "بانک توسعه صادرات", "021": "پست بانک ایران", "022": "بانک توسعه تعاون", "051": "موسسه اعتباری توسعه", "052": "بانک قوامین", "053": "بانک کارآفرین", "054": "بانک پارسیان", "055": "بانک اقتصاد نوین", "056": "بانک سامان", "057": "بانک پاسارگاد", "058": "بانک سرمایه", "059": "بانک سینا", "060": "بانک قرض‌الحسنه مهر ایران", "061": "بانک شهر", "062": "بانک آینده", "063": "بانک انصار", "064": "بانک گردشگری", "065": "بانک حکمت ایرانیان", "066": "بانک دی", "069": "بانک ایران زمین", "070": "بانک قرض‌الحسنه رسالت", "073": "بانک کوثر", "075": "بانک ملل", "078": "بانک خاورمیانه", "079": "بانک نور", "080": "بانک مهر اقتصاد", }; export function stripShebaPrefix(value: string): string { const digits = value.replace(/\D/g, ""); if (digits.length === 24) return digits; const upper = value.replace(/\s/g, "").toUpperCase(); if (upper.startsWith("IR")) { return upper.slice(2).replace(/\D/g, "").slice(0, 24); } return digits.slice(0, 24); } function ibanMod97(iban: string): number { const rearranged = iban.slice(4) + iban.slice(0, 4); const expanded = rearranged .split("") .map((char) => { const code = char.charCodeAt(0); if (code >= 65 && code <= 90) return String(code - 55); return char; }) .join(""); let remainder = expanded; while (remainder.length > 2) { const block = remainder.slice(0, 9); remainder = String(parseInt(block, 10) % 97) + remainder.slice(block.length); } return parseInt(remainder, 10) % 97; } export function isValidIranSheba(digits24: string): boolean { if (!/^\d{24}$/.test(digits24)) return false; return ibanMod97(`IR${digits24}`) === 1; } export function getIranBankName(digits24: string): string | null { if (digits24.length < 5) return null; const bankCode = digits24.slice(2, 5); return IRAN_BANKS[bankCode] ?? null; } export function formatShebaForStorage(digits24: string): string { return `IR${digits24}`; }