Skip to content

Commit

Permalink
lager serier av dokumenter & har med vedtak i saken
Browse files Browse the repository at this point in the history
  • Loading branch information
ramnav990 committed Dec 11, 2023
1 parent bf88622 commit e39dd6e
Show file tree
Hide file tree
Showing 24 changed files with 303 additions and 108 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 @@ -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
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
Original file line number Diff line number Diff line change
Expand Up @@ -80,11 +80,10 @@ class GenererDokumentForForhåndsvarselTilbakekrevingKonsument(
val sakId = sak.id

tilbakekrevingsbehandlingRepo.hentForSak(sakId).hentDokumenterForHendelseId(hendelseId).let {
if (it.isNotEmpty()) {
val ider = it.map { it.hendelseId }
if (it != null) {
return Unit.also {
hendelsekonsumenterRepo.lagre(hendelseId, konsumentId)
log.error("Feil under generering av forhåndsvarseldokument: Fant dokumenter knyttet til hendelsen. Dor sak $sakId og hendelse $hendelseId og dokumenthendelser $ider")
log.error("Feil under generering av forhåndsvarseldokument: Fant dokumenter knyttet til hendelsen. Dor sak $sakId og hendelse $hendelseId")
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,11 +77,10 @@ class GenererVedtaksbrevTilbakekrevingKonsument(
nesteVersjon: Hendelsesversjon,
) {
tilbakekrevingsbehandlingRepo.hentForSak(sak.id).hentDokumenterForHendelseId(hendelseId).let {
if (it.isNotEmpty()) {
val ider = it.map { it.hendelseId }
if (it != null) {
return Unit.also {
hendelsekonsumenterRepo.lagre(hendelseId, konsumentId)
log.error("Feil under generering av vedtaksbrev for tilbakekreving: Fant dokumenter knyttet til hendelsen. For sak ${sak.id} og hendelse $hendelseId og dokumenthendelser $ider. Denne hendelsen blir lagret i konsumenten")
log.error("Feil under generering av vedtaksbrev for tilbakekreving: Fant dokumenter knyttet til hendelsen. For sak ${sak.id} og hendelse $hendelseId. Denne hendelsen blir lagret i konsumenten")
}
}
}
Expand Down Expand Up @@ -156,8 +155,7 @@ class GenererVedtaksbrevTilbakekrevingKonsument(
.leggTilMetadata(
Dokument.Metadata(
sakId = sakInfo.sakId,
// TODO - må ha vedtaket
vedtakId = null,
vedtakId = iverksattHendelse.vedtakId,
),
)

Expand Down
Loading

0 comments on commit e39dd6e

Please sign in to comment.