Skip to content

Commit

Permalink
Merge pull request #1953 from navikt/støtt-klage-på-tilbakekrevingsve…
Browse files Browse the repository at this point in the history
…dtak

Støtt klage på tilbakekrevingsvedtak
  • Loading branch information
hestad authored Feb 10, 2025
2 parents 6628071 + 6c8d7c4 commit 131d599
Show file tree
Hide file tree
Showing 13 changed files with 246 additions and 118 deletions.
1 change: 1 addition & 0 deletions .idea/inspectionProfiles/Project_Default.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ import no.nav.su.se.bakover.client.krr.KontaktOgReservasjonsregister
import no.nav.su.se.bakover.client.krr.Kontaktinformasjon
import no.nav.su.se.bakover.client.skjerming.Skjerming
import no.nav.su.se.bakover.common.auth.AzureAd
import no.nav.su.se.bakover.common.domain.extensions.toNonEmptyList
import no.nav.su.se.bakover.common.domain.tid.februar
import no.nav.su.se.bakover.common.infrastructure.config.ApplicationConfig
import no.nav.su.se.bakover.common.infrastructure.token.JwtToken
Expand Down Expand Up @@ -52,7 +51,7 @@ internal class PersonClientTest {
@Test
fun `andre kall med nytt token hentes ikke fra cache`() {
val mocks = PersonClientConfigTestMocks(
BrukertokenGenerator(listOf("1", "2")),
BrukertokenGenerator(nonEmptyListOf("1", "2").map { JwtToken.BrukerToken(it) }),
)
val first =
mocks.personClient.person(fnr = mocks.fnr).also { it shouldBe mocks.person().right() }.getOrFail()
Expand Down Expand Up @@ -170,10 +169,6 @@ internal class PersonClientTest {
private val brukerTokens: NonEmptyList<JwtToken.BrukerToken> = nonEmptyListOf(JwtToken.BrukerToken("bruker-token")),
) : List<JwtToken.BrukerToken> by brukerTokens {

constructor(brukerTokens: List<String>) : this(
brukerTokens.map { JwtToken.BrukerToken(it) }.toNonEmptyList(),
)

var currentIndex = 0
fun next(): JwtToken.BrukerToken = brukerTokens[currentIndex++ % brukerTokens.size]
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ fun <T> RåSatser<T>.periodisert(tidligsteTilgjengeligeMåned: Måned): Månedss
emptyList()
}
}
}.let { Månedssatser(it) }
}.let { Månedssatser(it.toNonEmptyList<Månedssats<T>>()) }
}

