Skip to content

Commit

Permalink
Rydder opp i RegelResultatBehandler vs FastsettePerioderRegelOrkestre…
Browse files Browse the repository at this point in the history
…ring
  • Loading branch information
espenwaaga committed Jul 3, 2024
1 parent 72fe86c commit b8162cf
Show file tree
Hide file tree
Showing 5 changed files with 73 additions and 174 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.Stønadskontotype;
import no.nav.foreldrepenger.regler.uttak.fastsetteperiode.grunnlag.UttakPeriode;
import no.nav.foreldrepenger.regler.uttak.fastsetteperiode.grunnlag.Vedtak;
import no.nav.foreldrepenger.regler.uttak.fastsetteperiode.konfig.FarUttakRundtFødsel;
Expand All @@ -34,8 +33,6 @@
import no.nav.foreldrepenger.regler.uttak.fastsetteperiode.utfall.IkkeOppfyltÅrsak;
import no.nav.foreldrepenger.regler.uttak.fastsetteperiode.utfall.InnvilgetÅrsak;
import no.nav.foreldrepenger.regler.uttak.fastsetteperiode.utfall.PeriodeResultatÅrsak;
import no.nav.foreldrepenger.regler.uttak.fastsetteperiode.utfall.TomKontoIdentifiserer;
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.fpsak.nare.evaluation.Evaluation;
Expand Down Expand Up @@ -97,7 +94,7 @@ private Set<AktivitetIdentifikator> aktiviteterIPeriode(OppgittPeriode periode,
var aktivitetMedTidligstStartdato = arbeid.getArbeidsforhold()
.stream()
.min(Comparator.comparing(Arbeidsforhold::startdato))
.map(a -> a.identifikator())
.map(Arbeidsforhold::identifikator)
.orElseThrow();
aktiviteter.add(aktivitetMedTidligstStartdato);
}
Expand Down Expand Up @@ -133,14 +130,14 @@ private FastsettePeriodeResultat fastsettPeriode(FastsettePeriodeRegel fastsette
SaldoUtregning saldoUtregning,
LukketPeriode farRundtFødselIntervall) {
var fastsettePeriodeGrunnlag = new FastsettePeriodeGrunnlagImpl(grunnlag, farRundtFødselIntervall, saldoUtregning, aktuellPeriode);

var evaluering = fastsettePeriodeRegel.evaluer(fastsettePeriodeGrunnlag);
var inputJson = toJson(fastsettePeriodeGrunnlag);
var regelJson = EvaluationSerializer.asJson(evaluering, UttakVersion.UTTAK_VERSION, NareVersion.NARE_VERSION);
var regelResultatBehandlerResultat = behandleRegelresultat(evaluering, fastsettePeriodeGrunnlag, grunnlag);

return new FastsettePeriodeResultat(regelResultatBehandlerResultat.getPeriode(), regelJson, inputJson,
regelResultatBehandlerResultat.getEtterKnekkPeriode());
return new FastsettePeriodeResultat(
regelResultatBehandlerResultat.getPeriode(),
EvaluationSerializer.asJson(evaluering, UttakVersion.UTTAK_VERSION, NareVersion.NARE_VERSION),
toJson(fastsettePeriodeGrunnlag),
regelResultatBehandlerResultat.getEtterKnekkPeriode()
);
}

