Skip to content

Commit

Permalink
Forenkler beregningen av utbetalingsgrad og trekkdager
Browse files Browse the repository at this point in the history
  • Loading branch information
espenwaaga committed Jun 21, 2024
1 parent 4783069 commit 6eeccf9
Show file tree
Hide file tree
Showing 14 changed files with 230 additions and 268 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -197,13 +197,10 @@ private RegelResultatBehandlerResultat behandleRegelresultat(Evaluation evalueri
var knekkpunktOpt = finnKnekkpunkt(aktuellPeriode, regelGrunnlag, saldoUtregning, regelresultat,
fastsettePeriodeGrunnlag.periodeFarRundtFødsel().orElse(null));

var annenpartSamtidigUttaksprosent = SamtidigUttakUtil.kanRedusereUtbetalingsgradForTapende(fastsettePeriodeGrunnlag,
regelGrunnlag) ? SamtidigUttakUtil.uttaksprosentAnnenpart(fastsettePeriodeGrunnlag) : SamtidigUttaksprosent.ZERO;

return switch (utfallType) {
case AVSLÅTT -> behandler.avslåAktuellPeriode(aktuellPeriode, regelresultat, knekkpunktOpt,
overlapperMedInnvilgetAnnenpartsPeriode(aktuellPeriode, annenpartUttaksperioder(regelGrunnlag)));
case INNVILGET -> behandler.innvilgAktuellPeriode(aktuellPeriode, knekkpunktOpt, regelresultat, annenpartSamtidigUttaksprosent);
case INNVILGET -> behandler.innvilgAktuellPeriode(aktuellPeriode, knekkpunktOpt, regelresultat, fastsettePeriodeGrunnlag);
case MANUELL_BEHANDLING -> behandler.manuellBehandling(aktuellPeriode, regelresultat);
};
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

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

import java.math.BigDecimal;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
Expand All @@ -18,6 +19,7 @@
import no.nav.foreldrepenger.regler.uttak.fastsetteperiode.saldo.SaldoUtregning;
import no.nav.foreldrepenger.regler.uttak.fastsetteperiode.utfall.TomKontoKnekkpunkt;
import no.nav.foreldrepenger.regler.uttak.fastsetteperiode.utfall.UtfallType;
import no.nav.foreldrepenger.regler.uttak.fastsetteperiode.util.SamtidigUttakUtil;

class RegelResultatBehandler {

Expand All @@ -32,14 +34,20 @@ class RegelResultatBehandler {
RegelResultatBehandlerResultat innvilgAktuellPeriode(OppgittPeriode oppgittPeriode,
Optional<TomKontoKnekkpunkt> knekkpunktOpt,
FastsettePerioderRegelresultat regelresultat,
SamtidigUttaksprosent annenpartSamtidigUttaksprosent) {
FastsettePeriodeGrunnlag fastsettePeriodeGrunnlag) {
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 redusertUttaksprosentPgaSamtidigUttak = SamtidigUttakUtil.kanRedusereUtbetalingsgradForTapende(fastsettePeriodeGrunnlag, regelGrunnlag)
? SamtidigUttaksprosent.HUNDRED.subtract(SamtidigUttakUtil.uttaksprosentAnnenpart(fastsettePeriodeGrunnlag))
: null;

var aktiviteter = lagAktiviteter(innvilgPeriode, regelresultat, false, redusertUttaksprosentPgaSamtidigUttak);
var samtidigUttaksprosent = regnSamtidigUttaksprosentMotGradering(innvilgPeriode, redusertUttaksprosentPgaSamtidigUttak);
var innvilget = new UttakPeriode(innvilgPeriode, Perioderesultattype.INNVILGET, null, regelresultat.getAvklaringÅrsak(),
regelresultat.getGraderingIkkeInnvilgetÅrsak(), lagAktiviteter(innvilgPeriode, regelresultat, false, annenpartSamtidigUttaksprosent),
regnSamtidigUttaksprosentMotGradering(innvilgPeriode, annenpartSamtidigUttaksprosent), innvilgPeriode.getStønadskontotype());
regelresultat.getGraderingIkkeInnvilgetÅrsak(), aktiviteter, samtidigUttaksprosent, innvilgPeriode.getStønadskontotype());

if (knekkpunktOpt.isEmpty()) {
return RegelResultatBehandlerResultat.utenKnekk(innvilget);
Expand All @@ -61,8 +69,8 @@ RegelResultatBehandlerResultat innvilgAktuellPeriode(OppgittPeriode oppgittPerio

var avslått = new UttakPeriode(avslåPeriode, Perioderesultattype.AVSLÅTT, null, regelresultat.getAvklaringÅrsak(),
regelresultat.getGraderingIkkeInnvilgetÅrsak(),
lagAktiviteter(avslåPeriode, regelresultat, overlapperInnvilgetAnnenpartsPeriode, SamtidigUttaksprosent.ZERO),
regnSamtidigUttaksprosentMotGradering(avslåPeriode, SamtidigUttaksprosent.ZERO), konto(avslåPeriode).orElse(null));
lagAktiviteter(avslåPeriode, regelresultat, overlapperInnvilgetAnnenpartsPeriode, null),
regnSamtidigUttaksprosentMotGradering(avslåPeriode), konto(avslåPeriode).orElse(null));

if (!overlapperInnvilgetAnnenpartsPeriode && knekkpunktOpt.isPresent()) {
validerKnekkpunkt(oppgittPeriode, knekkpunktOpt.get());
Expand All @@ -73,16 +81,21 @@ RegelResultatBehandlerResultat innvilgAktuellPeriode(OppgittPeriode oppgittPerio
}
}

private static SamtidigUttaksprosent regnSamtidigUttaksprosentMotGradering(OppgittPeriode oppgittPeriode) {
return regnSamtidigUttaksprosentMotGradering(oppgittPeriode, null);
}

private static SamtidigUttaksprosent regnSamtidigUttaksprosentMotGradering(OppgittPeriode oppgittPeriode,
SamtidigUttaksprosent annenpartSamtidigUttaksprosent) {
if (!oppgittPeriode.erSøktSamtidigUttak() && !annenpartSamtidigUttaksprosent.merEnn0()) {
SamtidigUttaksprosent redusertSamtidigUttaksprosent) {
if (!oppgittPeriode.erSøktSamtidigUttak() && redusertSamtidigUttaksprosent == null) {
return null;
}
if (annenpartSamtidigUttaksprosent.merEnn0()) {
return SamtidigUttaksprosent.HUNDRED.subtract(annenpartSamtidigUttaksprosent);
if (redusertSamtidigUttaksprosent != null) {
return redusertSamtidigUttaksprosent;
}
return oppgittPeriode.erSøktGradering() ? SamtidigUttaksprosent.HUNDRED.subtract(
oppgittPeriode.getArbeidsprosent()) : oppgittPeriode.getSamtidigUttaksprosent();
return oppgittPeriode.erSøktGradering()
? SamtidigUttaksprosent.HUNDRED.subtract(oppgittPeriode.getArbeidsprosent())
: oppgittPeriode.getSamtidigUttaksprosent();
}

private Optional<Stønadskontotype> konto(OppgittPeriode oppgittPeriode) {
Expand All @@ -93,8 +106,8 @@ RegelResultatBehandlerResultat manuellBehandling(OppgittPeriode oppgittPeriode,
var stønadskontotype = konto(oppgittPeriode);
var resultat = new UttakPeriode(oppgittPeriode, Perioderesultattype.MANUELL_BEHANDLING, regelresultat.getManuellbehandlingårsak(),
regelresultat.getAvklaringÅrsak(), regelresultat.getGraderingIkkeInnvilgetÅrsak(),
lagAktiviteter(oppgittPeriode, regelresultat, false, SamtidigUttaksprosent.ZERO),
regnSamtidigUttaksprosentMotGradering(oppgittPeriode, SamtidigUttaksprosent.ZERO), stønadskontotype.orElse(null));
lagAktiviteter(oppgittPeriode, regelresultat, false, null),
regnSamtidigUttaksprosentMotGradering(oppgittPeriode), stønadskontotype.orElse(null));
return RegelResultatBehandlerResultat.utenKnekk(resultat);
}

Expand All @@ -105,21 +118,21 @@ RegelResultatBehandlerResultat manuellBehandling(OppgittPeriode oppgittPeriode,
private Set<UttakPeriodeAktivitet> lagAktiviteter(OppgittPeriode oppgittPeriode,
FastsettePerioderRegelresultat regelresultat,
boolean overlapperMedInnvilgetPeriodeHosAnnenpart,
SamtidigUttaksprosent annenpartSamtidigUttaksprosent) {
SamtidigUttaksprosent redusertUttaksprosent) {
return oppgittPeriode.getAktiviteter()
.stream()
.map(a -> lagAktivitet(a, regelresultat, overlapperMedInnvilgetPeriodeHosAnnenpart, oppgittPeriode, annenpartSamtidigUttaksprosent))
.map(a -> lagAktivitet(a, regelresultat, overlapperMedInnvilgetPeriodeHosAnnenpart, oppgittPeriode, redusertUttaksprosent))
.collect(Collectors.toSet());
}

private UttakPeriodeAktivitet lagAktivitet(AktivitetIdentifikator identifikator,
FastsettePerioderRegelresultat regelresultat,
boolean overlapperMedInnvilgetPeriodeHosAnnenpart,
OppgittPeriode oppgittPeriode,
SamtidigUttaksprosent annenpartSamtidigUttaksprosent) {
SamtidigUttaksprosent redusertUttaksprosent) {
var søktGradering = oppgittPeriode.erSøktGradering(identifikator);
var periodeAktivitetResultat = finnPeriodeAktivitetResultat(oppgittPeriode, overlapperMedInnvilgetPeriodeHosAnnenpart, identifikator,
regelresultat, annenpartSamtidigUttaksprosent);
regelresultat, redusertUttaksprosent);
return new UttakPeriodeAktivitet(identifikator, periodeAktivitetResultat.utbetalingsgrad(), periodeAktivitetResultat.trekkdager(),
søktGradering);
}
Expand All @@ -128,7 +141,7 @@ private PeriodeAktivitetResultat finnPeriodeAktivitetResultat(OppgittPeriode opp
boolean overlapperMedInnvilgetPeriodeHosAnnenpart,
AktivitetIdentifikator aktivitet,
FastsettePerioderRegelresultat regelresultat,
SamtidigUttaksprosent annenpartSamtidigUttaksprosent) {
SamtidigUttaksprosent redusertUttaksprosent) {
//Må sjekke saldo her, ved flere arbeidsforhold kan det reglene ha gått til sluttpunkt som trekkes dager selv om ett av arbeidsforholdene er tom
//På arbeidsforholdet som er tom på konto skal det settes 0 trekkdager
var stønadskonto = konto(oppgittPeriode);
Expand All @@ -141,19 +154,14 @@ private PeriodeAktivitetResultat finnPeriodeAktivitetResultat(OppgittPeriode opp

var utbetalingsgrad = Utbetalingsgrad.ZERO;
if (regelresultat.skalUtbetale()) {
var utbetalingsgradUtregning = bestemUtbetalingsgradUtregning(oppgittPeriode, aktivitet, annenpartSamtidigUttaksprosent);
utbetalingsgrad = utbetalingsgradUtregning.resultat();
utbetalingsgrad = UtbetalingsgradUtil.beregnUtbetalingsgradFor(oppgittPeriode, aktivitet, redusertUttaksprosent);
}
var trekkdager = Trekkdager.ZERO;
if (regelresultat.trekkDagerFraSaldo()) {
if (manuellBehandling && stønadskonto.isEmpty()) {
trekkdager = Trekkdager.ZERO;
} else {
var graderingInnvilget = regelresultat.getGraderingIkkeInnvilgetÅrsak() == null && oppgittPeriode.erSøktGradering(aktivitet);
trekkdager = TrekkdagerUtregningUtil.trekkdagerFor(oppgittPeriode, graderingInnvilget, oppgittPeriode.getArbeidsprosent(),
regnSamtidigUttaksprosentMotGradering(oppgittPeriode, annenpartSamtidigUttaksprosent));
}
if (regelresultat.trekkDagerFraSaldo() && !(manuellBehandling && stønadskonto.isEmpty())) {
var graderingInnvilget = regelresultat.getGraderingIkkeInnvilgetÅrsak() == null && oppgittPeriode.erSøktGradering(aktivitet);
trekkdager = TrekkdagerUtregningUtil.trekkdagerFor(oppgittPeriode, graderingInnvilget, utbetalingsgrad);
}

return new PeriodeAktivitetResultat(utbetalingsgrad, trekkdager);
}

Expand All @@ -180,20 +188,6 @@ private void validerKnekkpunkt(OppgittPeriode uttakPeriode, TomKontoKnekkpunkt k
}
}

private UtbetalingsgradUtregning bestemUtbetalingsgradUtregning(OppgittPeriode oppgittPeriode,
AktivitetIdentifikator aktivitet,
SamtidigUttaksprosent annenpartSamtidigUttaksprosent) {
if (oppgittPeriode.erSøktGradering(aktivitet)) {
return new UtbetalingsgradMedGraderingUtregning(oppgittPeriode, aktivitet, annenpartSamtidigUttaksprosent);
}
var samtidigUttaksprosent = regnSamtidigUttaksprosentMotGradering(oppgittPeriode, annenpartSamtidigUttaksprosent);
if (samtidigUttaksprosent != null) {
return new UtbetalingsgradSamtidigUttakUtregning(samtidigUttaksprosent, oppgittPeriode.getArbeidsprosent(),
annenpartSamtidigUttaksprosent);
}
return new UtbetalingsgradUtenGraderingUtregning(annenpartSamtidigUttaksprosent);
}

private record PeriodeAktivitetResultat(Utbetalingsgrad utbetalingsgrad, Trekkdager trekkdager) {
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,37 +3,34 @@
import java.math.BigDecimal;
import java.math.RoundingMode;

import no.nav.foreldrepenger.regler.uttak.fastsetteperiode.grunnlag.Periode;
import no.nav.foreldrepenger.regler.uttak.fastsetteperiode.grunnlag.SamtidigUttaksprosent;
import no.nav.foreldrepenger.regler.uttak.fastsetteperiode.grunnlag.OppgittPeriode;
import no.nav.foreldrepenger.regler.uttak.fastsetteperiode.grunnlag.Utbetalingsgrad;

public final class TrekkdagerUtregningUtil {

private static final BigDecimal BIG_DECIMAL_100 = BigDecimal.valueOf(100);

private TrekkdagerUtregningUtil() {
}

public static Trekkdager trekkdagerFor(Periode periode,
boolean gradert,
BigDecimal gradertArbeidstidsprosent,
SamtidigUttaksprosent samtidigUttaksprosent) {
var trekkdagerUtenGradering = Virkedager.beregnAntallVirkedager(periode);
if (gradert) {
return trekkdagerMedGradering(trekkdagerUtenGradering, gradertArbeidstidsprosent);
}
if (samtidigUttaksprosent != null) {
//Samme utregning som med gradering
return trekkdagerMedGradering(trekkdagerUtenGradering, BigDecimal.valueOf(100).subtract(samtidigUttaksprosent.decimalValue()));

public static Trekkdager trekkdagerFor(OppgittPeriode oppgittPeriode, boolean innvilgetGradering, Utbetalingsgrad utbetalingsgrad) {
var virkedagerIPerioden = Virkedager.beregnAntallVirkedager(oppgittPeriode);

if (innvilgetGradering) {
return beregnetTrekkdager(virkedagerIPerioden, BIG_DECIMAL_100.subtract(oppgittPeriode.getArbeidsprosent()));
}
return new Trekkdager(trekkdagerUtenGradering);
}

private static Trekkdager trekkdagerMedGradering(int trekkdagerUtenGradering, BigDecimal gradertArbeidstidsprosent) {
if (gradertArbeidstidsprosent.compareTo(BigDecimal.valueOf(100)) >= 0) {
return Trekkdager.ZERO;
if (!Utbetalingsgrad.ZERO.equals(utbetalingsgrad)) {
return beregnetTrekkdager(virkedagerIPerioden, utbetalingsgrad.decimalValue());
}
var trekkdager = BigDecimal.valueOf(trekkdagerUtenGradering)
.multiply(BigDecimal.valueOf(100).subtract(gradertArbeidstidsprosent))
.divide(BigDecimal.valueOf(100), 1, RoundingMode.DOWN);
return new Trekkdager(trekkdager);

return new Trekkdager(virkedagerIPerioden);
}

private static Trekkdager beregnetTrekkdager(int virkedagerIPerioden, BigDecimal trekkProsent) {
return new Trekkdager(BigDecimal.valueOf(virkedagerIPerioden)
.multiply(trekkProsent)
.divide(BIG_DECIMAL_100, 1, RoundingMode.DOWN));
}
}

This file was deleted.

This file was deleted.

Loading

0 comments on commit 6eeccf9

Please sign in to comment.