Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

Legg til opplysninger endepunkt for refusjon omsorgspenger arbeidsgiver #276

Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
c280e66
Legg til endepunkt for å slå opp arbeidstaker
selbekk Nov 12, 2024
d4ba3b6
Legg til tester
selbekk Nov 12, 2024
581bab9
Legg til flere tester
selbekk Nov 13, 2024
7be44c0
Legg til integrasjon med AAReg
selbekk Nov 13, 2024
ad53fa0
Legg til tester for Aareg integrasjon
selbekk Nov 13, 2024
aec7a38
Refaktorer og legg til bedre tester
selbekk Nov 13, 2024
7c05e81
Fjern arbeidsforhold som bruker ikke har tilgang til
selbekk Nov 13, 2024
2892818
Ytelsen og temaet er omsorgspenger, ikke omsorgsdager
selbekk Nov 14, 2024
bf171fe
Gjenbruk konstruktør
selbekk Nov 14, 2024
8e16c5d
Legg til tester for tilgangstjenesten
selbekk Nov 14, 2024
b580ce6
Legg til tester for REST-tjenesten
selbekk Nov 14, 2024
53101a7
Legg til tester for en DTO
selbekk Nov 14, 2024
0b8489a
Sett riktig path
selbekk Nov 14, 2024
3a064c8
Sett faktisk riktig path
selbekk Nov 14, 2024
b4de91b
Legg til ytelsetype i DTOen for å generalisere oppslagstjenesten for …
selbekk Jan 9, 2025
60d06b3
Legg til tester
selbekk Nov 12, 2024
2818b7d
Fjern arbeidsforhold som bruker ikke har tilgang til
selbekk Nov 13, 2024
c4f6f6f
Ytelsen og temaet er omsorgspenger, ikke omsorgsdager
selbekk Nov 14, 2024
2c16cac
Legg til støtte for å hente opplysninger om innsender via opplysninge…
selbekk Nov 14, 2024
f081535
Flytt alle dtos inn i en dto pakke
selbekk Nov 18, 2024
5528645
Lag innsendings-DTO for søknad
selbekk Nov 22, 2024
310cd70
Returner bedre feilkoder ved edge-cases
selbekk Dec 3, 2024
7ae5abd
Fiks noen tester
selbekk Dec 3, 2024
2a37396
Fiks feilende test
selbekk Jan 9, 2025
9a093b6
Fjern ubrukt import
selbekk Jan 10, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .deploy/k9/naiserator.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -97,3 +97,4 @@ spec:
{{else}}
- host: dokarkiv.{{environment}}-fss-pub.nais.io
{{/if}}
- host: aareg-services-nais.arbeidsforhold
Original file line number Diff line number Diff line change
Expand Up @@ -145,11 +145,7 @@ public byte[] hentPDF(long id) {
}

