Skip to content

Commit 357eaae

Browse files
authored
Merge pull request #1701 from navikt/gjeldende-vedtaksdata-for-tidligere-periode
hent ut gjeldende vedtaksinformasjon for tidligere søknadsbehandlingsperioden
2 parents a786a97 + 1f0e6d8 commit 357eaae

File tree

8 files changed

+232
-0
lines changed

8 files changed

+232
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package no.nav.su.se.bakover.domain.søknadsbehandling
2+
3+
sealed interface FeilVedHentingAvGjeldendeVedtaksdataForPeriode {
4+
data object GjeldendeVedtaksdataFinnesIkke : FeilVedHentingAvGjeldendeVedtaksdataForPeriode
5+
}

domain/src/main/kotlin/no/nav/su/se/bakover/domain/søknadsbehandling/SøknadsbehandlingService.kt

+13
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import no.nav.su.se.bakover.common.domain.attestering.Attestering
88
import no.nav.su.se.bakover.common.ident.NavIdentBruker
99
import no.nav.su.se.bakover.common.persistence.TransactionContext
1010
import no.nav.su.se.bakover.common.person.Fnr
11+
import no.nav.su.se.bakover.common.tid.periode.Periode
1112
import no.nav.su.se.bakover.domain.Sak
1213
import no.nav.su.se.bakover.domain.grunnlag.fradrag.LeggTilFradragsgrunnlagRequest
1314
import no.nav.su.se.bakover.domain.revurdering.vilkår.bosituasjon.KunneIkkeLeggeTilBosituasjongrunnlag
@@ -38,6 +39,7 @@ import no.nav.su.se.bakover.domain.vilkår.pensjon.LeggTilPensjonsVilkårRequest
3839
import no.nav.su.se.bakover.domain.vilkår.uføre.LeggTilUførevurderingerRequest
3940
import no.nav.su.se.bakover.domain.vilkår.utenlandsopphold.LeggTilFlereUtenlandsoppholdRequest
4041
import vilkår.familiegjenforening.domain.UgyldigFamiliegjenforeningVilkår
42+
import vilkår.vurderinger.domain.GrunnlagsdataOgVilkårsvurderinger
4143
import vilkår.vurderinger.domain.KunneIkkeLageGrunnlagsdata
4244
import java.util.UUID
4345
import kotlin.reflect.KClass
@@ -131,6 +133,17 @@ interface SøknadsbehandlingService {
131133

132134
fun lagre(søknadsbehandling: Søknadsbehandling)
133135

136+
/**
137+
* Henter gjeldende vedtaksdata for perioden som er før perioden som settes for denne søknadsbehandlingen.
138+
*
139+
* Eksempel: Hvis vi har et vedtak for ny periode (01.2021 - 12.2021), og vi har fått en ny søknad for
140+
* perioden 01.2022 - 12.2022, så vil vi hente gjeldende vedtaksdata for perioden 01.2021 - 12.2021.
141+
*/
142+
fun gjeldendeVedtaksdataForTidligerePeriode(
143+
sakId: UUID,
144+
knadsbehandlingId: SøknadsbehandlingId,
145+
): Either<FeilVedHentingAvGjeldendeVedtaksdataForPeriode, Pair<Periode, GrunnlagsdataOgVilkårsvurderinger>>
146+
134147
data class OpprettRequest(
135148
valknadId: UUID,
136149
val sakId: UUID,

service/src/main/kotlin/no/nav/su/se/bakover/service/søknadsbehandling/SøknadsbehandlingServiceImpl.kt

+25
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import no.nav.su.se.bakover.common.persistence.SessionFactory
1212
import no.nav.su.se.bakover.common.persistence.TransactionContext
1313
import no.nav.su.se.bakover.common.person.Fnr
1414
import no.nav.su.se.bakover.common.sikkerLogg
15+
import no.nav.su.se.bakover.common.tid.periode.Periode
1516
import no.nav.su.se.bakover.domain.Sak
1617
import no.nav.su.se.bakover.domain.behandling.BehandlingMetrics
1718
import no.nav.su.se.bakover.domain.grunnlag.fradrag.LeggTilFradragsgrunnlagRequest
@@ -26,6 +27,7 @@ import no.nav.su.se.bakover.domain.statistikk.StatistikkEvent
2627
import no.nav.su.se.bakover.domain.statistikk.StatistikkEventObserver
2728
import no.nav.su.se.bakover.domain.statistikk.notify
2829
import no.nav.su.se.bakover.domain.søknadsbehandling.BeregnetSøknadsbehandling
30+
import no.nav.su.se.bakover.domain.søknadsbehandling.FeilVedHentingAvGjeldendeVedtaksdataForPeriode
2931
import no.nav.su.se.bakover.domain.søknadsbehandling.KanBeregnes
3032
import no.nav.su.se.bakover.domain.søknadsbehandling.KanOppdatereFradragsgrunnlag
3133
import no.nav.su.se.bakover.domain.søknadsbehandling.KanOppdaterePeriodeBosituasjonVilkår
@@ -67,6 +69,7 @@ import no.nav.su.se.bakover.domain.søknadsbehandling.stønadsperiode.oppdaterSt
6769
import no.nav.su.se.bakover.domain.søknadsbehandling.tilAttestering.KunneIkkeSendeSøknadsbehandlingTilAttestering
6870
import no.nav.su.se.bakover.domain.søknadsbehandling.underkjenn.KunneIkkeUnderkjenneSøknadsbehandling
6971
import no.nav.su.se.bakover.domain.søknadsbehandling.vilkår.KunneIkkeLeggeTilVilkår
72+
import no.nav.su.se.bakover.domain.vedtak.Stønadsvedtak
7073
import no.nav.su.se.bakover.domain.vilkår.familiegjenforening.LeggTilFamiliegjenforeningRequest
7174
import no.nav.su.se.bakover.domain.vilkår.fastopphold.KunneIkkeLeggeFastOppholdINorgeVilkår
7275
import no.nav.su.se.bakover.domain.vilkår.fastopphold.LeggTilFastOppholdINorgeRequest
@@ -96,6 +99,7 @@ import vilkår.formue.domain.FormuegrenserFactory
9699
import vilkår.skatt.application.SkatteService
97100
import vilkår.skatt.domain.Skattegrunnlag
98101
import vilkår.vurderinger.domain.EksterneGrunnlagSkatt
102+
import vilkår.vurderinger.domain.GrunnlagsdataOgVilkårsvurderinger
99103
import økonomi.domain.utbetaling.UtbetalingsinstruksjonForEtterbetalinger
100104
import java.time.Clock
101105
import java.util.UUID
@@ -726,6 +730,27 @@ class SøknadsbehandlingServiceImpl(
726730
søknadsbehandlingRepo.lagre(søknadsbehandling)
727731
}
728732

733+
override fun gjeldendeVedtaksdataForTidligerePeriode(
734+
sakId: UUID,
735+
knadsbehandlingId: SøknadsbehandlingId,
736+
): Either<FeilVedHentingAvGjeldendeVedtaksdataForPeriode, Pair<Periode, GrunnlagsdataOgVilkårsvurderinger>> {
737+
val sak = sakService.hentSak(sakId)
738+
.getOrElse { throw IllegalStateException("Fant ikke sak $sakId ved henting av gjeldende vedtaksdata for tidligere perioder") }
739+
740+
return sak.vedtakListe.filterIsInstance<Stønadsvedtak>().filter {
741+
it.behandling.id != søknadsbehandlingId
742+
}.maxByOrNull { it.opprettet.instant }?.let { tidligereStønadsvedtak ->
743+
sak.hentGjeldendeVedtaksdata(
744+
periode = tidligereStønadsvedtak.periode,
745+
clock = clock,
746+
).mapLeft {
747+
FeilVedHentingAvGjeldendeVedtaksdataForPeriode.GjeldendeVedtaksdataFinnesIkke
748+
}.map {
749+
tidligereStønadsvedtak.periode to it.grunnlagsdataOgVilkårsvurderinger
750+
}
751+
} ?: FeilVedHentingAvGjeldendeVedtaksdataForPeriode.GjeldendeVedtaksdataFinnesIkke.left()
752+
}
753+
729754
private inline fun <reified T> hentKanOppdaterePeriodeGrunnlagVilkår(
730755
knadsbehandlingRepo: SøknadsbehandlingRepo,
731756
knadsbehandlingId: SøknadsbehandlingId,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
package no.nav.su.se.bakover.service.søknadsbehandling
2+
3+
import arrow.core.left
4+
import arrow.core.right
5+
import behandling.revurdering.domain.GrunnlagsdataOgVilkårsvurderingerRevurdering
6+
import behandling.revurdering.domain.VilkårsvurderingerRevurdering
7+
import io.kotest.matchers.shouldBe
8+
import no.nav.su.se.bakover.common.domain.Stønadsperiode
9+
import no.nav.su.se.bakover.common.tid.periode.år
10+
import no.nav.su.se.bakover.domain.sak.SakService
11+
import no.nav.su.se.bakover.domain.søknadsbehandling.FeilVedHentingAvGjeldendeVedtaksdataForPeriode
12+
import no.nav.su.se.bakover.domain.vilkår.flyktningVilkår
13+
import no.nav.su.se.bakover.test.argShouldBe
14+
import no.nav.su.se.bakover.test.enUkeEtterFixedClock
15+
import no.nav.su.se.bakover.test.getOrFail
16+
import no.nav.su.se.bakover.test.shouldBeEqualToExceptId
17+
import no.nav.su.se.bakover.test.søknadsbehandlingVilkårsvurdertInnvilget
18+
import no.nav.su.se.bakover.test.vedtakSøknadsbehandlingIverksattInnvilget
19+
import org.junit.jupiter.api.Test
20+
import org.mockito.kotlin.any
21+
import org.mockito.kotlin.doReturn
22+
import org.mockito.kotlin.mock
23+
import org.mockito.kotlin.verify
24+
import java.util.UUID
25+
26+
class SøknadsbehandlingGjeldendeVedtaksdataTidligerePeriodeTest {
27+
28+
@Test
29+
fun `gjeldende vedtaksdata finnes ikke`() {
30+
val (sak, innvilget) = søknadsbehandlingVilkårsvurdertInnvilget()
31+
32+
SøknadsbehandlingServiceAndMocks(
33+
sakService = mock<SakService> {
34+
on { hentSak(any<UUID>()) } doReturn sak.right()
35+
},
36+
).let {
37+
val actual = it.søknadsbehandlingService.gjeldendeVedtaksdataForTidligerePeriode(
38+
sak.id,
39+
innvilget.id,
40+
)
41+
42+
actual shouldBe FeilVedHentingAvGjeldendeVedtaksdataForPeriode.GjeldendeVedtaksdataFinnesIkke.left()
43+
verify(it.sakService).hentSak(argShouldBe(sak.id))
44+
it.verifyNoMoreInteractions()
45+
}
46+
}
47+
48+
@Test
49+
fun `gjeldende vedtaksdata for tidligere periode finnes`() {
50+
val (sak, vedtak) = vedtakSøknadsbehandlingIverksattInnvilget()
51+
val innvilget = søknadsbehandlingVilkårsvurdertInnvilget(
52+
stønadsperiode = Stønadsperiode.create(år(2022)),
53+
clock = enUkeEtterFixedClock,
54+
sakOgSøknad = sak to vedtak.behandling.søknad,
55+
).second
56+
val sakMedTidligereBehandling = sak.copy(
57+
behandlinger = sak.behandlinger.copy(
58+
søknadsbehandlinger = sak.behandlinger.søknadsbehandlinger + innvilget,
59+
),
60+
)
61+
62+
SøknadsbehandlingServiceAndMocks(
63+
sakService = mock<SakService> {
64+
on { hentSak(any<UUID>()) } doReturn sakMedTidligereBehandling.right()
65+
},
66+
).let {
67+
val actual = it.søknadsbehandlingService.gjeldendeVedtaksdataForTidligerePeriode(
68+
sak.id,
69+
innvilget.id,
70+
)
71+
72+
actual.getOrFail().let {
73+
it.first shouldBe vedtak.periode
74+
it.second.shouldBeEqualToExceptId(
75+
GrunnlagsdataOgVilkårsvurderingerRevurdering(
76+
grunnlagsdata = vedtak.behandling.grunnlagsdata,
77+
vilkårsvurderinger = VilkårsvurderingerRevurdering.Uføre(
78+
uføre = vedtak.behandling.vilkårsvurderinger.uføreVilkårKastHvisAlder(),
79+
lovligOpphold = vedtak.behandling.vilkårsvurderinger.lovligOpphold,
80+
formue = vedtak.behandling.vilkårsvurderinger.formue,
81+
utenlandsopphold = vedtak.behandling.vilkårsvurderinger.utenlandsopphold,
82+
opplysningsplikt = vedtak.behandling.vilkårsvurderinger.opplysningsplikt,
83+
flyktning = vedtak.behandling.vilkårsvurderinger.flyktningVilkår().getOrFail(),
84+
fastOpphold = vedtak.behandling.vilkårsvurderinger.fastOpphold,
85+
personligOppmøte = vedtak.behandling.vilkårsvurderinger.personligOppmøte,
86+
institusjonsopphold = vedtak.behandling.vilkårsvurderinger.institusjonsopphold,
87+
),
88+
),
89+
)
90+
}
91+
verify(it.sakService).hentSak(argShouldBe(sak.id))
92+
it.verifyNoMoreInteractions()
93+
}
94+
}
95+
}

web/src/main/kotlin/no/nav/su/se/bakover/web/routes/grunnlag/GrunnlagsdataOgVilkårsvurderingerJson.kt

+8
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package no.nav.su.se.bakover.web.routes.grunnlag
22

3+
import no.nav.su.se.bakover.common.serialize
34
import no.nav.su.se.bakover.domain.vilkår.familiegjenforening
45
import no.nav.su.se.bakover.domain.vilkår.flyktningVilkår
56
import no.nav.su.se.bakover.domain.vilkår.pensjonsVilkår
@@ -86,3 +87,10 @@ internal fun GrunnlagsdataOgVilkårsvurderinger.toJson(formuegrenserFactory: For
8687
formuegrenserFactory = formuegrenserFactory,
8788
)
8889
}
90+
91+
internal fun GrunnlagsdataOgVilkårsvurderinger.toStringifiedJson(formuegrenserFactory: FormuegrenserFactory): String =
92+
GrunnlagsdataOgVilkårsvurderingerJson.create(
93+
grunnlagsdata = this.grunnlagsdata,
94+
vilkårsvurderinger = this.vilkårsvurderinger,
95+
formuegrenserFactory = formuegrenserFactory,
96+
).let { serialize(it) }

web/src/main/kotlin/no/nav/su/se/bakover/web/routes/søknadsbehandling/SøknadsbehandlingRoutes.kt

+45
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ import no.nav.su.se.bakover.common.domain.attestering.Attestering
2222
import no.nav.su.se.bakover.common.extensions.enumContains
2323
import no.nav.su.se.bakover.common.ident.NavIdentBruker.Attestant
2424
import no.nav.su.se.bakover.common.ident.NavIdentBruker.Saksbehandler
25+
import no.nav.su.se.bakover.common.infrastructure.PeriodeJson
26+
import no.nav.su.se.bakover.common.infrastructure.PeriodeJson.Companion.toJson
2527
import no.nav.su.se.bakover.common.infrastructure.metrics.SuMetrics
2628
import no.nav.su.se.bakover.common.infrastructure.web.Feilresponser
2729
import no.nav.su.se.bakover.common.infrastructure.web.Feilresponser.attestantOgSaksbehandlerKanIkkeVæreSammePerson
@@ -43,6 +45,7 @@ import no.nav.su.se.bakover.common.serialize
4345
import no.nav.su.se.bakover.common.tid.Tidspunkt
4446
import no.nav.su.se.bakover.domain.Sak
4547
import no.nav.su.se.bakover.domain.attestering.UnderkjennAttesteringsgrunnBehandling
48+
import no.nav.su.se.bakover.domain.søknadsbehandling.FeilVedHentingAvGjeldendeVedtaksdataForPeriode
4649
import no.nav.su.se.bakover.domain.søknadsbehandling.SøknadsbehandlingId
4750
import no.nav.su.se.bakover.domain.søknadsbehandling.SøknadsbehandlingService
4851
import no.nav.su.se.bakover.domain.søknadsbehandling.SøknadsbehandlingService.BeregnRequest
@@ -58,6 +61,8 @@ import no.nav.su.se.bakover.domain.søknadsbehandling.stønadsperiode.Aldersvurd
5861
import no.nav.su.se.bakover.domain.søknadsbehandling.stønadsperiode.MaskinellAldersvurderingMedGrunnlagsdata
5962
import no.nav.su.se.bakover.domain.søknadsbehandling.underkjenn.KunneIkkeUnderkjenneSøknadsbehandling
6063
import no.nav.su.se.bakover.web.routes.dokument.tilResultat
64+
import no.nav.su.se.bakover.web.routes.grunnlag.GrunnlagsdataOgVilkårsvurderingerJson
65+
import no.nav.su.se.bakover.web.routes.grunnlag.toJson
6166
import no.nav.su.se.bakover.web.routes.sak.SAK_PATH
6267
import no.nav.su.se.bakover.web.routes.søknadsbehandling.attester.tilResultat
6368
import no.nav.su.se.bakover.web.routes.søknadsbehandling.beregning.OppdaterStønadsperiodeRequest
@@ -380,6 +385,46 @@ internal fun Route.søknadsbehandlingRoutes(
380385
}
381386
}
382387
}
388+
389+
data class TidligerePeriodeRespnse(
390+
val periode: PeriodeJson,
391+
val grunnlagsdataOgVilkårsvurderinger: GrunnlagsdataOgVilkårsvurderingerJson,
392+
)
393+
394+
get("$SØKNADSBEHANDLING_PATH/{behandlingId}/gjeldendeVedtaksdata/tidligereperiode") {
395+
call.withSakId { sakId ->
396+
call.withBehandlingId { behandlingId ->
397+
søknadsbehandlingService.gjeldendeVedtaksdataForTidligerePeriode(
398+
sakId = sakId,
399+
søknadsbehandlingId = SøknadsbehandlingId(behandlingId),
400+
).fold(
401+
ifLeft = { call.svar(it.tilResultat()) },
402+
ifRight = {
403+
call.svar(
404+
Resultat.json(
405+
OK,
406+
serialize(
407+
TidligerePeriodeRespnse(
408+
periode = it.first.toJson(),
409+
grunnlagsdataOgVilkårsvurderinger = it.second.toJson(formuegrenserFactory),
410+
),
411+
),
412+
),
413+
)
414+
},
415+
)
416+
}
417+
}
418+
}
419+
}
420+
421+
internal fun FeilVedHentingAvGjeldendeVedtaksdataForPeriode.tilResultat(): Resultat {
422+
return when (this) {
423+
FeilVedHentingAvGjeldendeVedtaksdataForPeriode.GjeldendeVedtaksdataFinnesIkke -> NotFound.errorJson(
424+
"Fant ikke gjeldende vedtaksdata for tidligere periode",
425+
"fant_ikke_gjeldende_vedtaksdata_for_tidligere_peridoe",
426+
)
427+
}
383428
}
384429

