diff --git a/database/src/main/kotlin/no/nav/su/se/bakover/database/sak/SakPostgresRepo.kt b/database/src/main/kotlin/no/nav/su/se/bakover/database/sak/SakPostgresRepo.kt index 1b6f57edfe..32cf49ef21 100644 --- a/database/src/main/kotlin/no/nav/su/se/bakover/database/sak/SakPostgresRepo.kt +++ b/database/src/main/kotlin/no/nav/su/se/bakover/database/sak/SakPostgresRepo.kt @@ -234,6 +234,22 @@ internal class SakPostgresRepo( } } + override fun hentSakInfo(fnr: Fnr): SakInfo? { + return dbMetrics.timeQuery("hentSakInfoForFnr") { + sessionFactory.withSession { session -> + """ + SELECT + id, saksnummer, fnr, type + FROM sak + WHERE fnr = :fnr + """.trimIndent().hent( + mapOf("fnr" to fnr), + session, + ) { row -> row.toSakInfo() } + } + } + } + private fun Row.toSakInfo(): SakInfo { return SakInfo( sakId = uuid("id"), diff --git a/database/src/test/kotlin/no/nav/su/se/bakover/database/sak/SakPostgresRepoTest.kt b/database/src/test/kotlin/no/nav/su/se/bakover/database/sak/SakPostgresRepoTest.kt index 24ef240ff3..02ecff6d05 100644 --- a/database/src/test/kotlin/no/nav/su/se/bakover/database/sak/SakPostgresRepoTest.kt +++ b/database/src/test/kotlin/no/nav/su/se/bakover/database/sak/SakPostgresRepoTest.kt @@ -126,6 +126,21 @@ internal class SakPostgresRepoTest { } } + @Test + fun `henter sakinfo for et gitt fnr`() { + withMigratedDb { dataSource -> + val testDataHelper = TestDataHelper(dataSource) + val repo = testDataHelper.sakRepo + val (sak) = testDataHelper.persisterSøknadsbehandlingIverksatt() + val hentetSakInfo = repo.hentSakInfo(sak.fnr) + + hentetSakInfo?.fnr shouldBe sak.fnr + hentetSakInfo?.sakId shouldBe sak.id + hentetSakInfo?.saksnummer shouldBe sak.saksnummer + hentetSakInfo?.type shouldBe sak.type + } + } + @Test fun `Henter alle restanser for alle saker`() { withMigratedDb { dataSource -> diff --git a/domain/src/main/kotlin/no/nav/su/se/bakover/domain/sak/SakRepo.kt b/domain/src/main/kotlin/no/nav/su/se/bakover/domain/sak/SakRepo.kt index 0d88aa3b90..d722f4f2a1 100644 --- a/domain/src/main/kotlin/no/nav/su/se/bakover/domain/sak/SakRepo.kt +++ b/domain/src/main/kotlin/no/nav/su/se/bakover/domain/sak/SakRepo.kt @@ -24,6 +24,7 @@ interface SakRepo { fun hentSak(hendelseId: HendelseId): Sak? fun hentSakInfoForIdenter(personidenter: NonEmptyList): SakInfo? fun hentSakInfo(sakId: UUID): SakInfo? + fun hentSakInfo(fnr: Fnr): SakInfo? fun opprettSak(sak: NySak) fun hentÅpneBehandlinger(): List fun hentFerdigeBehandlinger(): List diff --git a/domain/src/main/kotlin/no/nav/su/se/bakover/domain/sak/SakService.kt b/domain/src/main/kotlin/no/nav/su/se/bakover/domain/sak/SakService.kt index acda682ee1..c9e8f28bda 100644 --- a/domain/src/main/kotlin/no/nav/su/se/bakover/domain/sak/SakService.kt +++ b/domain/src/main/kotlin/no/nav/su/se/bakover/domain/sak/SakService.kt @@ -75,6 +75,7 @@ interface SakService { fun oppdaterFødselsnummer(command: OppdaterFødselsnummerPåSakCommand): Either fun hentSakIdSaksnummerOgFnrForAlleSaker(): List + fun hentEpsSaksIderForBrukersSak(sakId: UUID): List } data object FantIkkeSak diff --git a/service/src/main/kotlin/no/nav/su/se/bakover/service/sak/SakServiceImpl.kt b/service/src/main/kotlin/no/nav/su/se/bakover/service/sak/SakServiceImpl.kt index 73165e0362..512e061737 100644 --- a/service/src/main/kotlin/no/nav/su/se/bakover/service/sak/SakServiceImpl.kt +++ b/service/src/main/kotlin/no/nav/su/se/bakover/service/sak/SakServiceImpl.kt @@ -256,6 +256,12 @@ class SakServiceImpl( return sakRepo.hentSakIdSaksnummerOgFnrForAlleSaker() } + override fun hentEpsSaksIderForBrukersSak(sakId: UUID): List { + val sak = sakRepo.hentSak(sakId) ?: throw IllegalArgumentException("Fant ikke sak med id $sakId") + val fnrs = sak.vedtakstidslinje()?.flatMap { it.grunnlagsdata.eps } ?: emptyList() + return fnrs.mapNotNull { sakRepo.hentSakInfo(it)?.sakId } + } + private fun sakTilBegrensetSakInfo(sak: Sak?): BegrensetSakinfo { if (sak == null) { return BegrensetSakinfo(false, null) diff --git a/service/src/test/kotlin/no/nav/su/se/bakover/service/sak/SakServiceImplTest.kt b/service/src/test/kotlin/no/nav/su/se/bakover/service/sak/SakServiceImplTest.kt index b2f944e0a0..273ed9579b 100644 --- a/service/src/test/kotlin/no/nav/su/se/bakover/service/sak/SakServiceImplTest.kt +++ b/service/src/test/kotlin/no/nav/su/se/bakover/service/sak/SakServiceImplTest.kt @@ -17,6 +17,7 @@ import no.nav.su.se.bakover.common.domain.sak.Behandlingssammendrag import no.nav.su.se.bakover.common.domain.sak.SakInfo import no.nav.su.se.bakover.common.ident.NavIdentBruker import no.nav.su.se.bakover.common.journal.JournalpostId +import no.nav.su.se.bakover.common.person.Fnr import no.nav.su.se.bakover.common.tid.periode.år import no.nav.su.se.bakover.domain.Sak import no.nav.su.se.bakover.domain.brev.command.FritekstDokumentCommand @@ -29,7 +30,10 @@ import no.nav.su.se.bakover.test.argThat import no.nav.su.se.bakover.test.dokumentUtenMetadataInformasjonAnnet import no.nav.su.se.bakover.test.fixedClock import no.nav.su.se.bakover.test.fixedTidspunkt +import no.nav.su.se.bakover.test.fullstendigMedEPSUnder67UførFlyktning +import no.nav.su.se.bakover.test.generer import no.nav.su.se.bakover.test.getOrFail +import no.nav.su.se.bakover.test.iverksattSøknadsbehandling import no.nav.su.se.bakover.test.nySøknadsbehandlingMedStønadsperiode import no.nav.su.se.bakover.test.opprettetRevurdering import no.nav.su.se.bakover.test.revurderingTilAttestering @@ -40,6 +44,7 @@ import no.nav.su.se.bakover.test.søknad.nySakMedjournalførtSøknadOgOppgave import no.nav.su.se.bakover.test.søknadsbehandlingTilAttesteringInnvilget import no.nav.su.se.bakover.test.søknadsbehandlingUnderkjentInnvilget import no.nav.su.se.bakover.test.tikkendeFixedClock +import no.nav.su.se.bakover.test.vilkår.formuevilkårMedEps0Innvilget import org.junit.jupiter.api.Test import org.junit.jupiter.api.assertThrows import org.mockito.kotlin.any @@ -417,7 +422,7 @@ internal class SakServiceImplTest { SakServiceImpl(sakRepo, fixedClock, mock(), mock(), queryJournalpostClient, mock()) .hentAlleJournalposter(sak.id).shouldBeRight() - verify(sakRepo).hentSakInfo(argThat { it shouldBe sak.id }) + verify(sakRepo).hentSakInfo(argThat { it shouldBe sak.id }) verify(queryJournalpostClient).hentJournalposterFor(argThat { it shouldBe sak.saksnummer }, eq(50)) } @@ -432,6 +437,27 @@ internal class SakServiceImplTest { SakServiceImpl(sakRepo, fixedClock, mock(), mock(), mock(), mock()) .hentAlleJournalposter(sak.id) } - verify(sakRepo).hentSakInfo(argThat { it shouldBe sak.id }) + verify(sakRepo).hentSakInfo(argThat { it shouldBe sak.id }) + } + + @Test + fun `henter saksIder for eps`() { + val (epsSak) = nySakMedjournalførtSøknadOgOppgave(sakId = UUID.randomUUID(), fnr = Fnr.generer()) + val brukersSak = iverksattSøknadsbehandling( + customVilkår = listOf(formuevilkårMedEps0Innvilget(epsFnr = epsSak.fnr)), + customGrunnlag = listOf(fullstendigMedEPSUnder67UførFlyktning(fnr = epsSak.fnr)), + ).first + val sakRepo: SakRepo = mock { + on { hentSak(any()) } doReturn brukersSak + on { hentSakInfo(any()) } doReturn epsSak.info() + } + SakServiceImpl( + sakRepo, + fixedClock, + mock(), + mock(), + mock(), + mock(), + ).hentEpsSaksIderForBrukersSak(brukersSak.id) shouldBe listOf(epsSak.id) } } diff --git a/test-common/src/main/kotlin/BosituasjonTestData.kt b/test-common/src/main/kotlin/BosituasjonTestData.kt index f67b3b04b0..6facbc5a29 100644 --- a/test-common/src/main/kotlin/BosituasjonTestData.kt +++ b/test-common/src/main/kotlin/BosituasjonTestData.kt @@ -41,12 +41,13 @@ fun fullstendigMedEPSUnder67UførFlyktning( id: UUID = UUID.randomUUID(), opprettet: Tidspunkt = fixedTidspunkt, periode: Periode = stønadsperiode2021.periode, + fnr: Fnr = Fnr.generer(), ): Bosituasjon.Fullstendig.EktefellePartnerSamboer.Under67.UførFlyktning = Bosituasjon.Fullstendig.EktefellePartnerSamboer.Under67.UførFlyktning( id = id, opprettet = opprettet, periode = periode, - fnr = Fnr.generer(), + fnr = fnr, ) fun fullstendigMedEPSUnder67IkkeUførFlyktning( diff --git "a/test-common/src/main/kotlin/vilk\303\245r/FormueVilk\303\245rTestData.kt" "b/test-common/src/main/kotlin/vilk\303\245r/FormueVilk\303\245rTestData.kt" index 43f762e015..b49b6a4bce 100644 --- "a/test-common/src/main/kotlin/vilk\303\245r/FormueVilk\303\245rTestData.kt" +++ "b/test-common/src/main/kotlin/vilk\303\245r/FormueVilk\303\245rTestData.kt" @@ -2,6 +2,7 @@ package no.nav.su.se.bakover.test.vilkår import arrow.core.NonEmptyList import arrow.core.nonEmptyListOf +import no.nav.su.se.bakover.common.person.Fnr import no.nav.su.se.bakover.common.tid.Tidspunkt import no.nav.su.se.bakover.common.tid.periode.Periode import no.nav.su.se.bakover.common.tid.periode.år @@ -9,7 +10,6 @@ import no.nav.su.se.bakover.test.bosituasjongrunnlagEnslig import no.nav.su.se.bakover.test.create import no.nav.su.se.bakover.test.createFromGrunnlag import no.nav.su.se.bakover.test.empty -import no.nav.su.se.bakover.test.epsFnr import no.nav.su.se.bakover.test.fixedTidspunkt import no.nav.su.se.bakover.test.formuegrenserFactoryTestPåDato import no.nav.su.se.bakover.test.grunnlag.formueGrunnlagMedEps0Innvilget @@ -66,6 +66,7 @@ fun formuevilkårUtenEps0Innvilget( fun formuevilkårMedEps0Innvilget( opprettet: Tidspunkt = fixedTidspunkt, periode: Periode = år(2021), + epsFnr: Fnr = no.nav.su.se.bakover.test.epsFnr, bosituasjon: NonEmptyList = nonEmptyListOf( Bosituasjon.Fullstendig.EktefellePartnerSamboer.Under67.UførFlyktning( id = UUID.randomUUID(), diff --git "a/vilk\303\245r/institusjonsopphold/application/src/test/kotlin/no/nav/su/se/bakover/institusjonsopphold/application/service/OpprettOppgaverForInstitusjonsoppholdshendelserTest.kt" "b/vilk\303\245r/institusjonsopphold/application/src/test/kotlin/no/nav/su/se/bakover/institusjonsopphold/application/service/OpprettOppgaverForInstitusjonsoppholdshendelserTest.kt" index 2f268312b1..8f4062d1bf 100644 --- "a/vilk\303\245r/institusjonsopphold/application/src/test/kotlin/no/nav/su/se/bakover/institusjonsopphold/application/service/OpprettOppgaverForInstitusjonsoppholdshendelserTest.kt" +++ "b/vilk\303\245r/institusjonsopphold/application/src/test/kotlin/no/nav/su/se/bakover/institusjonsopphold/application/service/OpprettOppgaverForInstitusjonsoppholdshendelserTest.kt" @@ -87,7 +87,7 @@ class OpprettOppgaverForInstitusjonsoppholdshendelserTest { ) verify(oppgaveHendelseRepo).hentForSak(argThat { it shouldBe sak.id }, anyOrNull()) verify(institusjonsoppholdHendelseRepo).hentForSak(argThat { it shouldBe sak.id }) - verify(sakRepo).hentSakInfo(argThat { it shouldBe sak.id }) + verify(sakRepo).hentSakInfo(argThat { it shouldBe sak.id }) testMocks.verifyNoMoreInteractions() } @@ -136,7 +136,7 @@ class OpprettOppgaverForInstitusjonsoppholdshendelserTest { ) verify(oppgaveHendelseRepo).hentForSak(argThat { it shouldBe sak.id }, anyOrNull()) verify(institusjonsoppholdHendelseRepo).hentForSak(argThat { it shouldBe sak.id }) - verify(sakRepo).hentSakInfo(argThat { it shouldBe sak.id }) + verify(sakRepo).hentSakInfo(argThat { it shouldBe sak.id }) verify(oppgaveService).opprettOppgaveMedSystembruker( argThat { diff --git "a/vilk\303\245r/vurderinger/domain/src/main/kotlin/vilk\303\245r/vurderinger/domain/Grunnlagsdata.kt" "b/vilk\303\245r/vurderinger/domain/src/main/kotlin/vilk\303\245r/vurderinger/domain/Grunnlagsdata.kt" index 33232425ed..b8618e508c 100644 --- "a/vilk\303\245r/vurderinger/domain/src/main/kotlin/vilk\303\245r/vurderinger/domain/Grunnlagsdata.kt" +++ "b/vilk\303\245r/vurderinger/domain/src/main/kotlin/vilk\303\245r/vurderinger/domain/Grunnlagsdata.kt" @@ -34,6 +34,9 @@ data class Grunnlagsdata private constructor( val fradragsgrunnlag: List, val bosituasjon: List, ) { + /** + * Distincte fnr for eps i bosituasjonen. + */ val eps: List = bosituasjon.mapNotNull { it.eps }.distinct().sortedBy { it.toString() } /** diff --git a/web/src/main/kotlin/no/nav/su/se/bakover/web/routes/sak/SakRoutes.kt b/web/src/main/kotlin/no/nav/su/se/bakover/web/routes/sak/SakRoutes.kt index d32a5db5d5..5603c7642e 100644 --- a/web/src/main/kotlin/no/nav/su/se/bakover/web/routes/sak/SakRoutes.kt +++ b/web/src/main/kotlin/no/nav/su/se/bakover/web/routes/sak/SakRoutes.kt @@ -328,6 +328,15 @@ internal fun Route.sakRoutes( } } } + + get("$SAK_PATH/{sakId}/epsSak") { + authorize(Brukerrolle.Saksbehandler, Brukerrolle.Attestant) { + call.withSakId { + val sakIder = sakService.hentEpsSaksIderForBrukersSak(it) + call.svar(Resultat.json(OK, serialize(sakIder))) + } + } + } } fun KunneIkkeOppretteDokument.tilResultat(): Resultat = when (this) { diff --git a/web/src/main/kotlin/no/nav/su/se/bakover/web/services/AccessCheckProxy.kt b/web/src/main/kotlin/no/nav/su/se/bakover/web/services/AccessCheckProxy.kt index 9c66addd47..bc3c390b21 100644 --- a/web/src/main/kotlin/no/nav/su/se/bakover/web/services/AccessCheckProxy.kt +++ b/web/src/main/kotlin/no/nav/su/se/bakover/web/services/AccessCheckProxy.kt @@ -418,6 +418,10 @@ open class AccessCheckProxy( } override fun hentSakIdSaksnummerOgFnrForAlleSaker() = kastKanKunKallesFraAnnenService() + override fun hentEpsSaksIderForBrukersSak(sakId: UUID): List { + assertHarTilgangTilSak(sakId) + return services.sak.hentEpsSaksIderForBrukersSak(sakId) + } override fun opprettSak(sak: NySak) { assertHarTilgangTilPerson(sak.fnr)