Skip to content

Commit

Permalink
Bruk ny IM-klasse under lagring av journalpost-ID (#688)
Browse files Browse the repository at this point in the history
* Bruk ny IM-klasse under lagring av journalpost-ID

* Fjern midlertidig logging av feil til åpne logger

* Oppdater integrasjonstest

* Bruk korrekt nivå på logging
  • Loading branch information
bjerga authored Sep 27, 2024
1 parent a45030f commit f562dcc
Show file tree
Hide file tree
Showing 7 changed files with 107 additions and 206 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import no.nav.helsearbeidsgiver.inntektsmelding.db.tabell.SelvbestemtInntektsmel
import no.nav.helsearbeidsgiver.utils.log.logger
import no.nav.helsearbeidsgiver.utils.log.sikkerLogger
import org.jetbrains.exposed.sql.Database
import org.jetbrains.exposed.sql.Query
import org.jetbrains.exposed.sql.SortOrder
import org.jetbrains.exposed.sql.and
import org.jetbrains.exposed.sql.insert
Expand All @@ -26,7 +25,11 @@ class SelvbestemtImRepo(
fun hentNyesteIm(selvbestemtId: UUID): Inntektsmelding? =
Metrics.dbSelvbestemtIm.recordTime(::hentNyesteIm) {
transaction(db) {
hentNyesteImQuery(selvbestemtId)
SelvbestemtInntektsmeldingEntitet
.selectAll()
.where { SelvbestemtInntektsmeldingEntitet.selvbestemtId eq selvbestemtId }
.orderBy(SelvbestemtInntektsmeldingEntitet.opprettet, SortOrder.DESC)
.limit(1)
.firstOrNull(SelvbestemtInntektsmeldingEntitet.inntektsmelding)
}
}
Expand All @@ -44,17 +47,15 @@ class SelvbestemtImRepo(
}

fun oppdaterJournalpostId(
selvbestemtId: UUID,
inntektsmeldingId: UUID,
journalpostId: String,
) {
val antallOppdatert =
Metrics.dbSelvbestemtIm.recordTime(::oppdaterJournalpostId) {
transaction(db) {
SelvbestemtInntektsmeldingEntitet.update(
where = {
val nyesteImIdQuery = hentNyesteImQuery(selvbestemtId).adjustSelect { select(SelvbestemtInntektsmeldingEntitet.id) }

(SelvbestemtInntektsmeldingEntitet.id eqSubQuery nyesteImIdQuery) and
(SelvbestemtInntektsmeldingEntitet.inntektsmeldingId eq inntektsmeldingId) and
SelvbestemtInntektsmeldingEntitet.journalpostId.isNull()
},
) {
Expand All @@ -76,10 +77,3 @@ class SelvbestemtImRepo(
}
}
}

private fun hentNyesteImQuery(selvbestemtId: UUID): Query =
SelvbestemtInntektsmeldingEntitet
.selectAll()
.where { SelvbestemtInntektsmeldingEntitet.selvbestemtId eq selvbestemtId }
.orderBy(SelvbestemtInntektsmeldingEntitet.opprettet, SortOrder.DESC)
.limit(1)
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package no.nav.helsearbeidsgiver.inntektsmelding.db.river

import kotlinx.serialization.builtins.serializer
import kotlinx.serialization.json.JsonElement
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 @@ -16,21 +17,19 @@ import no.nav.helsearbeidsgiver.felles.utils.Log
import no.nav.helsearbeidsgiver.inntektsmelding.db.InntektsmeldingRepository
import no.nav.helsearbeidsgiver.inntektsmelding.db.SelvbestemtImRepo
import no.nav.helsearbeidsgiver.utils.collection.mapValuesNotNull
import no.nav.helsearbeidsgiver.utils.json.fromJson
import no.nav.helsearbeidsgiver.utils.json.serializer.UuidSerializer
import no.nav.helsearbeidsgiver.utils.json.toJson
import no.nav.helsearbeidsgiver.utils.log.logger
import no.nav.helsearbeidsgiver.utils.log.sikkerLogger
import java.util.UUID
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Inntektsmelding as InntektsmeldingV1

data class LagreJournalpostIdMelding(
val eventName: EventName,
val behovType: BehovType,
val transaksjonId: UUID,
// TODO erstatt med v1.Inntektsmelding når mulig
val inntektsmeldingType: InntektsmeldingV1.Type,
val inntektsmelding: Inntektsmelding,
val journalpostId: String,
val innsendingId: Long?,
)

class LagreJournalpostIdRiver(
Expand All @@ -44,75 +43,52 @@ class LagreJournalpostIdRiver(
if (setOf(Key.DATA, Key.FAIL).any(json::containsKey)) {
null
} else {
val forespoerselId = Key.FORESPOERSEL_ID.lesOrNull(UuidSerializer, json)
val selvbestemtId = Key.SELVBESTEMT_ID.lesOrNull(UuidSerializer, json)
val inntektsmeldingType =
if (forespoerselId != null) {
InntektsmeldingV1.Type.Forespurt(
id = forespoerselId,
)
} else if (selvbestemtId != null) {
InntektsmeldingV1.Type.Selvbestemt(
id = selvbestemtId,
)
} else {
null
}

if (inntektsmeldingType != null) {
LagreJournalpostIdMelding(
eventName = Key.EVENT_NAME.les(EventName.serializer(), json),
behovType = Key.BEHOV.krev(BehovType.LAGRE_JOURNALPOST_ID, BehovType.serializer(), json),
transaksjonId = Key.UUID.les(UuidSerializer, json),
inntektsmeldingType = inntektsmeldingType,
journalpostId = Key.JOURNALPOST_ID.les(String.serializer(), json),
)
} else {
if (Key.BEHOV.lesOrNull(BehovType.serializer(), json) == BehovType.LAGRE_JOURNALPOST_ID) {
"Klarte ikke lagre journalpost-ID. Melding mangler inntektsmeldingstype-ID.".also {
logger.error(it)
sikkerLogger.error("$it\n${json.toPretty()}")
}
}

null
}
LagreJournalpostIdMelding(
eventName = Key.EVENT_NAME.les(EventName.serializer(), json),
behovType = Key.BEHOV.krev(BehovType.LAGRE_JOURNALPOST_ID, BehovType.serializer(), json),
transaksjonId = Key.UUID.les(UuidSerializer, json),
inntektsmelding = Key.INNTEKTSMELDING.les(Inntektsmelding.serializer(), json),
journalpostId = Key.JOURNALPOST_ID.les(String.serializer(), json),
innsendingId = Key.INNSENDING_ID.lesOrNull(Long.serializer(), json),
)
}

override fun LagreJournalpostIdMelding.haandter(json: Map<Key, JsonElement>): Map<Key, JsonElement>? {
logger.info("Mottok melding.")
sikkerLogger.info("Mottok melding:\n${json.toPretty()}")

when (inntektsmeldingType) {
is InntektsmeldingV1.Type.Forespurt -> {
val innsendingId = Key.INNSENDING_ID.les(Long.serializer(), json)

imRepo.oppdaterJournalpostId(innsendingId, journalpostId)
when (inntektsmelding.type) {
is Inntektsmelding.Type.Forespurt -> {
if (innsendingId != null) {
imRepo.oppdaterJournalpostId(innsendingId, journalpostId)

if (imRepo.hentNyesteBerikedeInnsendingId(inntektsmeldingType.id) != innsendingId) {
return null.also {
if (imRepo.hentNyesteBerikedeInnsendingId(inntektsmelding.type.id) != innsendingId) {
"Inntektsmelding journalført, men ikke distribuert pga. nyere innsending.".also {
logger.info(it)
sikkerLogger.info(it)
}
return null
}
} else {
"Klarte ikke journalføre pga. manglende innsending-ID for forespørsel '${inntektsmelding.type.id}' og journalpost-ID '$journalpostId'."
.also {
logger.error(it)
sikkerLogger.error(it)
}
}
}

is InntektsmeldingV1.Type.Selvbestemt -> {
selvbestemtImRepo.oppdaterJournalpostId(inntektsmeldingType.id, journalpostId)
is Inntektsmelding.Type.Selvbestemt -> {
selvbestemtImRepo.oppdaterJournalpostId(inntektsmelding.id, journalpostId)
}
}

return mapOf(
Key.EVENT_NAME to EventName.INNTEKTSMELDING_JOURNALFOERT.toJson(),
Key.UUID to transaksjonId.toJson(),
Key.JOURNALPOST_ID to journalpostId.toJson(),
Key.INNTEKTSMELDING to json[Key.INNTEKTSMELDING],
Key.INNTEKTSMELDING to inntektsmelding.toJson(Inntektsmelding.serializer()),
Key.BESTEMMENDE_FRAVAERSDAG to json[Key.BESTEMMENDE_FRAVAERSDAG],
Key.INNTEKTSMELDING_DOKUMENT to json[Key.INNTEKTSMELDING_DOKUMENT],
Key.FORESPOERSEL_ID to json[Key.FORESPOERSEL_ID],
Key.SELVBESTEMT_ID to json[Key.SELVBESTEMT_ID],
Key.JOURNALPOST_ID to journalpostId.toJson(),
).mapValuesNotNull { it }
.also {
logger.info("Publiserer event '${EventName.INNTEKTSMELDING_JOURNALFOERT}' med journalpost-ID '$journalpostId'.")
Expand All @@ -129,17 +105,14 @@ class LagreJournalpostIdRiver(
feilmelding = "Klarte ikke lagre journalpost-ID '$journalpostId'.",
event = eventName,
transaksjonId = transaksjonId,
forespoerselId = json[Key.FORESPOERSEL_ID]?.fromJson(UuidSerializer),
forespoerselId = null,
utloesendeMelding = json.toJson(),
)

logger.error(fail.feilmelding)
sikkerLogger.error(fail.feilmelding, error)

return fail
.tilMelding()
.plus(Key.SELVBESTEMT_ID to json[Key.SELVBESTEMT_ID])
.mapValuesNotNull { it }
return fail.tilMelding()
}

override fun LagreJournalpostIdMelding.loggfelt(): Map<String, String> =
Expand All @@ -148,5 +121,9 @@ class LagreJournalpostIdRiver(
Log.event(eventName),
Log.behov(behovType),
Log.transaksjonId(transaksjonId),
when (inntektsmelding.type) {
is Inntektsmelding.Type.Forespurt -> Log.forespoerselId(inntektsmelding.type.id)
is Inntektsmelding.Type.Selvbestemt -> Log.selvbestemtId(inntektsmelding.type.id)
},
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ class SelvbestemtImRepoTest :

context(SelvbestemtImRepo::oppdaterJournalpostId.name) {

test("journalpost-ID oppdateres for angitt selvbestemt ID") {
test("journalpost-ID oppdateres for angitt inntektsmelding-ID (_ulik_ selvbestemt ID)") {
val selvbestemtId = UUID.randomUUID()
val journalpostId = randomDigitString(12)
val inntektsmelding =
Expand All @@ -160,7 +160,7 @@ class SelvbestemtImRepoTest :

selvbestemtImRepo.lagreIm(inntektsmelding)
selvbestemtImRepo.lagreIm(mockInntektsmeldingV1())
selvbestemtImRepo.oppdaterJournalpostId(selvbestemtId, journalpostId)
selvbestemtImRepo.oppdaterJournalpostId(inntektsmelding.id, journalpostId)

val alleRader = lesAlleRader(db)

Expand All @@ -173,14 +173,16 @@ class SelvbestemtImRepoTest :
}

alleRader.last().let {
it[SelvbestemtInntektsmeldingEntitet.inntektsmeldingId] shouldNotBe inntektsmelding.id
it[SelvbestemtInntektsmeldingEntitet.selvbestemtId] shouldNotBe selvbestemtId
it[SelvbestemtInntektsmeldingEntitet.journalpostId] shouldNotBe journalpostId
it[SelvbestemtInntektsmeldingEntitet.journalpostId].shouldBeNull()
}
}

test("kun nyeste inntektsmelding oppdateres med journalpost-ID") {
test("journalpost-ID oppdateres for angitt inntektsmelding-ID (_lik_ selvbestemt ID)") {
val selvbestemtId = UUID.randomUUID()
val journalpostId = randomDigitString(5)
val journalpostId1 = randomDigitString(5)
val journalpostId2 = randomDigitString(6)
val originalInntektsmelding =
mockInntektsmeldingV1().copy(
type =
Expand All @@ -195,7 +197,8 @@ class SelvbestemtImRepoTest :

selvbestemtImRepo.lagreIm(originalInntektsmelding)
selvbestemtImRepo.lagreIm(endretInntektsmelding)
selvbestemtImRepo.oppdaterJournalpostId(selvbestemtId, journalpostId)
selvbestemtImRepo.oppdaterJournalpostId(originalInntektsmelding.id, journalpostId1)
selvbestemtImRepo.oppdaterJournalpostId(endretInntektsmelding.id, journalpostId2)

val alleRader = lesAlleRader(db)

Expand All @@ -204,13 +207,13 @@ class SelvbestemtImRepoTest :
alleRader.first().let {
it[SelvbestemtInntektsmeldingEntitet.inntektsmeldingId] shouldBe originalInntektsmelding.id
it[SelvbestemtInntektsmeldingEntitet.selvbestemtId] shouldBe selvbestemtId
it[SelvbestemtInntektsmeldingEntitet.journalpostId].shouldBeNull()
it[SelvbestemtInntektsmeldingEntitet.journalpostId] shouldBe journalpostId1
}

alleRader.last().let {
it[SelvbestemtInntektsmeldingEntitet.inntektsmeldingId] shouldBe endretInntektsmelding.id
it[SelvbestemtInntektsmeldingEntitet.selvbestemtId] shouldBe selvbestemtId
it[SelvbestemtInntektsmeldingEntitet.journalpostId] shouldBe journalpostId
it[SelvbestemtInntektsmeldingEntitet.journalpostId] shouldBe journalpostId2
}
}

Expand All @@ -232,7 +235,7 @@ class SelvbestemtImRepoTest :

selvbestemtImRepo.lagreIm(originalInntektsmelding)
selvbestemtImRepo.lagreIm(endretInntektsmelding)
selvbestemtImRepo.oppdaterJournalpostId(selvbestemtId, gammelJournalpostId)
selvbestemtImRepo.oppdaterJournalpostId(endretInntektsmelding.id, gammelJournalpostId)

val alleRaderEtterSetup = lesAlleRader(db)

Expand All @@ -251,7 +254,7 @@ class SelvbestemtImRepoTest :
}

// Denne skal ha ingen effekt
selvbestemtImRepo.oppdaterJournalpostId(selvbestemtId, nyJournalpostId)
selvbestemtImRepo.oppdaterJournalpostId(endretInntektsmelding.id, nyJournalpostId)

val alleRaderEtterOppdatering = lesAlleRader(db)

Expand All @@ -278,10 +281,10 @@ class SelvbestemtImRepoTest :
selvbestemtImRepo.lagreIm(inntektsmelding1)
selvbestemtImRepo.lagreIm(inntektsmelding2)

selvbestemtImRepo.oppdaterJournalpostId(inntektsmelding1.type.id, journalpostId)
selvbestemtImRepo.oppdaterJournalpostId(inntektsmelding1.id, journalpostId)

shouldThrowExactly<ExposedSQLException> {
selvbestemtImRepo.oppdaterJournalpostId(inntektsmelding2.type.id, journalpostId)
selvbestemtImRepo.oppdaterJournalpostId(inntektsmelding2.id, journalpostId)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,13 @@ package no.nav.helsearbeidsgiver.inntektsmelding.db
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.Refusjon
import java.time.LocalDate
import java.time.ZonedDateTime
import java.util.UUID

val INNTEKTSMELDING_DOKUMENT =
val INNTEKTSMELDING_DOKUMENT_GAMMELT_INNTEKTFORMAT =
Inntektsmelding(
orgnrUnderenhet = "",
identitetsnummer = "",
Expand All @@ -22,13 +21,7 @@ val INNTEKTSMELDING_DOKUMENT =
fraværsperioder = emptyList(),
arbeidsgiverperioder = emptyList(),
beregnetInntekt = 502.0,
inntekt =
Inntekt(
bekreftet = true,
beregnetInntekt = 502.0,
endringÅrsak = null,
manueltKorrigert = false,
),
inntekt = null,
refusjon =
Refusjon(
true,
Expand All @@ -47,8 +40,3 @@ val INNTEKTSMELDING_DOKUMENT =
innsenderNavn = "Fido",
vedtaksperiodeId = UUID.randomUUID(),
)

val INNTEKTSMELDING_DOKUMENT_GAMMELT_INNTEKTFORMAT = INNTEKTSMELDING_DOKUMENT.copy(inntekt = null)

val INNTEKTSMELDING_DOKUMENT_MED_TOM_FORESPURT_DATA = INNTEKTSMELDING_DOKUMENT.copy(forespurtData = emptyList())
val INNTEKTSMELDING_DOKUMENT_MED_FORESPURT_DATA = INNTEKTSMELDING_DOKUMENT.copy(forespurtData = listOf("inntekt", "refusjon"))
Loading

0 comments on commit f562dcc

Please sign in to comment.