Skip to content

Commit

Permalink
Rydder opp i beregning av trekkdager og utbetalingsgrad
Browse files Browse the repository at this point in the history
  • Loading branch information
espenwaaga committed Jun 26, 2024
1 parent a716939 commit b365522
Show file tree
Hide file tree
Showing 8 changed files with 189 additions and 66 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@
import no.nav.foreldrepenger.regler.uttak.fastsetteperiode.grunnlag.Periode;
import no.nav.foreldrepenger.regler.uttak.fastsetteperiode.grunnlag.RegelGrunnlag;
import no.nav.foreldrepenger.regler.uttak.fastsetteperiode.grunnlag.Revurdering;
import no.nav.foreldrepenger.regler.uttak.fastsetteperiode.grunnlag.SamtidigUttaksprosent;
import no.nav.foreldrepenger.regler.uttak.fastsetteperiode.grunnlag.Stønadskontotype;
import no.nav.foreldrepenger.regler.uttak.fastsetteperiode.grunnlag.UttakPeriode;
import no.nav.foreldrepenger.regler.uttak.fastsetteperiode.grunnlag.Vedtak;
Expand All @@ -39,7 +38,6 @@
import no.nav.foreldrepenger.regler.uttak.fastsetteperiode.utfall.TomKontoKnekkpunkt;
import no.nav.foreldrepenger.regler.uttak.fastsetteperiode.util.ManglendeSøktePerioderForSammenhengendeUttakTjeneste;
import no.nav.foreldrepenger.regler.uttak.fastsetteperiode.util.ManglendeSøktePerioderTjeneste;
import no.nav.foreldrepenger.regler.uttak.fastsetteperiode.util.SamtidigUttakUtil;
import no.nav.fpsak.nare.evaluation.Evaluation;
import no.nav.fpsak.nare.evaluation.summary.EvaluationSerializer;
import no.nav.fpsak.nare.evaluation.summary.NareVersion;
Expand Down Expand Up @@ -200,7 +198,7 @@ private RegelResultatBehandlerResultat behandleRegelresultat(Evaluation evalueri
return switch (utfallType) {
case AVSLÅTT -> behandler.avslåAktuellPeriode(aktuellPeriode, regelresultat, knekkpunktOpt,
overlapperMedInnvilgetAnnenpartsPeriode(aktuellPeriode, annenpartUttaksperioder(regelGrunnlag)));
case INNVILGET -> behandler.innvilgAktuellPeriode(aktuellPeriode, knekkpunktOpt, regelresultat, fastsettePeriodeGrunnlag);
case INNVILGET -> behandler.innvilgAktuellPeriode(knekkpunktOpt, regelresultat, fastsettePeriodeGrunnlag);
case MANUELL_BEHANDLING -> behandler.manuellBehandling(aktuellPeriode, regelresultat);
};
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package no.nav.foreldrepenger.regler.uttak.fastsetteperiode;

import static no.nav.foreldrepenger.regler.uttak.fastsetteperiode.ValgAvStønadskontoTjeneste.velgStønadskonto;
import static no.nav.foreldrepenger.regler.uttak.fastsetteperiode.util.SamtidigUttakUtil.kanRedusereUtbetalingsgradForTapende;

import java.util.Optional;
import java.util.Set;
Expand Down Expand Up @@ -30,21 +31,21 @@ class RegelResultatBehandler {
this.regelGrunnlag = regelGrunnlag;
}

RegelResultatBehandlerResultat innvilgAktuellPeriode(OppgittPeriode oppgittPeriode,
Optional<TomKontoKnekkpunkt> knekkpunktOpt,
RegelResultatBehandlerResultat innvilgAktuellPeriode(Optional<TomKontoKnekkpunkt> knekkpunktOpt,
FastsettePerioderRegelresultat regelresultat,
FastsettePeriodeGrunnlag fastsettePeriodeGrunnlag) {
var oppgittPeriode = fastsettePeriodeGrunnlag.getAktuellPeriode();
var innvilgPeriode = knekkpunktOpt.map(TomKontoKnekkpunkt::dato)
.map(k -> oppgittPeriode.kopiMedNyPeriode(oppgittPeriode.getFom(), k.minusDays(1)))
.orElse(oppgittPeriode);

// Vi skal redusere søker i forhold til annenparts uttaksprosent slik at de til sammen har 100% uttaksprosent
var redusertUttaksprosentPgaSamtidigUttakMedSamletUttak100 = SamtidigUttakUtil.kanRedusereUtbetalingsgradForTapende(fastsettePeriodeGrunnlag, regelGrunnlag)
var redusertUttaksprosentPgaSamtidigUttakMedSamletUttak100 = kanRedusereUtbetalingsgradForTapende(fastsettePeriodeGrunnlag, regelGrunnlag)
? SamtidigUttaksprosent.HUNDRED.subtract(SamtidigUttakUtil.uttaksprosentAnnenpart(fastsettePeriodeGrunnlag))
: null;

var aktiviteter = lagAktiviteter(innvilgPeriode, regelresultat, false, redusertUttaksprosentPgaSamtidigUttakMedSamletUttak100);
var samtidigUttaksprosent = regnSamtidigUttaksprosentMotGradering(innvilgPeriode, redusertUttaksprosentPgaSamtidigUttakMedSamletUttak100);
var samtidigUttaksprosent = regnSamtidigUttaksprosentMotGradering(innvilgPeriode, redusertUttaksprosentPgaSamtidigUttakMedSamletUttak100); // TODO: Gjennomgang av hva dette er brukt til
var innvilget = new UttakPeriode(innvilgPeriode, Perioderesultattype.INNVILGET, null, regelresultat.getAvklaringÅrsak(),
regelresultat.getGraderingIkkeInnvilgetÅrsak(), aktiviteter, samtidigUttaksprosent, innvilgPeriode.getStønadskontotype());

Expand Down Expand Up @@ -151,16 +152,13 @@ private PeriodeAktivitetResultat finnPeriodeAktivitetResultat(OppgittPeriode opp
return new PeriodeAktivitetResultat(Utbetalingsgrad.ZERO, Trekkdager.ZERO);
}

var utbetalingsgrad = Utbetalingsgrad.ZERO;
if (regelresultat.skalUtbetale()) {
// øvreGrenseUtbetalingsgrad kan utledes med hensyn til morsStillingsprosent mot øvreGrenseUtbetalingsgrad (utbetalingsgraden som utgjør 100 samlet samtidig uttak)
utbetalingsgrad = UtbetalingsgradUtil.beregnUtbetalingsgradFor(oppgittPeriode, aktivitet, øvreGrenseUtbetalingsgrad);
}
var trekkdager = Trekkdager.ZERO;
if (regelresultat.trekkDagerFraSaldo() && !(manuellBehandling && stønadskonto.isEmpty())) {
var graderingSøktOgInnvilget = regelresultat.getGraderingIkkeInnvilgetÅrsak() == null && oppgittPeriode.erSøktGradering(aktivitet);
trekkdager = TrekkdagerUtregningUtil.trekkdagerFor(oppgittPeriode, graderingSøktOgInnvilget, utbetalingsgrad);
}
var utbetalingsgrad = regelresultat.skalUtbetale()
? UtbetalingsgradUtil.beregnUtbetalingsgradFor(oppgittPeriode, aktivitet, øvreGrenseUtbetalingsgrad)
: Utbetalingsgrad.ZERO;

var trekkdager = regelresultat.trekkDagerFraSaldo() && !(manuellBehandling && stønadskonto.isEmpty())
? TrekkdagerUtregningUtil.beregnTrekkdagerFor(oppgittPeriode, aktivitet, utbetalingsgrad, regelresultat.skalUtbetale(), regelresultat.getGraderingIkkeInnvilgetÅrsak())
: Trekkdager.ZERO;

return new PeriodeAktivitetResultat(utbetalingsgrad, trekkdager);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,10 @@
import java.math.BigDecimal;
import java.math.RoundingMode;

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.Utbetalingsgrad;
import no.nav.foreldrepenger.regler.uttak.fastsetteperiode.utfall.GraderingIkkeInnvilgetÅrsak;

public final class TrekkdagerUtregningUtil {

Expand All @@ -13,19 +15,24 @@ public final class TrekkdagerUtregningUtil {
private TrekkdagerUtregningUtil() {
}


public static Trekkdager trekkdagerFor(OppgittPeriode oppgittPeriode, boolean graderingSøktOgInnvilget, Utbetalingsgrad utbetalingsgrad) {
public static Trekkdager beregnTrekkdagerFor(OppgittPeriode oppgittPeriode,
AktivitetIdentifikator aktivitet,
Utbetalingsgrad utbetalingsgrad,
boolean skalUtbetale,
GraderingIkkeInnvilgetÅrsak graderingIkkeInnvilgetÅrsak) {
var virkedagerIPerioden = Virkedager.beregnAntallVirkedager(oppgittPeriode);

if (graderingSøktOgInnvilget) {
return beregnetTrekkdager(virkedagerIPerioden, BIG_DECIMAL_100.subtract(oppgittPeriode.getArbeidsprosent()));
}

if (!Utbetalingsgrad.ZERO.equals(utbetalingsgrad)) {
if (skalUtbetale) {
if (graderingIkkeInnvilgetÅrsak != null) {
return new Trekkdager(virkedagerIPerioden);
}
return beregnetTrekkdager(virkedagerIPerioden, utbetalingsgrad.decimalValue());
} else {
if (oppgittPeriode.erSøktGradering(aktivitet)) {
return beregnetTrekkdager(virkedagerIPerioden, BIG_DECIMAL_100.subtract(oppgittPeriode.getArbeidsprosent()));
}
return new Trekkdager(virkedagerIPerioden);
}

return new Trekkdager(virkedagerIPerioden);
}

private static Trekkdager beregnetTrekkdager(int virkedagerIPerioden, BigDecimal trekkProsent) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,14 @@ private UtbetalingsgradUtil() {}

public static Utbetalingsgrad beregnUtbetalingsgradFor(OppgittPeriode oppgittPeriode, AktivitetIdentifikator aktivitet, SamtidigUttaksprosent øvreGrenseUtbetalingsgrad) {
var beregnetUtbetalingsgrad = UTBETALINGSGRAD_100;
if (oppgittPeriode.erSøktGradering(aktivitet) || (oppgittPeriode.erSøktGradering() && oppgittPeriode.erSøktSamtidigUttak())) {
if (oppgittPeriode.erSøktGradering(aktivitet) || (oppgittPeriode.erSøktGradering() && oppgittPeriode.erSøktSamtidigUttak())) { // TODO: gradering og samtidig?
beregnetUtbetalingsgrad = UTBETALINGSGRAD_100.subtract(oppgittPeriode.getArbeidsprosent());
} else if (oppgittPeriode.erSøktSamtidigUttak()) {
beregnetUtbetalingsgrad = oppgittPeriode.getSamtidigUttaksprosent().decimalValue();
}


return øvreGrenseUtbetalingsgrad != null
? new Utbetalingsgrad(beregnetUtbetalingsgrad.min(øvreGrenseUtbetalingsgrad.decimalValue())) //
? new Utbetalingsgrad(beregnetUtbetalingsgrad.min(øvreGrenseUtbetalingsgrad.decimalValue()))
: new Utbetalingsgrad(beregnetUtbetalingsgrad);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -91,8 +91,11 @@ public static boolean gjelderFlerbarnsdager(FastsettePeriodeGrunnlag grunnlag) {
public static boolean kanRedusereUtbetalingsgradForTapende(FastsettePeriodeGrunnlag periodeGrunnlag, RegelGrunnlag regelGrunnlag) {
// Er det ikkejusterbar periode, samtidig uttak under 100% eller 150/200% tilfelle?
var kanReduseres = regelGrunnlag.getBehandling().isBerørtBehandling() || erTapendePeriodeUtregning(periodeGrunnlag);
if (!kanReduseres || !annenpartHarSamtidigPeriodeMedUtbetaling(periodeGrunnlag) || !merEnn100ProsentSamtidigUttak(periodeGrunnlag)
|| akseptert200ProsentSamtidigUttak(periodeGrunnlag) || akseptert150ProsentSamtidigUttak(periodeGrunnlag)) {
if (!kanReduseres
|| !annenpartHarSamtidigPeriodeMedUtbetaling(periodeGrunnlag)
|| !merEnn100ProsentSamtidigUttak(periodeGrunnlag)
|| akseptert200ProsentSamtidigUttak(periodeGrunnlag)
|| akseptert150ProsentSamtidigUttak(periodeGrunnlag)) {
return false;
}
// Sjekker om annenparts utbetalingsgrad <=80 slik at gjenværende utbetaling etter reduksjon er >= 20% (i første omgang)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
import java.util.List;
import java.util.Set;

import no.nav.foreldrepenger.regler.uttak.fastsetteperiode.grunnlag.UttakPeriode;

import org.junit.jupiter.api.Test;

import no.nav.foreldrepenger.regler.uttak.fastsetteperiode.grunnlag.Adopsjon;
Expand Down Expand Up @@ -230,6 +232,8 @@ void samtidig_uttaksprosent_skal_settes_til_100_minus_gradering_arbeidstidsprose
assertThat(resultat.get(3).uttakPeriode().getGraderingIkkeInnvilgetÅrsak()).isNull();
assertTrekkdager(resultat.get(3), ARBEIDSFORHOLD_1, new Trekkdager(new BigDecimal("22.50")));
assertTrekkdager(resultat.get(3), ARBEIDSFORHOLD_2, Trekkdager.ZERO);


assertKontoOgResultat(resultat.get(4), MØDREKVOTE, MANUELL_BEHANDLING);
assertTrekkdager(resultat.get(4), ARBEIDSFORHOLD_1, new Trekkdager(new BigDecimal("22.50")));
assertThat(resultat.get(4).uttakPeriode().getUtbetalingsgrad(ARBEIDSFORHOLD_2)).isEqualTo(Utbetalingsgrad.ZERO);
Expand Down Expand Up @@ -725,33 +729,33 @@ void skal_knekke_riktig_ved_flere_graderingsperioder_og_flere_arbeidsforhold() {
var fødselsdato = LocalDate.of(2018, 1, 1);
var grunnlag = RegelGrunnlagTestBuilder.create();
leggPåKvoter(grunnlag);
var mottattDato = fødselsdato.plusWeeks(8).minusDays(1);
var kontoer = new Kontoer.Builder().konto(konto(MØDREKVOTE, 200));
var gradering = OppgittPeriode.forGradering(MØDREKVOTE, fødselsdato.plusWeeks(5), mottattDato.plusWeeks(1), BigDecimal.TEN, null, false,
Set.of(ARBEIDSFORHOLD_1), mottattDato, mottattDato, null, null);
grunnlag.datoer(new Datoer.Builder().fødsel(fødselsdato))
.rettOgOmsorg(beggeRett())
.arbeid(new Arbeid.Builder().arbeidsforhold(new Arbeidsforhold(ARBEIDSFORHOLD_1)).arbeidsforhold(new Arbeidsforhold(ARBEIDSFORHOLD_2)))
.kontoer(kontoer)
.behandling(morBehandling().kreverSammenhengendeUttak(true))
.søknad(new Søknad.Builder().type(Søknadstype.FØDSEL)
.behandling(morBehandling())
.søknad(new Søknad.Builder()
.type(Søknadstype.FØDSEL)
.oppgittPeriode(oppgittPeriode(MØDREKVOTE, fødselsdato, fødselsdato.plusWeeks(5).minusDays(1)))
.oppgittPeriode(gradering))
.oppgittPeriode(gradertoppgittPeriode(MØDREKVOTE, fødselsdato.plusWeeks(5), fødselsdato.plusWeeks(9), BigDecimal.TEN, Set.of(ARBEIDSFORHOLD_1))))
.inngangsvilkår(oppfyltAlleVilkår());
var resultat = fastsettPerioder(grunnlag);
assertThat(resultat).hasSize(3);
assertThat(resultat.get(1).uttakPeriode().getGraderingIkkeInnvilgetÅrsak()).isEqualTo(
GraderingIkkeInnvilgetÅrsak.AVSLAG_PGA_FOR_TIDLIG_GRADERING);
assertThat(resultat.get(1).uttakPeriode().erGraderingInnvilget()).isFalse();
assertThat(resultat.get(1).uttakPeriode().erGraderingInnvilget(ARBEIDSFORHOLD_1)).isFalse();
assertThat(resultat.get(1).uttakPeriode().erGraderingInnvilget(ARBEIDSFORHOLD_1)).isFalse();
assertThat(resultat.get(1)
.uttakPeriode()
var avslåttGraderingFørUke7 = resultat.get(1).uttakPeriode();
assertThat(avslåttGraderingFørUke7.erGraderingInnvilget()).isFalse();
assertThat(avslåttGraderingFørUke7.getGraderingIkkeInnvilgetÅrsak()).isEqualTo(GraderingIkkeInnvilgetÅrsak.AVSLAG_PGA_FOR_TIDLIG_GRADERING);
assertThat(avslåttGraderingFørUke7.erGraderingInnvilget(ARBEIDSFORHOLD_1)).isFalse();
assertThat(avslåttGraderingFørUke7.getUtbetalingsgrad(ARBEIDSFORHOLD_1)).isEqualTo(new Utbetalingsgrad(90));
assertThat(avslåttGraderingFørUke7.getTrekkdager(ARBEIDSFORHOLD_1)).isEqualTo(new Trekkdager(5));
assertThat(avslåttGraderingFørUke7.erGraderingInnvilget(ARBEIDSFORHOLD_2)).isFalse();
assertThat(avslåttGraderingFørUke7.getUtbetalingsgrad(ARBEIDSFORHOLD_2)).isEqualTo(Utbetalingsgrad.FULL);
assertThat(avslåttGraderingFørUke7.getTrekkdager(ARBEIDSFORHOLD_2)).isEqualTo(new Trekkdager(5));
assertThat(avslåttGraderingFørUke7
.getAktiviteter()
.stream()
.anyMatch(a -> a.isSøktGradering() && a.getIdentifikator().equals(ARBEIDSFORHOLD_1))).isTrue();
assertThat(resultat.get(1)
.uttakPeriode()
assertThat(avslåttGraderingFørUke7
.getAktiviteter()
.stream()
.anyMatch(a -> a.isSøktGradering() && a.getIdentifikator().equals(ARBEIDSFORHOLD_2))).isFalse();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -442,11 +442,14 @@ void bfhr_minsterett_gradering_flere_arbeidsforhold() {
@Test
void bfhr_minsterett_gradering_flere_arbeidsforhold_2() {
var fødselsdato = LocalDate.of(2023, 10, 2);
var kontoer = new Kontoer.Builder().konto(konto(FORELDREPENGER, 40 * 5)).minsterettDager(8 * 5);
var kontoer = new Kontoer.Builder()
.konto(konto(FORELDREPENGER, 40 * 5))
.minsterettDager(8 * 5);
var arbeidsforhold1 = AktivitetIdentifikator.forArbeid(new Orgnummer("1"), null);
var arbeidsforhold2 = AktivitetIdentifikator.forArbeid(new Orgnummer("2"), null);
var gradering = OppgittPeriode.forGradering(FORELDREPENGER, fødselsdato, LocalDate.of(2024, 1, 22), BigDecimal.valueOf(50), null, false,
Set.of(arbeidsforhold1), fødselsdato, fødselsdato, null, null);
var virkedager = Virkedager.beregnAntallVirkedager(gradering);

var søknad = new Søknad.Builder().type(Søknadstype.FØDSEL).oppgittePerioder(List.of(gradering));

Expand All @@ -465,9 +468,9 @@ void bfhr_minsterett_gradering_flere_arbeidsforhold_2() {
assertThat(fastsattePerioder.get(2).uttakPeriode().getTrekkdager(arbeidsforhold1)).isEqualTo(new Trekkdager(20));
assertThat(fastsattePerioder.get(2).uttakPeriode().getTrekkdager(arbeidsforhold2)).isEqualTo(new Trekkdager(0));
assertThat(fastsattePerioder.get(2).uttakPeriode().getUtbetalingsgrad(arbeidsforhold2)).isEqualTo(Utbetalingsgrad.ZERO);

assertThat(fastsattePerioder.get(3).uttakPeriode().getPerioderesultattype()).isEqualTo(Perioderesultattype.AVSLÅTT);
//Søkt en dag for mye minsterett
assertThat(fastsattePerioder.get(3).uttakPeriode().getTrekkdager(arbeidsforhold1)).isEqualTo(new Trekkdager(0.5));
assertThat(fastsattePerioder.get(3).uttakPeriode().getTrekkdager(arbeidsforhold1)).isEqualTo(new Trekkdager(0.5)); //Søkt en dag for mye minsterett
assertThat(fastsattePerioder.get(3).uttakPeriode().getTrekkdager(arbeidsforhold2)).isEqualTo(new Trekkdager(1));
assertThat(fastsattePerioder.get(3).uttakPeriode().getPeriodeResultatÅrsak()).isEqualTo(AKTIVITET_UKJENT_UDOKUMENTERT);
}
Expand Down
Loading

0 comments on commit b365522

Please sign in to comment.