Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

NAV-23391: Setter riktig kategori og underkategori på behandlingstema for saksoversikt #4914

Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
8f32de9
NAV-23391: Setter riktig kategori og underkategori på behandlingstema…
thoalm Nov 22, 2024
25cd5f7
NAV-23391: La til tester for å sjekke at behandlingstema blir oppdate…
thoalm Dec 1, 2024
484959a
NAV-23391: Fjerner TODOene etter diskusjon
thoalm Dec 2, 2024
d2a5943
Merge branch 'main' into NAV_23391_setter_riktig_kategori_og_underkat…
thoalm Dec 2, 2024
d44127e
NAV-23391: Endrer metodenavn basert på QA kommentarer
thoalm Dec 2, 2024
9d28bfa
Merge branch 'main' into NAV_23391_setter_riktig_kategori_og_underkat…
thoalm Dec 2, 2024
e64bfa4
NAV-23391: Endrer logikk for å utlede kategori
thoalm Dec 5, 2024
3dfd132
NAV-23391: Oppdatere logikk for tester
thoalm Dec 6, 2024
6855ab0
NAV-23391: Fjernet TODOs og oppdaterete tester
thoalm Dec 6, 2024
e46fc5e
NAV-23391: RegistrerSøknadSteg skal ikke oppdatere behandlingstema hv…
thoalm Dec 6, 2024
61c7456
NAV-23391: Håndterer behandlinger som skal behandles automatisk
thoalm Dec 6, 2024
7599f3c
Merge branch 'main' into NAV_23391_setter_riktig_kategori_og_underkat…
thoalm Dec 6, 2024
ebf0118
NAV-23391: La til loggers og korrigerte metodeparameternavn
thoalm Dec 6, 2024
cdb46dc
NAV-23391: Endret kategori på behandling i tests for henleggelse av f…
thoalm Dec 8, 2024
ceba751
Merge branch 'main' into NAV_23391_setter_riktig_kategori_og_underkat…
thoalm Dec 8, 2024
138de06
NAV-23391: Omdøpte parameter til metode
thoalm Dec 8, 2024
d891f29
NAV-23391: Fjernet logger og la til ClockProvider
thoalm Dec 8, 2024
f47f976
NAV-23391: Kjørte ktlint
thoalm Dec 8, 2024
70a8488
NAV-23391: Implementerer endringer basert på tilbakemeldinger fra QA
thoalm Dec 8, 2024
45e64cd
NAV-23391: Oppdaterte navn på parameter i metoder til mer passende navn
thoalm Dec 8, 2024
ad7f1d9
NAV-23391: Oppdaterer test for å reflektere endring i feilmelding
thoalm Dec 9, 2024
34ad7e7
Merge branch 'main' into NAV_23391_setter_riktig_kategori_og_underkat…
thoalm Dec 9, 2024
fb2939a
NAV-23391: Logginnslag skal kun opprettes hvis nødvendig
thoalm Dec 9, 2024
2dc4fcd
Merge branch 'main' into NAV_23391_setter_riktig_kategori_og_underkat…
thoalm Dec 9, 2024
80a6454
NAV-23391: La til enhetstest
thoalm Dec 9, 2024
51a1f6c
Merge branch 'main' into NAV_23391_setter_riktig_kategori_og_underkat…
thoalm Dec 9, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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,79 @@ 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) {
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 @@ -129,33 +114,74 @@ class BehandlingstemaService(
}

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) {
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 nå = 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