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

POFIM-169 Arbeidsgiverinitiert inntektsmelding #347

Merged
merged 5 commits into from
Jan 24, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
Original file line number Diff line number Diff line change
Expand Up @@ -118,8 +118,8 @@ public void setStatus(ForespørselStatus sakStatus) {
this.status = sakStatus;
}

public String getOppgaveId() {
return oppgaveId;
public Optional<String> getOppgaveId() {
return Optional.ofNullable(oppgaveId);
}

void setOppgaveId(String oppgaveId) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
import java.util.UUID;

import no.nav.familie.inntektsmelding.forespørsel.modell.ForespørselEntitet;
import no.nav.familie.inntektsmelding.forvaltning.rest.InntektsmeldingForespørselDto;
import no.nav.familie.inntektsmelding.forespørsel.rest.OppdaterForespørselDto;
import no.nav.familie.inntektsmelding.forvaltning.rest.InntektsmeldingForespørselDto;
import no.nav.familie.inntektsmelding.koder.Ytelsetype;
import no.nav.familie.inntektsmelding.typer.dto.ForespørselResultat;
import no.nav.familie.inntektsmelding.typer.dto.NyBeskjedResultat;
Expand All @@ -25,10 +25,10 @@ public interface ForespørselBehandlingTjeneste {
LocalDate førsteUttaksdato);

ForespørselEntitet ferdigstillForespørsel(UUID foresporselUuid,
AktørIdEntitet aktorId,
OrganisasjonsnummerDto organisasjonsnummerDto,
LocalDate startdato,
LukkeÅrsak årsak);
AktørIdEntitet aktorId,
OrganisasjonsnummerDto organisasjonsnummerDto,
LocalDate startdato,
LukkeÅrsak årsak);

Optional<ForespørselEntitet> hentForespørsel(UUID forespørselUUID);

Expand All @@ -51,6 +51,13 @@ public interface ForespørselBehandlingTjeneste {
LocalDate førsteUttaksdato,
String tilleggsinfo);

UUID opprettForespørselForArbeidsgiverInitiertIm(Ytelsetype ytelsetype,
AktørIdEntitet aktørId,
SaksnummerDto fagsakSaksnummer,
OrganisasjonsnummerDto organisasjonsnummer,
LocalDate skjæringstidspunkt,
LocalDate førsteUttaksdato);

void lukkForespørsel(SaksnummerDto fagsakSaksnummer, OrganisasjonsnummerDto orgnummerDto, LocalDate skjæringstidspunkt);

void slettForespørsel(SaksnummerDto fagsakSaksnummer, OrganisasjonsnummerDto orgnummerDto, LocalDate skjæringstidspunkt);
Expand All @@ -63,9 +70,11 @@ public interface ForespørselBehandlingTjeneste {
void gjenåpneForespørsel(ForespørselEntitet eksisterendeForespørsel);

NyBeskjedResultat opprettNyBeskjedMedEksternVarsling(SaksnummerDto fagsakSaksnummer,
OrganisasjonsnummerDto organisasjonsnummer);
OrganisasjonsnummerDto organisasjonsnummer);

List<InntektsmeldingForespørselDto> finnForespørslerForFagsak(SaksnummerDto fagsakSaksnummer);

List<ForespørselEntitet> finnForespørslerForAktørId(AktørIdEntitet aktørIdEntitet, Ytelsetype ytelsetype);

Optional<ForespørselEntitet> finnOpprinneligForespørsel(AktørIdEntitet aktørId, Ytelsetype ytelseType, LocalDate startdato);
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import java.time.LocalDate;
import java.time.OffsetDateTime;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
Expand Down Expand Up @@ -123,7 +124,9 @@ class ForespørselBehandlingTjenesteImpl implements ForespørselBehandlingTjenes
validerOrganisasjon(foresporsel, organisasjonsnummerDto);
validerStartdato(foresporsel, startdato);

