Skip to content

Commit

Permalink
Integrate handling of errors from start
Browse files Browse the repository at this point in the history
  • Loading branch information
jacob-meidell committed Nov 19, 2024
1 parent a51fc53 commit 41e2261
Show file tree
Hide file tree
Showing 10 changed files with 178 additions and 63 deletions.
2 changes: 1 addition & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

val domeneVersion = "2.0.3"
val domeneVersion = "2.0.8"
val azureAdClient = "0.0.7"
val jacksonVersion = "2.17.1"
val logbackEncoderVersion = "8.0"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,9 @@ class PersongrunnlagKafkaListener(
Mdc.scopedMdc(persongrunnlagMelding.correlationId) { _ ->
Mdc.scopedMdc(persongrunnlagMelding.innlesingId) { _ ->
persongrunnlagRepo.lagre(
PersongrunnlagMelding.Lest(innhold = persongrunnlagMelding)
PersongrunnlagMelding.Lest(
innhold = persongrunnlagMelding,
)
)
log.info("Melding prosessert")
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.persongrunnlag.model

import no.nav.pensjon.opptjening.omsorgsopptjening.felles.domene.kafka.messages.domene.Feilinformasjon
import no.nav.pensjon.opptjening.omsorgsopptjening.felles.domene.kafka.messages.domene.IdentRolle

fun List<Feilinformasjon>.oppgavetekster(omsorgsyter: String): Set<String> {
return map {
when (it) {
is Feilinformasjon.OverlappendeBarnetrygdperioder -> {
"Kunne ikke behandle godskriving av omsorgsopptjening automatisk for $omsorgsyter på grunn av motstridende opplysninger for barnetrygdperiodene tilhørende et av barna. Vurder omsorgsopptjening manuelt."
}

is Feilinformasjon.OverlappendeHjelpestønadperioder -> {
"Kunne ikke behandle godskriving av omsorgsopptjening automatisk for $omsorgsyter på grunn av motstridende opplysninger for hjelpestønadsperiodene tilhørende et av barna. Vurder omsorgsopptjening manuelt."
}

is Feilinformasjon.UgyldigIdent -> {
"""Kunne ikke behandle godskriving av omsorgsopptjening automatisk for $omsorgsyter på grunn av at det ikke eksisterer et gjeldende fnr for ${
rolle(
it
)
} med ident: ${it.ident}""".trimIndent()
}

is Feilinformasjon.FeilIDataGrunnlag -> {
"Kunne ikke behandle godskriving av omsorgsopptjening automatisk for $omsorgsyter på grunn av feil i datagrunnlaget. Vurder omsorgsopptjening manuelt."
}
}
}.toSet()
}

private fun rolle(it: Feilinformasjon.UgyldigIdent) =
when (it.identRolle) {
IdentRolle.BARNETRYGDMOTTAKER -> "barnetrygdmottaker"
IdentRolle.OMSORGSYTER_BARNETRYGD -> "barnetrygdmottaker"
IdentRolle.OMSORGSYTER_HJELPESTONAD -> "barnetrygdmottaker"
IdentRolle.OMSORGSMOTTAKER_BARNETRYGD -> "barn"
IdentRolle.OMSORGSMOTTAKER_HJELPESTONAD -> "barn"
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,11 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo
import com.fasterxml.jackson.annotation.JsonTypeName
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.oppgave.model.Oppgave
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.oppgave.model.OppgaveDetaljer
import no.nav.pensjon.opptjening.omsorgsopptjening.felles.domene.kafka.messages.domene.Feilinformasjon
import java.time.Instant
import java.time.Instant.now
import java.time.temporal.ChronoUnit
import java.util.*
import java.util.UUID
import no.nav.pensjon.opptjening.omsorgsopptjening.felles.domene.kafka.messages.domene.PersongrunnlagMelding as PersongrunnlagMeldingKafka

sealed class PersongrunnlagMelding {
Expand All @@ -19,6 +20,11 @@ sealed class PersongrunnlagMelding {
val correlationId get() = innhold.correlationId
val innlesingId get() = innhold.innlesingId
val status: Status get() = statushistorikk.last()
val feilinformasjon: List<Feilinformasjon> get() = innhold.feilinfo

fun harFeilinformasjon(): Boolean {
return feilinformasjon.isNotEmpty()
}

data class Lest(
override val innhold: PersongrunnlagMeldingKafka,
Expand Down Expand Up @@ -65,6 +71,16 @@ sealed class PersongrunnlagMelding {
behandlingId = null,
meldingId = id,
)
} else if (harFeilinformasjon()) {
require(innhold.persongrunnlag.isEmpty()) { "Forventer at det ikke er persongrunnlag dersom feilinformasjon inneholder data" }
Oppgave.Transient(
detaljer = OppgaveDetaljer.MottakerOgTekst(
oppgavemottaker = "fnr",
oppgavetekst = feilinformasjon.oppgavetekster(innhold.omsorgsyter)
),
behandlingId = null,
meldingId = id
)
} else {
null
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.oms
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.omsorgsopptjening.model.FullførteBehandlinger
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.omsorgsopptjening.model.VilkårsvurderingFactory
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.omsorgsopptjening.repository.BehandlingRepo
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.oppgave.model.Oppgave
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.oppgave.model.OppgaveService
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.persongrunnlag.repository.PersongrunnlagRepo
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.utils.NewTransactionTemplate
Expand All @@ -32,18 +33,29 @@ internal class PersongrunnlagMeldingServiceImpl(
}

override fun behandle(melding: PersongrunnlagMelding.Mottatt): FullførteBehandlinger {
return behandleIntern(melding).let { fullførte ->
persongrunnlagRepo.updateStatus(melding.ferdig())
fullførte.also {
it.håndterUtfall(
innvilget = ::håndterInnvilgelse,
manuell = oppgaveService::opprettOppgaveHvisNødvendig,
avslag = {} //noop
)
return if (melding.harFeilinformasjon()) {
behandleFeilinformasjon(melding)
FullførteBehandlinger(emptyList())
} else {
behandleIntern(melding).let { fullførte ->
persongrunnlagRepo.updateStatus(melding.ferdig())
fullførte.also {
it.håndterUtfall(
innvilget = ::håndterInnvilgelse,
manuell = oppgaveService::opprettOppgaveHvisNødvendig,
avslag = {} //noop
)
}
}
}
}

private fun behandleFeilinformasjon(melding: PersongrunnlagMelding.Mottatt): Oppgave.Persistent {
return oppgaveService.opprett(melding.opprettOppgave()!!).also {
persongrunnlagRepo.updateStatus(melding.ferdig())
}
}

override fun retry(melding: PersongrunnlagMelding.Mottatt, ex: Throwable) {
melding.retry(ex.stackTraceToString()).let { retry ->
retry.opprettOppgave()?.let { oppgave ->
Expand Down Expand Up @@ -146,7 +158,7 @@ internal class PersongrunnlagMeldingServiceImpl(
PersongrunnlagMelding.Lest(
innhold = it.innhold,
opprettet = Instant.now(),
kopiertFra = it
kopiertFra = it,
)
}.let {
return persongrunnlagRepo.lagre(it)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,6 @@ import org.mockito.BDDMockito.willAnswer
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.mock.mockito.MockBean
import org.springframework.http.HttpHeaders
import java.time.Month
import java.time.YearMonth
import java.time.temporal.ChronoUnit
import kotlin.test.assertContains
import no.nav.pensjon.opptjening.omsorgsopptjening.felles.domene.kafka.messages.domene.PersongrunnlagMelding as PersongrunnlagMeldingKafka
Expand Down Expand Up @@ -175,7 +173,7 @@ class OppgaveServiceProsesseringTest : SpringContextTest.NoKafka() {
),
)

handler.process()!!
handler.process()

oppgaveRepo.findForMelding(melding!!).single().also {
assertInstanceOf(Oppgave.Status.Klar::class.java, it.status)
Expand Down Expand Up @@ -411,7 +409,7 @@ class OppgaveServiceProsesseringTest : SpringContextTest.NoKafka() {
),
)

handler.process()!!
handler.process()

oppgaveRepo.findForMelding(melding!!).single().also {
assertInstanceOf(Oppgave.Status.Klar::class.java, it.status)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.uti
import no.nav.pensjon.opptjening.omsorgsopptjening.felles.CorrelationId
import no.nav.pensjon.opptjening.omsorgsopptjening.felles.InnlesingId
import no.nav.pensjon.opptjening.omsorgsopptjening.felles.domene.kafka.Rådata
import no.nav.pensjon.opptjening.omsorgsopptjening.felles.domene.kafka.messages.domene.Feilinformasjon
import no.nav.pensjon.opptjening.omsorgsopptjening.felles.domene.kafka.messages.domene.IdentRolle
import no.nav.pensjon.opptjening.omsorgsopptjening.felles.domene.kafka.messages.domene.Kilde
import no.nav.pensjon.opptjening.omsorgsopptjening.felles.domene.kafka.messages.domene.Landstilknytning
import no.nav.pensjon.opptjening.omsorgsopptjening.felles.domene.kafka.messages.domene.Omsorgstype
Expand All @@ -40,7 +42,7 @@ import no.nav.pensjon.opptjening.omsorgsopptjening.felles.domene.kafka.messages.
class OppgaveopprettelseTest : SpringContextTest.NoKafka() {

@Autowired
private lateinit var repo: PersongrunnlagRepo
private lateinit var persongrunnlagRepo: PersongrunnlagRepo

@Autowired
private lateinit var persongrunnlagMeldingProcessingService: PersongrunnlagMeldingProcessingService
Expand All @@ -65,7 +67,7 @@ class OppgaveopprettelseTest : SpringContextTest.NoKafka() {
wiremock.ingenLøpendeAlderspensjon()
wiremock.ingenLøpendeUføretrgyd()

repo.lagre(
persongrunnlagRepo.lagre(
PersongrunnlagMelding.Lest(
innhold = PersongrunnlagMeldingKafka(
omsorgsyter = "12345678910",
Expand Down Expand Up @@ -114,7 +116,7 @@ class OppgaveopprettelseTest : SpringContextTest.NoKafka() {
assertThat(oppgaveRepo.findForBehandling(behandling.id)).isEmpty()
}

repo.lagre(
persongrunnlagRepo.lagre(
PersongrunnlagMelding.Lest(
innhold = PersongrunnlagMeldingKafka(
omsorgsyter = "04010012797",
Expand Down Expand Up @@ -181,7 +183,7 @@ class OppgaveopprettelseTest : SpringContextTest.NoKafka() {
wiremock.ingenLøpendeAlderspensjon()
wiremock.ingenLøpendeUføretrgyd()

repo.lagre(
persongrunnlagRepo.lagre(
PersongrunnlagMelding.Lest(
innhold = PersongrunnlagMeldingKafka(
omsorgsyter = "12345678910",
Expand Down Expand Up @@ -248,7 +250,7 @@ class OppgaveopprettelseTest : SpringContextTest.NoKafka() {
}
}

repo.lagre(
persongrunnlagRepo.lagre(
PersongrunnlagMelding.Lest(
innhold = PersongrunnlagMeldingKafka(
omsorgsyter = "04010012797",
Expand Down Expand Up @@ -343,7 +345,7 @@ class OppgaveopprettelseTest : SpringContextTest.NoKafka() {
wiremock.ingenLøpendeAlderspensjon()
wiremock.ingenLøpendeUføretrgyd()

repo.lagre(
persongrunnlagRepo.lagre(
PersongrunnlagMelding.Lest(
innhold = PersongrunnlagMeldingKafka(
omsorgsyter = "12345678910",
Expand Down Expand Up @@ -404,7 +406,7 @@ class OppgaveopprettelseTest : SpringContextTest.NoKafka() {
}
}

repo.lagre(
persongrunnlagRepo.lagre(
PersongrunnlagMelding.Lest(
innhold = PersongrunnlagMeldingKafka(
omsorgsyter = "04010012797",
Expand Down Expand Up @@ -461,7 +463,7 @@ class OppgaveopprettelseTest : SpringContextTest.NoKafka() {
wiremock.ingenLøpendeAlderspensjon()
wiremock.ingenLøpendeUføretrgyd()

repo.lagre(
persongrunnlagRepo.lagre(
PersongrunnlagMelding.Lest(
innhold = PersongrunnlagMeldingKafka(
omsorgsyter = "12345678910",
Expand Down Expand Up @@ -557,7 +559,7 @@ class OppgaveopprettelseTest : SpringContextTest.NoKafka() {
wiremock.ingenLøpendeAlderspensjon()
wiremock.ingenLøpendeUføretrgyd()

repo.lagre(
persongrunnlagRepo.lagre(
PersongrunnlagMelding.Lest(
innhold = PersongrunnlagMeldingKafka(
omsorgsyter = "12345678910",
Expand Down Expand Up @@ -609,7 +611,7 @@ class OppgaveopprettelseTest : SpringContextTest.NoKafka() {
wiremock.ingenLøpendeAlderspensjon()
wiremock.ingenLøpendeUføretrgyd()

repo.lagre(
persongrunnlagRepo.lagre(
PersongrunnlagMelding.Lest(
innhold = PersongrunnlagMeldingKafka(
omsorgsyter = "12345678910",
Expand Down Expand Up @@ -695,7 +697,7 @@ class OppgaveopprettelseTest : SpringContextTest.NoKafka() {
wiremock.ingenLøpendeAlderspensjon()
wiremock.ingenLøpendeUføretrgyd()

repo.lagre(
persongrunnlagRepo.lagre(
PersongrunnlagMelding.Lest(
innhold = PersongrunnlagMeldingKafka(
omsorgsyter = "12345678910",
Expand Down Expand Up @@ -727,7 +729,7 @@ class OppgaveopprettelseTest : SpringContextTest.NoKafka() {
result.alle().single().also { behandling -> assertThat(behandling.erInnvilget()).isTrue() }
}

repo.lagre(
persongrunnlagRepo.lagre(
PersongrunnlagMelding.Lest(
innhold = PersongrunnlagMeldingKafka(
omsorgsyter = "04010012797",
Expand Down Expand Up @@ -769,4 +771,49 @@ class OppgaveopprettelseTest : SpringContextTest.NoKafka() {
}
}
}

@Test
fun `oppretter oppgaver for meldinger som inneholder feil oversendt fra start`() {
val melding = persongrunnlagRepo.lagre(
PersongrunnlagMelding.Lest(
innhold = PersongrunnlagMeldingKafka(
omsorgsyter = "12345678910",
persongrunnlag = emptyList(),
feilinfo = listOf(
Feilinformasjon.OverlappendeBarnetrygdperioder("obt"),
Feilinformasjon.OverlappendeHjelpestønadperioder("ohs"),
Feilinformasjon.FeilIDataGrunnlag("fidg"),
Feilinformasjon.UgyldigIdent(
message = "ugyldig ident",
exceptionType = "RuntimeException",
exceptionMessage = "error",
ident = "12345678910",
identRolle = IdentRolle.BARNETRYGDMOTTAKER
)
),
rådata = Rådata(),
innlesingId = InnlesingId.generate(),
correlationId = CorrelationId.generate(),
)
),
)!!

persongrunnlagMeldingProcessingService.process()

persongrunnlagRepo.find(melding).also {
assertThat(it.status).isInstanceOf(PersongrunnlagMelding.Status.Ferdig::class.java)
}

oppgaveRepo.findForMelding(melding).also {
assertThat(it).hasSize(1)
assertThat(it.single().oppgavetekst).containsAll(
setOf(
"Kunne ikke behandle godskriving av omsorgsopptjening automatisk for 12345678910 på grunn av motstridende opplysninger for barnetrygdperiodene tilhørende et av barna. Vurder omsorgsopptjening manuelt.",
"Kunne ikke behandle godskriving av omsorgsopptjening automatisk for 12345678910 på grunn av motstridende opplysninger for hjelpestønadsperiodene tilhørende et av barna. Vurder omsorgsopptjening manuelt.",
"Kunne ikke behandle godskriving av omsorgsopptjening automatisk for 12345678910 på grunn av feil i datagrunnlaget. Vurder omsorgsopptjening manuelt.",
"Kunne ikke behandle godskriving av omsorgsopptjening automatisk for 12345678910 på grunn av at det ikke eksisterer et gjeldende fnr for barnetrygdmottaker med ident: 12345678910"
)
)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.per
import no.nav.pensjon.opptjening.omsorgsopptjening.felles.CorrelationId
import no.nav.pensjon.opptjening.omsorgsopptjening.felles.InnlesingId
import no.nav.pensjon.opptjening.omsorgsopptjening.felles.domene.kafka.Rådata
import no.nav.pensjon.opptjening.omsorgsopptjening.felles.domene.kafka.messages.domene.Feilinformasjon
import no.nav.pensjon.opptjening.omsorgsopptjening.felles.domene.kafka.messages.domene.IdentRolle
import no.nav.pensjon.opptjening.omsorgsopptjening.felles.domene.kafka.messages.domene.Kilde
import no.nav.pensjon.opptjening.omsorgsopptjening.felles.domene.kafka.messages.domene.Landstilknytning
import no.nav.pensjon.opptjening.omsorgsopptjening.felles.domene.kafka.messages.domene.Omsorgstype
Expand Down Expand Up @@ -257,7 +259,9 @@ class PersongrunnlagMeldingProsesseringTest : SpringContextTest.NoKafka() {
}

clock.nesteTikk(clock.nåtid().plus(10, ChronoUnit.HOURS)) //karantenetid utløpt
assertThat(persongrunnlagMeldingProcessingService.processAndExpectResult().first().antallBehandlinger()).isEqualTo(1)
assertThat(
persongrunnlagMeldingProcessingService.processAndExpectResult().first().antallBehandlinger()
).isEqualTo(1)

assertInstanceOf(PersongrunnlagMelding.Status.Ferdig::class.java, repo.find(melding).status)
}
Expand Down
Loading

0 comments on commit 41e2261

Please sign in to comment.