This commit is contained in:
payacom
2026-07-23 15:58:15 +03:30
parent af5b27b610
commit a1d7db5e7e
445 changed files with 23456 additions and 8865 deletions

82
src/lib/iranSheba.ts Normal file
View File

@@ -0,0 +1,82 @@
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}`;
}