From 326113290c5e226d1494923cce045cb41694569e Mon Sep 17 00:00:00 2001 From: Andreas Balevik Date: Tue, 26 Nov 2024 09:15:18 +0100 Subject: [PATCH] =?UTF-8?q?EY-4770=20Opprette=20omregningskj=C3=B8ring=20f?= =?UTF-8?q?or=20automatisk=20behandling=20(#6430)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Opprette omregningskjøring for automatisk behandling * rettet test som feilet * rettet etter tilbakemeldinger * rettet etter tilbakemeldinger * rettet etter tilbakemeldinger * rette byggefeil * la til tester * rettet tilbakemeldinger * rettet tilbakemeldinger --- .../src/main/kotlin/Application.kt | 2 + .../revurdering/RevurderingRoutes.kt | 4 +- .../main/kotlin/config/ApplicationContext.kt | 8 ++ ...kt => AarligInntektsjusteringJobbRoute.kt} | 4 +- .../AarligInntektsjusteringJobbService.kt | 17 +-- .../InntektsjusteringSelvbetjeningRoute.kt | 20 +++ .../InntektsjusteringSelvbetjeningService.kt | 117 ++++++++++++++++++ .../AarligInntektsjusteringJobbServiceTest.kt | 26 ++-- ...ntektsjusteringSelvbetjeningServiceTest.kt | 89 +++++++++++++ .../gyldigsoeknad/client/BehandlingClient.kt | 21 ++++ .../InntektsjusteringRiver.kt | 42 ++++--- .../InntektsjusteringRiverTest.kt | 17 +-- .../src/main/kotlin/BehandlingService.kt | 2 +- .../AarligInntektsjusteringRequest.kt | 13 ++ 14 files changed, 325 insertions(+), 57 deletions(-) rename apps/etterlatte-behandling/src/main/kotlin/inntektsjustering/{AarligInntektsjusteringRoute.kt => AarligInntektsjusteringJobbRoute.kt} (87%) create mode 100644 apps/etterlatte-behandling/src/main/kotlin/inntektsjustering/selvbetjening/InntektsjusteringSelvbetjeningRoute.kt create mode 100644 apps/etterlatte-behandling/src/main/kotlin/inntektsjustering/selvbetjening/InntektsjusteringSelvbetjeningService.kt create mode 100644 apps/etterlatte-behandling/src/test/kotlin/inntektsjustering/selvbetjening/InntektsjusteringSelvbetjeningServiceTest.kt diff --git a/apps/etterlatte-behandling/src/main/kotlin/Application.kt b/apps/etterlatte-behandling/src/main/kotlin/Application.kt index 8e256644fbf..032a6d08e3e 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/Application.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/Application.kt @@ -34,6 +34,7 @@ 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.inntektsjustering.selvbetjening.inntektsjusteringSelvbetjeningRoute import no.nav.etterlatte.institusjonsopphold.InstitusjonsoppholdService import no.nav.etterlatte.institusjonsopphold.institusjonsoppholdRoute import no.nav.etterlatte.kodeverk.kodeverk @@ -189,6 +190,7 @@ private fun Route.settOppRoutes(applicationContext: ApplicationContext) { ) omregningRoutes(omregningService = applicationContext.omregningService) aarligInntektsjusteringRoute(service = applicationContext.aarligInntektsjusteringJobbService) + inntektsjusteringSelvbetjeningRoute(service = applicationContext.inntektsjusteringSelvbetjeningService) migreringRoutes(migreringService = applicationContext.migreringService) bosattUtlandRoutes(bosattUtlandService = applicationContext.bosattUtlandService) behandlingsstatusRoutes(behandlingsstatusService = applicationContext.behandlingsStatusService) diff --git a/apps/etterlatte-behandling/src/main/kotlin/behandling/revurdering/RevurderingRoutes.kt b/apps/etterlatte-behandling/src/main/kotlin/behandling/revurdering/RevurderingRoutes.kt index 7d908570119..d3c4be954d9 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/behandling/revurdering/RevurderingRoutes.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/revurdering/RevurderingRoutes.kt @@ -82,11 +82,11 @@ internal fun Route.revurderingRoutes( post("manuell-inntektsjustering") { kunSaksbehandlerMedSkrivetilgang { saksbehandler -> - logger.info("Oppretter ny revurdering for årlig inntektsjustering på sak $sakId") + logger.info("Oppretter ny revurdering for årlig manuell inntektsjustering på sak $sakId") medBody { val revurdering = inTransaction { - aarligInntektsjusteringJobbService.opprettManuellInntektsjustering( + aarligInntektsjusteringJobbService.opprettRevurderingForAarligInntektsjustering( sakId, it.oppgaveId, saksbehandler, diff --git a/apps/etterlatte-behandling/src/main/kotlin/config/ApplicationContext.kt b/apps/etterlatte-behandling/src/main/kotlin/config/ApplicationContext.kt index 4f922c200a2..57f116212cf 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/config/ApplicationContext.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/config/ApplicationContext.kt @@ -100,6 +100,7 @@ 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.inntektsjustering.selvbetjening.InntektsjusteringSelvbetjeningService import no.nav.etterlatte.institusjonsopphold.InstitusjonsoppholdDao import no.nav.etterlatte.jobs.MetrikkerJob import no.nav.etterlatte.kafka.GcpKafkaConfig @@ -471,6 +472,13 @@ internal class ApplicationContext( ) val doedshendelseService = DoedshendelseService(doedshendelseDao, pdlTjenesterKlient) + val inntektsjusteringSelvbetjeningService = + InntektsjusteringSelvbetjeningService( + oppgaveService = oppgaveService, + rapid = rapid, + featureToggleService = featureToggleService, + ) + val aarligInntektsjusteringJobbService = AarligInntektsjusteringJobbService( omregningService = omregningService, diff --git a/apps/etterlatte-behandling/src/main/kotlin/inntektsjustering/AarligInntektsjusteringRoute.kt b/apps/etterlatte-behandling/src/main/kotlin/inntektsjustering/AarligInntektsjusteringJobbRoute.kt similarity index 87% rename from apps/etterlatte-behandling/src/main/kotlin/inntektsjustering/AarligInntektsjusteringRoute.kt rename to apps/etterlatte-behandling/src/main/kotlin/inntektsjustering/AarligInntektsjusteringJobbRoute.kt index b5e5a77a10b..b4b11e808c8 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/inntektsjustering/AarligInntektsjusteringRoute.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/inntektsjustering/AarligInntektsjusteringJobbRoute.kt @@ -11,9 +11,9 @@ import no.nav.etterlatte.libs.common.inntektsjustering.AarligInntektsjusteringRe internal fun Route.aarligInntektsjusteringRoute(service: AarligInntektsjusteringJobbService) { route("/inntektsjustering") { - post("jobb") { + post("aarlig-jobb") { val request = call.receive() - service.startAarligInntektsjustering(request) + service.startAarligInntektsjusteringJobb(request) call.respond(HttpStatusCode.OK) } } diff --git a/apps/etterlatte-behandling/src/main/kotlin/inntektsjustering/AarligInntektsjusteringJobbService.kt b/apps/etterlatte-behandling/src/main/kotlin/inntektsjustering/AarligInntektsjusteringJobbService.kt index 1112c588451..02b7d0c8d73 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/inntektsjustering/AarligInntektsjusteringJobbService.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/inntektsjustering/AarligInntektsjusteringJobbService.kt @@ -7,6 +7,7 @@ import no.nav.etterlatte.behandling.domain.Behandling import no.nav.etterlatte.behandling.domain.Revurdering import no.nav.etterlatte.behandling.klienter.BeregningKlient import no.nav.etterlatte.behandling.klienter.VedtakKlient +import no.nav.etterlatte.behandling.omregning.OmregningKlassifikasjonskodeJobService.Companion.kjoering import no.nav.etterlatte.behandling.omregning.OmregningService import no.nav.etterlatte.behandling.revurdering.RevurderingService import no.nav.etterlatte.common.klienter.PdlTjenesterKlient @@ -76,13 +77,15 @@ class AarligInntektsjusteringJobbService( ) { private val logger = LoggerFactory.getLogger(this::class.java) - fun startAarligInntektsjustering(request: AarligInntektsjusteringRequest) { + fun startAarligInntektsjusteringJobb(request: AarligInntektsjusteringRequest) { + logger.info("Starter årlig inntektsjusteringjobb $kjoering") request.saker.forEach { sakId -> startEnkeltSak(request.kjoering, request.loependeFom, sakId) } } - fun opprettManuellInntektsjustering( + // i det tilfelle hvor aarligInntektsjusteringJobb ikka kan behandle sak atuomatisk, + fun opprettRevurderingForAarligInntektsjustering( sakId: SakId, oppgaveId: UUID, saksbehandler: Saksbehandler, @@ -100,7 +103,9 @@ class AarligInntektsjusteringJobbService( val begrunnelse = oppgaveService.hentOppgave(oppgaveId).merknad val loependeFom = AarligInntektsjusteringRequest.utledLoependeFom() val revurdering = nyManuellRevurdering(sakId, hentForrigeBehandling(sakId), loependeFom, begrunnelse!!) + oppgaveService.ferdigstillOppgave(oppgaveId, saksbehandler) + return revurdering } @@ -109,7 +114,7 @@ class AarligInntektsjusteringJobbService( loependeFom: YearMonth, sakId: SakId, ) = inTransaction { - logger.info("Årlig inntektsjusteringsjobb $kjoering for $sakId") + logger.info("Årlig inntektsjusteringsjobb $kjoering for sak $sakId") try { val vedtak = runBlocking { @@ -122,7 +127,6 @@ class AarligInntektsjusteringJobbService( } val forrigeBehandling = hentForrigeBehandling(sakId) - val avkortingSjekk = hentAvkortingSjekk(sakId, loependeFom, forrigeBehandling.id) if (avkortingSjekk.harInntektForAar) { @@ -152,7 +156,7 @@ class AarligInntektsjusteringJobbService( } } - fun maaGjoeresManuelt( + private fun maaGjoeresManuelt( kjoering: String, sakId: SakId, loependeFom: YearMonth, @@ -209,7 +213,6 @@ class AarligInntektsjusteringJobbService( } val opplysningerGjenny = hentOpplysningerGjenny(sak, forrigeBehandling.id) - val opplysningerPdl = hentPdlPersonopplysning(sak) if (!opplysningerPdl.vergemaalEllerFremtidsfullmakt.isNullOrEmpty()) { @@ -370,7 +373,7 @@ class AarligInntektsjusteringJobbService( OmregningData( kjoering = kjoering, sakId = sakId, - revurderingaarsak = Revurderingaarsak.AARLIG_INNTEKTSJUSTERING, + revurderingaarsak = Revurderingaarsak.INNTEKTSENDRING, fradato = loependeFom.atDay(1), ).toPacket(), ), diff --git a/apps/etterlatte-behandling/src/main/kotlin/inntektsjustering/selvbetjening/InntektsjusteringSelvbetjeningRoute.kt b/apps/etterlatte-behandling/src/main/kotlin/inntektsjustering/selvbetjening/InntektsjusteringSelvbetjeningRoute.kt new file mode 100644 index 00000000000..6f59f164a83 --- /dev/null +++ b/apps/etterlatte-behandling/src/main/kotlin/inntektsjustering/selvbetjening/InntektsjusteringSelvbetjeningRoute.kt @@ -0,0 +1,20 @@ +package no.nav.etterlatte.inntektsjustering.selvbetjening + +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.InntektsjusteringRequest + +internal fun Route.inntektsjusteringSelvbetjeningRoute(service: InntektsjusteringSelvbetjeningService) { + route("/inntektsjustering") { + post("behandle") { + val request = call.receive() + service.behandleInntektsjustering(request) + call.respond(HttpStatusCode.OK) + } + } +} diff --git a/apps/etterlatte-behandling/src/main/kotlin/inntektsjustering/selvbetjening/InntektsjusteringSelvbetjeningService.kt b/apps/etterlatte-behandling/src/main/kotlin/inntektsjustering/selvbetjening/InntektsjusteringSelvbetjeningService.kt new file mode 100644 index 00000000000..68e6cd4fdc2 --- /dev/null +++ b/apps/etterlatte-behandling/src/main/kotlin/inntektsjustering/selvbetjening/InntektsjusteringSelvbetjeningService.kt @@ -0,0 +1,117 @@ +package no.nav.etterlatte.inntektsjustering.selvbetjening + +import no.nav.etterlatte.funksjonsbrytere.FeatureToggle +import no.nav.etterlatte.funksjonsbrytere.FeatureToggleService +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.InntektsjusteringRequest +import no.nav.etterlatte.libs.common.logging.getCorrelationId +import no.nav.etterlatte.libs.common.oppgave.OppgaveKilde +import no.nav.etterlatte.libs.common.oppgave.OppgaveType +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.SakId +import no.nav.etterlatte.libs.common.tidspunkt.Tidspunkt +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 org.slf4j.LoggerFactory +import java.time.YearMonth + +class InntektsjusteringSelvbetjeningService( + private val oppgaveService: OppgaveService, + private val rapid: KafkaProdusent, + private val featureToggleService: FeatureToggleService, +) { + private val logger = LoggerFactory.getLogger(this::class.java) + + fun behandleInntektsjustering(request: InntektsjusteringRequest) { + logger.info("Starter behandling av innmeldt inntektsjustering for sak ${request.sak.sakId}") + + if (skalGjoeresAutomatisk()) { + startAutomatiskBehandling( + request, + SakId(request.sak.sakId), + ) + } else { + startManuellBehandling(request) + } + } + + private fun startAutomatiskBehandling( + request: InntektsjusteringRequest, + sakId: SakId, + ) { + logger.info("Behandles automatisk: starter omregning for sak ${request.sak.sakId}") + publiserKlarForOmregning( + sakId, + InntektsjusteringRequest.utledLoependeFom(), + InntektsjusteringRequest.utledKjoering(request.inntektsjusteringId), + ) + } + + private fun startManuellBehandling(request: InntektsjusteringRequest) { + logger.info("Behandles manuelt: oppretter oppgave for mottatt inntektsjustering for sak ${request.sak.sakId}") + oppgaveService.opprettOppgave( + sakId = SakId(request.sak.sakId), + kilde = OppgaveKilde.BRUKERDIALOG, + type = OppgaveType.MOTTATT_INNTEKTSJUSTERING, + merknad = "Mottatt inntektsjustering", + referanse = request.journalpostId, + ) + } + + private fun publiserKlarForOmregning( + sakId: SakId, + loependeFom: YearMonth, + kjoering: String, + ) { + val correlationId = getCorrelationId() + rapid + .publiser( + "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 = kjoering, + sakId = sakId, + revurderingaarsak = Revurderingaarsak.INNTEKTSENDRING, + 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 skalGjoeresAutomatisk(): Boolean { + val featureToggle = + featureToggleService.isEnabled( + InntektsjusterinFeatureToggle.AUTOMATISK_BEHANDLE, + false, + ) + + // TODO: sjekke om riktig tilstand for automatisk behandling + return featureToggle + } + + enum class InntektsjusterinFeatureToggle( + private val key: String, + ) : FeatureToggle { + AUTOMATISK_BEHANDLE("inntektsjustering-automatisk-behandle"), + ; + + override fun key() = key + } +} diff --git a/apps/etterlatte-behandling/src/test/kotlin/inntektsjustering/AarligInntektsjusteringJobbServiceTest.kt b/apps/etterlatte-behandling/src/test/kotlin/inntektsjustering/AarligInntektsjusteringJobbServiceTest.kt index 9f226be9a30..6f1d67c1550 100644 --- a/apps/etterlatte-behandling/src/test/kotlin/inntektsjustering/AarligInntektsjusteringJobbServiceTest.kt +++ b/apps/etterlatte-behandling/src/test/kotlin/inntektsjustering/AarligInntektsjusteringJobbServiceTest.kt @@ -183,7 +183,7 @@ class AarligInntektsjusteringJobbServiceTest { val exception = assertThrows { - service.opprettManuellInntektsjustering(sakId, oppgaveId, mockk()) + service.opprettRevurderingForAarligInntektsjustering(sakId, oppgaveId, mockk()) } exception.code shouldBe "KAN_IKKE_OPPRETTE_REVURDERING_PGA_AAPNE_BEHANDLINGER" } @@ -198,7 +198,7 @@ class AarligInntektsjusteringJobbServiceTest { coEvery { oppgaveService.ferdigstillOppgave(oppgaveId, any()) } returns mockk() coEvery { oppgaveService.hentOppgave(oppgaveId) } returns oppgave - val revurdering = service.opprettManuellInntektsjustering(sakId, oppgaveId, mockk()) + val revurdering = service.opprettRevurderingForAarligInntektsjustering(sakId, oppgaveId, mockk()) verify { revurderingService.opprettRevurdering( sakId = sakId, @@ -236,7 +236,7 @@ class AarligInntektsjusteringJobbServiceTest { ) runBlocking { - service.startAarligInntektsjustering(request) + service.startAarligInntektsjusteringJobb(request) } verify { @@ -277,7 +277,7 @@ class AarligInntektsjusteringJobbServiceTest { every { omregningService.oppdaterKjoering(any()) } returns mockk() runBlocking { - service.startAarligInntektsjustering(request) + service.startAarligInntektsjusteringJobb(request) } verify { @@ -321,7 +321,7 @@ class AarligInntektsjusteringJobbServiceTest { every { omregningService.oppdaterKjoering(any()) } returns mockk() runBlocking { - service.startAarligInntektsjustering(request) + service.startAarligInntektsjusteringJobb(request) } verify { @@ -357,7 +357,7 @@ class AarligInntektsjusteringJobbServiceTest { every { oppgaveService.opprettOppgave(any(), any(), any(), any(), any()) } returns mockk() runBlocking { - service.startAarligInntektsjustering(request) + service.startAarligInntektsjusteringJobb(request) } // TODO verifer opprettelse rev @@ -391,7 +391,7 @@ class AarligInntektsjusteringJobbServiceTest { every { oppgaveService.opprettOppgave(any(), any(), any(), any(), any()) } returns mockk() runBlocking { - service.startAarligInntektsjustering(request) + service.startAarligInntektsjusteringJobb(request) } // TODO verifer opprettelse rev @@ -436,7 +436,7 @@ class AarligInntektsjusteringJobbServiceTest { every { omregningService.oppdaterKjoering(any()) } returns mockk() runBlocking { - service.startAarligInntektsjustering(request) + service.startAarligInntektsjusteringJobb(request) } verify { @@ -468,7 +468,7 @@ class AarligInntektsjusteringJobbServiceTest { every { omregningService.oppdaterKjoering(any()) } returns mockk() runBlocking { - service.startAarligInntektsjustering(request) + service.startAarligInntektsjusteringJobb(request) } verify { @@ -505,7 +505,7 @@ class AarligInntektsjusteringJobbServiceTest { every { omregningService.oppdaterKjoering(any()) } returns mockk() runBlocking { - service.startAarligInntektsjustering(request) + service.startAarligInntektsjusteringJobb(request) } verify { @@ -536,7 +536,7 @@ class AarligInntektsjusteringJobbServiceTest { every { omregningService.oppdaterKjoering(any()) } returns mockk() runBlocking { - service.startAarligInntektsjustering(request) + service.startAarligInntektsjusteringJobb(request) } verify { @@ -576,7 +576,7 @@ class AarligInntektsjusteringJobbServiceTest { every { omregningService.oppdaterKjoering(any()) } returns mockk() runBlocking { - service.startAarligInntektsjustering(request) + service.startAarligInntektsjusteringJobb(request) } // TODO verifer opprettelse rev @@ -640,7 +640,7 @@ class AarligInntektsjusteringJobbServiceTest { every { omregningService.oppdaterKjoering(any()) } returns mockk() runBlocking { - service.startAarligInntektsjustering(request) + service.startAarligInntektsjusteringJobb(request) } // TODO verifer opprettelse rev diff --git a/apps/etterlatte-behandling/src/test/kotlin/inntektsjustering/selvbetjening/InntektsjusteringSelvbetjeningServiceTest.kt b/apps/etterlatte-behandling/src/test/kotlin/inntektsjustering/selvbetjening/InntektsjusteringSelvbetjeningServiceTest.kt new file mode 100644 index 00000000000..60fa8ec9ae8 --- /dev/null +++ b/apps/etterlatte-behandling/src/test/kotlin/inntektsjustering/selvbetjening/InntektsjusteringSelvbetjeningServiceTest.kt @@ -0,0 +1,89 @@ +package no.nav.etterlatte.inntektsjustering.selvbetjening + +import io.mockk.Called +import io.mockk.clearAllMocks +import io.mockk.every +import io.mockk.mockk +import io.mockk.verify +import no.nav.etterlatte.funksjonsbrytere.FeatureToggleService +import no.nav.etterlatte.kafka.KafkaProdusent +import no.nav.etterlatte.libs.common.inntektsjustering.InntektsjusteringRequest +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.nyKontekstMedBruker +import no.nav.etterlatte.oppgave.OppgaveService +import org.junit.jupiter.api.BeforeAll +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.TestInstance +import java.util.UUID + +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +class InntektsjusteringSelvbetjeningServiceTest { + private val oppgaveService: OppgaveService = mockk() + private val rapid: KafkaProdusent = mockk() + private val featureToggleService: FeatureToggleService = mockk() + + val service = + InntektsjusteringSelvbetjeningService( + oppgaveService, + rapid, + featureToggleService, + ) + + @BeforeAll + fun setup() { + nyKontekstMedBruker(mockk()) + } + + @BeforeEach + fun beforeEach() { + clearAllMocks() + every { rapid.publiser(any(), any()) } returns Pair(1, 1L) + } + + @Test + fun `skal behandle inntektsjustering automatisk hvis featureToggle = true`() { + every { featureToggleService.isEnabled(any(), any()) } returns true + + val inntektsjusteringRequest = InntektsjusteringRequest(SakId(123L), "123", UUID.randomUUID()) + service.behandleInntektsjustering(inntektsjusteringRequest) + verify(exactly = 1) { + rapid.publiser( + "inntektsjustering-123", + withArg { + // TODO: add args + }, + ) + } + verify(exactly = 0) { + oppgaveService wasNot Called + } + } + + @Test + fun `skal behandle inntektsjustering manuelt hvis featureToggle = false`() { + 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()) + service.behandleInntektsjustering(inntektsjusteringRequest) + + verify(exactly = 1) { + oppgaveService.opprettOppgave( + sakId = SakId(123L), + kilde = OppgaveKilde.BRUKERDIALOG, + type = OppgaveType.MOTTATT_INNTEKTSJUSTERING, + merknad = "Mottatt inntektsjustering", + referanse = "123", + frist = null, + saksbehandler = null, + ) + } + + verify(exactly = 0) { + rapid wasNot Called + } + } +} diff --git a/apps/etterlatte-gyldig-soeknad/src/main/kotlin/no/nav/etterlatte/gyldigsoeknad/client/BehandlingClient.kt b/apps/etterlatte-gyldig-soeknad/src/main/kotlin/no/nav/etterlatte/gyldigsoeknad/client/BehandlingClient.kt index b23c049b54f..02d7c596341 100644 --- a/apps/etterlatte-gyldig-soeknad/src/main/kotlin/no/nav/etterlatte/gyldigsoeknad/client/BehandlingClient.kt +++ b/apps/etterlatte-gyldig-soeknad/src/main/kotlin/no/nav/etterlatte/gyldigsoeknad/client/BehandlingClient.kt @@ -15,6 +15,7 @@ import no.nav.etterlatte.libs.common.behandling.SakMedBehandlinger import no.nav.etterlatte.libs.common.behandling.SakType import no.nav.etterlatte.libs.common.feilhaandtering.UgyldigForespoerselException import no.nav.etterlatte.libs.common.gyldigSoeknad.GyldighetsResultat +import no.nav.etterlatte.libs.common.inntektsjustering.InntektsjusteringRequest import no.nav.etterlatte.libs.common.oppgave.NyOppgaveDto import no.nav.etterlatte.libs.common.oppgave.OppgaveIntern import no.nav.etterlatte.libs.common.sak.Sak @@ -52,6 +53,26 @@ class BehandlingClient( UUID.fromString(response.body()) } + fun behandleInntektsjustering( + sakId: SakId, + journalPostId: String, + inntektsjusteringId: UUID, + ) { + runBlocking { + sakOgBehandlingApp + .post("$url/inntektsjustering/behandle") { + contentType(ContentType.Application.Json) + setBody( + InntektsjusteringRequest( + sak = sakId, + journalpostId = journalPostId, + inntektsjusteringId = inntektsjusteringId, + ), + ) + }.body() + } + } + fun finnEllerOpprettSak( fnr: String, saktype: SakType, diff --git a/apps/etterlatte-gyldig-soeknad/src/main/kotlin/no/nav/etterlatte/inntektsjustering/InntektsjusteringRiver.kt b/apps/etterlatte-gyldig-soeknad/src/main/kotlin/no/nav/etterlatte/inntektsjustering/InntektsjusteringRiver.kt index 4cd38759316..18b115202ed 100644 --- a/apps/etterlatte-gyldig-soeknad/src/main/kotlin/no/nav/etterlatte/inntektsjustering/InntektsjusteringRiver.kt +++ b/apps/etterlatte-gyldig-soeknad/src/main/kotlin/no/nav/etterlatte/inntektsjustering/InntektsjusteringRiver.kt @@ -4,20 +4,20 @@ import com.fasterxml.jackson.databind.JsonMappingException import com.fasterxml.jackson.module.kotlin.readValue 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.objectMapper -import no.nav.etterlatte.libs.common.oppgave.NyOppgaveDto -import no.nav.etterlatte.libs.common.oppgave.OppgaveKilde -import no.nav.etterlatte.libs.common.oppgave.OppgaveType +import no.nav.etterlatte.libs.common.sak.Sak import no.nav.etterlatte.rapidsandrivers.ListenerMedLogging import no.nav.etterlatte.sikkerLogg 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, @@ -38,29 +38,21 @@ internal class InntektsjusteringRiver( ) { val inntektsjustering = packet.inntektsjustering() try { - logger.info("Mottatt inntektsjustering (id=${inntektsjustering.id})") + logger.info("Mottatt innmeldt inntektsjustering (id=${inntektsjustering.id})") val sak = runBlocking { behandlingKlient.finnEllerOpprettSak(inntektsjustering.fnr, SakType.OMSTILLINGSSTOENAD) } - val journalpostResponse = journalfoerInntektsjusteringService.opprettJournalpost(sak, inntektsjustering) + val journalpostResponse = + journalfoerInntektsjusteringService.opprettJournalpost(sak, inntektsjustering) + ?: run { + logger.warn("Kan ikke fortsette uten respons fra dokarkiv. Retry kjøres automatisk...") + return + } - if (journalpostResponse == null) { - logger.warn("Kan ikke fortsette uten respons fra dokarkiv. Retry kjøres automatisk...") - return - } else { - behandlingKlient.opprettOppgave( - sak.id, - NyOppgaveDto( - OppgaveKilde.BRUKERDIALOG, - OppgaveType.MOTTATT_INNTEKTSJUSTERING, - merknad = "Mottatt inntektsjustering", - referanse = journalpostResponse.journalpostId, - ), - ) - } + startBehandlingAvInntektsjustering(sak, journalpostResponse, inntektsjustering.id) } catch (e: JsonMappingException) { sikkerLogg.error("Feil under deserialisering", e) logger.error("Feil under deserialisering av inntektsjustering (id=${inntektsjustering.id}). Se sikkerlogg for detaljer.") @@ -71,6 +63,18 @@ internal class InntektsjusteringRiver( } } + private fun startBehandlingAvInntektsjustering( + sak: Sak, + journalpostResponse: OpprettJournalpostResponse, + inntektsjusteringId: UUID, + ) { + behandlingKlient.behandleInntektsjustering( + sak.id, + journalpostResponse.journalpostId, + inntektsjusteringId, + ) + } + private fun JsonMessage.inntektsjustering(): Inntektsjustering = objectMapper.readValue(this[InntektsjusteringInnsendt.inntektsjusteringInnhold].textValue()) } diff --git a/apps/etterlatte-gyldig-soeknad/src/test/kotlin/no/nav/etterlatte/inntektsjustering/InntektsjusteringRiverTest.kt b/apps/etterlatte-gyldig-soeknad/src/test/kotlin/no/nav/etterlatte/inntektsjustering/InntektsjusteringRiverTest.kt index c737520ebf4..468bfd07b4b 100644 --- a/apps/etterlatte-gyldig-soeknad/src/test/kotlin/no/nav/etterlatte/inntektsjustering/InntektsjusteringRiverTest.kt +++ b/apps/etterlatte-gyldig-soeknad/src/test/kotlin/no/nav/etterlatte/inntektsjustering/InntektsjusteringRiverTest.kt @@ -2,8 +2,10 @@ package no.nav.etterlatte.inntektsjustering import com.fasterxml.jackson.module.kotlin.readValue import io.kotest.matchers.shouldBe +import io.mockk.Runs import io.mockk.coEvery import io.mockk.coVerify +import io.mockk.just import io.mockk.mockk import io.mockk.slot import no.nav.etterlatte.behandling.randomSakId @@ -22,9 +24,6 @@ import no.nav.etterlatte.libs.common.event.InntektsjusteringInnsendtHendelseType import no.nav.etterlatte.libs.common.innsendtsoeknad.common.PDFMal import no.nav.etterlatte.libs.common.inntektsjustering.Inntektsjustering import no.nav.etterlatte.libs.common.objectMapper -import no.nav.etterlatte.libs.common.oppgave.NyOppgaveDto -import no.nav.etterlatte.libs.common.oppgave.OppgaveKilde -import no.nav.etterlatte.libs.common.oppgave.OppgaveType import no.nav.etterlatte.libs.common.sak.Sak import no.nav.etterlatte.libs.common.toJson import no.nav.helse.rapids_rivers.JsonMessage @@ -71,7 +70,7 @@ internal class InntektsjusteringRiverTest { "JournalId123", true, ) - coEvery { behandlingKlientMock.opprettOppgave(any(), any()) } returns UUID.randomUUID() + coEvery { behandlingKlientMock.behandleInntektsjustering(any(), any(), any()) } just Runs val melding = JsonMessage @@ -93,15 +92,7 @@ internal class InntektsjusteringRiverTest { dokarkivKlientMock.opprettJournalpost(capture(journalRequest)) pdfgenKlient.genererPdf(capture(pdfDataSlot), "inntektsjustering_nytt_aar_v1") - behandlingKlientMock.opprettOppgave( - sak.id, - NyOppgaveDto( - OppgaveKilde.BRUKERDIALOG, - OppgaveType.MOTTATT_INNTEKTSJUSTERING, - merknad = "Mottatt inntektsjustering", - referanse = "JournalId123", - ), - ) + behandlingKlientMock.behandleInntektsjustering(sak.id, any(), any()) } with(journalRequest.captured) { tittel shouldBe "Inntektsjustering 2025" diff --git a/apps/etterlatte-oppdater-behandling/src/main/kotlin/BehandlingService.kt b/apps/etterlatte-oppdater-behandling/src/main/kotlin/BehandlingService.kt index 6a5934eb993..e1a6d6a1b71 100644 --- a/apps/etterlatte-oppdater-behandling/src/main/kotlin/BehandlingService.kt +++ b/apps/etterlatte-oppdater-behandling/src/main/kotlin/BehandlingService.kt @@ -299,7 +299,7 @@ class BehandlingServiceImpl( override fun startAarligInntektsjustering(request: AarligInntektsjusteringRequest) = runBlocking { - behandlingKlient.post("$url/inntektsjustering/jobb") { + behandlingKlient.post("$url/inntektsjustering/aarlig-jobb") { contentType(ContentType.Application.Json) setBody(request) } diff --git a/libs/etterlatte-behandling-model/src/main/kotlin/no/nav/etterlatte/libs/common/inntektsjustering/AarligInntektsjusteringRequest.kt b/libs/etterlatte-behandling-model/src/main/kotlin/no/nav/etterlatte/libs/common/inntektsjustering/AarligInntektsjusteringRequest.kt index 316a043e5ee..04013ed047a 100644 --- a/libs/etterlatte-behandling-model/src/main/kotlin/no/nav/etterlatte/libs/common/inntektsjustering/AarligInntektsjusteringRequest.kt +++ b/libs/etterlatte-behandling-model/src/main/kotlin/no/nav/etterlatte/libs/common/inntektsjustering/AarligInntektsjusteringRequest.kt @@ -3,6 +3,7 @@ package no.nav.etterlatte.libs.common.inntektsjustering import no.nav.etterlatte.libs.common.sak.SakId import java.time.Year import java.time.YearMonth +import java.util.UUID data class AarligInntektsjusteringRequest( val kjoering: String, @@ -15,3 +16,15 @@ data class AarligInntektsjusteringRequest( fun utledLoependeFom() = YearMonth.of(Year.now().value, 1).plusYears(1) } } + +data class InntektsjusteringRequest( + val sak: SakId, + val journalpostId: String, + val inntektsjusteringId: UUID, +) { + companion object { + fun utledKjoering(id: UUID) = "INNTEKTSJUSTERING_${utledLoependeFom()}_$id" + + fun utledLoependeFom() = YearMonth.of(Year.now().value, 1).plusYears(1) + } +}