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 all 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
Expand Up @@ -78,17 +78,14 @@ class BehandlingService(
overstyrtKategori = nyBehandling.kategori,
behandlingType = nyBehandling.behandlingType,
behandlingÅrsak = nyBehandling.behandlingÅrsak,
kategoriFraLøpendeBehandling = behandlingstemaService.hentLøpendeKategori(fagsak.id),
tilbakefallendeKategori = behandlingstemaService.finnBehandlingKategori(fagsak.id),
)

val underkategori =
bestemUnderkategori(
overstyrtUnderkategori = nyBehandling.underkategori,
underkategoriFraLøpendeBehandling = behandlingstemaService.hentLøpendeUnderkategori(fagsakId = fagsak.id),
underkategoriFraInneværendeBehandling =
behandlingstemaService.hentUnderkategoriFraInneværendeBehandling(
fagsak.id,
),
løpendeUnderkategoriFraForrigeVedtatteBehandling = behandlingstemaService.finnLøpendeUnderkategoriFraForrigeVedtatteBehandling(fagsakId = fagsak.id),
underkategoriFraAktivBehandling = behandlingstemaService.finnUnderkategoriFraAktivBehandling(fagsakId = fagsak.id),
)

val behandling =
Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,24 @@
package no.nav.familie.ba.sak.kjerne.behandling.behandlingstema

import jakarta.transaction.Transactional
import no.nav.familie.ba.sak.common.ClockProvider
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.Companion.tilTidspunkt
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
import org.springframework.stereotype.Service
import java.time.YearMonth