private InntektsmeldingDialogDto.InnsenderDto lagInnmelderDto(Ytelsetype ytelsetype) {
if (!KontekstHolder.harKontekst() || !IdentType.EksternBruker.equals(KontekstHolder.getKontekst().getIdentType())) {
throw new IllegalStateException("Mangler innlogget bruker kontekst.");
}
var pid = KontekstHolder.getKontekst().getUid();
var personInfo = personTjeneste.hentPersonFraIdent(PersonIdent.fra(pid), ytelsetype);
var personInfo = personTjeneste.hentInnloggetPerson(ytelsetype);
return new InntektsmeldingDialogDto.InnsenderDto(personInfo.fornavn(), personInfo.mellomnavn(), personInfo.etternavn(),
personInfo.telefonnummer());
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package no.nav.familie.inntektsmelding.integrasjoner.aareg;

import java.net.URI;
import java.time.LocalDate;
import java.util.Arrays;
import java.util.List;

import jakarta.enterprise.context.ApplicationScoped;
import jakarta.ws.rs.core.UriBuilder;
import jakarta.ws.rs.core.UriBuilderException;

import no.nav.familie.inntektsmelding.integrasjoner.aareg.dto.ArbeidsforholdDto;
import no.nav.vedtak.felles.integrasjon.rest.NavHeaders;
import no.nav.vedtak.felles.integrasjon.rest.RestClient;
import no.nav.vedtak.felles.integrasjon.rest.RestClientConfig;
import no.nav.vedtak.felles.integrasjon.rest.RestConfig;
import no.nav.vedtak.felles.integrasjon.rest.RestRequest;
import no.nav.vedtak.felles.integrasjon.rest.TokenFlow;

/*
* Dokumentasjon https://confluence.adeo.no/display/FEL/AAREG+-+Tjeneste+REST+aareg.api
* Swagger https://aareg-services-q2.dev.intern.nav.no/swagger-ui/index.html?urls.primaryName=aareg.api.v1#/arbeidstaker/finnArbeidsforholdPrArbeidstaker
* Swagger V2 https://aareg-services-q2.dev.intern.nav.no/swagger-ui/index.html?urls.primaryName=aareg.api.v2#/arbeidstaker/finnArbeidsforholdPrArbeidstaker
*/

@ApplicationScoped
@RestClientConfig(tokenConfig = TokenFlow.ADAPTIVE, endpointProperty = "aareg.rs.url",
endpointDefault = "http://aareg-services-nais.arbeidsforhold/api/v1/arbeidstaker",
scopesProperty = "aareg.scopes", scopesDefault = "api://prod-fss.arbeidsforhold.aareg-services-nais/.default")
public class AaregRestKlient {

private final RestClient restClient; // Setter på consumer-token fra STS
private final RestConfig restConfig;

public AaregRestKlient() {
this(RestClient.client());
}

public AaregRestKlient(RestClient restClient) {
this.restClient = restClient;
this.restConfig = RestConfig.forClient(this.getClass());
}

public List<ArbeidsforholdDto> finnArbeidsforholdForArbeidstaker(String ident, LocalDate qfom, LocalDate qtom) {
try {
var target = lagUriForForFinnArbeidsforholdForArbeidstaker(qfom, qtom);
var request = RestRequest.newGET(target, restConfig).header(NavHeaders.HEADER_NAV_PERSONIDENT, ident);
var result = restClient.send(request, ArbeidsforholdDto[].class);
return Arrays.asList(result);
} catch (UriBuilderException | IllegalArgumentException e) {
throw new IllegalArgumentException("Utviklerfeil syntax-exception for finnArbeidsforholdForArbeidstaker");
}
}

/** Kun eksponert for å kunne teste URI-bygging – skal ikke brukes ellers */
URI lagUriForForFinnArbeidsforholdForArbeidstaker(LocalDate qfom, LocalDate qtom) {
return UriBuilder.fromUri(restConfig.endpoint())
.path("arbeidsforhold")
.queryParam("ansettelsesperiodeFom", String.valueOf(qfom))
.queryParam("ansettelsesperiodeTom", String.valueOf(qtom))
.queryParam("regelverk", "A_ORDNINGEN")
.queryParam("historikk", "true")
.queryParam("sporingsinformasjon", "false")
.build();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package no.nav.familie.inntektsmelding.integrasjoner.aareg.dto;

public record AnsettelsesperiodeDto(PeriodeDto periode) {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package no.nav.familie.inntektsmelding.integrasjoner.aareg.dto;

import java.math.BigDecimal;
import java.time.LocalDate;

public record ArbeidsavtaleDto(BigDecimal stillingsprosent, LocalDate sistLoennsendring, PeriodeDto gyldighetsperiode) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package no.nav.familie.inntektsmelding.integrasjoner.aareg.dto;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;

import java.util.List;

@JsonIgnoreProperties(ignoreUnknown = true)
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
@JsonAutoDetect(getterVisibility = JsonAutoDetect.Visibility.NONE, setterVisibility = JsonAutoDetect.Visibility.NONE, fieldVisibility = JsonAutoDetect.Visibility.ANY)
public record ArbeidsforholdDto(
@JsonProperty("arbeidsforholdId")
String arbeidsforholdId,

@JsonProperty("navArbeidsforholdId")
Long navArbeidsforholdId,

@JsonProperty("arbeidsgiver")
OpplysningspliktigArbeidsgiverDto arbeidsgiver,

@JsonProperty("ansettelsesperiode")
AnsettelsesperiodeDto ansettelsesperiode,

@JsonProperty("arbeidsavtaler")
List<ArbeidsavtaleDto> arbeidsavtaler,

@JsonProperty("permisjonPermitteringer")
List<PermisjonPermitteringDto> permisjonPermitteringer,

@JsonProperty("type")
String type // (kodeverk: Arbeidsforholdtyper)
) {
public List<ArbeidsavtaleDto> arbeidsavtaler() {
return arbeidsavtaler != null ? arbeidsavtaler : List.of();
}

public List<PermisjonPermitteringDto> permisjonPermitteringer() {
return permisjonPermitteringer != null ? permisjonPermitteringer : List.of();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package no.nav.familie.inntektsmelding.integrasjoner.aareg.dto;

public record OpplysningspliktigArbeidsgiverDto(Type type, String organisasjonsnummer, String aktoerId, String offentligIdent) {

@Override
public String toString() {
return "OpplysningspliktigArbeidsgiverDto{" + "type=" + type + ", organisasjonsnummer='" + organisasjonsnummer + '\'' + ", aktoerId='"
+ aktoerId + '\'' + ", offentligIdent='" + offentligIdent + '\'' + '}';
}

public enum Type {
Organisasjon,
Person
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package no.nav.familie.inntektsmelding.integrasjoner.aareg.dto;

import java.time.LocalDate;

public record PeriodeDto(LocalDate fom, LocalDate tom) {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package no.nav.familie.inntektsmelding.integrasjoner.aareg.dto;

import java.math.BigDecimal;

public record PermisjonPermitteringDto(PeriodeDto periode, BigDecimal prosent, String type) {

}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@
import jakarta.inject.Inject;
import jakarta.ws.rs.ProcessingException;

import no.nav.vedtak.sikkerhet.kontekst.IdentType;
import no.nav.vedtak.sikkerhet.kontekst.KontekstHolder;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand Down Expand Up @@ -76,6 +79,14 @@ public PersonInfo hentPersonFraIdent(PersonIdent personIdent, Ytelsetype ytelseT
mapTelefonnummer(person));
}

public PersonInfo hentInnloggetPerson(Ytelsetype ytelsetype) {
if (!KontekstHolder.harKontekst() || !IdentType.EksternBruker.equals(KontekstHolder.getKontekst().getIdentType())) {
throw new IllegalStateException("Mangler innlogget bruker kontekst.");
}
var pid = KontekstHolder.getKontekst().getUid();
return hentPersonFraIdent(PersonIdent.fra(pid), ytelsetype);
}

public PersonIdent finnPersonIdentForAktørId(AktørIdEntitet aktørIdEntitet) {
return hentPersonidentForAktørId(aktørIdEntitet).orElseThrow(
() -> new IllegalStateException("Finner ikke personnummer for id " + aktørIdEntitet));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,18 @@ public class AltinnTilgangTjeneste {
private final AltinnAutoriseringKlient altinnKlient;

public AltinnTilgangTjeneste() {
this.altinnKlient = AltinnAutoriseringKlient.instance();
this(AltinnAutoriseringKlient.instance());
}

public AltinnTilgangTjeneste(AltinnAutoriseringKlient altinnKlient) {
this.altinnKlient = altinnKlient;
}

public boolean harTilgangTilBedriften(String orgNr) {
return altinnKlient.harTilgangTilBedriften(orgNr);
}

public boolean manglerTilgangTilBedriften(String orgNr) {
return !altinnKlient.harTilgangTilBedriften(orgNr);
return !harTilgangTilBedriften(orgNr);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.rest;

public class FantIkkeArbeidstakerException extends SlåOppArbeidstakerException {

public FantIkkeArbeidstakerException() {
super("Fant ikke arbeidstaker");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.rest;

public class InnsenderHarIkkeTilgangTilArbeidsforholdException extends SlåOppArbeidstakerException {

public InnsenderHarIkkeTilgangTilArbeidsforholdException() {
super("Innsender har ikke tilgang til noen av arbeidsforholdene til arbeidstaker");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
package no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.rest;

import static no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.rest.RefusjonOmsorgsdagerArbeidsgiverRest.BASE_PATH;

import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import jakarta.transaction.Transactional;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.NotFoundException;
import jakarta.ws.rs.POST;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;

import no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.rest.dto.InnsendingSoknadDto;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.rest.dto.SlåOppArbeidstakerDto;
import no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.tjenester.ArbeidstakerTjeneste;
import no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.tjenester.OpplysningerTjeneste;
import no.nav.familie.inntektsmelding.server.auth.api.AutentisertMedTokenX;
import no.nav.familie.inntektsmelding.server.auth.api.Tilgangskontrollert;

@AutentisertMedTokenX
@ApplicationScoped
@Transactional
@Path(BASE_PATH)
public class RefusjonOmsorgsdagerArbeidsgiverRest {
private static final Logger LOG = LoggerFactory.getLogger(RefusjonOmsorgsdagerArbeidsgiverRest.class);

public static final String BASE_PATH = "/imdialog/refusjon-omsorgsdager-arbeidsgiver";
private static final String SLÅ_OPP_ARBEIDSTAKER = "/arbeidstaker";
private static final String OPPLYSNINGER = "/opplysninger";
private static final String SEND_INN_SØKNAD = "/send-inn-soknad";

private ArbeidstakerTjeneste arbeidstakerTjeneste;
private OpplysningerTjeneste opplysningerTjeneste;

RefusjonOmsorgsdagerArbeidsgiverRest() {
// CDI
}

@Inject
public RefusjonOmsorgsdagerArbeidsgiverRest(ArbeidstakerTjeneste arbeidstakerTjeneste, OpplysningerTjeneste opplysningerTjeneste) {
this.arbeidstakerTjeneste = arbeidstakerTjeneste;
this.opplysningerTjeneste = opplysningerTjeneste;
}

@POST
@Path(SLÅ_OPP_ARBEIDSTAKER)
@Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
@Operation(description = "Henter opplysninger om arbeidstaker, gitt et fødselsnummer.", tags = "imdialog")
@Tilgangskontrollert
public Response slåOppArbeidstaker(
@Parameter(description = "Datapakke som inneholder fødselsnummeret til en arbeidstaker") @NotNull @Valid
SlåOppArbeidstakerDto slåOppArbeidstakerDto) {

LOG.info("Slår opp arbeidstaker med fødselsnummer {}", slåOppArbeidstakerDto.fødselsnummer());

var dto = arbeidstakerTjeneste.slåOppArbeidstaker(slåOppArbeidstakerDto.fødselsnummer(), slåOppArbeidstakerDto.ytelseType());
return Response.ok(dto).build();
}

@GET
@Path(OPPLYSNINGER)
@Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
@Operation(description = "Henter opplysninger om innmelder.", tags = "imdialog")
@Tilgangskontrollert
public Response hentOpplysninger() {
var dto = opplysningerTjeneste.hentOpplysninger();
return Response.ok(dto).build();
}

@POST
@Path(SEND_INN_SØKNAD)
@Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
@Operation(description = "Mottar søknad om refusjon av omsorgspenger for arbeidsgiver.", tags = "imdialog")
@Tilgangskontrollert
public Response sendInnSøknad(
@Parameter(description = "Datapakke som inneholder søknad om refusjon av omsorgspenger for arbeidsgiver") @NotNull @Valid
InnsendingSoknadDto innsendingSoknadDto
) {
LOG.info("Mottatt søknad om refusjon av omsorgspenger for arbeidsgiver: {}", innsendingSoknadDto);
// TODO: Implementer denne
return Response.ok().build();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.rest;

public class SlåOppArbeidstakerException extends RuntimeException {

public SlåOppArbeidstakerException(String message) {
super(message);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.rest.dto;

public record ArbeidsforholdDto(String arbeidsgiver, String underenhetId, String arbeidsforholdId) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.rest.dto;

import jakarta.validation.constraints.NotNull;

public record InnsenderDto(@NotNull String fornavn, String mellomnavn, @NotNull String etternavn, String telefon) {}
Loading
Loading