-
Notifications
You must be signed in to change notification settings - Fork 1
/
index.ts
49 lines (47 loc) · 1.52 KB
/
index.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
export const elfProef = (
input: string | number,
weights: number[],
positiveSum: boolean
): boolean => {
if (typeof input === 'number') {
input = input.toString();
}
if (input.length !== weights.length) {
throw new Error('Amount of weights must be equal to length of input');
}
const numbers = input.split('');
const sum = numbers
.map((value: string, index: number) => {
const number = parseInt(value, 10);
const weight = weights[index];
return number * weight;
})
.reduce((a, b) => a + b);
const validMod = sum % 11 === 0;
const validRange = positiveSum === false || sum > 0;
return validMod && validRange;
};
export const validateBSN = (input: string | number): boolean => {
if (typeof input === 'number') {
input = input.toString();
}
const validFormat = /^[\d]{8,9}$/.test(input);
if (!validFormat) {
return false;
}
const prependedInput = input.length === 8 ? `0${input}` : input;
if (prependedInput.startsWith('00')) {
return false;
}
const validElfProef = elfProef(prependedInput, [9, 8, 7, 6, 5, 4, 3, 2, -1], false);
return validElfProef;
};
export const generateBSN = (): string => {
while (true) {
const randomNumber = Math.floor(Math.random() * (999999999 - 0 + 1) + 0);
const prependedNumber = String(randomNumber).padStart(9, '0');
if (validateBSN(prependedNumber)) {
return prependedNumber;
}
}
};