@@ -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 */
7477export function isValidSwissSocialSecurityNumber ( socialInsuranceNumber : string ) : boolean {
7578 if ( isNullOrWhitespace ( socialInsuranceNumber ) ) {
7679 return false ;
7780 }
78- const compactInsuranceNumber = socialInsuranceNumber . replaceAll ( / [ \s . ] + / g, "" ) ;
79- if ( ! / ^ 7 5 6 \d { 10 } $ / . test ( compactInsuranceNumber ) ) {
81+
82+ const socialInsuranceNumberWithDots = new RegExp ( / [ 7 ] [ 5 ] [ 6 ] [ . ] [ \d ] { 4 } [ . ] [ \d ] { 4 } [ . ] [ \d ] { 2 } $ / ) ;
83+ const socialInsuranceNumberWithoutDots = new RegExp ( / ^ 7 5 6 \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