data class RåSatser<T>(
Expand Down Expand Up @@ -84,9 +84,6 @@ data class Månedssatser<T>(
val satser: NonEmptyList<Månedssats<T>>,
) : List<Månedssats<T>> by satser {
constructor(sats: Månedssats<T>) : this(nonEmptyListOf(sats))
constructor(satser: List<Månedssats<T>>) : this(
satser.toNonEmptyList<Månedssats<T>>(),
)

init {
satser.map { it.måned }.let {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import no.nav.su.se.bakover.domain.klage.OversendtKlage
import no.nav.su.se.bakover.domain.klage.VilkårsvurdertKlage
import no.nav.su.se.bakover.domain.klage.VurdertKlage
import no.nav.su.se.bakover.domain.klage.brev.KunneIkkeLageBrevutkast
import java.util.UUID

interface KlageService {
fun opprett(request: NyKlageRequest): Either<KunneIkkeOppretteKlage, OpprettetKlage>
Expand Down Expand Up @@ -53,14 +54,14 @@ interface KlageService {

fun underkjenn(request: UnderkjennKlageRequest): Either<KunneIkkeUnderkjenneKlage, Klage>

fun oversend(klageId: KlageId, attestant: NavIdentBruker.Attestant): Either<KunneIkkeOversendeKlage, OversendtKlage>
fun oversend(sakId: UUID, klageId: KlageId, attestant: NavIdentBruker.Attestant): Either<KunneIkkeOversendeKlage, OversendtKlage>

fun iverksettAvvistKlage(
klageId: KlageId,
attestant: NavIdentBruker.Attestant,
): Either<KunneIkkeIverksetteAvvistKlage, IverksattAvvistKlage>

fun brevutkast(klageId: KlageId, ident: NavIdentBruker): Either<KunneIkkeLageBrevutkast, PdfA>
fun brevutkast(sakId: UUID, klageId: KlageId, ident: NavIdentBruker): Either<KunneIkkeLageBrevutkast, PdfA>

fun avslutt(
klageId: KlageId,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import arrow.core.right
import behandling.klage.domain.KlageId
import dokument.domain.Dokument
import dokument.domain.brev.BrevService
import dokument.domain.hendelser.DokumentHendelseRepo
import dokument.domain.journalføring.ErTilknyttetSak
import dokument.domain.journalføring.KunneIkkeSjekkeTilknytningTilSak
import dokument.domain.journalføring.QueryJournalpostClient
Expand All @@ -21,6 +22,7 @@ import no.nav.su.se.bakover.domain.klage.AvsluttetKlage
import no.nav.su.se.bakover.domain.klage.AvvistKlage
import no.nav.su.se.bakover.domain.klage.IverksattAvvistKlage
import no.nav.su.se.bakover.domain.klage.KanBekrefteKlagevurdering
import no.nav.su.se.bakover.domain.klage.KanGenerereBrevutkast
import no.nav.su.se.bakover.domain.klage.KanLeggeTilFritekstTilAvvistBrev
import no.nav.su.se.bakover.domain.klage.Klage
import no.nav.su.se.bakover.domain.klage.KlageClient
Expand All @@ -30,6 +32,7 @@ import no.nav.su.se.bakover.domain.klage.KlageTilAttestering
import no.nav.su.se.bakover.domain.klage.KunneIkkeAvslutteKlage
import no.nav.su.se.bakover.domain.klage.KunneIkkeBekrefteKlagesteg
import no.nav.su.se.bakover.domain.klage.KunneIkkeIverksetteAvvistKlage
import no.nav.su.se.bakover.domain.klage.KunneIkkeLageBrevKommandoForKlage
import no.nav.su.se.bakover.domain.klage.KunneIkkeLeggeTilFritekstForAvvist
import no.nav.su.se.bakover.domain.klage.KunneIkkeOppretteKlage
import no.nav.su.se.bakover.domain.klage.KunneIkkeOversendeKlage
Expand Down Expand Up @@ -57,6 +60,8 @@ import no.nav.su.se.bakover.oppgave.domain.Oppgavetype
import no.nav.su.se.bakover.vedtak.application.VedtakService
import org.slf4j.LoggerFactory
import java.time.Clock
import java.time.LocalDate
import java.util.UUID

class KlageServiceImpl(
private val sakService: SakService,
Expand All @@ -67,6 +72,7 @@ class KlageServiceImpl(
private val sessionFactory: SessionFactory,
private val oppgaveService: OppgaveService,
private val queryJournalpostClient: QueryJournalpostClient,
private val dokumentHendelseRepo: DokumentHendelseRepo,
val clock: Clock,
) : KlageService {

Expand Down Expand Up @@ -135,7 +141,8 @@ class KlageServiceImpl(
throw RuntimeException("Fant ikke sak med id ${command.sakId}")
}
command.vedtakId?.let {
val vedtak = sak.hentVedtakForId(command.vedtakId) ?: return KunneIkkeVilkårsvurdereKlage.FantIkkeVedtak.left()
val vedtak =
sak.hentVedtakForId(command.vedtakId) ?: return KunneIkkeVilkårsvurdereKlage.FantIkkeVedtak.left()
if (!vedtak.skalSendeBrev) {
// Dersom vi ikke har sendt ut et vedtaksbrev, kan det ikke beklages.
return KunneIkkeVilkårsvurdereKlage.VedtakSkalIkkeSendeBrev.left()
Expand Down Expand Up @@ -248,7 +255,7 @@ class KlageServiceImpl(
} ?: OppdaterOppgaveInfo.TilordnetRessurs.IkkeTilordneRessurs,
),
).mapLeft {
log.error("Feil ved oppdatering av oppgave ${klage.oppgaveId}, for klage ${klage.id}. Feilen var $it")
log.error("Send klagebehandling til attestering: Feil ved oppdatering av oppgave ${klage.oppgaveId}, for klage ${klage.id}. Feilen var $it")
}
}
}
Expand All @@ -272,26 +279,38 @@ class KlageServiceImpl(
tilordnetRessurs = OppdaterOppgaveInfo.TilordnetRessurs.NavIdent(klage.saksbehandler.navIdent),
),
).mapLeft {
log.error("Feil ved oppdatering av oppgave ${klage.oppgaveId}, for klage ${klage.id}. Feilen var $it")
log.error("Underkjenn klagebehandling: Feil ved oppdatering av oppgave ${klage.oppgaveId}, for klage ${klage.id}. Feilen var $it")
}
}
}

override fun oversend(
sakId: UUID,
klageId: KlageId,
attestant: NavIdentBruker.Attestant,
): Either<KunneIkkeOversendeKlage, OversendtKlage> {
val klage = (klageRepo.hentKlage(klageId) ?: return KunneIkkeOversendeKlage.FantIkkeKlage.left()).let {
it as? KlageTilAttestering.Vurdert ?: return KunneIkkeOversendeKlage.UgyldigTilstand(it::class)
.left()
}
val sak = sakService.hentSak(sakId)
.getOrElse {
throw java.lang.IllegalStateException("Kunne ikke generere brevutkast for sak. Fant ikke sak med id $sakId og klageId $klageId")
}

val klage = (
sak.hentKlage(klageId)
?: run {
log.error("Kunne ikke generere brevutkast for sak. Fant ikke klage med id $klageId på sak $sakId")
return KunneIkkeOversendeKlage.FantIkkeKlage.left()
}

).let {
(it as? KlageTilAttestering.Vurdert) ?: return KunneIkkeOversendeKlage.UgyldigTilstand(it::class).left()
}
val vedtakId = klage.vilkårsvurderinger.vedtakId
val oversendtKlage =
klage.oversend(Attestering.Iverksatt(attestant = attestant, opprettet = Tidspunkt.now(clock)))
.getOrElse { return it.left() }

val dokument = oversendtKlage.genererOversendelsesbrev(
hentVedtaksbrevDato = { klageRepo.hentVedtaksbrevDatoSomDetKlagesPå(klage.id) },
hentVedtaksbrevDato = { hentVedtaksbrevDatoForKlage(sakId, vedtakId, klageId) },
).getOrElse {
return KunneIkkeOversendeKlage.KunneIkkeLageBrevRequest(it).left()
}.let {
Expand Down Expand Up @@ -390,20 +409,49 @@ class KlageServiceImpl(
}

override fun brevutkast(
sakId: UUID,
klageId: KlageId,
ident: NavIdentBruker,
): Either<KunneIkkeLageBrevutkast, PdfA> {
val sak = sakService.hentSak(sakId)
.getOrElse { throw IllegalStateException("Kunne ikke generere brevutkast for sak. Fant ikke sak med id $sakId og klageId $klageId") }
val klage = sak.hentKlage(klageId)
?: run {
log.error("Kunne ikke generere brevutkast for sak. Fant ikke klage med id $klageId på sak $sakId")
return KunneIkkeLageBrevutkast.FantIkkeKlage.left()
}
(klage as? KanGenerereBrevutkast) ?: return KunneIkkeLageBrevutkast.FeilVedBrevRequest(
KunneIkkeLageBrevKommandoForKlage.UgyldigTilstand(fra = klage::class),
).left()
val vedtakId = klage.vilkårsvurderinger?.vedtakId ?: return KunneIkkeLageBrevutkast.FeilVedBrevRequest(KunneIkkeLageBrevKommandoForKlage.UgyldigTilstand(klage::class)).left()
val vedtaksbrevdato = hentVedtaksbrevDatoForKlage(sakId, vedtakId, klageId)
?: run {
log.error("Kunne ikke generere brevutkast for sak. Fant ikke vedtaksbrevdato for sak $sakId og vedtakId $vedtakId")
return KunneIkkeLageBrevutkast.FeilVedBrevRequest(KunneIkkeLageBrevKommandoForKlage.FeilVedHentingAvVedtaksbrevDato)
.left()
}
return genererBrevutkastForKlage(
klageId = klageId,
ident = ident,
hentKlage = { klageRepo.hentKlage(klageId) },
hentVedtaksbrevDato = { klageRepo.hentVedtaksbrevDatoSomDetKlagesPå(klageId) },
hentKlage = { klage },
hentVedtaksbrevDato = { vedtaksbrevdato },
genererPdf = {
brevService.lagDokument(command = it).map { it.generertDokument }
},
)
}

private fun hentVedtaksbrevDatoForKlage(
sakId: UUID,
vedtakId: UUID,
klageId: KlageId,
): LocalDate? {
return (
klageRepo.hentVedtaksbrevDatoSomDetKlagesPå(klageId)
?: dokumentHendelseRepo.hentVedtaksbrevdatoForSakOgVedtakId(sakId, vedtakId)
)
}

override fun avslutt(
klageId: KlageId,
saksbehandler: NavIdentBruker.Saksbehandler,
Expand Down
Loading

0 comments on commit 131d599

Please sign in to comment.