Skip to content

Commit

Permalink
FAGSYSTEM-301302 trekker ikke minsterett inn i negativ saldo ved grad…
Browse files Browse the repository at this point in the history
…ering og flere arbeidsforhold (#318)
  • Loading branch information
palfi authored Nov 2, 2023
1 parent 830cb7b commit e1dbce6
Show file tree
Hide file tree
Showing 5 changed files with 68 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -122,14 +122,13 @@ private UttakPeriodeAktivitet lagAktivitet(AktivitetIdentifikator identifikator,

private PeriodeAktivitetResultat finnPeriodeAktivitetResultat(OppgittPeriode oppgittPeriode,
boolean overlapperMedInnvilgetPeriodeHosAnnenpart,
AktivitetIdentifikator identifikator,
AktivitetIdentifikator aktivitet,
FastsettePerioderRegelresultat regelresultat,
SamtidigUttaksprosent annenpartSamtidigUttaksprosent) {
//Må sjekke saldo her, ved flere arbeidsforhold kan det reglene ha gått til sluttpunkt som trekkes dager selv om ett av arbeidsforholdene er tom
//På arbeidsforholdet som er tom på konto skal det settes 0 trekkdager
var stønadskonto = konto(oppgittPeriode);
var nettosaldo = saldoUtregning.nettoSaldoJustertForMinsterett(stønadskonto.orElse(null), identifikator, oppgittPeriode.kanTrekkeAvMinsterett());
var harIgjenTrekkdager = nettosaldo.merEnn0();
var harIgjenTrekkdager = isHarIgjenTrekkdager(oppgittPeriode, aktivitet, regelresultat, stønadskonto.orElse(null));

var manuellBehandling = manuellBehandling(regelresultat);
if (overlapperMedInnvilgetPeriodeHosAnnenpart || (!manuellBehandling && !harIgjenTrekkdager)) {
Expand All @@ -138,7 +137,7 @@ private PeriodeAktivitetResultat finnPeriodeAktivitetResultat(OppgittPeriode opp

var utbetalingsgrad = Utbetalingsgrad.ZERO;
if (regelresultat.skalUtbetale()) {
var utbetalingsgradUtregning = bestemUtbetalingsgradUtregning(oppgittPeriode, identifikator, annenpartSamtidigUttaksprosent);
var utbetalingsgradUtregning = bestemUtbetalingsgradUtregning(oppgittPeriode, aktivitet, annenpartSamtidigUttaksprosent);
utbetalingsgrad = utbetalingsgradUtregning.resultat();
}
var trekkdager = Trekkdager.ZERO;
Expand All @@ -147,14 +146,27 @@ private PeriodeAktivitetResultat finnPeriodeAktivitetResultat(OppgittPeriode opp
trekkdager = Trekkdager.ZERO;
} else {
var graderingInnvilget =
regelresultat.getGraderingIkkeInnvilgetÅrsak() == null && oppgittPeriode.erSøktGradering(identifikator);
regelresultat.getGraderingIkkeInnvilgetÅrsak() == null && oppgittPeriode.erSøktGradering(aktivitet);
trekkdager = TrekkdagerUtregningUtil.trekkdagerFor(oppgittPeriode, graderingInnvilget,
oppgittPeriode.getArbeidsprosent(), regnSamtidigUttaksprosentMotGradering(oppgittPeriode, annenpartSamtidigUttaksprosent));
}
}
return new PeriodeAktivitetResultat(utbetalingsgrad, trekkdager);
}

private boolean isHarIgjenTrekkdager(OppgittPeriode oppgittPeriode,
AktivitetIdentifikator aktivitet,
FastsettePerioderRegelresultat regelresultat,
Stønadskontotype stønadskonto) {
var nettosaldo = saldoUtregning.nettoSaldoJustertForMinsterett(stønadskonto, aktivitet, oppgittPeriode.kanTrekkeAvMinsterett());
if (regelresultat.getAvklaringÅrsak() != null && regelresultat.getAvklaringÅrsak().trekkerMinsterett()) {
var minsterettSaldo = saldoUtregning.restSaldoMinsterett(aktivitet);
var utenAktivitetskravSaldo = saldoUtregning.restSaldoDagerUtenAktivitetskrav();
return nettosaldo.merEnn0() && (minsterettSaldo.merEnn0() || utenAktivitetskravSaldo.merEnn0());
}
return nettosaldo.merEnn0();
}

private boolean manuellBehandling(FastsettePerioderRegelresultat regelresultat) {
return regelresultat.getUtfallType().equals(UtfallType.MANUELL_BEHANDLING);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,4 +107,9 @@ public int getId() {
public String getBeskrivelse() {
return beskrivelse;
}

@Override
public boolean trekkerMinsterett() {
return false;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -56,4 +56,9 @@ public int getId() {
public String getBeskrivelse() {
return beskrivelse;
}

@Override
public boolean trekkerMinsterett() {
return this.equals(FORELDREPENGER_KUN_FAR_HAR_RETT_UTEN_AKTIVITETSKRAV) || this.equals(GRADERING_FORELDREPENGER_KUN_FAR_HAR_RETT_UTEN_AKTIVITETSKRAV);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,5 @@ public interface PeriodeResultatÅrsak {

String getBeskrivelse();

boolean trekkerMinsterett();
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
import no.nav.foreldrepenger.regler.uttak.fastsetteperiode.grunnlag.RegelGrunnlag;
import no.nav.foreldrepenger.regler.uttak.fastsetteperiode.grunnlag.Søknad;
import no.nav.foreldrepenger.regler.uttak.fastsetteperiode.grunnlag.Søknadstype;
import no.nav.foreldrepenger.regler.uttak.fastsetteperiode.grunnlag.Utbetalingsgrad;
import no.nav.foreldrepenger.regler.uttak.fastsetteperiode.grunnlag.UtsettelseÅrsak;
import no.nav.foreldrepenger.regler.uttak.fastsetteperiode.grunnlag.UttakPeriode;
import no.nav.foreldrepenger.regler.uttak.fastsetteperiode.grunnlag.UttakPeriodeAktivitet;
Expand Down Expand Up @@ -439,6 +440,45 @@ void bfhr_minsterett_gradering_flere_arbeidsforhold() {
assertThat(fastsattePerioder.get(3).uttakPeriode().getPeriodeResultatÅrsak()).isEqualTo(AKTIVITETSKRAVET_UTDANNING_IKKE_OPPFYLT);
}

//FAGSYSTEM-301302
@Test
void bfhr_minsterett_gradering_flere_arbeidsforhold_2() {
var fødselsdato = LocalDate.of(2023, 10, 2);
var kontoer = new Kontoer.Builder().konto(konto(FORELDREPENGER, 40 * 5)).minsterettDager(8 * 5);
var arbeidsforhold1 = AktivitetIdentifikator.forArbeid(new Orgnummer("1"), null);
var arbeidsforhold2 = AktivitetIdentifikator.forArbeid(new Orgnummer("2"), null);
var gradering = OppgittPeriode.forGradering(FORELDREPENGER, fødselsdato, LocalDate.of(2024, 1, 22), BigDecimal.valueOf(50),
null, false, Set.of(arbeidsforhold1), fødselsdato, fødselsdato, null, null);

var søknad = new Søknad.Builder().type(Søknadstype.FØDSEL)
.oppgittePerioder(List.of(gradering));

var arbeid = new Arbeid.Builder().arbeidsforhold(new Arbeidsforhold(arbeidsforhold1)).arbeidsforhold(new Arbeidsforhold(arbeidsforhold2));
var grunnlag = basicGrunnlagFar(fødselsdato)
.rettOgOmsorg(bareFarRett())
.søknad(søknad)
.arbeid(arbeid)
.kontoer(kontoer);
var fastsattePerioder = fastsettPerioder(grunnlag);
assertThat(fastsattePerioder).hasSize(4);

assertThat(fastsattePerioder.get(0).uttakPeriode().erGraderingInnvilget()).isTrue();
assertThat(fastsattePerioder.get(0).uttakPeriode().getTrekkdager(arbeidsforhold1)).isEqualTo(new Trekkdager(15));
assertThat(fastsattePerioder.get(0).uttakPeriode().getTrekkdager(arbeidsforhold2)).isEqualTo(new Trekkdager(30));
assertThat(fastsattePerioder.get(1).uttakPeriode().erGraderingInnvilget()).isTrue();
assertThat(fastsattePerioder.get(1).uttakPeriode().getTrekkdager(arbeidsforhold1)).isEqualTo(new Trekkdager(5));
assertThat(fastsattePerioder.get(1).uttakPeriode().getTrekkdager(arbeidsforhold2)).isEqualTo(new Trekkdager(10));
assertThat(fastsattePerioder.get(2).uttakPeriode().erGraderingInnvilget()).isTrue();
assertThat(fastsattePerioder.get(2).uttakPeriode().getTrekkdager(arbeidsforhold1)).isEqualTo(new Trekkdager(20));
assertThat(fastsattePerioder.get(2).uttakPeriode().getTrekkdager(arbeidsforhold2)).isEqualTo(new Trekkdager(0));
assertThat(fastsattePerioder.get(2).uttakPeriode().getUtbetalingsgrad(arbeidsforhold2)).isEqualTo(Utbetalingsgrad.ZERO);
assertThat(fastsattePerioder.get(3).uttakPeriode().getPerioderesultattype()).isEqualTo(Perioderesultattype.AVSLÅTT);
//Søkt en dag for mye minsterett
assertThat(fastsattePerioder.get(3).uttakPeriode().getTrekkdager(arbeidsforhold1)).isEqualTo(new Trekkdager(0.5));
assertThat(fastsattePerioder.get(3).uttakPeriode().getTrekkdager(arbeidsforhold2)).isEqualTo(new Trekkdager(1));
assertThat(fastsattePerioder.get(3).uttakPeriode().getPeriodeResultatÅrsak()).isEqualTo(AKTIVITET_UKJENT_UDOKUMENTERT);
}

private boolean harPeriode(UttakPeriode p, Perioderesultattype prt, PeriodeResultatÅrsak prå, int dager) {
return p.getPerioderesultattype().equals(prt) && p.getPeriodeResultatÅrsak().equals(prå) &&
(dager == -1 || p.getAktiviteter().stream().map(UttakPeriodeAktivitet::getTrekkdager).mapToInt(Trekkdager::rundOpp).sum() == dager);
Expand Down

0 comments on commit e1dbce6

Please sign in to comment.