From 892909f8c169c47a35b9e8d06c2a9832e0345d6a Mon Sep 17 00:00:00 2001 From: Espen Velsvik Date: Thu, 29 Aug 2024 09:54:57 +0200 Subject: [PATCH] =?UTF-8?q?TSFF-676=20St=C3=B8tter=20tilkommet=20DP=20(#53?= =?UTF-8?q?8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TilkommetInntektsforholdTjeneste.java | 501 ++++---- ...ringsbehovUtlederTilkommetInntektTest.java | 1010 +++++++++-------- 2 files changed, 791 insertions(+), 720 deletions(-) diff --git a/kalkulator/src/main/java/no/nav/folketrygdloven/kalkulator/steg/tilkommetInntekt/TilkommetInntektsforholdTjeneste.java b/kalkulator/src/main/java/no/nav/folketrygdloven/kalkulator/steg/tilkommetInntekt/TilkommetInntektsforholdTjeneste.java index 3af0dade..ed0bd15b 100644 --- a/kalkulator/src/main/java/no/nav/folketrygdloven/kalkulator/steg/tilkommetInntekt/TilkommetInntektsforholdTjeneste.java +++ b/kalkulator/src/main/java/no/nav/folketrygdloven/kalkulator/steg/tilkommetInntekt/TilkommetInntektsforholdTjeneste.java @@ -20,6 +20,7 @@ import no.nav.folketrygdloven.kalkulator.modell.iay.AktørArbeidDto; import no.nav.folketrygdloven.kalkulator.modell.iay.InntektArbeidYtelseGrunnlagDto; import no.nav.folketrygdloven.kalkulator.modell.iay.YrkesaktivitetDto; +import no.nav.folketrygdloven.kalkulator.modell.iay.YtelseAnvistDto; import no.nav.folketrygdloven.kalkulator.modell.iay.permisjon.PermisjonPerYrkesaktivitet; import no.nav.folketrygdloven.kalkulator.modell.svp.PeriodeMedUtbetalingsgradDto; import no.nav.folketrygdloven.kalkulator.modell.typer.Aktivitetsgrad; @@ -30,6 +31,7 @@ import no.nav.folketrygdloven.kalkulus.kodeverk.AktivitetStatus; import no.nav.folketrygdloven.kalkulus.kodeverk.AndelKilde; import no.nav.folketrygdloven.kalkulus.kodeverk.UttakArbeidType; +import no.nav.folketrygdloven.kalkulus.kodeverk.YtelseType; import no.nav.fpsak.tidsserie.LocalDateSegment; import no.nav.fpsak.tidsserie.LocalDateTimeline; import no.nav.fpsak.tidsserie.StandardCombinators; @@ -43,248 +45,263 @@ */ public class TilkommetInntektsforholdTjeneste { - /** - * Utleder tidslinje over tilkommet inntektsforhold - *

- * Bestemmer hvilke statuser/arbeidsgivere som skal regnes som nytt - *

- * Dersom en inntekt/aktivitet regnes som nytt skal beregningsgrunnlaget graderes mot inntekt i denne perioden. Dette betyr at inntekt i tillegg til ytelsen kan føre til nedjustering av utbetalt ytelse. - *

- * Et inntektsforhold regnes som nytt dersom: - * - Den fører til at bruker har en ekstra inntekt i tillegg til det hen ville ha hatt om hen ikke mottok ytelse - * - Inntekten ikke erstatter inntekt i et arbeidsforhold som er avsluttet - * - Det ikke er fullt fravær i arbeidsforholdet/aktiviteten (har opprettholdt noe arbeid og dermed sannsynligvis inntekt) - *

- * Vi antar bruker ville opprettholdt arbeid hos arbeidsgivere der bruker fortsatt er innregistrert i aareg, og at dette regner som en løpende aktivitet. - * Dersom antall løpende aktiviteter øker, skal saksbehandler vurdere om de tilkomne aktivitetene skal føre til reduksjon i utbetaling. - * - * @param skjæringstidspunkt Skjæringstidspunkt for beregning - * @param andelerFraStart Andeler i første periode - * @param utbetalingsgradGrunnlag Ytelsesspesifikt grunnlag - * @param iayGrunnlag Iay-grunnlag - * @return Tidslinje for tilkommet aktivitet/inntektsforhold - */ - public static LocalDateTimeline> finnTilkommetInntektsforholdTidslinje(LocalDate skjæringstidspunkt, - Collection andelerFraStart, - YtelsespesifiktGrunnlag utbetalingsgradGrunnlag, - InntektArbeidYtelseGrunnlagDto iayGrunnlag) { - return finnTilkommetInntektsforholdTidslinje(skjæringstidspunkt, andelerFraStart, utbetalingsgradGrunnlag, iayGrunnlag, false); - } - - public static LocalDateTimeline> finnTilkommetInntektsforholdTidslinje(LocalDate skjæringstidspunkt, - Collection andelerFraStart, - YtelsespesifiktGrunnlag utbetalingsgradGrunnlag, - InntektArbeidYtelseGrunnlagDto iayGrunnlag, - boolean ikkeFiltrerVedFulltFravær) { - - var yrkesaktiviteter = iayGrunnlag.getAktørArbeidFraRegister().map(AktørArbeidDto::hentAlleYrkesaktiviteter).orElse(Collections.emptyList()); - var yrkesaktivitetTidslinje = finnInntektsforholdFraYrkesaktiviteter(skjæringstidspunkt, yrkesaktiviteter); - var næringTidslinje = finnInntektsforholdForStatusFraFravær((UtbetalingsgradGrunnlag) utbetalingsgradGrunnlag, AktivitetStatus.SELVSTENDIG_NÆRINGSDRIVENDE); - var frilansTidslinje = finnInntektsforholdForStatusFraFravær((UtbetalingsgradGrunnlag) utbetalingsgradGrunnlag, AktivitetStatus.FRILANSER); - var aktivitetTidslinje = yrkesaktivitetTidslinje.union(næringTidslinje, StandardCombinators::union) - .union(frilansTidslinje, StandardCombinators::union); - - if (!ikkeFiltrerVedFulltFravær) { - var utbetalingTidslinje = finnTidslinjeMedFravær((UtbetalingsgradGrunnlag) utbetalingsgradGrunnlag); - aktivitetTidslinje = aktivitetTidslinje.intersection(utbetalingTidslinje, StandardCombinators::leftOnly); - } - return aktivitetTidslinje.compress().map(s -> mapTilkommetTidslinje(andelerFraStart, yrkesaktiviteter, utbetalingsgradGrunnlag, s, ikkeFiltrerVedFulltFravær)); - } - - private static LocalDateTimeline finnTidslinjeMedFravær(UtbetalingsgradGrunnlag utbetalingsgradGrunnlag) { - return utbetalingsgradGrunnlag.getUtbetalingsgradPrAktivitet().stream() - .flatMap(a -> a.getPeriodeMedUtbetalingsgrad().stream()) - .filter(p -> p.getAktivitetsgrad().map(v -> v.compareTo(Aktivitetsgrad.HUNDRE) < 0).orElse(false)) - .map(p -> new LocalDateSegment<>(p.getPeriode().getFomDato(), p.getPeriode().getTomDato(), Boolean.TRUE)) - .collect(Collectors.collectingAndThen(Collectors.toList(), s -> new LocalDateTimeline<>(s, StandardCombinators::alwaysTrueForMatch))); - } - - private static List>> mapTilkommetTidslinje(Collection andeler, - Collection yrkesaktiviteter, - YtelsespesifiktGrunnlag utbetalingsgradGrunnlag, - LocalDateSegment> s, - boolean ikkeFiltrerVedFulltFravær) { - var periode = Intervall.fraOgMedTilOgMed(s.getFom(), s.getTom()); - return List.of(new LocalDateSegment<>(s.getFom(), s.getTom(), - mapTilkomne(yrkesaktiviteter, andeler, utbetalingsgradGrunnlag, periode, s.getValue(), ikkeFiltrerVedFulltFravær))); - } - - private static Set mapTilkomne(Collection yrkesaktiviteter, - Collection andeler, - YtelsespesifiktGrunnlag utbetalingsgradGrunnlag, - Intervall periode, - Set inntektsforholdListe, - boolean ikkeFiltrerVedFulltFravær) { - - - var nyeInntektsforhold = inntektsforholdListe.stream() - .filter(it -> !harAndelForArbeidsgiverFraStart(it, andeler)) - .filter(it -> ikkeFiltrerVedFulltFravær || harIkkeFulltFravær(utbetalingsgradGrunnlag, periode, it)) - .collect(Collectors.toSet()); - - return nyeInntektsforhold.stream() - .sorted(sorterPåStartdato(yrkesaktiviteter)) - .map(it -> new StatusOgArbeidsgiver(it.aktivitetStatus(), it.arbeidsgiver())) - .collect(Collectors.toCollection(LinkedHashSet::new)); - - } - - private static boolean harIkkeFulltFravær(YtelsespesifiktGrunnlag utbetalingsgradGrunnlag, Intervall periode, Inntektsforhold it) { - var aktivitetsgrad = finnAktivitetsgrad(periode, utbetalingsgradGrunnlag, it); - return harIkkeFulltFravær(aktivitetsgrad); - } - - private static LocalDateTimeline> finnInntektsforholdFraYrkesaktiviteter(LocalDate skjæringstidspunkt, Collection yrkesaktiviteter) { - return yrkesaktiviteter - .stream() - .filter(ya -> !mapTilAktivitetStatus(ya).equals(AktivitetStatus.UDEFINERT)) - .flatMap(ya -> { - var ansettelsesTidslinje = finnAnsettelseTidslinje(ya); - var permisjonTidslinje = PermisjonPerYrkesaktivitet.utledPermisjonPerYrkesaktivitet(ya, Collections.emptyMap(), skjæringstidspunkt); - return ansettelsesTidslinje.disjoint(permisjonTidslinje) - .toSegments().stream() - .map(LocalDateSegment::getLocalDateInterval) - .filter(p -> p.getTomDato().isAfter(BeregningstidspunktTjeneste.finnBeregningstidspunkt(skjæringstidspunkt))) - .map(p -> new LocalDateSegment<>( - p.getFomDato(), - p.getTomDato(), - Set.of(mapTilInntektsforhold(ya)))); - } - ) - .collect(Collectors.collectingAndThen(Collectors.toList(), s -> new LocalDateTimeline<>(s, StandardCombinators::union))); - - } - - private static Inntektsforhold mapTilInntektsforhold(YrkesaktivitetDto ya) { - var aktivitetStatus = mapTilAktivitetStatus(ya); - if (aktivitetStatus.equals(AktivitetStatus.ARBEIDSTAKER)) { - return new Inntektsforhold(aktivitetStatus, ya.getArbeidsgiver(), ya.getArbeidsforholdRef()); - } else { - return new Inntektsforhold(aktivitetStatus, null, null); - } - } - - private static LocalDateTimeline> finnInntektsforholdForStatusFraFravær(UtbetalingsgradGrunnlag utbetalinger, AktivitetStatus status) { - var perioderMedStatus = finnPerioderMedStatus(utbetalinger, mapTilUttakArbeidType(status)); - return perioderMedStatus.stream() - .filter(TilkommetInntektsforholdTjeneste::harIkkeFulltFravær) - .map(p -> new LocalDateSegment<>(p.getPeriode().getFomDato(), p.getPeriode().getTomDato(), Set.of(new Inntektsforhold(status, null, null)))) - .collect(Collectors.collectingAndThen(Collectors.toList(), s -> new LocalDateTimeline<>(s, StandardCombinators::union))); - } - - private static Boolean harIkkeFulltFravær(PeriodeMedUtbetalingsgradDto p) { - return p.getAktivitetsgrad().map(v -> v.compareTo(Aktivitetsgrad.ZERO) > 0).orElse(false); - } - - private static UttakArbeidType mapTilUttakArbeidType(AktivitetStatus status) { - return switch (status) { - case SELVSTENDIG_NÆRINGSDRIVENDE -> UttakArbeidType.SELVSTENDIG_NÆRINGSDRIVENDE; - case FRILANSER -> UttakArbeidType.FRILANS; - default -> - throw new IllegalStateException("Støtter ikke tilkommet inntektsforhold fra fravær for status " + status); - }; - } - - private static List finnPerioderMedStatus(UtbetalingsgradGrunnlag utbetalinger, UttakArbeidType uttakArbeidType) { - return utbetalinger.getUtbetalingsgradPrAktivitet().stream() - .filter(a -> a.getUtbetalingsgradArbeidsforhold().getUttakArbeidType().equals(uttakArbeidType)) - .flatMap(a -> a.getPeriodeMedUtbetalingsgrad().stream()) - .toList(); - } - - private static Optional finnAktivitetsgrad(Intervall periode, - YtelsespesifiktGrunnlag utbetalingsgradGrunnlag, - Inntektsforhold inntektsforhold) { - if (inntektsforhold.aktivitetStatus().erArbeidstaker()) { - return UtbetalingsgradTjeneste.finnAktivitetsgradForArbeid( - inntektsforhold.arbeidsgiver(), - inntektsforhold.arbeidsforholdRef(), - periode, utbetalingsgradGrunnlag, true); - } else { - return UtbetalingsgradTjeneste.finnAktivitetsgradForStatus( - inntektsforhold.aktivitetStatus(), - periode, - utbetalingsgradGrunnlag); - } - } - - private static AktivitetStatus mapTilAktivitetStatus(YrkesaktivitetDto yrkesaktivitet) { - return switch (yrkesaktivitet.getArbeidType()) { - case FORENKLET_OPPGJØRSORDNING, MARITIMT_ARBEIDSFORHOLD, ORDINÆRT_ARBEIDSFORHOLD -> - AktivitetStatus.ARBEIDSTAKER; - case FRILANSER_OPPDRAGSTAKER -> AktivitetStatus.FRILANSER; - case NÆRING -> AktivitetStatus.SELVSTENDIG_NÆRINGSDRIVENDE; - default -> AktivitetStatus.UDEFINERT; - }; - } - - private static boolean harIkkeFulltFravær(Optional aktivitetsgrad) { - return aktivitetsgrad.map(it -> it.compareTo(Aktivitetsgrad.ZERO) > 0).orElse(true); - } - - private static LocalDateTimeline finnAnsettelseTidslinje(YrkesaktivitetDto it) { - return new LocalDateTimeline<>(it.getAlleAnsettelsesperioder() - .stream() - .map(p -> new LocalDateSegment<>(p.getPeriode().getFomDato(), p.getPeriode().getTomDato(), Boolean.TRUE)) - .toList(), StandardCombinators::alwaysTrueForMatch); - } - - private static Comparator sorterPåStartdato(Collection yrkesaktiviteter) { - return (i1, i2) -> { - var ansattperioder1 = finnAnsattperioder(yrkesaktiviteter, i1); - var ansattperioder2 = finnAnsattperioder(yrkesaktiviteter, i2); - if (ansattperioder1.isEmpty()) { - return ansattperioder2.isEmpty() ? 0 : 1; - } - if (ansattperioder2.isEmpty()) { - return -1; - } - var førsteAnsattdato1 = finnFørsteAnsattdato(ansattperioder1); - var førsteAnsattdato2 = finnFørsteAnsattdato(ansattperioder2); - return førsteAnsattdato1.compareTo(førsteAnsattdato2); - }; - } - - private static List finnAnsattperioder(Collection yrkesaktiviteter, Inntektsforhold a1) { - return yrkesaktiviteter.stream().filter(ya -> ya.getArbeidsgiver().equals(a1.arbeidsgiver()) && ya.getArbeidsforholdRef().gjelderFor(a1.arbeidsforholdRef())) - .flatMap(ya -> ya.getAlleAnsettelsesperioder().stream()) - .toList(); - } - - private static boolean harAndelForArbeidsgiverFraStart(Inntektsforhold inntektsforhold, Collection andeler) { - var matchendeAndeler1 = andeler.stream().filter(a -> Objects.equals(a.getArbeidsgiver().orElse(null), inntektsforhold.arbeidsgiver()) && a.getAktivitetStatus().equals(inntektsforhold.aktivitetStatus())) - .toList(); - return matchendeAndeler1.stream().map(BeregningsgrunnlagPrStatusOgAndelDto::getKilde) - .anyMatch(AndelKilde.PROSESS_START::equals); - } - - private static LocalDate finnFørsteAnsattdato(Collection ansattperioder1) { - return ansattperioder1.stream().map(AktivitetsAvtaleDto::getPeriode) - .map(Intervall::getFomDato) - .min(Comparator.naturalOrder()).orElseThrow(); - } - - record Inntektsforhold(AktivitetStatus aktivitetStatus, Arbeidsgiver arbeidsgiver, - InternArbeidsforholdRefDto arbeidsforholdRef) { - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Inntektsforhold that = (Inntektsforhold) o; - return aktivitetStatus == that.aktivitetStatus && Objects.equals(arbeidsgiver, that.arbeidsgiver) && Objects.equals(arbeidsforholdRef, that.arbeidsforholdRef); - } - - @Override - public int hashCode() { - return Objects.hash(aktivitetStatus, arbeidsgiver, arbeidsforholdRef); - } - - @Override - public InternArbeidsforholdRefDto arbeidsforholdRef() { - return arbeidsforholdRef == null ? InternArbeidsforholdRefDto.nullRef() : arbeidsforholdRef; - } - } + /** + * Utleder tidslinje over tilkommet inntektsforhold + *

+ * Bestemmer hvilke statuser/arbeidsgivere som skal regnes som nytt + *

+ * Dersom en inntekt/aktivitet regnes som nytt skal beregningsgrunnlaget graderes mot inntekt i denne perioden. Dette betyr at inntekt i tillegg til ytelsen kan føre til nedjustering av utbetalt ytelse. + *

+ * Et inntektsforhold regnes som nytt dersom: + * - Den fører til at bruker har en ekstra inntekt i tillegg til det hen ville ha hatt om hen ikke mottok ytelse + * - Inntekten ikke erstatter inntekt i et arbeidsforhold som er avsluttet + * - Det ikke er fullt fravær i arbeidsforholdet/aktiviteten (har opprettholdt noe arbeid og dermed sannsynligvis inntekt) + *

+ * Vi antar bruker ville opprettholdt arbeid hos arbeidsgivere der bruker fortsatt er innregistrert i aareg, og at dette regner som en løpende aktivitet. + * Dersom antall løpende aktiviteter øker, skal saksbehandler vurdere om de tilkomne aktivitetene skal føre til reduksjon i utbetaling. + * + * @param skjæringstidspunkt Skjæringstidspunkt for beregning + * @param andelerFraStart Andeler i første periode + * @param utbetalingsgradGrunnlag Ytelsesspesifikt grunnlag + * @param iayGrunnlag Iay-grunnlag + * @return Tidslinje for tilkommet aktivitet/inntektsforhold + */ + public static LocalDateTimeline> finnTilkommetInntektsforholdTidslinje(LocalDate skjæringstidspunkt, + Collection andelerFraStart, + YtelsespesifiktGrunnlag utbetalingsgradGrunnlag, + InntektArbeidYtelseGrunnlagDto iayGrunnlag) { + return finnTilkommetInntektsforholdTidslinje(skjæringstidspunkt, andelerFraStart, utbetalingsgradGrunnlag, iayGrunnlag, false); + } + + public static LocalDateTimeline> finnTilkommetInntektsforholdTidslinje(LocalDate skjæringstidspunkt, + Collection andelerFraStart, + YtelsespesifiktGrunnlag utbetalingsgradGrunnlag, + InntektArbeidYtelseGrunnlagDto iayGrunnlag, + boolean ikkeFiltrerVedFulltFravær) { + + var yrkesaktiviteter = iayGrunnlag.getAktørArbeidFraRegister().map(AktørArbeidDto::hentAlleYrkesaktiviteter).orElse(Collections.emptyList()); + var yrkesaktivitetTidslinje = finnInntektsforholdFraYrkesaktiviteter(skjæringstidspunkt, yrkesaktiviteter); + var næringTidslinje = finnInntektsforholdForStatusFraFravær((UtbetalingsgradGrunnlag) utbetalingsgradGrunnlag, AktivitetStatus.SELVSTENDIG_NÆRINGSDRIVENDE); + var frilansTidslinje = finnInntektsforholdForStatusFraFravær((UtbetalingsgradGrunnlag) utbetalingsgradGrunnlag, AktivitetStatus.FRILANSER); + var dagpengetidslinje = finnDagpengetidslinje(iayGrunnlag, skjæringstidspunkt); + var aktivitetTidslinje = yrkesaktivitetTidslinje.union(næringTidslinje, StandardCombinators::union) + .union(frilansTidslinje, StandardCombinators::union) + .union(dagpengetidslinje, StandardCombinators::union); + + if (!ikkeFiltrerVedFulltFravær) { + var utbetalingTidslinje = finnTidslinjeMedFravær((UtbetalingsgradGrunnlag) utbetalingsgradGrunnlag); + aktivitetTidslinje = aktivitetTidslinje.intersection(utbetalingTidslinje, StandardCombinators::leftOnly); + } + return aktivitetTidslinje.compress().map(s -> mapTilkommetTidslinje(andelerFraStart, yrkesaktiviteter, utbetalingsgradGrunnlag, s, ikkeFiltrerVedFulltFravær)); + } + + private static LocalDateTimeline> finnDagpengetidslinje(InntektArbeidYtelseGrunnlagDto iayGrunnlag, LocalDate skjæringstidspunkt) { + return iayGrunnlag.getAktørYtelseFraRegister() + .stream() + .flatMap(y -> y.getAlleYtelser().stream()) + .filter(y -> y.getYtelseType().equals(YtelseType.DAGPENGER)) + .flatMap(y -> y.getYtelseAnvist().stream()) + .filter(ya -> ya.getUtbetalingsgradProsent().isPresent() && !ya.getUtbetalingsgradProsent().get().erNullEller0()) + .map(YtelseAnvistDto::getAnvistPeriode) + .filter(p -> p.getTomDato().isAfter(BeregningstidspunktTjeneste.finnBeregningstidspunkt(skjæringstidspunkt))) + .map(p -> new LocalDateSegment<>(p.getFomDato(), p.getTomDato(), Set.of(new Inntektsforhold(AktivitetStatus.DAGPENGER, null, null)))) + .collect(Collectors.collectingAndThen(Collectors.toList(), s -> new LocalDateTimeline<>(s, StandardCombinators::union))); + } + + private static LocalDateTimeline finnTidslinjeMedFravær(UtbetalingsgradGrunnlag utbetalingsgradGrunnlag) { + return utbetalingsgradGrunnlag.getUtbetalingsgradPrAktivitet().stream() + .flatMap(a -> a.getPeriodeMedUtbetalingsgrad().stream()) + .filter(p -> p.getAktivitetsgrad().map(v -> v.compareTo(Aktivitetsgrad.HUNDRE) < 0).orElse(false)) + .map(p -> new LocalDateSegment<>(p.getPeriode().getFomDato(), p.getPeriode().getTomDato(), Boolean.TRUE)) + .collect(Collectors.collectingAndThen(Collectors.toList(), s -> new LocalDateTimeline<>(s, StandardCombinators::alwaysTrueForMatch))); + } + + private static List>> mapTilkommetTidslinje(Collection andeler, + Collection yrkesaktiviteter, + YtelsespesifiktGrunnlag utbetalingsgradGrunnlag, + LocalDateSegment> s, + boolean ikkeFiltrerVedFulltFravær) { + var periode = Intervall.fraOgMedTilOgMed(s.getFom(), s.getTom()); + return List.of(new LocalDateSegment<>(s.getFom(), s.getTom(), + mapTilkomne(yrkesaktiviteter, andeler, utbetalingsgradGrunnlag, periode, s.getValue(), ikkeFiltrerVedFulltFravær))); + } + + private static Set mapTilkomne(Collection yrkesaktiviteter, + Collection andeler, + YtelsespesifiktGrunnlag utbetalingsgradGrunnlag, + Intervall periode, + Set inntektsforholdListe, + boolean ikkeFiltrerVedFulltFravær) { + + + var nyeInntektsforhold = inntektsforholdListe.stream() + .filter(it -> !harAndelForArbeidsgiverFraStart(it, andeler)) + .filter(it -> ikkeFiltrerVedFulltFravær || harIkkeFulltFravær(utbetalingsgradGrunnlag, periode, it)) + .collect(Collectors.toSet()); + + return nyeInntektsforhold.stream() + .sorted(sorterPåStartdato(yrkesaktiviteter)) + .map(it -> new StatusOgArbeidsgiver(it.aktivitetStatus(), it.arbeidsgiver())) + .collect(Collectors.toCollection(LinkedHashSet::new)); + + } + + private static boolean harIkkeFulltFravær(YtelsespesifiktGrunnlag utbetalingsgradGrunnlag, Intervall periode, Inntektsforhold it) { + var aktivitetsgrad = finnAktivitetsgrad(periode, utbetalingsgradGrunnlag, it); + return harIkkeFulltFravær(aktivitetsgrad); + } + + private static LocalDateTimeline> finnInntektsforholdFraYrkesaktiviteter(LocalDate skjæringstidspunkt, Collection yrkesaktiviteter) { + return yrkesaktiviteter + .stream() + .filter(ya -> !mapTilAktivitetStatus(ya).equals(AktivitetStatus.UDEFINERT)) + .flatMap(ya -> { + var ansettelsesTidslinje = finnAnsettelseTidslinje(ya); + var permisjonTidslinje = PermisjonPerYrkesaktivitet.utledPermisjonPerYrkesaktivitet(ya, Collections.emptyMap(), skjæringstidspunkt); + return ansettelsesTidslinje.disjoint(permisjonTidslinje) + .toSegments().stream() + .map(LocalDateSegment::getLocalDateInterval) + .filter(p -> p.getTomDato().isAfter(BeregningstidspunktTjeneste.finnBeregningstidspunkt(skjæringstidspunkt))) + .map(p -> new LocalDateSegment<>( + p.getFomDato(), + p.getTomDato(), + Set.of(mapTilInntektsforhold(ya)))); + } + ) + .collect(Collectors.collectingAndThen(Collectors.toList(), s -> new LocalDateTimeline<>(s, StandardCombinators::union))); + + } + + private static Inntektsforhold mapTilInntektsforhold(YrkesaktivitetDto ya) { + var aktivitetStatus = mapTilAktivitetStatus(ya); + if (aktivitetStatus.equals(AktivitetStatus.ARBEIDSTAKER)) { + return new Inntektsforhold(aktivitetStatus, ya.getArbeidsgiver(), ya.getArbeidsforholdRef()); + } else { + return new Inntektsforhold(aktivitetStatus, null, null); + } + } + + private static LocalDateTimeline> finnInntektsforholdForStatusFraFravær(UtbetalingsgradGrunnlag utbetalinger, AktivitetStatus status) { + var perioderMedStatus = finnPerioderMedStatus(utbetalinger, mapTilUttakArbeidType(status)); + return perioderMedStatus.stream() + .filter(TilkommetInntektsforholdTjeneste::harIkkeFulltFravær) + .map(p -> new LocalDateSegment<>(p.getPeriode().getFomDato(), p.getPeriode().getTomDato(), Set.of(new Inntektsforhold(status, null, null)))) + .collect(Collectors.collectingAndThen(Collectors.toList(), s -> new LocalDateTimeline<>(s, StandardCombinators::union))); + } + + private static Boolean harIkkeFulltFravær(PeriodeMedUtbetalingsgradDto p) { + return p.getAktivitetsgrad().map(v -> v.compareTo(Aktivitetsgrad.ZERO) > 0).orElse(false); + } + + private static UttakArbeidType mapTilUttakArbeidType(AktivitetStatus status) { + return switch (status) { + case SELVSTENDIG_NÆRINGSDRIVENDE -> UttakArbeidType.SELVSTENDIG_NÆRINGSDRIVENDE; + case FRILANSER -> UttakArbeidType.FRILANS; + default -> + throw new IllegalStateException("Støtter ikke tilkommet inntektsforhold fra fravær for status " + status); + }; + } + + private static List finnPerioderMedStatus(UtbetalingsgradGrunnlag utbetalinger, UttakArbeidType uttakArbeidType) { + return utbetalinger.getUtbetalingsgradPrAktivitet().stream() + .filter(a -> a.getUtbetalingsgradArbeidsforhold().getUttakArbeidType().equals(uttakArbeidType)) + .flatMap(a -> a.getPeriodeMedUtbetalingsgrad().stream()) + .toList(); + } + + private static Optional finnAktivitetsgrad(Intervall periode, + YtelsespesifiktGrunnlag utbetalingsgradGrunnlag, + Inntektsforhold inntektsforhold) { + if (inntektsforhold.aktivitetStatus().erArbeidstaker()) { + return UtbetalingsgradTjeneste.finnAktivitetsgradForArbeid( + inntektsforhold.arbeidsgiver(), + inntektsforhold.arbeidsforholdRef(), + periode, utbetalingsgradGrunnlag, true); + } else { + return UtbetalingsgradTjeneste.finnAktivitetsgradForStatus( + inntektsforhold.aktivitetStatus(), + periode, + utbetalingsgradGrunnlag); + } + } + + private static AktivitetStatus mapTilAktivitetStatus(YrkesaktivitetDto yrkesaktivitet) { + return switch (yrkesaktivitet.getArbeidType()) { + case FORENKLET_OPPGJØRSORDNING, MARITIMT_ARBEIDSFORHOLD, ORDINÆRT_ARBEIDSFORHOLD -> + AktivitetStatus.ARBEIDSTAKER; + case FRILANSER_OPPDRAGSTAKER -> AktivitetStatus.FRILANSER; + case NÆRING -> AktivitetStatus.SELVSTENDIG_NÆRINGSDRIVENDE; + default -> AktivitetStatus.UDEFINERT; + }; + } + + private static boolean harIkkeFulltFravær(Optional aktivitetsgrad) { + return aktivitetsgrad.map(it -> it.compareTo(Aktivitetsgrad.ZERO) > 0).orElse(true); + } + + private static LocalDateTimeline finnAnsettelseTidslinje(YrkesaktivitetDto it) { + return new LocalDateTimeline<>(it.getAlleAnsettelsesperioder() + .stream() + .map(p -> new LocalDateSegment<>(p.getPeriode().getFomDato(), p.getPeriode().getTomDato(), Boolean.TRUE)) + .toList(), StandardCombinators::alwaysTrueForMatch); + } + + private static Comparator sorterPåStartdato(Collection yrkesaktiviteter) { + return (i1, i2) -> { + var ansattperioder1 = finnAnsattperioder(yrkesaktiviteter, i1); + var ansattperioder2 = finnAnsattperioder(yrkesaktiviteter, i2); + if (ansattperioder1.isEmpty()) { + return ansattperioder2.isEmpty() ? 0 : 1; + } + if (ansattperioder2.isEmpty()) { + return -1; + } + var førsteAnsattdato1 = finnFørsteAnsattdato(ansattperioder1); + var førsteAnsattdato2 = finnFørsteAnsattdato(ansattperioder2); + return førsteAnsattdato1.compareTo(førsteAnsattdato2); + }; + } + + private static List finnAnsattperioder(Collection yrkesaktiviteter, Inntektsforhold a1) { + return yrkesaktiviteter.stream().filter(ya -> ya.getArbeidsgiver().equals(a1.arbeidsgiver()) && ya.getArbeidsforholdRef().gjelderFor(a1.arbeidsforholdRef())) + .flatMap(ya -> ya.getAlleAnsettelsesperioder().stream()) + .toList(); + } + + private static boolean harAndelForArbeidsgiverFraStart(Inntektsforhold inntektsforhold, Collection andeler) { + var matchendeAndeler1 = andeler.stream().filter(a -> Objects.equals(a.getArbeidsgiver().orElse(null), inntektsforhold.arbeidsgiver()) && a.getAktivitetStatus().equals(inntektsforhold.aktivitetStatus())) + .toList(); + return matchendeAndeler1.stream().map(BeregningsgrunnlagPrStatusOgAndelDto::getKilde) + .anyMatch(AndelKilde.PROSESS_START::equals); + } + + private static LocalDate finnFørsteAnsattdato(Collection ansattperioder1) { + return ansattperioder1.stream().map(AktivitetsAvtaleDto::getPeriode) + .map(Intervall::getFomDato) + .min(Comparator.naturalOrder()).orElseThrow(); + } + + record Inntektsforhold(AktivitetStatus aktivitetStatus, Arbeidsgiver arbeidsgiver, + InternArbeidsforholdRefDto arbeidsforholdRef) { + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Inntektsforhold that = (Inntektsforhold) o; + return aktivitetStatus == that.aktivitetStatus && Objects.equals(arbeidsgiver, that.arbeidsgiver) && Objects.equals(arbeidsforholdRef, that.arbeidsforholdRef); + } + + @Override + public int hashCode() { + return Objects.hash(aktivitetStatus, arbeidsgiver, arbeidsforholdRef); + } + + @Override + public InternArbeidsforholdRefDto arbeidsforholdRef() { + return arbeidsforholdRef == null ? InternArbeidsforholdRefDto.nullRef() : arbeidsforholdRef; + } + } } diff --git a/kalkulator/src/test/java/no/nav/folketrygdloven/kalkulator/steg/fordeling/avklaringsbehov/AvklaringsbehovUtlederTilkommetInntektTest.java b/kalkulator/src/test/java/no/nav/folketrygdloven/kalkulator/steg/fordeling/avklaringsbehov/AvklaringsbehovUtlederTilkommetInntektTest.java index 9d9562de..ce9edf0a 100644 --- a/kalkulator/src/test/java/no/nav/folketrygdloven/kalkulator/steg/fordeling/avklaringsbehov/AvklaringsbehovUtlederTilkommetInntektTest.java +++ b/kalkulator/src/test/java/no/nav/folketrygdloven/kalkulator/steg/fordeling/avklaringsbehov/AvklaringsbehovUtlederTilkommetInntektTest.java @@ -5,6 +5,7 @@ import java.time.LocalDate; import java.util.ArrayList; import java.util.Collections; +import java.util.Comparator; import java.util.LinkedHashSet; import java.util.List; import java.util.Objects; @@ -26,6 +27,9 @@ import no.nav.folketrygdloven.kalkulator.modell.iay.VersjonTypeDto; import no.nav.folketrygdloven.kalkulator.modell.iay.YrkesaktivitetDto; import no.nav.folketrygdloven.kalkulator.modell.iay.YrkesaktivitetDtoBuilder; +import no.nav.folketrygdloven.kalkulator.modell.iay.YtelseAnvistDto; +import no.nav.folketrygdloven.kalkulator.modell.iay.YtelseAnvistDtoBuilder; +import no.nav.folketrygdloven.kalkulator.modell.iay.YtelseDtoBuilder; import no.nav.folketrygdloven.kalkulator.modell.iay.permisjon.PermisjonDtoBuilder; import no.nav.folketrygdloven.kalkulator.modell.svp.AktivitetDto; import no.nav.folketrygdloven.kalkulator.modell.svp.PeriodeMedUtbetalingsgradDto; @@ -45,649 +49,699 @@ import no.nav.folketrygdloven.kalkulus.kodeverk.InntektspostType; import no.nav.folketrygdloven.kalkulus.kodeverk.PermisjonsbeskrivelseType; import no.nav.folketrygdloven.kalkulus.kodeverk.UttakArbeidType; +import no.nav.folketrygdloven.kalkulus.kodeverk.YtelseType; import no.nav.fpsak.tidsserie.LocalDateInterval; import no.nav.fpsak.tidsserie.LocalDateSegment; class AvklaringsbehovUtlederTilkommetInntektTest { - public static final String ARBEIDSGIVER_ORGNR = "123456789"; - public static final String ARBEIDSGIVER_ORGNR2 = "123456719"; - public static final String ARBEIDSGIVER_ORGNR3 = "123423429"; + public static final String ARBEIDSGIVER_ORGNR = "123456789"; + public static final String ARBEIDSGIVER_ORGNR2 = "123456719"; + public static final String ARBEIDSGIVER_ORGNR3 = "123423429"; - public static final LocalDate STP = LocalDate.of(2022, 12, 8); + public static final LocalDate STP = LocalDate.of(2022, 12, 8); - @Test - void skal_ikke_finne_tilkommet_andel_dersom_kun_en_andel_fra_start() { + @Test + void skal_ikke_finne_tilkommet_andel_dersom_kun_en_andel_fra_start() { - var arbeidsgiver = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR); - var arbeidstakerandelFraStart = lagArbeidstakerandel(arbeidsgiver, 1L, AndelKilde.PROSESS_START, InternArbeidsforholdRefDto.nullRef()); + var arbeidsgiver = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR); + var arbeidstakerandelFraStart = lagArbeidstakerandel(arbeidsgiver, 1L, AndelKilde.PROSESS_START, InternArbeidsforholdRefDto.nullRef()); - var utbetalingsgradFraStart = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver, InternArbeidsforholdRefDto.nullRef()), - lagUtbetalingsgrader(100, STP, STP.plusDays(20))); + var utbetalingsgradFraStart = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver, InternArbeidsforholdRefDto.nullRef()), + lagUtbetalingsgrader(100, STP, STP.plusDays(20))); - var yrkesaktivitet = lagYrkesaktivitet(arbeidsgiver, STP.minusMonths(10), STP.plusMonths(10), InternArbeidsforholdRefDto.nullRef()); + var yrkesaktivitet = lagYrkesaktivitet(arbeidsgiver, STP.minusMonths(10), STP.plusMonths(10), InternArbeidsforholdRefDto.nullRef()); - var periode = Intervall.fraOgMedTilOgMed(STP.plusDays(10), STP.plusDays(15)); - var tilkomneAndeler = finnTilkomneAndeler(periode, List.of(yrkesaktivitet), List.of(arbeidstakerandelFraStart), new PleiepengerSyktBarnGrunnlag(List.of(utbetalingsgradFraStart)), STP); + var periode = Intervall.fraOgMedTilOgMed(STP.plusDays(10), STP.plusDays(15)); + var tilkomneAndeler = finnTilkomneAndeler(periode, List.of(yrkesaktivitet), List.of(arbeidstakerandelFraStart), new PleiepengerSyktBarnGrunnlag(List.of(utbetalingsgradFraStart)), STP); - assertThat(tilkomneAndeler.isEmpty()).isTrue(); + assertThat(tilkomneAndeler.isEmpty()).isTrue(); - } + } - @Test - void skal_finne_tilkommet_andel_dersom_en_andel_fra_start_og_direkte_overgang_uten_overlap_til_nytt_arbeid() { + @Test + void skal_finne_tilkommet_andel_dersom_en_andel_fra_start_og_direkte_overgang_uten_overlap_til_nytt_arbeid() { - var arbeidsgiver = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR); - var arbeidstakerandelFraStart = lagArbeidstakerandel(arbeidsgiver, 1L, AndelKilde.PROSESS_START, InternArbeidsforholdRefDto.nullRef()); - var utbetalingsgradFraStart = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver, InternArbeidsforholdRefDto.nullRef()), - lagUtbetalingsgrader(100, STP, STP.plusDays(20))); + var arbeidsgiver = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR); + var arbeidstakerandelFraStart = lagArbeidstakerandel(arbeidsgiver, 1L, AndelKilde.PROSESS_START, InternArbeidsforholdRefDto.nullRef()); + var utbetalingsgradFraStart = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver, InternArbeidsforholdRefDto.nullRef()), + lagUtbetalingsgrader(100, STP, STP.plusDays(20))); - var arbeidsgiver2 = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR2); - var nyAndel = lagArbeidstakerandel(arbeidsgiver2, 2L, AndelKilde.PROSESS_PERIODISERING, InternArbeidsforholdRefDto.nullRef()); - var utbetalingsgradNyAndel = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver2, InternArbeidsforholdRefDto.nullRef()), - lagUtbetalingsgrader(50, STP, STP.plusDays(20))); + var arbeidsgiver2 = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR2); + var nyAndel = lagArbeidstakerandel(arbeidsgiver2, 2L, AndelKilde.PROSESS_PERIODISERING, InternArbeidsforholdRefDto.nullRef()); + var utbetalingsgradNyAndel = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver2, InternArbeidsforholdRefDto.nullRef()), + lagUtbetalingsgrader(50, STP, STP.plusDays(20))); - var yrkesaktivitet = lagYrkesaktivitet(arbeidsgiver, STP.minusMonths(10), STP.plusDays(9), InternArbeidsforholdRefDto.nullRef()); - var nyYrkesaktivitet = lagYrkesaktivitet(arbeidsgiver2, STP.plusDays(10), STP.plusDays(20), InternArbeidsforholdRefDto.nullRef()); + var yrkesaktivitet = lagYrkesaktivitet(arbeidsgiver, STP.minusMonths(10), STP.plusDays(9), InternArbeidsforholdRefDto.nullRef()); + var nyYrkesaktivitet = lagYrkesaktivitet(arbeidsgiver2, STP.plusDays(10), STP.plusDays(20), InternArbeidsforholdRefDto.nullRef()); - var utbetalingsgradGrunnlag = new PleiepengerSyktBarnGrunnlag(List.of(utbetalingsgradFraStart, utbetalingsgradNyAndel)); - var periode = Intervall.fraOgMedTilOgMed(STP.plusDays(10), STP.plusDays(15)); - var tilkomneAndeler = finnTilkomneAndeler(periode, List.of(yrkesaktivitet, nyYrkesaktivitet), List.of(arbeidstakerandelFraStart, nyAndel), utbetalingsgradGrunnlag, STP); + var utbetalingsgradGrunnlag = new PleiepengerSyktBarnGrunnlag(List.of(utbetalingsgradFraStart, utbetalingsgradNyAndel)); + var periode = Intervall.fraOgMedTilOgMed(STP.plusDays(10), STP.plusDays(15)); + var tilkomneAndeler = finnTilkomneAndeler(periode, List.of(yrkesaktivitet, nyYrkesaktivitet), List.of(arbeidstakerandelFraStart, nyAndel), utbetalingsgradGrunnlag, STP); - assertThat(tilkomneAndeler.size()).isEqualTo(1); - assertThat(tilkomneAndeler.iterator().next().arbeidsgiver()).isEqualTo(arbeidsgiver2); - } + assertThat(tilkomneAndeler.size()).isEqualTo(1); + assertThat(tilkomneAndeler.iterator().next().arbeidsgiver()).isEqualTo(arbeidsgiver2); + } - @Test - void skal_ikke_finne_tilkommet_andel_dersom_det_ikke_er_søkt_utbetalign_for_noen_aktiviteter() { + @Test + void skal_ikke_finne_tilkommet_andel_dersom_det_ikke_er_søkt_utbetalign_for_noen_aktiviteter() { - var arbeidsgiver = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR); - var arbeidstakerandelFraStart = lagArbeidstakerandel(arbeidsgiver, 1L, AndelKilde.PROSESS_START, InternArbeidsforholdRefDto.nullRef()); + var arbeidsgiver = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR); + var arbeidstakerandelFraStart = lagArbeidstakerandel(arbeidsgiver, 1L, AndelKilde.PROSESS_START, InternArbeidsforholdRefDto.nullRef()); - var arbeidsgiver2 = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR2); - var nyAndel = lagArbeidstakerandel(arbeidsgiver2, 2L, AndelKilde.PROSESS_PERIODISERING, InternArbeidsforholdRefDto.nullRef()); + var arbeidsgiver2 = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR2); + var nyAndel = lagArbeidstakerandel(arbeidsgiver2, 2L, AndelKilde.PROSESS_PERIODISERING, InternArbeidsforholdRefDto.nullRef()); - var yrkesaktivitet = lagYrkesaktivitet(arbeidsgiver, STP.minusMonths(10), STP.plusDays(15), InternArbeidsforholdRefDto.nullRef()); - var nyYrkesaktivitet = lagYrkesaktivitet(arbeidsgiver2, STP.plusDays(1), STP.plusDays(20), InternArbeidsforholdRefDto.nullRef()); + var yrkesaktivitet = lagYrkesaktivitet(arbeidsgiver, STP.minusMonths(10), STP.plusDays(15), InternArbeidsforholdRefDto.nullRef()); + var nyYrkesaktivitet = lagYrkesaktivitet(arbeidsgiver2, STP.plusDays(1), STP.plusDays(20), InternArbeidsforholdRefDto.nullRef()); - var utbetalingsgradFraStart = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver, InternArbeidsforholdRefDto.nullRef()), lagUtbetalingsgrader(0, STP.plusDays(2), STP.plusDays(3))); - var utbetalingsgradNyAndel = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver2, InternArbeidsforholdRefDto.nullRef()), - List.of(lagPeriodeMedUtbetalingsgrad(50, STP.plusDays(1), STP.plusDays(1)), - lagPeriodeMedUtbetalingsgrad(50, STP.plusDays(4), STP.plusDays(20)))); + var utbetalingsgradFraStart = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver, InternArbeidsforholdRefDto.nullRef()), lagUtbetalingsgrader(0, STP.plusDays(2), STP.plusDays(3))); + var utbetalingsgradNyAndel = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver2, InternArbeidsforholdRefDto.nullRef()), + List.of(lagPeriodeMedUtbetalingsgrad(50, STP.plusDays(1), STP.plusDays(1)), + lagPeriodeMedUtbetalingsgrad(50, STP.plusDays(4), STP.plusDays(20)))); - var periode = Intervall.fraOgMedTilOgMed(STP.plusDays(2), STP.plusDays(3)); + var periode = Intervall.fraOgMedTilOgMed(STP.plusDays(2), STP.plusDays(3)); - var tilkommetAktivitet = finnTilkomneAndeler(periode, List.of(yrkesaktivitet, nyYrkesaktivitet), List.of(arbeidstakerandelFraStart, nyAndel), new PleiepengerSyktBarnGrunnlag(List.of(utbetalingsgradFraStart, utbetalingsgradNyAndel)), STP); + var tilkommetAktivitet = finnTilkomneAndeler(periode, List.of(yrkesaktivitet, nyYrkesaktivitet), List.of(arbeidstakerandelFraStart, nyAndel), new PleiepengerSyktBarnGrunnlag(List.of(utbetalingsgradFraStart, utbetalingsgradNyAndel)), STP); - assertThat(tilkommetAktivitet.size()).isEqualTo(0); - } + assertThat(tilkommetAktivitet.size()).isEqualTo(0); + } - @Test - void skal_finne_tilkommet_andel_dersom_en_andel_fra_start_med_overlapp_til_nytt_arbeid() { + @Test + void skal_finne_tilkommet_andel_dersom_en_andel_fra_start_med_overlapp_til_nytt_arbeid() { - var arbeidsgiver = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR); - var arbeidstakerandelFraStart = lagArbeidstakerandel(arbeidsgiver, 1L, AndelKilde.PROSESS_START, InternArbeidsforholdRefDto.nullRef()); + var arbeidsgiver = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR); + var arbeidstakerandelFraStart = lagArbeidstakerandel(arbeidsgiver, 1L, AndelKilde.PROSESS_START, InternArbeidsforholdRefDto.nullRef()); - var arbeidsgiver2 = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR2); - var nyAndel = lagArbeidstakerandel(arbeidsgiver2, 2L, AndelKilde.PROSESS_PERIODISERING, InternArbeidsforholdRefDto.nullRef()); + var arbeidsgiver2 = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR2); + var nyAndel = lagArbeidstakerandel(arbeidsgiver2, 2L, AndelKilde.PROSESS_PERIODISERING, InternArbeidsforholdRefDto.nullRef()); - var yrkesaktivitet = lagYrkesaktivitet(arbeidsgiver, STP.minusMonths(10), STP.plusDays(15), InternArbeidsforholdRefDto.nullRef()); - var nyYrkesaktivitet = lagYrkesaktivitet(arbeidsgiver2, STP.plusDays(10), STP.plusDays(20), InternArbeidsforholdRefDto.nullRef()); + var yrkesaktivitet = lagYrkesaktivitet(arbeidsgiver, STP.minusMonths(10), STP.plusDays(15), InternArbeidsforholdRefDto.nullRef()); + var nyYrkesaktivitet = lagYrkesaktivitet(arbeidsgiver2, STP.plusDays(10), STP.plusDays(20), InternArbeidsforholdRefDto.nullRef()); - var utbetalingsgradFraStart = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver, InternArbeidsforholdRefDto.nullRef()), lagUtbetalingsgrader(100, STP, STP.plusDays(20))); - var utbetalingsgradNyAndel = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver2, InternArbeidsforholdRefDto.nullRef()), lagUtbetalingsgrader(50, STP.plusDays(10), STP.plusDays(20))); + var utbetalingsgradFraStart = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver, InternArbeidsforholdRefDto.nullRef()), lagUtbetalingsgrader(100, STP, STP.plusDays(20))); + var utbetalingsgradNyAndel = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver2, InternArbeidsforholdRefDto.nullRef()), lagUtbetalingsgrader(50, STP.plusDays(10), STP.plusDays(20))); - var periode = Intervall.fraOgMedTilOgMed(STP.plusDays(10), STP.plusDays(15)); + var periode = Intervall.fraOgMedTilOgMed(STP.plusDays(10), STP.plusDays(15)); - var tilkommetAktivitet = finnTilkomneAndeler(periode, List.of(yrkesaktivitet, nyYrkesaktivitet), List.of(arbeidstakerandelFraStart, nyAndel), new PleiepengerSyktBarnGrunnlag(List.of(utbetalingsgradFraStart, utbetalingsgradNyAndel)), STP); + var tilkommetAktivitet = finnTilkomneAndeler(periode, List.of(yrkesaktivitet, nyYrkesaktivitet), List.of(arbeidstakerandelFraStart, nyAndel), new PleiepengerSyktBarnGrunnlag(List.of(utbetalingsgradFraStart, utbetalingsgradNyAndel)), STP); - assertThat(tilkommetAktivitet.size()).isEqualTo(1); - assertThat(tilkommetAktivitet.iterator().next().arbeidsgiver()).isEqualTo(arbeidsgiver2); - } + assertThat(tilkommetAktivitet.size()).isEqualTo(1); + assertThat(tilkommetAktivitet.iterator().next().arbeidsgiver()).isEqualTo(arbeidsgiver2); + } - @Test - void skal_ikke_finne_tilkommet_andel_dersom_en_andel_fra_start_og_med_overlapp_til_nytt_arbeid_med_permisjon() { + @Test + void skal_ikke_finne_tilkommet_andel_dersom_en_andel_fra_start_og_med_overlapp_til_nytt_arbeid_med_permisjon() { - var arbeidsgiver = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR); - var arbeidstakerandelFraStart = lagArbeidstakerandel(arbeidsgiver, 1L, AndelKilde.PROSESS_START, InternArbeidsforholdRefDto.nullRef()); + var arbeidsgiver = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR); + var arbeidstakerandelFraStart = lagArbeidstakerandel(arbeidsgiver, 1L, AndelKilde.PROSESS_START, InternArbeidsforholdRefDto.nullRef()); - var arbeidsgiver2 = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR2); - var nyAndel = lagArbeidstakerandel(arbeidsgiver2, 2L, AndelKilde.PROSESS_PERIODISERING, InternArbeidsforholdRefDto.nullRef()); + var arbeidsgiver2 = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR2); + var nyAndel = lagArbeidstakerandel(arbeidsgiver2, 2L, AndelKilde.PROSESS_PERIODISERING, InternArbeidsforholdRefDto.nullRef()); - var yrkesaktivitet = lagYrkesaktivitet(arbeidsgiver, STP.minusMonths(10), STP.plusDays(15), InternArbeidsforholdRefDto.nullRef()); - var nyYrkesaktivitet = lagYrkesaktivitet(arbeidsgiver2, STP.plusDays(10), STP.plusDays(20), InternArbeidsforholdRefDto.nullRef()); + var yrkesaktivitet = lagYrkesaktivitet(arbeidsgiver, STP.minusMonths(10), STP.plusDays(15), InternArbeidsforholdRefDto.nullRef()); + var nyYrkesaktivitet = lagYrkesaktivitet(arbeidsgiver2, STP.plusDays(10), STP.plusDays(20), InternArbeidsforholdRefDto.nullRef()); - var utbetalingsgradFraStart = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver, InternArbeidsforholdRefDto.nullRef()), lagUtbetalingsgrader(100, STP, STP.plusDays(20))); - var utbetalingsgradNyAndel = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver2, InternArbeidsforholdRefDto.nullRef()), lagUtbetalingsgrader(50, STP.plusDays(10), STP.plusDays(20))); + var utbetalingsgradFraStart = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver, InternArbeidsforholdRefDto.nullRef()), lagUtbetalingsgrader(100, STP, STP.plusDays(20))); + var utbetalingsgradNyAndel = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver2, InternArbeidsforholdRefDto.nullRef()), lagUtbetalingsgrader(50, STP.plusDays(10), STP.plusDays(20))); - var periode = Intervall.fraOgMedTilOgMed(STP.plusDays(10), STP.plusDays(15)); + var periode = Intervall.fraOgMedTilOgMed(STP.plusDays(10), STP.plusDays(15)); - YrkesaktivitetDtoBuilder.oppdatere(Optional.of(nyYrkesaktivitet)) - .leggTilPermisjon(PermisjonDtoBuilder.ny().medPeriode(periode) - .medProsentsats(Stillingsprosent.HUNDRED) - .medPermisjonsbeskrivelseType(PermisjonsbeskrivelseType.VELFERDSPERMISJON)); + YrkesaktivitetDtoBuilder.oppdatere(Optional.of(nyYrkesaktivitet)) + .leggTilPermisjon(PermisjonDtoBuilder.ny().medPeriode(periode) + .medProsentsats(Stillingsprosent.HUNDRED) + .medPermisjonsbeskrivelseType(PermisjonsbeskrivelseType.VELFERDSPERMISJON)); - var tilkommetAktivitet = finnTilkomneAndeler(periode, List.of(yrkesaktivitet, nyYrkesaktivitet), List.of(arbeidstakerandelFraStart, nyAndel), new PleiepengerSyktBarnGrunnlag(List.of(utbetalingsgradFraStart, utbetalingsgradNyAndel)), STP); + var tilkommetAktivitet = finnTilkomneAndeler(periode, List.of(yrkesaktivitet, nyYrkesaktivitet), List.of(arbeidstakerandelFraStart, nyAndel), new PleiepengerSyktBarnGrunnlag(List.of(utbetalingsgradFraStart, utbetalingsgradNyAndel)), STP); - assertThat(tilkommetAktivitet.isEmpty()).isTrue(); - } + assertThat(tilkommetAktivitet.isEmpty()).isTrue(); + } - @Test - void skal_ikke_finne_tilkommet_andel_dersom_en_andel_fra_start_med_overlapp_til_nytt_arbeid_med_fullt_fravær() { + @Test + void skal_ikke_finne_tilkommet_andel_dersom_en_andel_fra_start_med_overlapp_til_nytt_arbeid_med_fullt_fravær() { - var arbeidsgiver = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR); - var arbeidstakerandelFraStart = lagArbeidstakerandel(arbeidsgiver, 1L, AndelKilde.PROSESS_START, InternArbeidsforholdRefDto.nullRef()); + var arbeidsgiver = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR); + var arbeidstakerandelFraStart = lagArbeidstakerandel(arbeidsgiver, 1L, AndelKilde.PROSESS_START, InternArbeidsforholdRefDto.nullRef()); - var arbeidsgiver2 = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR2); - var nyAndel = lagArbeidstakerandel(arbeidsgiver2, 2L, AndelKilde.PROSESS_PERIODISERING, InternArbeidsforholdRefDto.nullRef()); + var arbeidsgiver2 = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR2); + var nyAndel = lagArbeidstakerandel(arbeidsgiver2, 2L, AndelKilde.PROSESS_PERIODISERING, InternArbeidsforholdRefDto.nullRef()); - var yrkesaktivitet = lagYrkesaktivitet(arbeidsgiver, STP.minusMonths(10), STP.plusDays(15), InternArbeidsforholdRefDto.nullRef()); - var nyYrkesaktivitet = lagYrkesaktivitet(arbeidsgiver2, STP.plusDays(10), STP.plusDays(20), InternArbeidsforholdRefDto.nullRef()); + var yrkesaktivitet = lagYrkesaktivitet(arbeidsgiver, STP.minusMonths(10), STP.plusDays(15), InternArbeidsforholdRefDto.nullRef()); + var nyYrkesaktivitet = lagYrkesaktivitet(arbeidsgiver2, STP.plusDays(10), STP.plusDays(20), InternArbeidsforholdRefDto.nullRef()); - var utbetalingsgradFraStart = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver, InternArbeidsforholdRefDto.nullRef()), lagUtbetalingsgrader(100, STP, STP.plusDays(20))); - var utbetalingsgradNyAndel = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver2, InternArbeidsforholdRefDto.nullRef()), lagUtbetalingsgrader(100, STP.plusDays(10), STP.plusDays(20))); + var utbetalingsgradFraStart = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver, InternArbeidsforholdRefDto.nullRef()), lagUtbetalingsgrader(100, STP, STP.plusDays(20))); + var utbetalingsgradNyAndel = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver2, InternArbeidsforholdRefDto.nullRef()), lagUtbetalingsgrader(100, STP.plusDays(10), STP.plusDays(20))); - var periode = Intervall.fraOgMedTilOgMed(STP.plusDays(10), STP.plusDays(15)); + var periode = Intervall.fraOgMedTilOgMed(STP.plusDays(10), STP.plusDays(15)); - var tilkommetAktivitet = finnTilkomneAndeler(periode, List.of(yrkesaktivitet, nyYrkesaktivitet), List.of(arbeidstakerandelFraStart, nyAndel), new PleiepengerSyktBarnGrunnlag(List.of(utbetalingsgradFraStart, utbetalingsgradNyAndel)), STP); + var tilkommetAktivitet = finnTilkomneAndeler(periode, List.of(yrkesaktivitet, nyYrkesaktivitet), List.of(arbeidstakerandelFraStart, nyAndel), new PleiepengerSyktBarnGrunnlag(List.of(utbetalingsgradFraStart, utbetalingsgradNyAndel)), STP); - assertThat(tilkommetAktivitet.isEmpty()).isTrue(); - } + assertThat(tilkommetAktivitet.isEmpty()).isTrue(); + } - @Test - void skal_ikke_finne_tilkommet_andel_dersom_en_andel_fra_start_med_overlapp_til_nytt_arbeid_utenfor_aktuell_periode() { + @Test + void skal_ikke_finne_tilkommet_andel_dersom_en_andel_fra_start_med_overlapp_til_nytt_arbeid_utenfor_aktuell_periode() { - var arbeidsgiver = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR); - var arbeidstakerandelFraStart = lagArbeidstakerandel(arbeidsgiver, 1L, AndelKilde.PROSESS_START, InternArbeidsforholdRefDto.nullRef()); + var arbeidsgiver = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR); + var arbeidstakerandelFraStart = lagArbeidstakerandel(arbeidsgiver, 1L, AndelKilde.PROSESS_START, InternArbeidsforholdRefDto.nullRef()); - var arbeidsgiver2 = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR2); - var nyAndel = lagArbeidstakerandel(arbeidsgiver2, 2L, AndelKilde.PROSESS_PERIODISERING, InternArbeidsforholdRefDto.nullRef()); + var arbeidsgiver2 = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR2); + var nyAndel = lagArbeidstakerandel(arbeidsgiver2, 2L, AndelKilde.PROSESS_PERIODISERING, InternArbeidsforholdRefDto.nullRef()); - var yrkesaktivitet = lagYrkesaktivitet(arbeidsgiver, STP.minusMonths(10), STP.plusDays(15), InternArbeidsforholdRefDto.nullRef()); - var nyYrkesaktivitet = lagYrkesaktivitet(arbeidsgiver2, STP.plusDays(10), STP.plusDays(20), InternArbeidsforholdRefDto.nullRef()); + var yrkesaktivitet = lagYrkesaktivitet(arbeidsgiver, STP.minusMonths(10), STP.plusDays(15), InternArbeidsforholdRefDto.nullRef()); + var nyYrkesaktivitet = lagYrkesaktivitet(arbeidsgiver2, STP.plusDays(10), STP.plusDays(20), InternArbeidsforholdRefDto.nullRef()); - var utbetalingsgradFraStart = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver, InternArbeidsforholdRefDto.nullRef()), lagUtbetalingsgrader(50, STP, STP.plusDays(20))); - var utbetalingsgradNyAndel = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver2, InternArbeidsforholdRefDto.nullRef()), lagUtbetalingsgrader(50, STP.plusDays(10), STP.plusDays(20))); + var utbetalingsgradFraStart = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver, InternArbeidsforholdRefDto.nullRef()), lagUtbetalingsgrader(50, STP, STP.plusDays(20))); + var utbetalingsgradNyAndel = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver2, InternArbeidsforholdRefDto.nullRef()), lagUtbetalingsgrader(50, STP.plusDays(10), STP.plusDays(20))); - var periode = Intervall.fraOgMedTilOgMed(STP.plusDays(5), STP.plusDays(9)); + var periode = Intervall.fraOgMedTilOgMed(STP.plusDays(5), STP.plusDays(9)); - var yrkesaktiviteter = List.of(yrkesaktivitet, nyYrkesaktivitet); - var andelerFraStart = List.of(arbeidstakerandelFraStart, nyAndel); - var utbetalingsgradGrunnlag = new PleiepengerSyktBarnGrunnlag(List.of(utbetalingsgradFraStart, utbetalingsgradNyAndel)); - var tilkomneAndeler = finnTilkomneAndeler(periode, yrkesaktiviteter, andelerFraStart, utbetalingsgradGrunnlag, STP); + var yrkesaktiviteter = List.of(yrkesaktivitet, nyYrkesaktivitet); + var andelerFraStart = List.of(arbeidstakerandelFraStart, nyAndel); + var utbetalingsgradGrunnlag = new PleiepengerSyktBarnGrunnlag(List.of(utbetalingsgradFraStart, utbetalingsgradNyAndel)); + var tilkomneAndeler = finnTilkomneAndeler(periode, yrkesaktiviteter, andelerFraStart, utbetalingsgradGrunnlag, STP); - assertThat(tilkomneAndeler.isEmpty()).isTrue(); - } + assertThat(tilkomneAndeler.isEmpty()).isTrue(); + } - @Test - void skal_finne_tilkommet_andel_dersom_en_andel_fra_start_med_overlapp_til_to_arbeidsforhold_hos_ulike_arbeidsgivere() { + @Test + void skal_finne_tilkommet_andel_dersom_en_andel_fra_start_med_overlapp_til_to_arbeidsforhold_hos_ulike_arbeidsgivere() { - var arbeidsgiver = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR); - var arbeidstakerandelFraStart = lagArbeidstakerandel(arbeidsgiver, 1L, AndelKilde.PROSESS_START, InternArbeidsforholdRefDto.nullRef()); + var arbeidsgiver = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR); + var arbeidstakerandelFraStart = lagArbeidstakerandel(arbeidsgiver, 1L, AndelKilde.PROSESS_START, InternArbeidsforholdRefDto.nullRef()); - var arbeidsgiver2 = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR2); - var nyAndel = lagArbeidstakerandel(arbeidsgiver2, 2L, AndelKilde.PROSESS_PERIODISERING, InternArbeidsforholdRefDto.nullRef()); + var arbeidsgiver2 = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR2); + var nyAndel = lagArbeidstakerandel(arbeidsgiver2, 2L, AndelKilde.PROSESS_PERIODISERING, InternArbeidsforholdRefDto.nullRef()); - var arbeidsgiver3 = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR3); - var nyAndel2 = lagArbeidstakerandel(arbeidsgiver3, 3L, AndelKilde.PROSESS_PERIODISERING, InternArbeidsforholdRefDto.nullRef()); + var arbeidsgiver3 = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR3); + var nyAndel2 = lagArbeidstakerandel(arbeidsgiver3, 3L, AndelKilde.PROSESS_PERIODISERING, InternArbeidsforholdRefDto.nullRef()); - var yrkesaktivitet = lagYrkesaktivitet(arbeidsgiver, STP.minusMonths(10), STP.plusDays(15), InternArbeidsforholdRefDto.nullRef()); - var nyYrkesaktivitet = lagYrkesaktivitet(arbeidsgiver2, STP.plusDays(10), STP.plusDays(20), InternArbeidsforholdRefDto.nullRef()); - var nyYrkesaktivitet2 = lagYrkesaktivitet(arbeidsgiver3, STP.plusDays(12), STP.plusDays(20), InternArbeidsforholdRefDto.nullRef()); + var yrkesaktivitet = lagYrkesaktivitet(arbeidsgiver, STP.minusMonths(10), STP.plusDays(15), InternArbeidsforholdRefDto.nullRef()); + var nyYrkesaktivitet = lagYrkesaktivitet(arbeidsgiver2, STP.plusDays(10), STP.plusDays(20), InternArbeidsforholdRefDto.nullRef()); + var nyYrkesaktivitet2 = lagYrkesaktivitet(arbeidsgiver3, STP.plusDays(12), STP.plusDays(20), InternArbeidsforholdRefDto.nullRef()); - var utbetalingsgradFraStart = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver, InternArbeidsforholdRefDto.nullRef()), lagUtbetalingsgrader(50, STP, STP.plusDays(15))); - var utbetalingsgradNyAndel = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver2, InternArbeidsforholdRefDto.nullRef()), lagUtbetalingsgrader(50, STP.plusDays(10), STP.plusDays(20))); - var utbetalingsgradNyAndel2 = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver3, InternArbeidsforholdRefDto.nullRef()), lagUtbetalingsgrader(50, STP.plusDays(12), STP.plusDays(20))); + var utbetalingsgradFraStart = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver, InternArbeidsforholdRefDto.nullRef()), lagUtbetalingsgrader(50, STP, STP.plusDays(15))); + var utbetalingsgradNyAndel = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver2, InternArbeidsforholdRefDto.nullRef()), lagUtbetalingsgrader(50, STP.plusDays(10), STP.plusDays(20))); + var utbetalingsgradNyAndel2 = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver3, InternArbeidsforholdRefDto.nullRef()), lagUtbetalingsgrader(50, STP.plusDays(12), STP.plusDays(20))); - var periode = Intervall.fraOgMedTilOgMed(STP.plusDays(12), STP.plusDays(15)); + var periode = Intervall.fraOgMedTilOgMed(STP.plusDays(12), STP.plusDays(15)); - var tilkommetAktivitet = finnTilkomneAndeler(periode, List.of(yrkesaktivitet, nyYrkesaktivitet, nyYrkesaktivitet2), List.of(arbeidstakerandelFraStart, nyAndel, nyAndel2), new PleiepengerSyktBarnGrunnlag(List.of(utbetalingsgradFraStart, utbetalingsgradNyAndel, utbetalingsgradNyAndel2)), STP); + var tilkommetAktivitet = finnTilkomneAndeler(periode, List.of(yrkesaktivitet, nyYrkesaktivitet, nyYrkesaktivitet2), List.of(arbeidstakerandelFraStart, nyAndel, nyAndel2), new PleiepengerSyktBarnGrunnlag(List.of(utbetalingsgradFraStart, utbetalingsgradNyAndel, utbetalingsgradNyAndel2)), STP); - assertThat(tilkommetAktivitet.size()).isEqualTo(2); - var iterator = tilkommetAktivitet.iterator(); - assertThat(iterator.next().arbeidsgiver()).isEqualTo(arbeidsgiver2); - assertThat(iterator.next().arbeidsgiver()).isEqualTo(arbeidsgiver3); - } + assertThat(tilkommetAktivitet.size()).isEqualTo(2); + var iterator = tilkommetAktivitet.iterator(); + assertThat(iterator.next().arbeidsgiver()).isEqualTo(arbeidsgiver2); + assertThat(iterator.next().arbeidsgiver()).isEqualTo(arbeidsgiver3); + } - @Test - void skal_ikke_finne_tilkommet_andel_dersom_en_andel_fra_start_med_overlapp_til_nytt_arbeidsforhold_i_hos_samme_arbeidsgiver() { + @Test + void skal_ikke_finne_tilkommet_andel_dersom_en_andel_fra_start_med_overlapp_til_nytt_arbeidsforhold_i_hos_samme_arbeidsgiver() { - var arbeidsgiver = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR); - var ref1 = InternArbeidsforholdRefDto.nyRef(); - var arbeidstakerandelFraStart = lagArbeidstakerandel(arbeidsgiver, 1L, AndelKilde.PROSESS_START, ref1); + var arbeidsgiver = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR); + var ref1 = InternArbeidsforholdRefDto.nyRef(); + var arbeidstakerandelFraStart = lagArbeidstakerandel(arbeidsgiver, 1L, AndelKilde.PROSESS_START, ref1); - var ref2 = InternArbeidsforholdRefDto.nyRef(); - var nyAndel = lagArbeidstakerandel(arbeidsgiver, 2L, AndelKilde.PROSESS_PERIODISERING, ref2); + var ref2 = InternArbeidsforholdRefDto.nyRef(); + var nyAndel = lagArbeidstakerandel(arbeidsgiver, 2L, AndelKilde.PROSESS_PERIODISERING, ref2); - var yrkesaktivitet = lagYrkesaktivitet(arbeidsgiver, STP.minusMonths(10), STP.plusDays(15), ref1); - var nyYrkesaktivitet = lagYrkesaktivitet(arbeidsgiver, STP.plusDays(10), STP.plusDays(20), ref2); + var yrkesaktivitet = lagYrkesaktivitet(arbeidsgiver, STP.minusMonths(10), STP.plusDays(15), ref1); + var nyYrkesaktivitet = lagYrkesaktivitet(arbeidsgiver, STP.plusDays(10), STP.plusDays(20), ref2); - var utbetalingsgradFraStart = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver, ref1), lagUtbetalingsgrader(50, STP, STP.plusDays(15))); - var utbetalingsgradNyAndel = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver, ref2), lagUtbetalingsgrader(50, STP.plusDays(10), STP.plusDays(20))); + var utbetalingsgradFraStart = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver, ref1), lagUtbetalingsgrader(50, STP, STP.plusDays(15))); + var utbetalingsgradNyAndel = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver, ref2), lagUtbetalingsgrader(50, STP.plusDays(10), STP.plusDays(20))); - var periode = Intervall.fraOgMedTilOgMed(STP.plusDays(12), STP.plusDays(15)); + var periode = Intervall.fraOgMedTilOgMed(STP.plusDays(12), STP.plusDays(15)); - var tilkomneAndeler = finnTilkomneAndeler(periode, List.of(yrkesaktivitet, nyYrkesaktivitet), List.of(arbeidstakerandelFraStart, nyAndel), new PleiepengerSyktBarnGrunnlag(List.of(utbetalingsgradFraStart, utbetalingsgradNyAndel)), STP); + var tilkomneAndeler = finnTilkomneAndeler(periode, List.of(yrkesaktivitet, nyYrkesaktivitet), List.of(arbeidstakerandelFraStart, nyAndel), new PleiepengerSyktBarnGrunnlag(List.of(utbetalingsgradFraStart, utbetalingsgradNyAndel)), STP); - assertThat(tilkomneAndeler.isEmpty()).isTrue(); - } + assertThat(tilkomneAndeler.isEmpty()).isTrue(); + } - @Test - void skal_finne_to_tilkommne_andeler_dersom_en_andel_fra_start_uten_overlapp_til_to_overlappende_arbeidsforhold_hos_ulike_arbeidsgivere() { + @Test + void skal_finne_to_tilkommne_andeler_dersom_en_andel_fra_start_uten_overlapp_til_to_overlappende_arbeidsforhold_hos_ulike_arbeidsgivere() { - var arbeidsgiver = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR); - var arbeidstakerandelFraStart = lagArbeidstakerandel(arbeidsgiver, 1L, AndelKilde.PROSESS_START, InternArbeidsforholdRefDto.nullRef()); + var arbeidsgiver = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR); + var arbeidstakerandelFraStart = lagArbeidstakerandel(arbeidsgiver, 1L, AndelKilde.PROSESS_START, InternArbeidsforholdRefDto.nullRef()); - var arbeidsgiver2 = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR2); - var nyAndel = lagArbeidstakerandel(arbeidsgiver2, 2L, AndelKilde.PROSESS_PERIODISERING, InternArbeidsforholdRefDto.nullRef()); + var arbeidsgiver2 = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR2); + var nyAndel = lagArbeidstakerandel(arbeidsgiver2, 2L, AndelKilde.PROSESS_PERIODISERING, InternArbeidsforholdRefDto.nullRef()); - var arbeidsgiver3 = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR3); - var nyAndel2 = lagArbeidstakerandel(arbeidsgiver3, 3L, AndelKilde.PROSESS_PERIODISERING, InternArbeidsforholdRefDto.nullRef()); + var arbeidsgiver3 = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR3); + var nyAndel2 = lagArbeidstakerandel(arbeidsgiver3, 3L, AndelKilde.PROSESS_PERIODISERING, InternArbeidsforholdRefDto.nullRef()); - var yrkesaktivitet = lagYrkesaktivitet(arbeidsgiver, STP.minusMonths(10), STP.plusDays(9), InternArbeidsforholdRefDto.nullRef()); - var nyYrkesaktivitet = lagYrkesaktivitet(arbeidsgiver2, STP.plusDays(10), STP.plusDays(20), InternArbeidsforholdRefDto.nullRef()); - var nyYrkesaktivitet2 = lagYrkesaktivitet(arbeidsgiver3, STP.plusDays(12), STP.plusDays(20), InternArbeidsforholdRefDto.nullRef()); + var yrkesaktivitet = lagYrkesaktivitet(arbeidsgiver, STP.minusMonths(10), STP.plusDays(9), InternArbeidsforholdRefDto.nullRef()); + var nyYrkesaktivitet = lagYrkesaktivitet(arbeidsgiver2, STP.plusDays(10), STP.plusDays(20), InternArbeidsforholdRefDto.nullRef()); + var nyYrkesaktivitet2 = lagYrkesaktivitet(arbeidsgiver3, STP.plusDays(12), STP.plusDays(20), InternArbeidsforholdRefDto.nullRef()); - var utbetalingsgradFraStart = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver, InternArbeidsforholdRefDto.nullRef()), lagUtbetalingsgrader(50, STP, STP.plusDays(20))); - var utbetalingsgradNyAndel = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver2, InternArbeidsforholdRefDto.nullRef()), lagUtbetalingsgrader(50, STP.plusDays(10), STP.plusDays(20))); - var utbetalingsgradNyAndel2 = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver3, InternArbeidsforholdRefDto.nullRef()), lagUtbetalingsgrader(50, STP.plusDays(12), STP.plusDays(20))); + var utbetalingsgradFraStart = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver, InternArbeidsforholdRefDto.nullRef()), lagUtbetalingsgrader(50, STP, STP.plusDays(20))); + var utbetalingsgradNyAndel = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver2, InternArbeidsforholdRefDto.nullRef()), lagUtbetalingsgrader(50, STP.plusDays(10), STP.plusDays(20))); + var utbetalingsgradNyAndel2 = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver3, InternArbeidsforholdRefDto.nullRef()), lagUtbetalingsgrader(50, STP.plusDays(12), STP.plusDays(20))); - var periode = Intervall.fraOgMedTilOgMed(STP.plusDays(12), STP.plusDays(20)); + var periode = Intervall.fraOgMedTilOgMed(STP.plusDays(12), STP.plusDays(20)); - var tilkommetAktivitet = finnTilkomneAndeler(periode, List.of(yrkesaktivitet, nyYrkesaktivitet, nyYrkesaktivitet2), List.of(arbeidstakerandelFraStart, nyAndel, nyAndel2), new PleiepengerSyktBarnGrunnlag(List.of(utbetalingsgradFraStart, utbetalingsgradNyAndel, utbetalingsgradNyAndel2)), STP); + var tilkommetAktivitet = finnTilkomneAndeler(periode, List.of(yrkesaktivitet, nyYrkesaktivitet, nyYrkesaktivitet2), List.of(arbeidstakerandelFraStart, nyAndel, nyAndel2), new PleiepengerSyktBarnGrunnlag(List.of(utbetalingsgradFraStart, utbetalingsgradNyAndel, utbetalingsgradNyAndel2)), STP); - assertThat(tilkommetAktivitet.size()).isEqualTo(2); - var iterator = tilkommetAktivitet.iterator(); - assertThat(iterator.next().arbeidsgiver()).isEqualTo(arbeidsgiver2); - assertThat(iterator.next().arbeidsgiver()).isEqualTo(arbeidsgiver3); + assertThat(tilkommetAktivitet.size()).isEqualTo(2); + var iterator = tilkommetAktivitet.iterator(); + assertThat(iterator.next().arbeidsgiver()).isEqualTo(arbeidsgiver2); + assertThat(iterator.next().arbeidsgiver()).isEqualTo(arbeidsgiver3); - } + } - @Test - void skal_ikke_finne_tilkommet_andel_dersom_kun_en_frilansandel_fra_start() { - var frilansandelFraStart = lagFrilansandel(1L, AndelKilde.PROSESS_START); - var utbetalingsgradFraStart = new UtbetalingsgradPrAktivitetDto(lagFrilansAktivitet(), lagUtbetalingsgrader(100, STP, STP.plusDays(20))); + @Test + void skal_ikke_finne_tilkommet_andel_dersom_kun_en_frilansandel_fra_start() { + var frilansandelFraStart = lagFrilansandel(1L, AndelKilde.PROSESS_START); + var utbetalingsgradFraStart = new UtbetalingsgradPrAktivitetDto(lagFrilansAktivitet(), lagUtbetalingsgrader(100, STP, STP.plusDays(20))); - var periode = Intervall.fraOgMedTilOgMed(STP.plusDays(10), STP.plusDays(15)); - var tilkomneAndeler = finnTilkomneAndeler(periode, List.of(), List.of(frilansandelFraStart), new PleiepengerSyktBarnGrunnlag(List.of(utbetalingsgradFraStart)), STP); + var periode = Intervall.fraOgMedTilOgMed(STP.plusDays(10), STP.plusDays(15)); + var tilkomneAndeler = finnTilkomneAndeler(periode, List.of(), List.of(frilansandelFraStart), new PleiepengerSyktBarnGrunnlag(List.of(utbetalingsgradFraStart)), STP); - assertThat(tilkomneAndeler.isEmpty()).isTrue(); - } + assertThat(tilkomneAndeler.isEmpty()).isTrue(); + } - @Test - void skal_finne_tilkommet_andel_dersom_en_frilansandel_og_en_arbeidstakerandel_fra_start_med_direkte_overgang_til_nytt_arbeid() { - var frilansandelFraStart = lagFrilansandel(1L, AndelKilde.PROSESS_START); - var utbetalingsgradFraStart = new UtbetalingsgradPrAktivitetDto(lagFrilansAktivitet(), lagUtbetalingsgrader(50, STP, STP.plusDays(20))); + @Test + void skal_finne_tilkommet_andel_dersom_en_frilansandel_og_en_arbeidstakerandel_fra_start_med_direkte_overgang_til_nytt_arbeid() { + var frilansandelFraStart = lagFrilansandel(1L, AndelKilde.PROSESS_START); + var utbetalingsgradFraStart = new UtbetalingsgradPrAktivitetDto(lagFrilansAktivitet(), lagUtbetalingsgrader(50, STP, STP.plusDays(20))); - var arbeidsgiver = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR); - var yrkesaktivitet = lagYrkesaktivitet(arbeidsgiver, STP.minusMonths(10), STP.plusDays(9), InternArbeidsforholdRefDto.nullRef()); + var arbeidsgiver = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR); + var yrkesaktivitet = lagYrkesaktivitet(arbeidsgiver, STP.minusMonths(10), STP.plusDays(9), InternArbeidsforholdRefDto.nullRef()); - var atFraStart = lagArbeidstakerandel(arbeidsgiver, 2L, AndelKilde.PROSESS_START, InternArbeidsforholdRefDto.nullRef()); - var utbetalingsgradATFraStart = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver, InternArbeidsforholdRefDto.nullRef()), - lagUtbetalingsgrader(50, STP, STP.plusDays(20))); + var atFraStart = lagArbeidstakerandel(arbeidsgiver, 2L, AndelKilde.PROSESS_START, InternArbeidsforholdRefDto.nullRef()); + var utbetalingsgradATFraStart = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver, InternArbeidsforholdRefDto.nullRef()), + lagUtbetalingsgrader(50, STP, STP.plusDays(20))); - var arbeidsgiver2 = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR2); - var nyAndel = lagArbeidstakerandel(arbeidsgiver2, 3L, AndelKilde.PROSESS_PERIODISERING, InternArbeidsforholdRefDto.nullRef()); - var utbetalingsgradNyAndel = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver2, InternArbeidsforholdRefDto.nullRef()), - lagUtbetalingsgrader(50, STP, STP.plusDays(20))); + var arbeidsgiver2 = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR2); + var nyAndel = lagArbeidstakerandel(arbeidsgiver2, 3L, AndelKilde.PROSESS_PERIODISERING, InternArbeidsforholdRefDto.nullRef()); + var utbetalingsgradNyAndel = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver2, InternArbeidsforholdRefDto.nullRef()), + lagUtbetalingsgrader(50, STP, STP.plusDays(20))); - var nyYrkesaktivitet = lagYrkesaktivitet(arbeidsgiver2, STP.plusDays(10), STP.plusDays(20), InternArbeidsforholdRefDto.nullRef()); + var nyYrkesaktivitet = lagYrkesaktivitet(arbeidsgiver2, STP.plusDays(10), STP.plusDays(20), InternArbeidsforholdRefDto.nullRef()); - var periode = Intervall.fraOgMedTilOgMed(STP.plusDays(10), STP.plusDays(15)); - var tilkommetAktivitet = finnTilkomneAndeler(periode, List.of(yrkesaktivitet, nyYrkesaktivitet), List.of(frilansandelFraStart, atFraStart, nyAndel), - new PleiepengerSyktBarnGrunnlag(List.of(utbetalingsgradFraStart, utbetalingsgradATFraStart, utbetalingsgradNyAndel)), STP); + var periode = Intervall.fraOgMedTilOgMed(STP.plusDays(10), STP.plusDays(15)); + var tilkommetAktivitet = finnTilkomneAndeler(periode, List.of(yrkesaktivitet, nyYrkesaktivitet), List.of(frilansandelFraStart, atFraStart, nyAndel), + new PleiepengerSyktBarnGrunnlag(List.of(utbetalingsgradFraStart, utbetalingsgradATFraStart, utbetalingsgradNyAndel)), STP); - assertThat(tilkommetAktivitet.size()).isEqualTo(1); - var iterator = tilkommetAktivitet.iterator(); - assertThat(iterator.next().arbeidsgiver()).isEqualTo(arbeidsgiver2); - } + assertThat(tilkommetAktivitet.size()).isEqualTo(1); + var iterator = tilkommetAktivitet.iterator(); + assertThat(iterator.next().arbeidsgiver()).isEqualTo(arbeidsgiver2); + } - @Test - void skal_finne_tilkommet_andel_dersom_en_frilansandel_fra_start_og_direkte_overgang_til_arbeid() { + @Test + void skal_finne_tilkommet_andel_dersom_en_frilansandel_fra_start_og_direkte_overgang_til_arbeid() { - var frilansandelFraStart = lagFrilansandel(1L, AndelKilde.PROSESS_START); - var utbetalingsgradFraStart = new UtbetalingsgradPrAktivitetDto(lagFrilansAktivitet(), lagUtbetalingsgrader(100, STP, STP.plusDays(20))); + var frilansandelFraStart = lagFrilansandel(1L, AndelKilde.PROSESS_START); + var utbetalingsgradFraStart = new UtbetalingsgradPrAktivitetDto(lagFrilansAktivitet(), lagUtbetalingsgrader(100, STP, STP.plusDays(20))); - var arbeidsgiver2 = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR2); - var nyAndel = lagArbeidstakerandel(arbeidsgiver2, 2L, AndelKilde.PROSESS_PERIODISERING, InternArbeidsforholdRefDto.nullRef()); - var utbetalingsgradNyAndel = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver2, InternArbeidsforholdRefDto.nullRef()), - lagUtbetalingsgrader(50, STP, STP.plusDays(20))); + var arbeidsgiver2 = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR2); + var nyAndel = lagArbeidstakerandel(arbeidsgiver2, 2L, AndelKilde.PROSESS_PERIODISERING, InternArbeidsforholdRefDto.nullRef()); + var utbetalingsgradNyAndel = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver2, InternArbeidsforholdRefDto.nullRef()), + lagUtbetalingsgrader(50, STP, STP.plusDays(20))); - var nyYrkesaktivitet = lagYrkesaktivitet(arbeidsgiver2, STP.plusDays(10), STP.plusDays(20), InternArbeidsforholdRefDto.nullRef()); + var nyYrkesaktivitet = lagYrkesaktivitet(arbeidsgiver2, STP.plusDays(10), STP.plusDays(20), InternArbeidsforholdRefDto.nullRef()); - var utbetalingsgradGrunnlag = new PleiepengerSyktBarnGrunnlag(List.of(utbetalingsgradFraStart, utbetalingsgradNyAndel)); - var periode = Intervall.fraOgMedTilOgMed(STP.plusDays(10), STP.plusDays(15)); - var tilkommetAktivitet = finnTilkomneAndeler(periode, List.of(nyYrkesaktivitet), List.of(frilansandelFraStart, nyAndel), utbetalingsgradGrunnlag, STP); + var utbetalingsgradGrunnlag = new PleiepengerSyktBarnGrunnlag(List.of(utbetalingsgradFraStart, utbetalingsgradNyAndel)); + var periode = Intervall.fraOgMedTilOgMed(STP.plusDays(10), STP.plusDays(15)); + var tilkommetAktivitet = finnTilkomneAndeler(periode, List.of(nyYrkesaktivitet), List.of(frilansandelFraStart, nyAndel), utbetalingsgradGrunnlag, STP); - assertThat(tilkommetAktivitet.size()).isEqualTo(1); - var iterator = tilkommetAktivitet.iterator(); - assertThat(iterator.next().arbeidsgiver()).isEqualTo(arbeidsgiver2); - } + assertThat(tilkommetAktivitet.size()).isEqualTo(1); + var iterator = tilkommetAktivitet.iterator(); + assertThat(iterator.next().arbeidsgiver()).isEqualTo(arbeidsgiver2); + } - @Test - void skal_finne_tilkommet_frilansandel_dersom_en_arbeidstakerandel_fra_start_med_overlapp_til_frilans() { + @Test + void skal_finne_tilkommet_frilansandel_dersom_en_arbeidstakerandel_fra_start_med_overlapp_til_frilans() { - var arbeidsgiver = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR); - var arbeidstakerandelFraStart = lagArbeidstakerandel(arbeidsgiver, 1L, AndelKilde.PROSESS_START, InternArbeidsforholdRefDto.nullRef()); - var yrkesaktivitet = lagYrkesaktivitet(arbeidsgiver, STP.minusMonths(10), STP.plusDays(15), InternArbeidsforholdRefDto.nullRef()); - var utbetalingsgradFraStart = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver, InternArbeidsforholdRefDto.nullRef()), lagUtbetalingsgrader(100, STP, STP.plusDays(20))); + var arbeidsgiver = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR); + var arbeidstakerandelFraStart = lagArbeidstakerandel(arbeidsgiver, 1L, AndelKilde.PROSESS_START, InternArbeidsforholdRefDto.nullRef()); + var yrkesaktivitet = lagYrkesaktivitet(arbeidsgiver, STP.minusMonths(10), STP.plusDays(15), InternArbeidsforholdRefDto.nullRef()); + var utbetalingsgradFraStart = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver, InternArbeidsforholdRefDto.nullRef()), lagUtbetalingsgrader(100, STP, STP.plusDays(20))); - var arbeidsgiver2 = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR2); - var nyAndel = lagFrilansandel(2L, AndelKilde.PROSESS_PERIODISERING); - var yrkesaktivitet2 = lagFrilansYrkesaktivitet(arbeidsgiver2, STP.plusDays(10), STP.plusDays(15), InternArbeidsforholdRefDto.nullRef()); + var arbeidsgiver2 = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR2); + var nyAndel = lagFrilansandel(2L, AndelKilde.PROSESS_PERIODISERING); + var yrkesaktivitet2 = lagFrilansYrkesaktivitet(arbeidsgiver2, STP.plusDays(10), STP.plusDays(15), InternArbeidsforholdRefDto.nullRef()); - var utbetalingsgradNyAndel = new UtbetalingsgradPrAktivitetDto(lagFrilansAktivitet(), lagUtbetalingsgrader(50, STP.plusDays(10), STP.plusDays(20))); + var utbetalingsgradNyAndel = new UtbetalingsgradPrAktivitetDto(lagFrilansAktivitet(), lagUtbetalingsgrader(50, STP.plusDays(10), STP.plusDays(20))); - var periode = Intervall.fraOgMedTilOgMed(STP.plusDays(10), STP.plusDays(15)); + var periode = Intervall.fraOgMedTilOgMed(STP.plusDays(10), STP.plusDays(15)); - var tilkommetAktivitet = finnTilkomneAndeler(periode, List.of(yrkesaktivitet, yrkesaktivitet2), List.of(arbeidstakerandelFraStart, nyAndel), new PleiepengerSyktBarnGrunnlag(List.of(utbetalingsgradFraStart, utbetalingsgradNyAndel)), STP); + var tilkommetAktivitet = finnTilkomneAndeler(periode, List.of(yrkesaktivitet, yrkesaktivitet2), List.of(arbeidstakerandelFraStart, nyAndel), new PleiepengerSyktBarnGrunnlag(List.of(utbetalingsgradFraStart, utbetalingsgradNyAndel)), STP); - assertThat(tilkommetAktivitet.size()).isEqualTo(1); - assertThat(tilkommetAktivitet.iterator().next().aktivitetStatus()).isEqualTo(AktivitetStatus.FRILANSER); - } + assertThat(tilkommetAktivitet.size()).isEqualTo(1); + assertThat(tilkommetAktivitet.iterator().next().aktivitetStatus()).isEqualTo(AktivitetStatus.FRILANSER); + } - @Test - void skal_finne_tilkommet_frilansandel_dersom_en_dagpengeandel_fra_start_med_overlapp_til_frilans() { + @Test + void skal_finne_tilkommet_dagpengeandel_dersom_en_arbeidstakerandel_fra_start_med_overlapp_til_dagpenger() { - var dagpengeandelFraStart = lagDagpengeAndel(1L, AndelKilde.PROSESS_START); - var utbetalingsgradFraStart = new UtbetalingsgradPrAktivitetDto(lagDagpengeAktivitet(), lagUtbetalingsgrader(100, STP, STP.plusDays(20))); + var arbeidsgiver = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR); + var arbeidstakerandelFraStart = lagArbeidstakerandel(arbeidsgiver, 1L, AndelKilde.PROSESS_START, InternArbeidsforholdRefDto.nullRef()); + var yrkesaktivitet = lagYrkesaktivitet(arbeidsgiver, STP.minusMonths(10), STP.plusDays(15), InternArbeidsforholdRefDto.nullRef()); + var utbetalingsgradFraStart = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver, InternArbeidsforholdRefDto.nullRef()), lagUtbetalingsgrader(100, STP, STP.plusDays(20))); - var arbeidsgiver2 = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR2); - var nyAndel = lagFrilansandel(2L, AndelKilde.PROSESS_PERIODISERING); - var yrkesaktivitet2 = lagFrilansYrkesaktivitet(arbeidsgiver2, STP.plusDays(10), STP.plusDays(15), InternArbeidsforholdRefDto.nullRef()); - var utbetalingsgradNyAndel = new UtbetalingsgradPrAktivitetDto(lagFrilansAktivitet(), lagUtbetalingsgrader(50, STP.plusDays(10), STP.plusDays(20))); + var periode = Intervall.fraOgMedTilOgMed(STP.plusDays(10), STP.plusDays(15)); - var periode = Intervall.fraOgMedTilOgMed(STP.plusDays(10), STP.plusDays(15)); + var tilkommetAktivitet = finnTilkomneAndeler(periode, List.of(yrkesaktivitet), + List.of(Intervall.fraOgMedTilOgMed(STP.plusDays(2), STP.plusDays(15))), + List.of(), + List.of(arbeidstakerandelFraStart), + new PleiepengerSyktBarnGrunnlag(List.of(utbetalingsgradFraStart)), STP); - var tilkommetAktivitet = finnTilkomneAndeler(periode, List.of(yrkesaktivitet2), List.of(dagpengeandelFraStart, nyAndel), new PleiepengerSyktBarnGrunnlag(List.of(utbetalingsgradFraStart, utbetalingsgradNyAndel)), STP); + assertThat(tilkommetAktivitet.size()).isEqualTo(1); + assertThat(tilkommetAktivitet.iterator().next().aktivitetStatus()).isEqualTo(AktivitetStatus.DAGPENGER); + } - assertThat(tilkommetAktivitet.size()).isEqualTo(1); - assertThat(tilkommetAktivitet.iterator().next().aktivitetStatus()).isEqualTo(AktivitetStatus.FRILANSER); - } + @Test + void skal_finne_tilkommet_frilansandel_dersom_en_dagpengeandel_fra_start_med_overlapp_til_frilans() { - @Test - void skal_finne_tilkommet_frilansandel_dersom_en_arbeidstakerandel_fra_start_med_overlapp_til_frilans_uten_inntekt_og_tilkommet_to_måneder_siden() { + var dagpengeandelFraStart = lagDagpengeAndel(1L, AndelKilde.PROSESS_START); + var utbetalingsgradFraStart = new UtbetalingsgradPrAktivitetDto(lagDagpengeAktivitet(), lagUtbetalingsgrader(100, STP, STP.plusDays(20))); - var stp = LocalDate.now().minusMonths(2).minusDays(10); + var arbeidsgiver2 = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR2); + var nyAndel = lagFrilansandel(2L, AndelKilde.PROSESS_PERIODISERING); + var yrkesaktivitet2 = lagFrilansYrkesaktivitet(arbeidsgiver2, STP.plusDays(10), STP.plusDays(15), InternArbeidsforholdRefDto.nullRef()); - var arbeidsgiver = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR); - var arbeidstakerandelFraStart = lagArbeidstakerandel(arbeidsgiver, 1L, AndelKilde.PROSESS_START, InternArbeidsforholdRefDto.nullRef()); - var yrkesaktivitet = lagYrkesaktivitet(arbeidsgiver, stp.minusMonths(10), stp.plusDays(15), InternArbeidsforholdRefDto.nullRef()); - var utbetalingsgradFraStart = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver, InternArbeidsforholdRefDto.nullRef()), lagUtbetalingsgrader(100, stp, stp.plusDays(20))); + var utbetalingsgradNyAndel = new UtbetalingsgradPrAktivitetDto(lagFrilansAktivitet(), lagUtbetalingsgrader(50, STP.plusDays(10), STP.plusDays(20))); - var arbeidsgiver2 = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR2); - var nyAndel = lagFrilansandel(2L, AndelKilde.PROSESS_PERIODISERING); - var yrkesaktivitet2 = lagFrilansYrkesaktivitet(arbeidsgiver2, stp.plusDays(10), stp.plusDays(15), InternArbeidsforholdRefDto.nullRef()); + var periode = Intervall.fraOgMedTilOgMed(STP.plusDays(10), STP.plusDays(15)); - var utbetalingsgradNyAndel = new UtbetalingsgradPrAktivitetDto(lagFrilansAktivitet(), lagUtbetalingsgrader(50, stp.plusDays(10), stp.plusDays(20))); + var tilkommetAktivitet = finnTilkomneAndeler(periode, List.of(yrkesaktivitet2), List.of(dagpengeandelFraStart, nyAndel), new PleiepengerSyktBarnGrunnlag(List.of(utbetalingsgradFraStart, utbetalingsgradNyAndel)), STP); - var periode = Intervall.fraOgMedTilOgMed(stp.plusDays(10), stp.plusDays(15)); + assertThat(tilkommetAktivitet.size()).isEqualTo(1); + assertThat(tilkommetAktivitet.iterator().next().aktivitetStatus()).isEqualTo(AktivitetStatus.FRILANSER); + } - var tilkommetAktivitet = finnTilkomneAndeler(periode, List.of(yrkesaktivitet, yrkesaktivitet2), List.of(), List.of(arbeidstakerandelFraStart, nyAndel), new PleiepengerSyktBarnGrunnlag(List.of(utbetalingsgradFraStart, utbetalingsgradNyAndel)), stp); + @Test + void skal_finne_tilkommet_frilansandel_dersom_en_arbeidstakerandel_fra_start_med_overlapp_til_frilans_uten_inntekt_og_tilkommet_to_måneder_siden() { - assertThat(tilkommetAktivitet.size()).isEqualTo(1); - assertThat(tilkommetAktivitet.iterator().next().aktivitetStatus()).isEqualTo(AktivitetStatus.FRILANSER); - } + var stp = LocalDate.now().minusMonths(2).minusDays(10); - @Test - void skal_finne_tilkommet_frilansandel_dersom_en_arbeidstakerandel_fra_start_med_overlapp_til_frilans_uten_inntekt_og_tilkommet_den_første_for_to_måneder_siden() { + var arbeidsgiver = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR); + var arbeidstakerandelFraStart = lagArbeidstakerandel(arbeidsgiver, 1L, AndelKilde.PROSESS_START, InternArbeidsforholdRefDto.nullRef()); + var yrkesaktivitet = lagYrkesaktivitet(arbeidsgiver, stp.minusMonths(10), stp.plusDays(15), InternArbeidsforholdRefDto.nullRef()); + var utbetalingsgradFraStart = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver, InternArbeidsforholdRefDto.nullRef()), lagUtbetalingsgrader(100, stp, stp.plusDays(20))); - var stp = LocalDate.now().minusMonths(2).withDayOfMonth(1).minusDays(10); + var arbeidsgiver2 = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR2); + var nyAndel = lagFrilansandel(2L, AndelKilde.PROSESS_PERIODISERING); + var yrkesaktivitet2 = lagFrilansYrkesaktivitet(arbeidsgiver2, stp.plusDays(10), stp.plusDays(15), InternArbeidsforholdRefDto.nullRef()); - var arbeidsgiver = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR); - var arbeidstakerandelFraStart = lagArbeidstakerandel(arbeidsgiver, 1L, AndelKilde.PROSESS_START, InternArbeidsforholdRefDto.nullRef()); - var yrkesaktivitet = lagYrkesaktivitet(arbeidsgiver, stp.minusMonths(10), stp.plusDays(15), InternArbeidsforholdRefDto.nullRef()); - var utbetalingsgradFraStart = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver, InternArbeidsforholdRefDto.nullRef()), lagUtbetalingsgrader(100, stp, stp.plusDays(20))); + var utbetalingsgradNyAndel = new UtbetalingsgradPrAktivitetDto(lagFrilansAktivitet(), lagUtbetalingsgrader(50, stp.plusDays(10), stp.plusDays(20))); - var arbeidsgiver2 = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR2); - var nyAndel = lagFrilansandel(2L, AndelKilde.PROSESS_PERIODISERING); - var yrkesaktivitet2 = lagFrilansYrkesaktivitet(arbeidsgiver2, stp.plusDays(10), stp.plusDays(15), InternArbeidsforholdRefDto.nullRef()); + var periode = Intervall.fraOgMedTilOgMed(stp.plusDays(10), stp.plusDays(15)); - var utbetalingsgradNyAndel = new UtbetalingsgradPrAktivitetDto(lagFrilansAktivitet(), lagUtbetalingsgrader(50, stp.plusDays(10), stp.plusDays(20))); + var tilkommetAktivitet = finnTilkomneAndeler(periode, List.of(yrkesaktivitet, yrkesaktivitet2), List.of(), List.of(arbeidstakerandelFraStart, nyAndel), new PleiepengerSyktBarnGrunnlag(List.of(utbetalingsgradFraStart, utbetalingsgradNyAndel)), stp); - var periode = Intervall.fraOgMedTilOgMed(stp.plusDays(10), stp.plusDays(15)); + assertThat(tilkommetAktivitet.size()).isEqualTo(1); + assertThat(tilkommetAktivitet.iterator().next().aktivitetStatus()).isEqualTo(AktivitetStatus.FRILANSER); + } - var tilkommetAktivitet = finnTilkomneAndeler(periode, List.of(yrkesaktivitet, yrkesaktivitet2), List.of(), List.of(arbeidstakerandelFraStart, nyAndel), new PleiepengerSyktBarnGrunnlag(List.of(utbetalingsgradFraStart, utbetalingsgradNyAndel)), stp); + @Test + void skal_finne_tilkommet_frilansandel_dersom_en_arbeidstakerandel_fra_start_med_overlapp_til_frilans_uten_inntekt_og_tilkommet_den_første_for_to_måneder_siden() { - assertThat(tilkommetAktivitet.size()).isEqualTo(1); - assertThat(tilkommetAktivitet.iterator().next().aktivitetStatus()).isEqualTo(AktivitetStatus.FRILANSER); - } + var stp = LocalDate.now().minusMonths(2).withDayOfMonth(1).minusDays(10); - @Test - void skal_finne_tilkommet_frilansandel_dersom_en_arbeidstakerandel_fra_start_med_overlapp_til_frilans_uten_inntekt_og_siste_dag_den_første_for_to_måneder_siden() { + var arbeidsgiver = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR); + var arbeidstakerandelFraStart = lagArbeidstakerandel(arbeidsgiver, 1L, AndelKilde.PROSESS_START, InternArbeidsforholdRefDto.nullRef()); + var yrkesaktivitet = lagYrkesaktivitet(arbeidsgiver, stp.minusMonths(10), stp.plusDays(15), InternArbeidsforholdRefDto.nullRef()); + var utbetalingsgradFraStart = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver, InternArbeidsforholdRefDto.nullRef()), lagUtbetalingsgrader(100, stp, stp.plusDays(20))); - var stp = LocalDate.now().minusMonths(2).withDayOfMonth(1).minusDays(15); + var arbeidsgiver2 = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR2); + var nyAndel = lagFrilansandel(2L, AndelKilde.PROSESS_PERIODISERING); + var yrkesaktivitet2 = lagFrilansYrkesaktivitet(arbeidsgiver2, stp.plusDays(10), stp.plusDays(15), InternArbeidsforholdRefDto.nullRef()); - var arbeidsgiver = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR); - var arbeidstakerandelFraStart = lagArbeidstakerandel(arbeidsgiver, 1L, AndelKilde.PROSESS_START, InternArbeidsforholdRefDto.nullRef()); - var yrkesaktivitet = lagYrkesaktivitet(arbeidsgiver, stp.minusMonths(10), stp.plusDays(15), InternArbeidsforholdRefDto.nullRef()); - var utbetalingsgradFraStart = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver, InternArbeidsforholdRefDto.nullRef()), lagUtbetalingsgrader(100, stp, stp.plusDays(20))); + var utbetalingsgradNyAndel = new UtbetalingsgradPrAktivitetDto(lagFrilansAktivitet(), lagUtbetalingsgrader(50, stp.plusDays(10), stp.plusDays(20))); - var arbeidsgiver2 = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR2); - var nyAndel = lagFrilansandel(2L, AndelKilde.PROSESS_PERIODISERING); - var yrkesaktivitet2 = lagFrilansYrkesaktivitet(arbeidsgiver2, stp.plusDays(10), stp.plusDays(15), InternArbeidsforholdRefDto.nullRef()); + var periode = Intervall.fraOgMedTilOgMed(stp.plusDays(10), stp.plusDays(15)); - var utbetalingsgradNyAndel = new UtbetalingsgradPrAktivitetDto(lagFrilansAktivitet(), lagUtbetalingsgrader(50, stp.plusDays(10), stp.plusDays(20))); + var tilkommetAktivitet = finnTilkomneAndeler(periode, List.of(yrkesaktivitet, yrkesaktivitet2), List.of(), List.of(arbeidstakerandelFraStart, nyAndel), new PleiepengerSyktBarnGrunnlag(List.of(utbetalingsgradFraStart, utbetalingsgradNyAndel)), stp); - var periode = Intervall.fraOgMedTilOgMed(stp.plusDays(10), stp.plusDays(15)); + assertThat(tilkommetAktivitet.size()).isEqualTo(1); + assertThat(tilkommetAktivitet.iterator().next().aktivitetStatus()).isEqualTo(AktivitetStatus.FRILANSER); + } - var tilkommetAktivitet = finnTilkomneAndeler(periode, List.of(yrkesaktivitet, yrkesaktivitet2), List.of(), List.of(arbeidstakerandelFraStart, nyAndel), new PleiepengerSyktBarnGrunnlag(List.of(utbetalingsgradFraStart, utbetalingsgradNyAndel)), stp); + @Test + void skal_finne_tilkommet_frilansandel_dersom_en_arbeidstakerandel_fra_start_med_overlapp_til_frilans_uten_inntekt_og_siste_dag_den_første_for_to_måneder_siden() { - assertThat(tilkommetAktivitet.size()).isEqualTo(1); - assertThat(tilkommetAktivitet.iterator().next().aktivitetStatus()).isEqualTo(AktivitetStatus.FRILANSER); - } + var stp = LocalDate.now().minusMonths(2).withDayOfMonth(1).minusDays(15); + var arbeidsgiver = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR); + var arbeidstakerandelFraStart = lagArbeidstakerandel(arbeidsgiver, 1L, AndelKilde.PROSESS_START, InternArbeidsforholdRefDto.nullRef()); + var yrkesaktivitet = lagYrkesaktivitet(arbeidsgiver, stp.minusMonths(10), stp.plusDays(15), InternArbeidsforholdRefDto.nullRef()); + var utbetalingsgradFraStart = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver, InternArbeidsforholdRefDto.nullRef()), lagUtbetalingsgrader(100, stp, stp.plusDays(20))); - @Test - @Disabled - void skal_ikke_finne_tilkommet_frilansandel_dersom_en_arbeidstakerandel_fra_start_med_overlapp_til_frilans_uten_inntekt_og_periode_er_passert_med_to_måneder() { + var arbeidsgiver2 = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR2); + var nyAndel = lagFrilansandel(2L, AndelKilde.PROSESS_PERIODISERING); + var yrkesaktivitet2 = lagFrilansYrkesaktivitet(arbeidsgiver2, stp.plusDays(10), stp.plusDays(15), InternArbeidsforholdRefDto.nullRef()); - var stp = LocalDate.of(2022, 8, 1); + var utbetalingsgradNyAndel = new UtbetalingsgradPrAktivitetDto(lagFrilansAktivitet(), lagUtbetalingsgrader(50, stp.plusDays(10), stp.plusDays(20))); - var arbeidsgiver = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR); - var arbeidstakerandelFraStart = lagArbeidstakerandel(arbeidsgiver, 1L, AndelKilde.PROSESS_START, InternArbeidsforholdRefDto.nullRef()); - var yrkesaktivitet = lagYrkesaktivitet(arbeidsgiver, stp.minusMonths(10), stp.plusDays(15), InternArbeidsforholdRefDto.nullRef()); - var utbetalingsgradFraStart = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver, InternArbeidsforholdRefDto.nullRef()), lagUtbetalingsgrader(100, stp, stp.plusDays(20))); + var periode = Intervall.fraOgMedTilOgMed(stp.plusDays(10), stp.plusDays(15)); - var arbeidsgiver2 = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR2); - var nyAndel = lagFrilansandel(2L, AndelKilde.PROSESS_PERIODISERING); - var yrkesaktivitet2 = lagFrilansYrkesaktivitet(arbeidsgiver2, stp.plusDays(10), stp.plusDays(15), InternArbeidsforholdRefDto.nullRef()); + var tilkommetAktivitet = finnTilkomneAndeler(periode, List.of(yrkesaktivitet, yrkesaktivitet2), List.of(), List.of(arbeidstakerandelFraStart, nyAndel), new PleiepengerSyktBarnGrunnlag(List.of(utbetalingsgradFraStart, utbetalingsgradNyAndel)), stp); - var utbetalingsgradNyAndel = new UtbetalingsgradPrAktivitetDto(lagFrilansAktivitet(), lagUtbetalingsgrader(50, stp.plusDays(10), stp.plusDays(20))); + assertThat(tilkommetAktivitet.size()).isEqualTo(1); + assertThat(tilkommetAktivitet.iterator().next().aktivitetStatus()).isEqualTo(AktivitetStatus.FRILANSER); + } - var periode = Intervall.fraOgMedTilOgMed(stp.plusDays(10), stp.plusDays(15)); - var tilkommetAktivitet = finnTilkomneAndeler(periode, List.of(yrkesaktivitet, yrkesaktivitet2), List.of(), List.of(arbeidstakerandelFraStart, nyAndel), new PleiepengerSyktBarnGrunnlag(List.of(utbetalingsgradFraStart, utbetalingsgradNyAndel)), stp); + @Test + @Disabled + void skal_ikke_finne_tilkommet_frilansandel_dersom_en_arbeidstakerandel_fra_start_med_overlapp_til_frilans_uten_inntekt_og_periode_er_passert_med_to_måneder() { - assertThat(tilkommetAktivitet.size()).isEqualTo(0); - } + var stp = LocalDate.of(2022, 8, 1); + var arbeidsgiver = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR); + var arbeidstakerandelFraStart = lagArbeidstakerandel(arbeidsgiver, 1L, AndelKilde.PROSESS_START, InternArbeidsforholdRefDto.nullRef()); + var yrkesaktivitet = lagYrkesaktivitet(arbeidsgiver, stp.minusMonths(10), stp.plusDays(15), InternArbeidsforholdRefDto.nullRef()); + var utbetalingsgradFraStart = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver, InternArbeidsforholdRefDto.nullRef()), lagUtbetalingsgrader(100, stp, stp.plusDays(20))); - @Test - void skal_finne_tilkommet_næring_dersom_en_arbeidstakerandel_fra_start_med_overlapp_til_næring() { + var arbeidsgiver2 = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR2); + var nyAndel = lagFrilansandel(2L, AndelKilde.PROSESS_PERIODISERING); + var yrkesaktivitet2 = lagFrilansYrkesaktivitet(arbeidsgiver2, stp.plusDays(10), stp.plusDays(15), InternArbeidsforholdRefDto.nullRef()); - var arbeidsgiver = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR); - var arbeidstakerandelFraStart = lagArbeidstakerandel(arbeidsgiver, 1L, AndelKilde.PROSESS_START, InternArbeidsforholdRefDto.nullRef()); - var yrkesaktivitet = lagYrkesaktivitet(arbeidsgiver, STP.minusMonths(10), STP.plusDays(15), InternArbeidsforholdRefDto.nullRef()); - var utbetalingsgradFraStart = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver, InternArbeidsforholdRefDto.nullRef()), lagUtbetalingsgrader(100, STP, STP.plusDays(20))); + var utbetalingsgradNyAndel = new UtbetalingsgradPrAktivitetDto(lagFrilansAktivitet(), lagUtbetalingsgrader(50, stp.plusDays(10), stp.plusDays(20))); - var nyAndel = lagNæringsandel(2L, AndelKilde.PROSESS_PERIODISERING); - var utbetalingsgradNyAndel = new UtbetalingsgradPrAktivitetDto(lagNæringsAktivitet(), lagUtbetalingsgrader(50, STP.plusDays(10), STP.plusDays(20))); + var periode = Intervall.fraOgMedTilOgMed(stp.plusDays(10), stp.plusDays(15)); - var periode = Intervall.fraOgMedTilOgMed(STP.plusDays(10), STP.plusDays(15)); + var tilkommetAktivitet = finnTilkomneAndeler(periode, List.of(yrkesaktivitet, yrkesaktivitet2), List.of(), List.of(arbeidstakerandelFraStart, nyAndel), new PleiepengerSyktBarnGrunnlag(List.of(utbetalingsgradFraStart, utbetalingsgradNyAndel)), stp); - var tilkommetAktivitet = finnTilkomneAndeler(periode, List.of(yrkesaktivitet), - List.of(arbeidstakerandelFraStart, nyAndel), new PleiepengerSyktBarnGrunnlag(List.of(utbetalingsgradFraStart, utbetalingsgradNyAndel)), STP); + assertThat(tilkommetAktivitet.size()).isEqualTo(0); + } - assertThat(tilkommetAktivitet.size()).isEqualTo(1); - assertThat(tilkommetAktivitet.iterator().next().aktivitetStatus()).isEqualTo(AktivitetStatus.SELVSTENDIG_NÆRINGSDRIVENDE); - } - @Test - void skal_finne_tilkommet_andel_dersom_en_dagpengeandel_fra_start_og_direkte_overgang_til_arbeid() { + @Test + void skal_finne_tilkommet_næring_dersom_en_arbeidstakerandel_fra_start_med_overlapp_til_næring() { - var frilansandelFraStart = lagDagpengeAndel(1L, AndelKilde.PROSESS_START); - var utbetalingsgradFraStart = new UtbetalingsgradPrAktivitetDto(lagDagpengeAktivitet(), lagUtbetalingsgrader(100, STP, STP.plusDays(20))); + var arbeidsgiver = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR); + var arbeidstakerandelFraStart = lagArbeidstakerandel(arbeidsgiver, 1L, AndelKilde.PROSESS_START, InternArbeidsforholdRefDto.nullRef()); + var yrkesaktivitet = lagYrkesaktivitet(arbeidsgiver, STP.minusMonths(10), STP.plusDays(15), InternArbeidsforholdRefDto.nullRef()); + var utbetalingsgradFraStart = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver, InternArbeidsforholdRefDto.nullRef()), lagUtbetalingsgrader(100, STP, STP.plusDays(20))); - var arbeidsgiver2 = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR2); - var nyAndel = lagArbeidstakerandel(arbeidsgiver2, 2L, AndelKilde.PROSESS_PERIODISERING, InternArbeidsforholdRefDto.nullRef()); - var utbetalingsgradNyAndel = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver2, InternArbeidsforholdRefDto.nullRef()), - lagUtbetalingsgrader(50, STP, STP.plusDays(20))); - - var nyYrkesaktivitet = lagYrkesaktivitet(arbeidsgiver2, STP.plusDays(10), STP.plusDays(20), InternArbeidsforholdRefDto.nullRef()); + var nyAndel = lagNæringsandel(2L, AndelKilde.PROSESS_PERIODISERING); + var utbetalingsgradNyAndel = new UtbetalingsgradPrAktivitetDto(lagNæringsAktivitet(), lagUtbetalingsgrader(50, STP.plusDays(10), STP.plusDays(20))); - var utbetalingsgradGrunnlag = new PleiepengerSyktBarnGrunnlag(List.of(utbetalingsgradFraStart, utbetalingsgradNyAndel)); - var periode = Intervall.fraOgMedTilOgMed(STP.plusDays(10), STP.plusDays(15)); - var tilkommetAktivitet = finnTilkomneAndeler(periode, List.of(nyYrkesaktivitet), - List.of(lagInntektsposterForYrkesaktivitet(nyYrkesaktivitet, utbetalingsgradNyAndel.getPeriodeMedUtbetalingsgrad())), - List.of(frilansandelFraStart, nyAndel), utbetalingsgradGrunnlag, STP); - - assertThat(tilkommetAktivitet.size()).isEqualTo(1); - var iterator = tilkommetAktivitet.iterator(); - assertThat(iterator.next().arbeidsgiver()).isEqualTo(arbeidsgiver2); - } - - private InntektDtoBuilder lagInntektsposterForYrkesaktivitet(YrkesaktivitetDto nyYrkesaktivitet, List perioderMedUtbetalingsgrad) { - var perioderMedFulltFravær = perioderMedUtbetalingsgrad.stream().filter(it -> it.getAktivitetsgrad().map(v -> v.compareTo(Aktivitetsgrad.ZERO) == 0).orElse(false)).map(PeriodeMedUtbetalingsgradDto::getPeriode).toList(); - var inntektDto = InntektDtoBuilder.oppdatere(Optional.empty()).medArbeidsgiver(nyYrkesaktivitet.getArbeidsgiver()).medInntektsKilde(InntektskildeType.INNTEKT_BEREGNING); - nyYrkesaktivitet.getAlleAnsettelsesperioder().stream() - .map(AktivitetsAvtaleDto::getPeriode) - .filter(it -> !perioderMedFulltFravær.contains(it)) - .forEach(p -> inntektDto.leggTilInntektspost(InntektspostDtoBuilder.ny().medBeløp(Beløp.fra(10_000)).medPeriode(p.getFomDato(), p.getTomDato()).medInntektspostType(InntektspostType.LØNN))); - return inntektDto; - } - - - private Set finnTilkomneAndeler(Intervall periode, - List yrkesaktiviteter, - List andelerFraStart, - PleiepengerSyktBarnGrunnlag utbetalingsgradGrunnlag, - LocalDate skjæringstidspunkt) { - return finnTilkomneAndeler(periode, yrkesaktiviteter, lagInntektForYrkesaktiviteter(yrkesaktiviteter, utbetalingsgradGrunnlag), andelerFraStart, utbetalingsgradGrunnlag, skjæringstidspunkt); - } - - private Set finnTilkomneAndeler(Intervall periode, - List yrkesaktiviteter, - List inntekter, - List andelerFraStart, - PleiepengerSyktBarnGrunnlag utbetalingsgradGrunnlag, - LocalDate skjæringstidspunkt) { - - var oppdatere = InntektArbeidYtelseAggregatBuilder.oppdatere(Optional.empty(), VersjonTypeDto.REGISTER); - var aktørArbeid = InntektArbeidYtelseAggregatBuilder.AktørArbeidBuilder.oppdatere(Optional.empty()); - yrkesaktiviteter.forEach(aktørArbeid::leggTilYrkesaktivitet); - oppdatere.leggTilAktørArbeid(aktørArbeid); - var aktørInntektBuilder = InntektArbeidYtelseAggregatBuilder.AktørInntektBuilder.oppdatere(Optional.empty()); - inntekter.forEach(aktørInntektBuilder::leggTilInntekt); - oppdatere.leggTilAktørInntekt(aktørInntektBuilder); - - var tidslinje = TilkommetInntektsforholdTjeneste.finnTilkommetInntektsforholdTidslinje(skjæringstidspunkt, - andelerFraStart, utbetalingsgradGrunnlag, InntektArbeidYtelseGrunnlagDtoBuilder.nytt().medData(oppdatere).build()); - var segmenter = tidslinje.intersection(new LocalDateInterval(periode.getFomDato(), periode.getTomDato())).compress().toSegments(); - return segmenter.isEmpty() ? new LinkedHashSet<>() : segmenter.stream().map(LocalDateSegment::getValue) - .filter(s -> !s.isEmpty()).findFirst().orElse(Set.of()); - } - - private List lagInntektForYrkesaktiviteter(List yrkesaktiviteter, PleiepengerSyktBarnGrunnlag utbetalingsgradGrunnlag) { - List inntekter = new ArrayList<>(); - yrkesaktiviteter - .forEach(ya -> { - var perioderMedUtbetalingsgrad = utbetalingsgradGrunnlag.getUtbetalingsgradPrAktivitet().stream().filter(it -> - Objects.equals(it.getUtbetalingsgradArbeidsforhold().getArbeidsgiver().orElse(null), ya.getArbeidsgiver())) - .findFirst().map(UtbetalingsgradPrAktivitetDto::getPeriodeMedUtbetalingsgrad).orElse(Collections.emptyList()); - inntekter.add(lagInntektsposterForYrkesaktivitet(ya, perioderMedUtbetalingsgrad)); - }); - return inntekter; - } - - private BeregningsgrunnlagPrStatusOgAndelDto lagArbeidstakerandel(Arbeidsgiver arbeidsgiver2, long andelsnr, AndelKilde kilde, InternArbeidsforholdRefDto arbeidsforholdRef) { - return BeregningsgrunnlagPrStatusOgAndelDto.ny() - .medAndelsnr(andelsnr) - .medBGAndelArbeidsforhold(BGAndelArbeidsforholdDto.builder().medArbeidsgiver(arbeidsgiver2).medArbeidsforholdRef(arbeidsforholdRef)) - .medKilde(kilde) - .medAktivitetStatus(AktivitetStatus.ARBEIDSTAKER) - .build(); - } - - private BeregningsgrunnlagPrStatusOgAndelDto lagFrilansandel(long andelsnr, AndelKilde kilde) { - return BeregningsgrunnlagPrStatusOgAndelDto.ny() - .medAndelsnr(andelsnr) - .medKilde(kilde) - .medAktivitetStatus(AktivitetStatus.FRILANSER) - .build(); - } - - - private BeregningsgrunnlagPrStatusOgAndelDto lagNæringsandel(long andelsnr, AndelKilde kilde) { - return BeregningsgrunnlagPrStatusOgAndelDto.ny() - .medAndelsnr(andelsnr) - .medKilde(kilde) - .medAktivitetStatus(AktivitetStatus.SELVSTENDIG_NÆRINGSDRIVENDE) - .build(); - } - - - private BeregningsgrunnlagPrStatusOgAndelDto lagDagpengeAndel(long andelsnr, AndelKilde kilde) { - return BeregningsgrunnlagPrStatusOgAndelDto.ny() - .medAndelsnr(andelsnr) - .medKilde(kilde) - .medAktivitetStatus(AktivitetStatus.DAGPENGER) - .build(); - } - - - private YrkesaktivitetDto lagYrkesaktivitet(Arbeidsgiver arbeidsgiver2, LocalDate fom, LocalDate tom, InternArbeidsforholdRefDto arbeidsforholdId) { - return YrkesaktivitetDtoBuilder.oppdatere(Optional.empty()) - .medArbeidsgiver(arbeidsgiver2) - .medArbeidsforholdId(arbeidsforholdId) - .medArbeidType(ArbeidType.ORDINÆRT_ARBEIDSFORHOLD) - .leggTilAktivitetsAvtale(AktivitetsAvtaleDtoBuilder.ny() - .medPeriode(Intervall.fraOgMedTilOgMed(fom, tom)) - .medErAnsettelsesPeriode(true)) - .build(); - } - - private YrkesaktivitetDto lagFrilansYrkesaktivitet(Arbeidsgiver arbeidsgiver2, LocalDate fom, LocalDate tom, InternArbeidsforholdRefDto arbeidsforholdId) { - return YrkesaktivitetDtoBuilder.oppdatere(Optional.empty()) - .medArbeidsgiver(arbeidsgiver2) - .medArbeidsforholdId(arbeidsforholdId) - .medArbeidType(ArbeidType.FRILANSER_OPPDRAGSTAKER) - .leggTilAktivitetsAvtale(AktivitetsAvtaleDtoBuilder.ny() - .medPeriode(Intervall.fraOgMedTilOgMed(fom, tom)) - .medErAnsettelsesPeriode(true)) - .build(); - } - - - private List lagUtbetalingsgrader(int i, LocalDate fom, LocalDate tom) { - return List.of(lagPeriodeMedUtbetalingsgrad(i, fom, tom)); - } - - private PeriodeMedUtbetalingsgradDto lagPeriodeMedUtbetalingsgrad(int i, LocalDate fom, LocalDate tom) { - return new PeriodeMedUtbetalingsgradDto(Intervall.fraOgMedTilOgMed(fom, tom), null, Aktivitetsgrad.fra(100-i)); - } - - private AktivitetDto lagAktivitet(Arbeidsgiver arbeidsgiver2, InternArbeidsforholdRefDto ref) { - return new AktivitetDto(arbeidsgiver2, ref, UttakArbeidType.ORDINÆRT_ARBEID); - } - - private AktivitetDto lagFrilansAktivitet() { - return new AktivitetDto(null, InternArbeidsforholdRefDto.nullRef(), UttakArbeidType.FRILANS); - } - - private AktivitetDto lagNæringsAktivitet() { - return new AktivitetDto(null, InternArbeidsforholdRefDto.nullRef(), UttakArbeidType.SELVSTENDIG_NÆRINGSDRIVENDE); - } - - - private AktivitetDto lagDagpengeAktivitet() { - return new AktivitetDto(null, InternArbeidsforholdRefDto.nullRef(), UttakArbeidType.DAGPENGER); - } + var periode = Intervall.fraOgMedTilOgMed(STP.plusDays(10), STP.plusDays(15)); + + var tilkommetAktivitet = finnTilkomneAndeler(periode, List.of(yrkesaktivitet), + List.of(arbeidstakerandelFraStart, nyAndel), new PleiepengerSyktBarnGrunnlag(List.of(utbetalingsgradFraStart, utbetalingsgradNyAndel)), STP); + + assertThat(tilkommetAktivitet.size()).isEqualTo(1); + assertThat(tilkommetAktivitet.iterator().next().aktivitetStatus()).isEqualTo(AktivitetStatus.SELVSTENDIG_NÆRINGSDRIVENDE); + } + + @Test + void skal_finne_tilkommet_andel_dersom_en_dagpengeandel_fra_start_og_direkte_overgang_til_arbeid() { + + var frilansandelFraStart = lagDagpengeAndel(1L, AndelKilde.PROSESS_START); + var utbetalingsgradFraStart = new UtbetalingsgradPrAktivitetDto(lagDagpengeAktivitet(), lagUtbetalingsgrader(100, STP, STP.plusDays(20))); + + var arbeidsgiver2 = Arbeidsgiver.virksomhet(ARBEIDSGIVER_ORGNR2); + var nyAndel = lagArbeidstakerandel(arbeidsgiver2, 2L, AndelKilde.PROSESS_PERIODISERING, InternArbeidsforholdRefDto.nullRef()); + var utbetalingsgradNyAndel = new UtbetalingsgradPrAktivitetDto(lagAktivitet(arbeidsgiver2, InternArbeidsforholdRefDto.nullRef()), + lagUtbetalingsgrader(50, STP, STP.plusDays(20))); + + var nyYrkesaktivitet = lagYrkesaktivitet(arbeidsgiver2, STP.plusDays(10), STP.plusDays(20), InternArbeidsforholdRefDto.nullRef()); + + var utbetalingsgradGrunnlag = new PleiepengerSyktBarnGrunnlag(List.of(utbetalingsgradFraStart, utbetalingsgradNyAndel)); + var periode = Intervall.fraOgMedTilOgMed(STP.plusDays(10), STP.plusDays(15)); + var tilkommetAktivitet = finnTilkomneAndeler(periode, List.of(nyYrkesaktivitet), + List.of(lagInntektsposterForYrkesaktivitet(nyYrkesaktivitet, utbetalingsgradNyAndel.getPeriodeMedUtbetalingsgrad())), + List.of(frilansandelFraStart, nyAndel), utbetalingsgradGrunnlag, STP); + + assertThat(tilkommetAktivitet.size()).isEqualTo(1); + var iterator = tilkommetAktivitet.iterator(); + assertThat(iterator.next().arbeidsgiver()).isEqualTo(arbeidsgiver2); + } + + private InntektDtoBuilder lagInntektsposterForYrkesaktivitet(YrkesaktivitetDto nyYrkesaktivitet, List perioderMedUtbetalingsgrad) { + var perioderMedFulltFravær = perioderMedUtbetalingsgrad.stream().filter(it -> it.getAktivitetsgrad().map(v -> v.compareTo(Aktivitetsgrad.ZERO) == 0).orElse(false)).map(PeriodeMedUtbetalingsgradDto::getPeriode).toList(); + var inntektDto = InntektDtoBuilder.oppdatere(Optional.empty()).medArbeidsgiver(nyYrkesaktivitet.getArbeidsgiver()).medInntektsKilde(InntektskildeType.INNTEKT_BEREGNING); + nyYrkesaktivitet.getAlleAnsettelsesperioder().stream() + .map(AktivitetsAvtaleDto::getPeriode) + .filter(it -> !perioderMedFulltFravær.contains(it)) + .forEach(p -> inntektDto.leggTilInntektspost(InntektspostDtoBuilder.ny().medBeløp(Beløp.fra(10_000)).medPeriode(p.getFomDato(), p.getTomDato()).medInntektspostType(InntektspostType.LØNN))); + return inntektDto; + } + + + private Set finnTilkomneAndeler(Intervall periode, + List yrkesaktiviteter, + List andelerFraStart, + PleiepengerSyktBarnGrunnlag utbetalingsgradGrunnlag, + LocalDate skjæringstidspunkt) { + return finnTilkomneAndeler(periode, yrkesaktiviteter, lagInntektForYrkesaktiviteter(yrkesaktiviteter, utbetalingsgradGrunnlag), andelerFraStart, utbetalingsgradGrunnlag, skjæringstidspunkt); + } + + private Set finnTilkomneAndeler(Intervall periode, + List yrkesaktiviteter, + List inntekter, + List andelerFraStart, + PleiepengerSyktBarnGrunnlag utbetalingsgradGrunnlag, + LocalDate skjæringstidspunkt) { + + return finnTilkomneAndeler(periode, yrkesaktiviteter, List.of(), inntekter, andelerFraStart, utbetalingsgradGrunnlag, skjæringstidspunkt); + } + + private Set finnTilkomneAndeler(Intervall periode, + List yrkesaktiviteter, + List dagpengePerioder, + List inntekter, + List andelerFraStart, + PleiepengerSyktBarnGrunnlag utbetalingsgradGrunnlag, + LocalDate skjæringstidspunkt) { + + var oppdatere = InntektArbeidYtelseAggregatBuilder.oppdatere(Optional.empty(), VersjonTypeDto.REGISTER); + var aktørArbeid = InntektArbeidYtelseAggregatBuilder.AktørArbeidBuilder.oppdatere(Optional.empty()); + yrkesaktiviteter.forEach(aktørArbeid::leggTilYrkesaktivitet); + oppdatere.leggTilAktørArbeid(aktørArbeid); + var aktørInntektBuilder = InntektArbeidYtelseAggregatBuilder.AktørInntektBuilder.oppdatere(Optional.empty()); + inntekter.forEach(aktørInntektBuilder::leggTilInntekt); + oppdatere.leggTilAktørInntekt(aktørInntektBuilder); + + if (!dagpengePerioder.isEmpty()) { + var fom = dagpengePerioder.stream().map(Intervall::getFomDato).min(Comparator.naturalOrder()).orElseThrow(); + var tom = dagpengePerioder.stream().map(Intervall::getTomDato).max(Comparator.naturalOrder()).orElseThrow(); + var aktørYtelse = InntektArbeidYtelseAggregatBuilder.AktørYtelseBuilder.oppdatere(Optional.empty()); + var ytelseDtoBuilder = YtelseDtoBuilder.ny().medYtelseType(YtelseType.DAGPENGER).medPeriode(Intervall.fraOgMedTilOgMed(fom, tom)); + dagpengePerioder.forEach(p -> + ytelseDtoBuilder.leggTilYtelseAnvist(YtelseAnvistDtoBuilder.ny().medAnvistPeriode(p) + .medBeløp(Beløp.fra(1000)) + .medDagsats(Beløp.fra(1000)) + .medUtbetalingsgradProsent(Stillingsprosent.fra(200)).build())); + aktørYtelse.leggTilYtelse( + ytelseDtoBuilder + ); + + oppdatere.leggTilAktørYtelse(aktørYtelse); + + } + var tidslinje = TilkommetInntektsforholdTjeneste.finnTilkommetInntektsforholdTidslinje(skjæringstidspunkt, + andelerFraStart, utbetalingsgradGrunnlag, InntektArbeidYtelseGrunnlagDtoBuilder.nytt().medData(oppdatere).build()); + var segmenter = tidslinje.intersection(new LocalDateInterval(periode.getFomDato(), periode.getTomDato())).compress().toSegments(); + return segmenter.isEmpty() ? new LinkedHashSet<>() : segmenter.stream().map(LocalDateSegment::getValue) + .filter(s -> !s.isEmpty()).findFirst().orElse(Set.of()); + } + + private List lagInntektForYrkesaktiviteter(List yrkesaktiviteter, PleiepengerSyktBarnGrunnlag utbetalingsgradGrunnlag) { + List inntekter = new ArrayList<>(); + yrkesaktiviteter + .forEach(ya -> { + var perioderMedUtbetalingsgrad = utbetalingsgradGrunnlag.getUtbetalingsgradPrAktivitet().stream().filter(it -> + Objects.equals(it.getUtbetalingsgradArbeidsforhold().getArbeidsgiver().orElse(null), ya.getArbeidsgiver())) + .findFirst().map(UtbetalingsgradPrAktivitetDto::getPeriodeMedUtbetalingsgrad).orElse(Collections.emptyList()); + inntekter.add(lagInntektsposterForYrkesaktivitet(ya, perioderMedUtbetalingsgrad)); + }); + return inntekter; + } + + private BeregningsgrunnlagPrStatusOgAndelDto lagArbeidstakerandel(Arbeidsgiver arbeidsgiver2, long andelsnr, AndelKilde kilde, InternArbeidsforholdRefDto arbeidsforholdRef) { + return BeregningsgrunnlagPrStatusOgAndelDto.ny() + .medAndelsnr(andelsnr) + .medBGAndelArbeidsforhold(BGAndelArbeidsforholdDto.builder().medArbeidsgiver(arbeidsgiver2).medArbeidsforholdRef(arbeidsforholdRef)) + .medKilde(kilde) + .medAktivitetStatus(AktivitetStatus.ARBEIDSTAKER) + .build(); + } + + private BeregningsgrunnlagPrStatusOgAndelDto lagFrilansandel(long andelsnr, AndelKilde kilde) { + return BeregningsgrunnlagPrStatusOgAndelDto.ny() + .medAndelsnr(andelsnr) + .medKilde(kilde) + .medAktivitetStatus(AktivitetStatus.FRILANSER) + .build(); + } + + + private BeregningsgrunnlagPrStatusOgAndelDto lagNæringsandel(long andelsnr, AndelKilde kilde) { + return BeregningsgrunnlagPrStatusOgAndelDto.ny() + .medAndelsnr(andelsnr) + .medKilde(kilde) + .medAktivitetStatus(AktivitetStatus.SELVSTENDIG_NÆRINGSDRIVENDE) + .build(); + } + + + private BeregningsgrunnlagPrStatusOgAndelDto lagDagpengeAndel(long andelsnr, AndelKilde kilde) { + return BeregningsgrunnlagPrStatusOgAndelDto.ny() + .medAndelsnr(andelsnr) + .medKilde(kilde) + .medAktivitetStatus(AktivitetStatus.DAGPENGER) + .build(); + } + + + private YrkesaktivitetDto lagYrkesaktivitet(Arbeidsgiver arbeidsgiver2, LocalDate fom, LocalDate tom, InternArbeidsforholdRefDto arbeidsforholdId) { + return YrkesaktivitetDtoBuilder.oppdatere(Optional.empty()) + .medArbeidsgiver(arbeidsgiver2) + .medArbeidsforholdId(arbeidsforholdId) + .medArbeidType(ArbeidType.ORDINÆRT_ARBEIDSFORHOLD) + .leggTilAktivitetsAvtale(AktivitetsAvtaleDtoBuilder.ny() + .medPeriode(Intervall.fraOgMedTilOgMed(fom, tom)) + .medErAnsettelsesPeriode(true)) + .build(); + } + + private YrkesaktivitetDto lagFrilansYrkesaktivitet(Arbeidsgiver arbeidsgiver2, LocalDate fom, LocalDate tom, InternArbeidsforholdRefDto arbeidsforholdId) { + return YrkesaktivitetDtoBuilder.oppdatere(Optional.empty()) + .medArbeidsgiver(arbeidsgiver2) + .medArbeidsforholdId(arbeidsforholdId) + .medArbeidType(ArbeidType.FRILANSER_OPPDRAGSTAKER) + .leggTilAktivitetsAvtale(AktivitetsAvtaleDtoBuilder.ny() + .medPeriode(Intervall.fraOgMedTilOgMed(fom, tom)) + .medErAnsettelsesPeriode(true)) + .build(); + } + + + private List lagUtbetalingsgrader(int i, LocalDate fom, LocalDate tom) { + return List.of(lagPeriodeMedUtbetalingsgrad(i, fom, tom)); + } + + private PeriodeMedUtbetalingsgradDto lagPeriodeMedUtbetalingsgrad(int i, LocalDate fom, LocalDate tom) { + return new PeriodeMedUtbetalingsgradDto(Intervall.fraOgMedTilOgMed(fom, tom), null, Aktivitetsgrad.fra(100 - i)); + } + + private AktivitetDto lagAktivitet(Arbeidsgiver arbeidsgiver2, InternArbeidsforholdRefDto ref) { + return new AktivitetDto(arbeidsgiver2, ref, UttakArbeidType.ORDINÆRT_ARBEID); + } + + private AktivitetDto lagFrilansAktivitet() { + return new AktivitetDto(null, InternArbeidsforholdRefDto.nullRef(), UttakArbeidType.FRILANS); + } + + private AktivitetDto lagNæringsAktivitet() { + return new AktivitetDto(null, InternArbeidsforholdRefDto.nullRef(), UttakArbeidType.SELVSTENDIG_NÆRINGSDRIVENDE); + } + + + private AktivitetDto lagDagpengeAktivitet() { + return new AktivitetDto(null, InternArbeidsforholdRefDto.nullRef(), UttakArbeidType.DAGPENGER); + } }