arbeidsgiverNotifikasjon.oppgaveUtført(foresporsel.getOppgaveId(), OffsetDateTime.now());
// Arbeidsgiverinitierte forespørsler har ingen oppgave
foresporsel.getOppgaveId().map(oppgaveId -> arbeidsgiverNotifikasjon.oppgaveUtført(oppgaveId, OffsetDateTime.now()));

arbeidsgiverNotifikasjon.ferdigstillSak(foresporsel.getArbeidsgiverNotifikasjonSakId()); // Oppdaterer status i arbeidsgiver-notifikasjon
arbeidsgiverNotifikasjon.oppdaterSakTilleggsinformasjon(foresporsel.getArbeidsgiverNotifikasjonSakId(),
ForespørselTekster.lagTilleggsInformasjon(årsak));
Expand Down Expand Up @@ -254,7 +257,7 @@ class ForespørselBehandlingTjenesteImpl implements ForespørselBehandlingTjenes
@Override
public void settForespørselTilUtgått(ForespørselEntitet eksisterendeForespørsel, boolean skalOppdatereArbeidsgiverNotifikasjon) {
if (skalOppdatereArbeidsgiverNotifikasjon) {
arbeidsgiverNotifikasjon.oppgaveUtgått(eksisterendeForespørsel.getOppgaveId(), OffsetDateTime.now());
eksisterendeForespørsel.getOppgaveId().map( oppgaveId -> arbeidsgiverNotifikasjon.oppgaveUtgått(oppgaveId, OffsetDateTime.now()));
arbeidsgiverNotifikasjon.ferdigstillSak(eksisterendeForespørsel.getArbeidsgiverNotifikasjonSakId()); // Oppdaterer status i arbeidsgiver-notifikasjon
}

Expand Down Expand Up @@ -343,6 +346,40 @@ class ForespørselBehandlingTjenesteImpl implements ForespørselBehandlingTjenes
forespørselTjeneste.setOppgaveId(uuid, oppgaveId);
}

public UUID opprettForespørselForArbeidsgiverInitiertIm(Ytelsetype ytelsetype,
AktørIdEntitet aktørId,
SaksnummerDto fagsakSaksnummer,
OrganisasjonsnummerDto organisasjonsnummer,
LocalDate skjæringstidspunkt,
LocalDate førsteUttaksdato) {
var msg = String.format("Oppretter forespørsel for arbeidsgiverinitiert, orgnr: %s, stp: %s, saksnr: %s, ytelse: %s",
organisasjonsnummer,
skjæringstidspunkt,
fagsakSaksnummer.saksnr(),
ytelsetype);
LOG.info(msg);

var uuid = forespørselTjeneste.opprettForespørsel(skjæringstidspunkt,
ytelsetype,
aktørId,
organisasjonsnummer,
fagsakSaksnummer,
førsteUttaksdato);

var person = personTjeneste.hentPersonInfoFraAktørId(aktørId, ytelsetype);
var merkelapp = ForespørselTekster.finnMerkelapp(ytelsetype);
var skjemaUri = URI.create(inntektsmeldingSkjemaLenke + "/" + uuid);
var fagerSakId = arbeidsgiverNotifikasjon.opprettSak(uuid.toString(),
merkelapp,
organisasjonsnummer.orgnr(),
ForespørselTekster.lagSaksTittel(person.mapFulltNavn(), person.fødselsdato()),
skjemaUri);

forespørselTjeneste.setArbeidsgiverNotifikasjonSakId(uuid, fagerSakId);

return uuid;
}

