|
1 | 1 | package no.nav.foreldrepenger.abakus.registerdata.inntekt.sigrun;
|
2 | 2 |
|
| 3 | +import static java.time.temporal.ChronoUnit.YEARS; |
| 4 | + |
3 | 5 | import java.math.BigDecimal;
|
| 6 | +import java.time.Month; |
| 7 | +import java.time.MonthDay; |
4 | 8 | import java.time.Year;
|
| 9 | +import java.util.ArrayList; |
| 10 | +import java.util.Comparator; |
| 11 | +import java.util.List; |
5 | 12 | import java.util.Map;
|
6 |
| -import java.util.Objects; |
7 |
| -import java.util.function.Supplier; |
| 13 | +import java.util.Optional; |
8 | 14 | import java.util.stream.Collectors;
|
9 | 15 |
|
10 | 16 | import org.slf4j.Logger;
|
|
14 | 20 | import jakarta.inject.Inject;
|
15 | 21 | import no.nav.abakus.iaygrunnlag.kodeverk.InntektspostType;
|
16 | 22 | 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; |
22 | 26 | import no.nav.foreldrepenger.abakus.typer.PersonIdent;
|
23 | 27 |
|
24 | 28 |
|
25 | 29 | @ApplicationScoped
|
26 | 30 | public class SigrunTjeneste {
|
27 | 31 | private static final Logger LOG = LoggerFactory.getLogger(SigrunTjeneste.class);
|
28 | 32 |
|
29 |
| - private static final boolean SAMMENLIGN_PGI = true; |
| 33 | + private static final MonthDay TIDLIGSTE_SJEKK_FJOR = MonthDay.of(Month.MAY, 1); |
30 | 34 |
|
31 |
| - private SigrunConsumer sigrunConsumer; |
| 35 | + private static final Year FØRSTE_PGI = Year.of(2017); |
| 36 | + private SigrunRestClient sigrunConsumer; |
32 | 37 |
|
33 | 38 | SigrunTjeneste() {
|
34 | 39 | //CDI
|
35 | 40 | }
|
36 | 41 |
|
37 | 42 | @Inject
|
38 |
| - public SigrunTjeneste(SigrunConsumer sigrunConsumer) { |
| 43 | + public SigrunTjeneste(SigrunRestClient sigrunConsumer) { |
39 | 44 | this.sigrunConsumer = sigrunConsumer;
|
40 | 45 | }
|
41 | 46 |
|
42 | 47 |
|
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); |
50 | 50 | return SigrunPgiFolketrygdenMapper.mapFraPgiResponseTilIntern(svarene).entrySet().stream()
|
51 | 51 | .filter(e -> !e.getValue().isEmpty())
|
52 | 52 | .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
|
53 | 53 | }
|
54 | 54 |
|
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 | + } |
56 | 64 |
|
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; |
66 | 69 | }
|
67 | 70 |
|
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 | + } |
70 | 75 | 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); |
86 | 77 | } catch (Exception e) {
|
87 |
| - LOG.info("SIGRUN PGI: noe gikk veldig galt", e); |
| 78 | + return Optional.empty(); |
88 | 79 | }
|
89 | 80 | }
|
90 | 81 |
|
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; |
106 | 88 | }
|
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); |
119 | 93 | }
|
120 |
| - return opplysningsperiode; |
| 94 | + return årene.stream().sorted(Comparator.reverseOrder()).toList(); |
121 | 95 | }
|
122 | 96 |
|
123 | 97 | }
|
0 commit comments