Skip to content

Commit

Permalink
Mulighet for å resende utbetaling
Browse files Browse the repository at this point in the history
  • Loading branch information
hestad committed Jan 4, 2024
1 parent 175da81 commit e5fa5d7
Show file tree
Hide file tree
Showing 21 changed files with 470 additions and 42 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package no.nav.su.se.bakover.database.sak

import arrow.core.NonEmptyList
import kotliquery.Row
import no.nav.su.se.bakover.common.UUID30
import no.nav.su.se.bakover.common.domain.Saksnummer
import no.nav.su.se.bakover.common.domain.sak.Behandlingssammendrag
import no.nav.su.se.bakover.common.domain.sak.Sakstype
Expand Down Expand Up @@ -145,6 +146,17 @@ internal class SakPostgresRepo(
}!!
}

override fun hentSakForUtbetalingId(utbetalingId: UUID30, sessionContext: SessionContext?): Sak? {
return dbMetrics.timeQuery("hentSakForUtbetalingId") {
sessionFactory.withSessionContext(sessionContext) { sessionContext ->
sessionContext.withSession { session ->
"select s.* from sak s join utbetaling u on u.sakid = s.id where u.id = :utbetalingId"
.hent(mapOf("utbetalingId" to utbetalingId), session) { it.toSak(sessionContext) }
}
}
}
}

