From d334e366c1e41c00a6e9b5f21228f76a17e2ad64 Mon Sep 17 00:00:00 2001 From: "Edem.Schaanning.Agbo" Date: Wed, 19 Nov 2025 12:24:49 +0100 Subject: [PATCH 1/4] =?UTF-8?q?Validerer=20i=20rest-endepunkt=20Tar=20ikke?= =?UTF-8?q?=20imot=20revurdering=20av=20inntektskontroll=20p=C3=A5=20fremt?= =?UTF-8?q?idige=20perioder?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../behandling/BehandlingRestTjeneste.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/web/src/main/java/no/nav/ung/sak/web/app/tjenester/behandling/BehandlingRestTjeneste.java b/web/src/main/java/no/nav/ung/sak/web/app/tjenester/behandling/BehandlingRestTjeneste.java index 830eb0f4cc..951fb9ca90 100644 --- a/web/src/main/java/no/nav/ung/sak/web/app/tjenester/behandling/BehandlingRestTjeneste.java +++ b/web/src/main/java/no/nav/ung/sak/web/app/tjenester/behandling/BehandlingRestTjeneste.java @@ -59,12 +59,14 @@ import no.nav.ung.sak.kontrakt.behandling.ReåpneBehandlingDto; import no.nav.ung.sak.kontrakt.behandling.SaksnummerDto; import no.nav.ung.sak.kontrakt.behandling.SettBehandlingPaVentDto; +import no.nav.ung.sak.typer.Periode; import no.nav.ung.sak.typer.Saksnummer; import no.nav.ung.sak.web.app.rest.Redirect; import no.nav.ung.sak.web.app.tjenester.behandling.aksjonspunkt.BehandlingsutredningApplikasjonTjeneste; import no.nav.ung.sak.web.server.abac.AbacAttributtSupplier; import java.net.URISyntaxException; +import java.time.LocalDate; import java.util.List; import java.util.Optional; import java.util.function.Function; @@ -355,9 +357,17 @@ public Response opprettNyBehandling(@Context HttpServletRequest request, if (BehandlingType.REVURDERING.getKode().equals(behandlingType.getKode())) { BehandlingÅrsakType behandlingÅrsakType = BehandlingÅrsakType.fraKode(dto.getBehandlingArsakType().getKode()); - if (behandlingÅrsakType == BehandlingÅrsakType.RE_KONTROLL_REGISTER_INNTEKT && dto.getPeriode() == null) { - throw new UnsupportedOperationException("Ikke implementert støtte for å opprette revurdering for inntektskontroll uten definert periode"); + if (behandlingÅrsakType == BehandlingÅrsakType.RE_KONTROLL_REGISTER_INNTEKT) { + if (dto.getPeriode() == null) { + throw new UnsupportedOperationException("Ikke implementert støtte for å opprette revurdering for inntektskontroll uten definert periode"); + } + if (dto.getPeriode().getTom().isAfter(LocalDate.now())){ + throw new IllegalArgumentException("Kan ikke opprette revurdering av inntektskontroll for periode som helt eller delivs er i fremtiden"); + } } + // Hvis perioden overlapper med framtidige datoer så kast feil + // Vurder om det skal kastes feil hvis perioden overskrider siste kjørte inntekts kontroll + Behandling behandling = behandlingsoppretterTjeneste.opprettManuellRevurdering(fagsak, behandlingÅrsakType, dto.getPeriode() == null ? Optional.empty() : Optional.of(DatoIntervallEntitet.fra(dto.getPeriode()))); String gruppe = behandlingsprosessTjeneste.asynkStartBehandlingsprosess(behandling); return Redirect.tilBehandlingPollStatus(request, behandling.getUuid(), Optional.of(gruppe)); From dba52e34d73e8d2cb03721fed400715f24353adb Mon Sep 17 00:00:00 2001 From: "Edem.Schaanning.Agbo" Date: Thu, 20 Nov 2025 16:30:27 +0100 Subject: [PATCH 2/4] Validerer i BehandlingsoppretterTjeneste Fjerner validering i rest-endepunktet Tar ikke imot revurdering hvis det finnes gyldige perioder for revurdering og innkommende periode ikke matcher --- .../behandling/BehandlingRestTjeneste.java | 19 ++++++++----------- .../BehandlingsoppretterTjeneste.java | 12 ++++++++++++ 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/web/src/main/java/no/nav/ung/sak/web/app/tjenester/behandling/BehandlingRestTjeneste.java b/web/src/main/java/no/nav/ung/sak/web/app/tjenester/behandling/BehandlingRestTjeneste.java index 951fb9ca90..4567db916e 100644 --- a/web/src/main/java/no/nav/ung/sak/web/app/tjenester/behandling/BehandlingRestTjeneste.java +++ b/web/src/main/java/no/nav/ung/sak/web/app/tjenester/behandling/BehandlingRestTjeneste.java @@ -357,17 +357,14 @@ public Response opprettNyBehandling(@Context HttpServletRequest request, if (BehandlingType.REVURDERING.getKode().equals(behandlingType.getKode())) { BehandlingÅrsakType behandlingÅrsakType = BehandlingÅrsakType.fraKode(dto.getBehandlingArsakType().getKode()); - if (behandlingÅrsakType == BehandlingÅrsakType.RE_KONTROLL_REGISTER_INNTEKT) { - if (dto.getPeriode() == null) { - throw new UnsupportedOperationException("Ikke implementert støtte for å opprette revurdering for inntektskontroll uten definert periode"); - } - if (dto.getPeriode().getTom().isAfter(LocalDate.now())){ - throw new IllegalArgumentException("Kan ikke opprette revurdering av inntektskontroll for periode som helt eller delivs er i fremtiden"); - } - } - // Hvis perioden overlapper med framtidige datoer så kast feil - // Vurder om det skal kastes feil hvis perioden overskrider siste kjørte inntekts kontroll - +// if (behandlingÅrsakType == BehandlingÅrsakType.RE_KONTROLL_REGISTER_INNTEKT) { +// if (dto.getPeriode() == null) { +// throw new UnsupportedOperationException("Ikke implementert støtte for å opprette revurdering for inntektskontroll uten definert periode"); +// } +// if (dto.getPeriode().getTom().isAfter(LocalDate.now())){ +// throw new IllegalArgumentException("Kan ikke opprette revurdering av inntektskontroll for periode som helt eller delivs er i fremtiden"); +// } +// } Behandling behandling = behandlingsoppretterTjeneste.opprettManuellRevurdering(fagsak, behandlingÅrsakType, dto.getPeriode() == null ? Optional.empty() : Optional.of(DatoIntervallEntitet.fra(dto.getPeriode()))); String gruppe = behandlingsprosessTjeneste.asynkStartBehandlingsprosess(behandling); return Redirect.tilBehandlingPollStatus(request, behandling.getUuid(), Optional.of(gruppe)); diff --git a/web/src/main/java/no/nav/ung/sak/web/app/tjenester/behandling/BehandlingsoppretterTjeneste.java b/web/src/main/java/no/nav/ung/sak/web/app/tjenester/behandling/BehandlingsoppretterTjeneste.java index 428a2dd3a6..e2a6c72919 100644 --- a/web/src/main/java/no/nav/ung/sak/web/app/tjenester/behandling/BehandlingsoppretterTjeneste.java +++ b/web/src/main/java/no/nav/ung/sak/web/app/tjenester/behandling/BehandlingsoppretterTjeneste.java @@ -4,6 +4,7 @@ import jakarta.enterprise.inject.Any; import jakarta.enterprise.inject.Instance; import jakarta.inject.Inject; +import no.nav.fpsak.tidsserie.LocalDateTimeline; import no.nav.k9.felles.feil.Feil; import no.nav.k9.felles.feil.FeilFactory; import no.nav.k9.felles.feil.deklarasjon.DeklarerteFeil; @@ -83,6 +84,17 @@ private Behandling opprettRevurdering(Fagsak fagsak, BehandlingÅrsakType behand if (!kanRevurderingOpprettes) { throw BehandlingsoppretterTjeneste.BehandlingsoppretterTjenesteFeil.FACTORY.kanIkkeOppretteRevurdering(fagsak.getSaksnummer()).toException(); } + + var gyldigePerioderForRevurdering = finnGyldigeVurderingsperioderPrÅrsak(fagsak.getId()); + boolean skalSjekkeGyldighetAvPeriode = gyldigePerioderForRevurdering.stream().anyMatch(dto -> dto.årsak() == behandlingÅrsakType); + var periodenErVurdert = gyldigePerioderForRevurdering.stream().filter( + dto -> dto.årsak() == behandlingÅrsakType) + .anyMatch(dto -> dto.perioder().stream().anyMatch(p -> DatoIntervallEntitet.fra(p).equals(periode.get()))); + + if (skalSjekkeGyldighetAvPeriode && !periodenErVurdert){ + throw new UnsupportedOperationException("Perioden er ikke revurdert"); + } + var origBehandling = behandlingRepository.finnSisteAvsluttedeIkkeHenlagteYtelsebehandling(fagsak.getId()) .orElseThrow(() -> RevurderingFeil.FACTORY.tjenesteFinnerIkkeBehandlingForRevurdering(fagsak.getId()).toException()); From a44cf19a7758246a2e97676cf6c321a393f6630c Mon Sep 17 00:00:00 2001 From: "Edem.Schaanning.Agbo" Date: Fri, 21 Nov 2025 12:16:56 +0100 Subject: [PATCH 3/4] =?UTF-8?q?Godtar=20innkomende=20perioder=20s=C3=A5=20?= =?UTF-8?q?lenge=20de=20overlapper=20en=20tidligere=20kontrollert=20period?= =?UTF-8?q?e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fikser enhetstester --- .../behandling/BehandlingRestTjeneste.java | 9 ----- .../BehandlingsoppretterTjeneste.java | 36 ++++++++++++------- .../BehandlingsoppretterTjenesteTest.java | 12 +++++-- 3 files changed, 33 insertions(+), 24 deletions(-) diff --git a/web/src/main/java/no/nav/ung/sak/web/app/tjenester/behandling/BehandlingRestTjeneste.java b/web/src/main/java/no/nav/ung/sak/web/app/tjenester/behandling/BehandlingRestTjeneste.java index 4567db916e..84ee15c764 100644 --- a/web/src/main/java/no/nav/ung/sak/web/app/tjenester/behandling/BehandlingRestTjeneste.java +++ b/web/src/main/java/no/nav/ung/sak/web/app/tjenester/behandling/BehandlingRestTjeneste.java @@ -356,15 +356,6 @@ public Response opprettNyBehandling(@Context HttpServletRequest request, Fagsak fagsak = funnetFagsak.get(); if (BehandlingType.REVURDERING.getKode().equals(behandlingType.getKode())) { BehandlingÅrsakType behandlingÅrsakType = BehandlingÅrsakType.fraKode(dto.getBehandlingArsakType().getKode()); - -// if (behandlingÅrsakType == BehandlingÅrsakType.RE_KONTROLL_REGISTER_INNTEKT) { -// if (dto.getPeriode() == null) { -// throw new UnsupportedOperationException("Ikke implementert støtte for å opprette revurdering for inntektskontroll uten definert periode"); -// } -// if (dto.getPeriode().getTom().isAfter(LocalDate.now())){ -// throw new IllegalArgumentException("Kan ikke opprette revurdering av inntektskontroll for periode som helt eller delivs er i fremtiden"); -// } -// } Behandling behandling = behandlingsoppretterTjeneste.opprettManuellRevurdering(fagsak, behandlingÅrsakType, dto.getPeriode() == null ? Optional.empty() : Optional.of(DatoIntervallEntitet.fra(dto.getPeriode()))); String gruppe = behandlingsprosessTjeneste.asynkStartBehandlingsprosess(behandling); return Redirect.tilBehandlingPollStatus(request, behandling.getUuid(), Optional.of(gruppe)); diff --git a/web/src/main/java/no/nav/ung/sak/web/app/tjenester/behandling/BehandlingsoppretterTjeneste.java b/web/src/main/java/no/nav/ung/sak/web/app/tjenester/behandling/BehandlingsoppretterTjeneste.java index e2a6c72919..9f6547b43a 100644 --- a/web/src/main/java/no/nav/ung/sak/web/app/tjenester/behandling/BehandlingsoppretterTjeneste.java +++ b/web/src/main/java/no/nav/ung/sak/web/app/tjenester/behandling/BehandlingsoppretterTjeneste.java @@ -4,7 +4,6 @@ import jakarta.enterprise.inject.Any; import jakarta.enterprise.inject.Instance; import jakarta.inject.Inject; -import no.nav.fpsak.tidsserie.LocalDateTimeline; import no.nav.k9.felles.feil.Feil; import no.nav.k9.felles.feil.FeilFactory; import no.nav.k9.felles.feil.deklarasjon.DeklarerteFeil; @@ -26,13 +25,15 @@ import no.nav.ung.sak.behandlingslager.behandling.repository.BehandlingRepositoryProvider; import no.nav.ung.sak.behandlingslager.fagsak.Fagsak; import no.nav.ung.sak.domene.typer.tid.DatoIntervallEntitet; -import no.nav.ung.sak.kontrakt.behandling.ÅrsakOgPerioderDto; import no.nav.ung.sak.klage.domenetjenester.KlageVurderingTjeneste; +import no.nav.ung.sak.kontrakt.behandling.ÅrsakOgPerioderDto; import no.nav.ung.sak.produksjonsstyring.behandlingenhet.BehandlendeEnhetTjeneste; import no.nav.ung.sak.typer.Saksnummer; import java.time.LocalDate; -import java.util.*; +import java.util.List; +import java.util.Objects; +import java.util.Optional; import static no.nav.k9.felles.feil.LogLevel.INFO; @@ -84,15 +85,8 @@ private Behandling opprettRevurdering(Fagsak fagsak, BehandlingÅrsakType behand if (!kanRevurderingOpprettes) { throw BehandlingsoppretterTjeneste.BehandlingsoppretterTjenesteFeil.FACTORY.kanIkkeOppretteRevurdering(fagsak.getSaksnummer()).toException(); } - - var gyldigePerioderForRevurdering = finnGyldigeVurderingsperioderPrÅrsak(fagsak.getId()); - boolean skalSjekkeGyldighetAvPeriode = gyldigePerioderForRevurdering.stream().anyMatch(dto -> dto.årsak() == behandlingÅrsakType); - var periodenErVurdert = gyldigePerioderForRevurdering.stream().filter( - dto -> dto.årsak() == behandlingÅrsakType) - .anyMatch(dto -> dto.perioder().stream().anyMatch(p -> DatoIntervallEntitet.fra(p).equals(periode.get()))); - - if (skalSjekkeGyldighetAvPeriode && !periodenErVurdert){ - throw new UnsupportedOperationException("Perioden er ikke revurdert"); + if (!periodeKanRevurderesForÅrsak(fagsak, behandlingÅrsakType, periode)) { + throw new IllegalArgumentException("Perioden er ikke tidligere kontrollert"); } var origBehandling = behandlingRepository.finnSisteAvsluttedeIkkeHenlagteYtelsebehandling(fagsak.getId()) @@ -127,7 +121,7 @@ private Behandling opprettBehandling(Fagsak fagsak, BehandlingType behandlingTyp } beh.setBehandlingstidFrist(LocalDate.now().plusWeeks(behandlingType.getBehandlingstidFristUker())); beh.setBehandlendeEnhet(enhet); - }); + }); } public boolean kanOppretteNyBehandlingAvType(Long fagsakId, BehandlingType type) { @@ -184,4 +178,20 @@ public void opprettHistorikkinnslag(Behandling behandling, boolean manueltOppret historikkinnslagRepository.lagre(historikkBuilder.build()); } + + private boolean periodeKanRevurderesForÅrsak(Fagsak fagsak, BehandlingÅrsakType behandlingÅrsakType, Optional periode) { + var gyldigePerioderForRevurderingPrÅrsak = finnGyldigeVurderingsperioderPrÅrsak(fagsak.getId()); + boolean skalSjekkeGyldighetAvPeriode = gyldigePerioderForRevurderingPrÅrsak.stream().anyMatch(dto -> dto.årsak() == behandlingÅrsakType); + if (!skalSjekkeGyldighetAvPeriode) { + return true; + } + if (periode.isEmpty()) { + return false; + } + return gyldigePerioderForRevurderingPrÅrsak.stream().filter( + dto -> dto.årsak() == behandlingÅrsakType).flatMap(dto -> dto.perioder().stream()) + .map(DatoIntervallEntitet::fra) + .anyMatch(periode.get()::equals); + } + } diff --git a/web/src/test/java/no/nav/ung/sak/web/app/tjenester/behandling/BehandlingsoppretterTjenesteTest.java b/web/src/test/java/no/nav/ung/sak/web/app/tjenester/behandling/BehandlingsoppretterTjenesteTest.java index ebf5ad8a64..eff7cdf5a0 100644 --- a/web/src/test/java/no/nav/ung/sak/web/app/tjenester/behandling/BehandlingsoppretterTjenesteTest.java +++ b/web/src/test/java/no/nav/ung/sak/web/app/tjenester/behandling/BehandlingsoppretterTjenesteTest.java @@ -16,7 +16,9 @@ import no.nav.ung.sak.behandlingslager.fagsak.Fagsak; import no.nav.ung.sak.behandlingslager.tilkjentytelse.TilkjentYtelseRepository; import no.nav.ung.sak.db.util.JpaExtension; +import no.nav.ung.sak.domene.typer.tid.DatoIntervallEntitet; import no.nav.ung.sak.klage.domenetjenester.KlageVurderingTjeneste; +import no.nav.ung.sak.kontrakt.behandling.ÅrsakOgPerioderDto; import no.nav.ung.sak.produksjonsstyring.behandlingenhet.BehandlendeEnhetTjeneste; import no.nav.ung.sak.test.util.UnitTestLookupInstanceImpl; import no.nav.ung.sak.test.util.behandling.TestScenarioBuilder; @@ -29,11 +31,14 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mockito; +import java.util.List; import java.util.Optional; import java.util.Set; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @ExtendWith(CdiAwareExtension.class) @@ -73,6 +78,7 @@ class BehandlingsoppretterTjenesteTest { private Behandling behandling; private BehandlendeEnhetTjeneste behandlendeEnhetTjeneste; + private GyldigePerioderForRevurderingAvInntektskontrollPrÅrsakUtleder gyldigePerioderForRevurderingUtleder = mock(GyldigePerioderForRevurderingAvInntektskontrollPrÅrsakUtleder.class); @BeforeEach @@ -80,13 +86,15 @@ void setUp() { opprettRevurderingsKandidat(); behandlendeEnhetTjeneste = Mockito.mock(BehandlendeEnhetTjeneste.class); when(behandlendeEnhetTjeneste.finnBehandlendeEnhetFor(any())).thenReturn(new OrganisasjonsEnhet("1234", "Nav Test")); - behandlingsoppretterTjeneste = new BehandlingsoppretterTjeneste(repositoryProvider, behandlendeEnhetTjeneste, new UnitTestLookupInstanceImpl<>(new GyldigePerioderForRevurderingAvInntektskontrollPrÅrsakUtleder(tilkjentYtelseRepository, behandlingRepository)), behandlingskontrollTjeneste, klageVurderingTjeneste, personopplysningRepository, historikkinnslagRepository); + when(gyldigePerioderForRevurderingUtleder.utledPerioder(anyLong())).thenReturn(new ÅrsakOgPerioderDto(BehandlingÅrsakType.RE_KONTROLL_REGISTER_INNTEKT, List.of())); + behandlingsoppretterTjeneste = new BehandlingsoppretterTjeneste(repositoryProvider, behandlendeEnhetTjeneste, new UnitTestLookupInstanceImpl<>(gyldigePerioderForRevurderingUtleder), behandlingskontrollTjeneste, klageVurderingTjeneste, personopplysningRepository, historikkinnslagRepository); } @Test void skalOppretteProsesstriggerNårPeriodeErOppgitt() { Fagsak fagsak = behandling.getFagsak(); var periode = behandling.getFagsak().getPeriode(); + when(gyldigePerioderForRevurderingUtleder.utledPerioder(anyLong())).thenReturn(new ÅrsakOgPerioderDto(BehandlingÅrsakType.RE_KONTROLL_REGISTER_INNTEKT, List.of(periode.tilPeriode()))); var revurdering = behandlingsoppretterTjeneste.opprettManuellRevurdering(fagsak, BehandlingÅrsakType.RE_KONTROLL_REGISTER_INNTEKT, Optional.of(periode)); assertTrue(revurdering.erRevurdering()); @@ -101,7 +109,7 @@ void setUp() { @Test void skalOppretteProsesstriggerNårPeriodeIkkeErOppgitt() { Fagsak fagsak = behandling.getFagsak(); - var revurdering = behandlingsoppretterTjeneste.opprettManuellRevurdering(fagsak, BehandlingÅrsakType.RE_KONTROLL_REGISTER_INNTEKT, Optional.empty()); + var revurdering = behandlingsoppretterTjeneste.opprettManuellRevurdering(fagsak, BehandlingÅrsakType.RE_SATS_ENDRING, Optional.empty()); assertTrue(revurdering.erRevurdering()); Optional prosessTriggere = prosessTriggereRepository.hentGrunnlag(revurdering.getId()); From 3fc984bbedcefe884d168a3d4eb708c86a9695fa Mon Sep 17 00:00:00 2001 From: "Edem.Schaanning.Agbo" Date: Fri, 21 Nov 2025 12:19:13 +0100 Subject: [PATCH 4/4] Kommentar --- .../app/tjenester/behandling/BehandlingsoppretterTjeneste.java | 1 + 1 file changed, 1 insertion(+) diff --git a/web/src/main/java/no/nav/ung/sak/web/app/tjenester/behandling/BehandlingsoppretterTjeneste.java b/web/src/main/java/no/nav/ung/sak/web/app/tjenester/behandling/BehandlingsoppretterTjeneste.java index 9f6547b43a..31c27c4151 100644 --- a/web/src/main/java/no/nav/ung/sak/web/app/tjenester/behandling/BehandlingsoppretterTjeneste.java +++ b/web/src/main/java/no/nav/ung/sak/web/app/tjenester/behandling/BehandlingsoppretterTjeneste.java @@ -182,6 +182,7 @@ public void opprettHistorikkinnslag(Behandling behandling, boolean manueltOppret private boolean periodeKanRevurderesForÅrsak(Fagsak fagsak, BehandlingÅrsakType behandlingÅrsakType, Optional periode) { var gyldigePerioderForRevurderingPrÅrsak = finnGyldigeVurderingsperioderPrÅrsak(fagsak.getId()); boolean skalSjekkeGyldighetAvPeriode = gyldigePerioderForRevurderingPrÅrsak.stream().anyMatch(dto -> dto.årsak() == behandlingÅrsakType); + //Dersom det ikke er utledet gyldige perioder for årsak så aksepteres alle perioder, også ingen periode. if (!skalSjekkeGyldighetAvPeriode) { return true; }