Skip to content

Commit

Permalink
Videreføre inntekt inn i nytt år under årlig innntektsjustering (#6259)
Browse files Browse the repository at this point in the history
* Videreføre inntekt inn i nytt år under årlig innntektsjustering

* Legger ved år for å kunne verifisere inntekt som videreføres
  • Loading branch information
Bjodn authored Nov 7, 2024
1 parent 6ad2899 commit 3c803a6
Show file tree
Hide file tree
Showing 10 changed files with 214 additions and 64 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,14 @@ import io.ktor.client.call.body
import io.ktor.client.request.get
import io.ktor.client.request.post
import io.ktor.client.request.put
import io.ktor.client.request.setBody
import io.ktor.client.statement.HttpResponse
import io.ktor.http.ContentType
import io.ktor.http.contentType
import io.ktor.http.isSuccess
import kotlinx.coroutines.runBlocking
import no.nav.etterlatte.grunnbeloep.Grunnbeloep
import no.nav.etterlatte.libs.common.beregning.AarligInntektsjusteringAvkortingRequest
import java.util.UUID

class BeregningService(
Expand Down Expand Up @@ -61,6 +65,24 @@ class BeregningService(
beregningApp.get("$url/api/beregning/avkorting/$behandlingId/ferdig")
}

fun omregnAarligInntektsjustering(
aar: Int,
behandlingId: UUID,
forrigeBehandlingId: UUID,
): HttpResponse =
runBlocking {
beregningApp.post("$url/api/beregning/avkorting/aarlig-inntektsjustering") {
contentType(ContentType.Application.Json)
setBody(
AarligInntektsjusteringAvkortingRequest(
aar = aar,
nyBehandling = behandlingId,
forrigeBehandling = forrigeBehandlingId,
),
)
}
}

suspend fun hentGrunnbeloep(): Grunnbeloep =
beregningApp
.get("$url/api/beregning/grunnbeloep")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import no.nav.etterlatte.rapidsandrivers.BEREGNING_KEY
import no.nav.etterlatte.rapidsandrivers.HENDELSE_DATA_KEY
import no.nav.etterlatte.rapidsandrivers.Kontekst
import no.nav.etterlatte.rapidsandrivers.ListenerMedLoggingOgFeilhaandtering
import no.nav.etterlatte.rapidsandrivers.OmregningData
import no.nav.etterlatte.rapidsandrivers.OmregningDataPacket
import no.nav.etterlatte.rapidsandrivers.OmregningHendelseType
import no.nav.etterlatte.rapidsandrivers.ReguleringEvents
Expand Down Expand Up @@ -59,11 +60,8 @@ internal class OmregningHendelserBeregningRiver(
) {
logger.info("Mottatt omregninghendelse")
val omregningData = packet.omregningData
val behandlingId = omregningData.hentBehandlingId()
val behandlingViOmregnerFra = omregningData.hentForrigeBehandlingid()
val sakType = omregningData.hentSakType()
runBlocking {
val beregning = beregn(sakType, omregningData.revurderingaarsak, behandlingId, behandlingViOmregnerFra)
val beregning = beregn(omregningData)
packet[BEREGNING_KEY] = beregning.beregning

// TODO bør vi ha slike ting her?
Expand All @@ -76,12 +74,12 @@ internal class OmregningHendelserBeregningRiver(
logger.info("Publiserte oppdatert omregningshendelse")
}

internal suspend fun beregn(
sakType: SakType,
revurderingaarsak: Revurderingaarsak,
behandlingId: UUID,
behandlingViOmregnerFra: UUID,
): BeregningOgAvkorting {
internal suspend fun beregn(omregningData: OmregningData): BeregningOgAvkorting {
val behandlingId = omregningData.hentBehandlingId()
val behandlingViOmregnerFra = omregningData.hentForrigeBehandlingid()
val sakType = omregningData.hentSakType()
val fraDato = omregningData.hentFraDato()
val revurderingaarsak = omregningData.revurderingaarsak
beregningService.opprettBeregningsgrunnlagFraForrigeBehandling(behandlingId, behandlingViOmregnerFra)
beregningService.tilpassOverstyrtBeregningsgrunnlagForRegulering(behandlingId)
val beregning = beregningService.beregn(behandlingId).body<BeregningDTO>()
Expand All @@ -95,9 +93,23 @@ internal class OmregningHendelserBeregningRiver(

return if (sakType == SakType.OMSTILLINGSSTOENAD) {
val avkorting =
beregningService
.omregnAvkorting(behandlingId, behandlingViOmregnerFra)
.body<AvkortingDto>()
when (revurderingaarsak) {
Revurderingaarsak.AARLIG_INNTEKTSJUSTERING -> {
beregningService
.omregnAarligInntektsjustering(
aar = fraDato.year,
behandlingId = behandlingId,
forrigeBehandlingId = behandlingViOmregnerFra,
).body<AvkortingDto>()
}

else -> {
beregningService
.omregnAvkorting(behandlingId, behandlingViOmregnerFra)
.body<AvkortingDto>()
}
}

val forrigeAvkorting =
beregningService
.hentAvkorting(behandlingViOmregnerFra)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,16 @@ import no.nav.etterlatte.libs.common.beregning.BeregningDTO
import no.nav.etterlatte.libs.common.beregning.Beregningsperiode
import no.nav.etterlatte.libs.common.beregning.Beregningstype
import no.nav.etterlatte.libs.common.grunnlag.Metadata
import no.nav.etterlatte.libs.common.sak.SakId
import no.nav.etterlatte.libs.common.tidspunkt.Tidspunkt
import no.nav.etterlatte.rapidsandrivers.OmregningData
import no.nav.helse.rapids_rivers.RapidsConnection
import no.nav.helse.rapids_rivers.River
import org.junit.jupiter.api.Assertions.assertNotNull
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.assertThrows
import java.math.BigDecimal
import java.time.LocalDate
import java.time.Month
import java.time.YearMonth
import java.util.UUID
Expand Down Expand Up @@ -54,10 +57,15 @@ class OmregningHendelserBeregningRiverTest {

runBlocking {
river.beregn(
SakType.BARNEPENSJON,
revurderingaarsak = Revurderingaarsak.REGULERING,
behandlingId = nyBehandling,
behandlingViOmregnerFra = gammelBehandling,
OmregningData(
kjoering = "",
sakId = SakId(123L),
sakType = SakType.BARNEPENSJON,
revurderingaarsak = Revurderingaarsak.REGULERING,
behandlingId = nyBehandling,
forrigeBehandlingId = gammelBehandling,
fradato = LocalDate.of(2024, 1, 1),
),
)
}
}
Expand Down Expand Up @@ -89,10 +97,15 @@ class OmregningHendelserBeregningRiverTest {
runBlocking {
assertThrows<MindreEnnForrigeBehandling> {
river.beregn(
SakType.BARNEPENSJON,
revurderingaarsak = Revurderingaarsak.REGULERING,
behandlingId = nyBehandling,
behandlingViOmregnerFra = gammelBehandling,
OmregningData(
kjoering = "",
sakId = SakId(123L),
sakType = SakType.BARNEPENSJON,
revurderingaarsak = Revurderingaarsak.REGULERING,
behandlingId = nyBehandling,
forrigeBehandlingId = gammelBehandling,
fradato = LocalDate.of(2024, 1, 1),
),
)
}
}
Expand Down Expand Up @@ -126,10 +139,15 @@ class OmregningHendelserBeregningRiverTest {

runBlocking {
river.beregn(
SakType.BARNEPENSJON,
revurderingaarsak = Revurderingaarsak.REGULERING,
behandlingId = nyBehandling,
behandlingViOmregnerFra = gammelBehandling,
OmregningData(
kjoering = "",
sakId = SakId(123L),
sakType = SakType.BARNEPENSJON,
revurderingaarsak = Revurderingaarsak.REGULERING,
behandlingId = nyBehandling,
forrigeBehandlingId = gammelBehandling,
fradato = LocalDate.of(2024, 1, 1),
),
)
}
}
Expand Down Expand Up @@ -161,10 +179,15 @@ class OmregningHendelserBeregningRiverTest {
runBlocking {
assertThrows<ForStorOekning> {
river.beregn(
SakType.BARNEPENSJON,
revurderingaarsak = Revurderingaarsak.REGULERING,
behandlingId = nyBehandling,
behandlingViOmregnerFra = gammelBehandling,
OmregningData(
kjoering = "",
sakId = SakId(123L),
sakType = SakType.BARNEPENSJON,
revurderingaarsak = Revurderingaarsak.REGULERING,
behandlingId = nyBehandling,
forrigeBehandlingId = gammelBehandling,
fradato = LocalDate.of(2024, 1, 1),
),
)
}
}
Expand Down Expand Up @@ -197,10 +220,15 @@ class OmregningHendelserBeregningRiverTest {
runBlocking {
val resultat =
river.beregn(
SakType.BARNEPENSJON,
revurderingaarsak = Revurderingaarsak.REGULERING,
behandlingId = nyBehandling,
behandlingViOmregnerFra = gammelBehandling,
OmregningData(
kjoering = "",
sakId = SakId(123L),
sakType = SakType.BARNEPENSJON,
revurderingaarsak = Revurderingaarsak.REGULERING,
behandlingId = nyBehandling,
forrigeBehandlingId = gammelBehandling,
fradato = LocalDate.of(2024, 1, 1),
),
)

assertNotNull(resultat)
Expand Down
7 changes: 6 additions & 1 deletion apps/etterlatte-beregning/src/main/kotlin/Application.kt
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,12 @@ class Server(
) {
beregning(beregningService, behandlingKlient)
beregningsGrunnlag(beregningsGrunnlagService, behandlingKlient)
avkorting(avkortingService, behandlingKlient, avkortingTidligAlderspensjonService)
avkorting(
avkortingService,
behandlingKlient,
avkortingTidligAlderspensjonService,
aarligInntektsjusteringService,
)
ytelseMedGrunnlag(ytelseMedGrunnlagService, behandlingKlient)
grunnbeloep(grunnbeloepService)
sanksjon(sanksjonService, behandlingKlient)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package no.nav.etterlatte.avkorting

import no.nav.etterlatte.libs.common.beregning.AarligInntektsjusteringAvkortingSjekkRequest
import no.nav.etterlatte.libs.common.beregning.AarligInntektsjusteringAvkortingSjekkResponse
import no.nav.etterlatte.libs.common.beregning.AvkortingGrunnlagLagreDto
import no.nav.etterlatte.libs.common.feilhaandtering.InternfeilException
import no.nav.etterlatte.libs.ktor.token.BrukerTokenInfo
import no.nav.etterlatte.sanksjon.SanksjonService
import org.slf4j.LoggerFactory
import java.time.YearMonth
import java.util.UUID

class AarligInntektsjusteringService(
private val avkortingService: AvkortingService,
private val avkortingRepository: AvkortingRepository,
private val sanksjonService: SanksjonService,
) {
private val logger = LoggerFactory.getLogger(this::class.java)

fun hentSjekkAarligInntektsjustering(
request: AarligInntektsjusteringAvkortingSjekkRequest,
): AarligInntektsjusteringAvkortingSjekkResponse {
val sanksjoner = sanksjonService.hentSanksjon(request.sisteBehandling)
return AarligInntektsjusteringAvkortingSjekkResponse(
sakId = request.sakId,
aar = request.aar,
harInntektForAar = avkortingRepository.harSakInntektForAar(request),
harSanksjon = sanksjoner?.any { it.tom == null } ?: false,
)
}

suspend fun kopierAarligInntektsjustering(
aar: Int,
behandlingId: UUID,
forrigeBehandlingId: UUID,
brukerTokenInfo: BrukerTokenInfo,
): Avkorting {
avkortingService.tilstandssjekk(behandlingId, brukerTokenInfo)
logger.info("Oppretter avkorting for nytt inntektsår med siste inntekt fra behandling=$forrigeBehandlingId")
val forrigeAvkorting = avkortingService.hentForrigeAvkorting(forrigeBehandlingId)

val siseInntekt =
forrigeAvkorting.aarsoppgjoer
.last()
.inntektsavkorting
.last()
.grunnlag

with(siseInntekt.periode) {
if (fom.year != aar - 1 || (tom != null && tom?.year != aar - 1)) {
throw InternfeilException("Årlig inntektsjustering feilet - inntekt som overføres er i feil år")
}
}

val nyttGrunnlag =
AvkortingGrunnlagLagreDto(
inntektTom = siseInntekt.inntektTom,
fratrekkInnAar = 0,
inntektUtlandTom = siseInntekt.inntektUtlandTom,
fratrekkInnAarUtland = 0,
spesifikasjon = siseInntekt.spesifikasjon,
fom = YearMonth.of(aar, 1),
)

avkortingService.beregnAvkortingMedNyttGrunnlag(behandlingId, brukerTokenInfo, nyttGrunnlag)
return avkortingRepository.hentAvkorting(behandlingId)
?: throw AvkortingFinnesIkkeException(behandlingId)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import io.ktor.server.routing.get
import io.ktor.server.routing.post
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.AarligInntektsjusteringAvkortingSjekkRequest
import no.nav.etterlatte.libs.common.beregning.AvkortetYtelseDto
import no.nav.etterlatte.libs.common.beregning.AvkortingGrunnlagDto
Expand All @@ -26,6 +27,7 @@ fun Route.avkorting(
avkortingService: AvkortingService,
behandlingKlient: BehandlingKlient,
tidligAlderspensjonService: AvkortingTidligAlderspensjonService,
aarligInntektsjusteringService: AarligInntektsjusteringService,
) {
val logger = routeLogger

Expand Down Expand Up @@ -87,13 +89,25 @@ fun Route.avkorting(
}
}

route("/api/beregning/avkorting/aarlig-inntektsjustering-sjekk") {
post {
val harInntektForAarDto = call.receive<AarligInntektsjusteringAvkortingSjekkRequest>()
logger.info("Henter har inntekt for ${harInntektForAarDto.aar} for sakId=${harInntektForAarDto.sakId}")
val respons = avkortingService.hentSjekkAarligInntektsjustering(harInntektForAarDto)
route("/api/beregning/avkorting") {
post("aarlig-inntektsjustering-sjekk") {
val request = call.receive<AarligInntektsjusteringAvkortingSjekkRequest>()
logger.info("Henter har inntekt for ${request.aar} for sakId=${request.sakId}")
val respons = aarligInntektsjusteringService.hentSjekkAarligInntektsjustering(request)
call.respond(respons)
}
post("aarlig-inntektsjustering") {
val request = call.receive<AarligInntektsjusteringAvkortingRequest>()
logger.info("Oppretter avkorting nytt år for behandling=${request.nyBehandling}")
val respons =
aarligInntektsjusteringService.kopierAarligInntektsjustering(
aar = request.aar,
behandlingId = request.nyBehandling,
forrigeBehandlingId = request.forrigeBehandling,
brukerTokenInfo = brukerTokenInfo,
)
call.respond(respons.toDto())
}
}
}

Expand Down
Loading

0 comments on commit 3c803a6

Please sign in to comment.