Skip to content

Commit

Permalink
TFP-5929 Lagt til kall på ny tjeneste når vi utleder inntektsmeldinge…
Browse files Browse the repository at this point in the history
…r, og test for ny tjeneste

This reverts commit 3516afbe4f9425be49168deebf09e7fff8d20bb4.
  • Loading branch information
AnjaAalerud committed Jan 29, 2025
1 parent af74877 commit adc3d4a
Show file tree
Hide file tree
Showing 4 changed files with 282 additions and 3 deletions.
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
package no.nav.foreldrepenger.domene.arbeidsforhold.impl;

import static java.util.stream.Collectors.flatMapping;
import static no.nav.foreldrepenger.behandlingslager.virksomhet.OrgNummer.tilMaskertNummer;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashSet;
Expand All @@ -13,6 +17,7 @@
import java.util.Set;
import java.util.function.BiFunction;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import jakarta.enterprise.context.ApplicationScoped;
import jakarta.enterprise.inject.Any;
Expand All @@ -31,11 +36,13 @@
import no.nav.foreldrepenger.domene.arbeidsforhold.InntektArbeidYtelseTjeneste;
import no.nav.foreldrepenger.domene.arbeidsforhold.InntektsmeldingTjeneste;
import no.nav.foreldrepenger.domene.iay.modell.ArbeidsforholdInformasjon;
import no.nav.foreldrepenger.domene.iay.modell.ArbeidsforholdMedPermisjon;
import no.nav.foreldrepenger.domene.iay.modell.ArbeidsforholdOverstyring;
import no.nav.foreldrepenger.domene.iay.modell.InntektArbeidYtelseGrunnlag;
import no.nav.foreldrepenger.domene.iay.modell.Inntektsmelding;
import no.nav.foreldrepenger.domene.iay.modell.Yrkesaktivitet;
import no.nav.foreldrepenger.domene.iay.modell.YrkesaktivitetFilter;
import no.nav.foreldrepenger.domene.typer.AktørId;
import no.nav.foreldrepenger.domene.typer.EksternArbeidsforholdRef;
import no.nav.foreldrepenger.domene.typer.InternArbeidsforholdRef;

Expand Down Expand Up @@ -72,8 +79,7 @@ public Map<Arbeidsgiver, Set<EksternArbeidsforholdRef>> utledManglendeInntektsme
Objects.requireNonNull(referanse, VALID_REF);

var dato = skjæringstidspunkt.getUtledetSkjæringstidspunkt();
var påkrevdeInntektsmeldinger = abakusArbeidsforholdTjeneste
.finnArbeidsforholdForIdentPåDag(referanse.aktørId(), dato, referanse.fagsakYtelseType());
var påkrevdeInntektsmeldinger = abakusArbeidsforholdTjeneste.finnArbeidsforholdForIdentPåDag(referanse.aktørId(), dato, referanse.fagsakYtelseType());

if (påkrevdeInntektsmeldinger.isEmpty()) {
return Collections.emptyMap();
Expand All @@ -83,6 +89,76 @@ public Map<Arbeidsgiver, Set<EksternArbeidsforholdRef>> utledManglendeInntektsme

}

