83 lines
2.6 KiB
TypeScript
83 lines
2.6 KiB
TypeScript
const IRAN_BANKS: Record<string, string> = {
|
|
"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}`;
|
|
}
|