Skip to content

Commit

Permalink
Merge pull request #938 from navikt/innholdsfortegnelse
Browse files Browse the repository at this point in the history
Innholdsfortegnelse
  • Loading branch information
oyvind-wedoe authored Oct 13, 2023
2 parents 0cbcec5 + 2891161 commit 73fdef1
Show file tree
Hide file tree
Showing 47 changed files with 1,708 additions and 592 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ class DokumentUnderArbeidController(
}

@GetMapping
fun findHovedDokumenter(
fun findDokumenter(
@PathVariable("behandlingId") behandlingId: UUID,
): List<DokumentView> {
val allDokumenterUnderArbeid = dokumentUnderArbeidService.findDokumenterNotFinished(behandlingId = behandlingId)
Expand All @@ -61,7 +61,7 @@ class DokumentUnderArbeidController(
dokumentType = DokumentType.of(input.dokumentTypeId),
)
return dokumentMapper.mapToDokumentView(
dokumentUnderArbeidService.opprettOgMellomlagreNyttHoveddokument(
dokumentUnderArbeidService.createOpplastetDokumentUnderArbeid(
behandlingId = behandlingId,
dokumentType = DokumentType.of(input.dokumentTypeId),
opplastetFil = opplastetFil,
Expand Down Expand Up @@ -137,6 +137,36 @@ class DokumentUnderArbeidController(
)
}

@GetMapping("/{dokumentId}/vedleggsoversikt")
fun getMetadataForInnholdsfortegnelse(
@PathVariable("behandlingId") behandlingId: UUID,
@PathVariable("dokumentId") dokumentId: UUID,
): DokumentUnderArbeidMetadata {
logger.debug("Kall mottatt på getMetadataForInnholdsfortegnelse for {}", dokumentId)

return DokumentUnderArbeidMetadata(
behandlingId = behandlingId,
documentId = dokumentId,
title = "Innholdsfortegnelse"
)
}

@GetMapping("/{hoveddokumentId}/vedleggsoversikt/pdf")
@ResponseBody
fun getInnholdsfortegnelsePdf(
@PathVariable("behandlingId") behandlingId: UUID,
@PathVariable("hoveddokumentId") hoveddokumentId: UUID,
): ResponseEntity<ByteArray> {
logger.debug("Kall mottatt på getInnholdsfortegnelsePdf for {}", hoveddokumentId)
return dokumentMapper.mapToByteArray(
dokumentUnderArbeidService.getInnholdsfortegnelseAsFysiskDokument(
behandlingId = behandlingId,
hoveddokumentId = hoveddokumentId,
innloggetIdent = innloggetSaksbehandlerService.getInnloggetIdent()
)
)
}

@DeleteMapping("/{dokumentId}")
fun deleteDokument(
@PathVariable("behandlingId") behandlingId: UUID,
Expand All @@ -160,7 +190,7 @@ class DokumentUnderArbeidController(
return if (input.dokumentId == null) {
dokumentMapper.mapToDokumentListView(
dokumentUnderArbeidList = listOf(
dokumentUnderArbeidService.frikobleVedlegg(
dokumentUnderArbeidService.setAsHoveddokument(
behandlingId = behandlingId,
dokumentId = persistentDokumentId,
innloggetIdent = innloggetSaksbehandlerService.getInnloggetIdent()
Expand All @@ -170,7 +200,7 @@ class DokumentUnderArbeidController(
)
} else {
val (alteredDocuments, duplicateJournalfoerteDokumenter) =
dokumentUnderArbeidService.setParentDocument(
dokumentUnderArbeidService.setAsVedlegg(
parentId = input.dokumentId,
dokumentId = persistentDokumentId,
innloggetIdent = innloggetSaksbehandlerService.getInnloggetIdent()
Expand Down Expand Up @@ -209,7 +239,8 @@ class DokumentUnderArbeidController(
@PathVariable("behandlingId") behandlingId: UUID,
@PathVariable("dokumentid") dokumentId: UUID,
): List<DocumentValidationResponse> {
return dokumentUnderArbeidService.validateSmartDokument(dokumentId)
//TODO only called for hoveddokumenter?
return dokumentUnderArbeidService.validateIfSmartDokument(dokumentId)
}

//Old event stuff. Clients should read from EventController instead, and this can be deleted.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ class SmartEditorController(
behandlingId = behandlingId,
dokumentType = if (body.dokumentTypeId != null) DokumentType.of(body.dokumentTypeId) else DokumentType.VEDTAK,
json = body.content.toString(),
smartEditorTemplateId = body.templateId,
smartEditorTemplateId = body.templateId ?: error("TODO. Can be null?"),
innloggetIdent = innloggetSaksbehandlerService.getInnloggetIdent(),
tittel = body.tittel ?: DokumentType.VEDTAK.defaultFilnavn,
parentId = body.parentId,
Expand Down
133 changes: 103 additions & 30 deletions src/main/kotlin/no/nav/klage/dokument/api/mapper/DokumentMapper.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,14 @@ import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import no.nav.klage.dokument.api.view.DokumentView
import no.nav.klage.dokument.api.view.DokumentViewWithList
import no.nav.klage.dokument.api.view.SmartEditorDocumentView
import no.nav.klage.dokument.clients.kabaljsontopdf.domain.InnholdsfortegnelseRequest
import no.nav.klage.dokument.clients.kabalsmarteditorapi.model.response.DocumentOutput
import no.nav.klage.dokument.domain.FysiskDokument
import no.nav.klage.dokument.domain.dokumenterunderarbeid.DokumentUnderArbeid
import no.nav.klage.dokument.domain.dokumenterunderarbeid.DokumentUnderArbeidAsSmartdokument
import no.nav.klage.dokument.domain.dokumenterunderarbeid.DokumentUnderArbeidAsVedlegg
import no.nav.klage.dokument.domain.dokumenterunderarbeid.JournalfoertDokumentUnderArbeidAsVedlegg
import no.nav.klage.kodeverk.DokumentType
import no.nav.klage.kodeverk.Fagsystem
import no.nav.klage.kodeverk.Tema
import no.nav.klage.oppgave.api.view.DokumentReferanse
Expand All @@ -17,6 +22,7 @@ import org.springframework.http.HttpHeaders
import org.springframework.http.HttpStatus
import org.springframework.http.ResponseEntity
import org.springframework.stereotype.Component
import java.time.LocalDateTime

@Component
class DokumentMapper(
Expand All @@ -39,52 +45,119 @@ class DokumentMapper(

fun getSortedDokumentViewList(allDokumenterUnderArbeid: List<DokumentUnderArbeid>): List<DokumentView> {
val (dokumenterUnderArbeid, journalfoerteDokumenterUnderArbeid) = allDokumenterUnderArbeid.partition {
it.getType() != DokumentUnderArbeid.DokumentUnderArbeidType.JOURNALFOERT
it !is JournalfoertDokumentUnderArbeidAsVedlegg
}

return dokumenterUnderArbeid.sortedByDescending { it.created }
.map { mapToDokumentView(it) } + journalfoerteDokumenterUnderArbeid.map { mapToDokumentView(it) }
.sortedByDescending { it.journalfoertDokumentReference?.datoOpprettet }
.map { mapToDokumentView(it) }
.plus(journalfoerteDokumenterUnderArbeid
.map { mapToDokumentView(it) }
.sortedWith(compareByDescending<DokumentView> { it.journalfoertDokumentReference?.datoOpprettet }.thenBy { it.tittel })
)
}

fun mapToDokumentView(dokumentUnderArbeid: DokumentUnderArbeid): DokumentView {
val type = dokumentUnderArbeid.getType()
fun getSortedDokumentViewListForInnholdsfortegnelse(
allDokumenterUnderArbeid: List<DokumentUnderArbeid>,
mottakere: List<String>,
behandling: Behandling,
hoveddokument: DokumentUnderArbeid,
): Pair<List<InnholdsfortegnelseRequest.Document>, List<InnholdsfortegnelseRequest.Document>> {
val (dokumenterUnderArbeid, journalfoerteDokumenterUnderArbeid) = allDokumenterUnderArbeid.partition {
it !is JournalfoertDokumentUnderArbeidAsVedlegg
}

return dokumenterUnderArbeid.sortedByDescending { it.created }
.map {
mapToInnholdsfortegnelseRequestDocumentFromDokumentUnderArbeid(
dokumentUnderArbeid = it,
mottakere = mottakere,
behandling = behandling,
hoveddokument = hoveddokument,
)
} to journalfoerteDokumenterUnderArbeid
.map {
mapToInnholdsfortegnelseRequestDocumentFromJournalfoertDokument(
dokumentUnderArbeid = it,
behandling = behandling
)
}
.sortedWith(compareByDescending<InnholdsfortegnelseRequest.Document> { it.opprettet }.thenBy { it.tittel })
}

fun mapToInnholdsfortegnelseRequestDocumentFromJournalfoertDokument(
dokumentUnderArbeid: DokumentUnderArbeid,
mottakere: List<String> = emptyList(),
behandling: Behandling,
): InnholdsfortegnelseRequest.Document {
if (dokumentUnderArbeid !is JournalfoertDokumentUnderArbeidAsVedlegg) {
error("Document must be JOURNALFOERT")
}
val journalpost =
safClient.getJournalpostAsSaksbehandler(dokumentUnderArbeid.journalpostId)
val dokumentInDokarkiv =
journalpost.dokumenter?.find { it.dokumentInfoId == dokumentUnderArbeid.dokumentInfoId }
?: throw RuntimeException("Document not found in Dokarkiv")

return InnholdsfortegnelseRequest.Document(
tittel = dokumentInDokarkiv.tittel ?: "Tittel ikke funnet i SAF",
tema = Tema.fromNavn(journalpost.tema?.name).navn,
opprettet = dokumentUnderArbeid.opprettet,
avsenderMottaker = journalpost.avsenderMottaker?.navn ?: "",
saksnummer = journalpost.sak?.fagsakId ?: "Saksnummer ikke funnet i SAF",
type = journalpost.journalposttype?.name ?: "Type ikke funnet i SAF"
)
}

fun mapToInnholdsfortegnelseRequestDocumentFromDokumentUnderArbeid(
dokumentUnderArbeid: DokumentUnderArbeid,
mottakere: List<String> = emptyList(),
behandling: Behandling,
hoveddokument: DokumentUnderArbeid,
): InnholdsfortegnelseRequest.Document {
return InnholdsfortegnelseRequest.Document(
tittel = dokumentUnderArbeid.name,
tema = behandling.ytelse.toTema().navn,
opprettet = LocalDateTime.now(),
avsenderMottaker = mottakere.joinToString(),
saksnummer = behandling.fagsakId,
type = if (hoveddokument.dokumentType == DokumentType.NOTAT) "N" else "U"
)
}

fun mapToDokumentView(dokumentUnderArbeid: DokumentUnderArbeid): DokumentView {
var journalfoertDokumentReference: DokumentView.JournalfoertDokumentReference? = null

val dokumentInDokarkiv = if (type == DokumentUnderArbeid.DokumentUnderArbeidType.JOURNALFOERT) {
var tittel = dokumentUnderArbeid.name

if (dokumentUnderArbeid is JournalfoertDokumentUnderArbeidAsVedlegg) {
val journalpostInDokarkiv =
safClient.getJournalpostAsSaksbehandler(dokumentUnderArbeid.journalfoertDokumentReference!!.journalpostId)
val dokumentInDokarkiv =
journalpostInDokarkiv.dokumenter?.find { it.dokumentInfoId == dokumentUnderArbeid.journalfoertDokumentReference.dokumentInfoId }
?: throw RuntimeException("Document not found in Dokarkiv")
safClient.getJournalpostAsSaksbehandler(dokumentUnderArbeid.journalpostId)

journalfoertDokumentReference =
DokumentView.JournalfoertDokumentReference(
journalpostId = journalpostInDokarkiv.journalpostId,
dokumentInfoId = dokumentInDokarkiv.dokumentInfoId,
harTilgangTilArkivvariant = harTilgangTilArkivvariant(dokumentInDokarkiv),
datoOpprettet = journalpostInDokarkiv.datoOpprettet,
)
dokumentInDokarkiv
} else null
val dokument = journalpostInDokarkiv.dokumenter?.find { it.dokumentInfoId == dokumentUnderArbeid.dokumentInfoId }
?: throw RuntimeException("Document not found in Dokarkiv")

val tittel = if (dokumentInDokarkiv != null) {
(dokumentInDokarkiv.tittel ?: "Tittel ikke funnet i SAF")
} else dokumentUnderArbeid.name
tittel = (dokument.tittel ?: "Tittel ikke funnet i SAF")

journalfoertDokumentReference = DokumentView.JournalfoertDokumentReference(
journalpostId = dokumentUnderArbeid.journalpostId,
dokumentInfoId = dokumentUnderArbeid.dokumentInfoId,
harTilgangTilArkivvariant = harTilgangTilArkivvariant(dokument),
datoOpprettet = dokumentUnderArbeid.opprettet,
)
}

return DokumentView(
id = dokumentUnderArbeid.id,
tittel = tittel,
dokumentTypeId = dokumentUnderArbeid.dokumentType?.id,
created = dokumentUnderArbeid.created,
modified = dokumentUnderArbeid.modified,
isSmartDokument = dokumentUnderArbeid.smartEditorId != null,
templateId = dokumentUnderArbeid.smartEditorTemplateId,
isSmartDokument = dokumentUnderArbeid is DokumentUnderArbeidAsSmartdokument,
templateId = if (dokumentUnderArbeid is DokumentUnderArbeidAsSmartdokument) dokumentUnderArbeid.smartEditorTemplateId else null,
isMarkertAvsluttet = dokumentUnderArbeid.markertFerdig != null,
parent = dokumentUnderArbeid.parentId,
parentId = dokumentUnderArbeid.parentId,
type = type,
parent = if (dokumentUnderArbeid is DokumentUnderArbeidAsVedlegg) dokumentUnderArbeid.parentId else null,
parentId = if (dokumentUnderArbeid is DokumentUnderArbeidAsVedlegg) dokumentUnderArbeid.parentId else null,
type = dokumentUnderArbeid.getType(),
journalfoertDokumentReference = journalfoertDokumentReference,
creatorIdent = dokumentUnderArbeid.creatorIdent,
creatorRole = dokumentUnderArbeid.creatorRole,
Expand Down Expand Up @@ -126,9 +199,9 @@ class DokumentMapper(
id = dokumentUnderArbeid.id,
tittel = dokumentUnderArbeid.name,
dokumentTypeId = dokumentUnderArbeid.dokumentType!!.id,
templateId = dokumentUnderArbeid.smartEditorTemplateId,
parent = dokumentUnderArbeid.parentId,
parentId = dokumentUnderArbeid.parentId,
templateId = if (dokumentUnderArbeid is DokumentUnderArbeidAsSmartdokument) dokumentUnderArbeid.smartEditorTemplateId else null,
parent = if (dokumentUnderArbeid is DokumentUnderArbeidAsVedlegg) dokumentUnderArbeid.parentId else null,
parentId = if (dokumentUnderArbeid is DokumentUnderArbeidAsVedlegg) dokumentUnderArbeid.parentId else null,
content = jacksonObjectMapper().readTree(smartEditorDocument.json),
created = smartEditorDocument.created,
modified = smartEditorDocument.modified,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,14 @@ data class DokumentView(
val isSmartDokument: Boolean,
val templateId: String?,
val isMarkertAvsluttet: Boolean,
//Deprecated
@Deprecated("use parentId")
val parent: UUID?,
val parentId: UUID?,
val journalfoertDokumentReference: JournalfoertDokumentReference?,
val creatorIdent: String,
val creatorRole: BehandlingRole,
) {
data class JournalfoertDokumentReference (
data class JournalfoertDokumentReference(
val journalpostId: String,
val dokumentInfoId: String,
val harTilgangTilArkivvariant: Boolean,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package no.nav.klage.dokument.clients.kabaljsontopdf

import io.micrometer.tracing.Tracer
import no.nav.klage.dokument.clients.kabaljsontopdf.domain.DocumentValidationResponse
import no.nav.klage.dokument.clients.kabaljsontopdf.domain.InnholdsfortegnelseRequest
import no.nav.klage.dokument.domain.PDFDocument
import no.nav.klage.oppgave.util.getLogger
import org.springframework.http.MediaType
Expand Down Expand Up @@ -39,6 +40,25 @@ class KabalJsonToPdfClient(
.block() ?: throw RuntimeException("PDF could not be created")
}

fun getInnholdsfortegnelse(innholdsfortegnelseRequest: InnholdsfortegnelseRequest): PDFDocument {
logger.debug("Getting innholdsfortegnelse from kabalJsontoPdf.")
return kabalJsonToPdfWebClient.post()
.uri { it.path("/toinnholdsfortegnelse").build() }
.contentType(MediaType.APPLICATION_JSON)
.bodyValue(innholdsfortegnelseRequest)
.retrieve()
.toEntity(ByteArray::class.java)
.map {
val filename = it.headers["filename"]?.first()
PDFDocument(
filename = filename
?: "somefilename",
bytes = it.body ?: throw RuntimeException("Could not get PDF data")
)
}
.block() ?: throw RuntimeException("PDF could not be created")
}

fun validateJsonDocument(json: String): DocumentValidationResponse {
return kabalJsonToPdfWebClient.post()
.uri { it.path("/validate").build() }
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package no.nav.klage.dokument.clients.kabaljsontopdf.domain

import java.time.LocalDateTime

data class DocumentValidationResponse(
val errors: List<DocumentValidationError> = emptyList()
) {
data class DocumentValidationError(
val type: String,
val paths: List<List<Int>> = emptyList()
)
}

data class InnholdsfortegnelseRequest(
val dokumenterUnderArbeid: List<Document>,
val journalfoerteDokumenter: List<Document>,
) {
data class Document(
val tittel: String,
val tema: String,
val opprettet: LocalDateTime,
val avsenderMottaker: String,
val saksnummer: String,
val type: String,
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,12 @@ class DefaultKabalSmartEditorApiGateway(private val kabalSmartEditorApiClient: K
private val logger = getLogger(javaClass.enclosingClass)
}

fun isMellomlagretDokumentStale(smartEditorId: UUID, sistOpplastet: LocalDateTime?): Boolean {
return sistOpplastet == null || kabalSmartEditorApiClient.getDocument(smartEditorId).modified.isAfter(
sistOpplastet
fun isMellomlagretDokumentStale(
smartEditorId: UUID,
mellomlagretDate: LocalDateTime?
): Boolean {
return mellomlagretDate == null || kabalSmartEditorApiClient.getDocument(smartEditorId).modified.isAfter(
mellomlagretDate
)
}

Expand Down
Loading

0 comments on commit 73fdef1

Please sign in to comment.