Skip to content

Commit

Permalink
Merge pull request #2737 from navikt/sende-henleggelsebrev-automatisk…
Browse files Browse the repository at this point in the history
…-ved-trukket-søknad

Sende henleggelsebrev automatisk ved trukket søknad
  • Loading branch information
EndreHM authored Jan 6, 2025
2 parents d631d81 + b63c8ec commit ddf7700
Show file tree
Hide file tree
Showing 11 changed files with 625 additions and 140 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,9 @@ package no.nav.familie.ef.sak.behandling

import no.nav.familie.ef.sak.AuditLoggerEvent
import no.nav.familie.ef.sak.behandling.dto.BehandlingDto
import no.nav.familie.ef.sak.behandling.dto.HenlagtDto
import no.nav.familie.ef.sak.behandling.dto.SettPåVentRequest
import no.nav.familie.ef.sak.behandling.dto.TaAvVentStatusDto
import no.nav.familie.ef.sak.behandling.dto.tilDto
import no.nav.familie.ef.sak.fagsak.FagsakService
import no.nav.familie.ef.sak.fagsak.domain.Fagsak
import no.nav.familie.ef.sak.infrastruktur.exception.feilHvis
import no.nav.familie.ef.sak.infrastruktur.featuretoggle.FeatureToggleService
import no.nav.familie.ef.sak.infrastruktur.featuretoggle.Toggle
import no.nav.familie.ef.sak.infrastruktur.sikkerhet.TilgangService
import no.nav.familie.ef.sak.vilkår.gjenbruk.GjenbrukVilkårService
import no.nav.familie.kontrakter.felles.Ressurs
Expand All @@ -30,11 +24,8 @@ import java.util.UUID
class BehandlingController(
private val behandlingService: BehandlingService,
private val behandlingPåVentService: BehandlingPåVentService,
private val fagsakService: FagsakService,
private val henleggService: HenleggService,
private val tilgangService: TilgangService,
private val gjenbrukVilkårService: GjenbrukVilkårService,
private val featureToggleService: FeatureToggleService,
) {
@GetMapping("{behandlingId}")
fun hentBehandling(
Expand Down Expand Up @@ -86,34 +77,6 @@ class BehandlingController(
return Ressurs.success(behandlingId)
}

@PostMapping("{behandlingId}/henlegg")
fun henleggBehandling(
@PathVariable behandlingId: UUID,
@RequestBody henlagt: HenlagtDto,
): Ressurs<BehandlingDto> {
tilgangService.validerTilgangTilBehandling(behandlingId, AuditLoggerEvent.UPDATE)
tilgangService.validerHarSaksbehandlerrolle()
val henlagtBehandling = henleggService.henleggBehandling(behandlingId, henlagt)
val fagsak: Fagsak = fagsakService.hentFagsak(henlagtBehandling.fagsakId)
return Ressurs.success(henlagtBehandling.tilDto(fagsak.stønadstype))
}

@PostMapping("{behandlingId}/henlegg/behandling-uten-oppgave")
fun henleggBehandlingUtenOppgave(
@PathVariable behandlingId: UUID,
@RequestBody henlagt: HenlagtDto,
): Ressurs<BehandlingDto> {
tilgangService.validerTilgangTilBehandling(behandlingId, AuditLoggerEvent.UPDATE)
tilgangService.validerHarSaksbehandlerrolle()
feilHvis(!featureToggleService.isEnabled(toggle = Toggle.HENLEGG_BEHANDLING_UTEN_OPPGAVE)) {
"Henleggelse av behandling uten å henlegge oppgave er ikke mulig - toggle ikke enablet for bruker"
}

val henlagtBehandling = henleggService.henleggBehandlingUtenOppgave(behandlingId, henlagt)
val fagsak: Fagsak = fagsakService.hentFagsak(henlagtBehandling.fagsakId)
return Ressurs.success(henlagtBehandling.tilDto(fagsak.stønadstype))
}

@GetMapping("/ekstern/{eksternBehandlingId}")
fun hentBehandling(
@PathVariable eksternBehandlingId: Long,
Expand Down
59 changes: 0 additions & 59 deletions src/main/kotlin/no/nav/familie/ef/sak/behandling/HenleggService.kt

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,5 @@ package no.nav.familie.ef.sak.behandling.dto

data class HenlagtDto(
val årsak: HenlagtÅrsak,
val skalSendeHenleggelsesbrev: Boolean = false,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
package no.nav.familie.ef.sak.behandling.henlegg
import no.nav.familie.ef.sak.AuditLoggerEvent
import no.nav.familie.ef.sak.behandling.BehandlingService
import no.nav.familie.ef.sak.behandling.dto.BehandlingDto
import no.nav.familie.ef.sak.behandling.dto.HenlagtDto
import no.nav.familie.ef.sak.behandling.dto.HenlagtÅrsak
import no.nav.familie.ef.sak.behandling.dto.tilDto
import no.nav.familie.ef.sak.fagsak.FagsakService
import no.nav.familie.ef.sak.fagsak.domain.Fagsak
import no.nav.familie.ef.sak.felles.util.isEqualOrAfter
import no.nav.familie.ef.sak.infrastruktur.exception.feilHvis
import no.nav.familie.ef.sak.infrastruktur.featuretoggle.FeatureToggleService
import no.nav.familie.ef.sak.infrastruktur.featuretoggle.Toggle
import no.nav.familie.ef.sak.infrastruktur.sikkerhet.SikkerhetContext
import no.nav.familie.ef.sak.infrastruktur.sikkerhet.TilgangService
import no.nav.familie.ef.sak.opplysninger.personopplysninger.PersonopplysningerService
import no.nav.familie.kontrakter.felles.Ressurs
import no.nav.familie.prosessering.domene.Task
import no.nav.familie.prosessering.internal.TaskService
import no.nav.security.token.support.core.api.ProtectedWithClaims
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
import java.time.LocalDate
import java.util.UUID

@RestController
@RequestMapping(path = ["/api/behandling"])
@ProtectedWithClaims(issuer = "azuread")
class HenleggBehandlingController(
private val behandlingService: BehandlingService,
private val fagsakService: FagsakService,
private val henleggService: HenleggService,
private val tilgangService: TilgangService,
private val featureToggleService: FeatureToggleService,
private val taskService: TaskService,
private val personopplysningerService: PersonopplysningerService,
) {
@GetMapping("/{behandlingId}/henlegg/brev/forhandsvisning")
fun genererHenleggBrev(
@PathVariable behandlingId: UUID,
): Ressurs<ByteArray> {
val saksbehandling = behandlingService.hentSaksbehandling(behandlingId)
tilgangService.validerTilgangTilBehandling(saksbehandling, AuditLoggerEvent.ACCESS)
val saksbehandlerSignatur = SikkerhetContext.hentSaksbehandlerNavn(strict = true)
return henleggBrevRessurs(behandlingId, saksbehandlerSignatur)
}

private fun henleggBrevRessurs(
behandlingId: UUID,
saksbehandlerSignatur: String,
) = Ressurs.success(henleggService.genererHenleggelsesbrev(behandlingId, saksbehandlerSignatur))

@PostMapping("{behandlingId}/henlegg")
fun henleggBehandling(
@PathVariable behandlingId: UUID,
@RequestBody henlagt: HenlagtDto,
): Ressurs<BehandlingDto> {
tilgangService.validerTilgangTilBehandling(behandlingId, AuditLoggerEvent.UPDATE)
tilgangService.validerHarSaksbehandlerrolle()
val henlagtBehandling = henleggService.henleggBehandling(behandlingId, henlagt)
val fagsak: Fagsak = fagsakService.hentFagsak(henlagtBehandling.fagsakId)
if (henlagt.skalSendeHenleggelsesbrev) {
sendHenleggelsesbrev(henlagt, behandlingId)
}

return Ressurs.success(henlagtBehandling.tilDto(fagsak.stønadstype))
}

private fun sendHenleggelsesbrev(
henlagt: HenlagtDto,
behandlingId: UUID,
) {
validerIkkeSendBrevPåFeilType(henlagt)
validerIkkeSendBrevHvisVergemålEllerFullmakt(behandlingService.hentAktivIdent(behandlingId))
val saksbehandlerSignatur = SikkerhetContext.hentSaksbehandlerNavn(strict = true)
val saksbehandlerIdent = SikkerhetContext.hentSaksbehandler()
val task: Task =
SendTrukketSøknadHenleggelsesbrevTask.opprettTask(behandlingId, saksbehandlerSignatur, saksbehandlerIdent)

taskService.save(task)
}

private fun validerIkkeSendBrevPåFeilType(henlagt: HenlagtDto) {
feilHvis(henlagt.skalSendeHenleggelsesbrev && henlagt.årsak == HenlagtÅrsak.FEILREGISTRERT) { "Skal ikke sende brev hvis type er ulik trukket tilbake" }
}

private fun validerIkkeSendBrevHvisVergemålEllerFullmakt(
ident: String,
) {
val personopplysninger = personopplysningerService.hentPersonopplysningerFraRegister(ident)
val harVerge = personopplysninger.vergemål.isNotEmpty()
val harFullmakt: Boolean =
personopplysninger.fullmakt
.filter {
it.gyldigTilOgMed == null ||
(
it.gyldigTilOgMed.isEqualOrAfter(
LocalDate.now(),
)
)
}.isNotEmpty()
feilHvis(harVerge || harFullmakt) {
"Skal ikke sende brev hvis person er tilknyttet vergemål eller fullmakt"
}
}

@PostMapping("{behandlingId}/henlegg/behandling-uten-oppgave")
fun henleggBehandlingUtenOppgave(
@PathVariable behandlingId: UUID,
@RequestBody henlagt: HenlagtDto,
): Ressurs<BehandlingDto> {
tilgangService.validerTilgangTilBehandling(behandlingId, AuditLoggerEvent.UPDATE)
tilgangService.validerHarSaksbehandlerrolle()
feilHvis(!featureToggleService.isEnabled(toggle = Toggle.HENLEGG_BEHANDLING_UTEN_OPPGAVE)) {
"Henleggelse av behandling uten å henlegge oppgave er ikke mulig - toggle ikke enablet for bruker"
}

val henlagtBehandling = henleggService.henleggBehandlingUtenOppgave(behandlingId, henlagt)
val fagsak: Fagsak = fagsakService.hentFagsak(henlagtBehandling.fagsakId)
return Ressurs.success(henlagtBehandling.tilDto(fagsak.stønadstype))
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
package no.nav.familie.ef.sak.behandling.henlegg

import no.nav.familie.ef.sak.behandling.BehandlingService
import no.nav.familie.ef.sak.behandling.domain.Behandling
import no.nav.familie.ef.sak.behandling.dto.HenlagtDto
import no.nav.familie.ef.sak.brev.BrevClient
import no.nav.familie.ef.sak.brev.FamilieDokumentClient
import no.nav.familie.ef.sak.brev.VedtaksbrevService
import no.nav.familie.ef.sak.brev.dto.Flettefelter
import no.nav.familie.ef.sak.felles.util.norskFormat
import no.nav.familie.ef.sak.oppgave.OppgaveService
import no.nav.familie.ef.sak.opplysninger.personopplysninger.PersonopplysningerService
import no.nav.familie.kontrakter.felles.ef.StønadType
import no.nav.familie.kontrakter.felles.objectMapper
import no.nav.familie.kontrakter.felles.oppgave.Oppgavetype
import org.springframework.stereotype.Service
import org.springframework.transaction.annotation.Transactional
import java.time.LocalDate
import java.util.UUID

@Service
class HenleggService(
private val behandlingService: BehandlingService,
private val oppgaveService: OppgaveService,
private val brevClient: BrevClient,
private val familieDokumentClient: FamilieDokumentClient,
private val personopplysningerService: PersonopplysningerService,
) {
@Transactional
fun henleggBehandling(
behandlingId: UUID,
henlagt: HenlagtDto,
): Behandling {
val behandling = behandlingService.henleggBehandling(behandlingId, henlagt)
ferdigstillOppgaveTask(behandling)
return behandling
}

@Transactional
fun henleggBehandlingUtenOppgave(
behandlingId: UUID,
henlagt: HenlagtDto,
): Behandling {
val behandling = behandlingService.henleggBehandling(behandlingId, henlagt, false)
settEfOppgaveTilFerdig(behandling)
return behandling
}

private fun ferdigstillOppgaveTask(behandling: Behandling) {
oppgaveService.ferdigstillOppgaveHvisOppgaveFinnes(
behandlingId = behandling.id,
Oppgavetype.BehandleSak,
ignorerFeilregistrert = true,
)
oppgaveService.ferdigstillOppgaveHvisOppgaveFinnes(
behandlingId = behandling.id,
Oppgavetype.BehandleUnderkjentVedtak,
ignorerFeilregistrert = true,
)
}

private fun settEfOppgaveTilFerdig(behandling: Behandling) {
oppgaveService.settEfOppgaveTilFerdig(
behandlingId = behandling.id,
Oppgavetype.BehandleSak,
)
oppgaveService.settEfOppgaveTilFerdig(
behandlingId = behandling.id,
Oppgavetype.BehandleUnderkjentVedtak,
)
}

fun genererHenleggelsesbrev(
behandlingId: UUID,
saksbehandlerSignatur: String,
): ByteArray {
val saksbehandling = behandlingService.hentSaksbehandling(behandlingId)
val personIdent = behandlingService.hentAktivIdent(behandlingId)
val stønadstype = saksbehandling.stønadstype
val henleggelsesbrev =
Henleggelsesbrev(
lagDemalMedFlettefeltForStønadstype(stønadstype),
lagNavnOgIdentFlettefelt(personIdent),
)

val html =
brevClient
.genererHtml(
brevmal = "informasjonsbrevTrukketSoknad",
saksbehandlerBrevrequest = objectMapper.valueToTree(henleggelsesbrev),
saksbehandlersignatur = saksbehandlerSignatur,
enhet = "Nav Arbeid og ytelser",
skjulBeslutterSignatur = true,
).replace(VedtaksbrevService.BESLUTTER_VEDTAKSDATO_PLACEHOLDER, LocalDate.now().norskFormat())

return familieDokumentClient.genererPdfFraHtml(html)
}

private fun lagNavnOgIdentFlettefelt(personIdent: String): Flettefelter {
val visningsNavn = personopplysningerService.hentGjeldeneNavn(listOf(personIdent)).getValue(personIdent)
val navnOgIdentFlettefelt = Flettefelter(navn = listOf(visningsNavn), fodselsnummer = listOf(personIdent))
return navnOgIdentFlettefelt
}

private fun lagDemalMedFlettefeltForStønadstype(stønadstype: StønadType) =
Delmaler(
listOf(
Delmal(
DelmalFlettefelt(
listOf(
lagStringForDelmalFlettefelt(stønadstype),
),
),
),
),
)

private fun lagStringForDelmalFlettefelt(stønadstype: StønadType): String =
when (stønadstype) {
StønadType.BARNETILSYN -> "stønad til " + stønadstype.name.lowercase()
StønadType.SKOLEPENGER -> "stønad til " + stønadstype.name.lowercase()
else -> stønadstype.name.lowercase()
}
}

private data class Henleggelsesbrev(
val delmaler: Delmaler,
val flettefelter: Flettefelter,
)

private data class Delmal(
val flettefelter: DelmalFlettefelt,
)

private data class Delmaler(
val stonadstype: List<Delmal>,
)

private data class DelmalFlettefelt(
val stonadstype: List<String>,
)
Loading

0 comments on commit ddf7700

Please sign in to comment.