diff --git a/.deploy/k9/naiserator.yaml b/.deploy/k9/naiserator.yaml index 6d649d87..e769288f 100644 --- a/.deploy/k9/naiserator.yaml +++ b/.deploy/k9/naiserator.yaml @@ -97,3 +97,4 @@ spec: {{else}} - host: dokarkiv.{{environment}}-fss-pub.nais.io {{/if}} + - host: aareg-services-nais.arbeidsforhold diff --git a/src/main/java/no/nav/familie/inntektsmelding/imdialog/tjenester/InntektsmeldingTjeneste.java b/src/main/java/no/nav/familie/inntektsmelding/imdialog/tjenester/InntektsmeldingTjeneste.java index 5abf82bb..58e3bd7d 100644 --- a/src/main/java/no/nav/familie/inntektsmelding/imdialog/tjenester/InntektsmeldingTjeneste.java +++ b/src/main/java/no/nav/familie/inntektsmelding/imdialog/tjenester/InntektsmeldingTjeneste.java @@ -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()); } diff --git a/src/main/java/no/nav/familie/inntektsmelding/integrasjoner/aareg/AaregRestKlient.java b/src/main/java/no/nav/familie/inntektsmelding/integrasjoner/aareg/AaregRestKlient.java new file mode 100644 index 00000000..0c04eba2 --- /dev/null +++ b/src/main/java/no/nav/familie/inntektsmelding/integrasjoner/aareg/AaregRestKlient.java @@ -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 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(); + } + +} diff --git a/src/main/java/no/nav/familie/inntektsmelding/integrasjoner/aareg/dto/AnsettelsesperiodeDto.java b/src/main/java/no/nav/familie/inntektsmelding/integrasjoner/aareg/dto/AnsettelsesperiodeDto.java new file mode 100644 index 00000000..cee5e321 --- /dev/null +++ b/src/main/java/no/nav/familie/inntektsmelding/integrasjoner/aareg/dto/AnsettelsesperiodeDto.java @@ -0,0 +1,5 @@ +package no.nav.familie.inntektsmelding.integrasjoner.aareg.dto; + +public record AnsettelsesperiodeDto(PeriodeDto periode) { + +} diff --git a/src/main/java/no/nav/familie/inntektsmelding/integrasjoner/aareg/dto/ArbeidsavtaleDto.java b/src/main/java/no/nav/familie/inntektsmelding/integrasjoner/aareg/dto/ArbeidsavtaleDto.java new file mode 100644 index 00000000..b318c778 --- /dev/null +++ b/src/main/java/no/nav/familie/inntektsmelding/integrasjoner/aareg/dto/ArbeidsavtaleDto.java @@ -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) { +} diff --git a/src/main/java/no/nav/familie/inntektsmelding/integrasjoner/aareg/dto/ArbeidsforholdDto.java b/src/main/java/no/nav/familie/inntektsmelding/integrasjoner/aareg/dto/ArbeidsforholdDto.java new file mode 100644 index 00000000..5cee4929 --- /dev/null +++ b/src/main/java/no/nav/familie/inntektsmelding/integrasjoner/aareg/dto/ArbeidsforholdDto.java @@ -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 arbeidsavtaler, + + @JsonProperty("permisjonPermitteringer") + List permisjonPermitteringer, + + @JsonProperty("type") + String type // (kodeverk: Arbeidsforholdtyper) +) { + public List arbeidsavtaler() { + return arbeidsavtaler != null ? arbeidsavtaler : List.of(); + } + + public List permisjonPermitteringer() { + return permisjonPermitteringer != null ? permisjonPermitteringer : List.of(); + } +} diff --git a/src/main/java/no/nav/familie/inntektsmelding/integrasjoner/aareg/dto/OpplysningspliktigArbeidsgiverDto.java b/src/main/java/no/nav/familie/inntektsmelding/integrasjoner/aareg/dto/OpplysningspliktigArbeidsgiverDto.java new file mode 100644 index 00000000..d94bd44b --- /dev/null +++ b/src/main/java/no/nav/familie/inntektsmelding/integrasjoner/aareg/dto/OpplysningspliktigArbeidsgiverDto.java @@ -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 + } +} diff --git a/src/main/java/no/nav/familie/inntektsmelding/integrasjoner/aareg/dto/PeriodeDto.java b/src/main/java/no/nav/familie/inntektsmelding/integrasjoner/aareg/dto/PeriodeDto.java new file mode 100644 index 00000000..4e420450 --- /dev/null +++ b/src/main/java/no/nav/familie/inntektsmelding/integrasjoner/aareg/dto/PeriodeDto.java @@ -0,0 +1,7 @@ +package no.nav.familie.inntektsmelding.integrasjoner.aareg.dto; + +import java.time.LocalDate; + +public record PeriodeDto(LocalDate fom, LocalDate tom) { + +} diff --git a/src/main/java/no/nav/familie/inntektsmelding/integrasjoner/aareg/dto/PermisjonPermitteringDto.java b/src/main/java/no/nav/familie/inntektsmelding/integrasjoner/aareg/dto/PermisjonPermitteringDto.java new file mode 100644 index 00000000..5890e7fc --- /dev/null +++ b/src/main/java/no/nav/familie/inntektsmelding/integrasjoner/aareg/dto/PermisjonPermitteringDto.java @@ -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) { + +} diff --git a/src/main/java/no/nav/familie/inntektsmelding/integrasjoner/person/PersonTjeneste.java b/src/main/java/no/nav/familie/inntektsmelding/integrasjoner/person/PersonTjeneste.java index 0e4d6b18..1f441d7d 100644 --- a/src/main/java/no/nav/familie/inntektsmelding/integrasjoner/person/PersonTjeneste.java +++ b/src/main/java/no/nav/familie/inntektsmelding/integrasjoner/person/PersonTjeneste.java @@ -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; @@ -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)); diff --git a/src/main/java/no/nav/familie/inntektsmelding/pip/AltinnTilgangTjeneste.java b/src/main/java/no/nav/familie/inntektsmelding/pip/AltinnTilgangTjeneste.java index 90fbe122..fc5bc710 100644 --- a/src/main/java/no/nav/familie/inntektsmelding/pip/AltinnTilgangTjeneste.java +++ b/src/main/java/no/nav/familie/inntektsmelding/pip/AltinnTilgangTjeneste.java @@ -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); } } diff --git a/src/main/java/no/nav/familie/inntektsmelding/refusjonomsorgsdagerarbeidsgiver/rest/FantIkkeArbeidstakerException.java b/src/main/java/no/nav/familie/inntektsmelding/refusjonomsorgsdagerarbeidsgiver/rest/FantIkkeArbeidstakerException.java new file mode 100644 index 00000000..933b8649 --- /dev/null +++ b/src/main/java/no/nav/familie/inntektsmelding/refusjonomsorgsdagerarbeidsgiver/rest/FantIkkeArbeidstakerException.java @@ -0,0 +1,8 @@ +package no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.rest; + +public class FantIkkeArbeidstakerException extends SlåOppArbeidstakerException { + + public FantIkkeArbeidstakerException() { + super("Fant ikke arbeidstaker"); + } +} diff --git a/src/main/java/no/nav/familie/inntektsmelding/refusjonomsorgsdagerarbeidsgiver/rest/InnsenderHarIkkeTilgangTilArbeidsforholdException.java b/src/main/java/no/nav/familie/inntektsmelding/refusjonomsorgsdagerarbeidsgiver/rest/InnsenderHarIkkeTilgangTilArbeidsforholdException.java new file mode 100644 index 00000000..94206d1f --- /dev/null +++ b/src/main/java/no/nav/familie/inntektsmelding/refusjonomsorgsdagerarbeidsgiver/rest/InnsenderHarIkkeTilgangTilArbeidsforholdException.java @@ -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"); + } +} diff --git a/src/main/java/no/nav/familie/inntektsmelding/refusjonomsorgsdagerarbeidsgiver/rest/RefusjonOmsorgsdagerArbeidsgiverRest.java b/src/main/java/no/nav/familie/inntektsmelding/refusjonomsorgsdagerarbeidsgiver/rest/RefusjonOmsorgsdagerArbeidsgiverRest.java new file mode 100644 index 00000000..375b34a5 --- /dev/null +++ b/src/main/java/no/nav/familie/inntektsmelding/refusjonomsorgsdagerarbeidsgiver/rest/RefusjonOmsorgsdagerArbeidsgiverRest.java @@ -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(); + } + +} diff --git "a/src/main/java/no/nav/familie/inntektsmelding/refusjonomsorgsdagerarbeidsgiver/rest/Sl\303\245OppArbeidstakerException.java" "b/src/main/java/no/nav/familie/inntektsmelding/refusjonomsorgsdagerarbeidsgiver/rest/Sl\303\245OppArbeidstakerException.java" new file mode 100644 index 00000000..11e89dfb --- /dev/null +++ "b/src/main/java/no/nav/familie/inntektsmelding/refusjonomsorgsdagerarbeidsgiver/rest/Sl\303\245OppArbeidstakerException.java" @@ -0,0 +1,8 @@ +package no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.rest; + +public class SlåOppArbeidstakerException extends RuntimeException { + + public SlåOppArbeidstakerException(String message) { + super(message); + } +} diff --git a/src/main/java/no/nav/familie/inntektsmelding/refusjonomsorgsdagerarbeidsgiver/rest/dto/ArbeidsforholdDto.java b/src/main/java/no/nav/familie/inntektsmelding/refusjonomsorgsdagerarbeidsgiver/rest/dto/ArbeidsforholdDto.java new file mode 100644 index 00000000..fcbceafc --- /dev/null +++ b/src/main/java/no/nav/familie/inntektsmelding/refusjonomsorgsdagerarbeidsgiver/rest/dto/ArbeidsforholdDto.java @@ -0,0 +1,4 @@ +package no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.rest.dto; + +public record ArbeidsforholdDto(String arbeidsgiver, String underenhetId, String arbeidsforholdId) { +} diff --git a/src/main/java/no/nav/familie/inntektsmelding/refusjonomsorgsdagerarbeidsgiver/rest/dto/InnsenderDto.java b/src/main/java/no/nav/familie/inntektsmelding/refusjonomsorgsdagerarbeidsgiver/rest/dto/InnsenderDto.java new file mode 100644 index 00000000..d03a07a3 --- /dev/null +++ b/src/main/java/no/nav/familie/inntektsmelding/refusjonomsorgsdagerarbeidsgiver/rest/dto/InnsenderDto.java @@ -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) {} diff --git a/src/main/java/no/nav/familie/inntektsmelding/refusjonomsorgsdagerarbeidsgiver/rest/dto/InnsendingSoknadDto.java b/src/main/java/no/nav/familie/inntektsmelding/refusjonomsorgsdagerarbeidsgiver/rest/dto/InnsendingSoknadDto.java new file mode 100644 index 00000000..b71e329a --- /dev/null +++ b/src/main/java/no/nav/familie/inntektsmelding/refusjonomsorgsdagerarbeidsgiver/rest/dto/InnsendingSoknadDto.java @@ -0,0 +1,83 @@ +package no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.rest.dto; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.List; + +public record InnsendingSoknadDto( + // Base fields from RefusjonOmsorgspengerArbeidsgiverSkjemaStateSchema + Kontaktperson kontaktperson, + String årForRefusjon, + String harUtbetaltLønn, + String ansattesFødselsnummer, + String valgtArbeidsforhold, + String harDekket10FørsteOmsorgsdager, + List fraværHeleDager, + List fraværDelerAvDagen, + BigDecimal inntekt, + InntektEndringsArsak inntektEndringsÅrsak, + Boolean skalRefunderes, + BigDecimal refusjonsbelopPerMåned, + Boolean endringIRefusjon, + List refusjonsendringer, + Boolean misterNaturalytelser, + List bortfaltNaturalytelsePerioder +) { + public record Kontaktperson( + String navn, + String telefonnummer + ) {} + + public record FravaerHeleDager( + LocalDate fom, + LocalDate tom + ) {} + + public record FravaerDelerAvDag( + LocalDate dato, + Double normalArbeidstid, + Double timerFravaer + ) {} + + public record InntektEndringsArsak( + String arsak, + BigDecimal korrigertInntekt, + LocalDate fom, + LocalDate tom + ) {} + + public record Refusjonsendring( + LocalDate fom, + BigDecimal belop + ) {} + + public record BortfaltNaturalytelsePeriode( + NaturalytelsesType navn, + BigDecimal belop, + LocalDate fom, + LocalDate tom, + boolean inkluderTom + ) {} + + public enum NaturalytelsesType { + ELEKTRISK_KOMMUNIKASJON, + AKSJER_GRUNNFONDSBEVIS_TIL_UNDERKURS, + LOSJI, + KOST_DOEGN, + BESOKSREISER_HJEMMET_ANNET, + KOSTBESPARELSE_I_HJEMMET, + RENTEFORDEL_LAN, + BIL, + KOST_DAGER, + BOLIG, + SKATTEPLIKTIG_DEL_FORSIKRINGER, + FRI_TRANSPORT, + OPSJONER, + TILSKUDD_BARNEHAGEPLASS, + ANNET, + BEDRIFTSBARNEHAGEPLASS, + YRKEBIL_TJENESTLIGBEHOV_KILOMETER, + YRKEBIL_TJENESTLIGBEHOV_LISTEPRIS, + INNBETALING_TIL_UTENLANDSK_PENSJONSORDNING + } +} diff --git a/src/main/java/no/nav/familie/inntektsmelding/refusjonomsorgsdagerarbeidsgiver/rest/dto/OpplysningerResponseDto.java b/src/main/java/no/nav/familie/inntektsmelding/refusjonomsorgsdagerarbeidsgiver/rest/dto/OpplysningerResponseDto.java new file mode 100644 index 00000000..95f8012f --- /dev/null +++ b/src/main/java/no/nav/familie/inntektsmelding/refusjonomsorgsdagerarbeidsgiver/rest/dto/OpplysningerResponseDto.java @@ -0,0 +1,4 @@ +package no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.rest.dto; + +public record OpplysningerResponseDto(InnsenderDto innsender) { +} diff --git "a/src/main/java/no/nav/familie/inntektsmelding/refusjonomsorgsdagerarbeidsgiver/rest/dto/Sl\303\245OppArbeidstakerDto.java" "b/src/main/java/no/nav/familie/inntektsmelding/refusjonomsorgsdagerarbeidsgiver/rest/dto/Sl\303\245OppArbeidstakerDto.java" new file mode 100644 index 00000000..82e1704c --- /dev/null +++ "b/src/main/java/no/nav/familie/inntektsmelding/refusjonomsorgsdagerarbeidsgiver/rest/dto/Sl\303\245OppArbeidstakerDto.java" @@ -0,0 +1,13 @@ +package no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.rest.dto; + +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotNull; + +import no.nav.familie.inntektsmelding.integrasjoner.person.PersonIdent; +import no.nav.familie.inntektsmelding.koder.Ytelsetype; + +public record SlåOppArbeidstakerDto(@Valid @NotNull PersonIdent fødselsnummer, @Valid @NotNull Ytelsetype ytelseType) { + public SlåOppArbeidstakerDto { + } +} + diff --git "a/src/main/java/no/nav/familie/inntektsmelding/refusjonomsorgsdagerarbeidsgiver/rest/dto/Sl\303\245OppArbeidstakerResponseDto.java" "b/src/main/java/no/nav/familie/inntektsmelding/refusjonomsorgsdagerarbeidsgiver/rest/dto/Sl\303\245OppArbeidstakerResponseDto.java" new file mode 100644 index 00000000..f5780999 --- /dev/null +++ "b/src/main/java/no/nav/familie/inntektsmelding/refusjonomsorgsdagerarbeidsgiver/rest/dto/Sl\303\245OppArbeidstakerResponseDto.java" @@ -0,0 +1,6 @@ +package no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.rest.dto; + +import java.util.List; + +public record SlåOppArbeidstakerResponseDto(String fornavn, String mellomnavn, String etternavn, List arbeidsforhold) { +} diff --git a/src/main/java/no/nav/familie/inntektsmelding/refusjonomsorgsdagerarbeidsgiver/tjenester/ArbeidsforholdTjeneste.java b/src/main/java/no/nav/familie/inntektsmelding/refusjonomsorgsdagerarbeidsgiver/tjenester/ArbeidsforholdTjeneste.java new file mode 100644 index 00000000..86d7896b --- /dev/null +++ b/src/main/java/no/nav/familie/inntektsmelding/refusjonomsorgsdagerarbeidsgiver/tjenester/ArbeidsforholdTjeneste.java @@ -0,0 +1,43 @@ +package no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.tjenester; + +import jakarta.enterprise.context.ApplicationScoped; + +import no.nav.familie.inntektsmelding.integrasjoner.aareg.AaregRestKlient; +import no.nav.familie.inntektsmelding.integrasjoner.person.PersonIdent; +import no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.rest.dto.ArbeidsforholdDto; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.time.LocalDate; +import java.util.Collections; +import java.util.List; + +@ApplicationScoped +public class ArbeidsforholdTjeneste { + private AaregRestKlient aaregRestKlient; + private static final Logger LOG = LoggerFactory.getLogger(ArbeidsforholdTjeneste.class); + + public ArbeidsforholdTjeneste() { + // CDI + } + + public ArbeidsforholdTjeneste(AaregRestKlient aaregRestKlient) { + this.aaregRestKlient = aaregRestKlient; + } + + public List hentNåværendeArbeidsforhold(PersonIdent ident) { + var aaregInfo = aaregRestKlient.finnArbeidsforholdForArbeidstaker(ident.getIdent(), LocalDate.now(), LocalDate.now()); + if (aaregInfo == null) { + LOG.info("Fant ingen arbeidsforhold for ident {}. Returnerer tom liste", ident.getIdent()); + return Collections.emptyList(); + } + LOG.info("Fant {} arbeidsforhold for ident {}.", aaregInfo.size(), ident.getIdent()); + return aaregInfo.stream().map(arbeidsforhold -> + new ArbeidsforholdDto( + arbeidsforhold.arbeidsgiver().offentligIdent(), + arbeidsforhold.arbeidsgiver().organisasjonsnummer(), + arbeidsforhold.arbeidsforholdId() + )).toList(); + } +} diff --git a/src/main/java/no/nav/familie/inntektsmelding/refusjonomsorgsdagerarbeidsgiver/tjenester/ArbeidstakerTjeneste.java b/src/main/java/no/nav/familie/inntektsmelding/refusjonomsorgsdagerarbeidsgiver/tjenester/ArbeidstakerTjeneste.java new file mode 100644 index 00000000..2be6e1a0 --- /dev/null +++ b/src/main/java/no/nav/familie/inntektsmelding/refusjonomsorgsdagerarbeidsgiver/tjenester/ArbeidstakerTjeneste.java @@ -0,0 +1,80 @@ +package no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.tjenester; + +import jakarta.enterprise.context.ApplicationScoped; + +import no.nav.familie.inntektsmelding.pip.AltinnTilgangTjeneste; + +import no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.rest.FantIkkeArbeidstakerException; +import no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.rest.InnsenderHarIkkeTilgangTilArbeidsforholdException; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import no.nav.familie.inntektsmelding.integrasjoner.person.PersonIdent; +import no.nav.familie.inntektsmelding.integrasjoner.person.PersonTjeneste; +import no.nav.familie.inntektsmelding.koder.Ytelsetype; +import no.nav.familie.inntektsmelding.pip.AltinnTilgangTjeneste; +import no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.rest.dto.SlåOppArbeidstakerResponseDto; + +import java.util.Collections; + +@ApplicationScoped +public class ArbeidstakerTjeneste { + private static final Logger LOG = LoggerFactory.getLogger(ArbeidstakerTjeneste.class); + private PersonTjeneste personTjeneste; + private ArbeidsforholdTjeneste arbeidsforholdTjeneste; + private AltinnTilgangTjeneste altinnTilgangTjeneste; + + public ArbeidstakerTjeneste() { + // CDI + } + + public ArbeidstakerTjeneste(PersonTjeneste personTjeneste, ArbeidsforholdTjeneste arbeidsforholdTjeneste, AltinnTilgangTjeneste altinnTilgangTjeneste) { + this.personTjeneste = personTjeneste; + this.arbeidsforholdTjeneste = arbeidsforholdTjeneste; + this.altinnTilgangTjeneste = altinnTilgangTjeneste; + } + + public SlåOppArbeidstakerResponseDto slåOppArbeidstaker(PersonIdent ident, Ytelsetype ytelseType) { + var personInfo = personTjeneste.hentPersonFraIdent(ident, ytelseType); + + if (personInfo == null) { + throw new FantIkkeArbeidstakerException(); + } + + var alleArbeidsforhold = arbeidsforholdTjeneste.hentNåværendeArbeidsforhold(ident); + LOG.info("Fant totalt {} arbeidsforhold for ident {}", alleArbeidsforhold.size(), ident.getIdent()); + + if (alleArbeidsforhold.isEmpty()) { + LOG.info("Fant person, men ingen arbeidsforhold."); + // Her kan man i fremtiden sjekke om arbeidstaker har en åpen sak i enten fp-sak eller k9-sak, + // avhengig av ytelse som søkes etter + // Enn så lenge returnerer vi en tom liste + return new SlåOppArbeidstakerResponseDto( + personInfo.fornavn(), + personInfo.mellomnavn(), + personInfo.etternavn(), + Collections.emptyList() + ); + } + + var arbeidsforholdInnsenderHarTilgangTil = alleArbeidsforhold + .stream() + .filter(dto -> altinnTilgangTjeneste.harTilgangTilBedriften(dto.underenhetId())) + .toList(); + + if (arbeidsforholdInnsenderHarTilgangTil.isEmpty()) { + LOG.info("Innsender har ikke tilgang til noen arbeidsforhold for ident {}", ident.getIdent()); + throw new InnsenderHarIkkeTilgangTilArbeidsforholdException(); + } + + LOG.info("Innsender har tilgang til {} av {} arbeidsforhold for ident {}", arbeidsforholdInnsenderHarTilgangTil.size(), alleArbeidsforhold.size(), ident.getIdent()); + + return new SlåOppArbeidstakerResponseDto( + personInfo.fornavn(), + personInfo.mellomnavn(), + personInfo.etternavn(), + arbeidsforholdInnsenderHarTilgangTil + ); + } +} diff --git a/src/main/java/no/nav/familie/inntektsmelding/refusjonomsorgsdagerarbeidsgiver/tjenester/OpplysningerTjeneste.java b/src/main/java/no/nav/familie/inntektsmelding/refusjonomsorgsdagerarbeidsgiver/tjenester/OpplysningerTjeneste.java new file mode 100644 index 00000000..2de9584f --- /dev/null +++ b/src/main/java/no/nav/familie/inntektsmelding/refusjonomsorgsdagerarbeidsgiver/tjenester/OpplysningerTjeneste.java @@ -0,0 +1,32 @@ +package no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.tjenester; + +import jakarta.enterprise.context.ApplicationScoped; +import no.nav.familie.inntektsmelding.integrasjoner.person.PersonTjeneste; +import no.nav.familie.inntektsmelding.koder.Ytelsetype; +import no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.rest.dto.InnsenderDto; +import no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.rest.dto.OpplysningerResponseDto; + +@ApplicationScoped +public class OpplysningerTjeneste { + private PersonTjeneste personTjeneste; + + public OpplysningerTjeneste() { + // CDI + } + + public OpplysningerTjeneste(PersonTjeneste personTjeneste) { + this.personTjeneste = personTjeneste; + } + + public OpplysningerResponseDto hentOpplysninger() { + var innsender = personTjeneste.hentInnloggetPerson(Ytelsetype.OMSORGSPENGER); + + if (innsender == null) { + return new OpplysningerResponseDto(null); + } + + return new OpplysningerResponseDto( + new InnsenderDto(innsender.fornavn(), innsender.mellomnavn(), innsender.etternavn(), + innsender.telefonnummer())); + } +} diff --git a/src/main/java/no/nav/familie/inntektsmelding/server/app/api/ApiConfig.java b/src/main/java/no/nav/familie/inntektsmelding/server/app/api/ApiConfig.java index 484b46d4..32d5f4ea 100644 --- a/src/main/java/no/nav/familie/inntektsmelding/server/app/api/ApiConfig.java +++ b/src/main/java/no/nav/familie/inntektsmelding/server/app/api/ApiConfig.java @@ -7,6 +7,8 @@ import jakarta.ws.rs.ApplicationPath; +import no.nav.familie.inntektsmelding.server.exceptions.SlåOppArbeidstakerExceptionMapper; + import org.glassfish.jersey.server.ResourceConfig; import org.glassfish.jersey.server.ServerProperties; import org.slf4j.Logger; @@ -48,6 +50,7 @@ void registerExceptionMappers() { register(ConstraintViolationMapper.class); register(JsonMappingExceptionMapper.class); register(JsonParseExceptionMapper.class); + register(SlåOppArbeidstakerExceptionMapper.class); } private Set> getApplicationClasses() { diff --git a/src/main/java/no/nav/familie/inntektsmelding/server/exceptions/FeilType.java b/src/main/java/no/nav/familie/inntektsmelding/server/exceptions/FeilType.java index f4ee8f34..8eb1ad50 100644 --- a/src/main/java/no/nav/familie/inntektsmelding/server/exceptions/FeilType.java +++ b/src/main/java/no/nav/familie/inntektsmelding/server/exceptions/FeilType.java @@ -3,5 +3,7 @@ enum FeilType { MANGLER_TILGANG_FEIL, TOMT_RESULTAT_FEIL, - GENERELL_FEIL + GENERELL_FEIL, + INNSENDER_HAR_IKKE_TILGANG_TIL_ARBEIDSFORHOLD_FEIL, + FANT_IKKE_ARBEIDSTAKER_FEIL } diff --git "a/src/main/java/no/nav/familie/inntektsmelding/server/exceptions/Sl\303\245OppArbeidstakerExceptionMapper.java" "b/src/main/java/no/nav/familie/inntektsmelding/server/exceptions/Sl\303\245OppArbeidstakerExceptionMapper.java" new file mode 100644 index 00000000..ac4b0ddc --- /dev/null +++ "b/src/main/java/no/nav/familie/inntektsmelding/server/exceptions/Sl\303\245OppArbeidstakerExceptionMapper.java" @@ -0,0 +1,52 @@ +package no.nav.familie.inntektsmelding.server.exceptions; + +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.ext.ExceptionMapper; + +import no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.rest.FantIkkeArbeidstakerException; +import no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.rest.InnsenderHarIkkeTilgangTilArbeidsforholdException; +import no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.rest.SlåOppArbeidstakerException; + +import no.nav.vedtak.log.mdc.MDCOperations; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class SlåOppArbeidstakerExceptionMapper implements ExceptionMapper { + + private static final Logger LOG = LoggerFactory.getLogger(SlåOppArbeidstakerException.class); + + @Override + public Response toResponse(SlåOppArbeidstakerException e) { + switch (e) { + case InnsenderHarIkkeTilgangTilArbeidsforholdException e_ -> { + return harIkkeTilgangTilArbeidsforhold(); + } + case FantIkkeArbeidstakerException e_ -> { + return fantIkkeArbeidstaker(); + } + default -> { + LOG.error("Uventet feil", e); + return Response.serverError() + .entity(new FeilDto(FeilType.GENERELL_FEIL, "Uventet feil", MDCOperations.getCallId())) + .type(MediaType.APPLICATION_JSON) + .build(); + } + } + } + + private static Response harIkkeTilgangTilArbeidsforhold() { + return Response.status(Response.Status.OK) + .entity(new FeilDto(FeilType.INNSENDER_HAR_IKKE_TILGANG_TIL_ARBEIDSFORHOLD_FEIL, "Innsender har ikke tilgang til noen av arbeidsforholdene til arbeidstaker", MDCOperations.getCallId())) + .type(MediaType.APPLICATION_JSON) + .build(); + } + + private static Response fantIkkeArbeidstaker() { + return Response.status(Response.Status.NOT_FOUND) + .entity(new FeilDto(FeilType.FANT_IKKE_ARBEIDSTAKER_FEIL, "Fant ikke arbeidstaker", MDCOperations.getCallId())) + .type(MediaType.APPLICATION_JSON) + .build(); + } +} diff --git a/src/main/resources/application-dev-gcp-k9saksbehandling.properties b/src/main/resources/application-dev-gcp-k9saksbehandling.properties index ff0a233a..1ab4ccab 100644 --- a/src/main/resources/application-dev-gcp-k9saksbehandling.properties +++ b/src/main/resources/application-dev-gcp-k9saksbehandling.properties @@ -1,2 +1,8 @@ context.path=/k9/inntektsmelding inntektsmelding.skjema.lenke=https://arbeidsgiver.intern.dev.nav.no/k9-im-dialog + +dokarkiv.base.url=https://dokarkiv.dev-fss-pub.nais.io/rest/journalpostapi/v1/journalpost +dokarkiv.scopes=api://dev-fss.teamdokumenthandtering.dokarkiv-q1/.default + +aareg.rs.url=http://aareg-services-nais.arbeidsforhold/api/v1/arbeidstaker +aareg.scopes=api://prod-fss.arbeidsforhold.aareg-services-nais/.default diff --git a/src/main/resources/application-prod-gcp-k9saksbehandling.properties b/src/main/resources/application-prod-gcp-k9saksbehandling.properties index bad74c05..a7cc282b 100644 --- a/src/main/resources/application-prod-gcp-k9saksbehandling.properties +++ b/src/main/resources/application-prod-gcp-k9saksbehandling.properties @@ -1,2 +1,5 @@ context.path=/k9/inntektsmelding inntektsmelding.skjema.lenke=https://arbeidsgiver.nav.no/k9-im-dialog + +aareg.rs.url=http://aareg-services-nais.arbeidsforhold/api/v1/arbeidstaker +aareg.scopes=api://prod-fss.arbeidsforhold.aareg-services-nais/.default diff --git a/src/test/java/no/nav/familie/inntektsmelding/imdialog/tjenester/InntektsmeldingTjenesteTest.java b/src/test/java/no/nav/familie/inntektsmelding/imdialog/tjenester/InntektsmeldingTjenesteTest.java index 117a5388..d2bf062d 100644 --- a/src/test/java/no/nav/familie/inntektsmelding/imdialog/tjenester/InntektsmeldingTjenesteTest.java +++ b/src/test/java/no/nav/familie/inntektsmelding/imdialog/tjenester/InntektsmeldingTjenesteTest.java @@ -105,13 +105,13 @@ void skal_lage_dto() { var innsenderNavn = "Ine"; var innsenderEtternavn = "Sender"; var innsenderTelefonnummer = "+4711111111"; - when(personTjeneste.hentPersonFraIdent(PersonIdent.fra(INNMELDER_UID), forespørsel.getYtelseType())).thenReturn( - new PersonInfo(innsenderNavn, null, innsenderEtternavn, new PersonIdent(INNMELDER_UID), null, LocalDate.now(), innsenderTelefonnummer)); var inntekt1 = new Inntektsopplysninger.InntektMåned(BigDecimal.valueOf(52000), YearMonth.of(2024, 3), MånedslønnStatus.BRUKT_I_GJENNOMSNITT); var inntekt2 = new Inntektsopplysninger.InntektMåned(BigDecimal.valueOf(52000), YearMonth.of(2024, 4), MånedslønnStatus.BRUKT_I_GJENNOMSNITT); var inntekt3 = new Inntektsopplysninger.InntektMåned(BigDecimal.valueOf(52000), YearMonth.of(2024, 5), MånedslønnStatus.BRUKT_I_GJENNOMSNITT); when(inntektTjeneste.hentInntekt(forespørsel.getAktørId(), forespørsel.getSkjæringstidspunkt(), LocalDate.now(), forespørsel.getOrganisasjonsnummer())).thenReturn(new Inntektsopplysninger(BigDecimal.valueOf(52000), forespørsel.getOrganisasjonsnummer(), List.of(inntekt1, inntekt2, inntekt3))); + when(personTjeneste.hentInnloggetPerson(forespørsel.getYtelseType())).thenReturn( + new PersonInfo(innsenderNavn, null, innsenderEtternavn, new PersonIdent(INNMELDER_UID), null, LocalDate.now(), innsenderTelefonnummer)); // Act var imDialogDto = inntektsmeldingTjeneste.lagDialogDto(uuid); @@ -160,7 +160,8 @@ void skal_lage_dto() { var innsenderNavn = "Ine"; var innsenderEtternavn = "Sender"; var innsenderTelefonnummer = "+4711111111"; - when(personTjeneste.hentPersonFraIdent(PersonIdent.fra(INNMELDER_UID), forespørsel.getYtelseType())).thenReturn( + + when(personTjeneste.hentInnloggetPerson(forespørsel.getYtelseType())).thenReturn( new PersonInfo(innsenderNavn, null, innsenderEtternavn, new PersonIdent(INNMELDER_UID), null, LocalDate.now(), innsenderTelefonnummer)); when(inntektTjeneste.hentInntekt(forespørsel.getAktørId(), forespørsel.getSkjæringstidspunkt(), LocalDate.now(), forespørsel.getOrganisasjonsnummer())).thenReturn(new Inntektsopplysninger(BigDecimal.valueOf(52000), forespørsel.getOrganisasjonsnummer(), List.of())); diff --git a/src/test/java/no/nav/familie/inntektsmelding/integrasjoner/aareg/AaregRestKlientTest.java b/src/test/java/no/nav/familie/inntektsmelding/integrasjoner/aareg/AaregRestKlientTest.java new file mode 100644 index 00000000..5337ae81 --- /dev/null +++ b/src/test/java/no/nav/familie/inntektsmelding/integrasjoner/aareg/AaregRestKlientTest.java @@ -0,0 +1,119 @@ +package no.nav.familie.inntektsmelding.integrasjoner.aareg; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.time.LocalDate; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import no.nav.familie.inntektsmelding.integrasjoner.aareg.dto.ArbeidsforholdDto; +import no.nav.vedtak.felles.integrasjon.rest.RestClient; +import no.nav.vedtak.felles.integrasjon.rest.RestRequest; + +@ExtendWith(MockitoExtension.class) +class AaregRestKlientTest { + + @Mock + private RestClient restClient; + + private AaregRestKlient aaregRestKlient; + + @BeforeEach + void setUp() { + this.aaregRestKlient = new AaregRestKlient(restClient); + } + + @Test + void skal_hente_arbeidsforhold_for_person() { + var ident = "12345678901"; + var fom = LocalDate.of(2024, 1, 1); + var tom = LocalDate.of(2024, 3, 31); + + var arbeidsforhold = new ArbeidsforholdDto( + "123", + 1234L, + null, + null, + null, + null, + "ordinært"); + + when(restClient.send(any(RestRequest.class), eq(ArbeidsforholdDto[].class))) + .thenReturn(new ArbeidsforholdDto[]{arbeidsforhold}); + + var result = aaregRestKlient.finnArbeidsforholdForArbeidstaker(ident, fom, tom); + + assertThat(result).hasSize(1); + assertThat(result.getFirst()).isEqualTo(arbeidsforhold); + assertTrue(result.getFirst().arbeidsavtaler().isEmpty()); + assertTrue(result.getFirst().permisjonPermitteringer().isEmpty()); + + var requestCaptor = ArgumentCaptor.forClass(RestRequest.class); + verify(restClient).send(requestCaptor.capture(), eq(ArbeidsforholdDto[].class)); + } + + @Test + void skal_kaste_exception_ved_ugyldig_uri() { + // Arrange + var ident = "12345678901"; + var fom = LocalDate.of(2024, 1, 1); + var tom = LocalDate.of(2024, 3, 31); + + when(restClient.send(any(RestRequest.class), eq(ArbeidsforholdDto[].class))) + .thenThrow(new IllegalArgumentException("Invalid URI")); + + // Act & Assert + var exception = assertThrows(IllegalArgumentException.class, + () -> aaregRestKlient.finnArbeidsforholdForArbeidstaker(ident, fom, tom)); + + assertThat(exception.getMessage()) + .isEqualTo("Utviklerfeil syntax-exception for finnArbeidsforholdForArbeidstaker"); + } + + @Test + void skal_returnere_tom_liste_ved_ingen_arbeidsforhold() { + // Arrange + var ident = "12345678901"; + var fom = LocalDate.of(2024, 1, 1); + var tom = LocalDate.of(2024, 3, 31); + + when(restClient.send(any(RestRequest.class), eq(ArbeidsforholdDto[].class))) + .thenReturn(new ArbeidsforholdDto[]{}); + + // Act + var result = aaregRestKlient.finnArbeidsforholdForArbeidstaker(ident, fom, tom); + + // Assert + assertThat(result).isEmpty(); + } + + @Test + void skal_bygge_korrekt_uri_for_arbeidsforhold() { + // Arrange + var fom = LocalDate.of(2024, 1, 1); + var tom = LocalDate.of(2024, 3, 31); + + // Act + var uri = aaregRestKlient.lagUriForForFinnArbeidsforholdForArbeidstaker(fom, tom); + + // Assert + assertThat(uri.getPath()).endsWith("/arbeidsforhold"); + assertThat(uri.getQuery()) + .contains("ansettelsesperiodeFom=2024-01-01") + .contains("ansettelsesperiodeTom=2024-03-31") + .contains("regelverk=A_ORDNINGEN") + .contains("historikk=true") + .contains("sporingsinformasjon=false"); + } +} diff --git a/src/test/java/no/nav/familie/inntektsmelding/pip/AltinnTilgangTjenesteTest.java b/src/test/java/no/nav/familie/inntektsmelding/pip/AltinnTilgangTjenesteTest.java new file mode 100644 index 00000000..37a279f9 --- /dev/null +++ b/src/test/java/no/nav/familie/inntektsmelding/pip/AltinnTilgangTjenesteTest.java @@ -0,0 +1,72 @@ +package no.nav.familie.inntektsmelding.pip; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import no.nav.familie.inntektsmelding.integrasjoner.altinn.AltinnAutoriseringKlient; + +@ExtendWith(MockitoExtension.class) +class AltinnTilgangTjenesteTest { + + @Mock + private AltinnAutoriseringKlient altinnKlient; + + private AltinnTilgangTjeneste altinnTilgangTjeneste; + + @BeforeEach + void setUp() { + altinnTilgangTjeneste = new AltinnTilgangTjeneste(altinnKlient); + } + + @Test + void harTilgangTilBedriften_skal_returnere_true_når_tilgang_finnes() { + String orgNr = "123456789"; + when(altinnKlient.harTilgangTilBedriften(orgNr)).thenReturn(true); + + boolean harTilgang = altinnTilgangTjeneste.harTilgangTilBedriften(orgNr); + + assertTrue(harTilgang); + verify(altinnKlient).harTilgangTilBedriften(orgNr); + } + + @Test + void harTilgangTilBedriften_skal_returnere_false_når_tilgang_ikke_finnes() { + String orgNr = "123456789"; + when(altinnKlient.harTilgangTilBedriften(orgNr)).thenReturn(false); + + boolean harTilgang = altinnTilgangTjeneste.harTilgangTilBedriften(orgNr); + + assertFalse(harTilgang); + verify(altinnKlient).harTilgangTilBedriften(orgNr); + } + + @Test + void manglerTilgangTilBedriften_skal_returnere_true_når_tilgang_ikke_finnes() { + String orgNr = "123456789"; + when(altinnKlient.harTilgangTilBedriften(orgNr)).thenReturn(false); + + boolean manglerTilgang = altinnTilgangTjeneste.manglerTilgangTilBedriften(orgNr); + + assertTrue(manglerTilgang); + verify(altinnKlient).harTilgangTilBedriften(orgNr); + } + + @Test + void manglerTilgangTilBedriften_skal_returnere_false_når_tilgang_finnes() { + String orgNr = "123456789"; + when(altinnKlient.harTilgangTilBedriften(orgNr)).thenReturn(true); + + boolean manglerTilgang = altinnTilgangTjeneste.manglerTilgangTilBedriften(orgNr); + + assertFalse(manglerTilgang); + verify(altinnKlient).harTilgangTilBedriften(orgNr); + } +} diff --git a/src/test/java/no/nav/familie/inntektsmelding/refusjonomsorgsdagerarbeidsgiver/rest/RefusjonOmsorgsdagerArbeidsgiverRestTest.java b/src/test/java/no/nav/familie/inntektsmelding/refusjonomsorgsdagerarbeidsgiver/rest/RefusjonOmsorgsdagerArbeidsgiverRestTest.java new file mode 100644 index 00000000..c5b2ccf6 --- /dev/null +++ b/src/test/java/no/nav/familie/inntektsmelding/refusjonomsorgsdagerarbeidsgiver/rest/RefusjonOmsorgsdagerArbeidsgiverRestTest.java @@ -0,0 +1,77 @@ +package no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.rest; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import jakarta.ws.rs.core.Response; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import no.nav.familie.inntektsmelding.integrasjoner.person.PersonIdent; +import no.nav.familie.inntektsmelding.koder.Ytelsetype; +import no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.rest.dto.InnsenderDto; +import no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.rest.dto.OpplysningerResponseDto; +import no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.rest.dto.SlåOppArbeidstakerDto; +import no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.rest.dto.SlåOppArbeidstakerResponseDto; +import no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.tjenester.ArbeidstakerTjeneste; +import no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.tjenester.OpplysningerTjeneste; + +@ExtendWith(MockitoExtension.class) +class RefusjonOmsorgsdagerArbeidsgiverRestTest { + @Mock + private ArbeidstakerTjeneste arbeidstakerTjenesteMock; + + @Mock + private OpplysningerTjeneste opplysningerTjenesteMock; + + private RefusjonOmsorgsdagerArbeidsgiverRest rest; + @BeforeEach + void set_up() { + rest = new RefusjonOmsorgsdagerArbeidsgiverRest(arbeidstakerTjenesteMock, opplysningerTjenesteMock); + } + + @Test + void slå_opp_arbeidstaker_skal_returnere_ok_response_når_arbeidstaker_finnes() { + var fnr = PersonIdent.fra("12345678910"); + var dto = new SlåOppArbeidstakerDto(fnr, Ytelsetype.OMSORGSPENGER); + var arbeidstakerInfo = new SlåOppArbeidstakerResponseDto("fornavn", "mellomnavn", "etternavn", null); + + when(arbeidstakerTjenesteMock.slåOppArbeidstaker(fnr, Ytelsetype.OMSORGSPENGER)).thenReturn(arbeidstakerInfo); + + Response response = rest.slåOppArbeidstaker(dto); + + assertEquals(Response.Status.OK.getStatusCode(), response.getStatus()); + assertEquals(arbeidstakerInfo, response.getEntity()); + verify(arbeidstakerTjenesteMock).slåOppArbeidstaker(fnr, Ytelsetype.OMSORGSPENGER); + } + + @Test + void slå_opp_arbeidstaker_skal_kaste_not_found_exception_når_arbeidstaker_ikke_finnes() { + var fnr = PersonIdent.fra("12345678910"); + var dto = new SlåOppArbeidstakerDto(fnr, Ytelsetype.OMSORGSPENGER); + + when(arbeidstakerTjenesteMock.slåOppArbeidstaker(fnr, Ytelsetype.OMSORGSPENGER)).thenThrow(FantIkkeArbeidstakerException.class); + + assertThrows(FantIkkeArbeidstakerException.class, () -> rest.slåOppArbeidstaker(dto)); + verify(arbeidstakerTjenesteMock).slåOppArbeidstaker(fnr, Ytelsetype.OMSORGSPENGER); + } + + @Test + void hentOpplysninger_returnerer_som_forventet() { + var dto = new OpplysningerResponseDto(new InnsenderDto("fornavn", "mellomnavn", "etternavn", "telefon")); + + when(opplysningerTjenesteMock.hentOpplysninger()).thenReturn(dto); + + var response = rest.hentOpplysninger(); + + assertEquals(Response.Status.OK.getStatusCode(), response.getStatus()); + assertEquals(dto, response.getEntity()); + verify(opplysningerTjenesteMock).hentOpplysninger(); + } +} diff --git a/src/test/java/no/nav/familie/inntektsmelding/refusjonomsorgsdagerarbeidsgiver/tjenester/ArbeidsforholdTjenesteTest.java b/src/test/java/no/nav/familie/inntektsmelding/refusjonomsorgsdagerarbeidsgiver/tjenester/ArbeidsforholdTjenesteTest.java new file mode 100644 index 00000000..cd528d4c --- /dev/null +++ b/src/test/java/no/nav/familie/inntektsmelding/refusjonomsorgsdagerarbeidsgiver/tjenester/ArbeidsforholdTjenesteTest.java @@ -0,0 +1,143 @@ +package no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.tjenester; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.when; + +import java.time.LocalDate; +import java.util.Collections; +import java.util.List; + +import no.nav.familie.inntektsmelding.integrasjoner.aareg.dto.ArbeidsforholdDto; + +import no.nav.familie.inntektsmelding.integrasjoner.aareg.dto.OpplysningspliktigArbeidsgiverDto; +import no.nav.familie.inntektsmelding.typer.dto.ArbeidsgiverDto; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import no.nav.familie.inntektsmelding.integrasjoner.aareg.AaregRestKlient; +import no.nav.familie.inntektsmelding.integrasjoner.person.PersonIdent; + +@ExtendWith(MockitoExtension.class) +class ArbeidsforholdTjenesteTest { + + @Mock + private AaregRestKlient aaregRestKlient; + + private ArbeidsforholdTjeneste arbeidsforholdTjeneste; + + private static final PersonIdent PERSON_IDENT = PersonIdent.fra("12345678901"); + + @BeforeEach + void setUp() { + arbeidsforholdTjeneste = new ArbeidsforholdTjeneste(aaregRestKlient); + } + + @Test + void skalReturnereTomListeNårAaregReturnerNull() { + when(aaregRestKlient.finnArbeidsforholdForArbeidstaker(eq(PERSON_IDENT.getIdent()), any(LocalDate.class), + any(LocalDate.class))) + .thenReturn(null); + + var resultat = arbeidsforholdTjeneste.hentNåværendeArbeidsforhold(PERSON_IDENT); + + assertThat(resultat).isEmpty(); + } + + @Test + void skalReturnereTomListeNårAaregReturnerTomListe() { + when(aaregRestKlient.finnArbeidsforholdForArbeidstaker(eq(PERSON_IDENT.getIdent()), any(LocalDate.class), + any(LocalDate.class))) + .thenReturn(Collections.emptyList()); + + var resultat = arbeidsforholdTjeneste.hentNåværendeArbeidsforhold(PERSON_IDENT); + + assertThat(resultat).isEmpty(); + } + + @Test + void skalMappeArbeidsforholdKorrekt() { + var arbeidsforhold = new ArbeidsforholdDto( + "abc123", + 123L, + new OpplysningspliktigArbeidsgiverDto( + OpplysningspliktigArbeidsgiverDto.Type.Organisasjon, + "999999999", + "000000000", + "Arbeidsgiver AS" + ), + null, + null, + null, + "type" + ); + + when(aaregRestKlient.finnArbeidsforholdForArbeidstaker(eq(PERSON_IDENT.getIdent()), any(LocalDate.class), + any(LocalDate.class))) + .thenReturn(List.of(arbeidsforhold)); + + var resultat = arbeidsforholdTjeneste.hentNåværendeArbeidsforhold(PERSON_IDENT); + + assertThat(resultat) + .hasSize(1) + .first() + .satisfies(dto -> { + assertThat(dto.underenhetId()).isEqualTo("999999999"); + assertThat(dto.arbeidsforholdId()).isEqualTo("abc123"); + assertThat(dto.arbeidsgiver()).isEqualTo("Arbeidsgiver AS"); + }); + } + + @Test + void skalMappeFlereArbeidsforholdKorrekt() { + var arbeidsforhold1 = new ArbeidsforholdDto( + "arbeidsforhold id 1", + 123L, + new OpplysningspliktigArbeidsgiverDto( + OpplysningspliktigArbeidsgiverDto.Type.Organisasjon, + "000000001", + "100000001", + "Eino Arbeidsgiver AS" + ), + null, + null, + null, + "type" + ); + + var arbeidsforhold2 = new ArbeidsforholdDto( + "arbeidsforhold id 2", + 123L, + new OpplysningspliktigArbeidsgiverDto( + OpplysningspliktigArbeidsgiverDto.Type.Organisasjon, + "000000002", + "100000002", + "André Arbeidsgiver AS" + ), + null, + null, + null, + "type" + ); + + when(aaregRestKlient.finnArbeidsforholdForArbeidstaker(eq(PERSON_IDENT.getIdent()), any(LocalDate.class), + any(LocalDate.class))) + .thenReturn(List.of(arbeidsforhold1, arbeidsforhold2)); + + var resultat = arbeidsforholdTjeneste.hentNåværendeArbeidsforhold(PERSON_IDENT); + + assertThat(resultat).hasSize(2); + + assertThat(resultat.getFirst().underenhetId()).isEqualTo("000000001"); + assertThat(resultat.getFirst().arbeidsforholdId()).isEqualTo("arbeidsforhold id 1"); + assertThat(resultat.getFirst().arbeidsgiver()).isEqualTo("Eino Arbeidsgiver AS"); + assertThat(resultat.get(1).underenhetId()).isEqualTo("000000002"); + assertThat(resultat.get(1).arbeidsforholdId()).isEqualTo("arbeidsforhold id 2"); + assertThat(resultat.get(1).arbeidsgiver()).isEqualTo("André Arbeidsgiver AS"); + } +} diff --git a/src/test/java/no/nav/familie/inntektsmelding/refusjonomsorgsdagerarbeidsgiver/tjenester/ArbeidstakerTjenesteTest.java b/src/test/java/no/nav/familie/inntektsmelding/refusjonomsorgsdagerarbeidsgiver/tjenester/ArbeidstakerTjenesteTest.java new file mode 100644 index 00000000..302ee1fe --- /dev/null +++ b/src/test/java/no/nav/familie/inntektsmelding/refusjonomsorgsdagerarbeidsgiver/tjenester/ArbeidstakerTjenesteTest.java @@ -0,0 +1,135 @@ +package no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.tjenester; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; + +import java.time.LocalDate; +import java.util.Collections; +import java.util.List; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import no.nav.familie.inntektsmelding.integrasjoner.person.PersonIdent; +import no.nav.familie.inntektsmelding.integrasjoner.person.PersonInfo; +import no.nav.familie.inntektsmelding.integrasjoner.person.PersonTjeneste; +import no.nav.familie.inntektsmelding.koder.Ytelsetype; +import no.nav.familie.inntektsmelding.pip.AltinnTilgangTjeneste; +import no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.rest.FantIkkeArbeidstakerException; +import no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.rest.InnsenderHarIkkeTilgangTilArbeidsforholdException; +import no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.rest.dto.ArbeidsforholdDto; +import no.nav.familie.inntektsmelding.typer.entitet.AktørIdEntitet; + + +@ExtendWith(MockitoExtension.class) +public class ArbeidstakerTjenesteTest { + + private static final PersonIdent PERSON_IDENT = PersonIdent.fra("21073926618"); + + @Mock + private PersonTjeneste personTjenesteMock; + + @Mock + private ArbeidsforholdTjeneste arbeidsforholdTjenesteMock; + + @Mock + private AltinnTilgangTjeneste altinnTilgangTjenesteMock; + + private ArbeidstakerTjeneste arbeidstakerTjeneste; + + @BeforeEach + void setUp() { + this.arbeidstakerTjeneste = new ArbeidstakerTjeneste(personTjenesteMock, arbeidsforholdTjenesteMock, altinnTilgangTjenesteMock); + } + + @Test + void skal_kaste_exception_når_person_ikke_finnes() { + when(personTjenesteMock.hentPersonFraIdent(any(), any())).thenReturn(null); + + assertThrows(FantIkkeArbeidstakerException.class, + () -> arbeidstakerTjeneste.slåOppArbeidstaker(PERSON_IDENT, Ytelsetype.OMSORGSPENGER)); + } + + @Test + void skal_returnere_person_uten_arbeidsforhold() { + var personInfo = new PersonInfo( + "Test", + "Mellom", + "Testesen", + PERSON_IDENT, + AktørIdEntitet.dummy(), + LocalDate.now(), + null + ); + + + when(personTjenesteMock.hentPersonFraIdent(any(), any())).thenReturn(personInfo); + when(arbeidsforholdTjenesteMock.hentNåværendeArbeidsforhold(any())).thenReturn(Collections.emptyList()); + + var resultat = arbeidstakerTjeneste.slåOppArbeidstaker(PERSON_IDENT, Ytelsetype.OMSORGSPENGER); + + assertThat(resultat.fornavn()).isEqualTo("Test"); + assertThat(resultat.mellomnavn()).isEqualTo("Mellom"); + assertThat(resultat.etternavn()).isEqualTo("Testesen"); + assertTrue(resultat.arbeidsforhold().isEmpty()); + } + + @Test + void skal_kaste_exception_når_innsender_ikke_har_tilgang() { + var personInfo = new PersonInfo( + "Test", + "Mellom", + "Testesen", + PERSON_IDENT, + AktørIdEntitet.dummy(), + LocalDate.now(), + null + ); + + + when(personTjenesteMock.hentPersonFraIdent(any(), any())).thenReturn(personInfo); + when(arbeidsforholdTjenesteMock.hentNåværendeArbeidsforhold(any())).thenReturn( + List.of(new ArbeidsforholdDto("Arbeidsgiver AS", "123456789", "987654321")) + ); + when(altinnTilgangTjenesteMock.harTilgangTilBedriften(any())).thenReturn(false); + + + assertThrows(InnsenderHarIkkeTilgangTilArbeidsforholdException.class, + () -> arbeidstakerTjeneste.slåOppArbeidstaker(PERSON_IDENT, Ytelsetype.OMSORGSPENGER)); + } + + @Test + void skal_returnere_kun_arbeidsforhold_med_tilgang() { + var personInfo = new PersonInfo( + "Test", + "Mellom", + "Testesen", + PERSON_IDENT, + AktørIdEntitet.dummy(), + LocalDate.now(), + null + ); + + var arbeidsforhold1 = new ArbeidsforholdDto("Arbeidsgiver 1", "123456789", "987654321"); + var arbeidsforhold2 = new ArbeidsforholdDto("Arbeidsgiver 2", "987654321", "123456789"); + + when(personTjenesteMock.hentPersonFraIdent(any(), any())).thenReturn(personInfo); + when(arbeidsforholdTjenesteMock.hentNåværendeArbeidsforhold(any())) + .thenReturn(List.of(arbeidsforhold1, arbeidsforhold2)); + + when(altinnTilgangTjenesteMock.harTilgangTilBedriften("123456789")).thenReturn(false); + when(altinnTilgangTjenesteMock.harTilgangTilBedriften("987654321")).thenReturn(true); + + var resultat = arbeidstakerTjeneste.slåOppArbeidstaker(PERSON_IDENT, Ytelsetype.OMSORGSPENGER); + + assertThat(resultat.arbeidsforhold().size()).isEqualTo(1); + assertThat(resultat.arbeidsforhold().getFirst().arbeidsgiver()).isEqualTo("Arbeidsgiver 2"); + assertThat(resultat.arbeidsforhold().getFirst().underenhetId()).isEqualTo("987654321"); + } +} diff --git a/src/test/java/no/nav/familie/inntektsmelding/refusjonomsorgsdagerarbeidsgiver/tjenester/OpplysningerTjenesteTest.java b/src/test/java/no/nav/familie/inntektsmelding/refusjonomsorgsdagerarbeidsgiver/tjenester/OpplysningerTjenesteTest.java new file mode 100644 index 00000000..10ac132e --- /dev/null +++ b/src/test/java/no/nav/familie/inntektsmelding/refusjonomsorgsdagerarbeidsgiver/tjenester/OpplysningerTjenesteTest.java @@ -0,0 +1,96 @@ +package no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.tjenester; + +import no.nav.familie.inntektsmelding.integrasjoner.person.PersonIdent; +import no.nav.familie.inntektsmelding.integrasjoner.person.PersonInfo; +import no.nav.familie.inntektsmelding.integrasjoner.person.PersonTjeneste; +import no.nav.familie.inntektsmelding.koder.Ytelsetype; +import no.nav.familie.inntektsmelding.typer.entitet.AktørIdEntitet; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class OpplysningerTjenesteTest { + + @Mock + private PersonTjeneste personTjeneste; + + private OpplysningerTjeneste opplysningerTjeneste; + + @BeforeEach + void setUp() { + opplysningerTjeneste = new OpplysningerTjeneste(personTjeneste); + } + + @Test + void skal_returnere_tom_innmsender_når_person_ikke_returneres_fra_pdl() { + when(personTjeneste.hentInnloggetPerson(eq(Ytelsetype.OMSORGSPENGER))).thenReturn(null); + + var resultat = opplysningerTjeneste.hentOpplysninger(); + + assertThat(resultat.innsender()).isNull(); + } + + @Test + void skal_returnere_opplysninger_når_person_finnes() { + var fornavn = "Test"; + var mellomnavn = "Mellom"; + var etternavn = "Testesen"; + var telefonnummer = "+4799999999"; + + var personInfo = new PersonInfo( + fornavn, + mellomnavn, + etternavn, + new PersonIdent("12345678901"), + new AktørIdEntitet("2222222222222"), + null, + telefonnummer + ); + + when(personTjeneste.hentInnloggetPerson(eq(Ytelsetype.OMSORGSPENGER))).thenReturn(personInfo); + + var resultat = opplysningerTjeneste.hentOpplysninger(); + + assertThat(resultat).isNotNull(); + assertThat(resultat.innsender().fornavn()).isEqualTo(fornavn); + assertThat(resultat.innsender().mellomnavn()).isEqualTo(mellomnavn); + assertThat(resultat.innsender().etternavn()).isEqualTo(etternavn); + assertThat(resultat.innsender().telefon()).isEqualTo(telefonnummer); + } + + @Test + void skal_returnere_opplysninger_uten_mellomnavn() { + var fornavn = "Test"; + var etternavn = "Testesen"; + var telefonnummer = "+4799999999"; + + var personInfo = new PersonInfo( + fornavn, + null, + etternavn, + new PersonIdent("12345678901"), + new AktørIdEntitet("2222222222222"), + null, + telefonnummer + ); + + when(personTjeneste.hentInnloggetPerson(eq(Ytelsetype.OMSORGSPENGER))).thenReturn(personInfo); + + var resultat = opplysningerTjeneste.hentOpplysninger(); + + assertThat(resultat).isNotNull(); + assertThat(resultat.innsender().fornavn()).isEqualTo(fornavn); + assertThat(resultat.innsender().mellomnavn()).isNull(); + assertThat(resultat.innsender().etternavn()).isEqualTo(etternavn); + assertThat(resultat.innsender().telefon()).isEqualTo(telefonnummer); + } +} diff --git "a/src/test/java/no/nav/familie/inntektsmelding/server/exceptions/Sl\303\245OppArbeidstakerExceptionMapperTest.java" "b/src/test/java/no/nav/familie/inntektsmelding/server/exceptions/Sl\303\245OppArbeidstakerExceptionMapperTest.java" new file mode 100644 index 00000000..77649286 --- /dev/null +++ "b/src/test/java/no/nav/familie/inntektsmelding/server/exceptions/Sl\303\245OppArbeidstakerExceptionMapperTest.java" @@ -0,0 +1,84 @@ +package no.nav.familie.inntektsmelding.server.exceptions; + +import static org.assertj.core.api.Assertions.assertThat; + +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.MediaType; + +import no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.rest.FantIkkeArbeidstakerException; +import no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.rest.InnsenderHarIkkeTilgangTilArbeidsforholdException; +import no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.rest.SlåOppArbeidstakerException; + +import no.nav.vedtak.log.mdc.MDCOperations; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; + +import ch.qos.logback.classic.Level; +import no.nav.vedtak.log.util.MemoryAppender; + +@ExtendWith(MockitoExtension.class) +class SlåOppArbeidstakerExceptionMapperTest { + + private static MemoryAppender logSniffer; + private final SlåOppArbeidstakerExceptionMapper exceptionMapper = new SlåOppArbeidstakerExceptionMapper(); + + @BeforeEach + void setUp() { + logSniffer = MemoryAppender.sniff(SlåOppArbeidstakerException.class); + MDCOperations.putCallId(); + } + + @Test + void skal_mappe_innsender_har_ikke_tilgang_exception() { + var exception = new InnsenderHarIkkeTilgangTilArbeidsforholdException(); + + try (var response = exceptionMapper.toResponse(exception)) { + assertThat(response.getStatus()).isEqualTo(Response.Status.OK.getStatusCode()); + assertThat(response.getMediaType()).isEqualTo(MediaType.APPLICATION_JSON_TYPE); + + var feilDto = (FeilDto) response.getEntity(); + assertThat(feilDto.type()).isEqualTo(FeilType.INNSENDER_HAR_IKKE_TILGANG_TIL_ARBEIDSFORHOLD_FEIL); + assertThat(feilDto.feilmelding()).isEqualTo("Innsender har ikke tilgang til noen av arbeidsforholdene til arbeidstaker"); + assertThat(feilDto.callId()).isNotNull(); + + assertThat(logSniffer.search("Uventet feil", Level.ERROR)).isEmpty(); + } + } + + @Test + void skal_mappe_fant_ikke_arbeidstaker_exception() { + var exception = new FantIkkeArbeidstakerException(); + + try (var response = exceptionMapper.toResponse(exception)) { + assertThat(response.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode()); + assertThat(response.getMediaType()).isEqualTo(MediaType.APPLICATION_JSON_TYPE); + + var feilDto = (FeilDto) response.getEntity(); + assertThat(feilDto.type()).isEqualTo(FeilType.FANT_IKKE_ARBEIDSTAKER_FEIL); + assertThat(feilDto.feilmelding()).isEqualTo("Fant ikke arbeidstaker"); + assertThat(feilDto.callId()).isNotNull(); + + assertThat(logSniffer.search("Uventet feil", Level.ERROR)).isEmpty(); + } + } + + @Test + void skal_mappe_ukjent_exception() { + var exception = new SlåOppArbeidstakerException("Test ukjent feil"); + + try (var response = exceptionMapper.toResponse(exception)) { + assertThat(response.getStatus()).isEqualTo(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode()); + assertThat(response.getMediaType()).isEqualTo(MediaType.APPLICATION_JSON_TYPE); + + var feilDto = (FeilDto) response.getEntity(); + assertThat(feilDto.type()).isEqualTo(FeilType.GENERELL_FEIL); + assertThat(feilDto.feilmelding()).isEqualTo("Uventet feil"); + assertThat(feilDto.callId()).isNotNull(); + + assertThat(logSniffer.search("Uventet feil", Level.ERROR)).hasSize(1); + } + } +}