Skip to content

Commit f421808

Browse files
authored
Merge branch 'master' into feature/frontend-oppdatering
2 parents ddb2c52 + b77ff6f commit f421808

File tree

106 files changed

+3440
-162
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

106 files changed

+3440
-162
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
name: levende-arbeidsforhold-service
2+
3+
on:
4+
push:
5+
paths:
6+
- libs/kafka-config/**
7+
- libs/avro-schema/**
8+
- libs/security-core/**
9+
- libs/servlet-core/**
10+
- libs/servlet-insecure-security/**
11+
- libs/reactive-core/**
12+
- apps/levende-arbeidsforhold-service/**
13+
- .github/workflows/app.levende-arbeidsforhold-service.yml
14+
15+
jobs:
16+
workflow:
17+
uses: ./.github/workflows/common.workflow.backend.yml
18+
with:
19+
working-directory: "apps/levende-arbeidsforhold-service"
20+
deploy-tag: "#deploy-levende-arbeidsforhold-service"
21+
permissions:
22+
contents: read
23+
id-token: write
24+
secrets: inherit

apps/arbeidsforhold-service/src/main/resources/application.yml

+4-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,10 @@ consumers:
2727
namespace: dolly
2828
url: https://testnav-aareg-proxy.dev-fss-pub.nais.io
2929
cluster: dev-fss
30-
30+
spec:
31+
azure:
32+
application:
33+
enabled: true
3134
management:
3235
endpoints:
3336
enabled-by-default: true

apps/dolly-backend/config.test.yml

+2-1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ spec:
3737
- application: testnav-organisasjon-service
3838
- application: testnav-pdl-forvalter-dev
3939
- application: testnav-person-service
40+
- application: testnav-skattekort-service
4041
- application: testnav-sykemelding-api
4142
- application: testnav-synt-sykemelding-api
4243
- application: testnav-tps-messaging-service
@@ -107,4 +108,4 @@ spec:
107108
name: testnav-dolly-backend-dev
108109
databases:
109110
- name: testnav-dolly-backend-dev
110-
autoBackupHour: 3
111+
autoBackupHour: 3

apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/PensjonforvalterClient.java

+25-2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import no.nav.dolly.bestilling.pensjonforvalter.domain.PensjonTpYtelseRequest;
2222
import no.nav.dolly.bestilling.pensjonforvalter.domain.PensjonUforetrygdRequest;
2323
import no.nav.dolly.bestilling.pensjonforvalter.domain.PensjonforvalterResponse;
24+
import no.nav.dolly.bestilling.pensjonforvalter.domain.PensjonsavtaleRequest;
2425
import no.nav.dolly.bestilling.personservice.PersonServiceConsumer;
2526
import no.nav.dolly.consumer.norg2.Norg2Consumer;
2627
import no.nav.dolly.consumer.norg2.dto.Norg2EnhetResponse;
@@ -83,6 +84,7 @@ public class PensjonforvalterClient implements ClientRegister {
8384
private static final String TP_FORHOLD = "TpForhold#";
8485
private static final String PEN_ALDERSPENSJON = "AP#";
8586
private static final String PEN_UFORETRYGD = "Ufoer#";
87+
private static final String PEN_PENSJONSAVTALE = "Pensjonsavtale#";
8688
private static final String PERIODE = "/periode/";
8789

8890
private final PensjonforvalterConsumer pensjonforvalterConsumer;
@@ -154,7 +156,10 @@ public Flux<ClientFuture> gjenopprett(RsDollyUtvidetBestilling bestilling, Dolly
154156
.map(response -> POPP_INNTEKTSREGISTER + decodeStatus(response, dollyPerson.getIdent())),
155157

156158
lagreTpForhold(pensjon, dollyPerson.getIdent(), bestilteMiljoer.get())
157-
.map(response -> TP_FORHOLD + decodeStatus(response, dollyPerson.getIdent()))
159+
.map(response -> TP_FORHOLD + decodeStatus(response, dollyPerson.getIdent())),
160+
161+
lagrePensjonsavtale(pensjon, dollyPerson.getIdent(), bestilteMiljoer.get())
162+
.map(response -> PEN_PENSJONSAVTALE + decodeStatus(response, dollyPerson.getIdent()))
158163
)
159164
.collectList()
160165
.doOnNext(statusResultat::addAll)
@@ -197,9 +202,10 @@ public Flux<ClientFuture> gjenopprett(RsDollyUtvidetBestilling bestilling, Dolly
197202
@Override
198203
public void release(List<String> identer) {
199204

200-
// Pensjonforvalter / POPP støtter pt ikke sletting
205+
// Pensjonforvalter / POPP, AP, UT støtter pt ikke sletting
201206

202207
pensjonforvalterConsumer.sletteTpForhold(identer);
208+
pensjonforvalterConsumer.slettePensjonsavtale(identer);
203209
}
204210

205211
public static PensjonforvalterResponse mergePensjonforvalterResponses(List<PensjonforvalterResponse> responser) {
@@ -490,6 +496,23 @@ private Mono<PensjonforvalterResponse> lagreTpForhold(PensjonData pensjonData, S
490496
.map(PensjonforvalterClient::mergePensjonforvalterResponses);
491497
}
492498

499+
private Flux<PensjonforvalterResponse> lagrePensjonsavtale(PensjonData pensjon, String ident, Set<String> miljoer) {
500+
501+
return Flux.just(pensjon)
502+
.filter(PensjonData::hasPensjonsavtale)
503+
.map(PensjonData::getPensjonsavtale)
504+
.flatMap(pensjonsavtaler -> Flux.fromIterable(pensjonsavtaler)
505+
.flatMap(pensjonsavtale -> {
506+
507+
var context = MappingContextUtils.getMappingContext();
508+
context.setProperty(IDENT, ident);
509+
context.setProperty(MILJOER, miljoer);
510+
511+
var pensjonsavtaleRequest = mapperFacade.map(pensjonsavtale, PensjonsavtaleRequest.class, context);
512+
return pensjonforvalterConsumer.lagrePensjonsavtale(pensjonsavtaleRequest);
513+
}));
514+
}
515+
493516
private String decodeStatus(PensjonforvalterResponse response, String ident) {
494517

495518
log.info("Mottatt status på {} fra Pensjon-Testdata-Facade: {}", ident, response);

apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/PensjonforvalterConsumer.java

+20
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,14 @@
77
import no.nav.dolly.bestilling.pensjonforvalter.command.HentMiljoerCommand;
88
import no.nav.dolly.bestilling.pensjonforvalter.command.HentSamboerCommand;
99
import no.nav.dolly.bestilling.pensjonforvalter.command.LagreAlderspensjonCommand;
10+
import no.nav.dolly.bestilling.pensjonforvalter.command.LagrePensjonsavtaleCommand;
1011
import no.nav.dolly.bestilling.pensjonforvalter.command.LagrePoppInntektCommand;
1112
import no.nav.dolly.bestilling.pensjonforvalter.command.LagreSamboerCommand;
1213
import no.nav.dolly.bestilling.pensjonforvalter.command.LagreTpForholdCommand;
1314
import no.nav.dolly.bestilling.pensjonforvalter.command.LagreTpYtelseCommand;
1415
import no.nav.dolly.bestilling.pensjonforvalter.command.LagreUforetrygdCommand;
1516
import no.nav.dolly.bestilling.pensjonforvalter.command.OpprettPersonCommand;
17+
import no.nav.dolly.bestilling.pensjonforvalter.command.SlettePensjonsavtaleCommand;
1618
import no.nav.dolly.bestilling.pensjonforvalter.command.SletteTpForholdCommand;
1719
import no.nav.dolly.bestilling.pensjonforvalter.domain.AlderspensjonRequest;
1820
import no.nav.dolly.bestilling.pensjonforvalter.domain.PensjonPersonRequest;
@@ -23,6 +25,7 @@
2325
import no.nav.dolly.bestilling.pensjonforvalter.domain.PensjonTpYtelseRequest;
2426
import no.nav.dolly.bestilling.pensjonforvalter.domain.PensjonUforetrygdRequest;
2527
import no.nav.dolly.bestilling.pensjonforvalter.domain.PensjonforvalterResponse;
28+
import no.nav.dolly.bestilling.pensjonforvalter.domain.PensjonsavtaleRequest;
2629
import no.nav.dolly.config.Consumers;
2730
import no.nav.dolly.metrics.Timed;
2831
import no.nav.testnav.libs.securitycore.domain.ServerProperties;
@@ -148,6 +151,23 @@ public Flux<PensjonforvalterResponse> lagreTpYtelse(PensjonTpYtelseRequest pensj
148151
.flatMapMany(token -> new LagreTpYtelseCommand(webClient, token.getTokenValue(), pensjonTpYtelseRequest).call());
149152
}
150153

154+
@Timed(name = "providers", tags = { "operation", "pen_lagrePensjpnsavtale" })
155+
public Flux<PensjonforvalterResponse> lagrePensjonsavtale(PensjonsavtaleRequest pensjonsavtaleRequest) {
156+
157+
return tokenService.exchange(serverProperties)
158+
.flatMapMany(token -> new LagrePensjonsavtaleCommand(webClient, pensjonsavtaleRequest, token.getTokenValue()).call());
159+
}
160+
161+
@Timed(name = "providers", tags = { "operation", "pen_slettePensjpnsavtale" })
162+
public void slettePensjonsavtale(List<String> identer) {
163+
164+
var test = tokenService.exchange(serverProperties)
165+
.flatMapMany(token -> Flux.fromIterable(identer)
166+
.flatMap(ident -> new SlettePensjonsavtaleCommand(webClient, ident, token.getTokenValue()).call()))
167+
.collectList()
168+
.subscribe(resultat -> log.info("Slettet pensjonsavtaler (PEN), alle miljøer"));
169+
}
170+
151171
@Override
152172
public String serviceUrl() {
153173
return serverProperties.getUrl();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package no.nav.dolly.bestilling.pensjonforvalter.command;
2+
3+
import lombok.RequiredArgsConstructor;
4+
import lombok.extern.slf4j.Slf4j;
5+
import no.nav.dolly.bestilling.pensjonforvalter.domain.PensjonforvalterResponse;
6+
import no.nav.dolly.bestilling.pensjonforvalter.domain.PensjonsavtaleRequest;
7+
import no.nav.testnav.libs.reactivecore.utils.WebClientFilter;
8+
import org.springframework.web.reactive.function.client.WebClient;
9+
import reactor.core.publisher.Flux;
10+
import reactor.core.publisher.Mono;
11+
import reactor.util.retry.Retry;
12+
13+
import java.time.Duration;
14+
import java.util.concurrent.Callable;
15+
16+
import static no.nav.dolly.domain.CommonKeysAndUtils.CONSUMER;
17+
import static no.nav.dolly.domain.CommonKeysAndUtils.HEADER_NAV_CALL_ID;
18+
import static no.nav.dolly.domain.CommonKeysAndUtils.HEADER_NAV_CONSUMER_ID;
19+
import static no.nav.dolly.util.CallIdUtil.generateCallId;
20+
import static org.springframework.http.HttpHeaders.AUTHORIZATION;
21+
22+
@Slf4j
23+
@RequiredArgsConstructor
24+
public class LagrePensjonsavtaleCommand implements Callable<Flux<PensjonforvalterResponse>> {
25+
26+
private static final String PENSJONSAVTALE_URL = "/api/v2/pensjonsavtale/opprett";
27+
28+
private final WebClient webClient;
29+
private final PensjonsavtaleRequest pensjonsavtaleRequest;
30+
private final String token;
31+
32+
@Override
33+
public Flux<PensjonforvalterResponse> call() {
34+
35+
var callId = generateCallId();
36+
log.info("Pensjonsavtale lagre inntekt {}, callId: {}", pensjonsavtaleRequest, callId);
37+
38+
return webClient.post()
39+
.uri(uriBuilder -> uriBuilder.path(PENSJONSAVTALE_URL).build())
40+
.header(AUTHORIZATION, "Bearer " + token)
41+
.header(HEADER_NAV_CALL_ID, callId)
42+
.header(HEADER_NAV_CONSUMER_ID, CONSUMER)
43+
.bodyValue(pensjonsavtaleRequest)
44+
.retrieve()
45+
.bodyToFlux(PensjonforvalterResponse.class)
46+
.doOnError(WebClientFilter::logErrorMessage)
47+
.retryWhen(Retry.backoff(3, Duration.ofSeconds(5))
48+
.filter(WebClientFilter::is5xxException))
49+
.onErrorResume(error ->
50+
Mono.just(PensjonforvalterResponse.builder()
51+
.status(pensjonsavtaleRequest.getMiljoer().stream()
52+
.map(miljoe -> PensjonforvalterResponse.ResponseEnvironment.builder()
53+
.miljo(miljoe)
54+
.response(PensjonforvalterResponse.Response.builder()
55+
.httpStatus(PensjonforvalterResponse.HttpStatus.builder()
56+
.status(WebClientFilter.getStatus(error).value())
57+
.reasonPhrase(WebClientFilter.getStatus(error).getReasonPhrase())
58+
.build())
59+
.message(WebClientFilter.getMessage(error))
60+
.path(PENSJONSAVTALE_URL)
61+
.build())
62+
.build())
63+
.toList())
64+
.build()));
65+
}
66+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package no.nav.dolly.bestilling.pensjonforvalter.command;
2+
3+
import lombok.RequiredArgsConstructor;
4+
import lombok.extern.slf4j.Slf4j;
5+
import no.nav.dolly.bestilling.pensjonforvalter.domain.PensjonforvalterResponse;
6+
import no.nav.testnav.libs.reactivecore.utils.WebClientFilter;
7+
import no.nav.testnav.libs.securitycore.config.UserConstant;
8+
import org.springframework.web.reactive.function.client.WebClient;
9+
import reactor.core.publisher.Flux;
10+
import reactor.core.publisher.Mono;
11+
import reactor.util.retry.Retry;
12+
13+
import java.time.Duration;
14+
import java.util.concurrent.Callable;
15+
16+
import static no.nav.dolly.domain.CommonKeysAndUtils.CONSUMER;
17+
import static no.nav.dolly.domain.CommonKeysAndUtils.HEADER_NAV_CALL_ID;
18+
import static no.nav.dolly.domain.CommonKeysAndUtils.HEADER_NAV_CONSUMER_ID;
19+
import static no.nav.dolly.util.CallIdUtil.generateCallId;
20+
import static no.nav.dolly.util.TokenXUtil.getUserJwt;
21+
import static org.springframework.http.HttpHeaders.AUTHORIZATION;
22+
23+
@Slf4j
24+
@RequiredArgsConstructor
25+
public class SlettePensjonsavtaleCommand implements Callable<Flux<PensjonforvalterResponse>> {
26+
27+
private static final String PENSJON_TP_PERSON_FORHOLD_URL = "/api/v1/pensjonsavtale/delete";
28+
29+
private final WebClient webClient;
30+
private final String ident;
31+
private final String token;
32+
33+
34+
public Flux<PensjonforvalterResponse> call() {
35+
36+
var callId = generateCallId();
37+
log.info("Pensjon slette pensjonsavtale callId: {}", callId);
38+
39+
return webClient
40+
.delete()
41+
.uri(uriBuilder -> uriBuilder
42+
.path(PENSJON_TP_PERSON_FORHOLD_URL)
43+
.build())
44+
.header(AUTHORIZATION, "Bearer " + token)
45+
.header(UserConstant.USER_HEADER_JWT, getUserJwt())
46+
.header(HEADER_NAV_CALL_ID, callId)
47+
.header(HEADER_NAV_CONSUMER_ID, CONSUMER)
48+
.header("ident", ident)
49+
.retrieve()
50+
.bodyToFlux(PensjonforvalterResponse.class)
51+
.retryWhen(Retry.backoff(3, Duration.ofSeconds(5))
52+
.filter(WebClientFilter::is5xxException))
53+
.doOnError(WebClientFilter::logErrorMessage)
54+
.onErrorResume(Exception.class, error -> Mono.empty());
55+
}
56+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package no.nav.dolly.bestilling.pensjonforvalter.domain;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
5+
import lombok.Data;
6+
import lombok.NoArgsConstructor;
7+
8+
import java.util.ArrayList;
9+
import java.util.List;
10+
11+
import static java.util.Objects.isNull;
12+
13+
@Data
14+
@Builder
15+
@NoArgsConstructor
16+
@AllArgsConstructor
17+
public class PensjonsavtaleRequest {
18+
19+
public enum AvtaleKategori {
20+
NONE, UNKNOWN, INDIVIDUELL_ORDNING, PRIVAT_AFP,
21+
PRIVAT_TJENESTEPENSJON, OFFENTLIG_TJENESTEPENSJON, FOLKETRYGD
22+
}
23+
24+
private String ident;
25+
private String produktBetegnelse;
26+
private AvtaleKategori avtaleKategori;
27+
private List<OpprettUtbetalingsperiodeDTO> utbetalingsperioder;
28+
private List<String> miljoer;
29+
30+
public List<OpprettUtbetalingsperiodeDTO> getUtbetalingsperioder() {
31+
32+
if (isNull(utbetalingsperioder)) {
33+
utbetalingsperioder = new ArrayList<>();
34+
}
35+
return utbetalingsperioder;
36+
}
37+
38+
public List<String> getMiljoer() {
39+
40+
if (isNull(miljoer)) {
41+
miljoer = new ArrayList<>();
42+
}
43+
return miljoer;
44+
}
45+
46+
@Data
47+
@Builder
48+
@NoArgsConstructor
49+
@AllArgsConstructor
50+
public static class OpprettUtbetalingsperiodeDTO {
51+
private Integer startAlderAar;
52+
private Integer startAlderMaaned;
53+
private Integer sluttAlderAar;
54+
private Integer sluttAlderMaaned;
55+
private Integer aarligUtbetaling;
56+
}
57+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package no.nav.dolly.bestilling.pensjonforvalter.mapper;
2+
3+
import ma.glasnost.orika.CustomMapper;
4+
import ma.glasnost.orika.MapperFactory;
5+
import ma.glasnost.orika.MappingContext;
6+
import no.nav.dolly.bestilling.pensjonforvalter.domain.PensjonsavtaleRequest;
7+
import no.nav.dolly.domain.resultset.pensjon.PensjonData;
8+
import no.nav.dolly.mapper.MappingStrategy;
9+
import org.springframework.stereotype.Component;
10+
11+
import java.util.Set;
12+
13+
@Component
14+
public class PensjonsavtaleMappingStrategy implements MappingStrategy {
15+
16+
@Override
17+
public void register(MapperFactory factory) {
18+
factory.classMap(PensjonData.Pensjonsavtale.class, PensjonsavtaleRequest.class)
19+
.customize(new CustomMapper<>() {
20+
@Override
21+
public void mapAtoB(PensjonData.Pensjonsavtale pensjonsavtale, PensjonsavtaleRequest pensjonsavtaleRequest, MappingContext context) {
22+
23+
var ident = (String) context.getProperty("ident");
24+
var miljoer = (Set<String>) context.getProperty("miljoer");
25+
26+
pensjonsavtaleRequest.setIdent(ident);
27+
pensjonsavtaleRequest.setMiljoer(miljoer.stream().toList());
28+
}
29+
})
30+
.byDefault()
31+
.register();
32+
}
33+
}

apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/service/DollyBestillingService.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ protected void leggIdentTilGruppe(BestillingProgress progress, String beskrivels
154154
protected void leggIdentTilGruppe(String ident, BestillingProgress progress, String beskrivelse) {
155155

156156
identService.saveIdentTilGruppe(isNotBlank(ident) ? ident : progress.getIdent(), progress.getBestilling().getGruppe(), progress.getMaster(), beskrivelse);
157-
log.info("Ident {} lagt til gruppe {}", progress.getIdent(), progress.getBestilling().getGruppe().getId());
157+
log.info("Ident {} lagt til gruppe {}", isNotBlank(ident) ? ident : progress.getIdent(), progress.getBestilling().getGruppe().getId());
158158
}
159159

160160
protected Flux<DollyPerson> opprettDollyPerson(BestillingProgress progress, Bruker bruker) {

apps/dolly-backend/src/main/java/no/nav/dolly/domain/resultset/SystemTyper.java

+1
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ public enum SystemTyper {
3232
PEN_AP("Alderspensjon (AP)"),
3333
PEN_FORVALTER("Pensjon persondata (PEN)"),
3434
PEN_INNTEKT("Pensjonsopptjening (POPP)"),
35+
PEN_PENSJONSAVTALE("Pensjonsavtale (PEN)"),
3536
PEN_SAMBOER("Pensjon samboerregister"),
3637
PEN_UT("Uføretrygd (UT)"),
3738
SIGRUNSTUB("Skatteinntekt grunnlag (SIGRUN)"),

0 commit comments

Comments
 (0)