Skip to content

Commit

Permalink
Innfører gradering mot tilsyn som eksplisitt reduksjon
Browse files Browse the repository at this point in the history
  • Loading branch information
espenjv committed Sep 7, 2023
1 parent e4fc088 commit bb055f4
Show file tree
Hide file tree
Showing 3 changed files with 108 additions and 28 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package no.nav.folketrygdloven.beregningsgrunnlag.regelmodell.fastsett;

import java.math.BigDecimal;
import java.util.List;
import java.util.Objects;

import no.nav.fpsak.tidsserie.LocalDateTimeline;

public class PleiepengerSyktBarnGrunnlag extends YtelsesSpesifiktGrunnlag {

private LocalDateTimeline<BigDecimal> tilsynsgraderingsprosent;

public PleiepengerSyktBarnGrunnlag(LocalDateTimeline<BigDecimal> tilsynsgraderingsprosent) {
super("PSB");
this.tilsynsgraderingsprosent = tilsynsgraderingsprosent;
}

public LocalDateTimeline<BigDecimal> getTilsynsgraderingsprosent() {
return tilsynsgraderingsprosent;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,14 @@
import no.nav.folketrygdloven.beregningsgrunnlag.regelmodell.fastsett.BeregningsgrunnlagPeriode;
import no.nav.folketrygdloven.beregningsgrunnlag.regelmodell.fastsett.BeregningsgrunnlagPrArbeidsforhold;
import no.nav.folketrygdloven.beregningsgrunnlag.regelmodell.fastsett.BeregningsgrunnlagPrStatus;
import no.nav.folketrygdloven.beregningsgrunnlag.regelmodell.fastsett.PleiepengerSyktBarnGrunnlag;
import no.nav.folketrygdloven.beregningsgrunnlag.regelmodell.fastsett.TilkommetInntekt;
import no.nav.fpsak.nare.doc.RuleDocumentation;
import no.nav.fpsak.nare.evaluation.Evaluation;
import no.nav.fpsak.nare.evaluation.node.SingleEvaluation;
import no.nav.fpsak.nare.specification.LeafSpecification;
import no.nav.fpsak.tidsserie.LocalDateInterval;
import no.nav.fpsak.tidsserie.StandardCombinators;

@RuleDocumentation(FinnGrenseverdi.ID)
public class FinnGrenseverdi extends LeafSpecification<BeregningsgrunnlagPeriode> {
Expand All @@ -38,14 +41,19 @@ public Evaluation evaluate(BeregningsgrunnlagPeriode grunnlag) {
grunnlag.setTotalUtbetalingsgradFraUttak(totalUtbetalingsgradFraUttak);
resultater.put("totalUtbetalingsgradFraUttak", totalUtbetalingsgradFraUttak);

//hvis §8-47a, skaler med fast faktor
var erInaktivTypeA = MidlertidigInaktivType.A.equals(grunnlag.getBeregningsgrunnlag().getMidlertidigInaktivType());
if (erInaktivTypeA) {
BigDecimal reduksjonsfaktor = grunnlag.getBeregningsgrunnlag().getMidlertidigInaktivTypeAReduksjonsfaktor();
grenseverdi = grenseverdi.multiply(reduksjonsfaktor);
resultater.put("grad847a", reduksjonsfaktor);
}
grenseverdi = utførMidlertidigInaktivGradering(grunnlag, resultater, grenseverdi);
grenseverdi = utførYtelsesspesifikkGradering(grunnlag, grenseverdi);
grenseverdi = utførGraderingMotInntekt(grunnlag, resultater, grenseverdi, totalUtbetalingsgradFraUttak);

resultater.put("grenseverdi", grenseverdi);
grunnlag.setGrenseverdi(grenseverdi);
SingleEvaluation resultat = ja();
resultat.setEvaluationProperties(resultater);
return resultat;

}

private BigDecimal utførGraderingMotInntekt(BeregningsgrunnlagPeriode grunnlag, Map<String, Object> resultater, BigDecimal grenseverdi, BigDecimal totalUtbetalingsgradFraUttak) {
//juster ned med tilkommet inntekt hvis det gir lavere utbetaling enn overstående
if (grunnlag.getBeregningsgrunnlag().getToggles().isEnabled("GRADERING_MOT_INNTEKT", false) && !grunnlag.getTilkommetInntektsforholdListe().isEmpty()) {
BigDecimal graderingPåToppenAvUttakgraderingPgaTilkommetInntekt = andelBeholdtEtterGradertMotTilkommetInntekt(grunnlag);
Expand All @@ -60,15 +68,37 @@ public Evaluation evaluate(BeregningsgrunnlagPeriode grunnlag) {
resultater.put("inntektgraderingsprosent", grunnlag.getInntektsgraderingFraBruttoBeregningsgrunnlag());
}
}
resultater.put("grenseverdi", grenseverdi);
grunnlag.setGrenseverdi(grenseverdi);
SingleEvaluation resultat = ja();
resultat.setEvaluationProperties(resultater);
return resultat;
return grenseverdi;
}

private static BigDecimal utførMidlertidigInaktivGradering(BeregningsgrunnlagPeriode grunnlag, Map<String, Object> resultater, BigDecimal grenseverdi) {
//hvis §8-47a, skaler med fast faktor
var erInaktivTypeA = MidlertidigInaktivType.A.equals(grunnlag.getBeregningsgrunnlag().getMidlertidigInaktivType());
if (erInaktivTypeA) {
BigDecimal reduksjonsfaktor = grunnlag.getBeregningsgrunnlag().getMidlertidigInaktivTypeAReduksjonsfaktor();
grenseverdi = grenseverdi.multiply(reduksjonsfaktor);
resultater.put("grad847a", reduksjonsfaktor);
}
return grenseverdi;
}

private static BigDecimal utførYtelsesspesifikkGradering(BeregningsgrunnlagPeriode grunnlag, BigDecimal grenseverdi) {
if (grunnlag.getBeregningsgrunnlag().getYtelsesSpesifiktGrunnlag() instanceof PleiepengerSyktBarnGrunnlag psbGrunnlag) {
var tilsynsgraderingsprosent = psbGrunnlag.getTilsynsgraderingsprosent().compress((b1, b2) -> b1.compareTo(b2) == 0, StandardCombinators::leftOnly);
var intersection = tilsynsgraderingsprosent.intersection(new LocalDateInterval(grunnlag.getPeriodeFom(), grunnlag.getPeriodeTom()));
if (intersection.toSegments().size() > 1) {
throw new IllegalStateException("Fant flere tilsynsgrader for samme periode " + grunnlag.getPeriodeFom());
}
if (!intersection.isEmpty()) {
var tilsynsgradering = intersection.toSegments().first().getValue();
grenseverdi = grenseverdi.multiply(tilsynsgradering.divide(BigDecimal.valueOf(100), 10, RoundingMode.HALF_UP));
}
}
return grenseverdi;
}

static BigDecimal min(BigDecimal a, BigDecimal b){

static BigDecimal min(BigDecimal a, BigDecimal b) {
return a.compareTo(b) > 0 ? b : a;
}

Expand All @@ -91,7 +121,7 @@ private static BigDecimal summerAvkortet(BeregningsgrunnlagPeriode grunnlag) {
for (BeregningsgrunnlagPrStatus bps : grunnlag.getBeregningsgrunnlagPrStatusSomSkalBrukes()) {
if (bps.erArbeidstakerEllerFrilanser()) {
sum = sum.add(bps.getArbeidsforholdSomSkalBrukes().stream()
.map(arb -> arb.getAndelsmessigFørGraderingPrAar())
.map(BeregningsgrunnlagPrArbeidsforhold::getAndelsmessigFørGraderingPrAar)
.reduce(BigDecimal::add).orElse(BigDecimal.ZERO));
} else {
sum = sum.add(bps.getAndelsmessigFørGraderingPrAar());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,14 @@
import no.nav.folketrygdloven.beregningsgrunnlag.regelmodell.fastsett.BeregningsgrunnlagPeriode;
import no.nav.folketrygdloven.beregningsgrunnlag.regelmodell.fastsett.BeregningsgrunnlagPrArbeidsforhold;
import no.nav.folketrygdloven.beregningsgrunnlag.regelmodell.fastsett.BeregningsgrunnlagPrStatus;
import no.nav.folketrygdloven.beregningsgrunnlag.regelmodell.fastsett.PleiepengerSyktBarnGrunnlag;
import no.nav.folketrygdloven.beregningsgrunnlag.regelmodell.fastsett.TilkommetInntekt;
import no.nav.fpsak.nare.doc.RuleDocumentation;
import no.nav.fpsak.nare.evaluation.Evaluation;
import no.nav.fpsak.nare.evaluation.node.SingleEvaluation;
import no.nav.fpsak.nare.specification.LeafSpecification;
import no.nav.fpsak.tidsserie.LocalDateInterval;
import no.nav.fpsak.tidsserie.StandardCombinators;

@RuleDocumentation(FinnGrenseverdiUtenFordeling.ID)
public class FinnGrenseverdiUtenFordeling extends LeafSpecification<BeregningsgrunnlagPeriode> {
Expand All @@ -38,14 +41,19 @@ public Evaluation evaluate(BeregningsgrunnlagPeriode grunnlag) {
grunnlag.setTotalUtbetalingsgradFraUttak(totalUtbetalingsgradFraUttak);
resultater.put("totalUtbetalingsgradFraUttak", totalUtbetalingsgradFraUttak);

//hvis §8-47a, skaler med fast faktor
var erInaktivTypeA = MidlertidigInaktivType.A.equals(grunnlag.getBeregningsgrunnlag().getMidlertidigInaktivType());
if (erInaktivTypeA) {
BigDecimal reduksjonsfaktor = grunnlag.getBeregningsgrunnlag().getMidlertidigInaktivTypeAReduksjonsfaktor();
grenseverdi = grenseverdi.multiply(reduksjonsfaktor);
resultater.put("grad847a", reduksjonsfaktor);
}
grenseverdi = utførMidlertidigInaktivGradering(grunnlag, resultater, grenseverdi);
grenseverdi = utførYtelsesspesifikkGradering(grunnlag, grenseverdi);
grenseverdi = utførGraderingMotInntekt(grunnlag, resultater, grenseverdi, totalUtbetalingsgradFraUttak);

resultater.put("grenseverdi", grenseverdi);
grunnlag.setGrenseverdi(grenseverdi);
SingleEvaluation resultat = ja();
resultat.setEvaluationProperties(resultater);
return resultat;

}

private BigDecimal utførGraderingMotInntekt(BeregningsgrunnlagPeriode grunnlag, Map<String, Object> resultater, BigDecimal grenseverdi, BigDecimal totalUtbetalingsgradFraUttak) {
//juster ned med tilkommet inntekt hvis det gir lavere utbetaling enn overstående
if (grunnlag.getBeregningsgrunnlag().getToggles().isEnabled("GRADERING_MOT_INNTEKT", false) && !grunnlag.getTilkommetInntektsforholdListe().isEmpty()) {
BigDecimal graderingPåToppenAvUttakgraderingPgaTilkommetInntekt = andelBeholdtEtterGradertMotTilkommetInntekt(grunnlag);
Expand All @@ -60,15 +68,36 @@ public Evaluation evaluate(BeregningsgrunnlagPeriode grunnlag) {
resultater.put("inntektgraderingsprosent", grunnlag.getInntektsgraderingFraBruttoBeregningsgrunnlag());
}
}
resultater.put("grenseverdi", grenseverdi);
grunnlag.setGrenseverdi(grenseverdi);
SingleEvaluation resultat = ja();
resultat.setEvaluationProperties(resultater);
return resultat;
return grenseverdi;
}

private static BigDecimal utførMidlertidigInaktivGradering(BeregningsgrunnlagPeriode grunnlag, Map<String, Object> resultater, BigDecimal grenseverdi) {
//hvis §8-47a, skaler med fast faktor
var erInaktivTypeA = MidlertidigInaktivType.A.equals(grunnlag.getBeregningsgrunnlag().getMidlertidigInaktivType());
if (erInaktivTypeA) {
BigDecimal reduksjonsfaktor = grunnlag.getBeregningsgrunnlag().getMidlertidigInaktivTypeAReduksjonsfaktor();
grenseverdi = grenseverdi.multiply(reduksjonsfaktor);
resultater.put("grad847a", reduksjonsfaktor);
}
return grenseverdi;
}

private static BigDecimal utførYtelsesspesifikkGradering(BeregningsgrunnlagPeriode grunnlag, BigDecimal grenseverdi) {
if (grunnlag.getBeregningsgrunnlag().getYtelsesSpesifiktGrunnlag() instanceof PleiepengerSyktBarnGrunnlag psbGrunnlag) {
var tilsynsgraderingsprosent = psbGrunnlag.getTilsynsgraderingsprosent().compress((b1, b2) -> b1.compareTo(b2) == 0, StandardCombinators::leftOnly);
var intersection = tilsynsgraderingsprosent.intersection(new LocalDateInterval(grunnlag.getPeriodeFom(), grunnlag.getPeriodeTom()));
if (intersection.toSegments().size() > 1) {
throw new IllegalStateException("Fant flere tilsynsgrader for samme periode " + grunnlag.getPeriodeFom());
}
if (!intersection.isEmpty()) {
var tilsynsgradering = intersection.toSegments().first().getValue();
grenseverdi = grenseverdi.multiply(tilsynsgradering.divide(BigDecimal.valueOf(100), 10, RoundingMode.HALF_UP));
}
}
return grenseverdi;
}

static BigDecimal min(BigDecimal a, BigDecimal b){
static BigDecimal min(BigDecimal a, BigDecimal b) {
return a.compareTo(b) > 0 ? b : a;
}

Expand All @@ -91,7 +120,7 @@ private static BigDecimal summerAvkortet(BeregningsgrunnlagPeriode grunnlag) {
for (BeregningsgrunnlagPrStatus bps : grunnlag.getBeregningsgrunnlagPrStatusSomSkalBrukes()) {
if (bps.erArbeidstakerEllerFrilanser()) {
sum = sum.add(bps.getArbeidsforholdSomSkalBrukes().stream()
.map(arb -> arb.getAndelsmessigFørGraderingPrAar())
.map(BeregningsgrunnlagPrArbeidsforhold::getAndelsmessigFørGraderingPrAar)
.reduce(BigDecimal::add).orElse(BigDecimal.ZERO));
} else {
sum = sum.add(bps.getAndelsmessigFørGraderingPrAar());
Expand Down

0 comments on commit bb055f4

Please sign in to comment.