From 219351c49b04bc0dfdd8c4097b3657d39741c98c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Golberg?= Date: Thu, 7 Nov 2024 09:11:32 +0100 Subject: [PATCH 01/85] In transaction rundt hele enkeltSak (#6250) --- .../AarligInntektsjusteringJobbService.kt | 149 +++++++++--------- 1 file changed, 74 insertions(+), 75 deletions(-) diff --git a/apps/etterlatte-behandling/src/main/kotlin/inntektsjustering/AarligInntektsjusteringJobbService.kt b/apps/etterlatte-behandling/src/main/kotlin/inntektsjustering/AarligInntektsjusteringJobbService.kt index ddfdfc5db02..f7d8cbca5c3 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/inntektsjustering/AarligInntektsjusteringJobbService.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/inntektsjustering/AarligInntektsjusteringJobbService.kt @@ -1,5 +1,6 @@ package no.nav.etterlatte.inntektsjustering +import kotlinx.coroutines.runBlocking import no.nav.etterlatte.behandling.BehandlingService import no.nav.etterlatte.behandling.GrunnlagService import no.nav.etterlatte.behandling.domain.Behandling @@ -13,7 +14,6 @@ import no.nav.etterlatte.inTransaction import no.nav.etterlatte.kafka.JsonMessage import no.nav.etterlatte.kafka.KafkaProdusent import no.nav.etterlatte.libs.common.Vedtaksloesning -import no.nav.etterlatte.libs.common.behandling.Persongalleri import no.nav.etterlatte.libs.common.behandling.Prosesstype import no.nav.etterlatte.libs.common.behandling.Revurderingaarsak import no.nav.etterlatte.libs.common.behandling.SakType @@ -61,53 +61,47 @@ class AarligInntektsjusteringJobbService( const val BEGRUNNELSE_AUTOMATISK_JOBB = "Årlig inntektsjustering." // TODO må avklares med fag } - suspend fun startAarligInntektsjustering(request: AarligInntektsjusteringRequest) { + fun startAarligInntektsjustering(request: AarligInntektsjusteringRequest) { request.saker.forEach { sakId -> startEnkeltSak(request.kjoering, request.loependeFom, sakId) } } - private suspend fun startEnkeltSak( + private fun startEnkeltSak( kjoering: String, loependeFom: YearMonth, sakId: SakId, - ) { + ) = inTransaction { logger.info("Årlig inntektsjusteringsjobb $kjoering for $sakId") try { val vedtak = - vedtakKlient.sakHarLopendeVedtakPaaDato(sakId, loependeFom.atDay(1), HardkodaSystembruker.omregning) + runBlocking { + vedtakKlient.sakHarLopendeVedtakPaaDato(sakId, loependeFom.atDay(1), HardkodaSystembruker.omregning) + } val forrigeBehandling = hentForrigeBehandling(sakId) val avkortingSjekk = - beregningKlient.aarligInntektsjusteringSjekk( - sakId, - loependeFom.year, - forrigeBehandling.id, - HardkodaSystembruker.omregning, - ) + runBlocking { + beregningKlient.aarligInntektsjusteringSjekk( + sakId, + loependeFom.year, + forrigeBehandling.id, + HardkodaSystembruker.omregning, + ) + } val skalIkkeGjennomfoereJobb = skalIkkeGjennomfoereJobb(avkortingSjekk, vedtak, loependeFom) if (skalIkkeGjennomfoereJobb != null) { oppdaterKjoering(kjoering, KjoeringStatus.FERDIGSTILT, sakId, skalIkkeGjennomfoereJobb) - return + return@inTransaction } val aarsakTilManuell = kanIkkeKjoereAutomatisk(sakId, forrigeBehandling.id, vedtak, avkortingSjekk) if (aarsakTilManuell != null) { - val persongalleri = grunnlagService.hentPersongalleri(forrigeBehandling.id) - inTransaction { - opprettRevurderingOgOppgave(sakId, loependeFom, forrigeBehandling, persongalleri) - omregningService.oppdaterKjoering( - KjoeringRequest( - kjoering, - KjoeringStatus.TIL_MANUELL, - sakId, - aarsakTilManuell.name, - ), - ) - } - return + opprettRevurderingOgOppgave(sakId, loependeFom, forrigeBehandling) + oppdaterKjoering(kjoering, KjoeringStatus.TIL_MANUELL, sakId, aarsakTilManuell.name) + return@inTransaction } oppdaterKjoering(kjoering, KjoeringStatus.KLAR_FOR_OMREGNING, sakId) publiserKlarForOmregning(sakId, loependeFom) @@ -122,7 +116,7 @@ class AarligInntektsjusteringJobbService( } } - private suspend fun kanIkkeKjoereAutomatisk( + private fun kanIkkeKjoereAutomatisk( sakId: SakId, sisteBehandlingId: UUID, vedtak: LoependeYtelseDTO, @@ -144,13 +138,15 @@ class AarligInntektsjusteringJobbService( } val identErUendretPdl = - hentPdlPersonident(sak).let { sisteIdentifikatorPdl -> - val sisteIdent = - when (sisteIdentifikatorPdl) { - is PdlIdentifikator.FolkeregisterIdent -> sisteIdentifikatorPdl.folkeregisterident.value - is PdlIdentifikator.Npid -> sisteIdentifikatorPdl.npid.ident - } - sak.ident == sisteIdent + runBlocking { + hentPdlPersonident(sak).let { sisteIdentifikatorPdl -> + val sisteIdent = + when (sisteIdentifikatorPdl) { + is PdlIdentifikator.FolkeregisterIdent -> sisteIdentifikatorPdl.folkeregisterident.value + is PdlIdentifikator.Npid -> sisteIdentifikatorPdl.npid.ident + } + sak.ident == sisteIdent + } } if (!identErUendretPdl) { return AarligInntektsjusteringAarsakManuell.UTDATERT_IDENT @@ -184,27 +180,32 @@ class AarligInntektsjusteringJobbService( sakId: SakId, loependeFom: YearMonth, forrigeBehandling: Behandling, - persongalleri: Persongalleri, - ) = revurderingService - .opprettRevurdering( - sakId = sakId, - persongalleri = persongalleri, - forrigeBehandling = forrigeBehandling.id, - mottattDato = null, - prosessType = Prosesstype.MANUELL, - kilde = Vedtaksloesning.GJENNY, - revurderingAarsak = Revurderingaarsak.AARLIG_INNTEKTSJUSTERING, - virkningstidspunkt = loependeFom.atDay(1).tilVirkningstidspunkt(BEGRUNNELSE_AUTOMATISK_JOBB), - utlandstilknytning = forrigeBehandling.utlandstilknytning, - boddEllerArbeidetUtlandet = forrigeBehandling.boddEllerArbeidetUtlandet, - begrunnelse = BEGRUNNELSE_AUTOMATISK_JOBB, - saksbehandlerIdent = Fagsaksystem.EY.navn, - frist = Tidspunkt.ofNorskTidssone(loependeFom.minusMonths(1).atDay(1), LocalTime.NOON), - opphoerFraOgMed = forrigeBehandling.opphoerFraOgMed, - ).oppdater() - .also { - revurderingService.fjernSaksbehandlerFraRevurderingsOppgave(it) - } + ) { + val persongalleri = + runBlocking { + grunnlagService.hentPersongalleri(forrigeBehandling.id) + } + revurderingService + .opprettRevurdering( + sakId = sakId, + persongalleri = persongalleri, + forrigeBehandling = forrigeBehandling.id, + mottattDato = null, + prosessType = Prosesstype.MANUELL, + kilde = Vedtaksloesning.GJENNY, + revurderingAarsak = Revurderingaarsak.AARLIG_INNTEKTSJUSTERING, + virkningstidspunkt = loependeFom.atDay(1).tilVirkningstidspunkt(BEGRUNNELSE_AUTOMATISK_JOBB), + utlandstilknytning = forrigeBehandling.utlandstilknytning, + boddEllerArbeidetUtlandet = forrigeBehandling.boddEllerArbeidetUtlandet, + begrunnelse = BEGRUNNELSE_AUTOMATISK_JOBB, + saksbehandlerIdent = Fagsaksystem.EY.navn, + frist = Tidspunkt.ofNorskTidssone(loependeFom.minusMonths(1).atDay(1), LocalTime.NOON), + opphoerFraOgMed = forrigeBehandling.opphoerFraOgMed, + ).oppdater() + .also { + revurderingService.fjernSaksbehandlerFraRevurderingsOppgave(it) + } + } private fun publiserKlarForOmregning( sakId: SakId, @@ -257,23 +258,19 @@ class AarligInntektsjusteringJobbService( sakId: SakId, begrunnelse: String? = null, ) { - inTransaction { - omregningService.oppdaterKjoering( - KjoeringRequest( - kjoering, - status, - sakId, - begrunnelse, - ), - ) - } + omregningService.oppdaterKjoering( + KjoeringRequest( + kjoering, + status, + sakId, + begrunnelse, + ), + ) } private fun hentForrigeBehandling(sakId: SakId) = - inTransaction { - behandlingService.hentSisteIverksatte(sakId) - ?: throw InternfeilException("Fant ikke iverksatt behandling sak=$sakId") - } + behandlingService.hentSisteIverksatte(sakId) + ?: throw InternfeilException("Fant ikke iverksatt behandling sak=$sakId") private fun hentPdlPersonopplysning(sak: Sak) = pdlTjenesterKlient.hentPdlModellFlereSaktyper(sak.ident, PersonRolle.INNSENDER, SakType.OMSTILLINGSSTOENAD) @@ -282,16 +279,18 @@ class AarligInntektsjusteringJobbService( pdlTjenesterKlient.hentPdlIdentifikator(sak.ident) ?: throw InternfeilException("Fant ikke ident fra PDL for sak ${sak.id}") - private suspend fun hentOpplysningerGjenny( + private fun hentOpplysningerGjenny( sak: Sak, sisteBehandlingId: UUID, ): Personopplysning = - grunnlagService - .hentPersonopplysninger( - sisteBehandlingId, - sak.sakType, - HardkodaSystembruker.omregning, - ).innsender ?: throw InternfeilException("Fant ikke opplysninger for behandling=$sisteBehandlingId") + runBlocking { + grunnlagService + .hentPersonopplysninger( + sisteBehandlingId, + sak.sakType, + HardkodaSystembruker.omregning, + ).innsender ?: throw InternfeilException("Fant ikke opplysninger for behandling=$sisteBehandlingId") + } } enum class AarligInntektsjusteringAarsakManuell { From 232a7a910ced1f006eeb547672bc016a83c82159 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Oliver=20S=C3=B8berg?= <82504565+sebassonav@users.noreply.github.com> Date: Thu, 7 Nov 2024 10:32:02 +0100 Subject: [PATCH 02/85] Oppdatering av state i aktivitetsplikt + endring av hvor brev opprettes (#6234) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * wip på ferdigstilling aktivitetsplikt * Oppdatering av state i aktivitetsplikt oppgave * Fjerner rester av fetchOppgave * Fiks på visning av ferdigstilling * Rename fra MedOppdatering til Provider * Rydder i oppsummeringen for ferdigstilling av oppgave * Forenkler litt markup * Oppdatering av state når vi ferdigstiller brev og oppgave * Fikser endring i props * Bryter opp props litt * Ikke tilby å endre aktiviteter hvis oppgaven ikke kan redigeres * Oppdaterer brev-status når vi oppdaterer oppgave-status --------- Co-authored-by: Øyvind Haarberg --- .../aktivitetsplikt/AktivitetspliktRoute.kt | 1 + .../aktivitetsplikt/OppgaveVurderingRoute.tsx | 20 ++- .../brev/AktivitetspliktBrev.tsx | 168 ++++++++---------- .../aktivitetsplikt/brev/UtenBrevVisning.tsx | 62 ++++--- .../brev/VurderingInfoBrevOgOppsummering.tsx | 73 ++------ .../vurdering/VurderAktivitet.tsx | 80 ++++++--- .../aktivitetsplikt/vurdering/Vurderinger.tsx | 29 +-- .../aktivitetsgrad/AktivitetsgradIOppgave.tsx | 49 ++--- .../aktivitetsgrad/LeggTilNyVurdering.tsx | 4 +- .../vurdering/unntak/LeggTilUnntak.tsx | 4 +- .../vurdering/unntak/UnntakIOppgave.tsx | 6 +- ...ktivitetsplikt.tsx => ValgForInfobrev.tsx} | 98 +++++----- .../client/src/shared/api/aktivitetsplikt.ts | 4 +- 13 files changed, 288 insertions(+), 310 deletions(-) rename apps/etterlatte-saksbehandling-ui/client/src/components/person/aktivitet/vurderingAvAktivitetsplikt/{BrevAktivitetsplikt.tsx => ValgForInfobrev.tsx} (67%) diff --git a/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktRoute.kt b/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktRoute.kt index 3701d4e23bd..cc5ad275f19 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktRoute.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktRoute.kt @@ -264,6 +264,7 @@ internal fun Route.aktivitetspliktRoutes( } post("ferdigstillbrev-og-oppgave") { inTransaction { aktivitetspliktOppgaveService.ferdigstillBrevOgOppgave(oppgaveId, brukerTokenInfo) } + call.respond(HttpStatusCode.NoContent) } } diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/OppgaveVurderingRoute.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/OppgaveVurderingRoute.tsx index caa9b1b9983..a0fe68021a5 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/OppgaveVurderingRoute.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/OppgaveVurderingRoute.tsx @@ -11,8 +11,12 @@ import { VurderAktivitet } from '~components/aktivitetsplikt/vurdering/VurderAkt import { VurderingInfoBrevOgOppsummering } from '~components/aktivitetsplikt/brev/VurderingInfoBrevOgOppsummering' import { AktivitetspliktOppgaveVurdering } from '~shared/types/Aktivitetsplikt' -const AktivitetspliktOppgaveContext = createContext( - {} as AktivitetspliktOppgaveVurdering +interface AktivitetspliktOppgaveVurderingProvider extends AktivitetspliktOppgaveVurdering { + oppdater: () => void +} + +const AktivitetspliktOppgaveContext = createContext( + {} as AktivitetspliktOppgaveVurderingProvider ) export function OppgaveVurderingRoute(props: { @@ -20,19 +24,17 @@ export function OppgaveVurderingRoute(props: { fetchOppgave: () => void }) { const { vurderingOgOppgave, fetchOppgave } = props + return ( - + - } /> - } - /> + } /> + } /> } /> @@ -42,7 +44,7 @@ export function OppgaveVurderingRoute(props: { ) } -export const useAktivitetspliktOppgaveVurdering = (): AktivitetspliktOppgaveVurdering => { +export const useAktivitetspliktOppgaveVurdering = (): AktivitetspliktOppgaveVurderingProvider => { try { const oppgave = useContext(AktivitetspliktOppgaveContext) if (!oppgave) { diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/brev/AktivitetspliktBrev.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/brev/AktivitetspliktBrev.tsx index 04e639a6f9d..6bd5a55f3db 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/brev/AktivitetspliktBrev.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/brev/AktivitetspliktBrev.tsx @@ -1,14 +1,13 @@ +import { Box, Button, Heading, HStack, VStack } from '@navikt/ds-react' import React, { useEffect, useState } from 'react' -import { useNavigate } from 'react-router-dom' import { useApiCall } from '~shared/hooks/useApiCall' import { hentBrev } from '~shared/api/brev' -import { ferdigstillJournalfoerOgDistribuerbrev } from '~shared/api/aktivitetsplikt' +import { ferdigstillBrevOgOppgaveAktivitetsplikt } from '~shared/api/aktivitetsplikt' import { BrevProsessType, BrevStatus } from '~shared/types/Brev' -import { isFailure, mapApiResult } from '~shared/api/apiUtils' +import { isFailure, mapResult, Result } from '~shared/api/apiUtils' import Spinner from '~shared/Spinner' import { ApiErrorAlert } from '~ErrorBoundary' import { Column, GridContainer } from '~shared/styled' -import { Box, Button, HStack, VStack } from '@navikt/ds-react' import BrevTittel from '~components/person/brev/tittel/BrevTittel' import BrevSpraak from '~components/person/brev/spraak/BrevSpraak' import { BrevMottakerWrapper } from '~components/person/brev/mottaker/BrevMottakerWrapper' @@ -17,40 +16,22 @@ import RedigerbartBrev from '~components/behandling/brev/RedigerbartBrev' import { isPending } from '@reduxjs/toolkit' import { AktivitetspliktSteg } from '~components/aktivitetsplikt/stegmeny/AktivitetspliktStegmeny' import { handlinger } from '~components/behandling/handlinger/typer' -import styled from 'styled-components' - -const PanelWrapper = styled.div` - height: 100%; - width: 100%; - max-height: 955px; -` +import { useNavigate } from 'react-router-dom' +import { useAktivitetspliktOppgaveVurdering } from '~components/aktivitetsplikt/OppgaveVurderingRoute' -export function Aktivitetspliktbrev({ - brevId, - sakId, - oppgaveid, -}: { - brevId: number - sakId: number - oppgaveid: string -}) { +export function Aktivitetspliktbrev({ brevId }: { brevId: number }) { + const { oppgave, oppdater } = useAktivitetspliktOppgaveVurdering() const [kanRedigeres, setKanRedigeres] = useState(false) - const [tilbakestilt, setTilbakestilt] = useState(false) - const navigate = useNavigate() const [brevStatus, apiHentBrev] = useApiCall(hentBrev) - const [status, ferdigstillbrevApi] = useApiCall(ferdigstillJournalfoerOgDistribuerbrev) + const [status, ferdigstillOppgaveOgBrev] = useApiCall(ferdigstillBrevOgOppgaveAktivitetsplikt) - const ferdigstillBrev = () => { - ferdigstillbrevApi( - { oppgaveId: oppgaveid }, - () => hentBrevOgSetStatus(), - () => hentBrevOgSetStatus() - ) + const ferdigstill = () => { + ferdigstillOppgaveOgBrev({ oppgaveId: oppgave.id }, () => oppdater()) } const hentBrevOgSetStatus = () => { - apiHentBrev({ brevId: Number(brevId), sakId: Number(sakId) }, (brev) => { + apiHentBrev({ brevId: brevId, sakId: oppgave.sakId }, (brev) => { if ([BrevStatus.OPPRETTET, BrevStatus.OPPDATERT].includes(brev.status)) { setKanRedigeres(true) } else { @@ -61,68 +42,75 @@ export function Aktivitetspliktbrev({ useEffect(() => { hentBrevOgSetStatus() - }, [brevId, sakId, tilbakestilt]) + }, [brevId, oppgave.status]) - return ( - <> - {mapApiResult( - brevStatus, - , - () => ( - Feil oppsto ved henting av brev - ), - (brev) => ( - - - - + return mapResult(brevStatus, { + pending: , + error: (error) => En feil oppsto ved henting av brev: {error.detail}, + success: (brev) => { + const brevErFerdigstilt = + brev.prosessType === BrevProsessType.OPPLASTET_PDF || brev.status === BrevStatus.DISTRIBUERT + return ( + + + + + Infobrev aktivitetsplikt + + + - + + + + + {brevErFerdigstilt ? ( + + + + ) : ( + + undefined} /> + + )} + + <> + {isFailure(status) && Kunne ikke ferdigstille {status.error.detail}} + {isPending(status) && } + + + + + ) + }, + }) +} - - - - - {brev.prosessType === BrevProsessType.OPPLASTET_PDF || brev.status === BrevStatus.DISTRIBUERT ? ( - - - - ) : ( - <> - - setTilbakestilt(true)} - /> - - - )} - - - - {isFailure(status) && Kunne ikke ferdigstille {status.error.detail}} - {isPending(status) && } - - - {!( - brev.prosessType === BrevProsessType.OPPLASTET_PDF || brev.status === BrevStatus.DISTRIBUERT - ) && } - - - - - - - ) - )} - +export function InfobrevKnapperad(props: { + ferdigstill?: () => void + status?: Result + tekst?: string + children?: React.ReactElement +}) { + const navigate = useNavigate() + return ( + + {props.children} + + + {props.ferdigstill && ( + + )} + + ) } diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/brev/UtenBrevVisning.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/brev/UtenBrevVisning.tsx index fabe6822526..4606304cc95 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/brev/UtenBrevVisning.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/brev/UtenBrevVisning.tsx @@ -1,41 +1,51 @@ -import { OppgaveDTO, Oppgavestatus } from '~shared/types/oppgave' +import { Oppgavestatus } from '~shared/types/oppgave' import { useApiCall } from '~shared/hooks/useApiCall' import { ferdigstillOppgave } from '~shared/api/oppgaver' -import { Column, GridContainer } from '~shared/styled' -import { Alert, Button, HStack } from '@navikt/ds-react' -import { isPending } from '@reduxjs/toolkit' -import { isFailure } from '~shared/api/apiUtils' +import { Alert, BodyShort, VStack } from '@navikt/ds-react' +import { mapFailure } from '~shared/api/apiUtils' import { ApiErrorAlert } from '~ErrorBoundary' import React from 'react' +import { InfobrevKnapperad } from '~components/aktivitetsplikt/brev/AktivitetspliktBrev' +import { useAktivitetspliktOppgaveVurdering } from '~components/aktivitetsplikt/OppgaveVurderingRoute' -export function UtenBrevVisning({ oppgave, fetchOppgave }: { oppgave: OppgaveDTO; fetchOppgave: () => void }) { +export function UtenBrevVisning() { + const { oppgave, oppdater, aktivtetspliktbrevdata } = useAktivitetspliktOppgaveVurdering() const [ferdigstillOppgaveStatus, apiFerdigstillOppgave] = useApiCall(ferdigstillOppgave) const ferdigstillOppgaveWrapper = () => { apiFerdigstillOppgave(oppgave.id, () => { - fetchOppgave() + oppdater() }) } const oppgaveErFerdigstilt = oppgave.status === Oppgavestatus.FERDIGSTILT + const oppgaveKanFerdigstilles = !oppgaveErFerdigstilt && !!aktivtetspliktbrevdata && !aktivtetspliktbrevdata.brevId + return ( - - - - {oppgaveErFerdigstilt ? ( - Oppgaven er ferdigstilt - ) : ( - <> -
Brev skal ikke sendes for denne oppgaven, du kan nå ferdigstille oppgaven.
- - {isFailure(ferdigstillOppgaveStatus) && ( - Kunne ikke ferdigstille oppgave.{ferdigstillOppgaveStatus.error.detail} - )} - - )} -
-
-
+ + {oppgaveErFerdigstilt ? ( + Oppgaven er ferdigstilt + ) : oppgaveKanFerdigstilles ? ( + <> + Brev skal ikke sendes for denne oppgaven, du kan nå ferdigstille oppgaven. + + ) : ( + <> + + Brev er ikke opprettet for oppgaven. Du må gå tilbake til forrige steg for å opprette brevet + + + )} + + <> + {mapFailure(ferdigstillOppgaveStatus, (error) => ( + Kunne ikke ferdigstille oppgave.{error.detail} + ))} + + + ) } diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/brev/VurderingInfoBrevOgOppsummering.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/brev/VurderingInfoBrevOgOppsummering.tsx index df74ebff3ee..dce70e451d7 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/brev/VurderingInfoBrevOgOppsummering.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/brev/VurderingInfoBrevOgOppsummering.tsx @@ -1,70 +1,23 @@ -import { Alert, Box, Heading } from '@navikt/ds-react' +import { Box, Heading } from '@navikt/ds-react' import { useSidetittel } from '~shared/hooks/useSidetittel' import { useAktivitetspliktOppgaveVurdering } from '~components/aktivitetsplikt/OppgaveVurderingRoute' -import React, { useEffect, useState } from 'react' -import { useApiCall } from '~shared/hooks/useApiCall' -import { mapFailure } from '~shared/api/apiUtils' -import Spinner from '~shared/Spinner' -import { ApiErrorAlert } from '~ErrorBoundary' -import { isPending } from '@reduxjs/toolkit' -import { opprettAktivitetspliktsbrev } from '~shared/api/aktivitetsplikt' +import React from 'react' import { Aktivitetspliktbrev } from '~components/aktivitetsplikt/brev/AktivitetspliktBrev' import { UtenBrevVisning } from '~components/aktivitetsplikt/brev/UtenBrevVisning' -export function VurderingInfoBrevOgOppsummering({ fetchOppgave }: { fetchOppgave: () => void }) { +export function VurderingInfoBrevOgOppsummering() { useSidetittel('Aktivitetsplikt brev og oppsummering') - const { oppgave, aktivtetspliktbrevdata } = useAktivitetspliktOppgaveVurdering() - const [opprettBrevStatus, opprettBrevApiCall] = useApiCall(opprettAktivitetspliktsbrev) - const brevdataFinnes = !!aktivtetspliktbrevdata + const { aktivtetspliktbrevdata } = useAktivitetspliktOppgaveVurdering() - const [brevId, setBrevid] = useState(aktivtetspliktbrevdata?.brevId) - const [brevErKlart, setBrevErKlart] = useState(false) + if (!aktivtetspliktbrevdata?.brevId) { + return ( + + Vurdering av {aktivtetspliktbrevdata?.skalSendeBrev ? 'brev' : 'oppgave'} + + + ) + } - useEffect(() => { - if (brevdataFinnes) { - if (aktivtetspliktbrevdata?.skalSendeBrev) { - if (aktivtetspliktbrevdata.brevId) { - setBrevid(aktivtetspliktbrevdata.brevId) - setBrevErKlart(true) - } else { - opprettBrevApiCall({ oppgaveId: oppgave.id }, (brevIdDto) => { - setBrevid(brevIdDto.brevId) - setBrevErKlart(true) - }) - } - } else { - setBrevErKlart(false) - } - } - }, []) - - return ( - - Vurdering av {aktivtetspliktbrevdata?.skalSendeBrev ? 'brev' : 'oppgave'} - {brevdataFinnes ? ( - <> - {aktivtetspliktbrevdata?.skalSendeBrev ? ( - <> - {isPending(opprettBrevStatus) && } - {mapFailure(opprettBrevStatus, (err) => ( - Kunne ikke opprette brev {err.detail} - ))} - {brevErKlart && brevId && ( - - )} - - ) : ( - - )} - - ) : ( - <> - - Brevdata finnes ikke for denne oppgaven, gå tilbake til vurderingssiden for å endre dette - - - )} - - ) + return } diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/VurderAktivitet.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/VurderAktivitet.tsx index 1441bcdc195..3d40025c038 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/VurderAktivitet.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/VurderAktivitet.tsx @@ -1,7 +1,7 @@ -import { Box, Button, Heading, VStack } from '@navikt/ds-react' +import { Box, Button, Heading, HStack, VStack } from '@navikt/ds-react' import React, { useEffect } from 'react' import { Vurderinger } from '~components/aktivitetsplikt/vurdering/Vurderinger' -import { mapResult } from '~shared/api/apiUtils' +import { isPending, mapFailure, mapResult } from '~shared/api/apiUtils' import Spinner from '~shared/Spinner' import { ApiErrorAlert } from '~ErrorBoundary' import { AktivitetspliktTidslinje } from '~components/behandling/aktivitetsplikt/AktivitetspliktTidslinje' @@ -10,46 +10,80 @@ import { hentFamilieOpplysninger } from '~shared/api/pdltjenester' import { velgDoedsdato } from '~components/person/aktivitet/Aktivitet' import { useAktivitetspliktOppgaveVurdering } from '~components/aktivitetsplikt/OppgaveVurderingRoute' import { useNavigate } from 'react-router' -import { handlinger } from '~components/behandling/handlinger/typer' import { AktivitetspliktSteg } from '~components/aktivitetsplikt/stegmeny/AktivitetspliktStegmeny' +import { opprettAktivitetspliktsbrev } from '~shared/api/aktivitetsplikt' +import { erOppgaveRedigerbar } from '~shared/types/oppgave' -export function VurderAktivitet({ fetchOppgave }: { fetchOppgave: () => void }) { - const oppgave = useAktivitetspliktOppgaveVurdering() +export function VurderAktivitet() { + const { sak } = useAktivitetspliktOppgaveVurdering() const [familieOpplysningerResult, familieOpplysningerFetch] = useApiCall(hentFamilieOpplysninger) - const navigate = useNavigate() + useEffect(() => { - familieOpplysningerFetch({ ident: oppgave.sak.ident, sakType: oppgave.sak.sakType }) + familieOpplysningerFetch({ ident: sak.ident, sakType: sak.sakType }) }, []) return ( <> - + Oppfølging av aktivitet - + {mapResult(familieOpplysningerResult, { pending: , error: (error) => {error.detail || 'Kunne ikke hente opplysninger om avdød'}, - success: ({ avdoede }) => ( - <>{avdoede && } - ), + success: ({ avdoede }) => + avdoede && ( + <> + + + + ), })} - - - - + ) } + +function NesteEllerOpprettBrev() { + const { oppgave, aktivtetspliktbrevdata, oppdater } = useAktivitetspliktOppgaveVurdering() + const navigate = useNavigate() + + const [opprettBrevStatus, opprettBrevCall] = useApiCall(opprettAktivitetspliktsbrev) + + const erRedigerbar = erOppgaveRedigerbar(oppgave.status) + const skalOppretteBrev = erRedigerbar && aktivtetspliktbrevdata?.skalSendeBrev && !aktivtetspliktbrevdata.brevId + + function opprettBrev() { + opprettBrevCall( + { + oppgaveId: oppgave.id, + }, + () => { + oppdater() + navigate(`../${AktivitetspliktSteg.OPPSUMMERING_OG_BREV}`) + } + ) + } + + return ( + + + {mapFailure(opprettBrevStatus, (error) => ( + Kunne ikke opprette brev: {error.detail} + ))} + {skalOppretteBrev ? ( + + ) : ( + + )} + + + ) +} diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/Vurderinger.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/Vurderinger.tsx index 240f3356fc5..ec6b0d995f9 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/Vurderinger.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/Vurderinger.tsx @@ -1,34 +1,17 @@ import { useAktivitetspliktOppgaveVurdering } from '~components/aktivitetsplikt/OppgaveVurderingRoute' -import React, { useEffect } from 'react' +import React from 'react' import { erOppgaveRedigerbar } from '~shared/types/oppgave' import { Heading } from '@navikt/ds-react' -import { BrevAktivitetsplikt } from '~components/person/aktivitet/vurderingAvAktivitetsplikt/BrevAktivitetsplikt' +import { ValgForInfobrev } from '~components/person/aktivitet/vurderingAvAktivitetsplikt/ValgForInfobrev' import { AktivitetsgradIOppgave } from '~components/aktivitetsplikt/vurdering/aktivitetsgrad/AktivitetsgradIOppgave' import { LeggTilUnntak } from '~components/aktivitetsplikt/vurdering/unntak/LeggTilUnntak' import { LeggTilNyVurdering } from '~components/aktivitetsplikt/vurdering/aktivitetsgrad/LeggTilNyVurdering' import { UnntakIOppgave } from '~components/aktivitetsplikt/vurdering/unntak/UnntakIOppgave' -import { useApiCall } from '~shared/hooks/useApiCall' -import { hentFamilieOpplysninger } from '~shared/api/pdltjenester' -import { mapSuccess } from '~shared/api/apiUtils' - -export function Vurderinger() { - const { oppgave, sak } = useAktivitetspliktOppgaveVurdering() - - const [familieOpplysningerResult, hentOpplysninger] = useApiCall(hentFamilieOpplysninger) - useEffect(() => { - hentOpplysninger({ - ident: sak.ident, - sakType: oppgave.sakType, - }) - }, []) - - const doedsdato = - mapSuccess( - familieOpplysningerResult, - (opplysninger) => opplysninger.avdoede?.find((avdoed) => avdoed)?.doedsdato - ) ?? undefined +export function Vurderinger(props: { doedsdato: Date }) { + const { oppgave } = useAktivitetspliktOppgaveVurdering() + const { doedsdato } = props const oppgaveErRedigerbar = erOppgaveRedigerbar(oppgave.status) return ( @@ -38,7 +21,7 @@ export function Vurderinger() { {oppgaveErRedigerbar && } {oppgaveErRedigerbar && } - + ) } diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/aktivitetsgrad/AktivitetsgradIOppgave.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/aktivitetsgrad/AktivitetsgradIOppgave.tsx index d7a9a8d12c6..32cb7db4b42 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/aktivitetsgrad/AktivitetsgradIOppgave.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/aktivitetsgrad/AktivitetsgradIOppgave.tsx @@ -9,17 +9,20 @@ import { slettAktivitetspliktVurdering } from '~shared/api/aktivitetsplikt' import { useAktivitetspliktOppgaveVurdering } from '~components/aktivitetsplikt/OppgaveVurderingRoute' import { isFailure, isPending } from '~shared/api/apiUtils' import { ApiErrorAlert } from '~ErrorBoundary' +import { erOppgaveRedigerbar } from '~shared/types/oppgave' export function AktivitetsgradIOppgave(props: { doedsdato?: Date }) { - const { oppgave, vurdering } = useAktivitetspliktOppgaveVurdering() + const { oppgave, vurdering, oppdater } = useAktivitetspliktOppgaveVurdering() const [aktivitetForRedigering, setAktivitetForRedigering] = useState() const [slettStatus, slettSpesifikkAktivitet] = useApiCall(slettAktivitetspliktVurdering) + const erRedigerbar = erOppgaveRedigerbar(oppgave.status) + const aktiviteter = vurdering.aktivitet function oppdaterTilstandLagretVurdering() { - // TODO: oppdater state setAktivitetForRedigering(undefined) + oppdater() } function slettAktivitetsgradIOppgave(aktivitet: IAktivitetspliktAktivitetsgrad) { @@ -30,8 +33,8 @@ export function AktivitetsgradIOppgave(props: { doedsdato?: Date }) { vurderingId: aktivitet.id, }, () => { - // TODO: oppdater state setAktivitetForRedigering(undefined) + oppdater() } ) } @@ -93,25 +96,27 @@ export function AktivitetsgradIOppgave(props: { doedsdato?: Date }) { Saksbehandler: {formaterDato(aktivitet.endret.tidspunkt)} - - - - + {erRedigerbar && ( + + + + + )} ))} diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/aktivitetsgrad/LeggTilNyVurdering.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/aktivitetsgrad/LeggTilNyVurdering.tsx index 2bb1b422ab6..fc6b06aa920 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/aktivitetsgrad/LeggTilNyVurdering.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/aktivitetsgrad/LeggTilNyVurdering.tsx @@ -2,13 +2,15 @@ import React, { useState } from 'react' import { Box, Button, Heading, VStack } from '@navikt/ds-react' import { VurderingAktivitetsgradForm } from './VurderingAktivitetsgradForm' import { PlusIcon } from '@navikt/aksel-icons' +import { useAktivitetspliktOppgaveVurdering } from '~components/aktivitetsplikt/OppgaveVurderingRoute' export function LeggTilNyVurdering(props: { doedsdato?: Date }) { + const { oppdater } = useAktivitetspliktOppgaveVurdering() const [leggerTilVurdering, setLeggerTilVurdering] = useState(false) function oppdaterStateVedLagring() { - // TODO: Oppdatere state også med ny vurdering setLeggerTilVurdering(false) + oppdater() } if (!leggerTilVurdering) { diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/unntak/LeggTilUnntak.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/unntak/LeggTilUnntak.tsx index 54f30ed16b0..09a5cd80ade 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/unntak/LeggTilUnntak.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/unntak/LeggTilUnntak.tsx @@ -2,13 +2,15 @@ import React, { useState } from 'react' import { Box, Button, Heading, VStack } from '@navikt/ds-react' import { PlusIcon } from '@navikt/aksel-icons' import { UnntakAktivitetspliktOppgaveForm } from '~components/aktivitetsplikt/vurdering/unntak/UnntakAktivitetspliktOppgaveForm' +import { useAktivitetspliktOppgaveVurdering } from '~components/aktivitetsplikt/OppgaveVurderingRoute' export function LeggTilUnntak() { + const { oppdater } = useAktivitetspliktOppgaveVurdering() const [leggerTilUnntak, setLeggerTilUnntak] = useState(false) function oppdaterTilstandVedLagring() { - // TODO: oppdater tilstand også setLeggerTilUnntak(false) + oppdater() } if (!leggerTilUnntak) { diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/unntak/UnntakIOppgave.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/unntak/UnntakIOppgave.tsx index 27dff7927bc..c35835d5570 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/unntak/UnntakIOppgave.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/unntak/UnntakIOppgave.tsx @@ -13,7 +13,7 @@ import { isFailure, isPending } from '~shared/api/apiUtils' import { ApiErrorAlert } from '~ErrorBoundary' export function UnntakIOppgave() { - const { vurdering, oppgave } = useAktivitetspliktOppgaveVurdering() + const { vurdering, oppgave, oppdater } = useAktivitetspliktOppgaveVurdering() const [unntakForRedigering, setUnntakForRedigering] = useState() const [slettUnntakStatus, slettSpesifiktUnntak, resetSlettStatus] = useApiCall(slettAktivitetspliktUnntak) const unntaker = vurdering.unntak @@ -28,16 +28,16 @@ export function UnntakIOppgave() { unntakId: unntak.id, }, () => { - // TODO oppdater faktisk state setUnntakForRedigering(undefined) + oppdater() } ) } function oppdaterStateEtterRedigertUnntak() { resetSlettStatus() - // TODO faktisk oppdater state setUnntakForRedigering(undefined) + oppdater() } return ( diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/person/aktivitet/vurderingAvAktivitetsplikt/BrevAktivitetsplikt.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/person/aktivitet/vurderingAvAktivitetsplikt/ValgForInfobrev.tsx similarity index 67% rename from apps/etterlatte-saksbehandling-ui/client/src/components/person/aktivitet/vurderingAvAktivitetsplikt/BrevAktivitetsplikt.tsx rename to apps/etterlatte-saksbehandling-ui/client/src/components/person/aktivitet/vurderingAvAktivitetsplikt/ValgForInfobrev.tsx index 1515483f80c..c4de1980af9 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/person/aktivitet/vurderingAvAktivitetsplikt/BrevAktivitetsplikt.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/person/aktivitet/vurderingAvAktivitetsplikt/ValgForInfobrev.tsx @@ -1,6 +1,5 @@ -import { Button, Heading, HStack, Radio, VStack } from '@navikt/ds-react' +import { Box, Button, Heading, HStack, Radio, VStack } from '@navikt/ds-react' import React, { useEffect, useState } from 'react' -import { RadioGroupWrapper } from '~components/behandling/vilkaarsvurdering/Vurdering' import { JaNei, JaNeiRec } from '~shared/types/ISvar' import { useForm } from 'react-hook-form' import { isPending } from '@reduxjs/toolkit' @@ -27,8 +26,8 @@ function mapToDto(brevdata: IBrevAktivitetsplikt): IBrevAktivitetspliktRequest { } } -export const BrevAktivitetsplikt = () => { - const { oppgave, aktivtetspliktbrevdata } = useAktivitetspliktOppgaveVurdering() +export const ValgForInfobrev = () => { + const { oppgave, aktivtetspliktbrevdata, oppdater } = useAktivitetspliktOppgaveVurdering() const { handleSubmit, watch, control, resetField } = useForm({}) const [lagrebrevdataStatus, lagrebrevdata, tilbakestillApiResult] = useApiCall(lagreAktivitetspliktBrevdata) @@ -42,6 +41,7 @@ export const BrevAktivitetsplikt = () => { () => { oppdaterBrevdata(brevdatamappedToDo) setRedigeres(false) + oppdater() }, () => {} ) @@ -64,7 +64,7 @@ export const BrevAktivitetsplikt = () => { {redigeres ? (
- + { } /> - - {skalsendebrev === JaNei.JA && ( - <> - + {skalsendebrev === JaNei.JA && ( + <> @@ -94,13 +92,11 @@ export const BrevAktivitetsplikt = () => { } /> - - @@ -109,48 +105,50 @@ export const BrevAktivitetsplikt = () => { } /> - - - )} + + )} - {isFailureHandler({ - apiResult: lagrebrevdataStatus, - errorMessage: 'Kan ikke lagre valg for infobrevet', - })} - + {isFailureHandler({ + apiResult: lagrebrevdataStatus, + errorMessage: 'Kan ikke lagre valg for infobrevet', + })} + + + +
) : ( -
-
- {!!brevdata && ( - - - {brevdata.skalSendeBrev && ( - <> - - - - )} - - )} -
+ + {!!brevdata && ( + + + {brevdata.skalSendeBrev && ( + <> + + + + )} + + )} {erOppgaveRedigerbar(oppgave.status) && ( - + + + )} -
+ )} ) diff --git a/apps/etterlatte-saksbehandling-ui/client/src/shared/api/aktivitetsplikt.ts b/apps/etterlatte-saksbehandling-ui/client/src/shared/api/aktivitetsplikt.ts index a5c2031ed6a..790617ddce2 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/shared/api/aktivitetsplikt.ts +++ b/apps/etterlatte-saksbehandling-ui/client/src/shared/api/aktivitetsplikt.ts @@ -136,9 +136,9 @@ export const lagreAktivitetspliktBrevdata = async (args: { export const opprettAktivitetspliktsbrev = async (args: { oppgaveId: string }): Promise> => apiClient.post(`/aktivitetsplikt/oppgave/${args.oppgaveId}/opprettbrev`, {}) -export const ferdigstillJournalfoerOgDistribuerbrev = async (args: { +export const ferdigstillBrevOgOppgaveAktivitetsplikt = async (args: { oppgaveId: string -}): Promise> => +}): Promise> => apiClient.post(`/aktivitetsplikt/oppgave/${args.oppgaveId}/ferdigstillbrev-og-oppgave`, {}) interface BrevId { From 332a16048512dd29aa59d314cc7b1cafbe773652 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Oliver=20S=C3=B8berg?= <82504565+sebassonav@users.noreply.github.com> Date: Thu, 7 Nov 2024 11:39:56 +0100 Subject: [PATCH 03/85] =?UTF-8?q?Fjern=20brevid=20og=20slett=20brev=20ders?= =?UTF-8?q?om=20bruker=20velger=20nei=20p=C3=A5=20brevutfall=20(#6252)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fjern brevid og slett brev dersom bruker velger nei på brevutfall * mock * legg til tester --- .../aktivitetsplikt/AktivitetspliktBrevDao.kt | 22 ++- .../AktivitetspliktOppgaveService.kt | 30 +++- .../behandling/klienter/BrevApiKlient.kt | 19 +++ .../AktivitetspliktBrevDaoTest.kt | 33 +++++ .../AktivitetspliktOppgaveServiceTest.kt | 130 ++++++++++++++++++ .../kotlin/integration/EksterneKlienter.kt | 7 + 6 files changed, 233 insertions(+), 8 deletions(-) diff --git a/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktBrevDao.kt b/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktBrevDao.kt index 71992f60ca5..e5c77a52498 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktBrevDao.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktBrevDao.kt @@ -5,6 +5,7 @@ import no.nav.etterlatte.behandling.hendelse.getUUID import no.nav.etterlatte.behandling.objectMapper import no.nav.etterlatte.brev.model.BrevID import no.nav.etterlatte.common.ConnectionAutoclosing +import no.nav.etterlatte.libs.common.grunnlag.Grunnlagsopplysning import no.nav.etterlatte.libs.common.sak.SakId import no.nav.etterlatte.libs.database.setJsonb import no.nav.etterlatte.libs.database.singleOrNull @@ -78,7 +79,7 @@ class AktivitetspliktBrevDao( prepareStatement( """ UPDATE aktivitetsplikt_brevdata SET brev_id = ? - WHERE oppgave_id = ? + WHERE oppgave_id = ? """.trimIndent(), ) @@ -87,4 +88,23 @@ class AktivitetspliktBrevDao( stmt.executeUpdate() } } + + fun fjernBrevId( + oppgaveId: UUID, + kilde: Grunnlagsopplysning.Saksbehandler, + ) = connectionAutoclosing.hentConnection { connection -> + with(connection) { + val stmt = + prepareStatement( + """ + UPDATE aktivitetsplikt_brevdata SET brev_id = NULL, kilde = ? + WHERE oppgave_id = ? + + """.trimIndent(), + ) + stmt.setJsonb(1, kilde) + stmt.setObject(2, oppgaveId) + stmt.executeUpdate() + } + } } diff --git a/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveService.kt b/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveService.kt index 5aec82ad722..3dc35c109ea 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveService.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveService.kt @@ -81,13 +81,22 @@ class AktivitetspliktOppgaveService( data: AktivitetspliktInformasjonBrevdataRequest, ): AktivitetspliktInformasjonBrevdata? { val oppgave = oppgaveService.hentOppgave(oppgaveId) - val sak = sakService.finnSak(oppgave.sakId) ?: throw GenerellIkkeFunnetException() - val saksbehandler = - Kontekst.get().brukerTokenInfo - ?: throw IngenSaksbehandler("Fant ingen saksbehandler til lagring av brevdata for oppgave $oppgaveId") - val kilde = Grunnlagsopplysning.Saksbehandler.create(saksbehandler.ident()) - aktivitetspliktBrevDao.lagreBrevdata(data.toDaoObjektBrevutfall(oppgaveId, sakid = sak.id, kilde = kilde)) - return aktivitetspliktBrevDao.hentBrevdata(oppgaveId) + if (oppgave.status.erAvsluttet()) { + throw OppgaveErAvsluttet("Oppgave er avsluttet, id $oppgaveId. Kan ikke fjerne brevid") + } else { + val sak = sakService.finnSak(oppgave.sakId) ?: throw GenerellIkkeFunnetException() + val saksbehandler = + Kontekst.get().brukerTokenInfo + ?: throw IngenSaksbehandler("Fant ingen saksbehandler til lagring av brevdata for oppgave $oppgaveId") + val kilde = Grunnlagsopplysning.Saksbehandler.create(saksbehandler.ident()) + aktivitetspliktBrevDao.lagreBrevdata(data.toDaoObjektBrevutfall(oppgaveId, sakid = sak.id, kilde = kilde)) + val hentBrevId = aktivitetspliktBrevDao.hentBrevdata(oppgaveId = oppgaveId) + if (!data.skalSendeBrev && hentBrevId?.brevId != null) { + aktivitetspliktBrevDao.fjernBrevId(oppgaveId, kilde) + runBlocking { brevApiKlient.slettBrev(brevId = hentBrevId.brevId, brukerTokenInfo = saksbehandler) } + } + return aktivitetspliktBrevDao.hentBrevdata(oppgaveId) + } } private fun mapAktivitetsgradstypeTilAktivtetsgrad(aktivitetsgrad: AktivitetspliktAktivitetsgradType): Aktivitetsgrad = @@ -186,6 +195,13 @@ class AktivitetspliktOppgaveService( } } +class OppgaveErAvsluttet( + msg: String, +) : UgyldigForespoerselException( + code = "OPPGAVE_AVSLUTTET", + detail = msg, + ) + class IngenSaksbehandler( msg: String, ) : UgyldigForespoerselException( diff --git a/apps/etterlatte-behandling/src/main/kotlin/behandling/klienter/BrevApiKlient.kt b/apps/etterlatte-behandling/src/main/kotlin/behandling/klienter/BrevApiKlient.kt index 76f11726b07..838f250503f 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/behandling/klienter/BrevApiKlient.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/klienter/BrevApiKlient.kt @@ -30,6 +30,11 @@ interface BrevApiKlient { brukerTokenInfo: BrukerTokenInfo, ): Brev + suspend fun slettBrev( + brevId: Long, + brukerTokenInfo: BrukerTokenInfo, + ) + suspend fun ferdigstillBrev( req: FerdigstillJournalFoerOgDistribuerOpprettetBrev, brukerTokenInfo: BrukerTokenInfo, @@ -118,6 +123,20 @@ class BrevApiKlientObo( private val clientId = config.getString("brev-api.client.id") private val resourceUrl = config.getString("brev-api.resource.url") + override suspend fun slettBrev( + brevId: Long, + brukerTokenInfo: BrukerTokenInfo, + ) { + downstreamResourceClient + .delete( + resource = Resource(clientId = clientId, url = "$resourceUrl/api/brev/$brevId"), + brukerTokenInfo = brukerTokenInfo, + ).mapBoth( + success = { }, + failure = { errorResponse -> throw errorResponse }, + ) + } + override suspend fun ferdigstillBrev( req: FerdigstillJournalFoerOgDistribuerOpprettetBrev, brukerTokenInfo: BrukerTokenInfo, diff --git a/apps/etterlatte-behandling/src/test/kotlin/behandling/aktivitetsplikt/AktivitetspliktBrevDaoTest.kt b/apps/etterlatte-behandling/src/test/kotlin/behandling/aktivitetsplikt/AktivitetspliktBrevDaoTest.kt index 82295d48839..20b0c600413 100644 --- a/apps/etterlatte-behandling/src/test/kotlin/behandling/aktivitetsplikt/AktivitetspliktBrevDaoTest.kt +++ b/apps/etterlatte-behandling/src/test/kotlin/behandling/aktivitetsplikt/AktivitetspliktBrevDaoTest.kt @@ -93,4 +93,37 @@ class AktivitetspliktBrevDaoTest( val lagretBrevdata = dao.hentBrevdata(oppgave.id) lagretBrevdata shouldBe brevdata } + + @Test + fun `Kan fjerne brevid og kilde oppdaterer seg`() { + val sak = sakSkrivDao.opprettSak("person", SakType.OMSTILLINGSSTOENAD, Enheter.defaultEnhet.enhetNr) + val oppgave = lagNyOppgave(sak).also { oppgaveDao.opprettOppgave(it) } + + val sbIdent = "ident" + val brevdata = + AktivitetspliktInformasjonBrevdata( + sakid = sak.id, + oppgaveId = oppgave.id, + skalSendeBrev = true, + utbetaling = false, + redusertEtterInntekt = false, + kilde = Grunnlagsopplysning.Saksbehandler.create(sbIdent), + ) + + dao.lagreBrevdata(brevdata) + val lagretBrevdata = dao.hentBrevdata(oppgave.id) + lagretBrevdata shouldBe brevdata + + val brevId = 1L + dao.lagreBrevId(oppgave.id, brevId) + val brevdataMedBrevId = dao.hentBrevdata(oppgave.id) + brevdataMedBrevId?.brevId shouldBe brevId + + val nyKilde = Grunnlagsopplysning.Saksbehandler.create(sbIdent) + dao.fjernBrevId(oppgave.id, nyKilde) + + val dataMedFjernetBrevidOgNyKilde = dao.hentBrevdata(oppgave.id) + dataMedFjernetBrevidOgNyKilde?.kilde shouldBe nyKilde + dataMedFjernetBrevidOgNyKilde?.brevId shouldBe null + } } diff --git a/apps/etterlatte-behandling/src/test/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveServiceTest.kt b/apps/etterlatte-behandling/src/test/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveServiceTest.kt index b525ae9fb7a..62ce20b026f 100644 --- a/apps/etterlatte-behandling/src/test/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveServiceTest.kt +++ b/apps/etterlatte-behandling/src/test/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveServiceTest.kt @@ -3,10 +3,12 @@ package no.nav.etterlatte.behandling.aktivitetsplikt import io.mockk.Runs import io.mockk.clearAllMocks import io.mockk.coEvery +import io.mockk.coVerify import io.mockk.every import io.mockk.just import io.mockk.mockk import io.mockk.verify +import no.nav.etterlatte.User import no.nav.etterlatte.behandling.aktivitetsplikt.vurdering.AktivitetspliktAktivitetsgrad import no.nav.etterlatte.behandling.aktivitetsplikt.vurdering.AktivitetspliktAktivitetsgradType import no.nav.etterlatte.behandling.klienter.BrevApiKlient @@ -23,6 +25,7 @@ import no.nav.etterlatte.libs.common.oppgave.Status import no.nav.etterlatte.libs.common.sak.Sak import no.nav.etterlatte.libs.common.sak.SakId import no.nav.etterlatte.libs.common.tidspunkt.Tidspunkt +import no.nav.etterlatte.nyKontekstMedBruker import no.nav.etterlatte.oppgave.OppgaveService import no.nav.etterlatte.oppgave.lagNyOppgave import no.nav.etterlatte.sak.SakService @@ -349,4 +352,131 @@ class AktivitetspliktOppgaveServiceTest { } verify(exactly = 0) { oppgaveService.ferdigstillOppgave(oppgaveId, simpleSaksbehandler) } } + + @Test + fun `Kan ikke lagre om oppgave er avsluttet`() { + val oppgaveId = UUID.randomUUID() + val sakIdForOppgave = sak.id + every { oppgaveService.hentOppgave(oppgaveId) } returns + mockk { + every { sakId } returns sakIdForOppgave + every { status } returns Status.FERDIGSTILT + } + + val kilde = Grunnlagsopplysning.Saksbehandler.create("ident") + + every { aktivitetspliktBrevDao.hentBrevdata(oppgaveId) } returns + AktivitetspliktInformasjonBrevdata( + oppgaveId, + sakIdForOppgave, + 1234, + true, + utbetaling = true, + redusertEtterInntekt = true, + kilde = kilde, + ) + val aktivitetspliktInformasjonBrevdataRequest = AktivitetspliktInformasjonBrevdataRequest(false) + assertThrows { + service.lagreBrevdata(oppgaveId, aktivitetspliktInformasjonBrevdataRequest) + } + } + + @Test + fun `Skal fjerne brevid og slette brev om man lagrer nei til å sende brev etter å ha lagret med brevid`() { + nyKontekstMedBruker(mockk().also { every { it.name() } returns this::class.java.simpleName }) + val oppgaveId = UUID.randomUUID() + val sakIdForOppgave = sak.id + every { oppgaveService.hentOppgave(oppgaveId) } returns + mockk { + every { sakId } returns sakIdForOppgave + every { status } returns Status.UNDER_BEHANDLING + } + + val kilde = Grunnlagsopplysning.Saksbehandler.create("ident") + every { aktivitetspliktBrevDao.lagreBrevdata(any()) } returns 1 + every { aktivitetspliktBrevDao.hentBrevdata(oppgaveId) } returns + AktivitetspliktInformasjonBrevdata( + oppgaveId, + sakIdForOppgave, + 1234, + false, + utbetaling = true, + redusertEtterInntekt = true, + kilde = kilde, + ) + every { aktivitetspliktBrevDao.fjernBrevId(oppgaveId, any()) } returns 1 + coEvery { brevApiKlient.slettBrev(any(), any()) } just Runs + val aktivitetspliktInformasjonBrevdataRequest = AktivitetspliktInformasjonBrevdataRequest(false) + + service.lagreBrevdata(oppgaveId, aktivitetspliktInformasjonBrevdataRequest) + + coVerify(exactly = 1) { brevApiKlient.slettBrev(any(), any()) } + verify(exactly = 1) { aktivitetspliktBrevDao.fjernBrevId(oppgaveId, any()) } + } + + @Test + fun `Fjerner ikke brev id om den ikke finnes selvom bruker har valgt nei til å sende brev`() { + nyKontekstMedBruker(mockk().also { every { it.name() } returns this::class.java.simpleName }) + val oppgaveId = UUID.randomUUID() + val sakIdForOppgave = sak.id + every { oppgaveService.hentOppgave(oppgaveId) } returns + mockk { + every { sakId } returns sakIdForOppgave + every { status } returns Status.UNDER_BEHANDLING + } + + val kilde = Grunnlagsopplysning.Saksbehandler.create("ident") + every { aktivitetspliktBrevDao.lagreBrevdata(any()) } returns 1 + every { aktivitetspliktBrevDao.hentBrevdata(oppgaveId) } returns + AktivitetspliktInformasjonBrevdata( + oppgaveId, + sakIdForOppgave, + brevId = null, + false, + utbetaling = true, + redusertEtterInntekt = true, + kilde = kilde, + ) + every { aktivitetspliktBrevDao.fjernBrevId(oppgaveId, any()) } returns 1 + coEvery { brevApiKlient.slettBrev(any(), any()) } just Runs + val aktivitetspliktInformasjonBrevdataRequest = AktivitetspliktInformasjonBrevdataRequest(false) + + service.lagreBrevdata(oppgaveId, aktivitetspliktInformasjonBrevdataRequest) + + coVerify(exactly = 0) { brevApiKlient.slettBrev(any(), any()) } + verify(exactly = 0) { aktivitetspliktBrevDao.fjernBrevId(oppgaveId, any()) } + } + + @Test + fun `Skal ikke fjerne brevid om valgt skal sende brev`() { + nyKontekstMedBruker(mockk().also { every { it.name() } returns this::class.java.simpleName }) + val oppgaveId = UUID.randomUUID() + val sakIdForOppgave = sak.id + every { oppgaveService.hentOppgave(oppgaveId) } returns + mockk { + every { sakId } returns sakIdForOppgave + every { status } returns Status.UNDER_BEHANDLING + } + + val kilde = Grunnlagsopplysning.Saksbehandler.create("ident") + every { aktivitetspliktBrevDao.lagreBrevdata(any()) } returns 1 + every { aktivitetspliktBrevDao.hentBrevdata(oppgaveId) } returns + AktivitetspliktInformasjonBrevdata( + oppgaveId, + sakIdForOppgave, + 1234, + true, + utbetaling = true, + redusertEtterInntekt = true, + kilde = kilde, + ) + every { aktivitetspliktBrevDao.fjernBrevId(oppgaveId, any()) } returns 1 + coEvery { brevApiKlient.slettBrev(any(), any()) } just Runs + val aktivitetspliktInformasjonBrevdataRequest = AktivitetspliktInformasjonBrevdataRequest(true) + + service.lagreBrevdata(oppgaveId, aktivitetspliktInformasjonBrevdataRequest) + + coVerify(exactly = 0) { brevApiKlient.slettBrev(any(), any()) } + verify(exactly = 0) { aktivitetspliktBrevDao.fjernBrevId(oppgaveId, any()) } + } } diff --git a/apps/etterlatte-behandling/src/test/kotlin/integration/EksterneKlienter.kt b/apps/etterlatte-behandling/src/test/kotlin/integration/EksterneKlienter.kt index d0cad32cda6..145d681f49b 100644 --- a/apps/etterlatte-behandling/src/test/kotlin/integration/EksterneKlienter.kt +++ b/apps/etterlatte-behandling/src/test/kotlin/integration/EksterneKlienter.kt @@ -349,6 +349,13 @@ class BrevApiKlientTest : BrevApiKlient { TODO("Not yet implemented") } + override suspend fun slettBrev( + brevId: Long, + brukerTokenInfo: BrukerTokenInfo, + ) { + TODO("Not yet implemented") + } + override suspend fun ferdigstillBrev( req: FerdigstillJournalFoerOgDistribuerOpprettetBrev, brukerTokenInfo: BrukerTokenInfo, From b3a2b682f63b32267d082b25c389f2e206c8223d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Golberg?= Date: Thu, 7 Nov 2024 12:16:53 +0100 Subject: [PATCH 04/85] =?UTF-8?q?Sjekker=20om=20kan=20gj=C3=B8res=20automa?= =?UTF-8?q?tisk=20tidligere=20der=20det=20kan=20(#6254)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AarligInntektsjusteringJobbService.kt | 185 +++++++++--------- .../AarligInntektsjusteringJobbServiceTest.kt | 2 +- 2 files changed, 94 insertions(+), 93 deletions(-) diff --git a/apps/etterlatte-behandling/src/main/kotlin/inntektsjustering/AarligInntektsjusteringJobbService.kt b/apps/etterlatte-behandling/src/main/kotlin/inntektsjustering/AarligInntektsjusteringJobbService.kt index f7d8cbca5c3..8c8b59af8c2 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/inntektsjustering/AarligInntektsjusteringJobbService.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/inntektsjustering/AarligInntektsjusteringJobbService.kt @@ -11,6 +11,12 @@ import no.nav.etterlatte.behandling.revurdering.RevurderingService import no.nav.etterlatte.common.klienter.PdlTjenesterKlient import no.nav.etterlatte.grunnlag.Personopplysning import no.nav.etterlatte.inTransaction +import no.nav.etterlatte.inntektsjustering.AarligInntektsjusteringAarsakManuell.AAPEN_BEHANDLING +import no.nav.etterlatte.inntektsjustering.AarligInntektsjusteringAarsakManuell.HAR_SANKSJON +import no.nav.etterlatte.inntektsjustering.AarligInntektsjusteringAarsakManuell.TIL_SAMORDNING +import no.nav.etterlatte.inntektsjustering.AarligInntektsjusteringAarsakManuell.UTDATERTE_PERSONO_INFO +import no.nav.etterlatte.inntektsjustering.AarligInntektsjusteringAarsakManuell.UTDATERT_IDENT +import no.nav.etterlatte.inntektsjustering.AarligInntektsjusteringAarsakManuell.VERGEMAAL import no.nav.etterlatte.kafka.JsonMessage import no.nav.etterlatte.kafka.KafkaProdusent import no.nav.etterlatte.libs.common.Vedtaksloesning @@ -32,7 +38,6 @@ import no.nav.etterlatte.libs.common.sak.KjoeringStatus import no.nav.etterlatte.libs.common.sak.Sak import no.nav.etterlatte.libs.common.sak.SakId import no.nav.etterlatte.libs.common.tidspunkt.Tidspunkt -import no.nav.etterlatte.libs.common.vedtak.LoependeYtelseDTO import no.nav.etterlatte.libs.ktor.token.Fagsaksystem import no.nav.etterlatte.libs.ktor.token.HardkodaSystembruker import no.nav.etterlatte.rapidsandrivers.OmregningData @@ -78,31 +83,77 @@ class AarligInntektsjusteringJobbService( runBlocking { vedtakKlient.sakHarLopendeVedtakPaaDato(sakId, loependeFom.atDay(1), HardkodaSystembruker.omregning) } + if (!vedtak.erLoepende) { + oppdaterKjoering(kjoering, KjoeringStatus.FERDIGSTILT, sakId, "Sak er ikke løpende") + return@inTransaction + } val forrigeBehandling = hentForrigeBehandling(sakId) - val avkortingSjekk = - runBlocking { - beregningKlient.aarligInntektsjusteringSjekk( - sakId, - loependeFom.year, - forrigeBehandling.id, - HardkodaSystembruker.omregning, - ) + if (vedtak.underSamordning) { + nyBehandlingOgOppdaterKjoering(sakId, loependeFom, forrigeBehandling, kjoering, TIL_SAMORDNING) + return@inTransaction + } + + val avkortingSjekk = hentAvkortingSjekk(sakId, loependeFom, forrigeBehandling.id) + + if (avkortingSjekk.harInntektForAar) { + oppdaterKjoering( + kjoering, + KjoeringStatus.FERDIGSTILT, + sakId, + "Sak har allerede oppgitt inntekt for ${loependeFom.year}", + ) + return@inTransaction + } + if (avkortingSjekk.harSanksjon) { + nyBehandlingOgOppdaterKjoering(sakId, loependeFom, forrigeBehandling, kjoering, HAR_SANKSJON) + return@inTransaction + } + + val sak = sakService.finnSak(sakId) ?: throw InternfeilException("Fant ikke sak med id $sakId") + + val aapneBehandlinger = behandlingService.hentAapneBehandlingerForSak(sak) + if (aapneBehandlinger.isNotEmpty()) { + nyBehandlingOgOppdaterKjoering(sakId, loependeFom, forrigeBehandling, kjoering, AAPEN_BEHANDLING) + return@inTransaction + } + + hentPdlPersonident(sak).let { sisteIdentifikatorPdl -> + val sisteIdent = + when (sisteIdentifikatorPdl) { + is PdlIdentifikator.FolkeregisterIdent -> sisteIdentifikatorPdl.folkeregisterident.value + is PdlIdentifikator.Npid -> sisteIdentifikatorPdl.npid.ident + } + if (sak.ident != sisteIdent) { + nyBehandlingOgOppdaterKjoering(sakId, loependeFom, forrigeBehandling, kjoering, UTDATERT_IDENT) + return@inTransaction } + } + + val opplysningerGjenny = hentOpplysningerGjenny(sak, forrigeBehandling.id) - val skalIkkeGjennomfoereJobb = skalIkkeGjennomfoereJobb(avkortingSjekk, vedtak, loependeFom) - if (skalIkkeGjennomfoereJobb != null) { - oppdaterKjoering(kjoering, KjoeringStatus.FERDIGSTILT, sakId, skalIkkeGjennomfoereJobb) + val opplysningerErUendretIPdl = + hentPdlPersonopplysning(sak).let { opplysningerPdl -> + with(opplysningerGjenny.opplysning) { + fornavn == opplysningerPdl.fornavn.verdi && + mellomnavn == opplysningerPdl.mellomnavn?.verdi && + etternavn == opplysningerPdl.etternavn.verdi && + foedselsdato == opplysningerPdl.foedselsdato?.verdi && + doedsdato == opplysningerPdl.doedsdato?.verdi && + vergemaalEllerFremtidsfullmakt == opplysningerPdl.vergemaalEllerFremtidsfullmakt?.map { it.verdi } + } + } + if (!opplysningerErUendretIPdl) { + nyBehandlingOgOppdaterKjoering(sakId, loependeFom, forrigeBehandling, kjoering, UTDATERTE_PERSONO_INFO) return@inTransaction } - val aarsakTilManuell = kanIkkeKjoereAutomatisk(sakId, forrigeBehandling.id, vedtak, avkortingSjekk) - if (aarsakTilManuell != null) { - opprettRevurderingOgOppgave(sakId, loependeFom, forrigeBehandling) - oppdaterKjoering(kjoering, KjoeringStatus.TIL_MANUELL, sakId, aarsakTilManuell.name) + if (opplysningerGjenny.opplysning.vergemaalEllerFremtidsfullmakt?.isNotEmpty() == true) { + nyBehandlingOgOppdaterKjoering(sakId, loependeFom, forrigeBehandling, kjoering, VERGEMAAL) return@inTransaction } + oppdaterKjoering(kjoering, KjoeringStatus.KLAR_FOR_OMREGNING, sakId) publiserKlarForOmregning(sakId, loependeFom) } catch (e: Exception) { @@ -116,70 +167,26 @@ class AarligInntektsjusteringJobbService( } } - private fun kanIkkeKjoereAutomatisk( + private fun hentAvkortingSjekk( sakId: SakId, - sisteBehandlingId: UUID, - vedtak: LoependeYtelseDTO, - avkortingSjekkResponse: AarligInntektsjusteringAvkortingSjekkResponse, - ): AarligInntektsjusteringAarsakManuell? { - if (vedtak.underSamordning) { - return AarligInntektsjusteringAarsakManuell.TIL_SAMORDNING - } - - if (avkortingSjekkResponse.harSanksjon) { - return AarligInntektsjusteringAarsakManuell.HAR_SANKSJON - } - - val sak = sakService.finnSak(sakId) ?: throw InternfeilException("Fant ikke sak med id $sakId") - - val aapneBehandlinger = behandlingService.hentAapneBehandlingerForSak(sak) - if (aapneBehandlinger.isNotEmpty()) { - return AarligInntektsjusteringAarsakManuell.AAPEN_BEHANDLING - } - - val identErUendretPdl = - runBlocking { - hentPdlPersonident(sak).let { sisteIdentifikatorPdl -> - val sisteIdent = - when (sisteIdentifikatorPdl) { - is PdlIdentifikator.FolkeregisterIdent -> sisteIdentifikatorPdl.folkeregisterident.value - is PdlIdentifikator.Npid -> sisteIdentifikatorPdl.npid.ident - } - sak.ident == sisteIdent - } - } - if (!identErUendretPdl) { - return AarligInntektsjusteringAarsakManuell.UTDATERT_IDENT - } - - val opplysningerGjenny = hentOpplysningerGjenny(sak, sisteBehandlingId) - - val opplysningerErUendretIPdl = - hentPdlPersonopplysning(sak).let { opplysningerPdl -> - with(opplysningerGjenny.opplysning) { - fornavn == opplysningerPdl.fornavn.verdi && - mellomnavn == opplysningerPdl.mellomnavn?.verdi && - etternavn == opplysningerPdl.etternavn.verdi && - foedselsdato == opplysningerPdl.foedselsdato?.verdi && - doedsdato == opplysningerPdl.doedsdato?.verdi && - vergemaalEllerFremtidsfullmakt == opplysningerPdl.vergemaalEllerFremtidsfullmakt?.map { it.verdi } - } - } - if (!opplysningerErUendretIPdl) { - return AarligInntektsjusteringAarsakManuell.UTDATERTE_PERSONOPPLYSNINGER - } - - if (opplysningerGjenny.opplysning.vergemaalEllerFremtidsfullmakt?.isNotEmpty() == true) { - return AarligInntektsjusteringAarsakManuell.VERGEMAAL + loependeFom: YearMonth, + forrigeBehandlingId: UUID, + ): AarligInntektsjusteringAvkortingSjekkResponse = + runBlocking { + beregningKlient.aarligInntektsjusteringSjekk( + sakId, + loependeFom.year, + forrigeBehandlingId, + HardkodaSystembruker.omregning, + ) } - return null - } - - private fun opprettRevurderingOgOppgave( + private fun nyBehandlingOgOppdaterKjoering( sakId: SakId, loependeFom: YearMonth, forrigeBehandling: Behandling, + kjoering: String, + aarsakTilManuell: AarligInntektsjusteringAarsakManuell, ) { val persongalleri = runBlocking { @@ -205,6 +212,12 @@ class AarligInntektsjusteringJobbService( .also { revurderingService.fjernSaksbehandlerFraRevurderingsOppgave(it) } + oppdaterKjoering( + kjoering, + KjoeringStatus.TIL_MANUELL, + sakId, + aarsakTilManuell.name, + ) } private fun publiserKlarForOmregning( @@ -238,20 +251,6 @@ class AarligInntektsjusteringJobbService( } } - // Skal inntektjusteres hvis: 1) er løpende fom dato, 2) ikke har oppgitt inntekt fra 1.1 neste inntektsår - private fun skalIkkeGjennomfoereJobb( - avkortingSjekkResponse: AarligInntektsjusteringAvkortingSjekkResponse, - vedtak: LoependeYtelseDTO, - loependeFom: YearMonth, - ): String? = - if (!vedtak.erLoepende) { - "Sak er ikke løpende" - } else if (avkortingSjekkResponse.harInntektForAar) { - "Sak har allerede oppgitt inntekt for ${loependeFom.year}" - } else { - null - } - private fun oppdaterKjoering( kjoering: String, status: KjoeringStatus, @@ -275,9 +274,11 @@ class AarligInntektsjusteringJobbService( private fun hentPdlPersonopplysning(sak: Sak) = pdlTjenesterKlient.hentPdlModellFlereSaktyper(sak.ident, PersonRolle.INNSENDER, SakType.OMSTILLINGSSTOENAD) - private suspend fun hentPdlPersonident(sak: Sak) = - pdlTjenesterKlient.hentPdlIdentifikator(sak.ident) - ?: throw InternfeilException("Fant ikke ident fra PDL for sak ${sak.id}") + private fun hentPdlPersonident(sak: Sak) = + runBlocking { + pdlTjenesterKlient.hentPdlIdentifikator(sak.ident) + ?: throw InternfeilException("Fant ikke ident fra PDL for sak ${sak.id}") + } private fun hentOpplysningerGjenny( sak: Sak, @@ -295,7 +296,7 @@ class AarligInntektsjusteringJobbService( enum class AarligInntektsjusteringAarsakManuell { UTDATERT_IDENT, - UTDATERTE_PERSONOPPLYSNINGER, + UTDATERTE_PERSONO_INFO, VERGEMAAL, TIL_SAMORDNING, AAPEN_BEHANDLING, diff --git a/apps/etterlatte-behandling/src/test/kotlin/inntektsjustering/AarligInntektsjusteringJobbServiceTest.kt b/apps/etterlatte-behandling/src/test/kotlin/inntektsjustering/AarligInntektsjusteringJobbServiceTest.kt index 0e13f076432..9557f8f8192 100644 --- a/apps/etterlatte-behandling/src/test/kotlin/inntektsjustering/AarligInntektsjusteringJobbServiceTest.kt +++ b/apps/etterlatte-behandling/src/test/kotlin/inntektsjustering/AarligInntektsjusteringJobbServiceTest.kt @@ -466,7 +466,7 @@ class AarligInntektsjusteringJobbServiceTest { kjoering shouldBe "kjoering" status shouldBe KjoeringStatus.TIL_MANUELL sakId shouldBe SakId(123L) - begrunnelse shouldBe AarligInntektsjusteringAarsakManuell.UTDATERTE_PERSONOPPLYSNINGER.name + begrunnelse shouldBe AarligInntektsjusteringAarsakManuell.UTDATERTE_PERSONO_INFO.name } }, ) From 85277e6f208310ca7ceb7288faf835f2aeb1ea8b Mon Sep 17 00:00:00 2001 From: Emil Elton Nilsen <45180092+perkynades@users.noreply.github.com> Date: Thu, 7 Nov 2024 12:24:21 +0100 Subject: [PATCH 05/85] =?UTF-8?q?EY-4663=20-=20=C3=85pne=20opp=20for=20?= =?UTF-8?q?=C3=A5=20la=20selvbetjening=20sjekke=20om=20bruker=20har=20sak?= =?UTF-8?q?=20(#6241)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Åpne opp for å la selvbetjening sjekke om bruker har sak * Oppdater rolle til å være mer spesifik for bruken * Forenkle logikk i route --- apps/etterlatte-api/.nais/dev-api.yaml | 6 ++++++ apps/etterlatte-api/.nais/prod-api.yaml | 6 ++++++ .../samordning/sak/BehandlingSakRoutes.kt | 16 ++++++++++++++-- 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/apps/etterlatte-api/.nais/dev-api.yaml b/apps/etterlatte-api/.nais/dev-api.yaml index 9132400a1a4..d8341098608 100644 --- a/apps/etterlatte-api/.nais/dev-api.yaml +++ b/apps/etterlatte-api/.nais/dev-api.yaml @@ -104,6 +104,12 @@ spec: accessPolicy: inbound: rules: + - application: selvbetjening-backend + namespace: etterlatte + cluster: dev-gcp + permissions: + roles: + - les-oms-sak-for-person - application: arbeid-og-inntekt namespace: team-inntekt cluster: dev-fss diff --git a/apps/etterlatte-api/.nais/prod-api.yaml b/apps/etterlatte-api/.nais/prod-api.yaml index 47924d4a3fd..c542462ef8c 100644 --- a/apps/etterlatte-api/.nais/prod-api.yaml +++ b/apps/etterlatte-api/.nais/prod-api.yaml @@ -102,6 +102,12 @@ spec: accessPolicy: inbound: rules: + - application: selvbetjening-backend + namespace: etterlatte + cluster: prod-gcp + permissions: + roles: + - les-oms-sak-for-person - application: arbeid-og-inntekt namespace: team-inntekt cluster: prod-fss diff --git a/apps/etterlatte-api/src/main/kotlin/no/nav/etterlatte/samordning/sak/BehandlingSakRoutes.kt b/apps/etterlatte-api/src/main/kotlin/no/nav/etterlatte/samordning/sak/BehandlingSakRoutes.kt index 9a26fe48f11..255fed7ed38 100644 --- a/apps/etterlatte-api/src/main/kotlin/no/nav/etterlatte/samordning/sak/BehandlingSakRoutes.kt +++ b/apps/etterlatte-api/src/main/kotlin/no/nav/etterlatte/samordning/sak/BehandlingSakRoutes.kt @@ -39,9 +39,17 @@ fun Route.behandlingSakRoutes( accessPolicyRolesEllerAdGrupper = generateRoles(config) issuers = setOf(Issuer.AZURE.issuerName) } + + get("/har_sak") { + val foedselsnummer = call.receive() + val saker = behandlingService.hentSakforPerson(foedselsnummer) + + call.respond(HarOMSSakIGjenny(saker.isNotEmpty())) + } + post("/person/sak") { - val fnrOgSaktype = call.receive() - call.respond(behandlingService.hentSakforPerson(fnrOgSaktype)) + val foedselsnummer = call.receive() + call.respond(behandlingService.hentSakforPerson(foedselsnummer)) } } @@ -62,3 +70,7 @@ fun Route.behandlingSakRoutes( } } } + +data class HarOMSSakIGjenny( + val harOMSSak: Boolean, +) From d2d88c52c118c73df2911255d1df6d57bc2ba9a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Golberg?= Date: Thu, 7 Nov 2024 15:09:41 +0100 Subject: [PATCH 06/85] Mer inntektsjustering aar (#6256) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * vedtak sjekker om årlig inntektsjustering med rev årsak * Omregning lagrer feilmelding og corrid ved feil * Omregning lagrer feilende steg * behold stacktrace i feilmelding melding * Fjerner non null * Fikse tester --- .../behandling/omregning/OmregningDao.kt | 8 ++++-- .../AarligInntektsjusteringJobbService.kt | 6 ++-- ...omregning_kjoering_corrid_feilendesteg.sql | 8 ++++++ .../src/main/kotlin/BehandlingService.kt | 9 ++++++ .../kotlin/regulering/OmregningFeiletRiver.kt | 12 ++++++++ .../kotlin/regulering/VedtakAttestertRiver.kt | 5 ++-- .../regulering/OmregningFeiletRiverTest.kt | 28 ++++++++++++++++++- .../AarligInntektsjusteringRequest.kt | 5 ---- .../libs/common/sak/KjoeringRequest.kt | 2 ++ .../rapidsandrivers/OmregningHendelseType.kt | 1 + .../rapidsandrivers/RetryOgFeilhaandtering.kt | 5 +++- 11 files changed, 74 insertions(+), 15 deletions(-) create mode 100644 apps/etterlatte-behandling/src/main/resources/db/migration/V183__omregning_kjoering_corrid_feilendesteg.sql diff --git a/apps/etterlatte-behandling/src/main/kotlin/behandling/omregning/OmregningDao.kt b/apps/etterlatte-behandling/src/main/kotlin/behandling/omregning/OmregningDao.kt index cb363d628ed..220d94b4ff6 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/behandling/omregning/OmregningDao.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/omregning/OmregningDao.kt @@ -59,14 +59,16 @@ class OmregningDao( val statement = prepareStatement( """ - INSERT INTO omregningskjoering (kjoering, status, sak_id, begrunnelse) - VALUES (?, ?, ?, ?) + INSERT INTO omregningskjoering (kjoering, status, sak_id, begrunnelse, corr_id, feilende_steg) + VALUES (?, ?, ?, ?, ?, ?) """.trimIndent(), ) statement.setString(1, request.kjoering) statement.setString(2, request.status.name) statement.setSakId(3, request.sakId) - statement.setString(4, request.begrunnelse ?: "") + statement.setString(4, request.begrunnelse) + statement.setString(5, request.corrId) + statement.setString(6, request.feilendeSteg) statement.executeUpdate().also { require(it == 1) } } } diff --git a/apps/etterlatte-behandling/src/main/kotlin/inntektsjustering/AarligInntektsjusteringJobbService.kt b/apps/etterlatte-behandling/src/main/kotlin/inntektsjustering/AarligInntektsjusteringJobbService.kt index 8c8b59af8c2..4423f172d8f 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/inntektsjustering/AarligInntektsjusteringJobbService.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/inntektsjustering/AarligInntektsjusteringJobbService.kt @@ -26,7 +26,6 @@ import no.nav.etterlatte.libs.common.behandling.SakType import no.nav.etterlatte.libs.common.behandling.tilVirkningstidspunkt import no.nav.etterlatte.libs.common.beregning.AarligInntektsjusteringAvkortingSjekkResponse import no.nav.etterlatte.libs.common.feilhaandtering.InternfeilException -import no.nav.etterlatte.libs.common.inntektsjustering.AarligInntektsjusteringKjoering import no.nav.etterlatte.libs.common.inntektsjustering.AarligInntektsjusteringRequest import no.nav.etterlatte.libs.common.logging.getCorrelationId import no.nav.etterlatte.libs.common.person.PdlIdentifikator @@ -155,7 +154,7 @@ class AarligInntektsjusteringJobbService( } oppdaterKjoering(kjoering, KjoeringStatus.KLAR_FOR_OMREGNING, sakId) - publiserKlarForOmregning(sakId, loependeFom) + publiserKlarForOmregning(sakId, loependeFom, kjoering) } catch (e: Exception) { logger.warn("Automatisk jobb feilet! kjøring:$kjoering sak:$sakId", e) oppdaterKjoering( @@ -223,6 +222,7 @@ class AarligInntektsjusteringJobbService( private fun publiserKlarForOmregning( sakId: SakId, loependeFom: YearMonth, + kjoering: String, ) { val correlationId = getCorrelationId() rapid @@ -236,7 +236,7 @@ class AarligInntektsjusteringJobbService( TEKNISK_TID_KEY to Tidspunkt.now(), OmregningDataPacket.KEY to OmregningData( - kjoering = AarligInntektsjusteringKjoering.getKjoering(), + kjoering = kjoering, sakId = sakId, revurderingaarsak = Revurderingaarsak.AARLIG_INNTEKTSJUSTERING, fradato = loependeFom.atDay(1), diff --git a/apps/etterlatte-behandling/src/main/resources/db/migration/V183__omregning_kjoering_corrid_feilendesteg.sql b/apps/etterlatte-behandling/src/main/resources/db/migration/V183__omregning_kjoering_corrid_feilendesteg.sql new file mode 100644 index 00000000000..b366928d4dc --- /dev/null +++ b/apps/etterlatte-behandling/src/main/resources/db/migration/V183__omregning_kjoering_corrid_feilendesteg.sql @@ -0,0 +1,8 @@ +ALTER TABLE omregningskjoering + ADD COLUMN corr_id VARCHAR; + +ALTER TABLE omregningskjoering + ADD COLUMN feilende_steg VARCHAR; + +ALTER TABLE omregningskjoering + ALTER begrunnelse DROP NOT NULL; \ No newline at end of file diff --git a/apps/etterlatte-oppdater-behandling/src/main/kotlin/BehandlingService.kt b/apps/etterlatte-oppdater-behandling/src/main/kotlin/BehandlingService.kt index 05e6b83211c..c7a91884b5f 100644 --- a/apps/etterlatte-oppdater-behandling/src/main/kotlin/BehandlingService.kt +++ b/apps/etterlatte-oppdater-behandling/src/main/kotlin/BehandlingService.kt @@ -122,6 +122,9 @@ interface BehandlingService { sakId: SakId, status: KjoeringStatus, kjoering: String, + begrunnelse: String? = null, + corrId: String? = null, + feilendeSteg: String? = null, ) fun lagreFullfoertKjoering(request: LagreKjoeringRequest) @@ -368,6 +371,9 @@ class BehandlingServiceImpl( sakId: SakId, status: KjoeringStatus, kjoering: String, + begrunnelse: String?, + corrId: String?, + feilendeSteg: String?, ) { runBlocking { behandlingKlient.put("$url/omregning/kjoering") { @@ -377,6 +383,9 @@ class BehandlingServiceImpl( kjoering = kjoering, status = status, sakId = sakId, + begrunnelse = begrunnelse, + corrId = corrId, + feilendeSteg = feilendeSteg, ), ) } diff --git a/apps/etterlatte-oppdater-behandling/src/main/kotlin/regulering/OmregningFeiletRiver.kt b/apps/etterlatte-oppdater-behandling/src/main/kotlin/regulering/OmregningFeiletRiver.kt index 8027523c840..e54d48850df 100644 --- a/apps/etterlatte-oppdater-behandling/src/main/kotlin/regulering/OmregningFeiletRiver.kt +++ b/apps/etterlatte-oppdater-behandling/src/main/kotlin/regulering/OmregningFeiletRiver.kt @@ -1,6 +1,12 @@ package no.nav.etterlatte.regulering import no.nav.etterlatte.BehandlingService +import no.nav.etterlatte.libs.common.rapidsandrivers.CORRELATION_ID_KEY +import no.nav.etterlatte.libs.common.rapidsandrivers.FEILENDE_STEG +import no.nav.etterlatte.libs.common.rapidsandrivers.FEILMELDING_KEY +import no.nav.etterlatte.libs.common.rapidsandrivers.correlationId +import no.nav.etterlatte.libs.common.rapidsandrivers.feilendeSteg +import no.nav.etterlatte.libs.common.rapidsandrivers.feilmelding import no.nav.etterlatte.libs.common.sak.KjoeringStatus import no.nav.etterlatte.rapidsandrivers.EventNames.FEILA import no.nav.etterlatte.rapidsandrivers.KONTEKST_KEY @@ -25,6 +31,9 @@ internal class OmregningFeiletRiver( validate { it.requireKey(OmregningDataPacket.SAK_ID) } validate { it.requireKey(OmregningDataPacket.KJOERING) } validate { it.requireAny(KONTEKST_KEY, listOf(Kontekst.REGULERING.name, Kontekst.OMREGNING.name)) } + validate { it.interestedIn(FEILMELDING_KEY) } + validate { it.interestedIn(FEILENDE_STEG) } + validate { it.interestedIn(CORRELATION_ID_KEY) } } } @@ -39,6 +48,9 @@ internal class OmregningFeiletRiver( kjoering = omregningData.kjoering, sakId = omregningData.sakId, status = KjoeringStatus.FEILA, + begrunnelse = packet.feilmelding, + corrId = packet.correlationId, + feilendeSteg = packet.feilendeSteg, ) } } diff --git a/apps/etterlatte-oppdater-behandling/src/main/kotlin/regulering/VedtakAttestertRiver.kt b/apps/etterlatte-oppdater-behandling/src/main/kotlin/regulering/VedtakAttestertRiver.kt index aceade0c503..cf14ce6bcab 100644 --- a/apps/etterlatte-oppdater-behandling/src/main/kotlin/regulering/VedtakAttestertRiver.kt +++ b/apps/etterlatte-oppdater-behandling/src/main/kotlin/regulering/VedtakAttestertRiver.kt @@ -3,7 +3,7 @@ package no.nav.etterlatte.regulering import no.nav.etterlatte.BehandlingService import no.nav.etterlatte.brev.BrevRequestHendelseType import no.nav.etterlatte.brev.Brevkoder -import no.nav.etterlatte.libs.common.inntektsjustering.AarligInntektsjusteringKjoering +import no.nav.etterlatte.libs.common.behandling.Revurderingaarsak import no.nav.etterlatte.libs.common.rapidsandrivers.setEventNameForHendelseType import no.nav.etterlatte.libs.common.sak.KjoeringStatus import no.nav.etterlatte.libs.common.sak.LagreKjoeringRequest @@ -39,6 +39,7 @@ internal class VedtakAttestertRiver( validate { it.requireKey(OmregningDataPacket.KEY) } validate { it.requireKey(OmregningDataPacket.SAK_ID) } validate { it.requireKey(OmregningDataPacket.KJOERING) } + validate { it.requireKey(OmregningDataPacket.REV_AARSAK) } validate { it.interestedIn(BEREGNING_BELOEP_FOER) } validate { it.interestedIn(BEREGNING_BELOEP_ETTER) } validate { it.interestedIn(BEREGNING_G_FOER) } @@ -75,7 +76,7 @@ internal class VedtakAttestertRiver( ) // Årlig inntektsjustering jobb skal sende ut varsel og vedtak etter at sak er ferdig omregnet - if (kjoering === AarligInntektsjusteringKjoering.getKjoering()) { + if (packet.omregningData.revurderingaarsak == Revurderingaarsak.AARLIG_INNTEKTSJUSTERING) { packet.setEventNameForHendelseType(BrevRequestHendelseType.OPPRETT_JOURNALFOER_OG_DISTRIBUER) packet.brevKode = Brevkoder.OMS_INNTEKTSJUSTERING_VARSEL.name packet.sakId = packet.omregningData.sakId diff --git a/apps/etterlatte-oppdater-behandling/src/test/kotlin/regulering/OmregningFeiletRiverTest.kt b/apps/etterlatte-oppdater-behandling/src/test/kotlin/regulering/OmregningFeiletRiverTest.kt index ed6fe3fe189..4e950c9312d 100644 --- a/apps/etterlatte-oppdater-behandling/src/test/kotlin/regulering/OmregningFeiletRiverTest.kt +++ b/apps/etterlatte-oppdater-behandling/src/test/kotlin/regulering/OmregningFeiletRiverTest.kt @@ -6,9 +6,13 @@ import io.mockk.slot import no.nav.etterlatte.BehandlingService import no.nav.etterlatte.behandling.randomSakId import no.nav.etterlatte.libs.common.behandling.Revurderingaarsak +import no.nav.etterlatte.libs.common.rapidsandrivers.CORRELATION_ID_KEY +import no.nav.etterlatte.libs.common.rapidsandrivers.FEILENDE_STEG +import no.nav.etterlatte.libs.common.rapidsandrivers.FEILMELDING_KEY import no.nav.etterlatte.libs.common.rapidsandrivers.lagParMedEventNameKey import no.nav.etterlatte.libs.common.sak.KjoeringStatus import no.nav.etterlatte.libs.common.sak.SakId +import no.nav.etterlatte.libs.common.toJson import no.nav.etterlatte.rapidsandrivers.EventNames.FEILA import no.nav.etterlatte.rapidsandrivers.HENDELSE_DATA_KEY import no.nav.etterlatte.rapidsandrivers.KONTEKST_KEY @@ -19,6 +23,7 @@ import no.nav.helse.rapids_rivers.JsonMessage import no.nav.helse.rapids_rivers.testsupport.TestRapid import org.junit.jupiter.api.Assertions import org.junit.jupiter.api.Test +import java.util.UUID internal class OmregningFeiletRiverTest { @Test @@ -27,6 +32,10 @@ internal class OmregningFeiletRiverTest { val status = slot() val sakIdSlot = slot() val sakId = randomSakId() + val begrunnelse = slot() + val corrId = UUID.randomUUID().toString() + val corrIdSlot = slot() + val feilendeSteg = slot() val melding = JsonMessage.newMessage( @@ -40,11 +49,23 @@ internal class OmregningFeiletRiverTest { sakId = sakId, revurderingaarsak = Revurderingaarsak.OMREGNING, ).toPacket(), + FEILMELDING_KEY to "feilmelding", + CORRELATION_ID_KEY to corrId, + FEILENDE_STEG to "feilende steg", ), ) val behandlingService = mockk(relaxed = true) - every { behandlingService.lagreKjoering(capture(sakIdSlot), capture(status), capture(kjoering)) } returns Unit + every { + behandlingService.lagreKjoering( + capture(sakIdSlot), + capture(status), + capture(kjoering), + capture(begrunnelse), + capture(corrIdSlot), + capture(feilendeSteg), + ) + } returns Unit val inspector = TestRapid().apply { OmregningFeiletRiver(this, behandlingService) } inspector.sendTestMessage(melding.toJson()) @@ -53,6 +74,9 @@ internal class OmregningFeiletRiverTest { Assertions.assertEquals("OmregningKjoering", kjoering.captured) Assertions.assertEquals(sakId, sakIdSlot.captured) Assertions.assertEquals(KjoeringStatus.FEILA, status.captured) + Assertions.assertEquals("feilmelding".toJson(), begrunnelse.captured) + Assertions.assertEquals(corrId, corrIdSlot.captured) + Assertions.assertEquals("feilende steg", feilendeSteg.captured) } @Test @@ -70,6 +94,8 @@ internal class OmregningFeiletRiverTest { sakId = sakId, revurderingaarsak = Revurderingaarsak.REGULERING, ).toPacket(), + FEILMELDING_KEY to "", + FEILENDE_STEG to "", ), ) diff --git a/libs/etterlatte-behandling-model/src/main/kotlin/no/nav/etterlatte/libs/common/inntektsjustering/AarligInntektsjusteringRequest.kt b/libs/etterlatte-behandling-model/src/main/kotlin/no/nav/etterlatte/libs/common/inntektsjustering/AarligInntektsjusteringRequest.kt index 4af5fd8a623..ed56cf325b2 100644 --- a/libs/etterlatte-behandling-model/src/main/kotlin/no/nav/etterlatte/libs/common/inntektsjustering/AarligInntektsjusteringRequest.kt +++ b/libs/etterlatte-behandling-model/src/main/kotlin/no/nav/etterlatte/libs/common/inntektsjustering/AarligInntektsjusteringRequest.kt @@ -1,7 +1,6 @@ package no.nav.etterlatte.libs.common.inntektsjustering import no.nav.etterlatte.libs.common.sak.SakId -import java.time.Year import java.time.YearMonth data class AarligInntektsjusteringRequest( @@ -9,7 +8,3 @@ data class AarligInntektsjusteringRequest( val loependeFom: YearMonth, val saker: List, ) - -object AarligInntektsjusteringKjoering { - fun getKjoering(): String = "Årlig inntektsjustering ${Year.now().plusYears(1)}" -} diff --git a/libs/etterlatte-behandling-model/src/main/kotlin/no/nav/etterlatte/libs/common/sak/KjoeringRequest.kt b/libs/etterlatte-behandling-model/src/main/kotlin/no/nav/etterlatte/libs/common/sak/KjoeringRequest.kt index 0c894ee93b7..c3a247d6194 100644 --- a/libs/etterlatte-behandling-model/src/main/kotlin/no/nav/etterlatte/libs/common/sak/KjoeringRequest.kt +++ b/libs/etterlatte-behandling-model/src/main/kotlin/no/nav/etterlatte/libs/common/sak/KjoeringRequest.kt @@ -7,6 +7,8 @@ data class KjoeringRequest( val status: KjoeringStatus, val sakId: SakId, val begrunnelse: String? = null, + val corrId: String? = null, + val feilendeSteg: String? = null, ) data class LagreKjoeringRequest( diff --git a/libs/rapidsandrivers-extras/src/main/kotlin/rapidsandrivers/OmregningHendelseType.kt b/libs/rapidsandrivers-extras/src/main/kotlin/rapidsandrivers/OmregningHendelseType.kt index 3d7f77da3b7..59fd85224af 100644 --- a/libs/rapidsandrivers-extras/src/main/kotlin/rapidsandrivers/OmregningHendelseType.kt +++ b/libs/rapidsandrivers-extras/src/main/kotlin/rapidsandrivers/OmregningHendelseType.kt @@ -130,6 +130,7 @@ data class OmregningDataPacket( val FRA_DATO = "$HENDELSE_DATA_KEY.${OmregningDataPacket::fradato.name}" val BEHANDLING_ID = "$HENDELSE_DATA_KEY.${OmregningDataPacket::behandlingId.name}" val FORRIGE_BEHANDLING_ID = "$HENDELSE_DATA_KEY.${OmregningDataPacket::forrigeBehandlingId.name}" + val REV_AARSAK = "$HENDELSE_DATA_KEY.${OmregningDataPacket::revurderingaarsak.name}" } } diff --git a/libs/rapidsandrivers-extras/src/main/kotlin/rapidsandrivers/RetryOgFeilhaandtering.kt b/libs/rapidsandrivers-extras/src/main/kotlin/rapidsandrivers/RetryOgFeilhaandtering.kt index f092844efd1..ff05fecbda1 100644 --- a/libs/rapidsandrivers-extras/src/main/kotlin/rapidsandrivers/RetryOgFeilhaandtering.kt +++ b/libs/rapidsandrivers-extras/src/main/kotlin/rapidsandrivers/RetryOgFeilhaandtering.kt @@ -33,7 +33,10 @@ internal fun withRetryOgFeilhaandtering( } } catch (e: Exception) { feilhaandteringLogger.error("Håndtering av melding ${packet.id} feila på steg $feilendeSteg.", e) - sikkerLogg.error("Håndtering av melding ${packet.id} feila på steg $feilendeSteg. med body ${packet.toJson()}", e) + sikkerLogg.error( + "Håndtering av melding ${packet.id} feila på steg $feilendeSteg. med body ${packet.toJson()}", + e, + ) publiserFeilamelding(packet, feilendeSteg, kontekst, e, context) feilhaandteringLogger.warn("Fikk feil, sendte ut på feilkø, returnerer nå failure-result") From ac32c5d6abfe1ae1151c2d7e2f058c590e4daaf9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Golberg?= Date: Thu, 7 Nov 2024 17:40:40 +0100 Subject: [PATCH 07/85] Aarlig inntektsjustering hent saker (#6260) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Feil skal avbryte behandling * Fjerner where clause på opphoerFom fordi den ikke fungerer --- .../kotlin/behandling/BehandlingService.kt | 6 +- .../src/main/kotlin/sak/SakLesDao.kt | 9 +-- .../src/test/kotlin/sak/SakSkrivDaoTest.kt | 60 ------------------- 3 files changed, 8 insertions(+), 67 deletions(-) diff --git a/apps/etterlatte-behandling/src/main/kotlin/behandling/BehandlingService.kt b/apps/etterlatte-behandling/src/main/kotlin/behandling/BehandlingService.kt index b729238d9be..1c175c6bd77 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/behandling/BehandlingService.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/BehandlingService.kt @@ -867,7 +867,11 @@ internal class BehandlingServiceImpl( behandlingDao .hentAlleRevurderingerISakMedAarsak( sakId, - listOf(Revurderingaarsak.REGULERING, Revurderingaarsak.OMREGNING), + listOf( + Revurderingaarsak.REGULERING, + Revurderingaarsak.OMREGNING, + Revurderingaarsak.AARLIG_INNTEKTSJUSTERING, + ), ).singleOrNull { it.status != BehandlingStatus.AVBRUTT && it.status != BehandlingStatus.IVERKSATT }?.id diff --git a/apps/etterlatte-behandling/src/main/kotlin/sak/SakLesDao.kt b/apps/etterlatte-behandling/src/main/kotlin/sak/SakLesDao.kt index d4eb189925b..2aec3ef0b8f 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/sak/SakLesDao.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/sak/SakLesDao.kt @@ -80,7 +80,7 @@ class SakLesDao( ${if (spesifikkeSaker.isEmpty()) "" else " AND id = ANY(?)"} ${if (ekskluderteSaker.isEmpty()) "" else " AND NOT(id = ANY(?))"} ${if (sakType == null) "" else " AND s.saktype = ?"} - ${if (loependeFom == null) "" else " AND EXISTS (SELECT 1 FROM behandling b WHERE b.sak_id = s.id AND b.opphoer_fom > ?)"} + ORDER BY id ASC LIMIT $antall """.trimMargin(), @@ -98,10 +98,6 @@ class SakLesDao( statement.setString(paramIndex, sakType.name) paramIndex += 1 } - if (loependeFom != null) { - statement.setString(paramIndex, loependeFom.toString()) - paramIndex += 1 - } statement .executeQuery() @@ -122,7 +118,8 @@ class SakLesDao( fun finnSakMedGraderingOgSkjerming(id: SakId): SakMedGraderingOgSkjermet = connectionAutoclosing.hentConnection { connection -> - val statement = connection.prepareStatement("SELECT id, adressebeskyttelse, erSkjermet, enhet from sak where id = ?") + val statement = + connection.prepareStatement("SELECT id, adressebeskyttelse, erSkjermet, enhet from sak where id = ?") statement.setSakId(1, id) statement.executeQuery().single { SakMedGraderingOgSkjermet( diff --git a/apps/etterlatte-behandling/src/test/kotlin/sak/SakSkrivDaoTest.kt b/apps/etterlatte-behandling/src/test/kotlin/sak/SakSkrivDaoTest.kt index 6d3088e17db..d7fd0f4e882 100644 --- a/apps/etterlatte-behandling/src/test/kotlin/sak/SakSkrivDaoTest.kt +++ b/apps/etterlatte-behandling/src/test/kotlin/sak/SakSkrivDaoTest.kt @@ -35,7 +35,6 @@ import org.junit.jupiter.api.Test import org.junit.jupiter.api.TestInstance import org.junit.jupiter.api.extension.RegisterExtension import java.time.LocalDate -import java.time.YearMonth import javax.sql.DataSource @TestInstance(TestInstance.Lifecycle.PER_CLASS) @@ -219,65 +218,6 @@ internal class SakSkrivDaoTest( saker.forEach { it.id shouldNotBe sak1.id } } - @Test - fun `Skal hente alle saker som er loepende fra og med dato`() { - val sak1 = sakRepo.opprettSak("fnr1", SakType.BARNEPENSJON, Enheter.PORSGRUNN.enhetNr) - behandlingRepo.opprettBehandling( - opprettBehandling( - type = BehandlingType.FØRSTEGANGSBEHANDLING, - sakId = sak1.id, - prosesstype = Prosesstype.MANUELL, - opphoerFraOgMed = YearMonth.of(2024, 1), - ), - ) - - val sak2 = sakRepo.opprettSak("fnr2", SakType.BARNEPENSJON, Enheter.PORSGRUNN.enhetNr) - behandlingRepo.opprettBehandling( - opprettBehandling( - type = BehandlingType.FØRSTEGANGSBEHANDLING, - sakId = sak2.id, - prosesstype = Prosesstype.MANUELL, - opphoerFraOgMed = YearMonth.of(2024, 12), - ), - ) - - val sak3 = sakRepo.opprettSak("fnr3", SakType.BARNEPENSJON, Enheter.PORSGRUNN.enhetNr) - behandlingRepo.opprettBehandling( - opprettBehandling( - type = BehandlingType.FØRSTEGANGSBEHANDLING, - sakId = sak3.id, - prosesstype = Prosesstype.MANUELL, - opphoerFraOgMed = YearMonth.of(2025, 1), - ), - ) - - val saker = - sakLesDao.hentSaker( - "", - 4, - emptyList(), - emptyList(), - loependeFom = YearMonth.of(2024, 12), - ) - - saker.size shouldBe 1 - saker shouldContain sak3 - - // Negativ test - val sakerNegative = - sakLesDao.hentSaker( - "", - 4, - emptyList(), - emptyList(), - ) - - sakerNegative.size shouldBe 3 - sakerNegative shouldContain sak1 - sakerNegative shouldContain sak2 - sakerNegative shouldContain sak3 - } - @Test fun `Skal utelate ekskluderte saker`() { val sak1 = sakRepo.opprettSak("fnr1", SakType.BARNEPENSJON, Enheter.PORSGRUNN.enhetNr) From 6ad2899a1b9895ac280abc1d085538981b7c2fe6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Oliver=20S=C3=B8berg?= <82504565+sebassonav@users.noreply.github.com> Date: Thu, 7 Nov 2024 18:24:45 +0100 Subject: [PATCH 08/85] Hotfix kan ferdigstille oppgave aks 12mnd (#6258) --- .../src/components/aktivitetsplikt/brev/UtenBrevVisning.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/brev/UtenBrevVisning.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/brev/UtenBrevVisning.tsx index 4606304cc95..0bfc2adc1d0 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/brev/UtenBrevVisning.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/brev/UtenBrevVisning.tsx @@ -36,7 +36,7 @@ export function UtenBrevVisning() { )} From 3c803a6148a3fd74a01415419e425916a57c5793 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Golberg?= Date: Thu, 7 Nov 2024 18:26:44 +0100 Subject: [PATCH 09/85] =?UTF-8?q?Videref=C3=B8re=20inntekt=20inn=20i=20nyt?= =?UTF-8?q?t=20=C3=A5r=20under=20=C3=A5rlig=20innntektsjustering=20(#6259)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Videreføre inntekt inn i nytt år under årlig innntektsjustering * Legger ved år for å kunne verifisere inntekt som videreføres --- .../beregningkafka/BeregningService.kt | 22 ++++++ .../OmregningHendelserBeregningRiver.kt | 38 ++++++---- .../OmregningHendelserBeregningRiverTest.kt | 68 ++++++++++++------ .../src/main/kotlin/Application.kt | 7 +- .../AarligInntektsjusteringService.kt | 69 +++++++++++++++++++ .../main/kotlin/avkorting/AvkortingRoutes.kt | 24 +++++-- .../main/kotlin/avkorting/AvkortingService.kt | 29 ++------ .../main/kotlin/config/ApplicationContext.kt | 7 ++ .../kotlin/avkorting/AvkortingRoutesTest.kt | 8 ++- .../src/main/kotlin/BeregningDTO.kt | 6 ++ 10 files changed, 214 insertions(+), 64 deletions(-) create mode 100644 apps/etterlatte-beregning/src/main/kotlin/avkorting/AarligInntektsjusteringService.kt diff --git a/apps/etterlatte-beregning-kafka/src/main/kotlin/no/nav/etterlatte/beregningkafka/BeregningService.kt b/apps/etterlatte-beregning-kafka/src/main/kotlin/no/nav/etterlatte/beregningkafka/BeregningService.kt index 6ab90b0ed3f..a474da2b3a9 100644 --- a/apps/etterlatte-beregning-kafka/src/main/kotlin/no/nav/etterlatte/beregningkafka/BeregningService.kt +++ b/apps/etterlatte-beregning-kafka/src/main/kotlin/no/nav/etterlatte/beregningkafka/BeregningService.kt @@ -5,10 +5,14 @@ import io.ktor.client.call.body import io.ktor.client.request.get import io.ktor.client.request.post import io.ktor.client.request.put +import io.ktor.client.request.setBody import io.ktor.client.statement.HttpResponse +import io.ktor.http.ContentType +import io.ktor.http.contentType import io.ktor.http.isSuccess import kotlinx.coroutines.runBlocking import no.nav.etterlatte.grunnbeloep.Grunnbeloep +import no.nav.etterlatte.libs.common.beregning.AarligInntektsjusteringAvkortingRequest import java.util.UUID class BeregningService( @@ -61,6 +65,24 @@ class BeregningService( beregningApp.get("$url/api/beregning/avkorting/$behandlingId/ferdig") } + fun omregnAarligInntektsjustering( + aar: Int, + behandlingId: UUID, + forrigeBehandlingId: UUID, + ): HttpResponse = + runBlocking { + beregningApp.post("$url/api/beregning/avkorting/aarlig-inntektsjustering") { + contentType(ContentType.Application.Json) + setBody( + AarligInntektsjusteringAvkortingRequest( + aar = aar, + nyBehandling = behandlingId, + forrigeBehandling = forrigeBehandlingId, + ), + ) + } + } + suspend fun hentGrunnbeloep(): Grunnbeloep = beregningApp .get("$url/api/beregning/grunnbeloep") diff --git a/apps/etterlatte-beregning-kafka/src/main/kotlin/no/nav/etterlatte/beregningkafka/OmregningHendelserBeregningRiver.kt b/apps/etterlatte-beregning-kafka/src/main/kotlin/no/nav/etterlatte/beregningkafka/OmregningHendelserBeregningRiver.kt index 1e8fc322f22..1a83f881fea 100644 --- a/apps/etterlatte-beregning-kafka/src/main/kotlin/no/nav/etterlatte/beregningkafka/OmregningHendelserBeregningRiver.kt +++ b/apps/etterlatte-beregning-kafka/src/main/kotlin/no/nav/etterlatte/beregningkafka/OmregningHendelserBeregningRiver.kt @@ -16,6 +16,7 @@ import no.nav.etterlatte.rapidsandrivers.BEREGNING_KEY import no.nav.etterlatte.rapidsandrivers.HENDELSE_DATA_KEY import no.nav.etterlatte.rapidsandrivers.Kontekst import no.nav.etterlatte.rapidsandrivers.ListenerMedLoggingOgFeilhaandtering +import no.nav.etterlatte.rapidsandrivers.OmregningData import no.nav.etterlatte.rapidsandrivers.OmregningDataPacket import no.nav.etterlatte.rapidsandrivers.OmregningHendelseType import no.nav.etterlatte.rapidsandrivers.ReguleringEvents @@ -59,11 +60,8 @@ internal class OmregningHendelserBeregningRiver( ) { logger.info("Mottatt omregninghendelse") val omregningData = packet.omregningData - val behandlingId = omregningData.hentBehandlingId() - val behandlingViOmregnerFra = omregningData.hentForrigeBehandlingid() - val sakType = omregningData.hentSakType() runBlocking { - val beregning = beregn(sakType, omregningData.revurderingaarsak, behandlingId, behandlingViOmregnerFra) + val beregning = beregn(omregningData) packet[BEREGNING_KEY] = beregning.beregning // TODO bør vi ha slike ting her? @@ -76,12 +74,12 @@ internal class OmregningHendelserBeregningRiver( logger.info("Publiserte oppdatert omregningshendelse") } - internal suspend fun beregn( - sakType: SakType, - revurderingaarsak: Revurderingaarsak, - behandlingId: UUID, - behandlingViOmregnerFra: UUID, - ): BeregningOgAvkorting { + internal suspend fun beregn(omregningData: OmregningData): BeregningOgAvkorting { + val behandlingId = omregningData.hentBehandlingId() + val behandlingViOmregnerFra = omregningData.hentForrigeBehandlingid() + val sakType = omregningData.hentSakType() + val fraDato = omregningData.hentFraDato() + val revurderingaarsak = omregningData.revurderingaarsak beregningService.opprettBeregningsgrunnlagFraForrigeBehandling(behandlingId, behandlingViOmregnerFra) beregningService.tilpassOverstyrtBeregningsgrunnlagForRegulering(behandlingId) val beregning = beregningService.beregn(behandlingId).body() @@ -95,9 +93,23 @@ internal class OmregningHendelserBeregningRiver( return if (sakType == SakType.OMSTILLINGSSTOENAD) { val avkorting = - beregningService - .omregnAvkorting(behandlingId, behandlingViOmregnerFra) - .body() + when (revurderingaarsak) { + Revurderingaarsak.AARLIG_INNTEKTSJUSTERING -> { + beregningService + .omregnAarligInntektsjustering( + aar = fraDato.year, + behandlingId = behandlingId, + forrigeBehandlingId = behandlingViOmregnerFra, + ).body() + } + + else -> { + beregningService + .omregnAvkorting(behandlingId, behandlingViOmregnerFra) + .body() + } + } + val forrigeAvkorting = beregningService .hentAvkorting(behandlingViOmregnerFra) diff --git a/apps/etterlatte-beregning-kafka/src/test/kotlin/no/nav/etterlatte/beregningkafka/OmregningHendelserBeregningRiverTest.kt b/apps/etterlatte-beregning-kafka/src/test/kotlin/no/nav/etterlatte/beregningkafka/OmregningHendelserBeregningRiverTest.kt index 5a2a29b810a..3175e43d47e 100644 --- a/apps/etterlatte-beregning-kafka/src/test/kotlin/no/nav/etterlatte/beregningkafka/OmregningHendelserBeregningRiverTest.kt +++ b/apps/etterlatte-beregning-kafka/src/test/kotlin/no/nav/etterlatte/beregningkafka/OmregningHendelserBeregningRiverTest.kt @@ -16,13 +16,16 @@ import no.nav.etterlatte.libs.common.beregning.BeregningDTO import no.nav.etterlatte.libs.common.beregning.Beregningsperiode import no.nav.etterlatte.libs.common.beregning.Beregningstype import no.nav.etterlatte.libs.common.grunnlag.Metadata +import no.nav.etterlatte.libs.common.sak.SakId import no.nav.etterlatte.libs.common.tidspunkt.Tidspunkt +import no.nav.etterlatte.rapidsandrivers.OmregningData import no.nav.helse.rapids_rivers.RapidsConnection import no.nav.helse.rapids_rivers.River import org.junit.jupiter.api.Assertions.assertNotNull import org.junit.jupiter.api.Test import org.junit.jupiter.api.assertThrows import java.math.BigDecimal +import java.time.LocalDate import java.time.Month import java.time.YearMonth import java.util.UUID @@ -54,10 +57,15 @@ class OmregningHendelserBeregningRiverTest { runBlocking { river.beregn( - SakType.BARNEPENSJON, - revurderingaarsak = Revurderingaarsak.REGULERING, - behandlingId = nyBehandling, - behandlingViOmregnerFra = gammelBehandling, + OmregningData( + kjoering = "", + sakId = SakId(123L), + sakType = SakType.BARNEPENSJON, + revurderingaarsak = Revurderingaarsak.REGULERING, + behandlingId = nyBehandling, + forrigeBehandlingId = gammelBehandling, + fradato = LocalDate.of(2024, 1, 1), + ), ) } } @@ -89,10 +97,15 @@ class OmregningHendelserBeregningRiverTest { runBlocking { assertThrows { river.beregn( - SakType.BARNEPENSJON, - revurderingaarsak = Revurderingaarsak.REGULERING, - behandlingId = nyBehandling, - behandlingViOmregnerFra = gammelBehandling, + OmregningData( + kjoering = "", + sakId = SakId(123L), + sakType = SakType.BARNEPENSJON, + revurderingaarsak = Revurderingaarsak.REGULERING, + behandlingId = nyBehandling, + forrigeBehandlingId = gammelBehandling, + fradato = LocalDate.of(2024, 1, 1), + ), ) } } @@ -126,10 +139,15 @@ class OmregningHendelserBeregningRiverTest { runBlocking { river.beregn( - SakType.BARNEPENSJON, - revurderingaarsak = Revurderingaarsak.REGULERING, - behandlingId = nyBehandling, - behandlingViOmregnerFra = gammelBehandling, + OmregningData( + kjoering = "", + sakId = SakId(123L), + sakType = SakType.BARNEPENSJON, + revurderingaarsak = Revurderingaarsak.REGULERING, + behandlingId = nyBehandling, + forrigeBehandlingId = gammelBehandling, + fradato = LocalDate.of(2024, 1, 1), + ), ) } } @@ -161,10 +179,15 @@ class OmregningHendelserBeregningRiverTest { runBlocking { assertThrows { river.beregn( - SakType.BARNEPENSJON, - revurderingaarsak = Revurderingaarsak.REGULERING, - behandlingId = nyBehandling, - behandlingViOmregnerFra = gammelBehandling, + OmregningData( + kjoering = "", + sakId = SakId(123L), + sakType = SakType.BARNEPENSJON, + revurderingaarsak = Revurderingaarsak.REGULERING, + behandlingId = nyBehandling, + forrigeBehandlingId = gammelBehandling, + fradato = LocalDate.of(2024, 1, 1), + ), ) } } @@ -197,10 +220,15 @@ class OmregningHendelserBeregningRiverTest { runBlocking { val resultat = river.beregn( - SakType.BARNEPENSJON, - revurderingaarsak = Revurderingaarsak.REGULERING, - behandlingId = nyBehandling, - behandlingViOmregnerFra = gammelBehandling, + OmregningData( + kjoering = "", + sakId = SakId(123L), + sakType = SakType.BARNEPENSJON, + revurderingaarsak = Revurderingaarsak.REGULERING, + behandlingId = nyBehandling, + forrigeBehandlingId = gammelBehandling, + fradato = LocalDate.of(2024, 1, 1), + ), ) assertNotNull(resultat) diff --git a/apps/etterlatte-beregning/src/main/kotlin/Application.kt b/apps/etterlatte-beregning/src/main/kotlin/Application.kt index 94966cde519..f71280aa5ac 100644 --- a/apps/etterlatte-beregning/src/main/kotlin/Application.kt +++ b/apps/etterlatte-beregning/src/main/kotlin/Application.kt @@ -31,7 +31,12 @@ class Server( ) { beregning(beregningService, behandlingKlient) beregningsGrunnlag(beregningsGrunnlagService, behandlingKlient) - avkorting(avkortingService, behandlingKlient, avkortingTidligAlderspensjonService) + avkorting( + avkortingService, + behandlingKlient, + avkortingTidligAlderspensjonService, + aarligInntektsjusteringService, + ) ytelseMedGrunnlag(ytelseMedGrunnlagService, behandlingKlient) grunnbeloep(grunnbeloepService) sanksjon(sanksjonService, behandlingKlient) diff --git a/apps/etterlatte-beregning/src/main/kotlin/avkorting/AarligInntektsjusteringService.kt b/apps/etterlatte-beregning/src/main/kotlin/avkorting/AarligInntektsjusteringService.kt new file mode 100644 index 00000000000..c900a14d92b --- /dev/null +++ b/apps/etterlatte-beregning/src/main/kotlin/avkorting/AarligInntektsjusteringService.kt @@ -0,0 +1,69 @@ +package no.nav.etterlatte.avkorting + +import no.nav.etterlatte.libs.common.beregning.AarligInntektsjusteringAvkortingSjekkRequest +import no.nav.etterlatte.libs.common.beregning.AarligInntektsjusteringAvkortingSjekkResponse +import no.nav.etterlatte.libs.common.beregning.AvkortingGrunnlagLagreDto +import no.nav.etterlatte.libs.common.feilhaandtering.InternfeilException +import no.nav.etterlatte.libs.ktor.token.BrukerTokenInfo +import no.nav.etterlatte.sanksjon.SanksjonService +import org.slf4j.LoggerFactory +import java.time.YearMonth +import java.util.UUID + +class AarligInntektsjusteringService( + private val avkortingService: AvkortingService, + private val avkortingRepository: AvkortingRepository, + private val sanksjonService: SanksjonService, +) { + private val logger = LoggerFactory.getLogger(this::class.java) + + fun hentSjekkAarligInntektsjustering( + request: AarligInntektsjusteringAvkortingSjekkRequest, + ): AarligInntektsjusteringAvkortingSjekkResponse { + val sanksjoner = sanksjonService.hentSanksjon(request.sisteBehandling) + return AarligInntektsjusteringAvkortingSjekkResponse( + sakId = request.sakId, + aar = request.aar, + harInntektForAar = avkortingRepository.harSakInntektForAar(request), + harSanksjon = sanksjoner?.any { it.tom == null } ?: false, + ) + } + + suspend fun kopierAarligInntektsjustering( + aar: Int, + behandlingId: UUID, + forrigeBehandlingId: UUID, + brukerTokenInfo: BrukerTokenInfo, + ): Avkorting { + avkortingService.tilstandssjekk(behandlingId, brukerTokenInfo) + logger.info("Oppretter avkorting for nytt inntektsår med siste inntekt fra behandling=$forrigeBehandlingId") + val forrigeAvkorting = avkortingService.hentForrigeAvkorting(forrigeBehandlingId) + + val siseInntekt = + forrigeAvkorting.aarsoppgjoer + .last() + .inntektsavkorting + .last() + .grunnlag + + with(siseInntekt.periode) { + if (fom.year != aar - 1 || (tom != null && tom?.year != aar - 1)) { + throw InternfeilException("Årlig inntektsjustering feilet - inntekt som overføres er i feil år") + } + } + + val nyttGrunnlag = + AvkortingGrunnlagLagreDto( + inntektTom = siseInntekt.inntektTom, + fratrekkInnAar = 0, + inntektUtlandTom = siseInntekt.inntektUtlandTom, + fratrekkInnAarUtland = 0, + spesifikasjon = siseInntekt.spesifikasjon, + fom = YearMonth.of(aar, 1), + ) + + avkortingService.beregnAvkortingMedNyttGrunnlag(behandlingId, brukerTokenInfo, nyttGrunnlag) + return avkortingRepository.hentAvkorting(behandlingId) + ?: throw AvkortingFinnesIkkeException(behandlingId) + } +} diff --git a/apps/etterlatte-beregning/src/main/kotlin/avkorting/AvkortingRoutes.kt b/apps/etterlatte-beregning/src/main/kotlin/avkorting/AvkortingRoutes.kt index 8dd13bdd95a..1a5dea37e3f 100644 --- a/apps/etterlatte-beregning/src/main/kotlin/avkorting/AvkortingRoutes.kt +++ b/apps/etterlatte-beregning/src/main/kotlin/avkorting/AvkortingRoutes.kt @@ -10,6 +10,7 @@ import io.ktor.server.routing.get import io.ktor.server.routing.post import io.ktor.server.routing.route import no.nav.etterlatte.klienter.BehandlingKlient +import no.nav.etterlatte.libs.common.beregning.AarligInntektsjusteringAvkortingRequest import no.nav.etterlatte.libs.common.beregning.AarligInntektsjusteringAvkortingSjekkRequest import no.nav.etterlatte.libs.common.beregning.AvkortetYtelseDto import no.nav.etterlatte.libs.common.beregning.AvkortingGrunnlagDto @@ -26,6 +27,7 @@ fun Route.avkorting( avkortingService: AvkortingService, behandlingKlient: BehandlingKlient, tidligAlderspensjonService: AvkortingTidligAlderspensjonService, + aarligInntektsjusteringService: AarligInntektsjusteringService, ) { val logger = routeLogger @@ -87,13 +89,25 @@ fun Route.avkorting( } } - route("/api/beregning/avkorting/aarlig-inntektsjustering-sjekk") { - post { - val harInntektForAarDto = call.receive() - logger.info("Henter har inntekt for ${harInntektForAarDto.aar} for sakId=${harInntektForAarDto.sakId}") - val respons = avkortingService.hentSjekkAarligInntektsjustering(harInntektForAarDto) + route("/api/beregning/avkorting") { + post("aarlig-inntektsjustering-sjekk") { + val request = call.receive() + logger.info("Henter har inntekt for ${request.aar} for sakId=${request.sakId}") + val respons = aarligInntektsjusteringService.hentSjekkAarligInntektsjustering(request) call.respond(respons) } + post("aarlig-inntektsjustering") { + val request = call.receive() + logger.info("Oppretter avkorting nytt år for behandling=${request.nyBehandling}") + val respons = + aarligInntektsjusteringService.kopierAarligInntektsjustering( + aar = request.aar, + behandlingId = request.nyBehandling, + forrigeBehandlingId = request.forrigeBehandling, + brukerTokenInfo = brukerTokenInfo, + ) + call.respond(respons.toDto()) + } } } diff --git a/apps/etterlatte-beregning/src/main/kotlin/avkorting/AvkortingService.kt b/apps/etterlatte-beregning/src/main/kotlin/avkorting/AvkortingService.kt index 2ad65f1df8b..3ffb9645e86 100644 --- a/apps/etterlatte-beregning/src/main/kotlin/avkorting/AvkortingService.kt +++ b/apps/etterlatte-beregning/src/main/kotlin/avkorting/AvkortingService.kt @@ -10,8 +10,6 @@ import no.nav.etterlatte.libs.common.behandling.BehandlingStatus import no.nav.etterlatte.libs.common.behandling.BehandlingType import no.nav.etterlatte.libs.common.behandling.DetaljertBehandling import no.nav.etterlatte.libs.common.behandling.virkningstidspunkt -import no.nav.etterlatte.libs.common.beregning.AarligInntektsjusteringAvkortingSjekkRequest -import no.nav.etterlatte.libs.common.beregning.AarligInntektsjusteringAvkortingSjekkResponse import no.nav.etterlatte.libs.common.beregning.AvkortingDto import no.nav.etterlatte.libs.common.beregning.AvkortingFrontend import no.nav.etterlatte.libs.common.beregning.AvkortingGrunnlagLagreDto @@ -56,7 +54,6 @@ class AvkortingService( val reberegnetAvkorting = reberegnOgLagreAvkorting( behandling, - behandling.sak, eksisterendeAvkorting, brukerTokenInfo, BehandlingType.FØRSTEGANGSBEHANDLING, @@ -71,13 +68,12 @@ class AvkortingService( val forrigeAvkorting = hentAvkortingForrigeBehandling(behandling.sak, brukerTokenInfo) return if (eksisterendeAvkorting == null) { val nyAvkorting = - kopierOgReberegnAvkorting(behandling, behandling.sak, forrigeAvkorting, brukerTokenInfo) + kopierOgReberegnAvkorting(behandling, forrigeAvkorting, brukerTokenInfo) avkortingMedTillegg(nyAvkorting, behandling, forrigeAvkorting) } else if (behandling.status == BehandlingStatus.BEREGNET) { val reberegnetAvkorting = reberegnOgLagreAvkorting( behandling, - behandling.sak, eksisterendeAvkorting, brukerTokenInfo, BehandlingType.REVURDERING, @@ -88,18 +84,6 @@ class AvkortingService( } } - fun hentSjekkAarligInntektsjustering( - request: AarligInntektsjusteringAvkortingSjekkRequest, - ): AarligInntektsjusteringAvkortingSjekkResponse { - val sanksjoner = sanksjonService.hentSanksjon(request.sisteBehandling) - return AarligInntektsjusteringAvkortingSjekkResponse( - sakId = request.sakId, - aar = request.aar, - harInntektForAar = avkortingRepository.harSakInntektForAar(request), - harSanksjon = sanksjoner?.any { it.tom == null } ?: false, - ) - } - suspend fun hentFullfoertAvkorting( behandlingId: UUID, brukerTokenInfo: BrukerTokenInfo, @@ -184,12 +168,11 @@ class AvkortingService( logger.info("Kopierer avkorting fra forrige behandling med behandlingId=$forrigeBehandlingId") val forrigeAvkorting = hentForrigeAvkorting(forrigeBehandlingId) val behandling = behandlingKlient.hentBehandling(behandlingId, brukerTokenInfo) - return kopierOgReberegnAvkorting(behandling, behandling.sak, forrigeAvkorting, brukerTokenInfo) + return kopierOgReberegnAvkorting(behandling, forrigeAvkorting, brukerTokenInfo) } private suspend fun kopierOgReberegnAvkorting( behandling: DetaljertBehandling, - sakId: SakId, forrigeAvkorting: Avkorting, brukerTokenInfo: BrukerTokenInfo, ): Avkorting { @@ -197,7 +180,6 @@ class AvkortingService( val kopiertAvkorting = forrigeAvkorting.kopierAvkorting(opphoerFraOgMed) return reberegnOgLagreAvkorting( behandling, - sakId, kopiertAvkorting, brukerTokenInfo, behandling.behandlingType, @@ -206,7 +188,6 @@ class AvkortingService( private suspend fun reberegnOgLagreAvkorting( behandling: DetaljertBehandling, - sakId: SakId, avkorting: Avkorting, brukerTokenInfo: BrukerTokenInfo, behandlingType: BehandlingType, @@ -215,7 +196,7 @@ class AvkortingService( val beregning = beregningService.hentBeregningNonnull(behandling.id) val sanksjoner = sanksjonService.hentSanksjon(behandling.id) ?: emptyList() val beregnetAvkorting = avkorting.beregnAvkortingRevurdering(beregning, sanksjoner) - avkortingRepository.lagreAvkorting(behandling.id, sakId, beregnetAvkorting) + avkortingRepository.lagreAvkorting(behandling.id, behandling.sak, beregnetAvkorting) val lagretAvkorting = hentAvkortingNonNull(behandling.id) settBehandlingStatusAvkortet(brukerTokenInfo, behandling, behandlingType, lagretAvkorting) return lagretAvkorting @@ -258,11 +239,11 @@ class AvkortingService( return hentForrigeAvkorting(forrigeBehandlingId) } - private fun hentForrigeAvkorting(forrigeBehandlingId: UUID): Avkorting = + fun hentForrigeAvkorting(forrigeBehandlingId: UUID): Avkorting = avkortingRepository.hentAvkorting(forrigeBehandlingId) ?: throw TidligereAvkortingFinnesIkkeException(forrigeBehandlingId) - private suspend fun tilstandssjekk( + suspend fun tilstandssjekk( behandlingId: UUID, bruker: BrukerTokenInfo, ) { diff --git a/apps/etterlatte-beregning/src/main/kotlin/config/ApplicationContext.kt b/apps/etterlatte-beregning/src/main/kotlin/config/ApplicationContext.kt index 4c44e80d9ed..4e34c03adc4 100644 --- a/apps/etterlatte-beregning/src/main/kotlin/config/ApplicationContext.kt +++ b/apps/etterlatte-beregning/src/main/kotlin/config/ApplicationContext.kt @@ -2,6 +2,7 @@ package no.nav.etterlatte.config import com.typesafe.config.Config import com.typesafe.config.ConfigFactory +import no.nav.etterlatte.avkorting.AarligInntektsjusteringService import no.nav.etterlatte.avkorting.AvkortingRepository import no.nav.etterlatte.avkorting.AvkortingService import no.nav.etterlatte.avkorting.AvkortingTidligAlderspensjonService @@ -118,6 +119,12 @@ class ApplicationContext { behandlingKlient = behandlingKlient, avkortingRepository = avkortingRepository, ) + val aarligInntektsjusteringService = + AarligInntektsjusteringService( + avkortingService = avkortingService, + avkortingRepository = avkortingRepository, + sanksjonService = sanksjonService, + ) val ytelseMedGrunnlagService = YtelseMedGrunnlagService( beregningRepository = beregningRepository, diff --git a/apps/etterlatte-beregning/src/test/kotlin/avkorting/AvkortingRoutesTest.kt b/apps/etterlatte-beregning/src/test/kotlin/avkorting/AvkortingRoutesTest.kt index f10b5276a5d..b2426c21e44 100644 --- a/apps/etterlatte-beregning/src/test/kotlin/avkorting/AvkortingRoutesTest.kt +++ b/apps/etterlatte-beregning/src/test/kotlin/avkorting/AvkortingRoutesTest.kt @@ -43,6 +43,7 @@ class AvkortingRoutesTest { private val behandlingKlient = mockk() private val avkortingService = mockk() private val avkortingTidligAlderspensjonService = mockk() + private val aarligInntektsjusteringService = mockk() @BeforeAll fun beforeAll() { @@ -180,7 +181,12 @@ class AvkortingRoutesTest { private fun testApplication(block: suspend ApplicationTestBuilder.() -> Unit) { io.ktor.server.testing.testApplication { runServer(mockOAuth2Server) { - avkorting(avkortingService, behandlingKlient, avkortingTidligAlderspensjonService) + avkorting( + avkortingService, + behandlingKlient, + avkortingTidligAlderspensjonService, + aarligInntektsjusteringService, + ) } block(this) } diff --git a/libs/etterlatte-beregning-model/src/main/kotlin/BeregningDTO.kt b/libs/etterlatte-beregning-model/src/main/kotlin/BeregningDTO.kt index 938375a149e..2133caa201d 100644 --- a/libs/etterlatte-beregning-model/src/main/kotlin/BeregningDTO.kt +++ b/libs/etterlatte-beregning-model/src/main/kotlin/BeregningDTO.kt @@ -156,3 +156,9 @@ data class AarligInntektsjusteringAvkortingSjekkResponse( val harInntektForAar: Boolean, val harSanksjon: Boolean, ) + +data class AarligInntektsjusteringAvkortingRequest( + val aar: Int, + val forrigeBehandling: UUID, + val nyBehandling: UUID, +) From 9db8521effcf2247d67ea8bfe3deaf6431d72d17 Mon Sep 17 00:00:00 2001 From: Emil Elton Nilsen <45180092+perkynades@users.noreply.github.com> Date: Fri, 8 Nov 2024 08:44:47 +0100 Subject: [PATCH 10/85] EY-4663 sjekk om bruker har sak i gjenny - the squequal (#6261) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Åpne opp for å la selvbetjening sjekke om bruker har sak * Oppdater rolle til å være mer spesifik for bruken * Forenkle logikk i route * Flytte route * FLytt tilbake * Bytte til post * Litt mer fine grained claims --- apps/etterlatte-api/.nais/dev-api.yaml | 2 +- apps/etterlatte-api/.nais/prod-api.yaml | 2 +- .../samordning/sak/BehandlingSakRoutes.kt | 40 +++++++++++-------- 3 files changed, 25 insertions(+), 19 deletions(-) diff --git a/apps/etterlatte-api/.nais/dev-api.yaml b/apps/etterlatte-api/.nais/dev-api.yaml index d8341098608..527906c4b14 100644 --- a/apps/etterlatte-api/.nais/dev-api.yaml +++ b/apps/etterlatte-api/.nais/dev-api.yaml @@ -109,7 +109,7 @@ spec: cluster: dev-gcp permissions: roles: - - les-oms-sak-for-person + - les-oms-sak - application: arbeid-og-inntekt namespace: team-inntekt cluster: dev-fss diff --git a/apps/etterlatte-api/.nais/prod-api.yaml b/apps/etterlatte-api/.nais/prod-api.yaml index c542462ef8c..cf30d81877c 100644 --- a/apps/etterlatte-api/.nais/prod-api.yaml +++ b/apps/etterlatte-api/.nais/prod-api.yaml @@ -107,7 +107,7 @@ spec: cluster: prod-gcp permissions: roles: - - les-oms-sak-for-person + - les-oms-sak - application: arbeid-og-inntekt namespace: team-inntekt cluster: prod-fss diff --git a/apps/etterlatte-api/src/main/kotlin/no/nav/etterlatte/samordning/sak/BehandlingSakRoutes.kt b/apps/etterlatte-api/src/main/kotlin/no/nav/etterlatte/samordning/sak/BehandlingSakRoutes.kt index 255fed7ed38..0658dd9f81c 100644 --- a/apps/etterlatte-api/src/main/kotlin/no/nav/etterlatte/samordning/sak/BehandlingSakRoutes.kt +++ b/apps/etterlatte-api/src/main/kotlin/no/nav/etterlatte/samordning/sak/BehandlingSakRoutes.kt @@ -40,13 +40,6 @@ fun Route.behandlingSakRoutes( issuers = setOf(Issuer.AZURE.issuerName) } - get("/har_sak") { - val foedselsnummer = call.receive() - val saker = behandlingService.hentSakforPerson(foedselsnummer) - - call.respond(HarOMSSakIGjenny(saker.isNotEmpty())) - } - post("/person/sak") { val foedselsnummer = call.receive() call.respond(behandlingService.hentSakforPerson(foedselsnummer)) @@ -54,19 +47,32 @@ fun Route.behandlingSakRoutes( } route("api/sak") { - install(AuthorizationPlugin) { - accessPolicyRolesEllerAdGrupper = setOf("les-bp-sak", "les-oms-sak") + route("oms/har_sak") { + install(AuthorizationPlugin) { + accessPolicyRolesEllerAdGrupper = setOf("les-oms-sak") + } + post { + val foedselsnummer = call.receive() + val saker = behandlingService.hentSakforPerson(foedselsnummer) + + call.respond(HarOMSSakIGjenny(saker.isNotEmpty())) + } } - get("/{$SAKID_CALL_PARAMETER}") { - val sak = - behandlingService.hentSak(sakId) - ?: throw IkkeFunnetException( - code = "SAK_IKKE_FUNNET", - detail = "Sak med id=$sakId finnes ikke", - ) + route("/${SAKID_CALL_PARAMETER}") { + install(AuthorizationPlugin) { + accessPolicyRolesEllerAdGrupper = setOf("les-bp-sak", "les-oms-sak") + } + get { + val sak = + behandlingService.hentSak(sakId) + ?: throw IkkeFunnetException( + code = "SAK_IKKE_FUNNET", + detail = "Sak med id=$sakId finnes ikke", + ) - call.respond(sak) + call.respond(sak) + } } } } From 034b43e6d03cd49b4ca56176e507da0cefa0ba44 Mon Sep 17 00:00:00 2001 From: "Nicolas N." Date: Fri, 8 Nov 2024 09:38:39 +0100 Subject: [PATCH 11/85] Opprydding/forarbeid ifm. EY-4561 (#6257) * Opprydding/forarbeid ifm. EY-4561 * fjerner et par klasser som ble glemt --- .../common/klienter/PdlTjenesterKlient.kt | 16 -------- .../kotlin/integration/EksterneKlienter.kt | 2 - .../src/main/kotlin/pdl/PdlKlient.kt | 38 ------------------- .../src/main/kotlin/pdl/PdlModell.kt | 36 ------------------ .../src/main/kotlin/person/PersonRoute.kt | 12 ------ .../src/main/kotlin/person/PersonService.kt | 8 ---- .../src/test/kotlin/pdl/PdlKlientTest.kt | 38 ------------------- ...keregisterIdenterForAktoerIdBolkRequest.kt | 5 --- 8 files changed, 155 deletions(-) delete mode 100644 libs/saksbehandling-common/src/main/kotlin/person/HentFolkeregisterIdenterForAktoerIdBolkRequest.kt diff --git a/apps/etterlatte-behandling/src/main/kotlin/common/klienter/PdlTjenesterKlient.kt b/apps/etterlatte-behandling/src/main/kotlin/common/klienter/PdlTjenesterKlient.kt index 753b8ceda1c..e156dd10381 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/common/klienter/PdlTjenesterKlient.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/common/klienter/PdlTjenesterKlient.kt @@ -17,7 +17,6 @@ import no.nav.etterlatte.libs.common.person.AdressebeskyttelseGradering import no.nav.etterlatte.libs.common.person.Folkeregisteridentifikator import no.nav.etterlatte.libs.common.person.GeografiskTilknytning import no.nav.etterlatte.libs.common.person.HentAdressebeskyttelseRequest -import no.nav.etterlatte.libs.common.person.HentFolkeregisterIdenterForAktoerIdBolkRequest import no.nav.etterlatte.libs.common.person.HentGeografiskTilknytningRequest import no.nav.etterlatte.libs.common.person.HentPdlIdentRequest import no.nav.etterlatte.libs.common.person.HentPersonRequest @@ -54,8 +53,6 @@ interface PdlTjenesterKlient : Pingable { saktype: SakType, ): GeografiskTilknytning - fun hentFolkeregisterIdenterForAktoerIdBolk(aktoerIds: Set): Map - suspend fun hentPdlIdentifikator(ident: String): PdlIdentifikator? suspend fun hentAdressebeskyttelseForPerson(hentAdressebeskyttelseRequest: HentAdressebeskyttelseRequest): AdressebeskyttelseGradering @@ -150,19 +147,6 @@ class PdlTjenesterKlientImpl( return response } - override fun hentFolkeregisterIdenterForAktoerIdBolk(aktoerIds: Set): Map { - val request = HentFolkeregisterIdenterForAktoerIdBolkRequest(aktoerIds) - val response = - runBlocking { - client - .post("$url/folkeregisteridenter") { - contentType(ContentType.Application.Json) - setBody(request) - }.body>() - } - return response - } - override suspend fun hentPdlIdentifikator(ident: String): PdlIdentifikator? { logger.info("Henter ident fra PDL for fnr=${ident.maskerFnr()}") diff --git a/apps/etterlatte-behandling/src/test/kotlin/integration/EksterneKlienter.kt b/apps/etterlatte-behandling/src/test/kotlin/integration/EksterneKlienter.kt index 145d681f49b..597083849dc 100644 --- a/apps/etterlatte-behandling/src/test/kotlin/integration/EksterneKlienter.kt +++ b/apps/etterlatte-behandling/src/test/kotlin/integration/EksterneKlienter.kt @@ -628,8 +628,6 @@ class PdltjenesterKlientTest : PdlTjenesterKlient { saktype: SakType, ): GeografiskTilknytning = GeografiskTilknytning(kommune = "0301") - override fun hentFolkeregisterIdenterForAktoerIdBolk(aktoerIds: Set): Map = emptyMap() - override suspend fun hentPdlIdentifikator(ident: String): PdlIdentifikator? { TODO("Not yet implemented") } diff --git a/apps/etterlatte-pdltjenester/src/main/kotlin/pdl/PdlKlient.kt b/apps/etterlatte-pdltjenester/src/main/kotlin/pdl/PdlKlient.kt index c50a4ed8c1f..9667a9ffb95 100644 --- a/apps/etterlatte-pdltjenester/src/main/kotlin/pdl/PdlKlient.kt +++ b/apps/etterlatte-pdltjenester/src/main/kotlin/pdl/PdlKlient.kt @@ -12,7 +12,6 @@ import no.nav.etterlatte.libs.common.RetryResult import no.nav.etterlatte.libs.common.behandling.SakType import no.nav.etterlatte.libs.common.person.Folkeregisteridentifikator import no.nav.etterlatte.libs.common.person.HentAdressebeskyttelseRequest -import no.nav.etterlatte.libs.common.person.HentFolkeregisterIdenterForAktoerIdBolkRequest import no.nav.etterlatte.libs.common.person.HentGeografiskTilknytningRequest import no.nav.etterlatte.libs.common.person.HentPdlIdentRequest import no.nav.etterlatte.libs.common.person.HentPersonRequest @@ -174,43 +173,6 @@ class PdlKlient( } } - suspend fun hentFolkeregisterIdenterForAktoerIdBolk( - request: HentFolkeregisterIdenterForAktoerIdBolkRequest, - ): List = - request.aktoerIds - .chunked(PDL_BULK_SIZE) - .map { identerChunk -> - val graphqlBolkRequest = - PdlFoedselsnumreFraAktoerIdRequest( - query = getQuery("/pdl/hentFolkeregisterIdenterBolk.graphql"), - variables = - IdenterBolkVariables( - identer = identerChunk, - grupper = setOf(IdentGruppe.FOLKEREGISTERIDENT), - ), - ) - - logger.info("Henter folkeregisterident for ${request.aktoerIds.size} aktørIds fra PDL") - - val response = - retry { - httpClient - .post(apiUrl) { - behandlingsnummer(SakType.entries) - header(HEADER_TEMA, HEADER_TEMA_VALUE) - accept(Json) - contentType(Json) - setBody(graphqlBolkRequest) - }.body() - }.let { - when (it) { - is RetryResult.Success -> it.content - is RetryResult.Failure -> throw it.samlaExceptions() - } - } - response.data - }.flatMap { it.hentIdenterBolk } - suspend fun hentGeografiskTilknytning(request: HentGeografiskTilknytningRequest): PdlGeografiskTilknytningResponse { val graphqlRequest = PdlGeografiskTilknytningRequest( diff --git a/apps/etterlatte-pdltjenester/src/main/kotlin/pdl/PdlModell.kt b/apps/etterlatte-pdltjenester/src/main/kotlin/pdl/PdlModell.kt index 1e1a910d6ca..8c9574cd5b2 100644 --- a/apps/etterlatte-pdltjenester/src/main/kotlin/pdl/PdlModell.kt +++ b/apps/etterlatte-pdltjenester/src/main/kotlin/pdl/PdlModell.kt @@ -507,42 +507,6 @@ data class PdlGeografiskTilknytningResponse( override val errors: List? = null, ) : PdlDataErrorResponse -data class PdlFoedselsnumreFraAktoerIdRequest( - val query: String, - val variables: IdenterBolkVariables, -) - -data class IdenterBolkVariables( - val identer: List, - val grupper: Set, -) - -data class PdlFoedselsnumreFraAktoerIdResponse( - val data: PdlFoedselsnumreFraAktoerIdData, -) - -data class PdlFoedselsnumreFraAktoerIdData( - val hentIdenterBolk: Set, -) - -data class HentIdenterBolkResult( - val ident: String, - val identer: Set?, - val code: String, -) - -data class IdentInformasjon( - val ident: String, - val gruppe: IdentGruppe, - val historisk: Boolean, -) - -enum class IdentGruppe { - AKTORID, - FOLKEREGISTERIDENT, - NPID, -} - data class PdlHentForelderansvarHistorikkVariables( val ident: String, ) { diff --git a/apps/etterlatte-pdltjenester/src/main/kotlin/person/PersonRoute.kt b/apps/etterlatte-pdltjenester/src/main/kotlin/person/PersonRoute.kt index 71b197d7c36..005c5c1fbdf 100644 --- a/apps/etterlatte-pdltjenester/src/main/kotlin/person/PersonRoute.kt +++ b/apps/etterlatte-pdltjenester/src/main/kotlin/person/PersonRoute.kt @@ -7,7 +7,6 @@ import io.ktor.server.routing.Route import io.ktor.server.routing.post import io.ktor.server.routing.route import no.nav.etterlatte.libs.common.person.HentAdressebeskyttelseRequest -import no.nav.etterlatte.libs.common.person.HentFolkeregisterIdenterForAktoerIdBolkRequest import no.nav.etterlatte.libs.common.person.HentGeografiskTilknytningRequest import no.nav.etterlatte.libs.common.person.HentPdlIdentRequest import no.nav.etterlatte.libs.common.person.HentPersonHistorikkForeldreAnsvarRequest @@ -67,17 +66,6 @@ fun Route.personRoute(service: PersonService) { } } - route("folkeregisteridenter") { - post { - val personIdenterForAktoerIdRequest = call.receive() - - service - .hentFolkeregisterIdenterForAktoerIdBolk( - personIdenterForAktoerIdRequest, - ).let { call.respond(it) } - } - } - route("aktoerid") { post { val ident = call.receive() diff --git a/apps/etterlatte-pdltjenester/src/main/kotlin/person/PersonService.kt b/apps/etterlatte-pdltjenester/src/main/kotlin/person/PersonService.kt index 35b6451e125..bb817c719a4 100644 --- a/apps/etterlatte-pdltjenester/src/main/kotlin/person/PersonService.kt +++ b/apps/etterlatte-pdltjenester/src/main/kotlin/person/PersonService.kt @@ -8,7 +8,6 @@ import no.nav.etterlatte.libs.common.person.AdressebeskyttelseGradering import no.nav.etterlatte.libs.common.person.Folkeregisteridentifikator import no.nav.etterlatte.libs.common.person.GeografiskTilknytning import no.nav.etterlatte.libs.common.person.HentAdressebeskyttelseRequest -import no.nav.etterlatte.libs.common.person.HentFolkeregisterIdenterForAktoerIdBolkRequest import no.nav.etterlatte.libs.common.person.HentGeografiskTilknytningRequest import no.nav.etterlatte.libs.common.person.HentPdlIdentRequest import no.nav.etterlatte.libs.common.person.HentPersonHistorikkForeldreAnsvarRequest @@ -317,13 +316,6 @@ class PersonService( ) } - suspend fun hentFolkeregisterIdenterForAktoerIdBolk(request: HentFolkeregisterIdenterForAktoerIdBolkRequest): Map { - logger.info("Henter folkeregisteridenter for aktørIds=${request.aktoerIds}") - - val response = pdlKlient.hentFolkeregisterIdenterForAktoerIdBolk(request) - return response.associate { it.ident to it.identer?.firstOrNull()?.ident } - } - suspend fun hentGeografiskTilknytning(request: HentGeografiskTilknytningRequest): GeografiskTilknytning { logger.info("Henter geografisk tilknytning med fnr=${request.foedselsnummer} fra PDL") diff --git a/apps/etterlatte-pdltjenester/src/test/kotlin/pdl/PdlKlientTest.kt b/apps/etterlatte-pdltjenester/src/test/kotlin/pdl/PdlKlientTest.kt index ff3466826c8..d77ddd83000 100644 --- a/apps/etterlatte-pdltjenester/src/test/kotlin/pdl/PdlKlientTest.kt +++ b/apps/etterlatte-pdltjenester/src/test/kotlin/pdl/PdlKlientTest.kt @@ -13,7 +13,6 @@ import no.nav.etterlatte.STOR_SNERK import no.nav.etterlatte.libs.common.behandling.SakType import no.nav.etterlatte.libs.common.objectMapper import no.nav.etterlatte.libs.common.person.HentAdressebeskyttelseRequest -import no.nav.etterlatte.libs.common.person.HentFolkeregisterIdenterForAktoerIdBolkRequest import no.nav.etterlatte.libs.common.person.HentGeografiskTilknytningRequest import no.nav.etterlatte.libs.common.person.HentPdlIdentRequest import no.nav.etterlatte.libs.common.person.HentPersonRequest @@ -179,43 +178,6 @@ internal class PdlKlientTest { } } - @Test - fun `hentFolkregisterIdentBolk returnerer bolk`() { - mockEndpoint("/pdl/folkeregisteridentBolk.json") - - runBlocking { - val identResponse = - pdlKlient.hentFolkeregisterIdenterForAktoerIdBolk( - HentFolkeregisterIdenterForAktoerIdBolkRequest(setOf("2082995739063")), - ) - assertEquals("2082995739063", identResponse.first().ident) - assertEquals( - "03486048831", - identResponse - .first() - .identer!! - .first() - .ident, - ) - assertEquals( - false, - identResponse - .first() - .identer!! - .first() - .historisk, - ) - assertEquals( - "FOLKEREGISTERIDENT", - identResponse - .first() - .identer!! - .first() - .gruppe.name, - ) - } - } - @Test fun `hentGeografiskTilknytning returnerer geografisk tilknytning`() { mockEndpoint("/pdl/geografisk_tilknytning.json") diff --git a/libs/saksbehandling-common/src/main/kotlin/person/HentFolkeregisterIdenterForAktoerIdBolkRequest.kt b/libs/saksbehandling-common/src/main/kotlin/person/HentFolkeregisterIdenterForAktoerIdBolkRequest.kt deleted file mode 100644 index ae882614759..00000000000 --- a/libs/saksbehandling-common/src/main/kotlin/person/HentFolkeregisterIdenterForAktoerIdBolkRequest.kt +++ /dev/null @@ -1,5 +0,0 @@ -package no.nav.etterlatte.libs.common.person - -class HentFolkeregisterIdenterForAktoerIdBolkRequest( - val aktoerIds: Set, -) From 896ef7273bce20c279acc652619ae812dae0943d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 8 Nov 2024 09:51:35 +0100 Subject: [PATCH 12/85] Bump @amplitude/analytics-browser (#6246) Bumps [@amplitude/analytics-browser](https://github.com/amplitude/Amplitude-TypeScript) from 2.11.8 to 2.11.9. - [Release notes](https://github.com/amplitude/Amplitude-TypeScript/releases) - [Commits](https://github.com/amplitude/Amplitude-TypeScript/compare/@amplitude/analytics-browser@2.11.8...@amplitude/analytics-browser@2.11.9) --- updated-dependencies: - dependency-name: "@amplitude/analytics-browser" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../client/package.json | 2 +- .../client/yarn.lock | 58 +++++++++---------- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/apps/etterlatte-saksbehandling-ui/client/package.json b/apps/etterlatte-saksbehandling-ui/client/package.json index dd8d91a1f9d..bdf1dcc1fdd 100644 --- a/apps/etterlatte-saksbehandling-ui/client/package.json +++ b/apps/etterlatte-saksbehandling-ui/client/package.json @@ -14,7 +14,7 @@ "coverage": "vitest run --coverage" }, "dependencies": { - "@amplitude/analytics-browser": "^2.11.8", + "@amplitude/analytics-browser": "^2.11.9", "@navikt/aksel-icons": "^7.4.3", "@navikt/ds-css": "~7.4.3", "@navikt/ds-react": "~7.4.3", diff --git a/apps/etterlatte-saksbehandling-ui/client/yarn.lock b/apps/etterlatte-saksbehandling-ui/client/yarn.lock index d0b48f18bb5..cd2cb9cf700 100644 --- a/apps/etterlatte-saksbehandling-ui/client/yarn.lock +++ b/apps/etterlatte-saksbehandling-ui/client/yarn.lock @@ -7,27 +7,27 @@ resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.4.0.tgz#728c484f4e10df03d5a3acd0d8adcbbebff8ad63" integrity sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ== -"@amplitude/analytics-browser@^2.11.8": - version "2.11.8" - resolved "https://registry.yarnpkg.com/@amplitude/analytics-browser/-/analytics-browser-2.11.8.tgz#ab084a0b1e647ed3ceb4ba112d97cf25ddb58684" - integrity sha512-lFv8deROLwBfSlg92+r1NitWJ6BN45IKwpPLoixA0fZytScXEJqc0Gl5O+BY4qScbFECYt9PFKblhB+jC+IvPg== +"@amplitude/analytics-browser@^2.11.9": + version "2.11.9" + resolved "https://registry.yarnpkg.com/@amplitude/analytics-browser/-/analytics-browser-2.11.9.tgz#d54de7b53e8578d6bde2d4690198acf0df19c8e7" + integrity sha512-FHejpsW3OypNKaIBvMwLm74UUSBcR+VwrBsj7V2VlPDNRdeaFi21kJgVYUW5AcjxTsadMzBQGBb4BarZ4k2+9Q== dependencies: - "@amplitude/analytics-client-common" "^2.3.4" - "@amplitude/analytics-core" "^2.5.3" + "@amplitude/analytics-client-common" "^2.3.5" + "@amplitude/analytics-core" "^2.5.4" "@amplitude/analytics-remote-config" "^0.4.0" - "@amplitude/analytics-types" "^2.8.3" + "@amplitude/analytics-types" "^2.8.4" "@amplitude/plugin-autocapture-browser" "^1.0.2" - "@amplitude/plugin-page-view-tracking-browser" "^2.3.4" + "@amplitude/plugin-page-view-tracking-browser" "^2.3.5" tslib "^2.4.1" -"@amplitude/analytics-client-common@>=1 <3", "@amplitude/analytics-client-common@^2.3.4": - version "2.3.4" - resolved "https://registry.yarnpkg.com/@amplitude/analytics-client-common/-/analytics-client-common-2.3.4.tgz#c17c853e2d7c0158f8fdbbc514973df9ab57db0d" - integrity sha512-3oqdvca5W4BPblTaxf60YRtlh2uC+N3rA99wowDAhTBJoMJJaauOBoXu5BbiQO1u8Zw/c8ymyr8E20+glyptUg== +"@amplitude/analytics-client-common@>=1 <3", "@amplitude/analytics-client-common@^2.3.5": + version "2.3.5" + resolved "https://registry.yarnpkg.com/@amplitude/analytics-client-common/-/analytics-client-common-2.3.5.tgz#8c31d6d1848e26d705ad21205db79aceb7b1cf5a" + integrity sha512-BCP+jorfLMAKK/g87fAk4IPP/NzQLMCep+Qe23tqOCWguwTEINYnyzD/GmhaIKXSM2o9pmMLlHbhkA1vXUtF8g== dependencies: "@amplitude/analytics-connector" "^1.4.8" - "@amplitude/analytics-core" "^2.5.3" - "@amplitude/analytics-types" "^2.8.3" + "@amplitude/analytics-core" "^2.5.4" + "@amplitude/analytics-types" "^2.8.4" tslib "^2.4.1" "@amplitude/analytics-connector@^1.4.8": @@ -37,12 +37,12 @@ dependencies: "@amplitude/experiment-core" "^0.9.0" -"@amplitude/analytics-core@>=1 <3", "@amplitude/analytics-core@^2.5.3": - version "2.5.3" - resolved "https://registry.yarnpkg.com/@amplitude/analytics-core/-/analytics-core-2.5.3.tgz#73eabb5b79bf76bc4a5b519f75340791caba1697" - integrity sha512-dvx3PS0adnHRS22VbuP9YtWg//bQGF2c61Pj5IYXVsemtRRHqiS7XJ860brk3WeQgOkqf3Gyc023DoYcsWGoNQ== +"@amplitude/analytics-core@>=1 <3", "@amplitude/analytics-core@^2.5.4": + version "2.5.4" + resolved "https://registry.yarnpkg.com/@amplitude/analytics-core/-/analytics-core-2.5.4.tgz#b45308333c66bd75076c3bf256a51fd1565a807d" + integrity sha512-J5ZF8hQmxmxM+7bu25a2TfTnk/LQ/oH5FYdg79f1lJ85Aa6oUlCDxgvXwy1RVpwaFjWlZQgV4XVaAUrxtSPRFw== dependencies: - "@amplitude/analytics-types" "^2.8.3" + "@amplitude/analytics-types" "^2.8.4" tslib "^2.4.1" "@amplitude/analytics-remote-config@^0.4.0": @@ -55,10 +55,10 @@ "@amplitude/analytics-types" ">=1 <3" tslib "^2.4.1" -"@amplitude/analytics-types@>=1 <3", "@amplitude/analytics-types@^2.8.2", "@amplitude/analytics-types@^2.8.3": - version "2.8.3" - resolved "https://registry.yarnpkg.com/@amplitude/analytics-types/-/analytics-types-2.8.3.tgz#a5a4e1d6f1f02bc2c17d9460c95fc0e449f94351" - integrity sha512-HNmKVd0ACoi3xTi86xi+is7WgqKT78JA4fYLcM25/ckFkZ1zVCqD1AubaADEh26m34nJ3qDLK5Pob4QptQNPAg== +"@amplitude/analytics-types@>=1 <3", "@amplitude/analytics-types@^2.8.2", "@amplitude/analytics-types@^2.8.4": + version "2.8.4" + resolved "https://registry.yarnpkg.com/@amplitude/analytics-types/-/analytics-types-2.8.4.tgz#0d9ec0d3a0d00b729b5520b38ef8a158e691ffd2" + integrity sha512-jQ8WY1aPbpBshl0L/0YEeQn/wZlBr8Jlqc20qf8nbuDuimFy8RqAkE+BVaMI86FCkr3AJ7PjMXkGwCSbUx88CA== "@amplitude/experiment-core@^0.9.0": version "0.9.0" @@ -77,13 +77,13 @@ rxjs "^7.8.1" tslib "^2.4.1" -"@amplitude/plugin-page-view-tracking-browser@^2.3.4": - version "2.3.4" - resolved "https://registry.yarnpkg.com/@amplitude/plugin-page-view-tracking-browser/-/plugin-page-view-tracking-browser-2.3.4.tgz#96002cb4331d5c3e5fe7ea70f73ca274bce0d600" - integrity sha512-l7RS5gssG0BPYlgirV0NQ94EPzTOdDkp0z2jqU45D3DQAJXkoloUyw5lw/cbUXYwNulHZTG/BExcERfdvVWkLA== +"@amplitude/plugin-page-view-tracking-browser@^2.3.5": + version "2.3.5" + resolved "https://registry.yarnpkg.com/@amplitude/plugin-page-view-tracking-browser/-/plugin-page-view-tracking-browser-2.3.5.tgz#cd5bcdb7c53bb70baae1573d16ab4dc9fd8690bf" + integrity sha512-qcV4DLxRAZRriYBNvjc2PGW1EDad6PSsIXmxVs6j8i9fxY2SfdvsFd/Qd23CHj1e6Dt5QpAVJZpUMCEdqqDZbA== dependencies: - "@amplitude/analytics-client-common" "^2.3.4" - "@amplitude/analytics-types" "^2.8.3" + "@amplitude/analytics-client-common" "^2.3.5" + "@amplitude/analytics-types" "^2.8.4" tslib "^2.4.1" "@babel/runtime@^7.12.5": From 39db86988886093c5784790d4c5bc82733b0fef7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20Stette=20Haarberg?= Date: Fri, 8 Nov 2024 11:29:24 +0100 Subject: [PATCH 13/85] =?UTF-8?q?Logger=20ikke=20error=20f=C3=B8r=20vi=20e?= =?UTF-8?q?r=20tomme=20for=20retries=20(#6266)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/src/shared/api/feature.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/etterlatte-saksbehandling-ui/client/src/shared/api/feature.ts b/apps/etterlatte-saksbehandling-ui/client/src/shared/api/feature.ts index 653f38ae009..d533415c2a1 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/shared/api/feature.ts +++ b/apps/etterlatte-saksbehandling-ui/client/src/shared/api/feature.ts @@ -20,6 +20,7 @@ async function retryInner( promise: () => Promise> ): Promise | ApiError> { if (times < 1) { + logger.generalError({ msg: 'Feil i henting av brytere mot Unleash gikk ikke ok etter retries.' }) return { ok: false } as ApiError } @@ -28,12 +29,12 @@ async function retryInner( if (res.ok) { return res } else { - logger.generalError({ msg: 'Feil i henting av brytere mot Unleash. Prøver på nytt' }) + logger.generalWarning({ msg: 'Feil i henting av brytere mot Unleash. Prøver på nytt' }) return retryInner(times - 1, promise) } }) .catch((err) => { - logger.generalError({ msg: `Feil i henting av brytere mot Unleash. Prøver på nytt... error: ${err}` }) + logger.generalWarning({ msg: `Feil i henting av brytere mot Unleash. Prøver på nytt... error: ${err}` }) return retryInner(times - 1, promise) }) } From 962e99e2523d5ef1b464d32453b7a976eac65d9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Oliver=20S=C3=B8berg?= <82504565+sebassonav@users.noreply.github.com> Date: Fri, 8 Nov 2024 11:36:32 +0100 Subject: [PATCH 14/85] EY-4716 Bruk redux for stateoppdatering i aktivitetsplikt 12mnd (#6262) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * EY-4716 Bruk redux for stateoppdatering i aktivitetsplikt 12mnd * EY-4716 Update oppgave via redux også --- .../AktivitetspliktOppgaveService.kt | 3 +- .../aktivitetsplikt/AktivitetspliktRoute.kt | 38 ++++++++-------- .../src/main/kotlin/oppgave/OppgaveRoutes.kt | 9 ++-- .../src/main/kotlin/oppgave/OppgaveService.kt | 3 +- .../AktivitetspliktOppgaveServiceTest.kt | 5 ++- .../aktivitetsplikt/OppgaveVurderingRoute.tsx | 20 +++------ .../VurderAktivitetspliktOppgave.tsx | 27 ++++++----- .../brev/AktivitetspliktBrev.tsx | 10 +++-- .../aktivitetsplikt/brev/UtenBrevVisning.tsx | 9 ++-- .../vurdering/VurderAktivitet.tsx | 10 +++-- .../aktivitetsgrad/AktivitetsgradIOppgave.tsx | 23 ++++++---- .../aktivitetsgrad/LeggTilNyVurdering.tsx | 10 +++-- .../VurderingAktivitetsgradForm.tsx | 3 +- .../vurdering/unntak/LeggTilUnntak.tsx | 10 +++-- .../UnntakAktivitetspliktOppgaveForm.tsx | 5 ++- .../vurdering/unntak/UnntakIOppgave.tsx | 23 ++++++---- ...ktivitetspliktInfo6MndVarigUnntakModal.tsx | 4 +- .../oppgaveModal/AktivitetspliktInfoModal.tsx | 4 +- .../oppgaveModal/BrevOppgaveModal.tsx | 4 +- .../TilleggsinformasjonOppgaveModal.tsx | 4 +- .../ValgForInfobrev.tsx | 12 ++--- .../client/src/shared/api/aktivitetsplikt.ts | 13 ++---- .../client/src/shared/api/oppgaver.ts | 5 ++- .../client/src/store/Store.tsx | 2 + .../store/reducers/Aktivitetsplikt12mnd.ts | 45 +++++++++++++++++++ 25 files changed, 191 insertions(+), 110 deletions(-) create mode 100644 apps/etterlatte-saksbehandling-ui/client/src/store/reducers/Aktivitetsplikt12mnd.ts diff --git a/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveService.kt b/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveService.kt index 3dc35c109ea..13325a9e603 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveService.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveService.kt @@ -174,7 +174,7 @@ class AktivitetspliktOppgaveService( fun ferdigstillBrevOgOppgave( oppgaveId: UUID, brukerTokenInfo: BrukerTokenInfo, - ) { + ): OppgaveIntern { val brevData = aktivitetspliktBrevDao.hentBrevdata(oppgaveId) ?: throw GenerellIkkeFunnetException() val oppgave = oppgaveService.hentOppgave(oppgaveId) val sak = sakService.finnSak(oppgave.sakId) ?: throw GenerellIkkeFunnetException() @@ -189,6 +189,7 @@ class AktivitetspliktOppgaveService( val brevrespons: BrevStatusResponse = runBlocking { brevApiKlient.ferdigstillBrev(req, brukerTokenInfo) } if (brevrespons.status.erDistribuert()) { oppgaveService.ferdigstillOppgave(oppgaveId, brukerTokenInfo) + return oppgaveService.hentOppgave(oppgaveId) } else { throw BrevBleIkkeFerdig(brevrespons.status) } diff --git a/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktRoute.kt b/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktRoute.kt index cc5ad275f19..9dbf55fc47a 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktRoute.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktRoute.kt @@ -290,15 +290,16 @@ internal fun Route.aktivitetspliktRoutes( kunSkrivetilgang { logger.info("Oppretter aktivitetsgrad for sakId=$sakId og oppgaveId=$oppgaveId") val aktivitetsgrad = call.receive() - inTransaction { - aktivitetspliktService.upsertAktivitetsgradForOppgave( - aktivitetsgrad = aktivitetsgrad, - oppgaveId = oppgaveId, - sakId = sakId, - brukerTokenInfo = brukerTokenInfo, - ) - } - call.respond(HttpStatusCode.Created) + val aktivitetspliktVurdering = + inTransaction { + aktivitetspliktService.upsertAktivitetsgradForOppgave( + aktivitetsgrad = aktivitetsgrad, + oppgaveId = oppgaveId, + sakId = sakId, + brukerTokenInfo = brukerTokenInfo, + ) + } + call.respond(aktivitetspliktVurdering) } } @@ -324,15 +325,16 @@ internal fun Route.aktivitetspliktRoutes( kunSkrivetilgang { logger.info("Oppretter unntak for sakId=$sakId og oppgaveId=$oppgaveId") val unntak = call.receive() - inTransaction { - aktivitetspliktService.upsertUnntakForOppgave( - unntak = unntak, - oppgaveId = oppgaveId, - sakId = sakId, - brukerTokenInfo = brukerTokenInfo, - ) - } - call.respond(HttpStatusCode.Created) + val aktivitetspliktVurdering = + inTransaction { + aktivitetspliktService.upsertUnntakForOppgave( + unntak = unntak, + oppgaveId = oppgaveId, + sakId = sakId, + brukerTokenInfo = brukerTokenInfo, + ) + } + call.respond(aktivitetspliktVurdering) } } diff --git a/apps/etterlatte-behandling/src/main/kotlin/oppgave/OppgaveRoutes.kt b/apps/etterlatte-behandling/src/main/kotlin/oppgave/OppgaveRoutes.kt index 971bd8af7e2..5881e7af120 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/oppgave/OppgaveRoutes.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/oppgave/OppgaveRoutes.kt @@ -185,10 +185,11 @@ internal fun Route.oppgaveRoutes(service: OppgaveService) { put("ferdigstill") { kunSkrivetilgang { val merknad = call.receive().merknad - inTransaction { - service.ferdigstillOppgave(oppgaveId, brukerTokenInfo, merknad) - } - call.respond(HttpStatusCode.OK) + val oppgave = + inTransaction { + service.ferdigstillOppgave(oppgaveId, brukerTokenInfo, merknad) + } + call.respond(oppgave) } } diff --git a/apps/etterlatte-behandling/src/main/kotlin/oppgave/OppgaveService.kt b/apps/etterlatte-behandling/src/main/kotlin/oppgave/OppgaveService.kt index f3bc2a6b18e..044e048d1e3 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/oppgave/OppgaveService.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/oppgave/OppgaveService.kt @@ -347,12 +347,13 @@ class OppgaveService( id: UUID, saksbehandler: BrukerTokenInfo, merknad: String? = null, - ) { + ): OppgaveIntern { val oppgave = checkNotNull(oppgaveDao.hentOppgave(id)) { "Oppgave med id=$id finnes ikke – avbryter ferdigstilling av oppgaven" } ferdigstillOppgave(oppgave, saksbehandler, merknad) + return hentOppgave(id) } private fun ferdigstillOppgave( diff --git a/apps/etterlatte-behandling/src/test/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveServiceTest.kt b/apps/etterlatte-behandling/src/test/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveServiceTest.kt index 62ce20b026f..438d3ccd43c 100644 --- a/apps/etterlatte-behandling/src/test/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveServiceTest.kt +++ b/apps/etterlatte-behandling/src/test/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveServiceTest.kt @@ -19,6 +19,7 @@ import no.nav.etterlatte.ktor.token.simpleSaksbehandler import no.nav.etterlatte.libs.common.behandling.SakType import no.nav.etterlatte.libs.common.feilhaandtering.ForespoerselException import no.nav.etterlatte.libs.common.grunnlag.Grunnlagsopplysning +import no.nav.etterlatte.libs.common.oppgave.OppgaveIntern import no.nav.etterlatte.libs.common.oppgave.OppgaveKilde import no.nav.etterlatte.libs.common.oppgave.OppgaveType import no.nav.etterlatte.libs.common.oppgave.Status @@ -314,7 +315,7 @@ class AktivitetspliktOppgaveServiceTest { redusertEtterInntekt = true, kilde = kilde, ) - every { oppgaveService.ferdigstillOppgave(oppgaveId, simpleSaksbehandler) } just Runs + every { oppgaveService.ferdigstillOppgave(oppgaveId, simpleSaksbehandler) } returns mockk() coEvery { brevApiKlient.ferdigstillBrev(any(), any()) } returns BrevStatusResponse(brevId, no.nav.etterlatte.brev.model.Status.DISTRIBUERT) service.ferdigstillBrevOgOppgave(oppgaveId, simpleSaksbehandler) @@ -344,7 +345,7 @@ class AktivitetspliktOppgaveServiceTest { redusertEtterInntekt = true, kilde = kilde, ) - every { oppgaveService.ferdigstillOppgave(oppgaveId, simpleSaksbehandler) } just Runs + every { oppgaveService.ferdigstillOppgave(oppgaveId, simpleSaksbehandler) } returns mockk() coEvery { brevApiKlient.ferdigstillBrev(any(), any()) } returns BrevStatusResponse(brevId, no.nav.etterlatte.brev.model.Status.JOURNALFOERT) assertThrows { diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/OppgaveVurderingRoute.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/OppgaveVurderingRoute.tsx index a0fe68021a5..2459532fee4 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/OppgaveVurderingRoute.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/OppgaveVurderingRoute.tsx @@ -10,23 +10,17 @@ import { import { VurderAktivitet } from '~components/aktivitetsplikt/vurdering/VurderAktivitet' import { VurderingInfoBrevOgOppsummering } from '~components/aktivitetsplikt/brev/VurderingInfoBrevOgOppsummering' import { AktivitetspliktOppgaveVurdering } from '~shared/types/Aktivitetsplikt' +import { useAktivitetspliktOppgaveVurderingState } from '~store/reducers/Aktivitetsplikt12mnd' -interface AktivitetspliktOppgaveVurderingProvider extends AktivitetspliktOppgaveVurdering { - oppdater: () => void -} - -const AktivitetspliktOppgaveContext = createContext( - {} as AktivitetspliktOppgaveVurderingProvider +const AktivitetspliktOppgaveContext = createContext( + {} as AktivitetspliktOppgaveVurdering ) -export function OppgaveVurderingRoute(props: { - vurderingOgOppgave: AktivitetspliktOppgaveVurdering - fetchOppgave: () => void -}) { - const { vurderingOgOppgave, fetchOppgave } = props +export function OppgaveVurderingRoute(props: { vurderingOgOppgave: AktivitetspliktOppgaveVurdering }) { + const { vurderingOgOppgave } = props return ( - + @@ -44,7 +38,7 @@ export function OppgaveVurderingRoute(props: { ) } -export const useAktivitetspliktOppgaveVurdering = (): AktivitetspliktOppgaveVurderingProvider => { +export const useAktivitetspliktOppgaveVurdering = (): AktivitetspliktOppgaveVurdering => { try { const oppgave = useContext(AktivitetspliktOppgaveContext) if (!oppgave) { diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/VurderAktivitetspliktOppgave.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/VurderAktivitetspliktOppgave.tsx index b9b7c38b418..2bb19ac52cd 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/VurderAktivitetspliktOppgave.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/VurderAktivitetspliktOppgave.tsx @@ -8,34 +8,41 @@ import { ApiErrorAlert } from '~ErrorBoundary' import { OppgaveVurderingRoute } from '~components/aktivitetsplikt/OppgaveVurderingRoute' import { Link } from '@navikt/ds-react' import { hentAktivitetspliktOppgaveVurdering } from '~shared/api/aktivitetsplikt' +import { useDispatch } from 'react-redux' +import { setStartdata, useAktivitetspliktOppgaveVurderingState } from '~store/reducers/Aktivitetsplikt12mnd' export function VurderAktivitetspliktOppgave() { useSidetittel('Vurder aktivitetsplikt') const match = useMatch('/aktivitet-vurdering/:oppgaveId/*') const oppgaveId = match?.params.oppgaveId - const [oppgave, fetchOppgave] = useApiCall(hentAktivitetspliktOppgaveVurdering) - + const [oppgaveStatus, fetchOppgave] = useApiCall(hentAktivitetspliktOppgaveVurdering) + const dispatch = useDispatch() + const data = useAktivitetspliktOppgaveVurderingState() useEffect(() => { - if (!oppgaveId || (isSuccess(oppgave) && oppgave.data.oppgave.id === oppgaveId)) { + if (!oppgaveId || (isSuccess(oppgaveStatus) && oppgaveStatus.data.oppgave.id === oppgaveId)) { return } fetchOppgave({ oppgaveId }) }, [oppgaveId]) - return mapResult(oppgave, { + useEffect(() => { + if (isSuccess(oppgaveStatus)) { + dispatch(setStartdata(oppgaveStatus.data)) + } + }, [oppgaveId, oppgaveStatus]) + const dataErSatt = !!data.oppgave + + return mapResult(oppgaveStatus, { initial: ( OppgaveId mangler. Prøv å gå inn på oppgaven på nytt fra oppgavelisten. ), pending: , - success: (oppgave) => ( - fetchOppgave({ oppgaveId: oppgave.oppgave.id })} - /> - ), + success: (oppgave) => { + return <>{dataErSatt && } + }, error: (e) => ( {e.detail || 'Kunne ikke hente oppgave for vurderingen av aktivitetsplikt'} ), diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/brev/AktivitetspliktBrev.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/brev/AktivitetspliktBrev.tsx index 6bd5a55f3db..fa6bcd155af 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/brev/AktivitetspliktBrev.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/brev/AktivitetspliktBrev.tsx @@ -18,16 +18,20 @@ import { AktivitetspliktSteg } from '~components/aktivitetsplikt/stegmeny/Aktivi import { handlinger } from '~components/behandling/handlinger/typer' import { useNavigate } from 'react-router-dom' import { useAktivitetspliktOppgaveVurdering } from '~components/aktivitetsplikt/OppgaveVurderingRoute' +import { useDispatch } from 'react-redux' +import { setAktivitetspliktOppgave } from '~store/reducers/Aktivitetsplikt12mnd' export function Aktivitetspliktbrev({ brevId }: { brevId: number }) { - const { oppgave, oppdater } = useAktivitetspliktOppgaveVurdering() + const { oppgave } = useAktivitetspliktOppgaveVurdering() const [kanRedigeres, setKanRedigeres] = useState(false) const [brevStatus, apiHentBrev] = useApiCall(hentBrev) const [status, ferdigstillOppgaveOgBrev] = useApiCall(ferdigstillBrevOgOppgaveAktivitetsplikt) - + const dispatch = useDispatch() const ferdigstill = () => { - ferdigstillOppgaveOgBrev({ oppgaveId: oppgave.id }, () => oppdater()) + ferdigstillOppgaveOgBrev({ oppgaveId: oppgave.id }, (oppgave) => { + dispatch(setAktivitetspliktOppgave(oppgave)) + }) } const hentBrevOgSetStatus = () => { diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/brev/UtenBrevVisning.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/brev/UtenBrevVisning.tsx index 0bfc2adc1d0..fe7043986a9 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/brev/UtenBrevVisning.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/brev/UtenBrevVisning.tsx @@ -7,14 +7,17 @@ import { ApiErrorAlert } from '~ErrorBoundary' import React from 'react' import { InfobrevKnapperad } from '~components/aktivitetsplikt/brev/AktivitetspliktBrev' import { useAktivitetspliktOppgaveVurdering } from '~components/aktivitetsplikt/OppgaveVurderingRoute' +import { useDispatch } from 'react-redux' +import { setAktivitetspliktOppgave } from '~store/reducers/Aktivitetsplikt12mnd' export function UtenBrevVisning() { - const { oppgave, oppdater, aktivtetspliktbrevdata } = useAktivitetspliktOppgaveVurdering() + const { oppgave, aktivtetspliktbrevdata } = useAktivitetspliktOppgaveVurdering() const [ferdigstillOppgaveStatus, apiFerdigstillOppgave] = useApiCall(ferdigstillOppgave) + const dispatch = useDispatch() const ferdigstillOppgaveWrapper = () => { - apiFerdigstillOppgave(oppgave.id, () => { - oppdater() + apiFerdigstillOppgave(oppgave.id, (oppgave) => { + dispatch(setAktivitetspliktOppgave(oppgave)) }) } const oppgaveErFerdigstilt = oppgave.status === Oppgavestatus.FERDIGSTILT diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/VurderAktivitet.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/VurderAktivitet.tsx index 3d40025c038..fc3b6c7255e 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/VurderAktivitet.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/VurderAktivitet.tsx @@ -13,6 +13,8 @@ import { useNavigate } from 'react-router' import { AktivitetspliktSteg } from '~components/aktivitetsplikt/stegmeny/AktivitetspliktStegmeny' import { opprettAktivitetspliktsbrev } from '~shared/api/aktivitetsplikt' import { erOppgaveRedigerbar } from '~shared/types/oppgave' +import { useDispatch } from 'react-redux' +import { setBrevid } from '~store/reducers/Aktivitetsplikt12mnd' export function VurderAktivitet() { const { sak } = useAktivitetspliktOppgaveVurdering() @@ -50,11 +52,11 @@ export function VurderAktivitet() { } function NesteEllerOpprettBrev() { - const { oppgave, aktivtetspliktbrevdata, oppdater } = useAktivitetspliktOppgaveVurdering() + const { oppgave, aktivtetspliktbrevdata } = useAktivitetspliktOppgaveVurdering() const navigate = useNavigate() const [opprettBrevStatus, opprettBrevCall] = useApiCall(opprettAktivitetspliktsbrev) - + const dispatch = useDispatch() const erRedigerbar = erOppgaveRedigerbar(oppgave.status) const skalOppretteBrev = erRedigerbar && aktivtetspliktbrevdata?.skalSendeBrev && !aktivtetspliktbrevdata.brevId @@ -63,8 +65,8 @@ function NesteEllerOpprettBrev() { { oppgaveId: oppgave.id, }, - () => { - oppdater() + (brevId) => { + dispatch(setBrevid(brevId.brevId)) navigate(`../${AktivitetspliktSteg.OPPSUMMERING_OG_BREV}`) } ) diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/aktivitetsgrad/AktivitetsgradIOppgave.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/aktivitetsgrad/AktivitetsgradIOppgave.tsx index 32cb7db4b42..ef23b66e51a 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/aktivitetsgrad/AktivitetsgradIOppgave.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/aktivitetsgrad/AktivitetsgradIOppgave.tsx @@ -1,4 +1,8 @@ -import { IAktivitetspliktAktivitetsgrad, tekstAktivitetspliktVurderingType } from '~shared/types/Aktivitetsplikt' +import { + IAktivitetspliktAktivitetsgrad, + IAktivitetspliktVurderingNy, + tekstAktivitetspliktVurderingType, +} from '~shared/types/Aktivitetsplikt' import { BodyShort, Box, Button, Detail, Heading, HStack, ReadMore, Table, VStack } from '@navikt/ds-react' import { ClockDashedIcon, PencilIcon, TrashIcon } from '@navikt/aksel-icons' import { formaterDato, formaterDatoMedFallback } from '~utils/formatering/dato' @@ -10,19 +14,22 @@ import { useAktivitetspliktOppgaveVurdering } from '~components/aktivitetsplikt/ import { isFailure, isPending } from '~shared/api/apiUtils' import { ApiErrorAlert } from '~ErrorBoundary' import { erOppgaveRedigerbar } from '~shared/types/oppgave' +import { useDispatch } from 'react-redux' +import { setAktivitetspliktVurdering } from '~store/reducers/Aktivitetsplikt12mnd' export function AktivitetsgradIOppgave(props: { doedsdato?: Date }) { - const { oppgave, vurdering, oppdater } = useAktivitetspliktOppgaveVurdering() - const [aktivitetForRedigering, setAktivitetForRedigering] = useState() + const { oppgave, vurdering } = useAktivitetspliktOppgaveVurdering() + const [slettStatus, slettSpesifikkAktivitet] = useApiCall(slettAktivitetspliktVurdering) + const [aktivitetForRedigering, setAktivitetForRedigering] = useState() + const dispatch = useDispatch() const erRedigerbar = erOppgaveRedigerbar(oppgave.status) - const aktiviteter = vurdering.aktivitet - function oppdaterTilstandLagretVurdering() { + function oppdaterTilstandLagretVurdering(data: IAktivitetspliktVurderingNy) { + dispatch(setAktivitetspliktVurdering(data)) setAktivitetForRedigering(undefined) - oppdater() } function slettAktivitetsgradIOppgave(aktivitet: IAktivitetspliktAktivitetsgrad) { @@ -32,9 +39,9 @@ export function AktivitetsgradIOppgave(props: { doedsdato?: Date }) { oppgaveId: oppgave.id, vurderingId: aktivitet.id, }, - () => { + (data) => { + dispatch(setAktivitetspliktVurdering(data)) setAktivitetForRedigering(undefined) - oppdater() } ) } diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/aktivitetsgrad/LeggTilNyVurdering.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/aktivitetsgrad/LeggTilNyVurdering.tsx index fc6b06aa920..c1d1d33ef66 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/aktivitetsgrad/LeggTilNyVurdering.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/aktivitetsgrad/LeggTilNyVurdering.tsx @@ -2,15 +2,17 @@ import React, { useState } from 'react' import { Box, Button, Heading, VStack } from '@navikt/ds-react' import { VurderingAktivitetsgradForm } from './VurderingAktivitetsgradForm' import { PlusIcon } from '@navikt/aksel-icons' -import { useAktivitetspliktOppgaveVurdering } from '~components/aktivitetsplikt/OppgaveVurderingRoute' +import { useDispatch } from 'react-redux' +import { IAktivitetspliktVurderingNy } from '~shared/types/Aktivitetsplikt' +import { setAktivitetspliktVurdering } from '~store/reducers/Aktivitetsplikt12mnd' export function LeggTilNyVurdering(props: { doedsdato?: Date }) { - const { oppdater } = useAktivitetspliktOppgaveVurdering() + const dispatch = useDispatch() const [leggerTilVurdering, setLeggerTilVurdering] = useState(false) - function oppdaterStateVedLagring() { + function oppdaterStateVedLagring(data: IAktivitetspliktVurderingNy) { + dispatch(setAktivitetspliktVurdering(data)) setLeggerTilVurdering(false) - oppdater() } if (!leggerTilVurdering) { diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/aktivitetsgrad/VurderingAktivitetsgradForm.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/aktivitetsgrad/VurderingAktivitetsgradForm.tsx index 0016436b2d4..087e3f7cb90 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/aktivitetsgrad/VurderingAktivitetsgradForm.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/aktivitetsgrad/VurderingAktivitetsgradForm.tsx @@ -3,6 +3,7 @@ import { AktivitetspliktSkjoennsmessigVurdering, AktivitetspliktVurderingType, IAktivitetspliktAktivitetsgrad, + IAktivitetspliktVurderingNy, IOpprettAktivitetspliktAktivitetsgrad, tekstAktivitetspliktVurderingType, } from '~shared/types/Aktivitetsplikt' @@ -35,7 +36,7 @@ export function VurderingAktivitetsgradForm(props: { aktivitet?: IAktivitetspliktAktivitetsgrad doedsdato?: Date onAvbryt?: () => void - onSuccess: () => void + onSuccess: (data: IAktivitetspliktVurderingNy) => void }) { const { aktivitet, onSuccess, onAvbryt, doedsdato } = props const { oppgave } = useAktivitetspliktOppgaveVurdering() diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/unntak/LeggTilUnntak.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/unntak/LeggTilUnntak.tsx index 09a5cd80ade..d8c9125a62d 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/unntak/LeggTilUnntak.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/unntak/LeggTilUnntak.tsx @@ -2,15 +2,17 @@ import React, { useState } from 'react' import { Box, Button, Heading, VStack } from '@navikt/ds-react' import { PlusIcon } from '@navikt/aksel-icons' import { UnntakAktivitetspliktOppgaveForm } from '~components/aktivitetsplikt/vurdering/unntak/UnntakAktivitetspliktOppgaveForm' -import { useAktivitetspliktOppgaveVurdering } from '~components/aktivitetsplikt/OppgaveVurderingRoute' +import { IAktivitetspliktVurderingNy } from '~shared/types/Aktivitetsplikt' +import { useDispatch } from 'react-redux' +import { setAktivitetspliktVurdering } from '~store/reducers/Aktivitetsplikt12mnd' export function LeggTilUnntak() { - const { oppdater } = useAktivitetspliktOppgaveVurdering() const [leggerTilUnntak, setLeggerTilUnntak] = useState(false) + const dispatch = useDispatch() - function oppdaterTilstandVedLagring() { + function oppdaterTilstandVedLagring(data: IAktivitetspliktVurderingNy) { setLeggerTilUnntak(false) - oppdater() + dispatch(setAktivitetspliktVurdering(data)) } if (!leggerTilUnntak) { diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/unntak/UnntakAktivitetspliktOppgaveForm.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/unntak/UnntakAktivitetspliktOppgaveForm.tsx index f976a77ef70..5e5dd34b3c2 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/unntak/UnntakAktivitetspliktOppgaveForm.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/unntak/UnntakAktivitetspliktOppgaveForm.tsx @@ -1,6 +1,7 @@ import { AktivitetspliktUnntakType, IAktivitetspliktUnntak, + IAktivitetspliktVurderingNy, tekstAktivitetspliktUnntakType, } from '~shared/types/Aktivitetsplikt' import { useForm } from 'react-hook-form' @@ -29,7 +30,7 @@ function formdataErUtfylt(formdata: Partial): for export function UnntakAktivitetspliktOppgaveForm(props: { unntak?: IAktivitetspliktUnntak - onSuccess: () => void + onSuccess: (data: IAktivitetspliktVurderingNy) => void onAvbryt?: () => void }) { const { oppgave } = useAktivitetspliktOppgaveVurdering() @@ -43,7 +44,7 @@ export function UnntakAktivitetspliktOppgaveForm(props: { if (!formdataErUtfylt(formdata)) { return } - + console.log('formdata: ', formdata) lagreUnntak( { oppgaveId: oppgave.id, diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/unntak/UnntakIOppgave.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/unntak/UnntakIOppgave.tsx index c35835d5570..e4cd786e271 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/unntak/UnntakIOppgave.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/unntak/UnntakIOppgave.tsx @@ -1,5 +1,9 @@ import React, { useState } from 'react' -import { IAktivitetspliktUnntak, tekstAktivitetspliktUnntakType } from '~shared/types/Aktivitetsplikt' +import { + IAktivitetspliktUnntak, + IAktivitetspliktVurderingNy, + tekstAktivitetspliktUnntakType, +} from '~shared/types/Aktivitetsplikt' import { BodyShort, Box, Button, Detail, Heading, HStack, ReadMore, Table, VStack } from '@navikt/ds-react' import { HandShakeHeartIcon, PencilIcon, TrashIcon } from '@navikt/aksel-icons' import { AktivitetspliktUnntakTypeTag } from '~shared/tags/AktivitetspliktUnntakTypeTag' @@ -11,13 +15,15 @@ import { useApiCall } from '~shared/hooks/useApiCall' import { slettAktivitetspliktUnntak } from '~shared/api/aktivitetsplikt' import { isFailure, isPending } from '~shared/api/apiUtils' import { ApiErrorAlert } from '~ErrorBoundary' +import { setAktivitetspliktVurdering } from '~store/reducers/Aktivitetsplikt12mnd' +import { useDispatch } from 'react-redux' export function UnntakIOppgave() { - const { vurdering, oppgave, oppdater } = useAktivitetspliktOppgaveVurdering() + const { vurdering, oppgave } = useAktivitetspliktOppgaveVurdering() const [unntakForRedigering, setUnntakForRedigering] = useState() const [slettUnntakStatus, slettSpesifiktUnntak, resetSlettStatus] = useApiCall(slettAktivitetspliktUnntak) const unntaker = vurdering.unntak - + const dispatch = useDispatch() const oppgaveErRedigerbar = erOppgaveRedigerbar(oppgave.status) function slettUnntak(unntak: IAktivitetspliktUnntak) { @@ -27,17 +33,17 @@ export function UnntakIOppgave() { sakId: unntak.sakId, unntakId: unntak.id, }, - () => { + (data) => { + dispatch(setAktivitetspliktVurdering(data)) setUnntakForRedigering(undefined) - oppdater() } ) } - function oppdaterStateEtterRedigertUnntak() { - resetSlettStatus() + function oppdaterStateEtterRedigertUnntak(data: IAktivitetspliktVurderingNy) { + dispatch(setAktivitetspliktVurdering(data)) setUnntakForRedigering(undefined) - oppdater() + resetSlettStatus() } return ( @@ -76,6 +82,7 @@ export function UnntakIOppgave() { key={unntak.id} content={ setUnntakForRedigering(undefined)} /> diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/oppgavebenk/oppgaveModal/AktivitetspliktInfo6MndVarigUnntakModal.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/oppgavebenk/oppgaveModal/AktivitetspliktInfo6MndVarigUnntakModal.tsx index 3f006b5be31..9c082e4e09c 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/oppgavebenk/oppgaveModal/AktivitetspliktInfo6MndVarigUnntakModal.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/oppgavebenk/oppgaveModal/AktivitetspliktInfo6MndVarigUnntakModal.tsx @@ -36,9 +36,9 @@ export const AktivitetspliktInfo6MndVarigUnntakModal = ({ const ferdigstill = () => { if (!erFerdigstilt) { const merknad = begrunnelse ? begrunnelse : oppgave.merknad - apiFerdigstillOppgave({ id: oppgave.id, merknad }, () => { + apiFerdigstillOppgave({ id: oppgave.id, merknad }, (oppgave) => { setVisModal(false) - oppdaterStatus(oppgave.id, Oppgavestatus.FERDIGSTILT) + oppdaterStatus(oppgave.id, oppgave.status) }) } } diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/oppgavebenk/oppgaveModal/AktivitetspliktInfoModal.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/oppgavebenk/oppgaveModal/AktivitetspliktInfoModal.tsx index b94080b3343..6bacf5a963d 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/oppgavebenk/oppgaveModal/AktivitetspliktInfoModal.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/oppgavebenk/oppgaveModal/AktivitetspliktInfoModal.tsx @@ -72,9 +72,9 @@ export const AktivitetspliktInfoModal = ({ const ferdigstill = (data: AktivitetspliktVurderingValues) => { if (!erFerdigstilt && vurdering) { - apiFerdigstillOppgave(oppgave.id, () => { + apiFerdigstillOppgave(oppgave.id, (oppgave) => { setVisModal(false) - oppdaterStatus(oppgave.id, Oppgavestatus.FERDIGSTILT) + oppdaterStatus(oppgave.id, oppgave.status) }) } else if (data.aktivitetsplikt === JaNei.NEI || data.unntak === JaNei.JA) { opprettUnntak( diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/oppgavebenk/oppgaveModal/BrevOppgaveModal.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/oppgavebenk/oppgaveModal/BrevOppgaveModal.tsx index f3c8297e66c..b000fa0d1ac 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/oppgavebenk/oppgaveModal/BrevOppgaveModal.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/oppgavebenk/oppgaveModal/BrevOppgaveModal.tsx @@ -37,8 +37,8 @@ export const BrevOppgaveModal = ({ const avslutt = ({ kommentar }: { kommentar: string }) => { const nyMerknad = `${oppgave.merknad} – \nKommentar (${formaterDatoMedKlokkeslett(new Date())}): ${kommentar}` - avsluttOppgave({ id: oppgave.id, merknad: nyMerknad }, () => { - oppdaterStatus(oppgave.id, Oppgavestatus.FERDIGSTILT) + avsluttOppgave({ id: oppgave.id, merknad: nyMerknad }, (oppgave) => { + oppdaterStatus(oppgave.id, oppgave.status) setIsOpen(false) }) } diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/oppgavebenk/oppgaveModal/TilleggsinformasjonOppgaveModal.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/oppgavebenk/oppgaveModal/TilleggsinformasjonOppgaveModal.tsx index 5d8352dee4e..2a0cb4e9a17 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/oppgavebenk/oppgaveModal/TilleggsinformasjonOppgaveModal.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/oppgavebenk/oppgaveModal/TilleggsinformasjonOppgaveModal.tsx @@ -54,8 +54,8 @@ export const TilleggsinformasjonOppgaveModal = ({ const avslutt = ({ kommentar }: { kommentar: string }) => { const merknad = `${oppgave.merknad}. Kommentar: ${kommentar}` - avsluttOppgave({ id: oppgave.id, merknad }, () => { - oppdaterStatus(oppgave.id, Oppgavestatus.FERDIGSTILT) + avsluttOppgave({ id: oppgave.id, merknad }, (oppgave) => { + oppdaterStatus(oppgave.id, oppgave.status) setIsOpen(false) }) } diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/person/aktivitet/vurderingAvAktivitetsplikt/ValgForInfobrev.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/person/aktivitet/vurderingAvAktivitetsplikt/ValgForInfobrev.tsx index c4de1980af9..ad80fa9fb9b 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/person/aktivitet/vurderingAvAktivitetsplikt/ValgForInfobrev.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/person/aktivitet/vurderingAvAktivitetsplikt/ValgForInfobrev.tsx @@ -11,6 +11,8 @@ import { PencilIcon } from '@navikt/aksel-icons' import { Info } from '~components/behandling/soeknadsoversikt/Info' import { useAktivitetspliktOppgaveVurdering } from '~components/aktivitetsplikt/OppgaveVurderingRoute' import { erOppgaveRedigerbar } from '~shared/types/oppgave' +import { useDispatch } from 'react-redux' +import { setAktivtetspliktbrevdata } from '~store/reducers/Aktivitetsplikt12mnd' interface IBrevAktivitetsplikt { skalSendeBrev: JaNei @@ -27,21 +29,21 @@ function mapToDto(brevdata: IBrevAktivitetsplikt): IBrevAktivitetspliktRequest { } export const ValgForInfobrev = () => { - const { oppgave, aktivtetspliktbrevdata, oppdater } = useAktivitetspliktOppgaveVurdering() + const { oppgave, aktivtetspliktbrevdata } = useAktivitetspliktOppgaveVurdering() const { handleSubmit, watch, control, resetField } = useForm({}) + const dispatch = useDispatch() const [lagrebrevdataStatus, lagrebrevdata, tilbakestillApiResult] = useApiCall(lagreAktivitetspliktBrevdata) const [redigeres, setRedigeres] = useState(!aktivtetspliktbrevdata) - const [brevdata, oppdaterBrevdata] = useState(aktivtetspliktbrevdata) + const brevdata = aktivtetspliktbrevdata const lagreBrevutfall = (data: IBrevAktivitetsplikt) => { const brevdatamappedToDo = mapToDto(data) lagrebrevdata( { oppgaveId: oppgave.id, brevdata: brevdatamappedToDo }, - () => { - oppdaterBrevdata(brevdatamappedToDo) + (brevdata) => { + dispatch(setAktivtetspliktbrevdata(brevdata)) setRedigeres(false) - oppdater() }, () => {} ) diff --git a/apps/etterlatte-saksbehandling-ui/client/src/shared/api/aktivitetsplikt.ts b/apps/etterlatte-saksbehandling-ui/client/src/shared/api/aktivitetsplikt.ts index 790617ddce2..2c4e36a7799 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/shared/api/aktivitetsplikt.ts +++ b/apps/etterlatte-saksbehandling-ui/client/src/shared/api/aktivitetsplikt.ts @@ -9,6 +9,7 @@ import { IOpprettAktivitetspliktAktivitetsgrad, IOpprettAktivitetspliktUnntak, } from '~shared/types/Aktivitetsplikt' +import { OppgaveDTO } from '~shared/types/oppgave' export const hentAktivitetspliktOppfolging = async (args: { behandlingId: string @@ -55,12 +56,6 @@ export const hentAktivitspliktVurderingForOppgave = async (args: { }): Promise> => apiClient.get(`/sak/${args.sakId}/oppgave/${args.oppgaveId}/aktivitetsplikt/vurdering`) -export const hentAktivitetspliktVurderingForOppgaveNy = async (args: { - sakId: number - oppgaveId: string -}): Promise> => - apiClient.get(`/sak/${args.sakId}/oppgave/${args.oppgaveId}/aktivitetsplikt/vurdering/ny`) - export const opprettAktivitetspliktAktivitetsgrad = async (args: { sakId: number oppgaveId: string @@ -83,7 +78,7 @@ export const opprettAktivitetspliktUnntak = async (args: { sakId: number oppgaveId: string request: IOpprettAktivitetspliktUnntak -}): Promise> => +}): Promise> => apiClient.post(`/sak/${args.sakId}/oppgave/${args.oppgaveId}/aktivitetsplikt/vurdering/unntak`, { ...args.request }) export const slettAktivitetspliktUnntak = async (args: { @@ -130,7 +125,7 @@ export interface IBrevAktivitetspliktRequest { export const lagreAktivitetspliktBrevdata = async (args: { oppgaveId: string brevdata: IBrevAktivitetspliktRequest -}): Promise> => +}): Promise> => apiClient.post(`/aktivitetsplikt/oppgave/${args.oppgaveId}/brevdata`, { ...args.brevdata }) export const opprettAktivitetspliktsbrev = async (args: { oppgaveId: string }): Promise> => @@ -138,7 +133,7 @@ export const opprettAktivitetspliktsbrev = async (args: { oppgaveId: string }): export const ferdigstillBrevOgOppgaveAktivitetsplikt = async (args: { oppgaveId: string -}): Promise> => +}): Promise> => apiClient.post(`/aktivitetsplikt/oppgave/${args.oppgaveId}/ferdigstillbrev-og-oppgave`, {}) interface BrevId { diff --git a/apps/etterlatte-saksbehandling-ui/client/src/shared/api/oppgaver.ts b/apps/etterlatte-saksbehandling-ui/client/src/shared/api/oppgaver.ts index 9b248ffa5c8..68299c66f65 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/shared/api/oppgaver.ts +++ b/apps/etterlatte-saksbehandling-ui/client/src/shared/api/oppgaver.ts @@ -49,12 +49,13 @@ export const opprettOppgave = async (args: { request: NyOppgaveDto }): Promise> => apiClient.post(`/oppgaver/sak/${args.sakId}/opprett`, { ...args.request }) -export const ferdigstillOppgave = async (id: string): Promise> => ferdigstillOppgaveMedMerknad({ id }) +export const ferdigstillOppgave = async (id: string): Promise> => + ferdigstillOppgaveMedMerknad({ id }) export const ferdigstillOppgaveMedMerknad = async (args: { id: string merknad?: string | null -}): Promise> => apiClient.put(`/oppgaver/${args.id}/ferdigstill`, { merknad: args.merknad }) +}): Promise> => apiClient.put(`/oppgaver/${args.id}/ferdigstill`, { merknad: args.merknad }) export interface OppdatertOppgaveversjonResponseDto { versjon: number | null diff --git a/apps/etterlatte-saksbehandling-ui/client/src/store/Store.tsx b/apps/etterlatte-saksbehandling-ui/client/src/store/Store.tsx index 4ec91d07c83..3a81d00ab37 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/store/Store.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/store/Store.tsx @@ -13,6 +13,7 @@ import { sjekklisteReducer } from '~store/reducers/SjekklisteReducer' import { behandlingsidemenyReducer } from '~store/reducers/BehandlingSidemenyReducer' import { oppgaveReducer } from '~store/reducers/OppgaveReducer' import { personopplysningerReducer } from '~store/reducers/PersonopplysningerReducer' +import { Aktivitetsplikt12mndReducer } from '~store/reducers/Aktivitetsplikt12mnd' const reducer = { menuReducer: menuReducer, @@ -27,6 +28,7 @@ const reducer = { journalfoeringOppgaveReducer: journalfoeringOppgaveReducer, sjekklisteReducer: sjekklisteReducer, personopplysningerReducer: personopplysningerReducer, + Aktivitetsplikt12mndReducer: Aktivitetsplikt12mndReducer, } export const store = configureStore({ reducer, diff --git a/apps/etterlatte-saksbehandling-ui/client/src/store/reducers/Aktivitetsplikt12mnd.ts b/apps/etterlatte-saksbehandling-ui/client/src/store/reducers/Aktivitetsplikt12mnd.ts new file mode 100644 index 00000000000..20db3cfa180 --- /dev/null +++ b/apps/etterlatte-saksbehandling-ui/client/src/store/reducers/Aktivitetsplikt12mnd.ts @@ -0,0 +1,45 @@ +import { createAction, createReducer } from '@reduxjs/toolkit' +import { AktivitetspliktOppgaveVurdering, IAktivitetspliktVurderingNy } from '~shared/types/Aktivitetsplikt' +import { useAppSelector } from '~store/Store' +import { IBrevAktivitetspliktDto } from '~shared/api/aktivitetsplikt' +import { OppgaveDTO } from '~shared/types/oppgave' + +const initialState: AktivitetspliktOppgaveVurdering = {} as AktivitetspliktOppgaveVurdering + +export const setStartdata = createAction('set/AktivitetspliktOppgaveVurdering') +export const setBrevid = createAction('set/AktivitetspliktOppgaveVurdering/aktivtetspliktbrevdata/brevid') +export const setAktivtetspliktbrevdata = createAction( + 'set/AktivitetspliktOppgaveVurdering/aktivtetspliktbrevdata' +) +export const setAktivitetspliktVurdering = createAction( + 'set/AktivitetspliktOppgaveVurdering/aktivitetspliktVurdering' +) +export const setAktivitetspliktOppgave = createAction('set/AktivitetspliktOppgaveVurdering/oppgave') + +export const Aktivitetsplikt12mndReducer = createReducer(initialState, (builder) => { + builder.addCase(setStartdata, (_, action) => action.payload) + builder.addCase(setAktivtetspliktbrevdata, (state, action) => { + if (state.aktivtetspliktbrevdata) { + state.aktivtetspliktbrevdata = action.payload + } + }) + builder.addCase(setBrevid, (state, action) => { + if (state.aktivtetspliktbrevdata) { + state.aktivtetspliktbrevdata.brevId = action.payload + } + }) + builder.addCase(setAktivitetspliktVurdering, (state, action) => { + if (state.vurdering) { + state.vurdering = action.payload + } + }) + builder.addCase(setAktivitetspliktOppgave, (state, action) => { + if (state.oppgave) { + state.oppgave = action.payload + } + }) +}) + +export function useAktivitetspliktOppgaveVurderingState(): AktivitetspliktOppgaveVurdering { + return useAppSelector((state) => state.Aktivitetsplikt12mndReducer) +} From 24b82afae5550178294bc19dba94b480cf504d02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Oliver=20S=C3=B8berg?= <82504565+sebassonav@users.noreply.github.com> Date: Fri, 8 Nov 2024 11:37:09 +0100 Subject: [PATCH 15/85] Slett brev krevde sakid (#6263) * Slett brev krevde sakid * Fiks test --- .../aktivitetsplikt/AktivitetspliktOppgaveService.kt | 6 +++--- .../aktivitetsplikt/AktivitetspliktRoute.kt | 4 ++-- .../main/kotlin/behandling/klienter/BrevApiKlient.kt | 5 ++++- .../AktivitetspliktOppgaveServiceTest.kt | 12 ++++++------ .../src/test/kotlin/integration/EksterneKlienter.kt | 1 + 5 files changed, 16 insertions(+), 12 deletions(-) diff --git a/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveService.kt b/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveService.kt index 13325a9e603..050c6f28250 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveService.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveService.kt @@ -79,7 +79,7 @@ class AktivitetspliktOppgaveService( fun lagreBrevdata( oppgaveId: UUID, data: AktivitetspliktInformasjonBrevdataRequest, - ): AktivitetspliktInformasjonBrevdata? { + ): AktivitetspliktInformasjonBrevdata { val oppgave = oppgaveService.hentOppgave(oppgaveId) if (oppgave.status.erAvsluttet()) { throw OppgaveErAvsluttet("Oppgave er avsluttet, id $oppgaveId. Kan ikke fjerne brevid") @@ -93,9 +93,9 @@ class AktivitetspliktOppgaveService( val hentBrevId = aktivitetspliktBrevDao.hentBrevdata(oppgaveId = oppgaveId) if (!data.skalSendeBrev && hentBrevId?.brevId != null) { aktivitetspliktBrevDao.fjernBrevId(oppgaveId, kilde) - runBlocking { brevApiKlient.slettBrev(brevId = hentBrevId.brevId, brukerTokenInfo = saksbehandler) } + runBlocking { brevApiKlient.slettBrev(brevId = hentBrevId.brevId, sakId = sak.id, brukerTokenInfo = saksbehandler) } } - return aktivitetspliktBrevDao.hentBrevdata(oppgaveId) + return aktivitetspliktBrevDao.hentBrevdata(oppgaveId)!! } } diff --git a/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktRoute.kt b/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktRoute.kt index 9dbf55fc47a..b0442bb7e03 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktRoute.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktRoute.kt @@ -252,8 +252,8 @@ internal fun Route.aktivitetspliktRoutes( } post("brevdata") { val brevdata = call.receive() - inTransaction { aktivitetspliktOppgaveService.lagreBrevdata(oppgaveId, brevdata) } - call.respond(HttpStatusCode.OK) + val oppdaterBrevdata = inTransaction { aktivitetspliktOppgaveService.lagreBrevdata(oppgaveId, brevdata) } + call.respond(oppdaterBrevdata) } post("opprettbrev") { val brevId = diff --git a/apps/etterlatte-behandling/src/main/kotlin/behandling/klienter/BrevApiKlient.kt b/apps/etterlatte-behandling/src/main/kotlin/behandling/klienter/BrevApiKlient.kt index 838f250503f..a5487967755 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/behandling/klienter/BrevApiKlient.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/klienter/BrevApiKlient.kt @@ -20,6 +20,7 @@ import no.nav.etterlatte.libs.common.toJson import no.nav.etterlatte.libs.ktor.ktor.ktorobo.AzureAdClient import no.nav.etterlatte.libs.ktor.ktor.ktorobo.DownstreamResourceClient import no.nav.etterlatte.libs.ktor.ktor.ktorobo.Resource +import no.nav.etterlatte.libs.ktor.route.SAKID_CALL_PARAMETER import no.nav.etterlatte.libs.ktor.token.BrukerTokenInfo import java.util.UUID @@ -32,6 +33,7 @@ interface BrevApiKlient { suspend fun slettBrev( brevId: Long, + sakId: SakId, brukerTokenInfo: BrukerTokenInfo, ) @@ -125,11 +127,12 @@ class BrevApiKlientObo( override suspend fun slettBrev( brevId: Long, + sakId: SakId, brukerTokenInfo: BrukerTokenInfo, ) { downstreamResourceClient .delete( - resource = Resource(clientId = clientId, url = "$resourceUrl/api/brev/$brevId"), + resource = Resource(clientId = clientId, url = "$resourceUrl/api/brev/$brevId?${SAKID_CALL_PARAMETER}=${sakId.sakId}"), brukerTokenInfo = brukerTokenInfo, ).mapBoth( success = { }, diff --git a/apps/etterlatte-behandling/src/test/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveServiceTest.kt b/apps/etterlatte-behandling/src/test/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveServiceTest.kt index 438d3ccd43c..6a7da0865ee 100644 --- a/apps/etterlatte-behandling/src/test/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveServiceTest.kt +++ b/apps/etterlatte-behandling/src/test/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveServiceTest.kt @@ -406,12 +406,12 @@ class AktivitetspliktOppgaveServiceTest { kilde = kilde, ) every { aktivitetspliktBrevDao.fjernBrevId(oppgaveId, any()) } returns 1 - coEvery { brevApiKlient.slettBrev(any(), any()) } just Runs + coEvery { brevApiKlient.slettBrev(any(), any(), any()) } just Runs val aktivitetspliktInformasjonBrevdataRequest = AktivitetspliktInformasjonBrevdataRequest(false) service.lagreBrevdata(oppgaveId, aktivitetspliktInformasjonBrevdataRequest) - coVerify(exactly = 1) { brevApiKlient.slettBrev(any(), any()) } + coVerify(exactly = 1) { brevApiKlient.slettBrev(any(), any(), any()) } verify(exactly = 1) { aktivitetspliktBrevDao.fjernBrevId(oppgaveId, any()) } } @@ -439,12 +439,12 @@ class AktivitetspliktOppgaveServiceTest { kilde = kilde, ) every { aktivitetspliktBrevDao.fjernBrevId(oppgaveId, any()) } returns 1 - coEvery { brevApiKlient.slettBrev(any(), any()) } just Runs + coEvery { brevApiKlient.slettBrev(any(), any(), any()) } just Runs val aktivitetspliktInformasjonBrevdataRequest = AktivitetspliktInformasjonBrevdataRequest(false) service.lagreBrevdata(oppgaveId, aktivitetspliktInformasjonBrevdataRequest) - coVerify(exactly = 0) { brevApiKlient.slettBrev(any(), any()) } + coVerify(exactly = 0) { brevApiKlient.slettBrev(any(), any(), any()) } verify(exactly = 0) { aktivitetspliktBrevDao.fjernBrevId(oppgaveId, any()) } } @@ -472,12 +472,12 @@ class AktivitetspliktOppgaveServiceTest { kilde = kilde, ) every { aktivitetspliktBrevDao.fjernBrevId(oppgaveId, any()) } returns 1 - coEvery { brevApiKlient.slettBrev(any(), any()) } just Runs + coEvery { brevApiKlient.slettBrev(any(), any(), any()) } just Runs val aktivitetspliktInformasjonBrevdataRequest = AktivitetspliktInformasjonBrevdataRequest(true) service.lagreBrevdata(oppgaveId, aktivitetspliktInformasjonBrevdataRequest) - coVerify(exactly = 0) { brevApiKlient.slettBrev(any(), any()) } + coVerify(exactly = 0) { brevApiKlient.slettBrev(any(), any(), any()) } verify(exactly = 0) { aktivitetspliktBrevDao.fjernBrevId(oppgaveId, any()) } } } diff --git a/apps/etterlatte-behandling/src/test/kotlin/integration/EksterneKlienter.kt b/apps/etterlatte-behandling/src/test/kotlin/integration/EksterneKlienter.kt index 597083849dc..264c51d571d 100644 --- a/apps/etterlatte-behandling/src/test/kotlin/integration/EksterneKlienter.kt +++ b/apps/etterlatte-behandling/src/test/kotlin/integration/EksterneKlienter.kt @@ -351,6 +351,7 @@ class BrevApiKlientTest : BrevApiKlient { override suspend fun slettBrev( brevId: Long, + sakId: SakId, brukerTokenInfo: BrukerTokenInfo, ) { TODO("Not yet implemented") From 401827e5f0484720cee72ec979bfc6a0adf35ac5 Mon Sep 17 00:00:00 2001 From: "Nicolas N." Date: Fri, 8 Nov 2024 11:50:50 +0100 Subject: [PATCH 16/85] EY-4561 Nytt endepunkt for uthenting av alle folkeregidenter (#6265) --- .../src/main/kotlin/pdl/PdlKlient.kt | 15 ++++++---- .../src/main/kotlin/pdl/PdlOboKlient.kt | 2 +- .../src/main/kotlin/person/PersonRoute.kt | 8 ++++++ .../src/main/kotlin/person/PersonService.kt | 28 +++++++++++++++++++ .../main/kotlin/personweb/PersonWebService.kt | 5 ++-- ...{hentIdent.graphql => hentIdenter.graphql} | 0 .../src/main/kotlin/person/Person.kt | 21 +++++++------- 7 files changed, 60 insertions(+), 19 deletions(-) rename apps/etterlatte-pdltjenester/src/main/resources/pdl/{hentIdent.graphql => hentIdenter.graphql} (100%) diff --git a/apps/etterlatte-pdltjenester/src/main/kotlin/pdl/PdlKlient.kt b/apps/etterlatte-pdltjenester/src/main/kotlin/pdl/PdlKlient.kt index 9667a9ffb95..a57a78c96cd 100644 --- a/apps/etterlatte-pdltjenester/src/main/kotlin/pdl/PdlKlient.kt +++ b/apps/etterlatte-pdltjenester/src/main/kotlin/pdl/PdlKlient.kt @@ -146,21 +146,27 @@ class PdlKlient( } } - suspend fun hentPdlIdentifikator(request: HentPdlIdentRequest): PdlIdentResponse { + suspend fun hentPdlIdentifikator( + request: HentPdlIdentRequest, + grupper: List = listOf(PDLIdentGruppeTyper.FOLKEREGISTERIDENT, PDLIdentGruppeTyper.NPID), + ): PdlIdentResponse { val graphqlRequest = PdlIdentRequest( - query = getQuery("/pdl/hentIdent.graphql"), + query = getQuery("/pdl/hentIdenter.graphql"), variables = PdlIdentVariables( ident = request.ident.value, - grupper = listOf(PDLIdentGruppeTyper.FOLKEREGISTERIDENT.navn, PDLIdentGruppeTyper.NPID.navn), + grupper = grupper.map { it.navn }, historikk = true, ), ) logger.info("Henter PdlIdentifikator for ident = ${request.ident} fra PDL") + return retry { httpClient .post(apiUrl) { + behandlingsnummer(SakType.entries) + header(HEADER_TEMA, HEADER_TEMA_VALUE) accept(Json) contentType(Json) setBody(graphqlRequest) @@ -204,7 +210,7 @@ class PdlKlient( suspend fun hentAktoerId(request: HentPdlIdentRequest): PdlIdentResponse { val graphqlRequest = PdlIdentRequest( - query = getQuery("/pdl/hentIdent.graphql"), + query = getQuery("/pdl/hentIdenter.graphql"), variables = PdlIdentVariables( ident = request.ident.value, @@ -238,6 +244,5 @@ class PdlKlient( companion object { const val HEADER_TEMA = "Tema" const val HEADER_TEMA_VALUE = "PEN" - const val PDL_BULK_SIZE = 100 } } diff --git a/apps/etterlatte-pdltjenester/src/main/kotlin/pdl/PdlOboKlient.kt b/apps/etterlatte-pdltjenester/src/main/kotlin/pdl/PdlOboKlient.kt index 69bada2e9bf..fedc0f9e295 100644 --- a/apps/etterlatte-pdltjenester/src/main/kotlin/pdl/PdlOboKlient.kt +++ b/apps/etterlatte-pdltjenester/src/main/kotlin/pdl/PdlOboKlient.kt @@ -60,7 +60,7 @@ class PdlOboKlient( }.let { when (it) { is RetryResult.Success -> - it.content.also { loggDelvisReturnerteData(it, request) } + it.content.also { result -> loggDelvisReturnerteData(result, request) } is RetryResult.Failure -> throw it.samlaExceptions() } diff --git a/apps/etterlatte-pdltjenester/src/main/kotlin/person/PersonRoute.kt b/apps/etterlatte-pdltjenester/src/main/kotlin/person/PersonRoute.kt index 005c5c1fbdf..34bd39ba5d8 100644 --- a/apps/etterlatte-pdltjenester/src/main/kotlin/person/PersonRoute.kt +++ b/apps/etterlatte-pdltjenester/src/main/kotlin/person/PersonRoute.kt @@ -66,6 +66,14 @@ fun Route.personRoute(service: PersonService) { } } + post("folkeregisteridenter") { + val request = call.receive() + + val identer = service.hentPdlFolkeregisterIdenter(request) + + call.respond(identer) + } + route("aktoerid") { post { val ident = call.receive() diff --git a/apps/etterlatte-pdltjenester/src/main/kotlin/person/PersonService.kt b/apps/etterlatte-pdltjenester/src/main/kotlin/person/PersonService.kt index bb817c719a4..a5f92f4288c 100644 --- a/apps/etterlatte-pdltjenester/src/main/kotlin/person/PersonService.kt +++ b/apps/etterlatte-pdltjenester/src/main/kotlin/person/PersonService.kt @@ -15,6 +15,7 @@ import no.nav.etterlatte.libs.common.person.HentPersonRequest import no.nav.etterlatte.libs.common.person.HentPersongalleriRequest import no.nav.etterlatte.libs.common.person.NavPersonIdent import no.nav.etterlatte.libs.common.person.PDLIdentGruppeTyper +import no.nav.etterlatte.libs.common.person.PdlFolkeregisterIdentListe import no.nav.etterlatte.libs.common.person.PdlIdentifikator import no.nav.etterlatte.libs.common.person.Person import no.nav.etterlatte.libs.common.person.PersonRolle @@ -193,6 +194,33 @@ class PersonService( } } + suspend fun hentPdlFolkeregisterIdenter(request: HentPdlIdentRequest): PdlFolkeregisterIdentListe { + logger.info("Henter alle folkeregisteridenter for ident=${request.ident} fra PDL, inkl. historiske") + + val response = pdlKlient.hentPdlIdentifikator(request, listOf(PDLIdentGruppeTyper.FOLKEREGISTERIDENT)) + + return if (response.data?.hentIdenter == null) { + val pdlFeil = response.errors?.asFormatertFeil() + + if (response.errors?.personIkkeFunnet() == true) { + throw FantIkkePersonException("Fant ikke personen ${request.ident}") + } else { + throw PdlForesporselFeilet( + "Kunne ikke hente pdlidentifkator for ${request.ident} fra PDL: $pdlFeil", + ) + } + } else { + response.data.hentIdenter.identer + .filterNot { it.gruppe == PDLIdentGruppeTyper.FOLKEREGISTERIDENT.navn } + .map { + PdlIdentifikator.FolkeregisterIdent( + Folkeregisteridentifikator.of(it.ident), + it.historisk, + ) + }.let(::PdlFolkeregisterIdentListe) + } + } + suspend fun hentPersongalleri(hentPersongalleriRequest: HentPersongalleriRequest): Persongalleri { val persongalleri = when (hentPersongalleriRequest.saktype) { diff --git a/apps/etterlatte-pdltjenester/src/main/kotlin/personweb/PersonWebService.kt b/apps/etterlatte-pdltjenester/src/main/kotlin/personweb/PersonWebService.kt index 305d0ade3f1..ae3aee46ad1 100644 --- a/apps/etterlatte-pdltjenester/src/main/kotlin/personweb/PersonWebService.kt +++ b/apps/etterlatte-pdltjenester/src/main/kotlin/personweb/PersonWebService.kt @@ -88,8 +88,7 @@ class PersonWebService( ppsKlient = ppsKlient, ident = it.person.folkeregisteridentifikator - .filter { !it.metadata.historisk } - .first() + .first { !it.metadata.historisk } .identifikasjonsnummer, soekPerson = it.person, ) @@ -234,7 +233,7 @@ class PersonWebService( any { error -> error.extensions?.code == "unauthorized" && error.extensions - ?.details + .details ?.policy ?.let { policy -> policy.contains("adressebeskyttelse_fortrolig_adresse") || diff --git a/apps/etterlatte-pdltjenester/src/main/resources/pdl/hentIdent.graphql b/apps/etterlatte-pdltjenester/src/main/resources/pdl/hentIdenter.graphql similarity index 100% rename from apps/etterlatte-pdltjenester/src/main/resources/pdl/hentIdent.graphql rename to apps/etterlatte-pdltjenester/src/main/resources/pdl/hentIdenter.graphql diff --git a/libs/saksbehandling-common/src/main/kotlin/person/Person.kt b/libs/saksbehandling-common/src/main/kotlin/person/Person.kt index c38d9e1dc06..14665cdf426 100644 --- a/libs/saksbehandling-common/src/main/kotlin/person/Person.kt +++ b/libs/saksbehandling-common/src/main/kotlin/person/Person.kt @@ -153,17 +153,25 @@ data class VergeEllerFullmektig( val omfang: String? = null, ) +data class PdlFolkeregisterIdentListe( + val identifikatorer: List, +) + @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type") -sealed class PdlIdentifikator { +sealed class PdlIdentifikator( + open val historisk: Boolean, +) { @JsonTypeName("FOLKEREGISTERIDENT") data class FolkeregisterIdent( val folkeregisterident: Folkeregisteridentifikator, - ) : PdlIdentifikator() + override val historisk: Boolean = false, + ) : PdlIdentifikator(historisk) @JsonTypeName("NPID") data class Npid( val npid: NavPersonIdent, - ) : PdlIdentifikator() + override val historisk: Boolean = false, + ) : PdlIdentifikator(historisk) @JsonTypeName("AKTORID") data class AktoerId( @@ -257,13 +265,6 @@ data class MottakerAdresse( val land: String, ) -// TODO gir denne egentlig mening i nåværende form? Aktiv tar utgangspunkt i det vi får fra PPS, men det kan -// i teorien være en adresse som ikke lenger er gyldig da den kan ha satt gyldigTilDato -fun List.aktiv(): Adresse? = firstOrNull { it.aktiv } - -fun List.nyeste(inkluderInaktiv: Boolean = false): Adresse? = - sortedByDescending { it.gyldigFraOgMed }.firstOrNull { if (inkluderInaktiv) true else it.gyldigTilOgMed == null } - enum class AdressebeskyttelseGradering { STRENGT_FORTROLIG_UTLAND, STRENGT_FORTROLIG, From 69db280540a6b46e07426c78ac0dc15d24546dc6 Mon Sep 17 00:00:00 2001 From: "Nicolas N." Date: Fri, 8 Nov 2024 12:26:15 +0100 Subject: [PATCH 17/85] =?UTF-8?q?Opprydding=20i=20diverse=20sm=C3=A5rusk?= =?UTF-8?q?=20(#6267)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Opprydding i diverse smårusk * fikse en liten feil * logge opplysningstype Co-authored-by: Øyvind Stette Haarberg --------- Co-authored-by: Øyvind Stette Haarberg --- .../kotlin/behandling/klage/KlageService.kt | 3 +- .../AutomatiskRevurderingService.kt | 2 - .../behandling/sjekkliste/SjekklisteDao.kt | 7 +-- .../GrunnlagsendringshendelseService.kt | 2 +- .../src/main/kotlin/oppgave/OppgaveService.kt | 2 +- .../src/main/kotlin/sak/SakRoutes.kt | 29 ++++++------ .../src/main/kotlin/sak/SakendringerDao.kt | 2 +- .../hendelserpdl/PersonHendelseFordeler.kt | 44 +++++-------------- 8 files changed, 33 insertions(+), 58 deletions(-) diff --git a/apps/etterlatte-behandling/src/main/kotlin/behandling/klage/KlageService.kt b/apps/etterlatte-behandling/src/main/kotlin/behandling/klage/KlageService.kt index 515c8f2a121..1aba0a95b0f 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/behandling/klage/KlageService.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/klage/KlageService.kt @@ -31,6 +31,7 @@ import no.nav.etterlatte.libs.common.behandling.Mottakerident import no.nav.etterlatte.libs.common.behandling.SendtInnstillingsbrev import no.nav.etterlatte.libs.common.feilhaandtering.IkkeFunnetException import no.nav.etterlatte.libs.common.feilhaandtering.IkkeTillattException +import no.nav.etterlatte.libs.common.feilhaandtering.InternfeilException import no.nav.etterlatte.libs.common.feilhaandtering.UgyldigForespoerselException import no.nav.etterlatte.libs.common.grunnlag.Grunnlagsopplysning import no.nav.etterlatte.libs.common.klage.AarsakTilAvbrytelse @@ -685,7 +686,7 @@ class KlageServiceImpl( ) { val utfall = klage.utfall as KlageUtfallMedData.Avvist if (vedtakId != utfall.vedtak.vedtakId) { - throw IllegalStateException( + throw InternfeilException( "VedtakId=$vedtakId er forskjellig fra det som ligger i utfall=$vedtakId", ) } diff --git a/apps/etterlatte-behandling/src/main/kotlin/behandling/revurdering/AutomatiskRevurderingService.kt b/apps/etterlatte-behandling/src/main/kotlin/behandling/revurdering/AutomatiskRevurderingService.kt index 454fde118ca..4541d78638a 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/behandling/revurdering/AutomatiskRevurderingService.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/revurdering/AutomatiskRevurderingService.kt @@ -165,8 +165,6 @@ class AutomatiskRevurderingService( } } -class KunSystembrukerException : Exception("Hendelser kan kun utføres av systembruker") - class OmregningKreverLoependeVedtak : UgyldigForespoerselException("OMREGNING_KREVER_LØPENDE_VEDTAK", "Omregning krever at sak har løpende vedtak") diff --git a/apps/etterlatte-behandling/src/main/kotlin/behandling/sjekkliste/SjekklisteDao.kt b/apps/etterlatte-behandling/src/main/kotlin/behandling/sjekkliste/SjekklisteDao.kt index 817f43c1dcf..82710d7e2b4 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/behandling/sjekkliste/SjekklisteDao.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/sjekkliste/SjekklisteDao.kt @@ -3,6 +3,7 @@ package no.nav.etterlatte.behandling.sjekkliste import no.nav.etterlatte.Kontekst import no.nav.etterlatte.behandling.hendelse.getUUID import no.nav.etterlatte.common.ConnectionAutoclosing +import no.nav.etterlatte.libs.common.feilhaandtering.InternfeilException import no.nav.etterlatte.libs.database.toList import java.sql.ResultSet import java.util.UUID @@ -80,7 +81,7 @@ class SjekklisteDao( stmt.setObject(6, sjekklisteId) stmt.executeUpdate().also { if (it != 1) { - throw IllegalStateException("Feil under oppdatering av sjekkliste $sjekklisteId") + throw InternfeilException("Feil under oppdatering av sjekkliste $sjekklisteId") } } } @@ -156,7 +157,7 @@ class SjekklisteDao( stmt .executeQuery() .toList { sjekklisteItem() } - .also { if (it.isEmpty()) throw IllegalStateException("Fant ingen sjekklisterad id=$sjekklisteItemId") } + .also { if (it.isEmpty()) throw InternfeilException("Fant ingen sjekklisterad id=$sjekklisteItemId") } .first() } } @@ -190,7 +191,7 @@ class SjekklisteDao( stmt.setObject(3, itemId) stmt.executeUpdate().also { if (it != 1) { - throw IllegalStateException("Feil under oppdatering av sjekklisterad $itemId") + throw InternfeilException("Feil under oppdatering av sjekklisterad $itemId") } } } diff --git a/apps/etterlatte-behandling/src/main/kotlin/grunnlagsendring/GrunnlagsendringshendelseService.kt b/apps/etterlatte-behandling/src/main/kotlin/grunnlagsendring/GrunnlagsendringshendelseService.kt index 04e6352601a..d1621b260a4 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/grunnlagsendring/GrunnlagsendringshendelseService.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/grunnlagsendring/GrunnlagsendringshendelseService.kt @@ -399,7 +399,7 @@ class GrunnlagsendringshendelseService( } } - internal fun opprettRelevantHendelse( + private fun opprettRelevantHendelse( hendelse: Grunnlagsendringshendelse, samsvarMellomKildeOgGrunnlag: SamsvarMellomKildeOgGrunnlag, ) { diff --git a/apps/etterlatte-behandling/src/main/kotlin/oppgave/OppgaveService.kt b/apps/etterlatte-behandling/src/main/kotlin/oppgave/OppgaveService.kt index 044e048d1e3..fead4a49271 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/oppgave/OppgaveService.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/oppgave/OppgaveService.kt @@ -280,7 +280,7 @@ class OppgaveService( hentOppgaverForReferanse(referanse) .filter { it.type == type } .singleOrNull { it.erAttestering() } - ?: throw IllegalStateException("Fant ikke oppgave med referanse: $referanse") + ?: throw InternfeilException("Fant ikke oppgave med referanse: $referanse") val oppdatertMerknad = merknad ?: oppgave.merknad ?: "" val oppgaveId = oppgave.id diff --git a/apps/etterlatte-behandling/src/main/kotlin/sak/SakRoutes.kt b/apps/etterlatte-behandling/src/main/kotlin/sak/SakRoutes.kt index 7f6a946f365..f9a00992154 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/sak/SakRoutes.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/sak/SakRoutes.kt @@ -25,7 +25,6 @@ import no.nav.etterlatte.libs.common.behandling.SisteIverksatteBehandling import no.nav.etterlatte.libs.common.feilhaandtering.GenerellIkkeFunnetException import no.nav.etterlatte.libs.common.feilhaandtering.IkkeFunnetException import no.nav.etterlatte.libs.common.feilhaandtering.UgyldigForespoerselException -import no.nav.etterlatte.libs.common.person.Folkeregisteridentifikator import no.nav.etterlatte.libs.common.sak.HentSakerRequest import no.nav.etterlatte.libs.common.sak.Sak import no.nav.etterlatte.libs.common.sak.SakId @@ -151,10 +150,12 @@ internal fun Route.sakSystemRoutes( withFoedselsnummerInternal(tilgangService) { fnr -> val type: SakType = enumValueOf(requireNotNull(call.parameters["type"]) { "Må ha en Saktype for å finne sak" }) + + requestLogger.loggRequest(brukerTokenInfo, fnr, "personer/getsak/{type}") + val sak = - inTransaction { sakService.finnSak(fnr.value, type) }.also { - requestLogger.loggRequest(brukerTokenInfo, fnr, "personer/sak") - } ?: throw GenerellIkkeFunnetException() + inTransaction { sakService.finnSak(fnr.value, type) } ?: throw GenerellIkkeFunnetException() + call.respond(sak) } } @@ -272,6 +273,8 @@ internal fun Route.sakWebRoutes( post("/behandlingerforsak") { withFoedselsnummerInternal(tilgangService) { fnr -> + requestLogger.loggRequest(brukerTokenInfo, fnr, "behandlinger") + val sakMedBehandlinger = inTransaction { val saker = sakService.finnSaker(fnr.value) @@ -279,12 +282,6 @@ internal fun Route.sakWebRoutes( behandlingService.hentSakMedBehandlinger(saker) } - requestLogger.loggRequest( - brukerTokenInfo, - Folkeregisteridentifikator.of(sakMedBehandlinger.sak.ident), - "behandlinger", - ) - call.respond(sakMedBehandlinger) } } @@ -298,6 +295,8 @@ internal fun Route.sakWebRoutes( "Mangler påkrevd parameter {type} for å hente sak på bruker" }.let { enumValueOf(it) } + requestLogger.loggRequest(brukerTokenInfo, fnr, "personer/sak/type") + val sak = inTransaction { if (opprettHvisIkkeFinnes) { @@ -305,17 +304,17 @@ internal fun Route.sakWebRoutes( } else { sakService.finnSak(fnr.value, type) } - }.also { requestLogger.loggRequest(brukerTokenInfo, fnr, "personer/sak/type") } + } + call.respond(sak ?: HttpStatusCode.NoContent) } } post("/getsak/oms") { withFoedselsnummerInternal(tilgangService) { fnr -> - val saker = - inTransaction { sakService.finnSakerOmsOgHvisAvdoed(fnr.value) }.also { - requestLogger.loggRequest(brukerTokenInfo, fnr, "api/personer/getsak/oms") - } + requestLogger.loggRequest(brukerTokenInfo, fnr, "api/personer/getsak/oms") + + val saker = inTransaction { sakService.finnSakerOmsOgHvisAvdoed(fnr.value) } call.respond(saker) } diff --git a/apps/etterlatte-behandling/src/main/kotlin/sak/SakendringerDao.kt b/apps/etterlatte-behandling/src/main/kotlin/sak/SakendringerDao.kt index 639808b858b..c888e7155db 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/sak/SakendringerDao.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/sak/SakendringerDao.kt @@ -48,7 +48,7 @@ class SakendringerDao( block(connection) }.also { lagreEndringerPaaSak(null, it, kallendeMetode) } - internal fun lagreEndringerPaaSak( + private fun lagreEndringerPaaSak( sakFoer: Sak?, sakEtter: Sak, kallendeMetode: String, diff --git a/apps/etterlatte-hendelser-pdl/src/main/kotlin/hendelserpdl/PersonHendelseFordeler.kt b/apps/etterlatte-hendelser-pdl/src/main/kotlin/hendelserpdl/PersonHendelseFordeler.kt index 279f664e8be..28c5398d8a2 100644 --- a/apps/etterlatte-hendelser-pdl/src/main/kotlin/hendelserpdl/PersonHendelseFordeler.kt +++ b/apps/etterlatte-hendelser-pdl/src/main/kotlin/hendelserpdl/PersonHendelseFordeler.kt @@ -75,41 +75,17 @@ class PersonHendelseFordeler( is PdlIdentifikator.Npid -> loggIgnorererNpid(hendelse.hendelseId) is PdlIdentifikator.FolkeregisterIdent -> { + logger.info("Mottok en PDL hendelse (hendelseId=${hendelse.hendelseId}, type=${hendelse.opplysningstype})") + when (LeesahOpplysningstype.valueOf(hendelse.opplysningstype)) { - VERGEMAAL_ELLER_FREMTIDSFULLMAKT_V1 -> - haandterVergemaal(hendelse, ident).also { - logger.info("Mottok en PDL hendelse (hendelseId=${hendelse.hendelseId})") - } - ADRESSEBESKYTTELSE_V1 -> - haandterAdressebeskyttelse(hendelse, ident).also { - logger.info("Mottok en PDL hendelse (hendelseId=${hendelse.hendelseId})") - } - FORELDERBARNRELASJON_V1 -> - haandterForelderBarnRelasjon(hendelse, ident).also { - logger.info("Mottok en PDL hendelse (hendelseId=${hendelse.hendelseId})") - } - DOEDSFALL_V1 -> - haandterDoedsHendelse( - hendelse, - ident, - ).also { logger.info("Mottok en PDL hendelse (hendelseId=${hendelse.hendelseId})") } - UTFLYTTING_FRA_NORGE -> - haandterUtflyttingFraNorge(hendelse, ident).also { - logger.info("Mottok en PDL hendelse (hendelseId=${hendelse.hendelseId})") - } - SIVILSTAND_V1 -> - haandterSivilstand( - hendelse, - ident, - ).also { logger.info("Mottok en PDL hendelse (hendelseId=${hendelse.hendelseId})") } - BOSTEDSADRESSE_V1 -> - haandterBostedsadresse(hendelse, ident).also { - logger.info("Mottok en PDL hendelse (hendelseId=${hendelse.hendelseId})") - } - FOLKEREGISTERIDENTIFIKATOR_V1 -> - haandterFolkeregisteridentifikator(hendelse, ident).also { - logger.info("Mottok en PDL hendelse (hendelseId=${hendelse.hendelseId})") - } + VERGEMAAL_ELLER_FREMTIDSFULLMAKT_V1 -> haandterVergemaal(hendelse, ident) + ADRESSEBESKYTTELSE_V1 -> haandterAdressebeskyttelse(hendelse, ident) + FORELDERBARNRELASJON_V1 -> haandterForelderBarnRelasjon(hendelse, ident) + DOEDSFALL_V1 -> haandterDoedsHendelse(hendelse, ident) + UTFLYTTING_FRA_NORGE -> haandterUtflyttingFraNorge(hendelse, ident) + SIVILSTAND_V1 -> haandterSivilstand(hendelse, ident) + BOSTEDSADRESSE_V1 -> haandterBostedsadresse(hendelse, ident) + FOLKEREGISTERIDENTIFIKATOR_V1 -> haandterFolkeregisteridentifikator(hendelse, ident) } } } From 10bb03e9ef04df5fcb9e7db82419eadf89bb6f37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Oliver=20S=C3=B8berg?= <82504565+sebassonav@users.noreply.github.com> Date: Fri, 8 Nov 2024 16:48:51 +0100 Subject: [PATCH 18/85] Fiks at null returneres kontra tomme lister (#6272) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fiks at null returneres kontra tomme lister * Fiks tester * Bedre måte å sjekke om ting er tomt på * Denne testen burde aldri kjørt grønt før --- .../AktivitetspliktOppgaveService.kt | 2 +- .../aktivitetsplikt/AktivitetspliktRoute.kt | 2 +- .../aktivitetsplikt/AktivitetspliktService.kt | 17 ++++++----------- .../AktivitetspliktOppgaveServiceTest.kt | 18 +++++++++++++++--- 4 files changed, 23 insertions(+), 16 deletions(-) diff --git a/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveService.kt b/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveService.kt index 050c6f28250..695a1be05a2 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveService.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveService.kt @@ -54,7 +54,7 @@ class AktivitetspliktOppgaveService( val sak = sakService.finnSak(oppgave.sakId) ?: throw GenerellIkkeFunnetException() val vurderingerPaaOppgave = aktivitetspliktService.hentVurderingForOppgave(oppgaveId) val vurderinger = - if (vurderingerPaaOppgave == null && !oppgave.erAvsluttet()) { + if (vurderingerPaaOppgave.erTom() && !oppgave.erAvsluttet()) { // kopier de inn fra sak aktivitetspliktService.kopierInnTilOppgave(sak.id, oppgaveId) } else { diff --git a/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktRoute.kt b/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktRoute.kt index b0442bb7e03..97f8f8c5a00 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktRoute.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktRoute.kt @@ -315,7 +315,7 @@ internal fun Route.aktivitetspliktRoutes( brukerTokenInfo = brukerTokenInfo, ) } - call.respond(aktivitetsgrad ?: HttpStatusCode.NoContent) + call.respond(aktivitetsgrad) } } } diff --git a/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktService.kt b/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktService.kt index 057deaa95d1..4970cf90776 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktService.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktService.kt @@ -331,10 +331,7 @@ class AktivitetspliktService( ) } - return hentVurderingForOppgave(oppgaveId) ?: throw InternfeilException( - "Vi har ingen vurderinger men vi " + - "oppdaterte nettopp en vurdering i en oppgave. Gjelder oppgave med id=$oppgaveId i sak $sakId", - ) + return hentVurderingForOppgave(oppgaveId) } fun slettAktivitetsgradForOppgave( @@ -342,7 +339,7 @@ class AktivitetspliktService( aktivitetsgradId: UUID, sakId: SakId, brukerTokenInfo: BrukerTokenInfo, - ): AktivitetspliktVurdering? { + ): AktivitetspliktVurdering { val oppgave = oppgaveService.hentOppgave(oppgaveId) sjekkOppgaveTilhoererSakOgErRedigerbar(oppgave, sakId) @@ -404,14 +401,10 @@ class AktivitetspliktService( runBlocking { sendDtoTilStatistikk(sakId, brukerTokenInfo, behandlingId) } } - fun hentVurderingForOppgave(oppgaveId: UUID): AktivitetspliktVurdering? { + fun hentVurderingForOppgave(oppgaveId: UUID): AktivitetspliktVurdering { val aktivitetsgrad = aktivitetspliktAktivitetsgradDao.hentAktivitetsgradForOppgave(oppgaveId) val unntak = aktivitetspliktUnntakDao.hentUnntakForOppgave(oppgaveId) - if (aktivitetsgrad.isEmpty() && unntak.isEmpty()) { - return null - } - return AktivitetspliktVurdering(aktivitetsgrad, unntak) } @@ -741,7 +734,9 @@ data class AktivitetspliktVurderingGammel( data class AktivitetspliktVurdering( val aktivitet: List, val unntak: List, -) +) { + fun erTom() = aktivitet.isEmpty() && unntak.isEmpty() +} interface AktivitetspliktVurderingOpprettetDato { val opprettet: Grunnlagsopplysning.Kilde diff --git a/apps/etterlatte-behandling/src/test/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveServiceTest.kt b/apps/etterlatte-behandling/src/test/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveServiceTest.kt index 6a7da0865ee..80e09e2596b 100644 --- a/apps/etterlatte-behandling/src/test/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveServiceTest.kt +++ b/apps/etterlatte-behandling/src/test/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveServiceTest.kt @@ -76,7 +76,7 @@ class AktivitetspliktOppgaveServiceTest { ) every { oppgaveService.hentOppgave(oppgave.id) } returns oppgave - every { aktivitetspliktService.hentVurderingForOppgave(oppgave.id) } returns null + every { aktivitetspliktService.hentVurderingForOppgave(oppgave.id) } returns AktivitetspliktVurdering(emptyList(), emptyList()) every { aktivitetspliktService.kopierInnTilOppgave(sak.id, oppgave.id) } returns null every { aktivitetspliktBrevDao.hentBrevdata(oppgave.id) } returns null @@ -95,7 +95,7 @@ class AktivitetspliktOppgaveServiceTest { ).copy(status = Status.AVBRUTT) every { oppgaveService.hentOppgave(oppgave.id) } returns oppgave - every { aktivitetspliktService.hentVurderingForOppgave(oppgave.id) } returns null + every { aktivitetspliktService.hentVurderingForOppgave(oppgave.id) } returns AktivitetspliktVurdering(emptyList(), emptyList()) every { aktivitetspliktBrevDao.hentBrevdata(oppgave.id) } returns null service.hentVurderingForOppgave(oppgave.id) @@ -111,9 +111,21 @@ class AktivitetspliktOppgaveServiceTest { oppgaveType = OppgaveType.AKTIVITETSPLIKT_12MND, ) every { oppgaveService.hentOppgave(oppgave.id) } returns oppgave + + val grad = + aktivitetsgrad( + id = UUID.randomUUID(), + sakId = sak.id, + behandlingId = null, + oppgaveId = null, + aktivitetsgrad = AktivitetspliktAktivitetsgradType.AKTIVITET_UNDER_50, + fom = LocalDate.now(), + beskrivelse = "Beskrivelse", + ) + every { aktivitetspliktService.hentVurderingForOppgave(oppgave.id) } returns AktivitetspliktVurdering( - emptyList(), + listOf(grad), emptyList(), ) From fd28fee022689e62b1769b0ec07686d448300bb1 Mon Sep 17 00:00:00 2001 From: "Nicolas N." Date: Mon, 11 Nov 2024 09:36:06 +0100 Subject: [PATCH 19/85] Opprydding api utils (#6276) * litt opprydding i bruk av isSuccess, isFailure, osv. * bytte ut gamle mapApiResult med nye mapResult * legge tilbake tekst i feilmelding --- .../client/src/App.tsx | 23 ++--- .../src/components/behandling/Behandling.tsx | 16 ++-- .../behandling/brev/ForhaandsvisningBrev.tsx | 13 ++- .../revurderingsoversikt/RevurderingAnnen.tsx | 11 +-- .../SluttbehandlingUtland.tsx | 93 +++++++++---------- .../bosattUtland/SkalViseBosattUtland.tsx | 26 +++--- .../familieforhold/RedigerFamilieforhold.tsx | 11 ++- .../gyldigFramsattSoeknad/Verger.tsx | 13 ++- .../generellbehandling/Attesteringmodal.tsx | 16 ++-- .../generellbehandling/GenerellBehandling.tsx | 24 ++--- .../KravpakkeUtlandBehandling.tsx | 50 +++++----- .../SendtilAttesteringModal.tsx | 21 +++-- .../generellbehandling/UnderkjenneModal.tsx | 16 ++-- .../generelloppgave/GenerellOppgave.tsx | 19 ++-- .../manuelbehandling/ManuellBehandling.tsx | 35 +++---- .../components/person/aktivitet/Aktivitet.tsx | 16 ++-- .../person/brev/NyttBrevHandlingerPanel.tsx | 50 ++++------ .../dokumenter/avvik/KnyttTilAnnenBruker.tsx | 11 ++- .../dokumenter/avvik/KnyttTilAnnenSak.tsx | 4 +- .../client/src/shared/api/apiUtils.ts | 17 ---- 20 files changed, 206 insertions(+), 279 deletions(-) diff --git a/apps/etterlatte-saksbehandling-ui/client/src/App.tsx b/apps/etterlatte-saksbehandling-ui/client/src/App.tsx index 17888c41d02..4e5262d0509 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/App.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/App.tsx @@ -6,7 +6,7 @@ import { Person } from '~components/person/Person' import useHentInnloggetSaksbehandler from 'src/shared/hooks/useSettInnloggetSaksbehandler' import { nb } from 'date-fns/locale' import { registerLocale } from 'react-datepicker' -import ErrorBoundary from '~ErrorBoundary' +import ErrorBoundary, { ApiErrorAlert } from '~ErrorBoundary' import NyttBrev from '~components/person/brev/NyttBrev' import ScrollToTop from '~ScrollTop' import { useApiCall } from '~shared/hooks/useApiCall' @@ -21,8 +21,7 @@ import { Tilbakekrevingsbehandling } from '~components/tilbakekreving/Tilbakekre import GenerellBehandling from '~components/generellbehandling/GenerellBehandling' import ManuellBehandling from '~components/manuelbehandling/ManuellBehandling' import BehandleJournalfoeringOppgave from '~components/person/journalfoeringsoppgave/BehandleJournalfoeringOppgave' -import { isSuccess } from '~shared/api/apiUtils' -import { isFailureHandler } from '~shared/api/IsFailureHandler' +import { mapResult } from '~shared/api/apiUtils' import { setDefaultOptions } from 'date-fns' import GenerellOppgave from '~components/generelloppgave/GenerellOppgave' import { VurderAktivitetspliktOppgave } from '~components/aktivitetsplikt/VurderAktivitetspliktOppgave' @@ -43,14 +42,15 @@ function App() { }) }, []) - return ( - <> - {isSuccess(hentConfigStatus) && innloggetbrukerHentet && ( + return mapResult(hentConfigStatus, { + error: () => Kunne ikke hente konfigurasjonsverdier, + success: (config) => + innloggetbrukerHentet && (
- + @@ -71,13 +71,8 @@ function App() {
- )} - {isFailureHandler({ - apiResult: hentConfigStatus, - errorMessage: 'Kunne ikke hente konfigurasjonsverdier', - })} - - ) + ), + }) } export default App diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/behandling/Behandling.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/behandling/Behandling.tsx index 9328fa2f599..7cefbbc69c6 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/behandling/Behandling.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/behandling/Behandling.tsx @@ -14,7 +14,7 @@ import { BehandlingSidemeny } from '~components/behandling/sidemeny/BehandlingSi import Spinner from '~shared/Spinner' import { hentPersonopplysningerForBehandling } from '~shared/api/grunnlag' import { resetPersonopplysninger, setPersonopplysninger } from '~store/reducers/PersonopplysningerReducer' -import { mapAllApiResult } from '~shared/api/apiUtils' +import { mapResult } from '~shared/api/apiUtils' import { useSidetittel } from '~shared/hooks/useSidetittel' import { StickyToppMeny } from '~shared/StickyToppMeny' import { usePersonopplysninger } from '~components/person/usePersonopplysninger' @@ -56,12 +56,10 @@ export const Behandling = () => { } }, [behandlingFraRedux]) - return mapAllApiResult( - fetchBehandlingStatus, - , - null, - () => Kunne ikke hente behandling, - () => { + return mapResult(fetchBehandlingStatus, { + pending: , + error: (error) => Kunne ikke hente behandling: {error.detail}, + success: () => { if (behandlingFraRedux) { const behandling = behandlingFraRedux as IBehandlingReducer return ( @@ -85,6 +83,6 @@ export const Behandling = () => { ) } return null - } - ) + }, + }) } diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/behandling/brev/ForhaandsvisningBrev.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/behandling/brev/ForhaandsvisningBrev.tsx index 2364aaaa490..a8313d341bb 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/behandling/brev/ForhaandsvisningBrev.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/behandling/brev/ForhaandsvisningBrev.tsx @@ -5,8 +5,8 @@ import Spinner from '~shared/Spinner' import styled from 'styled-components' import { genererPdf } from '~shared/api/brev' -import { isPendingOrInitial, isSuccess } from '~shared/api/apiUtils' -import { isFailureHandler } from '~shared/api/IsFailureHandler' +import { mapResult } from '~shared/api/apiUtils' +import { ApiErrorAlert } from '~ErrorBoundary' export default function ForhaandsvisningBrev({ brev }: { brev: IBrev }) { const [fileURL, setFileURL] = useState() @@ -32,11 +32,10 @@ export default function ForhaandsvisningBrev({ brev }: { brev: IBrev }) { return ( - {isPendingOrInitial(pdf) && } - {isSuccess(pdf) && !!fileURL && } - {isFailureHandler({ - apiResult: pdf, - errorMessage: 'En feil har oppstått ved henting av PDF', + {mapResult(pdf, { + pending: , + error: (error) => En feil har oppstått ved henting av PDF: {error.detail}, + success: () => !!fileURL && , })} ) diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/behandling/revurderingsoversikt/RevurderingAnnen.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/behandling/revurderingsoversikt/RevurderingAnnen.tsx index 5642cca4982..cc0c5ef62a7 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/behandling/revurderingsoversikt/RevurderingAnnen.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/behandling/revurderingsoversikt/RevurderingAnnen.tsx @@ -13,11 +13,11 @@ import { lagreRevurderingInfo } from '~shared/api/revurdering' import { oppdaterRevurderingInfo } from '~store/reducers/BehandlingReducer' import styled from 'styled-components' -import { isPending, isSuccess } from '~shared/api/apiUtils' -import { isFailureHandler } from '~shared/api/IsFailureHandler' +import { isPending, mapResult } from '~shared/api/apiUtils' import { useAppDispatch } from '~store/Store' import { Toast } from '~shared/alerts/Toast' import { useInnloggetSaksbehandler } from '../useInnloggetSaksbehandler' +import { ApiErrorAlert } from '~ErrorBoundary' export const RevurderingAnnen = (props: { type: 'ANNEN' | 'ANNEN_UTEN_BREV'; behandling: IDetaljertBehandling }) => { const { type, behandling } = props @@ -105,10 +105,9 @@ export const RevurderingAnnen = (props: { type: 'ANNEN' | 'ANNEN_UTEN_BREV'; beh - {isSuccess(lagrestatus) && } - {isFailureHandler({ - apiResult: lagrestatus, - errorMessage: 'Kunne ikke lagre', + {mapResult(lagrestatus, { + success: () => , + error: (error) => Kunne ikke lagre: {error.detail}, })} ) : ( diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/behandling/revurderingsoversikt/sluttbehandlingUtland/SluttbehandlingUtland.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/behandling/revurderingsoversikt/sluttbehandlingUtland/SluttbehandlingUtland.tsx index 3bc8cd38abb..b34a1bc8dba 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/behandling/revurderingsoversikt/sluttbehandlingUtland/SluttbehandlingUtland.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/behandling/revurderingsoversikt/sluttbehandlingUtland/SluttbehandlingUtland.tsx @@ -17,7 +17,7 @@ import { Revurderingaarsak } from '~shared/types/Revurderingaarsak' import HistoriskeSEDer from '~components/behandling/revurderingsoversikt/sluttbehandlingUtland/historikk/HistoriskeSEDer' import { formaterDato } from '~utils/formatering/dato' -import { isPending, mapAllApiResult, mapResult } from '~shared/api/apiUtils' +import { isPending, mapResult } from '~shared/api/apiUtils' import { isFailureHandler } from '~shared/api/IsFailureHandler' import { hentAlleLand } from '~shared/api/behandling' import { ILand, sorterLand } from '~utils/kodeverk' @@ -108,45 +108,36 @@ export default function SluttbehandlingUtland({ gjøres en vurdering av rettigheter og trygdeavtale etter man har mottatt nødvendig dokumentasjon fra utenlandske trygdemyndigheter - <> - - Informasjon fra utsendelse av kravpakke - - {mapAllApiResult( - kravpakkeStatus, - , - null, - () => ( - Klarte ikke å hente kravpakke for sluttbehandling - ), - (kravpakkeMedAvdoed) => { - return ( - <> - {kravpakkeMedAvdoed.kravpakke.innhold ? ( - - - - - - - - ) : ( - - Fant ingen kravpakke for saken, kontroller at kravpakke ble opprettet. Finn sakens - førstegangsbehandling og kontroller at den har huket av {`"skal sende kravpakke"`} - - )} - - ) - } - )} - + + + Informasjon fra utsendelse av kravpakke + + + {mapResult(kravpakkeStatus, { + pending: , + error: (error) => ( + Klarte ikke å hente kravpakke for sluttbehandling: {error.detail} + ), + success: ({ avdoed, kravpakke }) => ( + <> + {kravpakke.innhold ? ( + + + + + + + + ) : ( + + Fant ingen kravpakke for saken, kontroller at kravpakke ble opprettet. Finn sakens førstegangsbehandling + og kontroller at den har huket av {`"skal sende kravpakke"`} + + )} + + ), + })} + {!!feilkoder?.size ? (
) } diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/behandling/soeknadsoversikt/bosattUtland/SkalViseBosattUtland.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/behandling/soeknadsoversikt/bosattUtland/SkalViseBosattUtland.tsx index 4fd255945b7..4cbf0844723 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/behandling/soeknadsoversikt/bosattUtland/SkalViseBosattUtland.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/behandling/soeknadsoversikt/bosattUtland/SkalViseBosattUtland.tsx @@ -5,8 +5,7 @@ import { hentBosattutland } from '~shared/api/bosattutland' import React, { useEffect } from 'react' import Spinner from '~shared/Spinner' import { Alert, Heading } from '@navikt/ds-react' - -import { isFailureWithCode, isFailure, isPending, isSuccess } from '~shared/api/apiUtils' +import { mapResult } from '~shared/api/apiUtils' import { EessiPensjonLenke } from '~components/behandling/soeknadsoversikt/bosattUtland/EessiPensjonLenke' export const SkalViseBosattUtland = (props: { behandling: IDetaljertBehandling; redigerbar: boolean }) => { @@ -34,17 +33,18 @@ const HentBosattutland = ({ behandling, redigerbar }: { behandling: IDetaljertBe - - - {isFailureWithCode(hentBosattUtlandStatus, 404) && ( - - )} - {isSuccess(hentBosattUtlandStatus) && ( - - )} - {isFailure(hentBosattUtlandStatus) && !isFailureWithCode(hentBosattUtlandStatus, 404) && ( - Vi klarte ikke å hente lagret data for bosatt utland - )} + {mapResult(hentBosattUtlandStatus, { + pending: , + error: (error) => + error.status === 404 ? ( + + ) : ( + Vi klarte ikke å hente lagret data for bosatt utland + ), + success: (bosattutland) => ( + + ), + })} ) } diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/behandling/soeknadsoversikt/familieforhold/RedigerFamilieforhold.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/behandling/soeknadsoversikt/familieforhold/RedigerFamilieforhold.tsx index 4dbb81cae9e..49306f80470 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/behandling/soeknadsoversikt/familieforhold/RedigerFamilieforhold.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/behandling/soeknadsoversikt/familieforhold/RedigerFamilieforhold.tsx @@ -4,13 +4,14 @@ import React, { useState } from 'react' import { PencilIcon, PlusIcon, XMarkIcon } from '@navikt/aksel-icons' import { useApiCall } from '~shared/hooks/useApiCall' import { redigerFamilieforhold } from '~shared/api/behandling' -import { isPending, isSuccess, mapFailure } from '~shared/api/apiUtils' +import { isPending, mapResult } from '~shared/api/apiUtils' import { Personopplysninger } from '~shared/types/grunnlag' import { IDetaljertBehandling } from '~shared/types/IDetaljertBehandling' import { useFieldArray, useForm } from 'react-hook-form' import { fnrErGyldig } from '~utils/fnr' import { FormWrapper } from '~components/person/journalfoeringsoppgave/BehandleJournalfoeringOppgave' import { SakType } from '~shared/types/sak' +import { ApiErrorAlert } from '~ErrorBoundary' type Props = { behandling: IDetaljertBehandling @@ -149,10 +150,10 @@ export const RedigerFamilieforhold = ({ behandling, personopplysninger }: Props)
- {isSuccess(status) && Lagret redigert familieforhold} - {mapFailure(status, (error) => ( - {error.detail} - ))} + {mapResult(status, { + error: (error) => {error.detail}, + success: () => Lagret redigert familieforhold, + })} diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/behandling/soeknadsoversikt/gyldigFramsattSoeknad/Verger.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/behandling/soeknadsoversikt/gyldigFramsattSoeknad/Verger.tsx index d03293b8ba6..5db6894a1a8 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/behandling/soeknadsoversikt/gyldigFramsattSoeknad/Verger.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/behandling/soeknadsoversikt/gyldigFramsattSoeknad/Verger.tsx @@ -6,10 +6,10 @@ import { IPdlPerson } from '~shared/types/Person' import { Grunnlagsopplysning } from '~shared/types/grunnlag' import { useEffect } from 'react' import { formaterKildePdl } from '~components/behandling/soeknadsoversikt/utils' -import { isSuccess } from '~shared/api/apiUtils' -import { isFailureHandler } from '~shared/api/IsFailureHandler' +import { mapResult } from '~shared/api/apiUtils' import { KopierbarVerdi } from '~shared/statusbar/KopierbarVerdi' import { VStack } from '@navikt/ds-react' +import { ApiErrorAlert } from '~ErrorBoundary' interface Props { behandlingId: string @@ -28,7 +28,7 @@ export const Verger = ({ sakId, behandlingId }: Props) => { function successContents(soekerOpplysning: Grunnlagsopplysning) { const vergeList = soekerOpplysning.opplysning.vergemaalEllerFremtidsfullmakt || [] - if (vergeList?.length == 0) { + if (!vergeList?.length) { return ( ) @@ -68,10 +68,9 @@ export const Verger = ({ sakId, behandlingId }: Props) => { return ( - {isSuccess(soeker) && successContents(soeker.data)} - {isFailureHandler({ - apiResult: soeker, - errorMessage: 'Kunne ikke hente info om verger', + {mapResult(soeker, { + error: (error) => Kunne ikke hente info om verge(r): {error.detail}, + success: (data) => successContents(data), })} ) diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/generellbehandling/Attesteringmodal.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/generellbehandling/Attesteringmodal.tsx index 73017e51023..1539efff8b4 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/generellbehandling/Attesteringmodal.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/generellbehandling/Attesteringmodal.tsx @@ -5,8 +5,8 @@ import { hentSakOgNavigerTilSaksoversikt } from '~components/generellbehandling/ import { useNavigate } from 'react-router-dom' import { Generellbehandling, KravpakkeUtland } from '~shared/types/Generellbehandling' -import { isPending, isSuccess } from '~shared/api/apiUtils' -import { isFailureHandler } from '~shared/api/IsFailureHandler' +import { isPending, mapResult } from '~shared/api/apiUtils' +import { ApiErrorAlert } from '~ErrorBoundary' export const Attesteringmodal = (props: { utlandsBehandling: Generellbehandling & { innhold: KravpakkeUtland | null } @@ -27,12 +27,12 @@ export const Attesteringmodal = (props: { - {isSuccess(attesterStatus) && ( - Behandlingen ble attestert, du blir straks sendt til saksoversikten - )} - {isFailureHandler({ - apiResult: attesterStatus, - errorMessage: 'Behandlingen ble ikke attestert', + + {mapResult(attesterStatus, { + error: (error) => Behandlingen ble ikke attestert: {error.detail}, + success: () => ( + Behandlingen ble attestert, du blir straks sendt til saksoversikten + ), })} ) diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/generellbehandling/GenerellBehandling.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/generellbehandling/GenerellBehandling.tsx index af0f9a3e2a7..a47cd298d7a 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/generellbehandling/GenerellBehandling.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/generellbehandling/GenerellBehandling.tsx @@ -5,13 +5,11 @@ import { hentGenerellBehandling } from '~shared/api/generellbehandling' import { ApiErrorAlert } from '~ErrorBoundary' import Spinner from '~shared/Spinner' import KravpakkeUtlandBehandling from '~components/generellbehandling/KravpakkeUtlandBehandling' -import { KravpakkeUtland } from '~shared/types/Generellbehandling' +import { Generellbehandling, KravpakkeUtland } from '~shared/types/Generellbehandling' import { Alert } from '@navikt/ds-react' -import { Generellbehandling } from '~shared/types/Generellbehandling' import { StatusBar } from '~shared/statusbar/Statusbar' import { hentSak } from '~shared/api/sak' -import { isSuccess, mapApiResult } from '~shared/api/apiUtils' -import { isFailureHandler } from '~shared/api/IsFailureHandler' +import { mapApiResult, mapResult } from '~shared/api/apiUtils' import { useSidetittel } from '~shared/hooks/useSidetittel' const GenerellBehandling = () => { @@ -24,15 +22,11 @@ const GenerellBehandling = () => { const [hentSakStatus, hentSakApi] = useApiCall(hentSak) useEffect(() => { - fetchGenerellbehandling(generellbehandlingId) + fetchGenerellbehandling(generellbehandlingId, (generellBehandling) => { + hentSakApi(generellBehandling.sakId) + }) }, [generellbehandlingId]) - useEffect(() => { - if (isSuccess(fetchGenerellbehandlingStatus)) { - hentSakApi(fetchGenerellbehandlingStatus.data.sakId) - } - }, [fetchGenerellbehandlingStatus]) - return mapApiResult( fetchGenerellbehandlingStatus, , @@ -42,11 +36,11 @@ const GenerellBehandling = () => { case 'KRAVPAKKE_UTLAND': return ( <> - {isFailureHandler({ - apiResult: hentSakStatus, - errorMessage: 'Vi klarte ikke å hente sak og derfor vil navn baren være borte', + {mapResult(hentSakStatus, { + error: (error) => Feil ved henting av saksinformasjon: {error.detail}, + success: (sak) => , })} - {isSuccess(hentSakStatus) && } + diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/generellbehandling/KravpakkeUtlandBehandling.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/generellbehandling/KravpakkeUtlandBehandling.tsx index 66064394776..de28aa99233 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/generellbehandling/KravpakkeUtlandBehandling.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/generellbehandling/KravpakkeUtlandBehandling.tsx @@ -33,16 +33,14 @@ import { ABlue500 } from '@navikt/ds-tokens/dist/tokens' import { ConfigContext } from '~clientConfig' import { DatoVelger } from '~shared/components/datoVelger/DatoVelger' import { getGrunnlagsAvOpplysningstype } from '~shared/api/grunnlag' -import { Grunnlagsopplysning } from '~shared/types/grunnlag' -import { formaterNavn, IPdlPerson } from '~shared/types/Person' -import { KildePdl } from '~shared/types/kilde' +import { formaterNavn } from '~shared/types/Person' import { Info } from '~components/behandling/soeknadsoversikt/Info' import { hentSak } from '~shared/api/sak' import { SendtilAttesteringModal } from '~components/generellbehandling/SendtilAttesteringModal' import { NavigateFunction } from 'react-router/dist/lib/hooks' import { GenerellbehandlingSidemeny } from '~components/generellbehandling/GenerellbehandlingSidemeny' -import { isPending, isPendingOrInitial, isSuccess, mapApiResult } from '~shared/api/apiUtils' +import { isPending, isPendingOrInitial, isSuccess, mapApiResult, mapResult } from '~shared/api/apiUtils' import { isFailureHandler } from '~shared/api/IsFailureHandler' import { formatDateToLocaleDateOrEmptyString } from '~shared/components/datoVelger/datoVelgerUtils' import { enhetErSkrivbar } from '~components/behandling/felles/utils' @@ -85,7 +83,6 @@ const KravpakkeUtlandBehandling = (props: { const [oppdaterGenerellBehandlingStatus, oppdaterGenerellBehandlingApi] = useApiCall(oppdaterGenerellBehandling) const [avbrytbehandlingStatus, avbrytBehandlingApi] = useApiCall(avbrytGenerellBehandling) const [avdoedeStatus, avdoedeFetch] = useApiCall(getGrunnlagsAvOpplysningstype) - const [avdoed, setAvdoed] = useState | null>(null) const innloggetSaksbehandler = useInnloggetSaksbehandler() const [hentAlleLandRequest, fetchAlleLand] = useApiCall(hentAlleLand) @@ -120,14 +117,11 @@ const KravpakkeUtlandBehandling = (props: { useEffect(() => { if (utlandsBehandling.tilknyttetBehandling) { - avdoedeFetch( - { - sakId: utlandsBehandling.sakId, - behandlingId: utlandsBehandling.tilknyttetBehandling, - opplysningstype: 'AVDOED_PDL_V1', - }, - (avdoed) => setAvdoed(avdoed) - ) + avdoedeFetch({ + sakId: utlandsBehandling.sakId, + behandlingId: utlandsBehandling.tilknyttetBehandling, + opplysningstype: 'AVDOED_PDL_V1', + }) } fetchAlleLand(null, (landliste) => { @@ -184,21 +178,21 @@ const KravpakkeUtlandBehandling = (props: {
{utlandsBehandling.tilknyttetBehandling ? (
- {isSuccess(avdoedeStatus) && avdoed && ( - <> -

Informasjon om avdøde

- - - - - - )} - {isFailureHandler({ - apiResult: avdoedeStatus, - errorMessage: 'Klarte ikke å hente informasjon om avdøed', + {mapResult(avdoedeStatus, { + pending: , + error: (error) => ( + Klarte ikke å hente informasjon om avdød: {error.detail} + ), + success: (avdoed) => ( + <> +

Informasjon om avdøde

+ + + + + + ), })} - -
) : ( @@ -262,7 +256,7 @@ const KravpakkeUtlandBehandling = (props: { Valgte land ) : null} - {isSuccess(hentAlleLandRequest) && valgteLandIsoKode && ( + {valgteLandIsoKode && ( {valgteLandIsoKode.map((landIsoKode) => { const kodeverkLandMatch = alleLandKodeverk?.find( diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/generellbehandling/SendtilAttesteringModal.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/generellbehandling/SendtilAttesteringModal.tsx index 18ff111a2e6..74156d7265d 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/generellbehandling/SendtilAttesteringModal.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/generellbehandling/SendtilAttesteringModal.tsx @@ -6,8 +6,8 @@ import { useApiCall } from '~shared/hooks/useApiCall' import { sendTilAttesteringGenerellBehandling } from '~shared/api/generellbehandling' import { hentSakOgNavigerTilSaksoversikt } from '~components/generellbehandling/KravpakkeUtlandBehandling' -import { isSuccess } from '~shared/api/apiUtils' -import { isFailureHandler } from '~shared/api/IsFailureHandler' +import { isSuccess, mapResult } from '~shared/api/apiUtils' +import { ApiErrorAlert } from '~ErrorBoundary' export const SendtilAttesteringModal = ({ utlandsBehandling, @@ -42,14 +42,15 @@ export const SendtilAttesteringModal = ({ - {isSuccess(sendTilAttesteringStatus) && ( - - Behandlingen ble sendt til attestering, du blir straks sendt til saksoversikten - - )} - {isFailureHandler({ - apiResult: sendTilAttesteringStatus, - errorMessage: 'Klarte ikke å sende til attestering kravpakke utland. Prøv igjen senere.', + {mapResult(sendTilAttesteringStatus, { + error: (error) => ( + Klarte ikke å sende til attestering kravpakke utland: {error.detail} + ), + success: () => ( + + Behandlingen ble sendt til attestering, du blir straks sendt til saksoversikten + + ), })} diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/generellbehandling/UnderkjenneModal.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/generellbehandling/UnderkjenneModal.tsx index 8f8f592f6c7..3d599852653 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/generellbehandling/UnderkjenneModal.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/generellbehandling/UnderkjenneModal.tsx @@ -6,8 +6,8 @@ import { Generellbehandling, KravpakkeUtland } from '~shared/types/Generellbehan import { useNavigate } from 'react-router-dom' import { hentSakOgNavigerTilSaksoversikt } from '~components/generellbehandling/KravpakkeUtlandBehandling' -import { isSuccess } from '~shared/api/apiUtils' -import { isFailureHandler } from '~shared/api/IsFailureHandler' +import { isSuccess, mapResult } from '~shared/api/apiUtils' +import { ApiErrorAlert } from '~ErrorBoundary' export const UnderkjenneModal = ({ utlandsBehandling, @@ -54,12 +54,12 @@ export const UnderkjenneModal = ({ > Bekreft og send i retur - {isSuccess(underkjennStatus) && ( - Behandlingen ble underkjent, du blir straks sendt til saksoversikten - )} - {isFailureHandler({ - apiResult: underkjennStatus, - errorMessage: 'Behandlingen ble ikke underkjent', + + {mapResult(underkjennStatus, { + error: (error) => Feil oppsto ved underkjenning: {error.detail}, + success: () => ( + Behandlingen ble underkjent, du blir straks sendt til saksoversikten + ), })} ) diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/generelloppgave/GenerellOppgave.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/generelloppgave/GenerellOppgave.tsx index f674fcb2dd0..db805ed2bc2 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/generelloppgave/GenerellOppgave.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/generelloppgave/GenerellOppgave.tsx @@ -5,9 +5,10 @@ import { useForm } from 'react-hook-form' import { useSidetittel } from '~shared/hooks/useSidetittel' import { opprettGenerellOppgave } from '~shared/api/oppgaver' import { GenerellOppgaveDto, OppgaveKilde, Oppgavetype } from '~shared/types/oppgave' -import { mapAllApiResult } from '~shared/api/apiUtils' import { ApiErrorAlert } from '~ErrorBoundary' import { useFeatureEnabledMedDefault } from '~shared/hooks/useFeatureToggle' +import { mapResult } from '~shared/api/apiUtils' +import Spinner from '~shared/Spinner' interface GenerellOppgaveForm extends Omit { sakIds: string @@ -81,17 +82,11 @@ export default function GenerellOppgave() { Opprett - {mapAllApiResult( - opprettGenerellOppgaveResult, - Oppretter Generelle oppgaver., - null, - (error) => ( - {error.detail} - ), - () => ( - Generelle oppgaver er opprettet! - ) - )} + {mapResult(opprettGenerellOppgaveResult, { + pending: , + error: (error) => {error.detail}, + success: () => Generelle oppgaver er opprettet!, + })} )} diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/manuelbehandling/ManuellBehandling.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/manuelbehandling/ManuellBehandling.tsx index 08c6057159b..2dbb34f9752 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/manuelbehandling/ManuellBehandling.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/manuelbehandling/ManuellBehandling.tsx @@ -10,9 +10,8 @@ import { } from '~components/person/journalfoeringsoppgave/nybehandling/OpprettNyBehandling' import { Spraak } from '~shared/types/Brev' import { opprettTrygdetidOverstyrtMigrering } from '~shared/api/trygdetid' -import { isPending, isSuccess, mapAllApiResult } from '~shared/api/apiUtils' +import { isPending, isSuccess, mapResult } from '~shared/api/apiUtils' import { ApiErrorAlert } from '~ErrorBoundary' -import { isFailureHandler } from '~shared/api/IsFailureHandler' import { useParams } from 'react-router-dom' import { hentOppgave } from '~shared/api/oppgaver' import PersongalleriBarnepensjon from '~components/person/journalfoeringsoppgave/nybehandling/PersongalleriBarnepensjon' @@ -25,6 +24,7 @@ import GjenopprettingModal from '~components/manuelbehandling/GjenopprettingModa import { useSidetittel } from '~shared/hooks/useSidetittel' import { Oppgavestatus, Oppgavetype } from '~shared/types/oppgave' import { OverstyrtBeregningKategori } from '~shared/types/OverstyrtBeregning' +import Spinner from '~shared/Spinner' interface ManuellBehandingSkjema extends NyBehandlingSkjema { kilde: string @@ -40,7 +40,6 @@ export default function ManuellBehandling() { useSidetittel('Manuell behandling') const [opprettBehandlingStatus, opprettNyBehandling] = useApiCall(opprettBehandling) - const [nyBehandlingId, setNyId] = useState('') const [overstyrTrygdetidStatus, opprettOverstyrtTrygdetidReq] = useApiCall(opprettTrygdetidOverstyrtMigrering) const [hentOppgaveStatus, apiHentOppgave] = useApiCall(hentOppgave) @@ -94,7 +93,6 @@ export default function ManuellBehandling() { if (data.overstyrTrygdetid) { opprettOverstyrtTrygdetidReq({ behandlingId: nyBehandlingRespons }) } - setNyId(nyBehandlingRespons) } ) } @@ -200,25 +198,20 @@ export default function ManuellBehandling() { )} - {isSuccess(opprettBehandlingStatus) && ( - Behandling med id {nyBehandlingId} ble opprettet! - )} - {isFailureHandler({ - apiResult: opprettBehandlingStatus, - errorMessage: 'Det oppsto en feil ved oppretting av behandlingen.', + {mapResult(opprettBehandlingStatus, { + error: (error) => ( + Det oppsto en feil ved oppretting av behandlingen: {error.detail} + ), + success: (nyBehandlingId) => ( + Behandling med id {nyBehandlingId} ble opprettet! + ), })} - {mapAllApiResult( - overstyrTrygdetidStatus, - Oppretter overstyrt trygdetid., - null, - () => ( - Klarte ikke å overstyre trygdetid. - ), - () => ( - Overstyrt trygdetid opprettet! - ) - )} + {mapResult(overstyrTrygdetidStatus, { + pending: , + error: () => Klarte ikke å overstyre trygdetid., + success: () => Overstyrt trygdetid opprettet!, + })} ) diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/person/aktivitet/Aktivitet.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/person/aktivitet/Aktivitet.tsx index 7fee8ba1c3a..c8d36776f90 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/person/aktivitet/Aktivitet.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/person/aktivitet/Aktivitet.tsx @@ -1,4 +1,4 @@ -import { isSuccess, mapResult, Result } from '~shared/api/apiUtils' +import { isSuccess, mapResult, mapSuccess, Result } from '~shared/api/apiUtils' import { SakMedBehandlinger } from '~components/person/typer' import React, { ReactNode, useEffect } from 'react' import { BodyShort, Box, Heading, Label, VStack } from '@navikt/ds-react' @@ -55,20 +55,16 @@ export const Aktivitet = ({ fnr, sakResult }: { fnr: string; sakResult: ResultGjenlevende sin tidslinje - {isSuccess(sakResult) && + {mapSuccess(sakResult, (data) => mapResult(familieOpplysningerResult, { pending: , error: (error) => ( {error.detail || 'Kunne ikke hente opplysninger om avdød'} ), - success: ({ avdoede }) => ( - <> - {avdoede && ( - - )} - - ), - })} + success: ({ avdoede }) => + avdoede && , + }) + )}
diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/person/brev/NyttBrevHandlingerPanel.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/person/brev/NyttBrevHandlingerPanel.tsx index 1e5a048a0aa..f23283d9f1b 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/person/brev/NyttBrevHandlingerPanel.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/person/brev/NyttBrevHandlingerPanel.tsx @@ -5,7 +5,7 @@ import { useState } from 'react' import { distribuerBrev, ferdigstillBrev, journalfoerBrev } from '~shared/api/brev' import Spinner from '~shared/Spinner' -import { isPending, mapAllApiResult } from '~shared/api/apiUtils' +import { isPending, mapResult } from '~shared/api/apiUtils' interface Props { brev: IBrev @@ -81,41 +81,23 @@ export default function NyttBrevHandlingerPanel({ brev, setKanRedigeres, callbac width="medium" aria-label="Ferdigstilling av brev" > - {mapAllApiResult( - ferdigstillStatus, - , - null, - (error) => ( - {error.detail} - ), - () => ( - Ferdigstilt ok! - ) - )} + {mapResult(ferdigstillStatus, { + pending: , + error: (error) => {error.detail}, + success: () => Ferdigstilt ok!, + })} - {mapAllApiResult( - journalfoerStatus, - , - null, - (error) => ( - {error.detail} - ), - () => ( - Journalført ok! - ) - )} + {mapResult(journalfoerStatus, { + pending: , + error: (error) => {error.detail}, + success: () => Journalført ok!, + })} - {mapAllApiResult( - distribuerStatus, - , - null, - (error) => ( - {error.detail} - ), - () => ( - Brev sendt til distribusjon. Laster inn brev på nytt... - ) - )} + {mapResult(distribuerStatus, { + pending: , + error: (error) => {error.detail}, + success: () => Brev sendt til distribusjon. Laster inn brev på nytt..., + })} setIsOpen(false)} aria-labelledby="modal-heading"> diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/person/dokumenter/avvik/KnyttTilAnnenBruker.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/person/dokumenter/avvik/KnyttTilAnnenBruker.tsx index aaf1a3dc89e..d8b01bd56c6 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/person/dokumenter/avvik/KnyttTilAnnenBruker.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/person/dokumenter/avvik/KnyttTilAnnenBruker.tsx @@ -1,5 +1,5 @@ import React, { useState } from 'react' -import { Alert, Button, HStack, TextField } from '@navikt/ds-react' +import { Alert, Button, HStack, TextField, VStack } from '@navikt/ds-react' import { isPending, isSuccess, mapResult, mapSuccess, Result } from '~shared/api/apiUtils' import { BrukerIdType, Journalpost, Sakstype } from '~shared/types/Journalpost' import { ISak } from '~shared/types/sak' @@ -110,9 +110,10 @@ export const KnyttTilAnnenBruker = ({ ), pending: , success: (annenSak) => ( - <> - {isSuccess(sakStatus) && } -
+ + {mapSuccess(sakStatus, (data) => ( + + ))} - + ), error: (error) => error.status === 404 ? ( diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/person/dokumenter/avvik/KnyttTilAnnenSak.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/person/dokumenter/avvik/KnyttTilAnnenSak.tsx index 72beadd0a9a..f1935af8eb7 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/person/dokumenter/avvik/KnyttTilAnnenSak.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/person/dokumenter/avvik/KnyttTilAnnenSak.tsx @@ -190,7 +190,9 @@ export const KnyttTilAnnenSak = ({ pending: , success: (annenSak) => ( <> - {isSuccess(sakStatus) && } + {mapSuccess(sakStatus, (data) => ( + + ))}
): result is Initial | isPending(result) || isInitial(result) export const isSuccessOrInitial = (result: Result): result is Initial | Success => isSuccess(result) || isInitial(result) -export const isFailureWithCode = (result: Result, code: number): result is Error => - result.status === 'error' && result.error.status === code export type Mappers = { success?: (_: T) => R @@ -64,21 +62,6 @@ export const mapApiResult = ( }) } -export const mapAllApiResult = ( - result: Result, - mapPending: ReactElement, - mapInitial: ReactElement | null, - mapError: (_: ApiError) => ReactElement, - mapSuccess: (_: T) => ReactElement | null -): ReactElement | null => { - return mapResult(result, { - pending: mapPending, - initial: mapInitial, - error: (error) => (error.status === 502 ? null : mapError(error)), - success: mapSuccess, - }) -} - export const mapSuccess = (result: Result, mapSuccess: (success: T) => R): R | null => mapResult(result, { success: mapSuccess }) From 36fd11135f36441227b80f922ff29649aef5121f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20Stette=20Haarberg?= Date: Mon, 11 Nov 2024 10:33:35 +0100 Subject: [PATCH 20/85] =?UTF-8?q?Fikser=20tittel=20p=C3=A5=20infobrev=20v/?= =?UTF-8?q?=206=20m=C3=A5neder=20(#6268)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/kotlin/no/nav/etterlatte/brev/Brevkoder.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/Brevkoder.kt b/libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/Brevkoder.kt index bdcbeac3e55..6b972161498 100644 --- a/libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/Brevkoder.kt +++ b/libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/Brevkoder.kt @@ -162,7 +162,7 @@ enum class Brevkoder( OMSTILLINGSSTOENAD_AKTIVITETSPLIKT_INFORMASJON_6MND_INNHOLD( EtterlatteBrevKode.OMSTILLINGSSTOENAD_AKTIVITETSPLIKT_INFORMASJON_6MND_INNHOLD, EtterlatteBrevKode.TOM_MAL_INFORMASJONSBREV, - "Informasjon om aktivitetsplikt for omstillingsstønad", + "Informasjon om omstillingsstønaden din", Brevtype.INFORMASJON, ), OMSTILLINGSSTOENAD_INFORMASJON_MOTTATT_SOEKNAD( From d6f3355a114a22e5369bf6e5af57eeb47fc2c3a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Oliver=20S=C3=B8berg?= <82504565+sebassonav@users.noreply.github.com> Date: Mon, 11 Nov 2024 11:52:58 +0100 Subject: [PATCH 21/85] Ikke logg samme feil to ganger ved gosysfeil (#6277) --- .../main/kotlin/oppgaveGosys/GosysOppgaveKlient.kt | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/apps/etterlatte-behandling/src/main/kotlin/oppgaveGosys/GosysOppgaveKlient.kt b/apps/etterlatte-behandling/src/main/kotlin/oppgaveGosys/GosysOppgaveKlient.kt index cc21f215fba..b3348cdbf53 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/oppgaveGosys/GosysOppgaveKlient.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/oppgaveGosys/GosysOppgaveKlient.kt @@ -13,6 +13,7 @@ import io.ktor.http.HttpStatusCode import no.nav.etterlatte.libs.common.Enhetsnummer import no.nav.etterlatte.libs.common.deserialize import no.nav.etterlatte.libs.common.feilhaandtering.ForespoerselException +import no.nav.etterlatte.libs.common.feilhaandtering.InternfeilException import no.nav.etterlatte.libs.common.feilhaandtering.TimeoutForespoerselException import no.nav.etterlatte.libs.common.logging.sikkerlogger import no.nav.etterlatte.libs.common.objectMapper @@ -151,8 +152,7 @@ class GosysOppgaveKlientImpl( } catch (e: SocketTimeoutException) { throw GosysTimeout() } catch (e: Exception) { - logger.error("Feil ved henting av oppgaver fra Gosys", e) - throw e + throw GosysInternalFeil(cause = e) } } @@ -180,8 +180,7 @@ class GosysOppgaveKlientImpl( } catch (e: SocketTimeoutException) { throw GosysTimeout() } catch (e: Exception) { - logger.error("Feil ved henting av oppgaver fra Gosys", e) - throw e + throw GosysInternalFeil(cause = e) } } @@ -310,6 +309,13 @@ data class EndreStatusRequest( val beskrivelse: String? = null, ) +class GosysInternalFeil( + override val cause: Throwable, +) : InternfeilException( + detail = "Feil ved henting av oppgaver fra Gosys. Melding ${cause.message}", + cause = cause, + ) + class GosysTimeout : TimeoutForespoerselException( code = "GOSYS_TIMEOUT", From 4a10f010f93f98ec8c307f435daf93402b9244ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Oliver=20S=C3=B8berg?= <82504565+sebassonav@users.noreply.github.com> Date: Mon, 11 Nov 2024 11:53:07 +0100 Subject: [PATCH 22/85] EY-4719 Egen route for brevvalg (#6271) * EY-4719 Egen route for brevvalg * nitpitcs * Returner oppgave fra ferdigstilling og valider at kan ferdigstille oppgave * Forbedre tester --- .../AktivitetspliktOppgaveService.kt | 15 ++ .../aktivitetsplikt/AktivitetspliktRoute.kt | 4 +- .../src/main/kotlin/oppgave/OppgaveService.kt | 8 + .../AktivitetspliktOppgaveServiceTest.kt | 39 +++ .../aktivitetsplikt/OppgaveVurderingRoute.tsx | 2 + .../brev/AktivitetspliktBrev.tsx | 37 +-- .../aktivitetsplikt/brev/UtenBrevVisning.tsx | 2 +- .../brev/VurderingInfoBrevOgOppsummering.tsx | 35 ++- .../stegmeny/AktivitetspliktStegmeny.tsx | 2 + .../vurdering/VurderAktivitet.tsx | 56 ++-- .../aktivitetsplikt/vurdering/Vurderinger.tsx | 2 - .../UnntakAktivitetspliktOppgaveForm.tsx | 1 - .../ValgForInfobrev.tsx | 242 +++++++++++------- 13 files changed, 277 insertions(+), 168 deletions(-) diff --git a/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveService.kt b/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveService.kt index 695a1be05a2..b83c1ffa6dc 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveService.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveService.kt @@ -177,6 +177,12 @@ class AktivitetspliktOppgaveService( ): OppgaveIntern { val brevData = aktivitetspliktBrevDao.hentBrevdata(oppgaveId) ?: throw GenerellIkkeFunnetException() val oppgave = oppgaveService.hentOppgave(oppgaveId) + try { + oppgaveService.sjekkOmKanFerdigstilleOppgave(oppgave, brukerTokenInfo) + } catch (e: Exception) { + throw FeilIOppgave("Kan ikke ferdigstille oppgave for oppgaveid $oppgaveId", e) + } + val sak = sakService.finnSak(oppgave.sakId) ?: throw GenerellIkkeFunnetException() val brevId = brevData.brevId ?: throw ManglerBrevdata("Brevid er ikke registrert på oppgaveid $oppgaveId") val req = @@ -196,6 +202,15 @@ class AktivitetspliktOppgaveService( } } +class FeilIOppgave( + msg: String, + override val cause: Throwable? = null, +) : UgyldigForespoerselException( + code = "OPPGAVE_AVSLUTTET", + detail = msg, + cause = cause, + ) + class OppgaveErAvsluttet( msg: String, ) : UgyldigForespoerselException( diff --git a/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktRoute.kt b/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktRoute.kt index 97f8f8c5a00..b195a7a80cf 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktRoute.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktRoute.kt @@ -263,8 +263,8 @@ internal fun Route.aktivitetspliktRoutes( call.respond(BrevIdDto(brevId)) } post("ferdigstillbrev-og-oppgave") { - inTransaction { aktivitetspliktOppgaveService.ferdigstillBrevOgOppgave(oppgaveId, brukerTokenInfo) } - call.respond(HttpStatusCode.NoContent) + val oppgave = inTransaction { aktivitetspliktOppgaveService.ferdigstillBrevOgOppgave(oppgaveId, brukerTokenInfo) } + call.respond(oppgave) } } diff --git a/apps/etterlatte-behandling/src/main/kotlin/oppgave/OppgaveService.kt b/apps/etterlatte-behandling/src/main/kotlin/oppgave/OppgaveService.kt index fead4a49271..9869a2e8fe8 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/oppgave/OppgaveService.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/oppgave/OppgaveService.kt @@ -356,6 +356,14 @@ class OppgaveService( return hentOppgave(id) } + fun sjekkOmKanFerdigstilleOppgave( + oppgave: OppgaveIntern, + saksbehandler: BrukerTokenInfo, + ) { + sikreAtOppgaveIkkeErAvsluttet(oppgave = oppgave) + sikreAtSaksbehandlerSomLukkerOppgaveEierOppgaven(oppgave, saksbehandler) + } + private fun ferdigstillOppgave( oppgave: OppgaveIntern, saksbehandler: BrukerTokenInfo, diff --git a/apps/etterlatte-behandling/src/test/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveServiceTest.kt b/apps/etterlatte-behandling/src/test/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveServiceTest.kt index 80e09e2596b..f2d6c86f94a 100644 --- a/apps/etterlatte-behandling/src/test/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveServiceTest.kt +++ b/apps/etterlatte-behandling/src/test/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveServiceTest.kt @@ -27,6 +27,7 @@ import no.nav.etterlatte.libs.common.sak.Sak import no.nav.etterlatte.libs.common.sak.SakId import no.nav.etterlatte.libs.common.tidspunkt.Tidspunkt import no.nav.etterlatte.nyKontekstMedBruker +import no.nav.etterlatte.oppgave.OppgaveKanIkkeEndres import no.nav.etterlatte.oppgave.OppgaveService import no.nav.etterlatte.oppgave.lagNyOppgave import no.nav.etterlatte.sak.SakService @@ -305,6 +306,40 @@ class AktivitetspliktOppgaveServiceTest { verify(exactly = 1) { aktivitetspliktService.hentVurderingForOppgave(oppgaveId) } } + @Test + fun `Kan ikke ferdigstille brev og oppgave om oppgaven er i feil state`() { + val simpleSaksbehandler = simpleSaksbehandler() + val oppgaveId = UUID.randomUUID() + val sakIdForOppgave = sak.id + every { oppgaveService.hentOppgave(oppgaveId) } returns + mockk { + every { sakId } returns sakIdForOppgave + every { status } returns Status.AVBRUTT + } + val kilde = Grunnlagsopplysning.Saksbehandler.create("ident") + + val brevId = 1234L + every { aktivitetspliktBrevDao.hentBrevdata(oppgaveId) } returns + AktivitetspliktInformasjonBrevdata( + oppgaveId, + sakIdForOppgave, + brevId, + true, + utbetaling = true, + redusertEtterInntekt = true, + kilde = kilde, + ) + every { oppgaveService.sjekkOmKanFerdigstilleOppgave(any(), any()) } throws OppgaveKanIkkeEndres(oppgaveId, Status.AVBRUTT) + every { oppgaveService.ferdigstillOppgave(oppgaveId, simpleSaksbehandler) } returns mockk() + coEvery { brevApiKlient.ferdigstillBrev(any(), any()) } returns + BrevStatusResponse(brevId, no.nav.etterlatte.brev.model.Status.DISTRIBUERT) + + assertThrows { + service.ferdigstillBrevOgOppgave(oppgaveId, simpleSaksbehandler) + } + verify(exactly = 0) { oppgaveService.ferdigstillOppgave(oppgaveId, simpleSaksbehandler) } + } + @Test fun `Skal kun ferdigstille oppgave hvis brev blir distribuert`() { val simpleSaksbehandler = simpleSaksbehandler() @@ -313,6 +348,7 @@ class AktivitetspliktOppgaveServiceTest { every { oppgaveService.hentOppgave(oppgaveId) } returns mockk { every { sakId } returns sakIdForOppgave + every { status } returns Status.UNDER_BEHANDLING } val kilde = Grunnlagsopplysning.Saksbehandler.create("ident") @@ -328,10 +364,12 @@ class AktivitetspliktOppgaveServiceTest { kilde = kilde, ) every { oppgaveService.ferdigstillOppgave(oppgaveId, simpleSaksbehandler) } returns mockk() + every { oppgaveService.sjekkOmKanFerdigstilleOppgave(any(), any()) } just Runs coEvery { brevApiKlient.ferdigstillBrev(any(), any()) } returns BrevStatusResponse(brevId, no.nav.etterlatte.brev.model.Status.DISTRIBUERT) service.ferdigstillBrevOgOppgave(oppgaveId, simpleSaksbehandler) verify(exactly = 1) { oppgaveService.ferdigstillOppgave(oppgaveId, simpleSaksbehandler) } + coVerify(exactly = 1) { brevApiKlient.ferdigstillBrev(any(), any()) } } @Test @@ -358,6 +396,7 @@ class AktivitetspliktOppgaveServiceTest { kilde = kilde, ) every { oppgaveService.ferdigstillOppgave(oppgaveId, simpleSaksbehandler) } returns mockk() + every { oppgaveService.sjekkOmKanFerdigstilleOppgave(any(), any()) } just Runs coEvery { brevApiKlient.ferdigstillBrev(any(), any()) } returns BrevStatusResponse(brevId, no.nav.etterlatte.brev.model.Status.JOURNALFOERT) assertThrows { diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/OppgaveVurderingRoute.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/OppgaveVurderingRoute.tsx index 2459532fee4..1dc2aa4901b 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/OppgaveVurderingRoute.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/OppgaveVurderingRoute.tsx @@ -11,6 +11,7 @@ import { VurderAktivitet } from '~components/aktivitetsplikt/vurdering/VurderAkt import { VurderingInfoBrevOgOppsummering } from '~components/aktivitetsplikt/brev/VurderingInfoBrevOgOppsummering' import { AktivitetspliktOppgaveVurdering } from '~shared/types/Aktivitetsplikt' import { useAktivitetspliktOppgaveVurderingState } from '~store/reducers/Aktivitetsplikt12mnd' +import { ValgForInfobrev } from '~components/person/aktivitet/vurderingAvAktivitetsplikt/ValgForInfobrev' const AktivitetspliktOppgaveContext = createContext( {} as AktivitetspliktOppgaveVurdering @@ -28,6 +29,7 @@ export function OppgaveVurderingRoute(props: { vurderingOgOppgave: Aktivitetspli } /> + } /> } /> } /> diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/brev/AktivitetspliktBrev.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/brev/AktivitetspliktBrev.tsx index fa6bcd155af..f8d163c7633 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/brev/AktivitetspliktBrev.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/brev/AktivitetspliktBrev.tsx @@ -1,10 +1,10 @@ -import { Box, Button, Heading, HStack, VStack } from '@navikt/ds-react' +import { Box, Heading, HStack, VStack } from '@navikt/ds-react' import React, { useEffect, useState } from 'react' import { useApiCall } from '~shared/hooks/useApiCall' import { hentBrev } from '~shared/api/brev' import { ferdigstillBrevOgOppgaveAktivitetsplikt } from '~shared/api/aktivitetsplikt' import { BrevProsessType, BrevStatus } from '~shared/types/Brev' -import { isFailure, mapResult, Result } from '~shared/api/apiUtils' +import { isFailure, mapResult } from '~shared/api/apiUtils' import Spinner from '~shared/Spinner' import { ApiErrorAlert } from '~ErrorBoundary' import { Column, GridContainer } from '~shared/styled' @@ -14,12 +14,10 @@ import { BrevMottakerWrapper } from '~components/person/brev/mottaker/BrevMottak import ForhaandsvisningBrev from '~components/behandling/brev/ForhaandsvisningBrev' import RedigerbartBrev from '~components/behandling/brev/RedigerbartBrev' import { isPending } from '@reduxjs/toolkit' -import { AktivitetspliktSteg } from '~components/aktivitetsplikt/stegmeny/AktivitetspliktStegmeny' -import { handlinger } from '~components/behandling/handlinger/typer' -import { useNavigate } from 'react-router-dom' import { useAktivitetspliktOppgaveVurdering } from '~components/aktivitetsplikt/OppgaveVurderingRoute' import { useDispatch } from 'react-redux' import { setAktivitetspliktOppgave } from '~store/reducers/Aktivitetsplikt12mnd' +import { InfobrevKnapperad } from '~components/aktivitetsplikt/brev/VurderingInfoBrevOgOppsummering' export function Aktivitetspliktbrev({ brevId }: { brevId: number }) { const { oppgave } = useAktivitetspliktOppgaveVurdering() @@ -89,32 +87,3 @@ export function Aktivitetspliktbrev({ brevId }: { brevId: number }) { }, }) } - -export function InfobrevKnapperad(props: { - ferdigstill?: () => void - status?: Result - tekst?: string - children?: React.ReactElement -}) { - const navigate = useNavigate() - return ( - - {props.children} - - - {props.ferdigstill && ( - - )} - - - ) -} diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/brev/UtenBrevVisning.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/brev/UtenBrevVisning.tsx index fe7043986a9..c175f940c97 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/brev/UtenBrevVisning.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/brev/UtenBrevVisning.tsx @@ -5,10 +5,10 @@ import { Alert, BodyShort, VStack } from '@navikt/ds-react' import { mapFailure } from '~shared/api/apiUtils' import { ApiErrorAlert } from '~ErrorBoundary' import React from 'react' -import { InfobrevKnapperad } from '~components/aktivitetsplikt/brev/AktivitetspliktBrev' import { useAktivitetspliktOppgaveVurdering } from '~components/aktivitetsplikt/OppgaveVurderingRoute' import { useDispatch } from 'react-redux' import { setAktivitetspliktOppgave } from '~store/reducers/Aktivitetsplikt12mnd' +import { InfobrevKnapperad } from '~components/aktivitetsplikt/brev/VurderingInfoBrevOgOppsummering' export function UtenBrevVisning() { const { oppgave, aktivtetspliktbrevdata } = useAktivitetspliktOppgaveVurdering() diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/brev/VurderingInfoBrevOgOppsummering.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/brev/VurderingInfoBrevOgOppsummering.tsx index dce70e451d7..51bf8f6288c 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/brev/VurderingInfoBrevOgOppsummering.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/brev/VurderingInfoBrevOgOppsummering.tsx @@ -1,9 +1,13 @@ -import { Box, Heading } from '@navikt/ds-react' +import { Box, Button, Heading, HStack } from '@navikt/ds-react' import { useSidetittel } from '~shared/hooks/useSidetittel' import { useAktivitetspliktOppgaveVurdering } from '~components/aktivitetsplikt/OppgaveVurderingRoute' import React from 'react' import { Aktivitetspliktbrev } from '~components/aktivitetsplikt/brev/AktivitetspliktBrev' import { UtenBrevVisning } from '~components/aktivitetsplikt/brev/UtenBrevVisning' +import { isPending, Result } from '~shared/api/apiUtils' +import { useNavigate } from 'react-router-dom' +import { AktivitetspliktSteg } from '~components/aktivitetsplikt/stegmeny/AktivitetspliktStegmeny' +import { handlinger } from '~components/behandling/handlinger/typer' export function VurderingInfoBrevOgOppsummering() { useSidetittel('Aktivitetsplikt brev og oppsummering') @@ -21,3 +25,32 @@ export function VurderingInfoBrevOgOppsummering() { return } + +export function InfobrevKnapperad(props: { + ferdigstill?: () => void + status?: Result + tekst?: string + children?: React.ReactElement +}) { + const navigate = useNavigate() + return ( + + {props.children} + + + {props.ferdigstill && props.status && ( + + )} + + + ) +} diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/stegmeny/AktivitetspliktStegmeny.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/stegmeny/AktivitetspliktStegmeny.tsx index 10030b8e821..fe1aa8ccddc 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/stegmeny/AktivitetspliktStegmeny.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/stegmeny/AktivitetspliktStegmeny.tsx @@ -6,6 +6,7 @@ import { useAktivitetspliktOppgaveVurdering } from '~components/aktivitetsplikt/ export enum AktivitetspliktSteg { VURDERING = 'vurdering', + BREVVALG = 'brevvalg', OPPSUMMERING_OG_BREV = 'oppsummering', } @@ -19,6 +20,7 @@ export function AktivitetspliktStegmeny() { + - + ) } -function NesteEllerOpprettBrev() { - const { oppgave, aktivtetspliktbrevdata } = useAktivitetspliktOppgaveVurdering() +function NesteKnapp() { + const { vurdering } = useAktivitetspliktOppgaveVurdering() + const aktiviteter = vurdering.aktivitet const navigate = useNavigate() - - const [opprettBrevStatus, opprettBrevCall] = useApiCall(opprettAktivitetspliktsbrev) - const dispatch = useDispatch() - const erRedigerbar = erOppgaveRedigerbar(oppgave.status) - const skalOppretteBrev = erRedigerbar && aktivtetspliktbrevdata?.skalSendeBrev && !aktivtetspliktbrevdata.brevId - - function opprettBrev() { - opprettBrevCall( - { - oppgaveId: oppgave.id, - }, - (brevId) => { - dispatch(setBrevid(brevId.brevId)) - navigate(`../${AktivitetspliktSteg.OPPSUMMERING_OG_BREV}`) - } - ) + const [manglerAktiviteter, setManglerAktiviteter] = useState(false) + const gaaTilNeste = () => { + if (aktiviteter?.length) { + navigate(`../${AktivitetspliktSteg.BREVVALG}`) + setManglerAktiviteter(false) + } else { + setManglerAktiviteter(true) + } } + useEffect(() => { + setManglerAktiviteter(false) + }, [vurdering.aktivitet]) return ( - {mapFailure(opprettBrevStatus, (error) => ( - Kunne ikke opprette brev: {error.detail} - ))} - {skalOppretteBrev ? ( - - ) : ( - - )} + + {manglerAktiviteter && Du må registrere en aktivitet for å gå videre} ) diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/Vurderinger.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/Vurderinger.tsx index ec6b0d995f9..7f326db4cce 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/Vurderinger.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/Vurderinger.tsx @@ -2,7 +2,6 @@ import { useAktivitetspliktOppgaveVurdering } from '~components/aktivitetsplikt/ import React from 'react' import { erOppgaveRedigerbar } from '~shared/types/oppgave' import { Heading } from '@navikt/ds-react' -import { ValgForInfobrev } from '~components/person/aktivitet/vurderingAvAktivitetsplikt/ValgForInfobrev' import { AktivitetsgradIOppgave } from '~components/aktivitetsplikt/vurdering/aktivitetsgrad/AktivitetsgradIOppgave' import { LeggTilUnntak } from '~components/aktivitetsplikt/vurdering/unntak/LeggTilUnntak' @@ -21,7 +20,6 @@ export function Vurderinger(props: { doedsdato: Date }) { {oppgaveErRedigerbar && } {oppgaveErRedigerbar && } - ) } diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/unntak/UnntakAktivitetspliktOppgaveForm.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/unntak/UnntakAktivitetspliktOppgaveForm.tsx index 5e5dd34b3c2..b517a2d84da 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/unntak/UnntakAktivitetspliktOppgaveForm.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/unntak/UnntakAktivitetspliktOppgaveForm.tsx @@ -44,7 +44,6 @@ export function UnntakAktivitetspliktOppgaveForm(props: { if (!formdataErUtfylt(formdata)) { return } - console.log('formdata: ', formdata) lagreUnntak( { oppgaveId: oppgave.id, diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/person/aktivitet/vurderingAvAktivitetsplikt/ValgForInfobrev.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/person/aktivitet/vurderingAvAktivitetsplikt/ValgForInfobrev.tsx index ad80fa9fb9b..f33d5c8611f 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/person/aktivitet/vurderingAvAktivitetsplikt/ValgForInfobrev.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/person/aktivitet/vurderingAvAktivitetsplikt/ValgForInfobrev.tsx @@ -2,9 +2,12 @@ import { Box, Button, Heading, HStack, Radio, VStack } from '@navikt/ds-react' import React, { useEffect, useState } from 'react' import { JaNei, JaNeiRec } from '~shared/types/ISvar' import { useForm } from 'react-hook-form' -import { isPending } from '@reduxjs/toolkit' import { useApiCall } from '~shared/hooks/useApiCall' -import { IBrevAktivitetspliktRequest, lagreAktivitetspliktBrevdata } from '~shared/api/aktivitetsplikt' +import { + IBrevAktivitetspliktRequest, + lagreAktivitetspliktBrevdata, + opprettAktivitetspliktsbrev, +} from '~shared/api/aktivitetsplikt' import { ControlledRadioGruppe } from '~shared/components/radioGruppe/ControlledRadioGruppe' import { isFailureHandler } from '~shared/api/IsFailureHandler' import { PencilIcon } from '@navikt/aksel-icons' @@ -12,7 +15,12 @@ import { Info } from '~components/behandling/soeknadsoversikt/Info' import { useAktivitetspliktOppgaveVurdering } from '~components/aktivitetsplikt/OppgaveVurderingRoute' import { erOppgaveRedigerbar } from '~shared/types/oppgave' import { useDispatch } from 'react-redux' -import { setAktivtetspliktbrevdata } from '~store/reducers/Aktivitetsplikt12mnd' +import { setAktivtetspliktbrevdata, setBrevid } from '~store/reducers/Aktivitetsplikt12mnd' +import { useNavigate } from 'react-router' +import { AktivitetspliktSteg } from '~components/aktivitetsplikt/stegmeny/AktivitetspliktStegmeny' +import { isPending, mapFailure } from '~shared/api/apiUtils' +import { ApiErrorAlert } from '~ErrorBoundary' +import { handlinger } from '~components/behandling/handlinger/typer' interface IBrevAktivitetsplikt { skalSendeBrev: JaNei @@ -60,98 +68,150 @@ export const ValgForInfobrev = () => { }, [skalsendebrev]) return ( - - - Valg for infobrev - - {redigeres ? ( -
- - - {JaNeiRec.JA} - {JaNeiRec.NEI} - - } - /> - - {skalsendebrev === JaNei.JA && ( - <> - - {JaNeiRec.JA} - {JaNeiRec.NEI} - - } - /> - - - {JaNeiRec.JA} - {JaNeiRec.NEI} - - } - /> - - )} + + + + + Valg for infobrev + + + {redigeres ? ( + + + + {JaNeiRec.JA} + {JaNeiRec.NEI} + + } + /> - {isFailureHandler({ - apiResult: lagrebrevdataStatus, - errorMessage: 'Kan ikke lagre valg for infobrevet', - })} - - - - - - ) : ( - - {!!brevdata && ( - - - {brevdata.skalSendeBrev && ( + {skalsendebrev === JaNei.JA && ( <> - - + {JaNeiRec.JA} + {JaNeiRec.NEI} + + } + /> + + + {JaNeiRec.JA} + {JaNeiRec.NEI} + + } /> )} - - )} - {erOppgaveRedigerbar(oppgave.status) && ( - - - - )} - - )} - + + {isFailureHandler({ + apiResult: lagrebrevdataStatus, + errorMessage: 'Kan ikke lagre valg for infobrevet', + })} + + + +
+ + ) : ( + + {!!brevdata && ( + + + {brevdata.skalSendeBrev && ( + <> + + + + )} + + )} + {erOppgaveRedigerbar(oppgave.status) && ( + + + + )} + + )} + +
+ + ) +} + +function NesteEllerOpprettBrevValg() { + const { oppgave, aktivtetspliktbrevdata } = useAktivitetspliktOppgaveVurdering() + const navigate = useNavigate() + + const [opprettBrevStatus, opprettBrevCall] = useApiCall(opprettAktivitetspliktsbrev) + const dispatch = useDispatch() + const erRedigerbar = erOppgaveRedigerbar(oppgave.status) + const skalOppretteBrev = erRedigerbar && aktivtetspliktbrevdata?.skalSendeBrev && !aktivtetspliktbrevdata.brevId + + function opprettBrev() { + opprettBrevCall( + { + oppgaveId: oppgave.id, + }, + (brevId) => { + dispatch(setBrevid(brevId.brevId)) + navigate(`../${AktivitetspliktSteg.OPPSUMMERING_OG_BREV}`) + } + ) + } + + return ( + + + + {mapFailure(opprettBrevStatus, (error) => ( + Kunne ikke opprette brev: {error.detail} + ))} + {skalOppretteBrev ? ( + + ) : ( + + )} + + ) } From e11c837531929e6c0eb086cf5be3c229dddd794b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Oliver=20S=C3=B8berg?= <82504565+sebassonav@users.noreply.github.com> Date: Mon, 11 Nov 2024 12:43:25 +0100 Subject: [PATCH 23/85] EY-4645 Kilde saksbehandler (#6251) --- .../AktivitetspliktOppgaveService.kt | 19 ++++++++++++++++-- .../AktivitetspliktAktivitetsgradDao.kt | 2 +- .../behandling/aktivitetsplikt/TestUtils.kt | 2 +- .../brev/AktivitetspliktBrev.tsx | 20 ++++++++++++++++--- .../vurdering/VurderAktivitet.tsx | 2 +- .../client/src/shared/api/aktivitetsplikt.ts | 2 ++ .../src/shared/types/Aktivitetsplikt.ts | 1 + 7 files changed, 40 insertions(+), 8 deletions(-) diff --git a/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveService.kt b/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveService.kt index b83c1ffa6dc..4ae41c42672 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveService.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveService.kt @@ -22,6 +22,7 @@ import no.nav.etterlatte.libs.common.oppgave.OppgaveIntern import no.nav.etterlatte.libs.common.oppgave.OppgaveType import no.nav.etterlatte.libs.common.sak.Sak import no.nav.etterlatte.libs.common.sak.SakId +import no.nav.etterlatte.libs.common.tidspunkt.Tidspunkt import no.nav.etterlatte.libs.common.toJson import no.nav.etterlatte.libs.ktor.token.BrukerTokenInfo import no.nav.etterlatte.oppgave.OppgaveService @@ -40,6 +41,17 @@ class AktivitetspliktOppgaveService( ) { private val logger: Logger = LoggerFactory.getLogger(this.javaClass.name) + private fun hentSistEndretAktivitetspliktSomErRelevantForBrev( + brevdata: AktivitetspliktInformasjonBrevdata?, + vurderinger: AktivitetspliktVurdering?, + ): Tidspunkt? = + listOfNotNull( + brevdata?.kilde?.tidspunkt, + vurderinger?.aktivitet?.maxOfOrNull { + it.endret.tidspunkt + }, + ).maxOrNull() + fun hentVurderingForOppgave(oppgaveId: UUID): AktivitetspliktOppgaveVurdering { val oppgave = oppgaveService.hentOppgave(oppgaveId) val vurderingType = @@ -63,7 +75,9 @@ class AktivitetspliktOppgaveService( val brevdata = aktivitetspliktBrevDao.hentBrevdata(oppgaveId = oppgaveId) + val sistEndret = hentSistEndretAktivitetspliktSomErRelevantForBrev(brevdata, vurderinger) return AktivitetspliktOppgaveVurdering( + sistEndret = sistEndret, aktivtetspliktbrevdata = brevdata, vurderingType = vurderingType, oppgave = oppgave, @@ -260,7 +274,7 @@ data class AktivitetspliktInformasjonBrevdataRequest( fun toDaoObjektBrevutfall( oppgaveId: UUID, sakid: SakId, - kilde: Grunnlagsopplysning.Kilde, + kilde: Grunnlagsopplysning.Saksbehandler, ): AktivitetspliktInformasjonBrevdata = AktivitetspliktInformasjonBrevdata( oppgaveId = oppgaveId, @@ -279,7 +293,7 @@ data class AktivitetspliktInformasjonBrevdata( val skalSendeBrev: Boolean, val utbetaling: Boolean? = null, val redusertEtterInntekt: Boolean? = null, - val kilde: Grunnlagsopplysning.Kilde, + val kilde: Grunnlagsopplysning.Saksbehandler, ) data class AktivitetspliktOppgaveVurdering( @@ -288,6 +302,7 @@ data class AktivitetspliktOppgaveVurdering( val sak: Sak, val vurdering: AktivitetspliktVurdering, val aktivtetspliktbrevdata: AktivitetspliktInformasjonBrevdata?, + val sistEndret: Tidspunkt?, ) enum class VurderingType { diff --git a/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/vurdering/AktivitetspliktAktivitetsgradDao.kt b/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/vurdering/AktivitetspliktAktivitetsgradDao.kt index 17c2adef8e1..4cbf1d41a7b 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/vurdering/AktivitetspliktAktivitetsgradDao.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/vurdering/AktivitetspliktAktivitetsgradDao.kt @@ -282,7 +282,7 @@ data class AktivitetspliktAktivitetsgrad( val fom: LocalDate, val tom: LocalDate?, override val opprettet: Grunnlagsopplysning.Kilde, - val endret: Grunnlagsopplysning.Kilde?, + val endret: Grunnlagsopplysning.Saksbehandler, val beskrivelse: String, val vurdertFra12Mnd: Boolean = false, ) : AktivitetspliktVurderingOpprettetDato { diff --git a/apps/etterlatte-behandling/src/test/kotlin/behandling/aktivitetsplikt/TestUtils.kt b/apps/etterlatte-behandling/src/test/kotlin/behandling/aktivitetsplikt/TestUtils.kt index 6b0a207f804..3d424daa725 100644 --- a/apps/etterlatte-behandling/src/test/kotlin/behandling/aktivitetsplikt/TestUtils.kt +++ b/apps/etterlatte-behandling/src/test/kotlin/behandling/aktivitetsplikt/TestUtils.kt @@ -57,7 +57,7 @@ fun aktivitetsgrad( ident = "Z123456", tidspunkt = Tidspunkt.now(), ), - endret: Grunnlagsopplysning.Saksbehandler? = + endret: Grunnlagsopplysning.Saksbehandler = Grunnlagsopplysning.Saksbehandler( ident = "Z123456", tidspunkt = Tidspunkt.now(), diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/brev/AktivitetspliktBrev.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/brev/AktivitetspliktBrev.tsx index f8d163c7633..a39a2810e6b 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/brev/AktivitetspliktBrev.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/brev/AktivitetspliktBrev.tsx @@ -1,9 +1,9 @@ -import { Box, Heading, HStack, VStack } from '@navikt/ds-react' +import { Alert, Box, Heading, HStack, VStack } from '@navikt/ds-react' import React, { useEffect, useState } from 'react' import { useApiCall } from '~shared/hooks/useApiCall' import { hentBrev } from '~shared/api/brev' import { ferdigstillBrevOgOppgaveAktivitetsplikt } from '~shared/api/aktivitetsplikt' -import { BrevProsessType, BrevStatus } from '~shared/types/Brev' +import { BrevProsessType, BrevStatus, IBrev } from '~shared/types/Brev' import { isFailure, mapResult } from '~shared/api/apiUtils' import Spinner from '~shared/Spinner' import { ApiErrorAlert } from '~ErrorBoundary' @@ -20,7 +20,7 @@ import { setAktivitetspliktOppgave } from '~store/reducers/Aktivitetsplikt12mnd' import { InfobrevKnapperad } from '~components/aktivitetsplikt/brev/VurderingInfoBrevOgOppsummering' export function Aktivitetspliktbrev({ brevId }: { brevId: number }) { - const { oppgave } = useAktivitetspliktOppgaveVurdering() + const { oppgave, sistEndret } = useAktivitetspliktOppgaveVurdering() const [kanRedigeres, setKanRedigeres] = useState(false) const [brevStatus, apiHentBrev] = useApiCall(hentBrev) @@ -42,6 +42,14 @@ export function Aktivitetspliktbrev({ brevId }: { brevId: number }) { }) } + const endringerHarKommetEtterBrevOpprettelse = (brev: IBrev) => { + if (sistEndret) { + return new Date(sistEndret).getTime() > new Date(brev.statusEndret).getTime() + } else { + return false + } + } + useEffect(() => { hentBrevOgSetStatus() }, [brevId, oppgave.status]) @@ -55,6 +63,12 @@ export function Aktivitetspliktbrev({ brevId }: { brevId: number }) { return ( + {endringerHarKommetEtterBrevOpprettelse(brev) && ( + + Vurdering av aktivitet eller valgene for infobrevet er oppdatert etter at brevet ble opprettet. Se nøye + over brevet for å se om innholdet stemmer med nåværende verdier. + + )} Infobrev aktivitetsplikt diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/VurderAktivitet.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/VurderAktivitet.tsx index f96a3fe7cf0..106b0dca57a 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/VurderAktivitet.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/VurderAktivitet.tsx @@ -65,7 +65,7 @@ function NesteKnapp() { }, [vurdering.aktivitet]) return ( - + {manglerAktiviteter && Du må registrere en aktivitet for å gå videre} diff --git a/apps/etterlatte-saksbehandling-ui/client/src/shared/api/aktivitetsplikt.ts b/apps/etterlatte-saksbehandling-ui/client/src/shared/api/aktivitetsplikt.ts index 2c4e36a7799..32432c0888a 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/shared/api/aktivitetsplikt.ts +++ b/apps/etterlatte-saksbehandling-ui/client/src/shared/api/aktivitetsplikt.ts @@ -9,6 +9,7 @@ import { IOpprettAktivitetspliktAktivitetsgrad, IOpprettAktivitetspliktUnntak, } from '~shared/types/Aktivitetsplikt' +import { KildeSaksbehandler } from '~shared/types/kilde' import { OppgaveDTO } from '~shared/types/oppgave' export const hentAktivitetspliktOppfolging = async (args: { @@ -145,4 +146,5 @@ export interface IBrevAktivitetspliktDto { skalSendeBrev: boolean utbetaling?: boolean redusertEtterInntekt?: boolean + kilde: KildeSaksbehandler } diff --git a/apps/etterlatte-saksbehandling-ui/client/src/shared/types/Aktivitetsplikt.ts b/apps/etterlatte-saksbehandling-ui/client/src/shared/types/Aktivitetsplikt.ts index 58fab47a3c7..d52b0b7159a 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/shared/types/Aktivitetsplikt.ts +++ b/apps/etterlatte-saksbehandling-ui/client/src/shared/types/Aktivitetsplikt.ts @@ -169,6 +169,7 @@ export interface AktivitetspliktOppgaveVurdering { sak: ISak vurdering: IAktivitetspliktVurderingNy aktivtetspliktbrevdata?: IBrevAktivitetspliktDto + sistEndret?: string } export enum AktivitetspliktOppgaveType { From 567d863bef1fb4b4300869e702ce4bed352cb304 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Oliver=20S=C3=B8berg?= <82504565+sebassonav@users.noreply.github.com> Date: Mon, 11 Nov 2024 13:46:37 +0100 Subject: [PATCH 24/85] =?UTF-8?q?Try=20catche=20rundt=20norg=20requester?= =?UTF-8?q?=20for=20=C3=A5=20unng=C3=A5=20random=20feil=20exceptions=20ute?= =?UTF-8?q?n=20tilh=C3=B8righet=20(#6278)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kotlin/behandling/klienter/Norg2Klient.kt | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/apps/etterlatte-behandling/src/main/kotlin/behandling/klienter/Norg2Klient.kt b/apps/etterlatte-behandling/src/main/kotlin/behandling/klienter/Norg2Klient.kt index 4e151752409..b93e0c24c38 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/behandling/klienter/Norg2Klient.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/klienter/Norg2Klient.kt @@ -16,6 +16,7 @@ import no.nav.etterlatte.behandling.domain.ArbeidsFordelingEnhet import no.nav.etterlatte.behandling.domain.ArbeidsFordelingRequest import no.nav.etterlatte.behandling.domain.Navkontor import no.nav.etterlatte.libs.common.Enhetsnummer +import no.nav.etterlatte.libs.common.feilhaandtering.InternfeilException import org.slf4j.LoggerFactory import java.time.Duration @@ -25,6 +26,11 @@ interface Norg2Klient { suspend fun hentNavkontorForOmraade(omraade: String): Navkontor } +class Norg2KlientFeil( + feilmelding: String, + override val cause: Throwable, +) : InternfeilException("$feilmelding ${cause.message}", cause) + class Norg2KlientImpl( private val client: HttpClient, private val url: String, @@ -34,27 +40,27 @@ class Norg2KlientImpl( private val cacheNavkontor = Caffeine .newBuilder() - .expireAfterWrite(Duration.ofMinutes(15)) + .expireAfterWrite(Duration.ofHours(1)) .build() - override suspend fun hentNavkontorForOmraade(omraade: String): Navkontor { - val maybeNavkontor = cacheNavkontor.getIfPresent(omraade) + override suspend fun hentNavkontorForOmraade(omraade: String): Navkontor = + cacheNavkontor.getIfPresent(omraade) ?: hentNavkontor(omraade) - return if (maybeNavkontor != null) { - maybeNavkontor - } else { + private suspend fun hentNavkontor(omraade: String): Navkontor { + try { val response = client.get("$url/enhet/navkontor/$omraade") { contentType(ContentType.Application.Json) } - - if (response.status.isSuccess()) { + return if (response.status.isSuccess()) { response.body().also { cacheNavkontor.put(omraade, it) } } else if (omraade == "0301" && response.status == HttpStatusCode.NotFound) { Navkontor("Ingen", Enhetsnummer.ingenTilknytning) } else { throw ResponseException(response, "Ukjent feil fra norg2 api") } + } catch (e: Exception) { + throw Norg2KlientFeil("Feil i kall mot norg2 for område $omraade", e) } } @@ -75,6 +81,6 @@ class Norg2KlientImpl( } } } catch (exception: Exception) { - throw RuntimeException("Feil i kall mot norg2 med tema og omraade: $request", exception) + throw Norg2KlientFeil("Feil i kall mot norg2 med tema og omraade: $request", exception) } } From 12870eb01e0681c4407cdd90b013cc7f3fe5ee91 Mon Sep 17 00:00:00 2001 From: "Nicolas N." Date: Mon, 11 Nov 2024 13:50:06 +0100 Subject: [PATCH 25/85] =?UTF-8?q?Sjekke=20om=20journalpost=20er=20ferdigst?= =?UTF-8?q?ilt=20f=C3=B8r=20avbryt-knapp=20vises=20(#6280)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/person/dokumenter/avvik/SettStatusAvbryt.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/person/dokumenter/avvik/SettStatusAvbryt.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/person/dokumenter/avvik/SettStatusAvbryt.tsx index f1b6d2e568b..d0525517355 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/person/dokumenter/avvik/SettStatusAvbryt.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/person/dokumenter/avvik/SettStatusAvbryt.tsx @@ -2,7 +2,7 @@ import { Alert, Button, HStack, Loader, VStack } from '@navikt/ds-react' import { isPending, isSuccess, mapFailure } from '~shared/api/apiUtils' import { useApiCall } from '~shared/hooks/useApiCall' import { settStatusAvbryt } from '~shared/api/dokument' -import { Journalpost, Journalposttype } from '~shared/types/Journalpost' +import { Journalpost, Journalposttype, Journalstatus } from '~shared/types/Journalpost' import { ApiErrorAlert } from '~ErrorBoundary' export const SettStatusAvbryt = ({ journalpost }: { journalpost: Journalpost }) => { @@ -17,6 +17,10 @@ export const SettStatusAvbryt = ({ journalpost }: { journalpost: Journalpost }) return Du kan ikke avbryte en inngående journalpost! } + if (journalpost.journalstatus === Journalstatus.FERDIGSTILT) { + return Du kan ikke avbryte en ferdigstilt journalpost + } + if (isSuccess(settStatusAvbrytResult)) { return ( From 8697bd332e7ef2fc26959b17cbacb186635bd449 Mon Sep 17 00:00:00 2001 From: "Nicolas N." Date: Mon, 11 Nov 2024 13:51:15 +0100 Subject: [PATCH 26/85] ikke vise ny-mottaker-knapp hvis ferdigstilt (#6269) --- .../components/person/brev/mottaker/BrevMottakerWrapper.tsx | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/person/brev/mottaker/BrevMottakerWrapper.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/person/brev/mottaker/BrevMottakerWrapper.tsx index f08d2193acd..dfa3f47cba9 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/person/brev/mottaker/BrevMottakerWrapper.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/person/brev/mottaker/BrevMottakerWrapper.tsx @@ -6,11 +6,8 @@ import { useApiCall } from '~shared/hooks/useApiCall' import { opprettMottaker } from '~shared/api/brev' import { isPending } from '~shared/api/apiUtils' import { PlusIcon } from '@navikt/aksel-icons' -import { useFeatureEnabledMedDefault } from '~shared/hooks/useFeatureToggle' export const BrevMottakerWrapper = ({ brev, kanRedigeres }: { brev: IBrev; kanRedigeres: boolean }) => { - const kanLeggeTilMottaker = useFeatureEnabledMedDefault('kan-legge-til-mottaker', false) - const [mottakere, setMottakere] = useState(brev.mottakere) const [opprettMottakerResult, apiOpprettMottaker] = useApiCall(opprettMottaker) @@ -42,7 +39,7 @@ export const BrevMottakerWrapper = ({ brev, kanRedigeres }: { brev: IBrev; kanRe /> ))} - {kanLeggeTilMottaker && mottakere.length < 2 && ( + {kanRedigeres && mottakere.length < 2 && ( + + + )} + + {isFailure(slettStatus) && ( + + Kunne ikke slette aktivitetsvurderingen, på grunn av feil: {slettStatus.error.detail} + + )} + + ) +} diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/aktivitetsgrad/VurderingAktivitetsgradForm.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/aktivitetsgrad/VurderingAktivitetsgradForm.tsx index 087e3f7cb90..cef8a7065a8 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/aktivitetsgrad/VurderingAktivitetsgradForm.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/vurdering/aktivitetsgrad/VurderingAktivitetsgradForm.tsx @@ -3,25 +3,30 @@ import { AktivitetspliktSkjoennsmessigVurdering, AktivitetspliktVurderingType, IAktivitetspliktAktivitetsgrad, + IAktivitetspliktUnntak, IAktivitetspliktVurderingNy, IOpprettAktivitetspliktAktivitetsgrad, tekstAktivitetspliktVurderingType, + teksterAktivitetspliktSkjoennsmessigVurdering, } from '~shared/types/Aktivitetsplikt' import { useAktivitetspliktOppgaveVurdering } from '~components/aktivitetsplikt/OppgaveVurderingRoute' import { useApiCall } from '~shared/hooks/useApiCall' import { opprettAktivitetspliktAktivitetsgrad } from '~shared/api/aktivitetsplikt' import { useForm } from 'react-hook-form' -import { Box, Button, HStack, Radio, Textarea, VStack } from '@navikt/ds-react' +import { Alert, Box, Button, ErrorMessage, HStack, Radio, Textarea, VStack } from '@navikt/ds-react' import { ControlledDatoVelger } from '~shared/components/datoVelger/ControlledDatoVelger' import { ControlledRadioGruppe } from '~shared/components/radioGruppe/ControlledRadioGruppe' import { isFailure, isPending } from '~shared/api/apiUtils' import { ApiErrorAlert } from '~ErrorBoundary' -import React, { useEffect } from 'react' +import React, { useEffect, useState } from 'react' import { addMonths, startOfMonth } from 'date-fns' +import { JaNei } from '~shared/types/ISvar' interface NyVurdering { typeVurdering: AktivitetspliktOppgaveVurderingType vurderingAvAktivitet: IOpprettAktivitetspliktAktivitetsgrad + harUnntak?: JaNei + unntak?: Partial } function maanederForVurdering(typeVurdering: AktivitetspliktOppgaveVurderingType): number { @@ -40,6 +45,7 @@ export function VurderingAktivitetsgradForm(props: { }) { const { aktivitet, onSuccess, onAvbryt, doedsdato } = props const { oppgave } = useAktivitetspliktOppgaveVurdering() + const [feilmelding, setFeilmelding] = useState('') const typeVurdering = oppgave.type === 'AKTIVITETSPLIKT' ? AktivitetspliktOppgaveVurderingType.SEKS_MAANEDER @@ -58,12 +64,20 @@ export function VurderingAktivitetsgradForm(props: { }, }) + const erNyVurdering = aktivitet === undefined + useEffect(() => { reset() }, [aktivitet]) function lagreOgOppdater(formdata: Partial) { + setFeilmelding('') if (!formdata.vurderingAvAktivitet?.aktivitetsgrad || !formdata.vurderingAvAktivitet.fom) { + setFeilmelding('Du må fylle ut vurderingen av aktivitetsgraden.') + return + } + if (formdata.harUnntak === JaNei.JA) { + setFeilmelding('Du kan ikke lagre ned unntak i vurderingen enda.') return } @@ -84,12 +98,29 @@ export function VurderingAktivitetsgradForm(props: { ) } + const svarAktivitetsgrad = watch('vurderingAvAktivitet.aktivitetsgrad') + const harKanskjeUnntak = + erNyVurdering && + (svarAktivitetsgrad === AktivitetspliktVurderingType.AKTIVITET_OVER_50 || + svarAktivitetsgrad === AktivitetspliktVurderingType.AKTIVITET_UNDER_50) + return (
- - + + + {harKanskjeUnntak && ( + + Ja + Nei + + } + errorVedTomInput="Du må svare om bruker har unntak" + /> + )} + + {watch('harUnntak') === JaNei.JA && harKanskjeUnntak && ( + + + Du kan ikke legge til unntak enda. Vi jobber med å få dette på plass. Du kan ta opp denne behandlingen + igjen neste uke. + + + )} + {watch('typeVurdering') === AktivitetspliktOppgaveVurderingType.TOLV_MAANEDER && - watch('vurderingAvAktivitet.aktivitetsgrad') === AktivitetspliktVurderingType.AKTIVITET_OVER_50 && ( + svarAktivitetsgrad === AktivitetspliktVurderingType.AKTIVITET_OVER_50 && ( - Ja - Med oppfølging - Nei + + {teksterAktivitetspliktSkjoennsmessigVurdering[AktivitetspliktSkjoennsmessigVurdering.JA]} + + + { + teksterAktivitetspliktSkjoennsmessigVurdering[ + AktivitetspliktSkjoennsmessigVurdering.MED_OPPFOELGING + ] + } + + + {teksterAktivitetspliktSkjoennsmessigVurdering[AktivitetspliktSkjoennsmessigVurdering.NEI]} + } /> )} + {svarAktivitetsgrad === AktivitetspliktVurderingType.AKTIVITET_UNDER_50 && watch('harUnntak') !== JaNei.JA && ( + + + Basert på vurderingen du har gjort vil det bli opprettet en revurdering for mulig sanksjon. + + + )} -