diff --git a/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveService.kt b/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveService.kt index f1aba630624..4acd82af17e 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveService.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveService.kt @@ -243,8 +243,7 @@ class AktivitetspliktOppgaveService( ) val brevrespons: BrevStatusResponse = runBlocking { brevApiKlient.ferdigstillBrev(req, brukerTokenInfo) } if (brevrespons.status.erDistribuert()) { - oppgaveService.ferdigstillOppgave(oppgaveId, brukerTokenInfo) - return oppgaveService.hentOppgave(oppgaveId) + return oppgaveService.ferdigstillOppgave(oppgaveId, brukerTokenInfo) } else { throw BrevBleIkkeFerdig(brevrespons.status) } diff --git a/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktRoute.kt b/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktRoute.kt index ea9ee1430ae..e501568a747 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktRoute.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktRoute.kt @@ -211,8 +211,8 @@ internal fun Route.aktivitetspliktRoutes( route("revurdering") { post { kunSystembruker { - logger.info("Sjekker om sak $sakId trenger en ny revurdering etter 6 måneder") val request = call.receive() + logger.info("Sjekker om sak $sakId trenger en ny revurdering aktivitetsplikt ${request.jobbType.name}") val opprettet = inTransaction { aktivitetspliktService.opprettRevurderingHvisKravIkkeOppfylt( @@ -224,6 +224,7 @@ internal fun Route.aktivitetspliktRoutes( } } } + route("oppgave-oppfoelging") { post { kunSystembruker { diff --git a/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktService.kt b/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktService.kt index 144c4d0e3aa..ae3a30e2921 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktService.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktService.kt @@ -6,8 +6,10 @@ import no.nav.etterlatte.behandling.BehandlingService import no.nav.etterlatte.behandling.aktivitetsplikt.vurdering.AktivitetspliktAktivitetsgrad import no.nav.etterlatte.behandling.aktivitetsplikt.vurdering.AktivitetspliktAktivitetsgradDao import no.nav.etterlatte.behandling.aktivitetsplikt.vurdering.AktivitetspliktAktivitetsgradOgUnntak +import no.nav.etterlatte.behandling.aktivitetsplikt.vurdering.AktivitetspliktAktivitetsgradType import no.nav.etterlatte.behandling.aktivitetsplikt.vurdering.AktivitetspliktAktivitetsgradType.AKTIVITET_100 import no.nav.etterlatte.behandling.aktivitetsplikt.vurdering.AktivitetspliktAktivitetsgradType.AKTIVITET_OVER_50 +import no.nav.etterlatte.behandling.aktivitetsplikt.vurdering.AktivitetspliktSkjoennsmessigVurdering import no.nav.etterlatte.behandling.aktivitetsplikt.vurdering.AktivitetspliktUnntak import no.nav.etterlatte.behandling.aktivitetsplikt.vurdering.AktivitetspliktUnntakDao import no.nav.etterlatte.behandling.aktivitetsplikt.vurdering.AktivitetspliktUnntakType @@ -49,6 +51,7 @@ import no.nav.etterlatte.oppgave.OppgaveService import java.time.LocalDate import java.time.YearMonth import java.util.UUID +import kotlin.collections.filter class AktivitetspliktService( private val aktivitetspliktDao: AktivitetspliktDao, @@ -121,7 +124,7 @@ class AktivitetspliktService( ) } - fun oppfyllerAktivitetsplikt( + fun oppfyllerAktivitetsplikt6mnd( sakId: SakId, aktivitetspliktDato: LocalDate, ): Boolean { @@ -447,7 +450,7 @@ class AktivitetspliktService( } fun hentVurderingForOppgaveGammel(oppgaveId: UUID): AktivitetspliktVurderingGammel? = - hentVurderingForOppgave(oppgaveId)?.let { + hentVurderingForOppgave(oppgaveId).let { AktivitetspliktVurderingGammel( aktivitet = it.aktivitet.firstOrNull(), unntak = it.unntak.firstOrNull(), @@ -476,6 +479,33 @@ class AktivitetspliktService( fun hentVurderingForSak(sakId: SakId): AktivitetspliktVurdering = hentVurderingForSakHelper(aktivitetspliktAktivitetsgradDao, aktivitetspliktUnntakDao, sakId) + private fun oppfyllerAktivitetsplikt12mnd(sakId: SakId): Boolean { + val oppgave12mnd = + oppgaveService + .hentOppgaverForSak(sakId, OppgaveType.AKTIVITETSPLIKT_12MND) + .filter { it.erFerdigstilt() } + .maxByOrNull { it.opprettet } + ?: throw InternfeilException("Fant ikke aktivitetsplikt12mnd for sak: $sakId") + + val vurderingForOppgave = hentVurderingForOppgave(oppgave12mnd.id) + val sistevurdering = + vurderingForOppgave.aktivitet.maxByOrNull { it.endret.tidspunkt } + + if (sistevurdering == null) { + return vurderingForOppgave.unntak.isNotEmpty() + } else { + if (sistevurdering.aktivitetsgrad == AktivitetspliktAktivitetsgradType.AKTIVITET_UNDER_50) { + return false + } + if (sistevurdering.aktivitetsgrad == AKTIVITET_OVER_50 && + sistevurdering.skjoennsmessigVurdering == AktivitetspliktSkjoennsmessigVurdering.NEI + ) { + return false + } + } + return true + } + fun opprettRevurderingHvisKravIkkeOppfylt( request: OpprettRevurderingForAktivitetspliktDto, bruker: BrukerTokenInfo, @@ -498,7 +528,15 @@ class AktivitetspliktService( } val aktivitetspliktDato = request.behandlingsmaaned.atDay(1).plusMonths(1) - return if (oppfyllerAktivitetsplikt(request.sakId, aktivitetspliktDato)) { + val jobbType = request.jobbType + // Hvis man oppfyller kravene skal det ikke opprettes en revurdering + val oppfyllerKrav = + when (jobbType) { + JobbType.OMS_DOED_6MND -> oppfyllerAktivitetsplikt6mnd(request.sakId, aktivitetspliktDato) + JobbType.OMS_DOED_12MND -> oppfyllerAktivitetsplikt12mnd(request.sakId) + else -> throw InternfeilException("Oppretting av revurdering støttes ikke for jobb ${jobbType.name}") + } + return if (oppfyllerKrav) { OpprettRevurderingForAktivitetspliktResponse(forrigeBehandlingId = forrigeBehandling.id) } else { if (behandlingService.hentBehandlingerForSak(request.sakId).any { it.status.aapenBehandling() }) { @@ -619,7 +657,7 @@ class AktivitetspliktService( fun kopierInnTilOppgave( sakId: SakId, oppgaveId: UUID, - ): AktivitetspliktVurdering? { + ): AktivitetspliktVurdering { val oppgave = oppgaveService.hentOppgave(oppgaveId) sjekkOppgaveTilhoererSakOgErRedigerbar(oppgave, sakId) @@ -785,12 +823,12 @@ data class AktivitetspliktVurdering( fun erTom() = aktivitet.isEmpty() && unntak.isEmpty() } +fun Grunnlagsopplysning.Kilde.endretDatoOrNull(): Tidspunkt? = if (this is Grunnlagsopplysning.Saksbehandler) this.tidspunkt else null + interface AktivitetspliktVurderingOpprettetDato { val opprettet: Grunnlagsopplysning.Kilde } -fun Grunnlagsopplysning.Kilde.endretDatoOrNull(): Tidspunkt? = if (this is Grunnlagsopplysning.Saksbehandler) this.tidspunkt else null - class SakidTilhoererIkkeBehandlingException : UgyldigForespoerselException( code = "SAK_ID_TILHOERER_IKKE_BEHANDLING", diff --git a/apps/etterlatte-behandling/src/test/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveServiceTest.kt b/apps/etterlatte-behandling/src/test/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveServiceTest.kt index d14808fd0c5..5a1a197cf6a 100644 --- a/apps/etterlatte-behandling/src/test/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveServiceTest.kt +++ b/apps/etterlatte-behandling/src/test/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveServiceTest.kt @@ -79,7 +79,7 @@ class AktivitetspliktOppgaveServiceTest { every { oppgaveService.hentOppgave(oppgave.id) } returns oppgave every { aktivitetspliktService.hentVurderingForOppgave(oppgave.id) } returns AktivitetspliktVurdering(emptyList(), emptyList()) - every { aktivitetspliktService.kopierInnTilOppgave(sak.id, oppgave.id) } returns null + every { aktivitetspliktService.kopierInnTilOppgave(sak.id, oppgave.id) } returns AktivitetspliktVurdering(emptyList(), emptyList()) every { aktivitetspliktBrevDao.hentBrevdata(oppgave.id) } returns null service.hentVurderingForOppgave(oppgave.id) diff --git a/apps/etterlatte-behandling/src/test/kotlin/behandling/aktivitetsplikt/AktivitetspliktServiceTest.kt b/apps/etterlatte-behandling/src/test/kotlin/behandling/aktivitetsplikt/AktivitetspliktServiceTest.kt index f7880f0c4e9..ad9791958b7 100644 --- a/apps/etterlatte-behandling/src/test/kotlin/behandling/aktivitetsplikt/AktivitetspliktServiceTest.kt +++ b/apps/etterlatte-behandling/src/test/kotlin/behandling/aktivitetsplikt/AktivitetspliktServiceTest.kt @@ -16,6 +16,7 @@ import no.nav.etterlatte.behandling.BehandlingService import no.nav.etterlatte.behandling.aktivitetsplikt.vurdering.AktivitetspliktAktivitetsgrad import no.nav.etterlatte.behandling.aktivitetsplikt.vurdering.AktivitetspliktAktivitetsgradDao import no.nav.etterlatte.behandling.aktivitetsplikt.vurdering.AktivitetspliktAktivitetsgradType +import no.nav.etterlatte.behandling.aktivitetsplikt.vurdering.AktivitetspliktSkjoennsmessigVurdering import no.nav.etterlatte.behandling.aktivitetsplikt.vurdering.AktivitetspliktUnntakDao import no.nav.etterlatte.behandling.aktivitetsplikt.vurdering.AktivitetspliktUnntakType import no.nav.etterlatte.behandling.aktivitetsplikt.vurdering.LagreAktivitetspliktAktivitetsgrad @@ -28,8 +29,6 @@ import no.nav.etterlatte.behandling.revurdering.RevurderingService import no.nav.etterlatte.behandling.sakId1 import no.nav.etterlatte.behandling.sakId2 import no.nav.etterlatte.common.Enheter -import no.nav.etterlatte.funksjonsbrytere.DummyFeatureToggleService -import no.nav.etterlatte.funksjonsbrytere.FeatureToggleService import no.nav.etterlatte.ktor.token.systembruker import no.nav.etterlatte.libs.common.Vedtaksloesning import no.nav.etterlatte.libs.common.behandling.BehandlingStatus @@ -46,6 +45,8 @@ import no.nav.etterlatte.libs.common.oppgave.OppgaveIntern import no.nav.etterlatte.libs.common.oppgave.OppgaveKilde import no.nav.etterlatte.libs.common.oppgave.OppgaveType import no.nav.etterlatte.libs.common.oppgave.Status +import no.nav.etterlatte.libs.common.sak.Sak +import no.nav.etterlatte.libs.common.sak.SakId import no.nav.etterlatte.libs.common.tidspunkt.Tidspunkt import no.nav.etterlatte.libs.ktor.token.BrukerTokenInfo import no.nav.etterlatte.libs.ktor.token.Fagsaksystem @@ -71,7 +72,6 @@ class AktivitetspliktServiceTest { private val oppgaveService: OppgaveService = mockk() private val statistikkProduer: BehandlingHendelserKafkaProducer = mockk() private val kopierService: AktivitetspliktKopierService = mockk() - private val featureToggleService: FeatureToggleService = DummyFeatureToggleService() private val service = AktivitetspliktService( aktivitetspliktDao, @@ -551,7 +551,7 @@ class AktivitetspliktServiceTest { ) every { aktivitetspliktUnntakDao.hentNyesteUnntak(aktivitet.sakId) } returns emptyList() - val result = service.oppfyllerAktivitetsplikt(aktivitet.sakId, aktivitet.fom) + val result = service.oppfyllerAktivitetsplikt6mnd(aktivitet.sakId, aktivitet.fom) result shouldBe true } @@ -570,7 +570,7 @@ class AktivitetspliktServiceTest { ) every { aktivitetspliktUnntakDao.hentNyesteUnntak(aktivitet.sakId) } returns emptyList() - val result = service.oppfyllerAktivitetsplikt(aktivitet.sakId, aktivitet.fom) + val result = service.oppfyllerAktivitetsplikt6mnd(aktivitet.sakId, aktivitet.fom) result shouldBe false } @@ -603,7 +603,7 @@ class AktivitetspliktServiceTest { }, ) - val result = service.oppfyllerAktivitetsplikt(aktivitet.sakId, aktivitet.fom) + val result = service.oppfyllerAktivitetsplikt6mnd(aktivitet.sakId, aktivitet.fom) result shouldBe true } @@ -623,7 +623,7 @@ class AktivitetspliktServiceTest { }, ) - val result = service.oppfyllerAktivitetsplikt(aktivitet.sakId, aktivitet.fom) + val result = service.oppfyllerAktivitetsplikt6mnd(aktivitet.sakId, aktivitet.fom) result shouldBe false } @@ -641,13 +641,20 @@ class AktivitetspliktServiceTest { every { opphoerFraOgMed } returns null } private val frist = Tidspunkt.now() - private val request = + private val request6mnd = OpprettRevurderingForAktivitetspliktDto( sakId = sakId, frist = frist, behandlingsmaaned = YearMonth.now(), jobbType = JobbType.OMS_DOED_6MND, ) + private val request12mnd = + OpprettRevurderingForAktivitetspliktDto( + sakId = sakId, + frist = frist, + behandlingsmaaned = YearMonth.now(), + jobbType = JobbType.OMS_DOED_12MND, + ) private val persongalleri: Persongalleri = mockk() private val persongalleriOpplysning = mockk> { @@ -655,7 +662,7 @@ class AktivitetspliktServiceTest { } @Test - fun `Skal opprette revurdering hvis kravene for aktivitetsplikt ikke er oppfylt`() { + fun `Skal opprette revurdering hvis kravene for aktivitetsplikt ikke er oppfylt 6mnd`() { val revurdering = mockk { every { id } returns UUID.randomUUID() @@ -674,13 +681,13 @@ class AktivitetspliktServiceTest { kilde = Vedtaksloesning.GJENNY, revurderingAarsak = Revurderingaarsak.AKTIVITETSPLIKT, virkningstidspunkt = - request.behandlingsmaaned + request6mnd.behandlingsmaaned .atDay(1) .plusMonths(1) .tilVirkningstidspunkt("Aktivitetsplikt"), utlandstilknytning = null, boddEllerArbeidetUtlandet = null, - begrunnelse = request.jobbType.beskrivelse, + begrunnelse = request6mnd.jobbType.beskrivelse, saksbehandlerIdent = Fagsaksystem.EY.navn, frist = frist, opphoerFraOgMed = null, @@ -692,13 +699,147 @@ class AktivitetspliktServiceTest { every { oppgaveService.hentOppgaverForReferanse(any()) } returns listOf( mockk { - every { type } returns OppgaveType.REVURDERING + every { type } returns OppgaveType.AKTIVITETSPLIKT_REVURDERING every { id } returns UUID.randomUUID() }, ) every { revurderingService.fjernSaksbehandlerFraRevurderingsOppgave(any()) } just runs - val resultat = service.opprettRevurderingHvisKravIkkeOppfylt(request, systembruker()) + val resultat = service.opprettRevurderingHvisKravIkkeOppfylt(request6mnd, systembruker()) + + with(resultat) { + opprettetRevurdering shouldBe true + opprettetOppgave shouldBe false + oppgaveId shouldBe null + nyBehandlingId shouldBe revurdering.id + forrigeBehandlingId shouldBe forrigeBehandling.id + } + verify(exactly = 1) { revurderingService.fjernSaksbehandlerFraRevurderingsOppgave(any()) } + } + + @Test + fun `Skal opprette revurdering hvis kravene for aktivitetsplikt ikke er oppfylt, ingen vurdering eller unntak 12 mnd`() { + val revurdering = + mockk { + every { id } returns UUID.randomUUID() + } + every { aktivitetspliktAktivitetsgradDao.hentNyesteAktivitetsgrad(sakId) } returns emptyList() + every { aktivitetspliktUnntakDao.hentNyesteUnntak(sakId) } returns emptyList() + every { behandlingService.hentSisteIverksatte(sakId) } returns forrigeBehandling + every { behandlingService.hentBehandlingerForSak(sakId) } returns listOf(forrigeBehandling) + coEvery { grunnlagKlient.hentPersongalleri(forrigeBehandling.id, any()) } returns persongalleriOpplysning + every { + revurderingService.opprettRevurdering( + sakId = sakId, + persongalleri = persongalleriOpplysning.opplysning, + forrigeBehandling = forrigeBehandling.id, + prosessType = Prosesstype.MANUELL, + kilde = Vedtaksloesning.GJENNY, + revurderingAarsak = Revurderingaarsak.AKTIVITETSPLIKT, + virkningstidspunkt = + request12mnd.behandlingsmaaned + .atDay(1) + .plusMonths(1) + .tilVirkningstidspunkt("Aktivitetsplikt"), + utlandstilknytning = null, + boddEllerArbeidetUtlandet = null, + begrunnelse = request12mnd.jobbType.beskrivelse, + saksbehandlerIdent = Fagsaksystem.EY.navn, + frist = frist, + opphoerFraOgMed = null, + mottattDato = null, + ) + } returns + mockk { every { oppdater() } returns revurdering } + every { oppgaveService.fjernSaksbehandler(any()) } just runs + every { oppgaveService.hentOppgaverForSak(any(), OppgaveType.AKTIVITETSPLIKT_12MND) } returns + listOf( + lagNyOppgave( + status = Status.FERDIGSTILT, + oppgaveType = OppgaveType.AKTIVITETSPLIKT_12MND, + sak = Sak("ident", SakType.OMSTILLINGSSTOENAD, SakId(1213L), Enheter.defaultEnhet.enhetNr), + ), + ) + every { revurderingService.fjernSaksbehandlerFraRevurderingsOppgave(any()) } just runs + every { aktivitetspliktAktivitetsgradDao.hentAktivitetsgradForOppgave(any()) } returns emptyList() + every { aktivitetspliktUnntakDao.hentUnntakForOppgave(any()) } returns emptyList() + + val resultat = service.opprettRevurderingHvisKravIkkeOppfylt(request12mnd, systembruker()) + + with(resultat) { + opprettetRevurdering shouldBe true + opprettetOppgave shouldBe false + oppgaveId shouldBe null + nyBehandlingId shouldBe revurdering.id + forrigeBehandlingId shouldBe forrigeBehandling.id + } + verify(exactly = 1) { revurderingService.fjernSaksbehandlerFraRevurderingsOppgave(any()) } + } + + @Test + fun `Skal opprette revurdering hvis kravene for aktivitetsplikt ikke er oppfylt, aktivitetsgrad under 50 12 mnd`() { + val revurdering = + mockk { + every { id } returns UUID.randomUUID() + } + every { aktivitetspliktAktivitetsgradDao.hentNyesteAktivitetsgrad(sakId) } returns emptyList() + every { aktivitetspliktUnntakDao.hentNyesteUnntak(sakId) } returns emptyList() + every { behandlingService.hentSisteIverksatte(sakId) } returns forrigeBehandling + every { behandlingService.hentBehandlingerForSak(sakId) } returns listOf(forrigeBehandling) + coEvery { grunnlagKlient.hentPersongalleri(forrigeBehandling.id, any()) } returns persongalleriOpplysning + every { + revurderingService.opprettRevurdering( + sakId = sakId, + persongalleri = persongalleriOpplysning.opplysning, + forrigeBehandling = forrigeBehandling.id, + prosessType = Prosesstype.MANUELL, + kilde = Vedtaksloesning.GJENNY, + revurderingAarsak = Revurderingaarsak.AKTIVITETSPLIKT, + virkningstidspunkt = + request12mnd.behandlingsmaaned + .atDay(1) + .plusMonths(1) + .tilVirkningstidspunkt("Aktivitetsplikt"), + utlandstilknytning = null, + boddEllerArbeidetUtlandet = null, + begrunnelse = request12mnd.jobbType.beskrivelse, + saksbehandlerIdent = Fagsaksystem.EY.navn, + frist = frist, + opphoerFraOgMed = null, + mottattDato = null, + ) + } returns + mockk { every { oppdater() } returns revurdering } + every { oppgaveService.fjernSaksbehandler(any()) } just runs + every { oppgaveService.hentOppgaverForSak(any(), OppgaveType.AKTIVITETSPLIKT_12MND) } returns + listOf( + lagNyOppgave( + status = Status.FERDIGSTILT, + oppgaveType = OppgaveType.AKTIVITETSPLIKT_12MND, + sak = Sak("ident", SakType.OMSTILLINGSSTOENAD, SakId(1213L), Enheter.defaultEnhet.enhetNr), + ), + ) + every { revurderingService.fjernSaksbehandlerFraRevurderingsOppgave(any()) } just runs + every { aktivitetspliktAktivitetsgradDao.hentAktivitetsgradForOppgave(any()) } returns + listOf( + AktivitetspliktAktivitetsgrad( + aktivitetsgrad = AktivitetspliktAktivitetsgradType.AKTIVITET_UNDER_50, + oppgaveId = UUID.randomUUID(), + behandlingId = null, + beskrivelse = "", + sakId = sakId, + endret = Grunnlagsopplysning.automatiskSaksbehandler, + opprettet = Grunnlagsopplysning.automatiskSaksbehandler, + vurdertFra12Mnd = false, + skjoennsmessigVurdering = null, + fom = LocalDate.now(), + tom = LocalDate.now().plusMonths(3L), + id = UUID.randomUUID(), + ), + ) + every { aktivitetspliktUnntakDao.hentUnntakForOppgave(any()) } returns emptyList() + + val resultat = service.opprettRevurderingHvisKravIkkeOppfylt(request12mnd, systembruker()) with(resultat) { opprettetRevurdering shouldBe true @@ -710,6 +851,156 @@ class AktivitetspliktServiceTest { verify(exactly = 1) { revurderingService.fjernSaksbehandlerFraRevurderingsOppgave(any()) } } + @Test + fun `opprette revurdering aktivitetsplikt ikke er oppfylt, aktivitetsgrad over 50skjønnsmessig nei - 12 mnd`() { + val revurdering = + mockk { + every { id } returns UUID.randomUUID() + } + every { aktivitetspliktAktivitetsgradDao.hentNyesteAktivitetsgrad(sakId) } returns emptyList() + every { aktivitetspliktUnntakDao.hentNyesteUnntak(sakId) } returns emptyList() + every { behandlingService.hentSisteIverksatte(sakId) } returns forrigeBehandling + every { behandlingService.hentBehandlingerForSak(sakId) } returns listOf(forrigeBehandling) + coEvery { grunnlagKlient.hentPersongalleri(forrigeBehandling.id, any()) } returns persongalleriOpplysning + every { + revurderingService.opprettRevurdering( + sakId = sakId, + persongalleri = persongalleriOpplysning.opplysning, + forrigeBehandling = forrigeBehandling.id, + prosessType = Prosesstype.MANUELL, + kilde = Vedtaksloesning.GJENNY, + revurderingAarsak = Revurderingaarsak.AKTIVITETSPLIKT, + virkningstidspunkt = + request12mnd.behandlingsmaaned + .atDay(1) + .plusMonths(1) + .tilVirkningstidspunkt("Aktivitetsplikt"), + utlandstilknytning = null, + boddEllerArbeidetUtlandet = null, + begrunnelse = request12mnd.jobbType.beskrivelse, + saksbehandlerIdent = Fagsaksystem.EY.navn, + frist = frist, + opphoerFraOgMed = null, + mottattDato = null, + ) + } returns + mockk { every { oppdater() } returns revurdering } + every { oppgaveService.fjernSaksbehandler(any()) } just runs + every { oppgaveService.hentOppgaverForSak(any(), OppgaveType.AKTIVITETSPLIKT_12MND) } returns + listOf( + lagNyOppgave( + status = Status.FERDIGSTILT, + oppgaveType = OppgaveType.AKTIVITETSPLIKT_12MND, + sak = Sak("ident", SakType.OMSTILLINGSSTOENAD, SakId(1213L), Enheter.defaultEnhet.enhetNr), + ), + ) + every { revurderingService.fjernSaksbehandlerFraRevurderingsOppgave(any()) } just runs + every { aktivitetspliktAktivitetsgradDao.hentAktivitetsgradForOppgave(any()) } returns + listOf( + AktivitetspliktAktivitetsgrad( + aktivitetsgrad = AktivitetspliktAktivitetsgradType.AKTIVITET_OVER_50, + oppgaveId = UUID.randomUUID(), + behandlingId = null, + beskrivelse = "", + sakId = sakId, + endret = Grunnlagsopplysning.automatiskSaksbehandler, + opprettet = Grunnlagsopplysning.automatiskSaksbehandler, + vurdertFra12Mnd = false, + skjoennsmessigVurdering = AktivitetspliktSkjoennsmessigVurdering.NEI, + fom = LocalDate.now(), + tom = LocalDate.now().plusMonths(3L), + id = UUID.randomUUID(), + ), + ) + every { aktivitetspliktUnntakDao.hentUnntakForOppgave(any()) } returns emptyList() + + val resultat = service.opprettRevurderingHvisKravIkkeOppfylt(request12mnd, systembruker()) + + with(resultat) { + opprettetRevurdering shouldBe true + opprettetOppgave shouldBe false + oppgaveId shouldBe null + nyBehandlingId shouldBe revurdering.id + forrigeBehandlingId shouldBe forrigeBehandling.id + } + verify(exactly = 1) { revurderingService.fjernSaksbehandlerFraRevurderingsOppgave(any()) } + } + + @Test + fun `Skal ikke opprette revurdering hvis kravene for aktivitetsplikt er oppfylt - 12 mnd`() { + val revurdering = + mockk { + every { id } returns UUID.randomUUID() + } + every { aktivitetspliktAktivitetsgradDao.hentNyesteAktivitetsgrad(sakId) } returns emptyList() + every { aktivitetspliktUnntakDao.hentNyesteUnntak(sakId) } returns emptyList() + every { behandlingService.hentSisteIverksatte(sakId) } returns forrigeBehandling + every { behandlingService.hentBehandlingerForSak(sakId) } returns listOf(forrigeBehandling) + coEvery { grunnlagKlient.hentPersongalleri(forrigeBehandling.id, any()) } returns persongalleriOpplysning + every { + revurderingService.opprettRevurdering( + sakId = sakId, + persongalleri = persongalleriOpplysning.opplysning, + forrigeBehandling = forrigeBehandling.id, + prosessType = Prosesstype.MANUELL, + kilde = Vedtaksloesning.GJENNY, + revurderingAarsak = Revurderingaarsak.AKTIVITETSPLIKT, + virkningstidspunkt = + request12mnd.behandlingsmaaned + .atDay(1) + .plusMonths(1) + .tilVirkningstidspunkt("Aktivitetsplikt"), + utlandstilknytning = null, + boddEllerArbeidetUtlandet = null, + begrunnelse = request12mnd.jobbType.beskrivelse, + saksbehandlerIdent = Fagsaksystem.EY.navn, + frist = frist, + opphoerFraOgMed = null, + mottattDato = null, + ) + } returns + mockk { every { oppdater() } returns revurdering } + every { oppgaveService.fjernSaksbehandler(any()) } just runs + every { oppgaveService.hentOppgaverForSak(any(), OppgaveType.AKTIVITETSPLIKT_12MND) } returns + listOf( + lagNyOppgave( + status = Status.FERDIGSTILT, + oppgaveType = OppgaveType.AKTIVITETSPLIKT_12MND, + sak = Sak("ident", SakType.OMSTILLINGSSTOENAD, SakId(1213L), Enheter.defaultEnhet.enhetNr), + ), + ) + every { revurderingService.fjernSaksbehandlerFraRevurderingsOppgave(any()) } just runs + every { aktivitetspliktAktivitetsgradDao.hentAktivitetsgradForOppgave(any()) } returns + listOf( + AktivitetspliktAktivitetsgrad( + aktivitetsgrad = AktivitetspliktAktivitetsgradType.AKTIVITET_OVER_50, + oppgaveId = UUID.randomUUID(), + behandlingId = null, + beskrivelse = "", + sakId = sakId, + endret = Grunnlagsopplysning.automatiskSaksbehandler, + opprettet = Grunnlagsopplysning.automatiskSaksbehandler, + vurdertFra12Mnd = false, + skjoennsmessigVurdering = AktivitetspliktSkjoennsmessigVurdering.JA, + fom = LocalDate.now(), + tom = LocalDate.now().plusMonths(3L), + id = UUID.randomUUID(), + ), + ) + every { aktivitetspliktUnntakDao.hentUnntakForOppgave(any()) } returns emptyList() + + val resultat = service.opprettRevurderingHvisKravIkkeOppfylt(request12mnd, systembruker()) + + with(resultat) { + opprettetRevurdering shouldBe false + opprettetOppgave shouldBe false + oppgaveId shouldBe null + nyBehandlingId shouldBe null + forrigeBehandlingId shouldBe forrigeBehandling.id + } + verify(exactly = 0) { revurderingService.fjernSaksbehandlerFraRevurderingsOppgave(any()) } + } + @Test fun `Skal opprette oppgave hvis det finnes en aapen behandling og kravene ikke er oppfylt`() { val oppgave = @@ -736,7 +1027,7 @@ class AktivitetspliktServiceTest { ) } returns oppgave - val resultat = service.opprettRevurderingHvisKravIkkeOppfylt(request, systembruker()) + val resultat = service.opprettRevurderingHvisKravIkkeOppfylt(request6mnd, systembruker()) with(resultat) { opprettetRevurdering shouldBe false @@ -765,7 +1056,7 @@ class AktivitetspliktServiceTest { every { behandlingService.hentSisteIverksatte(sakId) } returns forrigeBehandling coEvery { grunnlagKlient.hentPersongalleri(forrigeBehandling.id, any()) } returns persongalleriOpplysning - val resultat = service.opprettRevurderingHvisKravIkkeOppfylt(request, systembruker()) + val resultat = service.opprettRevurderingHvisKravIkkeOppfylt(request6mnd, systembruker()) with(resultat) { opprettetRevurdering shouldBe false @@ -860,3 +1151,23 @@ class AktivitetspliktServiceTest { ) } } + +fun lagNyOppgave( + sak: Sak, + oppgaveKilde: OppgaveKilde = OppgaveKilde.BEHANDLING, + oppgaveType: OppgaveType = OppgaveType.FOERSTEGANGSBEHANDLING, + status: Status, +) = OppgaveIntern( + id = UUID.randomUUID(), + status = status, + enhet = sak.enhet, + sakId = sak.id, + kilde = oppgaveKilde, + referanse = "referanse", + merknad = "merknad", + opprettet = Tidspunkt.now(), + sakType = sak.sakType, + fnr = sak.ident, + frist = null, + type = oppgaveType, +) diff --git a/apps/etterlatte-oppdater-behandling/src/main/kotlin/TidshendelseService.kt b/apps/etterlatte-oppdater-behandling/src/main/kotlin/TidshendelseService.kt index 59cb09e14ef..606e7f130d7 100644 --- a/apps/etterlatte-oppdater-behandling/src/main/kotlin/TidshendelseService.kt +++ b/apps/etterlatte-oppdater-behandling/src/main/kotlin/TidshendelseService.kt @@ -44,7 +44,7 @@ class TidshendelseService( } else { return when (hendelse.jobbtype) { JobbType.OMS_DOED_4MND, JobbType.OMS_DOED_10MND -> opprettAktivitetspliktOppgave(hendelse) - JobbType.OMS_DOED_6MND -> opprettRevurderingForAktivitetsplikt(hendelse) + JobbType.OMS_DOED_6MND, JobbType.OMS_DOED_12MND -> opprettRevurderingForAktivitetsplikt(hendelse) JobbType.OMS_DOED_6MND_INFORMASJON_VARIG_UNNTAK -> opprettOppgaveForAktivitetspliktVarigUnntak(hendelse) else -> throw IllegalArgumentException("Ingen håndtering for jobbtype: ${hendelse.jobbtype} for sak: ${hendelse.sakId}") } @@ -193,6 +193,7 @@ class TidshendelseService( JobbType.OMS_DOED_4MND -> false JobbType.OMS_DOED_6MND -> false JobbType.OMS_DOED_10MND -> false + JobbType.OMS_DOED_12MND -> false JobbType.OMS_DOED_6MND_INFORMASJON_VARIG_UNNTAK -> false JobbType.REGULERING, JobbType.FINN_SAKER_TIL_REGULERING, @@ -209,7 +210,7 @@ class TidshendelseService( JobbType.OMS_DOED_5AAR -> REVURDERING JobbType.OMS_DOED_4MND -> AKTIVITETSPLIKT JobbType.OMS_DOED_10MND -> AKTIVITETSPLIKT_12MND - JobbType.OMS_DOED_6MND -> AKTIVITETSPLIKT_REVURDERING + JobbType.OMS_DOED_6MND, JobbType.OMS_DOED_12MND -> AKTIVITETSPLIKT_REVURDERING JobbType.OMS_DOED_6MND_INFORMASJON_VARIG_UNNTAK -> AKTIVITETSPLIKT_INFORMASJON_VARIG_UNNTAK JobbType.REGULERING, JobbType.FINN_SAKER_TIL_REGULERING, diff --git a/apps/etterlatte-tidshendelser/src/main/kotlin/no/nav/etterlatte/tidshendelser/OmstillingsstoenadService.kt b/apps/etterlatte-tidshendelser/src/main/kotlin/no/nav/etterlatte/tidshendelser/OmstillingsstoenadService.kt index b3e6a876044..509da37a257 100644 --- a/apps/etterlatte-tidshendelser/src/main/kotlin/no/nav/etterlatte/tidshendelser/OmstillingsstoenadService.kt +++ b/apps/etterlatte-tidshendelser/src/main/kotlin/no/nav/etterlatte/tidshendelser/OmstillingsstoenadService.kt @@ -25,6 +25,7 @@ class OmstillingsstoenadService( JobbType.OMS_DOED_4MND -> 4 JobbType.OMS_DOED_6MND -> 6 JobbType.OMS_DOED_10MND -> 10 + JobbType.OMS_DOED_12MND -> 12 JobbType.OMS_DOED_6MND_INFORMASJON_VARIG_UNNTAK -> 6 else -> throw IllegalArgumentException("Ikke-støttet jobbtype: ${jobb.type}") } diff --git a/apps/etterlatte-tidshendelser/src/main/kotlin/no/nav/etterlatte/tidshendelser/OpprettJobberJobb.kt b/apps/etterlatte-tidshendelser/src/main/kotlin/no/nav/etterlatte/tidshendelser/OpprettJobberJobb.kt index b3fe450926d..91d5e517e9f 100644 --- a/apps/etterlatte-tidshendelser/src/main/kotlin/no/nav/etterlatte/tidshendelser/OpprettJobberJobb.kt +++ b/apps/etterlatte-tidshendelser/src/main/kotlin/no/nav/etterlatte/tidshendelser/OpprettJobberJobb.kt @@ -42,13 +42,20 @@ class OpprettJobb( val nesteMaaned = YearMonth.now().plusMonths(1) logger.info("Sjekker for jobber å legge til for måned: $nesteMaaned") val kjoeringerNesteMaaned = hendelseDao.finnJobberMedKjoeringForMaaned(nesteMaaned) - FasteJobber.entries.forEach { fasteJobber -> - if (kjoeringerNesteMaaned.none { fasteJobber.jobbType == it.type }) { - hendelseDao.opprettJobb(fasteJobber, nesteMaaned) - } + + fjernDuplikateKjoeringerFraFasteJobber(kjoeringerNesteMaaned).forEach { fasteJobber -> + hendelseDao.opprettJobb(fasteJobber, nesteMaaned) } } + private fun fjernDuplikateKjoeringerFraFasteJobber(kjoreringNesteMaaned: List) = + FasteJobber.entries.filter { fastJobb -> + kjoreringNesteMaaned.none { kjoringNesteMaaned -> + kjoringNesteMaaned.type == + fastJobb.jobbType + } + } + enum class FasteJobber( val jobbType: JobbType, val dagIMaaned: Int, @@ -57,5 +64,6 @@ class OpprettJobb( OMS_DOED_4MND(JobbType.OMS_DOED_4MND, 1, 0), OMS_DOED_6MND(JobbType.OMS_DOED_6MND, 1, 0), OMS_DOED_6MND_INFORMASJON_VARIG_UNNTAK(JobbType.OMS_DOED_6MND_INFORMASJON_VARIG_UNNTAK, 8, 0), + // TODO: EY-4519 legg inn når ferdigtestet OMS_DOED_12MND(JobbType.OMS_DOED_12MND, 1, 0), } } diff --git a/apps/etterlatte-tidshendelser/src/test/kotlin/no/nav/etterlatte/tidshendelser/OpprettJobberIntegrationTest.kt b/apps/etterlatte-tidshendelser/src/test/kotlin/no/nav/etterlatte/tidshendelser/OpprettJobberIntegrationTest.kt index 203f564dd3d..c98bfc6b274 100644 --- a/apps/etterlatte-tidshendelser/src/test/kotlin/no/nav/etterlatte/tidshendelser/OpprettJobberIntegrationTest.kt +++ b/apps/etterlatte-tidshendelser/src/test/kotlin/no/nav/etterlatte/tidshendelser/OpprettJobberIntegrationTest.kt @@ -3,6 +3,7 @@ package no.nav.etterlatte.tidshendelser import io.kotest.matchers.collections.shouldHaveSize import io.mockk.clearAllMocks import no.nav.etterlatte.libs.tidshendelser.JobbType +import no.nav.etterlatte.tidshendelser.OpprettJobb.FasteJobber import org.junit.jupiter.api.AfterEach import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test @@ -20,6 +21,7 @@ class OpprettJobberIntegrationTest( private val dbExtension = DatabaseExtension() } + private val nesteMaaned = YearMonth.now().plusMonths(1) private val hendelseDao = HendelseDao(dataSource) private val jobbTestdata = JobbTestdata(dataSource, hendelseDao) private val opprettJobb = OpprettJobb(hendelseDao) @@ -38,30 +40,30 @@ class OpprettJobberIntegrationTest( @Test fun `skal lage jobber om de ikke er laget fra før`() { opprettJobb.poll() - hendelseDao.finnJobberMedKjoeringForMaaned(YearMonth.now().plusMonths(1)) shouldHaveSize 3 + hendelseDao.finnJobberMedKjoeringForMaaned(nesteMaaned) shouldHaveSize FasteJobber.entries.size } @Test fun `skal ikke lage jobber om de er laget fra før`() { jobbTestdata.opprettJobb( JobbType.OMS_DOED_4MND, - YearMonth.now().plusMonths(1), - YearMonth.now().plusMonths(1).atDay(5), + nesteMaaned, + nesteMaaned.atDay(5), ) opprettJobb.poll() - hendelseDao.finnJobberMedKjoeringForMaaned(YearMonth.now().plusMonths(1)) shouldHaveSize 3 + hendelseDao.finnJobberMedKjoeringForMaaned(nesteMaaned) shouldHaveSize FasteJobber.entries.size } @Test fun `skal lage jobber om selv om det fins andre ikke faste jobber`() { jobbTestdata.opprettJobb( JobbType.AO_BP20, - YearMonth.now().plusMonths(1), - YearMonth.now().plusMonths(1).atDay(5), + nesteMaaned, + nesteMaaned.atDay(5), ) opprettJobb.poll() - hendelseDao.finnJobberMedKjoeringForMaaned(YearMonth.now().plusMonths(1)) shouldHaveSize 4 + hendelseDao.finnJobberMedKjoeringForMaaned(nesteMaaned) shouldHaveSize FasteJobber.entries.size + 1 } } diff --git a/libs/etterlatte-oppgave-model/src/main/kotlin/oppgave/OppgaveIntern.kt b/libs/etterlatte-oppgave-model/src/main/kotlin/oppgave/OppgaveIntern.kt index 8cf6942779c..1cbebdcca1a 100644 --- a/libs/etterlatte-oppgave-model/src/main/kotlin/oppgave/OppgaveIntern.kt +++ b/libs/etterlatte-oppgave-model/src/main/kotlin/oppgave/OppgaveIntern.kt @@ -42,6 +42,8 @@ data class OppgaveIntern( fun erAttestering(): Boolean = status == Status.ATTESTERING + fun erFerdigstilt(): Boolean = status == Status.FERDIGSTILT + fun typeKanAttesteres() = type in listOf( diff --git a/libs/etterlatte-tidshendelser-model/src/main/kotlin/no/nav/etterlatte/libs/tidshendelser/Jobbtype.kt b/libs/etterlatte-tidshendelser-model/src/main/kotlin/no/nav/etterlatte/libs/tidshendelser/Jobbtype.kt index be85a2107d0..f07a839deb5 100644 --- a/libs/etterlatte-tidshendelser-model/src/main/kotlin/no/nav/etterlatte/libs/tidshendelser/Jobbtype.kt +++ b/libs/etterlatte-tidshendelser-model/src/main/kotlin/no/nav/etterlatte/libs/tidshendelser/Jobbtype.kt @@ -35,6 +35,11 @@ enum class JobbType( JobbKategori.OMS_DOEDSDATO, SakType.OMSTILLINGSSTOENAD, ), + OMS_DOED_12MND( + "Omstillingsstønad vurdering av aktivitetsplikt 6 mnd etter dødsdato", + JobbKategori.OMS_DOEDSDATO, + SakType.OMSTILLINGSSTOENAD, + ), OMS_DOED_6MND_INFORMASJON_VARIG_UNNTAK( "Omstillingsstønad informasjon om aktivitetsplikt ved 6 mnd etter dødsdato - varig unntak", JobbKategori.OMS_DOEDSDATO,