Skip to content

Commit fc05fe5

Browse files
committed
TSFF-1101: Endring av vekting av ikke yrkesaktiv kun for nye regler + toggling av endret vekting av ikke yrkesaktiv
1 parent 4abdeab commit fc05fe5

File tree

10 files changed

+807
-74
lines changed

10 files changed

+807
-74
lines changed

nais/dev-fss-k9saksbehandling.yml

+2
Original file line numberDiff line numberDiff line change
@@ -78,3 +78,5 @@ spec:
7878
value: "true"
7979
- name: IGNORER_UTBETALINGSGRAD_DIFF_SIMULERING
8080
value: "true"
81+
- name: IKKE_YRKESAKTIV_VEKTES_SOM_YRKESAKTIV
82+
value: "true"

nais/prod-fss-k9saksbehandling.yml

+2
Original file line numberDiff line numberDiff line change
@@ -76,3 +76,5 @@ spec:
7676
value: "false"
7777
- name: IGNORER_UTBETALINGSGRAD_DIFF_SIMULERING
7878
value: "false"
79+
- name: IKKE_YRKESAKTIV_VEKTES_SOM_YRKESAKTIV
80+
value: "false"

regler/src/main/kotlin/no/nav/pleiepengerbarn/uttak/regler/ArbeidExt.kt

