diff --git a/src/main/java/no/nav/folketrygdloven/beregningsgrunnlag/fordel/OmfordelFraBrukersAndel.java b/src/main/java/no/nav/folketrygdloven/beregningsgrunnlag/fordel/OmfordelFraBrukersAndel.java deleted file mode 100644 index fb905203..00000000 --- a/src/main/java/no/nav/folketrygdloven/beregningsgrunnlag/fordel/OmfordelFraBrukersAndel.java +++ /dev/null @@ -1,95 +0,0 @@ -package no.nav.folketrygdloven.beregningsgrunnlag.fordel; - -import java.math.BigDecimal; -import java.util.Comparator; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import no.nav.folketrygdloven.beregningsgrunnlag.fordel.modell.FordelAndelModell; -import no.nav.folketrygdloven.beregningsgrunnlag.fordel.modell.FordelModell; -import no.nav.folketrygdloven.beregningsgrunnlag.fordel.modell.FordelPeriodeModell; -import no.nav.folketrygdloven.beregningsgrunnlag.regelmodell.AktivitetStatus; -import no.nav.fpsak.nare.evaluation.Evaluation; -import no.nav.fpsak.nare.specification.LeafSpecification; - -/** - * Omfordeler fra en generell brukers andel til en aktivitet/andel som er det er søkt for. - *

- * En brukers andel blir brukt i situasjoner der bruker er midlertidig inaktiv eller kommer direkte fra ytelse uten arbeidsforhold. - *

- * Dersom det søkes utbetaling for andre aktiviteter i løpet av ytelseperioden skal beregningsgrunnlag omfordeles til disse. - *

- * Omfordeling gjøres slik at hele grunnlaget fra brukers andel settes på andelen med lavest avkortingprioritet (den som avkortes sist). - */ -class OmfordelFraBrukersAndel extends LeafSpecification { - - public static final String ID = "OMFORDEL_FRA_BA"; - public static final String BESKRIVELSE = "Flytt beregningsgrunnlag fra brukers andel til aktivitetstatus med høyere prioritet"; - private static final Comparator AVKORTING_COMPARATOR = Comparator.comparingInt(a -> a.getAktivitetStatus().getAvkortingPrioritet()); - - OmfordelFraBrukersAndel() { - super(ID, BESKRIVELSE); - } - - @Override - public Evaluation evaluate(FordelModell modell) { - Map resultater = new HashMap<>(); - var brukersAndel = modell.getInput().getAlleAndelerForStatus(AktivitetStatus.BA); - var statusSomAvkortesSistUtenArbeid = finnStatusÅFlytteTil(modell.getInput()); - resultater.put("aktivitetstatusSomFlyttesTilFraInaktiv", statusSomAvkortesSistUtenArbeid.getAktivitetStatus()); - flyttTil(brukersAndel, statusSomAvkortesSistUtenArbeid, modell.getInput()); - settBrukersAndelTil0(brukersAndel); - return beregnet(resultater); - } - - private void settBrukersAndelTil0(List brukersAndel) { - brukersAndel.forEach(ba -> FordelAndelModell.oppdater(ba) - .medFordeltPrÅr(BigDecimal.ZERO) - .build()); - } - - private void flyttTil(List brukersAndel, FordelAndelModell flytteTilAndel, FordelPeriodeModell periodeModell) { - // Siden vi er her vet vi at det finnes minst ett element i lista, flytter bg herfra til flytteTilAndel - var førsteBrukersAndel = brukersAndel.get(0); - FordelAndelModell.oppdater(flytteTilAndel) - .medInntektskategori(førsteBrukersAndel.getInntektskategori()) - .medFordeltPrÅr(flytteTilAndel.getBruttoPrÅr().orElse(BigDecimal.ZERO).add(førsteBrukersAndel.getBruttoPrÅr().orElse(BigDecimal.ZERO))) - .build(); - if (brukersAndel.size() > 1) { - fordelRestenTilNyeAndeler(brukersAndel, flytteTilAndel, periodeModell); - } - } - - private void fordelRestenTilNyeAndeler(List brukersAndel, - FordelAndelModell eksisterendeAndel, - FordelPeriodeModell periodeModell) { - var restenAvLista = brukersAndel.subList(1, brukersAndel.size()); - for (FordelAndelModell andel : restenAvLista) { - var nyAndel = opprettNyAndelBasertPå(eksisterendeAndel); - FordelAndelModell.oppdater(nyAndel) - .medInntektskategori(andel.getInntektskategori()) - .medFordeltPrÅr(andel.getBruttoPrÅr().orElse(BigDecimal.ZERO)) - .build(); - periodeModell.leggTilAndel(nyAndel); - } - } - - private FordelAndelModell finnStatusÅFlytteTil(FordelPeriodeModell beregningsgrunnlagPeriode) { - return beregningsgrunnlagPeriode.getBeregningsgrunnlagPrStatusSomSkalBrukes() - .stream() - .filter(a -> !AktivitetStatus.AT.equals(a.getAktivitetStatus())) - .min(AVKORTING_COMPARATOR) - .orElseThrow(() -> new IllegalStateException("Forventet å ha en aktivitet å flytte til som ikke er arbeid")); - } - - private FordelAndelModell opprettNyAndelBasertPå(FordelAndelModell basertPå) { - return FordelAndelModell.builder() - .medArbeidsforhold(basertPå.getArbeidsforhold().orElse(null)) - .medAktivitetStatus(basertPå.getAktivitetStatus()) - .erNytt(true) - .build(); - } - - -} diff --git a/src/main/java/no/nav/folketrygdloven/beregningsgrunnlag/fordel/RegelFordelBeregningsgrunnlag.java b/src/main/java/no/nav/folketrygdloven/beregningsgrunnlag/fordel/RegelFordelBeregningsgrunnlag.java index 74f88f0b..333438b4 100644 --- a/src/main/java/no/nav/folketrygdloven/beregningsgrunnlag/fordel/RegelFordelBeregningsgrunnlag.java +++ b/src/main/java/no/nav/folketrygdloven/beregningsgrunnlag/fordel/RegelFordelBeregningsgrunnlag.java @@ -16,7 +16,7 @@ public class RegelFordelBeregningsgrunnlag implements EksportRegel { - public static final String ID = "FP_BR 22.3"; + public static final String ID = "FP_BR 22.3"; private FordelModell modell; public RegelFordelBeregningsgrunnlag() { @@ -58,31 +58,26 @@ private void validerAtBruttoErUendret(FordelModell modell) { .orElse(BigDecimal.ZERO); if (bruttoInn.compareTo(bruttoUt) != 0) { throw new IllegalStateException("Missmatch mellom fordelt beløp før og etter andelsmessig fordeling." + - " Inn i regel var brutto " + bruttoInn + ". Ut av regel var brutto " + bruttoUt); + " Inn i regel var brutto " + bruttoInn + ". Ut av regel var brutto " + bruttoUt); } } @SuppressWarnings("unchecked") - @Override - public Specification getSpecification() { - Ruleset rs = new Ruleset<>(); - - Specification fastsettFordelingAvBeregningsgrunnlag = new FastsettNyFordeling(modell).getSpecification(); - - Specification sjekkRefusjonMotBeregningsgrunnlag = rs.beregningHvisRegel(new SjekkHarRefusjonSomOverstigerBeregningsgrunnlag(), - fastsettFordelingAvBeregningsgrunnlag, new SettAndelerUtenSøktYtelseTilNull()); + @Override + public Specification getSpecification() { + Ruleset rs = new Ruleset<>(); - Specification omfordelFraBrukersAndel = rs.beregningsRegel(OmfordelFraBrukersAndel.ID, - OmfordelFraBrukersAndel.BESKRIVELSE, new OmfordelFraBrukersAndel(), sjekkRefusjonMotBeregningsgrunnlag); + Specification fastsettFordelingAvBeregningsgrunnlag = new FastsettNyFordeling(modell).getSpecification(); - Specification sjekkOmSkalFordeleFraBrukersAndel = rs.beregningHvisRegel(new SkalOmfordeleFraBrukersAndelTilFLEllerSN(), omfordelFraBrukersAndel, sjekkRefusjonMotBeregningsgrunnlag); + Specification sjekkRefusjonMotBeregningsgrunnlag = rs.beregningHvisRegel(new SjekkHarRefusjonSomOverstigerBeregningsgrunnlag(), + fastsettFordelingAvBeregningsgrunnlag, new SettAndelerUtenSøktYtelseTilNull()); Specification fordelBruttoAndelsmessig = rs.beregningsRegel(RegelFordelBeregningsgrunnlagAndelsmessig.ID, RegelFordelBeregningsgrunnlagAndelsmessig.BESKRIVELSE, new RegelFordelBeregningsgrunnlagAndelsmessig().getSpecification(), new Fordelt()); - Specification sjekkOmBruttoKanDekkeAllRefusjon = rs.beregningHvisRegel(new FinnesMerRefusjonEnnBruttoTilgjengeligOgFlereAndelerKreverRefusjon(), fordelBruttoAndelsmessig, sjekkOmSkalFordeleFraBrukersAndel); + Specification sjekkOmBruttoKanDekkeAllRefusjon = rs.beregningHvisRegel(new FinnesMerRefusjonEnnBruttoTilgjengeligOgFlereAndelerKreverRefusjon(), fordelBruttoAndelsmessig, sjekkRefusjonMotBeregningsgrunnlag); - Specification sjekkOmDetFinnesTilkommetRefkrav = rs.beregningHvisRegel(new FinnesTilkommetArbeidsandelMedRefusjonskrav(), sjekkOmBruttoKanDekkeAllRefusjon, sjekkOmSkalFordeleFraBrukersAndel); + Specification sjekkOmDetFinnesTilkommetRefkrav = rs.beregningHvisRegel(new FinnesTilkommetArbeidsandelMedRefusjonskrav(), sjekkOmBruttoKanDekkeAllRefusjon, sjekkRefusjonMotBeregningsgrunnlag); return sjekkOmDetFinnesTilkommetRefkrav; - } + } } diff --git a/src/main/java/no/nav/folketrygdloven/beregningsgrunnlag/fordel/SkalOmfordeleFraBrukersAndelTilFLEllerSN.java b/src/main/java/no/nav/folketrygdloven/beregningsgrunnlag/fordel/SkalOmfordeleFraBrukersAndelTilFLEllerSN.java deleted file mode 100644 index 220c4caf..00000000 --- a/src/main/java/no/nav/folketrygdloven/beregningsgrunnlag/fordel/SkalOmfordeleFraBrukersAndelTilFLEllerSN.java +++ /dev/null @@ -1,45 +0,0 @@ -package no.nav.folketrygdloven.beregningsgrunnlag.fordel; - -import java.math.BigDecimal; - -import no.nav.folketrygdloven.beregningsgrunnlag.fordel.modell.FordelAndelModell; -import no.nav.folketrygdloven.beregningsgrunnlag.fordel.modell.FordelModell; -import no.nav.folketrygdloven.beregningsgrunnlag.regelmodell.AktivitetStatus; -import no.nav.fpsak.nare.evaluation.Evaluation; -import no.nav.fpsak.nare.specification.LeafSpecification; - -/** - * Bestemmer om det skal omfordeles fra en brukers andel til FL eller SN. - * - * Se {@link OmfordelFraBrukersAndel} for en forklaring på hvilke situasjoner vi forventer å finne en brukers andel. - * - */ -class SkalOmfordeleFraBrukersAndelTilFLEllerSN extends LeafSpecification { - - static final String ID = "SKAL_OMFORDELE_FRA_BA"; - static final String BESKRIVELSE = "Har brukers andel og søkt for FL eller SN?"; - - SkalOmfordeleFraBrukersAndelTilFLEllerSN() { - super(ID, BESKRIVELSE); - } - - @Override - public Evaluation evaluate(FordelModell grunnlag) { - var harBrukersAndel = harBrukersAndelMedBeregningsgrunnlag(grunnlag); - boolean harSøktForFLEllerSN = harSøktFLEllerSN(grunnlag); - return harBrukersAndel && harSøktForFLEllerSN ? ja() : nei(); - } - - private boolean harSøktFLEllerSN(FordelModell grunnlag) { - boolean harSøktFrilans = grunnlag.getInput().getEnesteAndelForStatus(AktivitetStatus.FL).map(FordelAndelModell::erSøktYtelseFor).orElse(false); - boolean harSøktSN = grunnlag.getInput().getEnesteAndelForStatus(AktivitetStatus.SN).map(FordelAndelModell::erSøktYtelseFor).orElse(false); - return harSøktFrilans || harSøktSN; - } - - private boolean harBrukersAndelMedBeregningsgrunnlag(FordelModell grunnlag) { - var brukersAndeler = grunnlag.getInput().getAlleAndelerForStatus(AktivitetStatus.BA); - var brukerAndelBrutto = brukersAndeler.stream().map(ba -> ba.getBruttoPrÅr().orElse(BigDecimal.ZERO)).reduce(BigDecimal::add).orElse(BigDecimal.ZERO); - return brukerAndelBrutto.compareTo(BigDecimal.ZERO) > 0; - } - -} diff --git a/src/test/java/no/nav/folketrygdloven/beregningsgrunnlag/fordel/OmfordelFraBrukersAndelTest.java b/src/test/java/no/nav/folketrygdloven/beregningsgrunnlag/fordel/OmfordelFraBrukersAndelTest.java deleted file mode 100644 index 29f3f199..00000000 --- a/src/test/java/no/nav/folketrygdloven/beregningsgrunnlag/fordel/OmfordelFraBrukersAndelTest.java +++ /dev/null @@ -1,167 +0,0 @@ -package no.nav.folketrygdloven.beregningsgrunnlag.fordel; - -import static no.nav.folketrygdloven.beregningsgrunnlag.util.DateUtil.TIDENES_ENDE; -import static org.assertj.core.api.Assertions.assertThat; - -import java.math.BigDecimal; -import java.time.LocalDate; -import java.util.Arrays; - - -import no.nav.folketrygdloven.beregningsgrunnlag.fordel.modell.FordelAndelModell; -import no.nav.folketrygdloven.beregningsgrunnlag.fordel.modell.FordelModell; -import no.nav.folketrygdloven.beregningsgrunnlag.fordel.modell.FordelPeriodeModell; - -import org.junit.jupiter.api.Test; - -import no.nav.folketrygdloven.beregningsgrunnlag.regelmodell.AktivitetStatus; -import no.nav.folketrygdloven.beregningsgrunnlag.regelmodell.Periode; -import no.nav.folketrygdloven.beregningsgrunnlag.regelmodell.grunnlag.inntekt.Arbeidsforhold; -import no.nav.folketrygdloven.beregningsgrunnlag.regelmodell.grunnlag.inntekt.Inntektskategori; - -class OmfordelFraBrukersAndelTest { - - @Test - void skal_omfordele_fra_brukers_andel_til_frilans() { - // Arrange - var inntekt = BigDecimal.valueOf(200_000); - var arbeidstakerUtenFeriepenger = Inntektskategori.ARBEIDSTAKER_UTEN_FERIEPENGER; - var brukers_andel = lagBrukersAndel(inntekt, arbeidstakerUtenFeriepenger, 1L); - var frilans = lagFrilans(2L); - - var periode = new FordelPeriodeModell(Periode.of(LocalDate.now(), TIDENES_ENDE), Arrays.asList(brukers_andel, frilans)); - FordelModell regelmodell = new FordelModell(periode); - kjørRegel(regelmodell); - - // Regelen endrer på input så vi kan asserte på brukers_andel og frilans - assertThat(brukers_andel.getFordeltPrÅr().orElseThrow()).isEqualByComparingTo(BigDecimal.ZERO); - assertThat(frilans.getFordeltPrÅr().orElseThrow()).isEqualByComparingTo(inntekt); - assertThat(frilans.getInntektskategori()).isEqualTo(arbeidstakerUtenFeriepenger); - } - - @Test - void skal_omfordele_fra_to_brukers_andel_til_frilans() { - // Arrange - var inntekt = BigDecimal.valueOf(200_000); - var inntekt2 = BigDecimal.valueOf(40_000); - var brukers_andel = lagBrukersAndel(inntekt, Inntektskategori.ARBEIDSTAKER, 1L); - var brukers_andel2 = lagBrukersAndel(inntekt2, Inntektskategori.FRILANSER, 2L); - var frilans = lagFrilans(3L); - - var periode = new FordelPeriodeModell(Periode.of(LocalDate.now(), TIDENES_ENDE), Arrays.asList(brukers_andel, brukers_andel2, frilans)); - FordelModell regelmodell = new FordelModell(periode); - kjørRegel(regelmodell); - - // Regelen endrer på input så vi kan asserte på brukers_andel og frilans - assertThat(periode.getAndeler()).hasSize(4); - assertThat(brukers_andel.getFordeltPrÅr().orElseThrow()).isEqualByComparingTo(BigDecimal.ZERO); - assertThat(brukers_andel2.getFordeltPrÅr().orElseThrow()).isEqualByComparingTo(BigDecimal.ZERO); - assertThat(frilans.getFordeltPrÅr().orElseThrow()).isEqualByComparingTo(inntekt); - assertThat(frilans.getInntektskategori()).isEqualTo(Inntektskategori.ARBEIDSTAKER); - var nyAndel = periode.getAndeler().get(3); - assertThat(nyAndel.getInntektskategori()).isEqualTo(Inntektskategori.FRILANSER); - assertThat(nyAndel.getFordeltPrÅr().orElseThrow()).isEqualTo(inntekt2); - } - - @Test - void skal_omfordele_fra_brukers_andel_til_sn() { - // Arrange - var inntekt = BigDecimal.valueOf(200_000); - var arbeidstakerUtenFeriepenger = Inntektskategori.ARBEIDSTAKER_UTEN_FERIEPENGER; - var brukers_andel = lagBrukersAndel(inntekt, arbeidstakerUtenFeriepenger, 1L); - - long andelsnrSN = 2L; - var snStatus = lagSN(andelsnrSN); - - var periode = new FordelPeriodeModell(Periode.of(LocalDate.now(), TIDENES_ENDE), Arrays.asList(brukers_andel, snStatus)); - - FordelModell regelmodell = new FordelModell(periode); - kjørRegel(regelmodell); - - // Regelen endrer på input så vi kan asserte på brukers_andel og sn - assertThat(brukers_andel.getFordeltPrÅr().orElseThrow()).isEqualByComparingTo(BigDecimal.ZERO); - assertThat(snStatus.getFordeltPrÅr().orElseThrow()).isEqualByComparingTo(inntekt); - assertThat(snStatus.getInntektskategori()).isEqualTo(arbeidstakerUtenFeriepenger); - } - - @Test - void skal_omfordele_fra_to_brukers_andel_til_sn() { - // Arrange - var inntekt = BigDecimal.valueOf(200_000); - var inntekt2 = BigDecimal.valueOf(100_000); - var brukers_andel = lagBrukersAndel(inntekt, Inntektskategori.ARBEIDSTAKER, 1L); - var brukers_andel2 = lagBrukersAndel(inntekt2, Inntektskategori.SELVSTENDIG_NÆRINGSDRIVENDE, 2L); - - long andelsnrSN = 3L; - var snStatus = lagSN(andelsnrSN); - - var periode = new FordelPeriodeModell(Periode.of(LocalDate.now(), TIDENES_ENDE), Arrays.asList(brukers_andel,brukers_andel2, snStatus)); - - FordelModell regelmodell = new FordelModell(periode); - kjørRegel(regelmodell); - - // Regelen endrer på input så vi kan asserte på brukers_andel og sn - assertThat(periode.getAndeler()).hasSize(4); - assertThat(brukers_andel.getFordeltPrÅr().orElseThrow()).isEqualByComparingTo(BigDecimal.ZERO); - assertThat(brukers_andel2.getFordeltPrÅr().orElseThrow()).isEqualByComparingTo(BigDecimal.ZERO); - assertThat(snStatus.getFordeltPrÅr().orElseThrow()).isEqualByComparingTo(inntekt); - assertThat(snStatus.getInntektskategori()).isEqualTo(Inntektskategori.ARBEIDSTAKER); - var nyAndel = periode.getAndeler().get(3); - assertThat(nyAndel.getAktivitetStatus()).isEqualTo(AktivitetStatus.SN); - assertThat(nyAndel.getInntektskategori()).isEqualTo(Inntektskategori.SELVSTENDIG_NÆRINGSDRIVENDE); - assertThat(nyAndel.getFordeltPrÅr().orElseThrow()).isEqualTo(inntekt2); - } - - - @Test - void skal_omfordele_fra_brukers_andel_til_frilans_for_periode_med_fl_og_sn() { - // Arrange - var inntekt = BigDecimal.valueOf(200_000); - var arbeidstakerUtenFeriepenger = Inntektskategori.ARBEIDSTAKER_UTEN_FERIEPENGER; - var brukers_andel = lagBrukersAndel(inntekt, arbeidstakerUtenFeriepenger, 1L); - long andelsnrFrilans = 2L; - var frilans = lagFrilans(andelsnrFrilans); - long andelsnrSN = 3L; - var snStatus = lagSN(andelsnrSN); - var periode = new FordelPeriodeModell(Periode.of(LocalDate.now(), TIDENES_ENDE), Arrays.asList(brukers_andel, snStatus, frilans)); - FordelModell regelmodell = new FordelModell(periode); - kjørRegel(regelmodell); - - // Regelen endrer på input så vi kan asserte på brukers_andel og frilans/sn - assertThat(brukers_andel.getFordeltPrÅr().orElseThrow()).isEqualByComparingTo(BigDecimal.ZERO); - assertThat(frilans.getFordeltPrÅr().orElseThrow()).isEqualByComparingTo(inntekt); - assertThat(frilans.getInntektskategori()).isEqualTo(arbeidstakerUtenFeriepenger); - assertThat(snStatus.getBruttoPrÅr()).isEmpty(); - } - - private FordelAndelModell lagSN(long andelsnrSN) { - return FordelAndelModell.builder() - .medAktivitetStatus(AktivitetStatus.SN) - .medInntektskategori(Inntektskategori.UDEFINERT) - .medAndelNr(andelsnrSN) - .build(); - } - - private FordelAndelModell lagFrilans(long andelsnrFrilans) { - return FordelAndelModell.builder() - .medInntektskategori(Inntektskategori.UDEFINERT) - .medAktivitetStatus(AktivitetStatus.FL) - .medArbeidsforhold(Arbeidsforhold.frilansArbeidsforhold()) - .medAndelNr(andelsnrFrilans) - .build(); - } - - - private FordelAndelModell lagBrukersAndel(BigDecimal inntekt, Inntektskategori arbeidstakerUtenFeriepenger, long andelsnrBrukersAndel) { - return FordelAndelModell.builder() - .medAktivitetStatus(AktivitetStatus.BA) - .medForeslåttPrÅr(inntekt) - .medInntektskategori(arbeidstakerUtenFeriepenger) - .medAndelNr(andelsnrBrukersAndel) - .build(); - } - - private void kjørRegel(FordelModell modell) { - new OmfordelFraBrukersAndel().evaluate(modell); - } -} \ No newline at end of file diff --git a/src/test/java/no/nav/folketrygdloven/beregningsgrunnlag/fordel/SkalOmfordeleFraBrukersAndelTilFLEllerSNTest.java b/src/test/java/no/nav/folketrygdloven/beregningsgrunnlag/fordel/SkalOmfordeleFraBrukersAndelTilFLEllerSNTest.java deleted file mode 100644 index eeb28d77..00000000 --- a/src/test/java/no/nav/folketrygdloven/beregningsgrunnlag/fordel/SkalOmfordeleFraBrukersAndelTilFLEllerSNTest.java +++ /dev/null @@ -1,169 +0,0 @@ -package no.nav.folketrygdloven.beregningsgrunnlag.fordel; - -import static no.nav.folketrygdloven.beregningsgrunnlag.util.DateUtil.TIDENES_ENDE; -import static org.assertj.core.api.AssertionsForClassTypes.assertThat; - -import java.math.BigDecimal; -import java.time.LocalDate; -import java.util.Arrays; -import java.util.Collections; - - -import no.nav.folketrygdloven.beregningsgrunnlag.fordel.modell.FordelAndelModell; - -import no.nav.folketrygdloven.beregningsgrunnlag.fordel.modell.FordelModell; -import no.nav.folketrygdloven.beregningsgrunnlag.fordel.modell.FordelPeriodeModell; - -import org.junit.jupiter.api.Test; - -import no.nav.folketrygdloven.beregningsgrunnlag.regelmodell.Aktivitet; -import no.nav.folketrygdloven.beregningsgrunnlag.regelmodell.AktivitetStatus; -import no.nav.folketrygdloven.beregningsgrunnlag.regelmodell.Periode; -import no.nav.folketrygdloven.beregningsgrunnlag.regelmodell.grunnlag.inntekt.Arbeidsforhold; -import no.nav.folketrygdloven.beregningsgrunnlag.regelmodell.grunnlag.inntekt.Inntektskategori; -import no.nav.fpsak.nare.evaluation.Evaluation; -import no.nav.fpsak.nare.evaluation.Resultat; - -class SkalOmfordeleFraBrukersAndelTilFLEllerSNTest { - - @Test - void skal_ikke_omfordele_fra_brukers_andel_uten_brukers_andel() { - // Arrange - var andel = FordelAndelModell.builder() - .medAktivitetStatus(AktivitetStatus.SN) - .medInntektskategori(Inntektskategori.UDEFINERT) - .medAndelNr(1L) - .build(); - var periode = new FordelPeriodeModell(Periode.of(LocalDate.now(), TIDENES_ENDE), Collections.singletonList(andel)); - - // Act - Evaluation evaluation = new SkalOmfordeleFraBrukersAndelTilFLEllerSN().evaluate(new FordelModell(periode)); - - // Assert - assertThat(evaluation.result()).isEqualTo(Resultat.NEI); - } - - @Test - void skal_ikke_omfordele_fra_brukers_andel_uten_fl_eller_sn() { - // Arrange - var andel = FordelAndelModell.builder() - .medAktivitetStatus(AktivitetStatus.BA) - .medForeslåttPrÅr(BigDecimal.valueOf(200_000)) - .medInntektskategori(Inntektskategori.ARBEIDSTAKER_UTEN_FERIEPENGER) - .medAndelNr(1L) - .build(); - var periode = new FordelPeriodeModell(Periode.of(LocalDate.now(), TIDENES_ENDE), Collections.singletonList(andel)); - - // Act - Evaluation evaluation = new SkalOmfordeleFraBrukersAndelTilFLEllerSN().evaluate(new FordelModell(periode)); - - // Assert - assertThat(evaluation.result()).isEqualTo(Resultat.NEI); - } - - @Test - void skal_omfordele_fra_brukers_andel_med_fl() { - // Arrange - var andel1 = FordelAndelModell.builder() - .medAktivitetStatus(AktivitetStatus.BA) - .medForeslåttPrÅr(BigDecimal.valueOf(200_000)) - .medInntektskategori(Inntektskategori.ARBEIDSTAKER_UTEN_FERIEPENGER) - .medAndelNr(1L) - .build(); - var andel2 = FordelAndelModell.builder() - .medAktivitetStatus(AktivitetStatus.FL) - .medInntektskategori(Inntektskategori.UDEFINERT) - .medArbeidsforhold(Arbeidsforhold.frilansArbeidsforhold()) - .medAndelNr(2L) - .build(); - var periode = new FordelPeriodeModell(Periode.of(LocalDate.now(), TIDENES_ENDE), Arrays.asList(andel1, andel2)); - - // Act - Evaluation evaluation = new SkalOmfordeleFraBrukersAndelTilFLEllerSN().evaluate(new FordelModell(periode)); - - // Assert - assertThat(evaluation.result()).isEqualTo(Resultat.JA); - } - - @Test - void skal_omfordele_fra_brukers_andel_med_sn() { - // Arrange - var andelBA = FordelAndelModell.builder() - .medAktivitetStatus(AktivitetStatus.BA) - .medForeslåttPrÅr(BigDecimal.valueOf(200_000)) - .medInntektskategori(Inntektskategori.ARBEIDSTAKER_UTEN_FERIEPENGER) - .medAndelNr(1L) - .build(); - var andelSN = FordelAndelModell.builder() - .medAktivitetStatus(AktivitetStatus.SN) - .medInntektskategori(Inntektskategori.UDEFINERT) - .medAndelNr(2L) - .build(); - var periode = new FordelPeriodeModell(Periode.of(LocalDate.now(), TIDENES_ENDE), Arrays.asList(andelBA, andelSN)); - - // Act - Evaluation evaluation = new SkalOmfordeleFraBrukersAndelTilFLEllerSN().evaluate(new FordelModell(periode)); - - // Assert - assertThat(evaluation.result()).isEqualTo(Resultat.JA); - } - - @Test - void skal_omfordele_fra_brukers_andel_med_fl_og_sn() { - // Arrange - var andelBA = FordelAndelModell.builder() - .medAktivitetStatus(AktivitetStatus.BA) - .medForeslåttPrÅr(BigDecimal.valueOf(200_000)) - .medInntektskategori(Inntektskategori.ARBEIDSTAKER_UTEN_FERIEPENGER) - .medAndelNr(1L) - .build(); - var andelFL = FordelAndelModell.builder() - .medAktivitetStatus(AktivitetStatus.FL) - .medInntektskategori(Inntektskategori.UDEFINERT) - .medArbeidsforhold(Arbeidsforhold.frilansArbeidsforhold()) - .medAndelNr(2L) - .build(); - var andelSN = FordelAndelModell.builder() - .medAktivitetStatus(AktivitetStatus.SN) - .medInntektskategori(Inntektskategori.UDEFINERT) - .medAndelNr(3L) - .build(); - var periode = new FordelPeriodeModell(Periode.of(LocalDate.now(), TIDENES_ENDE), Arrays.asList(andelBA, andelSN, andelFL)); - - // Act - Evaluation evaluation = new SkalOmfordeleFraBrukersAndelTilFLEllerSN().evaluate(new FordelModell(periode)); - - // Assert - assertThat(evaluation.result()).isEqualTo(Resultat.JA); - } - - - @Test - void skal_ikkje_omfordele_fra_brukers_andel_med_kun_arbeidstaker() { - // Arrange - var andelBA = FordelAndelModell.builder() - .medAktivitetStatus(AktivitetStatus.BA) - .medForeslåttPrÅr(BigDecimal.valueOf(200_000)) - .medInntektskategori(Inntektskategori.ARBEIDSTAKER_UTEN_FERIEPENGER) - .medAndelNr(1L) - .build(); - var andelAT = FordelAndelModell.builder() - .medAktivitetStatus(AktivitetStatus.AT) - .medInntektskategori(Inntektskategori.UDEFINERT) - .medArbeidsforhold(Arbeidsforhold.builder() - .medAktivitet(Aktivitet.ARBEIDSTAKERINNTEKT) - .medOrgnr("123423874") - .build()) - .medAndelNr(2L) - .build(); - var periode = new FordelPeriodeModell(Periode.of(LocalDate.now(), TIDENES_ENDE), Arrays.asList(andelBA, andelAT)); - - // Act - Evaluation evaluation = new SkalOmfordeleFraBrukersAndelTilFLEllerSN().evaluate(new FordelModell(periode)); - - // Assert - assertThat(evaluation.result()).isEqualTo(Resultat.NEI); - } - - -} \ No newline at end of file diff --git "a/src/test/java/no/nav/folketrygdloven/beregningsgrunnlag/ytelse/svp/RegelFullf\303\270reBeregningsgrunnlagTest.java" "b/src/test/java/no/nav/folketrygdloven/beregningsgrunnlag/ytelse/svp/RegelFullf\303\270reBeregningsgrunnlagTest.java" index 37eddf46..b1dd9eba 100644 --- "a/src/test/java/no/nav/folketrygdloven/beregningsgrunnlag/ytelse/svp/RegelFullf\303\270reBeregningsgrunnlagTest.java" +++ "b/src/test/java/no/nav/folketrygdloven/beregningsgrunnlag/ytelse/svp/RegelFullf\303\270reBeregningsgrunnlagTest.java" @@ -27,757 +27,802 @@ import no.nav.folketrygdloven.beregningsgrunnlag.regelmodell.grunnlag.inntekt.Arbeidsforhold; class RegelFullføreBeregningsgrunnlagTest { - public static final String ORGNR1 = "910"; - private static final String ORGNR2 = "974760673"; - private static final String ORGNR3 = "976967631"; - private static final String ARB_ID_1 = "arbeidsforholdId_1"; - private static final String ARB_ID_2 = "arbeidsforholdId_2"; - private static final String ARB_ID_3 = "arbeidsforholdId_3"; - private static final BigDecimal GRUNNBELØP = BigDecimal.valueOf(100_000); - - private static BeregningsgrunnlagPeriode PERIODE = BeregningsgrunnlagPeriode.builder() - .medPeriode(Periode.of(LocalDate.now(), TIDENES_ENDE)) - .build(); - - - - @BeforeEach - void setup() { - PERIODE = BeregningsgrunnlagPeriode.builder() - .medPeriode(Periode.of(LocalDate.now(), TIDENES_ENDE)) - .build(); - Beregningsgrunnlag.builder() - .medBeregningsgrunnlagPeriode(PERIODE) - .medGrunnbeløp(GRUNNBELØP); - } - - @Test - void to_arbeidsforhold_hel_og_halv_utbetaling_kun_penger_til_refusjon() { - //Arrange - double bruttoEn = 624_000; - double refusjonEn = 600_000; - var utbetalingsgradEn = 50; - - double bruttoTo = 576_000; - double refusjonTo = 480_000; - var utbetalingsgradTo = 100; - - BeregningsgrunnlagPeriode periode = BeregningsgrunnlagPeriode.builder() - .medPeriode(Periode.of(LocalDate.now(), TIDENES_ENDE)) - .build(); - - var grunnbeløp = BigDecimal.valueOf(99_858L); - Beregningsgrunnlag.builder() - .medBeregningsgrunnlagPeriode(periode) - .medGrunnbeløp(grunnbeløp); - - leggTilArbeidsforhold(periode, 1L, ORGNR1, bruttoEn, refusjonEn, utbetalingsgradEn); - leggTilArbeidsforhold(periode, 2L, ORGNR2, bruttoTo, refusjonTo, utbetalingsgradTo); - - //Act - kjørRegelFinnGrenseverdi(periode); - kjørRegelFullførBeregningsgrunnlag(periode); - - assertThat(periode.getGrenseverdi()).isEqualByComparingTo(BigDecimal.valueOf(443369.52)); - List arbeidsforhold = periode.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL).getArbeidsforhold(); - - verifiserArbfor(arbeidsforhold, ORGNR1, 0, 599); - verifiserArbfor(arbeidsforhold, ORGNR2, 0, 1106); - } - - @Test - void to_arbeidsforhold_hel_og_halv_utbetaling_penger_til_bruker_og_refusjon() { - //Arrange - double bruttoEn = 624_000; - double refusjonEn = 300_000; - - double bruttoTo = 576_000; - double refusjonTo = 200_000; - - BeregningsgrunnlagPeriode periode = BeregningsgrunnlagPeriode.builder() - .medPeriode(Periode.of(LocalDate.now(), TIDENES_ENDE)) - .build(); - - Beregningsgrunnlag.builder() - .medBeregningsgrunnlagPeriode(periode) - .medGrunnbeløp(BigDecimal.valueOf(99_858L)); - - leggTilArbeidsforhold(periode, 1L, ORGNR1, bruttoEn, refusjonEn, 50); - leggTilArbeidsforhold(periode, 2L, ORGNR2, bruttoTo, refusjonTo, 100); - - //Act - kjørRegelFinnGrenseverdi(periode); - kjørRegelFullførBeregningsgrunnlag(periode); - - assertThat(periode.getGrenseverdi()).isEqualByComparingTo(BigDecimal.valueOf(443369.52)); - List arbeidsforhold = periode.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL).getArbeidsforhold(); - - verifiserArbfor(arbeidsforhold, ORGNR1, 22, 577); - verifiserArbfor(arbeidsforhold, ORGNR2, 337, 769); - } - - @Test - void tre_arbeidsforhold_halv_og_halv_og_ingen_utbetaling_penger_til_bruker_og_refusjon() { - //Arrange - double bruttoEn = 600_000; - double refusjonEn = 560_000.04; - - double bruttoTo = 750_000; - double refusjonTo = 333_333.36; - - double bruttoTre = 250_000; - double refusjonTre = 0; - - BeregningsgrunnlagPeriode periode = BeregningsgrunnlagPeriode.builder() - .medPeriode(Periode.of(LocalDate.now(), TIDENES_ENDE)) - .build(); - - Beregningsgrunnlag.builder() - .medBeregningsgrunnlagPeriode(periode) - .medGrunnbeløp(BigDecimal.valueOf(99_858L)); - - leggTilArbeidsforhold(periode, 1L, ORGNR1, bruttoEn, refusjonEn, 100); - leggTilArbeidsforhold(periode, 2L, ORGNR2, bruttoTo, refusjonTo, 60); - leggTilArbeidsforhold(periode, 3L, ORGNR3, bruttoTre, refusjonTre, 0); - - //Act - kjørRegelFinnGrenseverdi(periode); - kjørRegelFullførBeregningsgrunnlag(periode); - assertThat(periode.getGrenseverdi()).isEqualByComparingTo(BigDecimal.valueOf(393190.875)); - List arbeidsforhold = periode.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL).getArbeidsforhold(); - - verifiserArbfor(arbeidsforhold, ORGNR1, 0, 864); - verifiserArbfor(arbeidsforhold, ORGNR2, 0, 648); - verifiserArbfor(arbeidsforhold, ORGNR3, 0, 0); - } - - @Test - void skal_teste_et_arbeidsforhold_med_refusjon_over_6G() { - // Arrange - leggTilArbeidsforhold(PERIODE, 1L, ORGNR1, ARB_ID_1, 612_000, 612_000, 100); - - // Act - var grenseverdiRegelesultat = kjørRegelFinnGrenseverdi(PERIODE); - var regelResultat = kjørRegelFullførBeregningsgrunnlag(PERIODE); - - // Assert - List arbeidsforhold = PERIODE.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL).getArbeidsforhold(); - assertPeriode(612_000, PERIODE.getGrenseverdi(), PERIODE.getGrenseverdi()); - assertArbeidsforhold(arbeidsforhold, ORGNR1, BigDecimal.ZERO, PERIODE.getGrenseverdi(), PERIODE.getGrenseverdi()); - assertThat(grenseverdiRegelesultat).isNotNull(); - assertThat(regelResultat).isNotNull(); - } - - @Test - void skal_teste_to_arbeidsforhold_beregningsgrunnlag_under_6G_full_refusjon_gradert() { - // Arrange - leggTilArbeidsforhold(PERIODE, 1L, ORGNR1, ARB_ID_1, 200_000, 200_000, 100); - leggTilArbeidsforhold(PERIODE, 2L, ORGNR2, ARB_ID_2, 300_000, 300_000, 50); - - // Assert - var grenseverdiRegelesultat = kjørRegelFinnGrenseverdi(PERIODE); - var regelResultat = kjørRegelFullførBeregningsgrunnlag(PERIODE); - - // Assert - List arbeidsforhold = PERIODE.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL).getArbeidsforhold(); - assertPeriode(500_000, 350_000, 350_000); - assertArbeidsforhold(arbeidsforhold, ORGNR1, BigDecimal.ZERO, BigDecimal.valueOf(200_000), BigDecimal.valueOf(200_000)); - assertArbeidsforhold(arbeidsforhold, ORGNR2, BigDecimal.ZERO, BigDecimal.valueOf(150_000), BigDecimal.valueOf(150_000)); - assertThat(grenseverdiRegelesultat).isNotNull(); - assertThat(regelResultat).isNotNull(); - } - - @Test - void næring_med_beregningsgrunnlag_under_6G() { - // Arrange - leggTilNæring(300_000, 100, 1L); - - // Assert - var grenseverdiRegelesultat = kjørRegelFinnGrenseverdi(PERIODE); - var regelResultat = kjørRegelFullførBeregningsgrunnlag(PERIODE); - - // Assert - assertPeriode(300_000, 300_000, 300_000); - assertAndel(BigDecimal.valueOf(300_000), BigDecimal.valueOf(300_000)); - assertThat(grenseverdiRegelesultat).isNotNull(); - assertThat(regelResultat).isNotNull(); - } - - @Test - void næring_med_beregningsgrunnlag_under_6G_ikke_søkt_ytelse() { - // Arrange - leggTilNæring(300_000, 0, 1L); - - // Act - var grenseverdiRegelesultat = kjørRegelFinnGrenseverdi(PERIODE); - var regelResultat = kjørRegelFullførBeregningsgrunnlag(PERIODE); - - // Assert - assertPeriode(300_000, 0, 0); - assertAndel(BigDecimal.ZERO, BigDecimal.ZERO); - assertThat(grenseverdiRegelesultat).isNotNull(); - assertThat(regelResultat).isNotNull(); - } - - @Test - void næring_med_beregningsgrunnlag_under_6G_delvis_søkt_ytelse() { - // Arrange - leggTilNæring(300_000, 50, 1L); - - // Act - var grenseverdiRegelesultat = kjørRegelFinnGrenseverdi(PERIODE); - var regelResultat = kjørRegelFullførBeregningsgrunnlag(PERIODE); - - // Assert - assertPeriode(300_000, 150_000, 150_000); - assertAndel(BigDecimal.valueOf(150_000), BigDecimal.valueOf(150_000)); - assertThat(grenseverdiRegelesultat).isNotNull(); - assertThat(regelResultat).isNotNull(); - } - - @Test - void næring_med_beregningsgrunnlag_over_6G_delvis_søkt_ytelse() { - // Arrange - leggTilNæring(800_000, 50, 1L); - - // Act - var grenseverdiRegelesultat = kjørRegelFinnGrenseverdi(PERIODE); - var regelResultat = kjørRegelFullførBeregningsgrunnlag(PERIODE); - - // Assert - //assertPeriode(800_000‬, 299_574, 299_574); - assertAndel(BigDecimal.valueOf(300_000), BigDecimal.valueOf(300_000)); - assertThat(grenseverdiRegelesultat).isNotNull(); - assertThat(regelResultat).isNotNull(); - } - - @Test - void skal_teste_to_arbeidsforhold_beregningsgrunnlag_over_6G_refusjon_under_6G_gradert() { - // Arrange - leggTilArbeidsforhold(PERIODE, 1L, ORGNR1, ARB_ID_1, 800_000, 200_000, 100); - leggTilArbeidsforhold(PERIODE, 2L, ORGNR2, ARB_ID_2, 200_000, 200_000, 50); - - // Assert - var grenseverdiRegelesultat = kjørRegelFinnGrenseverdi(PERIODE); - var regelResultat = kjørRegelFullførBeregningsgrunnlag(PERIODE); - - // Assert - List arbeidsforhold = PERIODE.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL).getArbeidsforhold(); - assertPeriode(1_000_000, 540_000, 540_000); - assertArbeidsforhold(arbeidsforhold, ORGNR1, BigDecimal.valueOf(240_000), BigDecimal.valueOf(200_000), BigDecimal.valueOf(440_000)); - assertArbeidsforhold(arbeidsforhold, ORGNR2, BigDecimal.valueOf(0), BigDecimal.valueOf(100_000), BigDecimal.valueOf(100_000)); - assertThat(grenseverdiRegelesultat).isNotNull(); - assertThat(regelResultat).isNotNull(); - } - - @Test - void skal_teste_to_arbeidsforhold_med_refusjon_over_6G() { - // Arrange - leggTilArbeidsforhold(PERIODE, 1L, ORGNR1, ARB_ID_1, 600_000, 560_000, 100); - leggTilArbeidsforhold(PERIODE, 2L, ORGNR2, ARB_ID_2, 750_000, 200_000, 100); - leggTilArbeidsforhold(PERIODE, 3L, ORGNR3, ARB_ID_3, 250_000, 0, 0); - - // Assert - var grenseverdiRegelesultat = kjørRegelFinnGrenseverdi(PERIODE); - var regelResultat = kjørRegelFullførBeregningsgrunnlag(PERIODE); - - // Assert - List arbeidsforhold = PERIODE.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL).getArbeidsforhold(); - assertPeriode(1_600_000, 506_250, 506_250); - assertArbeidsforhold(arbeidsforhold, ORGNR1, BigDecimal.ZERO, BigDecimal.valueOf(306_250), null); - assertArbeidsforhold(arbeidsforhold, ORGNR2, BigDecimal.ZERO, BigDecimal.valueOf(200_000), null); - assertArbeidsforhold(arbeidsforhold, ORGNR3, BigDecimal.ZERO, BigDecimal.ZERO, null); - assertThat(grenseverdiRegelesultat).isNotNull(); - assertThat(regelResultat).isNotNull(); - } - - @Test - void skal_teste_to_arbeidsforhold_med_refusjon_under_6G() { - // Arrange - leggTilArbeidsforhold(PERIODE, 1L, ORGNR1, ARB_ID_1, 600_000, 150_000, 100); - leggTilArbeidsforhold(PERIODE, 2L, ORGNR2, ARB_ID_2, 750_000, 200_000, 100); - leggTilArbeidsforhold(PERIODE, 3L, ORGNR3, ARB_ID_3, 250_000, 0, 0); - - // Assert - var grenseverdiRegelesultat = kjørRegelFinnGrenseverdi(PERIODE); - var regelResultat = kjørRegelFullførBeregningsgrunnlag(PERIODE); - - // Assert - List arbeidsforhold = PERIODE.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL).getArbeidsforhold(); - assertPeriode(1_600_000, 506_250, 506_250); - assertArbeidsforhold(arbeidsforhold, ORGNR1, BigDecimal.valueOf(75_000), BigDecimal.valueOf(150_000), BigDecimal.valueOf(225_000)); - assertArbeidsforhold(arbeidsforhold, ORGNR2, BigDecimal.valueOf(81_250), BigDecimal.valueOf(200_000), BigDecimal.valueOf(281_250)); - assertArbeidsforhold(arbeidsforhold, ORGNR3, BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO); - assertThat(grenseverdiRegelesultat).isNotNull(); - assertThat(regelResultat).isNotNull(); - } - - @Test - void skal_teste_to_arbeidsforhold_med_refusjon_og_inntekt_under_6G() { - // Arrange - leggTilArbeidsforhold(PERIODE, 1L, ORGNR1, ARB_ID_1, 150_000, 100_000, 100); - leggTilArbeidsforhold(PERIODE, 2L, ORGNR2, ARB_ID_2, 200_000, 200_000, 100); - leggTilArbeidsforhold(PERIODE, 3L, ORGNR3, ARB_ID_3, 100_000, 0, 0); - - // Assert - var grenseverdiRegelesultat = kjørRegelFinnGrenseverdi(PERIODE); - var regelResultat = kjørRegelFullførBeregningsgrunnlag(PERIODE); - - // Assert - List arbeidsforhold = PERIODE.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL).getArbeidsforhold(); - assertPeriode(450_000, 350_000, 350_000); - assertArbeidsforhold(arbeidsforhold, ORGNR1, BigDecimal.valueOf(50_000), BigDecimal.valueOf(100_000), BigDecimal.valueOf(150_000)); - assertArbeidsforhold(arbeidsforhold, ORGNR2, BigDecimal.ZERO, BigDecimal.valueOf(200_000), BigDecimal.valueOf(200_000)); - assertArbeidsforhold(arbeidsforhold, ORGNR3, BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO); - assertThat(grenseverdiRegelesultat).isNotNull(); - assertThat(regelResultat).isNotNull(); - } - - @Test - void skal_teste_to_arbeidsforhold_med_refusjon_lik_6G_og_inntekt_over_6G_gradert() { - // Arrange - leggTilArbeidsforhold(PERIODE, 1L, ORGNR1, ARB_ID_1, 600_000, 600_000, 100); - leggTilArbeidsforhold(PERIODE, 2L, ORGNR2, ARB_ID_2, 600_000, 0, 50); - - // Assert - var grenseverdiRegelesultat = kjørRegelFinnGrenseverdi(PERIODE); - var regelResultat = kjørRegelFullførBeregningsgrunnlag(PERIODE); - - // Assert - List arbeidsforhold = PERIODE.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL).getArbeidsforhold(); - assertPeriode(1_200_000, 450_000, 450_000); - assertArbeidsforhold(arbeidsforhold, ORGNR1, BigDecimal.ZERO, BigDecimal.valueOf(450_000), BigDecimal.valueOf(450_000)); - assertArbeidsforhold(arbeidsforhold, ORGNR2, BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO); - assertThat(grenseverdiRegelesultat).isNotNull(); - assertThat(regelResultat).isNotNull(); - } - - @Test - void skal_teste_to_arbeidsforhold_med_refusjon_lik_6G_for_begge_og_inntekt_over_6G_gradert() { - // Arrange - leggTilArbeidsforhold(PERIODE, 1L, ORGNR1, ARB_ID_1, 600_000, 600_000, 100); - leggTilArbeidsforhold(PERIODE, 2L, ORGNR2, ARB_ID_2, 600_000, 600_000, 50); - - // Assert - var grenseverdiRegelesultat = kjørRegelFinnGrenseverdi(PERIODE); - var regelResultat = kjørRegelFullførBeregningsgrunnlag(PERIODE); - - // Assert - List arbeidsforhold = PERIODE.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL).getArbeidsforhold(); - assertPeriode(1_200_000, 450_000, 450_000); - assertArbeidsforhold(arbeidsforhold, ORGNR1, BigDecimal.ZERO, BigDecimal.valueOf(300_000), BigDecimal.valueOf(300_000)); - assertArbeidsforhold(arbeidsforhold, ORGNR2, BigDecimal.ZERO, BigDecimal.valueOf(150_000), BigDecimal.valueOf(150_000)); - assertThat(grenseverdiRegelesultat).isNotNull(); - assertThat(regelResultat).isNotNull(); - } - - @Test - void skal_teste_to_arbeidsforhold_med_refusjon_lik_6G_og_1G_og_inntekt_over_6G_gradert() { - // Arrange - leggTilArbeidsforhold(PERIODE, 1L, ORGNR1, ARB_ID_1, 600_000, 600_000, 100); - leggTilArbeidsforhold(PERIODE, 2L, ORGNR2, ARB_ID_2, 600_000, 100_000, 50); - - // Assert - var grenseverdiRegelesultat = kjørRegelFinnGrenseverdi(PERIODE); - var regelResultat = kjørRegelFullførBeregningsgrunnlag(PERIODE); - - // Assert - List arbeidsforhold = PERIODE.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL).getArbeidsforhold(); - assertPeriode(1_200_000, 450_000, 450_000); - assertArbeidsforhold(arbeidsforhold, ORGNR1, BigDecimal.ZERO, BigDecimal.valueOf(400_000), BigDecimal.valueOf(400_000)); - assertArbeidsforhold(arbeidsforhold, ORGNR2, BigDecimal.ZERO, BigDecimal.valueOf(50_000), BigDecimal.valueOf(50_000)); - assertThat(grenseverdiRegelesultat).isNotNull(); - assertThat(regelResultat).isNotNull(); - } - - @Test - void skal_teste_arbeidsforhold_med_refusjon_uten_tilrettelegging_og_tilrettelegging_uten_refusjon() { - // Arrange - leggTilArbeidsforhold(PERIODE, 1L, ORGNR1, ARB_ID_1, 300_000, 150_000, 100); - leggTilArbeidsforhold(PERIODE, 2L, ORGNR2, ARB_ID_2, 210_000, 210_000, 0); - leggTilArbeidsforhold(PERIODE, 3L, ORGNR3, ARB_ID_3, 240_000, 0, 100); - - // Assert - var grenseverdiRegelesultat = kjørRegelFinnGrenseverdi(PERIODE); - var regelResultat = kjørRegelFullførBeregningsgrunnlag(PERIODE); - - // Assert - List arbeidsforhold = PERIODE.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL).getArbeidsforhold(); - assertPeriode(750000, 432_000, 432_000); - assertArbeidsforhold(arbeidsforhold, ORGNR1, BigDecimal.valueOf(90_000), BigDecimal.valueOf(150_000), BigDecimal.valueOf(240_000)); - assertArbeidsforhold(arbeidsforhold, ORGNR2, BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO); - assertArbeidsforhold(arbeidsforhold, ORGNR3, BigDecimal.valueOf(192_000), BigDecimal.ZERO, BigDecimal.valueOf(192_000)); - assertThat(grenseverdiRegelesultat).isNotNull(); - assertThat(regelResultat).isNotNull(); - } - - @Test - void skal_teste_arbeidstaker_med_delvis_søkt_ytelse() { - // Arrange - leggTilArbeidsforhold(PERIODE, 1L, ORGNR1, ARB_ID_1, 300_000, 0, 45); - - // Assert - var grenseverdiRegelesultat = kjørRegelFinnGrenseverdi(PERIODE); - var regelResultat = kjørRegelFullførBeregningsgrunnlag(PERIODE); - - // Assert - List arbeidsforhold = PERIODE.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL).getArbeidsforhold(); - assertPeriode(300_000, 135_000, 135_000); - assertArbeidsforhold(arbeidsforhold, ORGNR1, BigDecimal.valueOf(135_000), BigDecimal.ZERO, BigDecimal.valueOf(135_000)); - assertThat(grenseverdiRegelesultat).isNotNull(); - assertThat(regelResultat).isNotNull(); - } - - @Test - void skal_teste_frilans_med_beregningsgrunnlag_under_6G() { - // Arrange - leggTilFrilans(300_000, 100, 1L); - - // Assert - var grenseverdiRegelesultat = kjørRegelFinnGrenseverdi(PERIODE); - var regelResultat = kjørRegelFullførBeregningsgrunnlag(PERIODE); - - // Assert - assertPeriode(300_000, 300_000, 300_000); - assertFrilans(BigDecimal.valueOf(300_000), BigDecimal.valueOf(300_000), 1154L); - assertThat(grenseverdiRegelesultat).isNotNull(); - assertThat(regelResultat).isNotNull(); - } - - @Test - void skal_teste_frilans_med_beregningsgrunnlag_under_6G_delvis_søkt_ytelse() { - // Arrange - leggTilFrilans(300_000, 50, 1L); - - // Assert - var grenseverdiRegelesultat = kjørRegelFinnGrenseverdi(PERIODE); - var regelResultat = kjørRegelFullførBeregningsgrunnlag(PERIODE); - - // Assert - assertPeriode(300_000, 150_000, 150_000); - assertFrilans(BigDecimal.valueOf(150_000), BigDecimal.valueOf(150_000), 577L); - assertThat(grenseverdiRegelesultat).isNotNull(); - assertThat(regelResultat).isNotNull(); - } - - @Test - void skal_teste_frilans_med_beregningsgrunnlag_under_6G_ikke_søkt_ytelse() { - // Arrange - leggTilFrilans(300_000, 0, 1L); - - // Assert - var grenseverdiRegelesultat = kjørRegelFinnGrenseverdi(PERIODE); - var regelResultat = kjørRegelFullførBeregningsgrunnlag(PERIODE); - - // Assert - assertPeriode(300_000, 0, 0); - assertFrilans(BigDecimal.ZERO, BigDecimal.ZERO, 0L); - assertThat(grenseverdiRegelesultat).isNotNull(); - assertThat(regelResultat).isNotNull(); - } - - @Test - void skal_teste_frilans_og_arbeid_med_beregningsgrunnlag_under_6G_søkt_ytelse_for_alle() { - // Arrange - leggTilFrilans(200_000, 100, 1L); - leggTilArbeidsforhold(PERIODE, 2L, ORGNR1, ARB_ID_1, 200_000, 0, 100); - - // Assert - var grenseverdiRegelesultat = kjørRegelFinnGrenseverdi(PERIODE); - var regelResultat = kjørRegelFullførBeregningsgrunnlag(PERIODE); - - // Assert - assertPeriode(400_000, 400_000, 400_000); - assertFrilans(BigDecimal.valueOf(200_000), BigDecimal.valueOf(200_000), null); - List arbeidsforhold = PERIODE.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL).getArbeidsforhold(); - assertArbeidsforhold(arbeidsforhold, ORGNR1, BigDecimal.valueOf(200_000), BigDecimal.ZERO, BigDecimal.valueOf(200_000)); - assertThat(grenseverdiRegelesultat).isNotNull(); - assertThat(regelResultat).isNotNull(); - } - - @Test - void skal_teste_frilans_og_arbeid_med_beregningsgrunnlag_over_6G_for_arbeid_søkt_ytelse_for_alle() { - // Arrange - leggTilFrilans(200_000, 100, 1L); - leggTilArbeidsforhold(PERIODE, 2L, ORGNR1, ARB_ID_1, 800_000, 0, 100); - - // Assert - var grenseverdiRegelesultat = kjørRegelFinnGrenseverdi(PERIODE); - var regelResultat = kjørRegelFullførBeregningsgrunnlag(PERIODE); - - // Assert - assertPeriode(1_000_000, 600_000, 600_000); - assertFrilans(BigDecimal.ZERO, BigDecimal.ZERO, 0L); - List arbeidsforhold = PERIODE.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL).getArbeidsforhold(); - assertArbeidsforhold(arbeidsforhold, ORGNR1, PERIODE.getGrenseverdi(), BigDecimal.ZERO, PERIODE.getGrenseverdi()); - assertThat(grenseverdiRegelesultat).isNotNull(); - assertThat(regelResultat).isNotNull(); - } - - @Test - void skal_teste_frilans_og_arbeid_med_beregningsgrunnlag_over_6G_for_arbeid_søkt_ytelse_for_frilans() { - // Arrange - leggTilFrilans(200_000, 100, 1L); - leggTilArbeidsforhold(PERIODE, 2L, ORGNR1, ARB_ID_1, 800_000, 0, 0); - - // Assert - var grenseverdiRegelesultat = kjørRegelFinnGrenseverdi(PERIODE); - var regelResultat = kjørRegelFullførBeregningsgrunnlag(PERIODE); - - // Assert - assertPeriode(1_000_000, 0, 0); - assertFrilans(BigDecimal.ZERO, BigDecimal.ZERO, 0L); - List arbeidsforhold = PERIODE.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL).getArbeidsforhold(); - assertArbeidsforhold(arbeidsforhold, ORGNR1, BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO); - assertThat(grenseverdiRegelesultat).isNotNull(); - assertThat(regelResultat).isNotNull(); - } - - @Test - void skal_teste_frilans_og_arbeid_med_beregningsgrunnlag_over_6G_til_sammen_søkt_delvis_ytelse_for_frilans() { - // Arrange - leggTilFrilans(500_000, 50, 1L); - leggTilArbeidsforhold(PERIODE, 2L, ORGNR1, ARB_ID_1, 500_000, 0, 0); - - // Assert - var grenseverdiRegelesultat = kjørRegelFinnGrenseverdi(PERIODE); - var regelResultat = kjørRegelFullførBeregningsgrunnlag(PERIODE); - - // Assert - assertPeriode(1_000_000, 50_000, 50_000); - assertFrilans(BigDecimal.valueOf(50_000), BigDecimal.valueOf(50_000), 192L); - List arbeidsforhold = PERIODE.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL).getArbeidsforhold(); - assertArbeidsforhold(arbeidsforhold, ORGNR1, BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO); - assertThat(grenseverdiRegelesultat).isNotNull(); - assertThat(regelResultat).isNotNull(); - } - - @Test - void skal_teste_frilans_og_to_arbeid_med_beregningsgrunnlag_over_6G_til_sammen_søkt_ytelse_for_alle_med_refusjonkrav_som_overstiger_total_avkortet_for_arbeid() { - // Arrange - leggTilFrilans(500_000, 100, 1L); - leggTilArbeidsforhold(PERIODE, 2L, ORGNR1, ARB_ID_1, 500_000, 500_000, 100); - leggTilArbeidsforhold(PERIODE, 3L, ORGNR2, ARB_ID_2, 500_000, 200_000, 100); - - // Assert - var grenseverdiRegelesultat = kjørRegelFinnGrenseverdi(PERIODE); - var regelResultat = kjørRegelFullførBeregningsgrunnlag(PERIODE); - - // Assert - assertPeriode(1_500_000, 600_000, 600_000); - assertFrilans(BigDecimal.ZERO, BigDecimal.ZERO, 0L); - List arbeidsforhold = PERIODE.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL).getArbeidsforhold(); - assertArbeidsforhold(arbeidsforhold, ORGNR1, BigDecimal.ZERO, BigDecimal.valueOf(400_000), BigDecimal.valueOf(400_000)); - assertArbeidsforhold(arbeidsforhold, ORGNR2, BigDecimal.ZERO, BigDecimal.valueOf(200_000), BigDecimal.valueOf(200_000)); - assertThat(grenseverdiRegelesultat).isNotNull(); - assertThat(regelResultat).isNotNull(); - } - - @Test - void skal_teste_frilans_og_to_arbeid_med_beregningsgrunnlag_over_6G_til_sammen_søkt_ytelse_for_alle_med_refusjonkrav_som_overstiger_total_avkortet_for_arbeid_med_fordeling_av_refusjonskrav() { - // Arrange - leggTilFrilans(500_000, 100, 1L); - leggTilArbeidsforhold(PERIODE, 2L, ORGNR1, ARB_ID_1, 500_000, 500_000, 100); - leggTilArbeidsforhold(PERIODE, 3L, ORGNR2, ARB_ID_2, 500_000, 300_000, 100); - - // Assert - var grenseverdiRegelesultat = kjørRegelFinnGrenseverdi(PERIODE); - var regelResultat = kjørRegelFullførBeregningsgrunnlag(PERIODE); - - // Assert - assertPeriode(1_500_000, 600_000, 600_000); - assertFrilans(BigDecimal.ZERO, BigDecimal.ZERO, 0L); - List arbeidsforhold = PERIODE.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL).getArbeidsforhold(); - assertArbeidsforhold(arbeidsforhold, ORGNR1, BigDecimal.ZERO, BigDecimal.valueOf(300_000), BigDecimal.valueOf(300_000)); - assertArbeidsforhold(arbeidsforhold, ORGNR2, BigDecimal.ZERO, BigDecimal.valueOf(300_000), BigDecimal.valueOf(300_000)); - assertThat(grenseverdiRegelesultat).isNotNull(); - assertThat(regelResultat).isNotNull(); - } - - @Test - void skal_teste_to_arbeidsforhold_hos_en_arbeidsgiver_med_beregningsgrunnlag_over_6G() { - // Arrange - leggTilArbeidsforhold(PERIODE, 2L, ORGNR1, ARB_ID_1, 400_000, 300_000, 100); - leggTilArbeidsforhold(PERIODE, 3L, ORGNR2, ARB_ID_2, 300_000, 300_000, 100); - - // Assert - var grenseverdiRegelesultat = kjørRegelFinnGrenseverdi(PERIODE); - var regelResultat = kjørRegelFullførBeregningsgrunnlag(PERIODE); - - // Assert - assertPeriode(700_000, 600_000, 600_000); - List arbeidsforhold = PERIODE.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL).getArbeidsforhold(); - assertArbeidsforhold(arbeidsforhold, ORGNR1, BigDecimal.ZERO, BigDecimal.valueOf(300_000), BigDecimal.valueOf(300_000)); - assertArbeidsforhold(arbeidsforhold, ORGNR2, BigDecimal.ZERO, BigDecimal.valueOf(300_000), BigDecimal.valueOf(300_000)); - assertThat(grenseverdiRegelesultat).isNotNull(); - assertThat(regelResultat).isNotNull(); - } - - @Test - void skal_teste_to_arbeidsforhold_hos_en_arbeidsgiver_med_beregningsgrunnlag_over_6G_ikke_full_utbetaling() { - // Arrange - leggTilArbeidsforhold(PERIODE, 2L, ORGNR1, ARB_ID_1, 624_000, 300_000, 50); - leggTilArbeidsforhold(PERIODE, 3L, ORGNR2, ARB_ID_2, 576_000, 200_000, 100); - - // Assert - var grenseverdiRegelesultat = kjørRegelFinnGrenseverdi(PERIODE); - var regelResultat = kjørRegelFullførBeregningsgrunnlag(PERIODE); - - // Assert - assertPeriode(1_200_000, 444_000, 444_000); - List arbeidsforhold = PERIODE.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL).getArbeidsforhold(); - assertArbeidsforhold(arbeidsforhold, ORGNR1, BigDecimal.valueOf(6_000), BigDecimal.valueOf(150_000), BigDecimal.valueOf(156_000)); - assertArbeidsforhold(arbeidsforhold, ORGNR2, BigDecimal.valueOf(88_000), BigDecimal.valueOf(200_000), BigDecimal.valueOf(288_000)); - assertThat(grenseverdiRegelesultat).isNotNull(); - assertThat(regelResultat).isNotNull(); - } - - private void assertPeriode(int brutto, int avkortet, int redusert) { - assertPeriode(BigDecimal.valueOf(brutto), BigDecimal.valueOf(avkortet), BigDecimal.valueOf(redusert)); - } - - private void assertPeriode(int brutto, BigDecimal avkortet, BigDecimal redusert) { - assertPeriode(BigDecimal.valueOf(brutto), avkortet, redusert); - } - - private void assertPeriode(BigDecimal brutto, BigDecimal avkortet, BigDecimal redusert) { - Assertions.assertThat(PERIODE.getBruttoPrÅr()).isEqualByComparingTo(brutto); - Assertions.assertThat(PERIODE.getAvkortetPrÅr()).isEqualByComparingTo(avkortet); - Assertions.assertThat(PERIODE.getRedusertPrÅr()).isEqualByComparingTo(redusert); - } - - private void assertAndel(BigDecimal bruker, BigDecimal avkortet) { - var andel = PERIODE.getBeregningsgrunnlagPrStatus(AktivitetStatus.SN); - BigDecimal total = bruker.add(BigDecimal.ZERO); - Assertions.assertThat(andel.getAvkortetPrÅr()).isEqualByComparingTo(Objects.requireNonNullElse(avkortet, total)); - Assertions.assertThat(andel.getRedusertPrÅr()).isEqualByComparingTo(total); - } - - private void assertFrilans(BigDecimal bruker, BigDecimal avkortet, Long dagsats) { - var andel = PERIODE.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL); - BigDecimal total = bruker.add(BigDecimal.ZERO); - Optional frilansOpt = andel.getArbeidsforhold().stream().filter(BeregningsgrunnlagPrArbeidsforhold::erFrilanser).findFirst(); - assertThat(frilansOpt).isPresent(); - BeregningsgrunnlagPrArbeidsforhold frilansAndel = frilansOpt.get(); - assertThat(frilansAndel.getAvkortetPrÅr()).isEqualByComparingTo(Objects.requireNonNullElse(avkortet, total)); - assertThat(frilansAndel.getRedusertPrÅr()).isEqualByComparingTo(total); - if (dagsats != null) { - assertThat(frilansAndel.getDagsats()).isEqualByComparingTo(dagsats); - } - } - - private void assertArbeidsforhold(List arbeidsforhold, String orgnr, BigDecimal bruker, BigDecimal refusjon, BigDecimal avkortet) { - Function calcDagsats = a -> a.divide(BigDecimal.valueOf(260), 0, RoundingMode.HALF_UP).longValue(); - Optional arbforOpt = arbeidsforhold.stream().filter(a -> Objects.equals(a.getArbeidsgiverId(),orgnr)).findFirst(); - BigDecimal total = bruker.add(refusjon); - - assertThat(arbforOpt).isPresent(); - BeregningsgrunnlagPrArbeidsforhold arbfor = arbforOpt.get(); - - Assertions.assertThat(arbfor.getAvkortetPrÅr()).isEqualByComparingTo(Objects.requireNonNullElse(avkortet, total)); - assertThat(arbfor.getRedusertPrÅr()).isEqualByComparingTo(total); - - Long dagsatsRefusjon = calcDagsats.apply(refusjon); - Long dagsatsBruker = calcDagsats.apply(bruker); - assertThat(arbfor.getDagsatsArbeidsgiver()).isEqualTo(dagsatsRefusjon); - assertThat(arbfor.getDagsatsBruker()).isEqualTo(dagsatsBruker); - assertThat(arbfor.getDagsats()).isEqualTo(dagsatsBruker + dagsatsRefusjon); - } - - private void verifiserArbfor(List arbeidsforhold, String orgnr, int forventetDagsatsBrukersAndel, int forventetDagsatsRefusjon) { - Optional arbforOpt = arbeidsforhold.stream().filter(a -> a.getArbeidsgiverId().equals(orgnr)).findFirst(); - assertThat(arbforOpt).isPresent(); - BeregningsgrunnlagPrArbeidsforhold arbfor = arbforOpt.get(); - assertThat(arbfor.getDagsatsArbeidsgiver()).isEqualTo(forventetDagsatsRefusjon); - assertThat(arbfor.getDagsatsBruker()).isEqualTo(forventetDagsatsBrukersAndel); - assertThat(arbfor.getDagsats()).isEqualTo(forventetDagsatsBrukersAndel + forventetDagsatsRefusjon); - } - - private void leggTilNæring(int brutto, int utbetaingsgrad, Long andelsnr) { - var andel = BeregningsgrunnlagPrStatus - .builder() - .medAktivitetStatus(AktivitetStatus.SN) - .medBruttoPrÅr(BigDecimal.valueOf(brutto)) - .medUtbetalingsprosent(BigDecimal.valueOf(utbetaingsgrad)) - .medAndelNr(andelsnr) - .build(); - andel.setErSøktYtelseFor( utbetaingsgrad != 0); - BeregningsgrunnlagPeriode.oppdater(PERIODE) - .medBeregningsgrunnlagPrStatus(andel); - } - - private void leggTilArbeidsforhold(BeregningsgrunnlagPeriode periode, - long andelsnr, - String orgnr, - double beregnetPrÅr, - double refusjonPrÅr, - double utbetalingsgrad) { - leggTilArbeidsforhold(periode, andelsnr, orgnr, null, beregnetPrÅr, refusjonPrÅr, utbetalingsgrad); - } - - private void leggTilFrilans(int brutto, int utbetaingsgrad, Long andelsnr) { - Arbeidsforhold arbeidsforhold = Arbeidsforhold.frilansArbeidsforhold(); - BeregningsgrunnlagPrStatus atfl = PERIODE.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL); - - if (atfl == null) { - BeregningsgrunnlagPeriode.oppdater(PERIODE) - .medBeregningsgrunnlagPrStatus(BeregningsgrunnlagPrStatus - .builder() - .medAktivitetStatus(AktivitetStatus.ATFL) - .medArbeidsforhold(lagBeregningsgrunnlagPrArbeidsforhold(andelsnr, brutto, 0, utbetaingsgrad, arbeidsforhold)) - .build()); - } else { - BeregningsgrunnlagPrStatus.builder(atfl) - .medArbeidsforhold(lagBeregningsgrunnlagPrArbeidsforhold(andelsnr, brutto, 0, utbetaingsgrad, arbeidsforhold)) - .build(); - } } - - private void leggTilArbeidsforhold(BeregningsgrunnlagPeriode periode, - long andelsnr, - String orgnr, - String arbeidsforholdId, - double beregnetPrÅr, - double refusjonPrÅr, - double utbetalingsgrad) { - Arbeidsforhold arbeidsforhold = Arbeidsforhold.nyttArbeidsforholdHosVirksomhet(orgnr, arbeidsforholdId); - BeregningsgrunnlagPrStatus atfl = periode.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL); - - if (atfl == null) { - BeregningsgrunnlagPeriode.oppdater(periode) - .medBeregningsgrunnlagPrStatus(BeregningsgrunnlagPrStatus - .builder() - .medAktivitetStatus(AktivitetStatus.ATFL) - .medArbeidsforhold(lagBeregningsgrunnlagPrArbeidsforhold(andelsnr, beregnetPrÅr, refusjonPrÅr, utbetalingsgrad, arbeidsforhold)) - .build()); - } else { - BeregningsgrunnlagPrStatus.builder(atfl) - .medArbeidsforhold(lagBeregningsgrunnlagPrArbeidsforhold(andelsnr, beregnetPrÅr, refusjonPrÅr, utbetalingsgrad, arbeidsforhold)) - .build(); - } - } - - private BeregningsgrunnlagPrArbeidsforhold lagBeregningsgrunnlagPrArbeidsforhold(long andelsnr, - double beregnetPrÅr, - double refusjonskrav, - double utbetalingsgrad, - Arbeidsforhold arbeidsforhold) { - BeregningsgrunnlagPrArbeidsforhold arb = BeregningsgrunnlagPrArbeidsforhold.builder() - .medAndelNr(andelsnr) - .medArbeidsforhold(arbeidsforhold) - .medBruttoPrÅr(BigDecimal.valueOf(beregnetPrÅr)) - .medRefusjonPrÅr(BigDecimal.valueOf(refusjonskrav)) - .medUtbetalingsprosent(BigDecimal.valueOf(utbetalingsgrad)) - .build(); - arb.setErSøktYtelseFor(utbetalingsgrad > 0); - return arb; - } - - - private RegelResultat kjørRegelFinnGrenseverdi(BeregningsgrunnlagPeriode grunnlag) { - return new RegelFinnGrenseverdiMedFordeling(grunnlag).evaluerRegel(grunnlag); - } - - private RegelResultat kjørRegelFullførBeregningsgrunnlag(BeregningsgrunnlagPeriode grunnlag) { - return new RegelFullføreBeregningsgrunnlag(grunnlag).evaluerRegel(grunnlag); - } + public static final String ORGNR1 = "910"; + private static final String ORGNR2 = "974760673"; + private static final String ORGNR3 = "976967631"; + private static final String ARB_ID_1 = "arbeidsforholdId_1"; + private static final String ARB_ID_2 = "arbeidsforholdId_2"; + private static final String ARB_ID_3 = "arbeidsforholdId_3"; + private static final BigDecimal GRUNNBELØP = BigDecimal.valueOf(100_000); + + private static BeregningsgrunnlagPeriode PERIODE = BeregningsgrunnlagPeriode.builder() + .medPeriode(Periode.of(LocalDate.now(), TIDENES_ENDE)) + .build(); + + + @BeforeEach + void setup() { + PERIODE = BeregningsgrunnlagPeriode.builder() + .medPeriode(Periode.of(LocalDate.now(), TIDENES_ENDE)) + .build(); + Beregningsgrunnlag.builder() + .medBeregningsgrunnlagPeriode(PERIODE) + .medGrunnbeløp(GRUNNBELØP); + } + + @Test + void to_arbeidsforhold_hel_og_halv_utbetaling_kun_penger_til_refusjon() { + //Arrange + double bruttoEn = 624_000; + double refusjonEn = 600_000; + var utbetalingsgradEn = 50; + + double bruttoTo = 576_000; + double refusjonTo = 480_000; + var utbetalingsgradTo = 100; + + BeregningsgrunnlagPeriode periode = BeregningsgrunnlagPeriode.builder() + .medPeriode(Periode.of(LocalDate.now(), TIDENES_ENDE)) + .build(); + + var grunnbeløp = BigDecimal.valueOf(99_858L); + Beregningsgrunnlag.builder() + .medBeregningsgrunnlagPeriode(periode) + .medGrunnbeløp(grunnbeløp); + + leggTilArbeidsforhold(periode, 1L, ORGNR1, bruttoEn, refusjonEn, utbetalingsgradEn); + leggTilArbeidsforhold(periode, 2L, ORGNR2, bruttoTo, refusjonTo, utbetalingsgradTo); + + //Act + kjørRegelFinnGrenseverdi(periode); + kjørRegelFullførBeregningsgrunnlag(periode); + + assertThat(periode.getGrenseverdi()).isEqualByComparingTo(BigDecimal.valueOf(443369.52)); + List arbeidsforhold = periode.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL).getArbeidsforhold(); + + verifiserArbfor(arbeidsforhold, ORGNR1, 0, 599); + verifiserArbfor(arbeidsforhold, ORGNR2, 0, 1106); + } + + @Test + void to_arbeidsforhold_hel_og_halv_utbetaling_penger_til_bruker_og_refusjon() { + //Arrange + double bruttoEn = 624_000; + double refusjonEn = 300_000; + + double bruttoTo = 576_000; + double refusjonTo = 200_000; + + BeregningsgrunnlagPeriode periode = BeregningsgrunnlagPeriode.builder() + .medPeriode(Periode.of(LocalDate.now(), TIDENES_ENDE)) + .build(); + + Beregningsgrunnlag.builder() + .medBeregningsgrunnlagPeriode(periode) + .medGrunnbeløp(BigDecimal.valueOf(99_858L)); + + leggTilArbeidsforhold(periode, 1L, ORGNR1, bruttoEn, refusjonEn, 50); + leggTilArbeidsforhold(periode, 2L, ORGNR2, bruttoTo, refusjonTo, 100); + + //Act + kjørRegelFinnGrenseverdi(periode); + kjørRegelFullførBeregningsgrunnlag(periode); + + assertThat(periode.getGrenseverdi()).isEqualByComparingTo(BigDecimal.valueOf(443369.52)); + List arbeidsforhold = periode.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL).getArbeidsforhold(); + + verifiserArbfor(arbeidsforhold, ORGNR1, 22, 577); + verifiserArbfor(arbeidsforhold, ORGNR2, 337, 769); + } + + @Test + void tre_arbeidsforhold_halv_og_halv_og_ingen_utbetaling_penger_til_bruker_og_refusjon() { + //Arrange + double bruttoEn = 600_000; + double refusjonEn = 560_000.04; + + double bruttoTo = 750_000; + double refusjonTo = 333_333.36; + + double bruttoTre = 250_000; + double refusjonTre = 0; + + BeregningsgrunnlagPeriode periode = BeregningsgrunnlagPeriode.builder() + .medPeriode(Periode.of(LocalDate.now(), TIDENES_ENDE)) + .build(); + + Beregningsgrunnlag.builder() + .medBeregningsgrunnlagPeriode(periode) + .medGrunnbeløp(BigDecimal.valueOf(99_858L)); + + leggTilArbeidsforhold(periode, 1L, ORGNR1, bruttoEn, refusjonEn, 100); + leggTilArbeidsforhold(periode, 2L, ORGNR2, bruttoTo, refusjonTo, 60); + leggTilArbeidsforhold(periode, 3L, ORGNR3, bruttoTre, refusjonTre, 0); + + //Act + kjørRegelFinnGrenseverdi(periode); + kjørRegelFullførBeregningsgrunnlag(periode); + assertThat(periode.getGrenseverdi()).isEqualByComparingTo(BigDecimal.valueOf(393190.875)); + List arbeidsforhold = periode.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL).getArbeidsforhold(); + + verifiserArbfor(arbeidsforhold, ORGNR1, 0, 864); + verifiserArbfor(arbeidsforhold, ORGNR2, 0, 648); + verifiserArbfor(arbeidsforhold, ORGNR3, 0, 0); + } + + @Test + void skal_teste_et_arbeidsforhold_med_refusjon_over_6G() { + // Arrange + leggTilArbeidsforhold(PERIODE, 1L, ORGNR1, ARB_ID_1, 612_000, 612_000, 100); + + // Act + var grenseverdiRegelesultat = kjørRegelFinnGrenseverdi(PERIODE); + var regelResultat = kjørRegelFullførBeregningsgrunnlag(PERIODE); + + // Assert + List arbeidsforhold = PERIODE.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL).getArbeidsforhold(); + assertPeriode(612_000, PERIODE.getGrenseverdi(), PERIODE.getGrenseverdi()); + assertArbeidsforhold(arbeidsforhold, ORGNR1, BigDecimal.ZERO, PERIODE.getGrenseverdi(), PERIODE.getGrenseverdi()); + assertThat(grenseverdiRegelesultat).isNotNull(); + assertThat(regelResultat).isNotNull(); + } + + @Test + void skal_teste_to_arbeidsforhold_beregningsgrunnlag_under_6G_full_refusjon_gradert() { + // Arrange + leggTilArbeidsforhold(PERIODE, 1L, ORGNR1, ARB_ID_1, 200_000, 200_000, 100); + leggTilArbeidsforhold(PERIODE, 2L, ORGNR2, ARB_ID_2, 300_000, 300_000, 50); + + // Assert + var grenseverdiRegelesultat = kjørRegelFinnGrenseverdi(PERIODE); + var regelResultat = kjørRegelFullførBeregningsgrunnlag(PERIODE); + + // Assert + List arbeidsforhold = PERIODE.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL).getArbeidsforhold(); + assertPeriode(500_000, 350_000, 350_000); + assertArbeidsforhold(arbeidsforhold, ORGNR1, BigDecimal.ZERO, BigDecimal.valueOf(200_000), BigDecimal.valueOf(200_000)); + assertArbeidsforhold(arbeidsforhold, ORGNR2, BigDecimal.ZERO, BigDecimal.valueOf(150_000), BigDecimal.valueOf(150_000)); + assertThat(grenseverdiRegelesultat).isNotNull(); + assertThat(regelResultat).isNotNull(); + } + + @Test + void næring_med_beregningsgrunnlag_under_6G() { + // Arrange + leggTilNæring(300_000, 100, 1L); + + // Assert + var grenseverdiRegelesultat = kjørRegelFinnGrenseverdi(PERIODE); + var regelResultat = kjørRegelFullførBeregningsgrunnlag(PERIODE); + + // Assert + assertPeriode(300_000, 300_000, 300_000); + assertAndel(BigDecimal.valueOf(300_000), BigDecimal.valueOf(300_000)); + assertThat(grenseverdiRegelesultat).isNotNull(); + assertThat(regelResultat).isNotNull(); + } + + @Test + void næring_med_beregningsgrunnlag_under_6G_ikke_søkt_ytelse() { + // Arrange + leggTilNæring(300_000, 0, 1L); + + // Act + var grenseverdiRegelesultat = kjørRegelFinnGrenseverdi(PERIODE); + var regelResultat = kjørRegelFullførBeregningsgrunnlag(PERIODE); + + // Assert + assertPeriode(300_000, 0, 0); + assertAndel(BigDecimal.ZERO, BigDecimal.ZERO); + assertThat(grenseverdiRegelesultat).isNotNull(); + assertThat(regelResultat).isNotNull(); + } + + @Test + void næring_med_beregningsgrunnlag_under_6G_delvis_søkt_ytelse() { + // Arrange + leggTilNæring(300_000, 50, 1L); + + // Act + var grenseverdiRegelesultat = kjørRegelFinnGrenseverdi(PERIODE); + var regelResultat = kjørRegelFullførBeregningsgrunnlag(PERIODE); + + // Assert + assertPeriode(300_000, 150_000, 150_000); + assertAndel(BigDecimal.valueOf(150_000), BigDecimal.valueOf(150_000)); + assertThat(grenseverdiRegelesultat).isNotNull(); + assertThat(regelResultat).isNotNull(); + } + + @Test + void brukers_andel_med_tilkommet_næring_uten_fordeling() { + // Arrange + var andel = BeregningsgrunnlagPrStatus + .builder() + .medAktivitetStatus(AktivitetStatus.BA) + .medBruttoPrÅr(BigDecimal.valueOf(300_000)) + .medUtbetalingsprosent(BigDecimal.valueOf(100)) + .medAndelNr(1L) + .build(); + andel.setErSøktYtelseFor(true); + + BeregningsgrunnlagPeriode.oppdater(PERIODE) + .medBeregningsgrunnlagPrStatus(andel); + + var snAndel = BeregningsgrunnlagPrStatus + .builder() + .medAktivitetStatus(AktivitetStatus.SN) + .medBruttoPrÅr(null) + .medUtbetalingsprosent(BigDecimal.valueOf(50)) + .medAndelNr(2L) + .build(); + snAndel.setErSøktYtelseFor(true); + BeregningsgrunnlagPeriode.oppdater(PERIODE) + .medBeregningsgrunnlagPrStatus(snAndel); + + + // Act + var grenseverdiRegelesultat = kjørRegelFinnGrenseverdi(PERIODE); + var regelResultat = kjørRegelFullførBeregningsgrunnlag(PERIODE); + + // Assert + assertPeriode(300_000, 300_000, 300_000); + + Assertions.assertThat(snAndel.getAvkortetPrÅr().compareTo(BigDecimal.ZERO)).isEqualTo(0); + Assertions.assertThat(snAndel.getRedusertPrÅr().compareTo(BigDecimal.ZERO)).isEqualTo(0); + + Assertions.assertThat(andel.getAvkortetPrÅr().compareTo(BigDecimal.valueOf(300000))).isEqualTo(0); + Assertions.assertThat(andel.getRedusertPrÅr().compareTo(BigDecimal.valueOf(300000))).isEqualTo(0); + + + assertThat(grenseverdiRegelesultat).isNotNull(); + assertThat(regelResultat).isNotNull(); + } + + @Test + void næring_med_beregningsgrunnlag_over_6G_delvis_søkt_ytelse() { + // Arrange + leggTilNæring(800_000, 50, 1L); + + // Act + var grenseverdiRegelesultat = kjørRegelFinnGrenseverdi(PERIODE); + var regelResultat = kjørRegelFullførBeregningsgrunnlag(PERIODE); + + // Assert + //assertPeriode(800_000‬, 299_574, 299_574); + assertAndel(BigDecimal.valueOf(300_000), BigDecimal.valueOf(300_000)); + assertThat(grenseverdiRegelesultat).isNotNull(); + assertThat(regelResultat).isNotNull(); + } + + @Test + void skal_teste_to_arbeidsforhold_beregningsgrunnlag_over_6G_refusjon_under_6G_gradert() { + // Arrange + leggTilArbeidsforhold(PERIODE, 1L, ORGNR1, ARB_ID_1, 800_000, 200_000, 100); + leggTilArbeidsforhold(PERIODE, 2L, ORGNR2, ARB_ID_2, 200_000, 200_000, 50); + + // Assert + var grenseverdiRegelesultat = kjørRegelFinnGrenseverdi(PERIODE); + var regelResultat = kjørRegelFullførBeregningsgrunnlag(PERIODE); + + // Assert + List arbeidsforhold = PERIODE.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL).getArbeidsforhold(); + assertPeriode(1_000_000, 540_000, 540_000); + assertArbeidsforhold(arbeidsforhold, ORGNR1, BigDecimal.valueOf(240_000), BigDecimal.valueOf(200_000), BigDecimal.valueOf(440_000)); + assertArbeidsforhold(arbeidsforhold, ORGNR2, BigDecimal.valueOf(0), BigDecimal.valueOf(100_000), BigDecimal.valueOf(100_000)); + assertThat(grenseverdiRegelesultat).isNotNull(); + assertThat(regelResultat).isNotNull(); + } + + @Test + void skal_teste_to_arbeidsforhold_med_refusjon_over_6G() { + // Arrange + leggTilArbeidsforhold(PERIODE, 1L, ORGNR1, ARB_ID_1, 600_000, 560_000, 100); + leggTilArbeidsforhold(PERIODE, 2L, ORGNR2, ARB_ID_2, 750_000, 200_000, 100); + leggTilArbeidsforhold(PERIODE, 3L, ORGNR3, ARB_ID_3, 250_000, 0, 0); + + // Assert + var grenseverdiRegelesultat = kjørRegelFinnGrenseverdi(PERIODE); + var regelResultat = kjørRegelFullførBeregningsgrunnlag(PERIODE); + + // Assert + List arbeidsforhold = PERIODE.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL).getArbeidsforhold(); + assertPeriode(1_600_000, 506_250, 506_250); + assertArbeidsforhold(arbeidsforhold, ORGNR1, BigDecimal.ZERO, BigDecimal.valueOf(306_250), null); + assertArbeidsforhold(arbeidsforhold, ORGNR2, BigDecimal.ZERO, BigDecimal.valueOf(200_000), null); + assertArbeidsforhold(arbeidsforhold, ORGNR3, BigDecimal.ZERO, BigDecimal.ZERO, null); + assertThat(grenseverdiRegelesultat).isNotNull(); + assertThat(regelResultat).isNotNull(); + } + + @Test + void skal_teste_to_arbeidsforhold_med_refusjon_under_6G() { + // Arrange + leggTilArbeidsforhold(PERIODE, 1L, ORGNR1, ARB_ID_1, 600_000, 150_000, 100); + leggTilArbeidsforhold(PERIODE, 2L, ORGNR2, ARB_ID_2, 750_000, 200_000, 100); + leggTilArbeidsforhold(PERIODE, 3L, ORGNR3, ARB_ID_3, 250_000, 0, 0); + + // Assert + var grenseverdiRegelesultat = kjørRegelFinnGrenseverdi(PERIODE); + var regelResultat = kjørRegelFullførBeregningsgrunnlag(PERIODE); + + // Assert + List arbeidsforhold = PERIODE.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL).getArbeidsforhold(); + assertPeriode(1_600_000, 506_250, 506_250); + assertArbeidsforhold(arbeidsforhold, ORGNR1, BigDecimal.valueOf(75_000), BigDecimal.valueOf(150_000), BigDecimal.valueOf(225_000)); + assertArbeidsforhold(arbeidsforhold, ORGNR2, BigDecimal.valueOf(81_250), BigDecimal.valueOf(200_000), BigDecimal.valueOf(281_250)); + assertArbeidsforhold(arbeidsforhold, ORGNR3, BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO); + assertThat(grenseverdiRegelesultat).isNotNull(); + assertThat(regelResultat).isNotNull(); + } + + @Test + void skal_teste_to_arbeidsforhold_med_refusjon_og_inntekt_under_6G() { + // Arrange + leggTilArbeidsforhold(PERIODE, 1L, ORGNR1, ARB_ID_1, 150_000, 100_000, 100); + leggTilArbeidsforhold(PERIODE, 2L, ORGNR2, ARB_ID_2, 200_000, 200_000, 100); + leggTilArbeidsforhold(PERIODE, 3L, ORGNR3, ARB_ID_3, 100_000, 0, 0); + + // Assert + var grenseverdiRegelesultat = kjørRegelFinnGrenseverdi(PERIODE); + var regelResultat = kjørRegelFullførBeregningsgrunnlag(PERIODE); + + // Assert + List arbeidsforhold = PERIODE.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL).getArbeidsforhold(); + assertPeriode(450_000, 350_000, 350_000); + assertArbeidsforhold(arbeidsforhold, ORGNR1, BigDecimal.valueOf(50_000), BigDecimal.valueOf(100_000), BigDecimal.valueOf(150_000)); + assertArbeidsforhold(arbeidsforhold, ORGNR2, BigDecimal.ZERO, BigDecimal.valueOf(200_000), BigDecimal.valueOf(200_000)); + assertArbeidsforhold(arbeidsforhold, ORGNR3, BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO); + assertThat(grenseverdiRegelesultat).isNotNull(); + assertThat(regelResultat).isNotNull(); + } + + @Test + void skal_teste_to_arbeidsforhold_med_refusjon_lik_6G_og_inntekt_over_6G_gradert() { + // Arrange + leggTilArbeidsforhold(PERIODE, 1L, ORGNR1, ARB_ID_1, 600_000, 600_000, 100); + leggTilArbeidsforhold(PERIODE, 2L, ORGNR2, ARB_ID_2, 600_000, 0, 50); + + // Assert + var grenseverdiRegelesultat = kjørRegelFinnGrenseverdi(PERIODE); + var regelResultat = kjørRegelFullførBeregningsgrunnlag(PERIODE); + + // Assert + List arbeidsforhold = PERIODE.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL).getArbeidsforhold(); + assertPeriode(1_200_000, 450_000, 450_000); + assertArbeidsforhold(arbeidsforhold, ORGNR1, BigDecimal.ZERO, BigDecimal.valueOf(450_000), BigDecimal.valueOf(450_000)); + assertArbeidsforhold(arbeidsforhold, ORGNR2, BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO); + assertThat(grenseverdiRegelesultat).isNotNull(); + assertThat(regelResultat).isNotNull(); + } + + @Test + void skal_teste_to_arbeidsforhold_med_refusjon_lik_6G_for_begge_og_inntekt_over_6G_gradert() { + // Arrange + leggTilArbeidsforhold(PERIODE, 1L, ORGNR1, ARB_ID_1, 600_000, 600_000, 100); + leggTilArbeidsforhold(PERIODE, 2L, ORGNR2, ARB_ID_2, 600_000, 600_000, 50); + + // Assert + var grenseverdiRegelesultat = kjørRegelFinnGrenseverdi(PERIODE); + var regelResultat = kjørRegelFullførBeregningsgrunnlag(PERIODE); + + // Assert + List arbeidsforhold = PERIODE.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL).getArbeidsforhold(); + assertPeriode(1_200_000, 450_000, 450_000); + assertArbeidsforhold(arbeidsforhold, ORGNR1, BigDecimal.ZERO, BigDecimal.valueOf(300_000), BigDecimal.valueOf(300_000)); + assertArbeidsforhold(arbeidsforhold, ORGNR2, BigDecimal.ZERO, BigDecimal.valueOf(150_000), BigDecimal.valueOf(150_000)); + assertThat(grenseverdiRegelesultat).isNotNull(); + assertThat(regelResultat).isNotNull(); + } + + @Test + void skal_teste_to_arbeidsforhold_med_refusjon_lik_6G_og_1G_og_inntekt_over_6G_gradert() { + // Arrange + leggTilArbeidsforhold(PERIODE, 1L, ORGNR1, ARB_ID_1, 600_000, 600_000, 100); + leggTilArbeidsforhold(PERIODE, 2L, ORGNR2, ARB_ID_2, 600_000, 100_000, 50); + + // Assert + var grenseverdiRegelesultat = kjørRegelFinnGrenseverdi(PERIODE); + var regelResultat = kjørRegelFullførBeregningsgrunnlag(PERIODE); + + // Assert + List arbeidsforhold = PERIODE.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL).getArbeidsforhold(); + assertPeriode(1_200_000, 450_000, 450_000); + assertArbeidsforhold(arbeidsforhold, ORGNR1, BigDecimal.ZERO, BigDecimal.valueOf(400_000), BigDecimal.valueOf(400_000)); + assertArbeidsforhold(arbeidsforhold, ORGNR2, BigDecimal.ZERO, BigDecimal.valueOf(50_000), BigDecimal.valueOf(50_000)); + assertThat(grenseverdiRegelesultat).isNotNull(); + assertThat(regelResultat).isNotNull(); + } + + @Test + void skal_teste_arbeidsforhold_med_refusjon_uten_tilrettelegging_og_tilrettelegging_uten_refusjon() { + // Arrange + leggTilArbeidsforhold(PERIODE, 1L, ORGNR1, ARB_ID_1, 300_000, 150_000, 100); + leggTilArbeidsforhold(PERIODE, 2L, ORGNR2, ARB_ID_2, 210_000, 210_000, 0); + leggTilArbeidsforhold(PERIODE, 3L, ORGNR3, ARB_ID_3, 240_000, 0, 100); + + // Assert + var grenseverdiRegelesultat = kjørRegelFinnGrenseverdi(PERIODE); + var regelResultat = kjørRegelFullførBeregningsgrunnlag(PERIODE); + + // Assert + List arbeidsforhold = PERIODE.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL).getArbeidsforhold(); + assertPeriode(750000, 432_000, 432_000); + assertArbeidsforhold(arbeidsforhold, ORGNR1, BigDecimal.valueOf(90_000), BigDecimal.valueOf(150_000), BigDecimal.valueOf(240_000)); + assertArbeidsforhold(arbeidsforhold, ORGNR2, BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO); + assertArbeidsforhold(arbeidsforhold, ORGNR3, BigDecimal.valueOf(192_000), BigDecimal.ZERO, BigDecimal.valueOf(192_000)); + assertThat(grenseverdiRegelesultat).isNotNull(); + assertThat(regelResultat).isNotNull(); + } + + @Test + void skal_teste_arbeidstaker_med_delvis_søkt_ytelse() { + // Arrange + leggTilArbeidsforhold(PERIODE, 1L, ORGNR1, ARB_ID_1, 300_000, 0, 45); + + // Assert + var grenseverdiRegelesultat = kjørRegelFinnGrenseverdi(PERIODE); + var regelResultat = kjørRegelFullførBeregningsgrunnlag(PERIODE); + + // Assert + List arbeidsforhold = PERIODE.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL).getArbeidsforhold(); + assertPeriode(300_000, 135_000, 135_000); + assertArbeidsforhold(arbeidsforhold, ORGNR1, BigDecimal.valueOf(135_000), BigDecimal.ZERO, BigDecimal.valueOf(135_000)); + assertThat(grenseverdiRegelesultat).isNotNull(); + assertThat(regelResultat).isNotNull(); + } + + @Test + void skal_teste_frilans_med_beregningsgrunnlag_under_6G() { + // Arrange + leggTilFrilans(300_000, 100, 1L); + + // Assert + var grenseverdiRegelesultat = kjørRegelFinnGrenseverdi(PERIODE); + var regelResultat = kjørRegelFullførBeregningsgrunnlag(PERIODE); + + // Assert + assertPeriode(300_000, 300_000, 300_000); + assertFrilans(BigDecimal.valueOf(300_000), BigDecimal.valueOf(300_000), 1154L); + assertThat(grenseverdiRegelesultat).isNotNull(); + assertThat(regelResultat).isNotNull(); + } + + @Test + void skal_teste_frilans_med_beregningsgrunnlag_under_6G_delvis_søkt_ytelse() { + // Arrange + leggTilFrilans(300_000, 50, 1L); + + // Assert + var grenseverdiRegelesultat = kjørRegelFinnGrenseverdi(PERIODE); + var regelResultat = kjørRegelFullførBeregningsgrunnlag(PERIODE); + + // Assert + assertPeriode(300_000, 150_000, 150_000); + assertFrilans(BigDecimal.valueOf(150_000), BigDecimal.valueOf(150_000), 577L); + assertThat(grenseverdiRegelesultat).isNotNull(); + assertThat(regelResultat).isNotNull(); + } + + @Test + void skal_teste_frilans_med_beregningsgrunnlag_under_6G_ikke_søkt_ytelse() { + // Arrange + leggTilFrilans(300_000, 0, 1L); + + // Assert + var grenseverdiRegelesultat = kjørRegelFinnGrenseverdi(PERIODE); + var regelResultat = kjørRegelFullførBeregningsgrunnlag(PERIODE); + + // Assert + assertPeriode(300_000, 0, 0); + assertFrilans(BigDecimal.ZERO, BigDecimal.ZERO, 0L); + assertThat(grenseverdiRegelesultat).isNotNull(); + assertThat(regelResultat).isNotNull(); + } + + @Test + void skal_teste_frilans_og_arbeid_med_beregningsgrunnlag_under_6G_søkt_ytelse_for_alle() { + // Arrange + leggTilFrilans(200_000, 100, 1L); + leggTilArbeidsforhold(PERIODE, 2L, ORGNR1, ARB_ID_1, 200_000, 0, 100); + + // Assert + var grenseverdiRegelesultat = kjørRegelFinnGrenseverdi(PERIODE); + var regelResultat = kjørRegelFullførBeregningsgrunnlag(PERIODE); + + // Assert + assertPeriode(400_000, 400_000, 400_000); + assertFrilans(BigDecimal.valueOf(200_000), BigDecimal.valueOf(200_000), null); + List arbeidsforhold = PERIODE.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL).getArbeidsforhold(); + assertArbeidsforhold(arbeidsforhold, ORGNR1, BigDecimal.valueOf(200_000), BigDecimal.ZERO, BigDecimal.valueOf(200_000)); + assertThat(grenseverdiRegelesultat).isNotNull(); + assertThat(regelResultat).isNotNull(); + } + + @Test + void skal_teste_frilans_og_arbeid_med_beregningsgrunnlag_over_6G_for_arbeid_søkt_ytelse_for_alle() { + // Arrange + leggTilFrilans(200_000, 100, 1L); + leggTilArbeidsforhold(PERIODE, 2L, ORGNR1, ARB_ID_1, 800_000, 0, 100); + + // Assert + var grenseverdiRegelesultat = kjørRegelFinnGrenseverdi(PERIODE); + var regelResultat = kjørRegelFullførBeregningsgrunnlag(PERIODE); + + // Assert + assertPeriode(1_000_000, 600_000, 600_000); + assertFrilans(BigDecimal.ZERO, BigDecimal.ZERO, 0L); + List arbeidsforhold = PERIODE.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL).getArbeidsforhold(); + assertArbeidsforhold(arbeidsforhold, ORGNR1, PERIODE.getGrenseverdi(), BigDecimal.ZERO, PERIODE.getGrenseverdi()); + assertThat(grenseverdiRegelesultat).isNotNull(); + assertThat(regelResultat).isNotNull(); + } + + @Test + void skal_teste_frilans_og_arbeid_med_beregningsgrunnlag_over_6G_for_arbeid_søkt_ytelse_for_frilans() { + // Arrange + leggTilFrilans(200_000, 100, 1L); + leggTilArbeidsforhold(PERIODE, 2L, ORGNR1, ARB_ID_1, 800_000, 0, 0); + + // Assert + var grenseverdiRegelesultat = kjørRegelFinnGrenseverdi(PERIODE); + var regelResultat = kjørRegelFullførBeregningsgrunnlag(PERIODE); + + // Assert + assertPeriode(1_000_000, 0, 0); + assertFrilans(BigDecimal.ZERO, BigDecimal.ZERO, 0L); + List arbeidsforhold = PERIODE.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL).getArbeidsforhold(); + assertArbeidsforhold(arbeidsforhold, ORGNR1, BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO); + assertThat(grenseverdiRegelesultat).isNotNull(); + assertThat(regelResultat).isNotNull(); + } + + @Test + void skal_teste_frilans_og_arbeid_med_beregningsgrunnlag_over_6G_til_sammen_søkt_delvis_ytelse_for_frilans() { + // Arrange + leggTilFrilans(500_000, 50, 1L); + leggTilArbeidsforhold(PERIODE, 2L, ORGNR1, ARB_ID_1, 500_000, 0, 0); + + // Assert + var grenseverdiRegelesultat = kjørRegelFinnGrenseverdi(PERIODE); + var regelResultat = kjørRegelFullførBeregningsgrunnlag(PERIODE); + + // Assert + assertPeriode(1_000_000, 50_000, 50_000); + assertFrilans(BigDecimal.valueOf(50_000), BigDecimal.valueOf(50_000), 192L); + List arbeidsforhold = PERIODE.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL).getArbeidsforhold(); + assertArbeidsforhold(arbeidsforhold, ORGNR1, BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO); + assertThat(grenseverdiRegelesultat).isNotNull(); + assertThat(regelResultat).isNotNull(); + } + + @Test + void skal_teste_frilans_og_to_arbeid_med_beregningsgrunnlag_over_6G_til_sammen_søkt_ytelse_for_alle_med_refusjonkrav_som_overstiger_total_avkortet_for_arbeid() { + // Arrange + leggTilFrilans(500_000, 100, 1L); + leggTilArbeidsforhold(PERIODE, 2L, ORGNR1, ARB_ID_1, 500_000, 500_000, 100); + leggTilArbeidsforhold(PERIODE, 3L, ORGNR2, ARB_ID_2, 500_000, 200_000, 100); + + // Assert + var grenseverdiRegelesultat = kjørRegelFinnGrenseverdi(PERIODE); + var regelResultat = kjørRegelFullførBeregningsgrunnlag(PERIODE); + + // Assert + assertPeriode(1_500_000, 600_000, 600_000); + assertFrilans(BigDecimal.ZERO, BigDecimal.ZERO, 0L); + List arbeidsforhold = PERIODE.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL).getArbeidsforhold(); + assertArbeidsforhold(arbeidsforhold, ORGNR1, BigDecimal.ZERO, BigDecimal.valueOf(400_000), BigDecimal.valueOf(400_000)); + assertArbeidsforhold(arbeidsforhold, ORGNR2, BigDecimal.ZERO, BigDecimal.valueOf(200_000), BigDecimal.valueOf(200_000)); + assertThat(grenseverdiRegelesultat).isNotNull(); + assertThat(regelResultat).isNotNull(); + } + + @Test + void skal_teste_frilans_og_to_arbeid_med_beregningsgrunnlag_over_6G_til_sammen_søkt_ytelse_for_alle_med_refusjonkrav_som_overstiger_total_avkortet_for_arbeid_med_fordeling_av_refusjonskrav() { + // Arrange + leggTilFrilans(500_000, 100, 1L); + leggTilArbeidsforhold(PERIODE, 2L, ORGNR1, ARB_ID_1, 500_000, 500_000, 100); + leggTilArbeidsforhold(PERIODE, 3L, ORGNR2, ARB_ID_2, 500_000, 300_000, 100); + + // Assert + var grenseverdiRegelesultat = kjørRegelFinnGrenseverdi(PERIODE); + var regelResultat = kjørRegelFullførBeregningsgrunnlag(PERIODE); + + // Assert + assertPeriode(1_500_000, 600_000, 600_000); + assertFrilans(BigDecimal.ZERO, BigDecimal.ZERO, 0L); + List arbeidsforhold = PERIODE.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL).getArbeidsforhold(); + assertArbeidsforhold(arbeidsforhold, ORGNR1, BigDecimal.ZERO, BigDecimal.valueOf(300_000), BigDecimal.valueOf(300_000)); + assertArbeidsforhold(arbeidsforhold, ORGNR2, BigDecimal.ZERO, BigDecimal.valueOf(300_000), BigDecimal.valueOf(300_000)); + assertThat(grenseverdiRegelesultat).isNotNull(); + assertThat(regelResultat).isNotNull(); + } + + @Test + void skal_teste_to_arbeidsforhold_hos_en_arbeidsgiver_med_beregningsgrunnlag_over_6G() { + // Arrange + leggTilArbeidsforhold(PERIODE, 2L, ORGNR1, ARB_ID_1, 400_000, 300_000, 100); + leggTilArbeidsforhold(PERIODE, 3L, ORGNR2, ARB_ID_2, 300_000, 300_000, 100); + + // Assert + var grenseverdiRegelesultat = kjørRegelFinnGrenseverdi(PERIODE); + var regelResultat = kjørRegelFullførBeregningsgrunnlag(PERIODE); + + // Assert + assertPeriode(700_000, 600_000, 600_000); + List arbeidsforhold = PERIODE.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL).getArbeidsforhold(); + assertArbeidsforhold(arbeidsforhold, ORGNR1, BigDecimal.ZERO, BigDecimal.valueOf(300_000), BigDecimal.valueOf(300_000)); + assertArbeidsforhold(arbeidsforhold, ORGNR2, BigDecimal.ZERO, BigDecimal.valueOf(300_000), BigDecimal.valueOf(300_000)); + assertThat(grenseverdiRegelesultat).isNotNull(); + assertThat(regelResultat).isNotNull(); + } + + @Test + void skal_teste_to_arbeidsforhold_hos_en_arbeidsgiver_med_beregningsgrunnlag_over_6G_ikke_full_utbetaling() { + // Arrange + leggTilArbeidsforhold(PERIODE, 2L, ORGNR1, ARB_ID_1, 624_000, 300_000, 50); + leggTilArbeidsforhold(PERIODE, 3L, ORGNR2, ARB_ID_2, 576_000, 200_000, 100); + + // Assert + var grenseverdiRegelesultat = kjørRegelFinnGrenseverdi(PERIODE); + var regelResultat = kjørRegelFullførBeregningsgrunnlag(PERIODE); + + // Assert + assertPeriode(1_200_000, 444_000, 444_000); + List arbeidsforhold = PERIODE.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL).getArbeidsforhold(); + assertArbeidsforhold(arbeidsforhold, ORGNR1, BigDecimal.valueOf(6_000), BigDecimal.valueOf(150_000), BigDecimal.valueOf(156_000)); + assertArbeidsforhold(arbeidsforhold, ORGNR2, BigDecimal.valueOf(88_000), BigDecimal.valueOf(200_000), BigDecimal.valueOf(288_000)); + assertThat(grenseverdiRegelesultat).isNotNull(); + assertThat(regelResultat).isNotNull(); + } + + private void assertPeriode(int brutto, int avkortet, int redusert) { + assertPeriode(BigDecimal.valueOf(brutto), BigDecimal.valueOf(avkortet), BigDecimal.valueOf(redusert)); + } + + private void assertPeriode(int brutto, BigDecimal avkortet, BigDecimal redusert) { + assertPeriode(BigDecimal.valueOf(brutto), avkortet, redusert); + } + + private void assertPeriode(BigDecimal brutto, BigDecimal avkortet, BigDecimal redusert) { + Assertions.assertThat(PERIODE.getBruttoPrÅr()).isEqualByComparingTo(brutto); + Assertions.assertThat(PERIODE.getAvkortetPrÅr()).isEqualByComparingTo(avkortet); + Assertions.assertThat(PERIODE.getRedusertPrÅr()).isEqualByComparingTo(redusert); + } + + private void assertAndel(BigDecimal bruker, BigDecimal avkortet) { + var andel = PERIODE.getBeregningsgrunnlagPrStatus(AktivitetStatus.SN); + BigDecimal total = bruker.add(BigDecimal.ZERO); + Assertions.assertThat(andel.getAvkortetPrÅr()).isEqualByComparingTo(Objects.requireNonNullElse(avkortet, total)); + Assertions.assertThat(andel.getRedusertPrÅr()).isEqualByComparingTo(total); + } + + private void assertFrilans(BigDecimal bruker, BigDecimal avkortet, Long dagsats) { + var andel = PERIODE.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL); + BigDecimal total = bruker.add(BigDecimal.ZERO); + Optional frilansOpt = andel.getArbeidsforhold().stream().filter(BeregningsgrunnlagPrArbeidsforhold::erFrilanser).findFirst(); + assertThat(frilansOpt).isPresent(); + BeregningsgrunnlagPrArbeidsforhold frilansAndel = frilansOpt.get(); + assertThat(frilansAndel.getAvkortetPrÅr()).isEqualByComparingTo(Objects.requireNonNullElse(avkortet, total)); + assertThat(frilansAndel.getRedusertPrÅr()).isEqualByComparingTo(total); + if (dagsats != null) { + assertThat(frilansAndel.getDagsats()).isEqualByComparingTo(dagsats); + } + } + + private void assertArbeidsforhold(List arbeidsforhold, String orgnr, BigDecimal bruker, BigDecimal refusjon, BigDecimal avkortet) { + Function calcDagsats = a -> a.divide(BigDecimal.valueOf(260), 0, RoundingMode.HALF_UP).longValue(); + Optional arbforOpt = arbeidsforhold.stream().filter(a -> Objects.equals(a.getArbeidsgiverId(), orgnr)).findFirst(); + BigDecimal total = bruker.add(refusjon); + + assertThat(arbforOpt).isPresent(); + BeregningsgrunnlagPrArbeidsforhold arbfor = arbforOpt.get(); + + Assertions.assertThat(arbfor.getAvkortetPrÅr()).isEqualByComparingTo(Objects.requireNonNullElse(avkortet, total)); + assertThat(arbfor.getRedusertPrÅr()).isEqualByComparingTo(total); + + Long dagsatsRefusjon = calcDagsats.apply(refusjon); + Long dagsatsBruker = calcDagsats.apply(bruker); + assertThat(arbfor.getDagsatsArbeidsgiver()).isEqualTo(dagsatsRefusjon); + assertThat(arbfor.getDagsatsBruker()).isEqualTo(dagsatsBruker); + assertThat(arbfor.getDagsats()).isEqualTo(dagsatsBruker + dagsatsRefusjon); + } + + private void verifiserArbfor(List arbeidsforhold, String orgnr, int forventetDagsatsBrukersAndel, int forventetDagsatsRefusjon) { + Optional arbforOpt = arbeidsforhold.stream().filter(a -> a.getArbeidsgiverId().equals(orgnr)).findFirst(); + assertThat(arbforOpt).isPresent(); + BeregningsgrunnlagPrArbeidsforhold arbfor = arbforOpt.get(); + assertThat(arbfor.getDagsatsArbeidsgiver()).isEqualTo(forventetDagsatsRefusjon); + assertThat(arbfor.getDagsatsBruker()).isEqualTo(forventetDagsatsBrukersAndel); + assertThat(arbfor.getDagsats()).isEqualTo(forventetDagsatsBrukersAndel + forventetDagsatsRefusjon); + } + + private void leggTilNæring(int brutto, int utbetaingsgrad, Long andelsnr) { + var andel = BeregningsgrunnlagPrStatus + .builder() + .medAktivitetStatus(AktivitetStatus.SN) + .medBruttoPrÅr(BigDecimal.valueOf(brutto)) + .medUtbetalingsprosent(BigDecimal.valueOf(utbetaingsgrad)) + .medAndelNr(andelsnr) + .build(); + andel.setErSøktYtelseFor(utbetaingsgrad != 0); + BeregningsgrunnlagPeriode.oppdater(PERIODE) + .medBeregningsgrunnlagPrStatus(andel); + } + + private void leggTilArbeidsforhold(BeregningsgrunnlagPeriode periode, + long andelsnr, + String orgnr, + double beregnetPrÅr, + double refusjonPrÅr, + double utbetalingsgrad) { + leggTilArbeidsforhold(periode, andelsnr, orgnr, null, beregnetPrÅr, refusjonPrÅr, utbetalingsgrad); + } + + private void leggTilFrilans(int brutto, int utbetaingsgrad, Long andelsnr) { + Arbeidsforhold arbeidsforhold = Arbeidsforhold.frilansArbeidsforhold(); + BeregningsgrunnlagPrStatus atfl = PERIODE.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL); + + if (atfl == null) { + BeregningsgrunnlagPeriode.oppdater(PERIODE) + .medBeregningsgrunnlagPrStatus(BeregningsgrunnlagPrStatus + .builder() + .medAktivitetStatus(AktivitetStatus.ATFL) + .medArbeidsforhold(lagBeregningsgrunnlagPrArbeidsforhold(andelsnr, brutto, 0, utbetaingsgrad, arbeidsforhold)) + .build()); + } else { + BeregningsgrunnlagPrStatus.builder(atfl) + .medArbeidsforhold(lagBeregningsgrunnlagPrArbeidsforhold(andelsnr, brutto, 0, utbetaingsgrad, arbeidsforhold)) + .build(); + } + } + + private void leggTilArbeidsforhold(BeregningsgrunnlagPeriode periode, + long andelsnr, + String orgnr, + String arbeidsforholdId, + double beregnetPrÅr, + double refusjonPrÅr, + double utbetalingsgrad) { + Arbeidsforhold arbeidsforhold = Arbeidsforhold.nyttArbeidsforholdHosVirksomhet(orgnr, arbeidsforholdId); + BeregningsgrunnlagPrStatus atfl = periode.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL); + + if (atfl == null) { + BeregningsgrunnlagPeriode.oppdater(periode) + .medBeregningsgrunnlagPrStatus(BeregningsgrunnlagPrStatus + .builder() + .medAktivitetStatus(AktivitetStatus.ATFL) + .medArbeidsforhold(lagBeregningsgrunnlagPrArbeidsforhold(andelsnr, beregnetPrÅr, refusjonPrÅr, utbetalingsgrad, arbeidsforhold)) + .build()); + } else { + BeregningsgrunnlagPrStatus.builder(atfl) + .medArbeidsforhold(lagBeregningsgrunnlagPrArbeidsforhold(andelsnr, beregnetPrÅr, refusjonPrÅr, utbetalingsgrad, arbeidsforhold)) + .build(); + } + } + + private BeregningsgrunnlagPrArbeidsforhold lagBeregningsgrunnlagPrArbeidsforhold(long andelsnr, + double beregnetPrÅr, + double refusjonskrav, + double utbetalingsgrad, + Arbeidsforhold arbeidsforhold) { + BeregningsgrunnlagPrArbeidsforhold arb = BeregningsgrunnlagPrArbeidsforhold.builder() + .medAndelNr(andelsnr) + .medArbeidsforhold(arbeidsforhold) + .medBruttoPrÅr(BigDecimal.valueOf(beregnetPrÅr)) + .medRefusjonPrÅr(BigDecimal.valueOf(refusjonskrav)) + .medUtbetalingsprosent(BigDecimal.valueOf(utbetalingsgrad)) + .build(); + arb.setErSøktYtelseFor(utbetalingsgrad > 0); + return arb; + } + + + private RegelResultat kjørRegelFinnGrenseverdi(BeregningsgrunnlagPeriode grunnlag) { + return new RegelFinnGrenseverdiMedFordeling(grunnlag).evaluerRegel(grunnlag); + } + + private RegelResultat kjørRegelFullførBeregningsgrunnlag(BeregningsgrunnlagPeriode grunnlag) { + return new RegelFullføreBeregningsgrunnlag(grunnlag).evaluerRegel(grunnlag); + } }