Skip to content

Commit a3bdddc

Browse files
authored
Egen opplysningsperiode for skattegrunnlag (#2059)
1 parent 5d985fa commit a3bdddc

File tree

11 files changed

+153
-64
lines changed

11 files changed

+153
-64
lines changed

domenetjenester/iay/src/main/java/no/nav/foreldrepenger/abakus/iay/tjeneste/GrunnlagRestTjeneste.java

+29-26
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@
8888
import no.nav.vedtak.sikkerhet.abac.TilpassetAbacAttributt;
8989
import no.nav.vedtak.sikkerhet.abac.beskyttet.ActionType;
9090

91-
@OpenAPIDefinition(tags = { @Tag(name = "iay-grunnlag") })
91+
@OpenAPIDefinition(tags = {@Tag(name = "iay-grunnlag")})
9292
@Path("/iay/grunnlag/v1")
9393
@ApplicationScoped
9494
@Transactional
@@ -113,12 +113,12 @@ public GrunnlagRestTjeneste(InntektArbeidYtelseTjeneste iayTjeneste,
113113
@Consumes(MediaType.APPLICATION_JSON)
114114
@Produces(MediaType.APPLICATION_JSON)
115115
@Operation(description = "Hent ett enkelt IAY Grunnlag for angitt spesifikasjon. Spesifikasjonen kan angit hvilke data som ønskes", tags = "iay-grunnlag", responses = {
116-
@ApiResponse(description = "InntektArbeidYtelseGrunnlagDto", content = @Content(mediaType = "application/json", schema = @Schema(implementation = InntektArbeidYtelseGrunnlagDto.class))),
117-
@ApiResponse(responseCode = "204", description = "Det finnes ikke et grunnlag for forespørselen"),
118-
@ApiResponse(responseCode = "304", description = "Grunnlaget har ikke endret seg i henhold til det fagsystemet allerede kjenner")
116+
@ApiResponse(description = "InntektArbeidYtelseGrunnlagDto", content = @Content(mediaType = "application/json", schema = @Schema(implementation = InntektArbeidYtelseGrunnlagDto.class))),
117+
@ApiResponse(responseCode = "204", description = "Det finnes ikke et grunnlag for forespørselen"),
118+
@ApiResponse(responseCode = "304", description = "Grunnlaget har ikke endret seg i henhold til det fagsystemet allerede kjenner")
119119
})
120120
@BeskyttetRessurs(actionType = ActionType.READ, resource = GRUNNLAG)
121-
@SuppressWarnings({ "findsecbugs:JAXRS_ENDPOINT", "resource" })
121+
@SuppressWarnings({"findsecbugs:JAXRS_ENDPOINT", "resource"})
122122
public Response hentIayGrunnlag(@NotNull @Valid InntektArbeidYtelseGrunnlagRequestAbacDto spesifikasjon) {
123123
Response response;
124124

@@ -153,12 +153,12 @@ public Response hentIayGrunnlag(@NotNull @Valid InntektArbeidYtelseGrunnlagReque
153153
@Path("/arbeidsforhold-referanser")
154154
@Produces(MediaType.APPLICATION_JSON)
155155
@Operation(description = "Hent aktivt arbeidsforholdinformasjon grunnlag for angitt kobling", tags = "iay-grunnlag", responses = {
156-
@ApiResponse(description = "ArbeidsforholdInformasjon", content = @Content(mediaType = "application/json", schema = @Schema(implementation = ArbeidsforholdInformasjon.class))),
157-
@ApiResponse(responseCode = "204", description = "Det finnes ikke et arbeidsforhold grunnlag for forespørselen"),
158-
@ApiResponse(responseCode = "304", description = "Grunnlaget har ikke endret seg i henhold til det fagsystemet allerede kjenner")
156+
@ApiResponse(description = "ArbeidsforholdInformasjon", content = @Content(mediaType = "application/json", schema = @Schema(implementation = ArbeidsforholdInformasjon.class))),
157+
@ApiResponse(responseCode = "204", description = "Det finnes ikke et arbeidsforhold grunnlag for forespørselen"),
158+
@ApiResponse(responseCode = "304", description = "Grunnlaget har ikke endret seg i henhold til det fagsystemet allerede kjenner")
159159
})
160160
@BeskyttetRessurs(actionType = ActionType.READ, resource = GRUNNLAG)
161-
@SuppressWarnings({ "findsecbugs:JAXRS_ENDPOINT" })
161+
@SuppressWarnings({"findsecbugs:JAXRS_ENDPOINT"})
162162
public Response hentArbeidsforholdInformasjon(@NotNull @Valid @QueryParam("ytelseType") YtelseType ytelseType,
163163
@NotNull @Valid @TilpassetAbacAttributt(supplierClass = AbacDataSupplier.class) @Pattern(regexp = "^[A-Za-z0-9_\\.\\-:]+$", message = "[${validatedValue}] matcher ikke tillatt pattern '{value}'") String saksnummer,
164164
@NotNull @Valid @QueryParam("kobling") UUID koblingReferanse,
@@ -203,12 +203,12 @@ public Response hentArbeidsforholdInformasjon(@NotNull @Valid @QueryParam("ytels
203203
@GET
204204
@Produces(MediaType.APPLICATION_JSON)
205205
@Operation(description = "Hent aktivt IAY grunnlag grunnlag for angitt kobling", tags = "iay-grunnlag", responses = {
206-
@ApiResponse(description = "InntektArbeidYtelseGrunnlagDto", content = @Content(mediaType = "application/json", schema = @Schema(implementation = ArbeidsforholdInformasjon.class))),
207-
@ApiResponse(responseCode = "204", description = "Det finnes ikke et arbeidsforhold grunnlag for forespørselen"),
208-
@ApiResponse(responseCode = "304", description = "Grunnlaget har ikke endret seg i henhold til det fagsystemet allerede kjenner")
206+
@ApiResponse(description = "InntektArbeidYtelseGrunnlagDto", content = @Content(mediaType = "application/json", schema = @Schema(implementation = ArbeidsforholdInformasjon.class))),
207+
@ApiResponse(responseCode = "204", description = "Det finnes ikke et arbeidsforhold grunnlag for forespørselen"),
208+
@ApiResponse(responseCode = "304", description = "Grunnlaget har ikke endret seg i henhold til det fagsystemet allerede kjenner")
209209
})
210210
@BeskyttetRessurs(actionType = ActionType.READ, resource = GRUNNLAG)
211-
@SuppressWarnings({ "findsecbugs:JAXRS_ENDPOINT" })
211+
@SuppressWarnings({"findsecbugs:JAXRS_ENDPOINT"})
212212
public Response hentSisteIayGrunnlag(@NotNull @Valid @QueryParam("ytelseType") YtelseType ytelseType,
213213
@TilpassetAbacAttributt(supplierClass = AbacDataSupplier.class) @NotNull @Valid @Pattern(regexp = "^[A-Za-z0-9_\\.\\-:]+$", message = "[${validatedValue}] matcher ikke tillatt pattern '{value}'") String saksnummer,
214214
@NotNull @Valid @QueryParam("kobling") UUID koblingReferanse,
@@ -250,7 +250,7 @@ public Response hentSisteIayGrunnlag(@NotNull @Valid @QueryParam("ytelseType") Y
250250
@Consumes(MediaType.APPLICATION_JSON)
251251
@Produces(MediaType.APPLICATION_JSON)
252252
@Operation(description = "Lagrer siste versjon", tags = "iay-grunnlag", responses = {
253-
@ApiResponse(responseCode = "200", description = "Mottatt grunnlaget")
253+
@ApiResponse(responseCode = "200", description = "Mottatt grunnlaget")
254254
})
255255
@BeskyttetRessurs(actionType = ActionType.UPDATE, resource = GRUNNLAG)
256256
@SuppressWarnings("findsecbugs:JAXRS_ENDPOINT")
@@ -271,13 +271,15 @@ public Response oppdaterOgLagreOverstyring(@NotNull @Valid OverstyrtInntektArbei
271271
return Response.ok().build();
272272
}
273273

274-
/** @deprecated bytt til {@link #oppdaterOgLagreOverstyring(OverstyrtInntektArbeidYtelseDto)} . */
274+
/**
275+
* @deprecated bytt til {@link #oppdaterOgLagreOverstyring(OverstyrtInntektArbeidYtelseDto)} .
276+
*/
275277
@Deprecated(forRemoval = true)
276278
@PUT
277279
@Consumes(MediaType.APPLICATION_JSON)
278280
@Produces(MediaType.APPLICATION_JSON)
279281
@Operation(description = "Lagrer siste versjon", tags = "iay-grunnlag", responses = {
280-
@ApiResponse(responseCode = "200", description = "Mottatt grunnlaget")
282+
@ApiResponse(responseCode = "200", description = "Mottatt grunnlaget")
281283
})
282284
@BeskyttetRessurs(actionType = ActionType.UPDATE, resource = GRUNNLAG)
283285
@SuppressWarnings("findsecbugs:JAXRS_ENDPOINT")
@@ -305,7 +307,7 @@ public Response oppdaterOgLagreGrunnlag(@NotNull @Valid InntektArbeidYtelseGrunn
305307
@Consumes(MediaType.APPLICATION_JSON)
306308
@Produces(MediaType.APPLICATION_JSON)
307309
@Operation(description = "Hent IAY Grunnlag for angitt søke spesifikasjon", tags = "iay-grunnlag", responses = {
308-
@ApiResponse(description = "Grunnlaget for saken", content = @Content(mediaType = "application/json", schema = @Schema(implementation = InntektArbeidYtelseGrunnlagSakSnapshotDto.class)))
310+
@ApiResponse(description = "Grunnlaget for saken", content = @Content(mediaType = "application/json", schema = @Schema(implementation = InntektArbeidYtelseGrunnlagSakSnapshotDto.class)))
309311
})
310312
@BeskyttetRessurs(actionType = ActionType.READ, resource = GRUNNLAG)
311313
@SuppressWarnings("findsecbugs:JAXRS_ENDPOINT")
@@ -400,20 +402,21 @@ private Kobling oppdaterKobling(@NotNull @Valid KopierGrunnlagRequest dto) {
400402
}
401403
}
402404
}
403-
// Oppdater kobling
404-
Periode opplysningsperiode = dto.getOpplysningsperiode();
405-
if (opplysningsperiode != null) {
406-
kobling.setOpplysningsperiode(IntervallEntitet.fraOgMedTilOgMed(opplysningsperiode.getFom(), opplysningsperiode.getTom()));
407-
}
408-
Periode opptjeningsperiode = dto.getOpptjeningsperiode();
409-
if (opptjeningsperiode != null) {
410-
kobling.setOpptjeningsperiode(IntervallEntitet.fraOgMedTilOgMed(opptjeningsperiode.getFom(), opptjeningsperiode.getTom()));
411-
}
405+
// Oppdater kobling med perioder
406+
mapPeriodeTilIntervall(dto.getOpplysningsperiode()).ifPresent(kobling::setOpplysningsperiode);
407+
mapPeriodeTilIntervall(dto.getOpplysningsperiodeSkattegrunnlag()).ifPresent(kobling::setOpplysningsperiodeSkattegrunnlag);
408+
mapPeriodeTilIntervall(dto.getOpptjeningsperiode()).ifPresent(kobling::setOpptjeningsperiode);
409+
412410
// Diff & log endringer
413411
koblingTjeneste.lagre(kobling);
414412
return kobling;
415413
}
416414

415+
private Optional<IntervallEntitet> mapPeriodeTilIntervall(Periode periode) {
416+
return Optional.ofNullable(periode == null ? null :
417+
IntervallEntitet.fraOgMedTilOgMed(periode.getFom(), periode.getTom()));
418+
}
419+
417420
private KoblingReferanse getKoblingReferanse(AktørId aktørId, UUID koblingRef, UUID grunnlagRef) {
418421
KoblingReferanse koblingReferanse;
419422
if (koblingRef != null) {

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ protected IAYRegisterInnhentingFellesTjenesteImpl(InntektArbeidYtelseTjeneste in
9090

9191
private void innhentNæringsOpplysninger(Kobling kobling, InntektArbeidYtelseAggregatBuilder inntektArbeidYtelseAggregatBuilder) {
9292
LOGGER.info("Henter lignet inntekt for sak=[{}, {}] med behandling='{}'", kobling.getSaksnummer(), kobling.getYtelseType(), kobling.getKoblingReferanse());
93-
var map = sigrunTjeneste.beregnetSkatt(kobling.getAktørId());
93+
var map = sigrunTjeneste.beregnetSkatt(kobling.getAktørId(), kobling.getOpplysningsperiodeSkattegrunnlag());
9494
var aktørInntektBuilder = inntektArbeidYtelseAggregatBuilder.getAktørInntektBuilder(kobling.getAktørId());
9595

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

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

+4-3
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,10 @@ public SigrunTjeneste(SigrunConsumer sigrunConsumer) {
2828
this.sigrunConsumer = sigrunConsumer;
2929
}
3030

31-
public Map<IntervallEntitet, Map<InntektspostType, BigDecimal>> beregnetSkatt(AktørId aktørId) {
32-
SigrunResponse beregnetskatt = sigrunConsumer.beregnetskatt(Long.valueOf(aktørId.getId()));
33-
SigrunSummertSkattegrunnlagResponse summertSkattegrunnlag = sigrunConsumer.summertSkattegrunnlag(Long.valueOf(aktørId.getId()));
31+
32+
public Map<IntervallEntitet, Map<InntektspostType, BigDecimal>> beregnetSkatt(AktørId aktørId, IntervallEntitet opplysningsperiodeSkattegrunnlag) {
33+
SigrunResponse beregnetskatt = sigrunConsumer.beregnetskatt(Long.valueOf(aktørId.getId()), opplysningsperiodeSkattegrunnlag);
34+
SigrunSummertSkattegrunnlagResponse summertSkattegrunnlag = sigrunConsumer.summertSkattegrunnlag(Long.valueOf(aktørId.getId()), opplysningsperiodeSkattegrunnlag);
3435
return SigrunTilInternMapper.mapFraSigrunTilIntern(beregnetskatt.beregnetSkatt(), summertSkattegrunnlag.summertskattegrunnlagMap());
3536
}
3637

Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
package no.nav.foreldrepenger.abakus.registerdata.inntekt.sigrun.klient;
22

3+
import no.nav.foreldrepenger.abakus.felles.jpa.IntervallEntitet;
34
import no.nav.foreldrepenger.abakus.registerdata.inntekt.sigrun.klient.summertskattegrunnlag.SigrunSummertSkattegrunnlagResponse;
45

56
public interface SigrunConsumer {
67

7-
SigrunResponse beregnetskatt(Long aktørId);
8+
SigrunResponse beregnetskatt(Long aktørId, IntervallEntitet opplysningsperiode);
89

9-
SigrunSummertSkattegrunnlagResponse summertSkattegrunnlag(Long aktørId);
10+
SigrunSummertSkattegrunnlagResponse summertSkattegrunnlag(Long aktørId, IntervallEntitet opplysningsperiode);
1011

1112
}

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

+55-19
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@
44

55
import java.time.MonthDay;
66
import java.time.Year;
7+
import java.util.ArrayList;
78
import java.util.List;
89
import java.util.Map;
910
import java.util.Optional;
1011
import java.util.stream.Collectors;
1112

1213
import javax.enterprise.context.ApplicationScoped;
1314

15+
import no.nav.foreldrepenger.abakus.felles.jpa.IntervallEntitet;
1416
import no.nav.foreldrepenger.abakus.registerdata.inntekt.sigrun.klient.summertskattegrunnlag.SSGResponse;
1517
import no.nav.foreldrepenger.abakus.registerdata.inntekt.sigrun.klient.summertskattegrunnlag.SigrunSummertSkattegrunnlagResponse;
1618
import no.nav.foreldrepenger.konfig.Environment;
@@ -39,39 +41,73 @@ public SigrunConsumerImpl() {
3941
}
4042

4143
@Override
42-
public SigrunResponse beregnetskatt(Long aktørId) {
43-
var årTilListeMedSkatt = ferdiglignedeBeregnetSkattÅr(aktørId).stream()
44+
public SigrunResponse beregnetskatt(Long aktørId, IntervallEntitet opplysningsperiode) {
45+
var årTilListeMedSkatt = ferdiglignedeBeregnetSkattÅr(aktørId, opplysningsperiode).stream()
4446
.collect(Collectors.toMap(år -> år, år -> client.hentBeregnetSkattForAktørOgÅr(aktørId, år.toString())));
45-
4647
return new SigrunResponse(årTilListeMedSkatt);
4748
}
4849

4950
@Override
50-
public SigrunSummertSkattegrunnlagResponse summertSkattegrunnlag(Long aktørId) {
51-
Map<Year, Optional<SSGResponse>> summertskattegrunnlagMap = hentÅrsListeForSummertskattegrunnlag(aktørId).stream()
51+
public SigrunSummertSkattegrunnlagResponse summertSkattegrunnlag(Long aktørId, IntervallEntitet opplysningsperiode) {
52+
Map<Year, Optional<SSGResponse>> summertskattegrunnlagMap = hentÅrsListeForSummertskattegrunnlag(aktørId, opplysningsperiode).stream()
5253
.collect(Collectors.toMap(år -> år, år -> client.hentSummertskattegrunnlag(aktørId, år.toString())));
5354
return new SigrunSummertSkattegrunnlagResponse(summertskattegrunnlagMap);
5455
}
5556

56-
private List<Year> ferdiglignedeBeregnetSkattÅr(Long aktørId) {
57-
Year iFjor = Year.now().minusYears(1L);
58-
if (iFjorErFerdiglignetBeregnet(aktørId, iFjor)) {
59-
return asList(iFjor, iFjor.minusYears(1L), iFjor.minusYears(2L));
57+
private List<Year> ferdiglignedeBeregnetSkattÅr(Long aktørId, IntervallEntitet opplysningsperiode) {
58+
if (opplysningsperiode != null) {
59+
return beregnetSkattÅrslisteFraOpplysningsperiode(opplysningsperiode);
60+
} else {
61+
Year iFjor = Year.now().minusYears(1L);
62+
if (iFjorErFerdiglignetBeregnet(aktørId, iFjor)) {
63+
return asList(iFjor, iFjor.minusYears(1L), iFjor.minusYears(2L));
64+
} else {
65+
Year iForifjor = iFjor.minusYears(1L);
66+
return asList(iForifjor, iForifjor.minusYears(1L), iForifjor.minusYears(2L));
67+
}
68+
}
69+
}
70+
71+
private List<Year> beregnetSkattÅrslisteFraOpplysningsperiode(IntervallEntitet opplysningsperiode) {
72+
var fomÅr = opplysningsperiode.getFomDato().getYear();
73+
var tomÅr = opplysningsperiode.getTomDato().getYear();
74+
var år = fomÅr;
75+
var årsListe = new ArrayList<Year>();
76+
while (år <= tomÅr) {
77+
årsListe.add(Year.of(år));
78+
år++;
79+
}
80+
return årsListe;
81+
}
82+
83+
private List<Year> hentÅrsListeForSummertskattegrunnlag(Long aktørId, IntervallEntitet opplysningsperiode) {
84+
if (opplysningsperiode != null) {
85+
return summertSkattegrunnlagÅrslisteFraOpplysningsperiode(opplysningsperiode);
6086
} else {
61-
Year iForifjor = iFjor.minusYears(1L);
62-
return asList(iForifjor, iForifjor.minusYears(1L), iForifjor.minusYears(2L));
87+
Year iFjor = Year.now().minusYears(1L);
88+
//filteret(SummertSkattegrunnlagForeldrepenger) i Sigrun er ikke impl. tidligere enn 2018
89+
if (iFjor.equals(Year.of(2018))) {
90+
return List.of(iFjor);
91+
} else if (iFjor.equals(Year.of(2019))) {
92+
return List.of(iFjor, iFjor.minusYears(1L));
93+
}
94+
return ferdiglignedeBeregnetSkattÅr(aktørId, opplysningsperiode);
6395
}
6496
}
6597

66-
private List<Year> hentÅrsListeForSummertskattegrunnlag(Long aktørId) {
67-
Year iFjor = Year.now().minusYears(1L);
68-
//filteret(SummertSkattegrunnlagForeldrepenger) i Sigrun er ikke impl. tidligere enn 2018
69-
if (iFjor.equals(Year.of(2018))) {
70-
return List.of(iFjor);
71-
} else if (iFjor.equals(Year.of(2019))) {
72-
return List.of(iFjor, iFjor.minusYears(1L));
98+
private ArrayList<Year> summertSkattegrunnlagÅrslisteFraOpplysningsperiode(IntervallEntitet opplysningsperiode) {
99+
var fomÅr = opplysningsperiode.getFomDato().getYear();
100+
var tomÅr = opplysningsperiode.getTomDato().getYear();
101+
var år = fomÅr;
102+
var årsListe = new ArrayList<Year>();
103+
while (år <= tomÅr) {
104+
//filteret(SummertSkattegrunnlagForeldrepenger) i Sigrun er ikke impl. tidligere enn 2018
105+
if (år >= 2018) {
106+
årsListe.add(Year.of(år));
107+
}
108+
år++;
73109
}
74-
return ferdiglignedeBeregnetSkattÅr(aktørId);
110+
return årsListe;
75111
}
76112

77113
private boolean iFjorErFerdiglignetBeregnet(Long aktørId, Year iFjor) {

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

+10-9
Original file line numberDiff line numberDiff line change
@@ -94,22 +94,23 @@ private Kobling oppdaterKobling(InnhentRegisterdataRequest dto) {
9494
}
9595
}
9696

97-
// Oppdater kobling
98-
Periode opplysningsperiode = dto.getOpplysningsperiode();
99-
if (opplysningsperiode != null) {
100-
kobling.setOpplysningsperiode(IntervallEntitet.fraOgMedTilOgMed(opplysningsperiode.getFom(), opplysningsperiode.getTom()));
101-
}
102-
Periode opptjeningsperiode = dto.getOpptjeningsperiode();
103-
if (opptjeningsperiode != null) {
104-
kobling.setOpptjeningsperiode(IntervallEntitet.fraOgMedTilOgMed(opptjeningsperiode.getFom(), opptjeningsperiode.getTom()));
105-
}
97+
// Oppdater kobling med perioder
98+
mapPeriodeTilIntervall(dto.getOpplysningsperiode()).ifPresent(kobling::setOpplysningsperiode);
99+
mapPeriodeTilIntervall(dto.getOpplysningsperiodeSkattegrunnlag()).ifPresent(kobling::setOpplysningsperiodeSkattegrunnlag);
100+
mapPeriodeTilIntervall(dto.getOpptjeningsperiode()).ifPresent(kobling::setOpptjeningsperiode);
101+
106102
// Diff & log endringer
107103
koblingTjeneste.lagre(kobling);
108104
koblingLås.ifPresent(lås -> koblingTjeneste.oppdaterLåsVersjon(lås));
109105

110106
return kobling;
111107
}
112108

109+
private Optional<IntervallEntitet> mapPeriodeTilIntervall(Periode periode) {
110+
return Optional.ofNullable(periode == null ? null :
111+
IntervallEntitet.fraOgMedTilOgMed(periode.getFom(), periode.getTom()));
112+
}
113+
113114
public String triggAsyncInnhent(InnhentRegisterdataRequest dto) {
114115
Kobling kobling = oppdaterKobling(dto);
115116

0 commit comments

Comments
 (0)