Skip to content

Commit

Permalink
EY-4808: Bruk angitt flyttedato for innflytting (#6559)
Browse files Browse the repository at this point in the history
* Hent dato for innflytting fra angittflyttedato

* Gjenbruk navn for felter fra pesys og vis hele datoen og ikke bare år

* Fiks tester

* Update apps/etterlatte-saksbehandling-ui/client/src/components/person/personopplysninger/Innflytting.tsx

Co-authored-by: Henrik Gundersen <[email protected]>

* Endre tidspunkt til adresse og dato

* tidspunkt til dato i backend

* Rett opp test

* Trenger ikke dobbel optional sjekk

* Oppdater tester

* Kommentar om at logikk er hentet fra pesys

---------

Co-authored-by: Henrik Gundersen <[email protected]>
  • Loading branch information
emilps and henrikg authored Dec 5, 2024
1 parent 1447b8c commit 2fa5a22
Show file tree
Hide file tree
Showing 10 changed files with 244 additions and 21 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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)),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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 =
Expand Down
2 changes: 2 additions & 0 deletions apps/etterlatte-pdltjenester/src/main/kotlin/pdl/PdlModell.kt
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,7 @@ data class PdlFoedested(

data class PdlFolkeregistermetadata(
val gyldighetstidspunkt: LocalDateTime? = null,
val ajourholdstidspunkt: LocalDateTime? = null,
val opphoerstidspunkt: LocalDateTime? = null,
)

Expand Down Expand Up @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 =
Expand All @@ -20,11 +22,65 @@ object UtlandMapper {
dato = utflytting.utflyttingsdato,
)

private fun mapInnflytting(innflytting: PdlInnflyttingTilNorge): InnflyttingTilNorge =
InnflyttingTilNorge(
private fun mapInnflytting(
innflytting: PdlInnflyttingTilNorge,
bostedsadresse: List<PdlBostedsadresse>?,
): 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<PdlBostedsadresse>?,
): 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
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,7 @@ query(
}
}
bostedsadresse(historikk: $bostedsadresseHistorikk) @include(if: $bostedsadresse) {
angittFlyttedato
coAdressenavn
vegadresse {...vegadresseDetails}
utenlandskAdresse {...utenlandskAdresseDetails}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,7 @@ query(
}
}
bostedsadresse(historikk: $bostedsadresseHistorikk) @include(if: $bostedsadresse) {
angittFlyttedato
coAdressenavn
vegadresse {...vegadresseDetails}
utenlandskAdresse {...utenlandskAdresseDetails}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<PdlHentPerson> {
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)
Expand All @@ -63,4 +122,78 @@ internal class UtlandMapperTest {
.toString(),
)
}

@Test
fun `skal mappe dato til gyldighetstidspunkt hvis angittFlyttedato er før gyldighetstidspunkt`() {
val hentPerson =
mockk<PdlHentPerson> {
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<PdlHentPerson> {
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(),
)
}
}
Original file line number Diff line number Diff line change
@@ -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,
Expand All @@ -19,11 +16,27 @@ export const Innflytting = ({
}): ReactNode => {
return (
<Personopplysning heading="Innflytting" icon={<AirplaneIcon />}>
<VStack gap="4">
<ReadMore header="Gyldighetsdato">
Gyldighetsdato kommer fra folkeregisteret og har ikke nødvendigvis sammenheng med når innflytting faktisk
skjedde.
<br />
<br />
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.
</ReadMore>
<ReadMore header="Ajourholdsdato">
Datoen opplysningen ble opprettet i Folkeregisteret. Feltet mangler på en del opplysninger migrert fra gammelt
registert.
</ReadMore>
</VStack>
<Table>
<Table.Header>
<Table.Row>
<Table.ColumnHeader scope="col">Innflyttet fra</Table.ColumnHeader>
<Table.ColumnHeader scope="col">Innflyttet år</Table.ColumnHeader>
<Table.ColumnHeader scope="col">Dato</Table.ColumnHeader>
<Table.ColumnHeader scope="col">Gyldighetsdato</Table.ColumnHeader>
<Table.ColumnHeader scope="col">Ajourholdsdato</Table.ColumnHeader>
</Table.Row>
</Table.Header>
<Table.Body>
Expand All @@ -34,7 +47,9 @@ export const Innflytting = ({
<Table.DataCell>
{!!flytting.fraflyttingsland && finnLandSomTekst(flytting.fraflyttingsland, landListe)}
</Table.DataCell>
<Table.DataCell>{!!flytting.dato && new Date(flytting.dato).getFullYear()}</Table.DataCell>
<Table.DataCell>{formaterDatoMedFallback(flytting.dato)}</Table.DataCell>
<Table.DataCell>{formaterDatoMedFallback(flytting.gyldighetsdato)}</Table.DataCell>
<Table.DataCell>{formaterDatoMedFallback(flytting.ajourholdsdato)}</Table.DataCell>
</Table.Row>
))}
</>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
2 changes: 2 additions & 0 deletions libs/saksbehandling-common/src/main/kotlin/person/Person.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down

0 comments on commit 2fa5a22

Please sign in to comment.