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 c0b72576..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 @@ -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; @@ -14,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; @@ -24,9 +21,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 +100,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 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 80b11f25..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,149 +22,149 @@ 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 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..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 @@ -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,10 +88,10 @@ 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(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()); @@ -104,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); - } - } 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