Skip to content

Commit

Permalink
Les ny IM-klasse under lagring av inntektsmelding (#689)
Browse files Browse the repository at this point in the history
  • Loading branch information
bjerga authored Sep 30, 2024
1 parent f562dcc commit 38ab858
Show file tree
Hide file tree
Showing 6 changed files with 67 additions and 60 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ import kotlinx.serialization.builtins.serializer
import kotlinx.serialization.json.JsonElement
import no.nav.helse.rapids_rivers.RapidsConnection
import no.nav.helsearbeidsgiver.domene.inntektsmelding.Utils.convert
import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Inntektsmelding
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.AarsakInnsending
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Inntektsmelding
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.skjema.SkjemaInntektsmelding
import no.nav.helsearbeidsgiver.felles.BehovType
import no.nav.helsearbeidsgiver.felles.EventName
Expand All @@ -32,7 +32,7 @@ import no.nav.helsearbeidsgiver.utils.wrapper.Fnr
import no.nav.helsearbeidsgiver.utils.wrapper.Orgnr
import java.time.LocalDate
import java.util.UUID
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Inntektsmelding as InntektsmeldingV1
import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Inntektsmelding as InntektsmeldingGammel

private const val UKJENT_NAVN = "Ukjent navn"
private const val UKJENT_VIRKSOMHET = "Ukjent virksomhet"
Expand All @@ -57,9 +57,8 @@ data class Steg3(
)

data class Steg4(
val inntektsmeldingV1: InntektsmeldingV1,
val bestemmendeFravaersdag: LocalDate,
val inntektsmelding: Inntektsmelding,
val bestemmendeFravaersdag: LocalDate,
val erDuplikat: Boolean,
)

Expand Down Expand Up @@ -96,9 +95,8 @@ class BerikInntektsmeldingService(

override fun lesSteg4(melding: Map<Key, JsonElement>): Steg4 =
Steg4(
inntektsmeldingV1 = Key.INNTEKTSMELDING.les(InntektsmeldingV1.serializer(), melding),
inntektsmelding = Key.INNTEKTSMELDING.les(Inntektsmelding.serializer(), melding),
bestemmendeFravaersdag = Key.BESTEMMENDE_FRAVAERSDAG.les(LocalDateSerializer, melding),
inntektsmelding = Key.INNTEKTSMELDING_DOKUMENT.les(Inntektsmelding.serializer(), melding),
erDuplikat = Key.ER_DUPLIKAT_IM.les(Boolean.serializer(), melding),
)

Expand Down Expand Up @@ -201,11 +199,13 @@ class BerikInntektsmeldingService(
data
.plus(
mapOf(
// TODO slett etter overgangsperiode
Key.FORESPOERSEL_ID to steg0.skjema.forespoerselId.toJson(),
Key.INNTEKTSMELDING to inntektsmelding.toJson(InntektsmeldingV1.serializer()),
// TODO vurder å flytte denne inn i InntektsmeldingV1 (ikke sikker om det er en god idé, så avventer til v1 er brukt overalt)
Key.INNTEKTSMELDING to inntektsmelding.toJson(Inntektsmelding.serializer()),
// TODO vurder å flytte denne inn i Inntektsmelding (ikke sikker om det er en god idé, så avventer til v1 er brukt overalt)
Key.BESTEMMENDE_FRAVAERSDAG to bestemmendeFravaersdag.toJson(),
Key.INNTEKTSMELDING_DOKUMENT to inntektsmeldingGammeltFormat.toJson(Inntektsmelding.serializer()),
// TODO slett etter overgangsperiode
Key.INNTEKTSMELDING_DOKUMENT to inntektsmeldingGammeltFormat.toJson(InntektsmeldingGammel.serializer()),
Key.INNSENDING_ID to steg0.innsendingId.toJson(Long.serializer()),
),
).toJson(),
Expand All @@ -227,7 +227,7 @@ class BerikInntektsmeldingService(
Key.EVENT_NAME to EventName.INNTEKTSMELDING_MOTTATT.toJson(),
Key.UUID to steg0.transaksjonId.toJson(),
Key.FORESPOERSEL_ID to steg0.skjema.forespoerselId.toJson(),
Key.INNTEKTSMELDING to steg4.inntektsmeldingV1.toJson(InntektsmeldingV1.serializer()),
Key.INNTEKTSMELDING to steg4.inntektsmelding.toJson(Inntektsmelding.serializer()),
Key.BESTEMMENDE_FRAVAERSDAG to steg4.bestemmendeFravaersdag.toJson(),
Key.INNSENDING_ID to steg0.innsendingId.toJson(Long.serializer()),
).mapValuesNotNull { it },
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import kotlinx.serialization.builtins.serializer
import kotlinx.serialization.json.JsonElement
import kotlinx.serialization.json.JsonObject
import no.nav.helse.rapids_rivers.testsupport.TestRapid
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
Expand Down Expand Up @@ -216,8 +215,7 @@ private object Mock {
mapOf(
Key.ER_DUPLIKAT_IM to false.toJson(Boolean.serializer()),
Key.INNTEKTSMELDING to inntektsmelding.toJson(InntektsmeldingV1.serializer()),
Key.BESTEMMENDE_FRAVAERSDAG to 20.oktober.toJson(LocalDateSerializer),
Key.INNTEKTSMELDING_DOKUMENT to inntektsmelding.convert().toJson(Inntektsmelding.serializer()),
Key.BESTEMMENDE_FRAVAERSDAG to 20.oktober.toJson(),
)

fun steg0(transaksjonId: UUID): Map<Key, JsonElement> =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@ package no.nav.helsearbeidsgiver.inntektsmelding.db.river

import kotlinx.serialization.builtins.serializer
import kotlinx.serialization.json.JsonElement
import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Inntektsmelding
import no.nav.helsearbeidsgiver.domene.inntektsmelding.Utils.convert
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Inntektsmelding
import no.nav.helsearbeidsgiver.felles.BehovType
import no.nav.helsearbeidsgiver.felles.EventName
import no.nav.helsearbeidsgiver.felles.Key
Expand All @@ -15,19 +16,21 @@ 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.LocalDateSerializer
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.LocalDate
import java.util.UUID

data class LagreImMelding(
val eventName: EventName,
val behovType: BehovType,
val transaksjonId: UUID,
val data: Map<Key, JsonElement>,
val forespoerselId: UUID,
val inntektsmelding: Inntektsmelding,
val bestemmendeFravaersdag: LocalDate,
val innsendingId: Long,
)

Expand All @@ -48,22 +51,24 @@ class LagreImRiver(
behovType = Key.BEHOV.krev(BehovType.LAGRE_IM, BehovType.serializer(), json),
transaksjonId = Key.UUID.les(UuidSerializer, json),
data = data,
forespoerselId = Key.FORESPOERSEL_ID.les(UuidSerializer, data),
inntektsmelding = Key.INNTEKTSMELDING_DOKUMENT.les(Inntektsmelding.serializer(), data),
inntektsmelding = Key.INNTEKTSMELDING.les(Inntektsmelding.serializer(), data),
bestemmendeFravaersdag = Key.BESTEMMENDE_FRAVAERSDAG.les(LocalDateSerializer, data),
innsendingId = Key.INNSENDING_ID.les(Long.serializer(), data),
)
}

override fun LagreImMelding.haandter(json: Map<Key, JsonElement>): Map<Key, JsonElement> {
val nyesteIm = imRepo.hentNyesteInntektsmelding(forespoerselId)
val inntektsmeldingGammeltFormat = inntektsmelding.convert().copy(bestemmendeFraværsdag = bestemmendeFravaersdag)

val nyesteIm = imRepo.hentNyesteInntektsmelding(inntektsmelding.type.id)

// TODO: Fjernes etter at vi har gått i prod med den nye innsending-flyten
val erDuplikat = nyesteIm?.erDuplikatAv(inntektsmelding) ?: false
val erDuplikat = nyesteIm?.erDuplikatAv(inntektsmeldingGammeltFormat) ?: false

if (erDuplikat) {
sikkerLogger.warn("Fant duplikat av inntektsmelding.")
} else {
imRepo.oppdaterMedBeriketDokument(forespoerselId, innsendingId, inntektsmelding)
imRepo.oppdaterMedBeriketDokument(inntektsmelding.type.id, innsendingId, inntektsmeldingGammeltFormat)
sikkerLogger.info("Lagret inntektsmelding.")
}

Expand All @@ -89,7 +94,7 @@ class LagreImRiver(
feilmelding = "Klarte ikke lagre inntektsmelding i database.",
event = eventName,
transaksjonId = transaksjonId,
forespoerselId = forespoerselId,
forespoerselId = inntektsmelding.type.id,
utloesendeMelding = json.toJson(),
)

Expand All @@ -105,6 +110,6 @@ class LagreImRiver(
Log.event(eventName),
Log.behov(behovType),
Log.transaksjonId(transaksjonId),
Log.forespoerselId(forespoerselId),
Log.forespoerselId(inntektsmelding.type.id),
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,21 +15,23 @@ import kotlinx.serialization.builtins.serializer
import kotlinx.serialization.json.JsonElement
import kotlinx.serialization.json.JsonNull
import no.nav.helse.rapids_rivers.testsupport.TestRapid
import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.AarsakInnsending
import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Inntektsmelding
import no.nav.helsearbeidsgiver.domene.inntektsmelding.Utils.convert
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.AarsakInnsending
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Inntektsmelding
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.til
import no.nav.helsearbeidsgiver.felles.BehovType
import no.nav.helsearbeidsgiver.felles.EventName
import no.nav.helsearbeidsgiver.felles.Key
import no.nav.helsearbeidsgiver.felles.json.toJson
import no.nav.helsearbeidsgiver.felles.json.toMap
import no.nav.helsearbeidsgiver.felles.rapidsrivers.model.Fail
import no.nav.helsearbeidsgiver.felles.test.mock.mockInntektsmelding
import no.nav.helsearbeidsgiver.felles.test.mock.mockInntektsmeldingV1
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.json.toJson
import no.nav.helsearbeidsgiver.utils.test.date.august
import no.nav.helsearbeidsgiver.utils.test.date.oktober
import java.util.UUID

class LagreImRiverTest :
Expand All @@ -51,15 +53,15 @@ class LagreImRiverTest :
mapOf(
"hvis ingen andre inntektsmeldinger er mottatt" to null,
"hvis ikke duplikat av tidligere inntektsmeldinger" to
mockInntektsmelding().copy(
fraværsperioder = listOf(9.august til 29.august),
mockInntektsmeldingV1().copy(
sykmeldingsperioder = listOf(9.august til 29.august),
),
),
) { eksisterendeInntektsmelding ->
every { mockImRepo.hentNyesteInntektsmelding(any()) } returns eksisterendeInntektsmelding
every { mockImRepo.hentNyesteInntektsmelding(any()) } returns eksisterendeInntektsmelding?.convert()
every { mockImRepo.oppdaterMedBeriketDokument(any(), any(), any()) } just Runs

val nyInntektsmelding = mockInntektsmelding()
val nyInntektsmelding = mockInntektsmeldingV1()

val innkommendeMelding = innkommendeMelding(innsendingId, nyInntektsmelding)

Expand All @@ -73,32 +75,37 @@ class LagreImRiverTest :
Key.UUID to innkommendeMelding.transaksjonId.toJson(),
Key.DATA to
mapOf(
Key.FORESPOERSEL_ID to innkommendeMelding.forespoerselId.toJson(),
Key.INNTEKTSMELDING_DOKUMENT to innkommendeMelding.inntektsmelding.toJson(Inntektsmelding.serializer()),
Key.INNTEKTSMELDING to innkommendeMelding.inntektsmelding.toJson(Inntektsmelding.serializer()),
Key.BESTEMMENDE_FRAVAERSDAG to bestemmendeFravaersdag.toJson(),
Key.ER_DUPLIKAT_IM to false.toJson(Boolean.serializer()),
Key.INNSENDING_ID to innsendingId.toJson(Long.serializer()),
).toJson(),
)

verifySequence {
mockImRepo.hentNyesteInntektsmelding(innkommendeMelding.forespoerselId)
mockImRepo.oppdaterMedBeriketDokument(innkommendeMelding.forespoerselId, innsendingId, nyInntektsmelding)
mockImRepo.hentNyesteInntektsmelding(innkommendeMelding.inntektsmelding.type.id)
mockImRepo.oppdaterMedBeriketDokument(innkommendeMelding.inntektsmelding.type.id, innsendingId, nyInntektsmelding.convert())
}
}
}

test("duplikat lagres ikke, men svarer OK") {
val nyInntektsmelding = mockInntektsmelding()
val nyInntektsmelding = mockInntektsmeldingV1()

val duplikatIm =
nyInntektsmelding.copy(
vedtaksperiodeId = UUID.randomUUID(),
innsenderNavn = "Krokete Krølltang",
årsakInnsending = AarsakInnsending.NY,
tidspunkt = nyInntektsmelding.tidspunkt.minusDays(14),
)
nyInntektsmelding.let {
it.copy(
vedtaksperiodeId = UUID.randomUUID(),
avsender =
it.avsender.copy(
navn = "Krokete Krølltang",
),
aarsakInnsending = AarsakInnsending.Ny,
mottatt = nyInntektsmelding.mottatt.minusDays(14),
)
}

every { mockImRepo.hentNyesteInntektsmelding(any()) } returns duplikatIm
every { mockImRepo.hentNyesteInntektsmelding(any()) } returns duplikatIm.convert()
every { mockImRepo.oppdaterMedBeriketDokument(any(), any(), any()) } just Runs

val innkommendeMelding = innkommendeMelding(innsendingId, nyInntektsmelding)
Expand All @@ -113,18 +120,18 @@ class LagreImRiverTest :
Key.UUID to innkommendeMelding.transaksjonId.toJson(),
Key.DATA to
mapOf(
Key.FORESPOERSEL_ID to innkommendeMelding.forespoerselId.toJson(),
Key.INNTEKTSMELDING_DOKUMENT to innkommendeMelding.inntektsmelding.toJson(Inntektsmelding.serializer()),
Key.INNTEKTSMELDING to innkommendeMelding.inntektsmelding.toJson(Inntektsmelding.serializer()),
Key.BESTEMMENDE_FRAVAERSDAG to bestemmendeFravaersdag.toJson(),
Key.ER_DUPLIKAT_IM to true.toJson(Boolean.serializer()),
Key.INNSENDING_ID to innsendingId.toJson(Long.serializer()),
).toJson(),
)

verifySequence {
mockImRepo.hentNyesteInntektsmelding(innkommendeMelding.forespoerselId)
mockImRepo.hentNyesteInntektsmelding(innkommendeMelding.inntektsmelding.type.id)
}
verify(exactly = 0) {
mockImRepo.oppdaterMedBeriketDokument(innkommendeMelding.forespoerselId, innsendingId, nyInntektsmelding)
mockImRepo.oppdaterMedBeriketDokument(any(), any(), any())
}
}

Expand All @@ -140,7 +147,7 @@ class LagreImRiverTest :
feilmelding = "Klarte ikke lagre inntektsmelding i database.",
event = innkommendeMelding.eventName,
transaksjonId = innkommendeMelding.transaksjonId,
forespoerselId = innkommendeMelding.forespoerselId,
forespoerselId = innkommendeMelding.inntektsmelding.type.id,
utloesendeMelding = innkommendeMelding.toMap().toJson(),
)

Expand Down Expand Up @@ -182,27 +189,26 @@ class LagreImRiverTest :
}
})

