Skip to content

Commit

Permalink
NAV-23391: Setter riktig kategori og underkategori på behandlingstema…
Browse files Browse the repository at this point in the history
… for fagsak
  • Loading branch information
thoalm committed Dec 1, 2024
1 parent 0ccfd3c commit 8f32de9
Show file tree
Hide file tree
Showing 12 changed files with 1,648 additions and 478 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -93,8 +93,7 @@ class BehandlingController(
@PutMapping(path = ["/{behandlingId}/behandlingstema"], produces = [MediaType.APPLICATION_JSON_VALUE])
fun endreBehandlingstema(
@PathVariable behandlingId: Long,
@RequestBody
endreBehandling: RestEndreBehandlingstema,
@RequestBody endreBehandlingstema: RestEndreBehandlingstema,
): ResponseEntity<Ressurs<RestUtvidetBehandling>> {
tilgangService.validerTilgangTilBehandling(behandlingId = behandlingId, event = AuditLoggerEvent.UPDATE)
tilgangService.verifiserHarTilgangTilHandling(
Expand All @@ -104,11 +103,10 @@ class BehandlingController(
tilgangService.validerKanRedigereBehandling(behandlingId)

val behandling =
behandlingstemaService.oppdaterBehandlingstema(
behandlingstemaService.oppdaterSaksbehandletBehandlingstema(
behandling = behandlingHentOgPersisterService.hent(behandlingId),
overstyrtUnderkategori = endreBehandling.behandlingUnderkategori,
overstyrtKategori = endreBehandling.behandlingKategori,
manueltOppdatert = true,
nyUnderkategori = endreBehandlingstema.behandlingUnderkategori,
nyKategori = endreBehandlingstema.behandlingKategori,
)

return ResponseEntity.ok(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
package no.nav.familie.ba.sak.kjerne.behandling.behandlingstema

import jakarta.transaction.Transactional
import no.nav.familie.ba.sak.common.FunksjonellFeil
import no.nav.familie.ba.sak.integrasjoner.oppgave.OppgaveService
import no.nav.familie.ba.sak.kjerne.behandling.BehandlingHentOgPersisterService
import no.nav.familie.ba.sak.kjerne.behandling.domene.Behandling
import no.nav.familie.ba.sak.kjerne.behandling.domene.BehandlingKategori
import no.nav.familie.ba.sak.kjerne.behandling.domene.BehandlingUnderkategori
import no.nav.familie.ba.sak.kjerne.beregning.domene.AndelTilkjentYtelse
import no.nav.familie.ba.sak.kjerne.beregning.domene.AndelTilkjentYtelseRepository
import no.nav.familie.ba.sak.kjerne.eøs.felles.BehandlingId
import no.nav.familie.ba.sak.kjerne.eøs.vilkårsvurdering.VilkårsvurderingTidslinjeService
import no.nav.familie.ba.sak.kjerne.logg.LoggService
import no.nav.familie.ba.sak.kjerne.tidslinje.komposisjon.innholdForTidspunkt
import no.nav.familie.ba.sak.kjerne.tidslinje.tidspunkt.MånedTidspunkt
import no.nav.familie.ba.sak.kjerne.vilkårsvurdering.domene.Regelverk
import no.nav.familie.ba.sak.kjerne.vilkårsvurdering.domene.Vilkår
import no.nav.familie.ba.sak.kjerne.vilkårsvurdering.domene.VilkårsvurderingRepository
Expand All @@ -27,94 +27,80 @@ class BehandlingstemaService(
private val vilkårsvurderingRepository: VilkårsvurderingRepository,
) {
@Transactional
fun oppdaterBehandlingstema(
fun oppdaterBehandlingstemaForRegistrerSøknad(
behandling: Behandling,
nyUnderkategori: BehandlingUnderkategori,
): Behandling = oppdaterBehandlingstemaPåBehandlingHvisNødvendig(behandling, behandling.kategori, nyUnderkategori)

@Transactional
fun oppdaterSaksbehandletBehandlingstema(
behandling: Behandling,
nyKategori: BehandlingKategori,
nyUnderkategori: BehandlingUnderkategori,
): Behandling {
val forrigeKategori = behandling.kategori
val forrigeUnderkategori = behandling.underkategori
val oppdatertBehanding = oppdaterBehandlingstemaPåBehandlingHvisNødvendig(behandling, nyKategori, nyUnderkategori)
loggService.opprettEndretBehandlingstema(
behandling = oppdatertBehanding,
forrigeKategori = forrigeKategori,
forrigeUnderkategori = forrigeUnderkategori,
nyKategori = nyKategori,
nyUnderkategori = nyUnderkategori,
)
return oppdatertBehanding
}

@Transactional
fun oppdaterBehandlingstemaForVilkår(
behandling: Behandling,
overstyrtKategori: BehandlingKategori? = null,
overstyrtUnderkategori: BehandlingUnderkategori? = null,
manueltOppdatert: Boolean = false,
): Behandling {
if (behandling.skalBehandlesAutomatisk) return behandling
if (manueltOppdatert && (overstyrtKategori == null || overstyrtUnderkategori == null)) {
throw FunksjonellFeil("Du må velge behandlingstema.")
if (behandling.skalBehandlesAutomatisk) {
return behandling
}
val nyKategori = hentKategoriFraInneværendeBehandling(behandling.fagsak.id)
val nyUnderkategori = overstyrtUnderkategori ?: hentUnderkategoriFraInneværendeBehandling(fagsakId = behandling.fagsak.id)
return oppdaterBehandlingstemaPåBehandlingHvisNødvendig(behandling, nyKategori, nyUnderkategori)
}

val utledetKategori =
bestemKategori(
overstyrtKategori = overstyrtKategori,
kategoriFraSisteIverksattBehandling = hentLøpendeKategori(behandling.fagsak.id),
kategoriFraInneværendeBehandling = hentKategoriFraInneværendeBehandling(behandling.fagsak.id),
)
fun hentLøpendeKategori(fagsakId: Long): BehandlingKategori {
val forrigeVedtatteBehandling = behandlingHentOgPersisterService.hentSisteBehandlingSomErVedtatt(fagsakId = fagsakId)
if (forrigeVedtatteBehandling == null) {
return BehandlingKategori.NASJONAL
}

val utledetUnderkategori =
bestemUnderkategori(
overstyrtUnderkategori = overstyrtUnderkategori,
underkategoriFraLøpendeBehandling = hentLøpendeUnderkategori(fagsakId = behandling.fagsak.id),
underkategoriFraInneværendeBehandling = hentUnderkategoriFraInneværendeBehandling(fagsakId = behandling.fagsak.id),
)
val tidslinjer = vilkårsvurderingTidslinjeService.hentTidslinjer(behandlingId = BehandlingId(forrigeVedtatteBehandling.id))
if (tidslinjer == null) {
// TODO : Burde dette være forrigeVedtatteBehandling.kategori ? Eller har det kanskje ikke så mye å si ?
return BehandlingKategori.NASJONAL
}

val forrigeUnderkategori = behandling.underkategori
val forrigeKategori = behandling.kategori
val skalOppdatereKategori = utledetKategori != forrigeKategori
val skalOppdatereUnderkategori = utledetUnderkategori != forrigeUnderkategori
val skalOppdatereKategoriEllerUnderkategori = skalOppdatereKategori || skalOppdatereUnderkategori

return if (skalOppdatereKategoriEllerUnderkategori) {
behandling.apply {
kategori = utledetKategori
underkategori = utledetUnderkategori
}
val etBarnHarMinstEnLøpendeEØSPeriode =
tidslinjer
.barnasTidslinjer()
.values
.map { it.egetRegelverkResultatTidslinje.innholdForTidspunkt(MånedTidspunkt.nå()) }
.any { it.innhold?.regelverk == Regelverk.EØS_FORORDNINGEN }

behandlingHentOgPersisterService.lagreEllerOppdater(behandling).also { lagretBehandling ->
oppgaveService.patchOppgaverForBehandling(lagretBehandling) {
val lagretUnderkategori = lagretBehandling.underkategori
if (it.behandlingstema != lagretBehandling.tilOppgaveBehandlingTema().value || it.behandlingstype != lagretBehandling.kategori.tilOppgavebehandlingType().value) {
it.copy(
behandlingstema =
when (lagretUnderkategori) {
BehandlingUnderkategori.ORDINÆR, BehandlingUnderkategori.UTVIDET ->
behandling.tilOppgaveBehandlingTema().value
},
behandlingstype = lagretBehandling.kategori.tilOppgavebehandlingType().value,
)
} else {
null
}
}

if (manueltOppdatert) {
loggService.opprettEndretBehandlingstema(
behandling = lagretBehandling,
forrigeKategori = forrigeKategori,
forrigeUnderkategori = forrigeUnderkategori,
nyKategori = utledetKategori,
nyUnderkategori = utledetUnderkategori,
)
}
}
return if (etBarnHarMinstEnLøpendeEØSPeriode) {
BehandlingKategori.EØS
} else {
behandling
BehandlingKategori.NASJONAL
}
}

fun hentLøpendeKategori(fagsakId: Long): BehandlingKategori {
val forrigeVedtatteBehandling =
behandlingHentOgPersisterService.hentSisteBehandlingSomErVedtatt(fagsakId = fagsakId)
?: return BehandlingKategori.NASJONAL

val barnasTidslinjer =
vilkårsvurderingTidslinjeService
.hentTidslinjer(behandlingId = BehandlingId(forrigeVedtatteBehandling.id))
?.barnasTidslinjer()
return utledLøpendeKategori(barnasTidslinjer)
}

fun hentKategoriFraInneværendeBehandling(fagsakId: Long): BehandlingKategori {
val aktivBehandling =
behandlingHentOgPersisterService.finnAktivOgÅpenForFagsak(fagsakId = fagsakId)
?: return BehandlingKategori.NASJONAL
val vilkårsvurdering =
vilkårsvurderingRepository.findByBehandlingAndAktiv(behandlingId = aktivBehandling.id)
?: return aktivBehandling.kategori
val aktivBehandling = behandlingHentOgPersisterService.finnAktivOgÅpenForFagsak(fagsakId = fagsakId)
if (aktivBehandling == null) {
return BehandlingKategori.NASJONAL
}

val vilkårsvurdering = vilkårsvurderingRepository.findByBehandlingAndAktiv(behandlingId = aktivBehandling.id)
if (vilkårsvurdering == null) {
return aktivBehandling.kategori
}

val erVilkårMedEØSRegelverkBehandlet =
vilkårsvurdering.personResultater
.flatMap { it.vilkårResultater }
Expand All @@ -128,34 +114,77 @@ class BehandlingstemaService(
}
}

// TODO : Blir denne kalt flere plasser enn nødvendig? Se kallet fra VilkårsvurderingForNyBehandlingService klassen
fun hentLøpendeUnderkategori(fagsakId: Long): BehandlingUnderkategori? {
val forrigeAndeler = hentForrigeAndeler(fagsakId)
return if (forrigeAndeler != null) utledLøpendeUnderkategori(forrigeAndeler) else null
val forrigeVedtatteBehandling = behandlingHentOgPersisterService.hentSisteBehandlingSomErVedtatt(fagsakId = fagsakId)
if (forrigeVedtatteBehandling == null) {
return null
}
val forrigeAndeler = andelTilkjentYtelseRepository.finnAndelerTilkjentYtelseForBehandling(behandlingId = forrigeVedtatteBehandling.id)
return if (forrigeAndeler.any { it.erUtvidet() && it.erLøpende() }) {
BehandlingUnderkategori.UTVIDET
} else {
BehandlingUnderkategori.ORDINÆR
}
}

fun hentUnderkategoriFraInneværendeBehandling(fagsakId: Long): BehandlingUnderkategori {
val aktivBehandling =
behandlingHentOgPersisterService.finnAktivOgÅpenForFagsak(fagsakId = fagsakId)
?: return BehandlingUnderkategori.ORDINÆR
val aktivBehandling = behandlingHentOgPersisterService.finnAktivOgÅpenForFagsak(fagsakId = fagsakId)
if (aktivBehandling == null) {
return BehandlingUnderkategori.ORDINÆR
}

val vilkårsvurdering = vilkårsvurderingRepository.findByBehandlingAndAktiv(behandlingId = aktivBehandling.id)
if (vilkårsvurdering == null) {
// TODO : Burde dette egentlig vøre aktivBehandling.underkategori ? Eller har det kanskje ikke så mye å si ?
return BehandlingUnderkategori.ORDINÆR
}

val erUtvidetVilkårBehandlet =
vilkårsvurderingRepository
.findByBehandlingAndAktiv(behandlingId = aktivBehandling.id)
?.personResultater
?.flatMap { it.vilkårResultater }
?.filter { it.sistEndretIBehandlingId == aktivBehandling.id }
?.any { it.vilkårType == Vilkår.UTVIDET_BARNETRYGD }

return if (erUtvidetVilkårBehandlet == true) {
vilkårsvurdering
.personResultater
.flatMap { it.vilkårResultater }
.filter { it.sistEndretIBehandlingId == aktivBehandling.id }
.any { it.vilkårType == Vilkår.UTVIDET_BARNETRYGD }

return if (erUtvidetVilkårBehandlet) {
BehandlingUnderkategori.UTVIDET
} else {
BehandlingUnderkategori.ORDINÆR
}
}

private fun hentForrigeAndeler(fagsakId: Long): List<AndelTilkjentYtelse>? {
val forrigeVedtatteBehandling =
behandlingHentOgPersisterService.hentSisteBehandlingSomErVedtatt(fagsakId = fagsakId) ?: return null
return andelTilkjentYtelseRepository.finnAndelerTilkjentYtelseForBehandling(behandlingId = forrigeVedtatteBehandling.id)
private fun oppdaterBehandlingstemaPåBehandlingHvisNødvendig(
behandling: Behandling,
nyKategori: BehandlingKategori,
nyUnderkategori: BehandlingUnderkategori,
): Behandling {
val skalOppdatereKategori = nyKategori != behandling.kategori
val skalOppdatereUnderkategori = nyUnderkategori != behandling.underkategori
if (skalOppdatereKategori || skalOppdatereUnderkategori) {
behandling.kategori = nyKategori
behandling.underkategori = nyUnderkategori
val lagretBehandling = behandlingHentOgPersisterService.lagreEllerOppdater(behandling)
patchOppgaveForBehandlingHvisNødvendig(lagretBehandling)
return lagretBehandling
}
return behandling
}

private fun patchOppgaveForBehandlingHvisNødvendig(
behandling: Behandling,
) {
oppgaveService.patchOppgaverForBehandling(behandling) {
val behandlingstemaErEndret = it.behandlingstema != behandling.tilOppgaveBehandlingTema().value
val behandlingstypeErEndret = it.behandlingstype != behandling.kategori.tilOppgavebehandlingType().value
if (behandlingstemaErEndret || behandlingstypeErEndret) {
it.copy(
behandlingstema = behandling.tilOppgaveBehandlingTema().value,
behandlingstype = behandling.kategori.tilOppgavebehandlingType().value,
)
} else {
null
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,6 @@ import no.nav.familie.ba.sak.kjerne.behandling.domene.BehandlingKategori
import no.nav.familie.ba.sak.kjerne.behandling.domene.BehandlingType
import no.nav.familie.ba.sak.kjerne.behandling.domene.BehandlingUnderkategori
import no.nav.familie.ba.sak.kjerne.behandling.domene.BehandlingÅrsak
import no.nav.familie.ba.sak.kjerne.behandling.domene.finnHøyesteKategori
import no.nav.familie.ba.sak.kjerne.beregning.domene.AndelTilkjentYtelse
import no.nav.familie.ba.sak.kjerne.eøs.vilkårsvurdering.VilkårsvurderingTidslinjer
import no.nav.familie.ba.sak.kjerne.personident.Aktør
import no.nav.familie.ba.sak.kjerne.tidslinje.komposisjon.innholdForTidspunkt
import no.nav.familie.ba.sak.kjerne.tidslinje.tidspunkt.MånedTidspunkt
import no.nav.familie.ba.sak.kjerne.vilkårsvurdering.domene.Regelverk

fun bestemKategoriVedOpprettelse(
overstyrtKategori: BehandlingKategori?,
Expand Down Expand Up @@ -43,25 +36,6 @@ fun bestemKategoriVedOpprettelse(
}
}

fun bestemKategori(
overstyrtKategori: BehandlingKategori?,
// kategori fra siste iverksatt behandling eller NASJONAL når det ikke finnes noe
kategoriFraSisteIverksattBehandling: BehandlingKategori,
kategoriFraInneværendeBehandling: BehandlingKategori,
): BehandlingKategori {
// når saksbehandler overstyrer behandlingstema manuelt
if (overstyrtKategori != null) return overstyrtKategori

// når saken har en løpende EØS utbetaling
if (kategoriFraSisteIverksattBehandling == BehandlingKategori.EØS) return BehandlingKategori.EØS

// når løpende utbetaling er NASJONAL og inneværende behandling får EØS
val oppdatertKategori =
listOf(kategoriFraSisteIverksattBehandling, kategoriFraInneværendeBehandling).finnHøyesteKategori()

return oppdatertKategori ?: BehandlingKategori.NASJONAL
}

fun bestemUnderkategori(
overstyrtUnderkategori: BehandlingUnderkategori?,
underkategoriFraLøpendeBehandling: BehandlingUnderkategori?,
Expand All @@ -73,25 +47,3 @@ fun bestemUnderkategori(

return oppdatertUnderkategori ?: BehandlingUnderkategori.ORDINÆR
}

fun utledLøpendeUnderkategori(andeler: List<AndelTilkjentYtelse>): BehandlingUnderkategori = if (andeler.any { it.erUtvidet() && it.erLøpende() }) BehandlingUnderkategori.UTVIDET else BehandlingUnderkategori.ORDINÆR

fun utledLøpendeKategori(
barnasTidslinjer: Map<Aktør, VilkårsvurderingTidslinjer.BarnetsTidslinjer>?,
): BehandlingKategori {
if (barnasTidslinjer == null) return BehandlingKategori.NASJONAL

val= MånedTidspunkt.nå()

val etBarnHarMinstEnLøpendeEØSPeriode =
barnasTidslinjer
.values
.map { it.egetRegelverkResultatTidslinje.innholdForTidspunkt(nå) }
.any { it.innhold?.regelverk == Regelverk.EØS_FORORDNINGEN }

return if (etBarnHarMinstEnLøpendeEØSPeriode) {
BehandlingKategori.EØS
} else {
BehandlingKategori.NASJONAL
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ import no.nav.familie.ba.sak.integrasjoner.skyggesak.SkyggesakService
import no.nav.familie.ba.sak.kjerne.behandling.BehandlingHentOgPersisterService
import no.nav.familie.ba.sak.kjerne.behandling.BehandlingService
import no.nav.familie.ba.sak.kjerne.behandling.UtvidetBehandlingService
import no.nav.familie.ba.sak.kjerne.behandling.behandlingstema.BehandlingstemaService
import no.nav.familie.ba.sak.kjerne.behandling.domene.BehandlingStatus
import no.nav.familie.ba.sak.kjerne.beregning.domene.AndelTilkjentYtelseRepository
import no.nav.familie.ba.sak.kjerne.beregning.domene.YtelseType
Expand Down Expand Up @@ -50,7 +49,6 @@ class FagsakService(
private val personRepository: PersonRepository,
private val andelerTilkjentYtelseRepository: AndelTilkjentYtelseRepository,
private val personidentService: PersonidentService,
private val behandlingstemaService: BehandlingstemaService,
private val utvidetBehandlingService: UtvidetBehandlingService,
private val behandlingService: BehandlingService,
private val vedtakRepository: VedtakRepository,
Expand Down Expand Up @@ -244,8 +242,8 @@ class FagsakService(
} else {
aktivBehandling.status == BehandlingStatus.UTREDES || (aktivBehandling.steg >= StegType.BESLUTTE_VEDTAK && aktivBehandling.steg != StegType.BEHANDLING_AVSLUTTET)
},
løpendeKategori = behandlingstemaService.hentLøpendeKategori(fagsakId = fagsakId),
løpendeUnderkategori = behandlingstemaService.hentLøpendeUnderkategori(fagsakId = fagsakId),
løpendeKategori = (aktivBehandling ?: sistVedtatteBehandling)?.kategori,
løpendeUnderkategori = (aktivBehandling ?: sistVedtatteBehandling)?.underkategori,
gjeldendeUtbetalingsperioder = gjeldendeUtbetalingsperioder,
fagsakType = fagsak.type,
institusjon =
Expand Down
Loading

0 comments on commit 8f32de9

Please sign in to comment.