diff --git a/src/main/kotlin/no/nav/familie/baks/mottak/integrasjoner/BaSakClient.kt b/src/main/kotlin/no/nav/familie/baks/mottak/integrasjoner/BaSakClient.kt index 87f6dfa45..7327f5297 100644 --- a/src/main/kotlin/no/nav/familie/baks/mottak/integrasjoner/BaSakClient.kt +++ b/src/main/kotlin/no/nav/familie/baks/mottak/integrasjoner/BaSakClient.kt @@ -172,6 +172,8 @@ data class RestMinimalFagsak( class RestVisningBehandling( val behandlingId: Long, val opprettetTidspunkt: LocalDateTime, + val kategori: BehandlingKategori, + val underkategori: BehandlingUnderkategori?, val aktiv: Boolean, val årsak: String? = null, val type: String, diff --git a/src/main/kotlin/no/nav/familie/baks/mottak/integrasjoner/KsSakClient.kt b/src/main/kotlin/no/nav/familie/baks/mottak/integrasjoner/KsSakClient.kt index d80513353..ccb26c8a8 100644 --- a/src/main/kotlin/no/nav/familie/baks/mottak/integrasjoner/KsSakClient.kt +++ b/src/main/kotlin/no/nav/familie/baks/mottak/integrasjoner/KsSakClient.kt @@ -41,10 +41,10 @@ class KsSakClient ) } - fun hentRestFagsak(fagsakId: Long): RestFagsak { - val uri = URI.create("$ksSakServiceUri/fagsaker/$fagsakId") + fun hentMinimalRestFagsak(fagsakId: Long): RestMinimalFagsak { + val uri = URI.create("$ksSakServiceUri/fagsaker/minimal/$fagsakId") return runCatching { - getForEntity>(uri) + getForEntity>(uri) }.fold( onSuccess = { it.data ?: throw IntegrasjonException(it.melding, null, uri) }, onFailure = { throw IntegrasjonException("Feil ved henting av RestFagsak fra ks-sak.", it, uri) }, diff --git a/src/main/kotlin/no/nav/familie/baks/mottak/task/VurderLivshendelseService.kt b/src/main/kotlin/no/nav/familie/baks/mottak/task/VurderLivshendelseService.kt index 67018c593..364538f39 100644 --- a/src/main/kotlin/no/nav/familie/baks/mottak/task/VurderLivshendelseService.kt +++ b/src/main/kotlin/no/nav/familie/baks/mottak/task/VurderLivshendelseService.kt @@ -12,9 +12,9 @@ import no.nav.familie.baks.mottak.integrasjoner.OppgaveClient import no.nav.familie.baks.mottak.integrasjoner.OppgaveVurderLivshendelseDto import no.nav.familie.baks.mottak.integrasjoner.PdlClient import no.nav.familie.baks.mottak.integrasjoner.PdlPersonData -import no.nav.familie.baks.mottak.integrasjoner.RestFagsak import no.nav.familie.baks.mottak.integrasjoner.RestFagsakIdOgTilknyttetAktørId -import no.nav.familie.baks.mottak.integrasjoner.RestUtvidetBehandling +import no.nav.familie.baks.mottak.integrasjoner.RestMinimalFagsak +import no.nav.familie.baks.mottak.integrasjoner.RestVisningBehandling import no.nav.familie.baks.mottak.integrasjoner.Sivilstand import no.nav.familie.kontrakter.felles.Behandlingstema import no.nav.familie.kontrakter.felles.Tema @@ -230,7 +230,7 @@ class VurderLivshendelseService( private fun hentBehandlingstema( tema: Tema, - restBehandling: RestUtvidetBehandling, + restBehandling: RestVisningBehandling, ) = when (tema) { Tema.BAR -> tilBarnetrygdBehandlingstema(restBehandling) Tema.KON -> tilKontanstøtteBehandlingstema(restBehandling) @@ -287,23 +287,23 @@ class VurderLivshendelseService( private fun hentRestFagsak( fagsakId: Long, tema: Tema, - ): RestFagsak { + ): RestMinimalFagsak { return when (tema) { - Tema.BAR -> baSakClient.hentRestFagsak(fagsakId) - Tema.KON -> ksSakClient.hentRestFagsak(fagsakId) + Tema.BAR -> baSakClient.hentMinimalRestFagsak(fagsakId) + Tema.KON -> ksSakClient.hentMinimalRestFagsak(fagsakId) Tema.ENF, Tema.OPP -> throw RuntimeException("Tema $tema er ikke støttet") }.also { secureLog.info("Hentet rest fagsak: $it, tema: $tema") } } - private fun hentSisteBehandlingSomErIverksatt(restFagsak: RestFagsak): RestUtvidetBehandling? { + private fun hentSisteBehandlingSomErIverksatt(restFagsak: RestMinimalFagsak): RestVisningBehandling? { return restFagsak.behandlinger - .filter { it.steg == STEG_TYPE_BEHANDLING_AVSLUTTET } + .filter { it.status == STATUS_AVSLUTTET } .maxByOrNull { it.opprettetTidspunkt } } - private fun hentAktivBehandling(restFagsak: RestFagsak): RestUtvidetBehandling { + private fun hentAktivBehandling(restFagsak: RestMinimalFagsak): RestVisningBehandling { return restFagsak.behandlinger.firstOrNull { it.aktiv } ?: error("Fagsak ${restFagsak.id} mangler aktiv behandling. Får ikke opprettet VurderLivshendelseOppgave") } @@ -353,32 +353,32 @@ class VurderLivshendelseService( return listeMedFagsakIdOgTilknyttetAktør } - private fun tilBarnetrygdBehandlingstema(restUtvidetBehandling: RestUtvidetBehandling?): Behandlingstema { + private fun tilBarnetrygdBehandlingstema(restBehandling: RestVisningBehandling?): Behandlingstema { return when { - restUtvidetBehandling == null -> Behandlingstema.Barnetrygd - restUtvidetBehandling.kategori == BehandlingKategori.EØS -> Behandlingstema.BarnetrygdEØS - restUtvidetBehandling.kategori == BehandlingKategori.NASJONAL && restUtvidetBehandling.underkategori == BehandlingUnderkategori.ORDINÆR -> Behandlingstema.OrdinærBarnetrygd - restUtvidetBehandling.kategori == BehandlingKategori.NASJONAL && restUtvidetBehandling.underkategori == BehandlingUnderkategori.UTVIDET -> Behandlingstema.UtvidetBarnetrygd + restBehandling == null -> Behandlingstema.Barnetrygd + restBehandling.kategori == BehandlingKategori.EØS -> Behandlingstema.BarnetrygdEØS + restBehandling.kategori == BehandlingKategori.NASJONAL && restBehandling.underkategori == BehandlingUnderkategori.ORDINÆR -> Behandlingstema.OrdinærBarnetrygd + restBehandling.kategori == BehandlingKategori.NASJONAL && restBehandling.underkategori == BehandlingUnderkategori.UTVIDET -> Behandlingstema.UtvidetBarnetrygd else -> Behandlingstema.Barnetrygd } } - private fun tilKontanstøtteBehandlingstema(restUtvidetBehandling: RestUtvidetBehandling?): Behandlingstema = + private fun tilKontanstøtteBehandlingstema(restBehandling: RestVisningBehandling?): Behandlingstema = when { - restUtvidetBehandling == null -> Behandlingstema.Kontantstøtte - restUtvidetBehandling.kategori == BehandlingKategori.EØS -> Behandlingstema.KontantstøtteEØS + restBehandling == null -> Behandlingstema.Kontantstøtte + restBehandling.kategori == BehandlingKategori.EØS -> Behandlingstema.KontantstøtteEØS else -> Behandlingstema.Kontantstøtte } private fun sjekkOmDatoErEtterEldsteVedtaksdato( dato: LocalDate, - aktivFaksak: RestFagsak, + aktivFaksak: RestMinimalFagsak, personIdent: String, tema: Tema, ): Boolean { val tidligsteVedtakIBaSak = aktivFaksak.behandlinger - .filter { it.resultat == RESULTAT_INNVILGET && it.steg == STEG_TYPE_BEHANDLING_AVSLUTTET } + .filter { it.resultat == RESULTAT_INNVILGET && it.status == STATUS_AVSLUTTET } .minByOrNull { it.opprettetTidspunkt } ?: return false if (dato.isAfter(tidligsteVedtakIBaSak.opprettetTidspunkt.toLocalDate())) { @@ -469,7 +469,7 @@ class VurderLivshendelseService( "${VurderLivshendelseType.SIVILSTAND.beskrivelse}: ${if (personErBruker) "bruker" else "barn $personIdent"} er registrert som gift fra $formatertDato" companion object { - const val STEG_TYPE_BEHANDLING_AVSLUTTET = "BEHANDLING_AVSLUTTET" + const val STATUS_AVSLUTTET = "AVSLUTTET" const val RESULTAT_INNVILGET = "INNVILGET" const val BEHANDLING_TYPE_MIGRERING = "MIGRERING_FRA_INFOTRYGD" } diff --git a/src/test/kotlin/no/nav/familie/baks/mottak/integrasjoner/BaSakClientTest.kt b/src/test/kotlin/no/nav/familie/baks/mottak/integrasjoner/BaSakClientTest.kt index 245509729..55fa4944f 100644 --- a/src/test/kotlin/no/nav/familie/baks/mottak/integrasjoner/BaSakClientTest.kt +++ b/src/test/kotlin/no/nav/familie/baks/mottak/integrasjoner/BaSakClientTest.kt @@ -2,11 +2,12 @@ package no.nav.familie.baks.mottak.integrasjoner import com.github.tomakehurst.wiremock.client.WireMock.aResponse import com.github.tomakehurst.wiremock.client.WireMock.equalToJson +import com.github.tomakehurst.wiremock.client.WireMock.get import com.github.tomakehurst.wiremock.client.WireMock.post import com.github.tomakehurst.wiremock.client.WireMock.stubFor import com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo import no.nav.familie.baks.mottak.DevLauncher -import org.assertj.core.api.Assertions +import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Tag import org.junit.jupiter.api.Test import org.junit.jupiter.api.TestInstance @@ -15,6 +16,7 @@ import org.springframework.boot.test.context.SpringBootTest import org.springframework.cloud.contract.wiremock.AutoConfigureWireMock import org.springframework.test.context.ActiveProfiles import java.io.IOException +import java.time.LocalDate @SpringBootTest(classes = [DevLauncher::class], properties = ["FAMILIE_BA_SAK_API_URL=http://localhost:28085/api"]) @ActiveProfiles("dev", "mock-oauth") @@ -38,7 +40,34 @@ class BaSakClientTest { ) val response = baSakClient.hentSaksnummer(personIdent) - Assertions.assertThat(response).isEqualTo(fagsakId.toString()) + assertThat(response).isEqualTo(fagsakId.toString()) + } + + @Test + @Tag("integration") + fun `skal hente minimal fagsak og mappe til RestMinimalFagsak`() { + stubFor( + get(urlEqualTo("/api/fagsaker/minimal/1")) + .willReturn( + aResponse() + .withHeader("Content-Type", "application/json") + .withBody(gyldigResponseMinimalSak()), + ), + ) + + val response = baSakClient.hentMinimalRestFagsak(fagsakId) + assertThat(response.id).isEqualTo(fagsakId) + assertThat(response.behandlinger).hasSize(1) + assertThat(response.behandlinger.first().aktiv).isTrue() + assertThat(response.behandlinger.first().behandlingId).isEqualTo(1000) + assertThat(response.behandlinger.first().kategori).isEqualTo(BehandlingKategori.NASJONAL) + assertThat(response.behandlinger.first().underkategori).isEqualTo(BehandlingUnderkategori.ORDINÆR) + assertThat(response.behandlinger.first().opprettetTidspunkt).isEqualTo(LocalDate.of(2023, 4, 2).atStartOfDay()) + assertThat(response.behandlinger.first().status).isEqualTo("AVSLUTTET") + assertThat(response.behandlinger.first().type).isEqualTo("FØRSTEGANGSBEHANDLING") + assertThat(response.behandlinger.first().vedtaksdato).isEqualTo(LocalDate.of(2023, 4, 3).atStartOfDay()) + assertThat(response.behandlinger.first().årsak).isEqualTo("SØKNAD") + assertThat(response.behandlinger.first().resultat).isEqualTo("INNVILGET") } @Throws(IOException::class) @@ -57,6 +86,42 @@ class BaSakClientTest { "}" } + @Throws(IOException::class) + private fun gyldigResponseMinimalSak(): String { + return """ + { + "data": { + "opprettetTidspunkt": "2023-04-01T00:00:00.00", + "id": $fagsakId, + "søkerFødselsnummer": "42104200000", + "status": "LØPENDE", + "underBehandling": false, + "løpendeKategori": "NASJONAL", + "behandlinger": [ + { + "behandlingId": 1000, + "opprettetTidspunkt": "2023-04-02T00:00:00.00", + "kategori": "NASJONAL", + "underkategori": "ORDINÆR", + "aktiv": true, + "årsak": "SØKNAD", + "type": "FØRSTEGANGSBEHANDLING", + "status": "AVSLUTTET", + "resultat": "INNVILGET", + "vedtaksdato": "2023-04-03T00:00:00.00" + } + ], + "tilbakekrevingsbehandlinger": [], + "gjeldendeUtbetalingsperioder": [] + }, + "status": "SUKSESS", + "melding": "Innhenting av data var vellykket", + "frontendFeilmelding": null, + "stacktrace": null + } + """.trimIndent() + } + companion object { private val personIdent = "12345678910" private val fagsakId = 1L diff --git a/src/test/kotlin/no/nav/familie/baks/mottak/integrasjoner/KsSakClientTest.kt b/src/test/kotlin/no/nav/familie/baks/mottak/integrasjoner/KsSakClientTest.kt index d3c9e15ad..f286b253b 100644 --- a/src/test/kotlin/no/nav/familie/baks/mottak/integrasjoner/KsSakClientTest.kt +++ b/src/test/kotlin/no/nav/familie/baks/mottak/integrasjoner/KsSakClientTest.kt @@ -2,11 +2,12 @@ package no.nav.familie.baks.mottak.integrasjoner import com.github.tomakehurst.wiremock.client.WireMock.aResponse import com.github.tomakehurst.wiremock.client.WireMock.equalToJson +import com.github.tomakehurst.wiremock.client.WireMock.get import com.github.tomakehurst.wiremock.client.WireMock.post import com.github.tomakehurst.wiremock.client.WireMock.stubFor import com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo import no.nav.familie.baks.mottak.DevLauncher -import org.assertj.core.api.Assertions +import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Tag import org.junit.jupiter.api.Test import org.junit.jupiter.api.TestInstance @@ -15,6 +16,7 @@ import org.springframework.boot.test.context.SpringBootTest import org.springframework.cloud.contract.wiremock.AutoConfigureWireMock import org.springframework.test.context.ActiveProfiles import java.io.IOException +import java.time.LocalDate @SpringBootTest(classes = [DevLauncher::class], properties = ["FAMILIE_KS_SAK_API_URL=http://localhost:28085/api"]) @ActiveProfiles("dev", "mock-oauth") @@ -38,7 +40,34 @@ class KsSakClientTest { ) val response = ksSakClient.hentSaksnummer(personIdent) - Assertions.assertThat(response).isEqualTo(fagsakId.toString()) + assertThat(response).isEqualTo(fagsakId.toString()) + } + + @Test + @Tag("integration") + fun `skal hente minimal fagsak og mappe til RestMinimalFagsak`() { + stubFor( + get(urlEqualTo("/api/fagsaker/minimal/1")) + .willReturn( + aResponse() + .withHeader("Content-Type", "application/json") + .withBody(gyldigResponseMinimalSak()), + ), + ) + + val response = ksSakClient.hentMinimalRestFagsak(fagsakId) + assertThat(response.id).isEqualTo(fagsakId) + assertThat(response.behandlinger).hasSize(1) + assertThat(response.behandlinger.first().aktiv).isTrue() + assertThat(response.behandlinger.first().behandlingId).isEqualTo(1000) + assertThat(response.behandlinger.first().kategori).isEqualTo(BehandlingKategori.NASJONAL) + assertThat(response.behandlinger.first().underkategori).isNull() + assertThat(response.behandlinger.first().opprettetTidspunkt).isEqualTo(LocalDate.of(2023, 4, 2).atStartOfDay()) + assertThat(response.behandlinger.first().status).isEqualTo("AVSLUTTET") + assertThat(response.behandlinger.first().type).isEqualTo("FØRSTEGANGSBEHANDLING") + assertThat(response.behandlinger.first().vedtaksdato).isEqualTo(LocalDate.of(2023, 4, 3).atStartOfDay()) + assertThat(response.behandlinger.first().årsak).isEqualTo("SØKNAD") + assertThat(response.behandlinger.first().resultat).isEqualTo("INNVILGET") } @Throws(IOException::class) @@ -57,6 +86,41 @@ class KsSakClientTest { "}" } + @Throws(IOException::class) + private fun gyldigResponseMinimalSak(): String { + return """ + { + "data": { + "opprettetTidspunkt": "2023-04-01T00:00:00.00", + "id": $fagsakId, + "søkerFødselsnummer": "42104200000", + "status": "LØPENDE", + "underBehandling": false, + "løpendeKategori": "NASJONAL", + "behandlinger": [ + { + "behandlingId": 1000, + "opprettetTidspunkt": "2023-04-02T00:00:00.00", + "kategori": "NASJONAL", + "aktiv": true, + "årsak": "SØKNAD", + "type": "FØRSTEGANGSBEHANDLING", + "status": "AVSLUTTET", + "resultat": "INNVILGET", + "vedtaksdato": "2023-04-03T00:00:00.00" + } + ], + "tilbakekrevingsbehandlinger": [], + "gjeldendeUtbetalingsperioder": [] + }, + "status": "SUKSESS", + "melding": "Innhenting av data var vellykket", + "frontendFeilmelding": null, + "stacktrace": null + } + """.trimIndent() + } + companion object { private val personIdent = "12345678910" private val fagsakId = 1L diff --git a/src/test/kotlin/no/nav/familie/baks/mottak/task/VurderLivshendelseServiceTest.kt b/src/test/kotlin/no/nav/familie/baks/mottak/task/VurderLivshendelseServiceTest.kt index cf20c6944..d716e7780 100644 --- a/src/test/kotlin/no/nav/familie/baks/mottak/task/VurderLivshendelseServiceTest.kt +++ b/src/test/kotlin/no/nav/familie/baks/mottak/task/VurderLivshendelseServiceTest.kt @@ -19,12 +19,12 @@ import no.nav.familie.baks.mottak.integrasjoner.OppgaveVurderLivshendelseDto import no.nav.familie.baks.mottak.integrasjoner.PdlClient import no.nav.familie.baks.mottak.integrasjoner.PdlForeldreBarnRelasjon import no.nav.familie.baks.mottak.integrasjoner.PdlPersonData -import no.nav.familie.baks.mottak.integrasjoner.RestArbeidsfordelingPåBehandling -import no.nav.familie.baks.mottak.integrasjoner.RestFagsak import no.nav.familie.baks.mottak.integrasjoner.RestFagsakDeltager import no.nav.familie.baks.mottak.integrasjoner.RestFagsakIdOgTilknyttetAktørId -import no.nav.familie.baks.mottak.integrasjoner.RestUtvidetBehandling +import no.nav.familie.baks.mottak.integrasjoner.RestMinimalFagsak +import no.nav.familie.baks.mottak.integrasjoner.RestVisningBehandling import no.nav.familie.baks.mottak.integrasjoner.Sivilstand +import no.nav.familie.baks.mottak.task.VurderLivshendelseService.Companion.BEHANDLING_TYPE_MIGRERING import no.nav.familie.kontrakter.ba.infotrygd.InfotrygdSøkResponse import no.nav.familie.kontrakter.ba.infotrygd.Stønad import no.nav.familie.kontrakter.felles.Behandlingstema @@ -183,7 +183,7 @@ class VurderLivshendelseServiceTest { ), ) - every { mockBaSakClient.hentRestFagsak(SAKS_ID) } returns lagAktivUtvidet() + every { mockBaSakClient.hentMinimalRestFagsak(SAKS_ID) } returns lagMinimalRestFagsakForBA() val livshendelseTask = Task( @@ -254,7 +254,7 @@ class VurderLivshendelseServiceTest { ), ) - every { mockKsSakClient.hentRestFagsak(SAKS_ID) } returns lagAktivUtvidet() + every { mockKsSakClient.hentMinimalRestFagsak(SAKS_ID) } returns lagMinimalRestFagsakForKS() val livshendelseTask = Task( @@ -321,7 +321,7 @@ class VurderLivshendelseServiceTest { ), ) - every { mockBaSakClient.hentRestFagsak(SAKS_ID) } returns lagAktivUtvidet() + every { mockBaSakClient.hentMinimalRestFagsak(SAKS_ID) } returns lagMinimalRestFagsakForBA() val livshendelseTask = Task( @@ -389,7 +389,7 @@ class VurderLivshendelseServiceTest { ), ) - every { mockKsSakClient.hentRestFagsak(SAKS_ID) } returns lagAktivUtvidet() + every { mockKsSakClient.hentMinimalRestFagsak(SAKS_ID) } returns lagMinimalRestFagsakForBA() val livshendelseTask = Task( @@ -446,7 +446,7 @@ class VurderLivshendelseServiceTest { ), ) - every { mockBaSakClient.hentRestFagsak(SAKS_ID) } returns lagAktivUtvidet() + every { mockBaSakClient.hentMinimalRestFagsak(SAKS_ID) } returns lagMinimalRestFagsakForBA() val livshendelseTask = Task( @@ -487,7 +487,7 @@ class VurderLivshendelseServiceTest { sivilstandMedDagensDato.data andThen sivilstandEldreEnnBasakVedtakMenNyereEnnInfotrygdVedtak.data - every { mockBaSakClient.hentRestFagsak(SAKS_ID) } returns lagAktivUtvidet() + every { mockBaSakClient.hentMinimalRestFagsak(SAKS_ID) } returns lagMinimalRestFagsakForBA() listOf(1, 2, 3, 4).forEach { val livshendelseTask = @@ -521,7 +521,7 @@ class VurderLivshendelseServiceTest { RestFagsakIdOgTilknyttetAktørId(PERSONIDENT_MOR + "00", SAKS_ID), ) - every { mockBaSakClient.hentRestFagsak(SAKS_ID) } returns lagAktivUtvidet() + every { mockBaSakClient.hentMinimalRestFagsak(SAKS_ID) } returns lagMinimalRestFagsakForBA() val oppgavebeskrivelseSlot = slot() every { mockOppgaveClient.oppdaterOppgaveBeskrivelse(any(), capture(oppgavebeskrivelseSlot)) } returns OppgaveResponse( @@ -673,22 +673,34 @@ class VurderLivshendelseServiceTest { ) } - private fun lagAktivUtvidet() = - RestFagsak( - SAKS_ID, - listOf( - RestUtvidetBehandling( - true, - RestArbeidsfordelingPåBehandling(ENHET_ID), - 321, - BehandlingKategori.NASJONAL, - LocalDateTime.now(), - "INNVILGET", - "BEHANDLING_AVSLUTTET", - "MIGRERING_FRA_INFOTRYGD", - BehandlingUnderkategori.UTVIDET, + private fun lagMinimalRestFagsakForBA() = + RestMinimalFagsak( + id = SAKS_ID, + behandlinger = + listOf( + lagRestVisningBehandling(underkategori = BehandlingUnderkategori.UTVIDET), + ), + ) + + private fun lagMinimalRestFagsakForKS() = + RestMinimalFagsak( + id = SAKS_ID, + behandlinger = + listOf( + lagRestVisningBehandling(underkategori = null), ), - ), + ) + + private fun lagRestVisningBehandling(underkategori: BehandlingUnderkategori?) = + RestVisningBehandling( + aktiv = true, + behandlingId = 321, + kategori = BehandlingKategori.NASJONAL, + opprettetTidspunkt = LocalDateTime.now(), + resultat = "INNVILGET", + status = "AVSLUTTET", + type = BEHANDLING_TYPE_MIGRERING, + underkategori = underkategori, ) private fun lagInfotrygdResponse() =