Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Lagt til grad for uttak og tilkommet inntekt #422

Merged
merged 3 commits into from
Aug 25, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,9 @@ public class BeregningsgrunnlagPeriode {
*/
private BigDecimal inntektsgraderingFraBruttoBeregningsgrunnlag;

private BigDecimal totalUtbetalingsgradFraUttak;
private BigDecimal totalUtbetalingsgradEtterReduksjonVedTilkommetInntekt;

private Dekningsgrad dekningsgrad = Dekningsgrad.DEKNINGSGRAD_100;
private boolean erVilkårOppfylt = true;

Expand Down Expand Up @@ -195,6 +198,22 @@ public static Builder oppdater(BeregningsgrunnlagPeriode eksisterendeBeregningsg
return new Builder(eksisterendeBeregningsgrunnlagPeriode);
}

public BigDecimal getTotalUtbetalingsgradFraUttak() {
return totalUtbetalingsgradFraUttak;
}

public void setTotalUtbetalingsgradFraUttak(BigDecimal totalUtbetalingsgradFraUttak) {
this.totalUtbetalingsgradFraUttak = totalUtbetalingsgradFraUttak;
}

public BigDecimal getTotalUtbetalingsgradEtterReduksjonVedTilkommetInntekt() {
return totalUtbetalingsgradEtterReduksjonVedTilkommetInntekt;
}

public void setTotalUtbetalingsgradEtterReduksjonVedTilkommetInntekt(BigDecimal totalUtbetalingsgradEtterReduksjonVedTilkommetInntekt) {
this.totalUtbetalingsgradEtterReduksjonVedTilkommetInntekt = totalUtbetalingsgradEtterReduksjonVedTilkommetInntekt;
}

public static class Builder {
private BeregningsgrunnlagPeriode beregningsgrunnlagPeriodeMal;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ public class BeregningsgrunnlagPrArbeidsforhold {
private BigDecimal redusertBrukersAndelPrÅr;
private Long dagsatsBruker;
private Long dagsatsArbeidsgiver;
private BigDecimal andelsmessigFørGraderingPrAar;
private BigDecimal andelsmessigFørGraderingPrAar; //avkortet mot 6G, innført for å støtte at utbetalingsgrader settes i beregning for k9 og SVP (isdf i tilkjent ytelse-steg som for FP)


public String getArbeidsgiverId() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,23 +29,31 @@ public FinnGrenseverdi() {
@Override
public Evaluation evaluate(BeregningsgrunnlagPeriode grunnlag) {
Map<String, Object> resultater = new HashMap<>();
BigDecimal sumAvkortetSkalBrukes = BigDecimal.ZERO;
for (BeregningsgrunnlagPrStatus bps : grunnlag.getBeregningsgrunnlagPrStatusSomSkalBrukes()) {
if (bps.erArbeidstakerEllerFrilanser()) {
sumAvkortetSkalBrukes = sumAvkortetSkalBrukes.add(bps.getArbeidsforholdSomSkalBrukes().stream()
.map(arb -> arb.getAndelsmessigFørGraderingPrAar().multiply(arb.getUtbetalingsprosent().scaleByPowerOfTen(-2)))
.reduce(BigDecimal::add).orElse(BigDecimal.ZERO));
} else {
sumAvkortetSkalBrukes = sumAvkortetSkalBrukes.add(bps.getAndelsmessigFørGraderingPrAar().multiply(bps.getUtbetalingsprosent().scaleByPowerOfTen(-2)));
}
}

//gradering mot uttak
BigDecimal summerAvkortetGradertMotUttak = summerAvkortetGradertMotUttak(grunnlag);
var grenseverdi = summerAvkortetGradertMotUttak;
BigDecimal sumAvkortet = summerAvkortet(grunnlag);
BigDecimal totalUtbetalingsgradFraUttak = sumAvkortet.signum() != 0 ? summerAvkortetGradertMotUttak.divide(sumAvkortet, 4, RoundingMode.HALF_UP) : BigDecimal.ZERO;
grunnlag.setTotalUtbetalingsgradFraUttak(totalUtbetalingsgradFraUttak);
resultater.put("totalUtbetalingsgradFraUttak", totalUtbetalingsgradFraUttak);

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

//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()) {
grenseverdi = gradertMotTilkommetInntekt(grunnlag, grenseverdi);
BigDecimal totalUtbetalingsgradEtterReduksjonVedTilkommetInntekt = andelBeholdtEtterGradertMotTilkommetInntekt(grunnlag);
resultater.put("totalUtbetalingsgradEtterReduksjonVedTilkommetInntekt", totalUtbetalingsgradEtterReduksjonVedTilkommetInntekt);
grunnlag.setTotalUtbetalingsgradEtterReduksjonVedTilkommetInntekt(totalUtbetalingsgradEtterReduksjonVedTilkommetInntekt);

//deprecated etter totalUtbetalingsgradEtterReduksjonVedTilkommetInntekt ble lagt til?
grenseverdi = totalUtbetalingsgradEtterReduksjonVedTilkommetInntekt.compareTo(BigDecimal.ONE) < 0 ? grenseverdi.multiply(totalUtbetalingsgradEtterReduksjonVedTilkommetInntekt) : grenseverdi;
if (grunnlag.getInntektsgraderingFraBruttoBeregningsgrunnlag() != null) {
resultater.put("inntektgraderingsprosent", grunnlag.getInntektsgraderingFraBruttoBeregningsgrunnlag());
}
Expand All @@ -58,7 +66,35 @@ public Evaluation evaluate(BeregningsgrunnlagPeriode grunnlag) {

}

private BigDecimal gradertMotTilkommetInntekt(BeregningsgrunnlagPeriode grunnlag, BigDecimal grenseverdi) {
private static BigDecimal summerAvkortetGradertMotUttak(BeregningsgrunnlagPeriode grunnlag) {
BigDecimal sum = BigDecimal.ZERO;
for (BeregningsgrunnlagPrStatus bps : grunnlag.getBeregningsgrunnlagPrStatusSomSkalBrukes()) {
if (bps.erArbeidstakerEllerFrilanser()) {
sum = sum.add(bps.getArbeidsforholdSomSkalBrukes().stream()
.map(arb -> arb.getAndelsmessigFørGraderingPrAar().multiply(arb.getUtbetalingsprosent().scaleByPowerOfTen(-2)))
.reduce(BigDecimal::add).orElse(BigDecimal.ZERO));
} else {
sum = sum.add(bps.getAndelsmessigFørGraderingPrAar().multiply(bps.getUtbetalingsprosent().scaleByPowerOfTen(-2)));
}
}
return sum;
}

private static BigDecimal summerAvkortet(BeregningsgrunnlagPeriode grunnlag) {
BigDecimal sum = BigDecimal.ZERO;
for (BeregningsgrunnlagPrStatus bps : grunnlag.getBeregningsgrunnlagPrStatusSomSkalBrukes()) {
if (bps.erArbeidstakerEllerFrilanser()) {
sum = sum.add(bps.getArbeidsforholdSomSkalBrukes().stream()
.map(arb -> arb.getAndelsmessigFørGraderingPrAar())
.reduce(BigDecimal::add).orElse(BigDecimal.ZERO));
} else {
sum = sum.add(bps.getAndelsmessigFørGraderingPrAar());
}
}
return sum;
}

private BigDecimal andelBeholdtEtterGradertMotTilkommetInntekt(BeregningsgrunnlagPeriode grunnlag) {
BigDecimal bortfalt = finnBortfaltInntekt(grunnlag);
var totaltGradertGrunnlag = grunnlag.getBeregningsgrunnlagPrStatus().stream()
.map(BeregningsgrunnlagPrStatus::getGradertBruttoInkludertNaturalytelsePrÅr)
Expand All @@ -73,15 +109,7 @@ private BigDecimal gradertMotTilkommetInntekt(BeregningsgrunnlagPeriode grunnlag
var graderingMotTotal = bortfalt.divide(totaltGrunnlag, 10, RoundingMode.HALF_UP);
grunnlag.setInntektsgraderingFraBruttoBeregningsgrunnlag(graderingMotTotal.multiply(BigDecimal.valueOf(100)));

// Grenseverdien er allerede gradert mot arbeidstid her
var graderingEtterGraderingMotArbeidstid = bortfalt.divide(totaltGradertGrunnlag, 10, RoundingMode.HALF_UP);
var grenseverdiGradertMotInntekt = grenseverdi.multiply(graderingEtterGraderingMotArbeidstid);

if (grenseverdi.compareTo(grenseverdiGradertMotInntekt) < 0) {
return grenseverdi;
} else {
return grenseverdiGradertMotInntekt;
}
return bortfalt.divide(totaltGradertGrunnlag, 10, RoundingMode.HALF_UP);
}

private BigDecimal finnBortfaltInntekt(BeregningsgrunnlagPeriode grunnlag) {
Expand Down