+4-4
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ internal fun Map<Arbeidsforhold, ArbeidsforholdPeriodeInfo>.finnSøkersTapteArbe
1818
val oppdatertArbeid = if (skalSeBortIfraArbeidstidFraSpesialhåndterteArbeidtyper) {
1919
this.filter {
2020
Arbeidstype.values()
21-
.find { arbeidstype -> arbeidstype.kode == it.key.type } !in GRUPPE_SOM_SKAL_SPESIALHÅNDTERES
21+
.find { arbeidstype -> arbeidstype.kode == it.key.type } !in getGruppeSomSkalSpesialhåndteres(nyeReglerGjelder)
2222
&& (it.value.tilkommet != true || !nyeReglerGjelder)
2323
}
2424
} else {
@@ -59,14 +59,14 @@ internal fun Map<Arbeidsforhold, ArbeidsforholdPeriodeInfo>.finnSøkersTapteArbe
5959

6060
private fun ArbeidsforholdPeriodeInfo.ikkeFravær() = jobberNormalt <= jobberNå
6161

62-
internal fun Map<Arbeidsforhold, ArbeidsforholdPeriodeInfo>.harSpesialhåndteringstilfelleForGamleRegler(periode: LukketPeriode, nyeReglerUtbetalingsgrad: LocalDate?): Boolean {
62+
internal fun Map<Arbeidsforhold, ArbeidsforholdPeriodeInfo>.harSpesialhåndteringstilfelleForGamleRegler(brukNyeRegler: Boolean, periode: LukketPeriode, nyeReglerUtbetalingsgrad: LocalDate?): Boolean {
6363
val harSpesialhåndteringAktivitetstyper = any {
6464
Arbeidstype.values()
65-
.find { arbeidstype -> arbeidstype.kode == it.key.type } in GRUPPE_SOM_SKAL_SPESIALHÅNDTERES
65+
.find { arbeidstype -> arbeidstype.kode == it.key.type } in getGruppeSomSkalSpesialhåndteres(brukNyeRegler)
6666
}
6767
val andreAktiviteter = filter {
6868
Arbeidstype.values()
69-
.find { arbeidstype -> arbeidstype.kode == it.key.type } !in GRUPPE_SOM_SKAL_SPESIALHÅNDTERES
69+
.find { arbeidstype -> arbeidstype.kode == it.key.type } !in getGruppeSomSkalSpesialhåndteres(brukNyeRegler)
7070
}
7171
val harBareFrilansUtenFravær = andreAktiviteter.isNotEmpty() && andreAktiviteter.all { Arbeidstype.FRILANSER.kode == it.key.type && it.value.ikkeFravær() }
7272

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package no.nav.pleiepengerbarn.uttak.regler
2+
3+
enum class Arbeidstype(val kode: String) {
4+
ARBEIDSTAKER("AT"),
5+
FRILANSER("FL"),
6+
DAGPENGER("DP"),
7+
SELVSTENDIG_NÆRINGSDRIVENDE("SN"),
8+
IKKE_YRKESAKTIV("IKKE_YRKESAKTIV"),
9+
IKKE_YRKESAKTIV_UTEN_ERSTATNING("IKKE_YRKESAKTIV_UTEN_ERSTATNING"),
10+
KUN_YTELSE("BA"),
11+
INAKTIV("MIDL_INAKTIV"),
12+
SYKEPENGER_AV_DAGPENGER("SP_AV_DP"),
13+
PSB_AV_DP("PSB_AV_DP")
14+
}
15+
16+
val GRUPPE_SOM_SKAL_SPESIALHÅNDTERES_NYE_REGLER = setOf(
17+
Arbeidstype.IKKE_YRKESAKTIV_UTEN_ERSTATNING,
18+
Arbeidstype.KUN_YTELSE
19+
)
20+
21+
val GRUPPE_SOM_SKAL_SPESIALHÅNDTERES_GAMLE_REGLER = setOf(
22+
Arbeidstype.IKKE_YRKESAKTIV,
23+
Arbeidstype.IKKE_YRKESAKTIV_UTEN_ERSTATNING,
24+
Arbeidstype.KUN_YTELSE
25+
)
26+
27+
val STANDARD_HÅNDTERING_NYE_REGLER = setOf(
28+
Arbeidstype.ARBEIDSTAKER,
29+
Arbeidstype.IKKE_YRKESAKTIV,
30+
Arbeidstype.FRILANSER,
31+
Arbeidstype.SELVSTENDIG_NÆRINGSDRIVENDE
32+
)
33+
34+
val STANDARD_HÅNDTERING_GAMLE_REGLER = setOf(
35+
Arbeidstype.ARBEIDSTAKER,
36+
Arbeidstype.FRILANSER,
37+
Arbeidstype.SELVSTENDIG_NÆRINGSDRIVENDE
38+
)
39+
40+
val YTELSER = setOf(
41+
Arbeidstype.SYKEPENGER_AV_DAGPENGER,
42+
Arbeidstype.PSB_AV_DP,
43+
Arbeidstype.DAGPENGER,
44+
Arbeidstype.INAKTIV
45+
)
46+
47+
fun getAktivitetsgruppe(skalBrukeNyeRegler: Boolean): List<Set<Arbeidstype>> {
48+
if (FeatureToggle.isActive("IKKE_YRKESAKTIV_VEKTES_SOM_YRKESAKTIV")) {
49+
if (skalBrukeNyeRegler) {
50+
return listOf(
51+
STANDARD_HÅNDTERING_NYE_REGLER,
52+
YTELSER,
53+
GRUPPE_SOM_SKAL_SPESIALHÅNDTERES_NYE_REGLER
54+
)
55+
}
56+
}
57+
return listOf(
58+
STANDARD_HÅNDTERING_GAMLE_REGLER,
59+
YTELSER,
60+
GRUPPE_SOM_SKAL_SPESIALHÅNDTERES_GAMLE_REGLER
61+
)
62+
}
63+
64+
fun getGruppeSomSkalSpesialhåndteres(skalBrukeNyeRegler: Boolean): Set<Arbeidstype> {
65+
if (FeatureToggle.isActive("IKKE_YRKESAKTIV_VEKTES_SOM_YRKESAKTIV")) {
66+
if (skalBrukeNyeRegler) {
67+
return GRUPPE_SOM_SKAL_SPESIALHÅNDTERES_NYE_REGLER
68+
}
69+
}
70+
return GRUPPE_SOM_SKAL_SPESIALHÅNDTERES_GAMLE_REGLER
71+
}

regler/src/main/kotlin/no/nav/pleiepengerbarn/uttak/regler/BeregnGrader.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -378,12 +378,12 @@ private fun Map<Arbeidsforhold, ArbeidsforholdPeriodeInfo>.seBortFraAndreArbeids
378378
&& !periode.fom.isBefore(nyeReglerUtbetalingsgrad)
379379

380380
val harIkkeYrkesaktiv = this.keys.any {
381-
GRUPPE_SOM_SKAL_SPESIALHÅNDTERES.contains(
381+
getGruppeSomSkalSpesialhåndteres(nyeReglerGjelder).contains(
382382
Arbeidstype.values().find { arbeidstype -> arbeidstype.kode == it.type })
383383
}
384384
val harAndreArbeidsforhold = this.any {
385385
Arbeidstype.values()
386-
.find { arbeidstype -> arbeidstype.kode == it.key.type } !in GRUPPE_SOM_SKAL_SPESIALHÅNDTERES && !it.value.utenArbeidtid()
386+
.find { arbeidstype -> arbeidstype.kode == it.key.type } !in getGruppeSomSkalSpesialhåndteres(nyeReglerGjelder) && !it.value.utenArbeidtid()
387387
&& !(Arbeidstype.FRILANSER.kode == it.key.type && it.value.ikkeFravær())
388388
}
389389

regler/src/main/kotlin/no/nav/pleiepengerbarn/uttak/regler/BeregnUtbetalingsgrader.kt

+12-40
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,15 @@
11
package no.nav.pleiepengerbarn.uttak.regler
22

3-
import no.nav.pleiepengerbarn.uttak.kontrakter.*
3+
import no.nav.pleiepengerbarn.uttak.kontrakter.Arbeidsforhold
4+
import no.nav.pleiepengerbarn.uttak.kontrakter.ArbeidsforholdPeriodeInfo
5+
import no.nav.pleiepengerbarn.uttak.kontrakter.OverstyrtInput
6+
import no.nav.pleiepengerbarn.uttak.kontrakter.OverstyrtUtbetalingsgradPerArbeidsforhold
7+
import no.nav.pleiepengerbarn.uttak.kontrakter.Prosent
48
import no.nav.pleiepengerbarn.uttak.regler.domene.Utbetalingsgrad
59
import java.math.BigDecimal
610
import java.math.RoundingMode
711
import java.time.Duration
812

9-
enum class Arbeidstype(val kode: String) {
10-
ARBEIDSTAKER("AT"),
11-
FRILANSER("FL"),
12-
DAGPENGER("DP"),
13-
SELVSTENDIG_NÆRINGSDRIVENDE("SN"),
14-
IKKE_YRKESAKTIV("IKKE_YRKESAKTIV"),
15-
IKKE_YRKESAKTIV_UTEN_ERSTATNING("IKKE_YRKESAKTIV_UTEN_ERSTATNING"),
16-
KUN_YTELSE("BA"),
17-
INAKTIV("MIDL_INAKTIV"),
18-
SYKEPENGER_AV_DAGPENGER("SP_AV_DP"),
19-
PSB_AV_DP("PSB_AV_DP")
20-
}
21-
22-
val GRUPPE_SOM_SKAL_SPESIALHÅNDTERES = setOf(
23-
Arbeidstype.IKKE_YRKESAKTIV_UTEN_ERSTATNING,
24-
Arbeidstype.KUN_YTELSE
25-
)
26-
private val AKTIVITETS_GRUPPER = listOf(
27-
setOf(
28-
Arbeidstype.ARBEIDSTAKER,
29-
Arbeidstype.IKKE_YRKESAKTIV,
30-
Arbeidstype.FRILANSER,
31-
Arbeidstype.SELVSTENDIG_NÆRINGSDRIVENDE
32-
),
33-
setOf(
34-
Arbeidstype.SYKEPENGER_AV_DAGPENGER,
35-
Arbeidstype.PSB_AV_DP,
36-
Arbeidstype.DAGPENGER,
37-
Arbeidstype.INAKTIV
38-
),
39-
GRUPPE_SOM_SKAL_SPESIALHÅNDTERES
40-
)
41-
4213
object BeregnUtbetalingsgrader {
4314

4415
internal fun beregn(
@@ -47,8 +18,8 @@ object BeregnUtbetalingsgrader {
4718
gradertMotTilsyn: Boolean,
4819
beregnGraderGrunnlag: BeregnGraderGrunnlag
4920
): Map<Arbeidsforhold, Utbetalingsgrad> {
50-
beregnGraderGrunnlag.arbeid.sjekkAtArbeidsforholdFinnesBlandtAktivitetsgrupper()
5121
val brukNyeRegler = gjelderNyeRegler(beregnGraderGrunnlag)
22+
beregnGraderGrunnlag.arbeid.sjekkAtArbeidsforholdFinnesBlandtAktivitetsgrupper(brukNyeRegler)
5223

5324
// Timer som jobbes normalt
5425
var sumJobberNormalt = finnTotalNormalarbeidstid(beregnGraderGrunnlag, brukNyeRegler)
@@ -68,7 +39,7 @@ object BeregnUtbetalingsgrader {
6839
// Map for holde på utbetalingsgrader
6940
val alleUtbetalingsgrader = mutableMapOf<Arbeidsforhold, Utbetalingsgrad>()
7041
// Beregner utbetalingsgrad gruppevis
71-
AKTIVITETS_GRUPPER.forEach { aktivitetsgruppe ->
42+
getAktivitetsgruppe(brukNyeRegler).forEach { aktivitetsgruppe ->
7243
val arbeidForAktivitetsgruppe = beregnGraderGrunnlag.arbeid.forAktivitetsgruppe(aktivitetsgruppe)
7344
if (!gjelderSpesialgruppePåGamleRegler(aktivitetsgruppe, brukNyeRegler)) {
7445
// HOVEDLØYPE FOR AKTIVITETER
@@ -91,6 +62,7 @@ object BeregnUtbetalingsgrader {
9162
// Finner ut om vi skal har kombinasjonen IKKE_YREKSAKTIV/KUN_YTELSE og Frilans uten fravær på gamle regler
9263
val spesialhåndteringsgruppeSkalSpesialhåndteres =
9364
beregnGraderGrunnlag.arbeid.harSpesialhåndteringstilfelleForGamleRegler(
65+
brukNyeRegler,
9466
beregnGraderGrunnlag.periode,
9567
beregnGraderGrunnlag.nyeReglerUtbetalingsgrad
9668
)
@@ -113,7 +85,7 @@ object BeregnUtbetalingsgrader {
11385
private fun gjelderSpesialgruppePåGamleRegler(
11486
aktivitetsgruppe: Set<Arbeidstype>,
11587
brukNyeRegler: Boolean
116-
) = aktivitetsgruppe == GRUPPE_SOM_SKAL_SPESIALHÅNDTERES && !brukNyeRegler
88+
) = aktivitetsgruppe == getGruppeSomSkalSpesialhåndteres(brukNyeRegler) && !brukNyeRegler
11789

11890
private fun gjelderNyeRegler(beregnGraderGrunnlag: BeregnGraderGrunnlag) =
11991
(beregnGraderGrunnlag.nyeReglerUtbetalingsgrad != null
@@ -125,7 +97,7 @@ object BeregnUtbetalingsgrader {
12597
): Duration {
12698
var sumJobberNormalt1 = Duration.ZERO
12799
beregnGraderGrunnlag.arbeid.entries.filter {
128-
brukNyeRegler || !GRUPPE_SOM_SKAL_SPESIALHÅNDTERES.contains(
100+
brukNyeRegler || !getGruppeSomSkalSpesialhåndteres(brukNyeRegler).contains(
129101
Arbeidstype.values().find { arbeidstype -> arbeidstype.kode == it.key.type })
130102
}.filter {
131103
it.value.tilkommet != true || !brukNyeRegler
@@ -317,8 +289,8 @@ private fun Map<Arbeidsforhold, ArbeidsforholdPeriodeInfo>.forAktivitetsgruppe(a
317289
return arbeidForAktivitetsgruppe
318290
}
319291

320-
private fun Map<Arbeidsforhold, ArbeidsforholdPeriodeInfo>.sjekkAtArbeidsforholdFinnesBlandtAktivitetsgrupper() {
321-
val lovligeArbeidstyper = AKTIVITETS_GRUPPER.flatten().map { it.kode }.toSet()
292+
private fun Map<Arbeidsforhold, ArbeidsforholdPeriodeInfo>.sjekkAtArbeidsforholdFinnesBlandtAktivitetsgrupper(skalBrukeNyeRegler: Boolean) {
293+
val lovligeArbeidstyper = getAktivitetsgruppe(skalBrukeNyeRegler).flatten().map { it.kode }.toSet()
322294
this.keys.forEach {
323295
if (!lovligeArbeidstyper.contains(it.type)) {
324296
throw IllegalArgumentException("Ulovlig arbeidstype ${it.type}")

regler/src/test/kotlin/no/nav/pleiepengerbarn/uttak/regler/BeregnGraderTest.kt regler/src/test/kotlin/no/nav/pleiepengerbarn/uttak/regler/BeregnGraderGamleReglerTest.kt

+25-21
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,11 @@ import java.math.RoundingMode
1111
import java.time.Duration
1212
import java.time.LocalDate
1313

14-
internal class BeregnGraderTest {
14+
/**
15+
* BeregnGraderTest er splittet i to tester, denne og BeregningNyeReglerTest. Denne innneholder alle testene
16+
* fra BeregnGraderTest
17+
*/
18+
internal class BeregnGraderGamleReglerTest {
1519

1620
private val IKKE_ETABLERT_TILSYN = Duration.ZERO
1721
private val INGENTING = Duration.ZERO
@@ -460,8 +464,8 @@ internal class BeregnGraderTest {
460464

461465
grader4.assert(
462466
Årsak.AVKORTET_MOT_INNTEKT,
463-
Prosent(92),
464-
IKKE_YRKESAKTIV to Prosent(100).setScale(2, RoundingMode.HALF_UP),
467+
Prosent(80),
468+
IKKE_YRKESAKTIV to Prosent(80).setScale(2, RoundingMode.HALF_UP),
465469
ARBEIDSGIVER1 to Prosent(100),
466470
FRILANS to Prosent(0)
467471
)
@@ -839,9 +843,9 @@ internal class BeregnGraderTest {
839843

840844
grader.assert(
841845
Årsak.AVKORTET_MOT_INNTEKT,
842-
Prosent(75),
846+
Prosent(50),
843847
ARBEIDSGIVER1 to Prosent(50),
844-
IKKE_YRKESAKTIV to Prosent(100)
848+
IKKE_YRKESAKTIV to Prosent(50)
845849
)
846850
}
847851

@@ -866,8 +870,8 @@ internal class BeregnGraderTest {
866870
grader.assert(
867871
Årsak.GRADERT_MOT_TILSYN,
868872
Prosent(53),
869-
ARBEIDSGIVER1 to Prosent(40),
870-
IKKE_YRKESAKTIV to Prosent(66)
873+
ARBEIDSGIVER1 to Prosent(53),
874+
IKKE_YRKESAKTIV to Prosent(53)
871875
)
872876
}
873877

@@ -892,8 +896,8 @@ internal class BeregnGraderTest {
892896
grader.assert(
893897
Årsak.GRADERT_MOT_TILSYN,
894898
Prosent(53),
895-
ARBEIDSGIVER1 to Prosent(40),
896-
IKKE_YRKESAKTIV to Prosent(66)
899+
ARBEIDSGIVER1 to Prosent(53),
900+
IKKE_YRKESAKTIV to Prosent(53)
897901
)
898902
}
899903

@@ -918,10 +922,10 @@ internal class BeregnGraderTest {
918922

919923
grader.assert(
920924
Årsak.AVKORTET_MOT_INNTEKT,
921-
Prosent(75),
925+
Prosent(63),
922926
ARBEIDSGIVER1 to Prosent(50),
923927
ARBEIDSGIVER2 to Prosent(75),
924-
IKKE_YRKESAKTIV to Prosent(100)
928+
IKKE_YRKESAKTIV to Prosent(62.5)
925929
)
926930
}
927931

@@ -972,10 +976,10 @@ internal class BeregnGraderTest {
972976

973977
grader.assert(
974978
Årsak.AVKORTET_MOT_INNTEKT,
975-
Prosent(87),
979+
Prosent(80),
976980
ARBEIDSGIVER1 to Prosent(60),
977981
DAGPENGER to Prosent(100),
978-
IKKE_YRKESAKTIV to Prosent(100)
982+
IKKE_YRKESAKTIV to Prosent(80)
979983
)
980984
}
981985

@@ -1000,10 +1004,10 @@ internal class BeregnGraderTest {
10001004

10011005
grader.assert(
10021006
Årsak.AVKORTET_MOT_INNTEKT,
1003-
Prosent(87),
1007+
Prosent(80),
10041008
ARBEIDSGIVER1 to Prosent(60),
10051009
INAKTIV to Prosent(100),
1006-
IKKE_YRKESAKTIV to Prosent(100)
1010+
IKKE_YRKESAKTIV to Prosent(80)
10071011
)
10081012
}
10091013

@@ -1029,11 +1033,11 @@ internal class BeregnGraderTest {
10291033

10301034
grader.assert(
10311035
Årsak.AVKORTET_MOT_INNTEKT,
1032-
Prosent(75),
1036+
Prosent(67),
10331037
ARBEIDSGIVER1 to Prosent(60),
10341038
ARBEIDSGIVER2 to Prosent(40),
10351039
DAGPENGER to Prosent(100),
1036-
IKKE_YRKESAKTIV to Prosent(100).setScale(2, RoundingMode.HALF_UP)
1040+
IKKE_YRKESAKTIV to Prosent(66.67).setScale(2, RoundingMode.HALF_UP)
10371041
)
10381042
}
10391043

@@ -1059,10 +1063,10 @@ internal class BeregnGraderTest {
10591063
)
10601064

10611065
grader.assert(
1062-
Årsak.AVKORTET_MOT_INNTEKT,
1063-
BigDecimal(55),
1064-
ARBEIDSGIVER1 to BigDecimal(10),
1065-
IKKE_YRKESAKTIV to BigDecimal(100)
1066+
Årsak.FOR_LAV_TAPT_ARBEIDSTID,
1067+
NULL_PROSENT,
1068+
ARBEIDSGIVER1 to NULL_PROSENT,
1069+
IKKE_YRKESAKTIV to NULL_PROSENT
10661070
)
10671071
}
10681072

0 commit comments

Comments
 (0)