From 5ab1b4165deb89dedb89831583434a06b496040e Mon Sep 17 00:00:00 2001 From: Mikael Bjerga Date: Thu, 18 Jul 2024 14:43:38 +0200 Subject: [PATCH 1/2] =?UTF-8?q?St=C3=B8tt=20ny=20skjemaklasse?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/innsending/InnsendingRoute.kt | 14 +++++++++++- .../LagreSelvbestemtImRoute.kt | 1 + .../innsending/InnsendingService.kt | 22 ++++++++++++++++--- 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/innsending/InnsendingRoute.kt b/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/innsending/InnsendingRoute.kt index 2e442177a..77e07b743 100644 --- a/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/innsending/InnsendingRoute.kt +++ b/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/innsending/InnsendingRoute.kt @@ -9,7 +9,10 @@ import io.prometheus.client.Summary import kotlinx.serialization.SerializationException import kotlinx.serialization.builtins.serializer import no.nav.helse.rapids_rivers.RapidsConnection +import no.nav.helsearbeidsgiver.domene.inntektsmelding.Utils.convert import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Innsending +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.AarsakInnsending +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.skjema.SkjemaInntektsmelding import no.nav.helsearbeidsgiver.felles.ResultJson import no.nav.helsearbeidsgiver.felles.Tekst import no.nav.helsearbeidsgiver.inntektsmelding.api.RedisPoller @@ -67,7 +70,16 @@ fun Route.innsendingRoute( logger.info(it) sikkerLogger.info("$it og request:\n$json") } - }.fromJson(Innsending.serializer()) + }.let { json -> + runCatching { + json.fromJson(SkjemaInntektsmelding.serializer()).convert( + sykmeldingsperioder = emptyList(), + aarsakInnsending = AarsakInnsending.Ny, + ) + }.getOrElse { + json.fromJson(Innsending.serializer()) + } + } tilgangskontroll.validerTilgangTilForespoersel(call.request, forespoerselId) diff --git a/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/lagreselvbestemtim/LagreSelvbestemtImRoute.kt b/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/lagreselvbestemtim/LagreSelvbestemtImRoute.kt index 9d60e727f..8fba9adb3 100644 --- a/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/lagreselvbestemtim/LagreSelvbestemtImRoute.kt +++ b/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/lagreselvbestemtim/LagreSelvbestemtImRoute.kt @@ -166,6 +166,7 @@ private suspend fun PipelineContext.sendResponse(resultat } } +// TODO slett når frontend bruker korrekte navn private fun JsonElement.fromJsonBackup(error: Throwable): SkjemaInntektsmeldingSelvbestemt { val skjemaJson = jsonObject val inntektJson = skjemaJson[SkjemaInntektsmeldingSelvbestemt::inntekt.name]!!.jsonObject diff --git a/innsending/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/innsending/InnsendingService.kt b/innsending/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/innsending/InnsendingService.kt index b93ff7fb3..e56a34f36 100644 --- a/innsending/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/innsending/InnsendingService.kt +++ b/innsending/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/innsending/InnsendingService.kt @@ -3,8 +3,11 @@ package no.nav.helsearbeidsgiver.inntektsmelding.innsending import kotlinx.serialization.builtins.serializer import kotlinx.serialization.json.JsonElement import no.nav.helse.rapids_rivers.RapidsConnection +import no.nav.helsearbeidsgiver.domene.inntektsmelding.Utils.convert import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Innsending import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Inntektsmelding +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.AarsakInnsending +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.skjema.SkjemaInntektsmelding import no.nav.helsearbeidsgiver.felles.BehovType import no.nav.helsearbeidsgiver.felles.EventName import no.nav.helsearbeidsgiver.felles.Forespoersel @@ -21,6 +24,7 @@ import no.nav.helsearbeidsgiver.felles.rapidsrivers.redis.RedisKey import no.nav.helsearbeidsgiver.felles.rapidsrivers.redis.RedisStoreClassSpecific import no.nav.helsearbeidsgiver.felles.rapidsrivers.service.ServiceMed2Steg import no.nav.helsearbeidsgiver.felles.utils.Log +import no.nav.helsearbeidsgiver.utils.json.fromJson import no.nav.helsearbeidsgiver.utils.json.serializer.UuidSerializer import no.nav.helsearbeidsgiver.utils.json.toJson import no.nav.helsearbeidsgiver.utils.json.toPretty @@ -37,7 +41,7 @@ data class Steg0( val orgnr: Orgnr, val sykmeldtFnr: Fnr, val avsenderFnr: Fnr, - val skjema: Innsending, + val skjema: JsonElement, ) sealed class Steg1 { @@ -89,7 +93,7 @@ class InnsendingService( orgnr = Key.ORGNRUNDERENHET.les(Orgnr.serializer(), melding), sykmeldtFnr = Key.IDENTITETSNUMMER.les(Fnr.serializer(), melding), avsenderFnr = Key.ARBEIDSGIVER_ID.les(Fnr.serializer(), melding), - skjema = Key.SKJEMA_INNTEKTSMELDING.les(Innsending.serializer(), melding), + skjema = Key.SKJEMA_INNTEKTSMELDING.les(JsonElement.serializer(), melding), ) override fun lesSteg1(melding: Map): Steg1 { @@ -154,10 +158,22 @@ class InnsendingService( steg1: Steg1, ) { if (steg1 is Steg1.Komplett) { + val skjema = + runCatching { + steg0.skjema + .fromJson(SkjemaInntektsmelding.serializer()) + .convert( + sykmeldingsperioder = steg1.forespoersel.sykmeldingsperioder, + aarsakInnsending = AarsakInnsending.Ny, + ) + }.getOrElse { + steg0.skjema.fromJson(Innsending.serializer()) + } + val inntektsmelding = mapInntektsmelding( forespoersel = steg1.forespoersel, - skjema = steg0.skjema, + skjema = skjema, fulltnavnArbeidstaker = steg1.sykmeldt.navn, virksomhetNavn = steg1.orgNavn, innsenderNavn = steg1.avsender.navn, From e826722b2ea72d478436197039fc47b83c7aa70e Mon Sep 17 00:00:00 2001 From: Mikael Bjerga Date: Wed, 24 Jul 2024 14:01:27 +0200 Subject: [PATCH 2/2] =?UTF-8?q?Sett=20innsendings=C3=A5rsak=20basert=20p?= =?UTF-8?q?=C3=A5=20tidligere=20lagrede=20inntektsmeldinger?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../innsending/InnsendingService.kt | 28 +++++++++++++++++-- .../integrasjonstest/InnsendingServiceIT.kt | 27 +++++++++++++++++- 2 files changed, 52 insertions(+), 3 deletions(-) diff --git a/innsending/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/innsending/InnsendingService.kt b/innsending/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/innsending/InnsendingService.kt index 5f6c286e0..64cb2b9a0 100644 --- a/innsending/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/innsending/InnsendingService.kt +++ b/innsending/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/innsending/InnsendingService.kt @@ -47,6 +47,7 @@ data class Steg0( sealed class Steg1 { data class Komplett( val forespoersel: Forespoersel, + val aarsakInnsending: AarsakInnsending, val orgNavn: String, val sykmeldt: PersonDato, val avsender: PersonDato, @@ -84,6 +85,8 @@ class InnsendingService( Key.INNTEKTSMELDING_DOKUMENT, Key.ER_DUPLIKAT_IM, Key.FORESPOERSEL_SVAR, + Key.LAGRET_INNTEKTSMELDING, + Key.EKSTERN_INNTEKTSMELDING, ) override fun lesSteg0(melding: Map): Steg0 = @@ -98,15 +101,25 @@ class InnsendingService( override fun lesSteg1(melding: Map): Steg1 { val forespoersel = runCatching { Key.FORESPOERSEL_SVAR.les(Forespoersel.serializer(), melding) } + val tidligereInntektsmelding = runCatching { Key.LAGRET_INNTEKTSMELDING.les(ResultJson.serializer(), melding) } + val tidligereEksternInntektsmelding = runCatching { Key.EKSTERN_INNTEKTSMELDING.les(ResultJson.serializer(), melding) } val orgNavn = runCatching { Key.VIRKSOMHET.les(String.serializer(), melding) } val sykmeldt = runCatching { Key.ARBEIDSTAKER_INFORMASJON.les(PersonDato.serializer(), melding) } val avsender = runCatching { Key.ARBEIDSGIVER_INFORMASJON.les(PersonDato.serializer(), melding) } - val results = listOf(forespoersel, orgNavn, sykmeldt, avsender) + val results = listOf(forespoersel, tidligereInntektsmelding, tidligereEksternInntektsmelding, orgNavn, sykmeldt, avsender) return if (results.all { it.isSuccess }) { + val aarsakInnsending = + if (tidligereInntektsmelding.getOrThrow().success == null && tidligereEksternInntektsmelding.getOrThrow().success == null) { + AarsakInnsending.Ny + } else { + AarsakInnsending.Endring + } + Steg1.Komplett( forespoersel = forespoersel.getOrThrow(), + aarsakInnsending = aarsakInnsending, orgNavn = orgNavn.getOrThrow(), sykmeldt = sykmeldt.getOrThrow(), avsender = avsender.getOrThrow(), @@ -133,6 +146,17 @@ class InnsendingService( Key.FORESPOERSEL_ID to steg0.forespoerselId.toJson(), ).also { loggBehovPublisert(BehovType.HENT_TRENGER_IM, it) } + rapid + .publish( + Key.EVENT_NAME to eventName.toJson(), + Key.BEHOV to BehovType.HENT_LAGRET_IM.toJson(), + Key.UUID to steg0.transaksjonId.toJson(), + Key.DATA to + mapOf( + Key.FORESPOERSEL_ID to steg0.forespoerselId.toJson(), + ).toJson(), + ).also { loggBehovPublisert(BehovType.HENT_LAGRET_IM, it) } + rapid .publish( Key.EVENT_NAME to eventName.toJson(), @@ -164,7 +188,7 @@ class InnsendingService( .fromJson(SkjemaInntektsmelding.serializer()) .convert( sykmeldingsperioder = steg1.forespoersel.sykmeldingsperioder, - aarsakInnsending = AarsakInnsending.Ny, + aarsakInnsending = steg1.aarsakInnsending, ) }.getOrElse { steg0.skjema.fromJson(Innsending.serializer()) diff --git a/integrasjonstest/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/integrasjonstest/InnsendingServiceIT.kt b/integrasjonstest/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/integrasjonstest/InnsendingServiceIT.kt index f7c25eb5d..e0cad062e 100644 --- a/integrasjonstest/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/integrasjonstest/InnsendingServiceIT.kt +++ b/integrasjonstest/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/integrasjonstest/InnsendingServiceIT.kt @@ -18,8 +18,10 @@ import no.nav.helsearbeidsgiver.felles.PersonDato import no.nav.helsearbeidsgiver.felles.ResultJson import no.nav.helsearbeidsgiver.felles.json.lesOrNull import no.nav.helsearbeidsgiver.felles.json.toJson +import no.nav.helsearbeidsgiver.felles.json.toMap import no.nav.helsearbeidsgiver.felles.test.mock.gyldigInnsendingRequest import no.nav.helsearbeidsgiver.felles.test.mock.mockForespurtData +import no.nav.helsearbeidsgiver.felles.test.mock.mockInntektsmelding import no.nav.helsearbeidsgiver.inntektsmelding.helsebro.domene.ForespoerselSvar import no.nav.helsearbeidsgiver.inntektsmelding.helsebro.toForespoersel import no.nav.helsearbeidsgiver.inntektsmelding.integrasjonstest.utils.EndToEndTest @@ -37,9 +39,12 @@ import java.util.UUID class InnsendingServiceIT : EndToEndTest() { @Test fun `Test at innsending er mottatt`() { + val tidligereInntektsmelding = mockInntektsmelding() + forespoerselRepository.lagreForespoersel(Mock.forespoerselId.toString(), Mock.orgnr.verdi) forespoerselRepository.oppdaterSakId(Mock.forespoerselId.toString(), Mock.SAK_ID) forespoerselRepository.oppdaterOppgaveId(Mock.forespoerselId.toString(), Mock.OPPGAVE_ID) + imRepository.lagreInntektsmelding(Mock.forespoerselId.toString(), tidligereInntektsmelding) val transaksjonId: UUID = UUID.randomUUID() @@ -83,6 +88,24 @@ class InnsendingServiceIT : EndToEndTest() { it[Key.FORESPOERSEL_SVAR]?.fromJson(Forespoersel.serializer()) shouldBe Mock.forespoersel } + // Tidligere inntektsmelding hentet + messages + .filter(EventName.INSENDING_STARTED) + .filter(Key.LAGRET_INNTEKTSMELDING, nestedData = true) + .filter(Key.EKSTERN_INNTEKTSMELDING, nestedData = true) + .firstAsMap() + .verifiserTransaksjonId(transaksjonId) + .verifiserForespoerselId() + .also { + it shouldContainKey Key.DATA + + val data = it[Key.DATA]?.toMap().orEmpty() + val tidligereInntektsmeldingResult = ResultJson(success = tidligereInntektsmelding.toJson(Inntektsmelding.serializer())) + + data[Key.LAGRET_INNTEKTSMELDING]?.fromJson(ResultJson.serializer()) shouldBe tidligereInntektsmeldingResult + data[Key.EKSTERN_INNTEKTSMELDING]?.fromJson(ResultJson.serializer()) shouldBe ResultJson(success = null) + } + // Virksomhetsnavn hentet messages .filter(EventName.INSENDING_STARTED) @@ -183,7 +206,9 @@ class InnsendingServiceIT : EndToEndTest() { private fun Map.verifiserForespoerselId(): Map = also { - Key.FORESPOERSEL_ID.lesOrNull(UuidSerializer, it) shouldBe Mock.forespoerselId + val data = it[Key.DATA]?.toMap().orEmpty() + val forespoerselId = Key.FORESPOERSEL_ID.lesOrNull(UuidSerializer, it) ?: Key.FORESPOERSEL_ID.lesOrNull(UuidSerializer, data) + forespoerselId shouldBe Mock.forespoerselId } private object Mock {