From 2d054c335a17163a3e8f8986636ec5e0337fb99b Mon Sep 17 00:00:00 2001 From: "Arselan.Sultani" Date: Wed, 16 Jul 2025 09:19:22 +0200 Subject: [PATCH 1/4] =?UTF-8?q?Legg=20til=20endepunkt=20for=20=C3=A5=20kun?= =?UTF-8?q?ne=20hente=20uncached=20inntekt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/deploy.yaml | 2 +- .../api/v1/UklassifisertInntektRoute.kt | 67 ++++++++++++++++++- 2 files changed, 66 insertions(+), 3 deletions(-) diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml index d2382c97..63353452 100644 --- a/.github/workflows/deploy.yaml +++ b/.github/workflows/deploy.yaml @@ -49,7 +49,7 @@ jobs: deploy-dev: name: Deploy to dev needs: [build] - if: github.ref == 'refs/heads/main' + if: github.ref == 'refs/heads/uncached-inntekt-med-inntekt-id' runs-on: ubuntu-latest permissions: contents: "read" 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..19a560dc 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,66 @@ 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" } + + call.withInntektRequest("GET /uklassifisert/uncached/") { + 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 { From 940023954b2c7a3733e8e5aeb97467ab07302b76 Mon Sep 17 00:00:00 2001 From: "Arselan.Sultani" Date: Wed, 16 Jul 2025 13:54:39 +0200 Subject: [PATCH 2/4] =?UTF-8?q?Legg=20til=20endepunkt=20for=20=C3=A5=20kun?= =?UTF-8?q?ne=20hente=20uncached=20inntekt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/v1/UklassifisertInntektRoute.kt | 148 ++++++++++++------ 1 file changed, 104 insertions(+), 44 deletions(-) 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 19a560dc..5a96d15d 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,9 +29,9 @@ 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.InntektkomponentResponse import no.nav.dagpenger.inntekt.inntektskomponenten.v1.InntektskomponentClient import no.nav.dagpenger.inntekt.mapping.GUIInntekt import no.nav.dagpenger.inntekt.mapping.Inntektsmottaker @@ -294,55 +294,68 @@ fun Route.uklassifisertInntekt( val inntektId = InntektId(call.parameters["inntektId"]!!) logger.info { "Henter nye inntekt for $inntektId" } - call.withInntektRequest("GET /uklassifisert/uncached/") { - inntektStore - .getStoredInntektMedMetadata(inntektId) - .let { storedInntektMedMetadata -> - logger.info { "Henter stored inntekt: ${storedInntektMedMetadata.inntektId}" } - val person = personOppslag.hentPerson(storedInntektMedMetadata.fødselsnummer) - val opptjeningsperiode = Opptjeningsperiode(storedInntektMedMetadata.beregningsdato) + 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(), - ) + 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(), + ) + val kombinerFraInntektskomponentenOgStoredInntekt = + kombinerInntektFraInntektskomponentenOgStoredInntekt( + it, + storedInntektMedMetadata.inntekt, + ) + + logger.info { + kombinerFraInntektskomponentenOgStoredInntekt.arbeidsInntektMaaned?.joinToString( + separator = "\n", + prefix = "Kombinert inntekt before mapping:\n", + ) { it.toString() } ?: "Ingen inntekter funnet" + } + + val oppdatertInntekt = + storedInntektMedMetadata.copy( + inntekt = kombinerFraInntektskomponentenOgStoredInntekt, + ) + + logger.info("UpdatedStoredInntekt: $oppdatertInntekt") + + val mapToFrontend = 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 = "", - ), + storedInntektMedMetadata = oppdatertInntekt, ) - }.let { - call.respond(HttpStatusCode.OK, it) - }.also { inntektOppfriskingCounter.inc() } - } ?: throw InntektNotFoundException("Inntekt with id $inntektId not found.") - } + + logger.info { "Kombinert inntekt after mapping: $mapToFrontend" } + + mapToFrontend + }.let { + call.respond(HttpStatusCode.OK, it) + }.also { inntektOppfriskingCounter.inc() } + } ?: throw InntektNotFoundException("Inntekt with id $inntektId not found.") } } } @@ -354,6 +367,53 @@ fun Route.uklassifisertInntekt( } } +fun kombinerInntektFraInntektskomponentenOgStoredInntekt( + inntektKomponentFraAInntekt: InntektkomponentResponse, + inntektKomponentFraDB: InntektkomponentResponse, +): InntektkomponentResponse { + logger.info { "Kombinerer data fra A-Inntekt og fra databasen" } + var inntektMånederFraAInntekt = inntektKomponentFraAInntekt.arbeidsInntektMaaned ?: emptyList() + + logger.info("Antall fra A-Inntekt: ${inntektMånederFraAInntekt.size}") + logger.info("Antall fra Db: ${inntektKomponentFraDB.arbeidsInntektMaaned?.size ?: 0}") + + inntektKomponentFraDB.arbeidsInntektMaaned?.map { storedInntektMåned -> + val inntektKomponentMåned = inntektMånederFraAInntekt.find { it.aarMaaned == storedInntektMåned.aarMaaned } + if (inntektKomponentMåned != null) { + inntektKomponentMåned.arbeidsInntektInformasjon?.inntektListe.orEmpty().forEach { inntekt -> + val matchIndex = + storedInntektMåned.arbeidsInntektInformasjon + ?.inntektListe + ?.indexOfFirst { + it.virksomhet?.identifikator == inntekt.virksomhet?.identifikator && + it.utbetaltIMaaned == inntekt.utbetaltIMaaned && + it.beskrivelse == inntekt.beskrivelse + } + if (matchIndex != null && matchIndex >= 0) { + storedInntektMåned.arbeidsInntektInformasjon.inntektListe.let { + it.toMutableList()[matchIndex] = inntekt + } + } + } + inntektMånederFraAInntekt = + inntektMånederFraAInntekt.filter { it.aarMaaned != storedInntektMåned.aarMaaned } + } + } + + inntektKomponentFraDB.copy( + arbeidsInntektMaaned = + (inntektKomponentFraDB.arbeidsInntektMaaned ?: emptyList()) + + inntektMånederFraAInntekt.map { + it.copy( + arbeidsInntektInformasjon = it.arbeidsInntektInformasjon?.copy(inntektListe = emptyList()), + ) + }, + ) + logger.info("Total antall inntektsmåneder etter kombinasjon: ${inntektKomponentFraDB.arbeidsInntektMaaned?.size ?: 0}") + + return inntektKomponentFraDB +} + private suspend fun hentOrganisasjoner( enhetsregisterClient: EnhetsregisterClient, organisasjonsNummerListe: List?, From 8c8bf8838700d372d7aea899102e07633da81718 Mon Sep 17 00:00:00 2001 From: "Arselan.Sultani" Date: Fri, 18 Jul 2025 09:55:10 +0200 Subject: [PATCH 3/4] =?UTF-8?q?Legg=20til=20endepunkt=20for=20=C3=A5=20kun?= =?UTF-8?q?ne=20hente=20uncached=20inntekt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/v1/UklassifisertInntektRoute.kt | 25 ++++--------------- 1 file changed, 5 insertions(+), 20 deletions(-) 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 5a96d15d..f40ff647 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 @@ -327,31 +327,16 @@ fun Route.uklassifisertInntekt( it, storedInntektMedMetadata.inntekt, ) - - logger.info { - kombinerFraInntektskomponentenOgStoredInntekt.arbeidsInntektMaaned?.joinToString( - separator = "\n", - prefix = "Kombinert inntekt before mapping:\n", - ) { it.toString() } ?: "Ingen inntekter funnet" - } - val oppdatertInntekt = storedInntektMedMetadata.copy( inntekt = kombinerFraInntektskomponentenOgStoredInntekt, ) - logger.info("UpdatedStoredInntekt: $oppdatertInntekt") - - val mapToFrontend = - it.mapToFrontend( - person = inntektsmottaker, - organisasjoner = organisasjoner, - storedInntektMedMetadata = oppdatertInntekt, - ) - - logger.info { "Kombinert inntekt after mapping: $mapToFrontend" } - - mapToFrontend + kombinerFraInntektskomponentenOgStoredInntekt.mapToFrontend( + person = inntektsmottaker, + organisasjoner = organisasjoner, + storedInntektMedMetadata = oppdatertInntekt, + ) }.let { call.respond(HttpStatusCode.OK, it) }.also { inntektOppfriskingCounter.inc() } From 27bbc92565da98d2bbf656077b2e23414d3b10ea Mon Sep 17 00:00:00 2001 From: "Arselan.Sultani" Date: Fri, 18 Jul 2025 15:05:31 +0200 Subject: [PATCH 4/4] =?UTF-8?q?Send=20tilbake=20inntekt=20uten=20=C3=A5=20?= =?UTF-8?q?kombinere=20med=20allerede=20lagret=20inntekt=20og=20lagt=20til?= =?UTF-8?q?=20test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/deploy.yaml | 2 +- .../api/v1/UklassifisertInntektRoute.kt | 73 ++------- .../api/v1/UklassifisertInntektRouteTest.kt | 153 ++++++++++++++++++ 3 files changed, 167 insertions(+), 61 deletions(-) diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml index 63353452..d2382c97 100644 --- a/.github/workflows/deploy.yaml +++ b/.github/workflows/deploy.yaml @@ -49,7 +49,7 @@ jobs: deploy-dev: name: Deploy to dev needs: [build] - if: github.ref == 'refs/heads/uncached-inntekt-med-inntekt-id' + if: github.ref == 'refs/heads/main' runs-on: ubuntu-latest permissions: contents: "read" 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 f40ff647..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,9 +29,9 @@ 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.InntektkomponentResponse import no.nav.dagpenger.inntekt.inntektskomponenten.v1.InntektskomponentClient import no.nav.dagpenger.inntekt.mapping.GUIInntekt import no.nav.dagpenger.inntekt.mapping.Inntektsmottaker @@ -322,20 +322,20 @@ fun Route.uklassifisertInntekt( ?.toList() ?: emptyList(), ) - val kombinerFraInntektskomponentenOgStoredInntekt = - kombinerInntektFraInntektskomponentenOgStoredInntekt( - it, - storedInntektMedMetadata.inntekt, - ) - val oppdatertInntekt = - storedInntektMedMetadata.copy( - inntekt = kombinerFraInntektskomponentenOgStoredInntekt, - ) - - kombinerFraInntektskomponentenOgStoredInntekt.mapToFrontend( + it.mapToFrontend( person = inntektsmottaker, organisasjoner = organisasjoner, - storedInntektMedMetadata = oppdatertInntekt, + 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) @@ -352,53 +352,6 @@ fun Route.uklassifisertInntekt( } } -fun kombinerInntektFraInntektskomponentenOgStoredInntekt( - inntektKomponentFraAInntekt: InntektkomponentResponse, - inntektKomponentFraDB: InntektkomponentResponse, -): InntektkomponentResponse { - logger.info { "Kombinerer data fra A-Inntekt og fra databasen" } - var inntektMånederFraAInntekt = inntektKomponentFraAInntekt.arbeidsInntektMaaned ?: emptyList() - - logger.info("Antall fra A-Inntekt: ${inntektMånederFraAInntekt.size}") - logger.info("Antall fra Db: ${inntektKomponentFraDB.arbeidsInntektMaaned?.size ?: 0}") - - inntektKomponentFraDB.arbeidsInntektMaaned?.map { storedInntektMåned -> - val inntektKomponentMåned = inntektMånederFraAInntekt.find { it.aarMaaned == storedInntektMåned.aarMaaned } - if (inntektKomponentMåned != null) { - inntektKomponentMåned.arbeidsInntektInformasjon?.inntektListe.orEmpty().forEach { inntekt -> - val matchIndex = - storedInntektMåned.arbeidsInntektInformasjon - ?.inntektListe - ?.indexOfFirst { - it.virksomhet?.identifikator == inntekt.virksomhet?.identifikator && - it.utbetaltIMaaned == inntekt.utbetaltIMaaned && - it.beskrivelse == inntekt.beskrivelse - } - if (matchIndex != null && matchIndex >= 0) { - storedInntektMåned.arbeidsInntektInformasjon.inntektListe.let { - it.toMutableList()[matchIndex] = inntekt - } - } - } - inntektMånederFraAInntekt = - inntektMånederFraAInntekt.filter { it.aarMaaned != storedInntektMåned.aarMaaned } - } - } - - inntektKomponentFraDB.copy( - arbeidsInntektMaaned = - (inntektKomponentFraDB.arbeidsInntektMaaned ?: emptyList()) + - inntektMånederFraAInntekt.map { - it.copy( - arbeidsInntektInformasjon = it.arbeidsInntektInformasjon?.copy(inntektListe = emptyList()), - ) - }, - ) - logger.info("Total antall inntektsmåneder etter kombinasjon: ${inntektKomponentFraDB.arbeidsInntektMaaned?.size ?: 0}") - - return inntektKomponentFraDB -} - private suspend fun hentOrganisasjoner( enhetsregisterClient: EnhetsregisterClient, organisasjonsNummerListe: List?, 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)) + } + } }