Skip to content

Commit

Permalink
Inntektsjustering legge til inntekt i omregningsflyt (#6449)
Browse files Browse the repository at this point in the history
* Legger til mottatt inntektsjustering i omregningsdata

* Oppretter avkorting med inntekt fra omregningdata

* Serialisere inntektsjustering som object ikke string

* Skal ikke forvente InntektsjusteringRequest som respons

* Skru av kasting av feil i river midlertidig
  • Loading branch information
Bjodn authored Nov 27, 2024
1 parent 4da01a1 commit aa7ef8d
Show file tree
Hide file tree
Showing 15 changed files with 141 additions and 28 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import no.nav.etterlatte.oppgave.OppgaveService
import no.nav.etterlatte.rapidsandrivers.OmregningData
import no.nav.etterlatte.rapidsandrivers.OmregningDataPacket
import no.nav.etterlatte.rapidsandrivers.OmregningHendelseType
import no.nav.etterlatte.rapidsandrivers.OmregningInntektsjustering
import org.slf4j.LoggerFactory
import java.time.YearMonth

Expand Down Expand Up @@ -49,6 +50,10 @@ class InntektsjusteringSelvbetjeningService(
sakId,
InntektsjusteringRequest.utledLoependeFom(),
InntektsjusteringRequest.utledKjoering(request.inntektsjusteringId),
OmregningInntektsjustering(
inntekt = request.inntekt,
inntektUtland = request.inntektUtland,
),
)
}

