Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Derive birth year from fnr individnr #1023

Merged
merged 4 commits into from
Feb 14, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ const editFormVariablesTable = (additional?: string): Component => {
'<tr><th>utils</th><td>En instans av <a href="http://formio.github.io/formio.js/docs/identifiers.html#utils" target="_blank">FormioUtils</a>, inkludert et par egendefinerte hjelpefunksjoner (se nedenfor).</td></tr>' +
'</table><br/>' +
'<p>Egendefinerte hjelpefunksjoner på utils.</p>' +
'<p><b>NB:</b> Funksjonene som basererer seg på fødselsnummer for å finne personens alder eller fødselsår vil ikke fungere dersom personen er født i 1955 eller tidligere.</p>' +
'<table class="table table-bordered table-condensed table-striped">' +
"<tr><th>isBornBeforeYear</th><td>Gitt api-key til et fødselsnummer returnerer denne funksjonen om personen er født tidligere enn oppgitt årstall.<br/><small><pre>utils.isBornBeforeYear(1964, 'fnr', submission)</pre></small></td></tr>" +
"<tr><th>isAgeBetween</th><td>Gitt api-key til et fødselsnummer returnerer denne funksjonen om personens alder ligger innenfor et intervall.<br/><small><pre>utils.isAgeBetween([18, 67], 'fnr', submission)</pre></small></td></tr>" +
Expand Down
1 change: 0 additions & 1 deletion packages/shared-components/src/formio/overrides/index.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
// Need import so that overrides are registered
import './moment-overrides';
import './utils-overrides/utils-overrides';
import './wizard-overrides.js/wizard-overrides';

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import fnrvalidator from '@navikt/fnrvalidator';
import { formDiffingTool, navFormioUtils } from '@navikt/skjemadigitalisering-shared-domain';
import { Utils } from 'formiojs';
import moment from 'moment/moment';
import '../moment-overrides';

const additionalDescription = (ctx) => {
if (!ctx.component.additionalDescriptionLabel && !ctx.component.additionalDescriptionText) return '';
Expand Down Expand Up @@ -152,10 +151,29 @@ const getAge = (fnrKey, submission = {}, pointInTime = moment()) => {
};

const getBirthDate = (fnrKey, submission = {}) => {
const value = Utils.getValue(submission, fnrKey);
if (value && fnrvalidator.fnr(value.trim()).status === 'valid') {
const birthDateStr = value.substring(0, 6);
return moment(birthDateStr, 'DDMMYY');
const value = Utils.getValue(submission, fnrKey)?.trim();
if (value && fnrvalidator.fnr(value).status === 'valid') {
let year = parseInt(value.substring(4, 6));
if (parseInt(value.substring(6)) < 10) {
// stillborn
return undefined;
} else {
const individnr = parseInt(value.substring(6, 9));
if (individnr < 500) {
year += 1900;
} else if (individnr < 750 && 54 < year) {
year += 1800;
} else if (individnr < 1000 && year < 40) {
year += 2000;
} else if (900 <= individnr && individnr < 1000 && 39 < year) {
year += 1900;
} else {
// unable to derive birth year
return undefined;
}
}
const birthDateStr = `${value.substring(0, 4)}${year}`;
return moment(birthDateStr, 'DDMMYYYY');
}
return undefined;
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -356,18 +356,23 @@ describe('utils-overrides', () => {
expect(UtilsOverrides.isBornBeforeYear(1964, 'fnr', { data: { fnr: '11013912345' } })).toBe(false);
});

it('parses birth year 55 as 2055', () => {
const FNR = '31105543487';
expect(UtilsOverrides.isBornBeforeYear(1954, 'fnr', { data: { fnr: FNR } })).toBe(false);
expect(UtilsOverrides.isBornBeforeYear(1955, 'fnr', { data: { fnr: FNR } })).toBe(false);
expect(UtilsOverrides.isBornBeforeYear(1956, 'fnr', { data: { fnr: FNR } })).toBe(false);
expect(UtilsOverrides.isBornBeforeYear(2054, 'fnr', { data: { fnr: FNR } })).toBe(false);
expect(UtilsOverrides.isBornBeforeYear(2055, 'fnr', { data: { fnr: FNR } })).toBe(false);
expect(UtilsOverrides.isBornBeforeYear(2056, 'fnr', { data: { fnr: FNR } })).toBe(true);
describe('birth date 18.09.1922', () => {
const FNR = '18092200163';

it.each([`${FNR}`, ` ${FNR}`, `${FNR} `])('submission value "%s" is correctly evaluated', (FNR) => {
expect(UtilsOverrides.isBornBeforeYear(1921, 'fnr', { data: { fnr: FNR } })).toBe(false);
expect(UtilsOverrides.isBornBeforeYear(1922, 'fnr', { data: { fnr: FNR } })).toBe(false);
expect(UtilsOverrides.isBornBeforeYear(1923, 'fnr', { data: { fnr: FNR } })).toBe(true);
expect(UtilsOverrides.isBornBeforeYear(1924, 'fnr', { data: { fnr: FNR } })).toBe(true);
expect(UtilsOverrides.isBornBeforeYear(2021, 'fnr', { data: { fnr: FNR } })).toBe(true);
expect(UtilsOverrides.isBornBeforeYear(2022, 'fnr', { data: { fnr: FNR } })).toBe(true);
expect(UtilsOverrides.isBornBeforeYear(2023, 'fnr', { data: { fnr: FNR } })).toBe(true);
expect(UtilsOverrides.isBornBeforeYear(2024, 'fnr', { data: { fnr: FNR } })).toBe(true);
});
});

it('parses birth year 56 as 1956', () => {
const FNR = '01055631685';
it('birth date 01.05.1956', () => {
const FNR = '01055600046';
expect(UtilsOverrides.isBornBeforeYear(1955, 'fnr', { data: { fnr: FNR } })).toBe(false);
expect(UtilsOverrides.isBornBeforeYear(1956, 'fnr', { data: { fnr: FNR } })).toBe(false);
expect(UtilsOverrides.isBornBeforeYear(1957, 'fnr', { data: { fnr: FNR } })).toBe(true);
Expand All @@ -376,8 +381,8 @@ describe('utils-overrides', () => {
expect(UtilsOverrides.isBornBeforeYear(2056, 'fnr', { data: { fnr: FNR } })).toBe(true);
});

it('parses birth year 39 as 2039', () => {
const FNR = '11013942015';
it('birth date 13.04.2039', () => {
const FNR = '13043950287';
expect(UtilsOverrides.isBornBeforeYear(1938, 'fnr', { data: { fnr: FNR } })).toBe(false);
expect(UtilsOverrides.isBornBeforeYear(1939, 'fnr', { data: { fnr: FNR } })).toBe(false);
expect(UtilsOverrides.isBornBeforeYear(1940, 'fnr', { data: { fnr: FNR } })).toBe(false);
Expand All @@ -389,7 +394,7 @@ describe('utils-overrides', () => {
});

it('handles composite key', () => {
const FNR = '01055631685';
const FNR = '01055600046';
const submission = { data: { fornavn: '', container: { fodselsnummer: FNR } } };
expect(UtilsOverrides.isBornBeforeYear(1955, 'container.fodselsnummer', submission)).toBe(false);
expect(UtilsOverrides.isBornBeforeYear(1956, 'container.fodselsnummer', submission)).toBe(false);
Expand Down Expand Up @@ -423,7 +428,7 @@ describe('utils-overrides', () => {
});

it('handles future fnr', () => {
const FNR = '06073333138';
const FNR = '06073350288';
expect(UtilsOverrides.getAge('fnr', { data: { fnr: FNR } }, pointInTime('15.10.2024'))).toBe(-8);
expect(UtilsOverrides.getAge('fnr', { data: { fnr: FNR } }, pointInTime('06.07.2033'))).toBe(0);
});
Expand Down
Loading