Skip to content

Commit

Permalink
Resend utb.: Støtt gjenoppta
Browse files Browse the repository at this point in the history
  • Loading branch information
hestad committed Jan 5, 2024
1 parent cca4166 commit 8ea1d4a
Show file tree
Hide file tree
Showing 7 changed files with 118 additions and 14 deletions.
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
package no.nav.su.se.bakover.domain.revurdering

import arrow.core.Either
import arrow.core.NonEmptyList
import arrow.core.getOrElse
import arrow.core.left
import arrow.core.right
import no.nav.su.se.bakover.common.domain.Avbrutt
import no.nav.su.se.bakover.common.domain.attestering.Attestering
import no.nav.su.se.bakover.common.domain.attestering.Attesteringshistorikk
import no.nav.su.se.bakover.common.domain.sak.Sakstype
import no.nav.su.se.bakover.common.extensions.toNonEmptyList
import no.nav.su.se.bakover.common.ident.NavIdentBruker
import no.nav.su.se.bakover.common.tid.Tidspunkt
import no.nav.su.se.bakover.common.tid.periode.Periode
Expand All @@ -17,6 +21,7 @@ import no.nav.su.se.bakover.domain.revurdering.gjenopptak.KunneIkkeLageAvsluttet
import no.nav.su.se.bakover.domain.revurdering.revurderes.VedtakSomRevurderesMånedsvis
import no.nav.su.se.bakover.domain.revurdering.årsak.Revurderingsårsak
import no.nav.su.se.bakover.domain.sak.SakInfo
import vilkår.uføre.domain.Uføregrunnlag
import økonomi.domain.simulering.Simulering
import java.util.UUID

