Skip to content

Commit bc5e844

Browse files
authored
TFP-5615 legg om til Sigrun PGI for Folketrygden (#2467)
* Tfeature/TFP-5615-bruk-pgiFP-5615 legg om til Sigrun PGI for Folketrygden * TFP-5615 ta med kildeskatt lønn * Forenkle oppsett Sigrun * Restanser * Felles 709 fra master * Sigrun skal håndtere PGIF008
1 parent dc58fc1 commit bc5e844

24 files changed

+234
-982
lines changed

domenetjenester/iay/src/main/java/no/nav/foreldrepenger/abakus/registerdata/IAYRegisterInnhentingTjeneste.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,9 @@ public IAYRegisterInnhentingTjeneste(InntektArbeidYtelseTjeneste inntektArbeidYt
9696
LOG.info("Henter lignet inntekt for sak=[{}, {}] med behandling='{}'", kobling.getSaksnummer(), kobling.getYtelseType(),
9797
kobling.getKoblingReferanse());
9898

99-
var map = sigrunTjeneste.beregnetSkatt(kobling.getAktørId(), new FnrSupplier(kobling.getAktørId())::tilPersonIdent,
100-
kobling.getOpplysningsperiodeSkattegrunnlag());
99+
var personIdent = getFnrFraAktørId(kobling.getAktørId());
100+
101+
var map = sigrunTjeneste.hentPensjonsgivende(personIdent, kobling.getOpplysningsperiodeSkattegrunnlag());
101102
var aktørInntektBuilder = inntektArbeidYtelseAggregatBuilder.getAktørInntektBuilder(kobling.getAktørId());
102103

103104
var inntektBuilder = aktørInntektBuilder.getInntektBuilder(InntektskildeType.SIGRUN, null);

domenetjenester/iay/src/main/java/no/nav/foreldrepenger/abakus/registerdata/inntekt/sigrun/SigrunTilInternMapper.java

Lines changed: 0 additions & 98 deletions
This file was deleted.
Lines changed: 47 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
11
package no.nav.foreldrepenger.abakus.registerdata.inntekt.sigrun;
22

3+
import static java.time.temporal.ChronoUnit.YEARS;
4+
35
import java.math.BigDecimal;
6+
import java.time.Month;
7+
import java.time.MonthDay;
48
import java.time.Year;
9+
import java.util.ArrayList;
10+
import java.util.Comparator;
11+
import java.util.List;
512
import java.util.Map;
6-
import java.util.Objects;
7-
import java.util.function.Supplier;
13+
import java.util.Optional;
814
import java.util.stream.Collectors;
915

1016
import org.slf4j.Logger;
@@ -14,110 +20,78 @@
1420
import jakarta.inject.Inject;
1521
import no.nav.abakus.iaygrunnlag.kodeverk.InntektspostType;
1622
import no.nav.foreldrepenger.abakus.felles.jpa.IntervallEntitet;
17-
import no.nav.foreldrepenger.abakus.registerdata.inntekt.sigrun.klient.SigrunConsumer;
18-
import no.nav.foreldrepenger.abakus.registerdata.inntekt.sigrun.klient.SigrunResponse;
19-
import no.nav.foreldrepenger.abakus.registerdata.inntekt.sigrun.klient.pgifolketrygden.SigrunPgiFolketrygdenMapper;
20-
import no.nav.foreldrepenger.abakus.registerdata.inntekt.sigrun.klient.summertskattegrunnlag.SigrunSummertSkattegrunnlagResponse;
21-
import no.nav.foreldrepenger.abakus.typer.AktørId;
23+
import no.nav.foreldrepenger.abakus.registerdata.inntekt.sigrun.klient.PgiFolketrygdenResponse;
24+
import no.nav.foreldrepenger.abakus.registerdata.inntekt.sigrun.klient.SigrunPgiFolketrygdenMapper;
25+
import no.nav.foreldrepenger.abakus.registerdata.inntekt.sigrun.klient.SigrunRestClient;
2226
import no.nav.foreldrepenger.abakus.typer.PersonIdent;
2327

2428

2529
@ApplicationScoped
2630
public class SigrunTjeneste {
2731
private static final Logger LOG = LoggerFactory.getLogger(SigrunTjeneste.class);
2832

29-
private static final boolean SAMMENLIGN_PGI = true;
33+
private static final MonthDay TIDLIGSTE_SJEKK_FJOR = MonthDay.of(Month.MAY, 1);
3034

31-
private SigrunConsumer sigrunConsumer;
35+
private static final Year FØRSTE_PGI = Year.of(2017);
36+
private SigrunRestClient sigrunConsumer;
3237

3338
SigrunTjeneste() {
3439
//CDI
3540
}
3641

3742
@Inject
38-
public SigrunTjeneste(SigrunConsumer sigrunConsumer) {
43+
public SigrunTjeneste(SigrunRestClient sigrunConsumer) {
3944
this.sigrunConsumer = sigrunConsumer;
4045
}
4146

4247

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

55-
public Map<IntervallEntitet, Map<InntektspostType, BigDecimal>> beregnetSkatt(AktørId aktørId, Supplier<PersonIdent> fnrSupplier, IntervallEntitet opplysningsperiodeSkattegrunnlag) {
55+
private List<PgiFolketrygdenResponse> pensjonsgivendeInntektForFolketrygden(String fnr, IntervallEntitet opplysningsperiode) {
56+
var senesteÅr = utledSenesteÅr(opplysningsperiode);
57+
List<PgiFolketrygdenResponse> svarene = new ArrayList<>();
58+
var svarSenesteÅr = svarForSenesteÅr(fnr, senesteÅr);
59+
svarSenesteÅr.ifPresent(svarene::add);
60+
utledTidligereÅr(opplysningsperiode, senesteÅr, svarSenesteÅr.isPresent())
61+
.forEach(år -> sigrunConsumer.hentPensjonsgivendeInntektForFolketrygden(fnr, år).ifPresent(svarene::add));
62+
return svarene;
63+
}
5664

57-
var justertOpplysningsperiode = justerOpplysningsperiodeNårSisteÅrIkkeErFerdiglignet(Long.valueOf(aktørId.getId()), opplysningsperiodeSkattegrunnlag);
58-
SigrunResponse beregnetskatt = sigrunConsumer.beregnetskatt(Long.valueOf(aktørId.getId()), justertOpplysningsperiode);
59-
SigrunSummertSkattegrunnlagResponse summertSkattegrunnlag = sigrunConsumer.summertSkattegrunnlag(Long.valueOf(aktørId.getId()),
60-
opplysningsperiodeSkattegrunnlag);
61-
var resultat = SigrunTilInternMapper.mapFraSigrunTilIntern(beregnetskatt.beregnetSkatt(), summertSkattegrunnlag.summertskattegrunnlagMap());
62-
if (SAMMENLIGN_PGI) {
63-
sammenlignPGI(fnrSupplier, justertOpplysningsperiode, resultat);
64-
}
65-
return resultat;
65+
private Year utledSenesteÅr(IntervallEntitet opplysningsperiode) {
66+
var ifjor = Year.now().minusYears(1);
67+
var oppgitt = opplysningsperiode != null ? Year.from(opplysningsperiode.getTomDato()) : ifjor;
68+
return oppgitt.isAfter(ifjor) ? ifjor : oppgitt;
6669
}
6770

68-
private void sammenlignPGI(Supplier<PersonIdent> fnrSupplier, IntervallEntitet opplysningsperiode,
69-
Map<IntervallEntitet, Map<InntektspostType, BigDecimal>> bs) {
71+
public Optional<PgiFolketrygdenResponse> svarForSenesteÅr(String fnr, Year senesteÅr) {
72+
if (Year.now().minusYears(1).equals(senesteÅr) && MonthDay.now().isBefore(TIDLIGSTE_SJEKK_FJOR)) {
73+
return Optional.empty();
74+
}
7075
try {
71-
var nettoBs = bs.entrySet().stream().filter(e -> !e.getValue().isEmpty()).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
72-
var nettoPgi = hentPensjonsgivende(fnrSupplier, opplysningsperiode);
73-
if (nettoBs.isEmpty() && nettoPgi.isEmpty()) {
74-
LOG.info("SIGRUN PGI: sammenlignet OK tomme svar fra begge");
75-
} else if (!nettoPgi.values().isEmpty() && nettoPgi.values().stream().anyMatch(v -> !v.values().isEmpty())) {
76-
if (sammenlignMaps(nettoBs, nettoPgi)) {
77-
LOG.info("SIGRUN PGI: sammenlignet OK");
78-
} else {
79-
LOG.info("SIGRUN PGI: sammenlignet DIFF BS/SSG {} PGI {}", bs, nettoPgi);
80-
}
81-
} else if (!nettoBs.values().isEmpty() && nettoBs.values().stream().anyMatch(v -> !v.values().isEmpty())) {
82-
LOG.info("SIGRUN PGI: tomt svar fra PGI BS//SG {}", bs);
83-
} else {
84-
LOG.info("SIGRUN PGI: tomme svar fra BS//SG {}", bs);
85-
}
76+
return sigrunConsumer.hentPensjonsgivendeInntektForFolketrygden(fnr, senesteÅr);
8677
} catch (Exception e) {
87-
LOG.info("SIGRUN PGI: noe gikk veldig galt", e);
78+
return Optional.empty();
8879
}
8980
}
9081

91-
private static boolean sammenlignMaps(Map<IntervallEntitet, Map<InntektspostType, BigDecimal>> bs, Map<IntervallEntitet, Map<InntektspostType, BigDecimal>> pgi) {
92-
return Objects.equals(bs.keySet(), pgi.keySet()) && pgi.entrySet().stream().allMatch(e -> sammenlignSubMaps(bs.get(e.getKey()), e.getValue()));
93-
}
94-
95-
private static boolean sammenlignSubMaps(Map<InntektspostType, BigDecimal> bs, Map<InntektspostType, BigDecimal> pgi) {
96-
return bs != null && Objects.equals(bs.keySet(), pgi.keySet()) && pgi.entrySet().stream().allMatch(e -> sammenlignSubMapVerdier(bs.get(e.getKey()), e.getValue()));
97-
}
98-
99-
private static boolean sammenlignSubMapVerdier(BigDecimal bs, BigDecimal pgi) {
100-
return Objects.equals(bs, pgi) || (bs != null && pgi.compareTo(bs) == 0);
101-
}
102-
103-
IntervallEntitet justerOpplysningsperiodeNårSisteÅrIkkeErFerdiglignet(Long aktørId, IntervallEntitet opplysningsperiode) {
104-
if (opplysningsperiode == null){
105-
return null; //fpsak spør unten å oppgi periode
82+
private List<Year> utledTidligereÅr(IntervallEntitet opplysningsperiode, Year senesteÅr, boolean harDataSenesteÅr) {
83+
long periodeLengde = opplysningsperiode != null ? YEARS.between(opplysningsperiode.getFomDato(), opplysningsperiode.getTomDato()) : 2L;
84+
var tidligsteÅr = opplysningsperiode != null ? Year.from(opplysningsperiode.getFomDato()) : senesteÅr.minusYears(2);
85+
var fraTidligsteÅr = harDataSenesteÅr || periodeLengde > 2L ? tidligsteÅr : tidligsteÅr.minusYears(1);
86+
if (fraTidligsteÅr.isBefore(FØRSTE_PGI)) {
87+
fraTidligsteÅr = FØRSTE_PGI;
10688
}
107-
// justerer slik at vi henter ett å eldre data når siste år som etterspørs ikke er ferdiglignet enda
108-
int fomÅr = opplysningsperiode.getFomDato().getYear();
109-
int tomÅr = opplysningsperiode.getTomDato().getYear();
110-
Year iFjor = Year.now().minusYears(1);
111-
LOG.info("Opprinnelig opplysningsperiode er fom {} tom {}", fomÅr, tomÅr);
112-
if (opplysningsperiode.getTomDato().getYear() == iFjor.getValue()) {
113-
boolean fjoråretFerdiglignet = sigrunConsumer.erÅretFerdiglignet(aktørId, iFjor);
114-
LOG.info("Ferdiglignet {}", fjoråretFerdiglignet);
115-
if (!fjoråretFerdiglignet && tomÅr - fomÅr < 3) { //dataminimering, ikke behov for data ut over 3 hele år før første stp
116-
LOG.info("Utvider opplysningsperioden med ett år pga ikke-ferdiglignet år");
117-
return IntervallEntitet.fraOgMedTilOgMed(opplysningsperiode.getFomDato().minusYears(1), opplysningsperiode.getTomDato());
118-
}
89+
List<Year> årene = new ArrayList<>();
90+
while (fraTidligsteÅr.isBefore(senesteÅr)) {
91+
årene.add(fraTidligsteÅr);
92+
fraTidligsteÅr = fraTidligsteÅr.plusYears(1);
11993
}
120-
return opplysningsperiode;
94+
return årene.stream().sorted(Comparator.reverseOrder()).toList();
12195
}
12296

12397
}

domenetjenester/iay/src/main/java/no/nav/foreldrepenger/abakus/registerdata/inntekt/sigrun/TekniskNavnMapper.java

Lines changed: 0 additions & 34 deletions
This file was deleted.

domenetjenester/iay/src/main/java/no/nav/foreldrepenger/abakus/registerdata/inntekt/sigrun/klient/BeregnetSkatt.java

Lines changed: 0 additions & 4 deletions
This file was deleted.
Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
package no.nav.foreldrepenger.abakus.registerdata.inntekt.sigrun.klient.pgifolketrygden;
1+
package no.nav.foreldrepenger.abakus.registerdata.inntekt.sigrun.klient;
22

33
import java.time.LocalDate;
44
import java.util.List;
5+
import java.util.Optional;
56

67
public record PgiFolketrygdenResponse(String norskPersonidentifikator, Integer inntektsaar, List<Pgi> pensjonsgivendeInntekt) {
78
public record Pgi(Skatteordning skatteordning, LocalDate datoForFastsetting, Long pensjonsgivendeInntektAvLoennsinntekt,
@@ -12,11 +13,8 @@ public enum Skatteordning {
1213
FASTLAND, SVALBARD, KILDESKATT_PAA_LOENN
1314
}
1415

15-
// Mens vi venter på avklaring rundt kildeskatt
16-
public List<Pgi> pgiSomSikkertKanBrukes() {
17-
return pensjonsgivendeInntekt().stream()
18-
.filter(p -> !Skatteordning.KILDESKATT_PAA_LOENN.equals(p.skatteordning()))
19-
.toList();
16+
public List<Pgi> safePensjonsgivendeInntekt() {
17+
return Optional.ofNullable(pensjonsgivendeInntekt()).orElse(List.of());
2018
}
2119

2220
@Override

domenetjenester/iay/src/main/java/no/nav/foreldrepenger/abakus/registerdata/inntekt/sigrun/klient/SigrunConsumer.java

Lines changed: 0 additions & 23 deletions
This file was deleted.

0 commit comments

Comments
 (0)