Skip to content

Commit

Permalink
Utvid tjeneste som gir inntektsmelding til fpoversikt (#6790)
Browse files Browse the repository at this point in the history
  • Loading branch information
johannbm authored Oct 22, 2024
1 parent 4c26fb4 commit 3a2c9a2
Show file tree
Hide file tree
Showing 7 changed files with 316 additions and 36 deletions.
1 change: 1 addition & 0 deletions .tool-versions
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
java temurin-21.0.3+9.0.LTS
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ Sak hentSak(String saksnummer) {
};
}

Set<InntektsmeldingDto> hentInntektsmeldingerForSak(String saksnummer) {
List<FpSakInntektsmeldingDto> hentInntektsmeldingerForSak(String saksnummer) {
return inntektsmeldingTjeneste.hentInntektsmeldingerForSak(new Saksnummer(saksnummer));
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package no.nav.foreldrepenger.web.app.tjenester.fpoversikt;

import java.util.List;
import java.util.Set;

import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
Expand Down Expand Up @@ -79,7 +78,7 @@ public List<DokumentTyperDto> hentmanglendeVedlegg(@TilpassetAbacAttributt(suppl
@Produces(MediaType.APPLICATION_JSON)
@Operation(description = "Henter inntektsmeldinger på sak", tags = "fpoversikt")
@BeskyttetRessurs(actionType = ActionType.READ, resourceType = ResourceType.FAGSAK)
public Set<InntektsmeldingDto> hentInntektsmeldinger(@TilpassetAbacAttributt(supplierClass = SaksnummerAbacSupplier.Supplier.class) @NotNull @Parameter(description = "Saksnummer for fagsak") @QueryParam("saksnummer") @Valid SaksnummerDto saksnummerDto) {
public List<FpSakInntektsmeldingDto> hentInntektsmeldinger(@TilpassetAbacAttributt(supplierClass = SaksnummerAbacSupplier.Supplier.class) @NotNull @Parameter(description = "Saksnummer for fagsak") @QueryParam("saksnummer") @Valid SaksnummerDto saksnummerDto) {
var saksnummer = saksnummerDto.getVerdi();
return dtoTjeneste.hentInntektsmeldingerForSak(saksnummer);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package no.nav.foreldrepenger.web.app.tjenester.fpoversikt;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;

import com.fasterxml.jackson.annotation.JsonInclude;

import no.nav.foreldrepenger.domene.iay.modell.kodeverk.NaturalYtelseType;
import no.nav.foreldrepenger.domene.typer.JournalpostId;

@JsonInclude(JsonInclude.Include.NON_NULL)
record FpSakInntektsmeldingDto(Boolean erAktiv, BigDecimal stillingsprosent,
BigDecimal inntektPrMnd,
BigDecimal refusjonPrMnd,
String arbeidsgiverNavn,
String arbeidsgiverIdent,
String journalpostId,
LocalDateTime mottattTidspunkt,
LocalDate startDatoPermisjon,
List<NaturalYtelse> bortfalteNaturalytelser,
List<Refusjon> refusjonsperioder
){
record NaturalYtelse(
LocalDate fomDato,
LocalDate tomDato,
BigDecimal beløpPerMnd,
NaturalYtelseType type
) {}

record Refusjon(
BigDecimal refusjonsbeløpMnd,
LocalDate fomDato
) {}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,50 +1,174 @@
package no.nav.foreldrepenger.web.app.tjenester.fpoversikt;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Set;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;

import no.nav.foreldrepenger.behandlingslager.behandling.MottattDokument;
import no.nav.foreldrepenger.behandlingslager.behandling.repository.BehandlingRepository;
import no.nav.foreldrepenger.behandlingslager.behandling.repository.MottatteDokumentRepository;
import no.nav.foreldrepenger.behandlingslager.fagsak.FagsakRepository;
import no.nav.foreldrepenger.domene.arbeidsforhold.InntektArbeidYtelseTjeneste;
import no.nav.foreldrepenger.domene.arbeidsforhold.InntektsmeldingTjeneste;
import no.nav.foreldrepenger.domene.arbeidsgiver.ArbeidsgiverTjeneste;
import no.nav.foreldrepenger.domene.arbeidsgiver.VirksomhetTjeneste;
import no.nav.foreldrepenger.domene.iay.modell.AktivitetsAvtale;
import no.nav.foreldrepenger.domene.iay.modell.AktørArbeid;
import no.nav.foreldrepenger.domene.iay.modell.InntektArbeidYtelseAggregat;
import no.nav.foreldrepenger.domene.iay.modell.InntektArbeidYtelseGrunnlag;
import no.nav.foreldrepenger.domene.iay.modell.Inntektsmelding;
import no.nav.foreldrepenger.domene.iay.modell.InntektsmeldingAggregat;
import no.nav.foreldrepenger.domene.iay.modell.NaturalYtelse;
import no.nav.foreldrepenger.domene.iay.modell.Yrkesaktivitet;
import no.nav.foreldrepenger.domene.iay.modell.kodeverk.NaturalYtelseType;
import no.nav.foreldrepenger.domene.typer.Saksnummer;
import no.nav.foreldrepenger.domene.typer.Stillingsprosent;
import no.nav.vedtak.konfig.Tid;

import static no.nav.vedtak.konfig.Tid.TIDENES_ENDE;

@ApplicationScoped
class InntektsmeldingDtoTjeneste {

private InntektsmeldingTjeneste inntektsmeldingTjeneste;
private MottatteDokumentRepository mottatteDokumentRepository;
private ArbeidsgiverTjeneste arbeidsgiverTjeneste;
private BehandlingRepository behandlingRepository;
private FagsakRepository fagsakRepository;
private InntektArbeidYtelseTjeneste inntektArbeidYtelseTjeneste;

@Inject
InntektsmeldingDtoTjeneste(InntektsmeldingTjeneste inntektsmeldingTjeneste, MottatteDokumentRepository mottatteDokumentRepository) {
InntektsmeldingDtoTjeneste(InntektsmeldingTjeneste inntektsmeldingTjeneste, MottatteDokumentRepository mottatteDokumentRepository, VirksomhetTjeneste virksomhetTjeneste,
ArbeidsgiverTjeneste arbeidsgiverTjeneste,
BehandlingRepository behandlingRepository,
FagsakRepository fagsakRepository,
InntektArbeidYtelseTjeneste inntektArbeidYtelseTjeneste) {
this.inntektsmeldingTjeneste = inntektsmeldingTjeneste;
this.mottatteDokumentRepository = mottatteDokumentRepository;
this.arbeidsgiverTjeneste = arbeidsgiverTjeneste;
this.behandlingRepository = behandlingRepository;
this.fagsakRepository = fagsakRepository;
this.inntektArbeidYtelseTjeneste = inntektArbeidYtelseTjeneste;
}

InntektsmeldingDtoTjeneste() {
//CDI
}


public Set<InntektsmeldingDto> hentInntektsmeldingerForSak(Saksnummer saksnummer) {
public List<FpSakInntektsmeldingDto> hentInntektsmeldingerForSak(Saksnummer saksnummer) {
var sak = fagsakRepository.hentSakGittSaksnummer(saksnummer);
var inntektArbeidYtelseGrunnlag = sak.flatMap(
s -> behandlingRepository.hentSisteYtelsesBehandlingForFagsakId(s.getId()))
.flatMap(b -> inntektArbeidYtelseTjeneste.finnGrunnlag(b.getId()));

var yrkesaktivitet = inntektArbeidYtelseGrunnlag
.flatMap(InntektArbeidYtelseGrunnlag::getRegisterVersjon)
.map(InntektArbeidYtelseAggregat::getAktørArbeid).orElse(List.of())
.stream().filter(i -> i.getAktørId().equals(sak.get().getAktørId())).findFirst()
.map(AktørArbeid::hentAlleYrkesaktiviteter).orElse(List.of());

var inntektsmeldinger = inntektArbeidYtelseGrunnlag
.flatMap(InntektArbeidYtelseGrunnlag::getInntektsmeldinger)
.map(InntektsmeldingAggregat::getAlleInntektsmeldinger).orElse(List.of())
.stream().map(Inntektsmelding::getJournalpostId).toList();

return inntektsmeldingTjeneste.hentAlleInntektsmeldingerForFagsak(saksnummer)
.stream()
.map(this::map)
.collect(Collectors.toSet());
.map(i -> map(i, inntektsmeldinger.contains(i.getJournalpostId()), yrkesaktivitet))
.collect(Collectors.toList());
}

private InntektsmeldingDto map(Inntektsmelding inntektsmelding) {
var arbeidsgiver = new Arbeidsgiver(inntektsmelding.getArbeidsgiver().getIdentifikator());
private FpSakInntektsmeldingDto map(Inntektsmelding inntektsmelding, boolean erAktiv, Collection<Yrkesaktivitet> yrkesaktivitet) {
var mottattTidspunkt = mottatteDokumentRepository.hentMottattDokument(inntektsmelding.getJournalpostId())
.stream()
.map(MottattDokument::getMottattTidspunkt)
.min(LocalDateTime::compareTo)
.orElseThrow();
return new InntektsmeldingDto(inntektsmelding.getJournalpostId(),
arbeidsgiver, inntektsmelding.getInnsendingstidspunkt(), inntektsmelding.getInntektBeløp().getVerdi(), mottattTidspunkt);

var naturalytelser = konverterAktivePerioderTilBortfaltePerioder(inntektsmelding.getNaturalYtelser());
var refusjonsperioder = lagRefusjonsperioder(inntektsmelding);

var arbeidsgiverOpplysninger = arbeidsgiverTjeneste.hent(inntektsmelding.getArbeidsgiver());

var stillingsprosent = yrkesaktivitet.stream()
.filter(i->i.gjelderFor(inntektsmelding.getArbeidsgiver(), inntektsmelding.getArbeidsforholdRef()))
.findFirst()
.map(Yrkesaktivitet::getAlleAktivitetsAvtaler).orElse(List.of())
.stream().filter(a -> a.getProsentsats() != null)
.max(Comparator.comparing(a-> a.getPeriode().getFomDato())).map(AktivitetsAvtale::getProsentsats).map(Stillingsprosent::getVerdi)
.orElse(null);

return new FpSakInntektsmeldingDto(
erAktiv,
stillingsprosent,
inntektsmelding.getInntektBeløp().getVerdi(),
inntektsmelding.getRefusjonBeløpPerMnd() == null ? null : inntektsmelding.getRefusjonBeløpPerMnd().getVerdi(),
arbeidsgiverOpplysninger.getNavn(),
inntektsmelding.getArbeidsgiver().getIdentifikator(),
inntektsmelding.getJournalpostId().getVerdi(),
mottattTidspunkt,
inntektsmelding.getStartDatoPermisjon().orElse(null),
naturalytelser,
refusjonsperioder
);
}

public static List<FpSakInntektsmeldingDto.Refusjon> lagRefusjonsperioder(Inntektsmelding inntektsmelding) {
var refusjon = inntektsmelding.getEndringerRefusjon().stream().map(r -> new FpSakInntektsmeldingDto.Refusjon(r.getRefusjonsbeløp().getVerdi(), r.getFom())).toList();
var mutableRefusjon = new ArrayList<>(refusjon);

// Representer opphøring av refusjon som en periode med 0 som refusjon
if (inntektsmelding.getRefusjonOpphører() != null && !Tid.TIDENES_ENDE.equals(inntektsmelding.getRefusjonOpphører() )) {
mutableRefusjon.add(new FpSakInntektsmeldingDto.Refusjon(new BigDecimal(0), inntektsmelding.getRefusjonOpphører().plusDays(1)));
}

mutableRefusjon.sort(Comparator.comparing(FpSakInntektsmeldingDto.Refusjon::fomDato));

return mutableRefusjon;
}

public static List<FpSakInntektsmeldingDto.NaturalYtelse> konverterAktivePerioderTilBortfaltePerioder(List<NaturalYtelse> aktiveNaturalytelser) {
var gruppertPåType = aktiveNaturalytelser.stream()
.collect(Collectors.groupingBy(NaturalYtelse::getType));

List<FpSakInntektsmeldingDto.NaturalYtelse> bortfalteNaturalytelser = new ArrayList<>();

gruppertPåType.forEach((key, value) -> {
var sortert = value.stream()
.sorted(Comparator.comparing(a -> a.getPeriode().getFomDato()))
.toList();

for (int i = 0; i < sortert.size(); i++) {
var current = sortert.get(i);
var next = (i + 1 < sortert.size()) ? sortert.get(i + 1) : null;

LocalDate nyFom = current.getPeriode().getTomDato();
LocalDate nyTom = (next != null) ? next.getPeriode().getFomDato() : null;

if (nyFom.equals(TIDENES_ENDE)) {
continue;
}

var newYtelse = new FpSakInntektsmeldingDto.NaturalYtelse(
nyFom.plusDays(1),
(nyTom != null) ? nyTom.minusDays(1) : TIDENES_ENDE,
current.getBeloepPerMnd().getVerdi(),
current.getType()
);

bortfalteNaturalytelser.add(newYtelse);
}
});

return bortfalteNaturalytelser;
}
}
Loading

0 comments on commit 3a2c9a2

Please sign in to comment.