Skip to content

Commit

Permalink
Beregnet antall barn BM i perioden (#438)
Browse files Browse the repository at this point in the history
* Beregnet antall barn BM i perioden

* Beregnet antall barn BM i perioden
  • Loading branch information
ugur93 authored Dec 31, 2024
1 parent 77f250f commit 7df3939
Show file tree
Hide file tree
Showing 6 changed files with 34 additions and 27 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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 }
Expand All @@ -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,
Expand All @@ -55,7 +51,7 @@ internal object NettoTilsynsutgiftBeregning {
SkattefradragBeregningResultat(
skattefradrag = BigDecimal.ZERO,
skattefradragPerBarn = BigDecimal.ZERO,
antallBarn = antallBarnBM,
antallBarnBeregnet = grunnlag.antallBarnBMBeregnet,
)
}

Expand Down Expand Up @@ -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 },
Expand All @@ -146,7 +143,7 @@ internal object NettoTilsynsutgiftBeregning {
}

private fun beregnFradragsbeløpPerBarn(
antallBarnIPerioden: Int,
antallBarnBeregnet: Int,
totalTilsynsutgift: BigDecimal,
sjablonSkattesatsAlminneligInntektProsent: BigDecimal,
sjablonMaksFradragsbeløp: BigDecimal,
Expand All @@ -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,
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ data class NettoTilsynsutgiftBeregningGrunnlag(
valknadsbarnReferanse: String,
val barnBMListe: List<BarnBM>,
val barnBMListeUnderTolvÅr: List<BarnBM>,
val antallBarnBMBeregnet: Int,
val faktiskUtgiftListe: List<FaktiskUtgift>,
val tilleggsstønad: Tilleggsstønad?,
val sjablonSjablontallBeregningGrunnlagListe: List<SjablonSjablontallBeregningGrunnlag>,
Expand All @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<BarnBM>, barnMedUtgifterReferanseListe: List<Grunnlagsreferanse>): Int {
val barnUnderTolvÅrReferanser = barnBMListeUnderTolvÅr.map { it.referanse }
val antallBarnMedUtgifterOgBMsBarnIPeriode = (barnMedUtgifterReferanseListe + barnUnderTolvÅrReferanser).toSet().size
return maxOf(antallBarnMedUtgifterOgBMsBarnIPeriode, barnBMListeUnderTolvÅr.size)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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(
Expand Down Expand Up @@ -144,16 +144,17 @@ internal object BeregnNettoTilsynsutgiftService : BeregnService() {
private fun lagNettoTilsynsutgiftBeregningGrunnlag(
grunnlag: NettoTilsynsutgiftPeriodeGrunnlag,
bruddPeriode: ÅrMånedsperiode,
antallBarnMedUtgifterIPerioden: Int,
barnMedUtgifterIPerioden: List<FaktiskUtgiftPeriodeCore>,
): 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 {
Expand Down Expand Up @@ -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,
Expand All @@ -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,
Expand Down Expand Up @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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": {
Expand All @@ -119,7 +119,7 @@
"manueltRegistrert": false
},
"grunnlagsreferanseListe": [],
"gjelderBarnReferanse": "person_PERSON_BARN_BIDRAGSMOTTAKER_20151217_102",
"gjelderBarnReferanse": "person_PERSON_BARN_BIDRAGSMOTTAKER_20151217_101",
"gjelderReferanse": "Person_Bidragsmottaker"
},
{
Expand Down
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
<jackson.version>2.18.2</jackson.version>
<kotest.version>5.9.1</kotest.version>
<swagger.version>2.2.27</swagger.version>
<bidrag-felles.version>2024.12.19.141921</bidrag-felles.version>
<bidrag-felles.version>2024.12.31.102412</bidrag-felles.version>
<ktlint.version>1.4.1</ktlint.version>
<spring-boot.version>3.3.5</spring-boot.version>
<kotlin-logging-jvm.version>7.0.3</kotlin-logging-jvm.version>
Expand Down

0 comments on commit 7df3939

Please sign in to comment.