public Map<Arbeidsgiver, Set<EksternArbeidsforholdRef>> utledManglendeInntektsmeldingerFraAAregVurderPermisjon(BehandlingReferanse referanse,
Skjæringstidspunkt skjæringstidspunkt) {
Objects.requireNonNull(referanse, VALID_REF);

var stp = skjæringstidspunkt.getUtledetSkjæringstidspunkt();
var arbeidsforholdInfo = abakusArbeidsforholdTjeneste.hentArbeidsforholdInfoForEnPeriode(referanse.aktørId(), stp, stp,
referanse.fagsakYtelseType());

if (arbeidsforholdInfo.isEmpty()) {
return Collections.emptyMap();
}

List<ArbeidsforholdMedPermisjon> påkrevdeArbeidsgivere = new ArrayList<>();
var mapAvOrgnrOgAvtaler = arbeidsforholdInfo.stream().collect(Collectors.groupingBy(this::arbeidsgiverNøkkel));

mapAvOrgnrOgAvtaler.forEach((orgnummerOgArbeidsfoholdsId, arbeidsforholdListe) -> {
var harPermisjon = harHundreProsentPermisjonOgDenErRelevant(arbeidsforholdListe, stp);
if (!harPermisjon) {
påkrevdeArbeidsgivere.addAll(arbeidsforholdListe);
}
});

var påkrevdeInntektsmeldinger = påkrevdeArbeidsgivere.stream()
.collect(Collectors.groupingBy(InntektsmeldingRegisterTjeneste::mapTilArbeidsgiver, flatMapping(arbeidsforholdMedPermisjon -> Stream.of(
EksternArbeidsforholdRef.ref(
arbeidsforholdMedPermisjon.arbeidsforholdId() != null ? arbeidsforholdMedPermisjon.arbeidsforholdId().getReferanse() : null)),
Collectors.toSet())));

return utledManglendeInntektsmeldinger(referanse, skjæringstidspunkt, påkrevdeInntektsmeldinger);
}

private static Arbeidsgiver mapTilArbeidsgiver(ArbeidsforholdMedPermisjon arbeidsforholdMedPermisjon) {
var arbeidsgiver = arbeidsforholdMedPermisjon.arbeidsgiver();
if (arbeidsgiver.getErVirksomhet()) {
return Arbeidsgiver.virksomhet(arbeidsgiver.getOrgnr());
}
if (arbeidsgiver.erAktørId()) {
return Arbeidsgiver.person(new AktørId(arbeidsgiver.getIdentifikator()));
}
throw new IllegalArgumentException("Arbeidsgiver er verken person eller organisasjon");
}

private boolean harHundreProsentPermisjonOgDenErRelevant(List<ArbeidsforholdMedPermisjon> arbeidsforholdListe, LocalDate stp) {
var stillingsprosentPåStp = arbeidsforholdListe.stream()
.map(ArbeidsforholdMedPermisjon::aktivitetsavtaler)
.flatMap(Collection::stream)
.filter(aktivitetAvtale -> aktivitetAvtale.periode().inkluderer(stp))
.map(ArbeidsforholdTjeneste.AktivitetAvtale::stillingsprosent)
.reduce(BigDecimal::add).orElse(BigDecimal.ZERO);

var relevantPermisjonsprosentPåStp = arbeidsforholdListe.stream().map(ArbeidsforholdMedPermisjon::permisjoner)
.flatMap(Collection::stream)
.filter(this::erPermisjonRelevant)
.filter(permisjon -> permisjon.periode().inkluderer(stp))
.map(ArbeidsforholdTjeneste.Permisjon::prosent)
.reduce(BigDecimal::add).orElse(BigDecimal.ZERO);

return stillingsprosentPåStp.compareTo(BigDecimal.ZERO) > 0 && relevantPermisjonsprosentPåStp.compareTo(BigDecimal.valueOf(100)) == 0;
}

private boolean erPermisjonRelevant(ArbeidsforholdTjeneste.Permisjon permisjon) {
return permisjon.type().erRelevantForBeregningEllerArbeidsforhold();
}

private String arbeidsgiverNøkkel(ArbeidsforholdMedPermisjon arbeidsforholdInfo) {
return arbeidsforholdInfo.arbeidsforholdId() != null
? arbeidsforholdInfo.arbeidsgiver().getOrgnr() + "-" + arbeidsforholdInfo.arbeidsforholdId().getReferanse()
: arbeidsforholdInfo.arbeidsgiver().getOrgnr();
}

