JS - אימות מספר חשבון ישראלי
-
כתבתי פונקציה לוידוא מספר חשבון ישראלי לפי המסמך הזה,
אני משתף אתכם שתוכלו להשתמש אבל גם בשביל תיקוני באגים (היה לי הרבה... הקוד גם לא כתוב כ"כ אלגנטי עמכם הסליחה).להלן הפונקציה עם ממשק קטן עם אנגולר לקלות הבדיקה:
https://stackblitz.com/edit/js-tmsgcv?file=index.js -
@dovid
כעת יצא לי שאני צריך פונקציית אימות פרטי חשבון.
ראשית כל תודה על המוצר המוכן!
אני צריך את זה בPHP, ולכן המרתי את הקוד ל PHP.
תיקון אחד שמצאתי (שגיאה שקיבלתי בPHP), בפרטי חשבון בנק בפאג"י, לאחר הסרת הקידומת של קוד העו"ש.
בלינק הנ"ל https://stackblitz.com/edit/js-tmsgcv?file=index.js
שורה 114
שורה לפני כן הסרת את 3 התווים הראשונים, וא"כ נשארו 6 תווים, לאחר מכן בלולאה בשורה 114 אנו אמורים להריץ את הלולאה רק 6 פעמים במקום 9 פעמים.
שורות 112-115r = account.substr(3); for (var i = 0, mul = 9; i < 9; i++ , mul--) counter += +(r[i]) * mul;
אמורות להיות
r = account.substr(3); for (var i = 0, mul = 6; i < 6; i++ , mul--) counter += +(r[i]) * mul;
תודה, מקווה שלא אמצא בעיות נוספות (יותר נכון: מקווה שאין בעיות נוספות, ואם יש אז שכן אמצא)..
-
ואגב להלן הקוד הנוכחי שלי ב PHP.
אם יש כאן מה לתקן, אשמח..<?php var_dump(accountValidation(52, 177, 111111)); function accountValidation($bank, $branch, $account): bool { $bank = str_pad((string)($bank ?? 0), 2, '0', STR_PAD_LEFT); $branch = str_pad((string)($branch ?? 0), 3, '0', STR_PAD_LEFT); $account = (string)($account ?? 0); if (strlen($branch) > 3 || strlen($bank) > 2) return false; if ($bank == 10 || $bank == 13 || $bank == 34) { $maxLen = 8; if (strlen($account) > $maxLen) return false; $account = str_pad($account, $maxLen, '0', STR_PAD_LEFT); $counter = (int)(substr($account, 6, 2)); $r = $branch . $account; for ($i = 0, $mul = 10; $i < 9; $i++ , $mul--) $counter += (int)($r[$i]) * $mul; $result = $counter % 100; return $result == 90 || $result == 72 || $result == 70 || $result == 60 || $result == 20; } else if ($bank == 12) { $maxLen = 6; if (strlen($account) > $maxLen) return false; $account = str_pad($account, $maxLen, '0', STR_PAD_LEFT); $counter = 0; $r = $branch . $account; for ($i = 0,$mul = 9;$i < 9; $i++ , $mul--) $counter += (int)($r[$i]) * $mul; $div = $counter % 11; return $div == 0 || $div == 2 || $div == 4 || $div == 6; } else if ($bank == 4) { $maxLen = 6; if (strlen($account) > $maxLen) return false; $account = str_pad($account, $maxLen, '0', STR_PAD_LEFT); $counter = 0; $r = $branch . $account; for ($i = 0,$mul = 9;$i < 9; $i++ , $mul--) $counter += (int)($r[$i]) * $mul; $div = $counter % 11; return $div == 0 || $div == 2; } else if ($bank == 11 || $bank == 17) { $maxLen = 9; if (strlen($account) > $maxLen) return false; $account = str_pad($account, $maxLen, '0', STR_PAD_LEFT); $counter = 0; $r = $account; for ($i = 0,$mul = 9;$i < 9; $i++ , $mul--) $counter += (int)($r[$i]) * $mul; $div = $counter % 11; return$div == 0 ||$div == 2 ||$div == 4; } else if ($bank == 20) { $maxLen = 6; if (strlen($account) > $maxLen) return false; $account = str_pad($account, $maxLen, '0', STR_PAD_LEFT); $counter = 0; if ((int)$branch > 400) $branch = str_pad((string)((int)$branch - 400), 3, '0', STR_PAD_LEFT); $r = $branch . $account; for ($i = 0,$mul = 9;$i < 9; $i++ , $mul--) $counter += (int)($r[$i]) * $mul; $div = $counter % 11; return $div == 0 ||$div == 2 ||$div == 4 ||$div == 6; } else if ($bank == 31 || $bank == 52) { $maxLen = 9; if (strlen($account) > $maxLen) return false; $account = str_pad($account, $maxLen, '0', STR_PAD_LEFT); $counter = 0; $r = $account; for ($i = 0,$mul = 9;$i < 9;$i++ ,$mul--) $counter += (int)($r[$i]) * $mul; $div = $counter % 11; if ($div == 0 ||$div == 6) return true; $counter = 0; $r = substr($account, 3); for ($i = 0,$mul = 6;$i < 6;$i++ ,$mul--) $counter += (int)($r[$i]) * $mul; $div = $counter % 11; return $div == 0 || $div == 6; } else if ($bank == 9) { $maxLen = 9; if (strlen($account) > $maxLen) return false; $account = str_pad($account, $maxLen, '0', STR_PAD_LEFT); $counter = 0; $r = $account; for ($i = 0,$mul = 9;$i < 9;$i++ ,$mul--) $counter += (int)($r[$i]) * $mul; return ($counter % 10) == 0; } else if ($bank == 22) { $maxLen = 9; if (strlen($account) > $maxLen) return false; $account = str_pad($account, $maxLen, '0', STR_PAD_LEFT); $counter = 0; $r = $account; $counter += (int)($r[0]) * 3; $counter += (int)($r[1]) * 2; for ($i = 2,$mul = 7;$i < 8;$i++ ,$mul--) $counter += (int)($r[$i]) * $mul; return (11 - ($counter % 11)) == $r[8]; } else if ($bank == 46) { $maxLen = 6; $account1 = $account; if(strlen($account1) > $maxLen) $account1 = substr($account, strlen($account) - $maxLen); $account1 = str_pad($account1, $maxLen, '0', STR_PAD_LEFT); $counter = 0; $r = $branch . $account1; for ($i = 0,$mul = 9;$i < 9;$i++ ,$mul--) $counter += (int)($r[$i]) * $mul; $div = $counter % 11; $special = [ 192, 191, 183 ,181, 178, 166, 154, 539, 527, 516, 515, 507, 505, 503 ]; if ($div == 0 || ($div == 2 && in_array($branch, $special))) return true; $maxLen = 9; if (strlen($account) > $maxLen) return false; $account2 = str_pad($account, $maxLen, '0', STR_PAD_LEFT); $counter = 0; $r = $account2; for ($i = 0,$mul = 9;$i < 9;$i++ ,$mul--) $counter += (int)($r[$i]) * $mul; if(($counter % 11) == 0) return true; $account3 = substr($account, 3); $counter = 0; $r = $account3; for ($i = 0,$mul = 9;$i < 9;$i++ ,$mul--) $counter += (int)($r[$i]) * $mul; return ($counter % 11) == 0; } else if ($bank == 14) { $maxLen = 6; $account1 = $account; if(strlen($account1) > $maxLen) $account1 = substr($account, strlen($account) - $maxLen); $account1 = str_pad($account1, $maxLen, '0', STR_PAD_LEFT); $counter = 0; $r = $branch . $account1 ; for ($i = 0,$mul = 9;$i < 9;$i++ ,$mul--) $counter += (int)($r[$i]) * $mul; $div = $counter % 11; $specialA = [ 385, 384 , 365, 347 ]; $specialB = [ 361 ,362 ,363 ]; if($div == 0) return true; if(in_array($branch, $specialA) && ($div == 0 ||$div == 2)) return true; if(in_array($branch, $specialB) && ($div == 0 ||$div == 2 ||$div == 4)) return true; $maxLen = 9; if (strlen($account) > $maxLen) return false; $account2 = str_pad($account, $maxLen, '0', STR_PAD_LEFT); $counter = 0; $r = $account2; for ($i = 0,$mul = 9;$i < 9;$i++ ,$mul--) $counter += (int)($r[$i]) * $mul; if(($counter % 11) == 0) return true; $account3 = substr($account, 3); $counter = 0; $r = $account3; for ($i = 0,$mul = 9;$i < 9;$i++ ,$mul--) $counter += (int)($r[$i]) * $mul; return ($counter % 11) == 0; } return false; }
-
@clickone אמר בJS - אימות מספר חשבון ישראלי:
עריכה: כעת אני רואה שזה המסמך שהבאת. והוא המעודכן לפי ידיעתי
יש קוד כזה בvba שכתוב לפי המסמך הנ"ל והוא ממש לא תקין,
יש כאלו שלא עברו שם(ובדקתי אז לפי המסמך הנ"ל - שבאמת לא היו אמורים לעבוד - כלומר: לא הייתה בעיה בקוד), למרות שהם עברו באתרים,
אין לי כרגע(זה היה בפרוג והוא עכשיו לא פעיל - יש תקלה כלשהי) אבל, אבדוק את זה בהמשך. -
@avi-rz
זה הקוד ב-vba מפרוג.Public Function fValidateBankAccount(lngBankNumber As Long, _ lngBranch As Long, _ lngAccount As Long) As Boolean On Error GoTo fValidateBankAccount_Error Dim lngRequiredAccountLength As Long Dim lngTotal As Long Dim strArrayAccount() As String Dim strArrayBranch() As String Dim strAccount As String Dim strBranch As String If lngBankNumber = 0 Or lngBranch = 0 Or lngAccount = 0 Then Exit Function Select Case lngBankNumber Case 10, 13, 34 lngRequiredAccountLength = 8 Case 12, 4 lngRequiredAccountLength = 6 Case 11, 17 lngRequiredAccountLength = 9 Case 20 lngRequiredAccountLength = 6 Case 31, 52 lngRequiredAccountLength = 9 Case 9 lngRequiredAccountLength = 9 Case 22 lngRequiredAccountLength = 9 Case 46 lngRequiredAccountLength = 9 Case 14 lngRequiredAccountLength = 9 Case 54 lngRequiredAccountLength = 9 End Select strBranch = lngBranch strAccount = String(lngRequiredAccountLength - Len(CStr(lngAccount)), "0") & CStr(lngAccount) strAccount = StrConv(strAccount, vbUnicode) strArrayAccount = Split(strAccount, vbNullChar) If lngBankNumber = 20 And lngBranch > 400 Then ' אם מספר הסניף בבנק מזרחי-טפחות גדול מ400 strBranch = CStr(lngBranch - 400) ' לפני החישובים יש להפחית 400 Else ' אם מספר הסניף בבנק מזרחי-טפחות לא גדול מ400 strBranch = CStr(lngBranch) ' לפני החישובים אל תבצע כלום End If If lngBankNumber = 12 Or lngBankNumber = 4 Then strBranch = lngBranch End If If Len(strBranch) < 3 Then strBranch = String(3 - Len(strBranch), "0") & strBranch ' מוסיף אפסים להשלים ל3 ספרות End If strBranch = StrConv(strBranch, vbUnicode) strArrayBranch = Split(strBranch, vbNullChar) Select Case lngBankNumber Case 10, 13, 34 lngTotal = CLng(strArrayBranch(0)) * 10 + _ CLng(strArrayBranch(1)) * 9 + _ CLng(strArrayBranch(2)) * 8 + _ CLng(strArrayAccount(0)) * 7 + _ CLng(strArrayAccount(1)) * 6 + _ CLng(strArrayAccount(2)) * 5 + _ CLng(strArrayAccount(3)) * 4 + _ CLng(strArrayAccount(4)) * 3 + _ CLng(strArrayAccount(5)) * 2 + _ Right(lngAccount, 2) Select Case Right(lngTotal, 2) Case 90, 72, 70, 60, 20 fValidateBankAccount = True Case Else fValidateBankAccount = False End Select Case 12 lngTotal = CLng(strArrayBranch(0)) * 9 + _ CLng(strArrayBranch(1)) * 8 + _ CLng(strArrayBranch(2)) * 7 + _ CLng(strArrayAccount(0)) * 6 + _ CLng(strArrayAccount(1)) * 5 + _ CLng(strArrayAccount(2)) * 4 + _ CLng(strArrayAccount(3)) * 3 + _ CLng(strArrayAccount(4)) * 2 + _ CLng(strArrayAccount(5)) * 1 Select Case lngTotal Mod 11 Case 0, 2, 4, 6 fValidateBankAccount = True Case Else fValidateBankAccount = False End Select Case 4 lngTotal = CLng(strArrayBranch(0)) * 9 + _ CLng(strArrayBranch(1)) * 8 + _ CLng(strArrayBranch(2)) * 7 + _ CLng(strArrayAccount(0)) * 6 + _ CLng(strArrayAccount(1)) * 5 + _ CLng(strArrayAccount(2)) * 4 + _ CLng(strArrayAccount(3)) * 3 + _ CLng(strArrayAccount(4)) * 2 + _ CLng(strArrayAccount(5)) * 1 Select Case lngTotal Mod 11 Case 0, 2 fValidateBankAccount = True Case Else fValidateBankAccount = False End Select Case 11, 17 lngTotal = CLng(strArrayAccount(0)) * 9 + _ CLng(strArrayAccount(1)) * 8 + _ CLng(strArrayAccount(2)) * 7 + _ CLng(strArrayAccount(3)) * 6 + _ CLng(strArrayAccount(4)) * 5 + _ CLng(strArrayAccount(5)) * 4 + _ CLng(strArrayAccount(6)) * 3 + _ CLng(strArrayAccount(7)) * 2 + _ CLng(strArrayAccount(8)) * 1 Select Case lngTotal Mod 11 Case 0, 2, 4 fValidateBankAccount = True Case Else fValidateBankAccount = False End Select Case 20 lngTotal = CLng(strArrayBranch(0)) * 9 + _ CLng(strArrayBranch(1)) * 8 + _ CLng(strArrayBranch(2)) * 7 + _ CLng(strArrayAccount(0)) * 6 + _ CLng(strArrayAccount(1)) * 5 + _ CLng(strArrayAccount(2)) * 4 + _ CLng(strArrayAccount(3)) * 3 + _ CLng(strArrayAccount(4)) * 2 + _ CLng(strArrayAccount(5)) * 1 Select Case lngTotal Mod 11 Case 0, 2, 4 fValidateBankAccount = True End Select Case 31, 52 lngTotal = CLng(strArrayAccount(0)) * 9 + _ CLng(strArrayAccount(1)) * 8 + _ CLng(strArrayAccount(2)) * 7 + _ CLng(strArrayAccount(3)) * 6 + _ CLng(strArrayAccount(4)) * 5 + _ CLng(strArrayAccount(5)) * 4 + _ CLng(strArrayAccount(6)) * 3 + _ CLng(strArrayAccount(7)) * 2 + _ CLng(strArrayAccount(8)) * 1 Select Case lngTotal Mod 11 Case 0, 6 fValidateBankAccount = True Case Else lngTotal = CLng(strArrayAccount(3)) * 6 + _ CLng(strArrayAccount(4)) * 5 + _ CLng(strArrayAccount(5)) * 4 + _ CLng(strArrayAccount(6)) * 3 + _ CLng(strArrayAccount(7)) * 2 + _ CLng(strArrayAccount(8)) * 1 Select Case lngTotal Mod 11 Case 0, 6 fValidateBankAccount = True Case Else fValidateBankAccount = False End Select End Select Case 9 lngTotal = CLng(strArrayAccount(0)) * 9 + _ CLng(strArrayAccount(1)) * 8 + _ CLng(strArrayAccount(2)) * 7 + _ CLng(strArrayAccount(3)) * 6 + _ CLng(strArrayAccount(4)) * 5 + _ CLng(strArrayAccount(5)) * 4 + _ CLng(strArrayAccount(6)) * 3 + _ CLng(strArrayAccount(7)) * 2 + _ CLng(strArrayAccount(8)) * 1 If lngTotal Mod 10 = 0 Then fValidateBankAccount = True Else fValidateBankAccount = False End If Case 54 fValidateBankAccount = True Case 22 lngTotal = CLng(strArrayAccount(0)) * 3 + _ CLng(strArrayAccount(1)) * 2 + _ CLng(strArrayAccount(2)) * 7 + _ CLng(strArrayAccount(3)) * 6 + _ CLng(strArrayAccount(4)) * 5 + _ CLng(strArrayAccount(5)) * 4 + _ CLng(strArrayAccount(6)) * 3 + _ CLng(strArrayAccount(7)) * 2 If 11 - (lngTotal Mod 11) = CLng(strArrayAccount(8)) Then fValidateBankAccount = True Else fValidateBankAccount = False End If Case 46 lngTotal = CLng(strArrayBranch(0)) * 9 + _ CLng(strArrayBranch(1)) * 8 + _ CLng(strArrayBranch(2)) * 7 + _ CLng(strArrayAccount(3)) * 6 + _ CLng(strArrayAccount(4)) * 5 + _ CLng(strArrayAccount(5)) * 4 + _ CLng(strArrayAccount(6)) * 3 + _ CLng(strArrayAccount(7)) * 2 + _ CLng(strArrayAccount(8)) * 1 Select Case lngTotal Mod 11 Case 0 fValidateBankAccount = True Case 2 Select Case strBranch Case 154, 166, 178, 181, 183, 191, 192, 503, 505, 507, 515, 516, 527, 539 fValidateBankAccount = True Case Else fValidateBankAccount = False End Select Case Else lngTotal = CLng(strArrayAccount(0)) * 9 + _ CLng(strArrayAccount(1)) * 8 + _ CLng(strArrayAccount(2)) * 7 + _ CLng(strArrayAccount(3)) * 6 + _ CLng(strArrayAccount(4)) * 5 + _ CLng(strArrayAccount(5)) * 4 + _ CLng(strArrayAccount(6)) * 3 + _ CLng(strArrayAccount(7)) * 2 + _ CLng(strArrayAccount(8)) * 1 If lngTotal Mod 11 = 0 Then fValidateBankAccount = True Else lngTotal = CLng(strArrayAccount(3)) * 6 + _ CLng(strArrayAccount(4)) * 5 + _ CLng(strArrayAccount(5)) * 4 + _ CLng(strArrayAccount(6)) * 3 + _ CLng(strArrayAccount(7)) * 2 + _ CLng(strArrayAccount(8)) * 1 If lngTotal Mod 11 = 0 Then fValidateBankAccount = True Else fValidateBankAccount = False End If End If End Select Case 14 lngTotal = CLng(strArrayBranch(0)) * 9 + _ CLng(strArrayBranch(1)) * 8 + _ CLng(strArrayBranch(2)) * 7 + _ CLng(strArrayAccount(3)) * 6 + _ CLng(strArrayAccount(4)) * 5 + _ CLng(strArrayAccount(5)) * 4 + _ CLng(strArrayAccount(6)) * 3 + _ CLng(strArrayAccount(7)) * 2 + _ CLng(strArrayAccount(8)) * 1 Select Case lngTotal Mod 11 Case 0 fValidateBankAccount = True Case 2 Select Case strBranch Case 347, 361, 362, 363, 365, 385 fValidateBankAccount = True Case Else fValidateBankAccount = False End Select Case 4 Select Case strBranch Case 361, 362, 363 fValidateBankAccount = True Case Else fValidateBankAccount = False End Select Case Else lngTotal = CLng(strArrayAccount(0)) * 9 + _ CLng(strArrayAccount(1)) * 8 + _ CLng(strArrayAccount(2)) * 7 + _ CLng(strArrayAccount(3)) * 6 + _ CLng(strArrayAccount(4)) * 5 + _ CLng(strArrayAccount(5)) * 4 + _ CLng(strArrayAccount(6)) * 3 + _ CLng(strArrayAccount(7)) * 2 + _ CLng(strArrayAccount(8)) * 1 If lngTotal Mod 11 = 0 Then fValidateBankAccount = True Else lngTotal = CLng(strArrayAccount(3)) * 6 + _ CLng(strArrayAccount(4)) * 5 + _ CLng(strArrayAccount(5)) * 4 + _ CLng(strArrayAccount(6)) * 3 + _ CLng(strArrayAccount(7)) * 2 + _ CLng(strArrayAccount(8)) * 1 If lngTotal Mod 11 = 0 Then fValidateBankAccount = True End If End If End Select End Select On Error GoTo 0 Exit Function fValidateBankAccount_Error: fValidateBankAccount = False MsgBox "Error " & err.Number & " (" & err.Description & ") in procedure fValidateBankAccount of Function mdlValidations" End Function