Skip to content

Commit

Permalink
Koble sammen samordning og beregning av endelig sats
Browse files Browse the repository at this point in the history
Legger til en avklaring om både samording og 90% regel for barnetillegg treffer samtidig

Co-authored-by: Geir André Lund <[email protected]>
Co-authored-by: Richard Andre Martinsen <[email protected]>
Co-authored-by: Eivind Havnelid Røyrvik <[email protected]>
  • Loading branch information
4 people committed Nov 20, 2024
1 parent 5b6d9d8 commit 92a7698
Show file tree
Hide file tree
Showing 21 changed files with 323 additions and 302 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -121,4 +121,12 @@ object Avklaringspunkter {
beskrivelse = "Barn må godkjennes om de skal gi barnetillegg",
kanKvitteres = true,
)

val KombinasjonSamordningOg90Regel =
Avklaringkode(
kode = "KombinasjonSamordningOg90Regel",
tittel = "Det er en kombinasjon av samordning og 90% regel for barnetillegget",
beskrivelse = "Det må sjekkes at endelig sats blir riktig",
kanKvitteres = true,
)
}
25 changes: 5 additions & 20 deletions dagpenger/src/main/kotlin/no/nav/dagpenger/regel/Samordning.kt
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@ import no.nav.dagpenger.regel.Behov.Svangerskapspenger
import no.nav.dagpenger.regel.Behov.Sykepenger
import no.nav.dagpenger.regel.Behov.Uføre
import no.nav.dagpenger.regel.Søknadstidspunkt.prøvingsdato
import no.nav.dagpenger.regel.fastsetting.DagpengenesStørrelse
import no.nav.dagpenger.regel.fastsetting.DagpengenesStørrelse.avrundetDagsatsUtenBarnetillegg
import no.nav.dagpenger.regel.fastsetting.DagpengenesStørrelse.harBarnetillegg

