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 9010f8603a..f8296040bc 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 @@ -10,21 +10,19 @@ import kotlinx.serialization.Serializable import kotlinx.serialization.SerializationException import kotlinx.serialization.UseSerializers import kotlinx.serialization.builtins.serializer -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Inntekt -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Inntektsmelding -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.KvitteringEkstern -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.KvitteringSimba import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Avsender import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Periode import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Sykmeldt import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.skjema.SkjemaInntektsmelding import no.nav.helsearbeidsgiver.felles.Tekst -import no.nav.helsearbeidsgiver.felles.domene.EksternInntektsmelding +import no.nav.helsearbeidsgiver.felles.domene.Forespoersel import no.nav.helsearbeidsgiver.felles.domene.KvitteringResultat +import no.nav.helsearbeidsgiver.felles.domene.LagretInntektsmelding import no.nav.helsearbeidsgiver.felles.metrics.Metrics import no.nav.helsearbeidsgiver.felles.rapidsrivers.redis.RedisConnection import no.nav.helsearbeidsgiver.felles.rapidsrivers.redis.RedisPrefix import no.nav.helsearbeidsgiver.felles.rapidsrivers.redis.RedisStore +import no.nav.helsearbeidsgiver.felles.utils.toOffsetDateTimeOslo import no.nav.helsearbeidsgiver.inntektsmelding.api.RedisPoller import no.nav.helsearbeidsgiver.inntektsmelding.api.RedisPollerTimeoutException import no.nav.helsearbeidsgiver.inntektsmelding.api.Routes @@ -43,9 +41,7 @@ import no.nav.helsearbeidsgiver.inntektsmelding.api.utils.respondOk import no.nav.helsearbeidsgiver.utils.json.fromJson import no.nav.helsearbeidsgiver.utils.json.serializer.OffsetDateTimeSerializer import no.nav.helsearbeidsgiver.utils.json.toPretty -import no.nav.helsearbeidsgiver.utils.pipe.orDefault import java.time.OffsetDateTime -import java.time.ZoneId import java.util.UUID fun Route.kvittering( @@ -82,10 +78,18 @@ fun Route.kvittering( val resultat = resultatJson.success?.fromJson(KvitteringResultat.serializer()) if (resultat != null) { sikkerLogger.info("Hentet kvittering for '$forespoerselId'.\n${resultatJson.success?.toPretty()}") - if (resultat.skjema == null && resultat.inntektsmelding == null && resultat.eksternInntektsmelding == null) { - respondNotFound("Kvittering ikke funnet for forespørselId: $forespoerselId", String.serializer()) - } else { - respondOk(resultat.tilResponse(), KvitteringResponse.serializer()) + + when (val lagret = resultat.lagret) { + is LagretInntektsmelding.Skjema -> { + val skjemaResponse = lagResponse(resultat.forespoersel, resultat.sykmeldtNavn, resultat.orgNavn, lagret) + respondOk(skjemaResponse, KvitteringResponse.serializer()) + } + is LagretInntektsmelding.Ekstern -> { + val eksternResponse = lagResponse(lagret) + respondOk(eksternResponse, KvitteringResponse.serializer()) + } + null -> + respondNotFound("Kvittering ikke funnet for forespørselId: $forespoerselId", String.serializer()) } } else { val feilmelding = resultatJson.failure?.fromJson(String.serializer()) ?: Tekst.TEKNISK_FEIL_FORBIGAAENDE @@ -110,88 +114,61 @@ fun Route.kvittering( @Serializable private data class KvitteringResponse( - val kvitteringNavNo: KvitteringNavNo?, - val kvitteringDokument: KvitteringSimba?, - val kvitteringEkstern: KvitteringEkstern?, -) - -@Serializable -private data class KvitteringNavNo( - val sykmeldt: Sykmeldt, - val avsender: Avsender, - val sykmeldingsperioder: List, - val skjema: SkjemaInntektsmelding, - val mottatt: OffsetDateTime, -) - -private fun KvitteringResultat.tilResponse(): KvitteringResponse = - KvitteringResponse( - kvitteringNavNo = tilKvitteringNavNo(), - kvitteringDokument = inntektsmelding?.tilKvitteringSimba(), - kvitteringEkstern = eksternInntektsmelding?.tilKvitteringEkstern(), + val kvitteringNavNo: NavNo?, + val kvitteringEkstern: Ekstern?, +) { + @Serializable + data class NavNo( + val sykmeldt: Sykmeldt, + val avsender: Avsender, + val sykmeldingsperioder: List, + val skjema: SkjemaInntektsmelding, + val mottatt: OffsetDateTime, ) -private fun KvitteringResultat.tilKvitteringNavNo(): KvitteringNavNo? { - val skjemaKvittering = skjema - return if (skjemaKvittering != null) { - KvitteringNavNo( - sykmeldt = - Sykmeldt( - fnr = forespoersel.fnr, - navn = sykmeldtNavn, - ), - avsender = - Avsender( - orgnr = forespoersel.orgnr, - orgNavn = orgNavn, - navn = avsenderNavn, - tlf = skjemaKvittering.avsenderTlf, - ), - sykmeldingsperioder = forespoersel.sykmeldingsperioder, - skjema = skjemaKvittering, - // midlertidig, erstattes med non-null alternativ - mottatt = inntektsmelding?.tidspunkt ?: OffsetDateTime.now(), - ) - } else { - null - } + @Serializable + data class Ekstern( + val avsenderSystem: String, + val referanse: String, + val mottatt: OffsetDateTime, + ) } -private fun Inntektsmelding.tilKvitteringSimba(): KvitteringSimba = - KvitteringSimba( - orgnrUnderenhet = orgnrUnderenhet, - identitetsnummer = identitetsnummer, - fulltNavn = fulltNavn, - virksomhetNavn = virksomhetNavn, - behandlingsdager = behandlingsdager, - egenmeldingsperioder = egenmeldingsperioder, - arbeidsgiverperioder = arbeidsgiverperioder, - // Frontend tolker feltet bestemmendeFraværsdag som om det var inntektsdato. - // Vi vil slippe denne hacken ved overgang til v1.Inntektsmelding, som kun inneholder inntektsdato (ikke bestemmende fraværsdag). - bestemmendeFraværsdag = inntektsdato ?: bestemmendeFraværsdag, - fraværsperioder = fraværsperioder, - inntekt = - Inntekt( - bekreftet = true, - // Kan slette nullable inntekt og fallback når IM med gammelt format slettes fra database - beregnetInntekt = inntekt?.beregnetInntekt ?: beregnetInntekt, - endringÅrsak = inntekt?.endringÅrsak, - manueltKorrigert = inntekt?.manueltKorrigert.orDefault(false), +private fun lagResponse( + forespoersel: Forespoersel, + sykmeldtNavn: String, + orgNavn: String, + lagret: LagretInntektsmelding.Skjema, +): KvitteringResponse = + KvitteringResponse( + kvitteringNavNo = + KvitteringResponse.NavNo( + sykmeldt = + Sykmeldt( + fnr = forespoersel.fnr, + navn = sykmeldtNavn, + ), + avsender = + Avsender( + orgnr = forespoersel.orgnr, + orgNavn = orgNavn, + navn = lagret.avsenderNavn ?: "Ukjent navn", + tlf = lagret.skjema.avsenderTlf, + ), + sykmeldingsperioder = forespoersel.sykmeldingsperioder, + skjema = lagret.skjema, + mottatt = lagret.mottatt.toOffsetDateTimeOslo(), ), - fullLønnIArbeidsgiverPerioden = fullLønnIArbeidsgiverPerioden, - refusjon = refusjon, - naturalytelser = naturalytelser, - årsakInnsending = årsakInnsending, - bekreftOpplysninger = true, - tidspunkt = tidspunkt, - forespurtData = forespurtData, - telefonnummer = telefonnummer, - innsenderNavn = innsenderNavn, + kvitteringEkstern = null, ) -private fun EksternInntektsmelding.tilKvitteringEkstern(): KvitteringEkstern = - KvitteringEkstern( - avsenderSystemNavn, - arkivreferanse, - tidspunkt.atZone(ZoneId.systemDefault()).toOffsetDateTime(), +private fun lagResponse(lagret: LagretInntektsmelding.Ekstern): KvitteringResponse = + KvitteringResponse( + kvitteringNavNo = null, + kvitteringEkstern = + KvitteringResponse.Ekstern( + avsenderSystem = lagret.ekstern.avsenderSystemNavn, + referanse = lagret.ekstern.arkivreferanse, + mottatt = lagret.ekstern.tidspunkt.toOffsetDateTimeOslo(), + ), ) diff --git a/apps/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/aktiveorgnr/AktiveOrgnrRouteKtTest.kt b/apps/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/aktiveorgnr/AktiveOrgnrRouteKtTest.kt index ec1567dcd9..c0b62d522e 100644 --- a/apps/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/aktiveorgnr/AktiveOrgnrRouteKtTest.kt +++ b/apps/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/aktiveorgnr/AktiveOrgnrRouteKtTest.kt @@ -1,5 +1,3 @@ -@file:Suppress("NonAsciiCharacters") - package no.nav.helsearbeidsgiver.inntektsmelding.api.aktiveorgnr import io.kotest.matchers.shouldBe diff --git a/apps/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/kvittering/KvitteringRouteKtTest.kt b/apps/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/kvittering/KvitteringRouteKtTest.kt index 56574f4cd3..5bcaf33349 100644 --- a/apps/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/kvittering/KvitteringRouteKtTest.kt +++ b/apps/api/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/api/kvittering/KvitteringRouteKtTest.kt @@ -3,16 +3,16 @@ package no.nav.helsearbeidsgiver.inntektsmelding.api.kvittering import io.ktor.http.HttpStatusCode import io.mockk.coEvery import no.nav.helsearbeidsgiver.felles.domene.KvitteringResultat +import no.nav.helsearbeidsgiver.felles.domene.LagretInntektsmelding import no.nav.helsearbeidsgiver.felles.domene.ResultJson import no.nav.helsearbeidsgiver.felles.json.toJson -import no.nav.helsearbeidsgiver.felles.test.mock.mockEksternInntektsmelding import no.nav.helsearbeidsgiver.felles.test.mock.mockForespoersel -import no.nav.helsearbeidsgiver.felles.test.mock.mockInntektsmelding import no.nav.helsearbeidsgiver.felles.test.mock.mockSkjemaInntektsmelding import no.nav.helsearbeidsgiver.inntektsmelding.api.Routes import no.nav.helsearbeidsgiver.inntektsmelding.api.utils.ApiTest import no.nav.helsearbeidsgiver.inntektsmelding.api.utils.harTilgangResultat import no.nav.helsearbeidsgiver.utils.json.toJson +import no.nav.helsearbeidsgiver.utils.test.date.mars import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Test import java.util.UUID @@ -56,9 +56,11 @@ private val resultat = KvitteringResultat( forespoersel = mockForespoersel(), sykmeldtNavn = "Syk Meldt", - avsenderNavn = "Avs Ender", orgNavn = "Orga Nisasjon", - skjema = mockSkjemaInntektsmelding(), - inntektsmelding = mockInntektsmelding(), - eksternInntektsmelding = mockEksternInntektsmelding(), + lagret = + LagretInntektsmelding.Skjema( + avsenderNavn = "Avs Ender", + skjema = mockSkjemaInntektsmelding(), + mottatt = 4.mars.atStartOfDay(), + ), ) 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 d5c7a953f2..7e355e4afc 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 @@ -6,7 +6,7 @@ import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Inntektsmelding 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.utils.zoneIdOslo +import no.nav.helsearbeidsgiver.felles.utils.toOffsetDateTimeOslo import java.time.LocalDateTime import java.util.UUID @@ -69,7 +69,7 @@ fun mapInntektsmelding( inntekt = inntekt, refusjon = refusjon, aarsakInnsending = aarsakInnsending, - mottatt = mottatt.atZone(zoneIdOslo).toOffsetDateTime(), + mottatt = mottatt.toOffsetDateTimeOslo(), 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 44ba43dffb..9eec994336 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 @@ -16,7 +16,7 @@ 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.felles.utils.toOffsetDateTimeOslo import no.nav.helsearbeidsgiver.utils.test.date.august import no.nav.helsearbeidsgiver.utils.test.date.desember import no.nav.helsearbeidsgiver.utils.test.date.juli @@ -82,7 +82,7 @@ class MapInntektsmeldingKtTest : vedtaksperiodeId shouldBe forespoersel.vedtaksperiodeId - mottatt shouldBe imMottatt.atZone(zoneIdOslo).toOffsetDateTime() + mottatt shouldBe imMottatt.toOffsetDateTimeOslo() } } 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 4967187e1f..4c2a70b927 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 @@ -1,13 +1,16 @@ package no.nav.helsearbeidsgiver.inntektsmelding.db +import no.nav.helsearbeidsgiver.domene.inntektsmelding.Utils.convert +import no.nav.helsearbeidsgiver.domene.inntektsmelding.Utils.convertAgp +import no.nav.helsearbeidsgiver.domene.inntektsmelding.Utils.convertInntekt import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Inntektsmelding import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.skjema.SkjemaInntektsmelding import no.nav.helsearbeidsgiver.felles.domene.EksternInntektsmelding +import no.nav.helsearbeidsgiver.felles.domene.LagretInntektsmelding import no.nav.helsearbeidsgiver.felles.metrics.Metrics import no.nav.helsearbeidsgiver.inntektsmelding.db.tabell.InntektsmeldingEntitet import no.nav.helsearbeidsgiver.utils.log.logger import no.nav.helsearbeidsgiver.utils.log.sikkerLogger -import no.nav.helsearbeidsgiver.utils.pipe.orDefault import org.jetbrains.exposed.sql.Database import org.jetbrains.exposed.sql.Query import org.jetbrains.exposed.sql.SortOrder @@ -25,25 +28,51 @@ class InntektsmeldingRepository( private val logger = logger() private val sikkerLogger = sikkerLogger() - fun hentNyesteEksternEllerInternInntektsmelding(forespoerselId: UUID): Triple = - Metrics.dbInntektsmelding.recordTime(InntektsmeldingRepository::hentNyesteEksternEllerInternInntektsmelding) { + fun hentNyesteInntektsmelding(forespoerselId: UUID): LagretInntektsmelding? = + Metrics.dbInntektsmelding.recordTime(InntektsmeldingRepository::hentNyesteInntektsmelding) { transaction(db) { InntektsmeldingEntitet .select( - InntektsmeldingEntitet.skjema, InntektsmeldingEntitet.dokument, + InntektsmeldingEntitet.skjema, InntektsmeldingEntitet.eksternInntektsmelding, + InntektsmeldingEntitet.innsendt, ).where { InntektsmeldingEntitet.forespoerselId eq forespoerselId.toString() } .orderBy(InntektsmeldingEntitet.innsendt, SortOrder.DESC) .limit(1) .map { - Triple( - it[InntektsmeldingEntitet.skjema], + Quadruple( it[InntektsmeldingEntitet.dokument], + it[InntektsmeldingEntitet.skjema], it[InntektsmeldingEntitet.eksternInntektsmelding], + it[InntektsmeldingEntitet.innsendt], ) - }.firstOrNull() - }.orDefault(Triple(null, null, null)) + } + }.firstOrNull() + ?.let { result -> + val inntektsmelding = result.first + val skjema = result.second + val eksternInntektsmelding = result.third + val mottatt = result.fourth + + when { + skjema != null -> LagretInntektsmelding.Skjema(inntektsmelding?.innsenderNavn, skjema, mottatt) + inntektsmelding != null -> { + val bakoverkompatibeltSkjema = + SkjemaInntektsmelding( + forespoerselId = forespoerselId, + avsenderTlf = inntektsmelding.telefonnummer.orEmpty(), + agp = inntektsmelding.convertAgp(), + inntekt = inntektsmelding.convertInntekt(), + refusjon = inntektsmelding.refusjon.convert(), + ) + + LagretInntektsmelding.Skjema(inntektsmelding.innsenderNavn, bakoverkompatibeltSkjema, mottatt) + } + eksternInntektsmelding != null -> LagretInntektsmelding.Ekstern(eksternInntektsmelding) + else -> null + } + } } fun oppdaterJournalpostId( @@ -82,7 +111,7 @@ class InntektsmeldingRepository( InntektsmeldingEntitet.insert { it[this.forespoerselId] = forespoerselId.toString() it[eksternInntektsmelding] = eksternIm - it[innsendt] = LocalDateTime.now() + it[innsendt] = eksternIm.tidspunkt } } } @@ -149,18 +178,25 @@ class InntektsmeldingRepository( } } } - - private fun hentNyesteImQuery(forespoerselId: UUID): Query = - InntektsmeldingEntitet - .selectAll() - .where { (InntektsmeldingEntitet.forespoerselId eq forespoerselId.toString()) and InntektsmeldingEntitet.dokument.isNotNull() } - .orderBy(InntektsmeldingEntitet.innsendt, SortOrder.DESC) - .limit(1) - - private fun hentNyesteImSkjemaQuery(forespoerselId: UUID): Query = - InntektsmeldingEntitet - .selectAll() - .where { InntektsmeldingEntitet.forespoerselId eq forespoerselId.toString() } - .orderBy(InntektsmeldingEntitet.innsendt, SortOrder.DESC) - .limit(1) } + +private class Quadruple( + val first: A, + val second: B, + val third: C, + val fourth: D, +) + +private fun hentNyesteImQuery(forespoerselId: UUID): Query = + InntektsmeldingEntitet + .selectAll() + .where { (InntektsmeldingEntitet.forespoerselId eq forespoerselId.toString()) and InntektsmeldingEntitet.dokument.isNotNull() } + .orderBy(InntektsmeldingEntitet.innsendt, SortOrder.DESC) + .limit(1) + +private fun hentNyesteImSkjemaQuery(forespoerselId: UUID): Query = + InntektsmeldingEntitet + .selectAll() + .where { InntektsmeldingEntitet.forespoerselId eq forespoerselId.toString() } + .orderBy(InntektsmeldingEntitet.innsendt, SortOrder.DESC) + .limit(1) diff --git a/apps/db/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/db/river/HentLagretImRiver.kt b/apps/db/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/db/river/HentLagretImRiver.kt index 658e3824a7..0210b7c387 100644 --- a/apps/db/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/db/river/HentLagretImRiver.kt +++ b/apps/db/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/db/river/HentLagretImRiver.kt @@ -1,15 +1,12 @@ package no.nav.helsearbeidsgiver.inntektsmelding.db.river import kotlinx.serialization.json.JsonElement -import no.nav.helsearbeidsgiver.domene.inntektsmelding.Utils.convert -import no.nav.helsearbeidsgiver.domene.inntektsmelding.Utils.convertAgp -import no.nav.helsearbeidsgiver.domene.inntektsmelding.Utils.convertInntekt -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Inntektsmelding 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.Key import no.nav.helsearbeidsgiver.felles.domene.EksternInntektsmelding +import no.nav.helsearbeidsgiver.felles.domene.LagretInntektsmelding import no.nav.helsearbeidsgiver.felles.domene.ResultJson import no.nav.helsearbeidsgiver.felles.json.krev import no.nav.helsearbeidsgiver.felles.json.les @@ -61,29 +58,9 @@ class HentLagretImRiver( override fun HentLagretImMelding.bestemNoekkel(): KafkaKey = svarKafkaKey override fun HentLagretImMelding.haandter(json: Map): Map { - val ( - skjema, - inntektsmelding, - eksternInntektsmelding, - ) = - imRepo - .hentNyesteEksternEllerInternInntektsmelding(forespoerselId) - .let { (skjema, inntektsmelding, eksternInntektsmelding) -> - val bakoverkompatibeltSkjema = - skjema ?: inntektsmelding?.let { - SkjemaInntektsmelding( - forespoerselId = forespoerselId, - avsenderTlf = it.telefonnummer.orEmpty(), - agp = it.convertAgp(), - inntekt = it.convertInntekt(), - refusjon = it.refusjon.convert(), - ) - } + val lagret = imRepo.hentNyesteInntektsmelding(forespoerselId) - Triple(bakoverkompatibeltSkjema, inntektsmelding, eksternInntektsmelding) - }.tilPayloadTriple() - - loggHentet(inntektsmelding, eksternInntektsmelding) + loggHentet(lagret) return mapOf( Key.EVENT_NAME to eventName.toJson(), @@ -91,11 +68,10 @@ class HentLagretImRiver( Key.DATA to data .plus( - mapOf( - Key.SKJEMA_INNTEKTSMELDING to skjema.toJson(), - Key.LAGRET_INNTEKTSMELDING to inntektsmelding.toJson(), - Key.EKSTERN_INNTEKTSMELDING to eksternInntektsmelding.toJson(), - ), + Key.LAGRET_INNTEKTSMELDING to + ResultJson( + success = lagret?.toJson(LagretInntektsmelding.serializer()), + ).toJson(), ).toJson(), ) } @@ -126,37 +102,22 @@ class HentLagretImRiver( Log.forespoerselId(forespoerselId), ) - private fun loggHentet( - inntektsmelding: ResultJson, - eksternInntektsmelding: ResultJson, - ) { - if (inntektsmelding.success == null) { - "Fant _ikke_ lagret inntektsmelding.".also { - logger.info(it) - sikkerLogger.info(it) + private fun loggHentet(lagret: LagretInntektsmelding?) { + when (lagret) { + is LagretInntektsmelding.Skjema -> { + logger.info("Fant lagret inntektsmeldingsskjema.") + sikkerLogger.info("Fant lagret inntektsmeldingsskjema.\n${lagret.skjema.toJson(SkjemaInntektsmelding.serializer()).toPretty()}") } - } else { - logger.info("Fant lagret inntektsmelding.") - sikkerLogger.info("Fant lagret inntektsmelding.\n${inntektsmelding.success?.toPretty()}") - } - - if (eksternInntektsmelding.success == null) { - "Fant _ikke_ lagret ekstern inntektsmelding.".also { - logger.info(it) - sikkerLogger.info(it) + is LagretInntektsmelding.Ekstern -> { + logger.info("Fant lagret ekstern inntektsmelding.") + sikkerLogger.info("Fant lagret ekstern inntektsmelding.\n${lagret.ekstern.toJson(EksternInntektsmelding.serializer()).toPretty()}") + } + null -> { + "Fant _ikke_ lagret inntektsmeldingsskjema eller ekstern inntektsmelding.".also { + logger.info(it) + sikkerLogger.info(it) + } } - } else { - logger.info("Fant lagret ekstern inntektsmelding.") - sikkerLogger.info("Fant lagret ekstern inntektsmelding.\n${eksternInntektsmelding.success?.toPretty()}") } } } - -private fun Triple.tilPayloadTriple(): Triple = - Triple( - first?.toJson(SkjemaInntektsmelding.serializer()).toSuccess(), - second?.toJson(Inntektsmelding.serializer()).toSuccess(), - third?.toJson(EksternInntektsmelding.serializer()).toSuccess(), - ) - -private fun JsonElement?.toSuccess(): ResultJson = ResultJson(success = this) 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 6930b09ebd..cb499706af 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 @@ -7,17 +7,24 @@ import io.kotest.matchers.equals.shouldNotBeEqual import io.kotest.matchers.nulls.shouldBeNull import io.kotest.matchers.nulls.shouldNotBeNull import io.kotest.matchers.shouldBe +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.skjema.SkjemaInntektsmelding import no.nav.helsearbeidsgiver.felles.db.exposed.test.FunSpecWithDb +import no.nav.helsearbeidsgiver.felles.domene.LagretInntektsmelding +import no.nav.helsearbeidsgiver.felles.test.mock.mockArbeidsgiverperiode import no.nav.helsearbeidsgiver.felles.test.mock.mockEksternInntektsmelding +import no.nav.helsearbeidsgiver.felles.test.mock.mockInntekt import no.nav.helsearbeidsgiver.felles.test.mock.mockInntektsmeldingGammeltFormat +import no.nav.helsearbeidsgiver.felles.test.mock.mockRefusjon import no.nav.helsearbeidsgiver.felles.test.mock.mockSkjemaInntektsmelding import no.nav.helsearbeidsgiver.felles.test.mock.randomDigitString +import no.nav.helsearbeidsgiver.felles.utils.toOffsetDateTimeOslo 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 +import org.jetbrains.exposed.sql.insert import org.jetbrains.exposed.sql.selectAll import org.jetbrains.exposed.sql.transactions.transaction import java.time.OffsetDateTime @@ -241,13 +248,14 @@ class InntektsmeldingRepositoryTest : test("skal _ikke_ oppdatere journalpostId for ekstern inntektsmelding") { val skjema = mockSkjemaInntektsmelding() + val mottatt = 9.desember.atStartOfDay() val journalpostId = "jp-slem-fryser" - val innsendingId1 = inntektsmeldingRepo.lagreInntektsmeldingSkjema(skjema, 9.desember.atStartOfDay()) + val innsendingId1 = inntektsmeldingRepo.lagreInntektsmeldingSkjema(skjema, mottatt) - val beriketDokument = mockInntektsmeldingGammeltFormat().copy(tidspunkt = OffsetDateTime.now()) + val beriketDokument = mockInntektsmeldingGammeltFormat().copy(tidspunkt = mottatt.toOffsetDateTimeOslo()) inntektsmeldingRepo.oppdaterMedBeriketDokument(skjema.forespoerselId, innsendingId1, beriketDokument) - inntektsmeldingRepo.lagreEksternInntektsmelding(skjema.forespoerselId, mockEksternInntektsmelding()) + inntektsmeldingRepo.lagreEksternInntektsmelding(skjema.forespoerselId, mockEksternInntektsmelding().copy(tidspunkt = mottatt.plusHours(1))) inntektsmeldingRepo.oppdaterJournalpostId(innsendingId1, journalpostId) @@ -271,4 +279,114 @@ class InntektsmeldingRepositoryTest : resultat[1][this.journalpostId].shouldBeNull() } } + + context(InntektsmeldingRepository::hentNyesteInntektsmelding.name) { + + test("henter nyeste") { + val forespoerselId = UUID.randomUUID() + val mottatt = 9.desember.atStartOfDay() + val a = mockSkjemaInntektsmelding().copy(forespoerselId = forespoerselId) + val b = mockEksternInntektsmelding().copy(tidspunkt = mottatt.plusHours(1)) + val c = mockSkjemaInntektsmelding().copy(forespoerselId = forespoerselId) + + inntektsmeldingRepo.lagreInntektsmeldingSkjema(a, mottatt) + inntektsmeldingRepo.lagreEksternInntektsmelding(forespoerselId, b) + inntektsmeldingRepo.lagreInntektsmeldingSkjema(c, mottatt.plusHours(2)) + + val lagret = inntektsmeldingRepo.hentNyesteInntektsmelding(forespoerselId) + + lagret shouldBe + LagretInntektsmelding.Skjema( + avsenderNavn = null, + skjema = c, + mottatt = mottatt.plusHours(2), + ) + } + + test("henter skjema (uten inntektsmelding)") { + val skjema = mockSkjemaInntektsmelding() + val mottatt = 9.desember.atStartOfDay() + + inntektsmeldingRepo.lagreInntektsmeldingSkjema(skjema, mottatt) + + val lagret = inntektsmeldingRepo.hentNyesteInntektsmelding(skjema.forespoerselId) + + lagret shouldBe + LagretInntektsmelding.Skjema( + avsenderNavn = null, + skjema = skjema, + mottatt = mottatt, + ) + } + + test("henter skjema (med inntektsmelding)") { + val skjema = mockSkjemaInntektsmelding() + // Bruk inntektsmelding som er ulikt skjema for å sjekke at hentet skjema ikke stammer fra inntektsmelding + val inntektsmelding = mockInntektsmeldingGammeltFormat().copy(inntekt = null) + val mottatt = 9.desember.atStartOfDay() + + val innsendingId = inntektsmeldingRepo.lagreInntektsmeldingSkjema(skjema, mottatt) + inntektsmeldingRepo.oppdaterMedBeriketDokument(skjema.forespoerselId, innsendingId, inntektsmelding) + + val lagret = inntektsmeldingRepo.hentNyesteInntektsmelding(skjema.forespoerselId) + + lagret shouldBe + LagretInntektsmelding.Skjema( + avsenderNavn = inntektsmelding.innsenderNavn, + skjema = skjema, + mottatt = mottatt, + ) + } + + test("henter inntektsmelding som skjema") { + val forespoerselId = UUID.randomUUID() + val inntektsmelding = mockInntektsmeldingGammeltFormat() + val mottatt = 9.desember.atStartOfDay() + + transaction(db) { + InntektsmeldingEntitet.insert { + it[this.forespoerselId] = forespoerselId.toString() + it[dokument] = inntektsmelding + it[innsendt] = mottatt + } + } + + val lagret = inntektsmeldingRepo.hentNyesteInntektsmelding(forespoerselId) + + val forventetSkjema = + SkjemaInntektsmelding( + forespoerselId = forespoerselId, + avsenderTlf = inntektsmelding.telefonnummer.orEmpty(), + agp = mockArbeidsgiverperiode(), + inntekt = mockInntekt(), + refusjon = mockRefusjon(), + ) + + lagret shouldBe + LagretInntektsmelding.Skjema( + avsenderNavn = "Nifs Krumkake", + skjema = forventetSkjema, + mottatt = mottatt, + ) + } + + test("henter ekstern inntektsmelding") { + val forespoerselId = UUID.randomUUID() + val eksternInntektsmelding = mockEksternInntektsmelding() + + inntektsmeldingRepo.lagreEksternInntektsmelding(forespoerselId, eksternInntektsmelding) + + val lagret = inntektsmeldingRepo.hentNyesteInntektsmelding(forespoerselId) + + lagret shouldBe LagretInntektsmelding.Ekstern(eksternInntektsmelding) + } + + test("tåler at det er ingenting å hente") { + inntektsmeldingRepo.lagreInntektsmeldingSkjema(mockSkjemaInntektsmelding(), 9.desember.atStartOfDay()) + + val lagret = inntektsmeldingRepo.hentNyesteInntektsmelding(UUID.randomUUID()) + + lagret.shouldBeNull() + } + } }) diff --git a/apps/db/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/db/river/HentLagretImRiverTest.kt b/apps/db/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/db/river/HentLagretImRiverTest.kt index 9b68e8550b..14d9560cf7 100644 --- a/apps/db/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/db/river/HentLagretImRiverTest.kt +++ b/apps/db/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/db/river/HentLagretImRiverTest.kt @@ -10,14 +10,10 @@ import io.mockk.every import io.mockk.mockk import io.mockk.verify import io.mockk.verifySequence -import kotlinx.serialization.json.JsonElement -import no.nav.helsearbeidsgiver.domene.inntektsmelding.Utils.convert -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Inntektsmelding -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.Key -import no.nav.helsearbeidsgiver.felles.domene.EksternInntektsmelding +import no.nav.helsearbeidsgiver.felles.domene.LagretInntektsmelding import no.nav.helsearbeidsgiver.felles.domene.ResultJson import no.nav.helsearbeidsgiver.felles.json.toJson import no.nav.helsearbeidsgiver.felles.json.toMap @@ -25,15 +21,13 @@ import no.nav.helsearbeidsgiver.felles.rapidsrivers.KafkaKey import no.nav.helsearbeidsgiver.felles.rapidsrivers.model.Fail import no.nav.helsearbeidsgiver.felles.test.mock.mockEksternInntektsmelding import no.nav.helsearbeidsgiver.felles.test.mock.mockFail -import no.nav.helsearbeidsgiver.felles.test.mock.mockInntektsmelding -import no.nav.helsearbeidsgiver.felles.test.mock.mockInntektsmeldingV1 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.inntektsmelding.db.river.MockHentIm.toMap import no.nav.helsearbeidsgiver.utils.json.toJson -import no.nav.helsearbeidsgiver.utils.pipe.orDefault +import no.nav.helsearbeidsgiver.utils.test.date.april import java.util.UUID class HentLagretImRiverTest : @@ -51,16 +45,13 @@ class HentLagretImRiverTest : context("henter inntektsmelding") { withData( mapOf( - "kun skjema og inntektsmelding" to Triple(mockSkjemaInntektsmelding(), mockInntektsmelding(), null), - "kun skjema" to Triple(mockSkjemaInntektsmelding(), null, null), - "kun ekstern inntektsmelding" to Triple(null, null, mockEksternInntektsmelding()), - "ingen funnet" to Triple(null, null, null), - "alle typer funnet (skal ikke skje)" to Triple(mockSkjemaInntektsmelding(), mockInntektsmelding(), mockEksternInntektsmelding()), + "kun skjema (med navn)" to LagretInntektsmelding.Skjema("Nifs Krumkake", mockSkjemaInntektsmelding(), 12.april.atStartOfDay()), + "kun skjema (uten navn)" to LagretInntektsmelding.Skjema(null, mockSkjemaInntektsmelding(), 12.april.atStartOfDay()), + "kun ekstern inntektsmelding" to LagretInntektsmelding.Ekstern(mockEksternInntektsmelding()), + "ingen funnet" to null, ), ) { lagret -> - every { - mockImRepo.hentNyesteEksternEllerInternInntektsmelding(any()) - } returns lagret + every { mockImRepo.hentNyesteInntektsmelding(any()) } returns lagret val innkommendeMelding = MockHentIm.innkommendeMelding() @@ -77,78 +68,22 @@ class HentLagretImRiverTest : Key.DATA to innkommendeMelding.data .plus( - mapOf( - Key.SKJEMA_INNTEKTSMELDING to - lagret.first - ?.toJson(SkjemaInntektsmelding.serializer()) - ?.toSuccessJson() - .orDefault(MockHentIm.tomResultJson()), - Key.LAGRET_INNTEKTSMELDING to - lagret.second - ?.toJson(Inntektsmelding.serializer()) - ?.toSuccessJson() - .orDefault(MockHentIm.tomResultJson()), - Key.EKSTERN_INNTEKTSMELDING to - lagret.third - ?.toJson(EksternInntektsmelding.serializer()) - ?.toSuccessJson() - .orDefault(MockHentIm.tomResultJson()), - ), + Key.LAGRET_INNTEKTSMELDING to + ResultJson( + success = lagret?.toJson(LagretInntektsmelding.serializer()), + ).toJson(), ).toJson(), ) verifySequence { - mockImRepo.hentNyesteEksternEllerInternInntektsmelding(innkommendeMelding.forespoerselId) + mockImRepo.hentNyesteInntektsmelding(innkommendeMelding.forespoerselId) } } } - test("konverterer inntektsmelding til skjema dersom skjema mangler") { - val innkommendeMelding = MockHentIm.innkommendeMelding() - val imV1 = mockInntektsmeldingV1() - val im = imV1.convert() - val skjema = - SkjemaInntektsmelding( - forespoerselId = innkommendeMelding.forespoerselId, - avsenderTlf = imV1.avsender.tlf, - agp = imV1.agp, - inntekt = imV1.inntekt, - refusjon = imV1.refusjon, - ) - - every { - mockImRepo.hentNyesteEksternEllerInternInntektsmelding(any()) - } returns Triple(null, im, null) - - testRapid.sendJson( - innkommendeMelding.toMap(), - ) - - testRapid.inspektør.size shouldBeExactly 1 - - testRapid.firstMessage().toMap() shouldContainExactly - mapOf( - Key.EVENT_NAME to innkommendeMelding.eventName.toJson(), - Key.KONTEKST_ID to innkommendeMelding.kontekstId.toJson(), - Key.DATA to - innkommendeMelding.data - .plus( - mapOf( - Key.SKJEMA_INNTEKTSMELDING to skjema.toJson(SkjemaInntektsmelding.serializer()).toSuccessJson(), - Key.LAGRET_INNTEKTSMELDING to im.toJson(Inntektsmelding.serializer()).toSuccessJson(), - Key.EKSTERN_INNTEKTSMELDING to MockHentIm.tomResultJson(), - ), - ).toJson(), - ) - - verifySequence { - mockImRepo.hentNyesteEksternEllerInternInntektsmelding(innkommendeMelding.forespoerselId) - } - } - test("håndterer feil") { every { - mockImRepo.hentNyesteEksternEllerInternInntektsmelding(any()) + mockImRepo.hentNyesteInntektsmelding(any()) } throws NullPointerException() val innkommendeMelding = MockHentIm.innkommendeMelding() @@ -167,7 +102,7 @@ class HentLagretImRiverTest : testRapid.firstMessage().toMap() shouldContainExactly forventetFail.tilMelding() verifySequence { - mockImRepo.hentNyesteEksternEllerInternInntektsmelding(innkommendeMelding.forespoerselId) + mockImRepo.hentNyesteInntektsmelding(innkommendeMelding.forespoerselId) } } @@ -189,7 +124,7 @@ class HentLagretImRiverTest : testRapid.inspektør.size shouldBeExactly 0 verify(exactly = 0) { - mockImRepo.hentNyesteEksternEllerInternInntektsmelding(any()) + mockImRepo.hentNyesteInntektsmelding(any()) } } } @@ -222,9 +157,5 @@ private object MockHentIm { Key.DATA to data.toJson(), ) - fun tomResultJson(): JsonElement = ResultJson().toJson() - val fail = mockFail("Filthy, little hobbitses...", EventName.INNTEKTSMELDING_MOTTATT) } - -private fun JsonElement.toSuccessJson(): JsonElement = ResultJson(success = this).toJson() diff --git a/apps/felles-db-exposed/src/testFixtures/kotlin/no/nav/helsearbeidsgiver/felles/db/exposed/test/FunSpecWithDb.kt b/apps/felles-db-exposed/src/testFixtures/kotlin/no/nav/helsearbeidsgiver/felles/db/exposed/test/FunSpecWithDb.kt index 91b3a842e3..055d649b70 100644 --- a/apps/felles-db-exposed/src/testFixtures/kotlin/no/nav/helsearbeidsgiver/felles/db/exposed/test/FunSpecWithDb.kt +++ b/apps/felles-db-exposed/src/testFixtures/kotlin/no/nav/helsearbeidsgiver/felles/db/exposed/test/FunSpecWithDb.kt @@ -18,7 +18,7 @@ abstract class FunSpecWithDb( Database(dbConfig()) .configureFlyway() - beforeEach { + beforeTest { transaction { table.forEach { it.deleteAll() } } diff --git a/apps/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/domene/ForespoerselFraBro.kt b/apps/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/domene/ForespoerselFraBro.kt index 8f279badfb..15a6703569 100644 --- a/apps/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/domene/ForespoerselFraBro.kt +++ b/apps/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/domene/ForespoerselFraBro.kt @@ -16,7 +16,6 @@ import java.util.UUID data class ForespoerselFraBro( val orgnr: Orgnr, val fnr: Fnr, - /** Ikke bruk ved henting av én forespørsel (Storebror lekker feil id). */ val forespoerselId: UUID, val vedtaksperiodeId: UUID, val sykmeldingsperioder: List, diff --git a/apps/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/domene/KvitteringResultat.kt b/apps/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/domene/KvitteringResultat.kt index 0409720cd1..2db8ecf37c 100644 --- a/apps/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/domene/KvitteringResultat.kt +++ b/apps/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/domene/KvitteringResultat.kt @@ -1,16 +1,11 @@ package no.nav.helsearbeidsgiver.felles.domene import kotlinx.serialization.Serializable -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Inntektsmelding -import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.skjema.SkjemaInntektsmelding @Serializable data class KvitteringResultat( val forespoersel: Forespoersel, val sykmeldtNavn: String, - val avsenderNavn: String, val orgNavn: String, - val skjema: SkjemaInntektsmelding?, - val inntektsmelding: Inntektsmelding?, - val eksternInntektsmelding: EksternInntektsmelding?, + val lagret: LagretInntektsmelding?, ) diff --git a/apps/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/domene/LagretInntektsmelding.kt b/apps/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/domene/LagretInntektsmelding.kt new file mode 100644 index 0000000000..c58ff66cf1 --- /dev/null +++ b/apps/felles/src/main/kotlin/no/nav/helsearbeidsgiver/felles/domene/LagretInntektsmelding.kt @@ -0,0 +1,27 @@ +@file:UseSerializers(LocalDateTimeSerializer::class) + +package no.nav.helsearbeidsgiver.felles.domene + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.UseSerializers +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.skjema.SkjemaInntektsmelding +import no.nav.helsearbeidsgiver.utils.json.serializer.LocalDateTimeSerializer +import java.time.LocalDateTime + +@Serializable +sealed class LagretInntektsmelding { + @Serializable + @SerialName("Skjema") + data class Skjema( + val avsenderNavn: String?, + val skjema: SkjemaInntektsmelding, + val mottatt: LocalDateTime, + ) : LagretInntektsmelding() + + @Serializable + @SerialName("Ekstern") + data class Ekstern( + val ekstern: EksternInntektsmelding, + ) : LagretInntektsmelding() +} 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 754fa4de8d..a0fd2f9537 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 @@ -1,16 +1,19 @@ package no.nav.helsearbeidsgiver.felles.utils import java.time.LocalDate +import java.time.LocalDateTime +import java.time.OffsetDateTime 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") +private val zoneIdOslo: ZoneId = ZoneId.of("Europe/Oslo") fun LocalDate.tilNorskFormat(): String = format(norskDatoFormat) fun LocalDate.toYearMonth(): YearMonth = YearMonth.of(year, month) +fun LocalDateTime.toOffsetDateTimeOslo(): OffsetDateTime = atZone(zoneIdOslo).toOffsetDateTime() + fun YearMonth.toLocalDate(day: Int): LocalDate = LocalDate.of(year, monthValue, day) diff --git a/apps/felles/src/test/kotlin/no/nav/helsearbeidsgiver/felles/rapidsrivers/model/FailTest.kt b/apps/felles/src/test/kotlin/no/nav/helsearbeidsgiver/felles/rapidsrivers/model/FailTest.kt index 1610b9f04b..6eef58efb6 100644 --- a/apps/felles/src/test/kotlin/no/nav/helsearbeidsgiver/felles/rapidsrivers/model/FailTest.kt +++ b/apps/felles/src/test/kotlin/no/nav/helsearbeidsgiver/felles/rapidsrivers/model/FailTest.kt @@ -5,8 +5,6 @@ import io.kotest.matchers.maps.shouldContainExactly import kotlinx.serialization.json.JsonNull import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Inntektsmelding import no.nav.helsearbeidsgiver.felles.Key -import no.nav.helsearbeidsgiver.felles.json.toJson -import no.nav.helsearbeidsgiver.felles.rapidsrivers.model.Fail.Companion.serializer import no.nav.helsearbeidsgiver.felles.test.mock.mockInntektsmeldingV1 import no.nav.helsearbeidsgiver.utils.json.toJson import java.util.UUID @@ -21,7 +19,7 @@ class FailTest : fail.tilMelding() shouldContainExactly mapOf( - Key.FAIL to fail.toJson(serializer()), + Key.FAIL to fail.toJson(Fail.serializer()), ) } } diff --git a/apps/felles/src/testFixtures/kotlin/no/nav/helsearbeidsgiver/felles/test/mock/MockInntektsmelding.kt b/apps/felles/src/testFixtures/kotlin/no/nav/helsearbeidsgiver/felles/test/mock/MockInntektsmelding.kt index f58acf1ed0..ebbc1b8fa3 100644 --- a/apps/felles/src/testFixtures/kotlin/no/nav/helsearbeidsgiver/felles/test/mock/MockInntektsmelding.kt +++ b/apps/felles/src/testFixtures/kotlin/no/nav/helsearbeidsgiver/felles/test/mock/MockInntektsmelding.kt @@ -1,28 +1,22 @@ package no.nav.helsearbeidsgiver.felles.test.mock import no.nav.helsearbeidsgiver.domene.inntektsmelding.Utils.convert -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.AarsakInnsending -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.BegrunnelseIngenEllerRedusertUtbetalingKode -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.FullLoennIArbeidsgiverPerioden -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Inntekt -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Inntektsmelding -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Naturalytelse -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.NaturalytelseKode -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Refusjon -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.RefusjonEndring -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Tariffendring +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.AarsakInnsending import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Arbeidsgiverperiode import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Avsender +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Inntekt +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Inntektsmelding +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Naturalytelse import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.NyStillingsprosent -import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Periode import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.RedusertLoennIAgp +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Refusjon +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.RefusjonEndring import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Sykmeldt import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.skjema.SkjemaAvsender import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.skjema.SkjemaInntektsmelding import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.skjema.SkjemaInntektsmeldingSelvbestemt import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.til import no.nav.helsearbeidsgiver.felles.domene.EksternInntektsmelding -import no.nav.helsearbeidsgiver.utils.test.date.desember import no.nav.helsearbeidsgiver.utils.test.date.kl import no.nav.helsearbeidsgiver.utils.test.date.mars import no.nav.helsearbeidsgiver.utils.test.date.november @@ -32,17 +26,8 @@ import no.nav.helsearbeidsgiver.utils.test.wrapper.genererGyldig import no.nav.helsearbeidsgiver.utils.wrapper.Fnr import no.nav.helsearbeidsgiver.utils.wrapper.Orgnr import java.time.ZoneOffset -import java.time.ZonedDateTime import java.util.UUID -import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.AarsakInnsending as AarsakInnsendingV1 -import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Inntekt as InntektV1 -import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Inntektsmelding as InntektsmeldingV1 -import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Naturalytelse as NaturalytelseV1 -import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Refusjon as RefusjonV1 -import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.RefusjonEndring as RefusjonEndringV1 - -private val dag = 24.desember(2022) -private const val INNTEKT = 25_000.0 +import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Inntektsmelding as InntektsmeldingGammeltFormat fun mockSkjemaInntektsmelding(): SkjemaInntektsmelding { val inntektsmelding = mockInntektsmeldingV1() @@ -73,11 +58,11 @@ fun mockSkjemaInntektsmeldingSelvbestemt(): SkjemaInntektsmeldingSelvbestemt { ) } -fun mockInntektsmeldingV1(): InntektsmeldingV1 = - InntektsmeldingV1( +fun mockInntektsmeldingV1(): Inntektsmelding = + Inntektsmelding( id = UUID.randomUUID(), type = - InntektsmeldingV1.Type.Forespurt( + Inntektsmelding.Type.Forespurt( id = UUID.randomUUID(), ), sykmeldt = @@ -97,144 +82,79 @@ fun mockInntektsmeldingV1(): InntektsmeldingV1 = 5.oktober til 15.oktober, 20.oktober til 3.november, ), - agp = - Arbeidsgiverperiode( - perioder = - listOf( - 5.oktober til 15.oktober, - 20.oktober til 22.oktober, - ), - egenmeldinger = - listOf( - 28.september til 28.september, - 30.september til 30.september, - ), - redusertLoennIAgp = - RedusertLoennIAgp( - beloep = 300.3, - begrunnelse = RedusertLoennIAgp.Begrunnelse.FerieEllerAvspasering, - ), - ), - inntekt = - InntektV1( - beloep = 544.6, - inntektsdato = 28.september, - naturalytelser = - listOf( - NaturalytelseV1( - naturalytelse = NaturalytelseV1.Kode.BEDRIFTSBARNEHAGEPLASS, - verdiBeloep = 52.5, - sluttdato = 10.oktober, - ), - NaturalytelseV1( - naturalytelse = NaturalytelseV1.Kode.BIL, - verdiBeloep = 434.0, - sluttdato = 12.oktober, - ), - ), - endringAarsak = - NyStillingsprosent( - gjelderFra = 16.oktober, - ), - ), - refusjon = - RefusjonV1( - beloepPerMaaned = 150.2, - endringer = - listOf( - RefusjonEndringV1( - 140.9, - 14.oktober, - ), - RefusjonEndringV1( - 130.8, - 18.oktober, - ), - RefusjonEndringV1( - 120.7, - 21.oktober, - ), - ), - sluttdato = 31.oktober, - ), - aarsakInnsending = AarsakInnsendingV1.Endring, + agp = mockArbeidsgiverperiode(), + inntekt = mockInntekt(), + refusjon = mockRefusjon(), + aarsakInnsending = AarsakInnsending.Endring, mottatt = 14.mars.kl(14, 41, 42, 0).atOffset(ZoneOffset.ofHours(1)), vedtaksperiodeId = UUID.randomUUID(), ) -fun mockInntektsmeldingGammeltFormat(): Inntektsmelding = mockInntektsmeldingV1().convert() - -fun mockInntektsmelding(): Inntektsmelding = - Inntektsmelding( - orgnrUnderenhet = Orgnr.genererGyldig().verdi, - identitetsnummer = Fnr.genererGyldig().verdi, - vedtaksperiodeId = UUID.randomUUID(), - fulltNavn = "Ola Normann", - virksomhetNavn = "Norge AS", - behandlingsdager = listOf(dag), - egenmeldingsperioder = +fun mockArbeidsgiverperiode(): Arbeidsgiverperiode = + Arbeidsgiverperiode( + perioder = listOf( - Periode(dag, dag.plusDays(2)), - Periode(dag.plusDays(3), dag.plusDays(4)), - ), - beregnetInntekt = INNTEKT, - inntekt = - Inntekt( - bekreftet = true, - beregnetInntekt = INNTEKT, - endringÅrsak = Tariffendring(dag, dag), - manueltKorrigert = false, + 5.oktober til 15.oktober, + 20.oktober til 22.oktober, ), - fullLønnIArbeidsgiverPerioden = - FullLoennIArbeidsgiverPerioden( - utbetalerFullLønn = true, - begrunnelse = BegrunnelseIngenEllerRedusertUtbetalingKode.BeskjedGittForSent, - utbetalt = 10_000.0, + egenmeldinger = + listOf( + 28.september til 28.september, + 30.september til 30.september, ), - refusjon = - Refusjon( - utbetalerHeleEllerDeler = true, - refusjonPrMnd = INNTEKT, - refusjonOpphører = dag.plusDays(3), - refusjonEndringer = - listOf( - RefusjonEndring(140.0, dag.minusDays(4)), - RefusjonEndring(150.0, dag.minusDays(5)), - RefusjonEndring(160.0, dag.minusDays(6)), - ), + redusertLoennIAgp = + RedusertLoennIAgp( + beloep = 300.3, + begrunnelse = RedusertLoennIAgp.Begrunnelse.FerieEllerAvspasering, ), + ) + +fun mockInntekt(): Inntekt = + Inntekt( + beloep = 544.6, + inntektsdato = 28.september, naturalytelser = listOf( Naturalytelse( - NaturalytelseKode.BIL, - dag.plusDays(5), - 350.0, + naturalytelse = Naturalytelse.Kode.BEDRIFTSBARNEHAGEPLASS, + verdiBeloep = 52.5, + sluttdato = 10.oktober, ), Naturalytelse( - NaturalytelseKode.BIL, - dag.plusDays(5), - 350.0, + naturalytelse = Naturalytelse.Kode.BIL, + verdiBeloep = 434.0, + sluttdato = 12.oktober, ), ), - fraværsperioder = - listOf( - Periode(dag, dag.plusDays(55)), - Periode(dag, dag.plusDays(22)), - Periode(dag, dag.plusDays(32)), + endringAarsak = + NyStillingsprosent( + gjelderFra = 16.oktober, ), - arbeidsgiverperioder = + ) + +fun mockRefusjon(): Refusjon = + Refusjon( + beloepPerMaaned = 150.2, + endringer = listOf( - Periode(dag, dag.plusDays(30)), - Periode(dag, dag.plusDays(40)), - Periode(dag, dag.plusDays(40)), + RefusjonEndring( + beloep = 140.9, + startdato = 14.oktober, + ), + RefusjonEndring( + beloep = 130.8, + startdato = 18.oktober, + ), + RefusjonEndring( + beloep = 120.7, + startdato = 21.oktober, + ), ), - bestemmendeFraværsdag = dag.plusDays(90), - tidspunkt = ZonedDateTime.now().toOffsetDateTime(), - årsakInnsending = AarsakInnsending.NY, - innsenderNavn = "Snill Arbeidsgiver", - telefonnummer = "22222222", + sluttdato = 31.oktober, ) +fun mockInntektsmeldingGammeltFormat(): InntektsmeldingGammeltFormat = mockInntektsmeldingV1().convert() + fun mockEksternInntektsmelding(): EksternInntektsmelding = EksternInntektsmelding( avsenderSystemNavn = "Trygge Trygves Trygdesystem", diff --git a/apps/innsending/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/innsending/KvitteringService.kt b/apps/innsending/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/innsending/KvitteringService.kt index bc17898de3..879c552227 100644 --- a/apps/innsending/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/innsending/KvitteringService.kt +++ b/apps/innsending/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/innsending/KvitteringService.kt @@ -2,14 +2,12 @@ package no.nav.helsearbeidsgiver.inntektsmelding.innsending import com.github.navikt.tbd_libs.rapids_and_rivers_api.RapidsConnection import kotlinx.serialization.json.JsonElement -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Inntektsmelding -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.Key -import no.nav.helsearbeidsgiver.felles.domene.EksternInntektsmelding import no.nav.helsearbeidsgiver.felles.domene.Forespoersel import no.nav.helsearbeidsgiver.felles.domene.KvitteringResultat +import no.nav.helsearbeidsgiver.felles.domene.LagretInntektsmelding import no.nav.helsearbeidsgiver.felles.domene.Person import no.nav.helsearbeidsgiver.felles.domene.ResultJson import no.nav.helsearbeidsgiver.felles.json.les @@ -60,9 +58,7 @@ class KvitteringService( data class Komplett( val orgnrMedNavn: Map, val personer: Map, - val skjema: SkjemaInntektsmelding?, - val inntektsmelding: Inntektsmelding?, - val eksternInntektsmelding: EksternInntektsmelding?, + val lagret: LagretInntektsmelding?, ) : Steg2() data object Delvis : Steg2() @@ -82,37 +78,21 @@ class KvitteringService( override fun lesSteg2(melding: Map): Steg2 { val orgnrMedNavn = runCatching { Key.VIRKSOMHETER.les(orgMapSerializer, melding) } val personer = runCatching { Key.PERSONER.les(personMapSerializer, melding) } - val skjema = - runCatching { - Key.SKJEMA_INNTEKTSMELDING - .les(ResultJson.serializer(), melding) - .success - ?.fromJson(SkjemaInntektsmelding.serializer()) - } - val inntektsmelding = + val lagret = runCatching { Key.LAGRET_INNTEKTSMELDING .les(ResultJson.serializer(), melding) .success - ?.fromJson(Inntektsmelding.serializer()) - } - val eksternInntektsmelding = - runCatching { - Key.EKSTERN_INNTEKTSMELDING - .les(ResultJson.serializer(), melding) - .success - ?.fromJson(EksternInntektsmelding.serializer()) + ?.fromJson(LagretInntektsmelding.serializer()) } - val results = listOf(orgnrMedNavn, personer, skjema, inntektsmelding, eksternInntektsmelding) + val results = listOf(orgnrMedNavn, personer, lagret) return if (results.all { it.isSuccess }) { Steg2.Komplett( orgnrMedNavn = orgnrMedNavn.getOrThrow(), personer = personer.getOrThrow(), - skjema = skjema.getOrThrow(), - inntektsmelding = inntektsmelding.getOrThrow(), - eksternInntektsmelding = eksternInntektsmelding.getOrThrow(), + lagret = lagret.getOrThrow(), ) } else if (results.any { it.isSuccess }) { Steg2.Delvis @@ -199,11 +179,8 @@ class KvitteringService( KvitteringResultat( forespoersel = steg1.forespoersel, sykmeldtNavn = sykmeldtNavn, - avsenderNavn = steg2.inntektsmelding?.innsenderNavn ?: UKJENT_NAVN, orgNavn = orgNavn, - skjema = steg2.skjema, - inntektsmelding = steg2.inntektsmelding, - eksternInntektsmelding = steg2.eksternInntektsmelding, + lagret = steg2.lagret, ).toJson(KvitteringResultat.serializer()), ) diff --git a/apps/innsending/src/test/kotlin/no.nav.helsearbeidsgiver.inntektsmelding.innsending/KvitteringServiceTest.kt b/apps/innsending/src/test/kotlin/no.nav.helsearbeidsgiver.inntektsmelding.innsending/KvitteringServiceTest.kt index 5dcd9340b9..ac6434816d 100644 --- a/apps/innsending/src/test/kotlin/no.nav.helsearbeidsgiver.inntektsmelding.innsending/KvitteringServiceTest.kt +++ b/apps/innsending/src/test/kotlin/no.nav.helsearbeidsgiver.inntektsmelding.innsending/KvitteringServiceTest.kt @@ -2,21 +2,18 @@ package no.nav.helsearbeidsgiver.inntektsmelding.innsending import com.github.navikt.tbd_libs.rapids_and_rivers.test_support.TestRapid import io.kotest.core.spec.style.FunSpec -import io.kotest.data.row import io.kotest.datatest.withData import io.kotest.matchers.ints.shouldBeExactly import io.kotest.matchers.shouldBe import io.mockk.clearAllMocks import io.mockk.verify import kotlinx.serialization.json.JsonElement -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Inntektsmelding -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.Key -import no.nav.helsearbeidsgiver.felles.domene.EksternInntektsmelding import no.nav.helsearbeidsgiver.felles.domene.Forespoersel import no.nav.helsearbeidsgiver.felles.domene.KvitteringResultat +import no.nav.helsearbeidsgiver.felles.domene.LagretInntektsmelding import no.nav.helsearbeidsgiver.felles.domene.Person import no.nav.helsearbeidsgiver.felles.domene.ResultJson import no.nav.helsearbeidsgiver.felles.json.orgMapSerializer @@ -29,13 +26,12 @@ import no.nav.helsearbeidsgiver.felles.test.mock.MockRedis import no.nav.helsearbeidsgiver.felles.test.mock.mockEksternInntektsmelding import no.nav.helsearbeidsgiver.felles.test.mock.mockFail import no.nav.helsearbeidsgiver.felles.test.mock.mockForespoersel -import no.nav.helsearbeidsgiver.felles.test.mock.mockInntektsmelding import no.nav.helsearbeidsgiver.felles.test.mock.mockSkjemaInntektsmelding import no.nav.helsearbeidsgiver.felles.test.rapidsrivers.firstMessage import no.nav.helsearbeidsgiver.felles.test.rapidsrivers.message import no.nav.helsearbeidsgiver.felles.test.rapidsrivers.sendJson import no.nav.helsearbeidsgiver.utils.json.toJson -import no.nav.helsearbeidsgiver.utils.pipe.orDefault +import no.nav.helsearbeidsgiver.utils.test.date.november import no.nav.helsearbeidsgiver.utils.wrapper.Fnr import no.nav.helsearbeidsgiver.utils.wrapper.Orgnr import java.util.UUID @@ -58,27 +54,18 @@ class KvitteringServiceTest : context("kvittering hentes") { withData( mapOf( - "inntektsmelding hentes" to row(mockSkjemaInntektsmelding(), mockInntektsmelding(), null), - "ekstern inntektsmelding hentes" to row(null, null, mockEksternInntektsmelding()), - "ingen inntektsmelding funnet" to row(null, null, null), - "begge typer inntektsmelding funnet (skal ikke skje)" to - row(mockSkjemaInntektsmelding(), mockInntektsmelding(), mockEksternInntektsmelding()), + "inntektsmelding hentes" to LagretInntektsmelding.Skjema("Barbie Roberts", mockSkjemaInntektsmelding(), 6.november.atStartOfDay()), + "ekstern inntektsmelding hentes" to LagretInntektsmelding.Ekstern(mockEksternInntektsmelding()), + "ingen inntektsmelding funnet" to null, ), - ) { (expectedSkjema, expectedInntektsmelding, expectedEksternInntektsmelding) -> + ) { lagret -> val kontekstId: UUID = UUID.randomUUID() - val avsenderNavn = "Barbie Roberts".takeUnless { expectedInntektsmelding == null }.orDefault("Ukjent navn") val expectedResult = KvitteringResultat( forespoersel = mockForespoersel(), sykmeldtNavn = "Kenneth Sean Carson", - avsenderNavn = avsenderNavn, orgNavn = "Mattel", - skjema = expectedSkjema, - inntektsmelding = - expectedInntektsmelding?.copy( - innsenderNavn = avsenderNavn, - ), - eksternInntektsmelding = expectedEksternInntektsmelding, + lagret = lagret, ) val sykmeldtFnr = expectedResult.forespoersel.fnr @@ -103,9 +90,7 @@ class KvitteringServiceTest : kontekstId, mapOf(expectedResult.forespoersel.orgnr to expectedResult.orgNavn), mapOf(sykmeldtFnr to Person(sykmeldtFnr, expectedResult.sykmeldtNavn)), - expectedResult.skjema, - expectedResult.inntektsmelding, - expectedResult.eksternInntektsmelding, + expectedResult.lagret, ), ) @@ -172,9 +157,7 @@ private object MockKvittering { kontekstId: UUID, orgnrMedNavn: Map, personer: Map, - skjema: SkjemaInntektsmelding?, - inntektsmelding: Inntektsmelding?, - eksternInntektsmelding: EksternInntektsmelding?, + lagret: LagretInntektsmelding?, ): Map = mapOf( Key.EVENT_NAME to EventName.KVITTERING_REQUESTED.toJson(), @@ -183,17 +166,9 @@ private object MockKvittering { mapOf( Key.VIRKSOMHETER to orgnrMedNavn.toJson(orgMapSerializer), Key.PERSONER to personer.toJson(personMapSerializer), - Key.SKJEMA_INNTEKTSMELDING to - ResultJson( - success = skjema?.toJson(SkjemaInntektsmelding.serializer()), - ).toJson(), Key.LAGRET_INNTEKTSMELDING to ResultJson( - success = inntektsmelding?.toJson(Inntektsmelding.serializer()), - ).toJson(), - Key.EKSTERN_INNTEKTSMELDING to - ResultJson( - success = eksternInntektsmelding?.toJson(EksternInntektsmelding.serializer()), + success = lagret?.toJson(LagretInntektsmelding.serializer()), ).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 9f571abd48..7916ee997e 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 @@ -22,7 +22,7 @@ import no.nav.helsearbeidsgiver.felles.json.toJson import no.nav.helsearbeidsgiver.felles.json.toMap import no.nav.helsearbeidsgiver.felles.test.json.lesBehov import no.nav.helsearbeidsgiver.felles.test.mock.mockForespurtData -import no.nav.helsearbeidsgiver.felles.test.mock.mockInntektsmelding +import no.nav.helsearbeidsgiver.felles.test.mock.mockInntektsmeldingGammeltFormat import no.nav.helsearbeidsgiver.felles.test.mock.mockSkjemaInntektsmelding import no.nav.helsearbeidsgiver.inntektsmelding.integrasjonstest.utils.EndToEndTest import no.nav.helsearbeidsgiver.inntektsmelding.integrasjonstest.utils.bjarneBetjent @@ -53,7 +53,7 @@ class BerikInntektsmeldingServiceIT : EndToEndTest() { @Test fun `skal berike og lagre inntektsmeldinger`() { - val tidligereInntektsmelding = mockInntektsmelding() + val tidligereInntektsmelding = mockInntektsmeldingGammeltFormat() val innsendingId = imRepository.lagreInntektsmeldingSkjema(Mock.skjema, 10.desember.atStartOfDay()) imRepository.oppdaterMedBeriketDokument(Mock.forespoerselId, innsendingId, tidligereInntektsmelding) @@ -168,7 +168,7 @@ class BerikInntektsmeldingServiceIT : EndToEndTest() { @Test fun `skal opprette en bakgrunnsjobb som gjenopptar berikelsen av inntektsmeldingen senere dersom oppslaget mot pdl feiler`() { - val tidligereInntektsmelding = mockInntektsmelding() + val tidligereInntektsmelding = mockInntektsmeldingGammeltFormat() val innsendingId = imRepository.lagreInntektsmeldingSkjema(Mock.skjema, 10.desember.atStartOfDay()) imRepository.oppdaterMedBeriketDokument(Mock.forespoerselId, innsendingId, tidligereInntektsmelding) 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 4e5d4ce123..69c8e55291 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 @@ -19,7 +19,7 @@ import no.nav.helsearbeidsgiver.felles.json.toJson import no.nav.helsearbeidsgiver.felles.json.toMap import no.nav.helsearbeidsgiver.felles.rapidsrivers.redis.RedisPrefix import no.nav.helsearbeidsgiver.felles.test.mock.mockForespurtData -import no.nav.helsearbeidsgiver.felles.test.mock.mockInntektsmelding +import no.nav.helsearbeidsgiver.felles.test.mock.mockInntektsmeldingGammeltFormat import no.nav.helsearbeidsgiver.felles.test.mock.mockSkjemaInntektsmelding import no.nav.helsearbeidsgiver.inntektsmelding.integrasjonstest.utils.EndToEndTest import no.nav.helsearbeidsgiver.utils.json.fromJson @@ -44,7 +44,7 @@ class InnsendingServiceIT : EndToEndTest() { @Test fun `Test at innsending er mottatt`() { val kontekstId: UUID = UUID.randomUUID() - val tidligereInntektsmelding = mockInntektsmelding() + val tidligereInntektsmelding = mockInntektsmeldingGammeltFormat() val innsendingId = imRepository.lagreInntektsmeldingSkjema(Mock.skjema, 9.desember.atStartOfDay()) imRepository.oppdaterMedBeriketDokument(Mock.skjema.forespoerselId, innsendingId, tidligereInntektsmelding) 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 20c5e57090..e83d3520dd 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 @@ -2,9 +2,9 @@ package no.nav.helsearbeidsgiver.inntektsmelding.integrasjonstest import io.kotest.matchers.nulls.shouldNotBeNull import io.kotest.matchers.shouldBe -import io.kotest.matchers.shouldNotBe import no.nav.helsearbeidsgiver.felles.EventName import no.nav.helsearbeidsgiver.felles.Key +import no.nav.helsearbeidsgiver.felles.domene.LagretInntektsmelding import no.nav.helsearbeidsgiver.felles.domene.ResultJson import no.nav.helsearbeidsgiver.felles.json.toJson import no.nav.helsearbeidsgiver.felles.json.toMap @@ -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.mock.mockForespoerselSvarSuksess import no.nav.helsearbeidsgiver.inntektsmelding.integrasjonstest.utils.EndToEndTest +import no.nav.helsearbeidsgiver.utils.json.fromJson import no.nav.helsearbeidsgiver.utils.json.toJson import no.nav.helsearbeidsgiver.utils.test.date.desember import org.junit.jupiter.api.BeforeEach @@ -32,6 +33,8 @@ class KvitteringIT : EndToEndTest() { fun `skal hente data til kvittering`() { val kontekstId = UUID.randomUUID() val skjema = mockSkjemaInntektsmelding() + val inntektsmelding = mockInntektsmeldingGammeltFormat() + val mottatt = 3.desember.atStartOfDay() mockForespoerselSvarFraHelsebro( forespoerselId = skjema.forespoerselId, @@ -41,8 +44,8 @@ class KvitteringIT : EndToEndTest() { ), ) - val innsendingId = imRepository.lagreInntektsmeldingSkjema(skjema, 3.desember.atStartOfDay()) - imRepository.oppdaterMedBeriketDokument(skjema.forespoerselId, innsendingId, mockInntektsmeldingGammeltFormat()) + val innsendingId = imRepository.lagreInntektsmeldingSkjema(skjema, mottatt) + imRepository.oppdaterMedBeriketDokument(skjema.forespoerselId, innsendingId, inntektsmelding) publish( Key.EVENT_NAME to EventName.KVITTERING_REQUESTED.toJson(), @@ -55,17 +58,19 @@ class KvitteringIT : EndToEndTest() { messages .filter(EventName.KVITTERING_REQUESTED) - .filter(Key.SKJEMA_INNTEKTSMELDING) .filter(Key.LAGRET_INNTEKTSMELDING) - .filter(Key.EKSTERN_INNTEKTSMELDING) .firstAsMap() .also { val data = it[Key.DATA].shouldNotBeNull().toMap() - data[Key.SKJEMA_INNTEKTSMELDING] shouldNotBe Mock.tomResultJson - data[Key.LAGRET_INNTEKTSMELDING] shouldNotBe Mock.tomResultJson - - data[Key.EKSTERN_INNTEKTSMELDING] shouldBe Mock.tomResultJson + val success = data[Key.LAGRET_INNTEKTSMELDING].shouldNotBeNull().fromJson(ResultJson.serializer()).success + success.shouldNotBeNull() + success.fromJson(LagretInntektsmelding.serializer()) shouldBe + LagretInntektsmelding.Skjema( + avsenderNavn = inntektsmelding.innsenderNavn, + skjema = skjema, + mottatt = mottatt, + ) } redisConnection.get(RedisPrefix.Kvittering, kontekstId).shouldNotBeNull() @@ -75,6 +80,7 @@ class KvitteringIT : EndToEndTest() { fun `skal hente data til kvittering hvis fra eksternt system`() { val kontekstId = UUID.randomUUID() val forespoerselId = UUID.randomUUID() + val eksternIm = mockEksternInntektsmelding() mockForespoerselSvarFraHelsebro( forespoerselId = forespoerselId, @@ -84,7 +90,7 @@ class KvitteringIT : EndToEndTest() { ), ) - imRepository.lagreEksternInntektsmelding(forespoerselId, mockEksternInntektsmelding()) + imRepository.lagreEksternInntektsmelding(forespoerselId, eksternIm) publish( Key.EVENT_NAME to EventName.KVITTERING_REQUESTED.toJson(), @@ -97,19 +103,14 @@ class KvitteringIT : EndToEndTest() { messages .filter(EventName.KVITTERING_REQUESTED) - .filter(Key.SKJEMA_INNTEKTSMELDING) .filter(Key.LAGRET_INNTEKTSMELDING) - .filter(Key.EKSTERN_INNTEKTSMELDING) .firstAsMap() .also { val data = it[Key.DATA].shouldNotBeNull().toMap() - data[Key.SKJEMA_INNTEKTSMELDING] shouldBe Mock.tomResultJson - data[Key.LAGRET_INNTEKTSMELDING] shouldBe Mock.tomResultJson - - val eIm = data[Key.EKSTERN_INNTEKTSMELDING] - eIm.shouldNotBeNull() - eIm shouldNotBe Mock.tomResultJson + val success = data[Key.LAGRET_INNTEKTSMELDING].shouldNotBeNull().fromJson(ResultJson.serializer()).success + success.shouldNotBeNull() + success.fromJson(LagretInntektsmelding.serializer()) shouldBe LagretInntektsmelding.Ekstern(eksternIm) } redisConnection.get(RedisPrefix.Kvittering, kontekstId).shouldNotBeNull() @@ -139,21 +140,12 @@ class KvitteringIT : EndToEndTest() { messages .filter(EventName.KVITTERING_REQUESTED) - .filter(Key.SKJEMA_INNTEKTSMELDING) .filter(Key.LAGRET_INNTEKTSMELDING) - .filter(Key.EKSTERN_INNTEKTSMELDING) .firstAsMap() .also { val data = it[Key.DATA].shouldNotBeNull().toMap() - // Skal ikke finne inntektsmeldingdokument - data[Key.SKJEMA_INNTEKTSMELDING] shouldBe Mock.tomResultJson - data[Key.LAGRET_INNTEKTSMELDING] shouldBe Mock.tomResultJson - data[Key.EKSTERN_INNTEKTSMELDING] shouldBe Mock.tomResultJson + data[Key.LAGRET_INNTEKTSMELDING] shouldBe ResultJson(success = null).toJson() } } - - private object Mock { - val tomResultJson = ResultJson(success = null).toJson() - } } 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 d3c437c1d4..180a15f208 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,7 @@ 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.felles.utils.toOffsetDateTimeOslo import no.nav.helsearbeidsgiver.utils.json.serializer.LocalDateTimeSerializer import no.nav.helsearbeidsgiver.utils.json.serializer.UuidSerializer import no.nav.helsearbeidsgiver.utils.json.serializer.list @@ -394,7 +394,7 @@ fun tilInntektsmelding( inntekt = skjema.inntekt, refusjon = skjema.refusjon, aarsakInnsending = aarsakInnsending, - mottatt = mottatt.atZone(zoneIdOslo).toOffsetDateTime(), + mottatt = mottatt.toOffsetDateTimeOslo(), vedtaksperiodeId = skjema.vedtaksperiodeId, ) }