Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/popp gjennomsnitt g #3582

Merged
merged 23 commits into from
Aug 15, 2024
Merged
Show file tree
Hide file tree
Changes from 21 commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
b1ff493
* Lagt til kall mot pensjon-facade generering av averageG og henter d…
stigus Jun 21, 2024
10868f7
Merge branch 'refs/heads/master' into feature/popp-gjennomsnitt-g
stigus Jun 27, 2024
38fe129
Lagt til en del oppsett for generering av pensjon-inntekt med gjennom…
stigus Jun 27, 2024
ffc74a1
Merge branch 'refs/heads/master' into feature/popp-gjennomsnitt-g
stigus Jun 28, 2024
552ae49
Merge branch 'refs/heads/master' into feature/popp-gjennomsnitt-g
stigus Jun 28, 2024
04b8af7
Lagt til en del oppsett for generering av pensjon-inntekt med gjennom…
stigus Jul 2, 2024
322d0b7
Refaktorert pensjon-inntekt en del, lagt til mye funksjonalitet for g…
stigus Jul 4, 2024
e03e2dc
Fjernet overflødig logging
stigus Jul 4, 2024
2c8b957
Liten refaktor på pensjon form
stigus Jul 4, 2024
460df7e
Backend oppsett for Pensjon generering
stigus Jul 4, 2024
8485b65
Endret typer til float der det passer bedre for PensjonData
stigus Jul 4, 2024
aad97d5
Fikset mer av opplegget for gjennomsnitt G generering
stigus Jul 5, 2024
0b16ccf
Merge branch 'refs/heads/master' into feature/popp-gjennomsnitt-g
stigus Jul 5, 2024
bd67189
Merge branch 'refs/heads/master' into feature/popp-gjennomsnitt-g
stigus Aug 6, 2024
faf0bca
Merge branch 'master' into feature/popp-gjennomsnitt-g
stigus Aug 8, 2024
cd08081
Refaktorert en del og fikset bug hvor egen input ble overskrevet ved …
stigus Aug 14, 2024
2af31e4
Deploy
stigus Aug 14, 2024
e278e9c
Merge branch 'refs/heads/master' into feature/popp-gjennomsnitt-g
stigus Aug 14, 2024
e9e93fe
Deploy pensjon-generer backend
stigus Aug 14, 2024
ef11398
Designendringer med Betsy
stigus Aug 14, 2024
9017411
Designendringer og fikset etter kommentarer
stigus Aug 15, 2024
558ea85
Tilbakemelding i pensjonform for bruker som kan få ugyldig alder
stigus Aug 15, 2024
5c79c10
Merge branch 'master' into feature/popp-gjennomsnitt-g
stigus Aug 15, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,4 @@ public static void main(String[] args) {

SpringApplication.run(DollyBackendApplicationStarter.class, args);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,12 @@ public Flux<ClientFuture> gjenopprett(RsDollyUtvidetBestilling bestilling, Dolly
return Flux.empty();
}

@Override
public void release(List<String> identer) {

// Sletting av arbeidsforhold er pt ikke støttet
}

private ClientFuture futurePersist(BestillingProgress progress, String status) {

return () -> {
Expand All @@ -97,12 +103,6 @@ private ClientFuture futurePersist(BestillingProgress progress, String status) {
};
}

@Override
public void release(List<String> identer) {

// Sletting av arbeidsforhold er pt ikke støttet
}

private Mono<String> sendArbeidsforhold(RsDollyUtvidetBestilling bestilling, DollyPerson dollyPerson,
Set<String> miljoer, boolean isOpprettEndre) {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import no.nav.dolly.bestilling.pensjonforvalter.domain.AlderspensjonSoknadRequest;
import no.nav.dolly.bestilling.pensjonforvalter.domain.AlderspensjonVedtakRequest;
import no.nav.dolly.bestilling.pensjonforvalter.domain.PensjonPersonRequest;
import no.nav.dolly.bestilling.pensjonforvalter.domain.PensjonPoppGenerertInntektRequest;
import no.nav.dolly.bestilling.pensjonforvalter.domain.PensjonPoppInntektRequest;
import no.nav.dolly.bestilling.pensjonforvalter.domain.PensjonSamboerRequest;
import no.nav.dolly.bestilling.pensjonforvalter.domain.PensjonSamboerResponse;
Expand Down Expand Up @@ -155,6 +156,10 @@ public Flux<ClientFuture> gjenopprett(RsDollyUtvidetBestilling bestilling, Dolly
dollyPerson.getIdent(), bestilteMiljoer.get())
.map(response -> POPP_INNTEKTSREGISTER + decodeStatus(response, dollyPerson.getIdent())),

lagreGenerertInntekt(pensjon,
dollyPerson.getIdent(), bestilteMiljoer.get())
.map(response -> POPP_INNTEKTSREGISTER + decodeStatus(response, dollyPerson.getIdent())),

lagreTpForhold(pensjon, dollyPerson.getIdent(), bestilteMiljoer.get())
.map(response -> TP_FORHOLD + decodeStatus(response, dollyPerson.getIdent())),

Expand Down Expand Up @@ -464,6 +469,22 @@ private Flux<PensjonforvalterResponse> lagreInntekt(PensjonData pensjonData, Str
}));
}

