Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bugfix - beregning av feilutbetaling #452

Merged
merged 1 commit into from
Nov 2, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package no.nav.familie.ef.personhendelse.inntekt

import java.math.BigDecimal
import java.math.RoundingMode

private val grunnbeløp = 118_620
private val reduksjonsfaktor = BigDecimal(0.45)

fun beregnFeilutbetaling(forventetInntekt: Int, samletInntekt: Int): Int {
return beregnUtbetaling(forventetInntekt) - beregnUtbetaling(samletInntekt)
}

private fun beregnUtbetaling(inntekt: Int): Int {
val avkortningPerMåned = beregnAvkortning(inntekt).divide(BigDecimal(12)).setScale(0, RoundingMode.HALF_DOWN)

val fullOvergangsstønadPerMåned =
BigDecimal(grunnbeløp).multiply(BigDecimal(2.25)).divide(BigDecimal(12)).setScale(0, RoundingMode.HALF_EVEN)

val utbetaling = fullOvergangsstønadPerMåned.subtract(avkortningPerMåned).setScale(0, RoundingMode.HALF_UP)

return if (utbetaling <= BigDecimal.ZERO) 0 else utbetaling.intValueExact()
}

private fun beregnAvkortning(inntekt: Int): BigDecimal {
val inntektOverHalveGrunnbeløp = BigDecimal(inntekt).subtract(BigDecimal(grunnbeløp).multiply(BigDecimal(0.5)))
return if (inntektOverHalveGrunnbeløp > BigDecimal.ZERO) {
inntektOverHalveGrunnbeløp.multiply(reduksjonsfaktor).setScale(5, RoundingMode.HALF_DOWN)
} else {
BigDecimal.ZERO
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@ import no.nav.familie.ef.personhendelse.client.OppgaveClient
import no.nav.familie.ef.personhendelse.client.SakClient
import no.nav.familie.ef.personhendelse.client.pdl.secureLogger
import org.springframework.stereotype.Service
import java.math.BigDecimal
import java.math.RoundingMode
import java.time.YearMonth

@Service
Expand All @@ -17,7 +15,6 @@ class InntektsendringerService(

private val grunnbeløp = 118_620
private val halvtGrunnbeløpMånedlig = (grunnbeløp / 2) / 12
private val reduksjonsfaktor = BigDecimal(0.45)

fun beregnEndretInntekt(inntektshistorikkResponse: InntektshistorikkResponse, forventetInntektForPerson: ForventetInntektForPerson): Inntektsendring {
// hent alle registrerte vedtak som var på personen sist beregning
Expand Down Expand Up @@ -88,30 +85,6 @@ class InntektsendringerService(
return BeregningResultat(endretInntektBeløp, inntektsendringProsent, feilutbetaling)
}

fun beregnFeilutbetaling(forventetInntekt: Int, samletInntekt: Int): Int {
return beregnUtbetaling(samletInntekt) - beregnUtbetaling(forventetInntekt)
}

private fun beregnUtbetaling(inntekt: Int): Int {
val avkortningPerMåned = beregnAvkortning(inntekt).setScale(0, RoundingMode.HALF_DOWN)

val fullOvergangsstønadPerMåned =
BigDecimal(grunnbeløp).multiply(BigDecimal(2.25)).divide(BigDecimal(12)).setScale(0, RoundingMode.HALF_EVEN)

val utbetaling = fullOvergangsstønadPerMåned.subtract(avkortningPerMåned).setScale(0, RoundingMode.HALF_UP)

return if (utbetaling <= BigDecimal.ZERO) 0 else utbetaling.intValueExact()
}

private fun beregnAvkortning(inntekt: Int): BigDecimal {
val inntektOverHalveGrunnbeløp = BigDecimal(inntekt).subtract(BigDecimal(grunnbeløp).multiply(BigDecimal(0.5)))
return if (inntektOverHalveGrunnbeløp > BigDecimal.ZERO) {
inntektOverHalveGrunnbeløp.multiply(reduksjonsfaktor).setScale(5, RoundingMode.HALF_DOWN)
} else {
BigDecimal.ZERO
}
}

// Ignorterte ytelser: Alle uføre går under annet regelverk (samordning) og skal derfor ignoreres.
val ignorerteYtelserOgUtbetalinger = listOf(
"overgangsstoenadTilEnsligMorEllerFarSomBegynteAaLoepe1April2014EllerSenere",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,7 @@ class ForelderBarnHandlerTest {
"Vurder saken.",
)
}

@Test
internal fun `finnNyeBarnForBruker inneholder for sent født terminbarn og nytt barn, forvent at oppgave opprettes`() {
mockNyeBarn(
Expand All @@ -127,6 +128,7 @@ class ForelderBarnHandlerTest {
"Vurder saken.",
)
}

@Test
internal fun `finnNyeBarnForBruker inneholder for sent født terminbarn, forvent at oppgave opprettes`() {
mockNyeBarn(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package no.nav.familie.ef.personhendelse.inntekt

import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.Test

class FeilutbetalingBeregningUtilTest {

@Test
fun `beregn feilutbetaling - max`() {
val feilutbetaling = beregnFeilutbetaling(0, 700_000)
val maxOvergangsstønadPrMnd = 118_620 * 2.25 / 12

Assertions.assertEquals(maxOvergangsstønadPrMnd.toInt(), feilutbetaling)
}

@Test
fun `beregn feilutbetaling`() {
val feilutbetaling = beregnFeilutbetaling(223_400, 406_400)
// 223400 utbetaler 16088 og 406400 utbetaler 9225
Assertions.assertEquals(6863, feilutbetaling)
}
}