Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Integrate handling of errors from start #28

Merged
merged 2 commits into from
Nov 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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.1.3"
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::opprettOppgaveForManuellBehandlingHvisNø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::opprettOppgaveForManuellBehandlingHvisNø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 @@ -172,7 +172,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 @@ -408,7 +408,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,63 @@ 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(
message = "obt",
exceptionType = "et",
exceptionMessage = "em",
omsorgsmottaker = "om"
),
Feilinformasjon.OverlappendeHjelpestønadperioder(
message = "ohs",
exceptionType = "et",
exceptionMessage = "em",
omsorgsmottaker = "om"
),
Feilinformasjon.FeilIDataGrunnlag(
message = "fidg",
exceptionType = "et",
exceptionMessage = "em"
),
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 @@ -19,6 +19,7 @@ import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.uti
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.ytelse.YtelseOppslag
import no.nav.pensjon.opptjening.omsorgsopptjening.felles.CorrelationId
import no.nav.pensjon.opptjening.omsorgsopptjening.felles.InnlesingId
import no.nav.pensjon.opptjening.omsorgsopptjening.felles.domene.UgyldigPersongrunnlag
import no.nav.pensjon.opptjening.omsorgsopptjening.felles.domene.kafka.Rådata
import no.nav.pensjon.opptjening.omsorgsopptjening.felles.domene.kafka.messages.domene.Kilde
import no.nav.pensjon.opptjening.omsorgsopptjening.felles.domene.kafka.messages.domene.Landstilknytning
Expand Down Expand Up @@ -559,7 +560,7 @@ class OmsorgsopptjeningsgrunnlagServiceImplTest {

@Test
fun `kan ikke opprette grunnlag dersom det er overlapp i perioder for omsorgsmottaker og disse ikke kan slås sammen`() {
assertThrows<IllegalArgumentException> {
assertThrows<UgyldigPersongrunnlag.OverlappendeOmsorgsperiode> {
service.lagOmsorgsopptjeningsgrunnlag(
PersongrunnlagMelding.Mottatt(
id = UUID.randomUUID(),
Expand Down Expand Up @@ -651,7 +652,7 @@ class OmsorgsopptjeningsgrunnlagServiceImplTest {

@Test
fun `kan ikke opprette grunnlag dersom det er overlapp i perioder for omsorgsyter og disse ikke kan slås sammen`() {
assertThrows<IllegalArgumentException> {
assertThrows<UgyldigPersongrunnlag.OverlappendeOmsorgsperiode> {
service.lagOmsorgsopptjeningsgrunnlag(
PersongrunnlagMelding.Mottatt(
id = UUID.randomUUID(),
Expand Down
Loading