Skip to content

Commit

Permalink
Begrunnelse: støtt reduksjon fra forrige behandling på småbarnstillegg (
Browse files Browse the repository at this point in the history
#3878)

### 💰 Hva skal gjøres, og hvorfor?
Favro: NAV-13722

I første behandling har søker utvidet og overgangsstønad, og får
småbarnstillegg.
I revurdering fjernes overgangsstønaden og dermed småbarnstillegg, men
søker får fremdeles utvidet.
Vi ønsker å begrunne at søker ikke får småbarnstillegget allikevel - det
er en reduksjon fra forrige behandling.

I denne PR-en gjør vi to endringer:
1. Vi må oppdage at det er en reduksjon fra forrige behandling når minst
én av ytelsene personen vurderes for ikke lenger vurderes som innvilget.
2. Vi må finne reduksjon fra forrige behandling-begrunnelser som gjelder
småbarnstillegg, ikke tapte vilkår

### 🔎️ Er det noe spesielt du ønsker tilbakemelding om?
_Er det noe du er usikker på eller ønsker å diskutere? Beskriv det
gjerne her eller kommenter koden det gjelder._

### ✅ Checklist
_Har du husket alle punktene i listen?_
- [ ] Jeg har testet mine endringer i henhold til akseptansekriteriene
🕵️
- [ ] Jeg har config- eller sql-endringer. I så fall, husk manuell
deploy til miljø for å verifisere endringene.
- [x] Jeg har skrevet tester. 

### 💬 Ønsker du en muntlig gjennomgang?
- [ ] Ja
- [ ] Nei

---------

Co-authored-by: halvorbmundal <[email protected]>
Co-authored-by: Stig Strøm <[email protected]>
  • Loading branch information
3 people authored Sep 27, 2023
1 parent eaaa30c commit 94ba108
Show file tree
Hide file tree
Showing 6 changed files with 138 additions and 34 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -286,7 +286,14 @@ private fun SanityBegrunnelse.erGjeldendeForReduksjonFraForrigeBehandling(begrun

val begrunnelseGjelderMistedeVilkår = this.vilkår.all { it in vilkårMistetSidenForrigeBehandling }

return begrunnelseGjelderReduksjonFraForrigeBehandling() && begrunnelseGjelderMistedeVilkår
val haddeSmåbarnstilleggForrigeBehandling = begrunnelseGrunnlag.erSmåbarnstilleggIForrigeBehandlingPeriode
val harSmåbarnstilleggDennePerioden =
begrunnelseGrunnlag.dennePerioden.andeler.any { it.type == YtelseType.SMÅBARNSTILLEGG }

val begrunnelseGjelderTaptSmåbarnstillegg =
UtvidetBarnetrygdTrigger.SMÅBARNSTILLEGG in utvidetBarnetrygdTriggere && haddeSmåbarnstilleggForrigeBehandling && !harSmåbarnstilleggDennePerioden

return begrunnelseGjelderReduksjonFraForrigeBehandling() && (begrunnelseGjelderMistedeVilkår || begrunnelseGjelderTaptSmåbarnstillegg)
}

private fun SanityBegrunnelse.begrunnelseGjelderReduksjonFraForrigeBehandling() =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,3 @@ data class GrunnlagForGjeldendeOgForrigeBehandling(
val gjeldende: VedtaksperiodeGrunnlagForPerson?,
val erReduksjonSidenForrigeBehandling: Boolean = false,
)

fun erReduksjonSidenForrigeBehandling(
erInnvilget: Boolean,
erInnvilgetForrigePeriode: Boolean,
erInnvilgetIForrigeBehandling: Boolean,
erInnvilgetIForrigePeriodeIForrigeBehandling: Boolean,
): Boolean {
return !erInnvilget &&
!erInnvilgetForrigePeriode &&
erInnvilgetIForrigeBehandling &&
!erInnvilgetIForrigePeriodeIForrigeBehandling
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,14 @@ sealed interface VedtaksperiodeGrunnlagForPerson {

fun erInnvilget() = this is VedtaksperiodeGrunnlagForPersonVilkårInnvilget && this.erInnvilgetEndretUtbetaling()

fun hentInnvilgedeYtelsestyper() =
if (this is VedtaksperiodeGrunnlagForPersonVilkårInnvilget) {
this.andeler.filter { it.prosent > BigDecimal.ZERO }
.map { it.type }.toSet()
} else {
emptySet()
}

fun kopier(
person: Person = this.person,
vilkårResultaterForVedtaksperiode: List<VilkårResultatForVedtaksperiode> = this.vilkårResultaterForVedtaksperiode,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import no.nav.familie.ba.sak.kjerne.behandling.domene.BehandlingÅrsak.OMREGNING
import no.nav.familie.ba.sak.kjerne.behandling.domene.BehandlingÅrsak.OMREGNING_SMÅBARNSTILLEGG
import no.nav.familie.ba.sak.kjerne.behandling.domene.BehandlingÅrsak.SMÅBARNSTILLEGG
import no.nav.familie.ba.sak.kjerne.beregning.domene.AndelTilkjentYtelse
import no.nav.familie.ba.sak.kjerne.beregning.domene.YtelseType
import no.nav.familie.ba.sak.kjerne.tidslinje.Periode
import no.nav.familie.ba.sak.kjerne.tidslinje.Tidslinje
import no.nav.familie.ba.sak.kjerne.tidslinje.eksperimentelt.filtrer
Expand Down Expand Up @@ -279,34 +280,66 @@ private fun kombinerGjeldendeOgForrigeGrunnlag(
grunnlagTidslinjePerPerson.map { (aktørId, grunnlagstidslinje) ->
val grunnlagForrigeBehandling = grunnlagTidslinjePerPersonForrigeBehandling[aktørId]

val innvilgetForrigeBehandlingTidslinje =
grunnlagForrigeBehandling?.map { it?.erInnvilget() ?: false } ?: TomTidslinje()
val ytelsestyperInnvilgetForrigeBehandlingTidslinje =
grunnlagForrigeBehandling?.map { it?.hentInnvilgedeYtelsestyper() } ?: TomTidslinje()

val grunnlagTidslinjeMedErForrigeBehandlingInnvilget =
grunnlagstidslinje.kombinerMed(innvilgetForrigeBehandlingTidslinje) { gjeldende, erForrigeInnvilget ->
Pair(gjeldende, erForrigeInnvilget)
val grunnlagTidslinjeMedInnvilgedeYtelsestyperForrigeBehandling =
grunnlagstidslinje.kombinerMed(ytelsestyperInnvilgetForrigeBehandlingTidslinje) { gjeldendePeriode, innvilgedeYtelsestyperForrigeBehandling ->
GjeldendeMedInnvilgedeYtelsestyperForrigeBehandling(
gjeldendePeriode,
innvilgedeYtelsestyperForrigeBehandling,
)
}

grunnlagTidslinjeMedErForrigeBehandlingInnvilget.zipMedNeste(ZipPadding.FØR)
grunnlagTidslinjeMedInnvilgedeYtelsestyperForrigeBehandling.zipMedNeste(ZipPadding.FØR)
.map {
val forrigePeriode = it?.first?.first
val erForrigePeriodeInnvilgetIForrigeBehandling = it?.first?.second ?: false
val gjeldende = it?.second?.first
val erGjeldendePeriodeInnvilgetIForrigeBehandling = it?.second?.second ?: false
val forrigePeriode = it?.first
val gjeldende = it?.second

val erReduksjonFraForrigeBehandlingPåMinstEnYtelsestype =
erReduksjonFraForrigeBehandlingPåMinstEnYtelsestype(
innvilgedeYtelsestyperForrigePeriode = forrigePeriode?.grunnlagForPerson?.hentInnvilgedeYtelsestyper(),
innvilgedeYtelsestyperForrigePeriodeForrigeBehandling = forrigePeriode?.innvilgedeYtelsestyperForrigeBehandling,
innvilgedeYtelsestyperDennePerioden = gjeldende?.grunnlagForPerson?.hentInnvilgedeYtelsestyper(),
innvilgedeYtelsestyperDennePeriodenForrigeBehandling = gjeldende?.innvilgedeYtelsestyperForrigeBehandling,
)

GrunnlagForGjeldendeOgForrigeBehandling(
gjeldende = gjeldende,
erReduksjonSidenForrigeBehandling =
erReduksjonSidenForrigeBehandling(
gjeldende?.erInnvilget() ?: false,
forrigePeriode?.erInnvilget() ?: false,
erGjeldendePeriodeInnvilgetIForrigeBehandling,
erForrigePeriodeInnvilgetIForrigeBehandling,
),
gjeldende = gjeldende?.grunnlagForPerson,
erReduksjonSidenForrigeBehandling = erReduksjonFraForrigeBehandlingPåMinstEnYtelsestype,

)
}.slåSammenLike().slåSammenSammenhengendeOpphørsPerioder()
}.slåSammenSammenhengendeOpphørsPerioder()
}

data class GjeldendeMedInnvilgedeYtelsestyperForrigeBehandling(
val grunnlagForPerson: VedtaksperiodeGrunnlagForPerson?,
val innvilgedeYtelsestyperForrigeBehandling: Set<YtelseType>?,
)

private fun erReduksjonFraForrigeBehandlingPåMinstEnYtelsestype(
innvilgedeYtelsestyperForrigePeriode: Set<YtelseType>?,
innvilgedeYtelsestyperForrigePeriodeForrigeBehandling: Set<YtelseType>?,
innvilgedeYtelsestyperDennePerioden: Set<YtelseType>?,
innvilgedeYtelsestyperDennePeriodenForrigeBehandling: Set<YtelseType>?,
): Boolean {
return YtelseType.values().any { ytelseType ->
val ytelseInnvilgetDennePerioden =
innvilgedeYtelsestyperDennePerioden?.contains(ytelseType) ?: false
val ytelseInnvilgetForrigePeriode =
innvilgedeYtelsestyperForrigePeriode?.contains(ytelseType) ?: false
val ytelseInnvilgetDennePeriodenForrigeBehandling =
innvilgedeYtelsestyperDennePeriodenForrigeBehandling?.contains(ytelseType) ?: false
val ytelseInnvilgetForrigePeriodeForrigeBehandling =
innvilgedeYtelsestyperForrigePeriodeForrigeBehandling?.contains(ytelseType) ?: false

!ytelseInnvilgetForrigePeriode &&
!ytelseInnvilgetDennePerioden &&
!ytelseInnvilgetForrigePeriodeForrigeBehandling &&
ytelseInnvilgetDennePeriodenForrigeBehandling
}
}

private fun Tidslinje<GrunnlagForGjeldendeOgForrigeBehandling, Måned>.slåSammenSammenhengendeOpphørsPerioder(): Tidslinje<GrunnlagForGjeldendeOgForrigeBehandling, Måned> {
val perioder = this.perioder().sortedBy { it.fraOgMed }.toList()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -247,7 +247,7 @@ class BegrunnelseTeksterStepDefinition {
kompetanser = kompetanser[forrigeBehandlingId] ?: emptyList(),
endredeUtbetalinger = endredeUtbetalinger[forrigeBehandlingId] ?: emptyList(),
andelerTilkjentYtelse = andelerTilkjentYtelse[forrigeBehandlingId] ?: emptyList(),
perioderOvergangsstønad = emptyList(),
perioderOvergangsstønad = overgangsstønadForVedtaksperiode[forrigeBehandlingId] ?: emptyList(),
uregistrerteBarn = emptyList(),
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -115,11 +115,79 @@ Egenskap: Reduksjon fra forrige behandling
| 01.08.2028 | 31.07.2040 | UTBETALING_MED_REDUKSJON_FRA_SIST_IVERKSATTE_BEHANDLING | | REDUKSJON_SØKER_ER_GIFT | |
| 01.08.2040 | | OPPHØR | | | |

Scenario: Skal få reduksjon fra forrige behandling-begrunnelser knyttet til bor fast hos søker for det ene barnet
Scenario: Skal få reduksjon fra forrige behandling-begrunnelse knyttet til småbarnstillegg når overgangsstønad forsvinner
Gitt følgende fagsaker for begrunnelse
| FagsakId | Fagsaktype |
| 1 | NORMAL |

Gitt følgende behandling
| BehandlingId | FagsakId | ForrigeBehandlingId | Behandlingsresultat | Behandlingsårsak |
| 1 | 1 | | INNVILGET | SØKNAD |
| 2 | 1 | 1 | ENDRET_UTBETALING | SMÅBARNSTILLEGG |

Og følgende persongrunnlag for begrunnelse
| BehandlingId | AktørId | Persontype | Fødselsdato |
| 1 | 1234 | SØKER | 19.11.1984 |
| 1 | 3456 | BARN | 26.08.2016 |
| 2 | 1234 | SØKER | 19.11.1984 |
| 2 | 3456 | BARN | 26.08.2016 |


Og følgende dagens dato 17.09.2023
Og lag personresultater for begrunnelse for behandling 1
Og lag personresultater for begrunnelse for behandling 2

Og legg til nye vilkårresultater for begrunnelse for behandling 1
| AktørId | Vilkår | Utdypende vilkår | Fra dato | Til dato | Resultat | Er eksplisitt avslag |
| 1234 | LOVLIG_OPPHOLD,BOSATT_I_RIKET | | 19.11.1984 | | OPPFYLT | Nei |
| 1234 | UTVIDET_BARNETRYGD | | 26.08.2016 | | OPPFYLT | Nei |

| 3456 | LOVLIG_OPPHOLD,BOR_MED_SØKER,GIFT_PARTNERSKAP | | 26.08.2016 | | OPPFYLT | Nei |
| 3456 | BOSATT_I_RIKET | | 26.08.2016 | 31.12.2018 | OPPFYLT | Nei |
| 3456 | UNDER_18_ÅR | | 26.08.2016 | 25.08.2034 | OPPFYLT | Nei |

Og legg til nye vilkårresultater for begrunnelse for behandling 2
| AktørId | Vilkår | Utdypende vilkår | Fra dato | Til dato | Resultat | Er eksplisitt avslag |
| 1234 | LOVLIG_OPPHOLD,BOSATT_I_RIKET | | 19.11.1984 | | OPPFYLT | Nei |
| 1234 | UTVIDET_BARNETRYGD | | 26.08.2016 | | OPPFYLT | Nei |

| 3456 | LOVLIG_OPPHOLD,BOR_MED_SØKER,GIFT_PARTNERSKAP | | 26.08.2016 | | OPPFYLT | Nei |
| 3456 | BOSATT_I_RIKET | | 26.08.2016 | 31.12.2018 | OPPFYLT | Nei |
| 3456 | UNDER_18_ÅR | | 26.08.2016 | 25.08.2034 | OPPFYLT | Nei |

Og med andeler tilkjent ytelse for begrunnelse
| AktørId | BehandlingId | Fra dato | Til dato | Beløp | Ytelse type | Prosent | Sats |
| 1234 | 1 | 01.09.2016 | 31.12.2018 | 1054 | UTVIDET_BARNETRYGD | 100 | 1054 |
| 1234 | 1 | 01.04.2017 | 31.12.2018 | 660 | SMÅBARNSTILLEGG | 100 | 660 |

| 3456 | 1 | 01.09.2016 | 31.12.2018 | 1054 | ORDINÆR_BARNETRYGD | 100 | 1054 |

| 1234 | 2 | 01.09.2016 | 31.12.2018 | 1054 | UTVIDET_BARNETRYGD | 100 | 1054 |

| 3456 | 2 | 01.09.2016 | 31.12.2018 | 1054 | ORDINÆR_BARNETRYGD | 100 | 1054 |

Og med overgangsstønad for begrunnelse
| AktørId | BehandlingId | Fra dato | Til dato |
| 3456 | 1 | 01.04.2017 | 30.06.2017 |
| 3456 | 1 | 01.07.2017 | 30.09.2017 |
| 3456 | 1 | 01.10.2017 | 31.12.2017 |
| 3456 | 1 | 01.01.2018 | 31.03.2018 |
| 3456 | 1 | 01.04.2018 | 30.06.2018 |
| 3456 | 1 | 01.07.2018 | 30.09.2018 |
| 3456 | 1 | 01.10.2018 | 31.12.2018 |

Når begrunnelsetekster genereres for behandling 2

forvent følgende standardBegrunnelser
| Fra dato | Til dato | VedtaksperiodeType | Regelverk | Inkluderte Begrunnelser | Ekskluderte Begrunnelser |
| 01.04.2017 | 31.12.2018 | UTBETALING_MED_REDUKSJON_FRA_SIST_IVERKSATTE_BEHANDLING | | SMÅBARNSTILLEGG_HADDE_IKKE_FULL_OVERGANGSSTØNAD | |
| 01.01.2019 | | OPPHØR | | | |

Scenario: Skal få reduksjon fra forrige behandling-begrunnelser knyttet til bor fast hos søker for det ene barnet
Gitt følgende fagsaker for begrunnelse
| FagsakId | Fagsaktype |
| 1 | NORMAL |

Gitt følgende behandling
| BehandlingId | FagsakId | ForrigeBehandlingId | Behandlingsresultat | Behandlingsårsak |
| 1 | 1 | | INNVILGET | SØKNAD |
Expand Down

0 comments on commit 94ba108

Please sign in to comment.