Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

VurderLivshendelse tar i bruk minimal restfagsak #1001

Merged
merged 2 commits into from
Jan 2, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,8 @@ data class RestMinimalFagsak(
class RestVisningBehandling(
val behandlingId: Long,
val opprettetTidspunkt: LocalDateTime,
val kategori: BehandlingKategori,
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

leveres av både ks og ba

val underkategori: BehandlingUnderkategori?,
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Denne er null for KS

Copy link
Contributor

@halvorbmundal halvorbmundal Dec 19, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Kan vi dokumentere dette gjennom typer? F.eks:

sealed class RestVisningBehandling(
    val behandlingId: Long,
    val opprettetTidspunkt: LocalDateTime,
    val kategori: BehandlingKategori,
    val aktiv: Boolean,
    val årsak: String? = null,
    val type: String,
    val status: String,
    val resultat: String? = null,
    val vedtaksdato: LocalDateTime? = null
) {
    data class Ba(
        val underkategori: BehandlingUnderkategori
    ) : RestVisningBehandling(
        behandlingId,
        opprettetTidspunkt,
        kategori,
        aktiv,
        årsak,
        type,
        status,
        resultat,
        vedtaksdato
    )

    data class Ks : RestVisningBehandling(
        behandlingId,
        opprettetTidspunkt,
        kategori,
        aktiv,
        årsak,
        type,
        status,
        resultat,
        vedtaksdato
    )
}

val aktiv: Boolean,
val årsak: String? = null,
val type: String,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<Ressurs<RestFagsak>>(uri)
getForEntity<Ressurs<RestMinimalFagsak>>(uri)
}.fold(
onSuccess = { it.data ?: throw IntegrasjonException(it.melding, null, uri) },
onFailure = { throw IntegrasjonException("Feil ved henting av RestFagsak fra ks-sak.", it, uri) },
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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")
}
Expand Down Expand Up @@ -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())) {
Expand Down Expand Up @@ -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"
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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")
Expand All @@ -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)
Expand All @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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")
Expand All @@ -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)
Expand All @@ -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
Expand Down
Loading