Skip to content

Commit

Permalink
Merge pull request #1841 from navikt/laste-opp-pdf-fritekst-brev-sak
Browse files Browse the repository at this point in the history
kan sende pdf istedenfor fritkest ved utsending av brev fra sak
  • Loading branch information
RamziAbuQassim authored Jun 13, 2024
2 parents ce34700 + 62a0718 commit befeb79
Show file tree
Hide file tree
Showing 10 changed files with 316 additions and 27 deletions.
6 changes: 3 additions & 3 deletions dokument/domain/src/main/kotlin/dokument/domain/Dokument.kt
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ sealed interface Dokument {
override val distribusjonstype = Distribusjonstype.VEDTAK

constructor(
utenMetadata: UtenMetadata,
utenMetadata: UtenMetadata.Vedtak,
metadata: Metadata,
distribueringsadresse: Distribueringsadresse?,
) : this(
Expand Down Expand Up @@ -134,7 +134,7 @@ sealed interface Dokument {
override val distribusjonstype = Distribusjonstype.VIKTIG

constructor(
utenMetadata: UtenMetadata,
utenMetadata: UtenMetadata.Informasjon.Viktig,
metadata: Metadata,
distribueringsadresse: Distribueringsadresse?,
) : this(
Expand All @@ -160,7 +160,7 @@ sealed interface Dokument {
override val distribusjonstype = Distribusjonstype.ANNET

constructor(
utenMetadata: UtenMetadata,
utenMetadata: UtenMetadata.Informasjon.Annet,
metadata: Metadata,
distribueringsadresse: Distribueringsadresse?,
) : this(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ data class DokumentMedMetadataUtenFil(
): Dokument.MedMetadata {
return when (distribusjonstype) {
Distribusjonstype.VEDTAK -> Dokument.MedMetadata.Vedtak(
utenMetadata = toDokumentUtenMetadata(pdf),
utenMetadata = toDokumentUtenMetadata(pdf) as Dokument.UtenMetadata.Vedtak,
metadata = metadata.copy(
journalpostId = journalpostId?.toString(),
brevbestillingId = brevbestillingId?.toString(),
Expand All @@ -41,7 +41,7 @@ data class DokumentMedMetadataUtenFil(
)

Distribusjonstype.VIKTIG -> Dokument.MedMetadata.Informasjon.Viktig(
utenMetadata = toDokumentUtenMetadata(pdf),
utenMetadata = toDokumentUtenMetadata(pdf) as Dokument.UtenMetadata.Informasjon.Viktig,
metadata = metadata.copy(
journalpostId = journalpostId?.toString(),
brevbestillingId = brevbestillingId?.toString(),
Expand All @@ -50,7 +50,7 @@ data class DokumentMedMetadataUtenFil(
)

Distribusjonstype.ANNET -> Dokument.MedMetadata.Informasjon.Annet(
utenMetadata = toDokumentUtenMetadata(pdf),
utenMetadata = toDokumentUtenMetadata(pdf) as Dokument.UtenMetadata.Informasjon.Annet,
metadata = metadata.copy(
journalpostId = journalpostId?.toString(),
brevbestillingId = brevbestillingId?.toString(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import dokument.domain.distribuering.Distribueringsadresse
import no.nav.su.se.bakover.common.deserialize
import no.nav.su.se.bakover.common.serialize

fun Distribueringsadresse.toDbJson(): String = serialize(
internal fun Distribueringsadresse.toDbJson(): String = serialize(
DistribueringsAdresseJson(
adresselinje1 = adresselinje1,
adresselinje2 = adresselinje2,
Expand All @@ -14,7 +14,7 @@ fun Distribueringsadresse.toDbJson(): String = serialize(
),
)

fun deserializeDistribueringsadresse(json: String): Distribueringsadresse =
internal fun deserializeDistribueringsadresse(json: String): Distribueringsadresse =
deserialize<DistribueringsAdresseJson>(json).let {
Distribueringsadresse(
adresselinje1 = it.adresselinje1,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package no.nav.su.se.bakover.domain.sak

import dokument.domain.Distribusjonstype
import dokument.domain.Dokument
import dokument.domain.distribuering.Distribueringsadresse
import no.nav.su.se.bakover.common.domain.PdfA
import no.nav.su.se.bakover.common.ident.NavIdentBruker
import no.nav.su.se.bakover.common.serialize
import no.nav.su.se.bakover.common.tid.Tidspunkt
import java.time.Clock
import java.util.UUID

data class JournalførOgSendDokumentCommand(
val sakId: UUID,
val saksbehandler: NavIdentBruker.Saksbehandler,
val journaltittel: String,
val pdf: PdfA,
val distribueringsadresse: Distribueringsadresse?,
val distribusjonstype: Distribusjonstype,
) {
fun opprettDokumentMedMetadata(clock: Clock): Dokument.MedMetadata {
val generertDokumentJson = createJson()

return when (this.distribusjonstype) {
Distribusjonstype.VEDTAK -> Dokument.MedMetadata.Vedtak(
utenMetadata = Dokument.UtenMetadata.Vedtak(
id = UUID.randomUUID(),
opprettet = Tidspunkt.now(clock),
tittel = journaltittel,
generertDokument = pdf,
generertDokumentJson = generertDokumentJson,
),
metadata = Dokument.Metadata(sakId = this.sakId),
distribueringsadresse = this.distribueringsadresse,
)

Distribusjonstype.VIKTIG -> Dokument.MedMetadata.Informasjon.Viktig(
utenMetadata = Dokument.UtenMetadata.Informasjon.Viktig(
id = UUID.randomUUID(),
opprettet = Tidspunkt.now(clock),
tittel = journaltittel,
generertDokument = pdf,
generertDokumentJson = generertDokumentJson,
),
metadata = Dokument.Metadata(sakId = this.sakId),
distribueringsadresse = this.distribueringsadresse,
)

Distribusjonstype.ANNET -> Dokument.MedMetadata.Informasjon.Annet(
utenMetadata = Dokument.UtenMetadata.Informasjon.Annet(
id = UUID.randomUUID(),
opprettet = Tidspunkt.now(clock),
tittel = journaltittel,
generertDokument = pdf,
generertDokumentJson = generertDokumentJson,
),
metadata = Dokument.Metadata(sakId = this.sakId),
distribueringsadresse = this.distribueringsadresse,
)
}
}

private fun createJson(): String = JournalførOgSendDokumentJson(
saksbehandler = saksbehandler,
journaltittel = journaltittel,
distribueringsadresse = distribueringsadresse,
distribusjonstype = distribusjonstype,
).let { serialize(it) }
}

private data class JournalførOgSendDokumentJson(
val saksbehandler: NavIdentBruker.Saksbehandler,
val journaltittel: String,
val distribueringsadresse: Distribueringsadresse?,
val distribusjonstype: Distribusjonstype,
) {
/**
* kommentar som skal bli inkludert i json for generertDokumentJson
*/
val kommentar: String = "Pdf er lastet opp manuelt. Innholdet i brevet er ukjent"
}
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,12 @@ interface SakService {

fun hentSakForSøknad(søknadId: UUID): Either<FantIkkeSak, Sak>
fun opprettFritekstDokument(request: OpprettDokumentRequest): Either<KunneIkkeOppretteDokument, Dokument.UtenMetadata>
fun lagreOgSendFritekstDokument(request: OpprettDokumentRequest): Either<KunneIkkeOppretteDokument, Dokument.MedMetadata>
fun genererLagreOgSendFritekstDokument(request: OpprettDokumentRequest): Either<KunneIkkeOppretteDokument, Dokument.MedMetadata>

/**
* Sending av dokumentet gjøres i en automatisk jobb når dokumentet lagres i databasen.
*/
fun lagreOgSendFritekstDokument(request: JournalførOgSendDokumentCommand): Dokument.MedMetadata
fun hentAlleJournalposter(sakId: UUID): Either<KunneIkkeHenteJournalposter, List<Journalpost>>
fun oppdaterFødselsnummer(command: OppdaterFødselsnummerPåSakCommand): Either<KunneIkkeOppdatereFødselsnummer, Sak>

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
package no.nav.su.se.bakover.domain.sak

import dokument.domain.Distribusjonstype
import dokument.domain.Dokument
import dokument.domain.distribuering.Distribueringsadresse
import io.kotest.matchers.equality.shouldBeEqualToIgnoringFields
import no.nav.su.se.bakover.common.domain.PdfA
import no.nav.su.se.bakover.common.ident.NavIdentBruker
import no.nav.su.se.bakover.test.fixedClock
import no.nav.su.se.bakover.test.fixedTidspunkt
import org.junit.jupiter.api.Test
import java.util.UUID

class JournalførOgSendDokumentCommandTest {

@Test
fun `oppretter dokument med metadata`() {
val vedtaksCommand = nyCommand(
distribueringsadresse = Distribueringsadresse(
adresselinje1 = "Gondor",
adresselinje2 = "calls",
adresselinje3 = "for",
postnummer = "aid",
poststed = "And Rohan will answer",
),
)
val viktigCommand = nyCommand(distribusjonstype = Distribusjonstype.VIKTIG)
val annetCommand = nyCommand(distribusjonstype = Distribusjonstype.ANNET)

vedtaksCommand.opprettDokumentMedMetadata(fixedClock).let {
it.shouldBeEqualToIgnoringFields(
Dokument.MedMetadata.Vedtak(
utenMetadata = Dokument.UtenMetadata.Vedtak(
id = it.id,
opprettet = fixedTidspunkt,
tittel = vedtaksCommand.journaltittel,
generertDokument = vedtaksCommand.pdf,
//language=json
generertDokumentJson = """{"saksbehandler":"saksbehandler","journaltittel":"tittel på journalposten","distribueringsadresse":{"adresselinje1":"Gondor","adresselinje2":"calls","adresselinje3":"for","postnummer":"aid","poststed":"And Rohan will answer"},"distribusjonstype":"VEDTAK","kommentar":"Pdf er lastet opp manuelt. Innholdet i brevet er ukjent"}""",
),
metadata = Dokument.Metadata(sakId = vedtaksCommand.sakId),
distribueringsadresse = vedtaksCommand.distribueringsadresse,
),
Dokument::id,
Dokument::generertDokument,
)
}

viktigCommand.opprettDokumentMedMetadata(fixedClock).shouldBeEqualToIgnoringFields(
Dokument.MedMetadata.Informasjon.Viktig(
utenMetadata = Dokument.UtenMetadata.Informasjon.Viktig(
id = UUID.randomUUID(),
opprettet = fixedTidspunkt,
tittel = viktigCommand.journaltittel,
generertDokument = viktigCommand.pdf,
//language=json
generertDokumentJson = """{"saksbehandler":"saksbehandler","journaltittel":"tittel på journalposten","distribueringsadresse":null,"distribusjonstype":"VIKTIG","kommentar":"Pdf er lastet opp manuelt. Innholdet i brevet er ukjent"}""",
),
metadata = Dokument.Metadata(sakId = viktigCommand.sakId),
distribueringsadresse = viktigCommand.distribueringsadresse,
),
Dokument::id,
)

annetCommand.opprettDokumentMedMetadata(fixedClock).shouldBeEqualToIgnoringFields(
Dokument.MedMetadata.Informasjon.Annet(
utenMetadata = Dokument.UtenMetadata.Informasjon.Annet(
id = UUID.randomUUID(),
opprettet = fixedTidspunkt,
tittel = annetCommand.journaltittel,
generertDokument = annetCommand.pdf,
//language=json
generertDokumentJson = """{"saksbehandler":"saksbehandler","journaltittel":"tittel på journalposten","distribueringsadresse":null,"distribusjonstype":"ANNET","kommentar":"Pdf er lastet opp manuelt. Innholdet i brevet er ukjent"}""",
),
metadata = Dokument.Metadata(sakId = annetCommand.sakId),
distribueringsadresse = annetCommand.distribueringsadresse,
),
Dokument::id,
)
}

private fun nyCommand(
sakId: UUID = UUID.randomUUID(),
saksbehandler: NavIdentBruker.Saksbehandler = no.nav.su.se.bakover.test.saksbehandler,
journaltittel: String = "tittel på journalposten",
pdf: PdfA = PdfA("pdf".toByteArray()),
distribueringsadresse: Distribueringsadresse? = null,
distribusjonstype: Distribusjonstype = Distribusjonstype.VEDTAK,
) = JournalførOgSendDokumentCommand(
sakId = sakId,
saksbehandler = saksbehandler,
journaltittel = journaltittel,
pdf = pdf,
distribueringsadresse = distribueringsadresse,
distribusjonstype = distribusjonstype,
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import no.nav.su.se.bakover.domain.Sak
import no.nav.su.se.bakover.domain.brev.command.FritekstDokumentCommand
import no.nav.su.se.bakover.domain.revurdering.RevurderingId
import no.nav.su.se.bakover.domain.sak.FantIkkeSak
import no.nav.su.se.bakover.domain.sak.JournalførOgSendDokumentCommand
import no.nav.su.se.bakover.domain.sak.KunneIkkeHenteGjeldendeGrunnlagsdataForVedtak
import no.nav.su.se.bakover.domain.sak.KunneIkkeHenteGjeldendeVedtaksdata
import no.nav.su.se.bakover.domain.sak.KunneIkkeOppretteDokument
Expand Down Expand Up @@ -165,14 +166,20 @@ class SakServiceImpl(
}
}

override fun lagreOgSendFritekstDokument(request: OpprettDokumentRequest): Either<KunneIkkeOppretteDokument, Dokument.MedMetadata> {
override fun genererLagreOgSendFritekstDokument(request: OpprettDokumentRequest): Either<KunneIkkeOppretteDokument, Dokument.MedMetadata> {
return opprettFritekstDokument(request).map {
it.leggTilMetadata(Dokument.Metadata(sakId = request.sakId), request.distribueringsadresse)
}.onRight {
dokumentRepo.lagre(it)
}
}

override fun lagreOgSendFritekstDokument(request: JournalførOgSendDokumentCommand): Dokument.MedMetadata {
return request.opprettDokumentMedMetadata(clock).also {
dokumentRepo.lagre(it)
}
}

override fun hentAlleJournalposter(sakId: UUID): Either<KunneIkkeHenteJournalposter, List<Journalpost>> {
return sakRepo.hentSakInfo(sakId)?.let {
journalpostClient.hentJournalposterFor(it.saksnummer)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package no.nav.su.se.bakover.service.sak

import arrow.core.right
import dokument.domain.Distribusjonstype
import dokument.domain.Dokument
import dokument.domain.DokumentRepo
import dokument.domain.GenererDokumentCommand
import dokument.domain.brev.BrevService
Expand All @@ -10,6 +11,7 @@ import dokument.domain.journalføring.Journalpost
import dokument.domain.journalføring.QueryJournalpostClient
import io.kotest.assertions.arrow.core.shouldBeRight
import io.kotest.matchers.shouldBe
import no.nav.su.se.bakover.common.domain.PdfA
import no.nav.su.se.bakover.common.domain.Saksnummer
import no.nav.su.se.bakover.common.domain.sak.Behandlingssammendrag
import no.nav.su.se.bakover.common.domain.sak.SakInfo
Expand All @@ -18,13 +20,15 @@ import no.nav.su.se.bakover.common.journal.JournalpostId
import no.nav.su.se.bakover.common.tid.periode.år
import no.nav.su.se.bakover.domain.Sak
import no.nav.su.se.bakover.domain.brev.command.FritekstDokumentCommand
import no.nav.su.se.bakover.domain.sak.JournalførOgSendDokumentCommand
import no.nav.su.se.bakover.domain.sak.OpprettDokumentRequest
import no.nav.su.se.bakover.domain.sak.SakRepo
import no.nav.su.se.bakover.domain.statistikk.StatistikkEvent
import no.nav.su.se.bakover.domain.statistikk.StatistikkEventObserver
import no.nav.su.se.bakover.test.argThat
import no.nav.su.se.bakover.test.dokumentUtenMetadataInformasjonAnnet
import no.nav.su.se.bakover.test.fixedClock
import no.nav.su.se.bakover.test.fixedTidspunkt
import no.nav.su.se.bakover.test.getOrFail
import no.nav.su.se.bakover.test.nySøknadsbehandlingMedStønadsperiode
import no.nav.su.se.bakover.test.opprettetRevurdering
Expand Down Expand Up @@ -327,7 +331,7 @@ internal class SakServiceImplTest {
}

val actual = SakServiceImpl(sakRepo, fixedClock, dokumentRepo, brevService, mock(), mock())
.lagreOgSendFritekstDokument(
.genererLagreOgSendFritekstDokument(
request = OpprettDokumentRequest(
sakId = sak.id,
saksbehandler = saksbehandler,
Expand Down Expand Up @@ -365,6 +369,40 @@ internal class SakServiceImplTest {
verifyNoMoreInteractions(dokumentRepo)
}

@Test
fun `lagrer og sender et fritekst dokument der saksbehandler har lastet opp pdf`() {
val expecedSakId = UUID.randomUUID()
val dokumentRepo = mock<DokumentRepo> {
doNothing().whenever(it).lagre(any(), anyOrNull())
}

val actual =
SakServiceImpl(mock(), fixedClock, dokumentRepo, mock(), mock(), mock()).lagreOgSendFritekstDokument(
request = JournalførOgSendDokumentCommand(
sakId = expecedSakId,
saksbehandler = saksbehandler,
journaltittel = "Vedtaksbrev om nytt vedtak",
pdf = PdfA(content = "".toByteArray()),
distribueringsadresse = null,
distribusjonstype = Distribusjonstype.VEDTAK,
),
)

actual shouldBe Dokument.MedMetadata.Vedtak(
utenMetadata = Dokument.UtenMetadata.Vedtak(
// id'en blir generert på innsiden av opprettelsen av dokumentet
id = actual.id,
opprettet = fixedTidspunkt,
tittel = "Vedtaksbrev om nytt vedtak",
generertDokument = PdfA(content = "".toByteArray()),
//language=json
generertDokumentJson = """{"saksbehandler":"saksbehandler","journaltittel":"Vedtaksbrev om nytt vedtak","distribueringsadresse":null,"distribusjonstype":"VEDTAK","kommentar":"Pdf er lastet opp manuelt. Innholdet i brevet er ukjent"}""",
),
metadata = Dokument.Metadata(sakId = expecedSakId),
distribueringsadresse = null,
)
}

@Test
fun `henter alle journalposter`() {
val sak = nySakMedjournalførtSøknadOgOppgave().first
Expand Down
Loading

0 comments on commit befeb79

Please sign in to comment.