385430
internal fun Sak.KunneIkkeOppdatereStønadsperiode.tilResultat(): Resultat {

web/src/main/kotlin/no/nav/su/se/bakover/web/services/AccessCheckProxy.kt

+9
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ import no.nav.su.se.bakover.domain.søknad.LukkSøknadCommand
130130
import no.nav.su.se.bakover.domain.søknad.Søknad
131131
import no.nav.su.se.bakover.domain.søknad.søknadinnhold.SøknadInnhold
132132
import no.nav.su.se.bakover.domain.søknadsbehandling.BeregnetSøknadsbehandling
133+
import no.nav.su.se.bakover.domain.søknadsbehandling.FeilVedHentingAvGjeldendeVedtaksdataForPeriode
133134
import no.nav.su.se.bakover.domain.søknadsbehandling.IverksattSøknadsbehandling
134135
import no.nav.su.se.bakover.domain.søknadsbehandling.KunneIkkeLeggeTilSkattegrunnlag
135136
import no.nav.su.se.bakover.domain.søknadsbehandling.LukketSøknadsbehandling
@@ -224,6 +225,7 @@ import vilkår.skatt.application.KunneIkkeHenteOgLagePdfAvSkattegrunnlag
224225
import vilkår.skatt.application.SkatteService
225226
import vilkår.skatt.domain.Skattegrunnlag
226227
import vilkår.uføre.domain.Uføregrunnlag
228+
import vilkår.vurderinger.domain.GrunnlagsdataOgVilkårsvurderinger
227229
import økonomi.domain.Fagområde
228230
import økonomi.domain.kvittering.Kvittering
229231
import økonomi.domain.simulering.ForskjellerMellomUtbetalingOgSimulering
@@ -723,6 +725,13 @@ open class AccessCheckProxy(
723725
}
724726

725727
override fun lagre(søknadsbehandling: Søknadsbehandling) = kastKanKunKallesFraAnnenService()
728+
override fun gjeldendeVedtaksdataForTidligerePeriode(
729+
sakId: UUID,
730+
knadsbehandlingId: SøknadsbehandlingId,
731+
): Either<FeilVedHentingAvGjeldendeVedtaksdataForPeriode, Pair<Periode, GrunnlagsdataOgVilkårsvurderinger>> {
732+
assertHarTilgangTilSak(sakId)
733+
return service.gjeldendeVedtaksdataForTidligerePeriode(sakId, søknadsbehandlingId)
734+
}
726735
},
727736
),
728737
ferdigstillVedtak = object : FerdigstillVedtakService {

web/src/test/kotlin/no/nav/su/se/bakover/web/routes/søknadsbehandling/SøknadsbehandlingRoutesKtTest.kt

+32
Original file line numberDiff line numberDiff line change
@@ -293,4 +293,36 @@ internal class SøknadsbehandlingRoutesKtTest {
293293
}
294294
}
295295
}
296+
297+
@Test
298+
fun `gjeldende vedtaksdata for tidligere periode`() {
299+
val innvilget = søknadsbehandlingVilkårsvurdertInnvilget().second
300+
301+
testApplication {
302+
application {
303+
testSusebakoverWithMockedDb(
304+
services = TestServicesBuilder.services(
305+
søknadsbehandling = SøknadsbehandlingServices(
306+
søknadsbehandlingService = mock {
307+
on {
308+
this.gjeldendeVedtaksdataForTidligerePeriode(
309+
any(),
310+
any(),
311+
)
312+
} doReturn Pair(innvilget.periode, innvilget.grunnlagsdataOgVilkårsvurderinger).right()
313+
},
314+
iverksettSøknadsbehandlingService = mock(),
315+
),
316+
),
317+
)
318+
}
319+
defaultRequest(
320+
HttpMethod.Get,
321+
"$SAK_PATH/${UUID.randomUUID()}/behandlinger/${UUID.randomUUID()}/gjeldendeVedtaksdata/tidligereperiode",
322+
listOf(Brukerrolle.Saksbehandler),
323+
).apply {
324+
status shouldBe HttpStatusCode.OK
325+
}
326+
}
327+
}
296328
}

0 commit comments

Comments
 (0)