From 17a60dfd5356b2946b21cf3cc327d00d7dd3bcad Mon Sep 17 00:00:00 2001 From: StianSDouzette <59877023+StianSDouzette@users.noreply.github.com> Date: Thu, 13 Jun 2024 12:20:39 +0200 Subject: [PATCH] sletter inntekt klienten (#665) Co-authored-by: Stian S. Douzette --- .../clients/inntekt/InntektClient.kt | 82 ------- .../clients/inntekt/InntektDomene.kt | 155 ------------- .../medlemskap/services/inntekt/Inntekt.kt | 9 - .../services/inntekt/InntektMapper.kt | 10 - .../services/inntekt/InntektService.kt | 10 - .../clients/inntekt/InntektClientTest.kt | 219 ------------------ 6 files changed, 485 deletions(-) delete mode 100644 src/main/kotlin/no/nav/medlemskap/clients/inntekt/InntektClient.kt delete mode 100644 src/main/kotlin/no/nav/medlemskap/clients/inntekt/InntektDomene.kt delete mode 100644 src/main/kotlin/no/nav/medlemskap/services/inntekt/Inntekt.kt delete mode 100644 src/main/kotlin/no/nav/medlemskap/services/inntekt/InntektMapper.kt delete mode 100644 src/main/kotlin/no/nav/medlemskap/services/inntekt/InntektService.kt delete mode 100644 src/test/kotlin/no/nav/medlemskap/clients/inntekt/InntektClientTest.kt diff --git a/src/main/kotlin/no/nav/medlemskap/clients/inntekt/InntektClient.kt b/src/main/kotlin/no/nav/medlemskap/clients/inntekt/InntektClient.kt deleted file mode 100644 index 754e573d7..000000000 --- a/src/main/kotlin/no/nav/medlemskap/clients/inntekt/InntektClient.kt +++ /dev/null @@ -1,82 +0,0 @@ -package no.nav.medlemskap.clients.inntekt - -import io.github.resilience4j.retry.Retry -import io.ktor.client.HttpClient -import io.ktor.client.call.* -import io.ktor.client.plugins.* -import io.ktor.client.request.* -import io.ktor.client.statement.HttpResponse -import io.ktor.http.ContentType -import io.ktor.http.HttpHeaders -import mu.KotlinLogging -import no.nav.medlemskap.clients.runWithRetryAndMetrics -import no.nav.medlemskap.clients.sts.StsRestClient -import no.nav.medlemskap.config.Configuration -import java.time.LocalDate -import java.time.format.DateTimeFormatter - -class InntektClient( - private val baseUrl: String, - private val stsClient: StsRestClient, - private val configuration: Configuration, - private val httpClient: HttpClient, - private val retry: Retry? = null -) { - - private val logger = KotlinLogging.logger { } - - suspend fun hentInntektListe(ident: String, callId: String, fraOgMed: LocalDate? = null, tilOgMed: LocalDate? = null): InntektskomponentResponse { - val token = stsClient.oidcToken() - return runCatching { - runWithRetryAndMetrics("Inntekt", "HentinntektlisteV1", retry) { - httpClient.post() { - url("$baseUrl/rs/api/v1/hentinntektliste") - header(HttpHeaders.Authorization, "Bearer $token") - header(HttpHeaders.ContentType, ContentType.Application.Json) - header("Nav-Consumer-Id", configuration.sts.username) - header("Nav-Call-Id", callId) - setBody( - HentInntektListeRequest( - ident = Ident(ident, "NATURLIG_IDENT"), - ainntektsfilter = "MedlemskapA-inntekt", - maanedFom = fraOgMed?.tilAarOgMnd(), - maanedTom = tilOgMed?.tilAarOgMnd(), - formaal = "Medlemskap" - ) - ) // Må diskutere med Helle om vi skal bruke Medlemskap eller sykepenger som formål - }.body() - } - }.fold( - onSuccess = { it }, - onFailure = { error -> - when (error) { - is ClientRequestException -> { - if (error.response.status.value == 400) { - InntektskomponentResponse(listOf(), Ident(ident, "")) - } else { - throw error - } - } - is ServerResponseException -> { - if (error.response.status.value == 500) { - InntektskomponentResponse(listOf(), Ident(ident, "")) - } else { - throw error - } - } - else -> throw error - } - } - ) - } - - private fun LocalDate.tilAarOgMnd() = this.format(DateTimeFormatter.ofPattern("yyyy-MM")) - - suspend fun healthCheck(): HttpResponse { - return httpClient.options { - url("$baseUrl") - header(HttpHeaders.ContentType, ContentType.Application.Json) - header("Nav-Consumer-Id", configuration.sts.username) - } - } -} diff --git a/src/main/kotlin/no/nav/medlemskap/clients/inntekt/InntektDomene.kt b/src/main/kotlin/no/nav/medlemskap/clients/inntekt/InntektDomene.kt deleted file mode 100644 index 40c1a99b3..000000000 --- a/src/main/kotlin/no/nav/medlemskap/clients/inntekt/InntektDomene.kt +++ /dev/null @@ -1,155 +0,0 @@ -package no.nav.medlemskap.clients.inntekt - -import java.math.BigDecimal -import java.time.LocalDate -import java.time.LocalDateTime -import java.time.YearMonth - -data class HentInntektListeRequest( - val ident: Ident, - val ainntektsfilter: String, - val maanedFom: String?, - val maanedTom: String?, - val formaal: String -) - -data class InntektskomponentResponse( - val arbeidsInntektMaaned: List?, - - val ident: Ident? -) - -data class ArbeidsinntektMaaned( - val aarMaaned: YearMonth?, - val avvikListe: List?, - val arbeidsInntektInformasjon: ArbeidsInntektInformasjon? -) - -data class Avvik( - val ident: Ident?, - val opplysningspliktig: Ident?, - val virksomhet: Ident?, - val avvikPeriode: YearMonth?, - val tekst: String? - -) - -data class Ident( - val identifikator: String?, - val aktoerType: String? -) - -data class ArbeidsInntektInformasjon( - val arbeidsforholdListe: List?, - val inntektListe: List?, - val forskuddstrekkListe: List?, - val fradragListe: List? - -) - -data class ArbeidsforholdFrilanser( - val antallTimerPerUkeSomEnFullStillingTilsvarer: Double?, - val arbeidstidsordning: String?, - val avloenningstype: String?, - val sisteDatoForStillingsprosentendring: LocalDate?, - val sisteLoennsendring: LocalDate?, - val frilansPeriodeFom: LocalDate?, - val frilansPeriodeTom: LocalDate?, - val stillingsprosent: Double?, - val yrke: String?, - val arbeidsforholdID: String?, - val arbeidsforholdIDnav: String?, - val arbeidsforholdstype: String?, - val arbeidsgiver: Ident?, - val arbeidstaker: Ident? -) - -data class Arbeidsforhold( - val antallTimerPerUkeSomEnFullStillingTilsvarer: Double?, - val arbeidstidsordning: String?, - val avloenningstype: String?, - val sisteDatoForStillingsprosentendring: YearMonth?, - val sisteLoennsendring: YearMonth?, - val frilansperiodeFom: LocalDate?, - val frilansperiodeTom: LocalDate?, - val stillingsprosent: Double?, - val yrke: String?, - val arbeidsforholdID: String?, - val arbeidsforholdIDnav: String?, - val arbeidsforholdType: String?, - val arbeidsgiver: Ident?, - val arbeidstaker: Ident? -) - -data class Inntekt( - val inntektType: String?, - val beloep: Double?, - val fordel: String?, - val inntektskilde: String?, - val inntektsperiodetype: String?, - val inntektsstatus: String?, - val leveringstidspunkt: YearMonth?, - val utbetaltIMaaned: YearMonth?, - val arbeidsforholdREF: String?, - val opplysningspliktig: Ident?, - val virksomhet: Ident?, - val inntektsmottaker: Ident?, - val inngaarIGrunnlagForTrekk: Boolean?, - val utloeserArbeidsgiveravgift: Boolean?, - val informasjonsstatus: String?, - val beskrivelse: String?, - val skatteOgAvgiftsregel: String?, - val opptjeningsland: String?, - val opptjeningsperiodeFom: LocalDate?, - val opptjeningsperiodeTom: LocalDate?, - val skattemessigBosattLand: String?, - val tilleggsinformasjon: Tilleggsinformasjon? - -) - -enum class InntektType { - LOENNSINNTEKT, - NAERINGSINNTEKT, - PENSJON_ELLER_TRYGD, - YTELSE_FRA_OFFENTLIGE -} - -enum class TilleggsinformasjonDetaljerType { - ALDERSUFOEREETTERLATTEAVTALEFESTETOGKRIGSPENSJON, - BARNEPENSJONOGUNDERHOLDSBIDRAG, - BONUSFRAFORSVARET, - ETTERBETALINGSPERIODE, - INNTJENINGSFORHOLD, - REISEKOSTOGLOSJI, - SVALBARDINNTEKT -} - -data class Forskuddstrekk( - val beloep: Int?, - val beskrivelse: String?, - val leveringstidspunkt: LocalDateTime?, - val opplysningspliktig: Ident?, - val utbetaler: Ident?, - val forskuddstrekkGjelder: Ident? -) - -data class Fradrag( - val beloep: BigDecimal?, - val beskrivelse: String?, - val fradragsperiode: String?, - val leveringstidspunkt: LocalDateTime?, - val inntektspliktig: Ident?, - val utbetaler: Ident?, - val fradragGjelder: Ident? -) - -data class Tilleggsinformasjon( - val kategori: String?, - val tilleggsinformasjonDetaljer: TilleggsinformasjonDetaljer? -) - -data class TilleggsinformasjonDetaljer( - val detaljerType: TilleggsinformasjonDetaljerType? -) - -// val versjon: String diff --git a/src/main/kotlin/no/nav/medlemskap/services/inntekt/Inntekt.kt b/src/main/kotlin/no/nav/medlemskap/services/inntekt/Inntekt.kt deleted file mode 100644 index 9b743ce30..000000000 --- a/src/main/kotlin/no/nav/medlemskap/services/inntekt/Inntekt.kt +++ /dev/null @@ -1,9 +0,0 @@ -package no.nav.medlemskap.domene - -data class Inntekt( - val arbeidsforhold: List -) - -data class InntektArbeidsforhold( - val yrke: String? -) diff --git a/src/main/kotlin/no/nav/medlemskap/services/inntekt/InntektMapper.kt b/src/main/kotlin/no/nav/medlemskap/services/inntekt/InntektMapper.kt deleted file mode 100644 index 254613c38..000000000 --- a/src/main/kotlin/no/nav/medlemskap/services/inntekt/InntektMapper.kt +++ /dev/null @@ -1,10 +0,0 @@ -package no.nav.medlemskap.services.inntekt - -import no.nav.medlemskap.clients.inntekt.InntektskomponentResponse -import no.nav.medlemskap.domene.Inntekt -import no.nav.medlemskap.domene.InntektArbeidsforhold - -// Todo Bruker foreløpig ingen data fra inntekstkomponenten -fun mapInntektResultat(@Suppress("UNUSED_PARAMETER") inntekt: InntektskomponentResponse): List { - return listOf(Inntekt(arbeidsforhold = listOf(InntektArbeidsforhold("yrke")))) -} diff --git a/src/main/kotlin/no/nav/medlemskap/services/inntekt/InntektService.kt b/src/main/kotlin/no/nav/medlemskap/services/inntekt/InntektService.kt deleted file mode 100644 index 1391ed8fb..000000000 --- a/src/main/kotlin/no/nav/medlemskap/services/inntekt/InntektService.kt +++ /dev/null @@ -1,10 +0,0 @@ -package no.nav.medlemskap.services.inntekt - -import no.nav.medlemskap.clients.inntekt.InntektClient -import java.time.LocalDate - -class InntektService(private val inntektClient: InntektClient) { - - suspend fun hentInntektListe(ident: String, callId: String, fraOgMed: LocalDate?, tilOgMed: LocalDate?) = - mapInntektResultat(inntektClient.hentInntektListe(ident, callId, fraOgMed, tilOgMed)) -} diff --git a/src/test/kotlin/no/nav/medlemskap/clients/inntekt/InntektClientTest.kt b/src/test/kotlin/no/nav/medlemskap/clients/inntekt/InntektClientTest.kt deleted file mode 100644 index 28ce0bb56..000000000 --- a/src/test/kotlin/no/nav/medlemskap/clients/inntekt/InntektClientTest.kt +++ /dev/null @@ -1,219 +0,0 @@ -package no.nav.medlemskap.clients.inntekt - -import assertk.assertThat -import assertk.assertions.isEqualTo -import assertk.assertions.isNotNull -import com.github.tomakehurst.wiremock.WireMockServer -import com.github.tomakehurst.wiremock.client.MappingBuilder -import com.github.tomakehurst.wiremock.client.WireMock -import com.github.tomakehurst.wiremock.client.WireMock.* -import com.github.tomakehurst.wiremock.core.WireMockConfiguration -import io.ktor.client.plugins.* -import io.ktor.http.ContentType -import io.ktor.http.HttpHeaders -import io.ktor.http.HttpStatusCode -import io.mockk.coEvery -import io.mockk.mockk -import kotlinx.coroutines.runBlocking -import no.nav.medlemskap.clients.sts.StsRestClient -import no.nav.medlemskap.common.cioHttpClient -import no.nav.medlemskap.config.Configuration -import org.junit.jupiter.api.* -import org.junit.jupiter.api.Assertions.assertEquals -import java.time.LocalDate -import java.time.YearMonth - -class InntektClientTest { - - companion object { - val server: WireMockServer = WireMockServer(WireMockConfiguration.options().dynamicPort()) - - @BeforeAll - @JvmStatic - fun start() { - server.start() - } - - @AfterAll - @JvmStatic - fun stop() { - server.stop() - } - } - - @BeforeEach - fun configure() { - WireMock.configureFor(server.port()) - } - - @Test - fun `tester response`() { - val callId = "12345" - - val stsClient: StsRestClient = mockk() - coEvery { stsClient.oidcToken() } returns "dummytoken" - - stubFor( - queryMapping.willReturn( - aResponse() - .withStatus(HttpStatusCode.OK.value) - .withHeader(HttpHeaders.ContentType, ContentType.Application.Json.toString()) - .withBody(inntektResponse) - ) - ) - - val client = InntektClient(server.baseUrl(), stsClient, config, cioHttpClient) - - val response = runBlocking { client.hentInntektListe("10108000398", callId, LocalDate.of(2016, 1, 1), LocalDate.of(2016, 8, 1)) } - println(response) - - assertEquals(YearMonth.of(2016, 1), response.arbeidsInntektMaaned?.get(0)?.aarMaaned) - assertEquals("LOENNSINNTEKT", response.arbeidsInntektMaaned?.get(0)?.arbeidsInntektInformasjon?.inntektListe?.get(0)?.inntektType) - assertEquals(25000.0, response.arbeidsInntektMaaned?.get(0)?.arbeidsInntektInformasjon?.inntektListe?.get(0)?.beloep) - assertEquals(YearMonth.of(2020, 1), response.arbeidsInntektMaaned?.get(0)?.arbeidsInntektInformasjon?.inntektListe?.get(0)?.leveringstidspunkt) - assertEquals(null, response.arbeidsInntektMaaned?.get(0)?.avvikListe) - } - - @Test - fun `tester ServerResponseException`() { - val callId = "12345" - val stsClient: StsRestClient = mockk() - coEvery { stsClient.oidcToken() } returns "dummytoken" - - WireMock.stubFor( - queryMapping.willReturn( - WireMock.aResponse() - .withStatus(HttpStatusCode.InternalServerError.value) - .withHeader(HttpHeaders.ContentType, ContentType.Application.Json.toString()) - - ) - ) - val client = InntektClient(server.baseUrl(), stsClient, config, cioHttpClient) - -// Assertions.assertThrows(ServerResponseException::class.java) { -// // runBlocking { client.hentInntektListe("10108000398", callId, LocalDate.of(2016, 1, 1), LocalDate.of(2016, 8, 1)) } -// // } - - val response = runBlocking { client.hentInntektListe("10108000398", callId, LocalDate.of(2016, 1, 1), LocalDate.of(2016, 8, 1)) } - assertThat(response.arbeidsInntektMaaned).isNotNull() - assertThat(response.arbeidsInntektMaaned!!.size).isEqualTo(0) - } - - @Test - fun `tester ClientRequestException`() { - val callId = "12345" - val stsClient: StsRestClient = mockk() - coEvery { stsClient.oidcToken() } returns "dummytoken" - - WireMock.stubFor( - queryMapping.willReturn( - WireMock.aResponse() - .withStatus(HttpStatusCode.Forbidden.value) - .withHeader(HttpHeaders.ContentType, ContentType.Application.Json.toString()) - - ) - ) - - val client = InntektClient(server.baseUrl(), stsClient, config, cioHttpClient) - - Assertions.assertThrows(ClientRequestException::class.java) { - runBlocking { client.hentInntektListe("10108000398", callId, LocalDate.of(2016, 1, 1), LocalDate.of(2016, 8, 1)) } - } - } - - private val config = Configuration() - - private val inntektRequest = - """ - { - "ident": { - "identifikator": "10108000398", - "aktoerType": "NATURLIG_IDENT" - }, - "ainntektsfilter": "MedlemskapA-inntekt", - "maanedFom": "2016-01", - "maanedTom": "2016-08", - "formaal": "Medlemskap" - } - """.trimIndent() - - private val queryMapping: MappingBuilder = post(urlPathEqualTo("/rs/api/v1/hentinntektliste")) - .withHeader(HttpHeaders.Accept, equalTo("application/json")) - .withHeader(HttpHeaders.ContentType, equalTo("application/json")) - .withHeader(HttpHeaders.Authorization, equalTo("Bearer dummytoken")) - .withHeader("Nav-Consumer-Id", equalTo("test")) - .withHeader("Nav-Call-Id", equalTo("12345")) - .withRequestBody(equalToJson(inntektRequest)) - - private val inntektResponse = - """ - { - "arbeidsInntektMaaned": [ - { - "aarMaaned": "2016-01", - "arbeidsInntektInformasjon": { - "inntektListe": [ - { - "inntektType": "LOENNSINNTEKT", - "beloep": 25000, - "fordel": "kontantytelse", - "inntektskilde": "A-ordningen", - "inntektsperiodetype": "Maaned", - "inntektsstatus": "LoependeInnrapportert", - "leveringstidspunkt": "2020-01", - "utbetaltIMaaned": "2016-01", - "opplysningspliktig": { - "identifikator": "873152362", - "aktoerType": "ORGANISASJON" - }, - "virksomhet": { - "identifikator": "873152362", - "aktoerType": "ORGANISASJON" - }, - "inntektsmottaker": { - "identifikator": "10108000398", - "aktoerType": "NATURLIG_IDENT" - }, - "inngaarIGrunnlagForTrekk": true, - "utloeserArbeidsgiveravgift": true, - "informasjonsstatus": "InngaarAlltid", - "beskrivelse": "fastloenn", - "skatteOgAvgiftsregel": "nettoloenn" - }, - { - "inntektType": "LOENNSINNTEKT", - "beloep": 25000, - "fordel": "kontantytelse", - "inntektskilde": "A-ordningen", - "inntektsperiodetype": "Maaned", - "inntektsstatus": "LoependeInnrapportert", - "leveringstidspunkt": "2020-01", - "utbetaltIMaaned": "2016-01", - "opplysningspliktig": { - "identifikator": "973063804", - "aktoerType": "ORGANISASJON" - }, - "virksomhet": { - "identifikator": "973063804", - "aktoerType": "ORGANISASJON" - }, - "inntektsmottaker": { - "identifikator": "10108000398", - "aktoerType": "NATURLIG_IDENT" - }, - "inngaarIGrunnlagForTrekk": true, - "utloeserArbeidsgiveravgift": true, - "informasjonsstatus": "InngaarAlltid", - "beskrivelse": "fastloenn" - } - ] - } - } - ], - "ident": { - "identifikator": "10108000398", - "aktoerType": "NATURLIG_IDENT" - } - } - """.trimIndent() -}