private Map<Arbeidsgiver, Set<EksternArbeidsforholdRef>> utledManglendeInntektsmeldinger(BehandlingReferanse referanse, Skjæringstidspunkt stp,
Map<Arbeidsgiver, Set<EksternArbeidsforholdRef>> påkrevdeInntektsmeldinger) {
class FinnEksternReferanse implements BiFunction<Arbeidsgiver, InternArbeidsforholdRef, EksternArbeidsforholdRef> {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
package no.nav.foreldrepenger.domene.arbeidsforhold.impl;

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.when;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.UUID;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;

import no.nav.foreldrepenger.behandling.BehandlingReferanse;
import no.nav.foreldrepenger.behandling.Skjæringstidspunkt;
import no.nav.foreldrepenger.behandlingslager.behandling.BehandlingStatus;
import no.nav.foreldrepenger.behandlingslager.behandling.BehandlingType;
import no.nav.foreldrepenger.behandlingslager.behandling.personopplysning.RelasjonsRolleType;
import no.nav.foreldrepenger.behandlingslager.fagsak.FagsakYtelseType;
import no.nav.foreldrepenger.behandlingslager.virksomhet.ArbeidType;
import no.nav.foreldrepenger.behandlingslager.virksomhet.Arbeidsgiver;
import no.nav.foreldrepenger.domene.abakus.ArbeidsforholdTjeneste;
import no.nav.foreldrepenger.domene.arbeidsforhold.InntektArbeidYtelseTjeneste;
import no.nav.foreldrepenger.domene.arbeidsforhold.InntektsmeldingTjeneste;
import no.nav.foreldrepenger.domene.arbeidsforhold.fp.InntektsmeldingFilterYtelseImpl;
import no.nav.foreldrepenger.domene.iay.modell.ArbeidsforholdMedPermisjon;
import no.nav.foreldrepenger.domene.iay.modell.kodeverk.PermisjonsbeskrivelseType;
import no.nav.foreldrepenger.domene.tid.DatoIntervallEntitet;
import no.nav.foreldrepenger.domene.typer.AktørId;
import no.nav.foreldrepenger.domene.typer.EksternArbeidsforholdRef;
import no.nav.foreldrepenger.domene.typer.Saksnummer;
import no.nav.vedtak.felles.testutilities.cdi.UnitTestLookupInstanceImpl;
// Denne testen tester kun InnteksmeldingRegisterTjeneste.utledManglendeInntektsmeldingerFraAAregVurderPermisjon()
@ExtendWith(MockitoExtension.class)
class InntektsmeldingRegisterTjenesteFpForAargTest {
private static final LocalDate SKJÆRINGSTIDSPUNKT = LocalDate.now();
private InntektsmeldingRegisterTjeneste inntektsmeldingRegisterTjeneste;
@Mock
private InntektArbeidYtelseTjeneste inntektArbeidYtelseTjeneste;
@Mock
private InntektsmeldingTjeneste inntektsmeldingTjeneste;
@Mock
private ArbeidsforholdTjeneste abakusArbeidsforholdTjeneste;

private static BehandlingReferanse behandlingReferanse;
private static final AktørId aktørId = AktørId.dummy();

@BeforeEach
void setUp() {
var foreldrepengerFilter = new InntektsmeldingFilterYtelseImpl();
inntektsmeldingRegisterTjeneste = new InntektsmeldingRegisterTjeneste(inntektArbeidYtelseTjeneste, inntektsmeldingTjeneste, abakusArbeidsforholdTjeneste,
new UnitTestLookupInstanceImpl<>(foreldrepengerFilter));
behandlingReferanse = new BehandlingReferanse(new Saksnummer("123"), 321L, FagsakYtelseType.FORELDREPENGER, 123L,
UUID.randomUUID(), BehandlingStatus.UTREDES, BehandlingType.FØRSTEGANGSSØKNAD, null, aktørId, RelasjonsRolleType.MORA);
}


@Test
void krever_ikke_inntektsmelding_for_et_av_arbeidsforholdene_fordi_det_er_100_prosent_permisjon() {
var skjæringstidspunkt = Skjæringstidspunkt.builder().medUtledetSkjæringstidspunkt(SKJÆRINGSTIDSPUNKT).build();
var arbeidsgiverMedRelevantPermisjon = Arbeidsgiver.virksomhet("123456789");
var eksternRef = EksternArbeidsforholdRef.ref("123");
var eksternRef2 = EksternArbeidsforholdRef.ref("456");

var aktivitetsAvtalePeriode = DatoIntervallEntitet.fraOgMed(SKJÆRINGSTIDSPUNKT);
var permisjonsPeriode = DatoIntervallEntitet.fraOgMedTilOgMed(SKJÆRINGSTIDSPUNKT.minusDays(2), SKJÆRINGSTIDSPUNKT.plusWeeks(2));
var aktivitetsavtaler = List.of(lagAktivitetsavtale(aktivitetsAvtalePeriode, BigDecimal.valueOf(50)));
var permisjoner = List.of(lagPermisjon(permisjonsPeriode, BigDecimal.valueOf(100)));

var aktivitetsavtaler2 = List.of(lagAktivitetsavtale(aktivitetsAvtalePeriode, BigDecimal.valueOf(50)));

var arbeidsforholdMedPermisjon = List.of(lagArbeidsforholdMedPermisjon(arbeidsgiverMedRelevantPermisjon, eksternRef, aktivitetsavtaler, permisjoner),
lagArbeidsforholdMedPermisjon(arbeidsgiverMedRelevantPermisjon, eksternRef2, aktivitetsavtaler2, Collections.emptyList()));

when(abakusArbeidsforholdTjeneste.hentArbeidsforholdInfoForEnPeriode(behandlingReferanse.aktørId(), SKJÆRINGSTIDSPUNKT, SKJÆRINGSTIDSPUNKT, FagsakYtelseType.FORELDREPENGER)).thenReturn(arbeidsforholdMedPermisjon);

var manglendeInntektsmeldinger = inntektsmeldingRegisterTjeneste.utledManglendeInntektsmeldingerFraAAregVurderPermisjon(behandlingReferanse, skjæringstidspunkt);

assertThat(manglendeInntektsmeldinger).hasSize(1);
assertThat(manglendeInntektsmeldinger.values().stream().toList().getFirst()).isEqualTo(Set.of(eksternRef2));
}

@Test
void krever_inntektsmelding_begge_arbeidsforholdene_når_permisjon_er_under_100_prosent() {
var skjæringstidspunkt = Skjæringstidspunkt.builder().medUtledetSkjæringstidspunkt(SKJÆRINGSTIDSPUNKT).build();
var arbeidsgiverMedRelevantPermisjon = Arbeidsgiver.virksomhet("123456789");

var aktivitetsAvtalePeriode = DatoIntervallEntitet.fraOgMed(SKJÆRINGSTIDSPUNKT);
var permisjonsPeriode = DatoIntervallEntitet.fraOgMedTilOgMed(SKJÆRINGSTIDSPUNKT.minusDays(2), SKJÆRINGSTIDSPUNKT.plusWeeks(2));
var aktivitetsavtaler = List.of(lagAktivitetsavtale(aktivitetsAvtalePeriode, BigDecimal.valueOf(50)));
var permisjoner = List.of(lagPermisjon(permisjonsPeriode, BigDecimal.valueOf(50)));

var arbeidsgiver2 = Arbeidsgiver.virksomhet("987654321");
var aktivitetsavtaler2 = List.of(lagAktivitetsavtale(aktivitetsAvtalePeriode, BigDecimal.valueOf(50)));

var arbeidsforholdMedPermisjon = List.of(lagArbeidsforholdMedPermisjon(arbeidsgiverMedRelevantPermisjon, null, aktivitetsavtaler, permisjoner),
lagArbeidsforholdMedPermisjon(arbeidsgiver2, null, aktivitetsavtaler2, Collections.emptyList()));

when(abakusArbeidsforholdTjeneste.hentArbeidsforholdInfoForEnPeriode(behandlingReferanse.aktørId(), SKJÆRINGSTIDSPUNKT, SKJÆRINGSTIDSPUNKT, FagsakYtelseType.FORELDREPENGER)).thenReturn(arbeidsforholdMedPermisjon);

var manglendeInntektsmeldinger = inntektsmeldingRegisterTjeneste.utledManglendeInntektsmeldingerFraAAregVurderPermisjon(behandlingReferanse, skjæringstidspunkt);

assertThat(manglendeInntektsmeldinger).hasSize(2);
assertThat(manglendeInntektsmeldinger.keySet().stream().toList()).contains(arbeidsgiver2, arbeidsgiverMedRelevantPermisjon);
}

@Test
void krever_inntektsmelding_begge_arbeidsforholdene_når_permisjon_ikke_inkluderer_stp() {
var skjæringstidspunkt = Skjæringstidspunkt.builder().medUtledetSkjæringstidspunkt(SKJÆRINGSTIDSPUNKT).build();
var arbeidsgiverMedRelevantPermisjon = Arbeidsgiver.virksomhet("123456789");

var aktivitetsAvtalePeriode = DatoIntervallEntitet.fraOgMed(SKJÆRINGSTIDSPUNKT);
var permisjonsPeriode = DatoIntervallEntitet.fraOgMedTilOgMed(SKJÆRINGSTIDSPUNKT.minusDays(15), SKJÆRINGSTIDSPUNKT.minusDays(2));
var aktivitetsavtaler = List.of(lagAktivitetsavtale(aktivitetsAvtalePeriode, BigDecimal.valueOf(50)));
var permisjoner = List.of(lagPermisjon(permisjonsPeriode, BigDecimal.valueOf(100)));

var arbeidsgiver2 = Arbeidsgiver.virksomhet("987654321");
var aktivitetsavtaler2 = List.of(lagAktivitetsavtale(aktivitetsAvtalePeriode, BigDecimal.valueOf(50)));

var arbeidsforholdMedPermisjon = List.of(lagArbeidsforholdMedPermisjon(arbeidsgiverMedRelevantPermisjon, null, aktivitetsavtaler, permisjoner),
lagArbeidsforholdMedPermisjon(arbeidsgiver2, null, aktivitetsavtaler2, Collections.emptyList()));

when(abakusArbeidsforholdTjeneste.hentArbeidsforholdInfoForEnPeriode(behandlingReferanse.aktørId(), SKJÆRINGSTIDSPUNKT, SKJÆRINGSTIDSPUNKT, FagsakYtelseType.FORELDREPENGER)).thenReturn(arbeidsforholdMedPermisjon);

var manglendeInntektsmeldinger = inntektsmeldingRegisterTjeneste.utledManglendeInntektsmeldingerFraAAregVurderPermisjon(behandlingReferanse, skjæringstidspunkt);

assertThat(manglendeInntektsmeldinger).hasSize(2);
assertThat(manglendeInntektsmeldinger.keySet().stream().toList()).contains(arbeidsgiver2, arbeidsgiverMedRelevantPermisjon);
}

private ArbeidsforholdTjeneste.AktivitetAvtale lagAktivitetsavtale(DatoIntervallEntitet periode, BigDecimal stillingsprosent) {
return new ArbeidsforholdTjeneste.AktivitetAvtale(periode, stillingsprosent);
}

private ArbeidsforholdMedPermisjon lagArbeidsforholdMedPermisjon(Arbeidsgiver arbeidsgiver, EksternArbeidsforholdRef ref, List<ArbeidsforholdTjeneste.AktivitetAvtale> aktivitetsavtaler, List<ArbeidsforholdTjeneste.Permisjon> permisjoner) {
return new ArbeidsforholdMedPermisjon(arbeidsgiver, ArbeidType.ORDINÆRT_ARBEIDSFORHOLD, ref, aktivitetsavtaler, permisjoner );
}
private ArbeidsforholdTjeneste.Permisjon lagPermisjon(DatoIntervallEntitet periode, BigDecimal permisjonsprosent) {
return new ArbeidsforholdTjeneste.Permisjon(periode, PermisjonsbeskrivelseType.ANNEN_PERMISJON_LOVFESTET, permisjonsprosent);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,8 @@ class InntektsmeldingTjenesteTest {
private final AtomicLong journalpostIdInc = new AtomicLong(123);
private final ArbeidsforholdTjenesteMock arbeidsforholdTjenesteMock = new ArbeidsforholdTjenesteMock(false);

private final

@BeforeEach
void setUp(EntityManager entityManager) {
behandlingRepository = new BehandlingRepository(entityManager);
Expand Down Expand Up @@ -142,6 +144,47 @@ private BehandlingReferanse lagReferanse(Behandling behandling) {
assertThat(inntektsmeldingArkivTjenesteSvp.utledManglendeInntektsmeldingerFraAAreg(behandlingReferanse, skjæringstidspunkt)).isEmpty();
}

@Test
void skal_ikke_ta_med_arbeidsforhold_det_ikke_er_søkt_for_når_manglende_im_utledes_for_svp_nytt_endepunkt() {
// Arrange
var arbId1Intern = ARBEIDSFORHOLD_ID;

var ARBEIDSFORHOLD_ID_2 = InternArbeidsforholdRef.ref("a6ea6724-868f-11e9-bc42-526af7764f64");

var virksomhet1 = lagVirksomhet();

this.arbeidsgiver = Arbeidsgiver.virksomhet(virksomhet1.getOrgnr());

var virksomhetTjeneste = mock(VirksomhetTjeneste.class);
when(virksomhetTjeneste.hentOrganisasjon(any())).thenReturn(virksomhet1);

var behandling = opprettBehandling();
opprettOppgittOpptjening(behandling);
opprettInntektArbeidYtelseAggregatForYrkesaktivitet(behandling, AKTØRID,
DatoIntervallEntitet.fraOgMedTilOgMed(ARBEIDSFORHOLD_FRA, ARBEIDSFORHOLD_TIL),
arbId1Intern, ArbeidType.ORDINÆRT_ARBEIDSFORHOLD, BigDecimal.TEN);
opprettInntektArbeidYtelseAggregatForYrkesaktivitet(behandling, AKTØRID,
DatoIntervallEntitet.fraOgMedTilOgMed(ARBEIDSFORHOLD_FRA, ARBEIDSFORHOLD_TIL), ARBEIDSFORHOLD_ID_2, ArbeidType.ORDINÆRT_ARBEIDSFORHOLD, BigDecimal.TEN);

var behandlingReferanse = lagReferanse(behandling);

var svangerskapspengerRepositoryMock = mock(SvangerskapspengerRepository.class);
var svpGrunnlag = byggSvpGrunnlag(behandling, virksomhet1.getOrgnr());
when(svangerskapspengerRepositoryMock.hentGrunnlag(behandling.getId())).thenReturn(Optional.ofNullable(svpGrunnlag));

var svpengerFilter = new InntektsmeldingFilterYtelseImpl(svangerskapspengerRepositoryMock);

var inntektsmeldingArkivTjenesteSvp = new InntektsmeldingRegisterTjeneste(iayTjeneste,
inntektsmeldingTjeneste, arbeidsforholdTjenesteMock.getMock(), new UnitTestLookupInstanceImpl<>(svpengerFilter));
// Act+Assert
assertThat(inntektsmeldingArkivTjenesteSvp.utledManglendeInntektsmeldingerFraAAreg(behandlingReferanse, skjæringstidspunkt)).isNotEmpty();

lagreInntektsmelding(I_DAG.minusDays(2), behandling, arbId1Intern, ARBEIDSFORHOLD_ID_EKSTERN);

// Act+Assert
assertThat(inntektsmeldingArkivTjenesteSvp.utledManglendeInntektsmeldingerFraAAreg(behandlingReferanse, skjæringstidspunkt)).isEmpty();
}

private SvpGrunnlagEntitet byggSvpGrunnlag(Behandling behandling, String arbeidsgiverOrgnr) {
var tilrettelegging = new SvpTilretteleggingEntitet.Builder()
.medBehovForTilretteleggingFom(LocalDate.now())
Expand Down
Loading

0 comments on commit adc3d4a

Please sign in to comment.