Skip to content

Commit

Permalink
Etteroppgjoer hent avkorting (#7128)
Browse files Browse the repository at this point in the history
* Mangler inTransaction

* Hente siste avkorting i sak for etteroppgjør

* Vise ytelse etter avkorting i etteroppgjør

* Egen komponent for tabell med inntekt som gjenbrukes av etteroppgjør

* Fikse test

* Ubrukt route get
  • Loading branch information
Bjodn authored Feb 26, 2025
1 parent 60bdb3d commit 997fe6b
Show file tree
Hide file tree
Showing 15 changed files with 287 additions and 130 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package no.nav.etterlatte.behandling.etteroppgjoer

import no.nav.etterlatte.behandling.etteroppgjoer.inntektskomponent.AInntekt
import no.nav.etterlatte.libs.common.beregning.AvkortingDto
import no.nav.etterlatte.libs.common.sak.Sak
import no.nav.etterlatte.libs.common.tidspunkt.Tidspunkt
import java.util.UUID
Expand All @@ -22,7 +23,7 @@ data class EtteroppgjoerBehandling(
data class EtteroppgjoerOpplysninger(
val skatt: OpplysnignerSkatt,
val ainntekt: AInntektView,
// TODO..
val tidligereAvkorting: AvkortingDto,
)

data class OpplysnignerSkatt(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import no.nav.etterlatte.libs.ktor.route.ETTEROPPGJOER_CALL_PARAMETER
import no.nav.etterlatte.libs.ktor.route.SAKID_CALL_PARAMETER
import no.nav.etterlatte.libs.ktor.route.etteroppgjoerId
import no.nav.etterlatte.libs.ktor.route.sakId
import no.nav.etterlatte.libs.ktor.token.brukerTokenInfo
import no.nav.etterlatte.tilgangsstyring.kunSkrivetilgang

enum class EtteroppgjoerToggles(
Expand All @@ -33,7 +34,7 @@ fun Route.etteroppgjoerRoutes(
get {
sjekkEtteroppgjoerEnabled(featureToggleService)
kunSkrivetilgang {
val etteroppgjoer = service.hentEtteroppgjoer(etteroppgjoerId)
val etteroppgjoer = service.hentEtteroppgjoer(brukerTokenInfo, etteroppgjoerId)
call.respond(etteroppgjoer)
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
package no.nav.etterlatte.behandling.etteroppgjoer

import io.ktor.server.plugins.NotFoundException
import no.nav.etterlatte.behandling.BehandlingService
import no.nav.etterlatte.behandling.etteroppgjoer.inntektskomponent.InntektskomponentService
import no.nav.etterlatte.behandling.klienter.BeregningKlient
import no.nav.etterlatte.inTransaction
import no.nav.etterlatte.libs.common.feilhaandtering.IkkeFunnetException
import no.nav.etterlatte.libs.common.feilhaandtering.InternfeilException
import no.nav.etterlatte.libs.common.oppgave.OppgaveKilde
import no.nav.etterlatte.libs.common.oppgave.OppgaveType
import no.nav.etterlatte.libs.common.sak.SakId
import no.nav.etterlatte.libs.common.tidspunkt.Tidspunkt
import no.nav.etterlatte.libs.ktor.token.BrukerTokenInfo
import no.nav.etterlatte.oppgave.OppgaveService
import no.nav.etterlatte.sak.SakLesDao
import java.util.UUID
Expand All @@ -17,8 +21,13 @@ class EtteroppgjoerService(
private val sakDao: SakLesDao,
private val oppgaveService: OppgaveService,
private val inntektskomponentService: InntektskomponentService,
private val beregningKlient: BeregningKlient,
private val behandlingService: BehandlingService,
) {
fun hentEtteroppgjoer(behandlingId: UUID): Etteroppgjoer {
suspend fun hentEtteroppgjoer(
brukerTokenInfo: BrukerTokenInfo,
behandlingId: UUID,
): Etteroppgjoer {
val etteroppgjoerBehandling =
inTransaction {
dao.hentEtteroppgjoer(behandlingId)
Expand All @@ -27,24 +36,43 @@ class EtteroppgjoerService(
detail = "Fant ikke forbehandling etteroppgjør $behandlingId",
)

val opplysningerSkatt = dao.hentOpplysningerSkatt(behandlingId)
val opplysningerAInntekt = dao.hentOpplysningerAInntekt(behandlingId)
val sisteIverksatteBehandling =
inTransaction {
behandlingService.hentSisteIverksatte(etteroppgjoerBehandling.sak.id)
?: throw InternfeilException("Fant ikke siste iverksatte")
}

val tidligereAvkorting =
beregningKlient.hentSisteAvkortingForEtteroppgjoer(
sisteIverksatteBehandling.id,
etteroppgjoerBehandling.aar,
brukerTokenInfo,
)

return inTransaction {
val opplysningerSkatt = dao.hentOpplysningerSkatt(behandlingId)
val opplysningerAInntekt = dao.hentOpplysningerAInntekt(behandlingId)

return Etteroppgjoer(
behandling = etteroppgjoerBehandling,
opplysninger =
EtteroppgjoerOpplysninger(
skatt = opplysningerSkatt,
ainntekt = opplysningerAInntekt.toView(),
),
)
Etteroppgjoer(
behandling = etteroppgjoerBehandling,
opplysninger =
EtteroppgjoerOpplysninger(
skatt = opplysningerSkatt,
ainntekt = opplysningerAInntekt.toView(),
tidligereAvkorting = tidligereAvkorting,
),
)
}
}

suspend fun opprettEtteroppgjoer(
sakId: SakId,
aar: Int,
) {
val sak = sakDao.hentSak(sakId) ?: throw NotFoundException("Fant ikke sak med id=$sakId")
val sak =
inTransaction {
sakDao.hentSak(sakId) ?: throw NotFoundException("Fant ikke sak med id=$sakId")
}

hentOgLagreOpplysninger(sak.ident, aar)

Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
package no.nav.etterlatte.behandling.klienter

import com.fasterxml.jackson.module.kotlin.readValue
import com.github.michaelbull.result.mapBoth
import com.github.michaelbull.result.mapError
import com.typesafe.config.Config
import io.ktor.client.HttpClient
import no.nav.etterlatte.libs.common.beregning.AvkortingDto
import no.nav.etterlatte.libs.common.beregning.AvkortingEtteropppgjoerRequest
import no.nav.etterlatte.libs.common.beregning.InntektsjusteringAvkortingInfoRequest
import no.nav.etterlatte.libs.common.beregning.InntektsjusteringAvkortingInfoResponse
import no.nav.etterlatte.libs.common.deserialize
import no.nav.etterlatte.libs.common.feilhaandtering.InternfeilException
import no.nav.etterlatte.libs.common.objectMapper
import no.nav.etterlatte.libs.common.sak.SakId
import no.nav.etterlatte.libs.ktor.ktor.ktorobo.AzureAdClient
import no.nav.etterlatte.libs.ktor.ktor.ktorobo.DownstreamResourceClient
Expand All @@ -33,6 +37,12 @@ interface BeregningKlient {
sisteBehandling: UUID,
brukerTokenInfo: BrukerTokenInfo,
): InntektsjusteringAvkortingInfoResponse

suspend fun hentSisteAvkortingForEtteroppgjoer(
behandlingId: UUID,
aar: Int,
brukerTokenInfo: BrukerTokenInfo,
): AvkortingDto
}

class BeregningKlientImpl(
Expand Down Expand Up @@ -107,4 +117,36 @@ class BeregningKlientImpl(
},
)
}

override suspend fun hentSisteAvkortingForEtteroppgjoer(
behandlingId: UUID,
aar: Int,
brukerTokenInfo: BrukerTokenInfo,
): AvkortingDto {
logger.info("Henter siste avkorting med behandlingId=$behandlingId for etteropgjør ")
try {
return downstreamResourceClient
.post(
resource =
Resource(
clientId = clientId,
url = "$resourceUrl/api/beregning/avkorting/etteroppgjoer",
),
brukerTokenInfo = brukerTokenInfo,
postBody =
AvkortingEtteropppgjoerRequest(
sisteIverksatteBehandling = behandlingId,
aar = aar,
),
).mapBoth(
success = { resource -> resource.response.let { objectMapper.readValue(it.toString()) } },
failure = { throwableErrorMessage -> throw throwableErrorMessage },
)
} catch (e: Exception) {
throw InternfeilException(
"Henting av avkorting for behandling med behandlingId=$behandlingId feilet",
e,
)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -642,6 +642,8 @@ internal class ApplicationContext(
sakDao = sakLesDao,
oppgaveService = oppgaveService,
inntektskomponentService = inntektskomponentService,
beregningKlient = beregningsKlient,
behandlingService = behandlingService,
)

val saksbehandlerJobService = SaksbehandlerJobService(saksbehandlerInfoDao, navAnsattKlient, axsysKlient)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ import no.nav.etterlatte.libs.common.behandling.Persongalleri
import no.nav.etterlatte.libs.common.behandling.SakType
import no.nav.etterlatte.libs.common.behandling.SakidOgRolle
import no.nav.etterlatte.libs.common.behandling.Saksrolle
import no.nav.etterlatte.libs.common.beregning.AvkortingDto
import no.nav.etterlatte.libs.common.beregning.InntektsjusteringAvkortingInfoResponse
import no.nav.etterlatte.libs.common.brev.BestillingsIdDto
import no.nav.etterlatte.libs.common.brev.JournalpostIdDto
Expand Down Expand Up @@ -237,6 +238,16 @@ class BeregningKlientTest :
skrivetilgang: Boolean,
bruker: Saksbehandler,
): Boolean = true

override suspend fun hentSisteAvkortingForEtteroppgjoer(
behandlingId: UUID,
aar: Int,
brukerTokenInfo: BrukerTokenInfo,
): AvkortingDto =
AvkortingDto(
avkortingGrunnlag = emptyList(),
avkortetYtelse = emptyList(),
)
}

class VedtakKlientTest : VedtakKlient {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import io.ktor.server.routing.route
import no.nav.etterlatte.klienter.BehandlingKlient
import no.nav.etterlatte.libs.common.beregning.AarligInntektsjusteringAvkortingRequest
import no.nav.etterlatte.libs.common.beregning.AvkortetYtelseDto
import no.nav.etterlatte.libs.common.beregning.AvkortingEtteropppgjoerRequest
import no.nav.etterlatte.libs.common.beregning.AvkortingGrunnlagDto
import no.nav.etterlatte.libs.common.beregning.AvkortingGrunnlagKildeDto
import no.nav.etterlatte.libs.common.beregning.AvkortingGrunnlagLagreDto
Expand Down Expand Up @@ -135,6 +136,15 @@ fun Route.avkorting(
mottattInntektsjusteringService.opprettAvkortingMedBrukeroppgittInntekt(request, brukerTokenInfo)
call.respond(respons.toDto())
}

post("etteroppgjoer") {
val request = call.receive<AvkortingEtteropppgjoerRequest>()
logger.info(
"Henter avkorting for siste iverksatte behandling for etteroppgjør år=${request.aar} id=${request.sisteIverksatteBehandling}",
)
val avkorting = avkortingService.hentSisteAvkortingForEtteroppgjoer(request.sisteIverksatteBehandling, request.aar)
call.respond(avkorting)
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -295,6 +295,20 @@ class AvkortingService(
throw AvkortingBehandlingFeilStatus(behandlingId)
}
}

fun hentSisteAvkortingForEtteroppgjoer(
sisteIverksatteBehandling: UUID,
aar: Int,
): AvkortingDto {
val avkorting =
avkortingRepository.hentAvkorting(sisteIverksatteBehandling)
?: throw InternfeilException("Mangler avkorting for siste iverksatte behandling id=$sisteIverksatteBehandling")
val aarsoppgjoer = avkorting.aarsoppgjoer.single { it.aar == aar }
return AvkortingDto(
avkortingGrunnlag = aarsoppgjoer.inntektsavkorting.map { it.grunnlag.toDto() },
avkortetYtelse = aarsoppgjoer.avkortetYtelseAar.map { it.toDto() },
)
}
}

class AvkortingFinnesIkkeException(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,6 @@ export const Avkorting = ({
behandling.sakEnhetId,
innloggetSaksbehandler.skriveEnheter
)

useEffect(() => {
if (!avkorting) {
dispatch(resetAvkorting())
Expand All @@ -67,6 +66,9 @@ export const Avkorting = ({
)
}

const avkortetYtelse = [...(avkorting?.avkortetYtelse ?? [])]
const tidligereAvkortetYtelse = [...(avkorting?.tidligereAvkortetYtelse ?? [])]

return (
<Box paddingBlock="8 0">
<VStack gap="8">
Expand Down Expand Up @@ -119,7 +121,9 @@ export const Avkorting = ({
{visSanksjon && (
<Sanksjon behandling={behandling} manglerInntektVirkAar={!avkortingGrunnlagInnevaerendeAar()} />
)}
{avkorting && <YtelseEtterAvkorting />}
{avkorting && (
<YtelseEtterAvkorting avkortetYtelse={avkortetYtelse} tidligereAvkortetYtelse={tidligereAvkortetYtelse} />
)}
</VStack>
</Box>
)
Expand Down
Loading

0 comments on commit 997fe6b

Please sign in to comment.