/**
* § 4-25.Samordning med reduserte ytelser fra folketrygden, eller redusert avtalefestet pensjon
Expand All @@ -43,13 +44,9 @@ object Samordning {
internal val foreldrepengerDagsats = Opplysningstype.somBeløp("Foreldrepenger dagsats")
internal val svangerskapspengerDagsats = Opplysningstype.somBeløp("Svangerskapspenger dagsats")

private val avrundetDagsUtenBarnetillegg = DagpengenesStørrelse.avrundetDagsUtenBarnetillegg
private val sumAndreYtelser = Opplysningstype.somBeløp("Sum andre ytelser")
internal val samordnetDagsats = Opplysningstype.somBeløp("Samordnet dagsats")
private val kanUtbetale = Opplysningstype.somBoolsk("Samordnet dagsats er negativ eller 0")
private val barnetillegg = DagpengenesStørrelse.barnetillegg
private val harBarnetillegg = Opplysningstype.somBoolsk("Har barnetillegg")
private val barnetilleggetsStørrelse = DagpengenesStørrelse.barnetilleggetsStørrelse

// Fulle dagpenger minus en/flere av reduserte ytelsene man mottar per samme dag (regnestykket)
// avrundetDagsUtenBarnetillegg - sykepenger - pleiepenger - omsorgspenger - opplæringspenger - uføre - foreldrepenger - svangerskapspenger
Expand Down Expand Up @@ -87,22 +84,10 @@ object Samordning {
)
}

regel(samordnetDagsats) {
substraksjonTilNull(avrundetDagsUtenBarnetillegg, sumAndreYtelser)
}
regel(kanUtbetale) {
størreEnnEllerLik(avrundetDagsUtenBarnetillegg, sumAndreYtelser)
}
regel(harBarnetillegg) {
størreEnnEllerLik(barnetillegg, barnetilleggetsStørrelse)
}
regel(samordnetDagsats) { substraksjonTilNull(avrundetDagsatsUtenBarnetillegg, sumAndreYtelser) }
regel(kanUtbetale) { størreEnnEllerLik(avrundetDagsatsUtenBarnetillegg, sumAndreYtelser) }

regel(utfallEtterSamordning) {
enAv(
kanUtbetale,
harBarnetillegg,
)
}
regel(utfallEtterSamordning) { enAv(kanUtbetale, harBarnetillegg) }

regel(skalSamordnes) {
enAv(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import no.nav.dagpenger.regel.TapAvArbeidsinntektOgArbeidstid.TapArbeidstidBereg
import no.nav.dagpenger.regel.Verneplikt.VernepliktKontroll
import no.nav.dagpenger.regel.Virkningstidspunkt.VirkningstidspunktForLangtFramITid
import no.nav.dagpenger.regel.fastsetting.DagpengenesStørrelse.BarnetilleggKontroll
import no.nav.dagpenger.regel.fastsetting.DagpengenesStørrelse.NittiProsentOgSamordning
import java.time.LocalDate
import java.time.LocalDateTime
import java.util.UUID
Expand Down Expand Up @@ -113,6 +114,7 @@ class SøknadInnsendtHendelse(
InntektNesteKalendermånedKontroll,
JobbetUtenforNorgeKontroll,
MuligGjenopptakKontroll,
NittiProsentOgSamordning,
SkalSamordnes,
SvangerskapsrelaterteSykepengerKontroll,
SøknadstidspunktForLangtFramITid,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ internal class BeregningsperiodeFabrikk(
Arbeidsdag(
dato,
opplysninger
.finnOpplysning(DagpengenesStørrelse.sats)
.finnOpplysning(DagpengenesStørrelse.dagsatsEtterSamordningMedBarnetillegg)
.verdi.verdien
.toInt(),
opplysninger.finnOpplysning(TapAvArbeidsinntektOgArbeidstid.fastsattVanligArbeidstid).verdi / 5,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,13 @@ import no.nav.dagpenger.opplysning.regel.innhentMed
import no.nav.dagpenger.opplysning.regel.minstAv
import no.nav.dagpenger.opplysning.regel.multiplikasjon
import no.nav.dagpenger.opplysning.regel.oppslag
import no.nav.dagpenger.opplysning.regel.størreEnnEllerLik
import no.nav.dagpenger.opplysning.verdier.Beløp
import no.nav.dagpenger.regel.Avklaringspunkter.BarnMåGodkjennes
import no.nav.dagpenger.regel.Avklaringspunkter.KombinasjonSamordningOg90Regel
import no.nav.dagpenger.regel.Behov.Barnetillegg
import no.nav.dagpenger.regel.Samordning.samordnetDagsats
import no.nav.dagpenger.regel.Samordning.skalSamordnes
import no.nav.dagpenger.regel.Søknadstidspunkt.prøvingsdato
import no.nav.dagpenger.regel.Søknadstidspunkt.søknadIdOpplysningstype
import java.math.BigDecimal
Expand All @@ -35,51 +39,76 @@ object DagpengenesStørrelse {
*/
private val dekningsgrad = Opplysningstype.somDesimaltall("Dekningsgrad")
val dagsatsUtenBarnetillegg = Opplysningstype.somBeløp("Dagsats uten barnetillegg")
val avrundetDagsatsUtenBarnetillegg = Opplysningstype.somBeløp("Avrundet dagsats uten barnetillegg")
val avrundetDagsUtenBarnetillegg = Opplysningstype.somBeløp("Avrundet dagsats uten barnetillegg")
val avrundetDagsMedBarnetillegg = Opplysningstype.somBeløp("Avrundet dagsats med barnetillegg")
val barnetillegg = Opplysningstype.somBeløp("Barnetillegg i kroner")
val dagsatsMedBarn = Opplysningstype.somBeløp("Dagsats med barn")
val ukessats = Opplysningstype.somBeløp("Ukessats")
private val dagsatsMedBarn = Opplysningstype.somBeløp("Dagsats med barn")
private val maksGrunnlag = Opplysningstype.somBeløp("Maks grunnlag for dagpenger")
private val antallArbeidsdagerPerÅr = Opplysningstype.somHeltall("Antall arbeidsdager per år")
private val arbeidsdagerPerUke = Opplysningstype.somHeltall("Antall arbeidsdager per uke")
private val maksSats = Opplysningstype.somBeløp("Maks dagsats for dagpenger")
private val avrundetMaksSats = Opplysningstype.somBeløp("Avrundet maks dagsats for dagpenger")
private val nittiProsent = Opplysningstype.somDesimaltall("90% av grunnlag for dagpenger")
val sats = Opplysningstype.somBeløp("Dagsats for dagpenger med barnetillegg")
internal val harBarnetillegg = Opplysningstype.somBoolsk("Har barnetillegg")
val ukessats = Opplysningstype.somBeløp("Ukessats med barnetillegg etter samordning")
val dagsatsEtterSamordningMedBarnetillegg = Opplysningstype.somBeløp("Dagsats med barnetillegg etter samordning")