private Flux<PensjonforvalterResponse> lagreGenerertInntekt(PensjonData pensjonData, String ident,
Set<String> miljoer) {

return Flux.just(pensjonData)
.filter(PensjonData::hasGenerertInntekt)
.map(PensjonData::getGenerertInntekt)
.flatMap(generertInntekt -> Flux.fromIterable(miljoer)
.flatMap(miljoe -> {

var request = mapperFacade.map(generertInntekt, PensjonPoppGenerertInntektRequest.class);
request.setFnr(ident);
request.setMiljoer(List.of(miljoe));
return pensjonforvalterConsumer.lagreGenererteInntekter(request);
}));
}

private Mono<PensjonforvalterResponse> lagreTpForhold(PensjonData pensjonData, String
ident, Set<String> miljoer) {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import no.nav.dolly.bestilling.pensjonforvalter.command.HentMiljoerCommand;
import no.nav.dolly.bestilling.pensjonforvalter.command.HentSamboerCommand;
import no.nav.dolly.bestilling.pensjonforvalter.command.LagreAlderspensjonCommand;
import no.nav.dolly.bestilling.pensjonforvalter.command.LagreGenerertPoppInntektCommand;
import no.nav.dolly.bestilling.pensjonforvalter.command.LagrePensjonsavtaleCommand;
import no.nav.dolly.bestilling.pensjonforvalter.command.LagrePoppInntektCommand;
import no.nav.dolly.bestilling.pensjonforvalter.command.LagreSamboerCommand;
Expand All @@ -18,6 +19,7 @@
import no.nav.dolly.bestilling.pensjonforvalter.command.SletteTpForholdCommand;
import no.nav.dolly.bestilling.pensjonforvalter.domain.AlderspensjonRequest;
import no.nav.dolly.bestilling.pensjonforvalter.domain.PensjonPersonRequest;
import no.nav.dolly.bestilling.pensjonforvalter.domain.PensjonPoppGenerertInntektRequest;
import no.nav.dolly.bestilling.pensjonforvalter.domain.PensjonPoppInntektRequest;
import no.nav.dolly.bestilling.pensjonforvalter.domain.PensjonSamboerRequest;
import no.nav.dolly.bestilling.pensjonforvalter.domain.PensjonSamboerResponse;
Expand Down Expand Up @@ -77,6 +79,14 @@ public Flux<PensjonforvalterResponse> lagreInntekter(PensjonPoppInntektRequest p
pensjonPoppInntektRequest).call());
}

@Timed(name = "providers", tags = { "operation", "popp_lagreGenerertInntekt" })
public Flux<PensjonforvalterResponse> lagreGenererteInntekter(PensjonPoppGenerertInntektRequest pensjonPoppGenerertInntektRequest) {

return tokenService.exchange(serverProperties)
.flatMapMany(token -> new LagreGenerertPoppInntektCommand(webClient, token.getTokenValue(),
pensjonPoppGenerertInntektRequest).call());
}

