From ffcf7c56f25ff363aa6812cd681ae40f5144715a Mon Sep 17 00:00:00 2001 From: Espen Johansen Velsvik Date: Fri, 1 Nov 2024 11:31:31 +0100 Subject: [PATCH 1/3] =?UTF-8?q?Bruker=20samme=20logikk=20for=20om=20det=20?= =?UTF-8?q?er=20s=C3=B8kt=20ytelse=20for=20andel/periode?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MapTilFordelingsmodell.java | 16 +- .../UtbetalingsgradTjeneste.java | 307 ++++++++++-------- ...usjonPerioderFraVLTilRegelPleiepenger.java | 2 +- 3 files changed, 165 insertions(+), 160 deletions(-) diff --git a/kalkulator/src/main/java/no/nav/folketrygdloven/kalkulator/adapter/vltilregelmodell/MapTilFordelingsmodell.java b/kalkulator/src/main/java/no/nav/folketrygdloven/kalkulator/adapter/vltilregelmodell/MapTilFordelingsmodell.java index c0b72576..38a7103e 100644 --- a/kalkulator/src/main/java/no/nav/folketrygdloven/kalkulator/adapter/vltilregelmodell/MapTilFordelingsmodell.java +++ b/kalkulator/src/main/java/no/nav/folketrygdloven/kalkulator/adapter/vltilregelmodell/MapTilFordelingsmodell.java @@ -1,11 +1,7 @@ package no.nav.folketrygdloven.kalkulator.adapter.vltilregelmodell; -import static no.nav.folketrygdloven.kalkulator.adapter.vltilregelmodell.UtbetalingsgradTjeneste.finnAktivitetsgradForAndel; -import static no.nav.folketrygdloven.kalkulator.adapter.vltilregelmodell.UtbetalingsgradTjeneste.finnUtbetalingsgradForAndel; - import java.math.BigDecimal; import java.util.List; -import java.util.Objects; import java.util.Optional; import java.util.stream.Collectors; @@ -24,9 +20,7 @@ import no.nav.folketrygdloven.kalkulator.modell.beregningsgrunnlag.BeregningsgrunnlagPeriodeDto; import no.nav.folketrygdloven.kalkulator.modell.beregningsgrunnlag.BeregningsgrunnlagPrStatusOgAndelDto; import no.nav.folketrygdloven.kalkulator.modell.iay.InntektsmeldingDto; -import no.nav.folketrygdloven.kalkulator.modell.typer.Aktivitetsgrad; import no.nav.folketrygdloven.kalkulator.modell.typer.Beløp; -import no.nav.folketrygdloven.kalkulator.modell.typer.Utbetalingsgrad; import no.nav.fpsak.tidsserie.LocalDateTimeline; public class MapTilFordelingsmodell { @@ -105,15 +99,7 @@ private static BigDecimal finnInntektFraIM(BeregningsgrunnlagPrStatusOgAndelDto } private static boolean erSøktYtelseFor(BeregningsgrunnlagPrStatusOgAndelDto bgAndel, YtelsespesifiktGrunnlag ytelsespesifiktGrunnlag) { - var erTilkommet = bgAndel.getBeregningsgrunnlagPeriode().getTilkomneInntekter() - .stream() - .anyMatch(it -> Objects.equals(it.getArbeidsgiver().orElse(null), bgAndel.getArbeidsgiver().orElse(null)) && bgAndel.getAktivitetStatus().equals(it.getAktivitetStatus())); - if (erTilkommet) { - var aktivitetsgrad = finnAktivitetsgradForAndel(bgAndel, bgAndel.getBeregningsgrunnlagPeriode().getPeriode(), ytelsespesifiktGrunnlag, false); - return aktivitetsgrad.orElse(Aktivitetsgrad.HUNDRE).compareTo(Aktivitetsgrad.fra(100)) < 0; - } - var ubetalingsgrad = finnUtbetalingsgradForAndel(bgAndel, bgAndel.getBeregningsgrunnlagPeriode().getPeriode(), ytelsespesifiktGrunnlag, false); - return ubetalingsgrad.compareTo(Utbetalingsgrad.ZERO) > 0; + return UtbetalingsgradTjeneste.erSøktYtelseFor(bgAndel, bgAndel.getBeregningsgrunnlagPeriode().getPeriode(), ytelsespesifiktGrunnlag, false); } private static Optional mapArbeidsforhold(BeregningsgrunnlagPrStatusOgAndelDto bgAndel) { diff --git a/kalkulator/src/main/java/no/nav/folketrygdloven/kalkulator/adapter/vltilregelmodell/UtbetalingsgradTjeneste.java b/kalkulator/src/main/java/no/nav/folketrygdloven/kalkulator/adapter/vltilregelmodell/UtbetalingsgradTjeneste.java index 80b11f25..0581d5dd 100644 --- a/kalkulator/src/main/java/no/nav/folketrygdloven/kalkulator/adapter/vltilregelmodell/UtbetalingsgradTjeneste.java +++ b/kalkulator/src/main/java/no/nav/folketrygdloven/kalkulator/adapter/vltilregelmodell/UtbetalingsgradTjeneste.java @@ -22,149 +22,168 @@ public class UtbetalingsgradTjeneste { - public static Beløp finnGradertBruttoForAndel(BeregningsgrunnlagPrStatusOgAndelDto andel, - Intervall periode, - YtelsespesifiktGrunnlag ytelsesSpesifiktGrunnlag) { - Utbetalingsgrad utbetalingsgrad = finnUtbetalingsgradForAndel(andel, periode, ytelsesSpesifiktGrunnlag, false); - return andel.getBruttoInkludertNaturalYtelser() - .divider(100, 10, RoundingMode.HALF_EVEN) - .multipliser(utbetalingsgrad.verdi()); - } - - - public static Utbetalingsgrad finnUtbetalingsgradForAndel(BeregningsgrunnlagPrStatusOgAndelDto andel, - Intervall periode, - YtelsespesifiktGrunnlag ytelsesSpesifiktGrunnlag, - boolean skalIgnorereIkkeYrkesaktivStatus) { - if (ytelsesSpesifiktGrunnlag instanceof UtbetalingsgradGrunnlag) { - var bgAndelArbeidsforhold = andel.getBgAndelArbeidsforhold(); - if (andel.getAktivitetStatus().erArbeidstaker() && bgAndelArbeidsforhold.isPresent()) { - return finnUtbetalingsgradForArbeid(bgAndelArbeidsforhold.get().getArbeidsgiver(), bgAndelArbeidsforhold.get().getArbeidsforholdRef(), periode, ytelsesSpesifiktGrunnlag, skalIgnorereIkkeYrkesaktivStatus); - } else { - return finnUtbetalingsgradForStatus(andel.getAktivitetStatus(), periode, ytelsesSpesifiktGrunnlag); - } - } - return Utbetalingsgrad.valueOf(100); - } - - public static Optional finnAktivitetsgradForAndel(BeregningsgrunnlagPrStatusOgAndelDto andel, - Intervall periode, - YtelsespesifiktGrunnlag ytelsesSpesifiktGrunnlag, - boolean skalIgnorereIkkeYrkesaktivStatus) { - if (ytelsesSpesifiktGrunnlag instanceof UtbetalingsgradGrunnlag) { - var bgAndelArbeidsforhold = andel.getBgAndelArbeidsforhold(); - if (andel.getAktivitetStatus().erArbeidstaker() && bgAndelArbeidsforhold.isPresent()) { - return finnAktivitetsgradForArbeid(bgAndelArbeidsforhold.get().getArbeidsgiver(), bgAndelArbeidsforhold.get().getArbeidsforholdRef(), periode, ytelsesSpesifiktGrunnlag, skalIgnorereIkkeYrkesaktivStatus); - } else { - return finnAktivitetsgradForStatus(andel.getAktivitetStatus(), periode, ytelsesSpesifiktGrunnlag); - } - } - return Optional.empty(); - } - - public static Utbetalingsgrad finnUtbetalingsgradForStatus(AktivitetStatus status, - Intervall periode, - YtelsespesifiktGrunnlag ytelsesSpesifiktGrunnlag) { - if (ytelsesSpesifiktGrunnlag instanceof UtbetalingsgradGrunnlag utbetalingsgradGrunnlag) { - return finnUtbetalingsgradForStatus(status, periode, utbetalingsgradGrunnlag); - } - return Utbetalingsgrad.valueOf(100); - } - - public static Optional finnAktivitetsgradForStatus(AktivitetStatus status, - Intervall periode, - YtelsespesifiktGrunnlag ytelsesSpesifiktGrunnlag) { - if (ytelsesSpesifiktGrunnlag instanceof UtbetalingsgradGrunnlag utbetalingsgradGrunnlag) { - return finnGraderForStatus(status, periode, utbetalingsgradGrunnlag).flatMap(PeriodeMedUtbetalingsgradDto::getAktivitetsgrad); - } - return Optional.empty(); - } - - public static Utbetalingsgrad finnUtbetalingsgradForStatus(AktivitetStatus status, Intervall periode, UtbetalingsgradGrunnlag utbetalingsgradGrunnlag) { - if (status.erArbeidstaker()) { - throw new IllegalStateException("Bruk Arbeidsforhold-mapper"); - } - return finnGraderForStatus(status, periode, utbetalingsgradGrunnlag) - .map(PeriodeMedUtbetalingsgradDto::getUtbetalingsgrad) - .orElse(Utbetalingsgrad.ZERO); - } - - private static Optional finnGraderForStatus(AktivitetStatus status, Intervall periode, UtbetalingsgradGrunnlag utbetalingsgradGrunnlag) { - if (status.erArbeidstaker()) { - throw new IllegalStateException("Bruk Arbeidsforhold-mapper"); - } - return finnPerioderForStatus(status, utbetalingsgradGrunnlag) - .stream() - .flatMap(utb -> utb.getPeriodeMedUtbetalingsgrad().stream()) - .filter(p -> p.getPeriode().inkluderer(periode.getFomDato())) - .findFirst(); - } - - public static Optional finnPerioderForStatus(AktivitetStatus status, UtbetalingsgradGrunnlag utbetalingsgradGrunnlag) { - return utbetalingsgradGrunnlag.getUtbetalingsgradPrAktivitet().stream() - .filter(ubtGrad -> matcherStatus(status, ubtGrad.getUtbetalingsgradArbeidsforhold().getUttakArbeidType())).findFirst(); - } - - public static Utbetalingsgrad finnUtbetalingsgradForArbeid(Arbeidsgiver arbeidsgiver, - InternArbeidsforholdRefDto arbeidsforholdRef, - Intervall periode, - YtelsespesifiktGrunnlag ytelsesSpesifiktGrunnlag, - boolean skalIgnorereIkkeYrkesaktivStatus) { - if (ytelsesSpesifiktGrunnlag instanceof UtbetalingsgradGrunnlag utbetalingsgradGrunnlag) { - return finnUtbetalingsgradForArbeid(arbeidsgiver, arbeidsforholdRef, periode, utbetalingsgradGrunnlag, skalIgnorereIkkeYrkesaktivStatus); - } - return Utbetalingsgrad.valueOf(100); - } - - public static Optional finnAktivitetsgradForArbeid(Arbeidsgiver arbeidsgiver, - InternArbeidsforholdRefDto arbeidsforholdRef, - Intervall periode, - YtelsespesifiktGrunnlag ytelsesSpesifiktGrunnlag, - boolean skalIgnorereIkkeYrkesaktivStatus) { - if (ytelsesSpesifiktGrunnlag instanceof UtbetalingsgradGrunnlag utbetalingsgradGrunnlag) { - return finnGraderForArbeid(arbeidsgiver, arbeidsforholdRef, periode, utbetalingsgradGrunnlag, skalIgnorereIkkeYrkesaktivStatus).flatMap(PeriodeMedUtbetalingsgradDto::getAktivitetsgrad); - } - return Optional.empty(); - } - - public static Utbetalingsgrad finnUtbetalingsgradForArbeid(Arbeidsgiver arbeidsgiver, InternArbeidsforholdRefDto arbeidsforholdRef, Intervall periode, UtbetalingsgradGrunnlag utbetalingsgradGrunnlag, boolean skalIgnorereIkkeYrkesaktivStatus) { - return finnGraderForArbeid(arbeidsgiver, arbeidsforholdRef, periode, utbetalingsgradGrunnlag, skalIgnorereIkkeYrkesaktivStatus) - .map(PeriodeMedUtbetalingsgradDto::getUtbetalingsgrad) - .orElse(Utbetalingsgrad.ZERO); - } - - private static Optional finnGraderForArbeid(Arbeidsgiver arbeidsgiver, InternArbeidsforholdRefDto arbeidsforholdRef, Intervall periode, UtbetalingsgradGrunnlag utbetalingsgradGrunnlag, boolean skalIgnorereIkkeYrkesaktivStatus) { - return finnPerioderForArbeid(utbetalingsgradGrunnlag, arbeidsgiver, arbeidsforholdRef, skalIgnorereIkkeYrkesaktivStatus) - .stream() - .flatMap(utb -> utb.getPeriodeMedUtbetalingsgrad().stream()) - .filter(p -> p.getPeriode().inkluderer(periode.getFomDato())) - .findFirst(); - } - - - public static List finnPerioderForArbeid(UtbetalingsgradGrunnlag utbetalingsgradGrunnlag, Arbeidsgiver arbeidsgiver, InternArbeidsforholdRefDto arbeidsforholdRef, boolean skalIgnorereIkkeYrkesaktivStatus) { - return utbetalingsgradGrunnlag.getUtbetalingsgradPrAktivitet().stream() - .filter(utbGrad -> erArbeidstaker(utbGrad, skalIgnorereIkkeYrkesaktivStatus) && - matcherArbeidsgiver(utbGrad, arbeidsgiver) && - matcherArbeidsforholdReferanse(utbGrad, arbeidsforholdRef)).toList(); - } - - private static boolean erArbeidstaker(UtbetalingsgradPrAktivitetDto ubtGrad, boolean ignorerIkkeYrkesaktivStatus) { - if (ignorerIkkeYrkesaktivStatus) { - return matcherStatusUtenIkkeYrkesaktiv(AktivitetStatus.ARBEIDSTAKER, ubtGrad.getUtbetalingsgradArbeidsforhold().getUttakArbeidType()); - } - return matcherStatus(AktivitetStatus.ARBEIDSTAKER, ubtGrad.getUtbetalingsgradArbeidsforhold().getUttakArbeidType()); - } - - private static boolean matcherArbeidsforholdReferanse(UtbetalingsgradPrAktivitetDto utbGrad, InternArbeidsforholdRefDto arbeidsforholdRef) { - return utbGrad.getUtbetalingsgradArbeidsforhold().getInternArbeidsforholdRef().gjelderFor(arbeidsforholdRef); - } - - private static Boolean matcherArbeidsgiver(UtbetalingsgradPrAktivitetDto utbGrad, Arbeidsgiver arbeidsgiver) { - return utbGrad.getUtbetalingsgradArbeidsforhold().getArbeidsgiver() - .map(Arbeidsgiver::getIdentifikator) - .map(id -> arbeidsgiver.getIdentifikator().equals(id)) - .orElse(false); - } + + public static boolean erSøktYtelseFor(BeregningsgrunnlagPrStatusOgAndelDto bgAndel, Intervall periode, YtelsespesifiktGrunnlag ytelsespesifiktGrunnlag, boolean skalIgnorereIkkeYrkesaktivStatus) { + return harOverNullProsentUtbetalingsgrad(finnUtbetalingsgradForAndel(bgAndel, periode, ytelsespesifiktGrunnlag, skalIgnorereIkkeYrkesaktivStatus)) || + harMindreEnnHundreProsentAktivitetsgrad(finnAktivitetsgradForAndel(bgAndel, periode, ytelsespesifiktGrunnlag, skalIgnorereIkkeYrkesaktivStatus)); + } + + public static boolean erSøktYtelseFor(PeriodeMedUtbetalingsgradDto p) { + return harOverNullProsentUtbetalingsgrad(p.getUtbetalingsgrad()) || harMindreEnnHundreProsentAktivitetsgrad(p.getAktivitetsgrad()); + } + + private static boolean harOverNullProsentUtbetalingsgrad(Utbetalingsgrad utbetalingsgrad) { + return utbetalingsgrad != null && utbetalingsgrad.compareTo(Utbetalingsgrad.ZERO) > 0; + } + + private static boolean harMindreEnnHundreProsentAktivitetsgrad(Optional aktivitetsgrad) { + return aktivitetsgrad.map(ag -> ag.compareTo(Aktivitetsgrad.HUNDRE) < 0).orElse(false); + } + + + public static Beløp finnGradertBruttoForAndel(BeregningsgrunnlagPrStatusOgAndelDto andel, + Intervall periode, + YtelsespesifiktGrunnlag ytelsesSpesifiktGrunnlag) { + Utbetalingsgrad utbetalingsgrad = finnUtbetalingsgradForAndel(andel, periode, ytelsesSpesifiktGrunnlag, false); + return andel.getBruttoInkludertNaturalYtelser() + .divider(100, 10, RoundingMode.HALF_EVEN) + .multipliser(utbetalingsgrad.verdi()); + } + + + public static Utbetalingsgrad finnUtbetalingsgradForAndel(BeregningsgrunnlagPrStatusOgAndelDto andel, + Intervall periode, + YtelsespesifiktGrunnlag ytelsesSpesifiktGrunnlag, + boolean skalIgnorereIkkeYrkesaktivStatus) { + if (ytelsesSpesifiktGrunnlag instanceof UtbetalingsgradGrunnlag) { + var bgAndelArbeidsforhold = andel.getBgAndelArbeidsforhold(); + if (andel.getAktivitetStatus().erArbeidstaker() && bgAndelArbeidsforhold.isPresent()) { + return finnUtbetalingsgradForArbeid(bgAndelArbeidsforhold.get().getArbeidsgiver(), bgAndelArbeidsforhold.get().getArbeidsforholdRef(), periode, ytelsesSpesifiktGrunnlag, skalIgnorereIkkeYrkesaktivStatus); + } else { + return finnUtbetalingsgradForStatus(andel.getAktivitetStatus(), periode, ytelsesSpesifiktGrunnlag); + } + } + return Utbetalingsgrad.valueOf(100); + } + + public static Optional finnAktivitetsgradForAndel(BeregningsgrunnlagPrStatusOgAndelDto andel, + Intervall periode, + YtelsespesifiktGrunnlag ytelsesSpesifiktGrunnlag, + boolean skalIgnorereIkkeYrkesaktivStatus) { + if (ytelsesSpesifiktGrunnlag instanceof UtbetalingsgradGrunnlag) { + var bgAndelArbeidsforhold = andel.getBgAndelArbeidsforhold(); + if (andel.getAktivitetStatus().erArbeidstaker() && bgAndelArbeidsforhold.isPresent()) { + return finnAktivitetsgradForArbeid(bgAndelArbeidsforhold.get().getArbeidsgiver(), bgAndelArbeidsforhold.get().getArbeidsforholdRef(), periode, ytelsesSpesifiktGrunnlag, skalIgnorereIkkeYrkesaktivStatus); + } else { + return finnAktivitetsgradForStatus(andel.getAktivitetStatus(), periode, ytelsesSpesifiktGrunnlag); + } + } + return Optional.empty(); + } + + public static Utbetalingsgrad finnUtbetalingsgradForStatus(AktivitetStatus status, + Intervall periode, + YtelsespesifiktGrunnlag ytelsesSpesifiktGrunnlag) { + if (ytelsesSpesifiktGrunnlag instanceof UtbetalingsgradGrunnlag utbetalingsgradGrunnlag) { + return finnUtbetalingsgradForStatus(status, periode, utbetalingsgradGrunnlag); + } + return Utbetalingsgrad.valueOf(100); + } + + public static Optional finnAktivitetsgradForStatus(AktivitetStatus status, + Intervall periode, + YtelsespesifiktGrunnlag ytelsesSpesifiktGrunnlag) { + if (ytelsesSpesifiktGrunnlag instanceof UtbetalingsgradGrunnlag utbetalingsgradGrunnlag) { + return finnGraderForStatus(status, periode, utbetalingsgradGrunnlag).flatMap(PeriodeMedUtbetalingsgradDto::getAktivitetsgrad); + } + return Optional.empty(); + } + + public static Utbetalingsgrad finnUtbetalingsgradForStatus(AktivitetStatus status, Intervall periode, UtbetalingsgradGrunnlag utbetalingsgradGrunnlag) { + if (status.erArbeidstaker()) { + throw new IllegalStateException("Bruk Arbeidsforhold-mapper"); + } + return finnGraderForStatus(status, periode, utbetalingsgradGrunnlag) + .map(PeriodeMedUtbetalingsgradDto::getUtbetalingsgrad) + .orElse(Utbetalingsgrad.ZERO); + } + + private static Optional finnGraderForStatus(AktivitetStatus status, Intervall periode, UtbetalingsgradGrunnlag utbetalingsgradGrunnlag) { + if (status.erArbeidstaker()) { + throw new IllegalStateException("Bruk Arbeidsforhold-mapper"); + } + return finnPerioderForStatus(status, utbetalingsgradGrunnlag) + .stream() + .flatMap(utb -> utb.getPeriodeMedUtbetalingsgrad().stream()) + .filter(p -> p.getPeriode().inkluderer(periode.getFomDato())) + .findFirst(); + } + + public static Optional finnPerioderForStatus(AktivitetStatus status, UtbetalingsgradGrunnlag utbetalingsgradGrunnlag) { + return utbetalingsgradGrunnlag.getUtbetalingsgradPrAktivitet().stream() + .filter(ubtGrad -> matcherStatus(status, ubtGrad.getUtbetalingsgradArbeidsforhold().getUttakArbeidType())).findFirst(); + } + + public static Utbetalingsgrad finnUtbetalingsgradForArbeid(Arbeidsgiver arbeidsgiver, + InternArbeidsforholdRefDto arbeidsforholdRef, + Intervall periode, + YtelsespesifiktGrunnlag ytelsesSpesifiktGrunnlag, + boolean skalIgnorereIkkeYrkesaktivStatus) { + if (ytelsesSpesifiktGrunnlag instanceof UtbetalingsgradGrunnlag utbetalingsgradGrunnlag) { + return finnUtbetalingsgradForArbeid(arbeidsgiver, arbeidsforholdRef, periode, utbetalingsgradGrunnlag, skalIgnorereIkkeYrkesaktivStatus); + } + return Utbetalingsgrad.valueOf(100); + } + + public static Optional finnAktivitetsgradForArbeid(Arbeidsgiver arbeidsgiver, + InternArbeidsforholdRefDto arbeidsforholdRef, + Intervall periode, + YtelsespesifiktGrunnlag ytelsesSpesifiktGrunnlag, + boolean skalIgnorereIkkeYrkesaktivStatus) { + if (ytelsesSpesifiktGrunnlag instanceof UtbetalingsgradGrunnlag utbetalingsgradGrunnlag) { + return finnGraderForArbeid(arbeidsgiver, arbeidsforholdRef, periode, utbetalingsgradGrunnlag, skalIgnorereIkkeYrkesaktivStatus).flatMap(PeriodeMedUtbetalingsgradDto::getAktivitetsgrad); + } + return Optional.empty(); + } + + public static Utbetalingsgrad finnUtbetalingsgradForArbeid(Arbeidsgiver arbeidsgiver, InternArbeidsforholdRefDto arbeidsforholdRef, Intervall periode, UtbetalingsgradGrunnlag utbetalingsgradGrunnlag, boolean skalIgnorereIkkeYrkesaktivStatus) { + return finnGraderForArbeid(arbeidsgiver, arbeidsforholdRef, periode, utbetalingsgradGrunnlag, skalIgnorereIkkeYrkesaktivStatus) + .map(PeriodeMedUtbetalingsgradDto::getUtbetalingsgrad) + .orElse(Utbetalingsgrad.ZERO); + } + + private static Optional finnGraderForArbeid(Arbeidsgiver arbeidsgiver, InternArbeidsforholdRefDto arbeidsforholdRef, Intervall periode, UtbetalingsgradGrunnlag utbetalingsgradGrunnlag, boolean skalIgnorereIkkeYrkesaktivStatus) { + return finnPerioderForArbeid(utbetalingsgradGrunnlag, arbeidsgiver, arbeidsforholdRef, skalIgnorereIkkeYrkesaktivStatus) + .stream() + .flatMap(utb -> utb.getPeriodeMedUtbetalingsgrad().stream()) + .filter(p -> p.getPeriode().inkluderer(periode.getFomDato())) + .findFirst(); + } + + + public static List finnPerioderForArbeid(UtbetalingsgradGrunnlag utbetalingsgradGrunnlag, Arbeidsgiver arbeidsgiver, InternArbeidsforholdRefDto arbeidsforholdRef, boolean skalIgnorereIkkeYrkesaktivStatus) { + return utbetalingsgradGrunnlag.getUtbetalingsgradPrAktivitet().stream() + .filter(utbGrad -> erArbeidstaker(utbGrad, skalIgnorereIkkeYrkesaktivStatus) && + matcherArbeidsgiver(utbGrad, arbeidsgiver) && + matcherArbeidsforholdReferanse(utbGrad, arbeidsforholdRef)).toList(); + } + + private static boolean erArbeidstaker(UtbetalingsgradPrAktivitetDto ubtGrad, boolean ignorerIkkeYrkesaktivStatus) { + if (ignorerIkkeYrkesaktivStatus) { + return matcherStatusUtenIkkeYrkesaktiv(AktivitetStatus.ARBEIDSTAKER, ubtGrad.getUtbetalingsgradArbeidsforhold().getUttakArbeidType()); + } + return matcherStatus(AktivitetStatus.ARBEIDSTAKER, ubtGrad.getUtbetalingsgradArbeidsforhold().getUttakArbeidType()); + } + + private static boolean matcherArbeidsforholdReferanse(UtbetalingsgradPrAktivitetDto utbGrad, InternArbeidsforholdRefDto arbeidsforholdRef) { + return utbGrad.getUtbetalingsgradArbeidsforhold().getInternArbeidsforholdRef().gjelderFor(arbeidsforholdRef); + } + + private static Boolean matcherArbeidsgiver(UtbetalingsgradPrAktivitetDto utbGrad, Arbeidsgiver arbeidsgiver) { + return utbGrad.getUtbetalingsgradArbeidsforhold().getArbeidsgiver() + .map(Arbeidsgiver::getIdentifikator) + .map(id -> arbeidsgiver.getIdentifikator().equals(id)) + .orElse(false); + } } diff --git a/kalkulator/src/main/java/no/nav/folketrygdloven/kalkulator/ytelse/k9/MapRefusjonPerioderFraVLTilRegelPleiepenger.java b/kalkulator/src/main/java/no/nav/folketrygdloven/kalkulator/ytelse/k9/MapRefusjonPerioderFraVLTilRegelPleiepenger.java index 7d9df99b..4b390f0a 100644 --- a/kalkulator/src/main/java/no/nav/folketrygdloven/kalkulator/ytelse/k9/MapRefusjonPerioderFraVLTilRegelPleiepenger.java +++ b/kalkulator/src/main/java/no/nav/folketrygdloven/kalkulator/ytelse/k9/MapRefusjonPerioderFraVLTilRegelPleiepenger.java @@ -87,7 +87,7 @@ private LocalDateTimeline finnUtbetalingTidslinje(UtbetalingsgradGrunnl final List> segmenterMedUtbetaling = UtbetalingsgradTjeneste.finnPerioderForArbeid(ytelsespesifiktGrunnlag, im.getArbeidsgiver(), im.getArbeidsforholdRef(), true) .stream() .flatMap(u -> u.getPeriodeMedUtbetalingsgrad().stream()) - .filter(p -> harOverNullProsentUtbetalingsgrad(p) || harMindreEnnHundreProsentAktivitetsgrad(p)) + .filter(UtbetalingsgradTjeneste::erSøktYtelseFor) .map(PeriodeMedUtbetalingsgradDto::getPeriode) .map(p -> new LocalDateTimeline<>(List.of(new LocalDateSegment<>(p.getFomDato(), p.getTomDato(), true)))) .collect(Collectors.toList()); From 6b9d308db1c4f01d2b089c8605ae845267ca05fb Mon Sep 17 00:00:00 2001 From: Espen Johansen Velsvik Date: Fri, 1 Nov 2024 13:33:41 +0100 Subject: [PATCH 2/3] Legger til tester --- .../adapter/ErS\303\270ktYtelseFor.java" | 37 ++++++++++ .../MapTilFordelingsmodell.java | 3 +- .../UtbetalingsgradTjeneste.java | 19 ----- ...usjonPerioderFraVLTilRegelPleiepenger.java | 3 +- .../ErS\303\270ktYtelseForTest.java" | 69 +++++++++++++++++++ 5 files changed, 110 insertions(+), 21 deletions(-) create mode 100644 "kalkulator/src/main/java/no/nav/folketrygdloven/kalkulator/adapter/ErS\303\270ktYtelseFor.java" create mode 100644 "kalkulator/src/test/java/no/nav/folketrygdloven/kalkulator/adapter/vltilregelmodell/ErS\303\270ktYtelseForTest.java" diff --git "a/kalkulator/src/main/java/no/nav/folketrygdloven/kalkulator/adapter/ErS\303\270ktYtelseFor.java" "b/kalkulator/src/main/java/no/nav/folketrygdloven/kalkulator/adapter/ErS\303\270ktYtelseFor.java" new file mode 100644 index 00000000..f1e3ad22 --- /dev/null +++ "b/kalkulator/src/main/java/no/nav/folketrygdloven/kalkulator/adapter/ErS\303\270ktYtelseFor.java" @@ -0,0 +1,37 @@ +package no.nav.folketrygdloven.kalkulator.adapter; + +import static no.nav.folketrygdloven.kalkulator.adapter.vltilregelmodell.UtbetalingsgradTjeneste.finnAktivitetsgradForAndel; +import static no.nav.folketrygdloven.kalkulator.adapter.vltilregelmodell.UtbetalingsgradTjeneste.finnUtbetalingsgradForAndel; + +import java.util.Optional; + +import no.nav.folketrygdloven.kalkulator.input.YtelsespesifiktGrunnlag; +import no.nav.folketrygdloven.kalkulator.modell.beregningsgrunnlag.BeregningsgrunnlagPrStatusOgAndelDto; +import no.nav.folketrygdloven.kalkulator.modell.svp.PeriodeMedUtbetalingsgradDto; +import no.nav.folketrygdloven.kalkulator.modell.typer.Aktivitetsgrad; +import no.nav.folketrygdloven.kalkulator.modell.typer.Utbetalingsgrad; +import no.nav.folketrygdloven.kalkulator.tid.Intervall; + +/** + * Avgjør om det er søkt ytelse for aktivitet. + */ +public class ErSøktYtelseFor { + + public static boolean erSøktYtelseFor(BeregningsgrunnlagPrStatusOgAndelDto bgAndel, Intervall periode, YtelsespesifiktGrunnlag ytelsespesifiktGrunnlag, boolean skalIgnorereIkkeYrkesaktivStatus) { + return harOverNullProsentUtbetalingsgrad(finnUtbetalingsgradForAndel(bgAndel, periode, ytelsespesifiktGrunnlag, skalIgnorereIkkeYrkesaktivStatus)) || + harMindreEnnHundreProsentAktivitetsgrad(finnAktivitetsgradForAndel(bgAndel, periode, ytelsespesifiktGrunnlag, skalIgnorereIkkeYrkesaktivStatus)); + } + + public static boolean erSøktYtelseFor(PeriodeMedUtbetalingsgradDto p) { + return harOverNullProsentUtbetalingsgrad(p.getUtbetalingsgrad()) || harMindreEnnHundreProsentAktivitetsgrad(p.getAktivitetsgrad()); + } + + private static boolean harOverNullProsentUtbetalingsgrad(Utbetalingsgrad utbetalingsgrad) { + return utbetalingsgrad != null && utbetalingsgrad.compareTo(Utbetalingsgrad.ZERO) > 0; + } + + private static boolean harMindreEnnHundreProsentAktivitetsgrad(Optional aktivitetsgrad) { + return aktivitetsgrad.map(ag -> ag.compareTo(Aktivitetsgrad.HUNDRE) < 0).orElse(false); + } + +} diff --git a/kalkulator/src/main/java/no/nav/folketrygdloven/kalkulator/adapter/vltilregelmodell/MapTilFordelingsmodell.java b/kalkulator/src/main/java/no/nav/folketrygdloven/kalkulator/adapter/vltilregelmodell/MapTilFordelingsmodell.java index 38a7103e..bd68c3aa 100644 --- a/kalkulator/src/main/java/no/nav/folketrygdloven/kalkulator/adapter/vltilregelmodell/MapTilFordelingsmodell.java +++ b/kalkulator/src/main/java/no/nav/folketrygdloven/kalkulator/adapter/vltilregelmodell/MapTilFordelingsmodell.java @@ -10,6 +10,7 @@ import no.nav.folketrygdloven.beregningsgrunnlag.regelmodell.AktivitetStatus; import no.nav.folketrygdloven.beregningsgrunnlag.regelmodell.Periode; import no.nav.folketrygdloven.beregningsgrunnlag.regelmodell.grunnlag.inntekt.Arbeidsforhold; +import no.nav.folketrygdloven.kalkulator.adapter.ErSøktYtelseFor; import no.nav.folketrygdloven.kalkulator.adapter.util.FinnArbeidsperiode; import no.nav.folketrygdloven.kalkulator.adapter.vltilregelmodell.kodeverk.MapInntektskategoriFraVLTilRegel; import no.nav.folketrygdloven.kalkulator.avklaringsbehov.PerioderTilVurderingTjeneste; @@ -99,7 +100,7 @@ private static BigDecimal finnInntektFraIM(BeregningsgrunnlagPrStatusOgAndelDto } private static boolean erSøktYtelseFor(BeregningsgrunnlagPrStatusOgAndelDto bgAndel, YtelsespesifiktGrunnlag ytelsespesifiktGrunnlag) { - return UtbetalingsgradTjeneste.erSøktYtelseFor(bgAndel, bgAndel.getBeregningsgrunnlagPeriode().getPeriode(), ytelsespesifiktGrunnlag, false); + return ErSøktYtelseFor.erSøktYtelseFor(bgAndel, bgAndel.getBeregningsgrunnlagPeriode().getPeriode(), ytelsespesifiktGrunnlag, false); } private static Optional mapArbeidsforhold(BeregningsgrunnlagPrStatusOgAndelDto bgAndel) { diff --git a/kalkulator/src/main/java/no/nav/folketrygdloven/kalkulator/adapter/vltilregelmodell/UtbetalingsgradTjeneste.java b/kalkulator/src/main/java/no/nav/folketrygdloven/kalkulator/adapter/vltilregelmodell/UtbetalingsgradTjeneste.java index 0581d5dd..af5a8e15 100644 --- a/kalkulator/src/main/java/no/nav/folketrygdloven/kalkulator/adapter/vltilregelmodell/UtbetalingsgradTjeneste.java +++ b/kalkulator/src/main/java/no/nav/folketrygdloven/kalkulator/adapter/vltilregelmodell/UtbetalingsgradTjeneste.java @@ -22,25 +22,6 @@ public class UtbetalingsgradTjeneste { - - public static boolean erSøktYtelseFor(BeregningsgrunnlagPrStatusOgAndelDto bgAndel, Intervall periode, YtelsespesifiktGrunnlag ytelsespesifiktGrunnlag, boolean skalIgnorereIkkeYrkesaktivStatus) { - return harOverNullProsentUtbetalingsgrad(finnUtbetalingsgradForAndel(bgAndel, periode, ytelsespesifiktGrunnlag, skalIgnorereIkkeYrkesaktivStatus)) || - harMindreEnnHundreProsentAktivitetsgrad(finnAktivitetsgradForAndel(bgAndel, periode, ytelsespesifiktGrunnlag, skalIgnorereIkkeYrkesaktivStatus)); - } - - public static boolean erSøktYtelseFor(PeriodeMedUtbetalingsgradDto p) { - return harOverNullProsentUtbetalingsgrad(p.getUtbetalingsgrad()) || harMindreEnnHundreProsentAktivitetsgrad(p.getAktivitetsgrad()); - } - - private static boolean harOverNullProsentUtbetalingsgrad(Utbetalingsgrad utbetalingsgrad) { - return utbetalingsgrad != null && utbetalingsgrad.compareTo(Utbetalingsgrad.ZERO) > 0; - } - - private static boolean harMindreEnnHundreProsentAktivitetsgrad(Optional aktivitetsgrad) { - return aktivitetsgrad.map(ag -> ag.compareTo(Aktivitetsgrad.HUNDRE) < 0).orElse(false); - } - - public static Beløp finnGradertBruttoForAndel(BeregningsgrunnlagPrStatusOgAndelDto andel, Intervall periode, YtelsespesifiktGrunnlag ytelsesSpesifiktGrunnlag) { diff --git a/kalkulator/src/main/java/no/nav/folketrygdloven/kalkulator/ytelse/k9/MapRefusjonPerioderFraVLTilRegelPleiepenger.java b/kalkulator/src/main/java/no/nav/folketrygdloven/kalkulator/ytelse/k9/MapRefusjonPerioderFraVLTilRegelPleiepenger.java index 4b390f0a..bdeafce2 100644 --- a/kalkulator/src/main/java/no/nav/folketrygdloven/kalkulator/ytelse/k9/MapRefusjonPerioderFraVLTilRegelPleiepenger.java +++ b/kalkulator/src/main/java/no/nav/folketrygdloven/kalkulator/ytelse/k9/MapRefusjonPerioderFraVLTilRegelPleiepenger.java @@ -9,6 +9,7 @@ import java.util.stream.Collectors; import no.nav.folketrygdloven.kalkulator.KonfigurasjonVerdi; +import no.nav.folketrygdloven.kalkulator.adapter.ErSøktYtelseFor; import no.nav.folketrygdloven.kalkulator.adapter.vltilregelmodell.UtbetalingsgradTjeneste; import no.nav.folketrygdloven.kalkulator.input.UtbetalingsgradGrunnlag; import no.nav.folketrygdloven.kalkulator.input.YtelsespesifiktGrunnlag; @@ -87,7 +88,7 @@ private LocalDateTimeline finnUtbetalingTidslinje(UtbetalingsgradGrunnl final List> segmenterMedUtbetaling = UtbetalingsgradTjeneste.finnPerioderForArbeid(ytelsespesifiktGrunnlag, im.getArbeidsgiver(), im.getArbeidsforholdRef(), true) .stream() .flatMap(u -> u.getPeriodeMedUtbetalingsgrad().stream()) - .filter(UtbetalingsgradTjeneste::erSøktYtelseFor) + .filter(ErSøktYtelseFor::erSøktYtelseFor) .map(PeriodeMedUtbetalingsgradDto::getPeriode) .map(p -> new LocalDateTimeline<>(List.of(new LocalDateSegment<>(p.getFomDato(), p.getTomDato(), true)))) .collect(Collectors.toList()); diff --git "a/kalkulator/src/test/java/no/nav/folketrygdloven/kalkulator/adapter/vltilregelmodell/ErS\303\270ktYtelseForTest.java" "b/kalkulator/src/test/java/no/nav/folketrygdloven/kalkulator/adapter/vltilregelmodell/ErS\303\270ktYtelseForTest.java" new file mode 100644 index 00000000..706e5a62 --- /dev/null +++ "b/kalkulator/src/test/java/no/nav/folketrygdloven/kalkulator/adapter/vltilregelmodell/ErS\303\270ktYtelseForTest.java" @@ -0,0 +1,69 @@ +package no.nav.folketrygdloven.kalkulator.adapter.vltilregelmodell; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +import java.time.LocalDate; + +import org.junit.jupiter.api.Test; + +import no.nav.folketrygdloven.kalkulator.adapter.ErSøktYtelseFor; +import no.nav.folketrygdloven.kalkulator.modell.svp.PeriodeMedUtbetalingsgradDto; +import no.nav.folketrygdloven.kalkulator.modell.typer.Aktivitetsgrad; +import no.nav.folketrygdloven.kalkulator.modell.typer.Utbetalingsgrad; +import no.nav.folketrygdloven.kalkulator.tid.Intervall; + +class ErSøktYtelseForTest { + + @Test + void skal_gi_søkt_ytelse_for_lik_false_når_utbetalingsgrad_er_lik_null_og_aktivitetsgrad_ikke_er_satt() { + var intervall = Intervall.fraOgMedTilOgMed(LocalDate.now(), LocalDate.now()); + var erSøktYtelseFor = ErSøktYtelseFor.erSøktYtelseFor(new PeriodeMedUtbetalingsgradDto(intervall, Utbetalingsgrad.ZERO, null)); + assertThat(erSøktYtelseFor).isFalse(); + } + + @Test + void skal_gi_søkt_ytelse_for_lik_false_når_utbetalingsgrad_er_lik_null_og_aktivitetsgrad_lik_hundre() { + var intervall = Intervall.fraOgMedTilOgMed(LocalDate.now(), LocalDate.now()); + var erSøktYtelseFor = ErSøktYtelseFor.erSøktYtelseFor(new PeriodeMedUtbetalingsgradDto(intervall, Utbetalingsgrad.ZERO, Aktivitetsgrad.HUNDRE)); + assertThat(erSøktYtelseFor).isFalse(); + } + + @Test + void skal_gi_søkt_ytelse_for_lik_true_når_utbetalingsgrad_er_over_null_og_aktivitetsgrad_ikke_satt() { + var intervall = Intervall.fraOgMedTilOgMed(LocalDate.now(), LocalDate.now()); + var erSøktYtelseFor = ErSøktYtelseFor.erSøktYtelseFor(new PeriodeMedUtbetalingsgradDto(intervall, Utbetalingsgrad.valueOf(1), null)); + assertThat(erSøktYtelseFor).isTrue(); + } + + @Test + void skal_gi_søkt_ytelse_for_lik_true_når_utbetalingsgrad_er_over_null_og_aktivitetsgrad_lik_hundre() { + // Feilsituasjon, f.eks avrundingsfeil i aktivitetsgrad eller utbetalingsgrad. prio til utbetalingsgrad + var intervall = Intervall.fraOgMedTilOgMed(LocalDate.now(), LocalDate.now()); + var erSøktYtelseFor = ErSøktYtelseFor.erSøktYtelseFor(new PeriodeMedUtbetalingsgradDto(intervall, Utbetalingsgrad.valueOf(1), Aktivitetsgrad.HUNDRE)); + assertThat(erSøktYtelseFor).isTrue(); + } + + @Test + void skal_gi_søkt_ytelse_for_lik_true_når_utbetalingsgrad_er_over_null_og_aktivitetsgrad_er_under_hundre() { + var intervall = Intervall.fraOgMedTilOgMed(LocalDate.now(), LocalDate.now()); + var erSøktYtelseFor = ErSøktYtelseFor.erSøktYtelseFor(new PeriodeMedUtbetalingsgradDto(intervall, Utbetalingsgrad.valueOf(1), Aktivitetsgrad.fra(99))); + assertThat(erSøktYtelseFor).isTrue(); + } + + @Test + void skal_gi_søkt_ytelse_for_lik_true_når_utbetalingsgrad_er_null_og_aktivitetsgrad_er_under_hundre() { + var intervall = Intervall.fraOgMedTilOgMed(LocalDate.now(), LocalDate.now()); + var erSøktYtelseFor = ErSøktYtelseFor.erSøktYtelseFor(new PeriodeMedUtbetalingsgradDto(intervall, Utbetalingsgrad.ZERO, Aktivitetsgrad.fra(99))); + assertThat(erSøktYtelseFor).isTrue(); + } + + + @Test + void skal_gi_søkt_ytelse_for_lik_false_når_utbetalingsgrad_er_null_og_aktivitetsgrad_er_hundre() { + var intervall = Intervall.fraOgMedTilOgMed(LocalDate.now(), LocalDate.now()); + var erSøktYtelseFor = ErSøktYtelseFor.erSøktYtelseFor(new PeriodeMedUtbetalingsgradDto(intervall, Utbetalingsgrad.ZERO, Aktivitetsgrad.HUNDRE)); + assertThat(erSøktYtelseFor).isFalse(); + } + + +} \ No newline at end of file From bc13efd91915f7a957f85e594fe4b7288372441c Mon Sep 17 00:00:00 2001 From: Espen Johansen Velsvik Date: Fri, 1 Nov 2024 13:34:27 +0100 Subject: [PATCH 3/3] Fjerner ubrukte metoder --- .../MapRefusjonPerioderFraVLTilRegelPleiepenger.java | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/kalkulator/src/main/java/no/nav/folketrygdloven/kalkulator/ytelse/k9/MapRefusjonPerioderFraVLTilRegelPleiepenger.java b/kalkulator/src/main/java/no/nav/folketrygdloven/kalkulator/ytelse/k9/MapRefusjonPerioderFraVLTilRegelPleiepenger.java index bdeafce2..cdec2a71 100644 --- a/kalkulator/src/main/java/no/nav/folketrygdloven/kalkulator/ytelse/k9/MapRefusjonPerioderFraVLTilRegelPleiepenger.java +++ b/kalkulator/src/main/java/no/nav/folketrygdloven/kalkulator/ytelse/k9/MapRefusjonPerioderFraVLTilRegelPleiepenger.java @@ -91,7 +91,7 @@ private LocalDateTimeline finnUtbetalingTidslinje(UtbetalingsgradGrunnl .filter(ErSøktYtelseFor::erSøktYtelseFor) .map(PeriodeMedUtbetalingsgradDto::getPeriode) .map(p -> new LocalDateTimeline<>(List.of(new LocalDateSegment<>(p.getFomDato(), p.getTomDato(), true)))) - .collect(Collectors.toList()); + .toList(); var timeline = new LocalDateTimeline(List.of()); @@ -105,13 +105,5 @@ private LocalDateTimeline finnUtbetalingTidslinje(UtbetalingsgradGrunnl return timeline.compress(); } - private static boolean harOverNullProsentUtbetalingsgrad(PeriodeMedUtbetalingsgradDto p) { - return p.getUtbetalingsgrad() != null && p.getUtbetalingsgrad().compareTo(Utbetalingsgrad.ZERO) > 0; - } - - private static boolean harMindreEnnHundreProsentAktivitetsgrad(PeriodeMedUtbetalingsgradDto p) { - return p.getAktivitetsgrad().map(ag -> ag.compareTo(Aktivitetsgrad.HUNDRE) < 0).orElse(false); - } - }