diff --git a/src/main/kotlin/no/nav/familie/ef/personhendelse/inntekt/FeilutbetalingBeregningUtil.kt b/src/main/kotlin/no/nav/familie/ef/personhendelse/inntekt/FeilutbetalingBeregningUtil.kt index 2bc717e1..fdf99e28 100644 --- a/src/main/kotlin/no/nav/familie/ef/personhendelse/inntekt/FeilutbetalingBeregningUtil.kt +++ b/src/main/kotlin/no/nav/familie/ef/personhendelse/inntekt/FeilutbetalingBeregningUtil.kt @@ -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 } diff --git a/src/main/kotlin/no/nav/familie/ef/personhendelse/inntekt/InntektsendringerService.kt b/src/main/kotlin/no/nav/familie/ef/personhendelse/inntekt/InntektsendringerService.kt index 11e0283d..496215bf 100644 --- a/src/main/kotlin/no/nav/familie/ef/personhendelse/inntekt/InntektsendringerService.kt +++ b/src/main/kotlin/no/nav/familie/ef/personhendelse/inntekt/InntektsendringerService.kt @@ -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) } diff --git a/src/test/kotlin/no/nav/familie/ef/personhendelse/inntekt/FeilutbetalingBeregningUtilTest.kt b/src/test/kotlin/no/nav/familie/ef/personhendelse/inntekt/FeilutbetalingBeregningUtilTest.kt index 4d974ed7..bbae877a 100644 --- a/src/test/kotlin/no/nav/familie/ef/personhendelse/inntekt/FeilutbetalingBeregningUtilTest.kt +++ b/src/test/kotlin/no/nav/familie/ef/personhendelse/inntekt/FeilutbetalingBeregningUtilTest.kt @@ -6,8 +6,8 @@ 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) @@ -15,8 +15,9 @@ class FeilutbetalingBeregningUtilTest { @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) } } diff --git a/src/test/kotlin/no/nav/familie/ef/personhendelse/inntekt/InntektsendringerServiceTest.kt b/src/test/kotlin/no/nav/familie/ef/personhendelse/inntekt/InntektsendringerServiceTest.kt index 76d6017b..aaf266c9 100644 --- a/src/test/kotlin/no/nav/familie/ef/personhendelse/inntekt/InntektsendringerServiceTest.kt +++ b/src/test/kotlin/no/nav/familie/ef/personhendelse/inntekt/InntektsendringerServiceTest.kt @@ -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 @@ -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) } }