diff --git a/kontrakter/src/main/kotlin/no/nav/pleiepengerbarn/uttak/kontrakter/KnekkpunktType.kt b/kontrakter/src/main/kotlin/no/nav/pleiepengerbarn/uttak/kontrakter/KnekkpunktType.kt index 1bc2e92e..6e40c7ae 100644 --- a/kontrakter/src/main/kotlin/no/nav/pleiepengerbarn/uttak/kontrakter/KnekkpunktType.kt +++ b/kontrakter/src/main/kotlin/no/nav/pleiepengerbarn/uttak/kontrakter/KnekkpunktType.kt @@ -11,6 +11,7 @@ enum class KnekkpunktType { ARBEID, SØKERS_DØDSFALL, BARNETS_DØDSFALL, + BARNETS_DØDSFALL_SLUTT_PÅ_RETT, SØKERS_ALDER, KRAVPRIORITETSPERIODE } \ No newline at end of file diff --git a/regler/src/main/kotlin/no/nav/pleiepengerbarn/uttak/regler/KnekkpunktUtleder.kt b/regler/src/main/kotlin/no/nav/pleiepengerbarn/uttak/regler/KnekkpunktUtleder.kt index 69cf0b18..69f59a65 100644 --- a/regler/src/main/kotlin/no/nav/pleiepengerbarn/uttak/regler/KnekkpunktUtleder.kt +++ b/regler/src/main/kotlin/no/nav/pleiepengerbarn/uttak/regler/KnekkpunktUtleder.kt @@ -30,6 +30,7 @@ internal object KnekkpunktUtleder { finnForBeredskap(knekkpunkMap, regelGrunnlag.beredskapsperioder.keys) finnForNattevåk(knekkpunkMap, regelGrunnlag.nattevåksperioder.keys) finnForKravprioritet(knekkpunkMap, regelGrunnlag.kravprioritet.keys) + finnForBarnsDød(knekkpunkMap, regelGrunnlag.barn) val knekkpunkter = mutableListOf() knekkpunkMap.forEach { (key, value) -> @@ -38,6 +39,14 @@ internal object KnekkpunktUtleder { return knekkpunkter.toSortedSet(compareBy { it.knekk }) } + private fun finnForBarnsDød(knekkpunktMap: KnekkpunktMap, barn: Barn) { + if (barn.dødsdato != null) { + oppdaterKnekkpunktMap(knekkpunktMap, barn.dødsdato!!.plusDays(1), KnekkpunktType.BARNETS_DØDSFALL) + val antallUker = barn.rettVedDød?.uker ?: 0 + oppdaterKnekkpunktMap(knekkpunktMap, barn.dødsdato!!.plusDays(1).plusWeeks(antallUker), KnekkpunktType.BARNETS_DØDSFALL) + } + } + private fun finnForKravprioritet(knekkpunktMap: KnekkpunktMap, kravprioritetsperioder: Set) { kravprioritetsperioder.forEach { finnForPeriode(knekkpunktMap, it, KnekkpunktType.KRAVPRIORITETSPERIODE)} } diff --git a/regler/src/main/kotlin/no/nav/pleiepengerbarn/uttak/regler/UttaksplanRegler.kt b/regler/src/main/kotlin/no/nav/pleiepengerbarn/uttak/regler/UttaksplanRegler.kt index 566f2870..9f4fd97b 100644 --- a/regler/src/main/kotlin/no/nav/pleiepengerbarn/uttak/regler/UttaksplanRegler.kt +++ b/regler/src/main/kotlin/no/nav/pleiepengerbarn/uttak/regler/UttaksplanRegler.kt @@ -3,7 +3,6 @@ package no.nav.pleiepengerbarn.uttak.regler import no.nav.pleiepengerbarn.uttak.kontrakter.* import no.nav.pleiepengerbarn.uttak.regler.delregler.* import no.nav.pleiepengerbarn.uttak.regler.delregler.IkkeOppfylt -import no.nav.pleiepengerbarn.uttak.regler.delregler.BarnsDødRegel import no.nav.pleiepengerbarn.uttak.regler.delregler.FerieRegel import no.nav.pleiepengerbarn.uttak.regler.domene.RegelGrunnlag import no.nav.pleiepengerbarn.uttak.regler.kontrakter_ext.annenPart @@ -14,12 +13,14 @@ import java.time.Duration internal object UttaksplanRegler { private val PeriodeRegler = linkedSetOf( - FerieRegel() + FerieRegel(), + BarnsDødPeriodeRegel() ) private val UttaksplanRegler = linkedSetOf( InngangsvilkårIkkeOppfyltRegel(), - BarnsDødRegel() +// NB: erstartet inntil videre med BarnsDødPeriodeRegel +// BarnsDødRegel() ) internal fun fastsettUttaksplan(grunnlag: RegelGrunnlag, knektePerioder: Map>) : Uttaksplan { @@ -33,15 +34,23 @@ internal object UttaksplanRegler { return fastsettUttaksplanRegler(perioder, grunnlag) } - private fun fastsettPeriodeRegler(søktUttaksperiode: LukketPeriode, grunnlag: RegelGrunnlag): MutableSet<Årsak> { - val ikkeOppfyltÅrsaker = mutableSetOf<Årsak>() + private fun fastsettPeriodeRegler(søktUttaksperiode: LukketPeriode, grunnlag: RegelGrunnlag): Set<Årsak> { + val årsaker = mutableSetOf<Årsak>() + var overstyrtÅrsak: Årsak? = null PeriodeRegler.forEach { regel -> val utfall = regel.kjør(periode = søktUttaksperiode, grunnlag = grunnlag) if (utfall is IkkeOppfylt) { - ikkeOppfyltÅrsaker.addAll(utfall.årsaker) + årsaker.addAll(utfall.årsaker) + } else if (utfall is TilBeregningAvGrad) { + if (utfall.overstyrtÅrsak != null) { + overstyrtÅrsak = utfall.overstyrtÅrsak + } } } - return ikkeOppfyltÅrsaker + if (overstyrtÅrsak != null) { + return setOf(overstyrtÅrsak!!) + } + return årsaker } private fun fastsettGrader( @@ -49,11 +58,12 @@ internal object UttaksplanRegler { søktUttaksperiode: LukketPeriode, grunnlag: RegelGrunnlag, knekkpunktTyper: Set, - ikkeOppfyltÅrsaker: Set<Årsak>) + årsaker: Set<Årsak>) { val grader = finnGrader(søktUttaksperiode, grunnlag) val nattevåk = grunnlag.finnNattevåk(søktUttaksperiode) val beredskap = grunnlag.finnBeredskap(søktUttaksperiode) + val ikkeOppfyltÅrsaker = årsaker.filter { !it.oppfylt } .toSet() if (ikkeOppfyltÅrsaker.isNotEmpty()) { perioder[søktUttaksperiode] = UttaksperiodeInfo.ikkeOppfylt( utbetalingsgrader = grader.tilUtbetalingsgrader(false), @@ -70,12 +80,17 @@ internal object UttaksplanRegler { ) } else { if (grader.årsak.oppfylt) { + val årsak = if (årsaker.size == 1) { + årsaker.first() + } else { + grader.årsak + } perioder[søktUttaksperiode] = UttaksperiodeInfo.oppfylt( uttaksgrad = grader.uttaksgrad, utbetalingsgrader = grader.tilUtbetalingsgrader(true), søkersTapteArbeidstid = grader.søkersTapteArbeidstid, oppgittTilsyn = grader.oppgittTilsyn, - årsak = grader.årsak, + årsak = årsak, pleiebehov = grader.pleiebehov.prosent, graderingMotTilsyn = grader.graderingMotTilsyn, knekkpunktTyper = knekkpunktTyper, diff --git "a/regler/src/main/kotlin/no/nav/pleiepengerbarn/uttak/regler/delregler/BarnsD\303\270dPeriodeRegel.kt" "b/regler/src/main/kotlin/no/nav/pleiepengerbarn/uttak/regler/delregler/BarnsD\303\270dPeriodeRegel.kt" new file mode 100644 index 00000000..3ef2aad0 --- /dev/null +++ "b/regler/src/main/kotlin/no/nav/pleiepengerbarn/uttak/regler/delregler/BarnsD\303\270dPeriodeRegel.kt" @@ -0,0 +1,28 @@ +package no.nav.pleiepengerbarn.uttak.regler.delregler + +import no.nav.pleiepengerbarn.uttak.kontrakter.LukketPeriode +import no.nav.pleiepengerbarn.uttak.kontrakter.RettVedDød +import no.nav.pleiepengerbarn.uttak.kontrakter.Årsak +import no.nav.pleiepengerbarn.uttak.regler.domene.RegelGrunnlag + +internal class BarnsDødPeriodeRegel : PeriodeRegel { + + override fun kjør(periode: LukketPeriode, grunnlag: RegelGrunnlag): Regelutfall { + val dødsdato = grunnlag.barn.dødsdato + if (dødsdato != null) { + val sisteDagMedRettEtterBarnetsDød = dødsdato.plusWeeks(grunnlag.barn.rettVedDød?.uker ?: 0) + if (periode.fom.isAfter(sisteDagMedRettEtterBarnetsDød)) { + return IkkeOppfylt(årsaker = setOf(Årsak.BARNETS_DØDSFALL)) + } + if (periode.fom.isAfter(dødsdato)) { + val årsak = when(grunnlag.barn.rettVedDød) { + RettVedDød.RETT_6_UKER -> Årsak.OPPFYLT_PGA_BARNETS_DØDSFALL_6_UKER + RettVedDød.RETT_12_UKER -> Årsak.OPPFYLT_PGA_BARNETS_DØDSFALL_12_UKER + null -> null + } + return TilBeregningAvGrad(årsak) + } + } + return TilBeregningAvGrad() + } +} \ No newline at end of file diff --git a/regler/src/main/kotlin/no/nav/pleiepengerbarn/uttak/regler/delregler/Regel.kt b/regler/src/main/kotlin/no/nav/pleiepengerbarn/uttak/regler/delregler/Regel.kt index 43e54203..6b5aa4ec 100644 --- a/regler/src/main/kotlin/no/nav/pleiepengerbarn/uttak/regler/delregler/Regel.kt +++ b/regler/src/main/kotlin/no/nav/pleiepengerbarn/uttak/regler/delregler/Regel.kt @@ -11,7 +11,9 @@ internal interface Regelutfall internal class IkkeOppfylt( internal val årsaker: Set<Årsak> ) : Regelutfall -internal class TilBeregningAvGrad : Regelutfall +internal class TilBeregningAvGrad( + val overstyrtÅrsak: Årsak? = null +) : Regelutfall internal interface UttaksplanRegel { fun kjør(uttaksplan: Uttaksplan, grunnlag: RegelGrunnlag) : Uttaksplan diff --git "a/regler/src/test/kotlin/no/nav/pleiepengerbarn/uttak/regler/delregler/BarnsD\303\270dPeriodeRegelTest.kt" "b/regler/src/test/kotlin/no/nav/pleiepengerbarn/uttak/regler/delregler/BarnsD\303\270dPeriodeRegelTest.kt" new file mode 100644 index 00000000..8ef2953d --- /dev/null +++ "b/regler/src/test/kotlin/no/nav/pleiepengerbarn/uttak/regler/delregler/BarnsD\303\270dPeriodeRegelTest.kt" @@ -0,0 +1,51 @@ +package no.nav.pleiepengerbarn.uttak.regler.delregler + +import no.nav.pleiepengerbarn.uttak.kontrakter.* +import no.nav.pleiepengerbarn.uttak.regler.domene.RegelGrunnlag +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Test +import java.time.LocalDate +import java.util.* + +internal class BarnsDødPeriodeRegelTest { + + private val regel: BarnsDødPeriodeRegel = BarnsDødPeriodeRegel() + + @Test + internal fun `Barn dør etter periode`() { + val resultat = regel.kjør(LukketPeriode("2020-01-01/2020-01-31"), grunnlagMedDødtBarn(LocalDate.parse("2020-02-15"), RettVedDød.RETT_6_UKER)) + assertThat(resultat).isInstanceOf(TilBeregningAvGrad::class.java) + val tilBeregningAvGrad = resultat as TilBeregningAvGrad + assertThat(tilBeregningAvGrad.overstyrtÅrsak).isNull() + } + + @Test + internal fun `Periode er etter barns død men innenfor rett ved død`() { + val resultat = regel.kjør(LukketPeriode("2020-01-16/2020-01-31"), grunnlagMedDødtBarn(LocalDate.parse("2020-01-15"), RettVedDød.RETT_6_UKER)) + assertThat(resultat).isInstanceOf(TilBeregningAvGrad::class.java) + val tilBeregningAvGrad = resultat as TilBeregningAvGrad + assertThat(tilBeregningAvGrad.overstyrtÅrsak).isEqualTo(Årsak.OPPFYLT_PGA_BARNETS_DØDSFALL_6_UKER) + } + + @Test + internal fun `Periode er etter barns død men etter rett ved død`() { + val resultat = regel.kjør(LukketPeriode("2020-05-16/2020-05-30"), grunnlagMedDødtBarn(LocalDate.parse("2020-01-15"), RettVedDød.RETT_6_UKER)) + assertThat(resultat).isInstanceOf(IkkeOppfylt::class.java) + val ikkeOppfylt = resultat as IkkeOppfylt + assertThat(ikkeOppfylt.årsaker).isEqualTo(setOf(Årsak.BARNETS_DØDSFALL)) + } + + + private fun grunnlagMedDødtBarn(dødsdatoBarn: LocalDate, rettVedDød: RettVedDød): RegelGrunnlag { + return RegelGrunnlag( + barn = Barn(aktørId = "123", dødsdato = dødsdatoBarn, rettVedDød = rettVedDød), + //Feltene nedenfor er ikke relevante for testen + behandlingUUID = UUID.randomUUID().toString(), + søker = Søker("456"), + pleiebehov = mapOf(), + søktUttak = listOf(), + arbeid = listOf() + ) + } + +} \ No newline at end of file diff --git "a/regler/src/test/kotlin/no/nav/pleiepengerbarn/uttak/regler/delregler/BarnsD\303\270dRegelTest.kt" "b/regler/src/test/kotlin/no/nav/pleiepengerbarn/uttak/regler/delregler/BarnsD\303\270dRegelTest.kt" index 94777b00..fb1490cd 100644 --- "a/regler/src/test/kotlin/no/nav/pleiepengerbarn/uttak/regler/delregler/BarnsD\303\270dRegelTest.kt" +++ "b/regler/src/test/kotlin/no/nav/pleiepengerbarn/uttak/regler/delregler/BarnsD\303\270dRegelTest.kt" @@ -12,11 +12,13 @@ import no.nav.pleiepengerbarn.uttak.regler.somArbeid import no.nav.pleiepengerbarn.uttak.regler.somUtbetalingsgrader import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Assertions.* +import org.junit.jupiter.api.Disabled import org.junit.jupiter.api.Test import java.time.Duration import java.time.LocalDate import java.util.* +@Disabled internal class BarnsDødRegelTest { private companion object { private val forventetGradVedAvkortingMotArbeid = Prosent(50)