Skip to content

Batch operation for adding and removing tilknyttet saksdokument. #1418

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
May 7, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ class DokumentUnderArbeidService(
private val kabalJsonToPdfService: KabalJsonToPdfService,
private val tokenUtil: TokenUtil,
private val svarbrevSettingsService: SvarbrevSettingsService,
@Value("\${INNSYNSBEGJAERING_TEMPLATE_ID}") private val innsynsbegjaeringTemplateId: String,
) {
companion object {
@Suppress("JAVA_CLASS_ON_COMPANION")
Expand Down Expand Up @@ -467,13 +468,17 @@ class DokumentUnderArbeidService(
parentDocument = parentDocument
)

behandlingService.connectDocumentsToBehandling(
behandlingId = behandling.id,
journalfoertDokumentReferenceSet = journalfoerteDokumenter,
saksbehandlerIdent = innloggetIdent,
systemUserContext = false,
ignoreCheckSkrivetilgang = isCurrentROL
)
val templateId = if (parentDocument is DokumentUnderArbeidAsSmartdokument) parentDocument.smartEditorTemplateId else null

if (templateId != innsynsbegjaeringTemplateId) {
behandlingService.connectDocumentsToBehandling(
behandlingId = behandling.id,
journalfoertDokumentReferenceSet = journalfoerteDokumenter,
saksbehandlerIdent = innloggetIdent,
systemUserContext = false,
ignoreCheckSkrivetilgang = isCurrentROL
)
}
}

val alreadyAddedDocuments =
Expand Down Expand Up @@ -1983,6 +1988,27 @@ class DokumentUnderArbeidService(
behandling.addSaksdokument(saksdokument, saksbehandlerIdent)
?.also { applicationEventPublisher.publishEvent(it) }
}

publishInternalEvent(
data = objectMapper.writeValueAsString(
IncludedDocumentsChangedEvent(
actor = Employee(
navIdent = saksbehandlerIdent,
navn = saksbehandlerService.getNameForIdentDefaultIfNull(saksbehandlerIdent),
),
timestamp = LocalDateTime.now(),
journalfoertDokumentReferenceSet = saksdokumenter.map {
JournalfoertDokument(
it.journalpostId,
it.dokumentInfoId
)
}.toSet()

)
),
behandlingId = behandling.id,
type = InternalEventType.INCLUDED_DOCUMENTS_ADDED,
)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import no.nav.klage.dokument.api.view.JournalfoertDokumentReference
import no.nav.klage.kodeverk.Tema
import no.nav.klage.oppgave.api.view.BehandlingEditedView
import no.nav.klage.oppgave.api.view.DokumenterResponse
import no.nav.klage.oppgave.api.view.TilknyttetDokument
import no.nav.klage.oppgave.api.view.TilknyttetDokumentSet
import no.nav.klage.oppgave.config.SecurityConfiguration.Companion.ISSUER_AAD
import no.nav.klage.oppgave.service.BehandlingService
import no.nav.klage.oppgave.service.InnloggetSaksbehandlerService
Expand Down Expand Up @@ -55,7 +55,7 @@ class BehandlingDokumentController(
@PostMapping("/{id}/dokumenttilknytninger")
fun setTilknyttetDokument(
@PathVariable("id") behandlingId: UUID,
@RequestBody input: TilknyttetDokument
@RequestBody input: TilknyttetDokumentSet
): BehandlingEditedView {
logBehandlingMethodDetails(
::setTilknyttetDokument.name,
Expand All @@ -65,11 +65,13 @@ class BehandlingDokumentController(
)
val modified = behandlingService.connectDocumentsToBehandling(
behandlingId = behandlingId,
journalfoertDokumentReferenceSet = setOf(
JournalfoertDokumentReference(
journalpostId = input.journalpostId, dokumentInfoId = input.dokumentInfoId,
journalfoertDokumentReferenceSet = if (input.journalpostId != null && input.dokumentInfoId != null) {
setOf(
JournalfoertDokumentReference(
journalpostId = input.journalpostId, dokumentInfoId = input.dokumentInfoId,
)
)
),
} else input.journalfoertDokumentReferenceSet ?: throw Error("Trenger oppgitt dokumentreferanse"),
saksbehandlerIdent = innloggetSaksbehandlerService.getInnloggetIdent(),
systemUserContext = false,
ignoreCheckSkrivetilgang = false,
Expand All @@ -78,18 +80,20 @@ class BehandlingDokumentController(
}

@DeleteMapping("/{id}/dokumenttilknytninger")
fun removeAllTilknyttetDokument(
fun batchRemoveTilknyttetDokument(
@PathVariable("id") behandlingId: UUID,
@RequestBody input: TilknyttetDokumentSet?
): BehandlingEditedView {
logBehandlingMethodDetails(
::removeAllTilknyttetDokument.name,
::batchRemoveTilknyttetDokument.name,
innloggetSaksbehandlerService.getInnloggetIdent(),
behandlingId,
logger
)
val modified = behandlingService.disconnectAllDokumenterFromBehandling(
val modified = behandlingService.disconnectDokumenterFromBehandling(
behandlingId = behandlingId,
saksbehandlerIdent = innloggetSaksbehandlerService.getInnloggetIdent()
saksbehandlerIdent = innloggetSaksbehandlerService.getInnloggetIdent(),
journalfoertDokumentReferenceSet = input?.journalfoertDokumentReferenceSet
)
return BehandlingEditedView(modified)
}
Expand Down
8 changes: 8 additions & 0 deletions src/main/kotlin/no/nav/klage/oppgave/api/view/DokumentView.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package no.nav.klage.oppgave.api.view

import no.nav.klage.dokument.api.view.JournalfoertDokumentReference
import java.time.LocalDate
import java.time.LocalDateTime
import java.util.*
Expand Down Expand Up @@ -197,6 +198,13 @@ data class DokumentReferanse(

}

data class TilknyttetDokumentSet(
val journalfoertDokumentReferenceSet: Set<JournalfoertDokumentReference>?,
//TODO: Delete when not needed anymore
val journalpostId: String?,
val dokumentInfoId: String?,
)

data class TilknyttetDokument(val journalpostId: String, val dokumentInfoId: String)

data class JournalfoertDokumentMetadata(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@ enum class InternalEventType {
DOCUMENTS_ADDED,
DOCUMENTS_REMOVED,
DOCUMENTS_CHANGED,
INCLUDED_DOCUMENTS_ADDED,
INCLUDED_DOCUMENTS_REMOVED,
INCLUDED_DOCUMENTS_CLEARED,
//Change to SMART_DOCUMENT_LANGUAGE_CHANGED when FE is ready
SMART_DOCUMENT_LANGUAGE,
SMART_DOCUMENT_VERSIONED,
Expand Down Expand Up @@ -57,11 +60,22 @@ data class Employee(
val navn: String,
)

data class JournalfoertDokument(
val journalpostId: String,
val dokumentInfoId: String,
)


abstract class BaseEvent(
open val actor: Employee,
open val timestamp: LocalDateTime,
)

data class MinimalEvent(
override val actor: Employee,
override val timestamp: LocalDateTime,
) : BaseEvent(actor = actor, timestamp = timestamp)

data class MedunderskriverEvent(
override val actor: Employee,
override val timestamp: LocalDateTime,
Expand Down Expand Up @@ -201,6 +215,12 @@ data class DocumentsAddedEvent(
val documents: List<DokumentView>,
) : BaseEvent(actor = actor, timestamp = timestamp)

data class IncludedDocumentsChangedEvent(
override val actor: Employee,
override val timestamp: LocalDateTime,
val journalfoertDokumentReferenceSet: Set<JournalfoertDokument>
): BaseEvent(actor = actor, timestamp = timestamp)

data class DocumentPatched(
override val actor: Employee,
override val timestamp: LocalDateTime,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -552,10 +552,12 @@ object BehandlingSetters {
klager.id = prosessfullmektig!!.id
klager.partId = prosessfullmektig!!.partId!!
}

sakenGjelder.partId.value -> {
klager.id = sakenGjelder.id
klager.partId = sakenGjelder.partId
}

else -> {
klager.partId = nyVerdi
klager.id = UUID.randomUUID()
Expand Down Expand Up @@ -810,6 +812,25 @@ object BehandlingSetters {
return BehandlingEndretEvent(behandling = this, endringslogginnslag = listOfNotNull(endringslogg))
}

fun Behandling.removeSaksdokumenter(
saksdokumentListForRemoval: List<Saksdokument>,
saksbehandlerident: String
): BehandlingEndretEvent {
val existingSaksdokumenter = saksdokumenter.joinToString()
val tidspunkt = LocalDateTime.now()
saksdokumenter.removeIf { saksdokumentListForRemoval.any { saksdokumentForRemoval -> saksdokumentForRemoval.journalpostId == it.journalpostId && saksdokumentForRemoval.dokumentInfoId == it.dokumentInfoId } }

modified = tidspunkt
val endringslogg = Endringslogginnslag.endringslogg(
saksbehandlerident = saksbehandlerident,
felt = Felt.SAKSDOKUMENT,
fraVerdi = existingSaksdokumenter,
tilVerdi = saksdokumenter.joinToString(),
behandlingId = id,
)
return BehandlingEndretEvent(behandling = this, endringslogginnslag = listOfNotNull(endringslogg))
}

fun Behandling.clearSaksdokumenter(
saksbehandlerident: String
): BehandlingEndretEvent {
Expand Down
123 changes: 112 additions & 11 deletions src/main/kotlin/no/nav/klage/oppgave/service/BehandlingService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ import no.nav.klage.oppgave.domain.klage.AnkeITrygderettenbehandlingSetters.setS
import no.nav.klage.oppgave.domain.klage.BehandlingSetters.addSaksdokumenter
import no.nav.klage.oppgave.domain.klage.BehandlingSetters.clearSaksdokumenter
import no.nav.klage.oppgave.domain.klage.BehandlingSetters.removeSaksdokument
import no.nav.klage.oppgave.domain.klage.BehandlingSetters.removeSaksdokumenter
import no.nav.klage.oppgave.domain.klage.BehandlingSetters.setAvsluttetAvSaksbehandler
import no.nav.klage.oppgave.domain.klage.BehandlingSetters.setExtraUtfallSet
import no.nav.klage.oppgave.domain.klage.BehandlingSetters.setFeilregistrering
Expand Down Expand Up @@ -1795,23 +1796,82 @@ class BehandlingService(
return behandling.modified
}

fun disconnectAllDokumenterFromBehandling(
fun disconnectDokumenterFromBehandling(
behandlingId: UUID,
saksbehandlerIdent: String
saksbehandlerIdent: String,
journalfoertDokumentReferenceSet: Set<JournalfoertDokumentReference>?
): LocalDateTime {
val behandling = getBehandlingForUpdate(behandlingId)

try {
val event =
behandling.clearSaksdokumenter(
saksbehandlerIdent
if (journalfoertDokumentReferenceSet.isNullOrEmpty()) {
try {
val event =
behandling.clearSaksdokumenter(
saksbehandlerIdent
)
event.let { applicationEventPublisher.publishEvent(it) }

publishInternalEvent(
data = objectMapper.writeValueAsString(
MinimalEvent(
actor = Employee(
navIdent = saksbehandlerIdent,
navn = saksbehandlerService.getNameForIdentDefaultIfNull(saksbehandlerIdent),
),
timestamp = LocalDateTime.now(),
)
),
behandlingId = behandling.id,
type = InternalEventType.INCLUDED_DOCUMENTS_CLEARED,
)
event.let { applicationEventPublisher.publishEvent(it) }

return behandling.modified
} catch (e: Exception) {
logger.error("Error disconnecting all documents from behandling ${behandling.id}", e)
throw e
return behandling.modified
} catch (e: Exception) {
logger.error("Error disconnecting all documents from behandling ${behandling.id}", e)
throw e
}
} else {
val saksdokumenter = journalfoertDokumentReferenceSet.map {
Saksdokument(
journalpostId = it.journalpostId,
dokumentInfoId = it.dokumentInfoId
)
}

try {
val event =
behandling.removeSaksdokumenter(
saksdokumenter,
saksbehandlerIdent
)
event.let { applicationEventPublisher.publishEvent(it) }

publishInternalEvent(
data = objectMapper.writeValueAsString(
IncludedDocumentsChangedEvent(
actor = Employee(
navIdent = saksbehandlerIdent,
navn = saksbehandlerService.getNameForIdentDefaultIfNull(saksbehandlerIdent),
),
timestamp = LocalDateTime.now(),
journalfoertDokumentReferenceSet = saksdokumenter.map {
JournalfoertDokument(
it.journalpostId,
it.dokumentInfoId
)
}.toSet()

)
),
behandlingId = behandling.id,
type = InternalEventType.INCLUDED_DOCUMENTS_REMOVED,
)

return behandling.modified
} catch (e: Exception) {
logger.error("Error disconnecting documents from behandling ${behandling.id}", e)
throw e
}
}
}

Expand Down Expand Up @@ -1907,6 +1967,27 @@ class BehandlingService(
saksbehandlerident = saksbehandlerIdent
)
event.let { applicationEventPublisher.publishEvent(it) }

publishInternalEvent(
data = objectMapper.writeValueAsString(
IncludedDocumentsChangedEvent(
actor = Employee(
navIdent = saksbehandlerIdent,
navn = saksbehandlerService.getNameForIdentDefaultIfNull(saksbehandlerIdent),
),
timestamp = LocalDateTime.now(),
journalfoertDokumentReferenceSet = saksdokumentsToAdd.map {
JournalfoertDokument(
it.journalpostId,
it.dokumentInfoId
)
}.toSet()

)
),
behandlingId = behandling.id,
type = InternalEventType.INCLUDED_DOCUMENTS_ADDED,
)
}
}

Expand All @@ -1923,6 +2004,26 @@ class BehandlingService(
)
event.let { applicationEventPublisher.publishEvent(it) }

publishInternalEvent(
data = objectMapper.writeValueAsString(
IncludedDocumentsChangedEvent(
actor = Employee(
navIdent = saksbehandlerIdent,
navn = saksbehandlerService.getNameForIdentDefaultIfNull(saksbehandlerIdent),
),
timestamp = LocalDateTime.now(),
journalfoertDokumentReferenceSet = setOf(
JournalfoertDokument(
saksdokument.journalpostId,
saksdokument.dokumentInfoId
)
)
)
),
behandlingId = behandling.id,
type = InternalEventType.INCLUDED_DOCUMENTS_REMOVED,
)

return behandling
} catch (e: Exception) {
logger.error("Error disconnecting document ${saksdokument.id} to behandling ${behandling.id}", e)
Expand Down
4 changes: 3 additions & 1 deletion src/main/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -370,4 +370,6 @@ SYSTEMBRUKER_IDENT: SYSTEMBRUKER

MINE_KLAGER_MICROFRONTEND_ID: mine-klager-microfrontend

KLAGE_BACKEND_GROUP_ID: S0384EXKSUS
KLAGE_BACKEND_GROUP_ID: S0384EXKSUS

INNSYNSBEGJAERING_TEMPLATE_ID: svar-på-innsynsbegjæring
Loading