diff --git a/src/main/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/FastsettePerioderRegelOrkestrering.java b/src/main/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/FastsettePerioderRegelOrkestrering.java index 3ff8cc8c..8d6d0b15 100644 --- a/src/main/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/FastsettePerioderRegelOrkestrering.java +++ b/src/main/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/FastsettePerioderRegelOrkestrering.java @@ -201,12 +201,18 @@ private RegelResultatBehandlerResultat behandleRegelresultat(Evaluation evalueri regelGrunnlag) ? SamtidigUttakUtil.uttaksprosentAnnenpart(fastsettePeriodeGrunnlag) : SamtidigUttaksprosent.ZERO; return switch (utfallType) { - case AVSLÅTT -> behandler.avslåAktuellPeriode(aktuellPeriode, regelresultat, knekkpunktOpt); + case AVSLÅTT -> behandler.avslåAktuellPeriode(aktuellPeriode, regelresultat, knekkpunktOpt, + overlapperMedInnvilgetAnnenpartsPeriode(aktuellPeriode, annenpartUttaksperioder(regelGrunnlag))); case INNVILGET -> behandler.innvilgAktuellPeriode(aktuellPeriode, knekkpunktOpt, regelresultat, annenpartSamtidigUttaksprosent); case MANUELL_BEHANDLING -> behandler.manuellBehandling(aktuellPeriode, regelresultat); }; } + private boolean overlapperMedInnvilgetAnnenpartsPeriode(OppgittPeriode aktuellPeriode, List annenPartUttaksperioder) { + return annenPartUttaksperioder.stream() + .anyMatch(annenpartsPeriode -> annenpartsPeriode.overlapper(aktuellPeriode) && annenpartsPeriode.isInnvilget()); + } + private List annenpartUttaksperioder(RegelGrunnlag regelGrunnlag) { return regelGrunnlag.getAnnenPart() == null ? Collections.emptyList() : regelGrunnlag.getAnnenPart().getUttaksperioder(); } diff --git a/src/main/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/RegelResultatBehandler.java b/src/main/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/RegelResultatBehandler.java index 14a3ff86..558e2a49 100644 --- a/src/main/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/RegelResultatBehandler.java +++ b/src/main/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/RegelResultatBehandler.java @@ -2,15 +2,11 @@ import static no.nav.foreldrepenger.regler.uttak.fastsetteperiode.ValgAvStønadskontoTjeneste.velgStønadskonto; -import java.math.BigDecimal; -import java.util.Collections; -import java.util.List; import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; import no.nav.foreldrepenger.regler.uttak.fastsetteperiode.grunnlag.AktivitetIdentifikator; -import no.nav.foreldrepenger.regler.uttak.fastsetteperiode.grunnlag.AnnenpartUttakPeriode; import no.nav.foreldrepenger.regler.uttak.fastsetteperiode.grunnlag.OppgittPeriode; import no.nav.foreldrepenger.regler.uttak.fastsetteperiode.grunnlag.Perioderesultattype; import no.nav.foreldrepenger.regler.uttak.fastsetteperiode.grunnlag.RegelGrunnlag; @@ -56,8 +52,8 @@ RegelResultatBehandlerResultat innvilgAktuellPeriode(OppgittPeriode oppgittPerio RegelResultatBehandlerResultat avslåAktuellPeriode(OppgittPeriode oppgittPeriode, FastsettePerioderRegelresultat regelresultat, - Optional knekkpunktOpt) { - var overlapperInnvilgetAnnenpartsPeriode = overlapperMedInnvilgetAnnenpartsPeriode(oppgittPeriode, annenpartUttaksperioder(regelGrunnlag)); + Optional knekkpunktOpt, + boolean overlapperInnvilgetAnnenpartsPeriode) { var avslåPeriode = knekkpunktOpt.map(TomKontoKnekkpunkt::dato) .filter(d -> !overlapperInnvilgetAnnenpartsPeriode) .map(knekkdato -> oppgittPeriode.kopiMedNyPeriode(oppgittPeriode.getFom(), knekkdato.minusDays(1))) @@ -143,10 +139,10 @@ private PeriodeAktivitetResultat finnPeriodeAktivitetResultat(OppgittPeriode opp return new PeriodeAktivitetResultat(Utbetalingsgrad.ZERO, Trekkdager.ZERO); } - var skalRedusereUtbetalingsgradMedFulleTrekkdagerPgaDelvisGodkjentArbeid = skalRedusereUtbetalingsgradMedFulleTrekkdagerPgaDelvisGodkjentArbeid(oppgittPeriode, aktivitet); + var graderingInnvilget = regelresultat.getGraderingIkkeInnvilgetÅrsak() == null && oppgittPeriode.erSøktGradering(aktivitet); var utbetalingsgrad = Utbetalingsgrad.ZERO; if (regelresultat.skalUtbetale()) { - var utbetalingsgradUtregning = bestemUtbetalingsgradUtregning(oppgittPeriode, aktivitet, skalRedusereUtbetalingsgradMedFulleTrekkdagerPgaDelvisGodkjentArbeid, annenpartSamtidigUttaksprosent); + var utbetalingsgradUtregning = bestemUtbetalingsgradUtregning(oppgittPeriode, aktivitet, annenpartSamtidigUttaksprosent, graderingInnvilget); utbetalingsgrad = utbetalingsgradUtregning.resultat(); } var trekkdager = Trekkdager.ZERO; @@ -154,34 +150,13 @@ private PeriodeAktivitetResultat finnPeriodeAktivitetResultat(OppgittPeriode opp if (manuellBehandling && stønadskonto.isEmpty()) { trekkdager = Trekkdager.ZERO; } else { - var graderingInnvilget = regelresultat.getGraderingIkkeInnvilgetÅrsak() == null && oppgittPeriode.erSøktGradering(aktivitet); trekkdager = TrekkdagerUtregningUtil.trekkdagerFor(oppgittPeriode, graderingInnvilget, oppgittPeriode.getArbeidsprosent(), - regnSamtidigUttaksprosentMotGradering(oppgittPeriode, annenpartSamtidigUttaksprosent), skalRedusereUtbetalingsgradMedFulleTrekkdagerPgaDelvisGodkjentArbeid); + regnSamtidigUttaksprosentMotGradering(oppgittPeriode, annenpartSamtidigUttaksprosent)); } } return new PeriodeAktivitetResultat(utbetalingsgrad, trekkdager); } - private boolean skalRedusereUtbetalingsgradMedFulleTrekkdagerPgaDelvisGodkjentArbeid(OppgittPeriode oppgittPeriode, AktivitetIdentifikator aktivitet) { - if (oppgittPeriode.getMorsStillingsprosent() == null) { - return false; - } - - if (oppgittPeriode.erSøktSamtidigUttak() || overlapperMedInnvilgetAnnenpartsPeriode(oppgittPeriode, annenpartUttaksperioder(regelGrunnlag))) { - return false; - } - - if (oppgittPeriode.erSøktGradering(aktivitet) && gradertUttakMindreEnnMorsStillingsprosent(oppgittPeriode)) { - return false; - } - return true; - } - - private static boolean gradertUttakMindreEnnMorsStillingsprosent(OppgittPeriode oppgittPeriode) { - return BigDecimal.valueOf(100).subtract(oppgittPeriode.getArbeidsprosent()) - .compareTo(oppgittPeriode.getMorsStillingsprosent().decimalValue()) < 0; - } - private boolean isHarIgjenTrekkdager(OppgittPeriode oppgittPeriode, AktivitetIdentifikator aktivitet, FastsettePerioderRegelresultat regelresultat, @@ -207,31 +182,22 @@ private void validerKnekkpunkt(OppgittPeriode uttakPeriode, TomKontoKnekkpunkt k private UtbetalingsgradUtregning bestemUtbetalingsgradUtregning(OppgittPeriode oppgittPeriode, AktivitetIdentifikator aktivitet, - boolean skalRedusereUtbetalingsgradMedFulleTrekkdagerPgaDelvisGodkjentArbeid, - SamtidigUttaksprosent annenpartSamtidigUttaksprosent) { - if (skalRedusereUtbetalingsgradMedFulleTrekkdagerPgaDelvisGodkjentArbeid) { - return new UtbetalingsgradMorsStillingsprosentUtregning(oppgittPeriode.getMorsStillingsprosent(), annenpartSamtidigUttaksprosent); - } - if (oppgittPeriode.erSøktGradering(aktivitet)) { + SamtidigUttaksprosent annenpartSamtidigUttaksprosent, + boolean graderingInnvilget) { + if (graderingInnvilget) { return new UtbetalingsgradMedGraderingUtregning(oppgittPeriode, aktivitet, annenpartSamtidigUttaksprosent); } var samtidigUttaksprosent = regnSamtidigUttaksprosentMotGradering(oppgittPeriode, annenpartSamtidigUttaksprosent); if (samtidigUttaksprosent != null) { return new UtbetalingsgradSamtidigUttakUtregning(samtidigUttaksprosent, oppgittPeriode.getArbeidsprosent(), annenpartSamtidigUttaksprosent); } + if (oppgittPeriode.getMorsStillingsprosent() != null) { + return new UtbetalingsgradMorsStillingsprosentUtregning(oppgittPeriode.getMorsStillingsprosent(), annenpartSamtidigUttaksprosent); + } return new UtbetalingsgradUtenGraderingUtregning(annenpartSamtidigUttaksprosent); } - private static List annenpartUttaksperioder(RegelGrunnlag regelGrunnlag) { - return regelGrunnlag.getAnnenPart() == null ? Collections.emptyList() : regelGrunnlag.getAnnenPart().getUttaksperioder(); - } - - private static boolean overlapperMedInnvilgetAnnenpartsPeriode(OppgittPeriode aktuellPeriode, List annenPartUttaksperioder) { - return annenPartUttaksperioder.stream() - .anyMatch(annenpartsPeriode -> annenpartsPeriode.overlapper(aktuellPeriode) && annenpartsPeriode.isInnvilget()); - } - private record PeriodeAktivitetResultat(Utbetalingsgrad utbetalingsgrad, Trekkdager trekkdager) { } } diff --git a/src/main/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/TrekkdagerUtregningUtil.java b/src/main/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/TrekkdagerUtregningUtil.java index ff9d3e83..be9c9c6b 100644 --- a/src/main/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/TrekkdagerUtregningUtil.java +++ b/src/main/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/TrekkdagerUtregningUtil.java @@ -12,15 +12,11 @@ private TrekkdagerUtregningUtil() { } public static Trekkdager trekkdagerFor(Periode periode, - boolean gradert, + boolean graderingInnvilget, BigDecimal gradertArbeidstidsprosent, - SamtidigUttaksprosent samtidigUttaksprosent, - boolean skalRedusereUtbetalingsgradMedFulleTrekkdagerPgaDelvisGodkjentArbeid) { + SamtidigUttaksprosent samtidigUttaksprosent) { var trekkdagerUtenGradering = Virkedager.beregnAntallVirkedager(periode); - if (skalRedusereUtbetalingsgradMedFulleTrekkdagerPgaDelvisGodkjentArbeid) { - return new Trekkdager(trekkdagerUtenGradering); - } - if (gradert) { + if (graderingInnvilget) { return trekkdagerMedGradering(trekkdagerUtenGradering, gradertArbeidstidsprosent); } if (samtidigUttaksprosent != null) { diff --git a/src/main/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/regelflyt/FellesperiodeDelregel.java b/src/main/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/regelflyt/FellesperiodeDelregel.java index c0356485..732238a3 100644 --- a/src/main/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/regelflyt/FellesperiodeDelregel.java +++ b/src/main/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/regelflyt/FellesperiodeDelregel.java @@ -219,8 +219,8 @@ private Specification sjekkOmMorErIArbeidMedStillingpr private Specification sjekkOmSøktUttaksprosentErStørreEllerLikMorsStillingsprosent() { return rs.hvisRegel(SjekkOmSøktUttaksprosentErStørreEllerLikMorsStillingsprosent.ID, SjekkOmSøktUttaksprosentErStørreEllerLikMorsStillingsprosent.BESKRIVELSE) - .hvis(new SjekkOmSøktUttaksprosentErStørreEllerLikMorsStillingsprosent(), Oppfylt.opprett("UT1272", InnvilgetÅrsak.GRADERING_FELLESPERIODE_ELLER_FORELDREPENGER, true)) // TODO - .ellers(Manuellbehandling.opprett("UT1330", InnvilgetÅrsak.GRADERING_FELLESPERIODE_ELLER_FORELDREPENGER, Manuellbehandlingårsak.AKTIVITETSKRAV_DELVIS_ARBEID, true, true)); + .hvis(new SjekkOmSøktUttaksprosentErStørreEllerLikMorsStillingsprosent(), Oppfylt.opprettMedAvslåttGradering("UT1330", InnvilgetÅrsak.GRADERING_FELLESPERIODE_ELLER_FORELDREPENGER, GraderingIkkeInnvilgetÅrsak.MOR_OPPFYLLER_IKKE_AKTIVITETSKRAV, true)) + .ellers(Manuellbehandling.opprett("UT1326", InnvilgetÅrsak.GRADERING_FELLESPERIODE_ELLER_FORELDREPENGER, Manuellbehandlingårsak.AKTIVITETSKRAV_DELVIS_ARBEID, true, true)); } private Specification delFlytForVanligUttak() { diff --git a/src/main/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/regelflyt/ForeldrepengerDelregel.java b/src/main/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/regelflyt/ForeldrepengerDelregel.java index d3b05eb4..ab7ae235 100644 --- a/src/main/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/regelflyt/ForeldrepengerDelregel.java +++ b/src/main/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/regelflyt/ForeldrepengerDelregel.java @@ -308,7 +308,7 @@ private Specification sjekkOmMorErIArbeidMedStillingpr private Specification sjekkOmSøktUttaksprosentErStørreEllerLikMorsStillingsprosent() { return rs.hvisRegel(SjekkOmSøktUttaksprosentErStørreEllerLikMorsStillingsprosent.ID, SjekkOmSøktUttaksprosentErStørreEllerLikMorsStillingsprosent.BESKRIVELSE) - .hvis(new SjekkOmSøktUttaksprosentErStørreEllerLikMorsStillingsprosent(), Oppfylt.opprett("UT1331", InnvilgetÅrsak.GRADERING_FELLESPERIODE_ELLER_FORELDREPENGER, true)) // TODO + .hvis(new SjekkOmSøktUttaksprosentErStørreEllerLikMorsStillingsprosent(), Oppfylt.opprettMedAvslåttGradering("UT1331", InnvilgetÅrsak.GRADERING_FELLESPERIODE_ELLER_FORELDREPENGER, GraderingIkkeInnvilgetÅrsak.MOR_OPPFYLLER_IKKE_AKTIVITETSKRAV, true)) .ellers(Manuellbehandling.opprett("UT1329", InnvilgetÅrsak.GRADERING_FORELDREPENGER_KUN_FAR_HAR_RETT, Manuellbehandlingårsak.AKTIVITETSKRAV_DELVIS_ARBEID, true, true)); } diff --git "a/src/main/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/utfall/GraderingIkkeInnvilget\303\205rsak.java" "b/src/main/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/utfall/GraderingIkkeInnvilget\303\205rsak.java" index 836155a8..4c7f6243 100644 --- "a/src/main/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/utfall/GraderingIkkeInnvilget\303\205rsak.java" +++ "b/src/main/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/utfall/GraderingIkkeInnvilget\303\205rsak.java" @@ -2,7 +2,8 @@ public enum GraderingIkkeInnvilgetÅrsak { - AVSLAG_PGA_FOR_TIDLIG_GRADERING(4504, "Gradering før uke 7"); + AVSLAG_PGA_FOR_TIDLIG_GRADERING(4504, "Gradering før uke 7"), + MOR_OPPFYLLER_IKKE_AKTIVITETSKRAV(4503, "Avslag gradering – ikke rett til gradert uttak pga. redusert oppfylt aktivitetskrav på mor"); private final int id; private final String beskrivelse; diff --git a/src/test/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/TrekkdagerUtregningUtilTest.java b/src/test/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/TrekkdagerUtregningUtilTest.java index 69420733..637aa416 100644 --- a/src/test/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/TrekkdagerUtregningUtilTest.java +++ b/src/test/java/no/nav/foreldrepenger/regler/uttak/fastsetteperiode/TrekkdagerUtregningUtilTest.java @@ -23,7 +23,7 @@ void skal_runde_ned_ved_gradering() { var arbeidstidsprosent = BigDecimal.valueOf(1); var periode = OppgittPeriode.forGradering(Stønadskontotype.FORELDREPENGER, fom, tom, arbeidstidsprosent, null, false, Set.of(), null, null, null, null, null); - var trekkdager = TrekkdagerUtregningUtil.trekkdagerFor(periode, true, arbeidstidsprosent, null, false); + var trekkdager = TrekkdagerUtregningUtil.trekkdagerFor(periode, true, arbeidstidsprosent, null); assertThat(trekkdager).isEqualTo(new Trekkdager(1.9)); } @@ -38,7 +38,7 @@ void skal_redusere_trekkdager_ved_samtidig_uttak_uten_gradering() { var samtidigUttaksprosent = new SamtidigUttaksprosent(50); var periode = OppgittPeriode.forVanligPeriode(Stønadskontotype.FORELDREPENGER, fom, tom, samtidigUttaksprosent, false, null, null, null, null, null); - var trekkdager = TrekkdagerUtregningUtil.trekkdagerFor(periode, false, null, samtidigUttaksprosent, false); + var trekkdager = TrekkdagerUtregningUtil.trekkdagerFor(periode, false, null, samtidigUttaksprosent); assertThat(trekkdager).isEqualTo(new Trekkdager(5)); }