Skip to content

Commit

Permalink
Merge pull request #1602 from navikt/iverksett-tilbakekreving-vedtaks…
Browse files Browse the repository at this point in the history
…brev

tilbakekreving-vedtaksbrev konsument
  • Loading branch information
ramnav990 authored Dec 13, 2023
2 parents 5ed220a + 54021b7 commit 43166f5
Show file tree
Hide file tree
Showing 32 changed files with 603 additions and 118 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,11 @@ data object DatabaseBuilder {
sessionFactory,
),
)
val dokumentHendelseRepo = DokumentHendelsePostgresRepo(
hendelseRepo = hendelseRepo,
hendelseFilRepo = HendelseFilPostgresRepo(sessionFactory),
sessionFactory = sessionFactory,
)

return DatabaseRepos(
avstemming = AvstemmingPostgresRepo(sessionFactory, dbMetrics),
Expand Down Expand Up @@ -313,7 +318,7 @@ data object DatabaseBuilder {
revurderingRepo = revurderingRepo,
vedtakRepo = vedtakRepo,
personhendelseRepo = personhendelseRepo,
dokumentRepo = DokumentPostgresRepo(sessionFactory, dbMetrics, clock),
dokumentRepo = DokumentPostgresRepo(sessionFactory, dbMetrics, clock, dokumentHendelseRepo),
nøkkeltallRepo = nøkkeltallRepo,
sessionFactory = sessionFactory,
klageRepo = klageRepo,
Expand All @@ -329,11 +334,7 @@ data object DatabaseBuilder {
institusjonsoppholdHendelseRepo = InstitusjonsoppholdHendelsePostgresRepo(dbMetrics, hendelseRepo),
oppgaveHendelseRepo = OppgaveHendelsePostgresRepo(dbMetrics, hendelseRepo, sessionFactory),
hendelsekonsumenterRepo = HendelsekonsumenterPostgresRepo(sessionFactory),
dokumentHendelseRepo = DokumentHendelsePostgresRepo(
hendelseRepo = hendelseRepo,
hendelseFilRepo = HendelseFilPostgresRepo(sessionFactory),
sessionFactory = sessionFactory,
),
dokumentHendelseRepo = dokumentHendelseRepo,
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -358,6 +358,7 @@ internal class SakPostgresRepo(
private fun Row.toSak(sessionContext: SessionContext): Sak {
return sessionContext.withSession { session ->
val sakId = UUID.fromString(string("id"))
val tilbakekrevingsbehandlingHendelser = tilbakekrevingRepo.hentForSak(sakId, sessionContext)
Sak(
id = sakId,
saksnummer = Saksnummer(long("saksnummer")),
Expand All @@ -369,10 +370,11 @@ internal class SakPostgresRepo(
revurderinger = revurderingRepo.hentRevurderingerForSak(sakId, session),
reguleringer = reguleringRepo.hentForSakId(sakId, sessionContext),
klager = klageRepo.hentKlager(sakId, sessionContext),
tilbakekrevinger = tilbakekrevingRepo.hentForSak(sakId, sessionContext).currentState,
tilbakekrevinger = tilbakekrevingsbehandlingHendelser.currentState,
),
utbetalinger = Utbetalinger(UtbetalingInternalRepo.hentOversendteUtbetalinger(sakId, session)),
vedtakListe = vedtakPostgresRepo.hentForSakId(sakId, session),
vedtakListe = vedtakPostgresRepo.hentForSakId(sakId, session) +
tilbakekrevingsbehandlingHendelser.currentStateVedtak,
type = Sakstype.from(string("type")),
utenlandsopphold = utenlandsoppholdRepo.hentForSakId(sakId, sessionContext).currentState,
// Siden vi ikke har migrert SAK_OPPRETTET-hendelser, vil vi ikke alltid ha en hendelse knyttet til denne saken. Vi reserverer da den aller første hendelsesversjonen til SAK_OPPRETTET.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package dokument.domain

import arrow.core.NonEmptyList
import dokument.domain.hendelser.DistribuertDokumentHendelse
import dokument.domain.hendelser.DokumentHendelse
import dokument.domain.hendelser.GenerertDokumentHendelse
import dokument.domain.hendelser.JournalførtDokumentHendelse
import java.util.UUID

data class DokumentHendelseSerie(
val sakId: UUID,
val dokumenter: NonEmptyList<DokumentHendelse>,
) : List<DokumentHendelse> by dokumenter {
/** Dette vil være hendelsen som første til dokumentgenereringen og denne dokumenthendelsesserien*/
val relatertHendelse = dokumenter[0].relatertHendelse

fun leggTilHendelse(hendelse: DokumentHendelse): DokumentHendelseSerie {
return DokumentHendelseSerie(sakId, dokumenter + hendelse)
}

fun dokumenttilstand(): Dokumenttilstand {
return when (val dokument = this.dokumenter.lastOrNull()) {
is GenerertDokumentHendelse -> {
if (dokument.skalSendeBrev) {
Dokumenttilstand.GENERERT
} else {
Dokumenttilstand.SKAL_IKKE_GENERERE
}
}

is JournalførtDokumentHendelse -> Dokumenttilstand.JOURNALFØRT
is DistribuertDokumentHendelse -> Dokumenttilstand.SENDT
}
}

init {
dokumenter.map { it.sakId }.distinct().let {
require(listOf(sakId) == it) {
"Forventer at alle dokumenter er relatert til samme sak. Forventet $sakId, men var $it}"
}
}
dokumenter.zipWithNext { a, b ->
require(a.versjon < b.versjon) {
"Forventer at dokumenter er sortert etter versjon. Var ${a.versjon} og ${b.versjon}"
}
}
if (dokumenter.isNotEmpty()) {
require(dokumenter[0] is GenerertDokumentHendelse) {
"Forventer at første dokument er generert. Var ${dokumenter[0]}"
}
}
if (dokumenter.size > 1) {
require(dokumenter[1] is JournalførtDokumentHendelse) {
"Forventer at det andre dokumentet er Journalført. Var ${dokumenter[1]}"
}
}
if (dokumenter.size > 2) {
require(dokumenter[2] is DistribuertDokumentHendelse) {
"Forventer at det siste dokumenter er distribuert. Var ${dokumenter[2]}"
}
}
require(dokumenter.size <= 3) {
"Forventer at det er maks 3 dokumenter i serien. Var ${dokumenter.size}"
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package dokument.domain

import arrow.core.nonEmptyListOf
import dokument.domain.hendelser.DistribuertDokumentHendelse
import dokument.domain.hendelser.DokumentHendelse
import dokument.domain.hendelser.GenerertDokumentHendelse
import dokument.domain.hendelser.JournalførtDokumentHendelse
import no.nav.su.se.bakover.hendelse.domain.HendelseId
import java.util.UUID

/**
* Forventer at alle dokumenter i serien er relatert til samme sak.
*/
data class DokumentHendelser(
val sakId: UUID,
val serier: List<DokumentHendelseSerie>,
) : List<DokumentHendelseSerie> by serier {

init {
serier.map { it.sakId }.distinct().let {
if (it.isNotEmpty()) {
require(listOf(sakId) == it) {
"Forventer at alle dokumenter er relatert til samme sak. Forventet $sakId, men var $it}"
}
}
}
}

fun hentSerieForRelatertHendelse(hendelseId: HendelseId): DokumentHendelseSerie? {
return serier.find {
it.dokumenter.map { it.relatertHendelse }.contains(hendelseId)
}
}

fun hentGenererte(): List<GenerertDokumentHendelse> {
return serier.flatMap { it.dokumenter }.filterIsInstance<GenerertDokumentHendelse>()
}

companion object {
fun empty(sakId: UUID) = DokumentHendelser(sakId = sakId, serier = emptyList())

fun create(sakId: UUID, dokumenter: List<DokumentHendelse>): DokumentHendelser {
dokumenter.map { it.sakId }.distinct().let {
if (it.isNotEmpty()) {
require(listOf(sakId) == it) {
"Forventer at alle dokumenter er relatert til samme sak. Forventet $sakId, men var $it}"
}
}
}
val sorterteDokumenter = dokumenter.sortedBy { it.versjon }

return sorterteDokumenter.fold(mapOf<HendelseId, DokumentHendelseSerie>()) { acc, hendelse ->
val hendelseId = hendelse.hendelseId
when (hendelse) {
is GenerertDokumentHendelse -> acc.plus(
hendelseId to DokumentHendelseSerie(
sakId = sakId,
dokumenter = nonEmptyListOf(hendelse),
),
)

is JournalførtDokumentHendelse -> acc.plus(
hendelseId to acc[hendelse.relatertHendelse]!!.leggTilHendelse(hendelse),
).minus(hendelse.relatertHendelse)

is DistribuertDokumentHendelse -> acc.plus(
hendelseId to acc[hendelse.relatertHendelse]!!.leggTilHendelse(hendelse),
).minus(hendelse.relatertHendelse)
}
}.values.toList().let {
DokumentHendelser(sakId = sakId, serier = it)
}
}
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package dokument.domain.hendelser

import dokument.domain.DokumentHendelser
import no.nav.su.se.bakover.common.persistence.SessionContext
import no.nav.su.se.bakover.hendelse.domain.DefaultHendelseMetadata
import no.nav.su.se.bakover.hendelse.domain.HendelseFil
Expand All @@ -20,7 +21,7 @@ interface DokumentHendelseRepo {
)

fun lagre(hendelse: DokumentHendelse, meta: DefaultHendelseMetadata, sessionContext: SessionContext? = null)
fun hentForSak(sakId: UUID, sessionContext: SessionContext? = null): List<DokumentHendelse>
fun hentForSak(sakId: UUID, sessionContext: SessionContext? = null): DokumentHendelser
fun hentHendelse(hendelseId: HendelseId, sessionContext: SessionContext? = null): DokumentHendelse?
fun hentFilFor(hendelseId: HendelseId, sessionContext: SessionContext? = null): HendelseFil?
fun hentHendelseOgFilFor(hendelseId: HendelseId, sessionContext: SessionContext? = null): Pair<DokumentHendelse?, HendelseFil?>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package no.nav.su.se.bakover.dokument.infrastructure

import dokument.domain.DokumentHendelser
import dokument.domain.hendelser.DistribuertDokument
import dokument.domain.hendelser.DistribuertDokumentHendelse
import dokument.domain.hendelser.DokumentHendelse
Expand Down Expand Up @@ -92,7 +93,7 @@ class DokumentHendelsePostgresRepo(
}
}

override fun hentForSak(sakId: UUID, sessionContext: SessionContext?): List<DokumentHendelse> {
override fun hentForSak(sakId: UUID, sessionContext: SessionContext?): DokumentHendelser {
return (hendelseRepo as HendelsePostgresRepo).let { repo ->
listOf(
GenerertDokument,
Expand All @@ -104,6 +105,8 @@ class DokumentHendelsePostgresRepo(
type = it,
sessionContext = sessionContext,
).map { it.toDokumentHendelse() }
}.let {
DokumentHendelser.create(sakId = sakId, dokumenter = it)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,16 @@ import java.util.UUID
*/
data class DokumentMetaDataDbJson(
val sakId: UUID,
val tilbakekrevingsbehandlingId: UUID,
val tilbakekrevingsbehandlingId: UUID?,
val vedtakId: UUID?,
val journalpostId: String?,
val brevbestillingsId: String?,
) {
companion object {
fun Dokument.Metadata.toHendelseDbJson(): DokumentMetaDataDbJson = DokumentMetaDataDbJson(
sakId = this.sakId,
tilbakekrevingsbehandlingId = this.tilbakekrevingsbehandlingId!!,
tilbakekrevingsbehandlingId = this.tilbakekrevingsbehandlingId,
vedtakId = this.vedtakId,
journalpostId = this.journalpostId,
brevbestillingsId = this.brevbestillingId,
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@ import dokument.domain.DokumentRepo
import dokument.domain.Dokumentdistribusjon
import dokument.domain.JournalføringOgBrevdistribusjon
import dokument.domain.brev.BrevbestillingId
import dokument.domain.hendelser.DokumentHendelseRepo
import kotliquery.Row
import no.nav.su.se.bakover.common.domain.PdfA
import no.nav.su.se.bakover.common.infrastructure.persistence.DbMetrics
import no.nav.su.se.bakover.common.infrastructure.persistence.PostgresSessionContext.Companion.withSession
import no.nav.su.se.bakover.common.infrastructure.persistence.PostgresSessionFactory
import no.nav.su.se.bakover.common.infrastructure.persistence.PostgresTransactionContext.Companion.withTransaction
import no.nav.su.se.bakover.common.infrastructure.persistence.Session
Expand All @@ -27,6 +29,7 @@ class DokumentPostgresRepo(
private val sessionFactory: PostgresSessionFactory,
private val dbMetrics: DbMetrics,
private val clock: Clock,
private val dokumentHendelseRepo: DokumentHendelseRepo,
) : DokumentRepo {

private val joinDokumentOgDistribusjonQuery =
Expand Down Expand Up @@ -85,13 +88,23 @@ class DokumentPostgresRepo(

override fun hentForSak(id: UUID): List<Dokument.MedMetadata> {
return dbMetrics.timeQuery("hentDokumentMedMetadataForSakId") {
sessionFactory.withSession { session ->
"""
sessionFactory.withSessionContext { ct ->
val genererte = dokumentHendelseRepo.hentForSak(id, ct).hentGenererte()
val dokumenterFraHendelser = genererte.map {
val fil = dokumentHendelseRepo.hentFilFor(it.hendelseId, ct)!!
it.dokumentUtenFil.toDokumentMedMetadata(fil.fil)
}

(
ct.withSession {
"""
$joinDokumentOgDistribusjonQuery and sakId = :id
""".trimIndent()
.hentListe(mapOf("id" to id), session) {
it.toDokumentMedStatus()
}
""".trimIndent()
.hentListe(mapOf("id" to id), it) {
it.toDokumentMedStatus()
}
} + dokumenterFraHendelser
).sortedBy { it.opprettet.instant }
}
}
}
Expand Down Expand Up @@ -196,7 +209,8 @@ class DokumentPostgresRepo(
where journalpostId is null
order by opprettet asc
limit :limit
""".trimIndent().hentListe(mapOf("limit" to antallSomSkalHentes), session) { it.toDokumentdistribusjon(session) }
""".trimIndent()
.hentListe(mapOf("limit" to antallSomSkalHentes), session) { it.toDokumentdistribusjon(session) }
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,7 @@ fun fromBrevCommand(
command = command,
personalia = personalia().bind(),
saksbehandlerNavn = hentNavnMappedLeft(command.saksbehandler).bind(),
attestantNavn = command.attestant?.let { hentNavnMappedLeft(it).bind() },
clock = clock,
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import java.time.LocalDate
internal data class VedtaksbrevTilbakekrevingsbehandlingPdfInnhold(
val personalia: PersonaliaPdfInnhold,
val saksbehandlerNavn: String,
val attestantNavn: String?,
val fritekst: String?,
val dato: String,
valnedsoversiktMedSum: MånedsoversiktMedSum,
Expand All @@ -25,11 +26,13 @@ internal data class VedtaksbrevTilbakekrevingsbehandlingPdfInnhold(
command: VedtaksbrevTilbakekrevingsbehandlingDokumentCommand,
personalia: PersonaliaPdfInnhold,
saksbehandlerNavn: String,
attestantNavn: String?,
clock: Clock,
): VedtaksbrevTilbakekrevingsbehandlingPdfInnhold {
return VedtaksbrevTilbakekrevingsbehandlingPdfInnhold(
personalia = personalia,
saksbehandlerNavn = saksbehandlerNavn,
attestantNavn = attestantNavn,
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
Expand Down
2 changes: 2 additions & 0 deletions test-common/src/main/kotlin/TilbakekrevingTestData.kt
Original file line number Diff line number Diff line change
Expand Up @@ -335,6 +335,7 @@ fun nyIverksattTilbakekrevingsbehandlingHendelse(
hendelseId: HendelseId = HendelseId.generer(),
hendelsesTidspunkt: Tidspunkt = fixedTidspunkt,
versjon: Hendelsesversjon = forrigeHendelse.versjon.inc(),
vedtakId: UUID = UUID.randomUUID(),
): IverksattHendelse = IverksattHendelse(
hendelseId = hendelseId,
sakId = forrigeHendelse.sakId,
Expand All @@ -343,6 +344,7 @@ fun nyIverksattTilbakekrevingsbehandlingHendelse(
id = forrigeHendelse.id,
utførtAv = utførtAv,
tidligereHendelseId = forrigeHendelse.hendelseId,
vedtakId = vedtakId,
)

fun nyAvbruttTilbakekrevingsbehandlingHendelse(
Expand Down
3 changes: 2 additions & 1 deletion test-common/src/main/kotlin/persistence/TestDataHelper.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import arrow.core.Tuple6
import arrow.core.Tuple8
import arrow.core.nonEmptyListOf
import arrow.core.right
import dokument.domain.DokumentHendelser
import io.kotest.matchers.shouldBe
import kotliquery.using
import no.nav.su.se.bakover.common.UUID30
Expand Down Expand Up @@ -1871,7 +1872,7 @@ class TestDataHelper(
clock = fixedClock,
kravgrunnlagPåSak = KravgrunnlagPåSakHendelser(listOf(it.sixth)),
oppgaveHendelser = listOf(it.eighth),
dokumentHendelser = listOf(),
dokumentHendelser = DokumentHendelser.empty(it.first.id),
),
)
}
Expand Down
Loading

0 comments on commit 43166f5

Please sign in to comment.