val regelsett =
Regelsett("§ 4-12. Dagpengenes størrelse\n (Sats)") {
regel(barn) { innhentMed(søknadIdOpplysningstype) }
regel(antallBarn) { antallAv(barn) { kvalifiserer } }

regel(barnetilleggetsStørrelse) { oppslag(prøvingsdato) { BarnetilleggSats.forDato(it) } }
regel(dekningsgrad) {
oppslag(prøvingsdato) { DagpengensStørrelseFaktor.forDato(it) }
}
// Regn ut dagsats uten barnetillegg, før samordning
regel(dekningsgrad) { oppslag(prøvingsdato) { DagpengensStørrelseFaktor.forDato(it) } }
regel(dagsatsUtenBarnetillegg) { multiplikasjon(grunnlag, dekningsgrad) }

// Avrunder og sender over til samordning
regel(avrundetDagsatsUtenBarnetillegg) { avrund(dagsatsUtenBarnetillegg) }

// Regn ut barnetillegg
regel(barnetilleggetsStørrelse) { oppslag(prøvingsdato) { BarnetilleggSats.forDato(it) } }
regel(barnetillegg) { multiplikasjon(barnetilleggetsStørrelse, antallBarn) }
regel(dagsatsMedBarn) { addisjon(dagsatsUtenBarnetillegg, barnetillegg) }

// Regne ut ukessats
regel(arbeidsdagerPerUke) { oppslag(prøvingsdato) { 5 } }
// Regn ut samordnet dagsats med barnetillegg
regel(dagsatsMedBarn) { addisjon(samordnetDagsats, barnetillegg) }

// Regn ut 90% av dagpengegrunnlaget
regel(nittiProsent) { oppslag(prøvingsdato) { 0.9 } }
regel(antallArbeidsdagerPerÅr) { oppslag(prøvingsdato) { 260 } }

regel(maksGrunnlag) { multiplikasjon(grunnlag, nittiProsent) }
regel(maksSats) { divisjon(maksGrunnlag, antallArbeidsdagerPerÅr) }
regel(sats) { minstAv(maksSats, dagsatsMedBarn) }
regel(avrundetMaksSats) { avrund(maksSats) }

regel(avrundetDagsMedBarnetillegg) { avrund(sats) }
regel(avrundetDagsUtenBarnetillegg) { avrund(dagsatsUtenBarnetillegg) } // Arena trenger denne
regel(ukessats) { multiplikasjon(avrundetDagsMedBarnetillegg, arbeidsdagerPerUke) }
// Regn ut samordnet dagsats med barnetillegg, begrenset til 90% av dagpengegrunnlaget
regel(dagsatsEtterSamordningMedBarnetillegg) { minstAv(avrundetMaksSats, dagsatsMedBarn) }

// regel(avrundetDagsMedBarnetillegg) { avrund(sats) }
// regel(avrundetDagsUtenBarnetillegg) { avrund(samordnetDagsats) }
// Arena trenger denne

// Regn ut ukessats
regel(arbeidsdagerPerUke) { oppslag(prøvingsdato) { 5 } }
regel(ukessats) { multiplikasjon(dagsatsEtterSamordningMedBarnetillegg, arbeidsdagerPerUke) }

regel(harBarnetillegg) { størreEnnEllerLik(barnetillegg, barnetilleggetsStørrelse) }
}

val ønsketResultat = listOf(ukessats, avrundetDagsUtenBarnetillegg)
val ønsketResultat = listOf(ukessats, samordnetDagsats)

val BarnetilleggKontroll =
Kontrollpunkt(BarnMåGodkjennes) {
it.har(barn) && it.finnOpplysning(barn).verdi.isNotEmpty()
}

val NittiProsentOgSamordning =
Kontrollpunkt(KombinasjonSamordningOg90Regel) {
it.har(skalSamordnes) &&
it.har(maksSats) &&
it.har(dagsatsMedBarn) &&
it.finnOpplysning(skalSamordnes).verdi &&
it.finnOpplysning(maksSats).verdi > it.finnOpplysning(dagsatsMedBarn).verdi
}
}

