diff --git a/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/api/v1/UklassifisertInntektRoute.kt b/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/api/v1/UklassifisertInntektRoute.kt index 754b1331..2c21490a 100644 --- a/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/api/v1/UklassifisertInntektRoute.kt +++ b/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/api/v1/UklassifisertInntektRoute.kt @@ -29,6 +29,7 @@ import no.nav.dagpenger.inntekt.db.Inntektparametre import no.nav.dagpenger.inntekt.db.ManueltRedigert import no.nav.dagpenger.inntekt.db.RegelKontekst import no.nav.dagpenger.inntekt.db.StoreInntektCommand +import no.nav.dagpenger.inntekt.db.StoredInntektMedMetadata import no.nav.dagpenger.inntekt.inntektskomponenten.v1.AktoerType import no.nav.dagpenger.inntekt.inntektskomponenten.v1.InntektkomponentRequest import no.nav.dagpenger.inntekt.inntektskomponenten.v1.InntektskomponentClient @@ -152,7 +153,8 @@ fun Route.uklassifisertInntekt( .getStoredInntektMedMetadata(inntektId) .let { storedInntektMedMetadata -> val person = personOppslag.hentPerson(storedInntektMedMetadata.fødselsnummer) - val inntektsmottaker = Inntektsmottaker(storedInntektMedMetadata.fødselsnummer, person.sammensattNavn()) + val inntektsmottaker = + Inntektsmottaker(storedInntektMedMetadata.fødselsnummer, person.sammensattNavn()) val organisasjoner = hentOrganisasjoner( enhetsregisterClient, @@ -198,7 +200,8 @@ fun Route.uklassifisertInntekt( beregningsdato = inntektPersonMapping.beregningsdato, ).apply { this.opptjeningsperiode.førsteMåned = inntekterDto.periode.fraOgMed - this.opptjeningsperiode.sisteAvsluttendeKalenderMåned = inntekterDto.periode.tilOgMed + this.opptjeningsperiode.sisteAvsluttendeKalenderMåned = + inntekterDto.periode.tilOgMed }, inntekt = it.inntekt, manueltRedigert = @@ -283,6 +286,64 @@ fun Route.uklassifisertInntekt( } } } + + route("/uklassifisert/uncached/{inntektId}") { + get { + val callId = call.callId + withContext(coroutineContext) { + val inntektId = InntektId(call.parameters["inntektId"]!!) + logger.info { "Henter nye inntekt for $inntektId" } + + inntektStore + .getStoredInntektMedMetadata(inntektId) + .let { storedInntektMedMetadata -> + logger.info { "Henter stored inntekt: ${storedInntektMedMetadata.inntektId}" } + val person = personOppslag.hentPerson(storedInntektMedMetadata.fødselsnummer) + val opptjeningsperiode = Opptjeningsperiode(storedInntektMedMetadata.beregningsdato) + + toInntektskomponentRequest(person, opptjeningsperiode) + .let { + logger.info { "Henter nye inntekter fra inntektskomponenten" } + inntektskomponentClient.getInntekt(it, callId = callId) + }.let { + logger.info { "Fikk nye inntekter fra inntektskomponenten" } + val inntektsmottaker = + Inntektsmottaker(person.fødselsnummer, person.sammensattNavn()) + val organisasjoner = + hentOrganisasjoner( + enhetsregisterClient, + it.arbeidsInntektMaaned + ?.flatMap { it.arbeidsInntektInformasjon?.inntektListe.orEmpty() } + ?.filter { inntekt -> + inntekt.virksomhet?.aktoerType == AktoerType.ORGANISASJON && + (inntekt.opptjeningsland == "NO" || inntekt.opptjeningsland == null) + }?.mapNotNull { it.virksomhet?.identifikator } + ?.toTypedArray() + ?.toList() ?: emptyList(), + ) + + it.mapToFrontend( + person = inntektsmottaker, + organisasjoner = organisasjoner, + storedInntektMedMetadata = + StoredInntektMedMetadata( + inntektId = inntektId, + fødselsnummer = storedInntektMedMetadata.fødselsnummer, + inntekt = it, + manueltRedigert = false, + timestamp = storedInntektMedMetadata.timestamp, + beregningsdato = storedInntektMedMetadata.beregningsdato, + storedInntektPeriode = storedInntektMedMetadata.storedInntektPeriode, + begrunnelse = "", + ), + ) + }.let { + call.respond(HttpStatusCode.OK, it) + }.also { inntektOppfriskingCounter.inc() } + } ?: throw InntektNotFoundException("Inntekt with id $inntektId not found.") + } + } + } } route("/verdikoder") { get { diff --git a/dp-inntekt-api/src/test/kotlin/no/nav/dagpenger/inntekt/api/v1/UklassifisertInntektRouteTest.kt b/dp-inntekt-api/src/test/kotlin/no/nav/dagpenger/inntekt/api/v1/UklassifisertInntektRouteTest.kt index 8ed02bc4..098e5839 100644 --- a/dp-inntekt-api/src/test/kotlin/no/nav/dagpenger/inntekt/api/v1/UklassifisertInntektRouteTest.kt +++ b/dp-inntekt-api/src/test/kotlin/no/nav/dagpenger/inntekt/api/v1/UklassifisertInntektRouteTest.kt @@ -37,6 +37,9 @@ import no.nav.dagpenger.inntekt.db.StoredInntektMedMetadata import no.nav.dagpenger.inntekt.db.StoredInntektPeriode import no.nav.dagpenger.inntekt.inntektskomponenten.v1.Aktoer import no.nav.dagpenger.inntekt.inntektskomponenten.v1.AktoerType +import no.nav.dagpenger.inntekt.inntektskomponenten.v1.ArbeidsInntektInformasjon +import no.nav.dagpenger.inntekt.inntektskomponenten.v1.ArbeidsInntektMaaned +import no.nav.dagpenger.inntekt.inntektskomponenten.v1.Inntekt import no.nav.dagpenger.inntekt.inntektskomponenten.v1.InntektBeskrivelse import no.nav.dagpenger.inntekt.inntektskomponenten.v1.InntektType import no.nav.dagpenger.inntekt.inntektskomponenten.v1.InntektkomponentRequest @@ -588,4 +591,154 @@ internal class UklassifisertInntektRouteTest { storeInntektCommandSlot.captured.manueltRedigert!!.redigertAv shouldBe TEST_OAUTH_USER storeInntektCommandSlot.captured.manueltRedigert!!.begrunnelse shouldBe "Dette er en begrunnelse." } + + @Test + fun `Get request for uncached uklassifisert inntekt skal returnere 200 OK og inntekt`() { + val enhetsregisterClientMock = mockk(relaxed = true) + val inntektKomponentClientMock = mockk(relaxed = true) + return withMockAuthServerAndTestApplication( + mockInntektApi( + inntektskomponentClient = inntektKomponentClientMock, + inntektStore = inntektStoreMock, + personOppslag = personOppslagMock, + enhetsregisterClient = enhetsregisterClientMock, + ), + ) { + val body = + UklassifisertInntektRouteTest::class.java + .getResource("/test-data/example-inntekt-med-inntektId-payload.json") + ?.readText() + every { + inntektStoreMock.getStoredInntektMedMetadata(inntektId) + } returns + StoredInntektMedMetadata( + inntektId, + inntekt = jacksonObjectMapper.readValue(body!!), + manueltRedigert = false, + timestamp = LocalDateTime.now(), + fødselsnummer = fødselsnummer, + beregningsdato = now(), + storedInntektPeriode = + StoredInntektPeriode( + fraOgMed = YearMonth.of(2023, 1), + tilOgMed = YearMonth.of(2025, 5), + ), + ) + + val inntektKomponentResponseFraAInntekt = + InntektkomponentResponse( + arbeidsInntektMaaned = + listOf( + ArbeidsInntektMaaned( + aarMaaned = YearMonth.parse("2019-01"), + avvikListe = null, + arbeidsInntektInformasjon = + ArbeidsInntektInformasjon( + inntektListe = + listOf( + Inntekt( + inntektType = InntektType.NAERINGSINNTEKT, + beloep = BigDecimal(250000), + fordel = "kontantytelse", + inntektskilde = "A-ordningen", + inntektsperiodetype = "Maaned", + inntektsstatus = "LoependeInnrapportert", + leveringstidspunkt = YearMonth.parse("2019-02"), + utbetaltIMaaned = YearMonth.parse("2018-03"), + opplysningspliktig = + Aktoer( + aktoerType = AktoerType.ORGANISASJON, + identifikator = "1111111", + ), + virksomhet = + Aktoer( + aktoerType = AktoerType.ORGANISASJON, + identifikator = "1111111", + ), + inntektsmottaker = + Aktoer( + aktoerType = AktoerType.NATURLIG_IDENT, + identifikator = "99999999999", + ), + inngaarIGrunnlagForTrekk = true, + utloeserArbeidsgiveravgift = true, + informasjonsstatus = "InngaarAlltid", + beskrivelse = InntektBeskrivelse.LOTT_KUN_TRYGDEAVGIFT, + ), + ), + ), + ), + ArbeidsInntektMaaned( + aarMaaned = YearMonth.parse("2018-03"), + avvikListe = null, + arbeidsInntektInformasjon = + ArbeidsInntektInformasjon( + inntektListe = + listOf( + Inntekt( + inntektType = InntektType.NAERINGSINNTEKT, + beloep = BigDecimal(250000), + fordel = "kontantytelse", + inntektskilde = "A-ordningen", + inntektsperiodetype = "Maaned", + inntektsstatus = "LoependeInnrapportert", + leveringstidspunkt = YearMonth.parse("2019-02"), + utbetaltIMaaned = YearMonth.parse("2018-03"), + opplysningspliktig = + Aktoer( + aktoerType = AktoerType.ORGANISASJON, + identifikator = "1111111", + ), + virksomhet = + Aktoer( + aktoerType = AktoerType.ORGANISASJON, + identifikator = "1111111", + ), + inntektsmottaker = + Aktoer( + aktoerType = AktoerType.NATURLIG_IDENT, + identifikator = "99999999999", + ), + inngaarIGrunnlagForTrekk = true, + utloeserArbeidsgiveravgift = true, + informasjonsstatus = "InngaarAlltid", + beskrivelse = InntektBeskrivelse.LOTT_KUN_TRYGDEAVGIFT, + ), + ), + ), + ), + ), + ident = + Aktoer( + aktoerType = AktoerType.NATURLIG_IDENT, + identifikator = "-1", + ), + ) + coEvery { + inntektKomponentClientMock.getInntekt( + request = any(), + callId = any(), + ) + } returns inntektKomponentResponseFraAInntekt + + val bodyFraEr = + FullVirksomhetsInformasjon::class.java + .getResource("/test-data/example-virksomhet-info.json")!! + .readText() + coEvery { enhetsregisterClientMock.hentEnhet("1111111") } returns bodyFraEr + + val response = + autentisert( + httpMethod = HttpMethod.Get, + endepunkt = "$uklassifisertInntekt/uncached/${inntektId.id}", + ) + + assertEquals(OK, response.status) + + val storedInntekt = + jacksonObjectMapper.readValue(response.bodyAsText()) + storedInntekt.virksomheter shouldHaveSize 1 + storedInntekt.virksomheter[0].inntekter?.shouldHaveSize((2)) + } + } }