Skip to content

Commit

Permalink
EY-4170 Kopiere vurdering og vilkårsvurdering hvis omgjøring har avsl… (
Browse files Browse the repository at this point in the history
#5316)

* 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
  • Loading branch information
sebassonav authored Jul 5, 2024
1 parent 2d9d0f4 commit c6b05c2
Show file tree
Hide file tree
Showing 25 changed files with 397 additions and 147 deletions.
1 change: 1 addition & 0 deletions .github/workflows/app-etterlatte-behandling.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
5 changes: 5 additions & 0 deletions apps/etterlatte-behandling/.nais/dev.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
5 changes: 5 additions & 0 deletions apps/etterlatte-behandling/.nais/prod.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -173,6 +177,7 @@ spec:
accessPolicy:
outbound:
rules:
- application: etterlatte-vilkaarsvurdering
- application: etterlatte-brev-api
- application: etterlatte-pdltjenester
- application: etterlatte-grunnlag
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@
<env name="PDL_AZURE_SCOPE" value="api://dev-gcp.etterlatte.etterlatte-pdltjenester/.default" />
<env name="PDLTJENESTER_AZURE_SCOPE" value="api://dev-gcp.etterlatte.etterlatte-pdltjenester/.default" />
<env name="SKJERMING_URL" value="https://skjermede-personer-pip.intern.dev.nav.no" />
<env name="ETTERLATTE_VILKAARSVURDERING_CLIENT_ID" value="dev-gcp.etterlatte.etterlatte-vilkaarsvurdering" />
<env name="ETTERLATTE_VILKAARSVURDERING_URL" value="https://etterlatte-vilkaarsvurdering.intern.dev.nav.no" />
<env name="PEN_CLIENT_ID" value="ddd52335-cfe8-4ee9-9e68-416a5ab26efa" />
<env name="PEN_URL" value="https://pensjon-pen-q2.dev-fss-pub.nais.io/pen/springapi" />
<env name="KRR_ENDPOINT_URL" value="http://digdir-krr-proxy.team-rocket" />
Expand Down
1 change: 1 addition & 0 deletions apps/etterlatte-behandling/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -69,7 +70,7 @@ class BehandlingDao(
}
}

fun alleBehandlingerISak(sakid: Long): List<Behandling> =
fun hentBehandlingerForSak(sakid: Long): List<Behandling> =
connectionAutoclosing.hentConnection {
with(it) {
val stmt =
Expand Down Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)

Expand Down Expand Up @@ -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,
Expand All @@ -303,13 +362,13 @@ class BehandlingFactory(
) = sakService.finnGjeldendeEnhet(persongalleri.soeker, sakType)

private fun opprettFoerstegangsbehandling(
harBehandlingUnderbehandling: List<Behandling>,
behandlingerUnderBehandling: List<Behandling>,
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())
}
Expand All @@ -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?,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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<OmgjoeringRequest>()
val behandlingOgOppgave = behandlingFactory.opprettOmgjoeringAvslag(sakId, saksbehandler, skalKopiereRequest.skalKopiere)
call.respond(behandlingOgOppgave.toBehandlingSammendrag())
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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}")
}
}
Expand Down
Loading

0 comments on commit c6b05c2

Please sign in to comment.