Skip to content

Commit 9cba0b5

Browse files
authored
Add string utility function formatSwissSocialInsuranceNumber (#80)
Add string utility function formatSwissSocialInsuranceNumber for issue #77
1 parent ac624da commit 9cba0b5

3 files changed

Lines changed: 85 additions & 3 deletions

File tree

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
99

1010
### Added
1111

12-
- `splitLines` string utility function
1312
- `tryParseSwissIbanNumber` swiss standard function
13+
- `tryParseSwissSocialInsuranceNumber` swiss standard function
14+
- `splitLines` string utility function
1415
- `trimStart`, `trimEnd` and `trim` string type utility functions
1516

1617
### Changed

src/lib/swissStandards.spec.ts

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
import { isValidSwissIbanNumber, isValidSwissSocialInsuranceNumber, tryParseSwissIbanNumber } from "./swissStandards";
1+
import {
2+
isValidSwissIbanNumber,
3+
isValidSwissSocialInsuranceNumber,
4+
tryParseSwissIbanNumber,
5+
tryParseSwissSocialInsuranceNumber,
6+
} from "./swissStandards";
27

38
describe("Swiss standards test", () => {
49
test.each([
@@ -58,4 +63,31 @@ describe("Swiss standards test", () => {
5863
])("check if the Swiss IBAN number gets parsed correctly", (unformattedSwissIbanNumber, expected) => {
5964
expect(tryParseSwissIbanNumber(unformattedSwissIbanNumber)).toEqual(expected);
6065
});
66+
67+
test.each([
68+
[
69+
undefined as unknown as string,
70+
{ isValid: false, swissSocialInsuranceNumber: undefined, swissSocialInsuranceNumberFormatted: undefined },
71+
],
72+
[null as unknown as string, { isValid: false, swissSocialInsuranceNumber: undefined, swissSocialInsuranceNumberFormatted: undefined }],
73+
[
74+
"7569217076985",
75+
{ isValid: true, swissSocialInsuranceNumber: "7569217076985", swissSocialInsuranceNumberFormatted: "756.9217.0769.85" },
76+
],
77+
[
78+
"756.9217.0769.85",
79+
{ isValid: true, swissSocialInsuranceNumber: "7569217076985", swissSocialInsuranceNumberFormatted: "756.9217.0769.85" },
80+
],
81+
[
82+
"7 56-9217.076 + 9.8 >5",
83+
{ isValid: true, swissSocialInsuranceNumber: "7569217076985", swissSocialInsuranceNumberFormatted: "756.9217.0769.85" },
84+
],
85+
[
86+
"7 56-9217.076 + 9.8 \n5",
87+
{ isValid: true, swissSocialInsuranceNumber: "7569217076985", swissSocialInsuranceNumberFormatted: "756.9217.0769.85" },
88+
],
89+
["7561234567891", { isValid: false, swissSocialInsuranceNumber: undefined, swissSocialInsuranceNumberFormatted: undefined }],
90+
])("check if the Swiss IBAN number gets parsed correctly", (unformattedSwissIbanNumber, expected) => {
91+
expect(tryParseSwissSocialInsuranceNumber(unformattedSwissIbanNumber)).toEqual(expected);
92+
});
6193
});

src/lib/swissStandards.ts

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,20 @@ export function isValidSwissSocialInsuranceNumber(socialInsuranceNumber: string)
116116
* @property {string} iban - The cleaned IBAN, only present if valid
117117
* @property {string} ibanFormatted - The formatted IBAN, only present if valid
118118
*/
119-
export function tryParseSwissIbanNumber(unformattedIbanNumber?: string) {
119+
export function tryParseSwissIbanNumber(unformattedIbanNumber?: string): {
120+
/**
121+
* Indicates whether the IBAN is valid or not
122+
*/
123+
isValid: boolean;
124+
/**
125+
* The cleaned IBAN, only present if valid
126+
*/
127+
iban?: string;
128+
/**
129+
* The formatted IBAN, only present if valid
130+
*/
131+
ibanFormatted?: string;
132+
} {
120133
if (isNullOrWhitespace(unformattedIbanNumber)) {
121134
return { isValid: false };
122135
}
@@ -130,3 +143,39 @@ export function tryParseSwissIbanNumber(unformattedIbanNumber?: string) {
130143
ibanFormatted: isValid ? iban.match(/.{1,4}/g)?.join(" ") : undefined,
131144
};
132145
}
146+
147+
/**
148+
* Attempts to parse and validate a Swiss social insurance number.
149+
* @param unformattedInsuranceNumber - The unformatted Swiss social insurance number
150+
* @returns The result object with the following properties:
151+
* @property {boolean} isValid - Indicates whether the Swiss social insurance number is valid or not
152+
* @property {string} swissSocialInsuranceNumber - The cleaned Swiss social insurance number, only present if valid
153+
* @property {string} swissSocialInsuranceNumberFormatted - The formatted Swiss social insurance number, only present if valid
154+
*/
155+
export function tryParseSwissSocialInsuranceNumber(unformattedInsuranceNumber?: string): {
156+
/**
157+
* Indicates whether the Swiss social insurance number is valid or not
158+
*/
159+
isValid: boolean;
160+
/**
161+
* The cleaned Swiss social insurance number, only present if valid
162+
*/
163+
swissSocialInsuranceNumber?: string;
164+
/**
165+
* The formatted Swiss social insurance number, only present if valid
166+
*/
167+
swissSocialInsuranceNumberFormatted?: string;
168+
} {
169+
if (isNullOrWhitespace(unformattedInsuranceNumber)) {
170+
return { isValid: false };
171+
}
172+
173+
const insuranceNumber = unformattedInsuranceNumber!.replaceAll(/\D/g, "");
174+
const isValid = isValidSwissSocialInsuranceNumber(insuranceNumber);
175+
176+
return {
177+
isValid: isValid,
178+
swissSocialInsuranceNumber: isValid ? insuranceNumber : undefined,
179+
swissSocialInsuranceNumberFormatted: isValid ? insuranceNumber.replace(/^(\d{3})(\d{4})(\d{4})(\d{2})$/, "$1.$2.$3.$4") : undefined,
180+
};
181+
}

0 commit comments

Comments
 (0)