Skip to content

Commit 84ccdff

Browse files
committed
Add IBAN to check now must be in one of two valid formats
1 parent 0df2166 commit 84ccdff

File tree

2 files changed

+21
-12
lines changed

2 files changed

+21
-12
lines changed

src/lib/string.spec.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -125,13 +125,13 @@ describe("string tests", () => {
125125
[null as unknown as string, false],
126126
[undefined as unknown as string, false],
127127
["7569217076985", true],
128+
["7561234567891", false],
128129
["756.9217.0769.85", true],
129130
["756.1234.5678.91", false],
130-
["7 5......69 2...1707......69.85", true],
131+
["756.1234.5678.91", false],
132+
["7 5......69 2...1707......69.85", false],
131133
["7 5......61 2...3456......7......89 1", false],
132-
["7561234567891", false],
133-
["7000000000000", false],
134-
])("check if ahv number is valid or not", (ahvNumber, expected) => {
134+
])("check if the social insurance number is valid or not", (ahvNumber, expected) => {
135135
expect(isValidSwissSocialSecurityNumber(ahvNumber)).toBe(expected);
136136
});
137137
});

src/lib/string.ts

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -66,29 +66,38 @@ export function truncate(value: string | undefined, maxLength: number, suffix =
6666
}
6767

6868
/**
69-
* Validation of Social insurance number with checking the checksum
69+
* Validation of social insurance number with checking the checksum
7070
* Validation according to https://www.sozialversicherungsnummer.ch/aufbau-neu.htm
7171
* @param socialInsuranceNumber The social insurance number to check
72+
* Must be in one of the following formats:
73+
* - "756.XXXX.XXXX.XX" with dots as seperators
74+
* - "756XXXXXXXXXX" with digits only
7275
* @returns The result if the social insurance number is valid or not
7376
*/
7477
export function isValidSwissSocialSecurityNumber(socialInsuranceNumber: string): boolean {
7578
if (isNullOrWhitespace(socialInsuranceNumber)) {
7679
return false;
7780
}
78-
const compactInsuranceNumber = socialInsuranceNumber.replaceAll(/[\s.]+/g, "");
79-
if (!/^756\d{10}$/.test(compactInsuranceNumber)) {
81+
82+
const socialInsuranceNumberWithDots = new RegExp(/[7][5][6][.][\d]{4}[.][\d]{4}[.][\d]{2}$/);
83+
const socialInsuranceNumberWithoutDots = new RegExp(/^756\d{10}$/);
84+
85+
if (!socialInsuranceNumberWithDots.test(socialInsuranceNumber) && !socialInsuranceNumberWithoutDots.test(socialInsuranceNumber)) {
8086
return false;
8187
}
82-
const number = compactInsuranceNumber.slice(0, -1);
83-
const reversedNumber = [...number].reverse().join("");
84-
const reversedNumberArray = [...reversedNumber];
88+
89+
const compactNumber = socialInsuranceNumber.replaceAll(/[\s.]+/g, "");
90+
const digits = compactNumber.slice(0, -1);
91+
const reversedDigits = [...digits].reverse().join("");
92+
const reversedDigitsArray = [...reversedDigits];
93+
8594
let sum = 0;
86-
for (const [i, element] of reversedNumberArray.entries()) {
95+
for (const [i, element] of reversedDigitsArray.entries()) {
8796
sum += i % 2 === 0 ? Number(element) * 3 : Number(element) * 1;
8897
}
8998

9099
const checksum = (10 - (sum % 10)) % 10;
91-
const checknumber = Number.parseInt(compactInsuranceNumber.slice(-1));
100+
const checknumber = Number.parseInt(compactNumber.slice(-1));
92101

93102
return checksum === checknumber;
94103
}

0 commit comments

Comments
 (0)