Skip to content

Commit

Permalink
Alternativ håndtering av barns død. Forutsetter nå at saksbehandler l… (
Browse files Browse the repository at this point in the history
#237)

* Alternativ håndtering av barns død. Forutsetter nå at saksbehandler legger på søknadsperiode.

* Tester + feilretting på knekkpunkt.
  • Loading branch information
frodeli authored Jul 2, 2021
1 parent d6a97d6 commit 1201b1e
Show file tree
Hide file tree
Showing 7 changed files with 118 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Original file line number Diff line number Diff line change
Expand Up @@ -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<Knekkpunkt>()
knekkpunkMap.forEach { (key, value) ->
Expand All @@ -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<LukketPeriode>) {
kravprioritetsperioder.forEach { finnForPeriode(knekkpunktMap, it, KnekkpunktType.KRAVPRIORITETSPERIODE)}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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<SøktUttak,Set<KnekkpunktType>>) : Uttaksplan {
Expand All @@ -33,27 +34,36 @@ 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(
perioder: MutableMap<LukketPeriode, UttaksperiodeInfo>,
ktUttaksperiode: LukketPeriode,
grunnlag: RegelGrunnlag,
knekkpunktTyper: Set<KnekkpunktType>,
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),
Expand All @@ -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,
Expand Down
Original file line number Diff line number Diff line change
@@ -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()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -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()
)
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down

0 comments on commit 1201b1e

Please sign in to comment.