Skip to content

Commit

Permalink
Bugfix: Feilutbetaling (#454)
Browse files Browse the repository at this point in the history
  • Loading branch information
olekvernberg authored Nov 2, 2023
1 parent 8f8336c commit b9e1890
Show file tree
Hide file tree
Showing 4 changed files with 22 additions and 20 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,27 +4,28 @@ import java.math.BigDecimal
import java.math.RoundingMode

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

fun beregnFeilutbetaling(forventetInntekt: Int, samletInntekt: Int): Int {
fun beregnFeilutbetalingForMåned(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 avkortning = 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 fullOvergangsstønad =
BigDecimal(grunnbeløp).multiply(BigDecimal(2.25)).setScale(0, RoundingMode.HALF_EVEN)

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

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

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)
val inntektOverHalveGrunnbeløpÅrlig = BigDecimal(inntekt).multiply(BigDecimal(12)).subtract(BigDecimal(halvtGrunnbeløp))
return if (inntektOverHalveGrunnbeløpÅrlig > BigDecimal.ZERO) {
inntektOverHalveGrunnbeløpÅrlig.multiply(reduksjonsfaktor).setScale(5, RoundingMode.HALF_DOWN)
} else {
BigDecimal.ZERO
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ class InntektsendringerService(
secureLogger.info("Samlet inntekt: $samletInntekt - månedlig forventet inntekt: $månedligForventetInntekt (årlig: $forventetInntekt) for person $ident")
val inntektsendringProsent = (((samletInntekt - månedligForventetInntekt) / månedligForventetInntekt.toDouble()) * 100).toInt()
val endretInntektBeløp = samletInntekt - månedligForventetInntekt
val feilutbetaling = beregnFeilutbetaling(månedligForventetInntekt, samletInntekt)
val feilutbetaling = beregnFeilutbetalingForMåned(månedligForventetInntekt, samletInntekt)
if (månedligForventetInntekt == 0) return BeregningResultat(endretInntektBeløp, 100, feilutbetaling) // Prioriterer personer registrert med uredusert stønad, men har samlet inntekt over 1/2 G
return BeregningResultat(endretInntektBeløp, inntektsendringProsent, feilutbetaling)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,18 @@ import org.junit.jupiter.api.Test
class FeilutbetalingBeregningUtilTest {

@Test
fun `beregn feilutbetaling - max`() {
val feilutbetaling = beregnFeilutbetaling(0, 700_000)
fun `beregn feilutbetaling - max feilutbetaling`() {
val feilutbetaling = beregnFeilutbetalingForMåned(0, 60_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
val feilutbetaling = beregnFeilutbetalingForMåned(18616, 33866)
// Årsinntekt 223400 utbetaler 16088 pr mnd og 406400 utbetaler 9225
// 223400 / 12 = 18616 , 406 400 / 12 = 33866
Assertions.assertEquals(6863, feilutbetaling)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -125,14 +125,14 @@ class InntektsendringerServiceTest {
oppdatertDatoInntektshistorikkResponse,
ForventetInntektForPerson("2", forventetInntektTiProsentLavere, forventetInntektTiProsentLavere, forventetInntektTiProsentLavere, forventetInntektTiProsentLavere),
),
).isEqualTo(inntektsendring(3500, 11))
).isEqualTo(inntektsendring(3500, 11, 1575))

Assertions.assertThat(
inntektsendringerService.beregnEndretInntekt(
oppdatertDatoInntektshistorikkResponse,
ForventetInntektForPerson("3", forventetInntektNiProsentLavere, forventetInntektNiProsentLavere, forventetInntektNiProsentLavere, forventetInntektNiProsentLavere),
),
).isEqualTo(inntektsendring(3150, 9))
).isEqualTo(inntektsendring(3150, 9, 1417))
}

@Test
Expand Down Expand Up @@ -432,12 +432,12 @@ class InntektsendringerServiceTest {
return this::class.java.classLoader.getResource(name)!!.readText(StandardCharsets.UTF_8)
}

fun inntektsendring(beløp: Int = 0, prosent: Int = 0): Inntektsendring {
val beregningsResultat = beregningResultat(beløp, prosent)
fun inntektsendring(beløp: Int = 0, prosent: Int = 0, feilutbetaling: Int = 0): Inntektsendring {
val beregningsResultat = beregningResultat(beløp, prosent, feilutbetaling)
return Inntektsendring(beregningsResultat, beregningsResultat, beregningsResultat, beregningsResultat)
}

fun beregningResultat(beløp: Int = 0, prosent: Int = 0): BeregningResultat {
return BeregningResultat(beløp, prosent, 0)
fun beregningResultat(beløp: Int = 0, prosent: Int = 0, feilutbetaling: Int = 0): BeregningResultat {
return BeregningResultat(beløp, prosent, feilutbetaling)
}
}

0 comments on commit b9e1890

Please sign in to comment.