@Service
class BehandlingstemaService(
Expand All @@ -25,137 +28,169 @@ class BehandlingstemaService(
private val oppgaveService: OppgaveService,
private val vilkårsvurderingTidslinjeService: VilkårsvurderingTidslinjeService,
private val vilkårsvurderingRepository: VilkårsvurderingRepository,
private val clockProvider: ClockProvider,
) {
@Transactional
fun oppdaterBehandlingstema(
fun oppdaterBehandlingstemaFraRegistrereSøknadSteg(
behandling: Behandling,
nyUnderkategori: BehandlingUnderkategori,
): Behandling {
if (behandling.skalBehandlesAutomatisk) {
return behandling
}
return oppdaterBehandlingstemaPåBehandlingHvisNødvendig(behandling, behandling.kategori, nyUnderkategori)
}

@Transactional
fun oppdaterSaksbehandletBehandlingstema(
behandling: Behandling,
nyKategori: BehandlingKategori,
nyUnderkategori: BehandlingUnderkategori,
): Behandling {
if (behandling.skalBehandlesAutomatisk) {
throw FunksjonellFeil("Kan ikke oppdatere behandlingstema manuelt på behandlinger som skal behandles automatisk.")
}
val forrigeKategori = behandling.kategori
val forrigeUnderkategori = behandling.underkategori
val oppdatertBehanding = oppdaterBehandlingstemaPåBehandlingHvisNødvendig(behandling, nyKategori, nyUnderkategori)
lagLogginnslagHvisNødvendig(oppdatertBehanding, forrigeKategori, forrigeUnderkategori, nyKategori, 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 = finnBehandlingKategori(behandling.fagsak.id)
val nyUnderkategori = overstyrtUnderkategori ?: finnUnderkategoriFraAktivBehandling(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 finnBehandlingKategori(fagsakId: Long): BehandlingKategori {
val aktivBehandling = behandlingHentOgPersisterService.finnAktivOgÅpenForFagsak(fagsakId = fagsakId)
val sisteVedtatteBehandling = behandlingHentOgPersisterService.hentSisteBehandlingSomErVedtatt(fagsakId = fagsakId)

val utledetUnderkategori =
bestemUnderkategori(
overstyrtUnderkategori = overstyrtUnderkategori,
underkategoriFraLøpendeBehandling = hentLøpendeUnderkategori(fagsakId = behandling.fagsak.id),
underkategoriFraInneværendeBehandling = hentUnderkategoriFraInneværendeBehandling(fagsakId = behandling.fagsak.id),
)
if (aktivBehandling == null) {
return sisteVedtatteBehandling?.kategori ?: 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 tidslinjer = vilkårsvurderingTidslinjeService.hentTidslinjer(behandlingId = BehandlingId(aktivBehandling.id))
if (tidslinjer == null) {
return sisteVedtatteBehandling?.kategori ?: BehandlingKategori.NASJONAL
}

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,
)
}
}
} else {
behandling
val alleBarnasTidslinjerSomHarLøpendePeriode =
tidslinjer
.barnasTidslinjer()
.values
.map { it.egetRegelverkResultatTidslinje.innholdForTidspunkt(YearMonth.now(clockProvider.get()).tilTidspunkt()) }

val etBarnHarMinstEnLøpendeEØSPeriode = alleBarnasTidslinjerSomHarLøpendePeriode.any { it.innhold?.regelverk == Regelverk.EØS_FORORDNINGEN }
if (etBarnHarMinstEnLøpendeEØSPeriode) {
return BehandlingKategori.EØS
}
}

fun hentLøpendeKategori(fagsakId: Long): BehandlingKategori {
val forrigeVedtatteBehandling =
behandlingHentOgPersisterService.hentSisteBehandlingSomErVedtatt(fagsakId = fagsakId)
?: return BehandlingKategori.NASJONAL
val etBarnHarMinstEnLøpendeNasjonalPeriode = alleBarnasTidslinjerSomHarLøpendePeriode.any { it.innhold?.regelverk == Regelverk.NASJONALE_REGLER }
if (etBarnHarMinstEnLøpendeNasjonalPeriode) {
return BehandlingKategori.NASJONAL
}

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

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 erVilkårMedEØSRegelverkBehandlet =
vilkårsvurdering.personResultater
.flatMap { it.vilkårResultater }
.filter { it.sistEndretIBehandlingId == aktivBehandling.id }
.any { it.vurderesEtter == Regelverk.EØS_FORORDNINGEN }

return if (erVilkårMedEØSRegelverkBehandlet) {
BehandlingKategori.EØS
fun finnLøpendeUnderkategoriFraForrigeVedtatteBehandling(fagsakId: Long): BehandlingUnderkategori? {
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 {
BehandlingKategori.NASJONAL
BehandlingUnderkategori.ORDINÆR
}
}

fun hentLøpendeUnderkategori(fagsakId: Long): BehandlingUnderkategori? {
val forrigeAndeler = hentForrigeAndeler(fagsakId)
return if (forrigeAndeler != null) utledLøpendeUnderkategori(forrigeAndeler) else null
}
fun finnUnderkategoriFraAktivBehandling(fagsakId: Long): BehandlingUnderkategori {
val aktivBehandling = behandlingHentOgPersisterService.finnAktivOgÅpenForFagsak(fagsakId = fagsakId)
if (aktivBehandling == null) {
return BehandlingUnderkategori.ORDINÆR
}

fun hentUnderkategoriFraInneværendeBehandling(fagsakId: Long): BehandlingUnderkategori {
val aktivBehandling =
behandlingHentOgPersisterService.finnAktivOgÅpenForFagsak(fagsakId = fagsakId)
?: 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)
patchBehandlingstemaPåOppgaveForBehandlingHvisNødvendig(lagretBehandling)
return lagretBehandling
}
return behandling
}

private fun patchBehandlingstemaPåOppgaveForBehandlingHvisNø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
}
}
}

private fun lagLogginnslagHvisNødvendig(
behandling: Behandling,
forrigeKategori: BehandlingKategori,
forrigeUnderkategori: BehandlingUnderkategori,
nyKategori: BehandlingKategori,
nyUnderkategori: BehandlingUnderkategori,
) {
val skalOppdatereKategori = nyKategori != forrigeKategori
val skalOppdatereUnderkategori = nyUnderkategori != forrigeUnderkategori
if (skalOppdatereKategori || skalOppdatereUnderkategori) {
loggService.opprettEndretBehandlingstema(
behandling = behandling,
forrigeKategori = forrigeKategori,
forrigeUnderkategori = forrigeUnderkategori,
nyKategori = nyKategori,
nyUnderkategori = nyUnderkategori,
)
}
}
}
Loading
Loading