From 5fca1ff7069326ca153f05a6cd45bc222e4d1b37 Mon Sep 17 00:00:00 2001 From: Espen Velsvik Date: Thu, 19 Dec 2024 10:06:36 +0100 Subject: [PATCH] Legger ikke til andeler for refusjon dersom det ikke utbetales ytelse for denne perioden (#585) --- ...usjonPerioderFraVLTilRegelPleiepenger.java | 109 ------------------ ...pRefusjonPerioderFraVLTilRegelUtbgrad.java | 38 +++--- ...usjonPerioderFraVLTilRegelUtbgradTest.java | 24 ++++ 3 files changed, 48 insertions(+), 123 deletions(-) delete mode 100644 kalkulator/src/main/java/no/nav/folketrygdloven/kalkulator/ytelse/k9/MapRefusjonPerioderFraVLTilRegelPleiepenger.java 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 deleted file mode 100644 index cdec2a71..00000000 --- a/kalkulator/src/main/java/no/nav/folketrygdloven/kalkulator/ytelse/k9/MapRefusjonPerioderFraVLTilRegelPleiepenger.java +++ /dev/null @@ -1,109 +0,0 @@ -package no.nav.folketrygdloven.kalkulator.ytelse.k9; - -import static no.nav.fpsak.tidsserie.LocalDateInterval.TIDENES_ENDE; - -import java.time.LocalDate; -import java.util.Collections; -import java.util.List; -import java.util.Set; -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; -import no.nav.folketrygdloven.kalkulator.modell.iay.AktivitetsAvtaleDto; -import no.nav.folketrygdloven.kalkulator.modell.iay.InntektsmeldingDto; -import no.nav.folketrygdloven.kalkulator.modell.iay.YrkesaktivitetDto; -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; -import no.nav.folketrygdloven.kalkulator.ytelse.utbgradytelse.MapRefusjonPerioderFraVLTilRegelUtbgrad; -import no.nav.fpsak.tidsserie.LocalDateSegment; -import no.nav.fpsak.tidsserie.LocalDateTimeline; -import no.nav.fpsak.tidsserie.StandardCombinators; - -public class MapRefusjonPerioderFraVLTilRegelPleiepenger extends MapRefusjonPerioderFraVLTilRegelUtbgrad { - - - public MapRefusjonPerioderFraVLTilRegelPleiepenger() { - super(); - } - - /** - * Finner gyldige perioder for refusjon basert på perioder med utbetalingsgrad og ansettelse - * - * @param startdatoEtterPermisjon Startdato for permisjonen for ytelse søkt for - * @param ytelsespesifiktGrunnlag Ytelsesspesifikt grunnlag - * @param im inntektsmelding for refusjonskrav - * @param relaterteYrkesaktiviteter Relaterte yrkesaktiviteter - * @return Gyldige perioder for refusjon - */ - @Override - protected List finnGyldigeRefusjonPerioder(LocalDate startdatoEtterPermisjon, - YtelsespesifiktGrunnlag ytelsespesifiktGrunnlag, - InntektsmeldingDto im, - List ansattperioder, - Set relaterteYrkesaktiviteter) { - - - if (KonfigurasjonVerdi.instance().get("PSB_IKKE_OPPHOER_REFUSJON_VED_ENDT_ARBEIDSFORHOLD", false)) { - return super.finnGyldigeRefusjonPerioder(startdatoEtterPermisjon, ytelsespesifiktGrunnlag, im, ansattperioder, relaterteYrkesaktiviteter); - } - - if (im.getRefusjonOpphører() != null && im.getRefusjonOpphører().isBefore(startdatoEtterPermisjon)) { - // Refusjon opphører før det utledede startpunktet, blir aldri refusjon - return Collections.emptyList(); - } - if (ytelsespesifiktGrunnlag instanceof UtbetalingsgradGrunnlag) { - var utbetalingTidslinje = finnUtbetalingTidslinje((UtbetalingsgradGrunnlag) ytelsespesifiktGrunnlag, im, startdatoEtterPermisjon); - var ansettelseTidslinje = finnAnsettelseTidslinje(ansattperioder); - return utbetalingTidslinje.intersection(ansettelseTidslinje) - .getLocalDateIntervals() - .stream() - .map(i -> Intervall.fraOgMedTilOgMed(i.getFomDato(), i.getTomDato())) - .collect(Collectors.toList()); - } - throw new IllegalStateException("Forventet utbetalingsgrader men fant ikke UtbetalingsgradGrunnlag."); - } - - private LocalDateTimeline finnAnsettelseTidslinje(List ansattperioder) { - var segmenterMedAnsettelse = ansattperioder.stream() - .map(AktivitetsAvtaleDto::getPeriode) - .map(p -> new LocalDateTimeline<>(List.of(new LocalDateSegment<>(p.getFomDato(), p.getTomDato(), true)))) - .collect(Collectors.toList()); - - var timeline = new LocalDateTimeline(List.of()); - - for (LocalDateTimeline localDateSegments : segmenterMedAnsettelse) { - timeline = timeline.combine(localDateSegments, StandardCombinators::coalesceRightHandSide, LocalDateTimeline.JoinStyle.CROSS_JOIN); - } - - return timeline.compress(); - } - - private LocalDateTimeline finnUtbetalingTidslinje(UtbetalingsgradGrunnlag ytelsespesifiktGrunnlag, InntektsmeldingDto im, LocalDate startDatoEtterPermisjon) { - final List> segmenterMedUtbetaling = UtbetalingsgradTjeneste.finnPerioderForArbeid(ytelsespesifiktGrunnlag, im.getArbeidsgiver(), im.getArbeidsforholdRef(), true) - .stream() - .flatMap(u -> u.getPeriodeMedUtbetalingsgrad().stream()) - .filter(ErSøktYtelseFor::erSøktYtelseFor) - .map(PeriodeMedUtbetalingsgradDto::getPeriode) - .map(p -> new LocalDateTimeline<>(List.of(new LocalDateSegment<>(p.getFomDato(), p.getTomDato(), true)))) - .toList(); - - var timeline = new LocalDateTimeline(List.of()); - - for (LocalDateTimeline localDateSegments : segmenterMedUtbetaling) { - timeline = timeline.combine(localDateSegments, StandardCombinators::coalesceRightHandSide, LocalDateTimeline.JoinStyle.CROSS_JOIN); - } - - var tidslinjeEtterPermisjon = new LocalDateTimeline<>(List.of(new LocalDateSegment<>(startDatoEtterPermisjon, TIDENES_ENDE, Boolean.TRUE))); - timeline = timeline.intersection(tidslinjeEtterPermisjon); - - return timeline.compress(); - } - - -} diff --git a/kalkulator/src/main/java/no/nav/folketrygdloven/kalkulator/ytelse/utbgradytelse/MapRefusjonPerioderFraVLTilRegelUtbgrad.java b/kalkulator/src/main/java/no/nav/folketrygdloven/kalkulator/ytelse/utbgradytelse/MapRefusjonPerioderFraVLTilRegelUtbgrad.java index a70a696e..dcb3df09 100644 --- a/kalkulator/src/main/java/no/nav/folketrygdloven/kalkulator/ytelse/utbgradytelse/MapRefusjonPerioderFraVLTilRegelUtbgrad.java +++ b/kalkulator/src/main/java/no/nav/folketrygdloven/kalkulator/ytelse/utbgradytelse/MapRefusjonPerioderFraVLTilRegelUtbgrad.java @@ -78,22 +78,32 @@ protected List finnGyldigeRefusjonPerioder(LocalDate startdatoEtterPe } private LocalDateTimeline finnUtbetalingTidslinje(UtbetalingsgradGrunnlag ytelsespesifiktGrunnlag, InntektsmeldingDto im) { - final List> segmenterMedUtbetaling = UtbetalingsgradTjeneste.finnPerioderForArbeid(ytelsespesifiktGrunnlag, im.getArbeidsgiver(), im.getArbeidsforholdRef(), false) - .stream() - .flatMap(u -> u.getPeriodeMedUtbetalingsgrad().stream()) - .filter(p -> harOverNullProsentUtbetalingsgrad(p) || harMindreEnnHundreProsentAktivitetsgrad(p)) - .map(PeriodeMedUtbetalingsgradDto::getPeriode) - .map(p -> new LocalDateTimeline<>(List.of(new LocalDateSegment<>(p.getFomDato(), p.getTomDato(), true)))) - .toList(); - - var timeline = new LocalDateTimeline(List.of()); + final LocalDateTimeline tidslinjeMedFraværHosArbeidsgiver = finnTidslinjeMedFraværHosArbeidsgiver(ytelsespesifiktGrunnlag, im); + final var tidslinjeForYtelse = finnTidslinjeForYtelse(ytelsespesifiktGrunnlag); + return tidslinjeMedFraværHosArbeidsgiver.intersection(tidslinjeForYtelse).compress(); + } - for (LocalDateTimeline localDateSegments : segmenterMedUtbetaling) { - timeline = timeline.combine(localDateSegments, StandardCombinators::coalesceRightHandSide, LocalDateTimeline.JoinStyle.CROSS_JOIN); - } + private static LocalDateTimeline finnTidslinjeMedFraværHosArbeidsgiver(UtbetalingsgradGrunnlag ytelsespesifiktGrunnlag, InntektsmeldingDto im) { + return UtbetalingsgradTjeneste.finnPerioderForArbeid(ytelsespesifiktGrunnlag, im.getArbeidsgiver(), im.getArbeidsforholdRef(), false) + .stream() + .flatMap(u -> u.getPeriodeMedUtbetalingsgrad().stream()) + .filter(p -> harOverNullProsentUtbetalingsgrad(p) || harMindreEnnHundreProsentAktivitetsgrad(p)) + .map(PeriodeMedUtbetalingsgradDto::getPeriode) + .map(p -> new LocalDateTimeline<>(p.getFomDato(), p.getTomDato(), true)) + .reduce(LocalDateTimeline::crossJoin) + .orElse(LocalDateTimeline.empty()); + } - return timeline.compress(); - } + private static LocalDateTimeline finnTidslinjeForYtelse(UtbetalingsgradGrunnlag ytelsespesifiktGrunnlag) { + return ytelsespesifiktGrunnlag.getUtbetalingsgradPrAktivitet() + .stream() + .flatMap(u -> u.getPeriodeMedUtbetalingsgrad().stream()) + .filter(MapRefusjonPerioderFraVLTilRegelUtbgrad::harOverNullProsentUtbetalingsgrad) + .map(PeriodeMedUtbetalingsgradDto::getPeriode) + .map(p -> new LocalDateTimeline<>(p.getFomDato(), p.getTomDato(), true)) + .reduce(LocalDateTimeline::crossJoin) + .orElse(LocalDateTimeline.empty()); + } private static boolean harOverNullProsentUtbetalingsgrad(PeriodeMedUtbetalingsgradDto p) { return p.getUtbetalingsgrad() != null && p.getUtbetalingsgrad().compareTo(Utbetalingsgrad.ZERO) > 0; diff --git a/kalkulator/src/test/java/no/nav/folketrygdloven/kalkulator/ytelse/utbgradytelse/MapRefusjonPerioderFraVLTilRegelUtbgradTest.java b/kalkulator/src/test/java/no/nav/folketrygdloven/kalkulator/ytelse/utbgradytelse/MapRefusjonPerioderFraVLTilRegelUtbgradTest.java index 6c058253..313d42fe 100644 --- a/kalkulator/src/test/java/no/nav/folketrygdloven/kalkulator/ytelse/utbgradytelse/MapRefusjonPerioderFraVLTilRegelUtbgradTest.java +++ b/kalkulator/src/test/java/no/nav/folketrygdloven/kalkulator/ytelse/utbgradytelse/MapRefusjonPerioderFraVLTilRegelUtbgradTest.java @@ -28,6 +28,7 @@ import no.nav.folketrygdloven.kalkulator.modell.beregningsgrunnlag.BeregningsgrunnlagGrunnlagDtoBuilder; import no.nav.folketrygdloven.kalkulator.modell.beregningsgrunnlag.BeregningsgrunnlagPeriodeDto; import no.nav.folketrygdloven.kalkulator.modell.beregningsgrunnlag.BeregningsgrunnlagPrStatusOgAndelDto; +import no.nav.folketrygdloven.kalkulator.modell.iay.AktivitetsAvtaleDto; import no.nav.folketrygdloven.kalkulator.modell.iay.AktivitetsAvtaleDtoBuilder; import no.nav.folketrygdloven.kalkulator.modell.iay.InntektArbeidYtelseAggregatBuilder; import no.nav.folketrygdloven.kalkulator.modell.iay.InntektArbeidYtelseGrunnlagDto; @@ -42,6 +43,7 @@ import no.nav.folketrygdloven.kalkulator.modell.svp.AktivitetDto; import no.nav.folketrygdloven.kalkulator.modell.svp.PeriodeMedUtbetalingsgradDto; import no.nav.folketrygdloven.kalkulator.modell.svp.UtbetalingsgradPrAktivitetDto; +import no.nav.folketrygdloven.kalkulator.modell.typer.Aktivitetsgrad; import no.nav.folketrygdloven.kalkulator.modell.typer.Arbeidsgiver; import no.nav.folketrygdloven.kalkulator.modell.typer.Beløp; import no.nav.folketrygdloven.kalkulator.modell.typer.InternArbeidsforholdRefDto; @@ -223,6 +225,28 @@ void skal_gi_refusjon_fra_start_for_arbeid_som_har_oppgitt_feil_startdato_i_innt Assertions.assertThat(opphør.getPeriode().getFom()).isEqualTo(LocalDate.of(2020, 1, 19).plusDays(1)); } + @Test + void skal_ikke_returnere_periode_for_fravær_fra_arbeidsgiver_men_ingen_uttak() { + var stp = LocalDate.now(); + var arbeidsgiver = Arbeidsgiver.virksomhet("123456789"); + var utbetalingsperiode = Intervall.fraOgMedTilOgMed(stp.plusDays(20), stp.plusDays(25)); + var gradForTilkommetArbeid = new UtbetalingsgradPrAktivitetDto( + new AktivitetDto(arbeidsgiver, InternArbeidsforholdRefDto.nullRef(), UttakArbeidType.ORDINÆRT_ARBEID), + List.of(new PeriodeMedUtbetalingsgradDto(utbetalingsperiode, new Utbetalingsgrad(BigDecimal.ZERO), + new Aktivitetsgrad(BigDecimal.valueOf(50))))); + var ytelsespesifiktGrunnlag = new PleiepengerSyktBarnGrunnlag(List.of(gradForTilkommetArbeid)); + var inntektsmelding = lagInntektsmelding(stp, arbeidsgiver); + var ansettelsesperiode = Intervall.fraOgMedTilOgMed(stp.minusYears(10), stp.plusYears(15)); + var aktivitetsAvtaleDtoBuilder = AktivitetsAvtaleDtoBuilder.ny().medPeriode(ansettelsesperiode).medErAnsettelsesPeriode(true); + var permisjonsperiode = Intervall.fraOgMedTilOgMed(stp.minusDays(1), stp.plusDays(15)); + var relaterteYrkesaktiviteter = Set.of(lagYrkesaktivitet(arbeidsgiver, aktivitetsAvtaleDtoBuilder, permisjonsperiode)); + + var avtaler = relaterteYrkesaktiviteter.iterator().next().getAlleAnsettelsesperioder().stream().toList(); + var perioder = mapper.finnGyldigeRefusjonPerioder(stp, ytelsespesifiktGrunnlag, inntektsmelding, avtaler, relaterteYrkesaktiviteter); + + assertThat(perioder.isEmpty()).isTrue(); + } + private PleiepengerSyktBarnGrunnlag lagUtbetalingsgrunnlag(Arbeidsgiver arbeidsgiver, Intervall utbetalingsperiode) { return new PleiepengerSyktBarnGrunnlag(List.of(new UtbetalingsgradPrAktivitetDto(