private List<OppgittPeriode> samletUttaksperioder(RegelGrunnlag grunnlag, OrkestreringTillegg orkestreringTillegg) {
Expand Down Expand Up @@ -184,49 +181,15 @@ private OrkestreringTillegg lagOrkestreringTillegg(RegelGrunnlag grunnlag) {
private RegelResultatBehandlerResultat behandleRegelresultat(Evaluation evaluering,
FastsettePeriodeGrunnlag grunnlag,
RegelGrunnlag regelGrunnlag) {
var aktuellPeriode = grunnlag.getAktuellPeriode();
var regelresultat = new FastsettePerioderRegelresultat(evaluering);
var utfallType = regelresultat.getUtfallType();

var knekkpunktOpt = finnKnekkpunkt(aktuellPeriode, regelGrunnlag, grunnlag.getSaldoUtregning(), regelresultat,
grunnlag.periodeFarRundtFødsel().orElse(null));

var behandler = new RegelResultatBehandler(grunnlag.getSaldoUtregning(), regelGrunnlag);
return switch (utfallType) {
case AVSLÅTT -> behandler.avslåAktuellPeriode(grunnlag, regelresultat, knekkpunktOpt);
case INNVILGET -> behandler.innvilgAktuellPeriode(grunnlag, regelresultat, knekkpunktOpt);
case MANUELL_BEHANDLING -> behandler.manuellBehandling(grunnlag, regelresultat);
};
return behandler.behandleRegelResultatForPeriode(grunnlag, regelresultat);
}

private static List<AnnenpartUttakPeriode> annenpartUttaksperioder(RegelGrunnlag regelGrunnlag) {
return regelGrunnlag.getAnnenPart() == null ? Collections.emptyList() : regelGrunnlag.getAnnenPart().getUttaksperioder();
}

private Optional<TomKontoKnekkpunkt> finnKnekkpunkt(OppgittPeriode aktuellPeriode,
RegelGrunnlag regelGrunnlag,
SaldoUtregning saldoUtregning,
FastsettePerioderRegelresultat regelresultat,
LukketPeriode farRundtFødselIntervall) {
if (erFPFF(aktuellPeriode)) {
return Optional.empty();
}
var stønadskontotype = utledKonto(aktuellPeriode, regelGrunnlag, saldoUtregning);
var startdatoNesteStønadsperiode = regelGrunnlag.getDatoer().getStartdatoNesteStønadsperiode().orElse(null);
return TomKontoIdentifiserer.identifiser(aktuellPeriode, new ArrayList<>(aktuellPeriode.getAktiviteter()), saldoUtregning,
stønadskontotype.orElse(null), farRundtFødselIntervall, startdatoNesteStønadsperiode, regelresultat.trekkDagerFraSaldo(),
regelresultat.getAvklaringÅrsak(), regelresultat.getUtfallType());
}

private Optional<Stønadskontotype> utledKonto(OppgittPeriode aktuellPeriode, RegelGrunnlag regelGrunnlag, SaldoUtregning saldoUtregning) {
return Optional.ofNullable(aktuellPeriode.getStønadskontotype())
.or(() -> ValgAvStønadskontoTjeneste.velgStønadskonto(aktuellPeriode, regelGrunnlag, saldoUtregning));
}

private boolean erFPFF(OppgittPeriode aktuellPeriode) {
return Stønadskontotype.FORELDREPENGER_FØR_FØDSEL.equals(aktuellPeriode.getStønadskontotype());
}

private String toJson(FastsettePeriodeGrunnlag grunnlag) {
try {
return JsonOutput.asJson(grunnlag);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package no.nav.foreldrepenger.regler.uttak.fastsetteperiode;

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

import java.util.ArrayList;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;

import no.nav.foreldrepenger.regler.uttak.fastsetteperiode.grunnlag.AktivitetIdentifikator;
import no.nav.foreldrepenger.regler.uttak.fastsetteperiode.grunnlag.LukketPeriode;
import no.nav.foreldrepenger.regler.uttak.fastsetteperiode.grunnlag.OppgittPeriode;
import no.nav.foreldrepenger.regler.uttak.fastsetteperiode.grunnlag.Perioderesultattype;
import no.nav.foreldrepenger.regler.uttak.fastsetteperiode.grunnlag.RegelGrunnlag;
Expand All @@ -16,17 +16,13 @@
import no.nav.foreldrepenger.regler.uttak.fastsetteperiode.grunnlag.UttakPeriode;
import no.nav.foreldrepenger.regler.uttak.fastsetteperiode.grunnlag.UttakPeriodeAktivitet;
import no.nav.foreldrepenger.regler.uttak.fastsetteperiode.saldo.SaldoUtregning;
import no.nav.foreldrepenger.regler.uttak.fastsetteperiode.utfall.TomKontoIdentifiserer;
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 {

/**
* saldoUtregning
* stønadskonto
*/

private final SaldoUtregning saldoUtregning;
private final RegelGrunnlag regelGrunnlag;

Expand All @@ -35,69 +31,80 @@ class RegelResultatBehandler {
this.regelGrunnlag = regelGrunnlag;
}

RegelResultatBehandlerResultat innvilgAktuellPeriode(FastsettePeriodeGrunnlag fastsettePeriodeGrunnlag,
FastsettePerioderRegelresultat regelresultat,
Optional<TomKontoKnekkpunkt> knekkpunktOpt) {
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)
? SamtidigUttaksprosent.HUNDRED.subtract(SamtidigUttakUtil.uttaksprosentAnnenpart(fastsettePeriodeGrunnlag))
RegelResultatBehandlerResultat behandleRegelResultatForPeriode(FastsettePeriodeGrunnlag grunnlag, FastsettePerioderRegelresultat regelresultat) {
var aktuellPeriode = grunnlag.getAktuellPeriode();
var knekkpunktOpt = finnKnekkpunkt(aktuellPeriode, regelGrunnlag, grunnlag.getSaldoUtregning(), regelresultat,
grunnlag.periodeFarRundtFødsel().orElse(null));
if (knekkpunktOpt.isPresent()) {
var knekkpunkt = knekkpunktOpt.get().dato();
var periodeFørKnekk = aktuellPeriode.kopiMedNyPeriode(aktuellPeriode.getFom(), knekkpunkt.minusDays(1));
var periodeEtterKnekk = aktuellPeriode.kopiMedNyPeriode(knekkpunkt, aktuellPeriode.getTom());
return RegelResultatBehandlerResultat.medKnekk(behandleResultatForPeriode(periodeFørKnekk, grunnlag, regelresultat), periodeEtterKnekk);
} else {
return RegelResultatBehandlerResultat.utenKnekk(behandleResultatForPeriode(aktuellPeriode, grunnlag, regelresultat));
}
}

private Optional<TomKontoKnekkpunkt> finnKnekkpunkt(OppgittPeriode aktuellPeriode,
RegelGrunnlag regelGrunnlag,
SaldoUtregning saldoUtregning,
FastsettePerioderRegelresultat regelresultat,
LukketPeriode farRundtFødselIntervall) {
if (regelresultat.getUtfallType().equals(UtfallType.MANUELL_BEHANDLING)) {
return Optional.empty();
}
if (Stønadskontotype.FORELDREPENGER_FØR_FØDSEL.equals(aktuellPeriode.getStønadskontotype())) {
return Optional.empty();
}
var stønadskontotype = utledKonto(aktuellPeriode, regelGrunnlag, saldoUtregning);
var startdatoNesteStønadsperiode = regelGrunnlag.getDatoer().getStartdatoNesteStønadsperiode().orElse(null);
return TomKontoIdentifiserer.identifiser(aktuellPeriode, new ArrayList<>(aktuellPeriode.getAktiviteter()), saldoUtregning,
stønadskontotype.orElse(null), farRundtFødselIntervall, startdatoNesteStønadsperiode, regelresultat.trekkDagerFraSaldo(),
regelresultat.getAvklaringÅrsak(), regelresultat.getUtfallType());
}

private UttakPeriode behandleResultatForPeriode(OppgittPeriode periode,
FastsettePeriodeGrunnlag grunnlag,
FastsettePerioderRegelresultat regelresultat) {
var redusertUttaksprosentPgaSamtidigUttakMedSamletUttak100 = SamtidigUttakUtil.kanRedusereUtbetalingsgradForTapende(grunnlag)
? SamtidigUttaksprosent.HUNDRED.subtract(SamtidigUttakUtil.uttaksprosentAnnenpart(grunnlag))
: null;

return switch (regelresultat.getUtfallType()) {
case AVSLÅTT -> avslåAktuellPeriode(grunnlag, periode, regelresultat);
case INNVILGET -> innvilgAktuellPeriode(grunnlag, periode, regelresultat, redusertUttaksprosentPgaSamtidigUttakMedSamletUttak100);
case MANUELL_BEHANDLING -> manuellBehandling(grunnlag, regelresultat);
};
}

private UttakPeriode innvilgAktuellPeriode(FastsettePeriodeGrunnlag fastsettePeriodeGrunnlag,
OppgittPeriode innvilgPeriode,
FastsettePerioderRegelresultat regelresultat,
SamtidigUttaksprosent redusertUttaksprosentPgaSamtidigUttakMedSamletUttak100) {
var aktiviteter = lagAktiveteter(innvilgPeriode, regelresultat, redusertUttaksprosentPgaSamtidigUttakMedSamletUttak100);
var samtidigUttaksprosent = samtidigUttaksprosentFra(fastsettePeriodeGrunnlag, aktiviteter);
var innvilget = new UttakPeriode(innvilgPeriode, Perioderesultattype.INNVILGET, null, regelresultat.getAvklaringÅrsak(),
return new UttakPeriode(innvilgPeriode, Perioderesultattype.INNVILGET, null, regelresultat.getAvklaringÅrsak(),
regelresultat.getGraderingIkkeInnvilgetÅrsak(), aktiviteter, samtidigUttaksprosent, innvilgPeriode.getStønadskontotype());

if (knekkpunktOpt.isEmpty()) {
return RegelResultatBehandlerResultat.utenKnekk(innvilget);
} else {
validerKnekkpunkt(oppgittPeriode, knekkpunktOpt.get());
var etterKnekk = oppgittPeriode.kopiMedNyPeriode(knekkpunktOpt.get().dato(), oppgittPeriode.getTom());
return RegelResultatBehandlerResultat.medKnekk(innvilget, etterKnekk);
}
}

RegelResultatBehandlerResultat avslåAktuellPeriode(FastsettePeriodeGrunnlag fastsettePeriodeGrunnlag,
FastsettePerioderRegelresultat regelresultat,
Optional<TomKontoKnekkpunkt> knekkpunktOpt) {
var oppgittPeriode = fastsettePeriodeGrunnlag.getAktuellPeriode();
var overlapperInnvilgetAnnenpartsPeriode = overlapperMedInnvilgetAnnenpartsPeriode(fastsettePeriodeGrunnlag);
var avslåPeriode = knekkpunktOpt.map(TomKontoKnekkpunkt::dato)
.filter(d -> !overlapperInnvilgetAnnenpartsPeriode)
.map(knekkdato -> oppgittPeriode.kopiMedNyPeriode(oppgittPeriode.getFom(), knekkdato.minusDays(1)))
.orElse(oppgittPeriode);

private UttakPeriode avslåAktuellPeriode(FastsettePeriodeGrunnlag fastsettePeriodeGrunnlag, OppgittPeriode avslåPeriode, FastsettePerioderRegelresultat regelresultat) {
var overlapperInnvilgetAnnenpartsPeriode = overlapperMedInnvilgetAnnenpartsPeriode(fastsettePeriodeGrunnlag);
var aktiviteter = overlapperInnvilgetAnnenpartsPeriode
? lagAktiviteterUtenTrekkOgUtbetaling(avslåPeriode)
: lagAktiveteter(avslåPeriode, regelresultat, null);

var avslått = new UttakPeriode(avslåPeriode, Perioderesultattype.AVSLÅTT, null, regelresultat.getAvklaringÅrsak(),
return new UttakPeriode(avslåPeriode, Perioderesultattype.AVSLÅTT, null, regelresultat.getAvklaringÅrsak(),
regelresultat.getGraderingIkkeInnvilgetÅrsak(), aktiviteter, samtidigUttaksprosentFra(fastsettePeriodeGrunnlag, aktiviteter),
konto(avslåPeriode).orElse(null));

if (!overlapperInnvilgetAnnenpartsPeriode && knekkpunktOpt.isPresent()) {
validerKnekkpunkt(oppgittPeriode, knekkpunktOpt.get());
var etterKnekk = oppgittPeriode.kopiMedNyPeriode(knekkpunktOpt.get().dato(), oppgittPeriode.getTom());
return RegelResultatBehandlerResultat.medKnekk(avslått, etterKnekk);
} else {
return RegelResultatBehandlerResultat.utenKnekk(avslått);
}
utledKonto(avslåPeriode, regelGrunnlag, saldoUtregning).orElse(null));
}

RegelResultatBehandlerResultat manuellBehandling(FastsettePeriodeGrunnlag fastsettePeriodeGrunnlag, FastsettePerioderRegelresultat regelresultat) {
private UttakPeriode manuellBehandling(FastsettePeriodeGrunnlag fastsettePeriodeGrunnlag, FastsettePerioderRegelresultat regelresultat) {
var oppgittPeriode = fastsettePeriodeGrunnlag.getAktuellPeriode();
var stønadskontotype = konto(oppgittPeriode);
var stønadskontotype = utledKonto(oppgittPeriode, regelGrunnlag, saldoUtregning);
var aktiviteter = lagAktiveteter(oppgittPeriode, regelresultat,null);
var resultat = new UttakPeriode(oppgittPeriode, Perioderesultattype.MANUELL_BEHANDLING, regelresultat.getManuellbehandlingårsak(),
return new UttakPeriode(oppgittPeriode, Perioderesultattype.MANUELL_BEHANDLING, regelresultat.getManuellbehandlingårsak(),
regelresultat.getAvklaringÅrsak(), regelresultat.getGraderingIkkeInnvilgetÅrsak(), aktiviteter,
samtidigUttaksprosentFra(fastsettePeriodeGrunnlag, aktiviteter), stønadskontotype.orElse(null));
return RegelResultatBehandlerResultat.utenKnekk(resultat);
}

private static SamtidigUttaksprosent samtidigUttaksprosentFra(FastsettePeriodeGrunnlag grunnlag, Set<UttakPeriodeAktivitet> aktiviteter) {
Expand All @@ -123,12 +130,9 @@ private static boolean overlapperMedInnvilgetAnnenpartsPeriode(FastsettePeriodeG
.anyMatch(annenpartsPeriode -> annenpartsPeriode.overlapper(oppgittPeriode) && annenpartsPeriode.isInnvilget());
}

private Optional<Stønadskontotype> konto(OppgittPeriode oppgittPeriode) {
return oppgittPeriode.getStønadskontotype() != null ? Optional.of(oppgittPeriode.getStønadskontotype()) : utledKonto(oppgittPeriode);
}

private Optional<Stønadskontotype> utledKonto(OppgittPeriode oppgittPeriode) {
return velgStønadskonto(oppgittPeriode, regelGrunnlag, saldoUtregning);
private Optional<Stønadskontotype> utledKonto(OppgittPeriode aktuellPeriode, RegelGrunnlag regelGrunnlag, SaldoUtregning saldoUtregning) {
return Optional.ofNullable(aktuellPeriode.getStønadskontotype())
.or(() -> ValgAvStønadskontoTjeneste.velgStønadskonto(aktuellPeriode, regelGrunnlag, saldoUtregning));
}

private static Set<UttakPeriodeAktivitet> lagAktiviteterUtenTrekkOgUtbetaling(OppgittPeriode oppgittPeriode) {
Expand Down Expand Up @@ -165,7 +169,7 @@ private PeriodeAktivitetResultat finnPeriodeAktivitetResultat(OppgittPeriode opp
SamtidigUttaksprosent avgrensetUttaksprosentForÅOppnåSamtidigUttak100) {
//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);
var stønadskonto = utledKonto(oppgittPeriode, regelGrunnlag, saldoUtregning);
var harIgjenTrekkdager = isHarIgjenTrekkdager(oppgittPeriode, aktivitet, regelresultat, stønadskonto.orElse(null));

var manuellBehandling = manuellBehandling(regelresultat);
Expand Down Expand Up @@ -201,12 +205,6 @@ private boolean manuellBehandling(FastsettePerioderRegelresultat regelresultat)
return regelresultat.getUtfallType().equals(UtfallType.MANUELL_BEHANDLING);
}

private void validerKnekkpunkt(OppgittPeriode uttakPeriode, TomKontoKnekkpunkt knekkpunkt) {
if (!uttakPeriode.overlapper(knekkpunkt.dato())) {
throw new IllegalArgumentException("Knekkpunkt må være i periode. " + knekkpunkt.dato() + " - " + uttakPeriode);
}
}

private record PeriodeAktivitetResultat(Utbetalingsgrad utbetalingsgrad, Trekkdager trekkdager) {
}
}
Loading

0 comments on commit b8162cf

Please sign in to comment.