Skip to content

Commit

Permalink
Duplikatsjekk: Hensynta at forrige IM kan være ekstern (#800)
Browse files Browse the repository at this point in the history
* Duplikatsjekk: Hensynta at forrige IM kan være ekstern

* Legg til kommentar om hvorfor IM ikke lenger duplikatsjekkes
  • Loading branch information
bjerga authored Dec 16, 2024
1 parent 7cf0861 commit 21aae81
Show file tree
Hide file tree
Showing 6 changed files with 14 additions and 107 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,6 @@ class InntektsmeldingRepository(
private val logger = logger()
private val sikkerLogger = sikkerLogger()

fun hentNyesteInntektsmelding(forespoerselId: UUID): Inntektsmelding? =
Metrics.dbInntektsmelding.recordTime(InntektsmeldingRepository::hentNyesteInntektsmelding) {
transaction(db) {
hentNyesteImQuery(forespoerselId)
.firstOrNull()
?.getOrNull(InntektsmeldingEntitet.dokument)
}
}

fun hentNyesteEksternEllerInternInntektsmelding(forespoerselId: UUID): Pair<Inntektsmelding?, EksternInntektsmelding?> =
Metrics.dbInntektsmelding.recordTime(InntektsmeldingRepository::hentNyesteEksternEllerInternInntektsmelding) {
transaction(db) {
Expand Down Expand Up @@ -162,7 +153,7 @@ class InntektsmeldingRepository(
private fun hentNyesteImSkjemaQuery(forespoerselId: UUID): Query =
InntektsmeldingEntitet
.selectAll()
.where { (InntektsmeldingEntitet.forespoerselId eq forespoerselId.toString()) and InntektsmeldingEntitet.skjema.isNotNull() }
.where { InntektsmeldingEntitet.forespoerselId eq forespoerselId.toString() }
.orderBy(InntektsmeldingEntitet.innsendt, SortOrder.DESC)
.limit(1)
}
Original file line number Diff line number Diff line change
@@ -1,19 +1,8 @@
package no.nav.helsearbeidsgiver.inntektsmelding.db

import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Inntektsmelding
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.skjema.SkjemaInntektsmelding
import no.nav.helsearbeidsgiver.felles.domene.Forespoersel

fun Inntektsmelding.erDuplikatAv(other: Inntektsmelding): Boolean =
this ==
other.copy(
vedtaksperiodeId = vedtaksperiodeId,
tidspunkt = tidspunkt,
årsakInnsending = årsakInnsending,
innsenderNavn = innsenderNavn,
telefonnummer = telefonnummer,
)

// Så lenge frontend sender felter som ikke kreves av Spleis så må vi filtrere ut disse for å sammenligne skjema
fun SkjemaInntektsmelding.erDuplikatAv(
other: SkjemaInntektsmelding,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ import no.nav.helsearbeidsgiver.felles.rapidsrivers.model.Fail
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
Expand Down Expand Up @@ -60,17 +59,8 @@ class LagreImRiver(
override fun LagreImMelding.haandter(json: Map<Key, JsonElement>): Map<Key, JsonElement> {
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(inntektsmeldingGammeltFormat) ?: false

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

return mapOf(
Key.EVENT_NAME to eventName.toJson(),
Expand All @@ -79,7 +69,9 @@ class LagreImRiver(
data
.plus(
mapOf(
Key.ER_DUPLIKAT_IM to erDuplikat.toJson(Boolean.serializer()),
// Duplikatsjekk er flyttet til 'LagreImSkjemaRiver'. Beholder dette svaret for å unngå å endre for mye på meldingsfylten.
// På sikt så bør vi vurdere om vi trenger å lagre inntektsmelding i databasen i det hele tatt.
Key.ER_DUPLIKAT_IM to false.toJson(Boolean.serializer()),
),
).toJson(),
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,9 @@ class InntektsmeldingRepositoryTest :
inntektsmeldinger.first().getOrNull(InntektsmeldingEntitet.dokument) shouldBe beriketDokument
}

inntektsmeldingRepo.hentNyesteInntektsmelding(skjema.forespoerselId) shouldBe beriketDokument
val record = testRepo.hentRecordFraInntektsmelding(skjema.forespoerselId).shouldNotBeNull()

record.getOrNull(InntektsmeldingEntitet.dokument) shouldBe beriketDokument

inntektsmeldingRepo.hentNyesteBerikedeInnsendingId(skjema.forespoerselId) shouldBe innsendingId
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,7 @@ import io.mockk.verifySequence
import kotlinx.serialization.builtins.serializer
import kotlinx.serialization.json.JsonElement
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
Expand All @@ -30,7 +28,6 @@ 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

Expand All @@ -48,66 +45,11 @@ class LagreImRiverTest :
clearAllMocks()
}

context("inntektsmelding lagres") {
withData(
mapOf(
"hvis ingen andre inntektsmeldinger er mottatt" to null,
"hvis ikke duplikat av tidligere inntektsmeldinger" to
mockInntektsmeldingV1().copy(
sykmeldingsperioder = listOf(9.august til 29.august),
),
),
) { eksisterendeInntektsmelding ->
every { mockImRepo.hentNyesteInntektsmelding(any()) } returns eksisterendeInntektsmelding?.convert()
every { mockImRepo.oppdaterMedBeriketDokument(any(), any(), any()) } just Runs

val nyInntektsmelding = mockInntektsmeldingV1()

val innkommendeMelding = innkommendeMelding(innsendingId, nyInntektsmelding)

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.transaksjonId.toJson(),
Key.DATA to
mapOf(
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.inntektsmelding.type.id)
mockImRepo.oppdaterMedBeriketDokument(innkommendeMelding.inntektsmelding.type.id, innsendingId, nyInntektsmelding.convert())
}
}
}
test("inntektsmelding lagres") {
every { mockImRepo.oppdaterMedBeriketDokument(any(), any(), any()) } just Runs

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

val duplikatIm =
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.convert()
every { mockImRepo.oppdaterMedBeriketDokument(any(), any(), any()) } just Runs

val innkommendeMelding = innkommendeMelding(innsendingId, nyInntektsmelding)

testRapid.sendJson(innkommendeMelding.toMap())
Expand All @@ -122,22 +64,19 @@ class LagreImRiverTest :
mapOf(
Key.INNTEKTSMELDING to innkommendeMelding.inntektsmelding.toJson(Inntektsmelding.serializer()),
Key.BESTEMMENDE_FRAVAERSDAG to bestemmendeFravaersdag.toJson(),
Key.ER_DUPLIKAT_IM to true.toJson(Boolean.serializer()),
Key.ER_DUPLIKAT_IM to false.toJson(Boolean.serializer()),
Key.INNSENDING_ID to innsendingId.toJson(Long.serializer()),
).toJson(),
)

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

test("håndterer at repo feiler") {
every {
mockImRepo.hentNyesteInntektsmelding(any())
mockImRepo.oppdaterMedBeriketDokument(any(), any(), any())
} throws RuntimeException("thank you, next")

val innkommendeMelding = innkommendeMelding(innsendingId)
Expand All @@ -156,9 +95,6 @@ class LagreImRiverTest :
testRapid.firstMessage().toMap() shouldContainExactly forventetFail.tilMelding()

verifySequence {
mockImRepo.hentNyesteInntektsmelding(any())
}
verify(exactly = 0) {
mockImRepo.oppdaterMedBeriketDokument(any(), any(), any())
}
}
Expand All @@ -180,7 +116,6 @@ class LagreImRiverTest :
testRapid.inspektør.size shouldBeExactly 0

verify(exactly = 0) {
mockImRepo.hentNyesteInntektsmelding(any())
mockImRepo.oppdaterMedBeriketDokument(any(), any(), any())
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -133,8 +133,6 @@ class LagreImSkjemaRiverTest :
}

test("håndterer at repo feiler") {
every { mockInntektsmeldingRepo.hentNyesteInntektsmelding(any()) } returns null

every {
mockInntektsmeldingRepo.hentNyesteInntektsmeldingSkjema(any())
} throws RuntimeException("Tråbbel med den Rolls-Royce? Den jo vere garantert!")
Expand Down

0 comments on commit 21aae81

Please sign in to comment.