Skip to content

Commit

Permalink
Alder på barn regel forbedring/forenkling (#2453)
Browse files Browse the repository at this point in the history
* Skal ikke sette automatisk vurdert hvis man setter vilkåret til eks SKAL_IKKE_VURDERES
* Trekker ut automatisk oppfylt delvilkårsvurdering i egen metode, som ikke trenger noen if-sjekker
* Trekker ut harFullførtFjerdetrinn til egen klasse for å kunne teste
* Kaster feil hvis man ikke finner ident til barnet og returnerer boolean i stedet for SvarId|null

* Koden er endret slik at et barn regnes som fjerdeklassing i juni og ikke i mai. Det gjør valideringen og automatisk vurdering litt strengere da den ekstra måneden "slakk" var ment som at en behandling kan være opprettet i mai, men fullført i juni, noe som vi nå går bort ifra.
I norsk målestokk er det svært få som starter i første klasse før "normalen" og følgelig heller ikke noe som blir fanget opp via søknad eller andre steder. Men barn vil heller ikke få SFO-tilbud som 5. klassing - så da har barnet isåfall et spesielt tilbud fordi det trengs ekstra oppfølging... Og da starter du sjelden på skolen ett år FØR tiden, mest sannsynlig ett år ETTER normaltid.
* Alder på barn kan ikke automatisk vurderes dersom barnId er null, noe som skjer ved migreringer da BehandlingBarn ikke er opprettet enda ved initiering av vilkår
* Fjerner enhetstester på harfullførtfjerdetrinn da det allerede finnes cucumber-tester på dette
* Laget enhetstester for AlderPåBarnRegel som sjekker at vilkårsresultat blir riktig

---------

Co-authored-by: Charlie Midtlyng <[email protected]>
Co-authored-by: Mattis Janitz <[email protected]>
Co-authored-by: Ole Christian Kvernberg <[email protected]>
  • Loading branch information
4 people authored Feb 20, 2024
1 parent f61f949 commit d5091db
Show file tree
Hide file tree
Showing 7 changed files with 120 additions and 48 deletions.
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
?.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) {
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 |

0 comments on commit d5091db

Please sign in to comment.