Skip to content

Commit

Permalink
TFP-5615 Neste steg i omlegging fra BS/SSG til PGI (#2466)
Browse files Browse the repository at this point in the history
Neste steg i omlegging fra BS/SSG til PGI
  • Loading branch information
jolarsen authored Nov 28, 2023
1 parent d569808 commit eecde59
Show file tree
Hide file tree
Showing 6 changed files with 107 additions and 32 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,8 @@

import java.math.BigDecimal;
import java.time.Year;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.function.Supplier;
import java.util.stream.Collectors;

Expand All @@ -19,9 +16,7 @@
import no.nav.foreldrepenger.abakus.felles.jpa.IntervallEntitet;
import no.nav.foreldrepenger.abakus.registerdata.inntekt.sigrun.klient.SigrunConsumer;
import no.nav.foreldrepenger.abakus.registerdata.inntekt.sigrun.klient.SigrunResponse;
import no.nav.foreldrepenger.abakus.registerdata.inntekt.sigrun.klient.pgifolketrygden.PgiFolketrygdenResponse;
import no.nav.foreldrepenger.abakus.registerdata.inntekt.sigrun.klient.pgifolketrygden.SigrunPgiFolketrygdenMapper;
import no.nav.foreldrepenger.abakus.registerdata.inntekt.sigrun.klient.summertskattegrunnlag.SSGResponse;
import no.nav.foreldrepenger.abakus.registerdata.inntekt.sigrun.klient.summertskattegrunnlag.SigrunSummertSkattegrunnlagResponse;
import no.nav.foreldrepenger.abakus.typer.AktørId;
import no.nav.foreldrepenger.abakus.typer.PersonIdent;
Expand All @@ -46,6 +41,18 @@ public SigrunTjeneste(SigrunConsumer sigrunConsumer) {
}


public Map<IntervallEntitet, Map<InntektspostType, BigDecimal>> hentPensjonsgivende(Supplier<PersonIdent> fnrSupplier, IntervallEntitet opplysningsperiodeSkattegrunnlag) {
var fnr = fnrSupplier.get();
if (fnr == null || fnr.getIdent() == null) {
LOG.info("SIGRUN PGI: fant ikke fnr for aktørid");
return Map.of();
}
var svarene = sigrunConsumer.pensjonsgivendeInntektForFolketrygden(fnr.getIdent(), opplysningsperiodeSkattegrunnlag);
return SigrunPgiFolketrygdenMapper.mapFraPgiResponseTilIntern(svarene).entrySet().stream()
.filter(e -> !e.getValue().isEmpty())
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
}

public Map<IntervallEntitet, Map<InntektspostType, BigDecimal>> beregnetSkatt(AktørId aktørId, Supplier<PersonIdent> fnrSupplier, IntervallEntitet opplysningsperiodeSkattegrunnlag) {

var justertOpplysningsperiode = justerOpplysningsperiodeNårSisteÅrIkkeErFerdiglignet(Long.valueOf(aktørId.getId()), opplysningsperiodeSkattegrunnlag);
Expand All @@ -54,45 +61,28 @@ public Map<IntervallEntitet, Map<InntektspostType, BigDecimal>> beregnetSkatt(Ak
opplysningsperiodeSkattegrunnlag);
var resultat = SigrunTilInternMapper.mapFraSigrunTilIntern(beregnetskatt.beregnetSkatt(), summertSkattegrunnlag.summertskattegrunnlagMap());
if (SAMMENLIGN_PGI) {
var fnr = fnrSupplier.get();
if (fnr != null) {
sammenlignPGI(fnr, justertOpplysningsperiode, resultat, summertSkattegrunnlag);
}
sammenlignPGI(fnrSupplier, justertOpplysningsperiode, resultat);
}
return resultat;
}

private void sammenlignPGI(PersonIdent pi, IntervallEntitet opplysningsperiode,
Map<IntervallEntitet, Map<InntektspostType, BigDecimal>> bs,
SigrunSummertSkattegrunnlagResponse summertSkattegrunnlag) {
private void sammenlignPGI(Supplier<PersonIdent> fnrSupplier, IntervallEntitet opplysningsperiode,
Map<IntervallEntitet, Map<InntektspostType, BigDecimal>> bs) {
try {
var nettoBs = bs.entrySet().stream().filter(e -> !e.getValue().isEmpty()).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
var harSvalbardSSG = summertSkattegrunnlag.summertskattegrunnlagMap().values().stream()
.flatMap(Optional::stream)
.map(SSGResponse::svalbardGrunnlag)
.mapToLong(Collection::size)
.sum() > 0 ? "Svalbard SSG" : "";
var pgiMap = sigrunConsumer.pgiFolketrygden(pi.getIdent(), opplysningsperiode);
var harSvalbardPGI = pgiMap.pgiFolketrygdenMap().values().stream()
.flatMap(Collection::stream)
.map(PgiFolketrygdenResponse::pensjonsgivendeInntekt)
.flatMap(Collection::stream)
.anyMatch(v -> PgiFolketrygdenResponse.Skatteordning.SVALBARD.equals(v.skatteordning())) ? "Svalbard PGI" : "";
var nettoPgi = SigrunPgiFolketrygdenMapper.mapFraSigrunTilIntern(pgiMap).entrySet().stream()
.filter(e -> !e.getValue().isEmpty())
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
var nettoPgi = hentPensjonsgivende(fnrSupplier, opplysningsperiode);
if (nettoBs.isEmpty() && nettoPgi.isEmpty()) {
LOG.info("SIGRUN PGI: sammenlignet OK tomme svar fra begge {} {}", harSvalbardSSG, harSvalbardPGI);
LOG.info("SIGRUN PGI: sammenlignet OK tomme svar fra begge");
} else if (!nettoPgi.values().isEmpty() && nettoPgi.values().stream().anyMatch(v -> !v.values().isEmpty())) {
if (sammenlignMaps(nettoBs, nettoPgi)) {
LOG.info("SIGRUN PGI: sammenlignet OK {} {}", harSvalbardSSG, harSvalbardPGI);
LOG.info("SIGRUN PGI: sammenlignet OK");
} else {
LOG.info("SIGRUN PGI: sammenlignet DIFF {} {} BS/SSG {} PGI {} kilde {}", harSvalbardSSG, harSvalbardPGI, bs, nettoPgi, pgiMap);
LOG.info("SIGRUN PGI: sammenlignet DIFF BS/SSG {} PGI {}", bs, nettoPgi);
}
} else if (!nettoBs.values().isEmpty() && nettoBs.values().stream().anyMatch(v -> !v.values().isEmpty())) {
LOG.info("SIGRUN PGI: tomt svar fra PGI {} {} BS//SG {} kilde {}", harSvalbardSSG, harSvalbardPGI, bs, pgiMap);
LOG.info("SIGRUN PGI: tomt svar fra PGI BS//SG {}", bs);
} else {
LOG.info("SIGRUN PGI: tomme svar fra BS//SG {} kilde {}", bs, pgiMap);
LOG.info("SIGRUN PGI: tomme svar fra BS//SG {}", bs);
}
} catch (Exception e) {
LOG.info("SIGRUN PGI: noe gikk veldig galt", e);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package no.nav.foreldrepenger.abakus.registerdata.inntekt.sigrun.klient;

import java.time.Year;
import java.util.List;

import no.nav.foreldrepenger.abakus.felles.jpa.IntervallEntitet;
import no.nav.foreldrepenger.abakus.registerdata.inntekt.sigrun.klient.pgifolketrygden.PgiFolketrygdenResponse;
import no.nav.foreldrepenger.abakus.registerdata.inntekt.sigrun.klient.pgifolketrygden.SigrunPgiFolketrygdenResponse;
import no.nav.foreldrepenger.abakus.registerdata.inntekt.sigrun.klient.summertskattegrunnlag.SigrunSummertSkattegrunnlagResponse;

Expand All @@ -14,6 +16,8 @@ public interface SigrunConsumer {

SigrunPgiFolketrygdenResponse pgiFolketrygden(String fnr, IntervallEntitet opplysningsperiode);

List<PgiFolketrygdenResponse> pensjonsgivendeInntektForFolketrygden(String fnr, IntervallEntitet opplysningsperiode);

boolean erÅretFerdiglignet(Long aktørId, Year år);

}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import java.time.MonthDay;
import java.time.Year;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
Expand All @@ -13,6 +14,7 @@

import jakarta.enterprise.context.ApplicationScoped;
import no.nav.foreldrepenger.abakus.felles.jpa.IntervallEntitet;
import no.nav.foreldrepenger.abakus.registerdata.inntekt.sigrun.klient.pgifolketrygden.PgiFolketrygdenResponse;
import no.nav.foreldrepenger.abakus.registerdata.inntekt.sigrun.klient.pgifolketrygden.SigrunPgiFolketrygdenResponse;
import no.nav.foreldrepenger.abakus.registerdata.inntekt.sigrun.klient.summertskattegrunnlag.SSGResponse;
import no.nav.foreldrepenger.abakus.registerdata.inntekt.sigrun.klient.summertskattegrunnlag.SigrunSummertSkattegrunnlagResponse;
Expand All @@ -25,6 +27,8 @@ public class SigrunConsumerImpl implements SigrunConsumer {
private static final String TEKNISK_NAVN = "skatteoppgjoersdato";

private static final MonthDay TIDLIGSTE_SJEKK_FJOR = MonthDay.of(5, 1);

private static final Year FØRSTE_PGI = Year.of(2017);
private static final boolean IS_PROD = Environment.current().isProd();
private final SigrunRestClient client;

Expand Down Expand Up @@ -61,6 +65,41 @@ public SigrunPgiFolketrygdenResponse pgiFolketrygden(String fnr, IntervallEntite
return new SigrunPgiFolketrygdenResponse(funnet);
}

@Override
public List<PgiFolketrygdenResponse> pensjonsgivendeInntektForFolketrygden(String fnr, IntervallEntitet opplysningsperiode) {
var senesteÅr = utledSenesteÅr(opplysningsperiode);
List<PgiFolketrygdenResponse> svarene = new ArrayList<>();
var svarSenesteÅr = kanVenteFerdiglignetFor(senesteÅr) ? client.hentPensjonsgivendeInntektForFolketrygden(fnr, senesteÅr) : null;
Optional.ofNullable(svarSenesteÅr).ifPresent(svarene::add);
utledTidligereÅr(opplysningsperiode, senesteÅr, senesteÅr != null)
.forEach(år -> Optional.ofNullable(client.hentPensjonsgivendeInntektForFolketrygden(fnr, år)).ifPresent(svarene::add));
return svarene;
}

public boolean kanVenteFerdiglignetFor(Year år) {
return !(IS_PROD && Year.now().minusYears(1).equals(år) && MonthDay.now().isBefore(TIDLIGSTE_SJEKK_FJOR));
}

private Year utledSenesteÅr(IntervallEntitet opplysningsperiode) {
var ifjor = Year.now().minusYears(1);
var oppgitt = opplysningsperiode != null ? Year.from(opplysningsperiode.getTomDato()) : ifjor;
return oppgitt.isAfter(ifjor) ? ifjor : oppgitt;
}

private List<Year> utledTidligereÅr(IntervallEntitet opplysningsperiode, Year senesteÅr, boolean harDataSenesteÅr) {
var tidligsteÅr = opplysningsperiode != null ? Year.from(opplysningsperiode.getFomDato()) : senesteÅr.minusYears(2);
var fraTidligsteÅr = harDataSenesteÅr ? tidligsteÅr : tidligsteÅr.minusYears(1);
if (fraTidligsteÅr.isBefore(FØRSTE_PGI)) {
fraTidligsteÅr = FØRSTE_PGI;
}
List<Year> årene = new ArrayList<>();
while (fraTidligsteÅr.isBefore(senesteÅr)) {
årene.add(fraTidligsteÅr);
fraTidligsteÅr = fraTidligsteÅr.plusYears(1);
}
return årene.stream().sorted(Comparator.reverseOrder()).toList();
}

@Override
public boolean erÅretFerdiglignet(Long aktørId, Year år) {
if (IS_PROD && Year.now().minusYears(1).equals(år) && MonthDay.now().isBefore(TIDLIGSTE_SJEKK_FJOR)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import java.net.HttpURLConnection;
import java.net.URI;
import java.net.http.HttpResponse;
import java.time.Year;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
Expand Down Expand Up @@ -37,6 +38,8 @@ public class SigrunRestClient {

private static final boolean IS_DEV = Environment.current().isDev();

private static final Year FØRSTE_PGI = Year.of(2017);

private static final Logger LOG = LoggerFactory.getLogger(SigrunRestClient.class);
private final OidcContextSupplier CONTEXT_SUPPLIER = new OidcContextSupplier();
private final RestClient client;
Expand Down Expand Up @@ -134,4 +137,26 @@ List<PgiFolketrygdenResponse> hentPgiForFolketrygden(String fnr, String år) {
}
}

//api/v1/pensjonsgivendeinntektforfolketrygden
PgiFolketrygdenResponse hentPensjonsgivendeInntektForFolketrygden(String fnr, Year år) {
if (år.isBefore(FØRSTE_PGI)) {
return null;
}
var request = RestRequest.newGET(endpointPgiFT, restConfig)
.header(NavHeaders.HEADER_NAV_PERSONIDENT, fnr)
.header("norskident", fnr) // PGA skd-stub i dev
.header(SigrunRestConfig.INNTEKTSAAR, år.toString())
.otherCallId(X_CALL_ID)
.header(SigrunRestConfig.CONSUMER_ID, CONTEXT_SUPPLIER.consumerIdForCurrentKontekst().get());

HttpResponse<String> response = client.sendReturnUnhandled(request);
// Sigrun-skd-stub i DEV returnerer en liste, mens ekte Sigrun returnerer objekt.
if (IS_DEV) {
return handleResponse(response).map(r -> DefaultJsonMapper.listFromJson(r, PgiFolketrygdenResponse.class))
.flatMap(l -> l.stream().findFirst()).orElse(null);
} else {
return handleResponse(response).map(r -> DefaultJsonMapper.fromJson(r, PgiFolketrygdenResponse.class)).orElse(null);
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,13 @@ public enum Skatteordning {
FASTLAND, SVALBARD, KILDESKATT_PAA_LOENN
}

// Mens vi venter på avklaring rundt kildeskatt
public List<Pgi> pgiSomSikkertKanBrukes() {
return pensjonsgivendeInntekt().stream()
.filter(p -> !Skatteordning.KILDESKATT_PAA_LOENN.equals(p.skatteordning()))
.toList();
}

@Override
public String toString() {
return "PgiFolketrygdenResponse{" + "inntektsaar=" + inntektsaar + ", pensjonsgivendeInntekt=" + pensjonsgivendeInntekt + '}';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,16 @@

public final class SigrunPgiFolketrygdenMapper {

public static Map<IntervallEntitet, Map<InntektspostType, BigDecimal>> mapFraPgiResponseTilIntern(List<PgiFolketrygdenResponse> response) {
Map<IntervallEntitet, Map<InntektspostType, BigDecimal>> resultat = new LinkedHashMap<>();
response.stream()
.collect(Collectors.groupingBy(PgiFolketrygdenResponse::inntektsaar))
.values().stream()
.map(SigrunPgiFolketrygdenMapper::mapPgiFolketrygden)
.forEach(resultat::putAll);
return resultat;
}

public static Map<IntervallEntitet, Map<InntektspostType, BigDecimal>> mapFraSigrunTilIntern(SigrunPgiFolketrygdenResponse response) {
Map<IntervallEntitet, Map<InntektspostType, BigDecimal>> resultat = new LinkedHashMap<>();
response.pgiFolketrygdenMap().values().stream()
Expand All @@ -28,7 +38,7 @@ public static Map<IntervallEntitet, Map<InntektspostType, BigDecimal>> mapPgiFol
}
var inntektBeløp = new ArrayList<InntektBeløp>();
for (var responselement : response) {
for (var pgi : responselement.pensjonsgivendeInntekt()) {
for (var pgi : responselement.pgiSomSikkertKanBrukes()) {
leggTilHvisVerdi(pgi.pensjonsgivendeInntektAvLoennsinntekt(), InntektspostType.LØNN, inntektBeløp);
leggTilHvisVerdi(pgi.pensjonsgivendeInntektAvLoennsinntektBarePensjonsdel(), InntektspostType.LØNN, inntektBeløp);
leggTilHvisVerdi(pgi.pensjonsgivendeInntektAvNaeringsinntekt(), InntektspostType.SELVSTENDIG_NÆRINGSDRIVENDE, inntektBeløp);
Expand Down

0 comments on commit eecde59

Please sign in to comment.