Skip to content

Commit

Permalink
Årlig Inntektsjustering jobb (#6053)
Browse files Browse the repository at this point in the history
* Inntektsjustering Jobb starter omregning

* Legger til egendefingert hendelse type i testdata

* Leser dato til yearmonth

* Flyttet oppstartslogikk for årlig inntektsjustering til behandling
  • Loading branch information
Bjodn authored Oct 21, 2024
1 parent 4de09df commit 671fa82
Show file tree
Hide file tree
Showing 14 changed files with 223 additions and 54 deletions.
2 changes: 2 additions & 0 deletions apps/etterlatte-behandling/src/main/kotlin/Application.kt
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ import no.nav.etterlatte.egenansatt.EgenAnsattService
import no.nav.etterlatte.egenansatt.egenAnsattRoute
import no.nav.etterlatte.grunnlagsendring.doedshendelse.doedshendelseRoute
import no.nav.etterlatte.grunnlagsendring.grunnlagsendringshendelseRoute
import no.nav.etterlatte.inntektsjustering.aarligInntektsjusteringRoute
import no.nav.etterlatte.institusjonsopphold.InstitusjonsoppholdService
import no.nav.etterlatte.institusjonsopphold.institusjonsoppholdRoute
import no.nav.etterlatte.kodeverk.kodeverk
Expand Down Expand Up @@ -187,6 +188,7 @@ private fun Route.settOppRoutes(applicationContext: ApplicationContext) {
automatiskRevurderingService = applicationContext.automatiskRevurderingService,
)
omregningRoutes(omregningService = applicationContext.omregningService)
aarligInntektsjusteringRoute(service = applicationContext.aarligInntektsjusteringJobbService)
migreringRoutes(migreringService = applicationContext.migreringService)
bosattUtlandRoutes(bosattUtlandService = applicationContext.bosattUtlandService)
behandlingsstatusRoutes(behandlingsstatusService = applicationContext.behandlingsStatusService)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,14 @@ import no.nav.etterlatte.libs.common.sak.KjoeringRequest
import no.nav.etterlatte.libs.common.sak.KjoeringStatus
import no.nav.etterlatte.libs.common.sak.LagreKjoeringRequest
import no.nav.etterlatte.libs.ktor.token.BrukerTokenInfo
import no.nav.etterlatte.libs.ktor.token.HardkodaSystembruker

class OmregningService(
private val behandlingService: BehandlingService,
private val omregningDao: OmregningDao,
) {
fun oppdaterKjoering(request: KjoeringRequest) = oppdaterKjoering(request, HardkodaSystembruker.omregning)

fun oppdaterKjoering(
request: KjoeringRequest,
bruker: BrukerTokenInfo,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ import no.nav.etterlatte.grunnlagsendring.doedshendelse.DoedshendelseJobService
import no.nav.etterlatte.grunnlagsendring.doedshendelse.DoedshendelseService
import no.nav.etterlatte.grunnlagsendring.doedshendelse.DoedshendelserKafkaServiceImpl
import no.nav.etterlatte.grunnlagsendring.doedshendelse.kontrollpunkt.DoedshendelseKontrollpunktService
import no.nav.etterlatte.inntektsjustering.AarligInntektsjusteringJobbService
import no.nav.etterlatte.institusjonsopphold.InstitusjonsoppholdDao
import no.nav.etterlatte.jobs.MetrikkerJob
import no.nav.etterlatte.jobs.next
Expand Down Expand Up @@ -459,6 +460,12 @@ internal class ApplicationContext(
omregningDao = omregningDao,
)

val aarligInntektsjusteringJobbService =
AarligInntektsjusteringJobbService(
omregningService = omregningService,
rapid = rapid,
)

val tilgangService = TilgangServiceImpl(sakTilgangDao)

val externalServices: List<Pingable> =
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
package no.nav.etterlatte.inntektsjustering

import no.nav.etterlatte.behandling.omregning.OmregningService
import no.nav.etterlatte.kafka.JsonMessage
import no.nav.etterlatte.kafka.KafkaProdusent
import no.nav.etterlatte.libs.common.behandling.Revurderingaarsak
import no.nav.etterlatte.libs.common.inntektsjustering.AarligInntektsjusteringRequest
import no.nav.etterlatte.libs.common.logging.getCorrelationId
import no.nav.etterlatte.libs.common.rapidsandrivers.CORRELATION_ID_KEY
import no.nav.etterlatte.libs.common.rapidsandrivers.TEKNISK_TID_KEY
import no.nav.etterlatte.libs.common.sak.KjoeringRequest
import no.nav.etterlatte.libs.common.sak.KjoeringStatus
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.etterlatte.rapidsandrivers.OmregningDataPacket
import no.nav.etterlatte.rapidsandrivers.OmregningHendelseType
import org.slf4j.LoggerFactory
import java.time.Year
import java.time.YearMonth

class AarligInntektsjusteringJobbService(
private val omregningService: OmregningService,
private val rapid: KafkaProdusent<String, String>,
) {
private val logger = LoggerFactory.getLogger(this::class.java)

fun startAarligInntektsjustering(request: AarligInntektsjusteringRequest) {
request.saker.forEach { sakId ->
startEnkeltSak(request.kjoering, request.loependeFom, sakId)
}
}

private fun startEnkeltSak(
kjoering: String,
loependeFom: YearMonth,
sakId: SakId,
) {
try {
logger.info("Årlig inntektsjusteringsjobb $kjoering for $sakId")
if (!skalBehandlingOmregnes(loependeFom)) {
// TODO Legge til en begrunnelse
omregningService.oppdaterKjoering(KjoeringRequest(kjoering, KjoeringStatus.FERDIGSTILT, sakId))
} else if (kanIkkeKjoeresAutomatisk()) {
// TODO Finnes det tilfeller av dette?
} else {
// TODO status KLAR_FOR_OMREGNING
publiserKlarForOmregning(sakId, loependeFom)
}
} catch (e: Exception) {
// TODO begrunnese!
omregningService.oppdaterKjoering(KjoeringRequest(kjoering, KjoeringStatus.FEILA, sakId))
}
}

private fun kanIkkeKjoeresAutomatisk(): Boolean {
// TODO
return false
}

private fun publiserKlarForOmregning(
sakId: SakId,
loependeFom: YearMonth,
) {
val correlationId = getCorrelationId()
rapid
.publiser(
"aarlig-inntektsjustering-$sakId",
JsonMessage
.newMessage(
OmregningHendelseType.KLAR_FOR_OMREGNING.lagEventnameForType(),
mapOf(
CORRELATION_ID_KEY to correlationId,
TEKNISK_TID_KEY to Tidspunkt.now(),
OmregningDataPacket.KEY to
OmregningData(
kjoering = "Årlig inntektsjustering ${Year.now().plusYears(1)}",
sakId = sakId,
revurderingaarsak = Revurderingaarsak.INNTEKTSENDRING, // TODO egen årsak?
fradato = loependeFom.atDay(1),
).toPacket(),
),
).toJson(),
).also { (partition, offset) ->
logger.info(
"Publiserte klar for omregningshendelse for $sakId på partition " +
"$partition, offset $offset, correlationid: $correlationId",
)
}
}

private fun skalBehandlingOmregnes(loependeFom: YearMonth): Boolean {
// TODO kall vedtakfor så om er innvilga / løpende

// TODO kall berening for å se om det finnes inntekt fra 1.1

return true
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package no.nav.etterlatte.inntektsjustering

import io.ktor.http.HttpStatusCode
import io.ktor.server.application.call
import io.ktor.server.request.receive
import io.ktor.server.response.respond
import io.ktor.server.routing.Route
import io.ktor.server.routing.post
import io.ktor.server.routing.route
import no.nav.etterlatte.libs.common.inntektsjustering.AarligInntektsjusteringRequest

internal fun Route.aarligInntektsjusteringRoute(service: AarligInntektsjusteringJobbService) {
route("/inntektsjustering") {
post("jobb") {
val request = call.receive<AarligInntektsjusteringRequest>()
service.startAarligInntektsjustering(request)
call.respond(HttpStatusCode.OK)
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package inntektsjustering

class AarligInntektsjusteringJobbServiceTest {
// TODO
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import no.nav.etterlatte.libs.common.behandling.OpprettRevurderingForAktivitetsp
import no.nav.etterlatte.libs.common.behandling.OpprettRevurderingForAktivitetspliktResponse
import no.nav.etterlatte.libs.common.behandling.SakMedBehandlinger
import no.nav.etterlatte.libs.common.behandling.SakType
import no.nav.etterlatte.libs.common.inntektsjustering.AarligInntektsjusteringRequest
import no.nav.etterlatte.libs.common.oppgave.NyOppgaveDto
import no.nav.etterlatte.libs.common.oppgave.OppgaveKilde
import no.nav.etterlatte.libs.common.oppgave.OppgaveType
Expand Down Expand Up @@ -105,6 +106,8 @@ interface BehandlingService {

fun hentBehandlingerForSak(foedselsNummerDTO: FoedselsnummerDTO): SakMedBehandlinger

fun startAarligInntektsjustering(request: AarligInntektsjusteringRequest): HttpResponse

fun opprettOppgave(
sakId: SakId,
oppgaveType: OppgaveType,
Expand Down Expand Up @@ -276,6 +279,14 @@ class BehandlingServiceImpl(
}.body()
}

override fun startAarligInntektsjustering(request: AarligInntektsjusteringRequest) =
runBlocking {
behandlingKlient.post("$url/inntektsjustering/jobb") {
contentType(ContentType.Application.Json)
setBody(request)
}
}

override fun opprettOppgave(
sakId: SakId,
oppgaveType: OppgaveType,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,7 @@ import no.nav.etterlatte.libs.common.behandling.BehandlingSammendrag
import no.nav.etterlatte.libs.common.behandling.BehandlingStatus
import no.nav.etterlatte.libs.common.behandling.Revurderingaarsak
import no.nav.etterlatte.libs.common.behandling.SakType
import no.nav.etterlatte.libs.common.sak.KjoeringStatus
import no.nav.etterlatte.libs.ktor.route.FoedselsnummerDTO
import no.nav.etterlatte.libs.common.inntektsjustering.AarligInntektsjusteringRequest
import no.nav.etterlatte.rapidsandrivers.InntektsjusteringHendelseType
import no.nav.etterlatte.rapidsandrivers.ListenerMedLogging
import no.nav.etterlatte.rapidsandrivers.RapidEvents.ANTALL
Expand Down Expand Up @@ -65,6 +64,7 @@ internal class InntektsjusteringJobbRiver(
logger = logger,
antall = antall,
finnSaker = { antallIDenneRunden ->
// TODO eksludere de som allerede er kjørt?
behandlingService.hentAlleSaker(
kjoering,
antallIDenneRunden,
Expand All @@ -75,22 +75,16 @@ internal class InntektsjusteringJobbRiver(
)
},
haandterSaker = { sakerSomSkalInformeres ->
sakerSomSkalInformeres.saker.forEach { sak ->

logger.info("$kjoering: Klar til å opprette, journalføre og distribuere varsel og vedtak for sakId ${sak.id}")
behandlingService.lagreKjoering(sak.id, KjoeringStatus.STARTA, kjoering)

val sakMedBehandlinger = behandlingService.hentBehandlingerForSak(FoedselsnummerDTO(sak.ident))
if (skalBehandlingOmregnes(sakMedBehandlinger.behandlinger, loependeFom)) {
// TODO: START OMREGNING
} else {
behandlingService.lagreKjoering(sak.id, KjoeringStatus.FERDIGSTILT, kjoering)
}
}
logger.info("Starter årlig inntektsjustering $kjoering")
val request =
AarligInntektsjusteringRequest(
kjoering = kjoering,
loependeFom = loependeFom,
saker = sakerSomSkalInformeres.saker.map { it.id },
)
behandlingService.startAarligInntektsjustering(request)
},
)

logger.info("$kjoering: Ferdig")
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import io.kotest.matchers.shouldBe
import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
Expand All @@ -7,7 +6,6 @@ import no.nav.etterlatte.behandling.randomSakId
import no.nav.etterlatte.common.Enheter
import no.nav.etterlatte.funksjonsbrytere.FeatureToggleService
import no.nav.etterlatte.inntektsjustering.InntektsjusteringJobbRiver
import no.nav.etterlatte.inntektsjustering.skalBehandlingOmregnes
import no.nav.etterlatte.libs.common.behandling.BehandlingSammendrag
import no.nav.etterlatte.libs.common.behandling.BehandlingStatus
import no.nav.etterlatte.libs.common.behandling.Revurderingaarsak
Expand All @@ -28,28 +26,10 @@ import no.nav.helse.rapids_rivers.testsupport.TestRapid
import org.junit.jupiter.api.Test
import java.time.YearMonth

class InntektsjusteringJobbRiver {
class InntektsjusteringJobbRiverTest {
private val kjoering = "inntektsjustering-jobb-2024"
private val loependeFom = YearMonth.of(2024, 1)

@Test
fun `skal inkluderes i omregning`() {
val behandlinger =
listOf(
genererBehandlingSammendrag(BehandlingStatus.IVERKSATT, Revurderingaarsak.INNTEKTSENDRING, YearMonth.of(2023, 1)),
genererBehandlingSammendrag(BehandlingStatus.IVERKSATT, Revurderingaarsak.ANNEN, YearMonth.of(2024, 1)),
genererBehandlingSammendrag(BehandlingStatus.AVBRUTT, Revurderingaarsak.INNTEKTSENDRING, YearMonth.of(2024, 1)),
)
skalBehandlingOmregnes(behandlinger, YearMonth.of(2024, 1)) shouldBe true
}

@Test
fun `skal IKKE inkluderes i omregning`() {
val behandlinger =
listOf(genererBehandlingSammendrag(BehandlingStatus.IVERKSATT, Revurderingaarsak.INNTEKTSENDRING, YearMonth.of(2024, 1)))
skalBehandlingOmregnes(behandlinger, YearMonth.of(2024, 1)) shouldBe false
}

@Test
fun `teste start inntektsjustering jobb aktivert`() {
val featureToggleService =
Expand All @@ -59,7 +39,14 @@ class InntektsjusteringJobbRiver {
mockk<BehandlingService>(relaxed = true).also {
every { it.hentAlleSaker(any(), any(), any(), any()) } returns
Saker(
listOf(Sak("saksbehandler1", SakType.OMSTILLINGSSTOENAD, randomSakId(), Enheter.PORSGRUNN.enhetNr)),
listOf(
Sak(
"saksbehandler1",
SakType.OMSTILLINGSSTOENAD,
randomSakId(),
Enheter.PORSGRUNN.enhetNr,
),
),
)
}

Expand All @@ -68,8 +55,16 @@ class InntektsjusteringJobbRiver {
inspector.sendTestMessage(genererMelding(loependeFom))

verify(exactly = 1) {
behandlingServiceMock.hentAlleSaker(kjoering, any(), any(), any(), SakType.OMSTILLINGSSTOENAD, loependeFom = loependeFom)
behandlingServiceMock.hentAlleSaker(
kjoering,
any(),
any(),
any(),
SakType.OMSTILLINGSSTOENAD,
loependeFom = loependeFom,
)
}
// TODO kaller behandling...
}

@Test
Expand All @@ -81,7 +76,14 @@ class InntektsjusteringJobbRiver {
mockk<BehandlingService>(relaxed = true).also {
every { it.hentAlleSaker(any(), any(), any(), any()) } returns
Saker(
listOf(Sak("saksbehandler1", SakType.OMSTILLINGSSTOENAD, randomSakId(), Enheter.PORSGRUNN.enhetNr)),
listOf(
Sak(
"saksbehandler1",
SakType.OMSTILLINGSSTOENAD,
randomSakId(),
Enheter.PORSGRUNN.enhetNr,
),
),
)
}

Expand All @@ -90,7 +92,14 @@ class InntektsjusteringJobbRiver {

inspector.sendTestMessage(genererMelding(loependeFom))
verify(exactly = 0) {
behandlingServiceMock.hentAlleSaker(kjoering, any(), any(), any(), SakType.OMSTILLINGSSTOENAD, loependeFom = loependeFom)
behandlingServiceMock.hentAlleSaker(
kjoering,
any(),
any(),
any(),
SakType.OMSTILLINGSSTOENAD,
loependeFom = loependeFom,
)
}
}

Expand All @@ -103,7 +112,7 @@ class InntektsjusteringJobbRiver {
ANTALL to 12000,
SPESIFIKKE_SAKER to listOf<SakId>(),
EKSKLUDERTE_SAKER to listOf<SakId>(),
LOEPENDE_FOM to loependeFom,
LOEPENDE_FOM to loependeFom.atDay(1),
),
).toJson()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
<select name="hendelseType" id="hendelseType" onchange="prefill()">
<option value="udefinert" selcted >Udefinert</option>
<option value="omregning">Omregning</option>
<option value="inntektsjusteringjobb">Inntektsjusteringjobb</option>
</select>
</div>

Expand All @@ -50,7 +51,10 @@
function prefill() {
const hendelseType = document.getElementById('hendelseType').value
if (hendelseType === 'omregning') {
document.getElementById('json').value = '{"@event_name":"OMREGNING:KLAR_FOR_OMREGNING","hendelse_data":{"sakId":"","fradato":"","revurderingaarsak":""}}'
document.getElementById('json').value = '{"@event_name":"OMREGNING:KLAR_FOR_OMREGNING","hendelse_data":{"sakId":"","fradato":"2024-01-01","revurderingaarsak":""}}'
prettify()
} else if( hendelseType == 'inntektsjusteringjobb') {
document.getElementById('json').value = '{"@event_name": "INNTEKTSJUSTERING:START_INNTEKTSJUSTERING_JOBB","kjoering": "asdf","antall": 1,"loepende_fom": "2024-01-01","spesifikke_saker": "","ekskluderte_saker": ""}'
prettify()
} else {
document.getElementById('json').value = ''
Expand Down
Loading

0 comments on commit 671fa82

Please sign in to comment.