diff --git a/.github/workflows/app.levende-arbeidsforhold-service.yml b/.github/workflows/app.levende-arbeidsforhold-service.yml new file mode 100644 index 00000000000..5c2c2af3571 --- /dev/null +++ b/.github/workflows/app.levende-arbeidsforhold-service.yml @@ -0,0 +1,24 @@ +name: levende-arbeidsforhold-service + +on: + push: + paths: + - libs/kafka-config/** + - libs/avro-schema/** + - libs/security-core/** + - libs/servlet-core/** + - libs/servlet-insecure-security/** + - libs/reactive-core/** + - apps/levende-arbeidsforhold-service/** + - .github/workflows/app.levende-arbeidsforhold-service.yml + +jobs: + workflow: + uses: ./.github/workflows/common.workflow.backend.yml + with: + working-directory: "apps/levende-arbeidsforhold-service" + deploy-tag: "#deploy-levende-arbeidsforhold-service" + permissions: + contents: read + id-token: write + secrets: inherit diff --git a/apps/arbeidsforhold-service/src/main/resources/application.yml b/apps/arbeidsforhold-service/src/main/resources/application.yml index 0cebd9bc87e..1ede0997de3 100644 --- a/apps/arbeidsforhold-service/src/main/resources/application.yml +++ b/apps/arbeidsforhold-service/src/main/resources/application.yml @@ -27,7 +27,10 @@ consumers: namespace: dolly url: https://testnav-aareg-proxy.dev-fss-pub.nais.io cluster: dev-fss - +spec: + azure: + application: + enabled: true management: endpoints: enabled-by-default: true diff --git a/apps/dolly-backend/config.test.yml b/apps/dolly-backend/config.test.yml index 23eb2c39428..79877d0ed8b 100644 --- a/apps/dolly-backend/config.test.yml +++ b/apps/dolly-backend/config.test.yml @@ -37,6 +37,7 @@ spec: - application: testnav-organisasjon-service - application: testnav-pdl-forvalter-dev - application: testnav-person-service + - application: testnav-skattekort-service - application: testnav-sykemelding-api - application: testnav-synt-sykemelding-api - application: testnav-tps-messaging-service @@ -107,4 +108,4 @@ spec: name: testnav-dolly-backend-dev databases: - name: testnav-dolly-backend-dev - autoBackupHour: 3 \ No newline at end of file + autoBackupHour: 3 diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/PensjonforvalterClient.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/PensjonforvalterClient.java index 3f34286411f..ea4f68fb40a 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/PensjonforvalterClient.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/PensjonforvalterClient.java @@ -21,6 +21,7 @@ import no.nav.dolly.bestilling.pensjonforvalter.domain.PensjonTpYtelseRequest; import no.nav.dolly.bestilling.pensjonforvalter.domain.PensjonUforetrygdRequest; import no.nav.dolly.bestilling.pensjonforvalter.domain.PensjonforvalterResponse; +import no.nav.dolly.bestilling.pensjonforvalter.domain.PensjonsavtaleRequest; import no.nav.dolly.bestilling.personservice.PersonServiceConsumer; import no.nav.dolly.consumer.norg2.Norg2Consumer; import no.nav.dolly.consumer.norg2.dto.Norg2EnhetResponse; @@ -83,6 +84,7 @@ public class PensjonforvalterClient implements ClientRegister { private static final String TP_FORHOLD = "TpForhold#"; private static final String PEN_ALDERSPENSJON = "AP#"; private static final String PEN_UFORETRYGD = "Ufoer#"; + private static final String PEN_PENSJONSAVTALE = "Pensjonsavtale#"; private static final String PERIODE = "/periode/"; private final PensjonforvalterConsumer pensjonforvalterConsumer; @@ -154,7 +156,10 @@ public Flux gjenopprett(RsDollyUtvidetBestilling bestilling, Dolly .map(response -> POPP_INNTEKTSREGISTER + decodeStatus(response, dollyPerson.getIdent())), lagreTpForhold(pensjon, dollyPerson.getIdent(), bestilteMiljoer.get()) - .map(response -> TP_FORHOLD + decodeStatus(response, dollyPerson.getIdent())) + .map(response -> TP_FORHOLD + decodeStatus(response, dollyPerson.getIdent())), + + lagrePensjonsavtale(pensjon, dollyPerson.getIdent(), bestilteMiljoer.get()) + .map(response -> PEN_PENSJONSAVTALE + decodeStatus(response, dollyPerson.getIdent())) ) .collectList() .doOnNext(statusResultat::addAll) @@ -197,9 +202,10 @@ public Flux gjenopprett(RsDollyUtvidetBestilling bestilling, Dolly @Override public void release(List identer) { - // Pensjonforvalter / POPP støtter pt ikke sletting + // Pensjonforvalter / POPP, AP, UT støtter pt ikke sletting pensjonforvalterConsumer.sletteTpForhold(identer); + pensjonforvalterConsumer.slettePensjonsavtale(identer); } public static PensjonforvalterResponse mergePensjonforvalterResponses(List responser) { @@ -490,6 +496,23 @@ private Mono lagreTpForhold(PensjonData pensjonData, S .map(PensjonforvalterClient::mergePensjonforvalterResponses); } + private Flux lagrePensjonsavtale(PensjonData pensjon, String ident, Set miljoer) { + + return Flux.just(pensjon) + .filter(PensjonData::hasPensjonsavtale) + .map(PensjonData::getPensjonsavtale) + .flatMap(pensjonsavtaler -> Flux.fromIterable(pensjonsavtaler) + .flatMap(pensjonsavtale -> { + + var context = MappingContextUtils.getMappingContext(); + context.setProperty(IDENT, ident); + context.setProperty(MILJOER, miljoer); + + var pensjonsavtaleRequest = mapperFacade.map(pensjonsavtale, PensjonsavtaleRequest.class, context); + return pensjonforvalterConsumer.lagrePensjonsavtale(pensjonsavtaleRequest); + })); + } + private String decodeStatus(PensjonforvalterResponse response, String ident) { log.info("Mottatt status på {} fra Pensjon-Testdata-Facade: {}", ident, response); diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/PensjonforvalterConsumer.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/PensjonforvalterConsumer.java index c22bc5da68e..d2f8fbfca78 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/PensjonforvalterConsumer.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/PensjonforvalterConsumer.java @@ -7,12 +7,14 @@ 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.LagrePensjonsavtaleCommand; import no.nav.dolly.bestilling.pensjonforvalter.command.LagrePoppInntektCommand; import no.nav.dolly.bestilling.pensjonforvalter.command.LagreSamboerCommand; import no.nav.dolly.bestilling.pensjonforvalter.command.LagreTpForholdCommand; import no.nav.dolly.bestilling.pensjonforvalter.command.LagreTpYtelseCommand; import no.nav.dolly.bestilling.pensjonforvalter.command.LagreUforetrygdCommand; import no.nav.dolly.bestilling.pensjonforvalter.command.OpprettPersonCommand; +import no.nav.dolly.bestilling.pensjonforvalter.command.SlettePensjonsavtaleCommand; import no.nav.dolly.bestilling.pensjonforvalter.command.SletteTpForholdCommand; import no.nav.dolly.bestilling.pensjonforvalter.domain.AlderspensjonRequest; import no.nav.dolly.bestilling.pensjonforvalter.domain.PensjonPersonRequest; @@ -23,6 +25,7 @@ import no.nav.dolly.bestilling.pensjonforvalter.domain.PensjonTpYtelseRequest; import no.nav.dolly.bestilling.pensjonforvalter.domain.PensjonUforetrygdRequest; import no.nav.dolly.bestilling.pensjonforvalter.domain.PensjonforvalterResponse; +import no.nav.dolly.bestilling.pensjonforvalter.domain.PensjonsavtaleRequest; import no.nav.dolly.config.Consumers; import no.nav.dolly.metrics.Timed; import no.nav.testnav.libs.securitycore.domain.ServerProperties; @@ -148,6 +151,23 @@ public Flux lagreTpYtelse(PensjonTpYtelseRequest pensj .flatMapMany(token -> new LagreTpYtelseCommand(webClient, token.getTokenValue(), pensjonTpYtelseRequest).call()); } + @Timed(name = "providers", tags = { "operation", "pen_lagrePensjpnsavtale" }) + public Flux lagrePensjonsavtale(PensjonsavtaleRequest pensjonsavtaleRequest) { + + return tokenService.exchange(serverProperties) + .flatMapMany(token -> new LagrePensjonsavtaleCommand(webClient, pensjonsavtaleRequest, token.getTokenValue()).call()); + } + + @Timed(name = "providers", tags = { "operation", "pen_slettePensjpnsavtale" }) + public void slettePensjonsavtale(List identer) { + + var test = tokenService.exchange(serverProperties) + .flatMapMany(token -> Flux.fromIterable(identer) + .flatMap(ident -> new SlettePensjonsavtaleCommand(webClient, ident, token.getTokenValue()).call())) + .collectList() + .subscribe(resultat -> log.info("Slettet pensjonsavtaler (PEN), alle miljøer")); + } + @Override public String serviceUrl() { return serverProperties.getUrl(); diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/command/LagrePensjonsavtaleCommand.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/command/LagrePensjonsavtaleCommand.java new file mode 100644 index 00000000000..81e8b513b7a --- /dev/null +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/command/LagrePensjonsavtaleCommand.java @@ -0,0 +1,66 @@ +package no.nav.dolly.bestilling.pensjonforvalter.command; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import no.nav.dolly.bestilling.pensjonforvalter.domain.PensjonforvalterResponse; +import no.nav.dolly.bestilling.pensjonforvalter.domain.PensjonsavtaleRequest; +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.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 org.springframework.http.HttpHeaders.AUTHORIZATION; + +@Slf4j +@RequiredArgsConstructor +public class LagrePensjonsavtaleCommand implements Callable> { + + private static final String PENSJONSAVTALE_URL = "/api/v2/pensjonsavtale/opprett"; + + private final WebClient webClient; + private final PensjonsavtaleRequest pensjonsavtaleRequest; + private final String token; + + @Override + public Flux call() { + + var callId = generateCallId(); + log.info("Pensjonsavtale lagre inntekt {}, callId: {}", pensjonsavtaleRequest, callId); + + return webClient.post() + .uri(uriBuilder -> uriBuilder.path(PENSJONSAVTALE_URL).build()) + .header(AUTHORIZATION, "Bearer " + token) + .header(HEADER_NAV_CALL_ID, callId) + .header(HEADER_NAV_CONSUMER_ID, CONSUMER) + .bodyValue(pensjonsavtaleRequest) + .retrieve() + .bodyToFlux(PensjonforvalterResponse.class) + .doOnError(WebClientFilter::logErrorMessage) + .retryWhen(Retry.backoff(3, Duration.ofSeconds(5)) + .filter(WebClientFilter::is5xxException)) + .onErrorResume(error -> + Mono.just(PensjonforvalterResponse.builder() + .status(pensjonsavtaleRequest.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(PENSJONSAVTALE_URL) + .build()) + .build()) + .toList()) + .build())); + } +} diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/command/SlettePensjonsavtaleCommand.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/command/SlettePensjonsavtaleCommand.java new file mode 100644 index 00000000000..67358421be6 --- /dev/null +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/command/SlettePensjonsavtaleCommand.java @@ -0,0 +1,56 @@ +package no.nav.dolly.bestilling.pensjonforvalter.command; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import no.nav.dolly.bestilling.pensjonforvalter.domain.PensjonforvalterResponse; +import no.nav.testnav.libs.reactivecore.utils.WebClientFilter; +import no.nav.testnav.libs.securitycore.config.UserConstant; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; +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.TokenXUtil.getUserJwt; +import static org.springframework.http.HttpHeaders.AUTHORIZATION; + +@Slf4j +@RequiredArgsConstructor +public class SlettePensjonsavtaleCommand implements Callable> { + + private static final String PENSJON_TP_PERSON_FORHOLD_URL = "/api/v1/pensjonsavtale/delete"; + + private final WebClient webClient; + private final String ident; + private final String token; + + + public Flux call() { + + var callId = generateCallId(); + log.info("Pensjon slette pensjonsavtale callId: {}", callId); + + return webClient + .delete() + .uri(uriBuilder -> uriBuilder + .path(PENSJON_TP_PERSON_FORHOLD_URL) + .build()) + .header(AUTHORIZATION, "Bearer " + token) + .header(UserConstant.USER_HEADER_JWT, getUserJwt()) + .header(HEADER_NAV_CALL_ID, callId) + .header(HEADER_NAV_CONSUMER_ID, CONSUMER) + .header("ident", ident) + .retrieve() + .bodyToFlux(PensjonforvalterResponse.class) + .retryWhen(Retry.backoff(3, Duration.ofSeconds(5)) + .filter(WebClientFilter::is5xxException)) + .doOnError(WebClientFilter::logErrorMessage) + .onErrorResume(Exception.class, error -> Mono.empty()); + } +} \ No newline at end of file diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/domain/PensjonsavtaleRequest.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/domain/PensjonsavtaleRequest.java new file mode 100644 index 00000000000..06f9ae6d4a9 --- /dev/null +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/domain/PensjonsavtaleRequest.java @@ -0,0 +1,57 @@ +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 PensjonsavtaleRequest { + + public enum AvtaleKategori { + NONE, UNKNOWN, INDIVIDUELL_ORDNING, PRIVAT_AFP, + PRIVAT_TJENESTEPENSJON, OFFENTLIG_TJENESTEPENSJON, FOLKETRYGD + } + + private String ident; + private String produktBetegnelse; + private AvtaleKategori avtaleKategori; + private List utbetalingsperioder; + private List miljoer; + + public List getUtbetalingsperioder() { + + if (isNull(utbetalingsperioder)) { + utbetalingsperioder = new ArrayList<>(); + } + return utbetalingsperioder; + } + + public List getMiljoer() { + + if (isNull(miljoer)) { + miljoer = new ArrayList<>(); + } + return miljoer; + } + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class OpprettUtbetalingsperiodeDTO { + private Integer startAlderAar; + private Integer startAlderMaaned; + private Integer sluttAlderAar; + private Integer sluttAlderMaaned; + private Integer aarligUtbetaling; + } +} diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/mapper/PensjonsavtaleMappingStrategy.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/mapper/PensjonsavtaleMappingStrategy.java new file mode 100644 index 00000000000..44f2511bdf5 --- /dev/null +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/mapper/PensjonsavtaleMappingStrategy.java @@ -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.PensjonsavtaleRequest; +import no.nav.dolly.domain.resultset.pensjon.PensjonData; +import no.nav.dolly.mapper.MappingStrategy; +import org.springframework.stereotype.Component; + +import java.util.Set; + +@Component +public class PensjonsavtaleMappingStrategy implements MappingStrategy { + + @Override + public void register(MapperFactory factory) { + factory.classMap(PensjonData.Pensjonsavtale.class, PensjonsavtaleRequest.class) + .customize(new CustomMapper<>() { + @Override + public void mapAtoB(PensjonData.Pensjonsavtale pensjonsavtale, PensjonsavtaleRequest pensjonsavtaleRequest, MappingContext context) { + + var ident = (String) context.getProperty("ident"); + var miljoer = (Set) context.getProperty("miljoer"); + + pensjonsavtaleRequest.setIdent(ident); + pensjonsavtaleRequest.setMiljoer(miljoer.stream().toList()); + } + }) + .byDefault() + .register(); + } +} diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/service/DollyBestillingService.java b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/service/DollyBestillingService.java index 7e1639dcf84..8befa07bc47 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/service/DollyBestillingService.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/service/DollyBestillingService.java @@ -154,7 +154,7 @@ protected void leggIdentTilGruppe(BestillingProgress progress, String beskrivels protected void leggIdentTilGruppe(String ident, BestillingProgress progress, String beskrivelse) { identService.saveIdentTilGruppe(isNotBlank(ident) ? ident : progress.getIdent(), progress.getBestilling().getGruppe(), progress.getMaster(), beskrivelse); - log.info("Ident {} lagt til gruppe {}", progress.getIdent(), progress.getBestilling().getGruppe().getId()); + log.info("Ident {} lagt til gruppe {}", isNotBlank(ident) ? ident : progress.getIdent(), progress.getBestilling().getGruppe().getId()); } protected Flux opprettDollyPerson(BestillingProgress progress, Bruker bruker) { diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/resultset/SystemTyper.java b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/resultset/SystemTyper.java index 20381dbac04..5bb1cdb6edb 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/resultset/SystemTyper.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/resultset/SystemTyper.java @@ -32,6 +32,7 @@ public enum SystemTyper { PEN_AP("Alderspensjon (AP)"), PEN_FORVALTER("Pensjon persondata (PEN)"), PEN_INNTEKT("Pensjonsopptjening (POPP)"), + PEN_PENSJONSAVTALE("Pensjonsavtale (PEN)"), PEN_SAMBOER("Pensjon samboerregister"), PEN_UT("Uføretrygd (UT)"), SIGRUNSTUB("Skatteinntekt grunnlag (SIGRUN)"), diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/resultset/pensjon/PensjonData.java b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/resultset/pensjon/PensjonData.java index 8f90d121877..836e548a9b7 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/domain/resultset/pensjon/PensjonData.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/domain/resultset/pensjon/PensjonData.java @@ -1,5 +1,6 @@ package no.nav.dolly.domain.resultset.pensjon; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; @@ -30,28 +31,49 @@ public class PensjonData { @Schema(description = "Data for tjenestepensjon (TP)") private List tp; + @Schema(description = "Data for pensjonsavtale") + private List pensjonsavtale; + @Schema(description = "Data for alderspensjon (AP)") private Alderspensjon alderspensjon; @Schema(description = "Data for uføretrygd (UT)") private Uforetrygd uforetrygd; + @JsonIgnore public boolean hasInntekt() { return nonNull(inntekt); } + @JsonIgnore public boolean hasTp() { return !getTp().isEmpty(); } + @JsonIgnore public boolean hasAlderspensjon() { return nonNull(alderspensjon); } + @JsonIgnore public boolean hasUforetrygd() { return nonNull(uforetrygd); } + @JsonIgnore + public boolean hasPensjonsavtale() { + + return !getPensjonsavtale().isEmpty(); + } + + public List getPensjonsavtale() { + + if (isNull(pensjonsavtale)) { + pensjonsavtale = new ArrayList<>(); + } + return pensjonsavtale; + } + public List getTp() { if (isNull(tp)) { @@ -131,6 +153,41 @@ public static class TpYtelse { private LocalDate datoYtelseIverksattTom; } + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class Pensjonsavtale { + public enum AvtaleKategori { + NONE, UNKNOWN, INDIVIDUELL_ORDNING, PRIVAT_AFP, + PRIVAT_TJENESTEPENSJON, OFFENTLIG_TJENESTEPENSJON, FOLKETRYGD + } + + private String produktBetegnelse; + private AvtaleKategori avtaleKategori; + private List utbetalingsperioder; + + public List getUtbetalingsperioder() { + + if (isNull(utbetalingsperioder)) { + utbetalingsperioder = new ArrayList<>(); + } + return utbetalingsperioder; + } + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class OpprettUtbetalingsperiodeDTO { + private Integer startAlderAar; + private Integer startAlderMaaned; + private Integer sluttAlderAar; + private Integer sluttAlderMaaned; + private Integer aarligUtbetaling; + } + } + @Data @Builder @NoArgsConstructor diff --git a/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/BestillingPensjonforvalterStatusMapper.java b/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/BestillingPensjonforvalterStatusMapper.java index 807422d2fb6..54aaf40538b 100644 --- a/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/BestillingPensjonforvalterStatusMapper.java +++ b/apps/dolly-backend/src/main/java/no/nav/dolly/mapper/BestillingPensjonforvalterStatusMapper.java @@ -18,6 +18,7 @@ import static no.nav.dolly.domain.resultset.SystemTyper.PEN_AP; import static no.nav.dolly.domain.resultset.SystemTyper.PEN_FORVALTER; import static no.nav.dolly.domain.resultset.SystemTyper.PEN_INNTEKT; +import static no.nav.dolly.domain.resultset.SystemTyper.PEN_PENSJONSAVTALE; import static no.nav.dolly.domain.resultset.SystemTyper.PEN_SAMBOER; import static no.nav.dolly.domain.resultset.SystemTyper.PEN_UT; import static no.nav.dolly.domain.resultset.SystemTyper.TP_FORVALTER; @@ -33,6 +34,7 @@ public final class BestillingPensjonforvalterStatusMapper { private static final String ALDERSPENSJON = "AP"; private static final String UFORETRYGD = "Ufoer"; private static final String SAMBOER = "Samboer"; + private static final String PENSJONSAVTALE = "Pensjonsavtale"; public static List buildPensjonforvalterStatusMap(List progressList) { @@ -65,6 +67,7 @@ public static List buildPensjonforvalterStatusMap(List() { @Override public void mapAtoB(PensjonData pensjonData, PensjonData akkumulert, MappingContext context) { akkumulert.getTp().addAll(pensjonData.getTp()); + akkumulert.getPensjonsavtale().addAll(pensjonData.getPensjonsavtale()); } }) .register(); diff --git a/apps/dolly-frontend/src/main/js/playwright/globalSetup.tsx b/apps/dolly-frontend/src/main/js/playwright/globalSetup.tsx index 827112dc97f..ec20a4276de 100644 --- a/apps/dolly-frontend/src/main/js/playwright/globalSetup.tsx +++ b/apps/dolly-frontend/src/main/js/playwright/globalSetup.tsx @@ -29,6 +29,7 @@ import { organisasjonFraMiljoeMock, paginerteGrupperMock, pensjonMock, + pensjonPensjonsavtaleMock, pensjonTpMock, personFragmentNavigerMock, personFragmentSearchMock, @@ -82,6 +83,9 @@ const skjerming = new RegExp(/dolly-backend\/api\/v1\/skjerming/) const pensjon = new RegExp(/testnav-pensjon-testdata-facade-proxy\/api\/v1\/inntekt/) const pensjonMiljoer = new RegExp(/testnav-pensjon-testdata-facade-proxy\/api\/v1\/miljo/) const pensjonTp = new RegExp(/testnav-pensjon-testdata-facade-proxy\/api\/v1\/tp(.*?)q1/) +const pensjonPensjonsavtale = new RegExp( + /testnav-pensjon-testdata-facade-proxy\/api\/v2\/pensjonsavtale\/hent/, +) const krrstub = new RegExp(/testnav-krrstub-proxy\/api\/v2/) const udistub = new RegExp(/testnav-udistub-proxy\/api\/v1/) const brregstub = new RegExp(/testnav-brregstub/) @@ -142,6 +146,7 @@ const mockRoutes: RouteInfo[] = [ { url: inst, response: instMock }, { url: pensjon, response: pensjonMock }, { url: pensjonTp, response: pensjonTpMock }, + { url: pensjonPensjonsavtale, response: pensjonPensjonsavtaleMock }, { url: sigrunstub, response: sigrunstubMock }, { url: udistub, response: udistubMock }, { url: kodeverk, response: kodeverkMock }, diff --git a/apps/dolly-frontend/src/main/js/playwright/mocks/BasicMocks.tsx b/apps/dolly-frontend/src/main/js/playwright/mocks/BasicMocks.tsx index 857d74b72ad..f861792b266 100644 --- a/apps/dolly-frontend/src/main/js/playwright/mocks/BasicMocks.tsx +++ b/apps/dolly-frontend/src/main/js/playwright/mocks/BasicMocks.tsx @@ -881,6 +881,8 @@ export const pensjonMock = [ export const pensjonTpMock = [{ ordning: '4095' }, { ordning: '3010' }] +export const pensjonPensjonsavtaleMock = [{}, {}] + export const tagsMock = [{ tag: 'DUMMY', beskrivelse: 'Dummy' }] export const kontoregisterMock = { diff --git a/apps/dolly-frontend/src/main/js/src/components/bestilling/sammendrag/kriterier/BestillingKriterieMapper.tsx b/apps/dolly-frontend/src/main/js/src/components/bestilling/sammendrag/kriterier/BestillingKriterieMapper.tsx index d2b993d48fc..432c2203aee 100644 --- a/apps/dolly-frontend/src/main/js/src/components/bestilling/sammendrag/kriterier/BestillingKriterieMapper.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/bestilling/sammendrag/kriterier/BestillingKriterieMapper.tsx @@ -1903,6 +1903,34 @@ const mapPensjon = (bestillingData, data, navEnheter) => { data.push(pensjonforvalterPopp) } + if (pensjonKriterier.pensjonsavtale && pensjonKriterier.pensjonsavtale?.length > 0) { + const penPensjonsavtale = { + header: 'Pensjonsavtale (PEN)', + itemRows: [], + } + + pensjonKriterier.pensjonsavtale?.forEach((pensjonsavtale, i) => { + penPensjonsavtale.itemRows.push([ + { numberHeader: `Pensjonsavtale ${i + 1}` }, + obj('Produktbetegnelse', pensjonsavtale.produktBetegnelse), + obj('Avtalekategori', showLabel('avtaleKategori', pensjonsavtale.avtaleKategori)), + ]) + + pensjonsavtale.utbetalingsperioder?.forEach((periode, j) => { + penPensjonsavtale.itemRows.push([ + { numberHeader: `Utbetalingsperiode ${j + 1}` }, + obj('Startalder År', periode.startAlderAar), + obj('Startalder Måned', showLabel('maanedsvelger', periode.startAlderMaaned)), + obj('Sluttalder År', periode.sluttAlderAar), + obj('Sluttalder Måned', showLabel('maanedsvelger', periode.sluttAlderMaaned)), + obj('Årlig Utbetaling', periode.aarligUtbetaling), + ]) + }) + }) + + data.push(penPensjonsavtale) + } + if (pensjonKriterier.tp && pensjonKriterier.tp?.length > 0) { const hentTpOrdningNavn = (tpnr) => { if (Options('tpOrdninger')?.length) { diff --git a/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/stegVelger/steg/steg1/paneler/Pensjon.tsx b/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/stegVelger/steg/steg1/paneler/Pensjon.tsx index 913c27b9586..c4b4a9621a6 100644 --- a/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/stegVelger/steg/steg1/paneler/Pensjon.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/stegVelger/steg/steg1/paneler/Pensjon.tsx @@ -15,6 +15,7 @@ import { runningE2ETest } from '@/service/services/Request' import _ from 'lodash' import { alderspensjonPath } from '@/components/fagsystem/alderspensjon/form/Form' import { uforetrygdPath } from '@/components/fagsystem/uforetrygd/form/Form' +import { initialPensjonsavtale } from '@/components/fagsystem/pensjonsavtale/initalValues' export const PensjonPanel = ({ stateModifier, formValues }: any) => { const sm = stateModifier(PensjonPanel.initialValues) @@ -92,6 +93,9 @@ export const PensjonPanel = ({ stateModifier, formValues }: any) => { + + + @@ -121,6 +125,7 @@ PensjonPanel.initialValues = ({ set, del, has }: any) => { tp: 'pensjonforvalter.tp', alderspensjon: 'pensjonforvalter.alderspensjon', uforetrygd: 'pensjonforvalter.uforetrygd', + pensjonsavtale: 'pensjonforvalter.pensjonsavtale', } return { inntekt: { @@ -160,5 +165,13 @@ PensjonPanel.initialValues = ({ set, del, has }: any) => { }, remove: () => del(paths.uforetrygd), }, + pensjonsavtale: { + label: 'Har pensjonsavtale', + checked: has(paths.pensjonsavtale), + add: () => { + set(paths.pensjonsavtale, initialPensjonsavtale) + }, + remove: () => del(paths.pensjonsavtale), + }, } } diff --git a/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/stegVelger/steg/steg2/Steg2.tsx b/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/stegVelger/steg/steg2/Steg2.tsx index 80b2d3e006f..1b8684a167e 100644 --- a/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/stegVelger/steg/steg2/Steg2.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/bestillingsveileder/stegVelger/steg/steg2/Steg2.tsx @@ -24,6 +24,7 @@ import { UforetrygdForm } from '@/components/fagsystem/uforetrygd/form/Form' import { SigrunstubPensjonsgivendeForm } from '@/components/fagsystem/sigrunstubPensjonsgivende/form/Form' import { KrrstubForm } from '@/components/fagsystem/krrstub/form/KrrForm' import { useFormContext } from 'react-hook-form' +import { PensjonsavtaleForm } from '@/components/fagsystem/pensjonsavtale/form/Form' const gruppeNavn = (gruppe) => {gruppe.navn} @@ -70,6 +71,7 @@ export const Steg2 = () => { + diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/familierelasjoner/foreldreansvar/Foreldreansvar.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/familierelasjoner/foreldreansvar/Foreldreansvar.tsx index 5275e65456d..0040bdc942c 100644 --- a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/familierelasjoner/foreldreansvar/Foreldreansvar.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pdlf/form/partials/familierelasjoner/foreldreansvar/Foreldreansvar.tsx @@ -167,7 +167,7 @@ export const ForeldreansvarForm = ({ eksisterendeNyPerson={eksisterendeNyPerson} /> )} - {kanHaForeldreansvar && opts?.personFoerLeggTil && ( + {ansvar === 'ANDRE' && kanHaForeldreansvar && opts?.personFoerLeggTil && ( { + const formMethods = useFormContext() + + return ( + + + + {(formPath, idx) => ( + + +
+ + + + + +
+
+
+ )} +
+
+
+ ) +} + +PensjonsavtaleForm.validation = validation diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pensjonsavtale/form/partials/Utbetalingsperioder.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pensjonsavtale/form/partials/Utbetalingsperioder.tsx new file mode 100644 index 00000000000..9e4b28eb6da --- /dev/null +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pensjonsavtale/form/partials/Utbetalingsperioder.tsx @@ -0,0 +1,45 @@ +import { FormDollyFieldArray } from '@/components/ui/form/fieldArray/DollyFieldArray' +import * as React from 'react' +import { FormTextInput } from '@/components/ui/form/inputs/textInput/TextInput' +import { SelectOptionsManager as Options } from '@/service/SelectOptions' +import { FormSelect } from '@/components/ui/form/inputs/select/Select' +import { initialUtbetalingsperiode } from '@/components/fagsystem/pensjonsavtale/initalValues' + +export const UtbetalingsperioderForm = ({ path }: any) => { + return ( + + {(path: any, idx: React.Key) => ( + +
+ + + + + +
+
+ )} +
+ ) +} diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pensjonsavtale/form/validation.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pensjonsavtale/form/validation.tsx new file mode 100644 index 00000000000..55fe1a047cd --- /dev/null +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pensjonsavtale/form/validation.tsx @@ -0,0 +1,56 @@ +import * as Yup from 'yup' +import { ifPresent } from '@/utils/YupValidations' + +export const validation = { + pensjonsavtale: ifPresent( + '$pensjonforvalter.pensjonsavtale', + Yup.array().of( + Yup.object({ + produktBetegnelse: Yup.string().required('Feltet er påkrevd'), + avtaleKategori: Yup.string().required('Feltet er påkrevd'), + utbetalingsperioder: Yup.array().of( + Yup.object({ + startAlderAar: Yup.number() + .min(62, 'Minimum 62 år') + .max(72, 'Maksimum 72 år') + .required('Feltet er påkrevd') + .typeError('Feltet er påkrevd og må ha verdi mellom 62 og 72 år'), + startAlderMaaned: Yup.number() + .min(1, 'Minimum 1 (januar)') + .max(12, 'Maksimum 12 (desember)') + .required('Feltet er påkrevd') + .typeError('Feltet er påkrevd og må ha verdi mellom 1 og 12 (januar-desember)'), + sluttAlderAar: Yup.number() + .nullable() + .min(72, 'Minimum 72 år') + .max(100, 'Maksimum 100 år') + .transform((value) => (Number.isNaN(value) ? null : value)) + .test( + 'has-value-if-sluttAlderMaaned-is-stated', + 'Sluttalder År må være satt når Sluttalder Måned har verdi', + (sluttAlderAar, context) => { + return sluttAlderAar || (!sluttAlderAar && !context.parent.sluttAlderMaaned) + }, + ), + sluttAlderMaaned: Yup.number() + .nullable() + .min(1, 'Minimum 1 (januar)') + .max(12, 'Maksimum 12 (desember)') + .typeError('Verdi kan angis, og må da ha verdi mellom 1 og 12 (januar-desember)') + .test( + 'has-value-if-sluttAlderAar-is-stated', + 'Feltet er påkrevd når Sluttalder År er angitt', + (sluttAlderMaaned, context) => { + return sluttAlderMaaned || (!sluttAlderMaaned && !context.parent.sluttAlderAar) + }, + ), + aarligUtbetaling: Yup.number() + .required() + .min(1000, 'Minimum 1000 kr') + .typeError('Verdi kan angis, og må da ha verdi minimum 1000 kr'), + }), + ), + }), + ), + ), +} diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pensjonsavtale/initalValues.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pensjonsavtale/initalValues.tsx new file mode 100644 index 00000000000..9f017676237 --- /dev/null +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pensjonsavtale/initalValues.tsx @@ -0,0 +1,15 @@ +export const initialUtbetalingsperiode = { + startAlderAar: 62, + startAlderMaaned: 1, + sluttAlderAar: 72, + sluttAlderMaaned: 12, + aarligUtbetaling: 30000, +} + +export const initialPensjonsavtale = [ + { + produktBetegnelse: 'Test av pensjonsavtale', + avtaleKategori: 'PRIVAT_TJENESTEPENSJON', + utbetalingsperioder: [initialUtbetalingsperiode], + }, +] diff --git a/apps/dolly-frontend/src/main/js/src/components/fagsystem/pensjonsavtale/visning/PensjonsavtaleVisning.tsx b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pensjonsavtale/visning/PensjonsavtaleVisning.tsx new file mode 100644 index 00000000000..c94b07d6c09 --- /dev/null +++ b/apps/dolly-frontend/src/main/js/src/components/fagsystem/pensjonsavtale/visning/PensjonsavtaleVisning.tsx @@ -0,0 +1,114 @@ +import SubOverskrift from '@/components/ui/subOverskrift/SubOverskrift' +import { TitleValue } from '@/components/ui/titleValue/TitleValue' +import Loading from '@/components/ui/loading/Loading' +import { DollyFieldArray } from '@/components/ui/form/fieldArray/DollyFieldArray' +import { ErrorBoundary } from '@/components/ui/appError/ErrorBoundary' +import Panel from '@/components/ui/panel/Panel' +import { runningE2ETest } from '@/service/services/Request' +import { Alert } from '@navikt/ds-react' +import { MiljoTabs } from '@/components/ui/miljoTabs/MiljoTabs' +import { useBestilteMiljoer } from '@/utils/hooks/useBestilling' +import { showLabel } from '@/utils/DataFormatter' + +export const sjekkManglerPensjonavtaleData = (pensjonData) => { + return pensjonData?.length < 1 +} + +const Utbetalingsperioder = ({ utbetalingsperioder }) => { + if (!utbetalingsperioder) return null + + return ( + + {(utbetalingsperiode, idx) => ( +
+ + + + + +
+ )} +
+ ) +} + +const Pensjonsavtale = ({ data, setPanelOpen }) => { + if (!data) return null + + const isPanelOpen = data?.length < 3 + + return ( + + + {(pensjonsavtale, idx) => ( +
+ + + +
+ )} +
+
+ ) +} + +export const PensjonsavtaleVisning = ({ data, loading, bestillingIdListe, tilgjengeligMiljoe }) => { + const { bestilteMiljoer } = useBestilteMiljoer(bestillingIdListe, 'PEN_PENSJONSAVTALE') + + if (loading) { + return + } + if (!data) { + return null + } + + const manglerFagsystemdata = sjekkManglerPensjonavtaleData(data) + + const miljoerMedData = data?.map((miljoData) => miljoData.data?.length > 0 && miljoData.miljo) + const errorMiljoer = bestilteMiljoer.filter((miljo) => !miljoerMedData?.includes(miljo)) + + const forsteMiljo = data.find((miljoData) => miljoData?.data)?.miljo + + const filteredData = + tilgjengeligMiljoe && data.filter((item) => tilgjengeligMiljoe.includes(item.miljo)) + + return ( + + + {manglerFagsystemdata ? ( + + Fant ikke pensjonsavtale-data for person + + ) : ( + + + + )} + + ) +} diff --git a/apps/dolly-frontend/src/main/js/src/components/miljoVelger/MiljoeInfo.tsx b/apps/dolly-frontend/src/main/js/src/components/miljoVelger/MiljoeInfo.tsx index 77752138cda..01cf948b258 100644 --- a/apps/dolly-frontend/src/main/js/src/components/miljoVelger/MiljoeInfo.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/miljoVelger/MiljoeInfo.tsx @@ -82,6 +82,12 @@ export const MiljoeInfo = ({ bestillingsdata, dollyEnvironments }) => { {getMiljoer(pensjonEnvironments, loadingPensjon, errorPensjon)} )} + {pensjonforvalter?.pensjonsavtale && ( +
  • + Pensjonsavtale (PEN):  + {getMiljoer(pensjonEnvironments, loadingPensjon, errorPensjon)} +
  • + )} {sykemelding &&
  • Sykemelding: q1
  • } diff --git a/apps/dolly-frontend/src/main/js/src/components/ui/form/formUtils.tsx b/apps/dolly-frontend/src/main/js/src/components/ui/form/formUtils.tsx index 7076a8ca7cc..d344c0a6d27 100644 --- a/apps/dolly-frontend/src/main/js/src/components/ui/form/formUtils.tsx +++ b/apps/dolly-frontend/src/main/js/src/components/ui/form/formUtils.tsx @@ -70,6 +70,7 @@ const getValgteAttributter = (values) => { 'inntektsmelding', 'arbeidsplassenCV', 'pensjonforvalter.inntekt', + 'pensjonforvalter.pensjonsavtale', 'pensjonforvalter.tp', 'pensjonforvalter.alderspensjon', 'pensjonforvalter.uforetrygd', diff --git a/apps/dolly-frontend/src/main/js/src/pages/gruppe/PersonVisning/PersonVisning.tsx b/apps/dolly-frontend/src/main/js/src/pages/gruppe/PersonVisning/PersonVisning.tsx index 5d8bbc2c9b5..346f553afde 100644 --- a/apps/dolly-frontend/src/main/js/src/pages/gruppe/PersonVisning/PersonVisning.tsx +++ b/apps/dolly-frontend/src/main/js/src/pages/gruppe/PersonVisning/PersonVisning.tsx @@ -42,6 +42,7 @@ import { useDokarkivData, useHistarkData, useInstData, + usePensjonsavtaleData, usePoppData, useTpData, useTransaksjonIdData, @@ -58,6 +59,7 @@ import { harInntektsmeldingBestilling, harInstBestilling, harMedlBestilling, + harPensjonavtaleBestilling, harPoppBestilling, harSykemeldingBestilling, harTpBestilling, @@ -90,6 +92,7 @@ import { useTenorIdent } from '@/utils/hooks/useTenorSoek' import { SkatteetatenVisning } from '@/components/fagsystem/skatteetaten/visning/SkatteetatenVisning' import PdlVisningConnector from '@/components/fagsystem/pdl/visning/PdlVisningConnector' import { useOrganisasjonMiljoe } from '@/utils/hooks/useOrganisasjonTilgang' +import { PensjonsavtaleVisning } from '@/components/fagsystem/pensjonsavtale/visning/PensjonsavtaleVisning' const getIdenttype = (ident) => { if (parseInt(ident.charAt(0)) > 3) { @@ -164,6 +167,11 @@ export default ({ harTpBestilling(bestillingerFagsystemer), ) + const { loading: loadingPensjonsavtaleData, pensjonsavtaleData } = usePensjonsavtaleData( + ident.ident, + harPensjonavtaleBestilling(bestillingerFagsystemer), + ) + const { loading: loadingPoppData, poppData } = usePoppData( ident.ident, harPoppBestilling(bestillingerFagsystemer), @@ -466,6 +474,12 @@ export default ({ bestillingIdListe={bestillingIdListe} tilgjengeligMiljoe={tilgjengeligMiljoe} /> + { optionsGruppe.includes('partner') && (copyOptionsGruppe = optionsGruppe.replace('partner_', '')) optionsGruppe.includes('barn') && (copyOptionsGruppe = optionsGruppe.replace('barn_', '')) - const obj = Options(copyOptionsGruppe).filter( - (options) => options.value.toUpperCase() === value.toUpperCase(), + const obj = Options(copyOptionsGruppe).filter((options) => + typeof value === 'string' + ? options.value.toUpperCase() === value.toUpperCase() + : options.value === value, ) if (_.get(obj, 'label') || _.get(obj, '[0].label')) { diff --git a/apps/dolly-frontend/src/main/js/src/utils/SjekkBestillingFagsystem.tsx b/apps/dolly-frontend/src/main/js/src/utils/SjekkBestillingFagsystem.tsx index bee10ce752d..0e02fd81ede 100644 --- a/apps/dolly-frontend/src/main/js/src/utils/SjekkBestillingFagsystem.tsx +++ b/apps/dolly-frontend/src/main/js/src/utils/SjekkBestillingFagsystem.tsx @@ -58,6 +58,16 @@ export const harApBestilling = (bestillingerFagsystemer) => { return alderspensjon } +export const harPensjonavtaleBestilling = (bestillingerFagsystemer) => { + let pensjonavtale = false + bestillingerFagsystemer?.forEach((i) => { + if (i?.pensjonforvalter?.pensjonsavtale) { + pensjonavtale = true + } + }) + return pensjonavtale +} + export const harUforetrygdBestilling = (bestillingerFagsystemer) => { let uforetrygd = false bestillingerFagsystemer?.forEach((i) => { diff --git a/apps/dolly-frontend/src/main/js/src/utils/hooks/useFagsystemer.tsx b/apps/dolly-frontend/src/main/js/src/utils/hooks/useFagsystemer.tsx index 8a01a5b3e37..e3a77c29037 100644 --- a/apps/dolly-frontend/src/main/js/src/utils/hooks/useFagsystemer.tsx +++ b/apps/dolly-frontend/src/main/js/src/utils/hooks/useFagsystemer.tsx @@ -22,6 +22,12 @@ const poppUrl = (ident, miljoer) => miljo: miljo, })) +const pensjonsavtaleUrl = (miljoer) => + miljoer?.map((miljo) => ({ + url: `/testnav-pensjon-testdata-facade-proxy/api/v2/pensjonsavtale/hent?miljo=${miljo}`, + miljo: miljo, + })) + const tpUrl = (ident, miljoer) => miljoer?.map((miljo) => ({ url: `/testnav-pensjon-testdata-facade-proxy/api/v1/tp/forhold?fnr=${ident}&miljo=${miljo}`, @@ -87,6 +93,24 @@ export const usePoppData = (ident, harPoppBestilling) => { } } +export const usePensjonsavtaleData = (ident, harPensjonsavtaleBestilling) => { + const { pensjonEnvironments } = usePensjonEnvironments() + + const { data, isLoading, error } = useSWR( + [ + harPensjonsavtaleBestilling ? pensjonsavtaleUrl(pensjonEnvironments) : null, + { 'Nav-Call-Id': 'dolly', 'Nav-Consumer-Id': 'dolly', Authorization: 'dolly', ident: ident }, + ], + ([url, headers]) => multiFetcherPensjon(url, headers), + ) + + return { + pensjonsavtaleData: data?.sort((a, b) => a.miljo.localeCompare(b.miljo)), + loading: isLoading, + error: error, + } +} + export const useTpData = (ident, harTpBestilling) => { const { pensjonEnvironments } = usePensjonEnvironments() diff --git a/apps/levende-arbeidsforhold-service/Dockerfile b/apps/levende-arbeidsforhold-service/Dockerfile new file mode 100644 index 00000000000..4a36f93546f --- /dev/null +++ b/apps/levende-arbeidsforhold-service/Dockerfile @@ -0,0 +1,8 @@ +FROM ghcr.io/navikt/baseimages/temurin:21 +LABEL maintainer="Team Dolly" + +ENV JAVA_OPTS="-Dspring.profiles.active=prod" + +ADD /build/libs/app.jar /app/app.jar + +EXPOSE 8080 diff --git a/apps/levende-arbeidsforhold-service/README.md b/apps/levende-arbeidsforhold-service/README.md new file mode 100644 index 00000000000..8f4c27a0910 --- /dev/null +++ b/apps/levende-arbeidsforhold-service/README.md @@ -0,0 +1,26 @@ +# Levende arbeidsforhold-service + +Fyll inn: + +## Swagger + +Swagger finnes under [/swagger](https://levende-arbeidsforhold-service.intern.dev.nav.no/swagger) -endepunktet til +applikasjonen. + +## Lokal kjøring + +Ha naisdevice kjørende og kjør GenererNavnServiceApplicationStarter med følgende argumenter: + +``` +-Dspring.cloud.vault.token=[vault-token] +-Dspring.profiles.active=dev +``` + +### Utviklerimage + +I utviklerimage brukes ikke naisdevice og du må legge til følgende ekstra argumenter: + +``` +-Djavax.net.ssl.trustStore=[path til lokal truststore] +-Djavax.net.ssl.trustStorePassword=[passord til lokal truststore] +``` diff --git a/apps/levende-arbeidsforhold-service/build.gradle b/apps/levende-arbeidsforhold-service/build.gradle new file mode 100644 index 00000000000..18246d51a1e --- /dev/null +++ b/apps/levende-arbeidsforhold-service/build.gradle @@ -0,0 +1,84 @@ +plugins { + id 'java' + id "org.sonarqube" version "5.0.0.4638" + id 'org.springframework.boot' version "3.2.6" + id 'io.spring.dependency-management' version "1.1.5" + id "jacoco" +} + +test { + useJUnitPlatform() +} + +sonarqube { + properties { + property "sonar.dynamicAnalysis", "reuseReports" + property "sonar.host.url", "https://sonarcloud.io" + property "sonar.java.coveragePlugin", "jacoco" + property "sonar.language", "java" + property "sonar.token", System.getenv("SONAR_TOKEN") + property "sonar.organization", "navikt" + property "sonar.project.monorepo.enabled", true + property "sonar.projectKey", "testnav-levende-arbeidsforhold-service" + property "sonar.projectName", "testnav-levende-arbeidsforhold-service" + property "sonar.sourceEncoding", "UTF-8" + } +} +bootJar { + archiveFileName = "app.jar" +} + +dependencyManagement { + applyMavenExclusions = false + imports { + mavenBom 'org.springframework.cloud:spring-cloud-dependencies:2023.0.1' + } +} + +repositories { + mavenCentral() + mavenLocal() + maven { + url = uri('https://packages.confluent.io/maven/') + } +} + +dependencies { + implementation 'no.nav.testnav.libs:avro-schema' + implementation 'no.nav.testnav.libs:kafka-config' + implementation 'no.nav.testnav.libs:security-core' + implementation 'no.nav.testnav.libs:servlet-insecure-security' + implementation 'no.nav.testnav.libs:servlet-core' + implementation 'no.nav.testnav.libs:reactive-core' + + implementation 'org.springframework.boot:spring-boot-starter-webflux' + implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.boot:spring-boot-starter-oauth2-client' + implementation 'org.springframework.boot:spring-boot-starter-security' + + implementation 'org.springframework.cloud:spring-cloud-starter-vault-config' + implementation 'org.springframework.boot:spring-boot-starter-actuator' + + implementation 'io.micrometer:micrometer-registry-prometheus' + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0' + implementation 'io.swagger.core.v3:swagger-annotations-jakarta:2.2.21' + + implementation 'net.logstash.logback:logstash-logback-encoder:7.4' + implementation 'org.hibernate.validator:hibernate-validator' + + testImplementation 'org.springframework.boot:spring-boot-starter-test' + testImplementation 'org.springframework.cloud:spring-cloud-contract-wiremock' + + implementation 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' + testAnnotationProcessor 'org.projectlombok:lombok' + + implementation 'org.apache.kafka:kafka-clients:3.7.0' + implementation 'io.confluent:kafka-avro-serializer:7.6.0' + implementation 'org.springframework.kafka:spring-kafka' +} +java { + toolchain { + languageVersion = JavaLanguageVersion.of(21) + } +} diff --git a/apps/levende-arbeidsforhold-service/config.yml b/apps/levende-arbeidsforhold-service/config.yml new file mode 100644 index 00000000000..31957652a8f --- /dev/null +++ b/apps/levende-arbeidsforhold-service/config.yml @@ -0,0 +1,51 @@ +apiVersion: "nais.io/v1alpha1" +kind: "Application" +metadata: + name: testnav-levende-arbeidsforhold-service + namespace: dolly + labels: + team: dolly +spec: + image: "{{image}}" + port: 8080 + accessPolicy: + inbound: + rules: + - application: team-dolly-lokal-app + cluster: dev-gcp + - application: testnav-oversikt-frontend + cluster: dev-gcp + outbound: + external: + - host: testnav-aareg-proxy.dev-fss-pub.nais.io + azure: + application: + allowAllUsers: true + enabled: true + tenant: nav.no + liveness: + path: /internal/isAlive + initialDelay: 4 + periodSeconds: 5 + failureThreshold: 500 + readiness: + path: /internal/isReady + initialDelay: 4 + periodSeconds: 5 + failureThreshold: 500 + prometheus: + enabled: true + path: /internal/metrics + replicas: + min: 1 + max: 1 + resources: + requests: + cpu: 200m + memory: 1024Mi + limits: + memory: 2048Mi + kafka: + pool: nav-dev + ingresses: + - "https://testnav-levende-arbeidsforhold-service.intern.dev.nav.no" diff --git a/apps/levende-arbeidsforhold-service/gradle/wrapper/gradle-wrapper.jar b/apps/levende-arbeidsforhold-service/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 00000000000..7454180f2ae Binary files /dev/null and b/apps/levende-arbeidsforhold-service/gradle/wrapper/gradle-wrapper.jar differ diff --git a/apps/levende-arbeidsforhold-service/gradle/wrapper/gradle-wrapper.properties b/apps/levende-arbeidsforhold-service/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000000..48c0a02ca41 --- /dev/null +++ b/apps/levende-arbeidsforhold-service/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/apps/levende-arbeidsforhold-service/gradlew b/apps/levende-arbeidsforhold-service/gradlew new file mode 100755 index 00000000000..3da45c161b0 --- /dev/null +++ b/apps/levende-arbeidsforhold-service/gradlew @@ -0,0 +1,234 @@ +#!/bin/sh + +# +# Copyright ? 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions ?$var?, ?${var}?, ?${var:-default}?, ?${var+SET}?, +# ?${var#prefix}?, ?${var%suffix}?, and ?$( cmd )?; +# * compound commands having a testable exit status, especially ?case?; +# * various built-in commands including ?command?, ?set?, and ?ulimit?. +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${0##*/} + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/apps/levende-arbeidsforhold-service/gradlew.bat b/apps/levende-arbeidsforhold-service/gradlew.bat new file mode 100644 index 00000000000..107acd32c4e --- /dev/null +++ b/apps/levende-arbeidsforhold-service/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/apps/levende-arbeidsforhold-service/gradlewUpdate.sh b/apps/levende-arbeidsforhold-service/gradlewUpdate.sh new file mode 100755 index 00000000000..e5ee6361152 --- /dev/null +++ b/apps/levende-arbeidsforhold-service/gradlewUpdate.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +gradle wrapper \ No newline at end of file diff --git a/apps/levende-arbeidsforhold-service/settings.gradle b/apps/levende-arbeidsforhold-service/settings.gradle new file mode 100644 index 00000000000..b8c8778a068 --- /dev/null +++ b/apps/levende-arbeidsforhold-service/settings.gradle @@ -0,0 +1,20 @@ +plugins { + id "com.gradle.develocity" version "3.17.4" +} + +rootProject.name = 'levende-arbeidsforhold-service' + +includeBuild "../../libs/kafka-config" +includeBuild "../../libs/avro-schema" +includeBuild '../../libs/security-core' +includeBuild '../../libs/servlet-core' +includeBuild '../../libs/reactive-core' +includeBuild '../../libs/servlet-insecure-security' +includeBuild '../../.github/workflows' + +develocity { + buildScan { + termsOfUseUrl = "https://gradle.com/terms-of-service" + termsOfUseAgree = "yes" + } +} \ No newline at end of file diff --git a/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/LevendeArbeidsforholdServiceApplicationStarter.java b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/LevendeArbeidsforholdServiceApplicationStarter.java new file mode 100644 index 00000000000..4c1bc1f8bd4 --- /dev/null +++ b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/LevendeArbeidsforholdServiceApplicationStarter.java @@ -0,0 +1,13 @@ +package no.nav.registre.testnorge.levendearbeidsforhold; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + + +@SpringBootApplication +public class LevendeArbeidsforholdServiceApplicationStarter { + + public static void main(String[] args) { + SpringApplication.run(LevendeArbeidsforholdServiceApplicationStarter.class, args); + } +} diff --git a/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/config/ApplicationConfig.java b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/config/ApplicationConfig.java new file mode 100644 index 00000000000..80a0da22609 --- /dev/null +++ b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/config/ApplicationConfig.java @@ -0,0 +1,15 @@ +package no.nav.registre.testnorge.levendearbeidsforhold.config; + +import no.nav.testnav.libs.servletcore.config.ApplicationCoreConfig; +import no.nav.testnav.libs.standalone.servletsecurity.config.InsecureJwtServerToServerConfiguration; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + +@Configuration +@Import({ + ApplicationCoreConfig.class, + InsecureJwtServerToServerConfiguration.class +}) +public class ApplicationConfig { + +} diff --git a/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/config/Consumers.java b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/config/Consumers.java new file mode 100644 index 00000000000..c5654aff14d --- /dev/null +++ b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/config/Consumers.java @@ -0,0 +1,29 @@ +package no.nav.registre.testnorge.levendearbeidsforhold.config; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import no.nav.testnav.libs.securitycore.domain.ServerProperties; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +import static lombok.AccessLevel.PACKAGE; + +/** + * Samler alle placeholders for ulike {@code consumers.*}-konfigurasjon her, dvs. subklasser av {@code ServerProperties}. + *

    + * Husk at Spring Boot bruker relaxed binding + * mellom configuration properties og field names. + * + * @see ServerProperties + */ +@Configuration +@ConfigurationProperties(prefix = "consumers") +@NoArgsConstructor(access = PACKAGE) +@Getter +@Setter(PACKAGE) +public class Consumers { + + private ServerProperties testnavAaregProxy; + +} \ No newline at end of file diff --git a/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/config/DevConfig.java b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/config/DevConfig.java new file mode 100644 index 00000000000..a5b2cad3c88 --- /dev/null +++ b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/config/DevConfig.java @@ -0,0 +1,36 @@ +package no.nav.registre.testnorge.levendearbeidsforhold.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; +import org.springframework.vault.annotation.VaultPropertySource; +import org.springframework.vault.authentication.ClientAuthentication; +import org.springframework.vault.authentication.TokenAuthentication; +import org.springframework.vault.client.VaultEndpoint; +import org.springframework.vault.config.AbstractVaultConfiguration; + +import static io.micrometer.common.util.StringUtils.isBlank; + +@Configuration +@Profile("dev") +@VaultPropertySource(value = "secret/dolly/lokal", ignoreSecretNotFound = false) +public class DevConfig extends AbstractVaultConfiguration { + + private static final String VAULT_TOKEN = "spring.cloud.vault.token"; + + @Override + public VaultEndpoint vaultEndpoint() { + return VaultEndpoint.create("vault.adeo.no", 443); + } + + @Override + public ClientAuthentication clientAuthentication() { + if (System.getenv().containsKey("VAULT_TOKEN")) { + System.setProperty(VAULT_TOKEN, System.getenv("VAULT_TOKEN")); + } + var token = System.getProperty(VAULT_TOKEN); + if (isBlank(token)) { + throw new IllegalArgumentException("Påkrevet property 'spring.cloud.vault.token' er ikke satt."); + } + return new TokenAuthentication(System.getProperty(VAULT_TOKEN)); + } +} \ No newline at end of file diff --git a/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/config/KafkaConfig.java b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/config/KafkaConfig.java new file mode 100644 index 00000000000..5fab1fac11f --- /dev/null +++ b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/config/KafkaConfig.java @@ -0,0 +1,95 @@ +package no.nav.registre.testnorge.levendearbeidsforhold.config; + + +import io.confluent.kafka.serializers.AbstractKafkaSchemaSerDeConfig; +import io.confluent.kafka.serializers.KafkaAvroDeserializer; +import io.confluent.kafka.serializers.KafkaAvroDeserializerConfig; +import lombok.extern.slf4j.Slf4j; +import org.apache.kafka.clients.CommonClientConfigs; +import org.apache.kafka.clients.consumer.Consumer; +import org.apache.kafka.clients.consumer.ConsumerConfig; +import org.apache.kafka.common.config.SslConfigs; +import org.apache.kafka.common.serialization.StringDeserializer; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; +import org.springframework.kafka.annotation.EnableKafka; +import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory; +import org.springframework.kafka.core.ConsumerFactory; +import org.springframework.kafka.core.DefaultKafkaConsumerFactory; +import org.springframework.kafka.listener.CommonLoggingErrorHandler; + +import java.net.InetSocketAddress; +import java.security.SecureRandom; +import java.util.HashMap; +import java.util.Random; + +@Slf4j +@EnableKafka +@Configuration +@Profile({"dev", "prod"}) +public class KafkaConfig { + + private static final Random RANDOM = new SecureRandom(); + private final String groupId; + + public KafkaConfig(@Value("${spring.kafka.consumer.group-id}") String groupId) { + this.groupId = groupId; + } + + public ConsumerFactory consumerFactory() { + + var randomSuffixGroupID = String.valueOf((int)(RANDOM.nextFloat() * 1000)); + + var inetSocketAddress = new InetSocketAddress(0); + var props = new HashMap(); + + props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, System.getenv("KAFKA_BROKERS")); + props.put(SslConfigs.SSL_KEYSTORE_LOCATION_CONFIG, System.getenv("KAFKA_KEYSTORE_PATH")); + props.put(SslConfigs.SSL_KEYSTORE_PASSWORD_CONFIG, System.getenv("KAFKA_CREDSTORE_PASSWORD")); + props.put(SslConfigs.SSL_TRUSTSTORE_LOCATION_CONFIG, System.getenv("KAFKA_TRUSTSTORE_PATH")); + props.put(SslConfigs.SSL_TRUSTSTORE_PASSWORD_CONFIG, System.getenv("KAFKA_CREDSTORE_PASSWORD")); + props.put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG, "SSL"); + props.put(KafkaAvroDeserializerConfig.SPECIFIC_AVRO_READER_CONFIG, true); + + props.put(AbstractKafkaSchemaSerDeConfig.BASIC_AUTH_CREDENTIALS_SOURCE, "USER_INFO"); + var username = System.getenv("KAFKA_SCHEMA_REGISTRY_USER"); + var password = System.getenv("KAFKA_SCHEMA_REGISTRY_PASSWORD"); + + props.put(AbstractKafkaSchemaSerDeConfig.USER_INFO_CONFIG, username + ":" + password); + props.put(AbstractKafkaSchemaSerDeConfig.SCHEMA_REGISTRY_URL_CONFIG, System.getenv("KAFKA_SCHEMA_REGISTRY")); + + props.put(ConsumerConfig.GROUP_ID_CONFIG, groupId + randomSuffixGroupID); + props.put(ConsumerConfig.CLIENT_ID_CONFIG, groupId + inetSocketAddress.getHostString()); + props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, true); + props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "latest"); + props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class); + props.put(ConsumerConfig.MAX_POLL_INTERVAL_MS_CONFIG, 1000 * 60 * 10); + props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, KafkaAvroDeserializer.class); + + return new DefaultKafkaConsumerFactory<>(props); + } + + @Bean + public ConcurrentKafkaListenerContainerFactory kafkaListenerContainerFactory() { + + var factory = new ConcurrentKafkaListenerContainerFactory(); + var consumerFactory = consumerFactory(); + consumerFactory.addListener(new ConsumerFactory.Listener<>() { + @Override + public void consumerAdded(String id, Consumer consumer) { + log.info("Legger til consumer med id: {}", id); + } + + @Override + public void consumerRemoved(String id, Consumer consumer) { + log.warn("Fjerner consumer med id: {}. Restarter app...", id); + } + }); + factory.setBatchListener(true); + factory.setConsumerFactory(consumerFactory); + factory.setCommonErrorHandler(new CommonLoggingErrorHandler()); + return factory; + } +} \ No newline at end of file diff --git a/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/config/OpenApiConfig.java b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/config/OpenApiConfig.java new file mode 100644 index 00000000000..d2dc2940c31 --- /dev/null +++ b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/config/OpenApiConfig.java @@ -0,0 +1,55 @@ +package no.nav.registre.testnorge.levendearbeidsforhold.config; + +import io.swagger.v3.oas.models.Components; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Contact; +import io.swagger.v3.oas.models.info.Info; +import io.swagger.v3.oas.models.info.License; +import io.swagger.v3.oas.models.security.SecurityRequirement; +import io.swagger.v3.oas.models.security.SecurityScheme; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import java.util.Arrays; + +import no.nav.testnav.libs.servletcore.config.ApplicationProperties; + +@Configuration +public class OpenApiConfig implements WebMvcConfigurer { + + @Bean + public OpenAPI openApi(ApplicationProperties applicationProperties) { + return new OpenAPI() + .components(new Components().addSecuritySchemes("bearer-jwt", new SecurityScheme() + .type(SecurityScheme.Type.HTTP) + .scheme("bearer") + .bearerFormat("JWT") + .in(SecurityScheme.In.HEADER) + .name("Authorization") + )) + .addSecurityItem( + new SecurityRequirement().addList("bearer-jwt", Arrays.asList("read", "write"))) + .info(new Info() + .title(applicationProperties.getName()) + .version(applicationProperties.getVersion()) + .description(applicationProperties.getDescription()) + .termsOfService("https://nav.no") + .contact(new Contact() + .url("https://nav-it.slack.com/archives/CA3P9NGA2") + .email("dolly@nav.no") + .name("Team Dolly") + ) + .license(new License() + .name("MIT License") + .url("https://opensource.org/licenses/MIT") + ) + ); + } + + @Override + public void addViewControllers(ViewControllerRegistry registry) { + registry.addViewController("/swagger").setViewName("redirect:/swagger-ui.html"); + } +} \ No newline at end of file diff --git a/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/config/SecurityConfig.java b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/config/SecurityConfig.java new file mode 100644 index 00000000000..ae501af8a05 --- /dev/null +++ b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/config/SecurityConfig.java @@ -0,0 +1,37 @@ +package no.nav.registre.testnorge.levendearbeidsforhold.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.Customizer; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.web.SecurityFilterChain; + +@EnableWebSecurity +@Configuration +public class SecurityConfig { + + @Bean + @SuppressWarnings("java:S4502") + public SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception { + + httpSecurity.sessionManagement(sessionConfig -> sessionConfig.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) + .csrf(AbstractHttpConfigurer::disable) + .authorizeHttpRequests(authorizeConfig -> authorizeConfig.requestMatchers( + "/internal/**", + "/webjars/**", + "/swagger-resources/**", + "/v3/api-docs/**", + "/swagger-ui/**", + "/swagger", + "/error", + "/swagger-ui.html" + ).permitAll().requestMatchers("/api/**").fullyAuthenticated()) + .oauth2ResourceServer(oauth2RSConfig -> oauth2RSConfig.jwt(Customizer.withDefaults())); + + return httpSecurity.build(); + } +} + diff --git a/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/consumers/AaregConsumer.java b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/consumers/AaregConsumer.java new file mode 100644 index 00000000000..9b3f46be9a2 --- /dev/null +++ b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/consumers/AaregConsumer.java @@ -0,0 +1,77 @@ +package no.nav.registre.testnorge.levendearbeidsforhold.consumers; + +import lombok.extern.slf4j.Slf4j; + +import no.nav.registre.testnorge.levendearbeidsforhold.consumers.command.EndreArbeidsforholdCommand; +import no.nav.registre.testnorge.levendearbeidsforhold.consumers.command.HentArbeidsforholdCommand; +import no.nav.registre.testnorge.levendearbeidsforhold.domain.v1.Arbeidsforhold; +import no.nav.registre.testnorge.levendearbeidsforhold.config.Consumers; +import no.nav.testnav.libs.securitycore.domain.ServerProperties; +import no.nav.testnav.libs.standalone.servletsecurity.exchange.TokenExchange; + +import org.springframework.http.MediaType; +import org.springframework.http.codec.json.Jackson2JsonDecoder; +import org.springframework.http.codec.json.Jackson2JsonEncoder; +import org.springframework.stereotype.Component; +import org.springframework.web.reactive.function.client.ExchangeStrategies; +import org.springframework.web.reactive.function.client.WebClient; + +import java.util.ArrayList; +import java.util.List; + +import static java.util.Objects.nonNull; + +import com.fasterxml.jackson.databind.ObjectMapper; + +@Slf4j +@Component +public class AaregConsumer { + + private final WebClient webClient; + private final ServerProperties serverProperties; + private final TokenExchange tokenExchange; + + public AaregConsumer( + Consumers consumers, + TokenExchange tokenExchange, + ObjectMapper objectMapper) { + + this.serverProperties = consumers.getTestnavAaregProxy(); + this.tokenExchange = tokenExchange; + + ExchangeStrategies jacksonStrategy = ExchangeStrategies + .builder() + .codecs( + config -> { + config + .defaultCodecs() + .jackson2JsonEncoder(new Jackson2JsonEncoder(objectMapper, MediaType.APPLICATION_JSON)); + config + .defaultCodecs() + .jackson2JsonDecoder(new Jackson2JsonDecoder(objectMapper, MediaType.APPLICATION_JSON)); + }) + .build(); + + this.webClient = WebClient + .builder() + .exchangeStrategies(jacksonStrategy) + .baseUrl(serverProperties.getUrl()) + .build(); + } + + public List hentArbeidsforhold(String ident) { + var token = tokenExchange.exchange(serverProperties).block(); + if (nonNull(token)) { + return new HentArbeidsforholdCommand(webClient, token.getTokenValue(), ident).call(); + } + return new ArrayList<>(); + } + + public void endreArbeidsforhold(Arbeidsforhold requests) { + var token = tokenExchange.exchange(serverProperties).block(); + if (nonNull(token)) { + new EndreArbeidsforholdCommand(webClient, requests, token.getTokenValue()).call(); + } + } +} + diff --git a/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/consumers/command/EndreArbeidsforholdCommand.java b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/consumers/command/EndreArbeidsforholdCommand.java new file mode 100644 index 00000000000..60aceb2f3f7 --- /dev/null +++ b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/consumers/command/EndreArbeidsforholdCommand.java @@ -0,0 +1,56 @@ +package no.nav.registre.testnorge.levendearbeidsforhold.consumers.command; + +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import no.nav.registre.testnorge.levendearbeidsforhold.domain.v1.Arbeidsforhold; +import no.nav.testnav.libs.reactivecore.utils.WebClientFilter; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.web.reactive.function.BodyInserters; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; +import reactor.util.retry.Retry; + +import java.time.Duration; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.concurrent.Callable; + +@Slf4j +@RequiredArgsConstructor +public class EndreArbeidsforholdCommand implements Callable> { + + private static final String navArbeidsforholdKilde = "Dolly-doedsfall-hendelse" ; + private static final String miljoe = "q2"; + + private final WebClient webClient; + private final Arbeidsforhold requests; + private final String token; + + @SneakyThrows + @Override + public Mono call() { + + Mono request = webClient + .put() + .uri(builder -> builder.path("/{miljoe}/api/v1/arbeidsforhold/{navArbeidsforholdId}") + .build(miljoe, requests.getNavArbeidsforholdId())) + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .header(HttpHeaders.AUTHORIZATION, "Bearer " + token) + .header("Nav-Arbeidsforhold-Kildereferanse", navArbeidsforholdKilde) + .header("Nav-Arbeidsforhold-Periode", LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM"))) + .body(BodyInserters.fromValue(requests)) + .retrieve() + .bodyToMono(Arbeidsforhold.class) + .retryWhen(Retry.backoff(3, Duration.ofSeconds(5)) + .filter(WebClientFilter::is5xxException)) + .map(arbeidsforhold1 -> Arbeidsforhold.builder().build()); + + request.subscribe(response -> {}, error -> log.error("Feil ved endring av arbeidsforhold: {}", error.getMessage())); + + return request; + } +} + + diff --git a/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/consumers/command/HentArbeidsforholdCommand.java b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/consumers/command/HentArbeidsforholdCommand.java new file mode 100644 index 00000000000..cf84f0f4848 --- /dev/null +++ b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/consumers/command/HentArbeidsforholdCommand.java @@ -0,0 +1,75 @@ +package no.nav.registre.testnorge.levendearbeidsforhold.consumers.command; + +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import no.nav.registre.testnorge.levendearbeidsforhold.domain.v1.Arbeidsforhold; +import no.nav.testnav.libs.reactivecore.utils.WebClientFilter; +import no.nav.testnav.libs.servletcore.headers.NavHeaders; +import org.springframework.http.HttpHeaders; +import org.springframework.web.reactive.function.client.WebClient; +import org.springframework.web.reactive.function.client.WebClientResponseException; +import reactor.util.retry.Retry; + +import java.time.Duration; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.UUID; +import java.util.concurrent.Callable; +import java.util.stream.Collectors; + +import static java.lang.String.format; + + +@Slf4j +@RequiredArgsConstructor +public class HentArbeidsforholdCommand implements Callable> { + private static final String miljoe = "q2"; + private static final String NAV_PERSON_IDENT = "Nav-Personident"; + private static final String CONSUMER = "Dolly"; + + private final WebClient webClient; + private final String token; + private final String ident; + + private static String getNavCallId() { + return format("%s %s", CONSUMER, UUID.randomUUID()); + } + + @SneakyThrows + @Override + public List call(){ + + try { + var arbeidsforhold = webClient + .get() + .uri(builder -> builder + .path("/{miljoe}/api/v1/arbeidstaker/arbeidsforhold") + .queryParam("arbeidsforholdtype", "forenkletOppgjoersordning", + "frilanserOppdragstakerHonorarPersonerMm", "maritimtArbeidsforhold", + "ordinaertArbeidsforhold") + .build(miljoe)) + .header(HttpHeaders.AUTHORIZATION, "Bearer " + token) + .header(NAV_PERSON_IDENT, ident) + .header(NavHeaders.NAV_CONSUMER_ID, CONSUMER) + .header(NavHeaders.NAV_CALL_ID, getNavCallId()) + .retrieve() + .bodyToMono(Arbeidsforhold[].class) + .retryWhen(Retry + .backoff(3, Duration.ofSeconds(5)) + .filter(WebClientFilter::is5xxException)) + .block(); + + return Arrays.stream(arbeidsforhold).collect(Collectors.toList()); + } catch (WebClientResponseException.NotFound e) { + return Collections.emptyList(); + } catch (WebClientResponseException e) { + log.error( + "Klarer ikke å hente arbeidsforhold. Feilmelding: {}.", + e.getResponseBodyAsString() + ); + throw e; + } + } +} diff --git a/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/Ansettelsesperiode.java b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/Ansettelsesperiode.java new file mode 100644 index 00000000000..b2580aa002b --- /dev/null +++ b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/Ansettelsesperiode.java @@ -0,0 +1,42 @@ +package no.nav.registre.testnorge.levendearbeidsforhold.domain.v1; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +@JsonInclude(JsonInclude.Include.NON_EMPTY) +@JsonPropertyOrder({ + "periode", + "sluttaarsak", + "varslingskode", + "bruksperiode", + "sporingsinformasjon" +}) +@Schema(description = "Informasjon knyttet til ansettelsesperioden") +public class Ansettelsesperiode { + + private Periode periode; + + @Schema(description = "Årsak for avsluttet ansettelsesperiode (kodeverk: Slutt%C3%A5rsakAareg)", example = "arbeidstakerHarSagtOppSelv") + private String sluttaarsak; + + @Schema(description = "Varslingskode (kodeverk: Varslingskode_5fAa-registeret) - benyttes hvis ansettelsesperiode er lukket maskinelt", example = "ERKONK") + private String varslingskode; + + private Bruksperiode bruksperiode; + + private Sporingsinformasjon sporingsinformasjon; + + @Override + public String toString() { + return ("Ansettelsesforhold: [" + periode.toString() + ", " + sluttaarsak + ", " + varslingskode); + } +} diff --git a/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/AntallTimerForTimeloennet.java b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/AntallTimerForTimeloennet.java new file mode 100644 index 00000000000..9f3dc79cfba --- /dev/null +++ b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/AntallTimerForTimeloennet.java @@ -0,0 +1,54 @@ +package no.nav.registre.testnorge.levendearbeidsforhold.domain.v1; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import no.nav.registre.testnorge.levendearbeidsforhold.util.JavaTimeUtil; + +import java.time.YearMonth; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +@JsonInclude(JsonInclude.Include.NON_EMPTY) +@JsonPropertyOrder({ + "periode", + "antallTimer", + "rapporteringsperiode", + "sporingsinformasjon" +}) +@Schema(description = "Informasjon om antall timer med timelønn") +public class AntallTimerForTimeloennet { + + private Periode periode; + + @Schema(description = "Antall timer", example = "37.5") + private Double antallTimer; + + private YearMonth rapporteringsperiode; + + private Sporingsinformasjon sporingsinformasjon; + + @JsonIgnore + public YearMonth getRapporteringsperiode() { + return rapporteringsperiode; + } + + @JsonProperty("rapporteringsperiode") + @Schema(description = "Rapporteringsperiode for antall timer med timelønn, format (ISO-8601): yyyy-MM", example = "2018-05") + public String getRapporteringsperiodeAsString() { + return JavaTimeUtil.toString(rapporteringsperiode); + } + + @JsonProperty("rapporteringsperiode") + public void setRapporteringsperiodeAsString(String rapporteringsperiode) { + this.rapporteringsperiode = JavaTimeUtil.toYearMonth(rapporteringsperiode); + } +} diff --git a/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/Arbeidsavtale.java b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/Arbeidsavtale.java new file mode 100644 index 00000000000..c9855e0b2e0 --- /dev/null +++ b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/Arbeidsavtale.java @@ -0,0 +1,101 @@ +package no.nav.registre.testnorge.levendearbeidsforhold.domain.v1; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import io.swagger.v3.oas.annotations.media.DiscriminatorMapping; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; +import no.nav.registre.testnorge.levendearbeidsforhold.util.JavaTimeUtil; + +import java.time.LocalDate; + +@Data +@NoArgsConstructor +@SuperBuilder +@JsonInclude(JsonInclude.Include.NON_EMPTY) +@JsonTypeInfo( + use = JsonTypeInfo.Id.NAME, + property = "type" +) +@JsonSubTypes({ + @JsonSubTypes.Type(value = OrdinaerArbeidsavtale.class, name = OrdinaerArbeidsavtale.TYPE), + @JsonSubTypes.Type(value = MaritimArbeidsavtale.class, name = MaritimArbeidsavtale.TYPE), + @JsonSubTypes.Type(value = ForenkletOppgjoersordningArbeidsavtale.class, name = ForenkletOppgjoersordningArbeidsavtale.TYPE), + @JsonSubTypes.Type(value = FrilanserArbeidsavtale.class, name = FrilanserArbeidsavtale.TYPE) +}) +@Schema(description = "Informasjon om arbeidsavtale/ansettelsesdetaljer", + discriminatorProperty = "type", + discriminatorMapping = { + @DiscriminatorMapping(value = OrdinaerArbeidsavtale.TYPE, schema = OrdinaerArbeidsavtale.class), + @DiscriminatorMapping(value = MaritimArbeidsavtale.TYPE, schema = MaritimArbeidsavtale.class), + @DiscriminatorMapping(value = ForenkletOppgjoersordningArbeidsavtale.TYPE, schema = ForenkletOppgjoersordningArbeidsavtale.class), + @DiscriminatorMapping(value = FrilanserArbeidsavtale.TYPE, schema = FrilanserArbeidsavtale.class) + } +) +public abstract class Arbeidsavtale implements Arbeidsavtaletype { + + @Schema(description = "Arbeidstidsordning (kodeverk: Arbeidstidsordninger)", example = "ikkeSkift") + private String arbeidstidsordning; + + @Schema(description = "Ansettelsesform (kodeverk: AnsettelsesformAareg)", example = "fast") + private String ansettelsesform; + + @Schema(description = "Yrke (kodeverk: Yrker)", example = "2130123") + private String yrke; + + @Schema(description = "Stillingsprosent", example = "49.5") + private Double stillingsprosent; + + @Schema(description = "Antall timer per uke", example = "37.5") + private Double antallTimerPrUke; + + @Schema(description = "Beregnet antall timer per uke", example = "37.5") + private Double beregnetAntallTimerPrUke; + + @Schema(description = "Dato for siste lønnsendring, format (ISO-8601): yyyy-MM-dd", example = "2014-07-15") + private LocalDate sistLoennsendring; + + @Schema(description = "Dato for siste stillingsendring, format (ISO-8601): yyyy-MM-dd", example = "2015-12-15") + private LocalDate sistStillingsendring; + + private Bruksperiode bruksperiode; + + private Gyldighetsperiode gyldighetsperiode; + + private Sporingsinformasjon sporingsinformasjon; + + @JsonIgnore + public LocalDate getSistLoennsendring() { + return sistLoennsendring; + } + + @JsonIgnore + public LocalDate getSistStillingsendring() { + return sistStillingsendring; + } + + @JsonProperty("sistLoennsendring") + public String getSistLoennsendringAsString() { + return JavaTimeUtil.toString(sistLoennsendring); + } + + @JsonProperty("sistLoennsendring") + public void setSistLoennsendringAsString(String sistLoennsendring) { + this.sistLoennsendring = JavaTimeUtil.toLocalDate(sistLoennsendring); + } + + @JsonProperty("sistStillingsendring") + public String getSistStillingsendringAsString() { + return JavaTimeUtil.toString(sistStillingsendring); + } + + @JsonProperty("sistStillingsendring") + public void setSistStillingsendringAsString(String sistStillingsendring) { + this.sistStillingsendring = JavaTimeUtil.toLocalDate(sistStillingsendring); + } +} diff --git a/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/Arbeidsavtaletype.java b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/Arbeidsavtaletype.java new file mode 100644 index 00000000000..8192cf72ad5 --- /dev/null +++ b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/Arbeidsavtaletype.java @@ -0,0 +1,9 @@ +package no.nav.registre.testnorge.levendearbeidsforhold.domain.v1; + +import io.swagger.v3.oas.annotations.media.Schema; + +public interface Arbeidsavtaletype { + + @Schema(description = "Type for arbeidsavtale", allowableValues = "Ordinaer,Maritim,Forenklet,Frilanser") + String getType(); +} diff --git a/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/Arbeidsforhold.java b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/Arbeidsforhold.java new file mode 100644 index 00000000000..a340d6fdf1f --- /dev/null +++ b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/Arbeidsforhold.java @@ -0,0 +1,121 @@ +package no.nav.registre.testnorge.levendearbeidsforhold.domain.v1; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import no.nav.registre.testnorge.levendearbeidsforhold.util.JavaTimeUtil; + +import java.time.LocalDateTime; +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +@JsonInclude(JsonInclude.Include.NON_EMPTY) +@JsonPropertyOrder({ + "navArbeidsforholdId", + "arbeidsforholdId", + "arbeidstaker", + "arbeidsgiver", + "opplysningspliktig", + "type", + "ansettelsesperiode", + "arbeidsavtaler", + "permisjonPermitteringer", + "antallTimerForTimeloennet", + "utenlandsopphold", + "varsler", + "innrapportertEtterAOrdningen", + "registrert", + "sistBekreftet", + "sporingsinformasjon" +}) +@Schema(description = "Informasjon om arbeidsforhold") +@SuppressWarnings({"pmd:TooManyFields", "fb-contrib:CC_CYCLOMATIC_COMPLEXITY"}) +public class Arbeidsforhold { + + @Schema(description = "Arbeidsforhold-id i AAREG", example = "123456") + private Long navArbeidsforholdId; + + @Schema(description = "Arbeidsforhold-id fra opplysningspliktig", example = "abc-321") + private String arbeidsforholdId; + + private LocalDateTime registrert; + + private Person arbeidstaker; + + private OpplysningspliktigArbeidsgiver arbeidsgiver; + + private OpplysningspliktigArbeidsgiver opplysningspliktig; + + @Schema(description = "Arbeidsforholdtype (kodeverk: Arbeidsforholdtyper)", example = "ordinaertArbeidsforhold") + private String type; + + private Ansettelsesperiode ansettelsesperiode; + + @Schema(description = "Liste av arbeidsavtaler - gjeldende og evt. med historikk") + private List arbeidsavtaler; + + @Schema(description = "Liste av permisjoner og/eller permitteringer") + private List permisjonPermitteringer; + + @Schema(description = "Liste av antall timer med timelønn") + private List antallTimerForTimeloennet; + + @Schema(description = "Liste av utenlandsopphold") + private List utenlandsopphold; + + @Schema(description = "Liste av unike varsler for ulike entiter") + private List varsler; + + @Schema(description = "Er arbeidsforholdet innrapportert via a-ordningen?") + private Boolean innrapportertEtterAOrdningen; + + private LocalDateTime sistBekreftet; + + private Sporingsinformasjon sporingsinformasjon; + + @JsonIgnore + public LocalDateTime getRegistrert() { + return registrert; + } + + @JsonProperty("registrert") + @Schema(description = "Tidspunkt for registrering av arbeidsforhold, format (ISO-8601): yyyy-MM-dd'T'HH:mm[:ss[.SSSSSSSSS]]", example = "2018-09-18T11:12:29") + public String getRegistrertAsString() { + return JavaTimeUtil.toString(registrert); + } + + @JsonProperty("registrert") + public void setRegistrertAsString(String registrert) { + this.registrert = JavaTimeUtil.toLocalDateTime(registrert); + } + + @JsonIgnore + public LocalDateTime getSistBekreftet() { + return sistBekreftet; + } + + @JsonProperty("sistBekreftet") + @Schema(description = "Tidspunkt for siste bekreftelse av arbeidsforhold, format (ISO-8601): yyyy-MM-dd'T'HH:mm[:ss[.SSSSSSSSS]]", example = "2018-09-19T12:10:31") + public String getSistBekreftetAsString() { + return JavaTimeUtil.toString(sistBekreftet); + } + + @JsonProperty("sistBekreftet") + public void setSistBekreftetAsString(String sistBekreftet) { + this.sistBekreftet = JavaTimeUtil.toLocalDateTime(sistBekreftet); + } + + @Override + public String toString() { + return ("Arbeidsforhold: [" + navArbeidsforholdId + ", " + arbeidsforholdId + ", " + ansettelsesperiode + ", " + arbeidsavtaler); + } +} diff --git a/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/Arbeidsforholdoversikt.java b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/Arbeidsforholdoversikt.java new file mode 100644 index 00000000000..eb51335d943 --- /dev/null +++ b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/Arbeidsforholdoversikt.java @@ -0,0 +1,107 @@ +package no.nav.registre.testnorge.levendearbeidsforhold.domain.v1; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import no.nav.registre.testnorge.levendearbeidsforhold.util.JavaTimeUtil; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +@JsonInclude(JsonInclude.Include.NON_EMPTY) +@JsonPropertyOrder({ + "navArbeidsforholdId", + "arbeidstaker", + "arbeidsgiver", + "opplysningspliktig", + "type", + "ansattFom", + "ansattTom", + "yrke", + "stillingsprosent", + "permisjonPermitteringsprosent", + "innrapportertEtterAOrdningen", + "sistBekreftet", + "varsler" +}) +@Schema(description = "Informasjon om arbeidsforhold (overordnet)") +@SuppressWarnings("fb-contrib:CC_CYCLOMATIC_COMPLEXITY") +public class Arbeidsforholdoversikt { + + @Schema(description = "Arbeidsforhold-id i AAREG", example = "123456") + private Long navArbeidsforholdId; + + private Person arbeidstaker; + + private OpplysningspliktigArbeidsgiver arbeidsgiver; + + private OpplysningspliktigArbeidsgiver opplysningspliktig; + + @Schema(description = "Arbeidsforholdtype (kodeverk: Arbeidsforholdtyper)", example = "ordinaertArbeidsforhold") + private String type; + + private LocalDate ansattFom; + + private LocalDate ansattTom; + + @Schema(description = "Yrke (kodeverk: Yrker)", example = "2130123") + private String yrke; + + @Schema(description = "Stillingsprosent", example = "49.5") + private Double stillingsprosent; + + @Schema(description = "Prosent for permisjon eller permittering (aggregert)", example = "50.5") + private Double permisjonPermitteringsprosent; + + @Schema(description = "Er arbeidsforholdet innrapportert via a-ordningen?") + private Boolean innrapportertEtterAOrdningen; + + private LocalDateTime sistBekreftet; + + @Schema(description = "Liste av unike varsler for ulike entiter") + private List varsler; + + @JsonIgnore + public LocalDate getAnsattFom() { + return ansattFom; + } + + @JsonProperty("ansattFom") + @Schema(description = "Fra-og-med-dato for ansettelsesperiode, format (ISO-8601): yyyy-MM-dd", example = "2014-07-01") + public String getAnsattFomAsString() { + return JavaTimeUtil.toString(ansattFom); + } + + @JsonIgnore + public LocalDate getAnsattTom() { + return ansattTom; + } + + @JsonProperty("ansattTom") + @Schema(description = "Til-og-med-dato for ansettelsesperiode, format (ISO-8601): yyyy-MM-dd", example = "2015-12-31") + public String getAnsattTomAsString() { + return JavaTimeUtil.toString(ansattTom); + } + + @JsonIgnore + public LocalDateTime getSistBekreftet() { + return sistBekreftet; + } + + @JsonProperty("sistBekreftet") + @Schema(description = "Tidspunkt for siste bekreftelse av arbeidsforhold, format (ISO-8601): yyyy-MM-dd'T'HH:mm[:ss[.SSSSSSSSS]]", example = "2018-09-19T12:10:31") + public String getSistBekreftetAsString() { + return JavaTimeUtil.toString(sistBekreftet); + } +} diff --git a/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/ArbeidsgiverArbeidsforholdoversikter.java b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/ArbeidsgiverArbeidsforholdoversikter.java new file mode 100644 index 00000000000..674475f7258 --- /dev/null +++ b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/ArbeidsgiverArbeidsforholdoversikter.java @@ -0,0 +1,42 @@ +package no.nav.registre.testnorge.levendearbeidsforhold.domain.v1; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ + "arbeidsforholdoversikter", + "startrad", + "antall", + "totalAntall" +}) +@Schema(description = """ + Resultatobjekt for finn-arbeidsforholdoversikter-per-arbeidsgiver + + Arbeidsforholdoversikter er filtrert grunnet tilgangskontroll hvis størrelse på liste er mindre enn (total) antall (forutsatt at antall- og/eller startrad-filter ikke er angitt)""" +) +public class ArbeidsgiverArbeidsforholdoversikter { + + @Schema(description = "Liste av arbeidsforholdoversikter") + private List arbeidsforholdoversikter; + + @Schema(description = "Nummer for første rad i resultatsett (ikke angitt hvis antall er 0)") + private Integer startrad; + + @Schema(description = "Antall arbeidsforholdoversikter i resultatsett - der det er siste resultatsett hvis antall er mindre enn forespurt antall") + private Integer antall; + + @Schema(description = "Total antall arbeidsforholdoversikter") + private Integer totalAntall; +} diff --git a/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/Arbeidsgiveroversikt.java b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/Arbeidsgiveroversikt.java new file mode 100644 index 00000000000..f1be4637bbf --- /dev/null +++ b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/Arbeidsgiveroversikt.java @@ -0,0 +1,32 @@ +package no.nav.registre.testnorge.levendearbeidsforhold.domain.v1; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ + "arbeidsgiver", + "aktiveArbeidsforhold", + "inaktiveArbeidsforhold" +}) +@Schema(description = "Informasjon knyttet til arbeidsgiver (overordnet)") +public class Arbeidsgiveroversikt { + + private OpplysningspliktigArbeidsgiver arbeidsgiver; + + @Schema(description = "Antall aktive arbeidsforhold, dvs. de som har en gjeldende ansettelsesperiode") + private Integer aktiveArbeidsforhold; + + @Schema(description = "Antall inaktive arbeidsforhold, dvs. de som har en historisk ansettelsesperiode") + private Integer inaktiveArbeidsforhold; + +} diff --git a/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/Bruksperiode.java b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/Bruksperiode.java new file mode 100644 index 00000000000..fd3fcb620ee --- /dev/null +++ b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/Bruksperiode.java @@ -0,0 +1,69 @@ +package no.nav.registre.testnorge.levendearbeidsforhold.domain.v1; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import no.nav.registre.testnorge.levendearbeidsforhold.util.JavaTimeUtil; + +import java.time.LocalDateTime; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +@JsonInclude(JsonInclude.Include.NON_EMPTY) +@JsonPropertyOrder({ + "fom", + "tom" +}) +@Schema(description = "Inneholder informasjon om bruksperiode til objektet") +public class Bruksperiode { + + private LocalDateTime fom; + + private LocalDateTime tom; + + @JsonIgnore + public LocalDateTime getFom() { + return fom; + } + + @JsonIgnore + public LocalDateTime getTom() { + return tom; + } + + @JsonProperty("fom") + @Schema(description = "Fra-tidsstempel for bruksperiode, format (ISO-8601): yyyy-MM-dd'T'HH:mm[:ss[.SSSSSSSSS]]", example = "2015-01-06T21:44:04.748") + public String getFomAsString() { + return JavaTimeUtil.toString(fom); + } + + @JsonProperty("fom") + public void setFomAsString(String fom) { + this.fom = JavaTimeUtil.toLocalDateTime(fom); + } + + @JsonProperty("tom") + @Schema(description = "Til-tidsstempel for bruksperiode, format (ISO-8601): yyyy-MM-dd'T'HH:mm[:ss[.SSSSSSSSS]]", example = "2015-12-06T19:45:04") + public String getTomAsString() { + return JavaTimeUtil.toString(tom); + } + + @JsonProperty("tom") + public void setTomAsString(String tom) { + this.tom = JavaTimeUtil.toLocalDateTime(tom); + } + + @Override + @SuppressWarnings({"pmd:ConsecutiveLiteralAppends", "pmd:ConsecutiveAppendsShouldReuse", "fb-contrib:UCPM_USE_CHARACTER_PARAMETERIZED_METHOD", "pmd:AppendCharacterWithChar"}) + public String toString() { + return "Bruksperiode{" + "fom=" + getFomAsString() + ", tom=" + getTomAsString() + "}"; + } +} diff --git a/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/ForenkletOppgjoersordningArbeidsavtale.java b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/ForenkletOppgjoersordningArbeidsavtale.java new file mode 100644 index 00000000000..2cfa5113756 --- /dev/null +++ b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/ForenkletOppgjoersordningArbeidsavtale.java @@ -0,0 +1,40 @@ +package no.nav.registre.testnorge.levendearbeidsforhold.domain.v1; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.ToString; +import lombok.experimental.SuperBuilder; + +@Data +@NoArgsConstructor +@SuperBuilder +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@JsonPropertyOrder({ + "arbeidstidsordning", + "ansettelsesform", + "yrke", + "stillingsprosent", + "antallTimerPrUke", + "beregnetAntallTimerPrUke", + "sistLoennsendring", + "sistStillingsendring", + "bruksperiode", + "gyldighetsperiode", + "sporingsinformasjon" +}) +@Schema(description = "Arbeidsavtale/ansettelsesdetaljer for forenklet oppgjørsordning arbeidsforhold") +public class ForenkletOppgjoersordningArbeidsavtale extends Arbeidsavtale { + + public static final String TYPE = "Forenklet"; + + @Override + @JsonIgnore + public String getType() { + return TYPE; + } +} diff --git a/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/FrilanserArbeidsavtale.java b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/FrilanserArbeidsavtale.java new file mode 100644 index 00000000000..db5a22093c9 --- /dev/null +++ b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/FrilanserArbeidsavtale.java @@ -0,0 +1,40 @@ +package no.nav.registre.testnorge.levendearbeidsforhold.domain.v1; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.ToString; +import lombok.experimental.SuperBuilder; + +@Data +@NoArgsConstructor +@SuperBuilder +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@JsonPropertyOrder({ + "arbeidstidsordning", + "ansettelsesform", + "yrke", + "stillingsprosent", + "antallTimerPrUke", + "beregnetAntallTimerPrUke", + "sistLoennsendring", + "sistStillingsendring", + "bruksperiode", + "gyldighetsperiode", + "sporingsinformasjon" +}) +@Schema(description = "Arbeidsavtale/ansettelsesdetaljer for frilanser arbeidsforhold", allOf = Arbeidsavtale.class) +public class FrilanserArbeidsavtale extends Arbeidsavtale { + + public static final String TYPE = "Frilanser"; + + @Override + @JsonIgnore + public String getType() { + return TYPE; + } +} diff --git a/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/Gyldighetsperiode.java b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/Gyldighetsperiode.java new file mode 100644 index 00000000000..35a6cd3690f --- /dev/null +++ b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/Gyldighetsperiode.java @@ -0,0 +1,21 @@ +package no.nav.registre.testnorge.levendearbeidsforhold.domain.v1; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +@Data +@NoArgsConstructor +@SuperBuilder +@EqualsAndHashCode(callSuper = true) +@JsonInclude(JsonInclude.Include.NON_EMPTY) +public class Gyldighetsperiode extends Periode { + + @Override + @SuppressWarnings({"pmd:ConsecutiveLiteralAppends", "pmd:ConsecutiveAppendsShouldReuse", "fb-contrib:UCPM_USE_CHARACTER_PARAMETERIZED_METHOD", "pmd:AppendCharacterWithChar"}) + public String toString() { + return "Gyldighetsperiode{" + "fom=" + getFomAsString() + ", tom=" + getTomAsString() + "}"; + } +} diff --git a/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/MaritimArbeidsavtale.java b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/MaritimArbeidsavtale.java new file mode 100644 index 00000000000..4f1a78bcf12 --- /dev/null +++ b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/MaritimArbeidsavtale.java @@ -0,0 +1,54 @@ +package no.nav.registre.testnorge.levendearbeidsforhold.domain.v1; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.ToString; +import lombok.experimental.SuperBuilder; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@SuperBuilder +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@JsonPropertyOrder({ + "fartsomraade", + "skipsregister", + "fartoeystype", + "arbeidstidsordning", + "ansettelsesform", + "yrke", + "stillingsprosent", + "antallTimerPrUke", + "beregnetAntallTimerPrUke", + "sistLoennsendring", + "sistStillingsendring", + "bruksperiode", + "gyldighetsperiode", + "sporingsinformasjon" +}) +@Schema(description = "Arbeidsavtale/ansettelsesdetaljer for maritime arbeidsforhold", allOf = Arbeidsavtale.class) +public class MaritimArbeidsavtale extends Arbeidsavtale { + + public static final String TYPE = "Maritim"; + + @Schema(description = "Fartsområde (kodeverk: Fartsomraader)", example = "utenriks") + private String fartsomraade; + + @Schema(description = "Skipsregister (kodeverk: Skipsregistre)", example = "nis") + private String skipsregister; + + @Schema(description = "Skipstype (kodeverk: Skipstyper)", example = "turist") + private String skipstype; + + @Override + @JsonIgnore + public String getType() { + return TYPE; + } +} diff --git a/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/OpplysningspliktigArbeidsgiver.java b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/OpplysningspliktigArbeidsgiver.java new file mode 100644 index 00000000000..b565cae50b8 --- /dev/null +++ b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/OpplysningspliktigArbeidsgiver.java @@ -0,0 +1,28 @@ +package no.nav.registre.testnorge.levendearbeidsforhold.domain.v1; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +@Data +@NoArgsConstructor +@SuperBuilder +@JsonInclude(JsonInclude.Include.NON_EMPTY) +@JsonTypeInfo( + use = JsonTypeInfo.Id.NAME, + property = "type" +) +@JsonSubTypes({ + @JsonSubTypes.Type(value = Organisasjon.class, name = "Organisasjon"), + @JsonSubTypes.Type(value = Person.class, name = "Person") +}) +@Schema(description = "Informasjon om opplysningspliktig eller arbeidsgiver (organisasjon eller person)", oneOf = {Organisasjon.class, Person.class}) +@SuppressWarnings("squid:S1610") +public abstract class OpplysningspliktigArbeidsgiver { + + public abstract String getType(); +} diff --git a/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/OpplysningspliktigArbeidsgiverType.java b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/OpplysningspliktigArbeidsgiverType.java new file mode 100644 index 00000000000..5c97c433b06 --- /dev/null +++ b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/OpplysningspliktigArbeidsgiverType.java @@ -0,0 +1,6 @@ +package no.nav.registre.testnorge.levendearbeidsforhold.domain.v1; + +public interface OpplysningspliktigArbeidsgiverType { + + String getType(); +} diff --git a/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/OrdinaerArbeidsavtale.java b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/OrdinaerArbeidsavtale.java new file mode 100644 index 00000000000..42cd8b828d9 --- /dev/null +++ b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/OrdinaerArbeidsavtale.java @@ -0,0 +1,40 @@ +package no.nav.registre.testnorge.levendearbeidsforhold.domain.v1; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.ToString; +import lombok.experimental.SuperBuilder; + +@Data +@NoArgsConstructor +@SuperBuilder +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@JsonPropertyOrder({ + "arbeidstidsordning", + "ansettelsesform", + "yrke", + "stillingsprosent", + "antallTimerPrUke", + "beregnetAntallTimerPrUke", + "sistLoennsendring", + "sistStillingsendring", + "bruksperiode", + "gyldighetsperiode", + "sporingsinformasjon" +}) +@Schema(description = "Arbeidsavtale/ansettelsesdetaljer for ordinære arbeidsforhold", allOf = Arbeidsavtale.class) +public class OrdinaerArbeidsavtale extends Arbeidsavtale { + + public static final String TYPE = "Ordinaer"; + + @Override + @JsonIgnore + public String getType() { + return TYPE; + } +} diff --git a/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/Organisasjon.java b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/Organisasjon.java new file mode 100644 index 00000000000..440607caed7 --- /dev/null +++ b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/Organisasjon.java @@ -0,0 +1,34 @@ +package no.nav.registre.testnorge.levendearbeidsforhold.domain.v1; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +@EqualsAndHashCode(callSuper = true) +@JsonInclude(JsonInclude.Include.NON_EMPTY) +@JsonPropertyOrder({ + "type", + "organisasjonsnummer" +}) +@Schema(description = "Informasjon om organisasjon (arbeidsgiver/opplysningspliktig)") +public class Organisasjon extends OpplysningspliktigArbeidsgiver implements OpplysningspliktigArbeidsgiverType { + + @Schema(description = "Organisasjonsnummer fra Enhetsregisteret", example = "987654321") + private String organisasjonsnummer; + + @Override + @JsonIgnore + public String getType() { + return this.getClass().getSimpleName(); + } +} diff --git a/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/Periode.java b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/Periode.java new file mode 100644 index 00000000000..087f903a9e8 --- /dev/null +++ b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/Periode.java @@ -0,0 +1,67 @@ +package no.nav.registre.testnorge.levendearbeidsforhold.domain.v1; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; +import no.nav.registre.testnorge.levendearbeidsforhold.util.JavaTimeUtil; + +import java.time.LocalDate; + +@Data +@NoArgsConstructor +@SuperBuilder +@JsonInclude(JsonInclude.Include.NON_EMPTY) +@JsonPropertyOrder({ + "fom", + "tom" +}) +@Schema(description = "Inneholder informasjon om periode") +public class Periode { + + private LocalDate fom; + + private LocalDate tom; + + @JsonIgnore + public LocalDate getFom() { + return fom; + } + + @JsonIgnore + public LocalDate getTom() { + return tom; + } + + @JsonProperty("fom") + @Schema(description = "Fra-og-med-dato for periode, format (ISO-8601): yyyy-MM-dd", example = "2014-07-01") + public String getFomAsString() { + return JavaTimeUtil.toString(fom); + } + + @JsonProperty("fom") + public void setFomAsString(String fom) { + this.fom = JavaTimeUtil.toLocalDate(fom); + } + + @JsonProperty("tom") + @Schema(description = "Til-og-med-dato for periode, format (ISO-8601): yyyy-MM-dd", example = "2015-12-31") + public String getTomAsString() { + return JavaTimeUtil.toString(tom); + } + + @JsonProperty("tom") + public void setTomAsString(String tom) { + this.tom = JavaTimeUtil.toLocalDate(tom); + } + + @Override + @SuppressWarnings({"pmd:ConsecutiveLiteralAppends", "pmd:ConsecutiveAppendsShouldReuse", "fb-contrib:UCPM_USE_CHARACTER_PARAMETERIZED_METHOD", "pmd:AppendCharacterWithChar"}) + public String toString() { + return "Periode{" + "fom=" + getFomAsString() + ", tom=" + getTomAsString() + "}"; + } +} diff --git a/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/PermisjonPermittering.java b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/PermisjonPermittering.java new file mode 100644 index 00000000000..93f4898e9f6 --- /dev/null +++ b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/PermisjonPermittering.java @@ -0,0 +1,42 @@ +package no.nav.registre.testnorge.levendearbeidsforhold.domain.v1; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +@JsonInclude(JsonInclude.Include.NON_EMPTY) +@JsonPropertyOrder({ + "permisjonPermitteringId", + "periode", + "prosent", + "type", + "sporingsinformasjon" +}) +@Schema(description = "Informasjon om permisjon eller permittering") +public class PermisjonPermittering { + + @Schema(description = "Id fra opplysningspliktig", example = "123-xyz") + private String permisjonPermitteringId; + + private Periode periode; + + @Schema(description = "Prosent for permisjon eller permittering", example = "50.5") + private Double prosent; + + @Schema(description = "Permisjon-/permitteringstype (kodeverk: PermisjonsOgPermitteringsBeskrivelse)", example = "permisjonMedForeldrepenger") + private String type; + + @Schema(description = "Varslingskode (kodeverk: Varslingskode_5fAa-registeret) - benyttes hvis permisjon/permittering er lukket maskinelt") + private String varslingskode; + + @Schema(description = "Informasjon om opprettelse og endring av objekt") + private Sporingsinformasjon sporingsinformasjon; +} diff --git a/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/Person.java b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/Person.java new file mode 100644 index 00000000000..bc79a98d9a8 --- /dev/null +++ b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/Person.java @@ -0,0 +1,36 @@ +package no.nav.registre.testnorge.levendearbeidsforhold.domain.v1; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +@Data +@NoArgsConstructor +@SuperBuilder +@EqualsAndHashCode(callSuper = true) +@JsonInclude(JsonInclude.Include.NON_EMPTY) +@JsonPropertyOrder({ + "type", + "offentligIdent", + "aktoerId" +}) +@Schema(description = "Informasjon om person (arbeidstaker/arbeidsgiver/opplysningspliktig)") +public class Person extends OpplysningspliktigArbeidsgiver implements Persontype { + + @Schema(description = "Gjeldende offentlig ident", example = "31126700000") + private String offentligIdent; + + @Schema(description = "Aktør-id", example = "1234567890") + private String aktoerId; + + @Override + @JsonIgnore + public String getType() { + return this.getClass().getSimpleName(); + } +} diff --git a/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/Persontype.java b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/Persontype.java new file mode 100644 index 00000000000..516b09ee60f --- /dev/null +++ b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/Persontype.java @@ -0,0 +1,6 @@ +package no.nav.registre.testnorge.levendearbeidsforhold.domain.v1; + +public interface Persontype { + + String getType(); +} diff --git a/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/README.md b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/README.md new file mode 100644 index 00000000000..3df8cc38724 --- /dev/null +++ b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/README.md @@ -0,0 +1,6 @@ +# /Domain.v1 + +Denne mappen inneholder alle klassene for å hente ut og parse +dokumentene av skjermaet fra [GET](https://aareg-services-q2.intern.dev.nav.no/swagger-ui/index.html#/arbeidstaker/finnArbeidsforholdPrArbeidstaker_1) +og [PUT](https://aareg-vedlikehold-q2.dev.intern.nav.no/swagger-ui/index.html#/arbeidsforhold/endreArbeidsforhold) +endepunktene til AA-reg. Klassene er en eksakt kopi av [AA-reg sin modell](https://github.com/navikt/aareg-services/tree/main/src/main/java/no/nav/aareg/services/provider/rs/api/contract/arbeidsforhold/v1) diff --git a/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/Sporingsinformasjon.java b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/Sporingsinformasjon.java new file mode 100644 index 00000000000..a5f3dc789eb --- /dev/null +++ b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/Sporingsinformasjon.java @@ -0,0 +1,87 @@ +package no.nav.registre.testnorge.levendearbeidsforhold.domain.v1; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import no.nav.registre.testnorge.levendearbeidsforhold.util.JavaTimeUtil; + +import java.time.LocalDateTime; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +@JsonInclude(JsonInclude.Include.NON_EMPTY) +@JsonPropertyOrder({ + "opprettetTidspunkt", + "opprettetAv", + "opprettetKilde", + "opprettetKildereferanse", + "endretTidspunkt", + "endretAv", + "endretKilde", + "endretKildereferanse" +}) +@Schema(description = "Informasjon om opprettelse og endring av objekt. MERK: Skal IKKE eksponeres i selvbetjeningssonen (SBS).") +public class Sporingsinformasjon { + + private LocalDateTime opprettetTidspunkt; + + @Schema(description = "Brukernavn for opprettelse", example = "srvappserver") + private String opprettetAv; + + @Schema(description = "Kilde for opprettelse", example = "EDAG") + private String opprettetKilde; + + @Schema(description = "Kildereferanse for opprettelse", example = "22a26849-aeef-4b81-9174-e238c11e1081") + private String opprettetKildereferanse; + + private LocalDateTime endretTidspunkt; + + @Schema(description = "Brukernavn for endring", example = "Z990693") + private String endretAv; + + @Schema(description = "Kilde for endring", example = "AAREG") + private String endretKilde; + + @Schema(description = "Kildereferanse for endring", example = "referanse-fra-kilde") + private String endretKildereferanse; + + @JsonIgnore + public LocalDateTime getOpprettetTidspunkt() { + return opprettetTidspunkt; + } + + @JsonIgnore + public LocalDateTime getEndretTidspunkt() { + return endretTidspunkt; + } + + @JsonProperty("opprettetTidspunkt") + @Schema(description = "Tidspunkt for opprettelse, format (ISO-8601): yyyy-MM-dd'T'HH:mm[:ss[.SSSSSSSSS]]", example = "2018-09-19T12:10:58.059") + public String getOpprettetTidspunktAsString() { + return JavaTimeUtil.toString(opprettetTidspunkt); + } + + @JsonProperty("opprettetTidspunkt") + public void setOpprettetTidspunktAsString(String opprettetTidspunkt) { + this.opprettetTidspunkt = JavaTimeUtil.toLocalDateTime(opprettetTidspunkt); + } + + @JsonProperty("endretTidspunkt") + @Schema(description = "Tidspunkt for endring, format (ISO-8601): yyyy-MM-dd'T'HH:mm[:ss[.SSSSSSSSS]]", example = "2018-09-19T12:11:20.79") + public String getEndretTidspunktAsString() { + return JavaTimeUtil.toString(endretTidspunkt); + } + + @JsonProperty("endretTidspunkt") + public void setEndretTidspunktAsString(String endretTidspunkt) { + this.endretTidspunkt = JavaTimeUtil.toLocalDateTime(endretTidspunkt); + } +} diff --git a/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/Utenlandsopphold.java b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/Utenlandsopphold.java new file mode 100644 index 00000000000..a6d61508b40 --- /dev/null +++ b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/Utenlandsopphold.java @@ -0,0 +1,56 @@ +package no.nav.registre.testnorge.levendearbeidsforhold.domain.v1; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import no.nav.registre.testnorge.levendearbeidsforhold.util.JavaTimeUtil; + +import java.time.YearMonth; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +@JsonInclude(JsonInclude.Include.NON_EMPTY) +@JsonPropertyOrder({ + "periode", + "landkode", + "rapporteringsperiode", + "sporingsinformasjon" +}) +@Schema(description = "Informasjon om utenlandsopphold") +public class Utenlandsopphold { + + @Schema(description = "Periode for utenlandsopphold") + private Periode periode; + + @Schema(description = "Landkode (kodeverk: Landkoder)", example = "JPN") + private String landkode; + + private YearMonth rapporteringsperiode; + + @Schema(description = "Informasjon om opprettelse og endring av objekt") + private Sporingsinformasjon sporingsinformasjon; + + @JsonIgnore + public YearMonth getRapporteringsperiode() { + return rapporteringsperiode; + } + + @JsonProperty("rapporteringsperiode") + @Schema(description = "Rapporteringsperiode for utenlandsopphold, format (ISO-8601): yyyy-MM", example = "2017-12") + public String getRapporteringsperiodeAsString() { + return JavaTimeUtil.toString(rapporteringsperiode); + } + + @JsonProperty("rapporteringsperiode") + public void setRapporteringsperiodeAsString(String rapporteringsperiode) { + this.rapporteringsperiode = JavaTimeUtil.toYearMonth(rapporteringsperiode); + } +} diff --git a/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/Varsel.java b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/Varsel.java new file mode 100644 index 00000000000..a7df47d6b06 --- /dev/null +++ b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/Varsel.java @@ -0,0 +1,29 @@ +package no.nav.registre.testnorge.levendearbeidsforhold.domain.v1; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +@JsonInclude(JsonInclude.Include.NON_EMPTY) +@JsonPropertyOrder({ + "entitet", + "type", + "varslingskode" +}) +@Schema(description = "Informasjon om varsel") +public class Varsel { + + @Schema(description = "Entitet for varsel") + private Varselentitet entitet; + + @Schema(description = "Varslingskode (kodeverk: Varslingskode_5fAa-registeret)") + private String varslingskode; +} diff --git a/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/Varselentitet.java b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/Varselentitet.java new file mode 100644 index 00000000000..73abecce19e --- /dev/null +++ b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/domain/v1/Varselentitet.java @@ -0,0 +1,11 @@ +package no.nav.registre.testnorge.levendearbeidsforhold.domain.v1; + +import io.swagger.v3.oas.annotations.media.Schema; + +@Schema(description = "Entitet for varsel") +public enum Varselentitet { + + ARBEIDSFORHOLD, + ANSETTELSESPERIODE, + PERMISJONPERMITTERING +} diff --git a/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/listener/DoedsfallListener.java b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/listener/DoedsfallListener.java new file mode 100644 index 00000000000..fa123f50c6f --- /dev/null +++ b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/listener/DoedsfallListener.java @@ -0,0 +1,49 @@ +package no.nav.registre.testnorge.levendearbeidsforhold.listener; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import no.nav.person.pdl.leesah.Personhendelse; +import no.nav.registre.testnorge.levendearbeidsforhold.service.ArbeidsforholdService; +import org.apache.kafka.clients.consumer.ConsumerRecord; +import org.springframework.kafka.annotation.KafkaListener; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Slf4j +@Component +@RequiredArgsConstructor +public class DoedsfallListener { + private static final String doedsfallTopic = "pdl.leesah-v1"; + private static final String oensketHendelsestype = "DOEDSFALL_V1"; + + private final ArbeidsforholdService arbeidsforholdService; + + /** + * Lytter til og konsumerer hendelser fra Kafka hendelsesstrømmen på et gitt topic. + * Behandler også alle hendelser av en gitt hendelsestype. + * @param hendelser - Alle konsumerte hendelser fra hendelsesstrømmen + */ + @KafkaListener(topics = doedsfallTopic) + public void getHendelser(List> hendelser) { + for (ConsumerRecord hendelse: hendelser){ + + var aktoerId = hendelse.key().split("\u001A")[1]; + var hendelsestype = hendelse.value().get(4).toString(); + + if (validerHendelse(hendelsestype)){ + arbeidsforholdService.arbeidsforholdService(aktoerId); + } + } + } + + /** + * Validerer om hendelsen er av ønsket hendelsestype + * @param personhendelse - Hendelse/opplysningstype, f.eks: FOLKEREGISTERIDENTIFIKATOR_V1, NAVN_V1, SIVILSTAND_V1, etc. + * @return true dersom det er av ønsket hendelsestype, false hvis ikke + */ + private Boolean validerHendelse(String personhendelse) { + return personhendelse.equals(oensketHendelsestype); + } +} + diff --git a/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/service/ArbeidsforholdService.java b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/service/ArbeidsforholdService.java new file mode 100644 index 00000000000..4822569213e --- /dev/null +++ b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/service/ArbeidsforholdService.java @@ -0,0 +1,51 @@ +package no.nav.registre.testnorge.levendearbeidsforhold.service; + + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import no.nav.registre.testnorge.levendearbeidsforhold.consumers.AaregConsumer; +import no.nav.registre.testnorge.levendearbeidsforhold.domain.v1.Arbeidsforhold; + +import org.springframework.stereotype.Service; + +import java.time.LocalDate; +import java.util.List; + +@Slf4j +@Service +@RequiredArgsConstructor +public class ArbeidsforholdService { + + private final AaregConsumer aaregConsumer; + private final String sluttAarsaksKode = "arbeidstakerHarSagtOppSelv"; + private final String varslingsKode = "NAVEND"; + + public void arbeidsforholdService(String aktoerId) { + List arbeidsforholdListe = hentArbeidsforhold(aktoerId); + if (!arbeidsforholdListe.isEmpty()) { + arbeidsforholdListe.forEach( + arbeidsforhold -> { + if (arbeidsforhold.getAnsettelsesperiode().getPeriode().getTom() == null){ + endreArbeidsforhold(arbeidsforhold); + } + } + ); + } + } + + public List hentArbeidsforhold(String ident) { + return aaregConsumer.hentArbeidsforhold(ident); + } + + public void endreArbeidsforhold(Arbeidsforhold arbeidsforhold){ + + arbeidsforhold.getAnsettelsesperiode().getPeriode().setTom(LocalDate.now()); + arbeidsforhold.getAnsettelsesperiode().setSluttaarsak(sluttAarsaksKode); + arbeidsforhold.getAnsettelsesperiode().setVarslingskode(varslingsKode); + arbeidsforhold.getArbeidsavtaler().forEach( + arbeidsavtale -> arbeidsavtale.setStillingsprosent(null)); + + aaregConsumer.endreArbeidsforhold(arbeidsforhold); + } +} diff --git a/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/util/JavaTimeUtil.java b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/util/JavaTimeUtil.java new file mode 100644 index 00000000000..589b1396fc6 --- /dev/null +++ b/apps/levende-arbeidsforhold-service/src/main/java/no/nav/registre/testnorge/levendearbeidsforhold/util/JavaTimeUtil.java @@ -0,0 +1,38 @@ +package no.nav.registre.testnorge.levendearbeidsforhold.util; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.YearMonth; +import java.time.format.DateTimeFormatter; + +import static java.time.format.DateTimeFormatter.ISO_LOCAL_DATE; +import static java.time.format.DateTimeFormatter.ISO_LOCAL_DATE_TIME; + +public class JavaTimeUtil { + + private static final String YEAR_MONTH_PATTERN = "yyyy-MM"; + + public static String toString(LocalDate date) { + return date != null ? date.format(ISO_LOCAL_DATE) : null; + } + + public static String toString(LocalDateTime dateTime) { + return dateTime != null ? dateTime.format(ISO_LOCAL_DATE_TIME) : null; + } + + public static String toString(YearMonth yearMonth) { + return yearMonth != null ? yearMonth.format(DateTimeFormatter.ofPattern(YEAR_MONTH_PATTERN)) : null; + } + + public static LocalDate toLocalDate(String date) { + return date != null ? LocalDate.parse(date, ISO_LOCAL_DATE) : null; + } + + public static LocalDateTime toLocalDateTime(String dateTime) { + return dateTime != null ? LocalDateTime.parse(dateTime, ISO_LOCAL_DATE_TIME) : null; + } + + public static YearMonth toYearMonth(String yearMonth) { + return yearMonth != null ? YearMonth.parse(yearMonth, DateTimeFormatter.ofPattern(YEAR_MONTH_PATTERN)) : null; + } +} \ No newline at end of file diff --git a/apps/levende-arbeidsforhold-service/src/main/resources/application-dev.yml b/apps/levende-arbeidsforhold-service/src/main/resources/application-dev.yml new file mode 100644 index 00000000000..7df314e0e54 --- /dev/null +++ b/apps/levende-arbeidsforhold-service/src/main/resources/application-dev.yml @@ -0,0 +1,2 @@ +kafka: + group-id: testnav-levende-arbeidsforhold-service diff --git a/apps/levende-arbeidsforhold-service/src/main/resources/application.yml b/apps/levende-arbeidsforhold-service/src/main/resources/application.yml new file mode 100644 index 00000000000..0e91756066c --- /dev/null +++ b/apps/levende-arbeidsforhold-service/src/main/resources/application.yml @@ -0,0 +1,55 @@ +AAD_ISSUER_URI: https://login.microsoftonline.com/62366534-1ec3-4962-8869-9b5535279d0b + +spring: + main: + banner-mode: off + application: + name: testnav-levende-arbeidsforhold-service + version: 1 + description: App for å avslutte arbeidsforhold ved dødsfall. + security: + oauth2: + client: + resourceserver: + aad: + issuer-uri: ${AAD_ISSUER_URI}/v2.0 + jwk-set-uri: ${AAD_ISSUER_URI}/discovery/v2.0/keys + accepted-audience: ${azure.app.client.id}, api://${azure.app.client.id} + cloud: + vault: + enabled: false + kafka: + consumer: + group-id: testnav-levende-arbeidsforhold-service +springdoc: + swagger-ui: + disable-swagger-default-url: true + url: /v3/api-docs + +management: + endpoints: + enabled-by-default: true + web: + base-path: /internal + exposure.include: prometheus,heapdump,health + path-mapping: + prometheus: metrics + endpoint: + prometheus.enabled: true + heapdump.enabled: true + prometheus: + metrics: + export: + enabled: true +server: + servlet: + encoding: + charset: UTF-8 + error: + include-message: always +consumers: + testnav-aareg-proxy: + name: testnav-aareg-proxy + namespace: dolly + url: https://testnav-aareg-proxy.dev-fss-pub.nais.io + cluster: dev-fss diff --git a/apps/levende-arbeidsforhold-service/src/main/resources/logback-spring.xml b/apps/levende-arbeidsforhold-service/src/main/resources/logback-spring.xml new file mode 100644 index 00000000000..9583ff2d427 --- /dev/null +++ b/apps/levende-arbeidsforhold-service/src/main/resources/logback-spring.xml @@ -0,0 +1,40 @@ + + + + + + + true + 256 + 10280 + 20 + ^sun\.reflect\..*\.invoke + ^net\.sf\.cglib\.proxy\.MethodProxy\.invoke + java\.util\.concurrent\..* + org\.apache\.catalina\..* + org\.apache\.coyote\..* + org\.apache\.tomcat\..* + + + + + + + + + + + + + %d{HH:mm:ss.SSS} | %5p | %logger{25} | %m%n + + utf8 + + + + + + + + + \ No newline at end of file diff --git a/apps/levende-arbeidsforhold-service/src/test/java/no/nav/registre/testnorge/levendearbeidsforhold/ApplicationContextTest.java b/apps/levende-arbeidsforhold-service/src/test/java/no/nav/registre/testnorge/levendearbeidsforhold/ApplicationContextTest.java new file mode 100644 index 00000000000..4c6f896873e --- /dev/null +++ b/apps/levende-arbeidsforhold-service/src/test/java/no/nav/registre/testnorge/levendearbeidsforhold/ApplicationContextTest.java @@ -0,0 +1,20 @@ +package no.nav.registre.testnorge.levendearbeidsforhold; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.security.oauth2.jwt.JwtDecoder; +import org.springframework.test.context.ActiveProfiles; + +@SpringBootTest +@ActiveProfiles("test") +class ApplicationContextTest { + + @MockBean + public JwtDecoder jwtDecoder; + + @Test + @SuppressWarnings("java:S2699") + void load_app_context() { + } +} diff --git a/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/service/AdresseService.java b/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/service/AdresseService.java index 35a4c0936a6..44120e286d6 100644 --- a/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/service/AdresseService.java +++ b/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/service/AdresseService.java @@ -18,6 +18,8 @@ import static java.util.Objects.nonNull; import static no.nav.pdl.forvalter.utils.ArtifactUtils.getKilde; import static no.nav.pdl.forvalter.utils.ArtifactUtils.getMaster; +import static no.nav.pdl.forvalter.utils.IdenttypeUtility.isNotNpidIdent; +import static no.nav.pdl.forvalter.utils.TestnorgeIdentUtility.isTestnorgeIdent; import static org.apache.commons.lang3.BooleanUtils.isFalse; import static org.apache.commons.lang3.BooleanUtils.isTrue; import static org.apache.commons.lang3.StringUtils.isNotBlank; @@ -225,4 +227,8 @@ private void sortAdresser(List adresser) { adresser.get(i - 1).setId(adresser.size() - i + 1); } } + protected boolean isIdSupported(AdresseDTO adresse, String ident) { + + return isNotNpidIdent(ident) && !isTestnorgeIdent(ident) && !adresse.isPdlMaster(); + } } diff --git a/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/service/BostedAdresseService.java b/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/service/BostedAdresseService.java index 6876f23e2cb..4f3b7410a36 100644 --- a/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/service/BostedAdresseService.java +++ b/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/service/BostedAdresseService.java @@ -24,6 +24,7 @@ import static java.util.Objects.isNull; import static java.util.Objects.nonNull; import static no.nav.pdl.forvalter.utils.IdenttypeUtility.getIdenttype; +import static no.nav.pdl.forvalter.utils.TestnorgeIdentUtility.isTestnorgeIdent; import static no.nav.testnav.libs.data.pdlforvalter.v1.AdressebeskyttelseDTO.AdresseBeskyttelse.STRENGT_FORTROLIG; import static no.nav.testnav.libs.data.pdlforvalter.v1.Identtype.FNR; import static org.apache.commons.lang3.BooleanUtils.isNotTrue; @@ -115,7 +116,13 @@ private void handle(BostedadresseDTO bostedadresse, PersonDTO person) { } } else if (bostedadresse.countAdresser() == 0) { - bostedadresse.setVegadresse(new VegadresseDTO()); + + if (isTestnorgeIdent(person.getIdent())) { + bostedadresse.setUtenlandskAdresse(new UtenlandskAdresseDTO()); + + } else { + bostedadresse.setVegadresse(new VegadresseDTO()); + } } } else if (bostedadresse.countAdresser() == 0) { @@ -139,14 +146,14 @@ private void buildBoadresse(BostedadresseDTO bostedadresse, PersonDTO person) { var vegadresse = adresseServiceConsumer.getVegadresse(bostedadresse.getVegadresse(), bostedadresse.getAdresseIdentifikatorFraMatrikkelen()); - bostedadresse.setAdresseIdentifikatorFraMatrikkelen(vegadresse.getMatrikkelId()); + bostedadresse.setAdresseIdentifikatorFraMatrikkelen(isIdSupported(bostedadresse, person.getIdent()) ? vegadresse.getMatrikkelId() : null); mapperFacade.map(vegadresse, bostedadresse.getVegadresse()); } else if (nonNull(bostedadresse.getMatrikkeladresse())) { var matrikkeladresse = adresseServiceConsumer.getMatrikkeladresse(bostedadresse.getMatrikkeladresse(), bostedadresse.getAdresseIdentifikatorFraMatrikkelen()); - bostedadresse.setAdresseIdentifikatorFraMatrikkelen(matrikkeladresse.getMatrikkelId()); + bostedadresse.setAdresseIdentifikatorFraMatrikkelen(isIdSupported(bostedadresse, person.getIdent()) ? matrikkeladresse.getMatrikkelId() : null); mapperFacade.map(matrikkeladresse, bostedadresse.getMatrikkeladresse()); } else if (nonNull(bostedadresse.getUtenlandskAdresse())) { diff --git a/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/service/KontaktAdresseService.java b/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/service/KontaktAdresseService.java index c2f50a46293..9ae0e8f07f9 100644 --- a/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/service/KontaktAdresseService.java +++ b/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/service/KontaktAdresseService.java @@ -114,7 +114,7 @@ private void handle(KontaktadresseDTO kontaktadresse, PersonDTO person) { if (nonNull(kontaktadresse.getVegadresse())) { var vegadresse = adresseServiceConsumer.getVegadresse(kontaktadresse.getVegadresse(), kontaktadresse.getAdresseIdentifikatorFraMatrikkelen()); - kontaktadresse.setAdresseIdentifikatorFraMatrikkelen(kontaktadresse.getMaster() == Master.FREG ? vegadresse.getMatrikkelId() : null); + kontaktadresse.setAdresseIdentifikatorFraMatrikkelen(isIdSupported(kontaktadresse, person.getIdent()) ? vegadresse.getMatrikkelId() : null); mapperFacade.map(vegadresse, kontaktadresse.getVegadresse()); kontaktadresse.getVegadresse().setKommunenummer(null); diff --git a/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/service/OppholdsadresseService.java b/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/service/OppholdsadresseService.java index 85144a803b5..49ee8f10ea4 100644 --- a/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/service/OppholdsadresseService.java +++ b/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/service/OppholdsadresseService.java @@ -6,7 +6,6 @@ import no.nav.pdl.forvalter.exception.InvalidRequestException; import no.nav.pdl.forvalter.utils.IdenttypeUtility; import no.nav.testnav.libs.data.pdlforvalter.v1.AdressebeskyttelseDTO; -import no.nav.testnav.libs.data.pdlforvalter.v1.DbVersjonDTO.Master; import no.nav.testnav.libs.data.pdlforvalter.v1.OppholdsadresseDTO; import no.nav.testnav.libs.data.pdlforvalter.v1.PersonDTO; import no.nav.testnav.libs.data.pdlforvalter.v1.StatsborgerskapDTO; @@ -114,14 +113,14 @@ protected void handle(OppholdsadresseDTO oppholdsadresse, PersonDTO person) { if (nonNull(oppholdsadresse.getVegadresse())) { var vegadresse = adresseServiceConsumer.getVegadresse(oppholdsadresse.getVegadresse(), oppholdsadresse.getAdresseIdentifikatorFraMatrikkelen()); - oppholdsadresse.setAdresseIdentifikatorFraMatrikkelen(oppholdsadresse.getMaster() == Master.FREG ? + oppholdsadresse.setAdresseIdentifikatorFraMatrikkelen(isIdSupported(oppholdsadresse, person.getIdent()) ? vegadresse.getMatrikkelId() : null); mapperFacade.map(vegadresse, oppholdsadresse.getVegadresse()); } else if (nonNull(oppholdsadresse.getMatrikkeladresse())) { var matrikkeladresse = adresseServiceConsumer.getMatrikkeladresse(oppholdsadresse.getMatrikkeladresse(), oppholdsadresse.getAdresseIdentifikatorFraMatrikkelen()); - oppholdsadresse.setAdresseIdentifikatorFraMatrikkelen(matrikkeladresse.getMatrikkelId()); + oppholdsadresse.setAdresseIdentifikatorFraMatrikkelen(isIdSupported(oppholdsadresse, person.getIdent()) ? matrikkeladresse.getMatrikkelId() : null); mapperFacade.map(matrikkeladresse, oppholdsadresse.getMatrikkeladresse()); } else if (nonNull(oppholdsadresse.getUtenlandskAdresse())) { diff --git a/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/utils/ArtifactUtils.java b/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/utils/ArtifactUtils.java index bb3889ac76a..f7dc682e76e 100644 --- a/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/utils/ArtifactUtils.java +++ b/apps/pdl-forvalter/src/main/java/no/nav/pdl/forvalter/utils/ArtifactUtils.java @@ -9,6 +9,7 @@ import java.util.concurrent.atomic.AtomicInteger; import static java.util.Objects.nonNull; +import static no.nav.pdl.forvalter.utils.TestnorgeIdentUtility.isTestnorgeIdent; import static org.apache.commons.lang3.StringUtils.isNotBlank; @UtilityClass @@ -30,7 +31,8 @@ public static boolean hasSpraak(String spraak) { public static DbVersjonDTO.Master getMaster(DbVersjonDTO artifact, PersonDTO person) { - return getMaster(artifact, person.getIdenttype()); + return isTestnorgeIdent(person.getIdent()) ? DbVersjonDTO.Master.PDL : + getMaster(artifact, person.getIdenttype()); } public static DbVersjonDTO.Master getMaster(DbVersjonDTO artifact, Identtype identtype) { diff --git a/apps/pdl-forvalter/src/test/java/no/nav/pdl/forvalter/service/AdressebeskyttelseServiceTest.java b/apps/pdl-forvalter/src/test/java/no/nav/pdl/forvalter/service/AdressebeskyttelseServiceTest.java index 115b1027850..e80dde56edd 100644 --- a/apps/pdl-forvalter/src/test/java/no/nav/pdl/forvalter/service/AdressebeskyttelseServiceTest.java +++ b/apps/pdl-forvalter/src/test/java/no/nav/pdl/forvalter/service/AdressebeskyttelseServiceTest.java @@ -70,6 +70,7 @@ void whenStrengtFortroligOrFortroligAndIdentypeDnr_thenThrowExecption() { void whenStrengtFortroligUtland_thenSetMasterToPdl() { var request = PersonDTO.builder() + .ident(DNR_IDENT) .adressebeskyttelse(List.of(AdressebeskyttelseDTO.builder() .gradering(STRENGT_FORTROLIG_UTLAND) .isNew(true) @@ -85,6 +86,7 @@ void whenStrengtFortroligUtland_thenSetMasterToPdl() { void whenStrengtFortrolig_thenSetKontaktadresseClearOtherAdresses() { var request = PersonDTO.builder() + .ident(DNR_IDENT) .adressebeskyttelse(List.of(AdressebeskyttelseDTO.builder() .gradering(STRENGT_FORTROLIG) .isNew(true) diff --git a/apps/pdl-forvalter/src/test/java/no/nav/pdl/forvalter/service/FolkeregisterPersonstatusServiceTest.java b/apps/pdl-forvalter/src/test/java/no/nav/pdl/forvalter/service/FolkeregisterPersonstatusServiceTest.java index 6ce12812e04..b87cdb75662 100644 --- a/apps/pdl-forvalter/src/test/java/no/nav/pdl/forvalter/service/FolkeregisterPersonstatusServiceTest.java +++ b/apps/pdl-forvalter/src/test/java/no/nav/pdl/forvalter/service/FolkeregisterPersonstatusServiceTest.java @@ -41,6 +41,7 @@ void whenValueProvided_thenKeepValue() { var target = folkeregisterPersonstatusService.convert( PersonDTO.builder() + .ident(FNR_IDENT) .folkeregisterPersonstatus(List.of(FolkeregisterPersonstatusDTO.builder() .status(FORSVUNNET) .isNew(true) @@ -55,6 +56,7 @@ void whenDoedsfallExists_thenUseDoedsfall() { var target = folkeregisterPersonstatusService.convert( PersonDTO.builder() + .ident(FNR_IDENT) .folkeregisterPersonstatus( List.of(FolkeregisterPersonstatusDTO.builder() .isNew(true) @@ -73,6 +75,7 @@ void whenOppholdExists_thenUseOpphold() { var target = folkeregisterPersonstatusService.convert( PersonDTO.builder() + .ident(FNR_IDENT) .folkeregisterPersonstatus( List.of(FolkeregisterPersonstatusDTO.builder() .isNew(true) @@ -90,6 +93,7 @@ void whenUtflyttingExists_thenUseUpphold() { var target = folkeregisterPersonstatusService.convert( PersonDTO.builder() + .ident(FNR_IDENT) .folkeregisterPersonstatus( List.of(FolkeregisterPersonstatusDTO.builder() .isNew(true) diff --git a/apps/pdl-forvalter/src/test/java/no/nav/pdl/forvalter/service/InnflyttingServiceTest.java b/apps/pdl-forvalter/src/test/java/no/nav/pdl/forvalter/service/InnflyttingServiceTest.java index 2efcadbae0a..18767d9b462 100644 --- a/apps/pdl-forvalter/src/test/java/no/nav/pdl/forvalter/service/InnflyttingServiceTest.java +++ b/apps/pdl-forvalter/src/test/java/no/nav/pdl/forvalter/service/InnflyttingServiceTest.java @@ -23,6 +23,8 @@ @ExtendWith(MockitoExtension.class) class InnflyttingServiceTest { + private static final String DNR_IDENT = "45023412345"; + @Mock private KodeverkConsumer kodeverkConsumer; @@ -52,6 +54,7 @@ void whenEmptyLandkode_thenProvideRandomCountry() { when(kodeverkConsumer.getTilfeldigLand()).thenReturn("IND"); var request = PersonDTO.builder() + .ident(DNR_IDENT) .innflytting(List.of(InnflyttingDTO.builder() .isNew(true) .build())) diff --git a/apps/pdl-forvalter/src/test/java/no/nav/pdl/forvalter/service/UtflyttingServiceTest.java b/apps/pdl-forvalter/src/test/java/no/nav/pdl/forvalter/service/UtflyttingServiceTest.java index 1b923df5319..e10e6318c06 100644 --- a/apps/pdl-forvalter/src/test/java/no/nav/pdl/forvalter/service/UtflyttingServiceTest.java +++ b/apps/pdl-forvalter/src/test/java/no/nav/pdl/forvalter/service/UtflyttingServiceTest.java @@ -23,6 +23,7 @@ @ExtendWith(MockitoExtension.class) class UtflyttingServiceTest { + private static final String FNR_IDENT = "03012312345"; @Mock private KodeverkConsumer kodeverkConsumer; @@ -52,6 +53,7 @@ void whenEmptyLandkode_thenProvideCountryFromGeografiskeKodeverkConsumer() { when(kodeverkConsumer.getTilfeldigLand()).thenReturn("TGW"); var request = PersonDTO.builder() + .ident(FNR_IDENT) .utflytting(List.of(UtflyttingDTO.builder().isNew(true).build())) .build(); diff --git a/apps/skattekort-service/src/main/java/no/nav/skattekortservice/SkattekortServiceApplicationStarter.java b/apps/skattekort-service/src/main/java/no/nav/skattekortservice/SkattekortServiceApplicationStarter.java index 1c714ebb8b7..0d5a91d6a10 100644 --- a/apps/skattekort-service/src/main/java/no/nav/skattekortservice/SkattekortServiceApplicationStarter.java +++ b/apps/skattekort-service/src/main/java/no/nav/skattekortservice/SkattekortServiceApplicationStarter.java @@ -10,4 +10,4 @@ public static void main(String[] args) { SpringApplication.run(SkattekortServiceApplicationStarter.class, args); } -} +} \ No newline at end of file diff --git a/apps/skattekort-service/src/main/java/no/nav/skattekortservice/dto/SkattekortResponsIntermediate.java b/apps/skattekort-service/src/main/java/no/nav/skattekortservice/dto/SkattekortResponsIntermediate.java index dcf4a91927e..efeef1ffbc1 100644 --- a/apps/skattekort-service/src/main/java/no/nav/skattekortservice/dto/SkattekortResponsIntermediate.java +++ b/apps/skattekort-service/src/main/java/no/nav/skattekortservice/dto/SkattekortResponsIntermediate.java @@ -1,11 +1,15 @@ package no.nav.skattekortservice.dto; +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; +import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.RequiredArgsConstructor; +import lombok.experimental.SuperBuilder; import no.nav.testnav.libs.dto.skattekortservice.v1.IdentifikatorForEnhetEllerPerson; import java.time.LocalDate; @@ -88,9 +92,6 @@ public static class Skattekort { private LocalDate utstedtDato; private Long skattekortidentifikator; private List forskuddstrekk; - private List frikort; - private List trekktabell; - private List trekkprosent; public List getForskuddstrekk() { @@ -99,59 +100,40 @@ public List getForskuddstrekk() { } return forskuddstrekk; } - - public List getFrikort() { - - if (isNull(frikort)) { - frikort = new ArrayList<>(); - } - return frikort; - } - - public List getTrekktabell() { - - if (isNull(trekktabell)) { - trekktabell = new ArrayList<>(); - } - return trekktabell; - } - - public List getTrekkprosent() { - - if (isNull(trekkprosent)) { - trekkprosent = new ArrayList<>(); - } - return trekkprosent; - } } @Data - @Builder + @SuperBuilder @NoArgsConstructor @AllArgsConstructor - public static class Forskuddstrekk { + @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "xsi:type") + @JsonSubTypes({ + @JsonSubTypes.Type(value = Frikort.class, name = "Frikort"), + @JsonSubTypes.Type(value = Trekktabell.class, name = "Trekktabell"), + @JsonSubTypes.Type(value = Trekkprosent.class, name = "Trekkprosent") + }) + public abstract static class Forskuddstrekk { private Trekkode trekkode; + private String type; } + @EqualsAndHashCode(callSuper = true) @Data - @Builder + @SuperBuilder @NoArgsConstructor @AllArgsConstructor - public static class Frikort { - - private Trekkode trekkode; + public static class Frikort extends Forskuddstrekk { private Integer frikortbeloep; } + @EqualsAndHashCode(callSuper = true) @Data - @Builder + @SuperBuilder @NoArgsConstructor @AllArgsConstructor - public static class Trekktabell { - - private Trekkode trekkode; + public static class Trekktabell extends Forskuddstrekk { private Tabelltype tabelltype; private String tabellnummer; @@ -159,11 +141,12 @@ public static class Trekktabell { private Integer antallMaanederForTrekk; } + @EqualsAndHashCode(callSuper = true) @Data - @Builder + @SuperBuilder @NoArgsConstructor @AllArgsConstructor - public static class Trekkprosent { + public static class Trekkprosent extends Forskuddstrekk { private Trekkode trekkode; diff --git a/apps/skattekort-service/src/main/java/no/nav/skattekortservice/mapper/ArbeidsgiverMappingStrategy.java b/apps/skattekort-service/src/main/java/no/nav/skattekortservice/mapper/ArbeidsgiverMappingStrategy.java index 28348b1e7ff..6d3f64c1a3b 100644 --- a/apps/skattekort-service/src/main/java/no/nav/skattekortservice/mapper/ArbeidsgiverMappingStrategy.java +++ b/apps/skattekort-service/src/main/java/no/nav/skattekortservice/mapper/ArbeidsgiverMappingStrategy.java @@ -5,7 +5,6 @@ import ma.glasnost.orika.MapperFactory; import ma.glasnost.orika.MappingContext; import no.nav.skattekortservice.dto.SkattekortResponsIntermediate; -import no.nav.testnav.libs.dto.skattekortservice.v1.Forskuddstrekk; import no.nav.testnav.libs.dto.skattekortservice.v1.Frikort; import no.nav.testnav.libs.dto.skattekortservice.v1.Resultatstatus; import no.nav.testnav.libs.dto.skattekortservice.v1.Skattekort; @@ -17,6 +16,8 @@ import no.nav.testnav.libs.dto.skattekortservice.v1.Trekktabell; import org.springframework.stereotype.Component; +import static java.util.Objects.nonNull; + @Slf4j @Component public class ArbeidsgiverMappingStrategy implements MappingStrategy { @@ -39,22 +40,12 @@ public void mapAtoB(SkattekortResponsIntermediate.Skattekortmelding source, Skat }) .register(); - factory.classMap(SkattekortResponsIntermediate.Forskuddstrekk.class, Forskuddstrekk.class) - .customize(new CustomMapper<>() { - @Override - public void mapAtoB(SkattekortResponsIntermediate.Forskuddstrekk source, Forskuddstrekk target, MappingContext context) { - - target.setTrekkode(Trekkode.valueOf(source.getTrekkode().getValue())); - } - }) - .register(); - factory.classMap(SkattekortResponsIntermediate.Frikort.class, Frikort.class) .customize(new CustomMapper<>() { @Override public void mapAtoB(SkattekortResponsIntermediate.Frikort source, Frikort target, MappingContext context) { - target.setTrekkode(Trekkode.valueOf(source.getTrekkode().getValue())); + target.setTrekkode(getTrekkodeValue(source.getTrekkode())); target.setFrikortbeloep(source.getFrikortbeloep()); } }) @@ -65,7 +56,7 @@ public void mapAtoB(SkattekortResponsIntermediate.Frikort source, Frikort target @Override public void mapAtoB(SkattekortResponsIntermediate.Trekktabell source, Trekktabell target, MappingContext context) { - target.setTrekkode(Trekkode.valueOf(source.getTrekkode().getValue())); + target.setTrekkode(getTrekkodeValue(source.getTrekkode())); target.setTabelltype(Tabelltype.valueOf(source.getTabelltype().getValue())); target.setTabellnummer(source.getTabellnummer()); target.setProsentsats(source.getProsentsats()); @@ -79,11 +70,16 @@ public void mapAtoB(SkattekortResponsIntermediate.Trekktabell source, Trekktabel @Override public void mapAtoB(SkattekortResponsIntermediate.Trekkprosent source, Trekkprosent target, MappingContext context) { - target.setTrekkode(Trekkode.valueOf(target.getTrekkode().getValue())); + target.setTrekkode(getTrekkodeValue(source.getTrekkode())); target.setProsentsats(source.getProsentsats()); target.setAntallMaanederForTrekk(source.getAntallMaanederForTrekk()); } }) .register(); } + + private static Trekkode getTrekkodeValue(SkattekortResponsIntermediate.Trekkode trekkode) { + + return nonNull(trekkode.getValue()) ? Trekkode.valueOf(trekkode.getValue()) : null; + } } diff --git a/apps/skattekort-service/src/main/java/no/nav/skattekortservice/mapper/TrekktypeMappingStrategy.java b/apps/skattekort-service/src/main/java/no/nav/skattekortservice/mapper/ForskuddstrekkMappingStrategy.java similarity index 52% rename from apps/skattekort-service/src/main/java/no/nav/skattekortservice/mapper/TrekktypeMappingStrategy.java rename to apps/skattekort-service/src/main/java/no/nav/skattekortservice/mapper/ForskuddstrekkMappingStrategy.java index 0d6d81dfd77..5e6c1273f11 100644 --- a/apps/skattekort-service/src/main/java/no/nav/skattekortservice/mapper/TrekktypeMappingStrategy.java +++ b/apps/skattekort-service/src/main/java/no/nav/skattekortservice/mapper/ForskuddstrekkMappingStrategy.java @@ -9,7 +9,6 @@ import no.nav.testnav.libs.dto.skattekortservice.v1.Skattekort; import no.nav.testnav.libs.dto.skattekortservice.v1.Trekkprosent; import no.nav.testnav.libs.dto.skattekortservice.v1.Trekktabell; -import no.nav.testnav.libs.dto.skattekortservice.v1.Trekktype; import org.springframework.stereotype.Component; import java.util.Objects; @@ -17,7 +16,7 @@ import static java.util.Objects.nonNull; @Component -public class TrekktypeMappingStrategy implements MappingStrategy { +public class ForskuddstrekkMappingStrategy implements MappingStrategy { @Override public void register(MapperFactory factory) { @@ -26,20 +25,17 @@ public void register(MapperFactory factory) { @Override public void mapAtoB(Skattekort skattekort, no.skatteetaten.fastsetting.formueinntekt.forskudd.skattekorttilarbeidsgiver.v3.Skattekort skattekort2, MappingContext context) { - skattekort2.getForskuddstrekk().addAll(skattekort.getTrekktype().stream() - .map(trekktype -> { - if (nonNull(trekktype.getFrikort())) { - return mapperFacade.map(trekktype.getFrikort(), + skattekort2.getForskuddstrekk().addAll(skattekort.getForskuddstrekk().stream() + .map(forskuddstrekk -> { + if (nonNull(forskuddstrekk.getFrikort())) { + return mapperFacade.map(forskuddstrekk.getFrikort(), no.skatteetaten.fastsetting.formueinntekt.forskudd.skattekorttilarbeidsgiver.v3.Frikort.class); - } else if (nonNull(trekktype.getTrekktabell())) { - return mapperFacade.map(trekktype.getTrekktabell(), + } else if (nonNull(forskuddstrekk.getTrekktabell())) { + return mapperFacade.map(forskuddstrekk.getTrekktabell(), no.skatteetaten.fastsetting.formueinntekt.forskudd.skattekorttilarbeidsgiver.v3.Trekktabell.class); - } else if (nonNull(trekktype.getTrekkprosent())) { - return mapperFacade.map(trekktype.getTrekkprosent(), + } else if (nonNull(forskuddstrekk.getTrekkprosent())) { + return mapperFacade.map(forskuddstrekk.getTrekkprosent(), no.skatteetaten.fastsetting.formueinntekt.forskudd.skattekorttilarbeidsgiver.v3.Trekkprosent.class); - } else if (nonNull(trekktype.getForskuddstrekk())) { - return mapperFacade.map(trekktype.getForskuddstrekk(), - no.skatteetaten.fastsetting.formueinntekt.forskudd.skattekorttilarbeidsgiver.v3.Forskuddstrekk.class); } else { return null; } @@ -48,7 +44,7 @@ public void mapAtoB(Skattekort skattekort, no.skatteetaten.fastsetting.formueinn .toList()); } }) - .exclude("trekktype") + .exclude("forskuddstrekk") .byDefault() .register(); @@ -57,29 +53,21 @@ public void mapAtoB(Skattekort skattekort, no.skatteetaten.fastsetting.formueinn @Override public void mapAtoB(SkattekortResponsIntermediate.Skattekort skattekort, Skattekort skattekort2, MappingContext context) { - skattekort2.getTrekktype().addAll(skattekort.getFrikort().stream() - .map(frikort -> Trekktype.builder() - .frikort(mapperFacade.map(frikort, Frikort.class)) - .build()) - .toList()); - skattekort2.getTrekktype().addAll(skattekort.getForskuddstrekk().stream() - .map(forskuddstrekk -> Trekktype.builder() - .forskuddstrekk(mapperFacade.map(forskuddstrekk, Forskuddstrekk.class)) - .build()) - .toList()); - skattekort2.getTrekktype().addAll(skattekort.getTrekkprosent().stream() - .map(trekkprosent -> Trekktype.builder() - .trekkprosent(mapperFacade.map(trekkprosent, Trekkprosent.class)) - .build()) - .toList()); - skattekort2.getTrekktype().addAll(skattekort.getTrekktabell().stream() - .map(trekktabell -> Trekktype.builder() - .trekktabell(mapperFacade.map(trekktabell, Trekktabell.class)) - .build()) - .toList()); + skattekort2.setSkattekortidentifikator(skattekort.getSkattekortidentifikator()); + skattekort2.setUtstedtDato(skattekort.getUtstedtDato()); + skattekort.getForskuddstrekk() + .forEach(forskuddstrekk -> skattekort2.getForskuddstrekk().add( + Forskuddstrekk.builder() + .frikort(forskuddstrekk instanceof SkattekortResponsIntermediate.Frikort ? + mapperFacade.map(forskuddstrekk, Frikort.class) : null) + .trekktabell(forskuddstrekk instanceof SkattekortResponsIntermediate.Trekktabell ? + mapperFacade.map(forskuddstrekk, Trekktabell.class) : null) + .trekkprosent(forskuddstrekk instanceof SkattekortResponsIntermediate.Trekkprosent ? + mapperFacade.map(forskuddstrekk, Trekkprosent.class) : null) + .build() + )); } }) - .byDefault() .register(); } } \ No newline at end of file diff --git a/apps/skattekort-service/src/main/java/no/nav/skattekortservice/utility/SkattekortValidator.java b/apps/skattekort-service/src/main/java/no/nav/skattekortservice/utility/SkattekortValidator.java index 2ead001896d..e039d549028 100644 --- a/apps/skattekort-service/src/main/java/no/nav/skattekortservice/utility/SkattekortValidator.java +++ b/apps/skattekort-service/src/main/java/no/nav/skattekortservice/utility/SkattekortValidator.java @@ -28,7 +28,7 @@ private static void validateSkattekort(SkattekortRequestDTO skattekort) { .map(ArbeidsgiverSkatt::getArbeidstaker) .flatMap(Collection::stream) .map(Skattekortmelding::getSkattekort) - .map(Skattekort::getTrekktype) + .map(Skattekort::getForskuddstrekk) .flatMap(Collection::stream) .forEach(trekktype -> { if (trekktype.isAllEmpty()) { diff --git a/examples/reactive-rest-example/src/main/java/no/nav/testnav/examples/reactiverestexample/repository/CarEntity.java b/examples/reactive-rest-example/src/main/java/no/nav/testnav/examples/reactiverestexample/repository/CarEntity.java index ee096aed4dd..dda3cadb6d7 100644 --- a/examples/reactive-rest-example/src/main/java/no/nav/testnav/examples/reactiverestexample/repository/CarEntity.java +++ b/examples/reactive-rest-example/src/main/java/no/nav/testnav/examples/reactiverestexample/repository/CarEntity.java @@ -49,3 +49,5 @@ public boolean isNew() { + + diff --git a/libs/avro-schema/src/main/avro/Personhendelse.avsc b/libs/avro-schema/src/main/avro/Personhendelse.avsc new file mode 100644 index 00000000000..24c9a2cd292 --- /dev/null +++ b/libs/avro-schema/src/main/avro/Personhendelse.avsc @@ -0,0 +1,81 @@ +{ + "type" : "record", + "name" : "Personhendelse", + "namespace" : "no.nav.person.pdl.leesah", + "fields" : [ { + "name" : "hendelseId", + "type" : "string" + }, { + "name" : "personidenter", + "type" : { + "type" : "array", + "items" : "string" + } + }, { + "name" : "master", + "type" : "string" + }, { + "name" : "opprettet", + "type" : { + "type" : "long", + "logicalType" : "timestamp-millis" + } + }, { + "name" : "opplysningstype", + "type" : "string" + }, { + "name" : "endringstype", + "type" : { + "type" : "enum", + "name" : "Endringstype", + "symbols" : [ "OPPRETTET", "KORRIGERT", "ANNULLERT", "OPPHOERT" ] + } + }, { + "name" : "tidligereHendelseId", + "type" : [ "null", "string" ], + "default" : null + }, { + "name" : "navn", + "type" : [ "null", { + "type" : "record", + "name" : "Navn", + "namespace" : "no.nav.person.pdl.leesah.navn", + "fields" : [ { + "name" : "fornavn", + "type" : "string" + }, { + "name" : "mellomnavn", + "type" : [ "null", "string" ], + "default" : null + }, { + "name" : "etternavn", + "type" : "string" + }, { + "name" : "forkortetNavn", + "type" : [ "null", "string" ], + "default" : null + }, { + "name" : "originaltNavn", + "type" : [ "null", { + "type" : "record", + "name" : "OriginaltNavn", + "fields" : [ { + "name" : "fornavn", + "type" : [ "null", "string" ], + "default" : null + }, { + "name" : "mellomnavn", + "type" : [ "null", "string" ], + "default" : null + }, { + "name" : "etternavn", + "type" : [ "null", "string" ], + "default" : null + } ] + } ], + "default" : null + } ] + } ], + "default" : null + } ] +} \ No newline at end of file diff --git a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/skattekortservice/v1/Forskuddstrekk.java b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/skattekortservice/v1/Forskuddstrekk.java index 0d2dc40687a..aeed4c1f671 100644 --- a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/skattekortservice/v1/Forskuddstrekk.java +++ b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/skattekortservice/v1/Forskuddstrekk.java @@ -1,15 +1,48 @@ package no.nav.testnav.libs.dto.skattekortservice.v1; +import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import java.util.Arrays; +import java.util.Objects; + @Data @Builder @NoArgsConstructor @AllArgsConstructor public class Forskuddstrekk { - private Trekkode trekkode; + private Frikort frikort; + private Trekktabell trekktabell; + private Trekkprosent trekkprosent; + + @JsonIgnore + public boolean isAllEmpty() { + + return contentsCount() == 0; + } + + @JsonIgnore + public boolean isAmbiguous() { + + return contentsCount() > 1; + } + + private long contentsCount() { + + return Arrays.stream(getClass().getDeclaredFields()) + .map(field -> { + try { + field.setAccessible(true); + return field.get(this); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + }) + .filter(Objects::nonNull) + .count(); + } } diff --git a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/skattekortservice/v1/Skattekort.java b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/skattekortservice/v1/Skattekort.java index b7f872e60a1..94a1bb58fa3 100644 --- a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/skattekortservice/v1/Skattekort.java +++ b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/skattekortservice/v1/Skattekort.java @@ -19,14 +19,14 @@ public class Skattekort { private LocalDate utstedtDato; private Long skattekortidentifikator; - private List trekktype; + private List forskuddstrekk; - public List getTrekktype() { + public List getForskuddstrekk() { - if (isNull(trekktype)) { - trekktype = new ArrayList<>(); + if (isNull(forskuddstrekk)) { + forskuddstrekk = new ArrayList<>(); } - return trekktype; + return forskuddstrekk; } } diff --git a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/skattekortservice/v1/Trekktype.java b/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/skattekortservice/v1/Trekktype.java deleted file mode 100644 index 5042a2e4870..00000000000 --- a/libs/data-transfer-objects/src/main/java/no/nav/testnav/libs/dto/skattekortservice/v1/Trekktype.java +++ /dev/null @@ -1,47 +0,0 @@ -package no.nav.testnav.libs.dto.skattekortservice.v1; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.SuperBuilder; - -import java.util.Arrays; -import java.util.Objects; - -@Data -@SuperBuilder -@NoArgsConstructor -public class Trekktype { - - private Forskuddstrekk forskuddstrekk; - private Frikort frikort; - private Trekktabell trekktabell; - private Trekkprosent trekkprosent; - - @JsonIgnore - public boolean isAllEmpty() { - - return contentsCount() == 0; - } - - @JsonIgnore - public boolean isAmbiguous() { - - return contentsCount() > 1; - } - - private long contentsCount() { - - return Arrays.stream(getClass().getDeclaredFields()) - .map(field -> { - try { - field.setAccessible(true); - return field.get(this); - } catch (IllegalAccessException e) { - throw new RuntimeException(e); - } - }) - .filter(Objects::nonNull) - .count(); - } -} diff --git a/settings.gradle b/settings.gradle index 21529e70cd8..17a285fbdea 100644 --- a/settings.gradle +++ b/settings.gradle @@ -95,6 +95,7 @@ includeBuild './apps/inntektsmelding-service' includeBuild './apps/jenkins-batch-status-service' includeBuild './apps/joark-dokument-service' includeBuild './apps/kodeverk-service' +includeBuild './apps/levende-arbeidsforhold-service' includeBuild './apps/miljoer-service' includeBuild './apps/oppsummeringsdokument-service' includeBuild './apps/organisasjon-bestilling-service' @@ -112,6 +113,7 @@ includeBuild './apps/person-organisasjon-tilgang-service' includeBuild './apps/person-search-service' includeBuild './apps/person-service' includeBuild './apps/profil-api' +includeBuild './apps/skattekort-service' includeBuild './apps/sykemelding-api' includeBuild './apps/synt-sykemelding-api' includeBuild './apps/synt-vedtakshistorikk-service' @@ -122,8 +124,6 @@ includeBuild './apps/tilbakemelding-api' includeBuild './apps/tps-messaging-service' includeBuild './apps/udi-stub' includeBuild './apps/varslinger-service' -includeBuild './apps/dollystatus' -includeBuild './apps/skattekort-service' includeBuild './xsd/arbeidsforhold-xsd'