Skip to content

Commit

Permalink
Utvide UtbetalingsgradUtregning med hensyn til mors stillingsprosent
Browse files Browse the repository at this point in the history
  • Loading branch information
espenwaaga authored and sirimykland committed Jun 18, 2024
1 parent 2b818c6 commit 959a8d4
Show file tree
Hide file tree
Showing 9 changed files with 51 additions and 40 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,37 +1,47 @@
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;

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());




}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,14 @@

public class MorsStillingsprosent implements Comparable<MorsStillingsprosent> {

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) {
Expand All @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -294,7 +294,8 @@ private Specification<FastsettePeriodeGrunnlag> sjekkOmAktivitetskravErOppfylt()

private Specification<FastsettePeriodeGrunnlag> 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));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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));

Expand All @@ -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));
}

Expand All @@ -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));

Expand All @@ -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));
Expand All @@ -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));
Expand All @@ -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())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}

0 comments on commit 959a8d4

Please sign in to comment.