From 959a8d4e921f6886ad2b2b6f8b12a23b8da840a0 Mon Sep 17 00:00:00 2001 From: espenwaaga Date: Tue, 18 Jun 2024 11:22:25 +0200 Subject: [PATCH] Utvide UtbetalingsgradUtregning med hensyn til mors stillingsprosent --- .../RegelResultatBehandler.java | 2 +- .../UtbetalingsgradMedGraderingUtregning.java | 40 ++++++++++++------- ...UtbetalingsgradSamtidigUttakUtregning.java | 1 + ...UtbetalingsgradUtenGraderingUtregning.java | 1 + .../grunnlag/MorsStillingsprosent.java | 10 ++--- .../regelflyt/ForeldrepengerDelregel.java | 3 +- .../DelvisArbeidOrkestreringTest.java | 24 +++++------ ...etalingsgradMedGraderingUtregningTest.java | 8 ++-- ...talingsgradUtenGraderingUtregningTest.java | 2 +- 9 files changed, 51 insertions(+), 40 deletions(-) diff --git a/src/main/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/RegelResultatBehandler.java b/src/main/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/RegelResultatBehandler.java index 5f7b3826..6f81ba8e 100644 --- a/src/main/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/RegelResultatBehandler.java +++ b/src/main/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/RegelResultatBehandler.java @@ -184,7 +184,7 @@ private UtbetalingsgradUtregning bestemUtbetalingsgradUtregning(OppgittPeriode o AktivitetIdentifikator aktivitet, SamtidigUttaksprosent annenpartSamtidigUttaksprosent) { if (oppgittPeriode.erSøktGradering(aktivitet)) { - return new UtbetalingsgradMedGraderingUtregning(oppgittPeriode, aktivitet, annenpartSamtidigUttaksprosent); + return new UtbetalingsgradMedGraderingUtregning(oppgittPeriode, annenpartSamtidigUttaksprosent); } var samtidigUttaksprosent = regnSamtidigUttaksprosentMotGradering(oppgittPeriode, annenpartSamtidigUttaksprosent); if (samtidigUttaksprosent != null) { diff --git a/src/main/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/UtbetalingsgradMedGraderingUtregning.java b/src/main/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/UtbetalingsgradMedGraderingUtregning.java index d859db7d..0479e9d4 100644 --- a/src/main/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/UtbetalingsgradMedGraderingUtregning.java +++ b/src/main/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/UtbetalingsgradMedGraderingUtregning.java @@ -1,8 +1,5 @@ package no.nav.foreldrepenger.regler.uttak.fastsetteperiode; -import java.util.Optional; - -import no.nav.foreldrepenger.regler.uttak.fastsetteperiode.grunnlag.AktivitetIdentifikator; import no.nav.foreldrepenger.regler.uttak.fastsetteperiode.grunnlag.OppgittPeriode; import no.nav.foreldrepenger.regler.uttak.fastsetteperiode.grunnlag.SamtidigUttaksprosent; import no.nav.foreldrepenger.regler.uttak.fastsetteperiode.grunnlag.Utbetalingsgrad; @@ -10,28 +7,41 @@ class UtbetalingsgradMedGraderingUtregning implements UtbetalingsgradUtregning { private final OppgittPeriode uttakPeriode; - private final AktivitetIdentifikator aktivitet; private final SamtidigUttaksprosent annenpartSamtidigUttaksprosent; - UtbetalingsgradMedGraderingUtregning(OppgittPeriode uttakPeriode, - AktivitetIdentifikator aktivitet, - SamtidigUttaksprosent annenpartSamtidigUttaksprosent) { + UtbetalingsgradMedGraderingUtregning(OppgittPeriode uttakPeriode, SamtidigUttaksprosent annenpartSamtidigUttaksprosent) { this.uttakPeriode = uttakPeriode; - this.aktivitet = aktivitet; this.annenpartSamtidigUttaksprosent = annenpartSamtidigUttaksprosent; } @Override public Utbetalingsgrad resultat() { - // Samtidiguttaksprosent med mindre gradering på noen aktiviteter i perioden - var lokalSamtidigUttaksprosent = uttakPeriode.erSøktGradering(aktivitet) ? Optional.ofNullable(uttakPeriode.getArbeidsprosent()) - .map(SamtidigUttaksprosent.HUNDRED::subtract) - .orElseThrow(() -> new IllegalArgumentException("arbeidstidsprosent kan ikke være null")) : SamtidigUttaksprosent.HUNDRED; + if (uttakPeriode.getArbeidsprosent() == null) { + throw new IllegalArgumentException("arbeidstidsprosent kan ikke være null"); + } + var søktUttaksprosent = SamtidigUttaksprosent.HUNDRED.subtract(uttakPeriode.getArbeidsprosent()); + + // Far søker gradering. Mor kan ha mindre enn 75% arbeids + var morsStillingsprosent = uttakPeriode.getMorsStillingsprosent(); var maksSamtidigUttakUtFraAnnenpart = SamtidigUttaksprosent.HUNDRED.subtract(annenpartSamtidigUttaksprosent); // Reduser utbetaling dersom annenpart > 0 og det ligger an til mer enn 100 prosent - if (lokalSamtidigUttaksprosent.subtract(maksSamtidigUttakUtFraAnnenpart).merEnn0()) { - return new Utbetalingsgrad(maksSamtidigUttakUtFraAnnenpart.decimalValue()); + + + if (morsStillingsprosent != null && maksSamtidigUttakUtFraAnnenpart.subtract(morsStillingsprosent.decimalValue()).merEnn0()) { + // morsStillingsprosent er minst og er taket + // TODO: Far graderer, mor i arbeid og samtidig uttak. Hva skjer hera? + return new Utbetalingsgrad(morsStillingsprosent.decimalValue()); + } else { + // maksSamtidigUttakUtFraAnnenpart er minst og er taket + if (søktUttaksprosent.subtract(maksSamtidigUttakUtFraAnnenpart).merEnn0()) { + return new Utbetalingsgrad(maksSamtidigUttakUtFraAnnenpart.decimalValue()); + } + + return new Utbetalingsgrad(søktUttaksprosent.decimalValue()); } - return new Utbetalingsgrad(lokalSamtidigUttaksprosent.decimalValue()); + + + + } } diff --git a/src/main/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/UtbetalingsgradSamtidigUttakUtregning.java b/src/main/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/UtbetalingsgradSamtidigUttakUtregning.java index 3de83505..ea53e00d 100644 --- a/src/main/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/UtbetalingsgradSamtidigUttakUtregning.java +++ b/src/main/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/UtbetalingsgradSamtidigUttakUtregning.java @@ -25,6 +25,7 @@ class UtbetalingsgradSamtidigUttakUtregning implements UtbetalingsgradUtregning @Override public Utbetalingsgrad resultat() { + // TODO SAMTIDIG UTTAK MED MOR ARBEID PEW PEW // Samtidiguttaksprosent med mindre gradering på noen aktiviteter i perioden var lokalSamtidigUttaksprosent = Optional.ofNullable(graderingArbeidstidsprosent) .map(SamtidigUttaksprosent.HUNDRED::subtract) diff --git a/src/main/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/UtbetalingsgradUtenGraderingUtregning.java b/src/main/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/UtbetalingsgradUtenGraderingUtregning.java index e9e1607a..921cae6c 100644 --- a/src/main/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/UtbetalingsgradUtenGraderingUtregning.java +++ b/src/main/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/UtbetalingsgradUtenGraderingUtregning.java @@ -20,6 +20,7 @@ public UtbetalingsgradUtenGraderingUtregning(SamtidigUttaksprosent annenpartSamt @Override public Utbetalingsgrad resultat() { if (morsStillingsprosent != null) { + // TODO: Annenparts samtidig uttaksprosent sammen med mor i arbeid return new Utbetalingsgrad(morsStillingsprosent.decimalValue()); } return Utbetalingsgrad.HUNDRED.subtract(annenpartSamtidigUttaksprosent.decimalValue()); diff --git a/src/main/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/grunnlag/MorsStillingsprosent.java b/src/main/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/grunnlag/MorsStillingsprosent.java index 3bf95c15..eb146823 100644 --- a/src/main/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/grunnlag/MorsStillingsprosent.java +++ b/src/main/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/grunnlag/MorsStillingsprosent.java @@ -6,14 +6,14 @@ public class MorsStillingsprosent implements Comparable { - public static final MorsStillingsprosent ZERO = new MorsStillingsprosent(0); - public static final MorsStillingsprosent TEN = new MorsStillingsprosent(10); - - private final BigDecimal verdi; public MorsStillingsprosent(BigDecimal verdi) { + Objects.requireNonNull(verdi, "Morsstillingssprosent må ha verdi hvis satt!"); this.verdi = scale(verdi); + if (this.verdi.compareTo(BigDecimal.valueOf(75)) >= 0 || this.verdi.compareTo(BigDecimal.ZERO) <= 0) { + throw new IllegalArgumentException("Mors stillingsprosent har en ugyldig verdi: " + this.verdi); + } } public MorsStillingsprosent(int verdi) { @@ -25,7 +25,7 @@ public BigDecimal decimalValue() { } private BigDecimal scale(BigDecimal verdi) { - return verdi.setScale(2, RoundingMode.DOWN); + return verdi.setScale(2, RoundingMode.UP); } @Override diff --git a/src/main/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/regelflyt/ForeldrepengerDelregel.java b/src/main/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/regelflyt/ForeldrepengerDelregel.java index fc9429ee..78e505be 100644 --- a/src/main/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/regelflyt/ForeldrepengerDelregel.java +++ b/src/main/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/regelflyt/ForeldrepengerDelregel.java @@ -294,7 +294,8 @@ private Specification sjekkOmAktivitetskravErOppfylt() private Specification sjekkGraderingVedKunFarMedmorRett() { return rs.hvisRegel(SjekkOmGradertPeriode.ID, SjekkOmGradertPeriode.BESKRIVELSE) - .hvis(new SjekkOmGradertPeriode(), Oppfylt.opprett("UT1315", InnvilgetÅrsak.GRADERING_FORELDREPENGER_KUN_FAR_HAR_RETT, true)) + .hvis(new SjekkOmGradertPeriode(), + Oppfylt.opprett("UT1315", InnvilgetÅrsak.GRADERING_FORELDREPENGER_KUN_FAR_HAR_RETT, true)) .ellers(Oppfylt.opprett("UT1316", InnvilgetÅrsak.FORELDREPENGER_KUN_FAR_HAR_RETT, true)); } diff --git a/src/test/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/DelvisArbeidOrkestreringTest.java b/src/test/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/DelvisArbeidOrkestreringTest.java index 08fdeea4..4cc9129e 100644 --- a/src/test/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/DelvisArbeidOrkestreringTest.java +++ b/src/test/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/DelvisArbeidOrkestreringTest.java @@ -32,7 +32,7 @@ public class DelvisArbeidOrkestreringTest extends FastsettePerioderRegelOrkestre class BareFarHarRett { @Test void far_fullt_uttak_mor_over_75_prosent_i_arbeid() { - var oppgittPeriode = lagOppgittPeriode(new MorsStillingsprosent(100)); + var oppgittPeriode = lagOppgittPeriode(null); var fastsattePerioder = fastsettPerioder(lagGrunnlag(oppgittPeriode)); @@ -43,14 +43,14 @@ void far_fullt_uttak_mor_over_75_prosent_i_arbeid() { } @Test - void far_fullt_uttak_mor_75_prosent_i_arbeid() { - var oppgittPeriode = lagOppgittPeriode(new MorsStillingsprosent(75)); + void far_fullt_uttak_mor_akkurat_ikke_75_prosent_i_arbeid() { + var oppgittPeriode = lagOppgittPeriode(new MorsStillingsprosent(BigDecimal.valueOf(74.99))); var fastsattePerioder = fastsettPerioder(lagGrunnlag(oppgittPeriode)); assertThat(fastsattePerioder).hasSize(1); assertThat(fastsattePerioder.getFirst().uttakPeriode().getPerioderesultattype()).isEqualTo(Perioderesultattype.INNVILGET); - assertThat(fastsattePerioder.getFirst().uttakPeriode().getUtbetalingsgrad(ARBEIDSFORHOLD)).isEqualTo(new Utbetalingsgrad(100)); + assertThat(fastsattePerioder.getFirst().uttakPeriode().getUtbetalingsgrad(ARBEIDSFORHOLD)).isEqualTo(new Utbetalingsgrad(74.99)); assertThat(fastsattePerioder.getFirst().uttakPeriode().getTrekkdager(ARBEIDSFORHOLD)).isEqualTo(new Trekkdager(30)); } @@ -67,8 +67,8 @@ void far_fullt_uttak_mor_under_75_prosent_i_arbeid() { } @Test - void far_graderer_20_prosent_mor_er_over_75_prosent_i_arbeid() { - var oppgittPeriode = lagOppgittPeriode(new MorsStillingsprosent(100), 20); + void far_søker_80_prosent_uttak_mor_er_over_75_prosent_i_arbeid() { + var oppgittPeriode = lagOppgittPeriode(null, 20); var fastsattePerioder = fastsettPerioder(lagGrunnlag(oppgittPeriode)); @@ -79,7 +79,7 @@ void far_graderer_20_prosent_mor_er_over_75_prosent_i_arbeid() { } @Test - void far_graderer_40_prosent_mor_arbeider_40_prosent() { + void far_søker_60_prosent_uttak_mor_arbeider_40_prosent() { var oppgittPeriode = lagOppgittPeriode(new MorsStillingsprosent(40), 40); var fastsattePerioder = fastsettPerioder(lagGrunnlag(oppgittPeriode)); @@ -91,7 +91,7 @@ void far_graderer_40_prosent_mor_arbeider_40_prosent() { } @Test - void far_graderer_60_prosent_mor_arbeider_40_prosent() { + void far_søker_40_prosent_uttak_mor_arbeider_40_prosent() { var oppgittPeriode = lagOppgittPeriode(new MorsStillingsprosent(40), 60); var fastsattePerioder = fastsettPerioder(lagGrunnlag(oppgittPeriode)); @@ -118,21 +118,19 @@ void far_graderer_80_prosent_mor_arbeider_40_prosent() { @Nested class BeggeHarRett { @Test - void far_graderer_80_prosent_mor_arbeider_40_prosent_fellesperiode() { - var farsArbeidsprosent = 80; - var morsStillingsprosent = new MorsStillingsprosent(40); + void far_søker_20_prosent_uttak_mor_arbeider_40_prosent() { var oppgittPeriode = OppgittPeriode.forGradering( FELLESPERIODE, FØDSELSDATO.plusWeeks(6), // 30 dager FØDSELSDATO.plusWeeks(12).minusDays(1), - BigDecimal.valueOf(farsArbeidsprosent), + BigDecimal.valueOf(80), null, false, Set.of(ARBEIDSFORHOLD), FØDSELSDATO, FØDSELSDATO, ARBEID, - morsStillingsprosent, + new MorsStillingsprosent(40), DokumentasjonVurdering.MORS_AKTIVITET_GODKJENT); var grunnlag = new RegelGrunnlag.Builder().behandling(farBehandling()) diff --git a/src/test/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/UtbetalingsgradMedGraderingUtregningTest.java b/src/test/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/UtbetalingsgradMedGraderingUtregningTest.java index e25c39ca..fa1e3706 100644 --- a/src/test/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/UtbetalingsgradMedGraderingUtregningTest.java +++ b/src/test/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/UtbetalingsgradMedGraderingUtregningTest.java @@ -25,14 +25,14 @@ void toArbeidsforholdMedEnGradertGirRedusertUtbetalingsgrad() { var periode = OppgittPeriode.forGradering(Stønadskontotype.FEDREKVOTE, LocalDate.now(), LocalDate.now().plusWeeks(1), arbeidstidsprosent, null, false, Set.of(aktivitet1), null, null, null, null, null); - var utregningForAktivitet1 = utregning(aktivitet1, periode); - var utregningForAktivitet2 = utregning(aktivitet2, periode); + var utregningForAktivitet1 = utregning(periode); + var utregningForAktivitet2 = utregning(periode); assertThat(utregningForAktivitet1.resultat()).isEqualTo(Utbetalingsgrad.FULL.subtract(arbeidstidsprosent)); assertThat(utregningForAktivitet2.resultat()).isEqualTo(Utbetalingsgrad.FULL); } - private UtbetalingsgradMedGraderingUtregning utregning(AktivitetIdentifikator aktivitetIdentifikator, OppgittPeriode periode) { - return new UtbetalingsgradMedGraderingUtregning(periode, aktivitetIdentifikator, SamtidigUttaksprosent.ZERO); + private UtbetalingsgradMedGraderingUtregning utregning(OppgittPeriode periode) { + return new UtbetalingsgradMedGraderingUtregning(periode, SamtidigUttaksprosent.ZERO); } } diff --git a/src/test/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/UtbetalingsgradUtenGraderingUtregningTest.java b/src/test/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/UtbetalingsgradUtenGraderingUtregningTest.java index 884724c9..42ff21c1 100644 --- a/src/test/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/UtbetalingsgradUtenGraderingUtregningTest.java +++ b/src/test/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/UtbetalingsgradUtenGraderingUtregningTest.java @@ -19,7 +19,7 @@ class UtbetalingsgradUtenGraderingUtregningTest { @Test void utbetaling_skal_være_justert_til_annenparts_stillingsprosent() { - var utregning = new UtbetalingsgradUtenGraderingUtregning(SamtidigUttaksprosent.ZERO, MorsStillingsprosent.TEN); + var utregning = new UtbetalingsgradUtenGraderingUtregning(SamtidigUttaksprosent.ZERO, new MorsStillingsprosent(10)); assertThat(utregning.resultat()).isEqualTo(Utbetalingsgrad.TEN); } }