Skip to content

Commit

Permalink
Feature/popp gjennomsnitt g (#3582)
Browse files Browse the repository at this point in the history
* Lagt til kall mot pensjon-facade generering av averageG og henter denne direkte til frontend
* Lagt til en del oppsett for generering av pensjon-inntekt med gjennomsnittlig G-verdi
* Refaktorert pensjon-inntekt en del, lagt til mye funksjonalitet for generert pensjon-inntekt og lagt på validering og BestillingKriterieMapping
* Backend oppsett for Pensjon generering
#deploy-test-dolly-backend
* Endret typer til float der det passer bedre for PensjonData
* Refaktorert en del og fikset bug hvor egen input ble overskrevet ved navigering frem og tilbake i bestillingen
* Designendringer med Betsy
  • Loading branch information
stigus authored Aug 15, 2024
1 parent 4a12fbd commit 61d4fbb
Show file tree
Hide file tree
Showing 30 changed files with 963 additions and 382 deletions.
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 @@ -134,4 +134,4 @@ private Function<PredicateSpec, Buildable<Route>> createRoute(String segment, St
.filters(filter, addUserJwtHeaderFilter())
).uri(host);
}
}
}
Loading

0 comments on commit 61d4fbb

Please sign in to comment.