private val bestemmendeFravaersdag = 20.oktober

private fun innkommendeMelding(
innsendingId: Long,
inntektsmelding: Inntektsmelding = mockInntektsmelding(),
): LagreImMelding {
val forespoerselId = UUID.randomUUID()

return LagreImMelding(
inntektsmelding: Inntektsmelding = mockInntektsmeldingV1(),
): LagreImMelding =
LagreImMelding(
eventName = EventName.INNTEKTSMELDING_SKJEMA_LAGRET,
behovType = BehovType.LAGRE_IM,
transaksjonId = UUID.randomUUID(),
data =
mapOf(
Key.FORESPOERSEL_ID to forespoerselId.toJson(),
Key.INNTEKTSMELDING_DOKUMENT to inntektsmelding.toJson(Inntektsmelding.serializer()),
Key.INNTEKTSMELDING to inntektsmelding.toJson(Inntektsmelding.serializer()),
Key.BESTEMMENDE_FRAVAERSDAG to bestemmendeFravaersdag.toJson(),
Key.INNSENDING_ID to innsendingId.toJson(Long.serializer()),
),
forespoerselId = forespoerselId,
inntektsmelding = inntektsmelding,
bestemmendeFravaersdag = bestemmendeFravaersdag,
innsendingId = innsendingId,
)
}

