lang
This commit is contained in:
82
src/lib/iranSheba.ts
Normal file
82
src/lib/iranSheba.ts
Normal 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}`;
|
||||
}
|
||||
Reference in New Issue
Block a user