@@ -113,36 +113,54 @@ export const sortDates = (d1: Date, d2: Date) => {
113
113
/**
114
114
* Obs! Denne kan feile hvis fødselsnummeret er syntetisk. Det er også tilfeller hvor dato ikke
115
115
* er helt korrekt - men dette er sjelden.
116
- * @param fnr Fødselsnummer
117
- * @returns fødselsdatoen eller null hvis fødselsnummeret er ugyldig
116
+ * @param idnr fnr/dnr
117
+ * @returns fødselsdatoen eller null hvis fødselsnummeret er ugyldig eller ikke støttet
118
118
*/
119
- export const getFødselsdatoFromFødselsnummer = ( fnr ?: string ) : Date | undefined => {
120
- if ( fnr === undefined || ! / ^ \d { 11 } $ / . test ( fnr ) ) {
119
+ export const getFødselsdatoFromIdNr = ( idnr ?: string ) : Date | undefined => {
120
+ if ( idnr === undefined || ! / ^ \d { 11 } $ / . test ( idnr ) ) {
121
121
return undefined ;
122
- // throw new Error('Ugyldig fødselsnummer. Må bestå av 11 siffer.');
122
+ }
123
+ let day = parseInt ( idnr . substring ( 0 , 2 ) , 10 ) ;
124
+ let month = parseInt ( idnr . substring ( 2 , 4 ) , 10 ) ;
125
+ const yearPart = parseInt ( idnr . substring ( 4 , 6 ) , 10 ) ;
126
+ const individnummer = parseInt ( idnr . substring ( 6 , 9 ) , 10 ) ;
127
+
128
+ // D-nummer: dag 41–71 → trekk 40
129
+ if ( day >= 41 && day <= 71 ) {
130
+ day -= 40 ;
131
+ }
132
+
133
+ // NAV-syntetisk: måned 41–52 → trekk 40
134
+ if ( month >= 41 && month <= 52 ) {
135
+ month -= 40 ;
123
136
}
124
137
125
- const day = parseInt ( fnr . substring ( 0 , 2 ) , 10 ) ;
126
- const month = parseInt ( fnr . substring ( 2 , 4 ) , 10 ) ;
127
- const yearPart = parseInt ( fnr . substring ( 4 , 6 ) , 10 ) ;
128
- const individnummer = parseInt ( fnr . substring ( 6 , 9 ) , 10 ) ;
138
+ // Skatt-syntetisk: måned 81–92 → trekk 80
139
+ if ( month >= 81 && month <= 92 ) {
140
+ month -= 80 ;
141
+ }
142
+
143
+ // Valider dag/måned etter justering
144
+ if ( month < 1 || month > 12 || day < 1 || day > 31 ) {
145
+ return undefined ;
146
+ }
129
147
130
148
let year : number ;
131
149
132
150
if ( individnummer >= 0 && individnummer <= 499 ) {
133
151
year = 1900 + yearPart ;
134
- } else if ( individnummer >= 500 && individnummer <= 749 && yearPart >= 0 && yearPart <= 39 ) {
135
- year = 2000 + yearPart ;
136
- } else if ( individnummer >= 900 && individnummer <= 999 && yearPart >= 0 && yearPart <= 39 ) {
137
- year = 1900 + yearPart ;
138
- } else if ( individnummer >= 500 && individnummer <= 999 && yearPart >= 40 && yearPart <= 99 ) {
152
+ } else if ( individnummer >= 500 && individnummer <= 749 && yearPart >= 54 && yearPart <= 99 ) {
153
+ year = 1800 + yearPart ;
154
+ } else if ( individnummer >= 900 && individnummer <= 999 && yearPart >= 40 && yearPart <= 99 ) {
139
155
year = 1900 + yearPart ;
156
+ } else if ( individnummer >= 500 && individnummer <= 999 && yearPart >= 0 && yearPart <= 39 ) {
157
+ year = 2000 + yearPart ;
140
158
} else {
141
- return undefined ; // Ugyldig fødselsnummer
159
+ return undefined ;
142
160
}
143
161
144
162
try {
145
- return dayjs . utc ( new Date ( year , month - 1 , day ) ) . toDate ( ) ;
163
+ return new Date ( year , month - 1 , day ) ;
146
164
} catch {
147
165
return undefined ;
148
166
}
@@ -154,7 +172,7 @@ export const dateUtils = {
154
172
getDatesInMonth,
155
173
getFirstOfTwoDates,
156
174
getFirstWeekDayInMonth,
157
- getFødselsdatoFromFødselsnummer ,
175
+ getFødselsdatoFromIdNr ,
158
176
getLastOfTwoDates,
159
177
getISOWeekdayFromISODate,
160
178
getLastWeekDayInMonth,
0 commit comments