diff --git a/CHANGELOG.md b/CHANGELOG.md index 3a0517b..96ad242 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,8 +9,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added -- `splitLines` string utility function - `tryParseSwissIbanNumber` swiss standard function +- `tryParseSwissSocialInsuranceNumber` swiss standard function +- `splitLines` string utility function - `trimStart`, `trimEnd` and `trim` string type utility functions ### Changed diff --git a/src/lib/swissStandards.spec.ts b/src/lib/swissStandards.spec.ts index 9708e93..8315a86 100644 --- a/src/lib/swissStandards.spec.ts +++ b/src/lib/swissStandards.spec.ts @@ -1,4 +1,9 @@ -import { isValidSwissIbanNumber, isValidSwissSocialInsuranceNumber, tryParseSwissIbanNumber } from "./swissStandards"; +import { + isValidSwissIbanNumber, + isValidSwissSocialInsuranceNumber, + tryParseSwissIbanNumber, + tryParseSwissSocialInsuranceNumber, +} from "./swissStandards"; describe("Swiss standards test", () => { test.each([ @@ -58,4 +63,31 @@ describe("Swiss standards test", () => { ])("check if the Swiss IBAN number gets parsed correctly", (unformattedSwissIbanNumber, expected) => { expect(tryParseSwissIbanNumber(unformattedSwissIbanNumber)).toEqual(expected); }); + + test.each([ + [ + undefined as unknown as string, + { isValid: false, swissSocialInsuranceNumber: undefined, swissSocialInsuranceNumberFormatted: undefined }, + ], + [null as unknown as string, { isValid: false, swissSocialInsuranceNumber: undefined, swissSocialInsuranceNumberFormatted: undefined }], + [ + "7569217076985", + { isValid: true, swissSocialInsuranceNumber: "7569217076985", swissSocialInsuranceNumberFormatted: "756.9217.0769.85" }, + ], + [ + "756.9217.0769.85", + { isValid: true, swissSocialInsuranceNumber: "7569217076985", swissSocialInsuranceNumberFormatted: "756.9217.0769.85" }, + ], + [ + "7 56-9217.076 + 9.8 >5", + { isValid: true, swissSocialInsuranceNumber: "7569217076985", swissSocialInsuranceNumberFormatted: "756.9217.0769.85" }, + ], + [ + "7 56-9217.076 + 9.8 \n5", + { isValid: true, swissSocialInsuranceNumber: "7569217076985", swissSocialInsuranceNumberFormatted: "756.9217.0769.85" }, + ], + ["7561234567891", { isValid: false, swissSocialInsuranceNumber: undefined, swissSocialInsuranceNumberFormatted: undefined }], + ])("check if the Swiss IBAN number gets parsed correctly", (unformattedSwissIbanNumber, expected) => { + expect(tryParseSwissSocialInsuranceNumber(unformattedSwissIbanNumber)).toEqual(expected); + }); }); diff --git a/src/lib/swissStandards.ts b/src/lib/swissStandards.ts index ac13650..c0089fe 100644 --- a/src/lib/swissStandards.ts +++ b/src/lib/swissStandards.ts @@ -116,7 +116,20 @@ export function isValidSwissSocialInsuranceNumber(socialInsuranceNumber: string) * @property {string} iban - The cleaned IBAN, only present if valid * @property {string} ibanFormatted - The formatted IBAN, only present if valid */ -export function tryParseSwissIbanNumber(unformattedIbanNumber?: string) { +export function tryParseSwissIbanNumber(unformattedIbanNumber?: string): { + /** + * Indicates whether the IBAN is valid or not + */ + isValid: boolean; + /** + * The cleaned IBAN, only present if valid + */ + iban?: string; + /** + * The formatted IBAN, only present if valid + */ + ibanFormatted?: string; +} { if (isNullOrWhitespace(unformattedIbanNumber)) { return { isValid: false }; } @@ -130,3 +143,39 @@ export function tryParseSwissIbanNumber(unformattedIbanNumber?: string) { ibanFormatted: isValid ? iban.match(/.{1,4}/g)?.join(" ") : undefined, }; } + +/** + * Attempts to parse and validate a Swiss social insurance number. + * @param unformattedInsuranceNumber - The unformatted Swiss social insurance number + * @returns The result object with the following properties: + * @property {boolean} isValid - Indicates whether the Swiss social insurance number is valid or not + * @property {string} swissSocialInsuranceNumber - The cleaned Swiss social insurance number, only present if valid + * @property {string} swissSocialInsuranceNumberFormatted - The formatted Swiss social insurance number, only present if valid + */ +export function tryParseSwissSocialInsuranceNumber(unformattedInsuranceNumber?: string): { + /** + * Indicates whether the Swiss social insurance number is valid or not + */ + isValid: boolean; + /** + * The cleaned Swiss social insurance number, only present if valid + */ + swissSocialInsuranceNumber?: string; + /** + * The formatted Swiss social insurance number, only present if valid + */ + swissSocialInsuranceNumberFormatted?: string; +} { + if (isNullOrWhitespace(unformattedInsuranceNumber)) { + return { isValid: false }; + } + + const insuranceNumber = unformattedInsuranceNumber!.replaceAll(/\D/g, ""); + const isValid = isValidSwissSocialInsuranceNumber(insuranceNumber); + + return { + isValid: isValid, + swissSocialInsuranceNumber: isValid ? insuranceNumber : undefined, + swissSocialInsuranceNumberFormatted: isValid ? insuranceNumber.replace(/^(\d{3})(\d{4})(\d{4})(\d{2})$/, "$1.$2.$3.$4") : undefined, + }; +}