From c6b05c2ce5f90823e40486eea7412d1974f189cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Oliver=20S=C3=B8berg?= <82504565+sebassonav@users.noreply.github.com> Date: Fri, 5 Jul 2024 15:48:55 +0200 Subject: [PATCH] =?UTF-8?q?EY-4170=20Kopiere=20vurdering=20og=20vilk=C3=A5?= =?UTF-8?q?rsvurdering=20hvis=20omgj=C3=B8ring=20har=20avsl=E2=80=A6=20(#5?= =?UTF-8?q?316)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * EY-4170 Kopiere vurdering og vilkårsvurdering hvis omgjøring har avslag tidligere * Fiks test * EY-4181 Pingable vilkårsvurdering klient * Test for kopiering ved omgjøring * Fix request body for kopiering * Fiks lokal kjøring behandling * Lagre ny førstegangsbehandling ned siden den må finnes før vilkårsvurdering kan kopiere den over pga tilgangssjekk * Pr feedback, og bruk felles opprettdto * Vv trenger grunnlag for behandlingen --- .../workflows/app-etterlatte-behandling.yaml | 1 + apps/etterlatte-behandling/.nais/dev.yaml | 5 + apps/etterlatte-behandling/.nais/prod.yaml | 5 + .../etterlatte-behandling.dev-gcp.run.xml | 2 + apps/etterlatte-behandling/build.gradle.kts | 1 + .../main/kotlin/behandling/BehandlingDao.kt | 38 +++-- .../kotlin/behandling/BehandlingFactory.kt | 157 +++++++++++++----- .../kotlin/behandling/BehandlingRoutes.kt | 10 +- .../kotlin/behandling/BehandlingService.kt | 2 +- .../behandling/GyldighetsproevingService.kt | 3 +- .../klienter/VilkaarsvurderingKlient.kt | 61 +++++++ .../main/kotlin/config/ApplicationContext.kt | 5 + .../src/main/resources/application.conf | 3 + .../kotlin/behandling/BehandlingDaoTest.kt | 22 +-- .../behandling/BehandlingFactoryTest.kt | 131 ++++++++++++--- .../behandling/BehandlingServiceImplTest.kt | 28 ++-- .../GyldighetsproevingServiceImplTest.kt | 6 +- .../RevurderingServiceIntegrationTest.kt | 4 + .../integration/BehandlingIntegrationTest.kt | 1 + .../kotlin/integration/EksterneKlienter.kt | 30 +++- .../test/kotlin/integration/HttpKlienter.kt | 15 -- .../sakOgBehandling/OmgjoerAvslagModal.tsx | 8 +- .../client/src/shared/api/revurdering.ts | 4 +- .../.nais/dev.yaml | 1 + .../.nais/prod.yaml | 1 + 25 files changed, 397 insertions(+), 147 deletions(-) create mode 100644 apps/etterlatte-behandling/src/main/kotlin/behandling/klienter/VilkaarsvurderingKlient.kt diff --git a/.github/workflows/app-etterlatte-behandling.yaml b/.github/workflows/app-etterlatte-behandling.yaml index 760ea9f1fa2..ec40ec597f7 100644 --- a/.github/workflows/app-etterlatte-behandling.yaml +++ b/.github/workflows/app-etterlatte-behandling.yaml @@ -27,6 +27,7 @@ on: - libs/etterlatte-pdl-model/** - libs/etterlatte-sporingslogg/** - libs/etterlatte-vedtaksvurdering-model/** + - libs/etterlatte-vilkaarsvurdering-model/** - libs/etterlatte-funksjonsbrytere/** - libs/rapidsandrivers-extras/** - gradle/libs.versions.toml diff --git a/apps/etterlatte-behandling/.nais/dev.yaml b/apps/etterlatte-behandling/.nais/dev.yaml index b09d56a2a80..0383f50a285 100644 --- a/apps/etterlatte-behandling/.nais/dev.yaml +++ b/apps/etterlatte-behandling/.nais/dev.yaml @@ -141,6 +141,10 @@ spec: value: api://dev-gcp.etterlatte.etterlatte-klage/.default - name: ETTERLATTE_KLAGE_API_URL value: http://etterlatte-klage + - name: ETTERLATTE_VILKAARSVURDERING_CLIENT_ID + value: dev-gcp.etterlatte.etterlatte-vilkaarsvurdering + - name: ETTERLATTE_VILKAARSVURDERING_URL + value: http://etterlatte-vilkaarsvurdering - name: OPPGAVE_CLIENT_ID value: dev-fss.oppgavehandtering.oppgave - name: OPPGAVE_URL @@ -174,6 +178,7 @@ spec: - application: etterlatte-migrering - application: etterlatte-beregning - application: etterlatte-tilbakekreving + - application: etterlatte-vilkaarsvurdering - application: skjermede-personer-pip # namespace hører til denne. Ikke legg til ny app i mellom. namespace: nom - application: digdir-krr-proxy diff --git a/apps/etterlatte-behandling/.nais/prod.yaml b/apps/etterlatte-behandling/.nais/prod.yaml index 34628ae5ee9..bad83888970 100644 --- a/apps/etterlatte-behandling/.nais/prod.yaml +++ b/apps/etterlatte-behandling/.nais/prod.yaml @@ -148,6 +148,10 @@ spec: value: api://prod-gcp.etterlatte.etterlatte-klage/.default - name: ETTERLATTE_KLAGE_API_URL value: http://etterlatte-klage + - name: ETTERLATTE_VILKAARSVURDERING_CLIENT_ID + value: prod-gcp.etterlatte.etterlatte-vilkaarsvurdering + - name: ETTERLATTE_VILKAARSVURDERING_URL + value: http://etterlatte-vilkaarsvurdering - name: OPPGAVE_CLIENT_ID value: prod-fss.oppgavehandtering.oppgave - name: OPPGAVE_URL @@ -173,6 +177,7 @@ spec: accessPolicy: outbound: rules: + - application: etterlatte-vilkaarsvurdering - application: etterlatte-brev-api - application: etterlatte-pdltjenester - application: etterlatte-grunnlag diff --git a/apps/etterlatte-behandling/.run/etterlatte-behandling.dev-gcp.run.xml b/apps/etterlatte-behandling/.run/etterlatte-behandling.dev-gcp.run.xml index fb9f30b2a0b..ea66a95a1c5 100644 --- a/apps/etterlatte-behandling/.run/etterlatte-behandling.dev-gcp.run.xml +++ b/apps/etterlatte-behandling/.run/etterlatte-behandling.dev-gcp.run.xml @@ -44,6 +44,8 @@ + + diff --git a/apps/etterlatte-behandling/build.gradle.kts b/apps/etterlatte-behandling/build.gradle.kts index 4974ab06c3b..b275f277ce7 100644 --- a/apps/etterlatte-behandling/build.gradle.kts +++ b/apps/etterlatte-behandling/build.gradle.kts @@ -20,6 +20,7 @@ dependencies { implementation(project(":libs:etterlatte-tilbakekreving-model")) implementation(project(":libs:etterlatte-migrering-model")) implementation(project(":libs:etterlatte-brev-model")) + implementation(project(":libs:etterlatte-vilkaarsvurdering-model")) implementation(libs.ktor2.okhttp) implementation(libs.ktor2.servercore) diff --git a/apps/etterlatte-behandling/src/main/kotlin/behandling/BehandlingDao.kt b/apps/etterlatte-behandling/src/main/kotlin/behandling/BehandlingDao.kt index 0cdbfb66449..7f6e3a55628 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/behandling/BehandlingDao.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/BehandlingDao.kt @@ -21,6 +21,7 @@ import no.nav.etterlatte.libs.common.behandling.Prosesstype import no.nav.etterlatte.libs.common.behandling.Revurderingaarsak import no.nav.etterlatte.libs.common.behandling.Utlandstilknytning import no.nav.etterlatte.libs.common.behandling.Virkningstidspunkt +import no.nav.etterlatte.libs.common.gyldigSoeknad.GyldighetsResultat import no.nav.etterlatte.libs.common.sak.BehandlingOgSak import no.nav.etterlatte.libs.common.sak.Sak import no.nav.etterlatte.libs.common.sak.Saker @@ -69,7 +70,7 @@ class BehandlingDao( } } - fun alleBehandlingerISak(sakid: Long): List = + fun hentBehandlingerForSak(sakid: Long): List = connectionAutoclosing.hentConnection { with(it) { val stmt = @@ -224,24 +225,25 @@ class BehandlingDao( } } - fun lagreGyldighetsproving(behandling: Foerstegangsbehandling) = - connectionAutoclosing.hentConnection { - with(it) { - val stmt = - prepareStatement( - """ - UPDATE behandling SET gyldighetssproving = ?, status = ?, sist_endret = ? - WHERE id = ? - """.trimIndent(), - ) - - stmt.setObject(1, objectMapper.writeValueAsString(behandling.gyldighetsproeving)) - stmt.setString(2, behandling.status.name) - stmt.setTidspunkt(3, behandling.sistEndret.toTidspunkt()) - stmt.setObject(4, behandling.id) - require(stmt.executeUpdate() == 1) - } + fun lagreGyldighetsproeving( + behandlingId: UUID, + gyldighetsproeving: GyldighetsResultat?, + ) = connectionAutoclosing.hentConnection { + with(it) { + val stmt = + prepareStatement( + """ + UPDATE behandling SET gyldighetssproving = ?, sist_endret = ? + WHERE id = ? + """.trimIndent(), + ) + + stmt.setObject(1, objectMapper.writeValueAsString(gyldighetsproeving)) + stmt.setTidspunkt(2, Tidspunkt.now().toLocalDatetimeUTC().toTidspunkt()) + stmt.setObject(3, behandlingId) + require(stmt.executeUpdate() == 1) } + } fun lagreStatus(lagretBehandling: Behandling) { lagreStatus(lagretBehandling.id, lagretBehandling.status, lagretBehandling.sistEndret) diff --git a/apps/etterlatte-behandling/src/main/kotlin/behandling/BehandlingFactory.kt b/apps/etterlatte-behandling/src/main/kotlin/behandling/BehandlingFactory.kt index 93d6202c655..405551bacb3 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/behandling/BehandlingFactory.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/BehandlingFactory.kt @@ -8,6 +8,8 @@ import no.nav.etterlatte.behandling.domain.toBehandlingOpprettet import no.nav.etterlatte.behandling.domain.toStatistikkBehandling import no.nav.etterlatte.behandling.hendelse.HendelseDao import no.nav.etterlatte.behandling.klienter.MigreringKlient +import no.nav.etterlatte.behandling.klienter.VilkaarsvurderingKlient +import no.nav.etterlatte.behandling.kommerbarnettilgode.KommerBarnetTilGodeService import no.nav.etterlatte.behandling.revurdering.AutomatiskRevurderingService import no.nav.etterlatte.common.Enheter import no.nav.etterlatte.grunnlagsendring.SakMedEnhet @@ -57,6 +59,8 @@ class BehandlingFactory( private val hendelseDao: HendelseDao, private val behandlingHendelser: BehandlingHendelserKafkaProducer, private val migreringKlient: MigreringKlient, + private val kommerBarnetTilGodeService: KommerBarnetTilGodeService, + private val vilkaarsvurderingKlient: VilkaarsvurderingKlient, ) { private val logger = LoggerFactory.getLogger(this::class.java) @@ -233,63 +237,118 @@ class BehandlingFactory( fun opprettOmgjoeringAvslag( sakId: Long, saksbehandler: Saksbehandler, + skalKopiere: Boolean, ): Behandling { - val sak = sakService.finnSak(sakId) ?: throw GenerellIkkeFunnetException() - val behandlingerISak = behandlingDao.alleBehandlingerISak(sakId) - val foerstegangsbehandlinger = behandlingerISak.filter { it.type == BehandlingType.FØRSTEGANGSBEHANDLING } - if (foerstegangsbehandlinger.isEmpty()) { - throw AvslagOmgjoering.IngenFoerstegangsbehandling() - } - val foerstegangsbehandlingerIkkeAvslaattAvbrutt = - foerstegangsbehandlinger.filter { it.status !in listOf(BehandlingStatus.AVBRUTT, BehandlingStatus.AVSLAG) } - if (foerstegangsbehandlingerIkkeAvslaattAvbrutt.isNotEmpty()) { - throw AvslagOmgjoering.FoerstegangsbehandlingFeilStatus( - sakId, - foerstegangsbehandlingerIkkeAvslaattAvbrutt.first().id, - ) - } - if (behandlingerISak.any { it.status.aapenBehandling() }) { - throw AvslagOmgjoering.HarAapenBehandling() - } + val behandlingerForOmgjoering = + inTransaction { + val sak = sakService.finnSak(sakId) ?: throw GenerellIkkeFunnetException() + val behandlingerISak = behandlingDao.hentBehandlingerForSak(sakId) + val foerstegangsbehandlinger = behandlingerISak.filter { it.type == BehandlingType.FØRSTEGANGSBEHANDLING } + if (foerstegangsbehandlinger.isEmpty()) { + throw AvslagOmgjoering.IngenFoerstegangsbehandling() + } + val foerstegangsbehandlingerIkkeAvslaattAvbrutt = + foerstegangsbehandlinger.filter { + it.status !in + listOf( + BehandlingStatus.AVBRUTT, + BehandlingStatus.AVSLAG, + ) + } + if (foerstegangsbehandlingerIkkeAvslaattAvbrutt.isNotEmpty()) { + throw AvslagOmgjoering.FoerstegangsbehandlingFeilStatus( + sakId, + foerstegangsbehandlingerIkkeAvslaattAvbrutt.first().id, + ) + } + if (behandlingerISak.any { it.status.aapenBehandling() }) { + throw AvslagOmgjoering.HarAapenBehandling() + } - val foerstegangsbehandlingViOmgjoerer = - foerstegangsbehandlinger.maxBy { it.behandlingOpprettet } - val behandling = - checkNotNull( - opprettFoerstegangsbehandling( - harBehandlingUnderbehandling = listOf(), - sak = sak, - mottattDato = foerstegangsbehandlingViOmgjoerer.mottattDato().toString(), - kilde = Vedtaksloesning.GJENNY, - prosessType = Prosesstype.MANUELL, - ), - ) { - "Behandlingen vi akkurat opprettet fins ikke :(" - } + val sisteAvslaatteBehandling = + behandlingerISak.filter { it.status == BehandlingStatus.AVSLAG }.maxByOrNull { it.behandlingOpprettet } + + val foerstegangsbehandlingViOmgjoerer = + foerstegangsbehandlinger.maxBy { it.behandlingOpprettet } + val nyFoerstegangsbehandling = + checkNotNull( + opprettFoerstegangsbehandling( + behandlingerUnderBehandling = emptyList(), + sak = sak, + mottattDato = foerstegangsbehandlingViOmgjoerer.mottattDato().toString(), + kilde = Vedtaksloesning.GJENNY, + prosessType = Prosesstype.MANUELL, + ), + ) { + "Behandlingen vi akkurat opprettet fins ikke :(" + } - val persongalleri = runBlocking { grunnlagService.hentPersongalleri(foerstegangsbehandlingViOmgjoerer.id) } - grunnlagService.leggInnNyttGrunnlag(behandling, persongalleri) + kopierFoerstegangsbehandlingOversikt(skalKopiere, sisteAvslaatteBehandling, nyFoerstegangsbehandling.id) + val oppgave = + oppgaveService.opprettFoerstegangsbehandlingsOppgaveForInnsendtSoeknad( + referanse = nyFoerstegangsbehandling.id.toString(), + sakId = nyFoerstegangsbehandling.sak.id, + oppgaveKilde = OppgaveKilde.BEHANDLING, + merknad = "Omgjøring av førstegangsbehandling", + ) + oppgaveService.tildelSaksbehandler(oppgave.id, saksbehandler.ident) - val oppgave = - oppgaveService.opprettFoerstegangsbehandlingsOppgaveForInnsendtSoeknad( - referanse = behandling.id.toString(), - sakId = behandling.sak.id, - oppgaveKilde = OppgaveKilde.BEHANDLING, - merknad = "Omgjøring av førstegangsbehandling", - ) - oppgaveService.tildelSaksbehandler(oppgave.id, saksbehandler.ident) + OmgjoerBehandling(nyFoerstegangsbehandling, sisteAvslaatteBehandling, foerstegangsbehandlingViOmgjoerer) + } + + val persongalleri = + runBlocking { grunnlagService.hentPersongalleri(behandlingerForOmgjoering.foerstegangsbehandlingViOmgjoerer.id) } + grunnlagService.leggInnNyttGrunnlag(behandlingerForOmgjoering.nyFoerstegangsbehandling, persongalleri) + + if (skalKopiere && behandlingerForOmgjoering.sisteAvslaatteBehandling != null) { + runBlocking { + // Dette må skje etter at grunnlag er lagt inn da det trengs i kopiering + vilkaarsvurderingKlient.kopierVilkaarsvurdering( + kopierTilBehandling = behandlingerForOmgjoering.nyFoerstegangsbehandling.id, + kopierFraBehandling = behandlingerForOmgjoering.sisteAvslaatteBehandling.id, + brukerTokenInfo = saksbehandler, + ) + } + } behandlingHendelser.sendMeldingForHendelseStatisitkk( - behandling.toStatistikkBehandling(persongalleri), + behandlingerForOmgjoering.nyFoerstegangsbehandling.toStatistikkBehandling(persongalleri), BehandlingHendelseType.OPPRETTET, ) - return behandling + return behandlingerForOmgjoering.nyFoerstegangsbehandling + } + + private fun kopierFoerstegangsbehandlingOversikt( + skalKopiere: Boolean, + sisteAvslaatteBehandling: Behandling?, + nyFoerstegangsbehandlingId: UUID, + ) { + if (skalKopiere && sisteAvslaatteBehandling != null) { + sisteAvslaatteBehandling.kommerBarnetTilgode?.let { + kommerBarnetTilGodeService.lagreKommerBarnetTilgode(it.copy(behandlingId = nyFoerstegangsbehandlingId)) + } + sisteAvslaatteBehandling.virkningstidspunkt?.let { + behandlingDao.lagreNyttVirkningstidspunkt( + nyFoerstegangsbehandlingId, + it, + ) + } + sisteAvslaatteBehandling.utlandstilknytning?.let { + behandlingDao.lagreUtlandstilknytning( + nyFoerstegangsbehandlingId, + it, + ) + } + sisteAvslaatteBehandling + .gyldighetsproeving() + ?.let { behandlingDao.lagreGyldighetsproeving(nyFoerstegangsbehandlingId, it) } + } } internal fun hentDataForOpprettBehandling(sakId: Long): DataHentetForOpprettBehandling { val sak = requireNotNull(sakService.finnSak(sakId)) { "Fant ingen sak med id=$sakId!" } val harBehandlingerForSak = - behandlingDao.alleBehandlingerISak(sak.id) + behandlingDao.hentBehandlingerForSak(sak.id) return DataHentetForOpprettBehandling( sak = sak, @@ -303,13 +362,13 @@ class BehandlingFactory( ) = sakService.finnGjeldendeEnhet(persongalleri.soeker, sakType) private fun opprettFoerstegangsbehandling( - harBehandlingUnderbehandling: List, + behandlingerUnderBehandling: List, sak: Sak, mottattDato: String?, kilde: Vedtaksloesning, prosessType: Prosesstype, ): Behandling? { - harBehandlingUnderbehandling.forEach { + behandlingerUnderBehandling.forEach { behandlingDao.lagreStatus(it.id, BehandlingStatus.AVBRUTT, LocalDateTime.now()) oppgaveService.avbrytAapneOppgaverMedReferanse(it.id.toString()) } @@ -333,6 +392,12 @@ class BehandlingFactory( } } +data class OmgjoerBehandling( + val nyFoerstegangsbehandling: Behandling, + val sisteAvslaatteBehandling: Behandling?, + val foerstegangsbehandlingViOmgjoerer: Behandling, +) + data class BehandlingOgOppgave( val behandling: Behandling, val oppgave: OppgaveIntern?, diff --git a/apps/etterlatte-behandling/src/main/kotlin/behandling/BehandlingRoutes.kt b/apps/etterlatte-behandling/src/main/kotlin/behandling/BehandlingRoutes.kt index d73922f1da8..1eab9f20e49 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/behandling/BehandlingRoutes.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/BehandlingRoutes.kt @@ -55,6 +55,10 @@ enum class BehandlingFeatures( override fun key(): String = key } +data class OmgjoeringRequest( + val skalKopiere: Boolean, +) + internal fun Route.behandlingRoutes( behandlingService: BehandlingService, gyldighetsproevingService: GyldighetsproevingService, @@ -81,10 +85,8 @@ internal fun Route.behandlingRoutes( throw IkkeTillattException("NOT_SUPPORTED", "Omgjøring av førstegangsbehandling er ikke støttet") } kunSaksbehandlerMedSkrivetilgang { saksbehandler -> - val behandlingOgOppgave = - inTransaction { - behandlingFactory.opprettOmgjoeringAvslag(sakId, saksbehandler) - } + val skalKopiereRequest = call.receive() + val behandlingOgOppgave = behandlingFactory.opprettOmgjoeringAvslag(sakId, saksbehandler, skalKopiereRequest.skalKopiere) call.respond(behandlingOgOppgave.toBehandlingSammendrag()) } } diff --git a/apps/etterlatte-behandling/src/main/kotlin/behandling/BehandlingService.kt b/apps/etterlatte-behandling/src/main/kotlin/behandling/BehandlingService.kt index f3bef4e6bc4..367a45640b8 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/behandling/BehandlingService.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/BehandlingService.kt @@ -212,7 +212,7 @@ internal class BehandlingServiceImpl( listOf(behandling).filterForEnheter().firstOrNull() } - private fun hentBehandlingerForSakId(sakId: Long) = behandlingDao.alleBehandlingerISak(sakId).filterForEnheter() + private fun hentBehandlingerForSakId(sakId: Long) = behandlingDao.hentBehandlingerForSak(sakId).filterForEnheter() override fun hentBehandling(behandlingId: UUID): Behandling? = hentBehandlingForId(behandlingId) diff --git a/apps/etterlatte-behandling/src/main/kotlin/behandling/GyldighetsproevingService.kt b/apps/etterlatte-behandling/src/main/kotlin/behandling/GyldighetsproevingService.kt index be2673dc97a..68eb75ff209 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/behandling/GyldighetsproevingService.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/GyldighetsproevingService.kt @@ -82,7 +82,8 @@ class GyldighetsproevingServiceImpl( this .oppdaterGyldighetsproeving(gyldighetsproeving) .also { - behandlingDao.lagreGyldighetsproving(it) + behandlingDao.lagreGyldighetsproeving(it.id, it.gyldighetsproeving()) + behandlingDao.lagreStatus(it) logger.info("behandling ${it.id} i sak: ${it.sak.id} er gyldighetsprøvd. Saktype: ${it.sak.sakType}") } } diff --git a/apps/etterlatte-behandling/src/main/kotlin/behandling/klienter/VilkaarsvurderingKlient.kt b/apps/etterlatte-behandling/src/main/kotlin/behandling/klienter/VilkaarsvurderingKlient.kt new file mode 100644 index 00000000000..d0336c4f704 --- /dev/null +++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/klienter/VilkaarsvurderingKlient.kt @@ -0,0 +1,61 @@ +package no.nav.etterlatte.behandling.klienter + +import com.github.michaelbull.result.mapError +import com.typesafe.config.Config +import io.ktor.client.HttpClient +import no.nav.etterlatte.common.klienter.PdlTjenesterKlientImpl.Companion.logger +import no.nav.etterlatte.libs.ktor.PingResult +import no.nav.etterlatte.libs.ktor.Pingable +import no.nav.etterlatte.libs.ktor.ktor.ktorobo.AzureAdClient +import no.nav.etterlatte.libs.ktor.ktor.ktorobo.DownstreamResourceClient +import no.nav.etterlatte.libs.ktor.ktor.ktorobo.Resource +import no.nav.etterlatte.libs.ktor.ping +import no.nav.etterlatte.libs.ktor.token.BrukerTokenInfo +import no.nav.etterlatte.vilkaarsvurdering.OpprettVilkaarsvurderingFraBehandling +import java.util.UUID + +interface VilkaarsvurderingKlient : Pingable { + suspend fun kopierVilkaarsvurdering( + kopierTilBehandling: UUID, + kopierFraBehandling: UUID, + brukerTokenInfo: BrukerTokenInfo, + ) +} + +class VilkaarsvurderingKlientImpl( + config: Config, + private val httpClient: HttpClient, +) : VilkaarsvurderingKlient { + private val clientId = config.getString("vilkaarsvurdering.client.id") + private val resourceUrl = config.getString("vilkaarsvurdering.resource.url") + private val azureAdClient = AzureAdClient(config) + private val downstreamResourceClient = DownstreamResourceClient(azureAdClient, httpClient) + + override suspend fun kopierVilkaarsvurdering( + kopierTilBehandling: UUID, + kopierFraBehandling: UUID, + brukerTokenInfo: BrukerTokenInfo, + ) { + downstreamResourceClient + .post( + resource = Resource(clientId = clientId, url = "$resourceUrl/api/vilkaarsvurdering/$kopierTilBehandling/kopier"), + brukerTokenInfo = brukerTokenInfo, + postBody = OpprettVilkaarsvurderingFraBehandling(forrigeBehandling = kopierFraBehandling), + ).mapError { error -> throw error } + } + + override val serviceName: String + get() = "VilkårsvurderingKlient" + override val beskrivelse: String + get() = "Snakker med vilkårsvurdering" + override val endpoint: String + get() = this.resourceUrl + + override suspend fun ping(konsument: String?): PingResult = + httpClient.ping( + pingUrl = resourceUrl.plus("/health/isready"), + logger = logger, + serviceName = serviceName, + beskrivelse = beskrivelse, + ) +} diff --git a/apps/etterlatte-behandling/src/main/kotlin/config/ApplicationContext.kt b/apps/etterlatte-behandling/src/main/kotlin/config/ApplicationContext.kt index e8bdd041549..c734b012830 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/config/ApplicationContext.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/config/ApplicationContext.kt @@ -54,6 +54,8 @@ import no.nav.etterlatte.behandling.klienter.TilbakekrevingKlient import no.nav.etterlatte.behandling.klienter.TilbakekrevingKlientImpl import no.nav.etterlatte.behandling.klienter.VedtakKlient import no.nav.etterlatte.behandling.klienter.VedtakKlientImpl +import no.nav.etterlatte.behandling.klienter.VilkaarsvurderingKlient +import no.nav.etterlatte.behandling.klienter.VilkaarsvurderingKlientImpl import no.nav.etterlatte.behandling.kommerbarnettilgode.KommerBarnetTilGodeDao import no.nav.etterlatte.behandling.kommerbarnettilgode.KommerBarnetTilGodeService import no.nav.etterlatte.behandling.omregning.MigreringService @@ -246,6 +248,7 @@ internal class ApplicationContext( val leaderElectionHttpClient: HttpClient = httpClient(), val grunnlagKlientObo: GrunnlagKlient = GrunnlagKlientObo(config, httpClient()), val beregningsKlient: BeregningKlient = BeregningKlientImpl(config, httpClient()), + val vilkaarsvuderingKlient: VilkaarsvurderingKlient = VilkaarsvurderingKlientImpl(config, httpClient()), val gosysOppgaveKlient: GosysOppgaveKlient = GosysOppgaveKlientImpl(config, httpClient()), val vedtakKlient: VedtakKlient = VedtakKlientImpl(config, httpClient()), val brevApiKlient: BrevApiKlient = BrevApiKlientObo(config, httpClient(forventSuksess = true)), @@ -507,6 +510,8 @@ internal class ApplicationContext( hendelseDao = hendelseDao, behandlingHendelser = behandlingsHendelser, migreringKlient = migreringKlient, + kommerBarnetTilGodeService = kommerBarnetTilGodeService, + vilkaarsvurderingKlient = vilkaarsvuderingKlient, ) val migreringService = diff --git a/apps/etterlatte-behandling/src/main/resources/application.conf b/apps/etterlatte-behandling/src/main/resources/application.conf index 6122dc641cf..f6bb9b07b38 100644 --- a/apps/etterlatte-behandling/src/main/resources/application.conf +++ b/apps/etterlatte-behandling/src/main/resources/application.conf @@ -26,6 +26,9 @@ beregning.resource.url = ${?ETTERLATTE_BEREGNING_URL} tilbakekreving.resource.url = ${?ETTERLATTE_TILBAKEKREVING_URL} tilbakekreving.azure.scope = ${?AZURE_SCOPE_ETTERLATTE_TILBAKEKREVING} +vilkaarsvurdering.client.id = ${?ETTERLATTE_VILKAARSVURDERING_CLIENT_ID} +vilkaarsvurdering.resource.url = ${?ETTERLATTE_VILKAARSVURDERING_URL} + oppgave.client.id = ${?OPPGAVE_CLIENT_ID} oppgave.resource.url = ${?OPPGAVE_URL} diff --git a/apps/etterlatte-behandling/src/test/kotlin/behandling/BehandlingDaoTest.kt b/apps/etterlatte-behandling/src/test/kotlin/behandling/BehandlingDaoTest.kt index 51781070d5d..cd07d34760d 100644 --- a/apps/etterlatte-behandling/src/test/kotlin/behandling/BehandlingDaoTest.kt +++ b/apps/etterlatte-behandling/src/test/kotlin/behandling/BehandlingDaoTest.kt @@ -164,7 +164,7 @@ internal class BehandlingDaoTest( val lagretPersongalleriBehandling = requireNotNull(behandlingRepo.hentBehandling(opprettBehandling.id)) as Foerstegangsbehandling - val gyldighetsproevingBehanding = + val gyldighetsproevingBehandling = lagretPersongalleriBehandling.copy( gyldighetsproeving = GyldighetsResultat( @@ -182,12 +182,12 @@ internal class BehandlingDaoTest( status = BehandlingStatus.OPPRETTET, ) - behandlingRepo.lagreGyldighetsproving(gyldighetsproevingBehanding) + behandlingRepo.lagreGyldighetsproeving(gyldighetsproevingBehandling.id, gyldighetsproevingBehandling.gyldighetsproeving()) val lagretGyldighetsproving = requireNotNull(behandlingRepo.hentBehandling(opprettBehandling.id)) as Foerstegangsbehandling assertEquals( - gyldighetsproevingBehanding.gyldighetsproeving, + gyldighetsproevingBehandling.gyldighetsproeving, lagretGyldighetsproving.gyldighetsproeving, ) } @@ -238,13 +238,13 @@ internal class BehandlingDaoTest( behandlingRepo.opprettBehandling(b) } - var behandling = behandlingRepo.alleBehandlingerISak(sak1) + var behandling = behandlingRepo.hentBehandlingerForSak(sak1) assertEquals(1, behandling.size) assertEquals(false, behandling.first().status == BehandlingStatus.AVBRUTT) val avbruttbehandling = (behandling.first() as Foerstegangsbehandling).copy(status = BehandlingStatus.AVBRUTT) behandlingRepo.lagreStatus(avbruttbehandling) - behandling = behandlingRepo.alleBehandlingerISak(sak1) + behandling = behandlingRepo.hentBehandlingerForSak(sak1) assertEquals(1, behandling.size) assertEquals(true, behandling.first().status == BehandlingStatus.AVBRUTT) } @@ -303,7 +303,7 @@ internal class BehandlingDaoTest( ) } - val behandlinger = behandlingRepo.alleBehandlingerISak(sak1) + val behandlinger = behandlingRepo.hentBehandlingerForSak(sak1) assertAll( "Skal hente ut to foerstegangsbehandlinger og to revurderinger", { assertEquals(4, behandlinger.size) }, @@ -336,10 +336,10 @@ internal class BehandlingDaoTest( } val foerstegangsbehandlinger = - behandlingRepo.alleBehandlingerISak(sak1).filter { + behandlingRepo.hentBehandlingerForSak(sak1).filter { it.type == BehandlingType.FØRSTEGANGSBEHANDLING } - val revurderinger = behandlingRepo.alleBehandlingerISak(sak1).filter { it.type == BehandlingType.REVURDERING } + val revurderinger = behandlingRepo.hentBehandlingerForSak(sak1).filter { it.type == BehandlingType.REVURDERING } assertAll( "Skal hente ut to foerstegangsbehandlinger og to revurderinger", { assertEquals(2, foerstegangsbehandlinger.size) }, @@ -394,9 +394,9 @@ internal class BehandlingDaoTest( ) } - val lagredeBehandlinger = behandlingRepo.alleBehandlingerISak(sak1) + val lagredeBehandlinger = behandlingRepo.hentBehandlingerForSak(sak1) val alleLoependeBehandlinger = - behandlingRepo.alleBehandlingerISak(sak1).filter { it.status in BehandlingStatus.underBehandling() } + behandlingRepo.hentBehandlingerForSak(sak1).filter { it.status in BehandlingStatus.underBehandling() } assertEquals(4, lagredeBehandlinger.size) assertEquals(2, alleLoependeBehandlinger.size) } @@ -519,7 +519,7 @@ internal class BehandlingDaoTest( .tilVilkaarsvurdert() .let { behandlingRepo.lagreNyttVirkningstidspunkt(it.id, it.virkningstidspunkt!!) - behandlingRepo.lagreGyldighetsproving(it) + behandlingRepo.lagreGyldighetsproeving(it.id, it.gyldighetsproeving()) kommerBarnetTilGodeDao.lagreKommerBarnetTilGode(it.kommerBarnetTilgode!!) behandlingRepo.lagreStatus(it.id, it.status, it.sistEndret) } diff --git a/apps/etterlatte-behandling/src/test/kotlin/behandling/BehandlingFactoryTest.kt b/apps/etterlatte-behandling/src/test/kotlin/behandling/BehandlingFactoryTest.kt index 1816f6d11f0..d3f348f852e 100644 --- a/apps/etterlatte-behandling/src/test/kotlin/behandling/BehandlingFactoryTest.kt +++ b/apps/etterlatte-behandling/src/test/kotlin/behandling/BehandlingFactoryTest.kt @@ -21,6 +21,7 @@ import no.nav.etterlatte.behandling.domain.OpprettBehandling import no.nav.etterlatte.behandling.domain.Revurdering import no.nav.etterlatte.behandling.hendelse.HendelseDao import no.nav.etterlatte.behandling.klage.KlageService +import no.nav.etterlatte.behandling.klienter.VilkaarsvurderingKlient import no.nav.etterlatte.behandling.kommerbarnettilgode.KommerBarnetTilGodeService import no.nav.etterlatte.behandling.revurdering.AutomatiskRevurderingService import no.nav.etterlatte.behandling.revurdering.RevurderingDao @@ -73,6 +74,8 @@ class BehandlingFactoryTest { private val behandlingDaoMock = mockk(relaxUnitFun = true) private val hendelseDaoMock = mockk(relaxUnitFun = true) private val behandlingHendelserKafkaProducerMock = mockk(relaxUnitFun = true) + private val kommerBarnetTilGodeServiceMock = mockk() + private val vilkaarsvurderingKlientMock = mockk() private val grunnlagsendringshendelseDao = mockk() private val grunnlagService = mockk(relaxUnitFun = true) private val oppgaveService = mockk() @@ -124,6 +127,8 @@ class BehandlingFactoryTest { hendelseDaoMock, behandlingHendelserKafkaProducerMock, mockk(), + vilkaarsvurderingKlient = vilkaarsvurderingKlientMock, + kommerBarnetTilGodeService = kommerBarnetTilGodeServiceMock, ) @BeforeEach @@ -142,6 +147,8 @@ class BehandlingFactoryTest { hendelseDaoMock, behandlingHendelserKafkaProducerMock, grunnlagService, + vilkaarsvurderingKlientMock, + kommerBarnetTilGodeServiceMock, ) clearAllMocks() } @@ -194,8 +201,8 @@ class BehandlingFactoryTest { every { behandlingDaoMock.opprettBehandling(capture(behandlingOpprettes)) } returns Unit every { behandlingDaoMock.hentBehandling(capture(behandlingHentes)) } returns opprettetBehandling every { hendelseDaoMock.behandlingOpprettet(any()) } returns Unit - every { behandlingDaoMock.lagreGyldighetsproving(any()) } returns Unit - every { behandlingDaoMock.alleBehandlingerISak(any()) } returns emptyList() + every { behandlingDaoMock.lagreGyldighetsproeving(any(), any()) } returns Unit + every { behandlingDaoMock.hentBehandlingerForSak(any()) } returns emptyList() every { behandlingDaoMock.lagreStatus(any(), any(), any()) } returns Unit every { behandlingHendelserKafkaProducerMock.sendMeldingForHendelseStatisitkk( @@ -232,7 +239,7 @@ class BehandlingFactoryTest { behandlingDaoMock.hentBehandling(any()) behandlingDaoMock.opprettBehandling(any()) hendelseDaoMock.behandlingOpprettet(any()) - behandlingDaoMock.alleBehandlingerISak(any()) + behandlingDaoMock.hentBehandlingerForSak(any()) behandlingHendelserKafkaProducerMock.sendMeldingForHendelseStatisitkk( any(), BehandlingHendelseType.OPPRETTET, @@ -289,7 +296,7 @@ class BehandlingFactoryTest { every { sakServiceMock.finnSak(any()) } returns opprettetBehandling.sak every { behandlingDaoMock.opprettBehandling(capture(behandlingOpprettes)) } returns Unit every { behandlingDaoMock.hentBehandling(capture(behandlingHentes)) } returns opprettetBehandling - every { behandlingDaoMock.alleBehandlingerISak(any()) } returns emptyList() + every { behandlingDaoMock.hentBehandlingerForSak(any()) } returns emptyList() every { hendelseDaoMock.behandlingOpprettet(any()) } returns Unit every { behandlingHendelserKafkaProducerMock.sendMeldingForHendelseStatisitkk( @@ -321,7 +328,7 @@ class BehandlingFactoryTest { behandlingDaoMock.hentBehandling(any()) behandlingDaoMock.opprettBehandling(any()) hendelseDaoMock.behandlingOpprettet(any()) - behandlingDaoMock.alleBehandlingerISak(any()) + behandlingDaoMock.hentBehandlingerForSak(any()) behandlingHendelserKafkaProducerMock.sendMeldingForHendelseStatisitkk(any(), any()) grunnlagService.leggInnNyttGrunnlag(any(), any()) oppgaveService.opprettFoerstegangsbehandlingsOppgaveForInnsendtSoeknad(any(), any()) @@ -376,7 +383,7 @@ class BehandlingFactoryTest { every { behandlingDaoMock.opprettBehandling(capture(behandlingOpprettes)) } returns Unit every { behandlingDaoMock.hentBehandling(capture(behandlingHentes)) } returns underArbeidBehandling every { - behandlingDaoMock.alleBehandlingerISak(any()) + behandlingDaoMock.hentBehandlingerForSak(any()) } returns emptyList() every { behandlingDaoMock.lagreStatus(any(), any(), any()) } returns Unit every { hendelseDaoMock.behandlingOpprettet(any()) } returns Unit @@ -409,7 +416,7 @@ class BehandlingFactoryTest { Assertions.assertTrue(foerstegangsbehandling is Foerstegangsbehandling) every { - behandlingDaoMock.alleBehandlingerISak(any()) + behandlingDaoMock.hentBehandlingerForSak(any()) } returns listOf(underArbeidBehandling) val nyfoerstegangsbehandling = @@ -429,7 +436,7 @@ class BehandlingFactoryTest { behandlingDaoMock.hentBehandling(any()) behandlingDaoMock.opprettBehandling(any()) hendelseDaoMock.behandlingOpprettet(any()) - behandlingDaoMock.alleBehandlingerISak(any()) + behandlingDaoMock.hentBehandlingerForSak(any()) behandlingHendelserKafkaProducerMock.sendMeldingForHendelseStatisitkk(any(), any()) grunnlagService.leggInnNyttGrunnlag(any(), any()) oppgaveService.opprettFoerstegangsbehandlingsOppgaveForInnsendtSoeknad(any(), any()) @@ -453,18 +460,19 @@ class BehandlingFactoryTest { id = iverksattBehandlingId, ) - every { behandlingDaoMock.alleBehandlingerISak(sakId) } returns listOf(iverksattBehandling) + every { behandlingDaoMock.hentBehandlingerForSak(sakId) } returns listOf(iverksattBehandling) every { sakServiceMock.finnSak(sakId) } returns iverksattBehandling.sak assertThrows { behandlingFactory.opprettOmgjoeringAvslag( sakId, saksbehandler, + false, ) } verify { sakServiceMock.finnSak(sakId) - behandlingDaoMock.alleBehandlingerISak(sakId) + behandlingDaoMock.hentBehandlingerForSak(sakId) } } @@ -474,15 +482,15 @@ class BehandlingFactoryTest { val saksbehandler = Saksbehandler("", "sakbehandler", null) every { sakServiceMock.finnSak(sak.id) } returns sak - every { behandlingDaoMock.alleBehandlingerISak(sak.id) } returns emptyList() + every { behandlingDaoMock.hentBehandlingerForSak(sak.id) } returns emptyList() assertThrows { - behandlingFactory.opprettOmgjoeringAvslag(sak.id, saksbehandler) + behandlingFactory.opprettOmgjoeringAvslag(sak.id, saksbehandler, false) } verify { sakServiceMock.finnSak(sak.id) - behandlingDaoMock.alleBehandlingerISak(sak.id) + behandlingDaoMock.hentBehandlingerForSak(sak.id) } } @@ -499,13 +507,82 @@ class BehandlingFactoryTest { ) every { sakServiceMock.finnSak(sak.id) } returns sak - every { behandlingDaoMock.alleBehandlingerISak(sak.id) } returns listOf(avslaattFoerstegangsbehandling, revurdering) + every { behandlingDaoMock.hentBehandlingerForSak(sak.id) } returns listOf(avslaattFoerstegangsbehandling, revurdering) - assertThrows { behandlingFactory.opprettOmgjoeringAvslag(sak.id, saksbehandler) } + assertThrows { behandlingFactory.opprettOmgjoeringAvslag(sak.id, saksbehandler, false) } verify { sakServiceMock.finnSak(sak.id) - behandlingDaoMock.alleBehandlingerISak(sak.id) + behandlingDaoMock.hentBehandlingerForSak(sak.id) + } + } + + @Test + fun `omgjøring skal lage ny førstegangsbehandling og kopiere vurdering hvis flagg er satt`() { + val sak = sak() + val saksbehandler = Saksbehandler("", "sakbehandler", null) + val avslaattFoerstegangsbehandling = foerstegangsbehandling(sak = sak, status = BehandlingStatus.AVSLAG) + val revurdering = + revurdering( + sak = sak, + revurderingAarsak = Revurderingaarsak.NY_SOEKNAD, + status = BehandlingStatus.AVBRUTT, + ) + + every { sakServiceMock.finnSak(sak.id) } returns sak + every { behandlingDaoMock.hentBehandlingerForSak(sak.id) } returns listOf(avslaattFoerstegangsbehandling, revurdering) + every { behandlingDaoMock.hentBehandling(avslaattFoerstegangsbehandling.id) } returns avslaattFoerstegangsbehandling + every { behandlingDaoMock.hentBehandling(any()) } returns foerstegangsbehandling(sak = sak) + every { behandlingDaoMock.lagreNyttVirkningstidspunkt(any(), any()) } returns 1 + every { kommerBarnetTilGodeServiceMock.lagreKommerBarnetTilgode(any()) } just Runs + coEvery { vilkaarsvurderingKlientMock.kopierVilkaarsvurdering(any(), any(), any()) } just Runs + + val opprettBehandlingSlot = slot() + every { behandlingDaoMock.opprettBehandling(capture(opprettBehandlingSlot)) } just runs + coEvery { grunnlagService.hentPersongalleri(avslaattFoerstegangsbehandling.id) } returns Persongalleri(sak.ident) + coEvery { grunnlagService.leggInnNyttGrunnlag(any(), any()) } just runs + every { oppgaveService.opprettFoerstegangsbehandlingsOppgaveForInnsendtSoeknad(any(), any(), any(), any()) } returns + OppgaveIntern( + id = UUID.randomUUID(), + status = Status.PAA_VENT, + enhet = Enheter.defaultEnhet.enhetNr, + sakId = sak.id, + kilde = OppgaveKilde.BEHANDLING, + type = OppgaveType.FOERSTEGANGSBEHANDLING, + saksbehandler = null, + forrigeSaksbehandlerIdent = null, + referanse = "", + merknad = null, + opprettet = Tidspunkt.now(), + sakType = SakType.OMSTILLINGSSTOENAD, + fnr = null, + frist = null, + ) + every { oppgaveService.tildelSaksbehandler(any(), saksbehandler.ident) } just runs + every { behandlingHendelserKafkaProducerMock.sendMeldingForHendelseStatisitkk(any(), any()) } just runs + + val opprettetBehandling = behandlingFactory.opprettOmgjoeringAvslag(sak.id, saksbehandler, true) + opprettetBehandling.sak.id shouldBe sak.id + opprettetBehandling.type shouldBe BehandlingType.FØRSTEGANGSBEHANDLING + opprettBehandlingSlot.captured.sakId shouldBe sak.id + opprettBehandlingSlot.captured.type shouldBe BehandlingType.FØRSTEGANGSBEHANDLING + + verify { + sakServiceMock.finnSak(sak.id) + behandlingDaoMock.hentBehandlingerForSak(sak.id) + behandlingDaoMock.lagreNyttVirkningstidspunkt(any(), any()) + behandlingDaoMock.hentBehandling(any()) + behandlingDaoMock.opprettBehandling(any()) + kommerBarnetTilGodeServiceMock.lagreKommerBarnetTilgode(any()) + oppgaveService.tildelSaksbehandler(any(), saksbehandler.ident) + oppgaveService.opprettFoerstegangsbehandlingsOppgaveForInnsendtSoeknad(any(), any(), any(), any()) + hendelseDaoMock.behandlingOpprettet(any()) + behandlingHendelserKafkaProducerMock.sendMeldingForHendelseStatisitkk(any(), any()) + } + coVerify { + vilkaarsvurderingKlientMock.kopierVilkaarsvurdering(any(), any(), any()) + grunnlagService.hentPersongalleri(avslaattFoerstegangsbehandling.id) + grunnlagService.leggInnNyttGrunnlag(any(), any()) } } @@ -522,7 +599,7 @@ class BehandlingFactoryTest { ) every { sakServiceMock.finnSak(sak.id) } returns sak - every { behandlingDaoMock.alleBehandlingerISak(sak.id) } returns listOf(avslaattFoerstegangsbehandling, revurdering) + every { behandlingDaoMock.hentBehandlingerForSak(sak.id) } returns listOf(avslaattFoerstegangsbehandling, revurdering) every { behandlingDaoMock.hentBehandling(avslaattFoerstegangsbehandling.id) } returns avslaattFoerstegangsbehandling every { behandlingDaoMock.hentBehandling(any()) } returns foerstegangsbehandling(sak = sak) @@ -550,7 +627,7 @@ class BehandlingFactoryTest { every { oppgaveService.tildelSaksbehandler(any(), saksbehandler.ident) } just runs every { behandlingHendelserKafkaProducerMock.sendMeldingForHendelseStatisitkk(any(), any()) } just runs - val opprettetBehandling = behandlingFactory.opprettOmgjoeringAvslag(sak.id, saksbehandler) + val opprettetBehandling = behandlingFactory.opprettOmgjoeringAvslag(sak.id, saksbehandler, false) opprettetBehandling.sak.id shouldBe sak.id opprettetBehandling.type shouldBe BehandlingType.FØRSTEGANGSBEHANDLING opprettBehandlingSlot.captured.sakId shouldBe sak.id @@ -558,7 +635,7 @@ class BehandlingFactoryTest { verify { sakServiceMock.finnSak(sak.id) - behandlingDaoMock.alleBehandlingerISak(sak.id) + behandlingDaoMock.hentBehandlingerForSak(sak.id) behandlingDaoMock.hentBehandling(any()) behandlingDaoMock.opprettBehandling(any()) oppgaveService.tildelSaksbehandler(any(), saksbehandler.ident) @@ -619,7 +696,7 @@ class BehandlingFactoryTest { every { behandlingDaoMock.opprettBehandling(capture(behandlingOpprettes)) } returns Unit every { behandlingDaoMock.hentBehandling(capture(behandlingHentes)) } returns nyBehandling every { - behandlingDaoMock.alleBehandlingerISak(any()) + behandlingDaoMock.hentBehandlingerForSak(any()) } returns emptyList() every { behandlingDaoMock.lagreStatus(any(), any(), any()) } returns Unit every { hendelseDaoMock.behandlingOpprettet(any()) } returns Unit @@ -690,7 +767,7 @@ class BehandlingFactoryTest { ) every { - behandlingDaoMock.alleBehandlingerISak(any()) + behandlingDaoMock.hentBehandlingerForSak(any()) } returns listOf(iverksattBehandling) every { aktivitetspliktDao.kopierAktiviteter(any(), any()) } returns 1 @@ -722,7 +799,7 @@ class BehandlingFactoryTest { behandlingDaoMock.hentBehandling(any()) behandlingDaoMock.opprettBehandling(any()) hendelseDaoMock.behandlingOpprettet(any()) - behandlingDaoMock.alleBehandlingerISak(any()) + behandlingDaoMock.hentBehandlingerForSak(any()) behandlingHendelserKafkaProducerMock.sendMeldingForHendelseStatisitkk(any(), any()) } } @@ -774,7 +851,7 @@ class BehandlingFactoryTest { every { behandlingDaoMock.opprettBehandling(capture(behandlingOpprettes)) } returns Unit every { behandlingDaoMock.hentBehandling(capture(behandlingHentes)) } returns nyBehandling every { - behandlingDaoMock.alleBehandlingerISak(any()) + behandlingDaoMock.hentBehandlingerForSak(any()) } returns emptyList() every { behandlingDaoMock.lagreStatus(any(), any(), any()) } returns Unit every { hendelseDaoMock.behandlingOpprettet(any()) } returns Unit @@ -845,7 +922,7 @@ class BehandlingFactoryTest { ) every { - behandlingDaoMock.alleBehandlingerISak(any()) + behandlingDaoMock.hentBehandlingerForSak(any()) } returns listOf(iverksattBehandling) every { aktivitetspliktDao.kopierAktiviteter(any(), any()) } returns 1 every { aktivitetspliktKopierService.kopierVurdering(any(), any()) } returns Unit @@ -878,7 +955,7 @@ class BehandlingFactoryTest { behandlingDaoMock.hentBehandling(any()) behandlingDaoMock.opprettBehandling(any()) hendelseDaoMock.behandlingOpprettet(any()) - behandlingDaoMock.alleBehandlingerISak(any()) + behandlingDaoMock.hentBehandlingerForSak(any()) behandlingHendelserKafkaProducerMock.sendMeldingForHendelseStatisitkk(any(), any()) } } @@ -926,7 +1003,7 @@ class BehandlingFactoryTest { every { sakServiceMock.finnSak(any()) } returns sak every { behandlingDaoMock.opprettBehandling(capture(behandlingOpprettes)) } just Runs every { behandlingDaoMock.hentBehandling(capture(behandlingHentes)) } returns opprettetBehandling - every { behandlingDaoMock.alleBehandlingerISak(any()) } returns emptyList() + every { behandlingDaoMock.hentBehandlingerForSak(any()) } returns emptyList() every { oppgaveService.opprettFoerstegangsbehandlingsOppgaveForInnsendtSoeknad(any(), any()) } returns mockOppgave @@ -962,7 +1039,7 @@ class BehandlingFactoryTest { behandlingDaoMock.opprettBehandling(any()) hendelseDaoMock.behandlingOpprettet(any()) behandlingDaoMock.hentBehandling(any()) - behandlingDaoMock.alleBehandlingerISak(any()) + behandlingDaoMock.hentBehandlingerForSak(any()) behandlingHendelserKafkaProducerMock.sendMeldingForHendelseStatisitkk( any(), BehandlingHendelseType.OPPRETTET, diff --git a/apps/etterlatte-behandling/src/test/kotlin/behandling/BehandlingServiceImplTest.kt b/apps/etterlatte-behandling/src/test/kotlin/behandling/BehandlingServiceImplTest.kt index c2d2fdbe86d..4221fa24289 100644 --- a/apps/etterlatte-behandling/src/test/kotlin/behandling/BehandlingServiceImplTest.kt +++ b/apps/etterlatte-behandling/src/test/kotlin/behandling/BehandlingServiceImplTest.kt @@ -97,7 +97,7 @@ internal class BehandlingServiceImplTest { fun `Kan hente egne ansatte behandlínger som egen ansatt saksbehandler`() { nyKontekstMedBruker(mockSaksbehandler(harRolleEgenAnsatt = true)) - every { behandlingDaoMock.alleBehandlingerISak(1) } returns + every { behandlingDaoMock.hentBehandlingerForSak(1) } returns listOf( revurdering( sakId = 1, @@ -121,7 +121,7 @@ internal class BehandlingServiceImplTest { fun `Kan hente strengt fortrolig behandlínger som streng fortrolig saksbehandler`() { nyKontekstMedBruker(mockSaksbehandler("ident", harRolleStrengtFortrolig = true)) - every { behandlingDaoMock.alleBehandlingerISak(1) } returns + every { behandlingDaoMock.hentBehandlingerForSak(1) } returns listOf( revurdering( sakId = 1, @@ -145,7 +145,7 @@ internal class BehandlingServiceImplTest { fun `Kan ikke hente strengt fortrolig behandlínger som vanlig saksbehandler`() { nyKontekstMedBruker(mockSaksbehandler()) - every { behandlingDaoMock.alleBehandlingerISak(1) } returns + every { behandlingDaoMock.hentBehandlingerForSak(1) } returns listOf( revurdering( sakId = 1, @@ -169,7 +169,7 @@ internal class BehandlingServiceImplTest { fun `Kan ikke hente egne ansatte behandlínger som vanlig saksbehandler`() { nyKontekstMedBruker(mockSaksbehandler()) - every { behandlingDaoMock.alleBehandlingerISak(1) } returns + every { behandlingDaoMock.hentBehandlingerForSak(1) } returns listOf( revurdering( sakId = 1, @@ -193,7 +193,7 @@ internal class BehandlingServiceImplTest { fun `skal hente behandlinger i sak`() { nyKontekstMedBruker(mockSaksbehandler()) - every { behandlingDaoMock.alleBehandlingerISak(1) } returns + every { behandlingDaoMock.hentBehandlingerForSak(1) } returns listOf( revurdering(sakId = 1, revurderingAarsak = Revurderingaarsak.REGULERING), foerstegangsbehandling(sakId = 1), @@ -626,7 +626,7 @@ internal class BehandlingServiceImplTest { revurderingAarsak = Revurderingaarsak.REGULERING, ) - every { behandlingDaoMock.alleBehandlingerISak(any()) } returns listOf(behandling1, behandling2) + every { behandlingDaoMock.hentBehandlingerForSak(any()) } returns listOf(behandling1, behandling2) assertEquals(behandling1, behandlingService.hentSisteIverksatte(1)) } @@ -634,7 +634,7 @@ internal class BehandlingServiceImplTest { @Test fun `skal hente behandlinger i sak hvor sak har enhet og brukeren har enhet`() { nyKontekstMedBruker(mockSaksbehandler(enheter = listOf(Enheter.PORSGRUNN.enhetNr))) - every { behandlingDaoMock.alleBehandlingerISak(1) } returns + every { behandlingDaoMock.hentBehandlingerForSak(1) } returns listOf( revurdering( sakId = 1, @@ -695,12 +695,12 @@ internal class BehandlingServiceImplTest { val sak1 = Sak("fnr", SakType.BARNEPENSJON, id = Random.nextLong(), "4808") val sak2 = Sak("fnr", SakType.OMSTILLINGSSTOENAD, id = Random.nextLong(), "4808") - every { behandlingDaoMock.alleBehandlingerISak(sak1.id) } returns + every { behandlingDaoMock.hentBehandlingerForSak(sak1.id) } returns listOf( foerstegangsbehandling(sakId = sak1.id, status = BehandlingStatus.AVBRUTT), foerstegangsbehandling(sakId = sak1.id, status = BehandlingStatus.AVBRUTT), ) - every { behandlingDaoMock.alleBehandlingerISak(sak2.id) } returns + every { behandlingDaoMock.hentBehandlingerForSak(sak2.id) } returns listOf( foerstegangsbehandling(sakId = sak2.id, status = BehandlingStatus.IVERKSATT), ) @@ -711,8 +711,8 @@ internal class BehandlingServiceImplTest { assertEquals(1, sakMedBehandlinger.behandlinger.size) verify(exactly = 1) { - behandlingDaoMock.alleBehandlingerISak(sak1.id) - behandlingDaoMock.alleBehandlingerISak(sak2.id) + behandlingDaoMock.hentBehandlingerForSak(sak1.id) + behandlingDaoMock.hentBehandlingerForSak(sak2.id) } } @@ -722,7 +722,7 @@ internal class BehandlingServiceImplTest { val sak = Sak("fnr", SakType.OMSTILLINGSSTOENAD, id = Random.nextLong(), "4808") - every { behandlingDaoMock.alleBehandlingerISak(sak.id) } returns + every { behandlingDaoMock.hentBehandlingerForSak(sak.id) } returns listOf( foerstegangsbehandling( sakId = sak.id, @@ -735,7 +735,7 @@ internal class BehandlingServiceImplTest { assertEquals(sak.id, sakMedBehandlinger.sak.id) assertEquals(1, sakMedBehandlinger.behandlinger.size) - verify(exactly = 1) { behandlingDaoMock.alleBehandlingerISak(sak.id) } + verify(exactly = 1) { behandlingDaoMock.hentBehandlingerForSak(sak.id) } } @Test @@ -825,7 +825,7 @@ internal class BehandlingServiceImplTest { coEvery { grunnlagKlientMock.hentPersongalleri(behandling.id, any()) } answers { callOriginal() } every { behandlingDaoMock.hentBehandling(BEHANDLINGS_ID) } returns behandling - every { behandlingDaoMock.alleBehandlingerISak(any()) } returns tidligereBehandlinger + every { behandlingDaoMock.hentBehandlingerForSak(any()) } returns tidligereBehandlinger } private fun mockPersongalleri() = diff --git a/apps/etterlatte-behandling/src/test/kotlin/behandling/GyldighetsproevingServiceImplTest.kt b/apps/etterlatte-behandling/src/test/kotlin/behandling/GyldighetsproevingServiceImplTest.kt index f11d5569de1..59c835f184a 100644 --- a/apps/etterlatte-behandling/src/test/kotlin/behandling/GyldighetsproevingServiceImplTest.kt +++ b/apps/etterlatte-behandling/src/test/kotlin/behandling/GyldighetsproevingServiceImplTest.kt @@ -131,7 +131,8 @@ internal class GyldighetsproevingServiceImplTest { ) every { behandlingDaoMock.hentBehandling(any()) } returns behandling - every { behandlingDaoMock.lagreGyldighetsproving(any()) } just Runs + every { behandlingDaoMock.lagreGyldighetsproeving(any(), any()) } just Runs + every { behandlingDaoMock.lagreStatus(any()) } just Runs every { user.enheter() @@ -169,7 +170,8 @@ internal class GyldighetsproevingServiceImplTest { verify(exactly = 1) { behandlingDaoMock.hentBehandling(id) - behandlingDaoMock.lagreGyldighetsproving(any()) + behandlingDaoMock.lagreStatus(any()) + behandlingDaoMock.lagreGyldighetsproeving(any(), any()) } } diff --git a/apps/etterlatte-behandling/src/test/kotlin/behandling/revurdering/RevurderingServiceIntegrationTest.kt b/apps/etterlatte-behandling/src/test/kotlin/behandling/revurdering/RevurderingServiceIntegrationTest.kt index 5ad48c975d0..e136a0b4f3e 100644 --- a/apps/etterlatte-behandling/src/test/kotlin/behandling/revurdering/RevurderingServiceIntegrationTest.kt +++ b/apps/etterlatte-behandling/src/test/kotlin/behandling/revurdering/RevurderingServiceIntegrationTest.kt @@ -302,6 +302,8 @@ class RevurderingServiceIntegrationTest : BehandlingIntegrationTest() { hendelseDao = applicationContext.hendelseDao, behandlingHendelser = hendelser, migreringKlient = mockk(), + vilkaarsvurderingKlient = applicationContext.vilkaarsvuderingKlient, + kommerBarnetTilGodeService = applicationContext.kommerBarnetTilGodeService, ) val (sak, behandling) = opprettSakMedFoerstegangsbehandling(fnr, behandlingFactory) @@ -1013,5 +1015,7 @@ class RevurderingServiceIntegrationTest : BehandlingIntegrationTest() { hendelseDao = applicationContext.hendelseDao, behandlingHendelser = applicationContext.behandlingsHendelser, migreringKlient = mockk(), + vilkaarsvurderingKlient = applicationContext.vilkaarsvuderingKlient, + kommerBarnetTilGodeService = applicationContext.kommerBarnetTilGodeService, ) } diff --git a/apps/etterlatte-behandling/src/test/kotlin/integration/BehandlingIntegrationTest.kt b/apps/etterlatte-behandling/src/test/kotlin/integration/BehandlingIntegrationTest.kt index b8240db9437..26905b35c13 100644 --- a/apps/etterlatte-behandling/src/test/kotlin/integration/BehandlingIntegrationTest.kt +++ b/apps/etterlatte-behandling/src/test/kotlin/integration/BehandlingIntegrationTest.kt @@ -108,6 +108,7 @@ abstract class BehandlingIntegrationTest { krrKlient = KrrklientTest(), axsysKlient = AxsysKlientTest(), pdlTjenesterKlient = pdlTjenesterKlient ?: PdltjenesterKlientTest(), + vilkaarsvuderingKlient = VilkaarsvurderingTest(), ) } diff --git a/apps/etterlatte-behandling/src/test/kotlin/integration/EksterneKlienter.kt b/apps/etterlatte-behandling/src/test/kotlin/integration/EksterneKlienter.kt index b52cfdee935..cf677c37050 100644 --- a/apps/etterlatte-behandling/src/test/kotlin/integration/EksterneKlienter.kt +++ b/apps/etterlatte-behandling/src/test/kotlin/integration/EksterneKlienter.kt @@ -17,6 +17,7 @@ import no.nav.etterlatte.behandling.klienter.OpprettetBrevDto import no.nav.etterlatte.behandling.klienter.SaksbehandlerInfo import no.nav.etterlatte.behandling.klienter.TilbakekrevingKlient import no.nav.etterlatte.behandling.klienter.VedtakKlient +import no.nav.etterlatte.behandling.klienter.VilkaarsvurderingKlient import no.nav.etterlatte.common.Enheter import no.nav.etterlatte.common.klienter.PdlTjenesterKlient import no.nav.etterlatte.common.klienter.PesysKlient @@ -194,7 +195,7 @@ class TilbakekrevingKlientTest : TilbakekrevingKlient { override val endpoint: String get() = "endpoint" - override suspend fun ping(konsument: String?): PingResult = PingResultUp(serviceName, ServiceStatus.UP, "endpoint", serviceName) + override suspend fun ping(konsument: String?): PingResult = PingResultUp(serviceName, ServiceStatus.UP, endpoint, serviceName) } class BrevApiKlientTest : BrevApiKlient { @@ -365,7 +366,7 @@ class NavAnsattKlientTest : NavAnsattKlient { override val endpoint: String get() = "endpoint" - override suspend fun ping(konsument: String?): PingResult = PingResultUp(serviceName, ServiceStatus.UP, "endpoint", serviceName) + override suspend fun ping(konsument: String?): PingResult = PingResultUp(serviceName, ServiceStatus.UP, endpoint, serviceName) } class PesysKlientTest : PesysKlient { @@ -378,7 +379,7 @@ class PesysKlientTest : PesysKlient { } class KrrklientTest : KrrKlient { - override suspend fun hentDigitalKontaktinformasjon(fnr: String): DigitalKontaktinformasjon? = + override suspend fun hentDigitalKontaktinformasjon(fnr: String): DigitalKontaktinformasjon = DigitalKontaktinformasjon( personident = "", aktiv = true, @@ -405,7 +406,26 @@ class AxsysKlientTest : AxsysKlient { override val endpoint: String get() = "endpoint" - override suspend fun ping(konsument: String?): PingResult = PingResultUp(serviceName, ServiceStatus.UP, "endpoint", serviceName) + override suspend fun ping(konsument: String?): PingResult = PingResultUp(serviceName, ServiceStatus.UP, endpoint, serviceName) +} + +class VilkaarsvurderingTest : VilkaarsvurderingKlient { + override suspend fun kopierVilkaarsvurdering( + kopierTilBehandling: UUID, + kopierFraBehandling: UUID, + brukerTokenInfo: BrukerTokenInfo, + ) { + // NO-OP + } + + override val serviceName: String + get() = "Vilkårsvurderinglient" + override val beskrivelse: String + get() = "Snakker med vilkårsvurdering" + override val endpoint: String + get() = "vilkårsvurdering" + + override suspend fun ping(konsument: String?): PingResult = PingResultUp(serviceName, ServiceStatus.UP, endpoint, serviceName) } class PdltjenesterKlientTest : PdlTjenesterKlient { @@ -439,5 +459,5 @@ class PdltjenesterKlientTest : PdlTjenesterKlient { override val endpoint: String get() = "endpoint" - override suspend fun ping(konsument: String?): PingResult = PingResultUp(serviceName, ServiceStatus.UP, "endpoint", serviceName) + override suspend fun ping(konsument: String?): PingResult = PingResultUp(serviceName, ServiceStatus.UP, endpoint, serviceName) } diff --git a/apps/etterlatte-behandling/src/test/kotlin/integration/HttpKlienter.kt b/apps/etterlatte-behandling/src/test/kotlin/integration/HttpKlienter.kt index f3902099505..1aba357d13d 100644 --- a/apps/etterlatte-behandling/src/test/kotlin/integration/HttpKlienter.kt +++ b/apps/etterlatte-behandling/src/test/kotlin/integration/HttpKlienter.kt @@ -121,21 +121,6 @@ fun klageHttpClientTest() = } } -fun tilbakekrevingHttpClientTest() = - HttpClient(MockEngine) { - engine { - addHandler { - respondOk() - } - } - install(ContentNegotiation) { - register( - ContentType.Application.Json, - JacksonConverter(objectMapper), - ) - } - } - fun migreringHttpClientTest() = HttpClient(MockEngine) { engine { diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/person/sakOgBehandling/OmgjoerAvslagModal.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/person/sakOgBehandling/OmgjoerAvslagModal.tsx index b53f77e1460..454f5a79790 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/person/sakOgBehandling/OmgjoerAvslagModal.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/person/sakOgBehandling/OmgjoerAvslagModal.tsx @@ -1,4 +1,4 @@ -import { Alert, BodyShort, Button, Heading, Modal } from '@navikt/ds-react' +import { Alert, BodyShort, Button, Checkbox, Heading, Modal } from '@navikt/ds-react' import React, { useState } from 'react' import { useApiCall } from '~shared/hooks/useApiCall' import { opprettOmgjoeringFoerstegangsbehandling } from '~shared/api/revurdering' @@ -9,10 +9,11 @@ import { useNavigate } from 'react-router-dom' export function OmgjoerAvslagModal(props: { sakId: number; harAapenBehandling: boolean }) { const { sakId, harAapenBehandling } = props const [open, setOpen] = useState(false) + const [skalKopiere, setSkalkopiereGrunnlag] = useState(false) const [opprettOmgjoeringStatus, opprettOmgjoering] = useApiCall(opprettOmgjoeringFoerstegangsbehandling) const navigate = useNavigate() function opprett() { - opprettOmgjoering({ sakId }) + opprettOmgjoering({ sakId, skalKopiere }) } function lukkModal() { @@ -35,6 +36,9 @@ export function OmgjoerAvslagModal(props: { sakId: number; harAapenBehandling: b Hvis det kun er avslåtte / avbrutte førstegangsbehandlinger i saken må en eventuell omgjøring gjøres som en ny førstegangsbehandling. + setSkalkopiereGrunnlag(!skalKopiere)}> + Kopier vurdering og vilkårsvurdering fra forrige avslag + {harAapenBehandling && ( Saken har allerede en åpen behandling. Denne må avsluttes eller avbrytes før en omgjøring kan startes. diff --git a/apps/etterlatte-saksbehandling-ui/client/src/shared/api/revurdering.ts b/apps/etterlatte-saksbehandling-ui/client/src/shared/api/revurdering.ts index c0645e2e18e..2a7393f0b49 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/shared/api/revurdering.ts +++ b/apps/etterlatte-saksbehandling-ui/client/src/shared/api/revurdering.ts @@ -70,6 +70,8 @@ export const opprettOmgjoeringKlage = async (args: { export const opprettOmgjoeringFoerstegangsbehandling = async (args: { sakId: number + skalKopiere: boolean }): Promise> => { - return apiClient.post(`/behandling/omgjoer-avslag-avbrudd/${args.sakId}`, {}) + const skalKopiere = args.skalKopiere + return apiClient.post(`/behandling/omgjoer-avslag-avbrudd/${args.sakId}`, { skalKopiere }) } diff --git a/apps/etterlatte-vilkaarsvurdering/.nais/dev.yaml b/apps/etterlatte-vilkaarsvurdering/.nais/dev.yaml index b6bb3ca0061..d8f6bf2c4ea 100644 --- a/apps/etterlatte-vilkaarsvurdering/.nais/dev.yaml +++ b/apps/etterlatte-vilkaarsvurdering/.nais/dev.yaml @@ -87,6 +87,7 @@ spec: - application: etterlatte-saksbehandling-ui-lokal # for å åpne for lokal utv. Ikke kopier denne til prod.yaml - application: etterlatte-saksbehandling-ui - application: etterlatte-beregning + - application: etterlatte-behandling - application: etterlatte-brev-api - application: etterlatte-vedtaksvurdering - application: etterlatte-vilkaarsvurdering-kafka diff --git a/apps/etterlatte-vilkaarsvurdering/.nais/prod.yaml b/apps/etterlatte-vilkaarsvurdering/.nais/prod.yaml index 47a0ee7e4c7..7a03e1fde97 100644 --- a/apps/etterlatte-vilkaarsvurdering/.nais/prod.yaml +++ b/apps/etterlatte-vilkaarsvurdering/.nais/prod.yaml @@ -96,6 +96,7 @@ spec: rules: - application: etterlatte-saksbehandling-ui - application: etterlatte-beregning + - application: etterlatte-behandling - application: etterlatte-brev-api - application: etterlatte-vedtaksvurdering - application: etterlatte-vilkaarsvurdering-kafka