From b832a6505f6357bd3d48b4ce95415859849e3833 Mon Sep 17 00:00:00 2001 From: Ann Katrin Gagnat Date: Wed, 14 Feb 2024 11:45:14 +0100 Subject: [PATCH 1/4] Derive birth year from fnr individnr --- .../src/formio/overrides/index.js | 1 - .../overrides/moment-overrides/index.js | 6 ---- .../utils-overrides/utils-overrides.js | 27 ++++++++++++--- .../utils-overrides/utils-overrides.test.js | 33 +++++++++++-------- 4 files changed, 41 insertions(+), 26 deletions(-) delete mode 100644 packages/shared-components/src/formio/overrides/moment-overrides/index.js diff --git a/packages/shared-components/src/formio/overrides/index.js b/packages/shared-components/src/formio/overrides/index.js index 8f4e7fde0..72333dc78 100644 --- a/packages/shared-components/src/formio/overrides/index.js +++ b/packages/shared-components/src/formio/overrides/index.js @@ -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'; diff --git a/packages/shared-components/src/formio/overrides/moment-overrides/index.js b/packages/shared-components/src/formio/overrides/moment-overrides/index.js deleted file mode 100644 index 37cb0eb02..000000000 --- a/packages/shared-components/src/formio/overrides/moment-overrides/index.js +++ /dev/null @@ -1,6 +0,0 @@ -import moment from 'moment/moment'; - -moment.parseTwoDigitYear = function (yearString) { - const lastTwoDigits = parseInt(yearString); - return lastTwoDigits + (lastTwoDigits > 55 ? 1900 : 2000); -}; diff --git a/packages/shared-components/src/formio/overrides/utils-overrides/utils-overrides.js b/packages/shared-components/src/formio/overrides/utils-overrides/utils-overrides.js index 1be688ac0..8bb81444c 100644 --- a/packages/shared-components/src/formio/overrides/utils-overrides/utils-overrides.js +++ b/packages/shared-components/src/formio/overrides/utils-overrides/utils-overrides.js @@ -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 ''; @@ -152,10 +151,28 @@ 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) { + 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 extract birth year + return undefined; + } + } + const birthDateStr = `${value.substring(0, 4)}${year}`; + return moment(birthDateStr, 'DDMMYYYY'); } return undefined; }; diff --git a/packages/shared-components/src/formio/overrides/utils-overrides/utils-overrides.test.js b/packages/shared-components/src/formio/overrides/utils-overrides/utils-overrides.test.js index b68bd9ed7..eea6a720b 100644 --- a/packages/shared-components/src/formio/overrides/utils-overrides/utils-overrides.test.js +++ b/packages/shared-components/src/formio/overrides/utils-overrides/utils-overrides.test.js @@ -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); @@ -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); @@ -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); @@ -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); }); From 5a8124622b1c7ae8cca3f3ffd4776c970c06e2b0 Mon Sep 17 00:00:00 2001 From: Ann Katrin Gagnat Date: Wed, 14 Feb 2024 11:47:33 +0100 Subject: [PATCH 2/4] add comment to explain return value undefined --- .../src/formio/overrides/utils-overrides/utils-overrides.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/shared-components/src/formio/overrides/utils-overrides/utils-overrides.js b/packages/shared-components/src/formio/overrides/utils-overrides/utils-overrides.js index 8bb81444c..3d0bfa674 100644 --- a/packages/shared-components/src/formio/overrides/utils-overrides/utils-overrides.js +++ b/packages/shared-components/src/formio/overrides/utils-overrides/utils-overrides.js @@ -155,6 +155,7 @@ const getBirthDate = (fnrKey, submission = {}) => { 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)); From f1900acc1a48ac66993049959dede20536eafe9f Mon Sep 17 00:00:00 2001 From: Ann Katrin Gagnat Date: Wed, 14 Feb 2024 11:49:24 +0100 Subject: [PATCH 3/4] comment --- .../src/formio/overrides/utils-overrides/utils-overrides.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/shared-components/src/formio/overrides/utils-overrides/utils-overrides.js b/packages/shared-components/src/formio/overrides/utils-overrides/utils-overrides.js index 3d0bfa674..e3a8a24eb 100644 --- a/packages/shared-components/src/formio/overrides/utils-overrides/utils-overrides.js +++ b/packages/shared-components/src/formio/overrides/utils-overrides/utils-overrides.js @@ -168,7 +168,7 @@ const getBirthDate = (fnrKey, submission = {}) => { } else if (900 <= individnr && individnr < 1000 && 39 < year) { year += 1900; } else { - // unable to extract birth year + // unable to derive birth year return undefined; } } From 56fe266375d237fd55c668dd921470fe19bb27dc Mon Sep 17 00:00:00 2001 From: Ann Katrin Gagnat Date: Wed, 14 Feb 2024 11:54:14 +0100 Subject: [PATCH 4/4] Remove documentation which is not valid anymore --- .../components/base/editForm/shared/editFormVariablesTable.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/shared-components/src/formio/components/base/editForm/shared/editFormVariablesTable.ts b/packages/shared-components/src/formio/components/base/editForm/shared/editFormVariablesTable.ts index 8237ff5fa..b8cb37cd0 100644 --- a/packages/shared-components/src/formio/components/base/editForm/shared/editFormVariablesTable.ts +++ b/packages/shared-components/src/formio/components/base/editForm/shared/editFormVariablesTable.ts @@ -22,7 +22,6 @@ const editFormVariablesTable = (additional?: string): Component => { 'utilsEn instans av FormioUtils, inkludert et par egendefinerte hjelpefunksjoner (se nedenfor).' + '
' + '

Egendefinerte hjelpefunksjoner på utils.

' + - '

NB: 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.

' + '' + "" + "" +
isBornBeforeYearGitt api-key til et fødselsnummer returnerer denne funksjonen om personen er født tidligere enn oppgitt årstall.
utils.isBornBeforeYear(1964, 'fnr', submission)
isAgeBetweenGitt api-key til et fødselsnummer returnerer denne funksjonen om personens alder ligger innenfor et intervall.
utils.isAgeBetween([18, 67], 'fnr', submission)