Expand Down Expand Up @@ -162,5 +167,24 @@ sealed class GjenopptaYtelseRevurdering : AbstraktRevurdering {

override val beregning = null
override fun erÅpen() = false

/**
* @return null dersom man kaller denne for en alderssak.
* @throws IllegalStateException Dersom søknadsbehandlingen mangler uføregrunnlag. Dette skal ikke skje. Initen skal også verifisere dette.
*
* Se også tilsvarende implementasjon for søknadsbehandling: [no.nav.su.se.bakover.domain.søknadsbehandling.IverksattSøknadsbehandling.Innvilget.hentUføregrunnlag]
*/
fun hentUføregrunnlag(): NonEmptyList<Uføregrunnlag>? {
return when (this.sakstype) {
Sakstype.ALDER -> null

Sakstype.UFØRE -> {
this.vilkårsvurderinger.uføreVilkår()
.getOrElse { throw IllegalStateException("Revurdering uføre: ${this.id} mangler uføregrunnlag") }
.grunnlag
.toNonEmptyList()
}
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package no.nav.su.se.bakover.domain.sak

import beregning.domain.Beregning
import no.nav.su.se.bakover.domain.Sak
import no.nav.su.se.bakover.domain.beregning.BeregningStrategyFactory
import no.nav.su.se.bakover.domain.vedtak.VedtakGjenopptakAvYtelse
import no.nav.su.se.bakover.vedtak.domain.Vedtak
import java.time.Clock
import java.util.UUID

/**
* Spesialfunksjon for resending av utbetaling for gjenopptak av ytelse.
*
* Merk at denne beregner på nytt basert på gjeldende grunnlagsdata og vilkårsvurderinger.
* Dersom vi har fått nye satser i mellomtiden, vil disse bli med.
*
* @param vedtakId Id til vedtaket som har blitt gjenopptatt.
*
* @throws IllegalArgumentException Dersom vedtaket ikke finnes på saken eller ikke er et gjenopptak.
*/
fun Sak.hentBeregningForGjenopptakAvYtelse(
vedtakId: UUID,
begrunnelse: String? = null,
beregningStrategyFactory: BeregningStrategyFactory,
clock: Clock,
): Beregning {
val vedtak = hentVedtakForIdEllerKast(vedtakId) as VedtakGjenopptakAvYtelse
val periode = vedtak.periode
val gjeldendeGrunnlagsdataForVedtak = hentGjeldendeVedtaksdata(
periode = periode,
clock = clock,
).getOrNull()!!.grunnlagsdataOgVilkårsvurderinger
return beregningStrategyFactory.beregn(
grunnlagsdataOgVilkårsvurderinger = gjeldendeGrunnlagsdataForVedtak,
begrunnelse = begrunnelse,
sakstype = this.type,
)
}

fun Sak.hentVedtakForIdEllerKast(vedtakId: UUID): Vedtak {
return hentVedtakForId(vedtakId)
?: throw IllegalArgumentException("Fant ikke vedtak med id $vedtakId på sak $id")
}

fun Sak.hentVedtakForId(vedtakId: UUID): Vedtak? {
return this.vedtakListe.find { it.id == vedtakId }
}
4 changes: 3 additions & 1 deletion web/src/main/kotlin/no/nav/su/se/bakover/web/Routes.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import no.nav.su.se.bakover.common.infrastructure.brukerrolle.AzureGroupMapper
import no.nav.su.se.bakover.common.infrastructure.config.ApplicationConfig
import no.nav.su.se.bakover.common.infrastructure.web.withUser
import no.nav.su.se.bakover.domain.DatabaseRepos
import no.nav.su.se.bakover.domain.beregning.BeregningStrategyFactory
import no.nav.su.se.bakover.kontrollsamtale.infrastructure.web.kontrollsamtaleRoutes
import no.nav.su.se.bakover.utenlandsopphold.application.annuller.AnnullerUtenlandsoppholdService
import no.nav.su.se.bakover.utenlandsopphold.application.korriger.KorrigerUtenlandsoppholdService
Expand Down Expand Up @@ -49,6 +50,7 @@ internal fun Application.setupKtorRoutes(
extraRoutes: Route.(services: Services) -> Unit,
azureGroupMapper: AzureGroupMapper,
formuegrenserFactoryIDag: FormuegrenserFactory,
beregningStrategyFactory: BeregningStrategyFactory,
databaseRepos: DatabaseRepos,
tilbakekrevingskomponenter: Tilbakekrevingskomponenter,
clients: Clients,
Expand Down Expand Up @@ -159,7 +161,7 @@ internal fun Application.setupKtorRoutes(
sessionFactory = databaseRepos.sessionFactory,
clock = clock,
serviceUser = applicationConfig.serviceUser.username,

beregningStrategyFactory = beregningStrategyFactory,
),
)
}
Expand Down
6 changes: 6 additions & 0 deletions web/src/main/kotlin/no/nav/su/se/bakover/web/StartServer.kt
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import no.nav.su.se.bakover.dokument.infrastructure.DokumentRepos
import no.nav.su.se.bakover.dokument.infrastructure.Dokumentkomponenter
import no.nav.su.se.bakover.domain.DatabaseRepos
import no.nav.su.se.bakover.domain.behandling.BehandlingMetrics
import no.nav.su.se.bakover.domain.beregning.BeregningStrategyFactory
import no.nav.su.se.bakover.domain.metrics.ClientMetrics
import no.nav.su.se.bakover.domain.oppgave.OppgaveService
import no.nav.su.se.bakover.domain.sak.SakService
Expand Down Expand Up @@ -179,6 +180,10 @@ fun Application.susebakover(
),
extraRoutes: Route.(services: Services) -> Unit = {},
) {
val beregningStrategyFactory = BeregningStrategyFactory(
clock = clock,
satsFactory = satsFactoryIDag,
)
tilbakekrevingskomponenter(
clock,
databaseRepos.sessionFactory,
Expand All @@ -201,6 +206,7 @@ fun Application.susebakover(
accessCheckProxy = accessCheckProxy,
clients = clients,
formuegrenserFactoryIDag = formuegrenserFactoryIDag,
beregningStrategyFactory = beregningStrategyFactory,
databaseRepos = databaseRepos,
extraRoutes = extraRoutes,
tilbakekrevingskomponenter = it,
Expand Down
3 changes: 3 additions & 0 deletions web/src/main/kotlin/no/nav/su/se/bakover/web/WebSetup.kt
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import no.nav.su.se.bakover.common.infrastructure.web.svar
import no.nav.su.se.bakover.common.jacksonConverter
import no.nav.su.se.bakover.common.person.UgyldigFnrException
import no.nav.su.se.bakover.domain.DatabaseRepos
import no.nav.su.se.bakover.domain.beregning.BeregningStrategyFactory
import no.nav.su.se.bakover.web.routes.installMetrics
import no.nav.su.se.bakover.web.routes.naisPaths
import no.nav.su.se.bakover.web.routes.naisRoutes
Expand All @@ -51,6 +52,7 @@ internal fun Application.setupKtor(
applicationConfig: ApplicationConfig,
accessCheckProxy: AccessCheckProxy,
formuegrenserFactoryIDag: FormuegrenserFactory,
beregningStrategyFactory: BeregningStrategyFactory,
databaseRepos: DatabaseRepos,
clients: Clients,
extraRoutes: Route.(services: Services) -> Unit,
Expand Down Expand Up @@ -80,6 +82,7 @@ internal fun Application.setupKtor(
extraRoutes = extraRoutes,
azureGroupMapper = azureGroupMapper,
formuegrenserFactoryIDag = formuegrenserFactoryIDag,
beregningStrategyFactory = beregningStrategyFactory,
databaseRepos = databaseRepos,
clients = clients,
tilbakekrevingskomponenter = tilbakekrevingskomponenter,
Expand Down
1 change: 1 addition & 0 deletions økonomi/application/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ dependencies {
implementation(project(":oppgave:domain"))
implementation(project(":vedtak:domain"))
implementation(project(":beregning"))
implementation(project(":satser"))
}

tasks.named<Jar>("jar") {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@ import no.nav.su.se.bakover.common.ident.NavIdentBruker
import no.nav.su.se.bakover.common.persistence.SessionFactory
import no.nav.su.se.bakover.common.sikkerLogg
import no.nav.su.se.bakover.domain.Sak
import no.nav.su.se.bakover.domain.beregning.BeregningStrategyFactory
import no.nav.su.se.bakover.domain.sak.SakService
import no.nav.su.se.bakover.domain.sak.hentBeregningForGjenopptakAvYtelse
import no.nav.su.se.bakover.domain.sak.lagNyUtbetaling
import no.nav.su.se.bakover.domain.sak.lagUtbetalingForOpphør
import no.nav.su.se.bakover.domain.vedtak.VedtakEndringIYtelse
Expand Down Expand Up @@ -45,6 +47,7 @@ class ResendUtbetalingService(
private val sessionFactory: SessionFactory,
private val clock: Clock,
private val serviceUser: String,
private val beregningStrategyFactory: BeregningStrategyFactory,
) {
private val log = LoggerFactory.getLogger(this::class.java)

Expand Down Expand Up @@ -104,6 +107,18 @@ class ResendUtbetalingService(
val nyUtbetaling: Utbetaling.UtbetalingForSimulering = lagNyUtbetaling(vedtak, utbetalingId, sak)
.getOrElse { return it.left() }

if (utbetaling.bruttoBeløp() != nyUtbetaling.bruttoBeløp()) {
return KunneIkkeSendeUtbetalingPåNytt.BruttobeløpHarForandretSeg(
utbetalingId = utbetalingId,
sakId = sak.id,
vedtakId = vedtak.id,
tidligere = utbetaling.bruttoBeløp(),
= nyUtbetaling.bruttoBeløp(),
).also {
log.error("Resend utbetaling: Bruttobeløp har forandret seg fra ${utbetaling.bruttoBeløp()} til ${nyUtbetaling.bruttoBeløp()}. Sak ${sak.id} og vedtakId ${vedtak.id}")
}.left()
}

val simulertUtbetaling = utbetalingService.simulerUtbetaling(nyUtbetaling).getOrElse {
log.error("Resend utbetaling: Kunne ikke simulere utbetalingen for sak ${sak.id} og utbetalingId $utbetalingId. Underliggende grunn: $it")
return KunneIkkeSendeUtbetalingPåNytt.KunneIkkeSimulere(utbetalingId, sak.id, vedtak.id).left()
Expand Down Expand Up @@ -180,13 +195,21 @@ class ResendUtbetalingService(
).right()
}

is VedtakGjenopptakAvYtelse -> KunneIkkeSendeUtbetalingPåNytt.IkkeStøtteForGjenopptak(
utbetalingId,
sak.id,
vedtak.id,
).also {
log.error("Resend utbetaling: Gjenopptak av ytelse er ikke støttet for sak ${sak.id} og utbetalingId $utbetalingId og vedtakId ${vedtak.id}")
}.left()
is VedtakGjenopptakAvYtelse -> {
sak.lagNyUtbetaling(
saksbehandler = NavIdentBruker.Attestant(serviceUser),
// IverksattGjenopptakAvYtelse (behandling) kopierer ikke med seg beregning, her må vi hente vedtaket før stansen.
beregning = sak.hentBeregningForGjenopptakAvYtelse(
vedtakId = vedtak.id,
begrunnelse = "Resendt utbetaling",
beregningStrategyFactory = beregningStrategyFactory,
clock = clock,
),
clock = clock,
utbetalingsinstruksjonForEtterbetaling = UtbetalingsinstruksjonForEtterbetalinger.SåFortSomMulig,
uføregrunnlag = vedtak.behandling.hentUføregrunnlag(),
).right()
}

is VedtakInnvilgetRegulering -> KunneIkkeSendeUtbetalingPåNytt.IkkeStøtteForRegulering(
utbetalingId,
Expand Down Expand Up @@ -289,17 +312,15 @@ sealed interface KunneIkkeSendeUtbetalingPåNytt {
override fun feilMelding() = "$utbetalingId - Stans av ytelse er ikke støttet. Sak $sakId og vedtakId $vedtakId"
}

/**
* TODO jah: Dette må vi støtte snarest, men vi fikser søknadsbehandlingene+revurderingene først.
* Vi har lagt inn en del regler i koden som gjør at vi ikke kan ha 2 gjenopptak på rad. Men vi kan revurdere den.
*/
data class IkkeStøtteForGjenopptak(
data class BruttobeløpHarForandretSeg(
override val utbetalingId: UUID30,
val sakId: UUID,
val vedtakId: UUID,
val tidligere: Int,
val nå: Int,
) : KunneIkkeSendeUtbetalingPåNytt {
override fun feilMelding() =
"$utbetalingId - Gjenopptak av ytelse er ikke støttet. Sak $sakId og vedtakId $vedtakId"
"$utbetalingId - Bruttobeløp har forandret seg fra $tidligere til $nå. Sak $sakId og vedtakId $vedtakId"
}

data class UkjentFeil(
Expand Down

0 comments on commit 8ea1d4a

Please sign in to comment.