@Override
public NyBeskjedResultat opprettNyBeskjedMedEksternVarsling(SaksnummerDto fagsakSaksnummer,
OrganisasjonsnummerDto organisasjonsnummer) {
Expand Down Expand Up @@ -455,6 +492,13 @@ public NyBeskjedResultat opprettNyBeskjedMedEksternVarsling(SaksnummerDto fagsak
return forespørselTjeneste.finnForespørslerForAktørid(aktørIdEntitet, ytelsetype);
}

@Override
public Optional<ForespørselEntitet> finnOpprinneligForespørsel(AktørIdEntitet aktørId, Ytelsetype ytelseType, LocalDate startdato) {
return finnForespørslerForAktørId(aktørId, ytelseType).stream()
.filter(f -> f.getFørsteUttaksdato().orElse(f.getSkjæringstidspunkt()).isBefore(startdato))
.max(Comparator.comparing(f -> f.getFørsteUttaksdato().orElse(f.getSkjæringstidspunkt())));
}

private void validerStartdato(ForespørselEntitet forespørsel, LocalDate startdato) {
var datoÅMatcheMot = forespørsel.getFørsteUttaksdato().orElseGet(forespørsel::getSkjæringstidspunkt);
if (!datoÅMatcheMot.equals(startdato)) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package no.nav.familie.inntektsmelding.forespørsel.tjenester;

public enum LukkeÅrsak {
EKSTERN_INNSENDING, ORDINÆR_INNSENDING, UTGÅTT
EKSTERN_INNSENDING,
ORDINÆR_INNSENDING,
UTGÅTT
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;

import no.nav.familie.inntektsmelding.typer.dto.OrganisasjonsnummerDto;

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

Expand Down Expand Up @@ -81,11 +83,16 @@ public Response hentInntektsmeldingerForOppgave(@NotNull @Valid @QueryParam("for
@Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
@Tilgangskontrollert
public Response sendInntektsmelding(@NotNull @Valid SendInntektsmeldingRequestDto sendInntektsmeldingRequestDto) {
tilgang.sjekkAtArbeidsgiverHarTilgangTilBedrift(sendInntektsmeldingRequestDto.foresporselUuid());

LOG.info("Mottok inntektsmelding for forespørsel {}", sendInntektsmeldingRequestDto.foresporselUuid());
var imResponse = inntektsmeldingTjeneste.mottaInntektsmelding(sendInntektsmeldingRequestDto);
return Response.ok(imResponse).build();
if (sendInntektsmeldingRequestDto.foresporselUuid() == null) {
tilgang.sjekkAtArbeidsgiverHarTilgangTilBedrift(new OrganisasjonsnummerDto(sendInntektsmeldingRequestDto.arbeidsgiverIdent().ident()));
LOG.info("Mottok arbeisgiverinitert inntektsmelding for aktørId {}", sendInntektsmeldingRequestDto.aktorId());
return Response.ok(inntektsmeldingTjeneste.mottaArbeidsgiverInitiertInntektsmelding(sendInntektsmeldingRequestDto)).build();
} else {
tilgang.sjekkAtArbeidsgiverHarTilgangTilBedrift(sendInntektsmeldingRequestDto.foresporselUuid());
LOG.info("Mottok inntektsmelding for forespørsel {}", sendInntektsmeldingRequestDto.foresporselUuid());
return Response.ok(inntektsmeldingTjeneste.mottaInntektsmelding(sendInntektsmeldingRequestDto)).build();
}
}

@GET
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
import no.nav.familie.inntektsmelding.typer.dto.NaturalytelsetypeDto;
import no.nav.familie.inntektsmelding.typer.dto.YtelseTypeDto;

public record SendInntektsmeldingRequestDto(@NotNull @Valid UUID foresporselUuid,
public record SendInntektsmeldingRequestDto(@Valid UUID foresporselUuid,
@NotNull @Valid AktørIdDto aktorId,
@NotNull @Valid YtelseTypeDto ytelse,
@NotNull @Valid ArbeidsgiverDto arbeidsgiverIdent,
Expand Down Expand Up @@ -49,6 +49,5 @@ public record EndringsårsakerRequestDto(@NotNull @Valid EndringsårsakDto årsa

public record KontaktpersonRequestDto(@Size(max = 100) @NotNull String navn, @NotNull @Size(max = 100) String telefonnummer) {
}

}

Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,6 @@
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;

import no.nav.familie.inntektsmelding.imdialog.rest.SlåOppArbeidstakerResponseDto;

import no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.tjenester.ArbeidstakerTjeneste;

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

Expand All @@ -24,6 +20,7 @@
import no.nav.familie.inntektsmelding.imdialog.rest.InntektsmeldingDialogDto;
import no.nav.familie.inntektsmelding.imdialog.rest.InntektsmeldingResponseDto;
import no.nav.familie.inntektsmelding.imdialog.rest.SendInntektsmeldingRequestDto;
import no.nav.familie.inntektsmelding.imdialog.rest.SlåOppArbeidstakerResponseDto;
import no.nav.familie.inntektsmelding.imdialog.task.SendTilJoarkTask;
import no.nav.familie.inntektsmelding.integrasjoner.dokgen.FpDokgenTjeneste;
import no.nav.familie.inntektsmelding.integrasjoner.inntektskomponent.InntektTjeneste;
Expand All @@ -33,8 +30,10 @@
import no.nav.familie.inntektsmelding.koder.ForespørselStatus;
import no.nav.familie.inntektsmelding.koder.Ytelsetype;
import no.nav.familie.inntektsmelding.metrikker.MetrikkerTjeneste;
import no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.tjenester.ArbeidstakerTjeneste;
import no.nav.familie.inntektsmelding.typer.dto.KodeverkMapper;
import no.nav.familie.inntektsmelding.typer.dto.OrganisasjonsnummerDto;
import no.nav.familie.inntektsmelding.typer.dto.SaksnummerDto;
import no.nav.familie.inntektsmelding.typer.entitet.AktørIdEntitet;
import no.nav.vedtak.felles.prosesstask.api.ProsessTaskData;
import no.nav.vedtak.felles.prosesstask.api.ProsessTaskTjeneste;
Expand Down Expand Up @@ -99,6 +98,39 @@ public InntektsmeldingResponseDto mottaInntektsmelding(SendInntektsmeldingReques
return InntektsmeldingMapper.mapFraEntitet(imEntitet, mottattInntektsmeldingDto.foresporselUuid());
}

public InntektsmeldingResponseDto mottaArbeidsgiverInitiertInntektsmelding(SendInntektsmeldingRequestDto sendInntektsmeldingRequestDto) {
var imEnitet = InntektsmeldingMapper.mapTilEntitet(sendInntektsmeldingRequestDto);
var aktørId = new AktørIdEntitet(sendInntektsmeldingRequestDto.aktorId().id());
var ytelseType = KodeverkMapper.mapYtelsetype(sendInntektsmeldingRequestDto.ytelse());
var organisasjonsnummer = new OrganisasjonsnummerDto(sendInntektsmeldingRequestDto.arbeidsgiverIdent().ident());


var opprinneligForespørsel = forespørselBehandlingTjeneste.finnOpprinneligForespørsel(aktørId, ytelseType, sendInntektsmeldingRequestDto.startdato())
.orElseThrow(() -> new IllegalStateException("Ingen forespørsler funnet for aktørId ved arbeidsgiverintiert innntektsmelding: " + aktørId));

var forespørselUuid = forespørselBehandlingTjeneste.opprettForespørselForArbeidsgiverInitiertIm(ytelseType,
aktørId,
new SaksnummerDto(opprinneligForespørsel.getFagsystemSaksnummer()),
organisasjonsnummer,
opprinneligForespørsel.getSkjæringstidspunkt(),
sendInntektsmeldingRequestDto.startdato());

var forespørselEnitet = forespørselBehandlingTjeneste.hentForespørsel(forespørselUuid)
.orElseThrow(() -> new IllegalStateException("Mangler forespørsel entitet"));

var imId = lagreOgLagJournalførTask(imEnitet, forespørselEnitet);

forespørselBehandlingTjeneste.ferdigstillForespørsel(forespørselUuid, aktørId, organisasjonsnummer,
sendInntektsmeldingRequestDto.startdato(), LukkeÅrsak.ORDINÆR_INNSENDING);

var imEntitet = inntektsmeldingRepository.hentInntektsmelding(imId);

// Metrikker i prometheus
MetrikkerTjeneste.logginnsendtArbeidsgiverinitiertIm(imEntitet);

return InntektsmeldingMapper.mapFraEntitet(imEntitet, forespørselUuid);
}

private Long lagreOgLagJournalførTask(InntektsmeldingEntitet entitet, ForespørselEntitet forespørsel) {
LOG.info("Lagrer inntektsmelding for forespørsel {}", forespørsel.getUuid());
var imId = inntektsmeldingRepository.lagreInntektsmelding(entitet);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@ private MetrikkerTjeneste() {
// Hvor mange dager er det mellom opprettelse og løsning av oppgaven når inntektsmelding sendes inn via vårt eget skjema
private static final DistributionSummary OPPGAVE_VARIGHET_INTERN_TELLER = Metrics.summary(APP_NAME + ".oppgaver.varighet.intern");

// Måler innsending av arbeidsgiverinitiert inntektsmelding
private static final String ARBEIDSGIVERINITIERT_INNSENDING = APP_NAME + "arbeidsgiverinitiert.innsending";

// Måler opprettelse av oppgaver per ytelse
private static final String COUNTER_FORESPØRRSEL = APP_NAME + ".oppgaver.opprettet";

Expand Down Expand Up @@ -129,4 +132,15 @@ private static void loggFeil(Exception e, String metodekall) {
String msg = String.format("FPINNTEKTSMELDING_METRIKKER_1: Feil ved generering av metrikker i metode %s, fikk feilmelding %s", metodekall, e);
LOG.warn(msg);
}

public static void logginnsendtArbeidsgiverinitiertIm(InntektsmeldingEntitet imEntitet) {

try {
var tags = new ArrayList<Tag>();
tags.add(new ImmutableTag(TAG_YTELSE, imEntitet.getYtelsetype().name()));
Metrics.counter(ARBEIDSGIVERINITIERT_INNSENDING, tags).increment();
} catch (Exception e) {
loggFeil(e, "logginnsendtArbeidsgiverinitiertIm");
}
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package no.nav.familie.inntektsmelding.server.tilgangsstyring;

import no.nav.familie.inntektsmelding.typer.dto.OrganisasjonsnummerDto;

import java.util.UUID;

public interface Tilgang {
Expand All @@ -11,7 +13,13 @@ public interface Tilgang {
* @throws no.nav.vedtak.exception.ManglerTilgangException om tilgangen ikke er gitt.
*/
void sjekkAtArbeidsgiverHarTilgangTilBedrift(UUID forespørselUuid);

/**
* Her sjekkes tilgang i Altinn gitt orgnummer for å se om brukeren som initierte kallet,
* har tilgang til den aktuelle bedriften.
* @param organisasjonsnummer - organisasjonsnummer som det forsøkes å sende inntektsmelding for.
* @throws no.nav.vedtak.exception.ManglerTilgangException om tilgangen ikke er gitt.
*/
void sjekkAtArbeidsgiverHarTilgangTilBedrift(OrganisasjonsnummerDto organisasjonsnummer);
/**
* Her hentes organisasjonsnummer knyttet til en tidligere innsendt inntektsmelding (fra PIP tjenesten),
* og deretter sjekkes det i Altinn om brukeren som initierte kallet, har tilgang til den aktuelle bedriften.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,13 @@ public void sjekkAtArbeidsgiverHarTilgangTilBedrift(UUID forespørselUuid) {
sjekkBorgersAltinnTilgangTilOrganisasjon(orgNrSet);
}

@Override
public void sjekkAtArbeidsgiverHarTilgangTilBedrift(OrganisasjonsnummerDto organisasjonsnummer) {
sjekkErBorger();

sjekkBorgersAltinnTilgangTilOrganisasjon(Set.of(organisasjonsnummer.orgnr()));
}

@Override
public void sjekkAtArbeidsgiverHarTilgangTilBedrift(long inntektsmeldingId) {
sjekkErBorger();
Expand Down
Loading
Loading