Skip to content

Commit d1cd166

Browse files
Merge pull request #468 from navikt/feature/beregning-sjekk-12-prosent
Ny delberegning for sjekk av beregnet bidrag vs løpende bidrag (12%).…
2 parents d98513f + 12dc694 commit d1cd166

30 files changed

+1547
-506
lines changed

Diff for: bidrag-beregn-barnebidrag/src/main/kotlin/no/nav/bidrag/beregn/barnebidrag/BeregnBarnebidragApi.kt

+2
Original file line numberDiff line numberDiff line change
@@ -59,4 +59,6 @@ class BeregnBarnebidragApi {
5959
service.beregnBarnetilleggSkattesats(beregnGrunnlag, rolle)
6060

6161
fun beregnEndeligBidrag(beregnGrunnlag: BeregnGrunnlag): BeregnEndeligBidragServiceRespons = service.beregnEndeligBidrag(beregnGrunnlag)
62+
63+
fun beregnEndringSjekkGrensePeriode(beregnGrunnlag: BeregnGrunnlag): List<GrunnlagDto> = service.beregnEndringSjekkGrensePeriode(beregnGrunnlag)
6264
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package no.nav.bidrag.beregn.barnebidrag.beregning
2+
3+
import no.nav.bidrag.beregn.barnebidrag.bo.EndringSjekkGrensePeriodeBeregningGrunnlag
4+
import no.nav.bidrag.beregn.barnebidrag.bo.EndringSjekkGrensePeriodeBeregningResultat
5+
import no.nav.bidrag.domene.enums.sjablon.SjablonTallNavn
6+
import no.nav.bidrag.domene.util.avrundetMedTiDesimaler
7+
import java.math.BigDecimal
8+
import java.math.RoundingMode
9+
10+
internal object EndringSjekkGrensePeriodeBeregning {
11+
12+
private val bigDecimal100 = BigDecimal.valueOf(100)
13+
14+
fun beregn(grunnlag: EndringSjekkGrensePeriodeBeregningGrunnlag): EndringSjekkGrensePeriodeBeregningResultat {
15+
16+
// Henter sjablonverdi
17+
val sjablonverdiEndringBidragGrenseProsent = hentSjablonverdi(grunnlag)
18+
val endringsgrenseFaktor = sjablonverdiEndringBidragGrenseProsent.divide(bigDecimal100, 10, RoundingMode.HALF_UP)
19+
20+
// Beregner faktisk endring. Hvis det ikke er noe løpende bidrag, settes faktisk endring til null.
21+
val faktiskEndringFaktor =
22+
if (grunnlag.løpendeBidragBeregningGrunnlag?.beløp != null) {
23+
grunnlag.beregnetBidragBeregningGrunnlag.beløp
24+
.divide(grunnlag.løpendeBidragBeregningGrunnlag.beløp, 10, RoundingMode.HALF_UP)
25+
.minus(BigDecimal(1))
26+
.abs()
27+
} else {
28+
null
29+
}
30+
31+
// Sjekker om endring er over grense (true hvis faktisk endring > sjablonverdi for endringsgrense eller faktisk endring er null)
32+
val endringErOverGrense = (faktiskEndringFaktor == null) || (faktiskEndringFaktor > endringsgrenseFaktor)
33+
34+
return EndringSjekkGrensePeriodeBeregningResultat(
35+
faktiskEndringFaktor = faktiskEndringFaktor?.avrundetMedTiDesimaler,
36+
endringErOverGrense = endringErOverGrense,
37+
grunnlagsreferanseListe = listOfNotNull(
38+
grunnlag.beregnetBidragBeregningGrunnlag.referanse,
39+
grunnlag.løpendeBidragBeregningGrunnlag?.referanse
40+
)
41+
+ grunnlag.sjablonSjablontallBeregningGrunnlagListe.map { it.referanse },
42+
)
43+
}
44+
45+
private fun hentSjablonverdi(grunnlag: EndringSjekkGrensePeriodeBeregningGrunnlag): BigDecimal =
46+
(
47+
grunnlag.sjablonSjablontallBeregningGrunnlagListe
48+
.filter { it.type == SjablonTallNavn.ENDRING_BIDRAG_GRENSE_PROSENT.navn }
49+
.map { it.verdi }
50+
.firstOrNull() ?: 0.0
51+
)
52+
.toBigDecimal()
53+
}

Diff for: bidrag-beregn-barnebidrag/src/main/kotlin/no/nav/bidrag/beregn/barnebidrag/bo/EndeligBidragBO.kt

-3
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import no.nav.bidrag.domene.tid.ÅrMånedsperiode
44
import no.nav.bidrag.domene.util.avrundetMedNullDesimaler
55
import no.nav.bidrag.domene.util.avrundetMedTiDesimaler
66
import no.nav.bidrag.domene.util.avrundetMedToDesimaler
7-
import no.nav.bidrag.transport.behandling.felles.grunnlag.BeløpshistorikkGrunnlag
87
import no.nav.bidrag.transport.behandling.felles.grunnlag.DelberegningBidragsevne
98
import no.nav.bidrag.transport.behandling.felles.grunnlag.DelberegningBidragspliktigesAndel
109
import no.nav.bidrag.transport.behandling.felles.grunnlag.DelberegningNettoBarnetillegg
@@ -38,8 +37,6 @@ data class SamværsfradragDelberegningPeriodeGrunnlag(val referanse: String, val
3837

3938
data class NettoBarnetilleggDelberegningPeriodeGrunnlag(val referanse: String, val nettoBarnetilleggPeriode: DelberegningNettoBarnetillegg)
4039

41-
data class BeløpshistorikkPeriodeGrunnlag(val referanse: String, val beløpshistorikkPeriode: BeløpshistorikkGrunnlag)
42-
4340
data class BegrensetRevurderingPeriodeGrunnlag(val referanse: String, val begrensetRevurdering: Boolean)
4441

4542
data class EndeligBidragPeriodeResultat(val periode: ÅrMånedsperiode, val resultat: EndeligBidragBeregningResultat)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package no.nav.bidrag.beregn.barnebidrag.bo
2+
3+
import no.nav.bidrag.domene.tid.ÅrMånedsperiode
4+
import no.nav.bidrag.transport.behandling.felles.grunnlag.SluttberegningBarnebidrag
5+
import java.math.BigDecimal
6+
7+
data class EndringSjekkGrensePeriodePeriodeGrunnlag(
8+
val beregningsperiode: ÅrMånedsperiode,
9+
val sluttberegningPeriodeGrunnlagListe: List<SluttberegningPeriodeGrunnlag>,
10+
val beløpshistorikkBidragPeriodeGrunnlag: BeløpshistorikkPeriodeGrunnlag?,
11+
val sjablonSjablontallPeriodeGrunnlagListe: List<SjablonSjablontallPeriodeGrunnlag>,
12+
)
13+
14+
data class SluttberegningPeriodeGrunnlag(val referanse: String, val sluttberegningPeriode: SluttberegningBarnebidrag)
15+
16+
data class EndringSjekkGrensePeriodePeriodeResultat(val periode: ÅrMånedsperiode, val resultat: EndringSjekkGrensePeriodeBeregningResultat)
17+
18+
data class EndringSjekkGrensePeriodeBeregningGrunnlag(
19+
val beregnetBidragBeregningGrunnlag: BeregnetBidragBeregningGrunnlag,
20+
valpendeBidragBeregningGrunnlag: LøpendeBidragBeregningGrunnlag?,
21+
val sjablonSjablontallBeregningGrunnlagListe: List<SjablonSjablontallBeregningGrunnlag>,
22+
)
23+
24+
data class BeregnetBidragBeregningGrunnlag(val referanse: String, val beløp: BigDecimal)
25+
26+
data class LøpendeBidragBeregningGrunnlag(val referanse: String, val beløp: BigDecimal?)
27+
28+
data class EndringSjekkGrensePeriodeBeregningResultat(
29+
val faktiskEndringFaktor: BigDecimal?,
30+
val endringErOverGrense: Boolean,
31+
val grunnlagsreferanseListe: List<String>,
32+
)

Diff for: bidrag-beregn-barnebidrag/src/main/kotlin/no/nav/bidrag/beregn/barnebidrag/bo/FellesBO.kt

+3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package no.nav.bidrag.beregn.barnebidrag.bo
22

3+
import no.nav.bidrag.transport.behandling.felles.grunnlag.BeløpshistorikkGrunnlag
34
import no.nav.bidrag.transport.behandling.felles.grunnlag.SjablonSjablontallPeriode
45
import java.math.BigDecimal
56
import java.time.LocalDate
@@ -10,4 +11,6 @@ data class SjablonSjablontallPeriodeGrunnlag(val referanse: String, val sjablonS
1011

1112
data class InntektBeregningGrunnlag(val referanse: String, val sumInntekt: BigDecimal)
1213

14+
data class BeløpshistorikkPeriodeGrunnlag(val referanse: String, val beløpshistorikkPeriode: BeløpshistorikkGrunnlag)
15+
1316
data class SjablonSjablontallBeregningGrunnlag(val referanse: String, val type: String, val verdi: Double)

Diff for: bidrag-beregn-barnebidrag/src/main/kotlin/no/nav/bidrag/beregn/barnebidrag/mapper/EndeligBidragMapper.kt

+45-29
Original file line numberDiff line numberDiff line change
@@ -25,37 +25,53 @@ import no.nav.bidrag.transport.behandling.felles.grunnlag.filtrerOgKonverterBase
2525

2626
internal object EndeligBidragMapper : CoreMapper() {
2727

28-
fun mapEndeligBidragGrunnlag(mottattGrunnlag: BeregnGrunnlag): EndeligBidragPeriodeGrunnlag = EndeligBidragPeriodeGrunnlag(
29-
beregningsperiode = mottattGrunnlag.periode,
30-
bidragsevneDelberegningPeriodeGrunnlagListe = mapBidragsevne(mottattGrunnlag),
31-
underholdskostnadDelberegningPeriodeGrunnlagListe = mapUnderholdskostnad(mottattGrunnlag),
32-
bpAndelUnderholdskostnadDelberegningPeriodeGrunnlagListe = mapBpAndelUnderholdskostnad(mottattGrunnlag),
33-
samværsfradragDelberegningPeriodeGrunnlagListe = mapSamværsfradrag(mottattGrunnlag),
34-
samværsklassePeriodeGrunnlagListe = mapSamværsklasse(mottattGrunnlag),
35-
nettoBarnetilleggBPDelberegningPeriodeGrunnlagListe = mapNettoBarnetillegg(
36-
beregnGrunnlag = mottattGrunnlag,
37-
referanseTilRolle = finnReferanseTilRolle(
38-
grunnlagListe = mottattGrunnlag.grunnlagListe,
39-
grunnlagstype = Grunnlagstype.PERSON_BIDRAGSPLIKTIG,
28+
fun mapEndeligBidragGrunnlag(mottattGrunnlag: BeregnGrunnlag): EndeligBidragPeriodeGrunnlag {
29+
val begrensetRevurderingPeriodeGrunnlag = mapSøknadGrunnlag(mottattGrunnlag)
30+
31+
return EndeligBidragPeriodeGrunnlag(
32+
beregningsperiode = mottattGrunnlag.periode,
33+
bidragsevneDelberegningPeriodeGrunnlagListe = mapBidragsevne(mottattGrunnlag),
34+
underholdskostnadDelberegningPeriodeGrunnlagListe = mapUnderholdskostnad(mottattGrunnlag),
35+
bpAndelUnderholdskostnadDelberegningPeriodeGrunnlagListe = mapBpAndelUnderholdskostnad(mottattGrunnlag),
36+
samværsfradragDelberegningPeriodeGrunnlagListe = mapSamværsfradrag(mottattGrunnlag),
37+
samværsklassePeriodeGrunnlagListe = mapSamværsklasse(mottattGrunnlag),
38+
nettoBarnetilleggBPDelberegningPeriodeGrunnlagListe = mapNettoBarnetillegg(
39+
beregnGrunnlag = mottattGrunnlag,
40+
referanseTilRolle = finnReferanseTilRolle(
41+
grunnlagListe = mottattGrunnlag.grunnlagListe,
42+
grunnlagstype = Grunnlagstype.PERSON_BIDRAGSPLIKTIG,
43+
),
4044
),
41-
),
42-
nettoBarnetilleggBMDelberegningPeriodeGrunnlagListe = mapNettoBarnetillegg(
43-
beregnGrunnlag = mottattGrunnlag,
44-
referanseTilRolle = finnReferanseTilRolle(
45-
grunnlagListe = mottattGrunnlag.grunnlagListe,
46-
grunnlagstype = Grunnlagstype.PERSON_BIDRAGSMOTTAKER,
45+
nettoBarnetilleggBMDelberegningPeriodeGrunnlagListe = mapNettoBarnetillegg(
46+
beregnGrunnlag = mottattGrunnlag,
47+
referanseTilRolle = finnReferanseTilRolle(
48+
grunnlagListe = mottattGrunnlag.grunnlagListe,
49+
grunnlagstype = Grunnlagstype.PERSON_BIDRAGSMOTTAKER,
50+
),
4751
),
48-
),
49-
beløpshistorikkForskuddPeriodeGrunnlag = mapBeløpshistorikk(
50-
beregnGrunnlag = mottattGrunnlag,
51-
grunnlagstype = Grunnlagstype.BELØPSHISTORIKK_FORSKUDD,
52-
),
53-
beløpshistorikkBidragPeriodeGrunnlag = mapBeløpshistorikk(
54-
beregnGrunnlag = mottattGrunnlag,
55-
grunnlagstype = Grunnlagstype.BELØPSHISTORIKK_BIDRAG,
56-
),
57-
begrensetRevurderingPeriodeGrunnlag = mapSøknadGrunnlag(mottattGrunnlag),
58-
)
52+
// Legger null i beløpshistorikk forskudd hvis indikator for begrenset revurdering er false
53+
beløpshistorikkForskuddPeriodeGrunnlag =
54+
if (begrensetRevurderingPeriodeGrunnlag == null || begrensetRevurderingPeriodeGrunnlag.begrensetRevurdering == false) {
55+
null
56+
} else {
57+
mapBeløpshistorikk(
58+
beregnGrunnlag = mottattGrunnlag,
59+
grunnlagstype = Grunnlagstype.BELØPSHISTORIKK_FORSKUDD
60+
)
61+
},
62+
// Legger null i beløpshistorikk bidrag hvis indikator for begrenset revurdering er false
63+
beløpshistorikkBidragPeriodeGrunnlag =
64+
if (begrensetRevurderingPeriodeGrunnlag == null || begrensetRevurderingPeriodeGrunnlag.begrensetRevurdering == false) {
65+
null
66+
} else {
67+
mapBeløpshistorikk(
68+
beregnGrunnlag = mottattGrunnlag,
69+
grunnlagstype = Grunnlagstype.BELØPSHISTORIKK_BIDRAG
70+
)
71+
},
72+
begrensetRevurderingPeriodeGrunnlag = begrensetRevurderingPeriodeGrunnlag,
73+
)
74+
}
5975

6076
private fun mapBidragsevne(beregnGrunnlag: BeregnGrunnlag): List<BidragsevneDelberegningPeriodeGrunnlag> {
6177
try {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package no.nav.bidrag.beregn.barnebidrag.mapper
2+
3+
import no.nav.bidrag.beregn.barnebidrag.bo.BeløpshistorikkPeriodeGrunnlag
4+
import no.nav.bidrag.beregn.barnebidrag.bo.EndringSjekkGrensePeriodePeriodeGrunnlag
5+
import no.nav.bidrag.beregn.barnebidrag.bo.SjablonSjablontallPeriodeGrunnlag
6+
import no.nav.bidrag.beregn.barnebidrag.bo.SluttberegningPeriodeGrunnlag
7+
import no.nav.bidrag.beregn.core.service.mapper.CoreMapper
8+
import no.nav.bidrag.domene.enums.grunnlag.Grunnlagstype
9+
import no.nav.bidrag.transport.behandling.beregning.felles.BeregnGrunnlag
10+
import no.nav.bidrag.transport.behandling.felles.grunnlag.BeløpshistorikkGrunnlag
11+
import no.nav.bidrag.transport.behandling.felles.grunnlag.GrunnlagDto
12+
import no.nav.bidrag.transport.behandling.felles.grunnlag.SjablonSjablontallPeriode
13+
import no.nav.bidrag.transport.behandling.felles.grunnlag.SluttberegningBarnebidrag
14+
import no.nav.bidrag.transport.behandling.felles.grunnlag.filtrerOgKonverterBasertPåEgenReferanse
15+
16+
internal object EndringSjekkGrensePeriodeMapper : CoreMapper() {
17+
fun mapEndringSjekkGrensePeriodeGrunnlag(mottattGrunnlag: BeregnGrunnlag, sjablonGrunnlag: List<GrunnlagDto>) =
18+
EndringSjekkGrensePeriodePeriodeGrunnlag(
19+
beregningsperiode = mottattGrunnlag.periode,
20+
sluttberegningPeriodeGrunnlagListe = mapSluttberegning(mottattGrunnlag),
21+
beløpshistorikkBidragPeriodeGrunnlag = mapBeløpshistorikk(mottattGrunnlag),
22+
sjablonSjablontallPeriodeGrunnlagListe = mapSjablonSjablontall(sjablonGrunnlag),
23+
)
24+
25+
private fun mapSluttberegning(beregnGrunnlag: BeregnGrunnlag): List<SluttberegningPeriodeGrunnlag> {
26+
try {
27+
return beregnGrunnlag.grunnlagListe
28+
.filtrerOgKonverterBasertPåEgenReferanse<SluttberegningBarnebidrag>(Grunnlagstype.SLUTTBEREGNING_BARNEBIDRAG)
29+
.map {
30+
SluttberegningPeriodeGrunnlag(
31+
referanse = it.referanse,
32+
sluttberegningPeriode = it.innhold,
33+
)
34+
}
35+
} catch (e: Exception) {
36+
throw IllegalArgumentException(
37+
"Ugyldig input ved beregning av barnebidrag. Innhold i Grunnlagstype.SLUTTBEREGNING_BARNEBIDRAG er ikke gyldig: " + e.message,
38+
)
39+
}
40+
}
41+
42+
private fun mapBeløpshistorikk(beregnGrunnlag: BeregnGrunnlag): BeløpshistorikkPeriodeGrunnlag? {
43+
return beregnGrunnlag.grunnlagListe
44+
.filtrerOgKonverterBasertPåEgenReferanse<BeløpshistorikkGrunnlag>(grunnlagType = Grunnlagstype.BELØPSHISTORIKK_BIDRAG)
45+
.map {
46+
BeløpshistorikkPeriodeGrunnlag(
47+
referanse = it.referanse,
48+
beløpshistorikkPeriode = it.innhold,
49+
)
50+
}
51+
.firstOrNull()
52+
}
53+
54+
// TODO Flytte til CoreMapper
55+
private fun mapSjablonSjablontall(sjablonGrunnlag: List<GrunnlagDto>): List<SjablonSjablontallPeriodeGrunnlag> {
56+
try {
57+
return sjablonGrunnlag
58+
.filter { it.type == Grunnlagstype.SJABLON_SJABLONTALL }
59+
.filtrerOgKonverterBasertPåEgenReferanse<SjablonSjablontallPeriode>()
60+
.map {
61+
SjablonSjablontallPeriodeGrunnlag(
62+
referanse = it.referanse,
63+
sjablonSjablontallPeriode = it.innhold,
64+
)
65+
}
66+
} catch (e: Exception) {
67+
throw IllegalArgumentException(
68+
"Feil ved uthenting av sjablon for sjablontall: " + e.message,
69+
)
70+
}
71+
}
72+
}

Diff for: bidrag-beregn-barnebidrag/src/main/kotlin/no/nav/bidrag/beregn/barnebidrag/service/BeregnBarnebidragService.kt

+19
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import no.nav.bidrag.beregn.barnebidrag.service.BeregnBarnetilleggSkattesatsServ
66
import no.nav.bidrag.beregn.barnebidrag.service.BeregnBidragsevneService.delberegningBidragsevne
77
import no.nav.bidrag.beregn.barnebidrag.service.BeregnBpAndelUnderholdskostnadService.delberegningBpAndelUnderholdskostnad
88
import no.nav.bidrag.beregn.barnebidrag.service.BeregnEndeligBidragService.delberegningEndeligBidrag
9+
import no.nav.bidrag.beregn.barnebidrag.service.BeregnEndringSjekkGrensePeriodeService.delberegningEndringSjekkGrensePeriode
910
import no.nav.bidrag.beregn.barnebidrag.service.BeregnNettoBarnetilleggService.delberegningNettoBarnetillegg
1011
import no.nav.bidrag.beregn.barnebidrag.service.BeregnNettoTilsynsutgiftService.delberegningNettoTilsynsutgift
1112
import no.nav.bidrag.beregn.barnebidrag.service.BeregnSamværsfradragService.delberegningSamværsfradrag
@@ -269,6 +270,24 @@ class BeregnBarnebidragService : BeregnService() {
269270
return delberegningEndeligBidragResultat
270271
}
271272

273+
// Beregning av om endelig bidrag (sluttberegning) er under eller over grense ("12%"-regelen) ifht løpende bidrag
274+
fun beregnEndringSjekkGrensePeriode(mottattGrunnlag: BeregnGrunnlag): List<GrunnlagDto> {
275+
secureLogger.debug { "Beregning av om endring i bidrag er over eller under grense - følgende request mottatt: ${tilJson(mottattGrunnlag)}" }
276+
277+
// Kontroll av inputdata
278+
try {
279+
// TODO Bør være mulig å ha null i beregnDatoTil?
280+
mottattGrunnlag.valider()
281+
} catch (e: IllegalArgumentException) {
282+
throw IllegalArgumentException("Ugyldig input ved beregning av endring sjekk grense: " + e.message)
283+
}
284+
285+
// Kaller delberegninger
286+
val delberegningEndringSjekkGrensePeriodeResultat = delberegningEndringSjekkGrensePeriode(mottattGrunnlag)
287+
288+
return delberegningEndringSjekkGrensePeriodeResultat
289+
}
290+
272291
private fun lagResultatPerioder(delberegningEndeligBidragResultat: List<GrunnlagDto>): List<ResultatPeriode> = delberegningEndeligBidragResultat
273292
.filtrerOgKonverterBasertPåEgenReferanse<SluttberegningBarnebidrag>(Grunnlagstype.SLUTTBEREGNING_BARNEBIDRAG)
274293
.map {

0 commit comments

Comments
 (0)