Skip to content

Commit

Permalink
FIX: Henter besteberegningsgrunnlag fra kalkulus (#6682)
Browse files Browse the repository at this point in the history
  • Loading branch information
pekern authored Sep 10, 2024
1 parent 6975465 commit 422feae
Show file tree
Hide file tree
Showing 6 changed files with 130 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import java.util.Optional;
import java.util.UUID;

import no.nav.folketrygdloven.fpkalkulus.kontrakt.besteberegning.BesteberegningGrunnlagDto;
import no.nav.folketrygdloven.kalkulus.kodeverk.AktivitetStatus;
import no.nav.folketrygdloven.kalkulus.response.v1.beregningsgrunnlag.detaljert.BeregningAktivitetAggregatDto;
import no.nav.folketrygdloven.kalkulus.response.v1.beregningsgrunnlag.detaljert.BeregningAktivitetDto;
Expand Down Expand Up @@ -34,6 +35,9 @@
import no.nav.foreldrepenger.domene.modell.BeregningsgrunnlagGrunnlagBuilder;
import no.nav.foreldrepenger.domene.modell.BeregningsgrunnlagPeriode;
import no.nav.foreldrepenger.domene.modell.BeregningsgrunnlagPrStatusOgAndel;
import no.nav.foreldrepenger.domene.modell.BesteberegningGrunnlag;
import no.nav.foreldrepenger.domene.modell.BesteberegningInntekt;
import no.nav.foreldrepenger.domene.modell.BesteberegningMånedsgrunnlag;
import no.nav.foreldrepenger.domene.modell.SammenligningsgrunnlagPrStatus;
import no.nav.foreldrepenger.domene.tid.ÅpenDatoIntervallEntitet;
import no.nav.foreldrepenger.domene.typer.AktørId;
Expand All @@ -49,16 +53,39 @@ private KalkulusTilFpsakMapper() {
// Hindrer instansiering
}

public static BeregningsgrunnlagGrunnlag map(BeregningsgrunnlagGrunnlagDto grunnlagDto) {
public static BeregningsgrunnlagGrunnlag map(BeregningsgrunnlagGrunnlagDto grunnlagDto, Optional<BesteberegningGrunnlagDto> besteberegningGrunnlagDto) {
return BeregningsgrunnlagGrunnlagBuilder.nytt()
.medBeregningsgrunnlag(grunnlagDto.getBeregningsgrunnlag() == null ? null : mapGrunnlag(grunnlagDto.getBeregningsgrunnlag()))
.medBeregningsgrunnlag(grunnlagDto.getBeregningsgrunnlag() == null ? null : mapGrunnlag(grunnlagDto.getBeregningsgrunnlag(), besteberegningGrunnlagDto))
.medRegisterAktiviteter(grunnlagDto.getRegisterAktiviteter() == null ? null : mapAktiviteter(grunnlagDto.getRegisterAktiviteter()))
.medSaksbehandletAktiviteter(grunnlagDto.getSaksbehandletAktiviteter() == null ? null : mapAktiviteter(grunnlagDto.getSaksbehandletAktiviteter()))
.medOverstyring(grunnlagDto.getOverstyringer() == null ? null : mapAktivitetOverstyringer(grunnlagDto.getOverstyringer()))
.medRefusjonOverstyring(grunnlagDto.getRefusjonOverstyringer() == null ? null : mapRefusjonoverstyringer(grunnlagDto.getRefusjonOverstyringer()))
.build(KodeverkFraKalkulusMapper.mapTilstand(grunnlagDto.getBeregningsgrunnlagTilstand()));
}

public static BesteberegningGrunnlag mapBesteberegning(BesteberegningGrunnlagDto bbg) {
var builder = BesteberegningGrunnlag.ny().medAvvik(mapTilBigDecimal(bbg.avvikFørsteOgTredjeLedd()));
bbg.seksBesteMåneder().stream().map(KalkulusTilFpsakMapper::mapBesteberegningMåned).forEach(builder::leggTilMånedsgrunnlag);
return builder.build();

}

private static BesteberegningMånedsgrunnlag mapBesteberegningMåned(BesteberegningGrunnlagDto.BesteberegningMånedDto m) {
var builder = BesteberegningMånedsgrunnlag.ny().medPeriode(m.periode().getFom(), m.periode().getTom());
m.inntekter().stream()
.map(KalkulusTilFpsakMapper::maBesteberegningInntekt)
.forEach(builder::leggTilInntekt);
return builder.build();
}

private static BesteberegningInntekt maBesteberegningInntekt(BesteberegningGrunnlagDto.BesteberegningInntektDto i) {
return BesteberegningInntekt.ny().medInntekt(mapTilBigDecimal(i.inntekt()))
.medArbeidsgiver(i.arbeidsgiver() == null ? null : mapArbeidsgiver(i.arbeidsgiver()))
.medOpptjeningAktivitetType(KodeverkFraKalkulusMapper.mapOpptjeningtype(i.opptjeningAktiviteterDto()))
.medArbeidsforholdRef(i.internArbeidsforholdRefDto() == null ? null : InternArbeidsforholdRef.ref(i.internArbeidsforholdRefDto().getAbakusReferanse()))
.build();
}

private static BeregningRefusjonOverstyringer mapRefusjonoverstyringer(BeregningRefusjonOverstyringerDto refusjonOverstyringer) {
var builder = BeregningRefusjonOverstyringer.builder();
refusjonOverstyringer.getOverstyringer().stream().map(KalkulusTilFpsakMapper::mapRefusjonoverstyring).forEach(builder::leggTilOverstyring);
Expand Down Expand Up @@ -109,7 +136,8 @@ private static BeregningAktivitet mapAktivitet(BeregningAktivitetDto aktivitetDt
.build();
}

private static Beregningsgrunnlag mapGrunnlag(BeregningsgrunnlagDto beregningsgrunnlagDto) {
private static Beregningsgrunnlag mapGrunnlag(BeregningsgrunnlagDto beregningsgrunnlagDto,
Optional<BesteberegningGrunnlagDto> besteberegningGrunnlagDto) {
var builder = Beregningsgrunnlag.builder()
.medSkjæringstidspunkt(beregningsgrunnlagDto.getSkjæringstidspunkt())
.medGrunnbeløp(mapTilBeløp(beregningsgrunnlagDto.getGrunnbeløp()))
Expand All @@ -135,6 +163,9 @@ private static Beregningsgrunnlag mapGrunnlag(BeregningsgrunnlagDto beregningsgr
.map(KalkulusTilFpsakMapper::mapSammenligningsgrunnlag)
.forEach(builder::leggTilSammenligningsgrunnlagPrStatus);

// Besteberegning
besteberegningGrunnlagDto.ifPresent(bbg -> builder.medBesteberegningsgrunnlag(mapBesteberegning(bbg)));

return builder.build();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,6 @@
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;

import no.nav.folketrygdloven.kalkulus.håndtering.v1.HåndterBeregningDto;
import no.nav.foreldrepenger.behandling.aksjonspunkt.OverstyringAksjonspunktDto;

import org.jboss.weld.exceptions.IllegalStateException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand All @@ -19,25 +16,30 @@
import no.nav.folketrygdloven.fpkalkulus.kontrakt.HentBeregningsgrunnlagGUIRequest;
import no.nav.folketrygdloven.fpkalkulus.kontrakt.HåndterBeregningRequestDto;
import no.nav.folketrygdloven.fpkalkulus.kontrakt.KopierBeregningsgrunnlagRequestDto;
import no.nav.folketrygdloven.fpkalkulus.kontrakt.besteberegning.BesteberegningGrunnlagDto;
import no.nav.folketrygdloven.kalkulus.felles.v1.AktørIdPersonident;
import no.nav.folketrygdloven.kalkulus.felles.v1.Saksnummer;
import no.nav.folketrygdloven.kalkulus.håndtering.v1.HåndterBeregningDto;
import no.nav.folketrygdloven.kalkulus.kodeverk.BeregningSteg;
import no.nav.folketrygdloven.kalkulus.response.v1.beregningsgrunnlag.gui.BeregningsgrunnlagDto;
import no.nav.foreldrepenger.behandling.BehandlingReferanse;
import no.nav.foreldrepenger.behandling.aksjonspunkt.BekreftetAksjonspunktDto;
import no.nav.foreldrepenger.behandling.aksjonspunkt.OverstyringAksjonspunktDto;
import no.nav.foreldrepenger.behandlingslager.behandling.BehandlingStegType;
import no.nav.foreldrepenger.behandlingslager.fagsak.FagsakYtelseType;
import no.nav.foreldrepenger.domene.aksjonspunkt.KalkulusAksjonspunktMapper;
import no.nav.foreldrepenger.domene.aksjonspunkt.MapEndringsresultat;
import no.nav.foreldrepenger.domene.aksjonspunkt.OppdaterBeregningsgrunnlagResultat;
import no.nav.foreldrepenger.domene.entiteter.BeregningsgrunnlagKobling;
import no.nav.foreldrepenger.domene.entiteter.BeregningsgrunnlagKoblingRepository;
import no.nav.foreldrepenger.domene.fp.BesteberegningFødendeKvinneTjeneste;
import no.nav.foreldrepenger.domene.mappers.KalkulusInputTjeneste;
import no.nav.foreldrepenger.domene.mappers.fra_kalkulus_til_domene.KalkulusTilFpsakMapper;
import no.nav.foreldrepenger.domene.modell.BeregningsgrunnlagGrunnlag;
import no.nav.foreldrepenger.domene.modell.kodeverk.BeregningsgrunnlagTilstand;
import no.nav.foreldrepenger.domene.output.BeregningsgrunnlagVilkårOgAkjonspunktResultat;
import no.nav.foreldrepenger.domene.typer.Beløp;
import no.nav.foreldrepenger.skjæringstidspunkt.SkjæringstidspunktTjeneste;

@ApplicationScoped
public class BeregningKalkulus implements BeregningAPI {
Expand All @@ -46,6 +48,8 @@ public class BeregningKalkulus implements BeregningAPI {
private KalkulusKlient klient;
private KalkulusInputTjeneste kalkulusInputTjeneste;
private BeregningsgrunnlagKoblingRepository koblingRepository;
private BesteberegningFødendeKvinneTjeneste besteberegningFødendeKvinneTjeneste;
private SkjæringstidspunktTjeneste skjæringstidspunktTjeneste;

BeregningKalkulus() {
// CDI
Expand All @@ -54,18 +58,25 @@ public class BeregningKalkulus implements BeregningAPI {
@Inject
public BeregningKalkulus(KalkulusKlient klient,
KalkulusInputTjeneste kalkulusInputTjeneste,
BeregningsgrunnlagKoblingRepository koblingRepository) {
BeregningsgrunnlagKoblingRepository koblingRepository,
BesteberegningFødendeKvinneTjeneste besteberegningFødendeKvinneTjeneste,
SkjæringstidspunktTjeneste skjæringstidspunktTjeneste) {
this.klient = klient;
this.kalkulusInputTjeneste = kalkulusInputTjeneste;
this.koblingRepository = koblingRepository;
this.besteberegningFødendeKvinneTjeneste = besteberegningFødendeKvinneTjeneste;
this.skjæringstidspunktTjeneste = skjæringstidspunktTjeneste;
}

@Override
public Optional<BeregningsgrunnlagGrunnlag> hent(BehandlingReferanse referanse) {
var kobling = koblingRepository.hentKobling(referanse.behandlingId());
return kobling.flatMap(k -> {
var request = new EnkelFpkalkulusRequestDto(k.getKoblingUuid(), new Saksnummer(referanse.saksnummer().getVerdi()));
return klient.hentGrunnlag(request).map(KalkulusTilFpsakMapper::map);
var stp = skjæringstidspunktTjeneste.getSkjæringstidspunkter(referanse.behandlingId());
var måHenteBesteberegningsgrunnlag = besteberegningFødendeKvinneTjeneste.brukerOmfattesAvBesteBeregningsRegelForFødendeKvinne(referanse, stp);
Optional<BesteberegningGrunnlagDto> besteberegnetGrunnlag = måHenteBesteberegningsgrunnlag ? klient.hentGrunnlagBesteberegning(request) : Optional.empty();
return klient.hentGrunnlag(request).map(bgDto -> KalkulusTilFpsakMapper.map(bgDto, besteberegnetGrunnlag));
});
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.ws.rs.core.UriBuilder;

import no.nav.folketrygdloven.fpkalkulus.kontrakt.besteberegning.BesteberegningGrunnlagDto;
import no.nav.vedtak.exception.TekniskException;

import org.slf4j.Logger;
Expand Down Expand Up @@ -37,6 +38,7 @@ public class KalkulusKlient {
private URI beregn;
private URI hentGrunnlag;
private URI hentGrunnlagGui;
private URI hentGrunnlagBesteberegning;
private URI kopierGrunnlag;
private URI avklaringsbehov;
private URI deatkvier;
Expand All @@ -50,6 +52,7 @@ public KalkulusKlient() {
this.beregn = toUri(restConfig.fpContextPath(), "/api/kalkulus/v1/beregn");
this.hentGrunnlag = toUri(restConfig.fpContextPath(), "/api/kalkulus/v1/grunnlag");
this.hentGrunnlagGui = toUri(restConfig.fpContextPath(), "/api/kalkulus/v1/grunnlag/gui");
this.hentGrunnlagBesteberegning = toUri(restConfig.fpContextPath(), "/api/kalkulus/v1/grunnlag/besteberegning");
this.kopierGrunnlag = toUri(restConfig.fpContextPath(), "/api/kalkulus/v1/kopier");
this.avklaringsbehov = toUri(restConfig.fpContextPath(), "/api/kalkulus/v1/avklaringsbehov");
this.deatkvier = toUri(restConfig.fpContextPath(), "/api/kalkulus/v1/deaktiver");
Expand Down Expand Up @@ -77,6 +80,11 @@ public Optional<BeregningsgrunnlagDto> hentGrunnlagGUI(HentBeregningsgrunnlagGUI
return restClient.sendReturnOptional(restRequest, BeregningsgrunnlagDto.class);
}

public Optional<BesteberegningGrunnlagDto> hentGrunnlagBesteberegning(EnkelFpkalkulusRequestDto request) {
var restRequest = RestRequest.newPOSTJson(request, hentGrunnlagBesteberegning, restConfig);
return restClient.sendReturnOptional(restRequest, BesteberegningGrunnlagDto.class);
}

public void kopierGrunnlag(KopierBeregningsgrunnlagRequestDto request) {
var restRequest = RestRequest.newPOSTJson(request, kopierGrunnlag, restConfig);
var respons = restClient.sendReturnUnhandled(restRequest);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,37 +3,43 @@
import static org.assertj.core.api.Assertions.assertThat;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.UUID;
import java.util.stream.Collectors;

import org.junit.jupiter.api.Test;

import no.nav.folketrygdloven.fpkalkulus.kontrakt.besteberegning.BesteberegningGrunnlagDto;
import no.nav.folketrygdloven.kalkulus.felles.v1.Beløp;
import no.nav.folketrygdloven.kalkulus.felles.v1.InternArbeidsforholdRefDto;
import no.nav.folketrygdloven.kalkulus.felles.v1.Periode;
import no.nav.folketrygdloven.kalkulus.kodeverk.OpptjeningAktivitetType;
import no.nav.folketrygdloven.kalkulus.response.v1.beregningsgrunnlag.detaljert.BGAndelArbeidsforhold;
import no.nav.folketrygdloven.kalkulus.response.v1.beregningsgrunnlag.detaljert.BeregningAktivitetDto;
import no.nav.folketrygdloven.kalkulus.response.v1.beregningsgrunnlag.detaljert.BeregningsgrunnlagGrunnlagDto;
import no.nav.folketrygdloven.kalkulus.response.v1.beregningsgrunnlag.detaljert.BeregningsgrunnlagPeriodeDto;
import no.nav.folketrygdloven.kalkulus.response.v1.beregningsgrunnlag.detaljert.BeregningsgrunnlagPrStatusOgAndelDto;
import no.nav.foreldrepenger.behandlingslager.virksomhet.Arbeidsgiver;
import no.nav.foreldrepenger.domene.json.StandardJsonConfig;
import no.nav.foreldrepenger.domene.mappers.fra_kalkulator_til_entitet.KodeverkFraKalkulusMapper;
import no.nav.foreldrepenger.domene.mappers.fra_kalkulus_til_domene.KalkulusTilFpsakMapper;
import no.nav.foreldrepenger.domene.modell.BeregningAktivitet;
import no.nav.foreldrepenger.domene.modell.BeregningsgrunnlagPrStatusOgAndel;

import org.junit.jupiter.api.Test;

import no.nav.folketrygdloven.kalkulus.response.v1.beregningsgrunnlag.detaljert.BeregningsgrunnlagGrunnlagDto;
import no.nav.folketrygdloven.kalkulus.response.v1.beregningsgrunnlag.detaljert.BeregningsgrunnlagPeriodeDto;
import no.nav.foreldrepenger.domene.json.StandardJsonConfig;
import no.nav.foreldrepenger.domene.modell.BeregningsgrunnlagAktivitetStatus;
import no.nav.foreldrepenger.domene.modell.BeregningsgrunnlagPeriode;
import no.nav.foreldrepenger.domene.modell.BeregningsgrunnlagPrStatusOgAndel;

class KalkulusTilFpsakMapperTest {

@Test
void skal_teste_mapping() {
var kontraktBgg = bgFraJson();

var domeneBgg = KalkulusTilFpsakMapper.map(kontraktBgg);
var domeneBgg = KalkulusTilFpsakMapper.map(kontraktBgg, Optional.empty());

var domenebg = domeneBgg.getBeregningsgrunnlag().orElseThrow();
var kontraktbg = kontraktBgg.getBeregningsgrunnlag();
Expand All @@ -52,6 +58,55 @@ void skal_teste_mapping() {
}
}

@Test
void skal_teste_mapping_med_besteberegning() {
var kontraktBgg = bgFraJson();


var arbRef = UUID.randomUUID().toString();
var inntektDPDto = new BesteberegningGrunnlagDto.BesteberegningInntektDto(OpptjeningAktivitetType.DAGPENGER, Beløp.fra(5000),
null, null);
var inntektATDto = new BesteberegningGrunnlagDto.BesteberegningInntektDto(OpptjeningAktivitetType.ARBEID, Beløp.fra(1234),
new no.nav.folketrygdloven.kalkulus.response.v1.Arbeidsgiver("999999999", null), new InternArbeidsforholdRefDto(arbRef));
var inntektMåned = new BesteberegningGrunnlagDto.BesteberegningMånedDto(
new Periode(LocalDate.of(2024, 1, 1), LocalDate.of(2024, 1, 31)), List.of(inntektDPDto, inntektATDto));
var besteberegningDto = new BesteberegningGrunnlagDto(Collections.singletonList(inntektMåned), Beløp.fra(70000));
var domeneBgg = KalkulusTilFpsakMapper.map(kontraktBgg, Optional.of(besteberegningDto));

var domenebg = domeneBgg.getBeregningsgrunnlag().orElseThrow();
var kontraktbg = kontraktBgg.getBeregningsgrunnlag();
assertThat(domenebg.getSkjæringstidspunkt()).isEqualTo(kontraktbg.getSkjæringstidspunkt());
assertThat(domenebg.getGrunnbeløp().getVerdi()).isEqualTo(kontraktbg.getGrunnbeløp().verdi());
assertThat(domenebg.getAktivitetStatuser().stream().map(BeregningsgrunnlagAktivitetStatus::getAktivitetStatus))
.containsAll(kontraktbg.getAktivitetStatuser().stream().map(KodeverkFraKalkulusMapper::mapAktivitetstatus).collect(Collectors.toList()));
assertThat(domenebg.getBeregningsgrunnlagPerioder()).hasSameSizeAs(kontraktbg.getBeregningsgrunnlagPerioder());
assertPerioder(domenebg.getBeregningsgrunnlagPerioder().stream()
.sorted(Comparator.comparing(bgp -> bgp.getPeriode().getFomDato())).collect(Collectors.toList()), kontraktbg.getBeregningsgrunnlagPerioder().stream()
.sorted(Comparator.comparing(bgp -> bgp.getPeriode().getFom())).collect(Collectors.toList()));
if (kontraktBgg.getRegisterAktiviteter() != null) {
assertThat(domeneBgg.getRegisterAktiviteter()).isNotNull();
assertThat(domeneBgg.getRegisterAktiviteter().getSkjæringstidspunktOpptjening()).isEqualTo(kontraktBgg.getRegisterAktiviteter().getSkjæringstidspunktOpptjening());
assertLikeAktiviteter(kontraktBgg.getRegisterAktiviteter().getAktiviteter(), domeneBgg.getRegisterAktiviteter().getBeregningAktiviteter());
}

var domeneBbg = domenebg.getBesteberegningGrunnlag();
assertThat(domeneBbg).isPresent();
assertThat(domeneBbg.get().getAvvik().get()).isEqualByComparingTo(BigDecimal.valueOf(70000));
assertThat(domeneBbg.get().getSeksBesteMåneder()).hasSize(1);
assertThat(domeneBbg.get().getSeksBesteMåneder().stream().findFirst().get().getInntekter()).hasSize(2);
assertThat(domeneBbg.get().getSeksBesteMåneder().stream().findFirst().get().getPeriode().getFomDato()).isEqualTo(inntektMåned.periode().getFom());
assertThat(domeneBbg.get().getSeksBesteMåneder().stream().findFirst().get().getPeriode().getTomDato()).isEqualTo(inntektMåned.periode().getTom());
var atAndel = domeneBbg.get().getSeksBesteMåneder().stream().findFirst().get().getInntekter().stream().filter(i -> i.getOpptjeningAktivitetType().equals(
no.nav.foreldrepenger.behandlingslager.behandling.opptjening.OpptjeningAktivitetType.ARBEID)).findFirst();
var dpAndel = domeneBbg.get().getSeksBesteMåneder().stream().findFirst().get().getInntekter().stream().filter(i -> i.getOpptjeningAktivitetType().equals(
no.nav.foreldrepenger.behandlingslager.behandling.opptjening.OpptjeningAktivitetType.DAGPENGER)).findFirst();
assertThat(dpAndel.get().getInntekt()).isEqualByComparingTo(BigDecimal.valueOf(5000));

assertThat(atAndel.get().getInntekt()).isEqualByComparingTo(BigDecimal.valueOf(1234));
assertThat(atAndel.get().getArbeidsgiver().getIdentifikator()).isEqualTo("999999999");
assertThat(atAndel.get().getArbeidsforholdRef().getReferanse()).isEqualTo(arbRef);
}

private void assertLikeAktiviteter(List<BeregningAktivitetDto> kontraktAktiviteter, List<BeregningAktivitet> domeneAktiviteter) {
assertThat(kontraktAktiviteter).hasSameSizeAs(domeneAktiviteter);
kontraktAktiviteter.forEach(ka -> {
Expand Down
Loading

0 comments on commit 422feae

Please sign in to comment.