Skip to content

Commit

Permalink
Nye exceptions, samt tester på feilhåndtering i komplettering
Browse files Browse the repository at this point in the history
  • Loading branch information
jankroken-nav committed Oct 28, 2024
1 parent 86bab02 commit fe93399
Show file tree
Hide file tree
Showing 5 changed files with 403 additions and 43 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package no.nav.pensjon.opptjening.omsorgsopptjening.start.innlesning.barnetrygd.domain

sealed class BarnetrygdException(msg: String, cause: Throwable) : RuntimeException(msg, cause) {
class FeilVedHentingAvPersonId(val fnr: String, msg: String, cause: Throwable) : BarnetrygdException(msg, cause)
class OverlappendePerioder(msg: String, cause: Throwable): BarnetrygdException(msg, cause)
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,15 @@ class KompletteringsService(
val gyldigÅrsIntervall = GyldigÅrsintervallFilter(barnetrygdmottakerUtenPdlData.år)

val barnetrygdmottaker = barnetrygdmottakerUtenPdlData.withPerson(
// TODO: håndter manglende svar
personIdService.personFromIdent(barnetrygdmottakerUtenPdlData.ident)!!
try {
hentPersonId(barnetrygdmottakerUtenPdlData.ident, "barnetrygdmottaker")
} catch (e: PersonOppslagException) {
throw BarnetrygdException.FeilVedHentingAvPersonId(
fnr = barnetrygdmottakerUtenPdlData.ident,
msg = "Feil ved henting av barnetrygdmottaker fra PDL",
cause = e,
)
}
)

val barnetrygdData: PersongrunnlagOgRådata =
Expand Down Expand Up @@ -98,41 +105,62 @@ class KompletteringsService(
valdataFraKilde: List<RådataFraKilde>,
) {
fun komprimer(): PersongrunnlagOgRådata {
val persongrunnlag = persongrunnlag.groupBy { it.omsorgsyter }.map { persongrunnlagPerOmsorgsyter ->
PersongrunnlagMelding.Persongrunnlag(
omsorgsyter = persongrunnlagPerOmsorgsyter.key,
omsorgsperioder = persongrunnlagPerOmsorgsyter.value
.flatMap { it.omsorgsperioder }
.distinct(),
hjelpestønadsperioder = persongrunnlagPerOmsorgsyter.value
.flatMap { it.hjelpestønadsperioder }
.distinct()
try {
val persongrunnlag = persongrunnlag.groupBy { it.omsorgsyter }.map { persongrunnlagPerOmsorgsyter ->
PersongrunnlagMelding.Persongrunnlag(
omsorgsyter = persongrunnlagPerOmsorgsyter.key,
omsorgsperioder = persongrunnlagPerOmsorgsyter.value
.flatMap { it.omsorgsperioder }
.distinct(),
hjelpestønadsperioder = persongrunnlagPerOmsorgsyter.value
.flatMap { it.hjelpestønadsperioder }
.distinct()
)
}
return PersongrunnlagOgRådata(
persongrunnlag = persongrunnlag,
rådataFraKilde = this.rådataFraKilde
)
} catch (e: IllegalArgumentException) {
throw BarnetrygdException.OverlappendePerioder("Overlappende perioder for samme omsorgsmottaker", e)
}
return PersongrunnlagOgRådata(
persongrunnlag = persongrunnlag,
rådataFraKilde = this.rådataFraKilde
)
}
}

fun oppdaterAlleFnr(barnetrygdData: PersongrunnlagOgRådata): PersongrunnlagOgRådata {
val saker = barnetrygdData.persongrunnlag.map { sak ->
val omsorgsyter = personIdService.personFromIdent(sak.omsorgsyter)!!.fnr
val omsorgsperioder = sak.omsorgsperioder.map { omsorgsperiode ->
val omsorgsmottaker = personIdService.personFromIdent(omsorgsperiode.omsorgsmottaker)!!.fnr
omsorgsperiode.copy(omsorgsmottaker = omsorgsmottaker)
}.distinct()
val hjelpestønadperioder = sak.hjelpestønadsperioder.map {
it.copy(omsorgsmottaker = personIdService.personFromIdent(it.omsorgsmottaker)!!.fnr)
}.distinct()
sak.copy(
omsorgsyter = omsorgsyter,
omsorgsperioder = omsorgsperioder,
hjelpestønadsperioder = hjelpestønadperioder
)
try {
val saker = barnetrygdData.persongrunnlag.map { sak ->
val omsorgsyter = hentPersonId(sak.omsorgsyter, "omsorgsyter").fnr
val omsorgsperioder = sak.omsorgsperioder.map { omsorgsperiode ->
val omsorgsmottaker =
hentPersonId(omsorgsperiode.omsorgsmottaker, "omsorgsmottaker, barnetrygd").fnr
omsorgsperiode.copy(omsorgsmottaker = omsorgsmottaker)
}.distinct()
val hjelpestønadperioder = sak.hjelpestønadsperioder.map {
it.copy(omsorgsmottaker = hentPersonId(it.omsorgsmottaker, "omsorgsmottaker, hjelpestønad").fnr)
}.distinct()
sak.copy(
omsorgsyter = omsorgsyter,
omsorgsperioder = omsorgsperioder,
hjelpestønadsperioder = hjelpestønadperioder
)
}
return barnetrygdData.copy(persongrunnlag = saker)
} catch (e: IllegalArgumentException) {
if ("Overlappende perioder for samme omsorgsmottaker" == e.message) {
throw BarnetrygdException.OverlappendePerioder("Overlappende hjelpestønadsperioder", e)
} else {
throw e
}
}
}

private fun hentPersonId(fnr: String, beskrivelse: String): PersonId {
try {
return personIdService.personFromIdent(fnr)!!
} catch (e: PersonOppslagException) {
throw BarnetrygdException.FeilVedHentingAvPersonId(fnr, "Feil ved oppslag i PDL for '$beskrivelse'", e)
}
return barnetrygdData.copy(persongrunnlag = saker)
}

fun ekspanderFnrTilAlleIHistorikken(fnrs: Set<String>): Set<String> {
Expand All @@ -145,7 +173,7 @@ class KompletteringsService(
valdata: Rådata,
) {
init {
// valider()
// valider()
}

fun valider() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,12 @@ import no.nav.pensjon.opptjening.omsorgsopptjening.start.innlesning.barnetrygd.r
import no.nav.pensjon.opptjening.omsorgsopptjening.start.innlesning.external.barnetrygd.*
import no.nav.pensjon.opptjening.omsorgsopptjening.start.innlesning.external.hjelpestønad.`hent hjelpestønad ok - har hjelpestønad`
import no.nav.pensjon.opptjening.omsorgsopptjening.start.innlesning.external.hjelpestønad.`hent hjelpestønad ok - ingen hjelpestønad`
import no.nav.pensjon.opptjening.omsorgsopptjening.start.innlesning.external.pdl.`pdl error not_found`
import no.nav.pensjon.opptjening.omsorgsopptjening.start.innlesning.external.pdl.`pdl fnr ett i bruk`
import no.nav.pensjon.opptjening.omsorgsopptjening.start.innlesning.external.pdl.`pdl fnr fra query`
import org.apache.kafka.clients.producer.ProducerRecord
import org.assertj.core.api.Assertions.assertThat
import org.assertj.core.api.Assertions.assertThatThrownBy
import org.junit.jupiter.api.Assertions.assertInstanceOf
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.extension.RegisterExtension
Expand Down Expand Up @@ -196,6 +198,93 @@ class BarnetrygdmottakerServiceTest : SpringContextTest.NoKafka() {
)
}


@Test
fun `Dersom barnetrygdmottaker ikke finnes i PDL havner barnetrygdmottaker i retry`() {
given(kafkaTemplate.send(any<ProducerRecord<String, String>>())).willAnswer {
CompletableFuture.completedFuture(it.arguments[0])
}
/**
* Stiller klokka litt fram i tid for å unngå at [Barnetrygdmottaker.Status.Retry.karanteneTil] fører til at vi hopper over raden.
*/
given(clock.instant()).willReturn(Instant.now().plus(10, ChronoUnit.DAYS))

val innlesing = lagreFullførtInnlesing()

val barnetrygdmottaker = barnetrygdmottakerRepository.insert(
Barnetrygdmottaker.Transient(
ident = "12345678910",
correlationId = CorrelationId.generate(),
innlesingId = innlesing.id
)
)
wiremock.`pdl error not_found`()

wiremock.stubFor(
WireMock.post(WireMock.urlPathEqualTo("/api/ekstern/pensjon/hent-barnetrygd"))
.inScenario("feilOgFerdig")
.whenScenarioStateIs(Scenario.STARTED)
.willReturn(WireMock.forbidden())
.willSetStateTo("ok")
)

wiremock.stubFor(
WireMock.post(WireMock.urlPathEqualTo("/api/ekstern/pensjon/hent-barnetrygd"))
.inScenario("feilOgFerdig")
.whenScenarioStateIs("ok")
.willReturn(
WireMock.ok()
.withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
.withBody(
"""
{
"fagsaker": [
{
"fagsakEiersIdent":"12345678910",
"barnetrygdPerioder":[
{
"personIdent":"09876543210",
"delingsprosentYtelse":"FULL",
"ytelseTypeEkstern":"ORDINÆR_BARNETRYGD",
"utbetaltPerMnd":2000,
"stønadFom": "2020-01",
"stønadTom": "2025-12",
"sakstypeEkstern":"NASJONAL",
"kildesystem":"BA",
"pensjonstrygdet":null,
"norgeErSekundærlandMedNullUtbetaling":false
}
]
}
]
}
""".trimIndent()
)
)
)
wiremock.`hent hjelpestønad ok - ingen hjelpestønad`()

assertInstanceOf(
Barnetrygdmottaker.Status.Klar::class.java,
barnetrygdmottakerRepository.find(barnetrygdmottaker.id)!!.status
)

barnetrygdService.process()
barnetrygdmottakerRepository.find(barnetrygdmottaker.id).let {
assertInstanceOf(Barnetrygdmottaker.Status.Retry::class.java, it!!.status).also { retry ->
assertThat(retry.antallForsøk).isEqualTo(1)
assertThat(retry.maxAntallForsøk).isEqualTo(3)
}
}

barnetrygdService.process()
barnetrygdmottakerRepository.find(barnetrygdmottaker.id)!!.let { barnetrygdmottaker ->
assertThat(barnetrygdmottaker.status)
.isInstanceOf(Barnetrygdmottaker.Status.Retry::class.java)
}
}


@Test
fun `oppdaterer status selv om det kastes exception under prosessering`() {
wiremock.`pdl fnr fra query`()
Expand Down
Loading

0 comments on commit fe93399

Please sign in to comment.