Expand All @@ -67,6 +72,7 @@ class InntektsjusteringSelvbetjeningService(
sakId: SakId,
loependeFom: YearMonth,
kjoering: String,
inntektsjustering: OmregningInntektsjustering,
) {
val correlationId = getCorrelationId()
rapid
Expand All @@ -84,6 +90,7 @@ class InntektsjusteringSelvbetjeningService(
sakId = sakId,
revurderingaarsak = Revurderingaarsak.INNTEKTSENDRING,
fradato = loependeFom.atDay(1),
inntektsjustering = inntektsjustering,
).toPacket(),
),
).toJson(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ class InntektsjusteringSelvbetjeningServiceTest {
fun `skal behandle inntektsjustering automatisk hvis featureToggle = true`() {
every { featureToggleService.isEnabled(any(), any()) } returns true

val inntektsjusteringRequest = InntektsjusteringRequest(SakId(123L), "123", UUID.randomUUID())
val inntektsjusteringRequest = InntektsjusteringRequest(SakId(123L), "123", UUID.randomUUID(), 100, 0)
service.behandleInntektsjustering(inntektsjusteringRequest)
verify(exactly = 1) {
rapid.publiser(
Expand All @@ -67,7 +67,7 @@ class InntektsjusteringSelvbetjeningServiceTest {
every { featureToggleService.isEnabled(any(), any()) } returns false
every { oppgaveService.opprettOppgave(any(), any(), any(), any(), any()) } returns mockk()

val inntektsjusteringRequest = InntektsjusteringRequest(SakId(123L), "123", UUID.randomUUID())
val inntektsjusteringRequest = InntektsjusteringRequest(SakId(123L), "123", UUID.randomUUID(), 100, 0)
service.behandleInntektsjustering(inntektsjusteringRequest)

verify(exactly = 1) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import io.ktor.http.isSuccess
import kotlinx.coroutines.runBlocking
import no.nav.etterlatte.grunnbeloep.Grunnbeloep
import no.nav.etterlatte.libs.common.beregning.AarligInntektsjusteringAvkortingRequest
import no.nav.etterlatte.libs.common.beregning.MottattInntektsjusteringAvkortigRequest
import no.nav.etterlatte.libs.common.feilhaandtering.checkInternFeil
import java.util.UUID

Expand Down Expand Up @@ -84,6 +85,14 @@ class BeregningService(
}
}

fun omregnMottattInntektsjustering(request: MottattInntektsjusteringAvkortigRequest): HttpResponse =
runBlocking {
beregningApp.post("$url/api/beregning/avkorting/mottatt-inntektsjustering") {
contentType(ContentType.Application.Json)
setBody(request)
}
}

suspend fun hentGrunnbeloep(): Grunnbeloep =
beregningApp
.get("$url/api/beregning/grunnbeloep")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import no.nav.etterlatte.libs.common.beregning.AvkortetYtelseDto
import no.nav.etterlatte.libs.common.beregning.AvkortingDto
import no.nav.etterlatte.libs.common.beregning.BeregningDTO
import no.nav.etterlatte.libs.common.beregning.Beregningsperiode
import no.nav.etterlatte.libs.common.beregning.MottattInntektsjusteringAvkortigRequest
import no.nav.etterlatte.libs.common.feilhaandtering.ForespoerselException
import no.nav.etterlatte.libs.common.rapidsandrivers.setEventNameForHendelseType
import no.nav.etterlatte.rapidsandrivers.BEREGNING_KEY
Expand All @@ -32,6 +33,7 @@ import tidspunkt.erFoerEllerPaa
import java.math.BigDecimal
import java.math.RoundingMode
import java.time.LocalDate
import java.time.YearMonth
import java.util.UUID
import kotlin.math.abs

Expand All @@ -49,6 +51,7 @@ internal class OmregningHendelserBeregningRiver(
validate { it.requireKey(OmregningDataPacket.FORRIGE_BEHANDLING_ID) }
validate { it.requireKey(OmregningDataPacket.SAK_TYPE) }
validate { it.requireKey(OmregningDataPacket.FRA_DATO) }
validate { it.interestedIn(OmregningDataPacket.INNTEKTSJUSTERING) }
}
}

Expand Down Expand Up @@ -106,6 +109,19 @@ internal class OmregningHendelserBeregningRiver(
).body<AvkortingDto>()
}

Revurderingaarsak.INNTEKTSENDRING -> {
val omregningInntekt = omregningData.hentInntektsjustering()
beregningService
.omregnMottattInntektsjustering(
MottattInntektsjusteringAvkortigRequest(
behandlingId = behandlingId,
virkningstidspunkt = YearMonth.from(omregningData.hentFraDato()),
inntekt = omregningInntekt.inntekt,
inntektUtland = omregningInntekt.inntektUtland,
),
).body<AvkortingDto>()
}

else -> {
beregningService
.omregnAvkorting(behandlingId, behandlingViOmregnerFra)
Expand Down
1 change: 1 addition & 0 deletions apps/etterlatte-beregning/src/main/kotlin/Application.kt
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ class Server(
behandlingKlient,
avkortingTidligAlderspensjonService,
aarligInntektsjusteringService,
mottattInntektsjusteringService,
)
ytelseMedGrunnlag(beregningOgAvkortingBrevService, behandlingKlient)
grunnbeloep(grunnbeloepService)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import no.nav.etterlatte.libs.common.beregning.AvkortingGrunnlagDto
import no.nav.etterlatte.libs.common.beregning.AvkortingGrunnlagKildeDto
import no.nav.etterlatte.libs.common.beregning.AvkortingGrunnlagLagreDto
import no.nav.etterlatte.libs.common.beregning.AvkortingOverstyrtInnvilgaMaanederDto
import no.nav.etterlatte.libs.common.beregning.MottattInntektsjusteringAvkortigRequest
import no.nav.etterlatte.libs.ktor.route.BEHANDLINGID_CALL_PARAMETER
import no.nav.etterlatte.libs.ktor.route.uuid
import no.nav.etterlatte.libs.ktor.route.withBehandlingId
Expand All @@ -28,6 +29,7 @@ fun Route.avkorting(
behandlingKlient: BehandlingKlient,
tidligAlderspensjonService: AvkortingTidligAlderspensjonService,
aarligInntektsjusteringService: AarligInntektsjusteringService,
mottattInntektsjusteringService: MottattInntektsjusteringService,
) {
val logger = LoggerFactory.getLogger("AvkortingRoute")

Expand Down Expand Up @@ -108,6 +110,14 @@ fun Route.avkorting(
)
call.respond(respons.toDto())
}

post("mottatt-inntektsjustering") {
val request = call.receive<MottattInntektsjusteringAvkortigRequest>()
logger.info("Oppretter avkorting etter mottatt inntektsjustering fra bruker behandling=${request.behandlingId}")
val respons =
mottattInntektsjusteringService.opprettAvkortingMedBrukeroppgittInntekt(request, brukerTokenInfo)
call.respond(respons.toDto())
}
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package no.nav.etterlatte.avkorting

import no.nav.etterlatte.libs.common.beregning.AvkortingGrunnlagLagreDto
import no.nav.etterlatte.libs.common.beregning.MottattInntektsjusteringAvkortigRequest
import no.nav.etterlatte.libs.ktor.token.BrukerTokenInfo

class MottattInntektsjusteringService(
private val avkortingService: AvkortingService,
) {
suspend fun opprettAvkortingMedBrukeroppgittInntekt(
request: MottattInntektsjusteringAvkortigRequest,
brukerTokenInfo: BrukerTokenInfo,
): Avkorting {
val (behandlingId, virkningstidspunkt, inntekt, inntektUtland) = request

avkortingService.tilstandssjekk(behandlingId, brukerTokenInfo)

// Avkorting opprettes her med tidligere årsoppgjør
avkortingService.hentOpprettEllerReberegnAvkorting(behandlingId, brukerTokenInfo)

val nyttGrunnlag =
AvkortingGrunnlagLagreDto(
inntektTom = inntekt,
fratrekkInnAar = 0, // TODO må tilpasses når vi skal støtte inntektsjustering inneværende år
inntektUtlandTom = inntektUtland,
fratrekkInnAarUtland = 0, // TODO må tilpasses når vi skal støtte inntektsjustering inneværende år
spesifikasjon = "Mottatt inntekt fra bruker gjennom selvbetjening", // TODO avklar med fag
fom = virkningstidspunkt,
)
avkortingService.beregnAvkortingMedNyttGrunnlag(behandlingId, brukerTokenInfo, nyttGrunnlag)

return avkortingService.hentAvkorting(behandlingId) ?: throw AvkortingFinnesIkkeException(behandlingId)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import no.nav.etterlatte.avkorting.AvkortingReparerAarsoppgjoeret
import no.nav.etterlatte.avkorting.AvkortingRepository
import no.nav.etterlatte.avkorting.AvkortingService
import no.nav.etterlatte.avkorting.AvkortingTidligAlderspensjonService
import no.nav.etterlatte.avkorting.MottattInntektsjusteringService
import no.nav.etterlatte.beregning.AnvendtTrygdetidRepository
import no.nav.etterlatte.beregning.BeregnBarnepensjonService
import no.nav.etterlatte.beregning.BeregnOmstillingsstoenadService
Expand Down Expand Up @@ -131,6 +132,7 @@ class ApplicationContext {
avkortingRepository = avkortingRepository,
sanksjonService = sanksjonService,
)
val mottattInntektsjusteringService = MottattInntektsjusteringService(avkortingService)
val beregningOgAvkortingBrevService =
BeregningOgAvkortingBrevService(
beregningRepository = beregningRepository,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ class AvkortingRoutesTest {
private val avkortingService = mockk<AvkortingService>()
private val avkortingTidligAlderspensjonService = mockk<AvkortingTidligAlderspensjonService>()
private val aarligInntektsjusteringService = mockk<AarligInntektsjusteringService>()
private val mottattInntektsjusteringService = mockk<MottattInntektsjusteringService>()

@BeforeAll
fun beforeAll() {
Expand Down Expand Up @@ -186,6 +187,7 @@ class AvkortingRoutesTest {
behandlingKlient,
avkortingTidligAlderspensjonService,
aarligInntektsjusteringService,
mottattInntektsjusteringService,
)
}
block(this)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,23 +53,13 @@ class BehandlingClient(
UUID.fromString(response.body())
}

fun behandleInntektsjustering(
sakId: SakId,
journalPostId: String,
inntektsjusteringId: UUID,
) {
fun behandleInntektsjustering(request: InntektsjusteringRequest) {
runBlocking {
sakOgBehandlingApp
.post("$url/inntektsjustering/behandle") {
contentType(ContentType.Application.Json)
setBody(
InntektsjusteringRequest(
sak = sakId,
journalpostId = journalPostId,
inntektsjusteringId = inntektsjusteringId,
),
)
}.body<InntektsjusteringRequest>()
setBody(request)
}
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
package no.nav.etterlatte.inntektsjustering

import com.fasterxml.jackson.databind.JsonMappingException
import com.fasterxml.jackson.module.kotlin.readValue
import com.fasterxml.jackson.module.kotlin.treeToValue
import kotlinx.coroutines.runBlocking
import no.nav.etterlatte.gyldigsoeknad.client.BehandlingClient
import no.nav.etterlatte.gyldigsoeknad.journalfoering.OpprettJournalpostResponse
import no.nav.etterlatte.libs.common.behandling.SakType
import no.nav.etterlatte.libs.common.event.InntektsjusteringInnsendt
import no.nav.etterlatte.libs.common.event.InntektsjusteringInnsendtHendelseType
import no.nav.etterlatte.libs.common.inntektsjustering.Inntektsjustering
import no.nav.etterlatte.libs.common.inntektsjustering.InntektsjusteringRequest
import no.nav.etterlatte.libs.common.objectMapper
import no.nav.etterlatte.libs.common.sak.Sak
import no.nav.etterlatte.rapidsandrivers.ListenerMedLogging
Expand All @@ -17,7 +18,6 @@ import no.nav.helse.rapids_rivers.JsonMessage
import no.nav.helse.rapids_rivers.MessageContext
import no.nav.helse.rapids_rivers.RapidsConnection
import org.slf4j.LoggerFactory
import java.util.UUID

internal class InntektsjusteringRiver(
rapidsConnection: RapidsConnection,
Expand Down Expand Up @@ -52,29 +52,37 @@ internal class InntektsjusteringRiver(
return
}

startBehandlingAvInntektsjustering(sak, journalpostResponse, inntektsjustering.id)
startBehandlingAvInntektsjustering(sak, journalpostResponse, inntektsjustering)
} catch (e: JsonMappingException) {
sikkerLogg.error("Feil under deserialisering", e)
logger.error("Feil under deserialisering av inntektsjustering (id=${inntektsjustering.id}). Se sikkerlogg for detaljer.")
throw e
} catch (e: Exception) {
logger.error("Uhåndtert feilsituasjon TODO : $", e)
throw e
// throw e TODO ta stilling til hvordan feil her skal håndteres...
}
}

private fun startBehandlingAvInntektsjustering(
sak: Sak,
journalpostResponse: OpprettJournalpostResponse,
inntektsjusteringId: UUID,
inntektsjustering: Inntektsjustering,
) {
behandlingKlient.behandleInntektsjustering(
sak.id,
journalpostResponse.journalpostId,
inntektsjusteringId,
InntektsjusteringRequest(
sak = sak.id,
journalpostId = journalpostResponse.journalpostId,
inntektsjusteringId = inntektsjustering.id,
inntekt =
inntektsjustering.arbeidsinntekt + inntektsjustering.naeringsinntekt + (
inntektsjustering.afpInntekt
?: 0
),
inntektUtland = inntektsjustering.inntektFraUtland,
),
)
}

private fun JsonMessage.inntektsjustering(): Inntektsjustering =
objectMapper.readValue<Inntektsjustering>(this[InntektsjusteringInnsendt.inntektsjusteringInnhold].textValue())
objectMapper.treeToValue<Inntektsjustering>(this[InntektsjusteringInnsendt.inntektsjusteringInnhold])
}
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ internal class InntektsjusteringRiverTest {
private fun testRapid() = TestRapid().apply { InntektsjusteringRiver(this, behandlingKlientMock, journalfoerInntektsjusteringService) }

@Test
fun `Skal journalføre inntektsjustering og opprette oppgave i Gjenny`() {
fun `Skal journalføre inntektsjustering og starte behandling med summert inntekt`() {
val sak = Sak("123", SakType.OMSTILLINGSSTOENAD, randomSakId(), Enheter.PORSGRUNN.enhetNr)
val inntektsjustering =
Inntektsjustering(
Expand All @@ -70,14 +70,14 @@ internal class InntektsjusteringRiverTest {
"JournalId123",
true,
)
coEvery { behandlingKlientMock.behandleInntektsjustering(any(), any(), any()) } just Runs
coEvery { behandlingKlientMock.behandleInntektsjustering(any()) } just Runs

val melding =
JsonMessage
.newMessage(
mapOf(
"@event_name" to InntektsjusteringInnsendtHendelseType.EVENT_NAME_INNSENDT.eventname,
InntektsjusteringInnsendt.inntektsjusteringInnhold to inntektsjustering.toJson(),
InntektsjusteringInnsendt.inntektsjusteringInnhold to inntektsjustering,
),
).toJson()

Expand All @@ -92,7 +92,14 @@ internal class InntektsjusteringRiverTest {
dokarkivKlientMock.opprettJournalpost(capture(journalRequest))
pdfgenKlient.genererPdf(capture(pdfDataSlot), "inntektsjustering_nytt_aar_v1")

behandlingKlientMock.behandleInntektsjustering(sak.id, any(), any())
behandlingKlientMock.behandleInntektsjustering(
withArg {
it.sak shouldBe sak.id
it.inntektsjusteringId shouldBe inntektsjustering.id
it.inntekt shouldBe 700
it.inntektUtland shouldBe 300
},
)
}
with(journalRequest.captured) {
tittel shouldBe "Inntektsjustering 2025"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ data class InntektsjusteringRequest(
val sak: SakId,
val journalpostId: String,
val inntektsjusteringId: UUID,
val inntekt: Int,
val inntektUtland: Int,
) {
companion object {
fun utledKjoering(id: UUID) = "INNTEKTSJUSTERING_${utledLoependeFom()}_$id"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -165,3 +165,10 @@ data class AarligInntektsjusteringAvkortingRequest(
val forrigeBehandling: UUID,
val nyBehandling: UUID,
)

data class MottattInntektsjusteringAvkortigRequest(
val behandlingId: UUID,
val virkningstidspunkt: YearMonth,
val inntekt: Int,
val inntektUtland: Int,
)
Loading

0 comments on commit aa7ef8d

Please sign in to comment.