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

Alder på barn regel forbedring/forenkling #2453

Merged
merged 11 commits into from
Feb 20, 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
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package no.nav.familie.ef.sak.vilkår.regler.vilkår

import com.fasterxml.jackson.annotation.JsonIgnore
import no.nav.familie.ef.sak.felles.util.norskFormat
import no.nav.familie.ef.sak.vilkår.Delvilkårsvurdering
import no.nav.familie.ef.sak.vilkår.VilkårType
Expand All @@ -15,8 +14,8 @@ import no.nav.familie.ef.sak.vilkår.regler.SvarId
import no.nav.familie.ef.sak.vilkår.regler.Vilkårsregel
import no.nav.familie.ef.sak.vilkår.regler.jaNeiSvarRegel
import no.nav.familie.ef.sak.vilkår.regler.regelIder
import no.nav.familie.ef.sak.vilkår.regler.vilkår.AlderPåBarnRegelUtil.harFullførtFjerdetrinn
import no.nav.familie.kontrakter.felles.Fødselsnummer
import org.slf4j.LoggerFactory
import java.time.LocalDate
import java.util.UUID

Expand All @@ -27,44 +26,50 @@ class AlderPåBarnRegel :
hovedregler = regelIder(HAR_ALDER_LAVERE_ENN_GRENSEVERDI),
) {

@JsonIgnore
private val secureLogger = LoggerFactory.getLogger("secureLogger")

override fun initiereDelvilkårsvurdering(
metadata: HovedregelMetadata,
resultat: Vilkårsresultat,
barnId: UUID?,
): List<Delvilkårsvurdering> {
val finnPersonIdentForGjeldendeBarn = metadata.barn.firstOrNull { it.id == barnId }?.personIdent
val harFullførtFjerdetrinn = if (finnPersonIdentForGjeldendeBarn == null ||
harFullførtFjerdetrinn(Fødselsnummer(finnPersonIdentForGjeldendeBarn).fødselsdato)
) {
null
} else {
SvarId.NEI
if (resultat != Vilkårsresultat.IKKE_TATT_STILLING_TIL || barnId == null) { // barnId kan være null ved migreringer, da behandlingbarn ikke er opprettet enda
return super.initiereDelvilkårsvurdering(metadata, resultat, barnId)
}

return hovedregler.map {
if (it == RegelId.HAR_ALDER_LAVERE_ENN_GRENSEVERDI && !harFullførtFjerdetrinn(metadata, barnId)) {
automatisktOppfyltHarAlderLavereEnnGrenseverdi()
} else {
Delvilkårsvurdering(resultat, vurderinger = listOf(Vurdering(it)))
}
}
secureLogger.info("BarnId: $barnId harFullførtFjerdetrinn: $harFullførtFjerdetrinn fødselsdato")
return listOf(
Delvilkårsvurdering(
resultat = if (harFullførtFjerdetrinn == SvarId.NEI) Vilkårsresultat.AUTOMATISK_OPPFYLT else Vilkårsresultat.IKKE_TATT_STILLING_TIL,
listOf(
Vurdering(
regelId = RegelId.HAR_ALDER_LAVERE_ENN_GRENSEVERDI,
svar = harFullførtFjerdetrinn,
begrunnelse = if (harFullførtFjerdetrinn == SvarId.NEI) {
"Automatisk vurdert: Ut ifra barnets alder er det ${
LocalDate.now()
.norskFormat()
} automatisk vurdert at barnet ikke har fullført 4. skoleår."
} else {
null
},
),
}

private fun automatisktOppfyltHarAlderLavereEnnGrenseverdi(): Delvilkårsvurdering {
val beskrivelse = "Automatisk vurdert: Ut ifra barnets alder er det ${LocalDate.now().norskFormat()}" +
" automatisk vurdert at barnet ikke har fullført 4. skoleår."
return Delvilkårsvurdering(
resultat = Vilkårsresultat.AUTOMATISK_OPPFYLT,
listOf(
Vurdering(
regelId = RegelId.HAR_ALDER_LAVERE_ENN_GRENSEVERDI,
svar = SvarId.NEI,
begrunnelse = beskrivelse,
),
),
)
}

private fun harFullførtFjerdetrinn(
metadata: HovedregelMetadata,
barnId: UUID?,
): Boolean {
val fødselsdato = metadata.barn.firstOrNull { it.id == barnId }
?.personIdent
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Burde man egentlige bruke fødselsdato fra PDL her, og ikke personIdent? Det er ikke sikkert personIdent -> fødselsdato er lik faktiskt fødselsdato

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Det høres jo rimelig ut - jeg vet ikke helt hvilke potensielle fallgruver som dukker opp hvis vi bytter til fødselsdato?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Problemet er vel først og fremst at det ikke finnes noe fødselsdato i det objektet der, eller?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Det er mulig, men det burde kunne legges til då :-)

?.let { Fødselsnummer(it).fødselsdato }
?: error("Finner ikke ident til barn=$barnId")
return harFullførtFjerdetrinn(fødselsdato)
}

companion object {

private val unntakAlderMapping =
Expand All @@ -91,14 +96,4 @@ class AlderPåBarnRegel :
),
)
}

fun harFullførtFjerdetrinn(fødselsdato: LocalDate, datoForBeregning: LocalDate = LocalDate.now()): Boolean {
val alder = datoForBeregning.year - fødselsdato.year
var skoletrinn = alder - 5 // Begynner på skolen i det året de fyller 6
if (datoForBeregning.month.plus(1).value < 6) { // Legger til en sikkerhetsmargin på 1 mnd tilfelle de fyller år mens saken behandles
skoletrinn--
}
secureLogger.info("Fødselsdato: $fødselsdato gir skoletrinn $skoletrinn")
return skoletrinn > 4
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package no.nav.familie.ef.sak.vilkår.regler.vilkår

import java.time.LocalDate
import java.time.Month

object AlderPåBarnRegelUtil {

/**
* Et barn født i 2013 har ikke avsluttet 3'e trinn før juni det året man fyller 10
*
* 2013 født
* 2014 fyller 1 år
* ...
* 2019 fyller 6 år - starter 1 trinn
* 2020 fyller 7 år - fullfører 1 trinn
* ...
* 2023 fyller 10 år - fullfører 4 trinn i juni
*/
fun harFullførtFjerdetrinn(fødselsdato: LocalDate, datoForBeregning: LocalDate = LocalDate.now()): Boolean {
return if (datoForBeregning.month >= Month.JUNE) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Vet ikke helt hvorfor vi gjorde det på denne måten tidligere, men det blir vel litt forskjell her nå?

        if (datoForBeregning.month.plus(1).value < 6) { // Legger til en sikkerhetsmargin på 1 mnd tilfelle de fyller år mens saken behandles
        ```

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ja, forskjellen blir at man i den tidligere løsningen fikk at man "fullført fjerne trinn" hvis man beregner i mai, det året barnet skal fullføre, som på en måte høres rart ut? 👀
Hva mener man egentlige med "sikkerhetsmargin"?

datoForBeregning.year - fødselsdato.year > 9
} else {
datoForBeregning.year - fødselsdato.year > 10
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ import no.nav.familie.kontrakter.ef.infotrygd.InfotrygdSakResponse
import no.nav.familie.kontrakter.ef.infotrygd.InfotrygdSakResultat
import no.nav.familie.kontrakter.ef.iverksett.IverksettStatus
import no.nav.familie.kontrakter.felles.Månedsperiode
import no.nav.familie.kontrakter.felles.ef.StønadType.BARNETILSYN
import no.nav.familie.kontrakter.felles.ef.StønadType.OVERGANGSSTØNAD
import no.nav.familie.kontrakter.felles.objectMapper
import no.nav.familie.kontrakter.felles.oppgave.Oppgavetype
Expand Down Expand Up @@ -779,10 +780,9 @@ internal class MigreringServiceTest : OppslagSpringRunnerTest() {
inner class Barnetilsyn {

@Test
internal fun `migrering av skolepenger`() {
internal fun `migrering av barnetilsyn`() {
mockPerioder(utgifterBarnetilsyn = 100)

val fagsak = fagsakService.hentEllerOpprettFagsak("1", OVERGANGSSTØNAD)
val fagsak = fagsakService.hentEllerOpprettFagsak("1", BARNETILSYN)
val behandlingId = testWithBrukerContext(groups = listOf(rolleConfig.beslutterRolle)) {
migreringService.migrerBarnetilsyn(fagsak.fagsakPersonId, MigrerRequestDto())
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ import no.nav.familie.ef.sak.no.nav.familie.ef.sak.cucumber.domeneparser.Beregni
import no.nav.familie.ef.sak.vedtak.domain.PeriodetypeBarnetilsyn
import no.nav.familie.ef.sak.vedtak.dto.PeriodeMedBeløpDto
import no.nav.familie.ef.sak.vedtak.dto.UtgiftsperiodeDto
import no.nav.familie.ef.sak.vilkår.regler.vilkår.AlderPåBarnRegel
import no.nav.familie.ef.sak.vilkår.regler.vilkår.AlderPåBarnRegelUtil
import no.nav.familie.kontrakter.felles.Månedsperiode
import org.assertj.core.api.Assertions.assertThat
import java.math.BigDecimal.ZERO
Expand Down Expand Up @@ -98,7 +98,7 @@ class BeregningBarnetilsynStepDefinitions {
@Når("sjekk på om barn har fullført fjerde skoletrinn utføres den {string}")
fun sjekk_har_fullført_fjerde_skoletrinn(datoSjekkUtføres: String) {
datoForKjøring = parseDato(datoSjekkUtføres)
resultatHarFullførtFjerdetrinn = AlderPåBarnRegel().harFullførtFjerdetrinn(gittFødselsdato, parseDato(datoSjekkUtføres))
resultatHarFullførtFjerdetrinn = AlderPåBarnRegelUtil.harFullførtFjerdetrinn(gittFødselsdato, parseDato(datoSjekkUtføres))
}

@Når("vi beregner perioder med barnetilsyn")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ internal class OppdaterVilkårTest {
id = UUID.randomUUID(),
behandlingId = behandlingId,
søknadBarnId = null,
personIdent = null,
personIdent = "01472152579",
navn = null,
fødselTermindato = null,
)
Expand Down Expand Up @@ -124,7 +124,7 @@ internal class OppdaterVilkårTest {
id = UUID.randomUUID(),
behandlingId = behandlingId,
søknadBarnId = null,
personIdent = null,
personIdent = "03441983106",
navn = null,
fødselTermindato = null,
)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package no.nav.familie.ef.sak.no.nav.familie.ef.sak.vilkår.regler.vilkår

import io.mockk.every
import io.mockk.mockk
import no.nav.familie.ef.sak.repository.behandling
import no.nav.familie.ef.sak.repository.behandlingBarn
import no.nav.familie.ef.sak.vilkår.Vilkårsresultat
import no.nav.familie.ef.sak.vilkår.regler.HovedregelMetadata
import no.nav.familie.ef.sak.vilkår.regler.vilkår.AlderPåBarnRegel
import org.assertj.core.api.Assertions
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import java.util.UUID

class AlderPåBarnRegelTest {

val hovedregelMetadataMock = mockk<HovedregelMetadata>()
val behandlingBarnMedDnr = behandlingBarn(behandlingId = UUID.randomUUID(), personIdent = "06431960727", søknadBarnId = UUID.randomUUID())
val behandlingBarn2 = behandlingBarn(behandlingId = UUID.randomUUID(), personIdent = "03041983106", søknadBarnId = UUID.randomUUID())

@BeforeEach
fun setup() {
every { hovedregelMetadataMock.barn } returns listOf(behandlingBarnMedDnr, behandlingBarn2)
every { hovedregelMetadataMock.behandling } returns behandling()
}

@Test
fun `Vilkår ikke tatt stilling til og har fullført fjerdetrinn - skal automatisk oppfylle vilkår`() {
val listDelvilkårsvurdering = AlderPåBarnRegel().initiereDelvilkårsvurdering(
hovedregelMetadataMock,
Vilkårsresultat.IKKE_TATT_STILLING_TIL,
behandlingBarnMedDnr.id,
)

Assertions.assertThat(listDelvilkårsvurdering.size).isEqualTo(1)
Assertions.assertThat(listDelvilkårsvurdering.first().resultat).isEqualTo(Vilkårsresultat.AUTOMATISK_OPPFYLT)
}

@Test
fun `Vilkår tatt stilling til i resultat, skal ikke vurdere automatisk`() {
val listDelvilkårsvurdering = AlderPåBarnRegel().initiereDelvilkårsvurdering(
hovedregelMetadataMock,
Vilkårsresultat.OPPFYLT,
null,
)

Assertions.assertThat(listDelvilkårsvurdering.size).isEqualTo(1)
Assertions.assertThat(listDelvilkårsvurdering.first().resultat).isEqualTo(Vilkårsresultat.OPPFYLT)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,9 @@ Egenskap: Har fullført fjerdetrinn
| 01.01.2012 | 01.07.2022 | Ja |
| 01.01.2013 | 01.07.2022 | Nei |
| 01.01.2012 | 01.06.2022 | Ja |
| 01.01.2012 | 01.05.2022 | Ja |
| 31.12.2012 | 01.06.2022 | Ja |
| 01.01.2012 | 01.05.2022 | Nei |
| 01.01.2012 | 01.04.2022 | Nei |
| 01.01.2012 | 01.11.2021 | Nei |
| 14.04.2013 | 01.04.2023 | Nei |
| 14.04.2013 | 01.05.2023 | Ja |
| 14.04.2013 | 01.06.2023 | Ja |