diff --git a/apps/etterlatte-behandling/src/test/kotlin/grunnlagsendring/GrunnlagHelperKtTest.kt b/apps/etterlatte-behandling/src/test/kotlin/grunnlagsendring/GrunnlagHelperKtTest.kt index ac11c16bb45..2dae63f0a5a 100644 --- a/apps/etterlatte-behandling/src/test/kotlin/grunnlagsendring/GrunnlagHelperKtTest.kt +++ b/apps/etterlatte-behandling/src/test/kotlin/grunnlagsendring/GrunnlagHelperKtTest.kt @@ -147,7 +147,10 @@ internal class GrunnlagHelperKtTest { fun `skal hente utland`() { val utland = Utland( - innflyttingTilNorge = listOf(InnflyttingTilNorge("Danmark", LocalDate.of(2007, 4, 1))), + innflyttingTilNorge = + listOf( + InnflyttingTilNorge("Danmark", LocalDate.of(2007, 4, 1), LocalDate.of(2013, 7, 9), LocalDate.of(2013, 7, 9)), + ), utflyttingFraNorge = listOf( UtflyttingFraNorge("Sverige", LocalDate.of(2005, 7, 8)), diff --git a/apps/etterlatte-behandling/src/test/kotlin/grunnlagsendring/SamsvarHelperKtTest.kt b/apps/etterlatte-behandling/src/test/kotlin/grunnlagsendring/SamsvarHelperKtTest.kt index c0a203648e3..a781030f7c0 100644 --- a/apps/etterlatte-behandling/src/test/kotlin/grunnlagsendring/SamsvarHelperKtTest.kt +++ b/apps/etterlatte-behandling/src/test/kotlin/grunnlagsendring/SamsvarHelperKtTest.kt @@ -66,7 +66,10 @@ internal class SamsvarHelperKtTest { fun `samsvarUtflytting med samsvar`() { val utland = Utland( - innflyttingTilNorge = listOf(InnflyttingTilNorge("Tyskland", LocalDate.of(2013, 7, 9))), + innflyttingTilNorge = + listOf( + InnflyttingTilNorge("Tyskland", LocalDate.of(2013, 7, 9), LocalDate.of(2013, 7, 9), LocalDate.of(2013, 7, 9)), + ), utflyttingFraNorge = listOf(UtflyttingFraNorge("Tyskland", LocalDate.of(2022, 1, 1))), ) val utflyttingPdl = utland @@ -79,7 +82,10 @@ internal class SamsvarHelperKtTest { fun `samsvarUtflytting uten samsvar`() { val utflyttingPdl = Utland( - innflyttingTilNorge = listOf(InnflyttingTilNorge("Tyskland", LocalDate.of(2013, 7, 9))), + innflyttingTilNorge = + listOf( + InnflyttingTilNorge("Tyskland", LocalDate.of(2013, 7, 9), LocalDate.of(2013, 7, 9), LocalDate.of(2013, 7, 9)), + ), utflyttingFraNorge = listOf(UtflyttingFraNorge("Tyskland", LocalDate.of(2022, 1, 1))), ) val utflyttingGrunnlag = diff --git a/apps/etterlatte-pdltjenester/src/main/kotlin/pdl/PdlModell.kt b/apps/etterlatte-pdltjenester/src/main/kotlin/pdl/PdlModell.kt index bfc9cd80215..05ddbd130b6 100644 --- a/apps/etterlatte-pdltjenester/src/main/kotlin/pdl/PdlModell.kt +++ b/apps/etterlatte-pdltjenester/src/main/kotlin/pdl/PdlModell.kt @@ -236,6 +236,7 @@ data class PdlFoedested( data class PdlFolkeregistermetadata( val gyldighetstidspunkt: LocalDateTime? = null, + val ajourholdstidspunkt: LocalDateTime? = null, val opphoerstidspunkt: LocalDateTime? = null, ) @@ -305,6 +306,7 @@ data class PdlUtflyttingFraNorge( ) data class PdlBostedsadresse( + val angittFlyttedato: LocalDate? = null, val coAdressenavn: String?, val gyldigFraOgMed: LocalDateTime? = null, val gyldigTilOgMed: LocalDateTime? = null, diff --git a/apps/etterlatte-pdltjenester/src/main/kotlin/pdl/mapper/UtlandMapper.kt b/apps/etterlatte-pdltjenester/src/main/kotlin/pdl/mapper/UtlandMapper.kt index ab1342972ef..86c0e08c833 100644 --- a/apps/etterlatte-pdltjenester/src/main/kotlin/pdl/mapper/UtlandMapper.kt +++ b/apps/etterlatte-pdltjenester/src/main/kotlin/pdl/mapper/UtlandMapper.kt @@ -3,15 +3,17 @@ package no.nav.etterlatte.pdl.mapper import no.nav.etterlatte.libs.common.person.InnflyttingTilNorge import no.nav.etterlatte.libs.common.person.UtflyttingFraNorge import no.nav.etterlatte.libs.common.person.Utland +import no.nav.etterlatte.pdl.PdlBostedsadresse import no.nav.etterlatte.pdl.PdlHentPerson import no.nav.etterlatte.pdl.PdlInnflyttingTilNorge import no.nav.etterlatte.pdl.PdlUtflyttingFraNorge +import java.time.LocalDate object UtlandMapper { fun mapUtland(hentPerson: PdlHentPerson): Utland = Utland( utflyttingFraNorge = hentPerson.utflyttingFraNorge?.map { (mapUtflytting(it)) }, - innflyttingTilNorge = hentPerson.innflyttingTilNorge?.map { (mapInnflytting(it)) }, + innflyttingTilNorge = hentPerson.innflyttingTilNorge?.map { (mapInnflytting(it, hentPerson.bostedsadresse)) }, ) private fun mapUtflytting(utflytting: PdlUtflyttingFraNorge): UtflyttingFraNorge = @@ -20,11 +22,65 @@ object UtlandMapper { dato = utflytting.utflyttingsdato, ) - private fun mapInnflytting(innflytting: PdlInnflyttingTilNorge): InnflyttingTilNorge = - InnflyttingTilNorge( + private fun mapInnflytting( + innflytting: PdlInnflyttingTilNorge, + bostedsadresse: List?, + ): InnflyttingTilNorge { + val gyldighetsdato: LocalDate? = innflytting.folkeregistermetadata?.gyldighetstidspunkt?.toLocalDate() + val ajourholdsdato: LocalDate? = innflytting.folkeregistermetadata?.ajourholdstidspunkt?.toLocalDate() + + // Logikk for å finne innvandretDato er hentet fra Pesys + val innvandretDato = + if (gyldighetsdato != null) { + val angittFlyttedato = + bostedsadresse + ?.filter { + it.gyldigFraOgMed != null + }?.find { it.gyldigFraOgMed?.toLocalDate() == gyldighetsdato } + ?.angittFlyttedato + + if (angittFlyttedato != null) { + angittFlyttedato + } else { + finnForsteDatoEtterInnflytting(gyldighetsdato, bostedsadresse) + } + } else if (ajourholdsdato != null) { + finnForsteDatoEtterInnflytting(ajourholdsdato, bostedsadresse) + } else { + null + } + + return InnflyttingTilNorge( fraflyttingsland = innflytting.fraflyttingsland, - // TODO her må vi heller sjekke mot gyldighetsdato på bostedsadresse - // TODO skal ikke være tostring her - dato = innflytting.folkeregistermetadata?.gyldighetstidspunkt?.toLocalDate(), + dato = innvandretDato, + gyldighetsdato = gyldighetsdato, + ajourholdsdato = ajourholdsdato, ) + } + + private fun finnForsteDatoEtterInnflytting( + systemoppgitt: LocalDate, + bostedsadresse: List?, + ): LocalDate { + if (bostedsadresse.isNullOrEmpty()) { + return systemoppgitt + } + + return bostedsadresse + .sortedBy { it.angittFlyttedato } + .mapNotNull { hentDatoForBostedadresse(it) } + .firstOrNull { it.isAfter(systemoppgitt) || it.isEqual(systemoppgitt) } ?: systemoppgitt + } + + private fun hentDatoForBostedadresse(bostedsadresse: PdlBostedsadresse): LocalDate? { + if (bostedsadresse.angittFlyttedato != null) { + return bostedsadresse.angittFlyttedato + } + + if (bostedsadresse.gyldigFraOgMed != null) { + return bostedsadresse.gyldigFraOgMed.toLocalDate() + } + + return null + } } diff --git a/apps/etterlatte-pdltjenester/src/main/resources/pdl/hentPerson.graphql b/apps/etterlatte-pdltjenester/src/main/resources/pdl/hentPerson.graphql index cd4c9b81fc5..160a1b86014 100644 --- a/apps/etterlatte-pdltjenester/src/main/resources/pdl/hentPerson.graphql +++ b/apps/etterlatte-pdltjenester/src/main/resources/pdl/hentPerson.graphql @@ -172,6 +172,7 @@ query( } } bostedsadresse(historikk: $bostedsadresseHistorikk) @include(if: $bostedsadresse) { + angittFlyttedato coAdressenavn vegadresse {...vegadresseDetails} utenlandskAdresse {...utenlandskAdresseDetails} diff --git a/apps/etterlatte-pdltjenester/src/main/resources/pdl/hentPersonBolk.graphql b/apps/etterlatte-pdltjenester/src/main/resources/pdl/hentPersonBolk.graphql index d4a7642ab22..830e55b64ca 100644 --- a/apps/etterlatte-pdltjenester/src/main/resources/pdl/hentPersonBolk.graphql +++ b/apps/etterlatte-pdltjenester/src/main/resources/pdl/hentPersonBolk.graphql @@ -156,6 +156,7 @@ query( } } bostedsadresse(historikk: $bostedsadresseHistorikk) @include(if: $bostedsadresse) { + angittFlyttedato coAdressenavn vegadresse {...vegadresseDetails} utenlandskAdresse {...utenlandskAdresseDetails} diff --git a/apps/etterlatte-pdltjenester/src/test/kotlin/pdl/mapper/UtlandMapperTest.kt b/apps/etterlatte-pdltjenester/src/test/kotlin/pdl/mapper/UtlandMapperTest.kt index 3167d09babd..eb935082d7f 100644 --- a/apps/etterlatte-pdltjenester/src/test/kotlin/pdl/mapper/UtlandMapperTest.kt +++ b/apps/etterlatte-pdltjenester/src/test/kotlin/pdl/mapper/UtlandMapperTest.kt @@ -46,10 +46,69 @@ internal class UtlandMapperTest { every { folkeregistermetadata } returns mockk { every { gyldighetstidspunkt } returns LocalDateTime.parse("2021-07-01T00:00:00") + every { ajourholdstidspunkt } returns LocalDateTime.parse("2021-07-01T00:00:00") } }, ) every { utflyttingFraNorge } returns null + every { bostedsadresse } returns + listOf( + mockk { + every { angittFlyttedato } returns LocalDate.parse("2021-07-01") + every { gyldigFraOgMed } returns LocalDateTime.parse("2021-07-01T00:00:00") + }, + ) + } + + val utland = UtlandMapper.mapUtland(hentPerson) + + assertEquals("FRA", utland.innflyttingTilNorge?.first()?.fraflyttingsland) + assertEquals( + "2021-07-01", + utland.innflyttingTilNorge + ?.first() + ?.dato + .toString(), + ) + assertEquals( + "2021-07-01", + utland.innflyttingTilNorge + ?.first() + ?.gyldighetsdato + .toString(), + ) + assertEquals( + "2021-07-01", + utland.innflyttingTilNorge + ?.first() + ?.ajourholdsdato + .toString(), + ) + } + + @Test + fun `skal mappe dato til angittFlyttedato hvis angittFlyttedato er etter gyldighetstidspunkt`() { + val hentPerson = + mockk { + every { innflyttingTilNorge } returns + listOf( + mockk { + every { fraflyttingsland } returns "FRA" + every { folkeregistermetadata } returns + mockk { + every { gyldighetstidspunkt } returns LocalDateTime.parse("2021-06-01T00:00:00") + every { ajourholdstidspunkt } returns LocalDateTime.parse("2021-08-01T00:00:00") + } + }, + ) + every { utflyttingFraNorge } returns null + every { bostedsadresse } returns + listOf( + mockk { + every { angittFlyttedato } returns LocalDate.parse("2021-07-01") + every { gyldigFraOgMed } returns LocalDateTime.parse("2021-07-01T00:00:00") + }, + ) } val utland = UtlandMapper.mapUtland(hentPerson) @@ -63,4 +122,78 @@ internal class UtlandMapperTest { .toString(), ) } + + @Test + fun `skal mappe dato til gyldighetstidspunkt hvis angittFlyttedato er før gyldighetstidspunkt`() { + val hentPerson = + mockk { + every { innflyttingTilNorge } returns + listOf( + mockk { + every { fraflyttingsland } returns "FRA" + every { folkeregistermetadata } returns + mockk { + every { gyldighetstidspunkt } returns LocalDateTime.parse("2021-08-01T00:00:00") + every { ajourholdstidspunkt } returns LocalDateTime.parse("2021-09-01T00:00:00") + } + }, + ) + every { utflyttingFraNorge } returns null + every { bostedsadresse } returns + listOf( + mockk { + every { angittFlyttedato } returns LocalDate.parse("2021-07-01") + every { gyldigFraOgMed } returns LocalDateTime.parse("2021-07-01T00:00:00") + }, + ) + } + + val utland = UtlandMapper.mapUtland(hentPerson) + + assertEquals("FRA", utland.innflyttingTilNorge?.first()?.fraflyttingsland) + assertEquals( + "2021-08-01", + utland.innflyttingTilNorge + ?.first() + ?.dato + .toString(), + ) + } + + @Test + fun `skal mappe dato til ajourholdstidspunkt hvis gyldighetstidspunkt er null`() { + val hentPerson = + mockk { + every { innflyttingTilNorge } returns + listOf( + mockk { + every { fraflyttingsland } returns "FRA" + every { folkeregistermetadata } returns + mockk { + every { gyldighetstidspunkt } returns null + every { ajourholdstidspunkt } returns LocalDateTime.parse("2021-09-01T00:00:00") + } + }, + ) + every { utflyttingFraNorge } returns null + every { bostedsadresse } returns + listOf( + mockk { + every { angittFlyttedato } returns null + every { gyldigFraOgMed } returns LocalDateTime.parse("2021-07-01T00:00:00") + }, + ) + } + + val utland = UtlandMapper.mapUtland(hentPerson) + + assertEquals("FRA", utland.innflyttingTilNorge?.first()?.fraflyttingsland) + assertEquals( + "2021-09-01", + utland.innflyttingTilNorge + ?.first() + ?.dato + .toString(), + ) + } } diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/person/personopplysninger/Innflytting.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/person/personopplysninger/Innflytting.tsx index c72c62852dc..54a56eae657 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/person/personopplysninger/Innflytting.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/person/personopplysninger/Innflytting.tsx @@ -1,14 +1,11 @@ import React, { ReactNode } from 'react' import { Personopplysning } from '~components/person/personopplysninger/Personopplysning' import { AirplaneIcon } from '@navikt/aksel-icons' -import { Heading, Table } from '@navikt/ds-react' +import { Heading, ReadMore, Table, VStack } from '@navikt/ds-react' import { finnLandSomTekst } from '~components/person/personopplysninger/utils' import { ILand } from '~utils/kodeverk' - -interface InnflyttingDTO { - fraflyttingsland?: string - dato?: string -} +import { formaterDatoMedFallback } from '~utils/formatering/dato' +import { InnflyttingDTO } from '~shared/types/Person' export const Innflytting = ({ innflytting, @@ -19,11 +16,27 @@ export const Innflytting = ({ }): ReactNode => { return ( }> + + + Gyldighetsdato kommer fra folkeregisteret og har ikke nødvendigvis sammenheng med når innflytting faktisk + skjedde. +
+
+ Dersom man skal finne ut om en person regnes som innflyttet i henhold til folkeregisterlover, så kan man se på + om personen har en norsk bostedsadresse med angitt flyttedato. +
+ + Datoen opplysningen ble opprettet i Folkeregisteret. Feltet mangler på en del opplysninger migrert fra gammelt + registert. + +
Innflyttet fra - Innflyttet år + Dato + Gyldighetsdato + Ajourholdsdato @@ -34,7 +47,9 @@ export const Innflytting = ({ {!!flytting.fraflyttingsland && finnLandSomTekst(flytting.fraflyttingsland, landListe)} - {!!flytting.dato && new Date(flytting.dato).getFullYear()} + {formaterDatoMedFallback(flytting.dato)} + {formaterDatoMedFallback(flytting.gyldighetsdato)} + {formaterDatoMedFallback(flytting.ajourholdsdato)} ))} diff --git a/apps/etterlatte-saksbehandling-ui/client/src/shared/types/Person.ts b/apps/etterlatte-saksbehandling-ui/client/src/shared/types/Person.ts index 6c147ee0b30..c87941b0447 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/shared/types/Person.ts +++ b/apps/etterlatte-saksbehandling-ui/client/src/shared/types/Person.ts @@ -74,10 +74,14 @@ export interface Utland { tilflyttingsland?: string dato?: string }[] - innflyttingTilNorge?: { - fraflyttingsland?: string - dato?: string - }[] + innflyttingTilNorge?: InnflyttingDTO[] +} + +export interface InnflyttingDTO { + fraflyttingsland?: string + dato?: string + gyldighetsdato?: string + ajourholdsdato?: string } export interface Statsborgerskap { diff --git a/libs/saksbehandling-common/src/main/kotlin/person/Person.kt b/libs/saksbehandling-common/src/main/kotlin/person/Person.kt index 14665cdf426..6df316f2e8f 100644 --- a/libs/saksbehandling-common/src/main/kotlin/person/Person.kt +++ b/libs/saksbehandling-common/src/main/kotlin/person/Person.kt @@ -114,6 +114,8 @@ data class Utland( data class InnflyttingTilNorge( val fraflyttingsland: String?, val dato: LocalDate?, + val gyldighetsdato: LocalDate?, + val ajourholdsdato: LocalDate?, ) data class UtflyttingFraNorge(