diff --git a/bidrag-beregn-barnebidrag/src/main/kotlin/no/nav/bidrag/beregn/barnebidrag/beregning/NettoTilsynsutgiftBeregning.kt b/bidrag-beregn-barnebidrag/src/main/kotlin/no/nav/bidrag/beregn/barnebidrag/beregning/NettoTilsynsutgiftBeregning.kt index 5dd8892b..c7bd2884 100644 --- a/bidrag-beregn-barnebidrag/src/main/kotlin/no/nav/bidrag/beregn/barnebidrag/beregning/NettoTilsynsutgiftBeregning.kt +++ b/bidrag-beregn-barnebidrag/src/main/kotlin/no/nav/bidrag/beregn/barnebidrag/beregning/NettoTilsynsutgiftBeregning.kt @@ -10,7 +10,7 @@ import java.math.BigDecimal import java.math.MathContext import java.math.RoundingMode internal data class SkattefradragBeregningResultat( - val antallBarn: Int, + val antallBarnBeregnet: Int, val skattefradrag: BigDecimal, val skattefradragPerBarn: BigDecimal, val skattefradragTotalTilsynsutgift: BigDecimal = BigDecimal.ZERO, @@ -21,10 +21,6 @@ internal object NettoTilsynsutgiftBeregning { // sjablon maks tilsynsbeløp, skal beløpene justeres forholdsmessig. fun beregn(grunnlag: NettoTilsynsutgiftBeregningGrunnlag): NettoTilsynsutgiftBeregningResultat { - // Henter antall barn i perioden. Dette skal være antall BMs barn under 12 år. i første versjon så må det legges inn perioder med faktiske - // utgifter for alle barn. I neste versjon så skal alle BMs barn ligge i grunnlaget (grunnlag.barnBMListe), og antall barn telles derfra. - val antallBarnBM = maxOf(grunnlag.faktiskUtgiftListe.distinctBy { it.gjelderBarn }.size, grunnlag.barnBMListeUnderTolvÅr.size) - val sjablonSkattAlminneligInntektProsent = grunnlag.sjablonSjablontallBeregningGrunnlagListe .firstOrNull { it.type == SjablonTallNavn.SKATT_ALMINNELIG_INNTEKT_PROSENT.navn } @@ -46,7 +42,7 @@ internal object NettoTilsynsutgiftBeregning { val skattefradragResultat = if (totalTilsynsutgift > BigDecimal.ZERO) { beregnFradragsbeløpPerBarn( - antallBarnIPerioden = antallBarnBM, + antallBarnBeregnet = grunnlag.antallBarnBMBeregnet, totalTilsynsutgift = minOf(totalTilsynsutgift, sjablonMaksTilsynsutgift), sjablonSkattesatsAlminneligInntektProsent = sjablonSkattAlminneligInntektProsent.verdi.toBigDecimal(), sjablonMaksFradragsbeløp = sjablonMaksFradragsbeløp, @@ -55,7 +51,7 @@ internal object NettoTilsynsutgiftBeregning { SkattefradragBeregningResultat( skattefradrag = BigDecimal.ZERO, skattefradragPerBarn = BigDecimal.ZERO, - antallBarn = antallBarnBM, + antallBarnBeregnet = grunnlag.antallBarnBMBeregnet, ) } @@ -131,7 +127,8 @@ internal object NettoTilsynsutgiftBeregning { nettoTilsynsutgift = (justertBruttoTilsynsutgifterBeløpSøknadsbarn - skattefradragResultat.skattefradragPerBarn).avrundetMedToDesimaler .coerceAtLeast(BigDecimal.ZERO), tilsynsutgiftBarnListe = tilsynsutgiftBarnListe, - antallBarn = skattefradragResultat.antallBarn, + antallBarnBMBeregnet = skattefradragResultat.antallBarnBeregnet, + antallBarnBMUnderTolvÅr = grunnlag.barnBMListeUnderTolvÅr.size, grunnlagsreferanseListe = listOfNotNull( grunnlag.barnBMListe.map { it.referanse }, grunnlag.faktiskUtgiftListe.map { it.referanse }, @@ -146,7 +143,7 @@ internal object NettoTilsynsutgiftBeregning { } private fun beregnFradragsbeløpPerBarn( - antallBarnIPerioden: Int, + antallBarnBeregnet: Int, totalTilsynsutgift: BigDecimal, sjablonSkattesatsAlminneligInntektProsent: BigDecimal, sjablonMaksFradragsbeløp: BigDecimal, @@ -156,13 +153,13 @@ internal object NettoTilsynsutgiftBeregning { val skattefradragTotalTilsynsutgift = totalTilsynsutgift.multiply(skattesatsFaktor, MathContext(10, RoundingMode.HALF_UP)) val skattefradrag = minOf(skattefradragTotalTilsynsutgift, maksFradragsbeløp) - val skattefradragPerBarn = skattefradrag.divide(antallBarnIPerioden.toBigDecimal(), MathContext(10, RoundingMode.HALF_UP)) + val skattefradragPerBarn = skattefradrag.divide(antallBarnBeregnet.toBigDecimal(), MathContext(10, RoundingMode.HALF_UP)) return SkattefradragBeregningResultat( skattefradrag = skattefradrag, skattefradragPerBarn = skattefradragPerBarn, skattefradragMaksfradrag = maksFradragsbeløp, skattefradragTotalTilsynsutgift = skattefradragTotalTilsynsutgift, - antallBarn = antallBarnIPerioden, + antallBarnBeregnet = antallBarnBeregnet, ) } } diff --git a/bidrag-beregn-barnebidrag/src/main/kotlin/no/nav/bidrag/beregn/barnebidrag/bo/NettoTilsynsutgiftBO.kt b/bidrag-beregn-barnebidrag/src/main/kotlin/no/nav/bidrag/beregn/barnebidrag/bo/NettoTilsynsutgiftBO.kt index a61c1c50..3e8ae6f0 100644 --- a/bidrag-beregn-barnebidrag/src/main/kotlin/no/nav/bidrag/beregn/barnebidrag/bo/NettoTilsynsutgiftBO.kt +++ b/bidrag-beregn-barnebidrag/src/main/kotlin/no/nav/bidrag/beregn/barnebidrag/bo/NettoTilsynsutgiftBO.kt @@ -31,6 +31,7 @@ data class NettoTilsynsutgiftBeregningGrunnlag( val søknadsbarnReferanse: String, val barnBMListe: List, val barnBMListeUnderTolvÅr: List, + val antallBarnBMBeregnet: Int, val faktiskUtgiftListe: List, val tilleggsstønad: Tilleggsstønad?, val sjablonSjablontallBeregningGrunnlagListe: List, @@ -50,7 +51,8 @@ data class NettoTilsynsutgiftBeregningResultat( val bruttoTilsynsutgift: BigDecimal, val justertBruttoTilsynsutgift: BigDecimal, val andelTilsynsutgiftFaktor: BigDecimal, - val antallBarn: Int, + val antallBarnBMBeregnet: Int, + val antallBarnBMUnderTolvÅr: Int, val skattefradrag: BigDecimal, val skattefradragPerBarn: BigDecimal, val skattefradragTotalTilsynsutgift: BigDecimal = BigDecimal.ZERO, diff --git a/bidrag-beregn-barnebidrag/src/main/kotlin/no/nav/bidrag/beregn/barnebidrag/mapper/NettoTilsynsutgiftMapper.kt b/bidrag-beregn-barnebidrag/src/main/kotlin/no/nav/bidrag/beregn/barnebidrag/mapper/NettoTilsynsutgiftMapper.kt index 68d9edff..461bf8f2 100644 --- a/bidrag-beregn-barnebidrag/src/main/kotlin/no/nav/bidrag/beregn/barnebidrag/mapper/NettoTilsynsutgiftMapper.kt +++ b/bidrag-beregn-barnebidrag/src/main/kotlin/no/nav/bidrag/beregn/barnebidrag/mapper/NettoTilsynsutgiftMapper.kt @@ -178,4 +178,10 @@ internal object NettoTilsynsutgiftMapper : CoreMapper() { fun beregnMånedsbeløpTilleggsstønad(beløpDagsats: BigDecimal): BigDecimal = beløpDagsats.multiply(BigDecimal.valueOf(260)).divide(BigDecimal.valueOf(12), 10, RoundingMode.HALF_UP).coerceAtLeast(BigDecimal.ZERO) + + fun beregnAntallBarnBM(barnBMListeUnderTolvÅr: List, barnMedUtgifterReferanseListe: List): Int { + val barnUnderTolvÅrReferanser = barnBMListeUnderTolvÅr.map { it.referanse } + val antallBarnMedUtgifterOgBMsBarnIPeriode = (barnMedUtgifterReferanseListe + barnUnderTolvÅrReferanser).toSet().size + return maxOf(antallBarnMedUtgifterOgBMsBarnIPeriode, barnBMListeUnderTolvÅr.size) + } } diff --git a/bidrag-beregn-barnebidrag/src/main/kotlin/no/nav/bidrag/beregn/barnebidrag/service/BeregnNettoTilsynsutgiftService.kt b/bidrag-beregn-barnebidrag/src/main/kotlin/no/nav/bidrag/beregn/barnebidrag/service/BeregnNettoTilsynsutgiftService.kt index b91941ea..7bfce8c7 100644 --- a/bidrag-beregn-barnebidrag/src/main/kotlin/no/nav/bidrag/beregn/barnebidrag/service/BeregnNettoTilsynsutgiftService.kt +++ b/bidrag-beregn-barnebidrag/src/main/kotlin/no/nav/bidrag/beregn/barnebidrag/service/BeregnNettoTilsynsutgiftService.kt @@ -12,6 +12,7 @@ import no.nav.bidrag.beregn.barnebidrag.bo.SjablonMaksTilsynsbeløpBeregningGrun import no.nav.bidrag.beregn.barnebidrag.bo.SjablonSjablontallBeregningGrunnlag import no.nav.bidrag.beregn.barnebidrag.bo.SjablonSjablontallPeriodeGrunnlag import no.nav.bidrag.beregn.barnebidrag.bo.Tilleggsstønad +import no.nav.bidrag.beregn.barnebidrag.mapper.NettoTilsynsutgiftMapper.beregnAntallBarnBM import no.nav.bidrag.beregn.barnebidrag.mapper.NettoTilsynsutgiftMapper.finnReferanseTilRolle import no.nav.bidrag.beregn.barnebidrag.mapper.NettoTilsynsutgiftMapper.mapNettoTilsynsutgiftPeriodeGrunnlag import no.nav.bidrag.beregn.core.dto.FaktiskUtgiftPeriodeCore @@ -53,16 +54,15 @@ internal object BeregnNettoTilsynsutgiftService : BeregnService() { bruddPeriodeListe.forEach { bruddPeriode -> // Teller antall barn i perioden. Hvis antall er null så gjøres det ingen beregning - val antallBarnMedUtgifterIPerioden = nettoTilsynsutgiftPeriodeGrunnlag.faktiskUtgiftPeriodeCoreListe + val barnMedUtgifterIPerioden = nettoTilsynsutgiftPeriodeGrunnlag.faktiskUtgiftPeriodeCoreListe .filter { ÅrMånedsperiode(it.periode.datoFom, it.periode.datoTil).inneholder(bruddPeriode) } .distinctBy { it.gjelderBarn } - .size - if (antallBarnMedUtgifterIPerioden > 0) { + if (barnMedUtgifterIPerioden.isNotEmpty()) { val nettoTilsynsutgiftBeregningGrunnlag = lagNettoTilsynsutgiftBeregningGrunnlag( nettoTilsynsutgiftPeriodeGrunnlag, bruddPeriode, - antallBarnMedUtgifterIPerioden, + barnMedUtgifterIPerioden, ) nettoTilsynsutgiftBeregningResultatListe.add( NettoTilsynsutgiftPeriodeResultat( @@ -144,16 +144,17 @@ internal object BeregnNettoTilsynsutgiftService : BeregnService() { private fun lagNettoTilsynsutgiftBeregningGrunnlag( grunnlag: NettoTilsynsutgiftPeriodeGrunnlag, bruddPeriode: ÅrMånedsperiode, - antallBarnMedUtgifterIPerioden: Int, + barnMedUtgifterIPerioden: List, ): NettoTilsynsutgiftBeregningGrunnlag { - // I første versjon må det legges inn faktiske utgifter for alle BMs barn under 12 år. I neste versjon skal alle BMs barn ligge i barnBMListe - // og denne vil da gi grunnlaget for å telle antall barn i perioden. - val antallBarnBMUnderTolvÅr = maxOf(antallBarnMedUtgifterIPerioden, barnUnderTolvÅr(grunnlag.barnBMListe, bruddPeriode.fom).size) + val barnBMListeUnderTolvÅr = barnUnderTolvÅr(grunnlag.barnBMListe, bruddPeriode.fom) + val barnMedUtgifterReferanser = barnMedUtgifterIPerioden.map { it.gjelderBarn } + val antallBarnBMBeregnet = beregnAntallBarnBM(barnBMListeUnderTolvÅr, barnMedUtgifterReferanser) val respons = NettoTilsynsutgiftBeregningGrunnlag( søknadsbarnReferanse = grunnlag.søknadsbarnReferanse, barnBMListe = grunnlag.barnBMListe, - barnBMListeUnderTolvÅr = barnUnderTolvÅr(grunnlag.barnBMListe, bruddPeriode.fom), + antallBarnBMBeregnet = antallBarnBMBeregnet, + barnBMListeUnderTolvÅr = barnBMListeUnderTolvÅr, faktiskUtgiftListe = grunnlag.faktiskUtgiftPeriodeCoreListe .filter { ÅrMånedsperiode(it.periode.datoFom, it.periode.datoTil).inneholder(bruddPeriode) } .map { @@ -188,7 +189,7 @@ internal object BeregnNettoTilsynsutgiftService : BeregnService() { .asSequence() .filter { it.sjablonMaksTilsynsbeløpPeriode.periode.inneholder(bruddPeriode) } .sortedBy { it.sjablonMaksTilsynsbeløpPeriode.antallBarnTom } - .filter { it.sjablonMaksTilsynsbeløpPeriode.antallBarnTom >= antallBarnBMUnderTolvÅr } + .filter { it.sjablonMaksTilsynsbeløpPeriode.antallBarnTom >= antallBarnBMBeregnet } .map { SjablonMaksTilsynsbeløpBeregningGrunnlag( referanse = it.referanse, @@ -201,7 +202,7 @@ internal object BeregnNettoTilsynsutgiftService : BeregnService() { .asSequence() .filter { it.sjablonMaksFradragsbeløpPeriode.periode.inneholder(bruddPeriode) } .sortedBy { it.sjablonMaksFradragsbeløpPeriode.antallBarnTom } - .filter { it.sjablonMaksFradragsbeløpPeriode.antallBarnTom >= antallBarnBMUnderTolvÅr } + .filter { it.sjablonMaksFradragsbeløpPeriode.antallBarnTom >= antallBarnBMBeregnet } .map { SjablonMaksFradragsbeløpBeregningGrunnlag( referanse = it.referanse, @@ -278,7 +279,8 @@ internal object BeregnNettoTilsynsutgiftService : BeregnService() { justertBruttoTilsynsutgift = it.resultat.justertBruttoTilsynsutgift, andelTilsynsutgiftFaktor = it.resultat.andelTilsynsutgiftFaktor, skattefradrag = it.resultat.skattefradrag, - antallBarnBMUnderTolvÅr = it.resultat.antallBarn, + antallBarnBMUnderTolvÅr = it.resultat.antallBarnBMUnderTolvÅr, + antallBarnBMBeregnet = it.resultat.antallBarnBMBeregnet, nettoTilsynsutgift = it.resultat.nettoTilsynsutgift, tilsynsutgiftBarnListe = it.resultat.tilsynsutgiftBarnListe, erBegrensetAvMaksTilsyn = it.resultat.erBegrensetAvMaksTilsyn, diff --git a/bidrag-beregn-barnebidrag/src/test/resources/testfiler/nettotilsynsutgift/nettotilsynsutgift_eksempel_flere_perioder.json b/bidrag-beregn-barnebidrag/src/test/resources/testfiler/nettotilsynsutgift/nettotilsynsutgift_eksempel_flere_perioder.json index 7c2c85ed..689f9640 100644 --- a/bidrag-beregn-barnebidrag/src/test/resources/testfiler/nettotilsynsutgift/nettotilsynsutgift_eksempel_flere_perioder.json +++ b/bidrag-beregn-barnebidrag/src/test/resources/testfiler/nettotilsynsutgift/nettotilsynsutgift_eksempel_flere_perioder.json @@ -106,7 +106,7 @@ "gjelderReferanse": "Person_Bidragsmottaker" }, { - "referanse": "Mottatt_FaktiskUtgift_202301_person_PERSON_BARN_BIDRAGSMOTTAKER_20151217_102", + "referanse": "Mottatt_FaktiskUtgift_202301_person_PERSON_BARN_BIDRAGSMOTTAKER_20151217_101", "type": "FAKTISK_UTGIFT_PERIODE", "innhold": { "periode": { @@ -119,7 +119,7 @@ "manueltRegistrert": false }, "grunnlagsreferanseListe": [], - "gjelderBarnReferanse": "person_PERSON_BARN_BIDRAGSMOTTAKER_20151217_102", + "gjelderBarnReferanse": "person_PERSON_BARN_BIDRAGSMOTTAKER_20151217_101", "gjelderReferanse": "Person_Bidragsmottaker" }, { diff --git a/pom.xml b/pom.xml index 8f97db89..68239882 100644 --- a/pom.xml +++ b/pom.xml @@ -19,7 +19,7 @@ 2.18.2 5.9.1 2.2.27 - 2024.12.19.141921 + 2024.12.31.102412 1.4.1 3.3.5 7.0.3