override fun hentSakforSøknadsbehandling(søknadsbehandlingId: UUID): Sak {
return dbMetrics.timeQuery("hentSakForSøknadsbehandling") {
sessionFactory.withSessionContext { sessionContext ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,19 @@ import no.nav.su.se.bakover.common.deserializeListNullable
import no.nav.su.se.bakover.common.domain.Saksnummer
import no.nav.su.se.bakover.common.ident.NavIdentBruker
import no.nav.su.se.bakover.common.infrastructure.persistence.DbMetrics
import no.nav.su.se.bakover.common.infrastructure.persistence.PostgresSessionContext.Companion.withOptionalSession
import no.nav.su.se.bakover.common.infrastructure.persistence.PostgresSessionFactory
import no.nav.su.se.bakover.common.infrastructure.persistence.PostgresTransactionContext.Companion.withTransaction
import no.nav.su.se.bakover.common.infrastructure.persistence.Session
import no.nav.su.se.bakover.common.infrastructure.persistence.TransactionalSession
import no.nav.su.se.bakover.common.infrastructure.persistence.hent
import no.nav.su.se.bakover.common.infrastructure.persistence.hentListe
import no.nav.su.se.bakover.common.infrastructure.persistence.insert
import no.nav.su.se.bakover.common.infrastructure.persistence.oppdatering
import no.nav.su.se.bakover.common.infrastructure.persistence.tidspunkt
import no.nav.su.se.bakover.common.infrastructure.persistence.uuid30OrNull
import no.nav.su.se.bakover.common.journal.JournalpostId
import no.nav.su.se.bakover.common.persistence.SessionContext
import no.nav.su.se.bakover.common.persistence.TransactionContext
import no.nav.su.se.bakover.common.person.Fnr
import no.nav.su.se.bakover.common.serialize
Expand Down Expand Up @@ -196,6 +199,19 @@ internal class VedtakPostgresRepo(
}
}

override fun oppdaterUtbetalingId(
vedtakId: UUID,
utbetalingId: UUID30,
sessionContext: SessionContext?,
) {
sessionContext.withOptionalSession(sessionFactory) { session ->
"""
update vedtak set utbetalingId = :utbetalingId where id = :vedtakId
""".trimIndent()
.oppdatering(mapOf("utbetalingId" to utbetalingId, "vedtakId" to vedtakId), session)
}
}

/**
* Det er kun [VedtakEndringIYtelse] som inneholder en utbetalingId
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,11 @@ data class Utbetalinger(
data object FantIkkeGjeldendeUtbetaling

fun sisteUtbetalingslinje(): Utbetalingslinje? {
return utbetalinger.lastOrNull()?.sisteUtbetalingslinje()
return sisteUtbetaling()?.sisteUtbetalingslinje()
}

fun sisteUtbetaling(): Utbetaling? {
return utbetalinger.lastOrNull()
}

fun sisteUtbetalingslinjeId(): UUID30? {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
package no.nav.su.se.bakover.domain.revurdering

import arrow.core.NonEmptyList
import arrow.core.getOrElse
import beregning.domain.Beregning
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.oppgave.OppgaveId
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.revurderes.VedtakSomRevurderesMå
import no.nav.su.se.bakover.domain.revurdering.steg.InformasjonSomRevurderes
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.time.Clock
import java.time.LocalDate
Expand Down Expand Up @@ -69,6 +74,25 @@ sealed class IverksattRevurdering : Revurdering() {
override val erOpphørt = false

override fun utledOpphørsgrunner(clock: Clock): List<Opphørsgrunn> = emptyList()

/**
* @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()
}
}
}
}

data class Opphørt(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,7 @@ package no.nav.su.se.bakover.domain.revurdering.iverksett.innvilg

import arrow.core.Either
import arrow.core.flatMap
import arrow.core.getOrElse
import arrow.core.left
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.domain.Sak
import no.nav.su.se.bakover.domain.oppdrag.simulering.kontrollsimuler
Expand Down Expand Up @@ -47,18 +44,7 @@ internal fun Sak.iverksettInnvilgetRevurdering(
beregning = iverksattRevurdering.beregning,
clock = clock,
utbetalingsinstruksjonForEtterbetaling = UtbetalingsinstruksjonForEtterbetalinger.SåFortSomMulig,
uføregrunnlag = when (iverksattRevurdering.sakstype) {
Sakstype.ALDER -> {
null
}

Sakstype.UFØRE -> {
iverksattRevurdering.vilkårsvurderinger.uføreVilkår()
.getOrElse { throw IllegalStateException("Revurdering uføre: ${iverksattRevurdering.id} mangler uføregrunnlag") }
.grunnlag
.toNonEmptyList()
}
},
uføregrunnlag = iverksattRevurdering.hentUføregrunnlag(),
).let {
kontrollsimuler(
utbetalingForSimulering = it,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package no.nav.su.se.bakover.domain.sak

import arrow.core.NonEmptyList
import no.nav.su.se.bakover.common.UUID30
import no.nav.su.se.bakover.common.domain.Saksnummer
import no.nav.su.se.bakover.common.domain.sak.Behandlingssammendrag
import no.nav.su.se.bakover.common.domain.sak.Sakstype
Expand Down Expand Up @@ -29,7 +30,7 @@ interface SakRepo {
fun hentSakForRevurdering(revurderingId: UUID): Sak

fun hentSakForRevurdering(revurderingId: UUID, sessionContext: SessionContext): Sak

fun hentSakForUtbetalingId(utbetalingId: UUID30, sessionContext: SessionContext? = null): Sak?
fun hentSakforSøknadsbehandling(søknadsbehandlingId: UUID): Sak
fun hentSakForSøknad(søknadId: UUID): Sak?
fun hentSakForVedtak(vedtakId: UUID): Sak?
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package no.nav.su.se.bakover.domain.sak

import arrow.core.Either
import dokument.domain.Dokument
import no.nav.su.se.bakover.common.UUID30
import no.nav.su.se.bakover.common.domain.Saksnummer
import no.nav.su.se.bakover.common.domain.sak.Behandlingssammendrag
import no.nav.su.se.bakover.common.domain.sak.Sakstype
Expand All @@ -25,6 +26,7 @@ interface SakService {
fun hentSak(sakId: UUID, sessionContext: SessionContext): Either<FantIkkeSak, Sak>
fun hentSak(fnr: Fnr, type: Sakstype): Either<FantIkkeSak, Sak>
fun hentSak(saksnummer: Saksnummer): Either<FantIkkeSak, Sak>
fun hentSakForUtbetalingId(utbetalingId: UUID30): Either<FantIkkeSak, Sak>
fun hentSaker(fnr: Fnr): Either<FantIkkeSak, List<Sak>>

fun hentSak(hendelseId: HendelseId): Either<FantIkkeSak, Sak>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
package no.nav.su.se.bakover.domain.søknadsbehandling

import arrow.core.NonEmptyList
import arrow.core.getOrElse
import arrow.core.left
import beregning.domain.Beregning
import no.nav.su.se.bakover.common.domain.Saksnummer
import no.nav.su.se.bakover.common.domain.attestering.Attesteringshistorikk
import no.nav.su.se.bakover.common.domain.oppgave.OppgaveId
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.person.Fnr
import no.nav.su.se.bakover.common.tid.Tidspunkt
Expand All @@ -23,6 +26,7 @@ import no.nav.su.se.bakover.domain.søknadsbehandling.avslag.ErAvslag
import no.nav.su.se.bakover.domain.søknadsbehandling.stønadsperiode.Aldersvurdering
import no.nav.su.se.bakover.domain.søknadsbehandling.stønadsperiode.Stønadsperiode
import no.nav.su.se.bakover.domain.vilkår.Vilkårsvurderingsresultat
import vilkår.uføre.domain.Uføregrunnlag
import økonomi.domain.simulering.Simulering
import java.util.UUID

Expand Down Expand Up @@ -70,6 +74,25 @@ sealed interface IverksattSøknadsbehandling : Søknadsbehandling, KanGenerereBr
override fun skalSendeVedtaksbrev(): Boolean {
return true
}

/**
* @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 revurdering: [no.nav.su.se.bakover.domain.revurdering.IverksattRevurdering.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("Søknadsbehandling uføre: ${this.id} mangler uføregrunnlag") }
.grunnlag
.toNonEmptyList()
}
}
}
}

sealed interface Avslag : IverksattSøknadsbehandling, ErAvslag, KanGenerereAvslagsbrev {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,28 +1,23 @@
package no.nav.su.se.bakover.domain.søknadsbehandling.iverksett.innvilg

import arrow.core.Either
import arrow.core.NonEmptyList
import arrow.core.getOrElse
import arrow.core.left
import arrow.core.nonEmptyListOf
import arrow.core.raise.either
import arrow.core.right
import no.nav.su.se.bakover.common.domain.attestering.Attestering
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.sikkerLogg
import no.nav.su.se.bakover.domain.Sak
import no.nav.su.se.bakover.domain.oppdrag.simulering.kontrollsimuler
import no.nav.su.se.bakover.domain.sak.lagNyUtbetaling
import no.nav.su.se.bakover.domain.sak.oppdaterSøknadsbehandling
import no.nav.su.se.bakover.domain.statistikk.StatistikkEvent
import no.nav.su.se.bakover.domain.søknadsbehandling.IverksattSøknadsbehandling
import no.nav.su.se.bakover.domain.søknadsbehandling.SøknadsbehandlingTilAttestering
import no.nav.su.se.bakover.domain.søknadsbehandling.iverksett.KunneIkkeIverksetteSøknadsbehandling
import no.nav.su.se.bakover.domain.søknadsbehandling.validerOverlappendeStønadsperioder
import no.nav.su.se.bakover.domain.vedtak.VedtakSomKanRevurderes
import org.slf4j.LoggerFactory
import vilkår.uføre.domain.Uføregrunnlag
import økonomi.domain.simulering.SimuleringFeilet
import økonomi.domain.utbetaling.Utbetaling
import økonomi.domain.utbetaling.UtbetalingsinstruksjonForEtterbetalinger
Expand Down Expand Up @@ -63,7 +58,7 @@ internal fun Sak.iverksettInnvilgetSøknadsbehandling(
beregning = iverksattBehandling.beregning,
clock = clock,
utbetalingsinstruksjonForEtterbetaling = UtbetalingsinstruksjonForEtterbetalinger.SåFortSomMulig,
uføregrunnlag = hentUføregrunnlag(iverksattBehandling),
uføregrunnlag = iverksattBehandling.hentUføregrunnlag(),
).let {
kontrollsimuler(
utbetalingForSimulering = it,
Expand Down Expand Up @@ -103,22 +98,6 @@ private fun Sak.validerGjeldendeVedtak(
}
}

private fun hentUføregrunnlag(
iverksattBehandling: IverksattSøknadsbehandling.Innvilget,
): NonEmptyList<Uføregrunnlag>? {
return when (iverksattBehandling.sakstype) {
Sakstype.ALDER -> {
null
}

Sakstype.UFØRE -> {
iverksattBehandling.vilkårsvurderinger.uføreVilkår().getOrElse {
throw IllegalStateException("Søknadsbehandling uføre: ${iverksattBehandling.id} mangler uføregrunnlag")
}.grunnlag.toNonEmptyList()
}
}
}

/**
* Sjekker kun saksbehandlers simulering.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package no.nav.su.se.bakover.domain.vedtak

import no.nav.su.se.bakover.common.UUID30
import no.nav.su.se.bakover.common.journal.JournalpostId
import no.nav.su.se.bakover.common.persistence.SessionContext
import no.nav.su.se.bakover.common.persistence.TransactionContext
import no.nav.su.se.bakover.common.person.Fnr
import no.nav.su.se.bakover.common.tid.periode.Måned
Expand All @@ -14,8 +15,15 @@ interface VedtakRepo {
fun hentForRevurderingId(revurderingId: UUID): Vedtak?
fun hentForMåned(måned: Måned): List<Vedtaksammendrag>
fun hentForFødselsnumreOgFraOgMedMåned(fødselsnumre: List<Fnr>, fraOgMed: Måned): List<Vedtaksammendrag>

/** Denne vil feile dersom vedtaket er lagret før. */
fun lagre(vedtak: Vedtak)

/** Denne vil feile dersom vedtaket er lagret før. */
fun lagreITransaksjon(vedtak: Vedtak, tx: TransactionContext)

/** En spesialoperasjon som kun skal brukes ved resending av utbetalinger */
fun oppdaterUtbetalingId(vedtakId: UUID, utbetalingId: UUID30, sessionContext: SessionContext? = null)
fun hentForUtbetaling(utbetalingId: UUID30): VedtakSomKanRevurderes?
fun hentJournalpostId(vedtakId: UUID): JournalpostId?
fun hentSøknadsbehandlingsvedtakFraOgMed(fraOgMed: LocalDate): List<UUID>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import arrow.core.right
import dokument.domain.Dokument
import dokument.domain.DokumentRepo
import dokument.domain.brev.BrevService
import no.nav.su.se.bakover.common.UUID30
import no.nav.su.se.bakover.common.domain.Saksnummer
import no.nav.su.se.bakover.common.domain.sak.Behandlingssammendrag
import no.nav.su.se.bakover.common.domain.sak.Sakstype
Expand Down Expand Up @@ -85,6 +86,10 @@ class SakServiceImpl(
return sakRepo.hentSak(saksnummer)?.right() ?: FantIkkeSak.left()
}

override fun hentSakForUtbetalingId(utbetalingId: UUID30): Either<FantIkkeSak, Sak> {
return sakRepo.hentSakForUtbetalingId(utbetalingId)?.right() ?: FantIkkeSak.left()
}

override fun hentSak(hendelseId: HendelseId): Either<FantIkkeSak, Sak> {
return sakRepo.hentSak(hendelseId)?.right() ?: FantIkkeSak.left()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,14 +89,18 @@ class UtbetalingServiceImpl(
.map { utbetalingForSimulering.toSimulertUtbetaling(it) }
}

private fun sendUtbetalingTilOS(utbetalingsRequest: Utbetalingsrequest): Either<UtbetalingFeilet.Protokollfeil, Utbetalingsrequest> {
private fun sendUtbetalingTilOS(
utbetalingsRequest: Utbetalingsrequest,
): Either<UtbetalingFeilet.Protokollfeil, Utbetalingsrequest> {
return utbetalingPublisher.publishRequest(utbetalingsRequest)
.mapLeft {
UtbetalingFeilet.Protokollfeil
}
}

private fun Utbetaling.SimulertUtbetaling.forberedOversendelse(transactionContext: TransactionContext): Utbetaling.OversendtUtbetaling.UtenKvittering {
private fun Utbetaling.SimulertUtbetaling.forberedOversendelse(
transactionContext: TransactionContext,
): Utbetaling.OversendtUtbetaling.UtenKvittering {
return toOversendtUtbetaling(utbetalingPublisher.generateRequest(this)).also {
utbetalingRepo.opprettUtbetaling(
utbetaling = it,
Expand Down
1 change: 1 addition & 0 deletions settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ include("oppgave:infrastructure")
include("økonomi:domain")
include("økonomi:infrastructure")
include("økonomi:application")
include("økonomi:presentation")

include("tilbakekreving:presentation")
include("tilbakekreving:application")
Expand Down
2 changes: 2 additions & 0 deletions web/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,9 @@ dependencies {
implementation(project(":oppgave:infrastructure"))
implementation(project(":oppgave:domain"))
implementation(project(":økonomi:domain"))
implementation(project(":økonomi:application"))
implementation(project(":økonomi:infrastructure"))
implementation(project(":økonomi:presentation"))

implementation(project(":dokument:domain"))
implementation(project(":dokument:infrastructure"))
Expand Down
Loading

0 comments on commit e5fa5d7

Please sign in to comment.