private fun LagreImMelding.toMap(): Map<Key, JsonElement> =
mapOf(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ import no.nav.helsearbeidsgiver.inntektsmelding.db.InntektsmeldingRepository
import no.nav.helsearbeidsgiver.inntektsmelding.db.SelvbestemtImRepo
import no.nav.helsearbeidsgiver.inntektsmelding.db.river.Mock.INNSENDING_ID
import no.nav.helsearbeidsgiver.inntektsmelding.db.river.Mock.toMap
import no.nav.helsearbeidsgiver.utils.json.serializer.LocalDateSerializer
import no.nav.helsearbeidsgiver.utils.json.toJson
import no.nav.helsearbeidsgiver.utils.test.date.oktober
import java.util.UUID
Expand Down Expand Up @@ -65,7 +64,7 @@ class LagreJournalpostIdRiverTest :
Key.EVENT_NAME to EventName.INNTEKTSMELDING_JOURNALFOERT.toJson(),
Key.UUID to innkommendeMelding.transaksjonId.toJson(),
Key.INNTEKTSMELDING to innkommendeMelding.inntektsmelding.toJson(Inntektsmelding.serializer()),
Key.BESTEMMENDE_FRAVAERSDAG to Mock.bestemmendeFravaersdag.toJson(LocalDateSerializer),
Key.BESTEMMENDE_FRAVAERSDAG to Mock.bestemmendeFravaersdag.toJson(),
Key.JOURNALPOST_ID to innkommendeMelding.journalpostId.toJson(),
)

Expand Down Expand Up @@ -249,7 +248,7 @@ private object Mock {
Key.UUID to transaksjonId.toJson(),
Key.JOURNALPOST_ID to journalpostId.toJson(),
Key.INNTEKTSMELDING to inntektsmelding.toJson(Inntektsmelding.serializer()),
Key.BESTEMMENDE_FRAVAERSDAG to bestemmendeFravaersdag.toJson(LocalDateSerializer),
Key.BESTEMMENDE_FRAVAERSDAG to bestemmendeFravaersdag.toJson(),
Key.INNSENDING_ID to INNSENDING_ID.toJson(Long.serializer()),
)

Expand Down
Loading

0 comments on commit 38ab858

Please sign in to comment.