@Timed(name = "providers", tags = { "operation", "pen_opprettPerson" })
public Flux<PensjonforvalterResponse> opprettPerson(PensjonPersonRequest pensjonPersonRequest,
Set<String> miljoer) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
package no.nav.dolly.bestilling.pensjonforvalter.command;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import no.nav.dolly.bestilling.pensjonforvalter.domain.PensjonPoppGenerertInntektRequest;
import no.nav.dolly.bestilling.pensjonforvalter.domain.PensjonforvalterResponse;
import no.nav.testnav.libs.reactivecore.utils.WebClientFilter;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.netty.http.client.HttpClientRequest;
import reactor.util.retry.Retry;

import java.time.Duration;
import java.util.concurrent.Callable;

import static no.nav.dolly.domain.CommonKeysAndUtils.CONSUMER;
import static no.nav.dolly.domain.CommonKeysAndUtils.HEADER_NAV_CALL_ID;
import static no.nav.dolly.domain.CommonKeysAndUtils.HEADER_NAV_CONSUMER_ID;
import static no.nav.dolly.util.CallIdUtil.generateCallId;
import static no.nav.dolly.util.RequestTimeout.REQUEST_DURATION;
import static org.springframework.http.HttpHeaders.AUTHORIZATION;

@Slf4j
@RequiredArgsConstructor
public class LagreGenerertPoppInntektCommand implements Callable<Flux<PensjonforvalterResponse>> {

private static final String POPP_INNTEKTSKJEMA_URL = "/api/v1/inntektskjema";

private final WebClient webClient;
private final String token;
private final PensjonPoppGenerertInntektRequest pensjonPoppGenerertInntektRequest;

public Flux<PensjonforvalterResponse> call() {

var callId = generateCallId();
log.info("Popp lagre generert inntekt {}, callId: {}", pensjonPoppGenerertInntektRequest, callId);
return webClient
.post()
.uri(uriBuilder -> uriBuilder
.path(POPP_INNTEKTSKJEMA_URL)
.build())
.httpRequest(httpRequest -> {
HttpClientRequest reactorRequest = httpRequest.getNativeRequest();
reactorRequest.responseTimeout(Duration.ofSeconds(REQUEST_DURATION));
})
.header(AUTHORIZATION, "Bearer " + token)
.header(HEADER_NAV_CALL_ID, callId)
.header(HEADER_NAV_CONSUMER_ID, CONSUMER)
.bodyValue(pensjonPoppGenerertInntektRequest)
.retrieve()
.bodyToFlux(PensjonforvalterResponse.class)
.doOnError(WebClientFilter::logErrorMessage)
.retryWhen(Retry.backoff(3, Duration.ofSeconds(5))
.filter(WebClientFilter::is5xxException))
.onErrorResume(error ->
Mono.just(PensjonforvalterResponse.builder()
.status(pensjonPoppGenerertInntektRequest.getMiljoer().stream()
.map(miljoe -> PensjonforvalterResponse.ResponseEnvironment.builder()
.miljo(miljoe)
.response(PensjonforvalterResponse.Response.builder()
.httpStatus(PensjonforvalterResponse.HttpStatus.builder()
.status(WebClientFilter.getStatus(error).value())
.reasonPhrase(WebClientFilter.getStatus(error).getReasonPhrase())
.build())
.message(WebClientFilter.getMessage(error))
.path(POPP_INNTEKTSKJEMA_URL)
.build())
.build())
.toList())
.build()));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package no.nav.dolly.bestilling.pensjonforvalter.domain;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.ArrayList;
import java.util.List;

import static java.util.Objects.isNull;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PensjonPoppGenerertInntektRequest {

private String fnr;
private List<PoppGenerertInntektRequest> inntekter;
private List<String> miljoer;

public List<String> getMiljoer() {

if (isNull(miljoer)) {
miljoer = new ArrayList<>();
}
return miljoer;
}

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class PoppGenerertInntektRequest {

private Integer aar;
private Integer inntekt;

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package no.nav.dolly.bestilling.pensjonforvalter.mapper;

import ma.glasnost.orika.CustomMapper;
import ma.glasnost.orika.MapperFactory;
import ma.glasnost.orika.MappingContext;
import no.nav.dolly.bestilling.pensjonforvalter.domain.PensjonPoppGenerertInntektRequest;
import no.nav.dolly.domain.resultset.pensjon.PensjonData;
import no.nav.dolly.mapper.MappingStrategy;
import org.springframework.stereotype.Component;

@Component
public class PensjonGenerertInntektMappingStrategy implements MappingStrategy {

@Override
public void register(MapperFactory factory) {

factory.classMap(PensjonData.PoppGenerertInntektWrapper.class, PensjonPoppGenerertInntektRequest.class)
.customize(new CustomMapper<>() {
@Override
public void mapAtoB(PensjonData.PoppGenerertInntektWrapper generertInntektWrapper, PensjonPoppGenerertInntektRequest request, MappingContext context) {

request.setInntekter(generertInntektWrapper.getInntekter().stream().map(inntekt ->
PensjonPoppGenerertInntektRequest.PoppGenerertInntektRequest.builder()
.aar(inntekt.getAr())
.inntekt(inntekt.getInntekt())
.build()).toList());
}
})
.byDefault()
.register();

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@ public class PensjonData {
@Schema(description = "Inntekt i pensjonsopptjeningsregister (POPP)")
private PoppInntekt inntekt;

@Schema(description = "Generert inntekt i pensjonsopptjeningsregister (POPP)")
private PoppGenerertInntektWrapper generertInntekt;

@Schema(description = "Data for tjenestepensjon (TP)")
private List<TpOrdning> tp;

Expand All @@ -45,6 +48,10 @@ public boolean hasInntekt() {
return nonNull(inntekt);
}

public boolean hasGenerertInntekt() {
return nonNull(generertInntekt);
}

@JsonIgnore
public boolean hasTp() {
return !getTp().isEmpty();
Expand Down Expand Up @@ -91,6 +98,12 @@ public enum TpYtelseType {
UKJENT
}

public enum UforeType {UNGUFOR, GIFT, ENSLIG}

public enum BarnetilleggType {FELLESBARN, SAERKULLSBARN}

public enum InntektType {ARBEIDSINNTEKT, NAERINGSINNTEKT, PENSJON_FRA_UTLANDET, UTENLANDS_INNTEKT, ANDRE_PENSJONER_OG_YTELSER}

@Data
@Builder
@NoArgsConstructor
Expand All @@ -110,6 +123,67 @@ public static class PoppInntekt {
private Boolean redusertMedGrunnbelop;
}

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public static class PoppGenerertInntektWrapper {

@Schema(description = "Verdier brukt til generering av inntekt")
private PoppGenerer generer;

@Schema(description = "Genererte verdier for POPP inntekt")
private List<PoppGenerertInntekt> inntekter;

public List<PoppGenerertInntekt> getInntekter() {
if (inntekter == null) {
inntekter = new ArrayList<>();
}
return inntekter;
}
}

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public static class PoppGenerer {

@Schema(description = "Fra og med år YYYY")
private Integer fomAar;

@Schema(description = "Til og med år YYYY")
private Integer tomAar;

@Schema(description = "Gjennomsnittlig grunnbeløp (G) per år")
private Float averageG;

@Schema(description = "Gjennomsnittlig grunnbeløp (G) kan genereres til verdi under 1G")
private Boolean tillatInntektUnder1G;
}

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public static class PoppGenerertInntekt {

@Schema(description = "Gjeldende år")
private Integer ar;

@Schema(description = "Inntekt i hele kroner for året")
private Integer inntekt;

@Schema(description = "Generert G-verdi for året")
private Float generatedG;

@Schema(description = "Grunnbeløp for året")
private Boolean grunnbelop;
}

@Data
@Builder
@NoArgsConstructor
Expand Down Expand Up @@ -288,10 +362,4 @@ public static class ForventetInntekt {
private InntektType inntektType;
private Integer belop;
}

public enum UforeType {UNGUFOR, GIFT, ENSLIG}

public enum BarnetilleggType {FELLESBARN, SAERKULLSBARN}

public enum InntektType {ARBEIDSINNTEKT, NAERINGSINNTEKT, PENSJON_FRA_UTLANDET, UTENLANDS_INNTEKT, ANDRE_PENSJONER_OG_YTELSER}
}
Original file line number Diff line number Diff line change
Expand Up @@ -131,4 +131,4 @@ private Function<PredicateSpec, Buildable<Route>> createRoute(String segment, St
.filters(filter, addUserJwtHeaderFilter())
).uri(host);
}
}
}
Loading