From 4d107e613984e098a6e58f02deacceba3f5744ee Mon Sep 17 00:00:00 2001 From: Mikael Bjerga <6940327+bjerga@users.noreply.github.com> Date: Fri, 20 Dec 2024 08:58:10 +0100 Subject: [PATCH] Bruk mottatt-dato fra api-app (#810) --- .../api/innsending/InnsendingProducer.kt | 2 + .../api/innsending/InnsendingRoute.kt | 42 ++++++++++--------- .../api/kvittering/KvitteringRoute.kt | 4 +- .../LagreSelvbestemtImProducer.kt | 4 +- .../LagreSelvbestemtImRoute.kt | 25 +++++------ .../api/InnsendingProducerTest.kt | 12 +++++- .../LagreSelvbestemtImProducerTest.kt | 14 ++++++- .../BerikInntektsmeldingService.kt | 6 +++ .../MapInntektsmelding.kt | 6 ++- .../MapInntektsmeldingKtTest.kt | 17 +++++--- .../db/InntektsmeldingRepository.kt | 7 +++- .../db/river/LagreImSkjemaRiver.kt | 7 +++- .../db/InntektsmeldingRepositoryTest.kt | 27 +++++++----- .../db/river/LagreImSkjemaRiverTest.kt | 31 +++++++++----- .../no/nav/helsearbeidsgiver/felles/Key.kt | 1 + .../felles/utils/DateUtils.kt | 3 ++ .../innsending/InnsendingService.kt | 10 ++++- .../InnsendingServiceTest.kt | 4 ++ .../BerikInntektsmeldingServiceIT.kt | 5 ++- .../integrasjonstest/InnsendingIT.kt | 2 +- .../integrasjonstest/InnsendingServiceIT.kt | 3 +- .../integrasjonstest/KvitteringIT.kt | 3 +- .../LagreSelvbestemtImService.kt | 12 +++++- .../LagreSelvbestemtImServiceTest.kt | 6 ++- gradle.properties | 2 +- 25 files changed, 178 insertions(+), 77 deletions(-) diff --git a/apps/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/innsending/InnsendingProducer.kt b/apps/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/innsending/InnsendingProducer.kt index 8ba0dc6c3..fa1ef4dce 100644 --- a/apps/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/innsending/InnsendingProducer.kt +++ b/apps/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/innsending/InnsendingProducer.kt @@ -11,6 +11,7 @@ import no.nav.helsearbeidsgiver.inntektsmelding.api.sikkerLogger import no.nav.helsearbeidsgiver.utils.json.toJson import no.nav.helsearbeidsgiver.utils.json.toPretty import no.nav.helsearbeidsgiver.utils.wrapper.Fnr +import java.time.LocalDateTime import java.util.UUID class InnsendingProducer( @@ -34,6 +35,7 @@ class InnsendingProducer( mapOf( Key.ARBEIDSGIVER_FNR to arbeidsgiverFnr.toJson(), Key.SKJEMA_INNTEKTSMELDING to skjemaInntektsmelding.toJson(SkjemaInntektsmelding.serializer()), + Key.MOTTATT to LocalDateTime.now().toJson(), ).toJson(), ).also { logger.info("Publiserte til kafka forespørselId: ${skjemaInntektsmelding.forespoerselId} og transaksjonId=$transaksjonId") diff --git a/apps/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/innsending/InnsendingRoute.kt b/apps/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/innsending/InnsendingRoute.kt index d072196a9..043f9f9d5 100644 --- a/apps/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/innsending/InnsendingRoute.kt +++ b/apps/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/innsending/InnsendingRoute.kt @@ -2,10 +2,12 @@ package no.nav.helsearbeidsgiver.inntektsmelding.api.innsending import com.github.navikt.tbd_libs.rapids_and_rivers_api.RapidsConnection import io.ktor.http.HttpStatusCode +import io.ktor.server.application.ApplicationCall import io.ktor.server.application.call import io.ktor.server.request.receiveText import io.ktor.server.routing.Route import io.ktor.server.routing.post +import io.ktor.util.pipeline.PipelineContext import kotlinx.serialization.builtins.serializer import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.skjema.SkjemaInntektsmelding import no.nav.helsearbeidsgiver.felles.Tekst @@ -27,6 +29,7 @@ import no.nav.helsearbeidsgiver.inntektsmelding.api.utils.respondBadRequest import no.nav.helsearbeidsgiver.inntektsmelding.api.utils.respondInternalServerError import no.nav.helsearbeidsgiver.utils.json.fromJson import no.nav.helsearbeidsgiver.utils.json.parseJson +import no.nav.helsearbeidsgiver.utils.json.toPretty import java.util.UUID fun Route.innsending( @@ -41,25 +44,7 @@ fun Route.innsending( Metrics.innsendingEndpoint.recordTime(Route::innsending) { val transaksjonId = UUID.randomUUID() - val skjema = - call - .receiveText() - .runCatching { - parseJson() - .also { json -> - "Mottok inntektsmeldingsskjema.".let { - logger.info(it) - sikkerLogger.info("$it og request:\n$json") - } - }.fromJson(SkjemaInntektsmelding.serializer()) - }.getOrElse { error -> - "Klarte ikke parse json for inntektsmeldingsskjema.".also { - logger.error(it) - sikkerLogger.error(it, error) - } - null - } - + val skjema = lesRequestOrNull() when { skjema == null -> { respondBadRequest(JsonErrorResponse(), JsonErrorResponse.serializer()) @@ -106,3 +91,22 @@ fun Route.innsending( } } } + +private suspend fun PipelineContext.lesRequestOrNull(): SkjemaInntektsmelding? = + call + .receiveText() + .runCatching { + parseJson() + .also { json -> + "Mottok inntektsmeldingsskjema.".let { + logger.info(it) + sikkerLogger.info("$it\n${json.toPretty()}") + } + }.fromJson(SkjemaInntektsmelding.serializer()) + }.getOrElse { error -> + "Klarte ikke parse json for inntektsmeldingsskjema.".also { + logger.error(it) + sikkerLogger.error(it, error) + } + null + } diff --git a/apps/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/kvittering/KvitteringRoute.kt b/apps/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/kvittering/KvitteringRoute.kt index a7393219f..597d9ca5e 100644 --- a/apps/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/kvittering/KvitteringRoute.kt +++ b/apps/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/kvittering/KvitteringRoute.kt @@ -34,6 +34,7 @@ import no.nav.helsearbeidsgiver.inntektsmelding.api.utils.respondInternalServerE import no.nav.helsearbeidsgiver.inntektsmelding.api.utils.respondNotFound import no.nav.helsearbeidsgiver.inntektsmelding.api.utils.respondOk import no.nav.helsearbeidsgiver.utils.json.fromJson +import no.nav.helsearbeidsgiver.utils.json.toPretty import no.nav.helsearbeidsgiver.utils.pipe.orDefault import java.time.ZoneId import java.util.UUID @@ -69,10 +70,9 @@ fun Route.kvittering( kvitteringProducer.publish(transaksjonId, forespoerselId) val resultatJson = redisPoller.hent(transaksjonId) - sikkerLogger.info("Resultat for henting av kvittering for $forespoerselId: $resultatJson") - val resultat = resultatJson.success?.fromJson(InnsendtInntektsmelding.serializer()) if (resultat != null) { + sikkerLogger.info("Hentet kvittering for '$forespoerselId'.\n${resultatJson.success?.toPretty()}") if (resultat.dokument == null && resultat.eksternInntektsmelding == null) { respondNotFound("Kvittering ikke funnet for forespørselId: $forespoerselId", String.serializer()) } else { diff --git a/apps/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/lagreselvbestemtim/LagreSelvbestemtImProducer.kt b/apps/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/lagreselvbestemtim/LagreSelvbestemtImProducer.kt index b529b20f7..d2396d295 100644 --- a/apps/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/lagreselvbestemtim/LagreSelvbestemtImProducer.kt +++ b/apps/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/lagreselvbestemtim/LagreSelvbestemtImProducer.kt @@ -13,6 +13,7 @@ import no.nav.helsearbeidsgiver.utils.json.toJson import no.nav.helsearbeidsgiver.utils.json.toPretty import no.nav.helsearbeidsgiver.utils.log.MdcUtils import no.nav.helsearbeidsgiver.utils.wrapper.Fnr +import java.time.LocalDateTime import java.util.UUID class LagreSelvbestemtImProducer( @@ -38,8 +39,9 @@ class LagreSelvbestemtImProducer( Key.KONTEKST_ID to transaksjonId.toJson(), Key.DATA to mapOf( - Key.SKJEMA_INNTEKTSMELDING to skjema.toJson(SkjemaInntektsmeldingSelvbestemt.serializer()), Key.ARBEIDSGIVER_FNR to avsenderFnr.toJson(), + Key.SKJEMA_INNTEKTSMELDING to skjema.toJson(SkjemaInntektsmeldingSelvbestemt.serializer()), + Key.MOTTATT to LocalDateTime.now().toJson(), ).toJson(), ).also { logger.info("Publiserte til kafka.") diff --git a/apps/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/lagreselvbestemtim/LagreSelvbestemtImRoute.kt b/apps/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/lagreselvbestemtim/LagreSelvbestemtImRoute.kt index 6a47c0892..9765fe3d1 100644 --- a/apps/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/lagreselvbestemtim/LagreSelvbestemtImRoute.kt +++ b/apps/api/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/lagreselvbestemtim/LagreSelvbestemtImRoute.kt @@ -94,20 +94,21 @@ fun Route.lagreSelvbestemtImRoute( private suspend fun PipelineContext.lesRequestOrNull(): SkjemaInntektsmeldingSelvbestemt? = call .receiveText() - .parseJson() - .also { json -> - "Mottok selvbestemt inntektsmelding.".let { - logger.info(it) - sikkerLogger.info("$it:\n${json.toPretty()}") - } - }.runCatching { - fromJson(SkjemaInntektsmeldingSelvbestemt.serializer()) - }.onFailure { e -> - "Kunne ikke parse json.".let { + .runCatching { + parseJson() + .also { json -> + "Mottok selvbestemt inntektsmelding.".let { + logger.info(it) + sikkerLogger.info("$it\n${json.toPretty()}") + } + }.fromJson(SkjemaInntektsmeldingSelvbestemt.serializer()) + }.getOrElse { error -> + "Kunne ikke parse json for selvbestemt inntektsmeldingsskjema.".let { logger.error(it) - sikkerLogger.error(it, e) + sikkerLogger.error(it, error) } - }.getOrNull() + null + } private suspend fun PipelineContext.sendResponse(result: Result) { result diff --git a/apps/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/InnsendingProducerTest.kt b/apps/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/InnsendingProducerTest.kt index ae05769a9..da03ab63e 100644 --- a/apps/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/InnsendingProducerTest.kt +++ b/apps/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/InnsendingProducerTest.kt @@ -4,6 +4,7 @@ import com.github.navikt.tbd_libs.rapids_and_rivers.test_support.TestRapid import io.kotest.core.spec.style.FunSpec import io.kotest.matchers.ints.shouldBeExactly import io.kotest.matchers.maps.shouldContainExactly +import io.mockk.every import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.skjema.SkjemaInntektsmelding import no.nav.helsearbeidsgiver.felles.EventName import no.nav.helsearbeidsgiver.felles.Key @@ -13,8 +14,11 @@ import no.nav.helsearbeidsgiver.felles.test.mock.mockSkjemaInntektsmelding import no.nav.helsearbeidsgiver.felles.test.rapidsrivers.firstMessage import no.nav.helsearbeidsgiver.inntektsmelding.api.innsending.InnsendingProducer import no.nav.helsearbeidsgiver.utils.json.toJson +import no.nav.helsearbeidsgiver.utils.test.date.oktober +import no.nav.helsearbeidsgiver.utils.test.mock.mockStatic import no.nav.helsearbeidsgiver.utils.test.wrapper.genererGyldig import no.nav.helsearbeidsgiver.utils.wrapper.Fnr +import java.time.LocalDateTime import java.util.UUID class InnsendingProducerTest : @@ -26,8 +30,13 @@ class InnsendingProducerTest : val transaksjonId = UUID.randomUUID() val avsenderFnr = Fnr.genererGyldig() val skjema = mockSkjemaInntektsmelding() + val mottatt = 12.oktober.atStartOfDay() - producer.publish(transaksjonId, skjema, avsenderFnr) + mockStatic(LocalDateTime::class) { + every { LocalDateTime.now() } returns mottatt + + producer.publish(transaksjonId, skjema, avsenderFnr) + } testRapid.inspektør.size shouldBeExactly 1 testRapid.firstMessage().toMap() shouldContainExactly @@ -38,6 +47,7 @@ class InnsendingProducerTest : mapOf( Key.ARBEIDSGIVER_FNR to avsenderFnr.toJson(), Key.SKJEMA_INNTEKTSMELDING to skjema.toJson(SkjemaInntektsmelding.serializer()), + Key.MOTTATT to mottatt.toJson(), ).toJson(), ) } diff --git a/apps/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/lagreselvbestemtim/LagreSelvbestemtImProducerTest.kt b/apps/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/lagreselvbestemtim/LagreSelvbestemtImProducerTest.kt index b2727df6f..606f4ae89 100644 --- a/apps/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/lagreselvbestemtim/LagreSelvbestemtImProducerTest.kt +++ b/apps/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/lagreselvbestemtim/LagreSelvbestemtImProducerTest.kt @@ -4,6 +4,7 @@ import com.github.navikt.tbd_libs.rapids_and_rivers.test_support.TestRapid import io.kotest.core.spec.style.FunSpec import io.kotest.matchers.ints.shouldBeExactly import io.kotest.matchers.maps.shouldContainExactly +import io.mockk.every import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.skjema.SkjemaInntektsmeldingSelvbestemt import no.nav.helsearbeidsgiver.felles.EventName import no.nav.helsearbeidsgiver.felles.Key @@ -12,8 +13,11 @@ import no.nav.helsearbeidsgiver.felles.json.toMap import no.nav.helsearbeidsgiver.felles.test.mock.mockSkjemaInntektsmeldingSelvbestemt import no.nav.helsearbeidsgiver.felles.test.rapidsrivers.firstMessage import no.nav.helsearbeidsgiver.utils.json.toJson +import no.nav.helsearbeidsgiver.utils.test.date.oktober +import no.nav.helsearbeidsgiver.utils.test.mock.mockStatic import no.nav.helsearbeidsgiver.utils.test.wrapper.genererGyldig import no.nav.helsearbeidsgiver.utils.wrapper.Fnr +import java.time.LocalDateTime import java.util.UUID class LagreSelvbestemtImProducerTest : @@ -26,8 +30,13 @@ class LagreSelvbestemtImProducerTest : val transaksjonId = UUID.randomUUID() val avsenderFnr = Fnr.genererGyldig() val skjema = mockSkjemaInntektsmeldingSelvbestemt() + val mottatt = 14.oktober.atStartOfDay() - producer.publish(transaksjonId, skjema, avsenderFnr) + mockStatic(LocalDateTime::class) { + every { LocalDateTime.now() } returns mottatt + + producer.publish(transaksjonId, skjema, avsenderFnr) + } testRapid.inspektør.size shouldBeExactly 1 testRapid.firstMessage().toMap() shouldContainExactly @@ -36,8 +45,9 @@ class LagreSelvbestemtImProducerTest : Key.KONTEKST_ID to transaksjonId.toJson(), Key.DATA to mapOf( - Key.SKJEMA_INNTEKTSMELDING to skjema.toJson(SkjemaInntektsmeldingSelvbestemt.serializer()), Key.ARBEIDSGIVER_FNR to avsenderFnr.toJson(), + Key.SKJEMA_INNTEKTSMELDING to skjema.toJson(SkjemaInntektsmeldingSelvbestemt.serializer()), + Key.MOTTATT to mottatt.toJson(), ).toJson(), ) } diff --git a/apps/berik-inntektsmelding-service/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/berikinntektsmeldingservice/BerikInntektsmeldingService.kt b/apps/berik-inntektsmelding-service/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/berikinntektsmeldingservice/BerikInntektsmeldingService.kt index 51a177564..db9fcc329 100644 --- a/apps/berik-inntektsmelding-service/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/berikinntektsmeldingservice/BerikInntektsmeldingService.kt +++ b/apps/berik-inntektsmelding-service/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/berikinntektsmeldingservice/BerikInntektsmeldingService.kt @@ -12,6 +12,7 @@ import no.nav.helsearbeidsgiver.felles.Key import no.nav.helsearbeidsgiver.felles.domene.Forespoersel import no.nav.helsearbeidsgiver.felles.domene.Person import no.nav.helsearbeidsgiver.felles.json.les +import no.nav.helsearbeidsgiver.felles.json.lesOrNull import no.nav.helsearbeidsgiver.felles.json.orgMapSerializer import no.nav.helsearbeidsgiver.felles.json.personMapSerializer import no.nav.helsearbeidsgiver.felles.json.toJson @@ -20,6 +21,7 @@ import no.nav.helsearbeidsgiver.felles.rapidsrivers.publish import no.nav.helsearbeidsgiver.felles.rapidsrivers.service.ServiceMed4Steg import no.nav.helsearbeidsgiver.felles.utils.Log import no.nav.helsearbeidsgiver.utils.json.serializer.LocalDateSerializer +import no.nav.helsearbeidsgiver.utils.json.serializer.LocalDateTimeSerializer import no.nav.helsearbeidsgiver.utils.json.serializer.UuidSerializer import no.nav.helsearbeidsgiver.utils.json.toJson import no.nav.helsearbeidsgiver.utils.json.toPretty @@ -29,6 +31,7 @@ import no.nav.helsearbeidsgiver.utils.log.sikkerLogger import no.nav.helsearbeidsgiver.utils.wrapper.Fnr import no.nav.helsearbeidsgiver.utils.wrapper.Orgnr import java.time.LocalDate +import java.time.LocalDateTime import java.util.UUID private const val UKJENT_NAVN = "Ukjent navn" @@ -39,6 +42,7 @@ data class Steg0( val avsenderFnr: Fnr, val skjema: SkjemaInntektsmelding, val innsendingId: Long, + val mottatt: LocalDateTime?, ) data class Steg1( @@ -73,6 +77,7 @@ class BerikInntektsmeldingService( avsenderFnr = Key.ARBEIDSGIVER_FNR.les(Fnr.serializer(), melding), skjema = Key.SKJEMA_INNTEKTSMELDING.les(SkjemaInntektsmelding.serializer(), melding), innsendingId = Key.INNSENDING_ID.les(Long.serializer(), melding), + mottatt = Key.MOTTATT.lesOrNull(LocalDateTimeSerializer, melding), ) override fun lesSteg1(melding: Map): Steg1 = @@ -176,6 +181,7 @@ class BerikInntektsmeldingService( virksomhetNavn = orgNavn, sykmeldtNavn = sykmeldtNavn, avsenderNavn = avsenderNavn, + mottatt = steg0.mottatt, ) val bestemmendeFravaersdag = utledBestemmendeFravaersdag(steg1.forespoersel, inntektsmelding) diff --git a/apps/berik-inntektsmelding-service/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/berikinntektsmeldingservice/MapInntektsmelding.kt b/apps/berik-inntektsmelding-service/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/berikinntektsmeldingservice/MapInntektsmelding.kt index 27ec88894..d4c52c5ed 100644 --- a/apps/berik-inntektsmelding-service/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/berikinntektsmeldingservice/MapInntektsmelding.kt +++ b/apps/berik-inntektsmelding-service/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/berikinntektsmeldingservice/MapInntektsmelding.kt @@ -8,6 +8,9 @@ import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Sykmeldt import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.skjema.SkjemaInntektsmelding import no.nav.helsearbeidsgiver.felles.domene.Forespoersel import no.nav.helsearbeidsgiver.felles.domene.ForslagInntekt +import no.nav.helsearbeidsgiver.felles.utils.zoneIdOslo +import no.nav.helsearbeidsgiver.utils.pipe.orDefault +import java.time.LocalDateTime import java.time.ZonedDateTime import java.util.UUID @@ -18,6 +21,7 @@ fun mapInntektsmelding( virksomhetNavn: String, sykmeldtNavn: String, avsenderNavn: String, + mottatt: LocalDateTime?, ): Inntektsmelding { val agp = if (forespoersel.forespurtData.arbeidsgiverperiode.paakrevd) { @@ -74,7 +78,7 @@ fun mapInntektsmelding( inntekt = inntekt, refusjon = refusjon, aarsakInnsending = aarsakInnsending, - mottatt = ZonedDateTime.now().toOffsetDateTime(), + mottatt = mottatt?.atZone(zoneIdOslo).orDefault(ZonedDateTime.now()).toOffsetDateTime(), vedtaksperiodeId = forespoersel.vedtaksperiodeId, ) } diff --git a/apps/berik-inntektsmelding-service/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/berikinntektsmeldingservice/MapInntektsmeldingKtTest.kt b/apps/berik-inntektsmelding-service/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/berikinntektsmeldingservice/MapInntektsmeldingKtTest.kt index c3d5cdd63..c7298e8d9 100644 --- a/apps/berik-inntektsmelding-service/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/berikinntektsmeldingservice/MapInntektsmeldingKtTest.kt +++ b/apps/berik-inntektsmelding-service/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/berikinntektsmeldingservice/MapInntektsmeldingKtTest.kt @@ -3,7 +3,6 @@ package no.nav.helsearbeidsgiver.inntektsmelding.berikinntektsmeldingservice import io.kotest.core.spec.style.FunSpec import io.kotest.matchers.collections.shouldBeEmpty import io.kotest.matchers.collections.shouldNotBeEmpty -import io.kotest.matchers.date.shouldBeWithin import io.kotest.matchers.nulls.shouldBeNull import io.kotest.matchers.nulls.shouldNotBeNull import io.kotest.matchers.shouldBe @@ -18,12 +17,11 @@ import no.nav.helsearbeidsgiver.felles.test.mock.mockSkjemaInntektsmelding import no.nav.helsearbeidsgiver.felles.test.mock.utenPaakrevdAGP import no.nav.helsearbeidsgiver.felles.test.mock.utenPaakrevdInntekt import no.nav.helsearbeidsgiver.felles.test.mock.utenPaakrevdRefusjon +import no.nav.helsearbeidsgiver.felles.utils.zoneIdOslo import no.nav.helsearbeidsgiver.utils.test.date.august import no.nav.helsearbeidsgiver.utils.test.date.desember import no.nav.helsearbeidsgiver.utils.test.date.juli -import java.time.ZonedDateTime -import kotlin.time.Duration.Companion.seconds -import kotlin.time.toJavaDuration +import no.nav.helsearbeidsgiver.utils.test.date.kl class MapInntektsmeldingKtTest : FunSpec({ @@ -36,6 +34,7 @@ class MapInntektsmeldingKtTest : val virksomhetNavn = "Skrekkinngytende smaker LLC" val sykmeldtNavn = "Runar fra Regnskap" val avsenderNavn = "Hege fra HR" + val imMottatt = 11.juli.kl(10, 10, 0, 0) val inntektsmelding = mapInntektsmelding( @@ -45,6 +44,7 @@ class MapInntektsmeldingKtTest : virksomhetNavn = virksomhetNavn, sykmeldtNavn = sykmeldtNavn, avsenderNavn = avsenderNavn, + mottatt = imMottatt, ) inntektsmelding.apply { @@ -83,7 +83,7 @@ class MapInntektsmeldingKtTest : vedtaksperiodeId shouldBe forespoersel.vedtaksperiodeId - mottatt.shouldBeWithin(5.seconds.toJavaDuration(), ZonedDateTime.now().toOffsetDateTime()) + mottatt shouldBe imMottatt.atZone(zoneIdOslo).toOffsetDateTime() } } @@ -104,6 +104,7 @@ class MapInntektsmeldingKtTest : virksomhetNavn = "Skrekkinngytende smaker LLC", sykmeldtNavn = "Runar fra Regnskap", avsenderNavn = "Hege fra HR", + mottatt = 6.desember.atStartOfDay(), ) inntektsmelding.agp.shouldBeNull() @@ -123,6 +124,7 @@ class MapInntektsmeldingKtTest : virksomhetNavn = "Skrekkinngytende smaker LLC", sykmeldtNavn = "Runar fra Regnskap", avsenderNavn = "Hege fra HR", + mottatt = 6.desember.atStartOfDay(), ) skjema.agp.shouldNotBeNull() @@ -141,6 +143,7 @@ class MapInntektsmeldingKtTest : virksomhetNavn = "Skrekkinngytende smaker LLC", sykmeldtNavn = "Runar fra Regnskap", avsenderNavn = "Hege fra HR", + mottatt = 6.desember.atStartOfDay(), ) val fastsattInntekt = 8795.0 @@ -175,6 +178,7 @@ class MapInntektsmeldingKtTest : virksomhetNavn = "Skrekkinngytende smaker LLC", sykmeldtNavn = "Runar fra Regnskap", avsenderNavn = "Hege fra HR", + mottatt = 6.desember.atStartOfDay(), ) inntektsmelding.inntekt.also { @@ -204,6 +208,7 @@ class MapInntektsmeldingKtTest : virksomhetNavn = "Skrekkinngytende smaker LLC", sykmeldtNavn = "Runar fra Regnskap", avsenderNavn = "Hege fra HR", + mottatt = 6.desember.atStartOfDay(), ) inntektsmelding.inntekt.also { @@ -240,6 +245,7 @@ class MapInntektsmeldingKtTest : virksomhetNavn = "Skrekkinngytende smaker LLC", sykmeldtNavn = "Runar fra Regnskap", avsenderNavn = "Hege fra HR", + mottatt = 6.desember.atStartOfDay(), ) inntektsmelding.inntekt.also { @@ -262,6 +268,7 @@ class MapInntektsmeldingKtTest : virksomhetNavn = "Skrekkinngytende smaker LLC", sykmeldtNavn = "Runar fra Regnskap", avsenderNavn = "Hege fra HR", + mottatt = 6.desember.atStartOfDay(), ) skjema.refusjon.shouldNotBeNull() diff --git a/apps/db/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/db/InntektsmeldingRepository.kt b/apps/db/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/db/InntektsmeldingRepository.kt index eabcd35e5..77fe8cbd4 100644 --- a/apps/db/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/db/InntektsmeldingRepository.kt +++ b/apps/db/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/db/InntektsmeldingRepository.kt @@ -92,13 +92,16 @@ class InntektsmeldingRepository( } } - fun lagreInntektsmeldingSkjema(inntektsmeldingSkjema: SkjemaInntektsmelding): Long = + fun lagreInntektsmeldingSkjema( + inntektsmeldingSkjema: SkjemaInntektsmelding, + mottatt: LocalDateTime?, + ): Long = Metrics.dbInntektsmelding.recordTime(InntektsmeldingRepository::lagreInntektsmeldingSkjema) { transaction(db) { InntektsmeldingEntitet.insert { it[this.forespoerselId] = inntektsmeldingSkjema.forespoerselId.toString() it[skjema] = inntektsmeldingSkjema - it[innsendt] = LocalDateTime.now() + it[innsendt] = mottatt ?: LocalDateTime.now() } get InntektsmeldingEntitet.id } } diff --git a/apps/db/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/db/river/LagreImSkjemaRiver.kt b/apps/db/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/db/river/LagreImSkjemaRiver.kt index fa3b2fb9a..4fb634de2 100644 --- a/apps/db/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/db/river/LagreImSkjemaRiver.kt +++ b/apps/db/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/db/river/LagreImSkjemaRiver.kt @@ -9,6 +9,7 @@ import no.nav.helsearbeidsgiver.felles.Key import no.nav.helsearbeidsgiver.felles.domene.Forespoersel import no.nav.helsearbeidsgiver.felles.json.krev import no.nav.helsearbeidsgiver.felles.json.les +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.rapidsrivers.model.Fail @@ -16,10 +17,12 @@ import no.nav.helsearbeidsgiver.felles.rapidsrivers.river.ObjectRiver import no.nav.helsearbeidsgiver.felles.utils.Log import no.nav.helsearbeidsgiver.inntektsmelding.db.InntektsmeldingRepository import no.nav.helsearbeidsgiver.inntektsmelding.db.erDuplikatAv +import no.nav.helsearbeidsgiver.utils.json.serializer.LocalDateTimeSerializer import no.nav.helsearbeidsgiver.utils.json.serializer.UuidSerializer import no.nav.helsearbeidsgiver.utils.json.toJson import no.nav.helsearbeidsgiver.utils.log.logger import no.nav.helsearbeidsgiver.utils.log.sikkerLogger +import java.time.LocalDateTime import java.util.UUID private const val INNSENDING_ID_VED_DUPLIKAT = -1L @@ -31,6 +34,7 @@ data class LagreImSkjemaMelding( val data: Map, val forespoersel: Forespoersel, val skjema: SkjemaInntektsmelding, + val mottatt: LocalDateTime?, ) class LagreImSkjemaRiver( @@ -51,6 +55,7 @@ class LagreImSkjemaRiver( data = data, forespoersel = Key.FORESPOERSEL_SVAR.les(Forespoersel.serializer(), data), skjema = Key.SKJEMA_INNTEKTSMELDING.les(SkjemaInntektsmelding.serializer(), data), + mottatt = Key.MOTTATT.lesOrNull(LocalDateTimeSerializer, data), ) } @@ -64,7 +69,7 @@ class LagreImSkjemaRiver( sikkerLogger.warn("Fant duplikat av inntektsmeldingskjema.") INNSENDING_ID_VED_DUPLIKAT } else { - repository.lagreInntektsmeldingSkjema(skjema).also { + repository.lagreInntektsmeldingSkjema(skjema, mottatt).also { sikkerLogger.info("Lagret inntektsmeldingskjema.") } } diff --git a/apps/db/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/db/InntektsmeldingRepositoryTest.kt b/apps/db/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/db/InntektsmeldingRepositoryTest.kt index d1bc9e1a7..6930b09eb 100644 --- a/apps/db/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/db/InntektsmeldingRepositoryTest.kt +++ b/apps/db/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/db/InntektsmeldingRepositoryTest.kt @@ -13,6 +13,8 @@ import no.nav.helsearbeidsgiver.felles.test.mock.mockInntektsmeldingGammeltForma import no.nav.helsearbeidsgiver.felles.test.mock.mockSkjemaInntektsmelding import no.nav.helsearbeidsgiver.felles.test.mock.randomDigitString import no.nav.helsearbeidsgiver.inntektsmelding.db.tabell.InntektsmeldingEntitet +import no.nav.helsearbeidsgiver.utils.test.date.desember +import no.nav.helsearbeidsgiver.utils.test.date.mars import org.jetbrains.exposed.sql.Database import org.jetbrains.exposed.sql.ResultRow import org.jetbrains.exposed.sql.and @@ -47,7 +49,7 @@ class InntektsmeldingRepositoryTest : val skjema = mockSkjemaInntektsmelding() - val innsendingId = inntektsmeldingRepo.lagreInntektsmeldingSkjema(skjema) + val innsendingId = inntektsmeldingRepo.lagreInntektsmeldingSkjema(skjema, 9.desember.atStartOfDay()) val beriketDokument = mockInntektsmeldingGammeltFormat().copy(tidspunkt = OffsetDateTime.now()) inntektsmeldingRepo.oppdaterMedBeriketDokument(skjema.forespoerselId, innsendingId, beriketDokument) @@ -81,10 +83,11 @@ class InntektsmeldingRepositoryTest : }.shouldBeEmpty() val skjema = mockSkjemaInntektsmelding() + val mottatt = 27.mars.atStartOfDay() - val innsendingId1 = inntektsmeldingRepo.lagreInntektsmeldingSkjema(skjema) - val innsendingId2 = inntektsmeldingRepo.lagreInntektsmeldingSkjema(skjema) - inntektsmeldingRepo.lagreInntektsmeldingSkjema(skjema) + val innsendingId1 = inntektsmeldingRepo.lagreInntektsmeldingSkjema(skjema, mottatt) + val innsendingId2 = inntektsmeldingRepo.lagreInntektsmeldingSkjema(skjema, mottatt.plusHours(3)) + inntektsmeldingRepo.lagreInntektsmeldingSkjema(skjema, mottatt.plusHours(6)) innsendingId1 shouldNotBeEqual innsendingId2 @@ -105,7 +108,7 @@ class InntektsmeldingRepositoryTest : val skjema = mockSkjemaInntektsmelding() val inntektsmeldingGammeltFormat = mockInntektsmeldingGammeltFormat() - val innsendingId = inntektsmeldingRepo.lagreInntektsmeldingSkjema(skjema) + val innsendingId = inntektsmeldingRepo.lagreInntektsmeldingSkjema(skjema, 9.desember.atStartOfDay()) inntektsmeldingRepo.oppdaterMedBeriketDokument(skjema.forespoerselId, innsendingId, inntektsmeldingGammeltFormat) @@ -127,7 +130,7 @@ class InntektsmeldingRepositoryTest : val skjema = mockSkjemaInntektsmelding() val journalpost1 = randomDigitString(7) - val innsendingId = inntektsmeldingRepo.lagreInntektsmeldingSkjema(skjema) + val innsendingId = inntektsmeldingRepo.lagreInntektsmeldingSkjema(skjema, 9.desember.atStartOfDay()) val beriketDokument = mockInntektsmeldingGammeltFormat().copy(tidspunkt = OffsetDateTime.now()) inntektsmeldingRepo.oppdaterMedBeriketDokument(skjema.forespoerselId, innsendingId, beriketDokument) @@ -144,9 +147,10 @@ class InntektsmeldingRepositoryTest : test("skal oppdatere im med journalpostId") { val skjema = mockSkjemaInntektsmelding() val journalpostId = "jp-mollefonken-kjele" + val mottatt = 16.mars.atStartOfDay() - val innsendingId1 = inntektsmeldingRepo.lagreInntektsmeldingSkjema(skjema) - val innsendingId2 = inntektsmeldingRepo.lagreInntektsmeldingSkjema(skjema) + val innsendingId1 = inntektsmeldingRepo.lagreInntektsmeldingSkjema(skjema, mottatt) + val innsendingId2 = inntektsmeldingRepo.lagreInntektsmeldingSkjema(skjema, mottatt.plusHours(3)) val beriketDokument = mockInntektsmeldingGammeltFormat().copy(tidspunkt = OffsetDateTime.now()) inntektsmeldingRepo.oppdaterMedBeriketDokument(skjema.forespoerselId, innsendingId1, beriketDokument) @@ -180,9 +184,10 @@ class InntektsmeldingRepositoryTest : val skjema = mockSkjemaInntektsmelding() val gammelJournalpostId = "jp-traust-gevir" val nyJournalpostId = "jp-gallant-badehette" + val mottatt = 5.mars.atStartOfDay() - val innsendingId1 = inntektsmeldingRepo.lagreInntektsmeldingSkjema(skjema) - val innsendingId2 = inntektsmeldingRepo.lagreInntektsmeldingSkjema(skjema) + val innsendingId1 = inntektsmeldingRepo.lagreInntektsmeldingSkjema(skjema, mottatt) + val innsendingId2 = inntektsmeldingRepo.lagreInntektsmeldingSkjema(skjema, mottatt.plusHours(3)) val beriketDokument = mockInntektsmeldingGammeltFormat().copy(tidspunkt = OffsetDateTime.now()) inntektsmeldingRepo.oppdaterMedBeriketDokument(skjema.forespoerselId, innsendingId1, beriketDokument) @@ -238,7 +243,7 @@ class InntektsmeldingRepositoryTest : val skjema = mockSkjemaInntektsmelding() val journalpostId = "jp-slem-fryser" - val innsendingId1 = inntektsmeldingRepo.lagreInntektsmeldingSkjema(skjema) + val innsendingId1 = inntektsmeldingRepo.lagreInntektsmeldingSkjema(skjema, 9.desember.atStartOfDay()) val beriketDokument = mockInntektsmeldingGammeltFormat().copy(tidspunkt = OffsetDateTime.now()) inntektsmeldingRepo.oppdaterMedBeriketDokument(skjema.forespoerselId, innsendingId1, beriketDokument) diff --git a/apps/db/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/db/river/LagreImSkjemaRiverTest.kt b/apps/db/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/db/river/LagreImSkjemaRiverTest.kt index 63384fa57..e5bae06dc 100644 --- a/apps/db/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/db/river/LagreImSkjemaRiverTest.kt +++ b/apps/db/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/db/river/LagreImSkjemaRiverTest.kt @@ -28,8 +28,11 @@ import no.nav.helsearbeidsgiver.felles.test.mock.mockSkjemaInntektsmelding import no.nav.helsearbeidsgiver.felles.test.rapidsrivers.firstMessage import no.nav.helsearbeidsgiver.felles.test.rapidsrivers.sendJson import no.nav.helsearbeidsgiver.inntektsmelding.db.InntektsmeldingRepository +import no.nav.helsearbeidsgiver.utils.collection.mapValuesNotNull import no.nav.helsearbeidsgiver.utils.json.toJson import no.nav.helsearbeidsgiver.utils.test.date.juli +import no.nav.helsearbeidsgiver.utils.test.date.kl +import no.nav.helsearbeidsgiver.utils.test.date.november import java.util.UUID class LagreImSkjemaRiverTest : @@ -68,7 +71,7 @@ class LagreImSkjemaRiverTest : ) { eksisterendeInntektsmeldingskjema -> val innsendingId = 1L every { mockInntektsmeldingRepo.hentNyesteInntektsmeldingSkjema(any()) } returns eksisterendeInntektsmeldingskjema - every { mockInntektsmeldingRepo.lagreInntektsmeldingSkjema(any()) } returns innsendingId + every { mockInntektsmeldingRepo.lagreInntektsmeldingSkjema(any(), any()) } returns innsendingId val nyttInntektsmeldingSkjema = mockSkjemaInntektsmelding() @@ -86,14 +89,16 @@ class LagreImSkjemaRiverTest : mapOf( Key.FORESPOERSEL_SVAR to innkommendeMelding.forespoersel.toJson(Forespoersel.serializer()), Key.SKJEMA_INNTEKTSMELDING to innkommendeMelding.skjema.toJson(SkjemaInntektsmelding.serializer()), + Key.MOTTATT to innkommendeMelding.mottatt?.toJson(), Key.ER_DUPLIKAT_IM to false.toJson(Boolean.serializer()), Key.INNSENDING_ID to innsendingId.toJson(Long.serializer()), - ).toJson(), + ).mapValuesNotNull { it } + .toJson(), ) verifySequence { mockInntektsmeldingRepo.hentNyesteInntektsmeldingSkjema(innkommendeMelding.skjema.forespoerselId) - mockInntektsmeldingRepo.lagreInntektsmeldingSkjema(nyttInntektsmeldingSkjema) + mockInntektsmeldingRepo.lagreInntektsmeldingSkjema(nyttInntektsmeldingSkjema, innkommendeMelding.mottatt) } } } @@ -103,7 +108,7 @@ class LagreImSkjemaRiverTest : val innsendingIdVedDuplikat = -1L every { mockInntektsmeldingRepo.hentNyesteInntektsmeldingSkjema(any()) } returns inntektsmeldingSkjema - every { mockInntektsmeldingRepo.lagreInntektsmeldingSkjema(any()) } returns innsendingId + every { mockInntektsmeldingRepo.lagreInntektsmeldingSkjema(any(), any()) } returns innsendingId val innkommendeMelding = innkommendeMelding(skjema = inntektsmeldingSkjema) @@ -119,16 +124,18 @@ class LagreImSkjemaRiverTest : mapOf( Key.FORESPOERSEL_SVAR to innkommendeMelding.forespoersel.toJson(Forespoersel.serializer()), Key.SKJEMA_INNTEKTSMELDING to innkommendeMelding.skjema.toJson(SkjemaInntektsmelding.serializer()), + Key.MOTTATT to innkommendeMelding.mottatt?.toJson(), Key.ER_DUPLIKAT_IM to true.toJson(Boolean.serializer()), Key.INNSENDING_ID to innsendingIdVedDuplikat.toJson(Long.serializer()), - ).toJson(), + ).mapValuesNotNull { it } + .toJson(), ) verifySequence { mockInntektsmeldingRepo.hentNyesteInntektsmeldingSkjema(innkommendeMelding.skjema.forespoerselId) } verify(exactly = 0) { - mockInntektsmeldingRepo.lagreInntektsmeldingSkjema(inntektsmeldingSkjema) + mockInntektsmeldingRepo.lagreInntektsmeldingSkjema(inntektsmeldingSkjema, innkommendeMelding.mottatt) } } @@ -156,7 +163,7 @@ class LagreImSkjemaRiverTest : mockInntektsmeldingRepo.hentNyesteInntektsmeldingSkjema(any()) } verify(exactly = 0) { - mockInntektsmeldingRepo.lagreInntektsmeldingSkjema(any()) + mockInntektsmeldingRepo.lagreInntektsmeldingSkjema(any(), any()) } } context("ignorerer melding") { @@ -177,7 +184,7 @@ class LagreImSkjemaRiverTest : verify(exactly = 0) { mockInntektsmeldingRepo.hentNyesteInntektsmeldingSkjema(any()) - mockInntektsmeldingRepo.lagreInntektsmeldingSkjema(any()) + mockInntektsmeldingRepo.lagreInntektsmeldingSkjema(any(), any()) } } } @@ -186,8 +193,9 @@ class LagreImSkjemaRiverTest : private fun innkommendeMelding( forespoersel: Forespoersel = mockForespoersel(), skjema: SkjemaInntektsmelding = mockSkjemaInntektsmelding(), -): LagreImSkjemaMelding = - LagreImSkjemaMelding( +): LagreImSkjemaMelding { + val mottatt = 10.november.kl(13, 55, 0, 0) + return LagreImSkjemaMelding( eventName = EventName.INSENDING_STARTED, behovType = BehovType.LAGRE_IM_SKJEMA, transaksjonId = UUID.randomUUID(), @@ -195,10 +203,13 @@ private fun innkommendeMelding( mapOf( Key.FORESPOERSEL_SVAR to forespoersel.toJson(Forespoersel.serializer()), Key.SKJEMA_INNTEKTSMELDING to skjema.toJson(SkjemaInntektsmelding.serializer()), + Key.MOTTATT to mottatt.toJson(), ), forespoersel = forespoersel, skjema = skjema, + mottatt = mottatt, ) +} private fun LagreImSkjemaMelding.toMap(): Map = mapOf( diff --git a/apps/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/Key.kt b/apps/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/Key.kt index 293f23d1a..e0327b591 100644 --- a/apps/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/Key.kt +++ b/apps/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/Key.kt @@ -32,6 +32,7 @@ enum class Key : IKey { JOURNALPOST_ID, KONTEKST_ID, LAGRET_INNTEKTSMELDING, + MOTTATT, OPPGAVE_ID, ORGNR_UNDERENHET, ORGNR_UNDERENHETER, diff --git a/apps/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/utils/DateUtils.kt b/apps/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/utils/DateUtils.kt index 1e0b8f5a5..754fa4de8 100644 --- a/apps/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/utils/DateUtils.kt +++ b/apps/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/utils/DateUtils.kt @@ -2,10 +2,13 @@ package no.nav.helsearbeidsgiver.felles.utils import java.time.LocalDate import java.time.YearMonth +import java.time.ZoneId import java.time.format.DateTimeFormatter private val norskDatoFormat = DateTimeFormatter.ofPattern("dd.MM.yyyy") +val zoneIdOslo: ZoneId = ZoneId.of("Europe/Oslo") + fun LocalDate.tilNorskFormat(): String = format(norskDatoFormat) fun LocalDate.toYearMonth(): YearMonth = YearMonth.of(year, month) diff --git a/apps/innsending/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/innsending/InnsendingService.kt b/apps/innsending/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/innsending/InnsendingService.kt index 6e17b0eff..2339ced29 100644 --- a/apps/innsending/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/innsending/InnsendingService.kt +++ b/apps/innsending/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/innsending/InnsendingService.kt @@ -10,12 +10,15 @@ import no.nav.helsearbeidsgiver.felles.Key import no.nav.helsearbeidsgiver.felles.domene.Forespoersel import no.nav.helsearbeidsgiver.felles.domene.ResultJson import no.nav.helsearbeidsgiver.felles.json.les +import no.nav.helsearbeidsgiver.felles.json.lesOrNull import no.nav.helsearbeidsgiver.felles.json.toJson import no.nav.helsearbeidsgiver.felles.rapidsrivers.model.Fail import no.nav.helsearbeidsgiver.felles.rapidsrivers.publish import no.nav.helsearbeidsgiver.felles.rapidsrivers.redis.RedisStore import no.nav.helsearbeidsgiver.felles.rapidsrivers.service.ServiceMed2Steg import no.nav.helsearbeidsgiver.felles.utils.Log +import no.nav.helsearbeidsgiver.utils.collection.mapValuesNotNull +import no.nav.helsearbeidsgiver.utils.json.serializer.LocalDateTimeSerializer import no.nav.helsearbeidsgiver.utils.json.serializer.UuidSerializer import no.nav.helsearbeidsgiver.utils.json.toJson import no.nav.helsearbeidsgiver.utils.json.toPretty @@ -23,12 +26,14 @@ import no.nav.helsearbeidsgiver.utils.log.MdcUtils import no.nav.helsearbeidsgiver.utils.log.logger import no.nav.helsearbeidsgiver.utils.log.sikkerLogger import no.nav.helsearbeidsgiver.utils.wrapper.Fnr +import java.time.LocalDateTime import java.util.UUID data class Steg0( val kontekstId: UUID, val avsenderFnr: Fnr, val skjema: SkjemaInntektsmelding, + val mottatt: LocalDateTime?, ) data class Steg1( @@ -54,6 +59,7 @@ class InnsendingService( kontekstId = Key.KONTEKST_ID.les(UuidSerializer, melding), avsenderFnr = Key.ARBEIDSGIVER_FNR.les(Fnr.serializer(), melding), skjema = Key.SKJEMA_INNTEKTSMELDING.les(SkjemaInntektsmelding.serializer(), melding), + mottatt = Key.MOTTATT.lesOrNull(LocalDateTimeSerializer, melding), ) override fun lesSteg1(melding: Map): Steg1 = @@ -124,7 +130,9 @@ class InnsendingService( Key.SKJEMA_INNTEKTSMELDING to steg0.skjema.toJson(SkjemaInntektsmelding.serializer()), Key.FORESPOERSEL_SVAR to steg1.forespoersel.toJson(Forespoersel.serializer()), Key.INNSENDING_ID to steg2.innsendingId.toJson(Long.serializer()), - ).toJson(), + Key.MOTTATT to steg0.mottatt?.toJson(), + ).mapValuesNotNull { it } + .toJson(), ) MdcUtils.withLogFields( diff --git a/apps/innsending/src/test/kotlin/no.nav.helsearbeidsgiver.inntektsmelding.innsending/InnsendingServiceTest.kt b/apps/innsending/src/test/kotlin/no.nav.helsearbeidsgiver.inntektsmelding.innsending/InnsendingServiceTest.kt index fd1e324e5..ed813dd41 100644 --- a/apps/innsending/src/test/kotlin/no.nav.helsearbeidsgiver.inntektsmelding.innsending/InnsendingServiceTest.kt +++ b/apps/innsending/src/test/kotlin/no.nav.helsearbeidsgiver.inntektsmelding.innsending/InnsendingServiceTest.kt @@ -32,7 +32,9 @@ import no.nav.helsearbeidsgiver.felles.test.rapidsrivers.message import no.nav.helsearbeidsgiver.felles.test.rapidsrivers.sendJson import no.nav.helsearbeidsgiver.utils.json.serializer.UuidSerializer import no.nav.helsearbeidsgiver.utils.json.toJson +import no.nav.helsearbeidsgiver.utils.test.date.august import no.nav.helsearbeidsgiver.utils.test.date.juli +import no.nav.helsearbeidsgiver.utils.test.date.kl import no.nav.helsearbeidsgiver.utils.test.wrapper.genererGyldig import no.nav.helsearbeidsgiver.utils.wrapper.Fnr import java.util.UUID @@ -180,6 +182,7 @@ private object Mock { ) val skjema = mockSkjemaInntektsmelding() + val mottatt = 15.august.kl(12, 0, 0, 0) fun steg0(transaksjonId: UUID): Map = mapOf( @@ -189,6 +192,7 @@ private object Mock { mapOf( Key.ARBEIDSGIVER_FNR to avsender.fnr.toJson(), Key.SKJEMA_INNTEKTSMELDING to skjema.toJson(SkjemaInntektsmelding.serializer()), + Key.MOTTATT to mottatt.toJson(), ).toJson(), ) diff --git a/apps/integrasjonstest/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/integrasjonstest/BerikInntektsmeldingServiceIT.kt b/apps/integrasjonstest/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/integrasjonstest/BerikInntektsmeldingServiceIT.kt index 435855f7d..a0294810a 100644 --- a/apps/integrasjonstest/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/integrasjonstest/BerikInntektsmeldingServiceIT.kt +++ b/apps/integrasjonstest/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/integrasjonstest/BerikInntektsmeldingServiceIT.kt @@ -33,6 +33,7 @@ import no.nav.helsearbeidsgiver.utils.json.serializer.LocalDateSerializer import no.nav.helsearbeidsgiver.utils.json.serializer.UuidSerializer import no.nav.helsearbeidsgiver.utils.json.toJson import no.nav.helsearbeidsgiver.utils.test.date.august +import no.nav.helsearbeidsgiver.utils.test.date.desember import no.nav.helsearbeidsgiver.utils.test.date.juli import no.nav.helsearbeidsgiver.utils.test.date.juni import no.nav.helsearbeidsgiver.utils.test.wrapper.genererGyldig @@ -54,7 +55,7 @@ class BerikInntektsmeldingServiceIT : EndToEndTest() { fun `skal berike og lagre inntektsmeldinger`() { val tidligereInntektsmelding = mockInntektsmelding() - val innsendingId = imRepository.lagreInntektsmeldingSkjema(Mock.skjema) + val innsendingId = imRepository.lagreInntektsmeldingSkjema(Mock.skjema, 10.desember.atStartOfDay()) imRepository.oppdaterMedBeriketDokument(Mock.forespoerselId, innsendingId, tidligereInntektsmelding) coEvery { @@ -172,7 +173,7 @@ class BerikInntektsmeldingServiceIT : EndToEndTest() { fun `skal opprette en bakgrunnsjobb som gjenopptar berikelsen av inntektsmeldingen senere dersom oppslaget mot pdl feiler`() { val tidligereInntektsmelding = mockInntektsmelding() - val innsendingId = imRepository.lagreInntektsmeldingSkjema(Mock.skjema) + val innsendingId = imRepository.lagreInntektsmeldingSkjema(Mock.skjema, 10.desember.atStartOfDay()) imRepository.oppdaterMedBeriketDokument(Mock.forespoerselId, innsendingId, tidligereInntektsmelding) coEvery { diff --git a/apps/integrasjonstest/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/integrasjonstest/InnsendingIT.kt b/apps/integrasjonstest/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/integrasjonstest/InnsendingIT.kt index 00d8e757d..657a6668e 100644 --- a/apps/integrasjonstest/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/integrasjonstest/InnsendingIT.kt +++ b/apps/integrasjonstest/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/integrasjonstest/InnsendingIT.kt @@ -128,7 +128,7 @@ class InnsendingIT : EndToEndTest() { @Test fun `skal ikke lagre duplikat inntektsmeldingskjema`() { - imRepository.lagreInntektsmeldingSkjema(Mock.skjema) + imRepository.lagreInntektsmeldingSkjema(Mock.skjema, 13.august.atStartOfDay()) mockForespoerselSvarFraHelsebro( forespoerselId = Mock.forespoerselId, diff --git a/apps/integrasjonstest/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/integrasjonstest/InnsendingServiceIT.kt b/apps/integrasjonstest/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/integrasjonstest/InnsendingServiceIT.kt index f828a3fe6..755e23cf4 100644 --- a/apps/integrasjonstest/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/integrasjonstest/InnsendingServiceIT.kt +++ b/apps/integrasjonstest/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/integrasjonstest/InnsendingServiceIT.kt @@ -26,6 +26,7 @@ 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.test.date.april +import no.nav.helsearbeidsgiver.utils.test.date.desember import no.nav.helsearbeidsgiver.utils.test.date.februar import no.nav.helsearbeidsgiver.utils.test.date.mars import no.nav.helsearbeidsgiver.utils.test.date.oktober @@ -43,7 +44,7 @@ class InnsendingServiceIT : EndToEndTest() { val transaksjonId: UUID = UUID.randomUUID() val tidligereInntektsmelding = mockInntektsmelding() - val innsendingId = imRepository.lagreInntektsmeldingSkjema(Mock.skjema) + val innsendingId = imRepository.lagreInntektsmeldingSkjema(Mock.skjema, 9.desember.atStartOfDay()) imRepository.oppdaterMedBeriketDokument(Mock.skjema.forespoerselId, innsendingId, tidligereInntektsmelding) mockForespoerselSvarFraHelsebro( diff --git a/apps/integrasjonstest/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/integrasjonstest/KvitteringIT.kt b/apps/integrasjonstest/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/integrasjonstest/KvitteringIT.kt index b67eea541..6c03b0cd7 100644 --- a/apps/integrasjonstest/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/integrasjonstest/KvitteringIT.kt +++ b/apps/integrasjonstest/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/integrasjonstest/KvitteringIT.kt @@ -14,6 +14,7 @@ import no.nav.helsearbeidsgiver.felles.test.mock.mockInntektsmeldingGammeltForma import no.nav.helsearbeidsgiver.felles.test.mock.mockSkjemaInntektsmelding import no.nav.helsearbeidsgiver.inntektsmelding.integrasjonstest.utils.EndToEndTest import no.nav.helsearbeidsgiver.utils.json.toJson +import no.nav.helsearbeidsgiver.utils.test.date.desember import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test import org.junit.jupiter.api.TestInstance @@ -31,7 +32,7 @@ class KvitteringIT : EndToEndTest() { val transaksjonId = UUID.randomUUID() val skjema = mockSkjemaInntektsmelding() - val innsendingId = imRepository.lagreInntektsmeldingSkjema(skjema) + val innsendingId = imRepository.lagreInntektsmeldingSkjema(skjema, 3.desember.atStartOfDay()) imRepository.oppdaterMedBeriketDokument(skjema.forespoerselId, innsendingId, mockInntektsmeldingGammeltFormat()) publish( diff --git a/apps/selvbestemt-lagre-im-service/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemtlagreimservice/LagreSelvbestemtImService.kt b/apps/selvbestemt-lagre-im-service/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemtlagreimservice/LagreSelvbestemtImService.kt index 016bd8e61..3d9a0920e 100644 --- a/apps/selvbestemt-lagre-im-service/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemtlagreimservice/LagreSelvbestemtImService.kt +++ b/apps/selvbestemt-lagre-im-service/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemtlagreimservice/LagreSelvbestemtImService.kt @@ -26,7 +26,9 @@ import no.nav.helsearbeidsgiver.felles.rapidsrivers.redis.RedisStore import no.nav.helsearbeidsgiver.felles.rapidsrivers.service.Service import no.nav.helsearbeidsgiver.felles.rapidsrivers.service.ServiceMed3Steg import no.nav.helsearbeidsgiver.felles.utils.Log +import no.nav.helsearbeidsgiver.felles.utils.zoneIdOslo import no.nav.helsearbeidsgiver.utils.collection.mapValuesNotNull +import no.nav.helsearbeidsgiver.utils.json.serializer.LocalDateTimeSerializer import no.nav.helsearbeidsgiver.utils.json.serializer.UuidSerializer import no.nav.helsearbeidsgiver.utils.json.serializer.list import no.nav.helsearbeidsgiver.utils.json.toJson @@ -34,16 +36,19 @@ import no.nav.helsearbeidsgiver.utils.json.toPretty import no.nav.helsearbeidsgiver.utils.log.MdcUtils import no.nav.helsearbeidsgiver.utils.log.logger import no.nav.helsearbeidsgiver.utils.log.sikkerLogger +import no.nav.helsearbeidsgiver.utils.pipe.orDefault import no.nav.helsearbeidsgiver.utils.wrapper.Fnr import no.nav.helsearbeidsgiver.utils.wrapper.Orgnr import java.time.LocalDate -import java.time.OffsetDateTime +import java.time.LocalDateTime +import java.time.ZonedDateTime import java.util.UUID data class Steg0( val transaksjonId: UUID, val skjema: SkjemaInntektsmeldingSelvbestemt, val avsenderFnr: Fnr, + val mottatt: LocalDateTime?, ) sealed class Steg1 { @@ -81,6 +86,7 @@ class LagreSelvbestemtImService( transaksjonId = Key.KONTEKST_ID.les(UuidSerializer, melding), skjema = Key.SKJEMA_INNTEKTSMELDING.les(SkjemaInntektsmeldingSelvbestemt.serializer(), melding), avsenderFnr = Key.ARBEIDSGIVER_FNR.les(Fnr.serializer(), melding), + mottatt = Key.MOTTATT.lesOrNull(LocalDateTimeSerializer, melding), ) override fun lesSteg1(melding: Map): Steg1 { @@ -194,6 +200,7 @@ class LagreSelvbestemtImService( orgNavn = orgNavn, sykmeldtNavn = sykmeldtNavn, avsenderNavn = avsenderNavn, + mottatt = steg0.mottatt, ) val sykeperioder = @@ -364,6 +371,7 @@ fun tilInntektsmelding( orgNavn: String, sykmeldtNavn: String, avsenderNavn: String, + mottatt: LocalDateTime?, ): Inntektsmelding { val aarsakInnsending = if (skjema.selvbestemtId == null) { @@ -395,7 +403,7 @@ fun tilInntektsmelding( inntekt = skjema.inntekt, refusjon = skjema.refusjon, aarsakInnsending = aarsakInnsending, - mottatt = OffsetDateTime.now(), + mottatt = mottatt?.atZone(zoneIdOslo).orDefault(ZonedDateTime.now()).toOffsetDateTime(), vedtaksperiodeId = skjema.vedtaksperiodeId, ) } diff --git a/apps/selvbestemt-lagre-im-service/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemtlagreimservice/LagreSelvbestemtImServiceTest.kt b/apps/selvbestemt-lagre-im-service/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemtlagreimservice/LagreSelvbestemtImServiceTest.kt index 631427f61..aae28e953 100644 --- a/apps/selvbestemt-lagre-im-service/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemtlagreimservice/LagreSelvbestemtImServiceTest.kt +++ b/apps/selvbestemt-lagre-im-service/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/selvbestemtlagreimservice/LagreSelvbestemtImServiceTest.kt @@ -52,6 +52,8 @@ import no.nav.helsearbeidsgiver.felles.test.rapidsrivers.sendJson import no.nav.helsearbeidsgiver.utils.json.serializer.UuidSerializer import no.nav.helsearbeidsgiver.utils.json.toJson import no.nav.helsearbeidsgiver.utils.test.date.april +import no.nav.helsearbeidsgiver.utils.test.date.august +import no.nav.helsearbeidsgiver.utils.test.date.kl import no.nav.helsearbeidsgiver.utils.test.date.mars import no.nav.helsearbeidsgiver.utils.test.mock.mockStatic import no.nav.helsearbeidsgiver.utils.test.wrapper.genererGyldig @@ -517,6 +519,7 @@ private object Mock { orgNavn = ORG_NAVN, sykmeldtNavn = sykmeldt.navn, avsenderNavn = avsender.navn, + mottatt = 16.august.kl(18, 19, 0, 0), ) fun steg0(transaksjonId: UUID): Map = @@ -525,8 +528,9 @@ private object Mock { Key.KONTEKST_ID to transaksjonId.toJson(), Key.DATA to mapOf( - Key.SKJEMA_INNTEKTSMELDING to skjema.toJson(SkjemaInntektsmeldingSelvbestemt.serializer()), Key.ARBEIDSGIVER_FNR to avsender.fnr.toJson(), + Key.SKJEMA_INNTEKTSMELDING to skjema.toJson(SkjemaInntektsmeldingSelvbestemt.serializer()), + Key.MOTTATT to inntektsmelding.mottatt.toLocalDateTime().toJson(), ).toJson(), ) diff --git a/gradle.properties b/gradle.properties index 5a475b981..69500b5d4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,7 +5,7 @@ kotlinVersion=2.0.21 kotlinterVersion=4.4.0 # Dependency versions -hagDomeneInntektsmeldingVersion=0.1.5 +hagDomeneInntektsmeldingVersion=0.1.7 junitJupiterVersion=5.11.3 kotestVersion=5.9.1 kotlinCoroutinesVersion=1.9.0