| @@ -11,6 +11,9 @@ function writeInfo(label, msg) { |
| 11 |
11 |
export function onLoad() { |
| 12 |
12 |
const gen_bsn = getById("bsn"); |
| 13 |
13 |
gen_bsn.addEventListener("click", generateBsn); |
|
14 |
+ |
|
15 |
+ const gen_iban = getById("iban"); |
|
16 |
+ gen_iban.addEventListener("click", generateIban); |
| 14 |
17 |
} |
| 15 |
18 |
|
| 16 |
19 |
function generateBsn() { |
| @@ -45,3 +48,70 @@ function generateBsn() { |
| 45 |
48 |
const BSNString = "" + nr9 + nr8 + nr7 + nr6 + nr5 + nr4 + nr3 + nr2 + nr1; |
| 46 |
49 |
writeInfo("BSN: ", BSNString); |
| 47 |
50 |
} |
|
51 |
+ |
|
52 |
+ |
|
53 |
+const BANK_CODES = ["ABNA", "ASNB", "BUNQ", "INGB", "KNAB", "RABO", "RBRB", "SNSB", "TRIO"]; |
|
54 |
+ |
|
55 |
+ |
|
56 |
+function randomDigits(count) { |
|
57 |
+ let digits = ""; |
|
58 |
+ for (let i = 0; i < count; i++) { |
|
59 |
+ digits += Math.floor(Math.random() * 10); |
|
60 |
+ } |
|
61 |
+ return digits; |
|
62 |
+} |
|
63 |
+ |
|
64 |
+ |
|
65 |
+ |
|
66 |
+ |
|
67 |
+ |
|
68 |
+ |
|
69 |
+ |
|
70 |
+function randomAccountNumber() { |
|
71 |
+ while (true) { |
|
72 |
+ const digits = randomDigits(8); |
|
73 |
+ let sum = 0; |
|
74 |
+ for (let i = 0; i < 8; i++) { |
|
75 |
+ sum += (9 - i) * Number(digits[i]); |
|
76 |
+ } |
|
77 |
+ |
|
78 |
+ const last = (11 - (sum % 11)) % 11; |
|
79 |
+ if (last < 10) { |
|
80 |
+ return "0" + digits + last; |
|
81 |
+ } |
|
82 |
+ |
|
83 |
+ } |
|
84 |
+} |
|
85 |
+ |
|
86 |
+ |
|
87 |
+ |
|
88 |
+ |
|
89 |
+ |
|
90 |
+ |
|
91 |
+function lettersToDigits(letters) { |
|
92 |
+ return [...letters].map((c) => c.charCodeAt(0) - 55).join(""); |
|
93 |
+} |
|
94 |
+ |
|
95 |
+ |
|
96 |
+ |
|
97 |
+ |
|
98 |
+ |
|
99 |
+ |
|
100 |
+function mod97(digits) { |
|
101 |
+ let rest = 0; |
|
102 |
+ for (const digit of digits) { |
|
103 |
+ rest = (rest * 10 + Number(digit)) % 97; |
|
104 |
+ } |
|
105 |
+ return rest; |
|
106 |
+} |
|
107 |
+ |
|
108 |
+function generateIban() { |
|
109 |
+ const bank = BANK_CODES[Math.floor(Math.random() * BANK_CODES.length)]; |
|
110 |
+ const account = randomAccountNumber(); |
|
111 |
+ |
|
112 |
+ |
|
113 |
+ const rest = mod97(lettersToDigits(bank) + account + lettersToDigits("NL") + "00"); |
|
114 |
+ const check = String(98 - rest).padStart(2, "0"); |
|
115 |
+ |
|
116 |
+ writeInfo("IBAN: ", "NL" + check + bank + account); |
|
117 |
+} |