diff --git a/apps/etterlatte-brev-api/src/main/kotlin/no/nav/etterlatte/brev/BrevRoute.kt b/apps/etterlatte-brev-api/src/main/kotlin/no/nav/etterlatte/brev/BrevRoute.kt index 83f71516ad5..44b3462e5cb 100644 --- a/apps/etterlatte-brev-api/src/main/kotlin/no/nav/etterlatte/brev/BrevRoute.kt +++ b/apps/etterlatte-brev-api/src/main/kotlin/no/nav/etterlatte/brev/BrevRoute.kt @@ -21,7 +21,6 @@ import no.nav.etterlatte.brev.hentinformasjon.grunnlag.GrunnlagService import no.nav.etterlatte.brev.model.BrevInnholdVedlegg import no.nav.etterlatte.brev.model.FerdigstillJournalFoerOgDistribuerOpprettetBrev import no.nav.etterlatte.brev.model.Mottaker -import no.nav.etterlatte.brev.model.OpprettBrevRequest import no.nav.etterlatte.brev.model.OpprettJournalfoerOgDistribuerRequest import no.nav.etterlatte.brev.model.Spraak import no.nav.etterlatte.brev.pdf.PDFService @@ -285,16 +284,6 @@ fun Route.brevRoute( } } - post("opprett-brev") { - kunSystembruker { systembruker -> - withSakId(tilgangssjekker, skrivetilgang = true) { - val req = call.receive() - val brevErDistribuert = service.opprettBrev(systembruker, req) - call.respond(brevErDistribuert) - } - } - } - post("ferdigstill-journalfoer-og-distribuer") { kunSaksbehandler { sb -> val req = call.receive() diff --git a/apps/etterlatte-brev-api/src/main/kotlin/no/nav/etterlatte/brev/BrevService.kt b/apps/etterlatte-brev-api/src/main/kotlin/no/nav/etterlatte/brev/BrevService.kt index efe4fbb369c..562e21345a1 100644 --- a/apps/etterlatte-brev-api/src/main/kotlin/no/nav/etterlatte/brev/BrevService.kt +++ b/apps/etterlatte-brev-api/src/main/kotlin/no/nav/etterlatte/brev/BrevService.kt @@ -7,13 +7,11 @@ import no.nav.etterlatte.brev.model.Brev import no.nav.etterlatte.brev.model.BrevDistribusjonResponse import no.nav.etterlatte.brev.model.BrevID import no.nav.etterlatte.brev.model.BrevInnholdVedlegg -import no.nav.etterlatte.brev.model.BrevOpprettResponse import no.nav.etterlatte.brev.model.BrevProsessType import no.nav.etterlatte.brev.model.BrevStatusResponse import no.nav.etterlatte.brev.model.FerdigstillJournalFoerOgDistribuerOpprettetBrev import no.nav.etterlatte.brev.model.Mottaker import no.nav.etterlatte.brev.model.MottakerType -import no.nav.etterlatte.brev.model.OpprettBrevRequest import no.nav.etterlatte.brev.model.OpprettJournalfoerOgDistribuerRequest import no.nav.etterlatte.brev.model.Pdf import no.nav.etterlatte.brev.model.Spraak @@ -45,6 +43,9 @@ class BrevService( private val logger = LoggerFactory.getLogger(this::class.java) private val sikkerlogger = sikkerlogger() + /* + * Brev uten behandling (dødshendelse, etc) + */ suspend fun opprettJournalfoerOgDistribuerRiver( bruker: BrukerTokenInfo, req: OpprettJournalfoerOgDistribuerRequest, @@ -93,21 +94,6 @@ class BrevService( } } - suspend fun opprettBrev( - bruker: BrukerTokenInfo, - req: OpprettBrevRequest, - ): BrevOpprettResponse { - val (brev, enhetsnummer) = - brevoppretter.opprettBrevSomHarInnhold( - sakId = req.sakId, - behandlingId = req.behandlingId, - bruker = bruker, - brevKode = req.brevKode, - brevData = req.brevParametereAutomatisk.brevDataMapping(), - ) - return BrevOpprettResponse(brev.id, enhetsnummer) - } - suspend fun ferdigstillBrevJournalfoerOgDistribuerforOpprettetBrev( req: FerdigstillJournalFoerOgDistribuerOpprettetBrev, bruker: BrukerTokenInfo, diff --git a/apps/etterlatte-brev-api/src/main/kotlin/no/nav/etterlatte/brev/vedtaksbrev/VedtaksbrevRoute.kt b/apps/etterlatte-brev-api/src/main/kotlin/no/nav/etterlatte/brev/vedtaksbrev/VedtaksbrevRoute.kt index 0f7cf71e992..baf6945df28 100644 --- a/apps/etterlatte-brev-api/src/main/kotlin/no/nav/etterlatte/brev/vedtaksbrev/VedtaksbrevRoute.kt +++ b/apps/etterlatte-brev-api/src/main/kotlin/no/nav/etterlatte/brev/vedtaksbrev/VedtaksbrevRoute.kt @@ -13,6 +13,7 @@ import io.ktor.server.routing.route import no.nav.etterlatte.brev.Brevtype import no.nav.etterlatte.brev.JournalfoerBrevService import no.nav.etterlatte.brev.VedtakTilJournalfoering +import no.nav.etterlatte.brev.model.GenererOgFerdigstillVedtaksbrev import no.nav.etterlatte.libs.common.sak.SakId import no.nav.etterlatte.libs.ktor.route.BEHANDLINGID_CALL_PARAMETER import no.nav.etterlatte.libs.ktor.route.Tilgangssjekker @@ -93,6 +94,28 @@ fun Route.vedtaksbrevRoute( } } + post("vedtak/generer-pdf-og-ferdigstill") { + kunSystembruker { systembruker -> + val behandlingId = behandlingId + val request = call.receive() + logger.info("Generere og ferdigstille vedtaksbrev for behandling (behandlingId=$behandlingId)") + + measureTimedValue { + service.genererPdfOgFerdigstill(request.behandlingId, request.brevId, systembruker) + }.also { (_, varighet) -> + logger.info( + "Generere og ferdigstilling av vedtaksbrev tok ${ + varighet.toString( + DurationUnit.SECONDS, + 2, + ) + }", + ) + call.respond(HttpStatusCode.OK) + } + } + } + post("vedtak/ferdigstill") { withBehandlingId(tilgangssjekker, skrivetilgang = true) { behandlingId -> logger.info("Ferdigstiller vedtaksbrev for behandling (id=$behandlingId)") @@ -118,10 +141,12 @@ fun Route.vedtaksbrevRoute( service.hentNyttInnhold(sakId, brevId, behandlingId, brukerTokenInfo, body.brevtype) }.let { (brevPayload, varighet) -> logger.info( - "Oppretting av nytt innhold til brev (id=$brevId) tok ${varighet.toString( - DurationUnit.SECONDS, - 2, - )}", + "Oppretting av nytt innhold til brev (id=$brevId) tok ${ + varighet.toString( + DurationUnit.SECONDS, + 2, + ) + }", ) call.respond(brevPayload) } diff --git a/apps/etterlatte-brev-api/src/main/kotlin/no/nav/etterlatte/brev/vedtaksbrev/VedtaksbrevService.kt b/apps/etterlatte-brev-api/src/main/kotlin/no/nav/etterlatte/brev/vedtaksbrev/VedtaksbrevService.kt index 1057268b89f..2b7f59f0dda 100644 --- a/apps/etterlatte-brev-api/src/main/kotlin/no/nav/etterlatte/brev/vedtaksbrev/VedtaksbrevService.kt +++ b/apps/etterlatte-brev-api/src/main/kotlin/no/nav/etterlatte/brev/vedtaksbrev/VedtaksbrevService.kt @@ -90,7 +90,13 @@ class VedtaksbrevService( pdfGenerator.genererPdf( id = id, bruker = bruker, - avsenderRequest = { brukerToken, vedtak, enhet -> opprettAvsenderRequest(brukerToken, vedtak, enhet) }, + avsenderRequest = { brukerToken, vedtak, enhet -> + opprettAvsenderRequest( + brukerToken, + vedtak, + enhet, + ) + }, brevKodeMapping = { brevKodeMappingVedtak.brevKode(it) }, brevDataMapping = { brevDataMapperFerdigstilling.brevDataFerdigstilling(it) }, ) @@ -113,6 +119,15 @@ class VedtaksbrevService( return pdf } + suspend fun genererPdfOgFerdigstill( + behandlingId: UUID, + brevId: BrevID, + brukerTokenInfo: BrukerTokenInfo, + ) { + genererPdf(brevId, brukerTokenInfo) + ferdigstillVedtaksbrev(behandlingId, brukerTokenInfo) + } + suspend fun ferdigstillVedtaksbrev( behandlingId: UUID, brukerTokenInfo: BrukerTokenInfo, diff --git a/apps/etterlatte-vedtaksvurdering-kafka/src/main/kotlin/no/nav/etterlatte/klienter/BrevKlient.kt b/apps/etterlatte-vedtaksvurdering-kafka/src/main/kotlin/no/nav/etterlatte/klienter/BrevKlient.kt index 4cf8dbb3f74..4a14c72af61 100644 --- a/apps/etterlatte-vedtaksvurdering-kafka/src/main/kotlin/no/nav/etterlatte/klienter/BrevKlient.kt +++ b/apps/etterlatte-vedtaksvurdering-kafka/src/main/kotlin/no/nav/etterlatte/klienter/BrevKlient.kt @@ -8,16 +8,14 @@ import io.ktor.client.request.setBody import io.ktor.http.ContentType import io.ktor.http.contentType import kotlinx.coroutines.runBlocking -import no.nav.etterlatte.brev.model.BrevOpprettResponse -import no.nav.etterlatte.brev.model.BrevStatusResponse -import no.nav.etterlatte.brev.model.FerdigstillJournalFoerOgDistribuerOpprettetBrev -import no.nav.etterlatte.brev.model.OpprettBrevRequest +import no.nav.etterlatte.brev.model.Brev +import no.nav.etterlatte.brev.model.GenererOgFerdigstillVedtaksbrev import no.nav.etterlatte.libs.common.feilhaandtering.InternfeilException import no.nav.etterlatte.libs.common.retryOgPakkUt -import no.nav.etterlatte.libs.common.sak.SakId import no.nav.etterlatte.libs.common.toJson import org.slf4j.LoggerFactory import java.time.Duration +import java.util.UUID class BrevKlient( private val httpClient: HttpClient, @@ -25,43 +23,42 @@ class BrevKlient( ) { private val logger = LoggerFactory.getLogger(this::class.java) - internal fun opprettBrev( - sakid: SakId, - opprett: OpprettBrevRequest, - ): BrevOpprettResponse = + internal fun opprettBrev(behandlingId: UUID): Brev = runBlocking { try { - logger.info("Oppretter brev uten distribusjon for sak med sakId=$sakid") + logger.info("Ber brev-api om å opprette vedtaksbrev for behandling id=$behandlingId") retryOgPakkUt(times = 5, vent = { timesleft -> Thread.sleep(Duration.ofSeconds(1L * timesleft)) }) { httpClient - .post("$url/api/brev/sak/${sakid.sakId}/opprett-brev") { + .post("$url/api/brev/behandling/$behandlingId/vedtak") { contentType(ContentType.Application.Json) - setBody(opprett.toJson()) - }.body() + // setBody(opprett.toJson()) + }.body() } } catch (e: ResponseException) { - logger.error("Opprettelse av brev feilet for sak med sakId=$sakid feilet", e) - throw InternfeilException("Kunne ikke opprette brev for sak: $sakid") + logger.error("Opprettelse av brev feilet for behandling med id=$behandlingId", e) + throw InternfeilException("Opprettelse av brev feilet for behandling med id=$behandlingId") } } - internal fun ferdigstillJournalfoerDistribuerBrev( - sakid: SakId, - request: FerdigstillJournalFoerOgDistribuerOpprettetBrev, - ): BrevStatusResponse = - runBlocking { - try { - logger.info("Oppretter brev uten distribusjon for sak med sakId=$sakid") - retryOgPakkUt(times = 5, vent = { timesleft -> Thread.sleep(Duration.ofSeconds(1L * timesleft)) }) { - httpClient - .post("$url/api/brev/sak/${sakid.sakId}/ferdigstill-journalfoer-og-distribuer") { - contentType(ContentType.Application.Json) - setBody(request.toJson()) - }.body() - } - } catch (e: ResponseException) { - logger.error("Opprettelse av brev feilet for sak med sakId=$sakid feilet", e) - throw InternfeilException("Kunne ikke opprette brev for sak: $sakid") + internal fun genererPdfOgFerdigstillVedtaksbrev( + behandlingId: UUID, + request: GenererOgFerdigstillVedtaksbrev, + ) = runBlocking { + try { + logger.info("Kaller brev-api for å generere og ferdigstille vedtaksbrev for $behandlingId") + retryOgPakkUt(times = 5, vent = { timesleft -> Thread.sleep(Duration.ofSeconds(1L * timesleft)) }) { + httpClient + .post("$url/api/brev/behandling/$behandlingId/vedtak/generer-pdf-og-ferdigstill") { + contentType(ContentType.Application.Json) + setBody(request.toJson()) + } } + } catch (e: ResponseException) { + logger.error( + "Forsøk på å generere pdf og ferdigstille vedtaksbrev feilet for behandling med id=$behandlingId", + e, + ) + throw InternfeilException("Forsøk på å generere pdf og ferdigstille vedtaksbrev feilet for behandling med id=$behandlingId") } + } } diff --git a/apps/etterlatte-vedtaksvurdering-kafka/src/main/kotlin/no/nav/etterlatte/regulering/OpprettVedtakforespoerselRiver.kt b/apps/etterlatte-vedtaksvurdering-kafka/src/main/kotlin/no/nav/etterlatte/regulering/OpprettVedtakforespoerselRiver.kt index 90977382bb9..3ac79fe3f75 100644 --- a/apps/etterlatte-vedtaksvurdering-kafka/src/main/kotlin/no/nav/etterlatte/regulering/OpprettVedtakforespoerselRiver.kt +++ b/apps/etterlatte-vedtaksvurdering-kafka/src/main/kotlin/no/nav/etterlatte/regulering/OpprettVedtakforespoerselRiver.kt @@ -1,18 +1,14 @@ package no.nav.etterlatte.regulering import no.nav.etterlatte.VedtakService -import no.nav.etterlatte.brev.BrevParametereAutomatisk -import no.nav.etterlatte.brev.Brevkoder -import no.nav.etterlatte.brev.SaksbehandlerOgAttestant -import no.nav.etterlatte.brev.model.BrevOpprettResponse -import no.nav.etterlatte.brev.model.FerdigstillJournalFoerOgDistribuerOpprettetBrev -import no.nav.etterlatte.brev.model.OpprettBrevRequest +import no.nav.etterlatte.brev.model.Brev +import no.nav.etterlatte.brev.model.BrevID +import no.nav.etterlatte.brev.model.GenererOgFerdigstillVedtaksbrev import no.nav.etterlatte.funksjonsbrytere.FeatureToggleService import no.nav.etterlatte.libs.common.behandling.Revurderingaarsak import no.nav.etterlatte.libs.common.feilhaandtering.InternfeilException import no.nav.etterlatte.libs.common.sak.SakId import no.nav.etterlatte.libs.common.vedtak.VedtakInnholdDto -import no.nav.etterlatte.libs.ktor.token.Fagsaksystem import no.nav.etterlatte.no.nav.etterlatte.klienter.BrevKlient import no.nav.etterlatte.no.nav.etterlatte.klienter.UtbetalingKlient import no.nav.etterlatte.no.nav.etterlatte.regulering.ReguleringFeatureToggle @@ -68,7 +64,6 @@ internal class OpprettVedtakforespoerselRiver( val dato = omregningData.hentFraDato() val revurderingaarsak = omregningData.revurderingaarsak - val kunFatteVedtak = featureToggleService.isEnabled(ReguleringFeatureToggle.SkalStoppeEtterFattetVedtak, false) val skalSendeBrev = when (omregningData.revurderingaarsak) { Revurderingaarsak.AARLIG_INNTEKTSJUSTERING -> true @@ -76,29 +71,28 @@ internal class OpprettVedtakforespoerselRiver( } val respons = - if (kunFatteVedtak) { - opprettBrev(skalSendeBrev, sakId, behandlingId, omregningData.revurderingaarsak) + if (featureToggleService.isEnabled(ReguleringFeatureToggle.SkalStoppeEtterFattetVedtak, false)) { + opprettBrev(behandlingId, revurderingaarsak) vedtak.opprettVedtakOgFatt(sakId, behandlingId) } else { when (omregningData.utbetalingVerifikasjon) { - UtbetalingVerifikasjon.INGEN -> vedtak.opprettVedtakFattOgAttester(sakId, behandlingId) - UtbetalingVerifikasjon.SIMULERING -> { - vedtak.opprettVedtakOgFatt(sakId, behandlingId) - val brevResp = opprettBrev(skalSendeBrev, sakId, behandlingId, revurderingaarsak) - - verifiserUendretUtbetaling(behandlingId, skalAvbryte = false) - ferdigstillBrev(skalSendeBrev, sakId, revurderingaarsak, brevResp) - vedtak.attesterVedtak(sakId, behandlingId) + UtbetalingVerifikasjon.INGEN -> { + if (skalSendeBrev) { + vedtakOgBrev(sakId, behandlingId, revurderingaarsak) + } else { + vedtak.opprettVedtakFattOgAttester(sakId, behandlingId) + } } - UtbetalingVerifikasjon.SIMULERING_AVBRYT_ETTERBETALING_ELLER_TILBAKEKREVING -> { - vedtak.opprettVedtakOgFatt(sakId, behandlingId) - val brevResp = opprettBrev(skalSendeBrev, sakId, behandlingId, revurderingaarsak) + UtbetalingVerifikasjon.SIMULERING -> vedtakOgBrev(sakId, behandlingId, revurderingaarsak, false) - verifiserUendretUtbetaling(behandlingId, skalAvbryte = true) - ferdigstillBrev(skalSendeBrev, sakId, revurderingaarsak, brevResp) - vedtak.attesterVedtak(sakId, behandlingId) - } + UtbetalingVerifikasjon.SIMULERING_AVBRYT_ETTERBETALING_ELLER_TILBAKEKREVING -> + vedtakOgBrev( + sakId, + behandlingId, + revurderingaarsak, + true, + ) } } @@ -142,56 +136,49 @@ internal class OpprettVedtakforespoerselRiver( } } - private fun opprettBrev( - skalSendeBrev: Boolean, + private fun vedtakOgBrev( sakId: SakId, behandlingId: UUID, revurderingaarsak: Revurderingaarsak, - ): BrevOpprettResponse? { - if (!skalSendeBrev) { - return null + skalAvbryteUtbetaling: Boolean? = null, + ): VedtakOgRapid { + vedtak.opprettVedtakOgFatt(sakId, behandlingId) + val brev = opprettBrev(behandlingId, revurderingaarsak) + + if (skalAvbryteUtbetaling != null) { + verifiserUendretUtbetaling(behandlingId, skalAvbryte = skalAvbryteUtbetaling) } - val brevRequest = - when (revurderingaarsak) { - Revurderingaarsak.AARLIG_INNTEKTSJUSTERING -> - OpprettBrevRequest( - brevKode = Brevkoder.OMS_INNTEKTSJUSTERING_VARSEL, - brevParametereAutomatisk = BrevParametereAutomatisk.OmstillingsstoenadInntektsjusteringRedigerbar(), - sakId = sakId, - behandlingId = behandlingId, - ) - - else -> throw InternfeilException("Støtter ikke brev under automatisk omregning for $revurderingaarsak") - } - return brevKlient.opprettBrev(sakId, brevRequest) + if (brev != null) { + ferdigstillBrev(behandlingId, brev.id, revurderingaarsak) + } + + return vedtak.attesterVedtak(sakId, behandlingId) } + private fun opprettBrev( + behandlingId: UUID, + revurderingaarsak: Revurderingaarsak, + ): Brev? = + when (revurderingaarsak) { + Revurderingaarsak.AARLIG_INNTEKTSJUSTERING -> brevKlient.opprettBrev(behandlingId) + else -> null + } + private fun ferdigstillBrev( - skalSendeBrev: Boolean, - sakId: SakId, + behandlingId: UUID, + brevId: BrevID, revurderingaarsak: Revurderingaarsak, - brevResponse: BrevOpprettResponse?, ) { - if (!skalSendeBrev) { - return + when (revurderingaarsak) { + Revurderingaarsak.AARLIG_INNTEKTSJUSTERING -> + brevKlient.genererPdfOgFerdigstillVedtaksbrev( + behandlingId, + GenererOgFerdigstillVedtaksbrev(behandlingId, brevId), + ) + + else -> throw InternfeilException("Støtter ikke brev under automatisk omregning for $revurderingaarsak") } - val (brevId, enhetsnummer) = - brevResponse - ?: throw InternfeilException("Mangler brevrespons fra opprettelse av brev for $sakId") - val brevRequest = - when (revurderingaarsak) { - Revurderingaarsak.AARLIG_INNTEKTSJUSTERING -> - FerdigstillJournalFoerOgDistribuerOpprettetBrev( - brevId = brevId, - sakId = sakId, - enhetsnummer = enhetsnummer, - avsenderRequest = SaksbehandlerOgAttestant(Fagsaksystem.EY.navn, Fagsaksystem.EY.navn), - ) - - else -> throw InternfeilException("Støtter ikke brev under automatisk omregning for $revurderingaarsak") - } - brevKlient.ferdigstillJournalfoerDistribuerBrev(sakId, brevRequest) } private fun hentBeloep( diff --git a/apps/etterlatte-vedtaksvurdering-kafka/src/test/kotlin/no/nav/etterlatte/regulering/OpprettVedtakforespoerselRiverTest.kt b/apps/etterlatte-vedtaksvurdering-kafka/src/test/kotlin/no/nav/etterlatte/regulering/OpprettVedtakforespoerselRiverTest.kt index 40f155a587a..5fd43f040d9 100644 --- a/apps/etterlatte-vedtaksvurdering-kafka/src/test/kotlin/no/nav/etterlatte/regulering/OpprettVedtakforespoerselRiverTest.kt +++ b/apps/etterlatte-vedtaksvurdering-kafka/src/test/kotlin/no/nav/etterlatte/regulering/OpprettVedtakforespoerselRiverTest.kt @@ -286,7 +286,9 @@ internal class OpprettVedtakforespoerselRiverTest { inspector.sendTestMessage(melding.toJson()) - verify { vedtakServiceMock.opprettVedtakFattOgAttester(sakId, behandlingId) } - verify { brevKlientMock.ferdigstillJournalfoerDistribuerBrev(sakId, any()) } + verify { vedtakServiceMock.opprettVedtakOgFatt(sakId, behandlingId) } + verify { vedtakServiceMock.attesterVedtak(sakId, behandlingId) } + verify { brevKlientMock.opprettBrev(behandlingId) } + verify { brevKlientMock.genererPdfOgFerdigstillVedtaksbrev(behandlingId, any()) } } } diff --git a/libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/Brev.kt b/libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/Brev.kt index 97cb246de3f..ce180cbf0fc 100644 --- a/libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/Brev.kt +++ b/libs/etterlatte-brev-model/src/main/kotlin/no/nav/etterlatte/brev/Brev.kt @@ -125,11 +125,9 @@ data class OpprettJournalfoerOgDistribuerRequest( val sakId: SakId, ) -data class OpprettBrevRequest( - val brevKode: Brevkoder, - val brevParametereAutomatisk: BrevParametereAutomatisk, - val sakId: SakId, +data class GenererOgFerdigstillVedtaksbrev( val behandlingId: UUID, + val brevId: BrevID, ) data class FerdigstillJournalFoerOgDistribuerOpprettetBrev( @@ -165,8 +163,3 @@ data class BrevDistribusjonResponse( val brevId: BrevID, val erDistribuert: Boolean, ) - -data class BrevOpprettResponse( - val brevId: BrevID, - val enhetsnummer: Enhetsnummer, -)