diff --git a/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/api/v1/models/InntekterDto.kt b/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/api/v1/models/InntekterDto.kt index 77d2566b..5896bdbe 100644 --- a/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/api/v1/models/InntekterDto.kt +++ b/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/api/v1/models/InntekterDto.kt @@ -11,6 +11,7 @@ import no.nav.dagpenger.inntekt.inntektskomponenten.v1.Inntekt import no.nav.dagpenger.inntekt.inntektskomponenten.v1.InntektkomponentResponse import no.nav.dagpenger.inntekt.mapping.Inntektsmottaker import no.nav.dagpenger.inntekt.mapping.Virksomhet +import no.nav.dagpenger.inntekt.mapping.utledInntektType import java.time.LocalDateTime.now import java.time.YearMonth @@ -39,6 +40,7 @@ private fun mapToInntektkomponentResponse(inntekterDto: InntekterDto): Inntektko inntekterDto.virksomheter.forEach { virksomhet -> virksomhet.inntekter?.map { inntektMaaned -> val inntekter = inntektPerÅrOgMåned[inntektMaaned.aarMaaned]?.first ?: mutableListOf() + val inntektType = inntektMaaned.inntektType ?: utledInntektType(inntektMaaned.beskrivelse) inntekter.add( Inntekt( inntektMaaned.belop, @@ -59,7 +61,7 @@ private fun mapToInntektkomponentResponse(inntekterDto: InntekterDto): Inntektko inntektMaaned.inngaarIGrunnlagForTrekk, inntektMaaned.utloeserArbeidsgiveravgift, inntektMaaned.informasjonsstatus, - inntektMaaned.inntektType, + inntektType, inntektMaaned.tilleggsinformasjon, ), ) diff --git a/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/mapping/MapToInntektFrontend.kt b/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/mapping/MapToInntektFrontend.kt index 32841733..394cf2f8 100644 --- a/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/mapping/MapToInntektFrontend.kt +++ b/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/mapping/MapToInntektFrontend.kt @@ -147,7 +147,7 @@ data class InntektMaaned( val inngaarIGrunnlagForTrekk: Boolean? = null, val utloeserArbeidsgiveravgift: Boolean? = null, val informasjonsstatus: String? = null, - val inntektType: InntektType, + val inntektType: InntektType? = null, val tilleggsinformasjon: TilleggInformasjon? = null, val aarMaaned: YearMonth, ) diff --git a/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/mapping/Verdikoder.kt b/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/mapping/Verdikoder.kt index a42142de..61895926 100644 --- a/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/mapping/Verdikoder.kt +++ b/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/mapping/Verdikoder.kt @@ -17,12 +17,19 @@ fun verdiKode(datagrunnlagKlassifisering: DatagrunnlagKlassifisering): String { private fun shouldTryGenericMappingWithoutForhold(datagrunnlagKlassifisering: DatagrunnlagKlassifisering) = !dataGrunnlagKlassifiseringToVerdikode.contains(datagrunnlagKlassifisering) && datagrunnlagKlassifisering.forhold != null -fun dataGrunnlag(verdiKode: String): DatagrunnlagKlassifisering { - return dataGrunnlagKlassifiseringToVerdikode.inverse[verdiKode] +fun dataGrunnlag(verdiKode: String): DatagrunnlagKlassifisering = + dataGrunnlagKlassifiseringToVerdikode.inverse[verdiKode] ?: throw VerdiKodeMappingException("No datagrunnlag found for verdikode=$verdiKode") -} -class VerdiKodeMappingException(message: String) : RuntimeException(message) +fun utledInntektType(inntektBeskrivelse: InntektBeskrivelse): InntektType = + dataGrunnlagKlassifiseringToVerdikode.keys + .find { it.beskrivelse == inntektBeskrivelse } + ?.type + ?: throw IllegalArgumentException("Klarte ikke å utlede inntekttype fra inntektbeskrivelse \"$inntektBeskrivelse\".") + +class VerdiKodeMappingException( + message: String, +) : RuntimeException(message) @Suppress("ktlint:standard:max-line-length") val dataGrunnlagKlassifiseringToVerdikode = diff --git a/dp-inntekt-api/src/test/kotlin/no/nav/dagpenger/inntekt/api/v1/models/InntekterDtoTest.kt b/dp-inntekt-api/src/test/kotlin/no/nav/dagpenger/inntekt/api/v1/models/InntekterDtoTest.kt index 42bce877..cc877c54 100644 --- a/dp-inntekt-api/src/test/kotlin/no/nav/dagpenger/inntekt/api/v1/models/InntekterDtoTest.kt +++ b/dp-inntekt-api/src/test/kotlin/no/nav/dagpenger/inntekt/api/v1/models/InntekterDtoTest.kt @@ -15,7 +15,9 @@ import no.nav.dagpenger.inntekt.inntektskomponenten.v1.AktoerType.ORGANISASJON import no.nav.dagpenger.inntekt.inntektskomponenten.v1.Avvik import no.nav.dagpenger.inntekt.inntektskomponenten.v1.Inntekt import no.nav.dagpenger.inntekt.inntektskomponenten.v1.InntektBeskrivelse.BIL +import no.nav.dagpenger.inntekt.inntektskomponenten.v1.InntektBeskrivelse.SVANGERSKAPSPENGER_FERIEPENGER import no.nav.dagpenger.inntekt.inntektskomponenten.v1.InntektType.LOENNSINNTEKT +import no.nav.dagpenger.inntekt.inntektskomponenten.v1.InntektType.YTELSE_FRA_OFFENTLIGE import no.nav.dagpenger.inntekt.inntektskomponenten.v1.Periode import no.nav.dagpenger.inntekt.inntektskomponenten.v1.SpesielleInntjeningsforhold.LOENN_VED_KONKURS_ELLER_STATSGARANTI_OSV import no.nav.dagpenger.inntekt.inntektskomponenten.v1.TilleggInformasjon @@ -127,4 +129,22 @@ class InntekterDtoTest { it?.arbeidsInntektInformasjon?.inntektListe?.shouldBeEmpty() } } + + @Test + fun `mapToStoredInntekt mapper til forventet resultat når inntektType er null`() { + val inntektId = ULID().nextULID() + val inntekterDto = + jacksonObjectMapper.readValue( + this::class.java + .getResource("/test-data/expected-uklassifisert-post-body-inntektType-er-null.json") + ?.readText()!!, + ) + + val storedInntekt = inntekterDto.mapToStoredInntekt(inntektId = inntektId) + + storedInntekt.inntekt.arbeidsInntektMaaned?.first()?.arbeidsInntektInformasjon?.inntektListe?.first().let { + it?.beskrivelse shouldBe SVANGERSKAPSPENGER_FERIEPENGER + it?.inntektType shouldBe YTELSE_FRA_OFFENTLIGE + } + } } diff --git a/dp-inntekt-api/src/test/kotlin/no/nav/dagpenger/inntekt/mapping/VerdikoderKtTest.kt b/dp-inntekt-api/src/test/kotlin/no/nav/dagpenger/inntekt/mapping/VerdikoderKtTest.kt deleted file mode 100644 index 2b3bce07..00000000 --- a/dp-inntekt-api/src/test/kotlin/no/nav/dagpenger/inntekt/mapping/VerdikoderKtTest.kt +++ /dev/null @@ -1,38 +0,0 @@ -package no.nav.dagpenger.inntekt.mapping - -import no.nav.dagpenger.inntekt.inntektskomponenten.v1.InntektBeskrivelse -import no.nav.dagpenger.inntekt.inntektskomponenten.v1.InntektType -import no.nav.dagpenger.inntekt.inntektskomponenten.v1.SpesielleInntjeningsforhold -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.Test - -internal class VerdikoderKtTest { - @Test - fun `test posteringstype-mapping for Feriepenger`() { - val posteringsTypeInfo = DatagrunnlagKlassifisering(InntektType.LOENNSINNTEKT, InntektBeskrivelse.FERIEPENGER, null) - - assertEquals("Feriepenger", verdiKode(posteringsTypeInfo)) - } - - @Test - fun `test at inntjeningsforhold uten mapping er det samme som null`() { - val posteringsTypeWithNull = DatagrunnlagKlassifisering(InntektType.LOENNSINNTEKT, InntektBeskrivelse.FERIEPENGER, null) - val posteringsTypeWithoutMapping = - DatagrunnlagKlassifisering( - InntektType.LOENNSINNTEKT, - InntektBeskrivelse.FERIEPENGER, - SpesielleInntjeningsforhold.STATSANSATT_UTLANDET, - ) - - assertEquals(verdiKode(posteringsTypeWithNull), verdiKode(posteringsTypeWithoutMapping)) - } - - @Test - fun `test at ukjent inntjeningsforhold er det samme som null`() { - val posteringsTypeWithNull = DatagrunnlagKlassifisering(InntektType.LOENNSINNTEKT, InntektBeskrivelse.FERIEPENGER, null) - val posteringsTypeWithUnknown = - DatagrunnlagKlassifisering(InntektType.LOENNSINNTEKT, InntektBeskrivelse.FERIEPENGER, SpesielleInntjeningsforhold.UNKNOWN) - - assertEquals(verdiKode(posteringsTypeWithNull), verdiKode(posteringsTypeWithUnknown)) - } -} diff --git a/dp-inntekt-api/src/test/kotlin/no/nav/dagpenger/inntekt/mapping/VerdikoderTest.kt b/dp-inntekt-api/src/test/kotlin/no/nav/dagpenger/inntekt/mapping/VerdikoderTest.kt new file mode 100644 index 00000000..e8772fbb --- /dev/null +++ b/dp-inntekt-api/src/test/kotlin/no/nav/dagpenger/inntekt/mapping/VerdikoderTest.kt @@ -0,0 +1,52 @@ +package no.nav.dagpenger.inntekt.mapping + +import io.kotest.matchers.shouldBe +import no.nav.dagpenger.inntekt.inntektskomponenten.v1.InntektBeskrivelse +import no.nav.dagpenger.inntekt.inntektskomponenten.v1.InntektType.LOENNSINNTEKT +import no.nav.dagpenger.inntekt.inntektskomponenten.v1.InntektType.YTELSE_FRA_OFFENTLIGE +import no.nav.dagpenger.inntekt.inntektskomponenten.v1.SpesielleInntjeningsforhold +import org.junit.jupiter.api.Test + +@Suppress("ktlint:standard:max-line-length") +internal class VerdikoderTest { + @Test + fun `posteringstype-mapping for Feriepenger returnerer forventet verdi`() { + val posteringsTypeInfo = + DatagrunnlagKlassifisering(LOENNSINNTEKT, InntektBeskrivelse.FERIEPENGER, null) + + verdiKode(posteringsTypeInfo) shouldBe "Feriepenger" + } + + @Test + fun `verdikode for DatagrunnlagKlassifisering med inntjeningsforhold uten mapping skal være lik verdikode for DatagrunnlagKlassifisering som inntjeningsforhold lik null`() { + val posteringsTypeWithNull = + DatagrunnlagKlassifisering(LOENNSINNTEKT, InntektBeskrivelse.FERIEPENGER, null) + val posteringsTypeWithoutMapping = + DatagrunnlagKlassifisering( + LOENNSINNTEKT, + InntektBeskrivelse.FERIEPENGER, + SpesielleInntjeningsforhold.STATSANSATT_UTLANDET, + ) + + verdiKode(posteringsTypeWithoutMapping) shouldBe verdiKode(posteringsTypeWithNull) + } + + @Test + fun `verdikode for DatagrunnlagKlassifisering med ukjent inntjeningsforhold skal være lik verdikode for DatagrunnlagKlassifisering med inntjeningsforhold lik null`() { + val posteringsTypeWithNull = + DatagrunnlagKlassifisering(LOENNSINNTEKT, InntektBeskrivelse.FERIEPENGER, null) + val posteringsTypeWithUnknown = + DatagrunnlagKlassifisering( + LOENNSINNTEKT, + InntektBeskrivelse.FERIEPENGER, + SpesielleInntjeningsforhold.UNKNOWN, + ) + + verdiKode(posteringsTypeWithUnknown) shouldBe verdiKode(posteringsTypeWithNull) + } + + @Test + fun `utledInntektType utleder InntektBeskrivelse til forventet InntektType`() { + utledInntektType(InntektBeskrivelse.FORELDREPENGER) shouldBe YTELSE_FRA_OFFENTLIGE + } +} diff --git a/dp-inntekt-api/src/test/resources/test-data/expected-uklassifisert-post-body-inntektType-er-null.json b/dp-inntekt-api/src/test/resources/test-data/expected-uklassifisert-post-body-inntektType-er-null.json new file mode 100644 index 00000000..abe0b22d --- /dev/null +++ b/dp-inntekt-api/src/test/resources/test-data/expected-uklassifisert-post-body-inntektType-er-null.json @@ -0,0 +1,69 @@ +{ + "virksomheter": [ + { + "virksomhetsnummer": "123456789", + "virksomhetsnavn": "Test Virksomhet", + "periode": { + "fraOgMed": "2023-01", + "tilOgMed": "2024-12" + }, + "inntekter": [ + { + "belop": 50000.00, + "fordel": "kontantytelse", + "beskrivelse": "feriepengerSvangerskapspenger", + "inntektskilde": "A-ordningen", + "inntektsstatus": "LoependeInnrapportert", + "inntektsperiodetype": "Maaned", + "leveringstidspunkt": "2023-01", + "opptjeningsland": "NO", + "opptjeningsperiode": { + "startDato": "2023-01-04T00:00:00", + "sluttDato": "2023-01-25T00:00:00" + }, + "skattemessigBosattLand": "NO", + "utbetaltIMaaned": "2023-02", + "opplysningspliktig": { + "aktoerType": "NATURLIG_IDENT", + "identifikator": "06221841830" + }, + "inntektsinnsender": { + "aktoerType": "ORGANISASJON", + "identifikator": "561235623" + }, + "virksomhet": { + "aktoerType": "ORGANISASJON", + "identifikator": "123456789" + }, + "inntektsmottaker": { + "aktoerType": "AKTOER_ID", + "identifikator": "287631" + }, + "inngaarIGrunnlagForTrekk": true, + "utloeserArbeidsgiveravgift": false, + "informasjonsstatus": "InngaarAlltid", + "inntektType": null, + "tilleggsinformasjon": { + "kategori": "enKategori", + "tilleggsinformasjonDetaljer": { + "detaljerType": "enDetaljerType", + "spesielleInntjeningsforhold": "loennVedKonkursEllerStatsgarantiOsv" + } + }, + "aarMaaned": "2023-01" + } + ], + "totalBelop": 50000.00, + "avvikListe": [] + } + ], + "mottaker": { + "pnr": "19876543210", + "navn": "Navn Navnesen" + }, + "periode": { + "fraOgMed": "2000-12", + "tilOgMed": "2025-04" + }, + "begrunnelse": "Dette er en begrunnelse." +}