private object BarnetilleggSats {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import no.nav.dagpenger.regel.Søknadstidspunkt.prøvingsdato

object Egenandel {
val egenandel = Opplysningstype.somBeløp("Egenandel")
private val sats = DagpengenesStørrelse.avrundetDagsMedBarnetillegg
private val sats = DagpengenesStørrelse.dagsatsEtterSamordningMedBarnetillegg
private val faktor = Opplysningstype.somDesimaltall("Antall dagsats for egenandel")

val regelsett =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import no.nav.dagpenger.regel.beregning.Beregning.arbeidstimer
import no.nav.dagpenger.regel.beregning.Beregning.forbruk
import no.nav.dagpenger.regel.beregning.Beregning.terskel
import no.nav.dagpenger.regel.beregning.BeregningsperiodeFabrikk
import no.nav.dagpenger.regel.fastsetting.DagpengenesStørrelse.sats
import no.nav.dagpenger.regel.fastsetting.DagpengenesStørrelse.dagsatsEtterSamordningMedBarnetillegg
import no.nav.dagpenger.regel.fastsetting.Dagpengeperiode.antallStønadsuker
import no.nav.dagpenger.regel.fastsetting.Dagpengeperiode.gjenståendeStønadsdager
import no.nav.dagpenger.regel.fastsetting.Egenandel.egenandel
Expand Down Expand Up @@ -148,7 +148,7 @@ class BeregningSteg : No {
Faktum(antallStønadsuker, args["verdi"]!!.toInt(), gyldighetsperiode)
},
"Sats" to { args, gyldighetsperiode ->
Faktum(sats, Beløp(args["verdi"]!!.toInt()), gyldighetsperiode)
Faktum(dagsatsEtterSamordningMedBarnetillegg, Beløp(args["verdi"]!!.toInt()), gyldighetsperiode)
},
"FVA" to { args, gyldighetsperiode ->
Faktum(fastsattVanligArbeidstid, args["verdi"]!!.toDouble(), gyldighetsperiode)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,13 @@ import no.nav.dagpenger.regel.Søknadstidspunkt.prøvingsdato
import no.nav.dagpenger.regel.fastsetting.Dagpengegrunnlag
import no.nav.dagpenger.regel.fastsetting.DagpengenesStørrelse
import no.nav.dagpenger.regel.fastsetting.DagpengenesStørrelse.antallBarn
import no.nav.dagpenger.regel.fastsetting.DagpengenesStørrelse.avrundetDagsMedBarnetillegg
import no.nav.dagpenger.regel.fastsetting.DagpengenesStørrelse.dagsatsEtterSamordningMedBarnetillegg
import no.nav.dagpenger.regel.fastsetting.DagpengenesStørrelse.dagsatsUtenBarnetillegg
import no.nav.dagpenger.regel.fastsetting.DagpengenesStørrelse.ukessats

class DagpengensStørrelseSteg : No {
private val fraDato = 10.mai(2024)
private val regelsett = RegelverkDagpenger.regelsettFor(avrundetDagsMedBarnetillegg)
private val regelsett = RegelverkDagpenger.regelsettFor(ukessats)
private val opplysninger: Opplysninger = Opplysninger()
private lateinit var regelkjøring: Regelkjøring

Expand Down Expand Up @@ -52,7 +53,7 @@ class DagpengensStørrelseSteg : No {
}

Så("skal dagpengens størrelse være {string}") { størrelse: String ->
opplysninger.finnOpplysning(avrundetDagsMedBarnetillegg).verdi shouldBe Beløp(størrelse.toBigDecimal())
opplysninger.finnOpplysning(dagsatsEtterSamordningMedBarnetillegg).verdi shouldBe Beløp(størrelse.toBigDecimal())
}

Så("skal ukessats være {string}") { ukessats: String ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,7 @@ class EgenandelSteg : No {
opplysninger.leggTil(Faktum(prøvingsdato, fraDato)).also { regelkjøring.evaluer() }
opplysninger
.leggTil(
Faktum(
DagpengenesStørrelse.avrundetDagsMedBarnetillegg,
Beløp(sats.toBigDecimal()),
),
Faktum(DagpengenesStørrelse.dagsatsEtterSamordningMedBarnetillegg, Beløp(sats.toBigDecimal())),
).also { regelkjøring.evaluer() }
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,15 @@ import no.nav.dagpenger.regel.RegelverkDagpenger
import no.nav.dagpenger.regel.Samordning
import no.nav.dagpenger.regel.Søknadstidspunkt
import no.nav.dagpenger.regel.fastsetting.DagpengenesStørrelse
import no.nav.dagpenger.regel.fastsetting.DagpengenesStørrelse.avrundetDagsMedBarnetillegg
import no.nav.dagpenger.regel.fastsetting.DagpengenesStørrelse.ukessats
import java.time.LocalDate

class SamordningSteg : No {
private val fraDato = 10.mai(2022)
private val regelsett =
listOf(Samordning.regelsett) +
RegelverkDagpenger.regelsettFor(
avrundetDagsMedBarnetillegg,
)
RegelverkDagpenger.regelsettFor(
ukessats,
)
private val opplysninger: Opplysninger = Opplysninger()
private lateinit var regelkjøring: Regelkjøring

Expand All @@ -38,11 +37,11 @@ class SamordningSteg : No {
Gitt("at søker har søkt om dagpenger og har redusert ytelse") {
opplysninger
.leggTil(
Faktum<LocalDate>(Søknadstidspunkt.søknadsdato, 11.mai(2022)) as Opplysning<*>,
Faktum(Søknadstidspunkt.søknadsdato, 11.mai(2022)) as Opplysning<*>,
).also { regelkjøring.evaluer() }
opplysninger
.leggTil(
Faktum<LocalDate>(Søknadstidspunkt.ønsketdato, 11.mai(2022)) as Opplysning<*>,
Faktum(Søknadstidspunkt.ønsketdato, 11.mai(2022)) as Opplysning<*>,
).also { regelkjøring.evaluer() }
}

Expand All @@ -58,13 +57,13 @@ class SamordningSteg : No {
)
}

opplysninger.leggTil(Faktum<BarnListe>(DagpengenesStørrelse.barn, BarnListe(barn))).also { regelkjøring.evaluer() }
opplysninger.leggTil(Faktum(DagpengenesStørrelse.barn, BarnListe(barn))).also { regelkjøring.evaluer() }
}

Gitt("søker har redusert sykepenger {boolsk}") { sykepenger: Boolean ->
opplysninger
.leggTil(
Faktum<Boolean>(Samordning.sykepenger, sykepenger),
Faktum(Samordning.sykepenger, sykepenger),
).also {
regelkjøring.evaluer()
}
Expand All @@ -81,7 +80,7 @@ class SamordningSteg : No {
Gitt("søker har redusert pleiepenger {boolsk}") { pleiepenger: Boolean ->
opplysninger
.leggTil(
Faktum<Boolean>(Samordning.pleiepenger, pleiepenger),
Faktum(Samordning.pleiepenger, pleiepenger),
).also {
regelkjøring.evaluer()
}
Expand All @@ -90,7 +89,7 @@ class SamordningSteg : No {
Gitt("søker har redusert omsorgspenger {boolsk}") { omsorgspenger: Boolean ->
opplysninger
.leggTil(
Faktum<Boolean>(Samordning.omsorgspenger, omsorgspenger),
Faktum(Samordning.omsorgspenger, omsorgspenger),
).also {
regelkjøring.evaluer()
}
Expand All @@ -99,7 +98,7 @@ class SamordningSteg : No {
Gitt("søker har redusert opplæringspenger {boolsk}") { opplæringspenger: Boolean ->
opplysninger
.leggTil(
Faktum<Boolean>(Samordning.opplæringspenger, opplæringspenger),
Faktum(Samordning.opplæringspenger, opplæringspenger),
).also {
regelkjøring.evaluer()
}
Expand All @@ -108,7 +107,7 @@ class SamordningSteg : No {
Gitt("søker har redusert uføre {boolsk}") { uføre: Boolean ->
opplysninger
.leggTil(
Faktum<Boolean>(Samordning.uføre, uføre),
Faktum(Samordning.uføre, uføre),
).also {
regelkjøring.evaluer()
}
Expand All @@ -117,7 +116,7 @@ class SamordningSteg : No {
Gitt("søker har redusert foreldrepenger {boolsk}") { foreldrepenger: Boolean ->
opplysninger
.leggTil(
Faktum<Boolean>(Samordning.foreldrepenger, foreldrepenger),
Faktum(Samordning.foreldrepenger, foreldrepenger),
).also {
regelkjøring.evaluer()
}
Expand All @@ -126,7 +125,7 @@ class SamordningSteg : No {
Gitt("søker har redusert svangerskapspenger {boolsk}") { svangerskapspenger: Boolean ->
opplysninger
.leggTil(
Faktum<Boolean>(Samordning.svangerskapspenger, svangerskapspenger),
Faktum(Samordning.svangerskapspenger, svangerskapspenger),
).also {
regelkjøring.evaluer()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ Egenskap: § 4-12. Dagpengenes størrelse
skal dagpengens størrelse være "663"

Scenario: Dagpengegrunnlag og mange barn gjør at 90% regelen blir brukt
Gitt at dagpengegrunnlag er "70000"
Gitt at dagpengegrunnlag er "70001"
Og at søker har 7 barn
skal dagpengens uavrundet størrelse uten barnetillegg være "168"
skal dagpengens uavrundet størrelse uten barnetillegg være "168.0024"
skal dagpengens størrelse være "242"
skal ukessats være "1210"
Loading

0 comments on commit 92a7698

Please sign in to comment.