Skip to content

Commit

Permalink
kan forhåndsvise vedtaksbrev for tilbakekrevingsbehandling. Sender pe…
Browse files Browse the repository at this point in the history
…r nå kun personalia til pdfgen
  • Loading branch information
ramnav990 committed Oct 31, 2023
1 parent e190e4a commit 61664de
Show file tree
Hide file tree
Showing 17 changed files with 300 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ sealed class PdfTemplate(
data object Forhåndsvarsel : PdfTemplate("forhåndsvarsel")
data object ForhåndsvarselTilbakekreving : PdfTemplate("forhåndsvarselTilbakekreving")
data object ForhåndsvarselTilbakekrevingsbehandling : PdfTemplate("forhåndsvarselTilbakekrevingsbehandling")
data object VedtaksbrevTilbakekrevingsbehandling : PdfTemplate("vedtaksbrevTilbakekrevingsbehandling")
data object InnkallingTilKontrollsamtale : PdfTemplate("innkallingKontrollsamtale")
data object PåminnelseNyStønadsperiode : PdfTemplate("påminnelseOmNyStønadsperiode")

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,11 @@ sealed class PdfTemplateMedDokumentNavn(
dokumentNavn = "Varsel om mulig tilbakekreving",
)

data object VedtaksbrevTilbakekrevingsbehandling : PdfTemplateMedDokumentNavn(
pdfTemplate = PdfTemplate.VedtaksbrevTilbakekrevingsbehandling,
dokumentNavn = "Tilbakekreving av Supplerende stønad",
)

data object InnkallingTilKontrollsamtale : PdfTemplateMedDokumentNavn(
pdfTemplate = PdfTemplate.InnkallingTilKontrollsamtale,
dokumentNavn = "Supplerende stønad ufør flyktning – innkalling til samtale",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import no.nav.su.se.bakover.domain.brev.command.KlageDokumentCommand
import no.nav.su.se.bakover.domain.brev.command.PåminnelseNyStønadsperiodeDokumentCommand
import no.nav.su.se.bakover.domain.brev.command.TrukketSøknadDokumentCommand
import tilbakekreving.domain.forhåndsvarsel.ForhåndsvarsleTilbakekrevingsbehandlingDokumentCommand
import tilbakekreving.domain.forhåndsvarsel.VedtaksbrevTilbakekrevingsbehandlingDokumentCommand
import java.time.Clock
import java.util.UUID

Expand All @@ -30,6 +31,7 @@ fun PdfA.tilDokument(
return when (command) {
is IverksettRevurderingDokumentCommand,
is IverksettSøknadsbehandlingDokumentCommand,
is VedtaksbrevTilbakekrevingsbehandlingDokumentCommand,
is KlageDokumentCommand.Avvist,
-> vedtak(
id = id,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import person.domain.KunneIkkeHenteNavnForNavIdent
import person.domain.KunneIkkeHentePerson
import person.domain.Person
import tilbakekreving.domain.forhåndsvarsel.ForhåndsvarsleTilbakekrevingsbehandlingDokumentCommand
import tilbakekreving.domain.forhåndsvarsel.VedtaksbrevTilbakekrevingsbehandlingDokumentCommand
import java.time.Clock

fun GenererDokumentCommand.tilPdfInnhold(
Expand Down Expand Up @@ -173,6 +174,13 @@ fun fromBrevCommand(
clock = clock,
)

is VedtaksbrevTilbakekrevingsbehandlingDokumentCommand -> VedtaksbrevTilbakekrevingsbehandlingPdfInnhold.fromBrevCommand(
command = command,
personalia = personalia().bind(),
saksbehandlerNavn = hentNavnMappedLeft(command.saksbehandler).bind(),
clock = clock,
)

else -> throw IllegalStateException("Ukjent GenererDokumentCommand for sak ${command.saksnummer}. ")
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package no.nav.su.se.bakover.domain.brev.jsonRequest

import dokument.domain.pdf.PdfInnhold
import dokument.domain.pdf.PdfTemplateMedDokumentNavn
import dokument.domain.pdf.PersonaliaPdfInnhold
import no.nav.su.se.bakover.common.extensions.toBrevformat
import tilbakekreving.domain.forhåndsvarsel.VedtaksbrevTilbakekrevingsbehandlingDokumentCommand
import java.time.Clock
import java.time.LocalDate

/**
* TODO - her må vi fylle inn med mer info
*/
data class VedtaksbrevTilbakekrevingsbehandlingPdfInnhold(
val personalia: PersonaliaPdfInnhold,
val saksbehandlerNavn: String,
val fritekst: String?,
val dato: String,
) : PdfInnhold() {
override val pdfTemplate = PdfTemplateMedDokumentNavn.VedtaksbrevTilbakekrevingsbehandling

companion object {
fun fromBrevCommand(
command: VedtaksbrevTilbakekrevingsbehandlingDokumentCommand,
personalia: PersonaliaPdfInnhold,
saksbehandlerNavn: String,
clock: Clock,
): VedtaksbrevTilbakekrevingsbehandlingPdfInnhold {
return VedtaksbrevTilbakekrevingsbehandlingPdfInnhold(
personalia = personalia,
saksbehandlerNavn = saksbehandlerNavn,
fritekst = command.fritekst,
// Denne formateres annerledes enn i personalia, selvom begge deler er dagens dato. 2021-01-01 vil gi 01.01.2021 i personalia, mens 1. januar 2021 i dette feltet.
// TODO jah: Kanskje vi kan bruke denne i su-pdfgen? https://github.com/navikt/pdfgen/blob/master/src/main/kotlin/no/nav/pdfgen/template/Helpers.kt
dato = LocalDate.now(clock).toBrevformat(),
)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import tilbakekreving.application.service.opprett.OpprettTilbakekrevingsbehandli
import tilbakekreving.application.service.tilAttestering.TilbakekrevingsbehandlingTilAttesteringService
import tilbakekreving.application.service.underkjenn.UnderkjennTilbakekrevingsbehandlingService
import tilbakekreving.application.service.vurder.BrevTilbakekrevingsbehandlingService
import tilbakekreving.application.service.vurder.ForhåndsvisVedtaksbrevTilbakekrevingsbehandlingService
import tilbakekreving.application.service.vurder.MånedsvurderingerTilbakekrevingsbehandlingService
import tilbakekreving.domain.kravgrunnlag.Kravgrunnlag
import tilbakekreving.domain.kravgrunnlag.KravgrunnlagRepo
Expand Down Expand Up @@ -62,6 +63,11 @@ class TilbakekrevingServices(
tilbakekrevingsbehandlingRepo = tilbakekrevingsbehandlingRepo,
clock = clock,
),
val forhåndsvisVedtaksbrevTilbakekrevingsbehandlingService: ForhåndsvisVedtaksbrevTilbakekrevingsbehandlingService = ForhåndsvisVedtaksbrevTilbakekrevingsbehandlingService(
tilgangstyring = tilgangstyringService,
sakService = sakService,
brevService = brevService,
),
val knyttKravgrunnlagTilSakOgUtbetalingKonsument: KnyttKravgrunnlagTilSakOgUtbetalingKonsument = KnyttKravgrunnlagTilSakOgUtbetalingKonsument(
kravgrunnlagRepo = kravgrunnlagRepo,
tilbakekrevingService = tilbakekrevingService,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package tilbakekreving.application.service.vurder

import arrow.core.Either
import arrow.core.getOrElse
import arrow.core.left
import dokument.domain.brev.BrevService
import dokument.domain.brev.Brevvalg
import no.nav.su.se.bakover.common.domain.PdfA
import no.nav.su.se.bakover.domain.oppdrag.tilbakekreving.behandling.hentTilbakekrevingsbehandling
import no.nav.su.se.bakover.domain.sak.SakService
import org.slf4j.LoggerFactory
import tilbakekreving.application.service.common.TilbakekrevingsbehandlingTilgangstyringService
import tilbakekreving.domain.forhåndsvarsel.VedtaksbrevTilbakekrevingsbehandlingDokumentCommand
import tilbakekreving.domain.vurdert.ForhåndsvisVedtaksbrevCommand
import tilbakekreving.domain.vurdert.KunneIkkeForhåndsviseVedtaksbrev

class ForhåndsvisVedtaksbrevTilbakekrevingsbehandlingService(
private val tilgangstyring: TilbakekrevingsbehandlingTilgangstyringService,
private val sakService: SakService,
private val brevService: BrevService,
) {
private val log = LoggerFactory.getLogger(this::class.java)

fun forhåndsvisVedtaksbrev(
command: ForhåndsvisVedtaksbrevCommand,
): Either<KunneIkkeForhåndsviseVedtaksbrev, PdfA> {
tilgangstyring.assertHarTilgangTilSak(command.sakId).onLeft {
return KunneIkkeForhåndsviseVedtaksbrev.IkkeTilgang(it).left()
}

val sak = sakService.hentSak(command.sakId).getOrElse {
throw IllegalStateException("Kunne ikke oppdatere vedtaksbrev for tilbakekrevingsbehandling, fant ikke sak. Kommandoen var: $command")
}

val behandling = sak.hentTilbakekrevingsbehandling(command.behandlingId)
?: return KunneIkkeForhåndsviseVedtaksbrev.FantIkkeBehandling.left()

return brevService.lagDokument(
VedtaksbrevTilbakekrevingsbehandlingDokumentCommand(
fødselsnummer = sak.fnr,
saksnummer = sak.saksnummer,
correlationId = command.correlationId,
sakId = sak.id,
saksbehandler = command.ident,
fritekst = when (behandling.vedtaksbrevvalg) {
is Brevvalg.SaksbehandlersValg.SkalIkkeSendeBrev -> return KunneIkkeForhåndsviseVedtaksbrev.SkalIkkeSendeBrevForÅViseVedtaksbrev.left()
is Brevvalg.SaksbehandlersValg.SkalSendeBrev.InformasjonsbrevMedFritekst -> return KunneIkkeForhåndsviseVedtaksbrev.BrevetMåVæreVedtaksbrevMedFritekst.left().also {
log.error("Tilbakekrevingsbehandling ${behandling.id} har brevvalg for InformasjonsbrevMedFritekst. Det skal bare være mulig å ikke sende brev, eller VedtaksbrevMedFritekst")
}
is Brevvalg.SaksbehandlersValg.SkalSendeBrev.Vedtaksbrev.MedFritekst -> behandling.vedtaksbrevvalg!!.fritekst
is Brevvalg.SaksbehandlersValg.SkalSendeBrev.Vedtaksbrev.UtenFritekst -> return KunneIkkeForhåndsviseVedtaksbrev.BrevetMåVæreVedtaksbrevMedFritekst.left().also {
log.error("Tilbakekrevingsbehandling ${behandling.id} har brevvalg for VedtaksbrevUtenFritekst. Det skal bare være mulig å ikke sende brev, eller VedtaksbrevMedFritekst")
}
null -> return KunneIkkeForhåndsviseVedtaksbrev.IkkeTattStillingTilBrevvalg.left()
},
),
)
.map { it.generertDokument }
.mapLeft { KunneIkkeForhåndsviseVedtaksbrev.FeilVedGenereringAvDokument }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package tilbakekreving.domain.forhåndsvarsel

import dokument.domain.GenererDokumentCommand
import no.nav.su.se.bakover.common.CorrelationId
import no.nav.su.se.bakover.common.brukerrolle.Brukerrolle
import no.nav.su.se.bakover.common.domain.Saksnummer
import no.nav.su.se.bakover.common.ident.NavIdentBruker
import no.nav.su.se.bakover.common.person.Fnr
import no.nav.su.se.bakover.hendelse.domain.SakshendelseCommand
import java.util.UUID

data class VedtaksbrevTilbakekrevingsbehandlingDokumentCommand(
override valdselsnummer: Fnr,
override val saksnummer: Saksnummer,
override val correlationId: CorrelationId?,
override val sakId: UUID,
val saksbehandler: NavIdentBruker.Saksbehandler,
val fritekst: String?,
) : GenererDokumentCommand, SakshendelseCommand {
override val ident: NavIdentBruker? = null
override val brukerroller: List<Brukerrolle> = emptyList()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package tilbakekreving.domain.vurdert

import no.nav.su.se.bakover.common.CorrelationId
import no.nav.su.se.bakover.common.brukerrolle.Brukerrolle
import no.nav.su.se.bakover.common.ident.NavIdentBruker
import no.nav.su.se.bakover.hendelse.domain.SakshendelseCommand
import tilbakekreving.domain.TilbakekrevingsbehandlingId
import java.util.UUID

data class ForhåndsvisVedtaksbrevCommand(
override val sakId: UUID,
val behandlingId: TilbakekrevingsbehandlingId,
override val correlationId: CorrelationId?,
override val ident: NavIdentBruker.Saksbehandler,
override val brukerroller: List<Brukerrolle>,
) : SakshendelseCommand
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package tilbakekreving.domain.vurdert

import tilbakekreving.domain.IkkeTilgangTilSak

sealed interface KunneIkkeForhåndsviseVedtaksbrev {
data class IkkeTilgang(val underliggende: IkkeTilgangTilSak) : KunneIkkeForhåndsviseVedtaksbrev
data object SkalIkkeSendeBrevForÅViseVedtaksbrev : KunneIkkeForhåndsviseVedtaksbrev
data object BrevetMåVæreVedtaksbrevMedFritekst : KunneIkkeForhåndsviseVedtaksbrev
data object FantIkkeBehandling : KunneIkkeForhåndsviseVedtaksbrev
data object IkkeTattStillingTilBrevvalg : KunneIkkeForhåndsviseVedtaksbrev
data object FeilVedGenereringAvDokument : KunneIkkeForhåndsviseVedtaksbrev
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import tilbakekreving.application.service.opprett.OpprettTilbakekrevingsbehandli
import tilbakekreving.application.service.tilAttestering.TilbakekrevingsbehandlingTilAttesteringService
import tilbakekreving.application.service.underkjenn.UnderkjennTilbakekrevingsbehandlingService
import tilbakekreving.application.service.vurder.BrevTilbakekrevingsbehandlingService
import tilbakekreving.application.service.vurder.ForhåndsvisVedtaksbrevTilbakekrevingsbehandlingService
import tilbakekreving.application.service.vurder.MånedsvurderingerTilbakekrevingsbehandlingService
import tilbakekreving.presentation.api.avslutt.avbrytTilbakekrevingsbehandlingRoute
import tilbakekreving.presentation.api.forhåndsvarsel.forhåndsvarsleTilbakekrevingRoute
Expand All @@ -26,6 +27,7 @@ fun Route.tilbakekrevingRoutes(
opprettTilbakekrevingsbehandlingService: OpprettTilbakekrevingsbehandlingService,
nedsvurderingerTilbakekrevingsbehandlingService: MånedsvurderingerTilbakekrevingsbehandlingService,
brevTilbakekrevingsbehandlingService: BrevTilbakekrevingsbehandlingService,
forhåndsvisVedtaksbrevTilbakekrevingsbehandlingService: ForhåndsvisVedtaksbrevTilbakekrevingsbehandlingService,
forhåndsvarsleTilbakekrevingsbehandlingService: ForhåndsvarsleTilbakekrevingsbehandlingService,
forhåndsvisForhåndsvarselTilbakekrevingsbehandlingService: ForhåndsvisForhåndsvarselTilbakekrevingsbehandlingService,
tilbakekrevingsbehandlingTilAttesteringService: TilbakekrevingsbehandlingTilAttesteringService,
Expand All @@ -36,6 +38,7 @@ fun Route.tilbakekrevingRoutes(
this.opprettTilbakekrevingsbehandlingRoute(opprettTilbakekrevingsbehandlingService)
this.vurderTilbakekrevingsbehandlingRoute(månedsvurderingerTilbakekrevingsbehandlingService)
this.vedtaksbrevTilbakekrevingsbehandlingRoute(brevTilbakekrevingsbehandlingService)
this.vedtaksbrevTilbakekrevingsbehandlingRoute(forhåndsvisVedtaksbrevTilbakekrevingsbehandlingService)
this.forhåndsvarsleTilbakekrevingRoute(forhåndsvarsleTilbakekrevingsbehandlingService)
this.visForhåndsvarselTilbakekrevingsbrev(forhåndsvisForhåndsvarselTilbakekrevingsbehandlingService)
this.tilAttesteringTilbakekrevingsbehandlingRoute(tilbakekrevingsbehandlingTilAttesteringService)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package tilbakekreving.presentation.api.vedtaksbrev

import io.ktor.http.ContentType
import io.ktor.http.HttpStatusCode
import io.ktor.server.application.call
import io.ktor.server.response.respondBytes
import io.ktor.server.routing.Route
import io.ktor.server.routing.get
import no.nav.su.se.bakover.common.brukerrolle.Brukerrolle
import no.nav.su.se.bakover.common.infrastructure.web.Feilresponser
import no.nav.su.se.bakover.common.infrastructure.web.Resultat
import no.nav.su.se.bakover.common.infrastructure.web.authorize
import no.nav.su.se.bakover.common.infrastructure.web.correlationId
import no.nav.su.se.bakover.common.infrastructure.web.errorJson
import no.nav.su.se.bakover.common.infrastructure.web.suUserContext
import no.nav.su.se.bakover.common.infrastructure.web.svar
import no.nav.su.se.bakover.common.infrastructure.web.withSakId
import no.nav.su.se.bakover.common.infrastructure.web.withTilbakekrevingId
import tilbakekreving.application.service.vurder.ForhåndsvisVedtaksbrevTilbakekrevingsbehandlingService
import tilbakekreving.domain.TilbakekrevingsbehandlingId
import tilbakekreving.domain.vurdert.ForhåndsvisVedtaksbrevCommand
import tilbakekreving.domain.vurdert.KunneIkkeForhåndsviseVedtaksbrev
import tilbakekreving.presentation.api.TILBAKEKREVING_PATH
import tilbakekreving.presentation.api.common.ikkeTilgangTilSak

internal fun Route.vedtaksbrevTilbakekrevingsbehandlingRoute(
forhåndsvisVedtaksbrevService: ForhåndsvisVedtaksbrevTilbakekrevingsbehandlingService,
) {
get("$TILBAKEKREVING_PATH/{tilbakekrevingsId}/vedtaksbrev/forhandsvis") {
authorize(Brukerrolle.Saksbehandler, Brukerrolle.Attestant) {
call.withSakId { sakId ->
call.withTilbakekrevingId { tilbakekrevingId ->
forhåndsvisVedtaksbrevService.forhåndsvisVedtaksbrev(
ForhåndsvisVedtaksbrevCommand(
sakId = sakId,
behandlingId = TilbakekrevingsbehandlingId(tilbakekrevingId),
correlationId = call.correlationId,
ident = call.suUserContext.saksbehandler,
brukerroller = call.suUserContext.roller,
),
)
.fold(
{ call.svar(it.tilResultat()) },
{ call.respondBytes(it.getContent(), ContentType.Application.Pdf) },
)
}
}
}
}
}

internal fun KunneIkkeForhåndsviseVedtaksbrev.tilResultat(): Resultat = when (this) {
is KunneIkkeForhåndsviseVedtaksbrev.IkkeTilgang -> ikkeTilgangTilSak
KunneIkkeForhåndsviseVedtaksbrev.BrevetMåVæreVedtaksbrevMedFritekst -> HttpStatusCode.InternalServerError.errorJson(
"Brevet må være av typen [Vedtaksbrev.MedFritekst]",
"brevet_må_være_av_typen_vedtaksbrev_med_fritekst",
)

KunneIkkeForhåndsviseVedtaksbrev.FantIkkeBehandling -> Feilresponser.fantIkkeBehandling
KunneIkkeForhåndsviseVedtaksbrev.IkkeTattStillingTilBrevvalg -> HttpStatusCode.BadRequest.errorJson(
"Det er ikke tatt stilling til brevvalg for å vise vedtaksbrev",
"ikke_tatt_stilling_til_brevvalg",
)

KunneIkkeForhåndsviseVedtaksbrev.SkalIkkeSendeBrevForÅViseVedtaksbrev -> HttpStatusCode.BadRequest.errorJson(
"Det er valg at brev ikke skal sendes. Brevet kan dermed ikke vises",
"valg_å_ikke_sende_brev",
)

KunneIkkeForhåndsviseVedtaksbrev.FeilVedGenereringAvDokument -> Feilresponser.feilVedGenereringAvDokument
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package no.nav.su.se.bakover.web.tilbakekreving

import io.kotest.assertions.withClue
import io.kotest.matchers.shouldBe
import io.kotest.matchers.string.shouldStartWith
import io.ktor.client.HttpClient
import io.ktor.client.statement.bodyAsText
import io.ktor.http.HttpMethod
import io.ktor.http.HttpStatusCode
import kotlinx.coroutines.runBlocking
import no.nav.su.se.bakover.common.brukerrolle.Brukerrolle
import no.nav.su.se.bakover.web.SharedRegressionTestData

fun forhåndsvisVedtaksbrevTilbakekrevingsbehandling(
sakId: String,
tilbakekrevingsbehandlingId: String,
expectedHttpStatusCode: HttpStatusCode = HttpStatusCode.OK,
client: HttpClient,
verifiserRespons: Boolean = true,
): String {
return runBlocking {
SharedRegressionTestData.defaultRequest(
HttpMethod.Get,
"/saker/$sakId/tilbakekreving/$tilbakekrevingsbehandlingId/vedtaksbrev/forhandsvis",
listOf(Brukerrolle.Saksbehandler),
client = client,
).apply {
withClue("Kunne ikke forhåndsvise vedtaksbrev tilbakekrevingsbehandling: ${this.bodyAsText()}") {
status shouldBe expectedHttpStatusCode
}
}.bodyAsText().also {
if (verifiserRespons) {
verifiserForhåndsvisVedtaksbrevTilbakekrevingsbehandlingRespons(
actual = it,
)
}
}
}
}

fun verifiserForhåndsvisVedtaksbrevTilbakekrevingsbehandlingRespons(
actual: String,
) {
actual.shouldStartWith("%PDF-1.0")
}
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ fun verifiserIverksattTilbakekrevingsbehandlingRespons(
{
"attestant": "AttestantLokal",
"underkjennelse":null,
"opprettet": ${if (tidligereAttesteringer == null) "\"2021-02-01T01:03:54.456789Z\"" else "\"2021-02-01T01:03:57.456789Z\""}
"opprettet": ${if (tidligereAttesteringer == null) "\"2021-02-01T01:03:54.456789Z\"" else "\"2021-02-01T01:04:00.456789Z\""}
}
]
}"""
Expand Down
Loading

0 comments on commit 61664de

Please sign in to comment.