From bac747238c1ca5c0886bbffa0d00b129ce3e6809 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Oliver=20S=C3=B8berg?= <82504565+sebassonav@users.noreply.github.com> Date: Fri, 1 Nov 2024 16:46:58 +0100 Subject: [PATCH] EY-4661 10mnd brev aktivitetsplikt (#6174) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * EY-4661 10mnd brev aktivitetsplikt * Rydd opp etter rebase mot main * Reminder * Flytt skalopprettebrev ting inn i ifen så det ikke gjøres ellers * Legg til noen tester for opprett brev * EY-4661 Hent utlandstilknytning på saken * EY-4661 Alltid returnere en brevid ellers kaste exception --- .../aktivitetsplikt/AktivitetspliktBrevDao.kt | 35 +++- .../AktivitetspliktOppgaveService.kt | 106 +++++++++++- .../aktivitetsplikt/AktivitetspliktRoute.kt | 12 ++ .../kotlin/behandling/hendelse/HendelseDao.kt | 1 + .../behandling/klienter/BrevApiKlient.kt | 22 +++ .../tilbakekreving/TilbakekrevingDao.kt | 1 + .../main/kotlin/config/ApplicationContext.kt | 2 + .../V179__aktivitetsplikt_legg_til_brevid.sql | 1 + .../AktivitetspliktBrevDaoTest.kt | 41 +++++ .../AktivitetspliktOppgaveServiceTest.kt | 121 ++++++++++++- .../kotlin/integration/EksterneKlienter.kt | 9 + .../nav/etterlatte/brev/pdf/PDFGenerator.kt | 2 +- .../OpprettJournalfoerOgDistribuerRiver.kt | 6 +- .../aktivitetsplikt/OppgaveVurderingRoute.tsx | 3 +- .../brev/VurderingInfoBrev.tsx | 162 +++++++++++++++++- .../stegmeny/AktivitetspliktStegmeny.tsx | 6 +- .../vurdering/VurderAktivitet.tsx | 15 +- .../BrevAktivitetsplikt.tsx | 27 +-- .../components/person/brev/NyttBrevModal.tsx | 2 +- .../client/src/shared/api/aktivitetsplikt.ts | 22 ++- .../src/shared/types/Aktivitetsplikt.ts | 2 + .../brev/BrevParametereAutomatisk.kt | 8 +- .../no/nav/etterlatte/brev/BrevParametre.kt | 14 +- .../BarnepensjonInformasjonDoedsfall.kt | 2 +- ...fallMellomAttenOgTjueVedReformtidspunkt.kt | 2 +- .../BarnepensjonInformasjonMottattSoeknad.kt | 0 .../BarnepensjonInnhentingAvOpplysninger.kt | 0 .../{ => oms}/AktivitetspliktBrevdata.kt | 2 +- ...lingsstoenadAarligInntektsjusteringJobb.kt | 2 +- .../OmstillingsstoenadInformasjonDoedsfall.kt | 2 +- ...illingsstoenadInformasjonMottattSoeknad.kt | 0 ...tillingsstoenadInnhentingAvOpplysninger.kt | 0 32 files changed, 582 insertions(+), 48 deletions(-) create mode 100644 apps/etterlatte-behandling/src/main/resources/db/migration/V179__aktivitetsplikt_legg_til_brevid.sql rename {apps/etterlatte-brev-api => libs/etterlatte-brev-model}/src/main/kotlin/no/nav/etterlatte/brev/BrevParametre.kt (92%) rename libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/model/{ => bp}/BarnepensjonInformasjonDoedsfall.kt (94%) rename libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/model/{ => bp}/BarnepensjonInformasjonDoedsfallMellomAttenOgTjueVedReformtidspunkt.kt (94%) rename {apps/etterlatte-brev-api => libs/etterlatte-brev-model}/src/main/kotlin/no/nav/etterlatte/brev/model/bp/BarnepensjonInformasjonMottattSoeknad.kt (100%) rename {apps/etterlatte-brev-api => libs/etterlatte-brev-model}/src/main/kotlin/no/nav/etterlatte/brev/model/bp/BarnepensjonInnhentingAvOpplysninger.kt (100%) rename libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/model/{ => oms}/AktivitetspliktBrevdata.kt (95%) rename libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/model/{ => oms}/OmstillingsstoenadAarligInntektsjusteringJobb.kt (90%) rename libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/model/{ => oms}/OmstillingsstoenadInformasjonDoedsfall.kt (93%) rename {apps/etterlatte-brev-api => libs/etterlatte-brev-model}/src/main/kotlin/no/nav/etterlatte/brev/model/oms/OmstillingsstoenadInformasjonMottattSoeknad.kt (100%) rename {apps/etterlatte-brev-api => libs/etterlatte-brev-model}/src/main/kotlin/no/nav/etterlatte/brev/model/oms/OmstillingsstoenadInnhentingAvOpplysninger.kt (100%) 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 1320314463c..482a318f83c 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktBrevDao.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktBrevDao.kt @@ -1,6 +1,8 @@ package no.nav.etterlatte.behandling.aktivitetsplikt import no.nav.etterlatte.behandling.hendelse.getUUID +import no.nav.etterlatte.behandling.hendelse.setLong +import no.nav.etterlatte.brev.model.BrevID import no.nav.etterlatte.common.ConnectionAutoclosing import no.nav.etterlatte.libs.common.sak.SakId import no.nav.etterlatte.libs.database.singleOrNull @@ -15,7 +17,7 @@ class AktivitetspliktBrevDao( val stmt = prepareStatement( """ - SELECT oppgave_id, sak_id, utbetaling, redusert_etter_inntekt, skal_sende_brev from aktivitetsplikt_brevdata + SELECT oppgave_id, sak_id, utbetaling, redusert_etter_inntekt, skal_sende_brev, brev_id from aktivitetsplikt_brevdata WHERE oppgave_id = ? """.trimIndent(), ) @@ -24,8 +26,16 @@ class AktivitetspliktBrevDao( AktivitetspliktInformasjonBrevdata( oppgaveId = getUUID("oppgave_id"), sakid = SakId(getLong("sak_id")), - utbetaling = getBoolean("utbetaling"), - redusertEtterInntekt = getBoolean("redusert_etter_inntekt"), + brevId = if (getObject("brev_id") == null) null else getLong("brev_id"), + utbetaling = if (getObject("utbetaling") == null) null else getBoolean("utbetaling"), + redusertEtterInntekt = + if (getObject("redusert_etter_inntekt") == + null + ) { + null + } else { + getBoolean("redusert_etter_inntekt") + }, skalSendeBrev = getBoolean("skal_sende_brev"), ) } @@ -52,4 +62,23 @@ class AktivitetspliktBrevDao( stmt.executeUpdate() } } + + fun lagreBrevId( + oppgaveId: UUID, + brevId: BrevID, + ) = connectionAutoclosing.hentConnection { connection -> + with(connection) { + val stmt = + prepareStatement( + """ + UPDATE aktivitetsplikt_brevdata SET brev_id = ? + WHERE oppgave_id = ? + + """.trimIndent(), + ) + stmt.setLong(1, brevId) + 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 5906a21e4d1..f018a74d37c 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveService.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveService.kt @@ -1,13 +1,26 @@ package no.nav.etterlatte.behandling.aktivitetsplikt +import kotlinx.coroutines.runBlocking +import no.nav.etterlatte.behandling.BehandlingService +import no.nav.etterlatte.behandling.aktivitetsplikt.vurdering.AktivitetspliktAktivitetsgradType +import no.nav.etterlatte.behandling.klienter.BrevApiKlient +import no.nav.etterlatte.brev.BrevParametre +import no.nav.etterlatte.brev.model.BrevID +import no.nav.etterlatte.brev.model.oms.Aktivitetsgrad +import no.nav.etterlatte.brev.model.oms.NasjonalEllerUtland +import no.nav.etterlatte.libs.common.behandling.UtlandstilknytningType import no.nav.etterlatte.libs.common.feilhaandtering.GenerellIkkeFunnetException import no.nav.etterlatte.libs.common.feilhaandtering.UgyldigForespoerselException 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.toJson +import no.nav.etterlatte.libs.ktor.token.BrukerTokenInfo import no.nav.etterlatte.oppgave.OppgaveService import no.nav.etterlatte.sak.SakService +import org.slf4j.Logger +import org.slf4j.LoggerFactory import java.util.UUID class AktivitetspliktOppgaveService( @@ -15,7 +28,11 @@ class AktivitetspliktOppgaveService( private val oppgaveService: OppgaveService, private val sakService: SakService, private val aktivitetspliktBrevDao: AktivitetspliktBrevDao, + private val brevApiKlient: BrevApiKlient, + private val behandlingService: BehandlingService, ) { + private val logger: Logger = LoggerFactory.getLogger(this.javaClass.name) + fun hentVurderingForOppgave(oppgaveId: UUID): AktivitetspliktOppgaveVurdering { val oppgave = oppgaveService.hentOppgave(oppgaveId) val vurderingType = @@ -58,17 +75,101 @@ class AktivitetspliktOppgaveService( ): AktivitetspliktInformasjonBrevdata? { val oppgave = oppgaveService.hentOppgave(oppgaveId) val sak = sakService.finnSak(oppgave.sakId) ?: throw GenerellIkkeFunnetException() - aktivitetspliktBrevDao.lagreBrevdata(data.toDaoObjekt(oppgaveId, sakid = sak.id)) + aktivitetspliktBrevDao.lagreBrevdata(data.toDaoObjektBrevutfall(oppgaveId, sakid = sak.id)) return aktivitetspliktBrevDao.hentBrevdata(oppgaveId) } + + private fun mapAktivitetsgradstypeTilAktivtetsgrad(aktivitetsgrad: AktivitetspliktAktivitetsgradType): Aktivitetsgrad = + when (aktivitetsgrad) { + AktivitetspliktAktivitetsgradType.AKTIVITET_UNDER_50 -> Aktivitetsgrad.UNDER_50_PROSENT + AktivitetspliktAktivitetsgradType.AKTIVITET_OVER_50 -> Aktivitetsgrad.OVER_50_PROSENT + AktivitetspliktAktivitetsgradType.AKTIVITET_100 -> Aktivitetsgrad.AKKURAT_100_PROSENT + } + + private fun mapNasjonalEllerUtland(utland: UtlandstilknytningType): NasjonalEllerUtland = + when (utland) { + UtlandstilknytningType.NASJONAL -> NasjonalEllerUtland.NASJONAL + UtlandstilknytningType.UTLANDSTILSNITT -> NasjonalEllerUtland.UTLAND + UtlandstilknytningType.BOSATT_UTLAND -> NasjonalEllerUtland.UTLAND + } + + fun opprettBrevHvisKraveneErOppfyltOgDetIkkeFinnes( + oppgaveId: UUID, + brukerTokenInfo: BrukerTokenInfo, + ): BrevID { + val oppgave = oppgaveService.hentOppgave(oppgaveId) + val brevData = aktivitetspliktBrevDao.hentBrevdata(oppgaveId) ?: throw GenerellIkkeFunnetException() + if (brevData.brevId != null) { + return brevData.brevId + } + val skalOppretteBrev = skalOppretteBrev(brevData) + if (skalOppretteBrev) { + val vurderingForOppgave = aktivitetspliktService.hentVurderingForOppgave(oppgaveId) ?: throw GenerellIkkeFunnetException() + val sisteAktivtetsgrad = vurderingForOppgave.aktivitet.maxBy { it.fom } + val nasjonalEllerUtland = behandlingService.hentUtlandstilknytningForSak(oppgave.sakId) ?: throw GenerellIkkeFunnetException() + val brevParametreAktivitetsplikt10mnd = + BrevParametre.AktivitetspliktInformasjon10Mnd( + aktivitetsgrad = mapAktivitetsgradstypeTilAktivtetsgrad(sisteAktivtetsgrad.aktivitetsgrad), + utbetaling = brevData.utbetaling!!, + redusertEtterInntekt = brevData.redusertEtterInntekt!!, + nasjonalEllerUtland = mapNasjonalEllerUtland(nasjonalEllerUtland.type), + ) + val opprettetBrev = + runBlocking { + brevApiKlient.opprettSpesifiktBrev( + oppgave.sakId, + brevParametreAktivitetsplikt10mnd, + brukerTokenInfo = brukerTokenInfo, + ) + } + aktivitetspliktBrevDao.lagreBrevId(oppgaveId, opprettetBrev.id) + return opprettetBrev.id + } else { + throw BrevFeil("Kunne ikke opprette brev for $oppgaveId se data: ${brevData.toJson()}") + } + } + + private fun skalOppretteBrev(brevdata: AktivitetspliktInformasjonBrevdata): Boolean { + if (brevdata.skalSendeBrev) { + if (brevdata.brevId == null) { + val harUtbetaling = brevdata.utbetaling != null + val harReduserEtterInntekt = brevdata.redusertEtterInntekt != null + if (!harUtbetaling || !harReduserEtterInntekt) { + logger.info("Mangler brevdatainformasjon for oppgaveid ${brevdata.oppgaveId}") + throw ManglerBrevdata("Mangler brevdatainformasjon for oppgaveid ${brevdata.oppgaveId}") + } + return true + } else { + logger.info("Oppretter ikke brev for oppgaveid ${brevdata.oppgaveId} brevid finnes allerede, id: ${brevdata.brevId}") + return false + } + } else { + logger.info("Oppretter ikke brev for oppgaveid ${brevdata.oppgaveId} har ikke valgt å sende brev for oppgave") + return false + } + } } +class BrevFeil( + msg: String, +) : UgyldigForespoerselException( + code = "FEIL_I_BREV_FORESPØRSEL", + detail = msg, + ) + +class ManglerBrevdata( + msg: String, +) : UgyldigForespoerselException( + code = "MANGLER_BREVDATA", + detail = msg, + ) + data class AktivitetspliktInformasjonBrevdataRequest( val skalSendeBrev: Boolean, val utbetaling: Boolean? = null, val redusertEtterInntekt: Boolean? = null, ) { - fun toDaoObjekt( + fun toDaoObjektBrevutfall( oppgaveId: UUID, sakid: SakId, ): AktivitetspliktInformasjonBrevdata = @@ -84,6 +185,7 @@ data class AktivitetspliktInformasjonBrevdataRequest( data class AktivitetspliktInformasjonBrevdata( val oppgaveId: UUID, val sakid: SakId, + val brevId: Long? = null, val skalSendeBrev: Boolean, val utbetaling: Boolean? = null, val redusertEtterInntekt: Boolean? = null, 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 ca8cd17a487..4d275928653 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktRoute.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktRoute.kt @@ -15,6 +15,7 @@ import kotlinx.coroutines.runBlocking import no.nav.etterlatte.behandling.aktivitetsplikt.vurdering.LagreAktivitetspliktAktivitetsgrad import no.nav.etterlatte.behandling.aktivitetsplikt.vurdering.LagreAktivitetspliktUnntak import no.nav.etterlatte.behandling.domain.TilstandException +import no.nav.etterlatte.brev.model.BrevID import no.nav.etterlatte.inTransaction import no.nav.etterlatte.libs.common.behandling.OpprettAktivitetspliktOppfolging import no.nav.etterlatte.libs.common.behandling.OpprettOppgaveForAktivitetspliktVarigUnntakDto @@ -238,6 +239,13 @@ internal fun Route.aktivitetspliktRoutes( inTransaction { aktivitetspliktOppgaveService.lagreBrevdata(oppgaveId, brevdata) } call.respond(HttpStatusCode.OK) } + post("opprettbrev") { + val brevId = + inTransaction { + aktivitetspliktOppgaveService.opprettBrevHvisKraveneErOppfyltOgDetIkkeFinnes(oppgaveId = oppgaveId, brukerTokenInfo) + } + call.respond(BrevIdDto(brevId)) + } } route("/api/sak/{$SAKID_CALL_PARAMETER}/oppgave/{$OPPGAVEID_CALL_PARAMETER}/aktivitetsplikt/vurdering") { @@ -341,6 +349,10 @@ internal fun Route.aktivitetspliktRoutes( } } +data class BrevIdDto( + val brevId: BrevID? = null, +) + class VurderingIkkeFunnetException( sakId: SakId, referanse: UUID, diff --git a/apps/etterlatte-behandling/src/main/kotlin/behandling/hendelse/HendelseDao.kt b/apps/etterlatte-behandling/src/main/kotlin/behandling/hendelse/HendelseDao.kt index e576f5f75dd..77d8e738adc 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/behandling/hendelse/HendelseDao.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/hendelse/HendelseDao.kt @@ -283,4 +283,5 @@ fun PreparedStatement.setLong( fun ResultSet.getUUID(name: String) = getObject(name) as UUID +// TODO: denne går på resultsettet ikke kolonnen og vil mappe feil om spørringen har treff på andre kolonner i selecten fun ResultSet.getLongOrNull(name: String) = getLong(name).takeUnless { wasNull() } 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 35bda836be9..2f7c497855e 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/behandling/klienter/BrevApiKlient.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/klienter/BrevApiKlient.kt @@ -7,6 +7,7 @@ import com.github.michaelbull.result.mapError import com.typesafe.config.Config import io.ktor.client.HttpClient import no.nav.etterlatte.behandling.objectMapper +import no.nav.etterlatte.brev.BrevParametre import no.nav.etterlatte.brev.model.Brev import no.nav.etterlatte.libs.common.behandling.Klage import no.nav.etterlatte.libs.common.brev.BestillingsIdDto @@ -21,6 +22,12 @@ import no.nav.etterlatte.libs.ktor.token.BrukerTokenInfo import java.util.UUID interface BrevApiKlient { + suspend fun opprettSpesifiktBrev( + sakId: SakId, + brevParametre: BrevParametre, + brukerTokenInfo: BrukerTokenInfo, + ): Brev + suspend fun opprettKlageOversendelsesbrevISak( klageId: UUID, brukerTokenInfo: BrukerTokenInfo, @@ -104,6 +111,21 @@ class BrevApiKlientObo( private val clientId = config.getString("brev-api.client.id") private val resourceUrl = config.getString("brev-api.resource.url") + override suspend fun opprettSpesifiktBrev( + sakId: SakId, + brevParametre: BrevParametre, + brukerTokenInfo: BrukerTokenInfo, + ): Brev = + post( + url = "$resourceUrl/api/brev/sak/$sakId/spesifikk", + onSuccess = { resource -> + resource.response?.let { objectMapper.readValue(it.toJson()) } + ?: throw RuntimeException("Fikk ikke en riktig respons fra oppretting av brev") + }, + brukerTokenInfo = brukerTokenInfo, + postBody = brevParametre.toJson(), + ) + override suspend fun opprettKlageOversendelsesbrevISak( klageId: UUID, brukerTokenInfo: BrukerTokenInfo, diff --git a/apps/etterlatte-behandling/src/main/kotlin/behandling/tilbakekreving/TilbakekrevingDao.kt b/apps/etterlatte-behandling/src/main/kotlin/behandling/tilbakekreving/TilbakekrevingDao.kt index 9e458cbe048..99e04b5d8cf 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/behandling/tilbakekreving/TilbakekrevingDao.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/tilbakekreving/TilbakekrevingDao.kt @@ -330,4 +330,5 @@ fun PreparedStatement.setInt( value: Int?, ) = if (value == null) setNull(index, Types.BIGINT) else setInt(index, value) +// TODO: denne går på resultsettet ikke kolonnen og vil mappe feil om spørringen har treff på andre kolonner i selecten fun ResultSet.getIntOrNull(name: String) = getInt(name).takeUnless { wasNull() } diff --git a/apps/etterlatte-behandling/src/main/kotlin/config/ApplicationContext.kt b/apps/etterlatte-behandling/src/main/kotlin/config/ApplicationContext.kt index 0fed9e0abfc..fbb2e900a8f 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/config/ApplicationContext.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/config/ApplicationContext.kt @@ -605,6 +605,8 @@ internal class ApplicationContext( oppgaveService = oppgaveService, sakService = sakService, aktivitetspliktBrevDao = aktivitetspliktBrevDao, + brevApiKlient = brevApiKlient, + behandlingService = behandlingService, ) // Jobs diff --git a/apps/etterlatte-behandling/src/main/resources/db/migration/V179__aktivitetsplikt_legg_til_brevid.sql b/apps/etterlatte-behandling/src/main/resources/db/migration/V179__aktivitetsplikt_legg_til_brevid.sql new file mode 100644 index 00000000000..5af8af4cc0e --- /dev/null +++ b/apps/etterlatte-behandling/src/main/resources/db/migration/V179__aktivitetsplikt_legg_til_brevid.sql @@ -0,0 +1 @@ +ALTER TABLE aktivitetsplikt_brevdata ADD COLUMN brev_id BIGINT; \ No newline at end of file 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 c698b99dcdc..fe38ba02b29 100644 --- a/apps/etterlatte-behandling/src/test/kotlin/behandling/aktivitetsplikt/AktivitetspliktBrevDaoTest.kt +++ b/apps/etterlatte-behandling/src/test/kotlin/behandling/aktivitetsplikt/AktivitetspliktBrevDaoTest.kt @@ -48,4 +48,45 @@ class AktivitetspliktBrevDaoTest( dao.hentBrevdata(UUID.randomUUID()) shouldBe null } + + @Test + fun `Kan lagre hente og sette brevid`() { + val sak = sakSkrivDao.opprettSak("person", SakType.OMSTILLINGSSTOENAD, Enheter.defaultEnhet.enhetNr) + val oppgave = lagNyOppgave(sak).also { oppgaveDao.opprettOppgave(it) } + + val brevdata = + AktivitetspliktInformasjonBrevdata( + sakid = sak.id, + oppgaveId = oppgave.id, + skalSendeBrev = true, + utbetaling = false, + redusertEtterInntekt = false, + ) + + 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 + } + + @Test + fun `Skal fungere med nullable for booleans`() { + val sak = sakSkrivDao.opprettSak("person", SakType.OMSTILLINGSSTOENAD, Enheter.defaultEnhet.enhetNr) + val oppgave = lagNyOppgave(sak).also { oppgaveDao.opprettOppgave(it) } + + val brevdata = + AktivitetspliktInformasjonBrevdata( + sakid = sak.id, + oppgaveId = oppgave.id, + skalSendeBrev = false, + ) + + dao.lagreBrevdata(brevdata) + val lagretBrevdata = dao.hentBrevdata(oppgave.id) + lagretBrevdata shouldBe brevdata + } } 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 92d823dadd0..1cb326715aa 100644 --- a/apps/etterlatte-behandling/src/test/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveServiceTest.kt +++ b/apps/etterlatte-behandling/src/test/kotlin/behandling/aktivitetsplikt/AktivitetspliktOppgaveServiceTest.kt @@ -4,30 +4,41 @@ import io.mockk.clearAllMocks import io.mockk.every import io.mockk.mockk import io.mockk.verify +import no.nav.etterlatte.behandling.aktivitetsplikt.vurdering.AktivitetspliktAktivitetsgrad +import no.nav.etterlatte.behandling.aktivitetsplikt.vurdering.AktivitetspliktAktivitetsgradType import no.nav.etterlatte.behandling.randomSakId import no.nav.etterlatte.common.Enheter +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.OppgaveKilde import no.nav.etterlatte.libs.common.oppgave.OppgaveType 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.oppgave.OppgaveService import no.nav.etterlatte.oppgave.lagNyOppgave import no.nav.etterlatte.sak.SakService import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test import org.junit.jupiter.api.assertThrows +import java.time.LocalDate +import java.util.UUID class AktivitetspliktOppgaveServiceTest { private val aktivitetspliktService: AktivitetspliktService = mockk() private val oppgaveService: OppgaveService = mockk() private val sakService: SakService = mockk() + private val aktivitetspliktBrevDao: AktivitetspliktBrevDao = mockk() private val service = AktivitetspliktOppgaveService( aktivitetspliktService = aktivitetspliktService, oppgaveService = oppgaveService, sakService = sakService, + aktivitetspliktBrevDao, + mockk(relaxed = true), mockk(relaxed = true), ) @@ -57,6 +68,7 @@ class AktivitetspliktOppgaveServiceTest { every { oppgaveService.hentOppgave(oppgave.id) } returns oppgave every { aktivitetspliktService.hentVurderingForOppgave(oppgave.id) } returns null every { aktivitetspliktService.kopierInnTilOppgave(sak.id, oppgave.id) } returns null + every { aktivitetspliktBrevDao.hentBrevdata(oppgave.id) } returns null service.hentVurderingForOppgave(oppgave.id) @@ -74,7 +86,7 @@ class AktivitetspliktOppgaveServiceTest { every { oppgaveService.hentOppgave(oppgave.id) } returns oppgave every { aktivitetspliktService.hentVurderingForOppgave(oppgave.id) } returns null - + every { aktivitetspliktBrevDao.hentBrevdata(oppgave.id) } returns null service.hentVurderingForOppgave(oppgave.id) verify(exactly = 0) { aktivitetspliktService.kopierInnTilOppgave(sak.id, oppgave.id) } @@ -95,6 +107,7 @@ class AktivitetspliktOppgaveServiceTest { emptyList(), ) + every { aktivitetspliktBrevDao.hentBrevdata(oppgave.id) } returns null service.hentVurderingForOppgave(oppgave.id) verify(exactly = 0) { aktivitetspliktService.kopierInnTilOppgave(sak.id, oppgave.id) } } @@ -114,4 +127,110 @@ class AktivitetspliktOppgaveServiceTest { service.hentVurderingForOppgave(oppgave.id) } } + + @Test + fun `Skal ikke opprette brev da skal sende brev er false`() { + val simpleSaksbehandler = simpleSaksbehandler() + val oppgaveId = UUID.randomUUID() + val sakIdForOppgave = SakId(1L) + every { oppgaveService.hentOppgave(oppgaveId) } returns + mockk { + every { sakId } returns sakIdForOppgave + } + + val skalIkkeSendebrev = AktivitetspliktInformasjonBrevdata(oppgaveId, sakIdForOppgave, null, false) + every { aktivitetspliktBrevDao.hentBrevdata(oppgaveId) } returns skalIkkeSendebrev + assertThrows { + service.opprettBrevHvisKraveneErOppfyltOgDetIkkeFinnes(oppgaveId, simpleSaksbehandler) + } + verify(exactly = 0) { aktivitetspliktBrevDao.lagreBrevId(any(), any()) } + verify(exactly = 0) { aktivitetspliktService.hentVurderingForOppgave(oppgaveId) } + } + + @Test + fun `Skal ikke opprette brev da skal sende brev hvis mangler utbeatling`() { + val simpleSaksbehandler = simpleSaksbehandler() + val oppgaveId = UUID.randomUUID() + val sakIdForOppgave = SakId(1L) + every { oppgaveService.hentOppgave(oppgaveId) } returns + mockk { + every { sakId } returns sakIdForOppgave + } + + val skalIkkeSendebrev = AktivitetspliktInformasjonBrevdata(oppgaveId, sakIdForOppgave, null, true, redusertEtterInntekt = true) + every { aktivitetspliktBrevDao.hentBrevdata(oppgaveId) } returns skalIkkeSendebrev + assertThrows { service.opprettBrevHvisKraveneErOppfyltOgDetIkkeFinnes(oppgaveId, simpleSaksbehandler) } + verify(exactly = 0) { aktivitetspliktBrevDao.lagreBrevId(any(), any()) } + verify(exactly = 0) { aktivitetspliktService.hentVurderingForOppgave(oppgaveId) } + } + + @Test + fun `Skal ikke opprette brev da skal sende brev hvis mangler redusertEtterInntekt`() { + val simpleSaksbehandler = simpleSaksbehandler() + val oppgaveId = UUID.randomUUID() + val sakIdForOppgave = SakId(1L) + every { oppgaveService.hentOppgave(oppgaveId) } returns + mockk { + every { sakId } returns sakIdForOppgave + } + + val skalIkkeSendebrev = AktivitetspliktInformasjonBrevdata(oppgaveId, sakIdForOppgave, null, true, utbetaling = true) + every { aktivitetspliktBrevDao.hentBrevdata(oppgaveId) } returns skalIkkeSendebrev + assertThrows { service.opprettBrevHvisKraveneErOppfyltOgDetIkkeFinnes(oppgaveId, simpleSaksbehandler) } + } + + @Test + fun `Skal ikke opprette brev hvis brevid finnes`() { + val simpleSaksbehandler = simpleSaksbehandler() + val oppgaveId = UUID.randomUUID() + val sakIdForOppgave = SakId(1L) + every { oppgaveService.hentOppgave(oppgaveId) } returns + mockk { + every { sakId } returns sakIdForOppgave + } + + val brevIdfinnes = AktivitetspliktInformasjonBrevdata(oppgaveId, sakIdForOppgave, 2L, true) + every { aktivitetspliktBrevDao.hentBrevdata(oppgaveId) } returns brevIdfinnes + service.opprettBrevHvisKraveneErOppfyltOgDetIkkeFinnes(oppgaveId, simpleSaksbehandler) + verify(exactly = 0) { aktivitetspliktBrevDao.lagreBrevId(any(), any()) } + verify(exactly = 0) { aktivitetspliktService.hentVurderingForOppgave(oppgaveId) } + } + + @Test + fun `Skal opprette brev hvis skalsendebrev true`() { + val simpleSaksbehandler = simpleSaksbehandler() + val oppgaveId = UUID.randomUUID() + val sakIdForOppgave = SakId(1L) + every { oppgaveService.hentOppgave(oppgaveId) } returns + mockk { + every { sakId } returns sakIdForOppgave + } + + val kilde = Grunnlagsopplysning.Saksbehandler("Z123456", Tidspunkt.now()) + val aksgrad = + AktivitetspliktAktivitetsgrad( + id = UUID.randomUUID(), + sakId = sakIdForOppgave, + behandlingId = UUID.randomUUID(), + oppgaveId = oppgaveId, + aktivitetsgrad = AktivitetspliktAktivitetsgradType.AKTIVITET_UNDER_50, + fom = LocalDate.now(), + tom = null, + opprettet = kilde, + endret = kilde, + beskrivelse = "Beskrivelse", + ) + every { aktivitetspliktService.hentVurderingForOppgave(oppgaveId) } returns + mockk { + every { aktivitet } returns listOf(aksgrad) + } + every { aktivitetspliktBrevDao.lagreBrevId(oppgaveId, any()) } returns 1 + val skalSendeBrev = + AktivitetspliktInformasjonBrevdata(oppgaveId, sakIdForOppgave, null, true, utbetaling = true, redusertEtterInntekt = true) + every { aktivitetspliktBrevDao.hentBrevdata(oppgaveId) } returns skalSendeBrev + + service.opprettBrevHvisKraveneErOppfyltOgDetIkkeFinnes(oppgaveId, simpleSaksbehandler) + verify(exactly = 1) { aktivitetspliktBrevDao.lagreBrevId(any(), any()) } + verify(exactly = 1) { aktivitetspliktService.hentVurderingForOppgave(oppgaveId) } + } } diff --git a/apps/etterlatte-behandling/src/test/kotlin/integration/EksterneKlienter.kt b/apps/etterlatte-behandling/src/test/kotlin/integration/EksterneKlienter.kt index 9890641e04f..413e4d00776 100644 --- a/apps/etterlatte-behandling/src/test/kotlin/integration/EksterneKlienter.kt +++ b/apps/etterlatte-behandling/src/test/kotlin/integration/EksterneKlienter.kt @@ -17,6 +17,7 @@ import no.nav.etterlatte.behandling.klienter.TilbakekrevingKlient import no.nav.etterlatte.behandling.klienter.VedtakKlient import no.nav.etterlatte.behandling.randomSakId import no.nav.etterlatte.behandling.sakId1 +import no.nav.etterlatte.brev.BrevParametre import no.nav.etterlatte.brev.Brevkoder import no.nav.etterlatte.brev.Brevtype import no.nav.etterlatte.brev.model.Adresse @@ -336,6 +337,14 @@ class TilbakekrevingKlientTest : TilbakekrevingKlient { class BrevApiKlientTest : BrevApiKlient { private var brevId = 1L + override suspend fun opprettSpesifiktBrev( + sakId: SakId, + brevParametre: BrevParametre, + brukerTokenInfo: BrukerTokenInfo, + ): Brev { + TODO("Not yet implemented") + } + override suspend fun opprettKlageOversendelsesbrevISak( klageId: UUID, brukerTokenInfo: BrukerTokenInfo, diff --git a/apps/etterlatte-brev-api/src/main/kotlin/no/nav/etterlatte/brev/pdf/PDFGenerator.kt b/apps/etterlatte-brev-api/src/main/kotlin/no/nav/etterlatte/brev/pdf/PDFGenerator.kt index b0da0f0ac7c..32265af5a2a 100644 --- a/apps/etterlatte-brev-api/src/main/kotlin/no/nav/etterlatte/brev/pdf/PDFGenerator.kt +++ b/apps/etterlatte-brev-api/src/main/kotlin/no/nav/etterlatte/brev/pdf/PDFGenerator.kt @@ -21,8 +21,8 @@ import no.nav.etterlatte.brev.model.BrevID import no.nav.etterlatte.brev.model.BrevProsessType import no.nav.etterlatte.brev.model.BrevkodeRequest import no.nav.etterlatte.brev.model.InnholdMedVedlegg -import no.nav.etterlatte.brev.model.OmstillingsstoenadAarligInntektsjusteringJobb import no.nav.etterlatte.brev.model.Pdf +import no.nav.etterlatte.brev.model.oms.OmstillingsstoenadAarligInntektsjusteringJobb import no.nav.etterlatte.brev.vedtaksbrev.UgyldigMottakerKanIkkeFerdigstilles import no.nav.etterlatte.libs.common.Enhetsnummer import no.nav.etterlatte.libs.common.logging.sikkerlogger diff --git a/apps/etterlatte-brev-kafka/src/main/kotlin/no/nav/etterlatte/rivers/OpprettJournalfoerOgDistribuerRiver.kt b/apps/etterlatte-brev-kafka/src/main/kotlin/no/nav/etterlatte/rivers/OpprettJournalfoerOgDistribuerRiver.kt index 8d45744b447..60e0d655e86 100644 --- a/apps/etterlatte-brev-kafka/src/main/kotlin/no/nav/etterlatte/rivers/OpprettJournalfoerOgDistribuerRiver.kt +++ b/apps/etterlatte-brev-kafka/src/main/kotlin/no/nav/etterlatte/rivers/OpprettJournalfoerOgDistribuerRiver.kt @@ -13,11 +13,11 @@ import no.nav.etterlatte.brev.Brevkoder import no.nav.etterlatte.brev.SaksbehandlerOgAttestant import no.nav.etterlatte.brev.behandling.Avdoed import no.nav.etterlatte.brev.behandling.mapAvdoede -import no.nav.etterlatte.brev.model.BarnepensjonInformasjonDoedsfall -import no.nav.etterlatte.brev.model.BarnepensjonInformasjonDoedsfallMellomAttenOgTjueVedReformtidspunkt import no.nav.etterlatte.brev.model.BrevDistribusjonResponse -import no.nav.etterlatte.brev.model.OmstillingsstoenadInformasjonDoedsfall import no.nav.etterlatte.brev.model.OpprettJournalfoerOgDistribuerRequest +import no.nav.etterlatte.brev.model.bp.BarnepensjonInformasjonDoedsfall +import no.nav.etterlatte.brev.model.bp.BarnepensjonInformasjonDoedsfallMellomAttenOgTjueVedReformtidspunkt +import no.nav.etterlatte.brev.model.oms.OmstillingsstoenadInformasjonDoedsfall import no.nav.etterlatte.klienter.BrevapiKlient import no.nav.etterlatte.klienter.GrunnlagKlient import no.nav.etterlatte.libs.common.feilhaandtering.InternfeilException 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 6554ed0fc17..6c8786dcf4c 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/OppgaveVurderingRoute.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/OppgaveVurderingRoute.tsx @@ -1,6 +1,6 @@ import { StatusBar } from '~shared/statusbar/Statusbar' import { GridContainer, MainContent } from '~shared/styled' -import { Navigate, Route, Routes } from 'react-router-dom' +import { Route, Routes } from 'react-router-dom' import React, { createContext, useContext } from 'react' import { AktivitetspliktSidemeny } from '~components/aktivitetsplikt/sidemeny/AktivitetspliktSidemeny' import { @@ -27,7 +27,6 @@ export function OppgaveVurderingRoute(props: { vurderingOgOppgave: Aktivitetspli } /> } /> - } /> diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/brev/VurderingInfoBrev.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/brev/VurderingInfoBrev.tsx index 7ba200d3b55..d83c1a84ff8 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/brev/VurderingInfoBrev.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/aktivitetsplikt/brev/VurderingInfoBrev.tsx @@ -1,9 +1,169 @@ -import { Box, Heading } from '@navikt/ds-react' +import { Alert, Box, Heading, VStack } 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 { hentBrev } from '~shared/api/brev' +import { BrevProsessType, BrevStatus } from '~shared/types/Brev' +import { isFailure, mapApiResult } from '~shared/api/apiUtils' +import Spinner from '~shared/Spinner' +import { ApiErrorAlert } from '~ErrorBoundary' +import { Column, GridContainer } from '~shared/styled' +import BrevTittel from '~components/person/brev/tittel/BrevTittel' +import BrevSpraak from '~components/person/brev/spraak/BrevSpraak' +import { BrevMottakerWrapper } from '~components/person/brev/mottaker/BrevMottakerWrapper' +import ForhaandsvisningBrev from '~components/behandling/brev/ForhaandsvisningBrev' +import RedigerbartBrev from '~components/behandling/brev/RedigerbartBrev' +import BrevStatusPanel from '~components/person/brev/BrevStatusPanel' +import NyttBrevHandlingerPanel from '~components/person/brev/NyttBrevHandlingerPanel' +import styled from 'styled-components' +import { isPending } from '@reduxjs/toolkit' +import { opprettAktivitetspliktsbrev } from '~shared/api/aktivitetsplikt' export function VurderingInfoBrev() { + useSidetittel('Aktivitetsplikt brev') + + const { oppgave, aktivtetspliktbrevdata } = useAktivitetspliktOppgaveVurdering() + const [opprettBrevStatus, opprettBrevApiCall] = useApiCall(opprettAktivitetspliktsbrev) + + //const redigerbar = erOppgaveRedigerbar(oppgave.status) + const brevdataFinnes = !!aktivtetspliktbrevdata + + const [brevId, setBrevid] = useState(aktivtetspliktbrevdata?.brevId) + const [brevErKlart, setBrevErKlart] = useState(false) + /*TODO: kalle backend her og sjekke om + 1. brevid finnes + finnes ikke -> sjekk om oppgave kan redigeres og om det var valgt at brev skulle sendes JA/NEI + finnes -> vise brev .. fikset brevkomponenten det automatisk? + Bad state altså at brevid ikke finnes og sb ikke har tatt stilling til brevvalg må reroutes tilkbake til vurderingssiden + hvis bad state her ha med tilbakeknapp + + TODO: håndtere sette oppgave til ferdigstilt på onclick lagre brev + */ + + 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 { + //Skal ikke sende brev for denne oppgave, brevløs oppgave, bare å vise skal ikke ha brev blabla + setBrevErKlart(false) + } + } else { + //Håndtere manglende brevdata.... vise generell mangler utfylling av brevdata feil + } + }, []) + return ( Vurdering infobrev her + {brevdataFinnes ? ( + <> + {aktivtetspliktbrevdata?.skalSendeBrev ? ( + <> + {isPending(opprettBrevStatus) && } + {isFailure(opprettBrevStatus) && ( + Kunne ikke opprette brev {opprettBrevStatus.error.detail} + )} + {brevErKlart && brevId && } + + ) : ( + <> +
Brev skal ikke sendes for denne oppgaven
+ + )} + + ) : ( + <> + + Brevdata finnes ikke for denne oppgaven, gå tilbake til vurderingssiden for å endre dette + + + )}
) } + +const PanelWrapper = styled.div` + height: 100%; + width: 100%; + max-height: 955px; +` + +function Aktivitetspliktbrev({ brevId, sakId }: { brevId: number; sakId: number }) { + const [kanRedigeres, setKanRedigeres] = useState(false) + const [tilbakestilt, setTilbakestilt] = useState(false) + + const [brevStatus, apiHentBrev] = useApiCall(hentBrev) + + useEffect(() => { + apiHentBrev({ brevId: Number(brevId), sakId: Number(sakId) }, (brev) => { + if ([BrevStatus.OPPRETTET, BrevStatus.OPPDATERT].includes(brev.status)) { + setKanRedigeres(true) + } else { + setKanRedigeres(false) + } + }) + }, [brevId, sakId, tilbakestilt]) + + return ( + <> + {mapApiResult( + brevStatus, + , + () => ( + Feil oppsto ved henting av brev + ), + (brev) => ( + + + + + + + + + + + + {brev.prosessType === BrevProsessType.OPPLASTET_PDF || brev.status === BrevStatus.DISTRIBUERT ? ( + + + + ) : ( + setTilbakestilt(true)} + /> + )} + + + + + + Handlinger + + { + // TODO sett oppgave til ferdigstilt her, hele denne skal flyttes til backend som kan håndtere det. + }} + /> + + + + ) + )} + + ) +} 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 980178f4e2e..ae554ea3be7 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 @@ -2,6 +2,7 @@ import { StegMenyBox } from '~components/behandling/StegMeny/stegmeny' import { HStack } from '@navikt/ds-react' import React from 'react' import { AktivitetNavLenke } from '~components/aktivitetsplikt/stegmeny/AktivitetspliktNavLenke' +import { useAktivitetspliktOppgaveVurdering } from '~components/aktivitetsplikt/OppgaveVurderingRoute' export enum AktivitetspliktSteg { VURDERING = 'vurdering', @@ -9,7 +10,10 @@ export enum AktivitetspliktSteg { } export function AktivitetspliktStegmeny() { - const skalBrevVises = true // TODO: logikk for om man skal sende brev + const { aktivtetspliktbrevdata } = useAktivitetspliktOppgaveVurdering() + + const skalBrevVises = + (!!aktivtetspliktbrevdata && !!aktivtetspliktbrevdata.brevId) || !!aktivtetspliktbrevdata?.skalSendeBrev //Implisitt at utbetaling og redusertEtterInntekt er satt 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 a62efd33950..60e062fdd93 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,4 +1,4 @@ -import { Box, Heading, VStack } from '@navikt/ds-react' +import { Box, Button, Heading, VStack } from '@navikt/ds-react' import React, { useEffect } from 'react' import { Vurderinger } from '~components/aktivitetsplikt/vurdering/Vurderinger' import { mapResult } from '~shared/api/apiUtils' @@ -9,10 +9,14 @@ import { useApiCall } from '~shared/hooks/useApiCall' 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' export function VurderAktivitet() { const oppgave = useAktivitetspliktOppgaveVurdering() const [familieOpplysningerResult, familieOpplysningerFetch] = useApiCall(hentFamilieOpplysninger) + const navigate = useNavigate() useEffect(() => { familieOpplysningerFetch({ ident: oppgave.sak.ident, sakType: oppgave.sak.sakType }) }, []) @@ -34,6 +38,15 @@ export function VurderAktivitet() { ), })} + + + 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/BrevAktivitetsplikt.tsx index be1c584c37b..10fc220c508 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/BrevAktivitetsplikt.tsx @@ -5,7 +5,7 @@ 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 { IBrevAktivitetspliktDto, lagreAktivitetspliktBrevdata } from '~shared/api/aktivitetsplikt' +import { IBrevAktivitetspliktRequest, lagreAktivitetspliktBrevdata } from '~shared/api/aktivitetsplikt' import { ControlledRadioGruppe } from '~shared/components/radioGruppe/ControlledRadioGruppe' import { isFailureHandler } from '~shared/api/IsFailureHandler' import { PencilIcon } from '@navikt/aksel-icons' @@ -19,22 +19,21 @@ interface IBrevAktivitetsplikt { redusertEtterInntekt: JaNei } -function mapToDto(brevdata: IBrevAktivitetsplikt): IBrevAktivitetspliktDto { +function mapToDto(brevdata: IBrevAktivitetsplikt): IBrevAktivitetspliktRequest { return { skalSendeBrev: brevdata.skalSendeBrev === JaNei.JA, - utbetaling: brevdata.utbetaling === JaNei.JA, - redusertEtterInntekt: brevdata.redusertEtterInntekt === JaNei.JA, + utbetaling: brevdata.utbetaling ? brevdata.utbetaling === JaNei.JA : undefined, + redusertEtterInntekt: brevdata.redusertEtterInntekt ? brevdata.redusertEtterInntekt === JaNei.JA : undefined, } } export const BrevAktivitetsplikt = () => { const { oppgave, aktivtetspliktbrevdata } = useAktivitetspliktOppgaveVurdering() - //Hvis jeg lagrer og kommer inn i ikke redigervisning så er aktivtetspliktbrevdata ikke hentet på nytt const { handleSubmit, watch, control, resetField } = useForm({}) const [lagrebrevdataStatus, lagrebrevdata, tilbakestillApiResult] = useApiCall(lagreAktivitetspliktBrevdata) const [redigeres, setRedigeres] = useState(!aktivtetspliktbrevdata) - const [brevdata, oppdaterBrevdata] = useState(aktivtetspliktbrevdata) + const [brevdata, oppdaterBrevdata] = useState(aktivtetspliktbrevdata) const lagreBrevutfall = (data: IBrevAktivitetsplikt) => { const brevdatamappedToDo = mapToDto(data) @@ -127,12 +126,16 @@ export const BrevAktivitetsplikt = () => {
{!!brevdata && ( - - - + + {brevdata.skalSendeBrev && ( + <> + + + + )} )}
diff --git a/apps/etterlatte-saksbehandling-ui/client/src/components/person/brev/NyttBrevModal.tsx b/apps/etterlatte-saksbehandling-ui/client/src/components/person/brev/NyttBrevModal.tsx index afd6c8956cd..3e329035a63 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/components/person/brev/NyttBrevModal.tsx +++ b/apps/etterlatte-saksbehandling-ui/client/src/components/person/brev/NyttBrevModal.tsx @@ -341,7 +341,7 @@ type FilledFormData = { borINorgeEllerIkkeAvtaleland?: JaNei } -enum NasjonalEllerUtland { +export enum NasjonalEllerUtland { NASJONAL = 'NASJONAL', UTLAND = 'UTLAND', } 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 d7a17951f29..ff2d2e2af49 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/shared/api/aktivitetsplikt.ts +++ b/apps/etterlatte-saksbehandling-ui/client/src/shared/api/aktivitetsplikt.ts @@ -105,14 +105,28 @@ export const hentAktivitetspliktOppgaveVurdering = async (args: { oppgaveId: string }): Promise> => apiClient.get(`/aktivitetsplikt/oppgave/${args.oppgaveId}`) -export interface IBrevAktivitetspliktDto { +export interface IBrevAktivitetspliktRequest { skalSendeBrev: boolean - utbetaling: boolean - redusertEtterInntekt: boolean + utbetaling?: boolean + redusertEtterInntekt?: boolean } export const lagreAktivitetspliktBrevdata = async (args: { oppgaveId: string - brevdata: IBrevAktivitetspliktDto + brevdata: IBrevAktivitetspliktRequest }): Promise> => apiClient.post(`/aktivitetsplikt/oppgave/${args.oppgaveId}/brevdata`, { ...args.brevdata }) + +export const opprettAktivitetspliktsbrev = async (args: { oppgaveId: string }): Promise> => + apiClient.post(`/aktivitetsplikt/oppgave/${args.oppgaveId}/opprettbrev`, {}) + +interface BrevId { + brevId: number +} + +export interface IBrevAktivitetspliktDto { + brevId?: number + skalSendeBrev: boolean + utbetaling?: boolean + redusertEtterInntekt?: boolean +} 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 fbbf5d270a5..5460e894ce9 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/shared/types/Aktivitetsplikt.ts +++ b/apps/etterlatte-saksbehandling-ui/client/src/shared/types/Aktivitetsplikt.ts @@ -48,6 +48,8 @@ export enum AktivitetspliktVurderingType { AKTIVITET_100 = 'AKTIVITET_100', } +//enum class Aktivitetsgrad { IKKE_I_AKTIVITET, UNDER_50_PROSENT, OVER_50_PROSENT, UNDER_100_PROSENT, AKKURAT_100_PROSENT } + export const tekstAktivitetspliktVurderingType: Record = { AKTIVITET_UNDER_50: 'Under 50%', AKTIVITET_OVER_50: '50% - 100%', diff --git a/libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/BrevParametereAutomatisk.kt b/libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/BrevParametereAutomatisk.kt index 223959532c7..d13b92ecda5 100644 --- a/libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/BrevParametereAutomatisk.kt +++ b/libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/BrevParametereAutomatisk.kt @@ -2,10 +2,10 @@ package no.nav.etterlatte.brev import com.fasterxml.jackson.annotation.JsonTypeInfo import com.fasterxml.jackson.annotation.JsonTypeName -import no.nav.etterlatte.brev.model.BarnepensjonInformasjonDoedsfall -import no.nav.etterlatte.brev.model.BarnepensjonInformasjonDoedsfallMellomAttenOgTjueVedReformtidspunkt -import no.nav.etterlatte.brev.model.OmstillingsstoenadAarligInntektsjusteringJobb -import no.nav.etterlatte.brev.model.OmstillingsstoenadInformasjonDoedsfall +import no.nav.etterlatte.brev.model.bp.BarnepensjonInformasjonDoedsfall +import no.nav.etterlatte.brev.model.bp.BarnepensjonInformasjonDoedsfallMellomAttenOgTjueVedReformtidspunkt +import no.nav.etterlatte.brev.model.oms.OmstillingsstoenadAarligInntektsjusteringJobb +import no.nav.etterlatte.brev.model.oms.OmstillingsstoenadInformasjonDoedsfall @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type") sealed class BrevParametereAutomatisk { diff --git a/apps/etterlatte-brev-api/src/main/kotlin/no/nav/etterlatte/brev/BrevParametre.kt b/libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/BrevParametre.kt similarity index 92% rename from apps/etterlatte-brev-api/src/main/kotlin/no/nav/etterlatte/brev/BrevParametre.kt rename to libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/BrevParametre.kt index 9644b1baff9..236b9fba920 100644 --- a/apps/etterlatte-brev-api/src/main/kotlin/no/nav/etterlatte/brev/BrevParametre.kt +++ b/libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/BrevParametre.kt @@ -2,15 +2,15 @@ package no.nav.etterlatte.brev import com.fasterxml.jackson.annotation.JsonTypeInfo import com.fasterxml.jackson.annotation.JsonTypeName -import no.nav.etterlatte.brev.model.Aktivitetsgrad -import no.nav.etterlatte.brev.model.AktivitetspliktInformasjon10mndBrevdata -import no.nav.etterlatte.brev.model.AktivitetspliktInformasjon4MndBrevdata -import no.nav.etterlatte.brev.model.AktivitetspliktInformasjon6MndBrevdata -import no.nav.etterlatte.brev.model.BarnepensjonInformasjonDoedsfall -import no.nav.etterlatte.brev.model.NasjonalEllerUtland -import no.nav.etterlatte.brev.model.OmstillingsstoenadInformasjonDoedsfall +import no.nav.etterlatte.brev.model.bp.BarnepensjonInformasjonDoedsfall import no.nav.etterlatte.brev.model.bp.BarnepensjonInformasjonMottattSoeknad import no.nav.etterlatte.brev.model.bp.BarnepensjonInnhentingAvOpplysninger +import no.nav.etterlatte.brev.model.oms.Aktivitetsgrad +import no.nav.etterlatte.brev.model.oms.AktivitetspliktInformasjon10mndBrevdata +import no.nav.etterlatte.brev.model.oms.AktivitetspliktInformasjon4MndBrevdata +import no.nav.etterlatte.brev.model.oms.AktivitetspliktInformasjon6MndBrevdata +import no.nav.etterlatte.brev.model.oms.NasjonalEllerUtland +import no.nav.etterlatte.brev.model.oms.OmstillingsstoenadInformasjonDoedsfall import no.nav.etterlatte.brev.model.oms.OmstillingsstoenadInformasjonMottattSoeknad import no.nav.etterlatte.brev.model.oms.OmstillingsstoenadInnhentingAvOpplysninger import java.time.LocalDate diff --git a/libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/model/BarnepensjonInformasjonDoedsfall.kt b/libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/model/bp/BarnepensjonInformasjonDoedsfall.kt similarity index 94% rename from libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/model/BarnepensjonInformasjonDoedsfall.kt rename to libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/model/bp/BarnepensjonInformasjonDoedsfall.kt index cedf70aed39..de8b6b1bc12 100644 --- a/libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/model/BarnepensjonInformasjonDoedsfall.kt +++ b/libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/model/bp/BarnepensjonInformasjonDoedsfall.kt @@ -1,4 +1,4 @@ -package no.nav.etterlatte.brev.model +package no.nav.etterlatte.brev.model.bp import no.nav.etterlatte.brev.BrevDataRedigerbar import no.nav.etterlatte.brev.behandling.Avdoed diff --git a/libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/model/BarnepensjonInformasjonDoedsfallMellomAttenOgTjueVedReformtidspunkt.kt b/libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/model/bp/BarnepensjonInformasjonDoedsfallMellomAttenOgTjueVedReformtidspunkt.kt similarity index 94% rename from libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/model/BarnepensjonInformasjonDoedsfallMellomAttenOgTjueVedReformtidspunkt.kt rename to libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/model/bp/BarnepensjonInformasjonDoedsfallMellomAttenOgTjueVedReformtidspunkt.kt index fddac7c79df..07269329f7f 100644 --- a/libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/model/BarnepensjonInformasjonDoedsfallMellomAttenOgTjueVedReformtidspunkt.kt +++ b/libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/model/bp/BarnepensjonInformasjonDoedsfallMellomAttenOgTjueVedReformtidspunkt.kt @@ -1,4 +1,4 @@ -package no.nav.etterlatte.brev.model +package no.nav.etterlatte.brev.model.bp import no.nav.etterlatte.brev.BrevDataRedigerbar import no.nav.etterlatte.brev.behandling.Avdoed diff --git a/apps/etterlatte-brev-api/src/main/kotlin/no/nav/etterlatte/brev/model/bp/BarnepensjonInformasjonMottattSoeknad.kt b/libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/model/bp/BarnepensjonInformasjonMottattSoeknad.kt similarity index 100% rename from apps/etterlatte-brev-api/src/main/kotlin/no/nav/etterlatte/brev/model/bp/BarnepensjonInformasjonMottattSoeknad.kt rename to libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/model/bp/BarnepensjonInformasjonMottattSoeknad.kt diff --git a/apps/etterlatte-brev-api/src/main/kotlin/no/nav/etterlatte/brev/model/bp/BarnepensjonInnhentingAvOpplysninger.kt b/libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/model/bp/BarnepensjonInnhentingAvOpplysninger.kt similarity index 100% rename from apps/etterlatte-brev-api/src/main/kotlin/no/nav/etterlatte/brev/model/bp/BarnepensjonInnhentingAvOpplysninger.kt rename to libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/model/bp/BarnepensjonInnhentingAvOpplysninger.kt diff --git a/libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/model/AktivitetspliktBrevdata.kt b/libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/model/oms/AktivitetspliktBrevdata.kt similarity index 95% rename from libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/model/AktivitetspliktBrevdata.kt rename to libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/model/oms/AktivitetspliktBrevdata.kt index d4b4fa52107..e8a7e796984 100644 --- a/libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/model/AktivitetspliktBrevdata.kt +++ b/libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/model/oms/AktivitetspliktBrevdata.kt @@ -1,4 +1,4 @@ -package no.nav.etterlatte.brev.model +package no.nav.etterlatte.brev.model.oms import no.nav.etterlatte.brev.BrevDataRedigerbar diff --git a/libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/model/OmstillingsstoenadAarligInntektsjusteringJobb.kt b/libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/model/oms/OmstillingsstoenadAarligInntektsjusteringJobb.kt similarity index 90% rename from libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/model/OmstillingsstoenadAarligInntektsjusteringJobb.kt rename to libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/model/oms/OmstillingsstoenadAarligInntektsjusteringJobb.kt index 8ff6bed98ef..1f1de8ff007 100644 --- a/libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/model/OmstillingsstoenadAarligInntektsjusteringJobb.kt +++ b/libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/model/oms/OmstillingsstoenadAarligInntektsjusteringJobb.kt @@ -1,4 +1,4 @@ -package no.nav.etterlatte.brev.model +package no.nav.etterlatte.brev.model.oms import no.nav.etterlatte.brev.BrevDataRedigerbar diff --git a/libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/model/OmstillingsstoenadInformasjonDoedsfall.kt b/libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/model/oms/OmstillingsstoenadInformasjonDoedsfall.kt similarity index 93% rename from libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/model/OmstillingsstoenadInformasjonDoedsfall.kt rename to libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/model/oms/OmstillingsstoenadInformasjonDoedsfall.kt index d1160c75d3b..bf932dfce4c 100644 --- a/libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/model/OmstillingsstoenadInformasjonDoedsfall.kt +++ b/libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/model/oms/OmstillingsstoenadInformasjonDoedsfall.kt @@ -1,4 +1,4 @@ -package no.nav.etterlatte.brev.model +package no.nav.etterlatte.brev.model.oms import no.nav.etterlatte.brev.BrevDataRedigerbar import no.nav.etterlatte.brev.behandling.Avdoed diff --git a/apps/etterlatte-brev-api/src/main/kotlin/no/nav/etterlatte/brev/model/oms/OmstillingsstoenadInformasjonMottattSoeknad.kt b/libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/model/oms/OmstillingsstoenadInformasjonMottattSoeknad.kt similarity index 100% rename from apps/etterlatte-brev-api/src/main/kotlin/no/nav/etterlatte/brev/model/oms/OmstillingsstoenadInformasjonMottattSoeknad.kt rename to libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/model/oms/OmstillingsstoenadInformasjonMottattSoeknad.kt diff --git a/apps/etterlatte-brev-api/src/main/kotlin/no/nav/etterlatte/brev/model/oms/OmstillingsstoenadInnhentingAvOpplysninger.kt b/libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/model/oms/OmstillingsstoenadInnhentingAvOpplysninger.kt similarity index 100% rename from apps/etterlatte-brev-api/src/main/kotlin/no/nav/etterlatte/brev/model/oms/OmstillingsstoenadInnhentingAvOpplysninger.kt rename to libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/model/oms/OmstillingsstoenadInnhentingAvOpplysninger.kt