Skip to content

Commit

Permalink
Merge pull request #4685 from navikt/feature/journalfor-task
Browse files Browse the repository at this point in the history
Flytt journalføring i onetime task
  • Loading branch information
fredrikpe authored Dec 2, 2024
2 parents 75c07a9 + 2aec820 commit 93b9fcb
Show file tree
Hide file tree
Showing 10 changed files with 233 additions and 49 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package no.nav.mulighetsrommet.api.clients.dokark

import arrow.core.Either
import arrow.core.left
import arrow.core.right
import io.ktor.client.call.*
import io.ktor.client.engine.*
import io.ktor.client.plugins.cache.*
Expand All @@ -24,7 +27,7 @@ class DokarkClient(
install(HttpCache)
}

suspend fun opprettJournalpost(journalpost: Journalpost, accessType: AccessType): DokarkResult {
suspend fun opprettJournalpost(journalpost: Journalpost, accessType: AccessType): Either<DokarkError, DokarkResponse> {
val response = client.post("$baseUrl/rest/journalpostapi/v1/journalpost?forsoekFerdigstill=true") {
bearerAuth(tokenProvider.exchange(accessType))
contentType(ContentType.Application.Json)
Expand All @@ -33,14 +36,10 @@ class DokarkClient(

if (!response.status.isSuccess()) {
log.warn("Feilet å opprette journalpost: {}", response.bodyAsText())
return DokarkResult.Error("Feilet å laste opp til joark")
return DokarkError("Feilet å laste opp til joark").left()
}

val dokarkresponse = response.body<DokarkResponse>()
if (!dokarkresponse.journalpostferdigstilt) {
log.warn("Opprettet journalpost, men den kunne ikke bli ferdigstilt automatisk")
}
return DokarkResult.Success(journalpostId = dokarkresponse.journalpostId)
return response.body<DokarkResponse>().right()
}
}

Expand All @@ -58,10 +57,7 @@ data class DokarkResponseDokument(
val dokumentInfoId: String,
)

sealed interface DokarkResult {
data class Success(val journalpostId: String) : DokarkResult
data class Error(val message: String) : DokarkResult
}
data class DokarkError(val message: String)

@Serializable
data class Journalpost(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ import no.nav.mulighetsrommet.api.refusjon.db.DeltakerRepository
import no.nav.mulighetsrommet.api.refusjon.db.RefusjonskravRepository
import no.nav.mulighetsrommet.api.refusjon.kafka.AmtDeltakerV1KafkaConsumer
import no.nav.mulighetsrommet.api.refusjon.task.GenerateRefusjonskrav
import no.nav.mulighetsrommet.api.refusjon.task.JournalforRefusjonskrav
import no.nav.mulighetsrommet.api.services.EndringshistorikkService
import no.nav.mulighetsrommet.api.services.LagretFilterService
import no.nav.mulighetsrommet.api.services.PoaoTilgangService
Expand Down Expand Up @@ -419,6 +420,7 @@ private fun tasks(config: TaskConfig) = module {
single { SynchronizeNavAnsatte(config.synchronizeNavAnsatte, get(), get()) }
single { SynchronizeUtdanninger(config.synchronizeUtdanninger, get(), get()) }
single { GenerateRefusjonskrav(config.generateRefusjonskrav, get()) }
single { JournalforRefusjonskrav(get(), get(), get(), get(), get(), get()) }
single {
val updateTiltaksgjennomforingStatus = UpdateTiltaksgjennomforingStatus(
get(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import no.nav.mulighetsrommet.api.plugins.ArrangorflatePrincipal
import no.nav.mulighetsrommet.api.refusjon.db.DeltakerRepository
import no.nav.mulighetsrommet.api.refusjon.db.RefusjonskravRepository
import no.nav.mulighetsrommet.api.refusjon.model.*
import no.nav.mulighetsrommet.api.refusjon.task.JournalforRefusjonskrav
import no.nav.mulighetsrommet.api.responses.*
import no.nav.mulighetsrommet.api.tilsagn.TilsagnService
import no.nav.mulighetsrommet.database.Database
Expand All @@ -27,7 +28,6 @@ import no.nav.mulighetsrommet.domain.dto.Kontonummer
import no.nav.mulighetsrommet.domain.dto.NorskIdent
import no.nav.mulighetsrommet.domain.dto.Organisasjonsnummer
import no.nav.mulighetsrommet.ktor.exception.StatusException
import no.nav.mulighetsrommet.tokenprovider.AccessType
import org.koin.ktor.ext.inject
import java.math.BigDecimal
import java.math.RoundingMode
Expand All @@ -39,8 +39,8 @@ fun Route.arrangorflateRoutes() {
val arrangorService: ArrangorService by inject()
val refusjonskrav: RefusjonskravRepository by inject()
val deltakerRepository: DeltakerRepository by inject()
val dokarkClient: DokarkClient by inject()
val pdl: HentAdressebeskyttetPersonBolkPdlQuery by inject()
val journalforRefusjonskrav: JournalforRefusjonskrav by inject()
val db: Database by inject()

suspend fun RoutingContext.arrangorerMedTilgang(): List<ArrangorDto> {
Expand Down Expand Up @@ -117,28 +117,7 @@ fun Route.arrangorflateRoutes() {
tx,
)

val pdf = run {
val tilsagn = tilsagnService.getArrangorflateTilsagnTilRefusjon(
gjennomforingId = krav.gjennomforing.id,
periode = krav.beregning.input.periode,
)
val refusjonsKravAft: RefusjonKravAft = toRefusjonskrav(pdl, deltakerRepository, krav)
Pdfgen.refusjonJournalpost(refusjonsKravAft, tilsagn)
}

val result = dokarkClient.opprettJournalpost(
refusjonskravJournalpost(pdf, krav.id, krav.arrangor.organisasjonsnummer),
AccessType.M2M,
)
when (result) {
is DokarkResult.Error -> throw StatusException(
HttpStatusCode.InternalServerError,
"Feilet ved opprettelse av journalpost",
)
is DokarkResult.Success -> {
refusjonskrav.setJournalpostId(id, result.journalpostId, tx)
}
}
journalforRefusjonskrav.schedule(krav.id)
}

call.respond(HttpStatusCode.OK)
Expand Down Expand Up @@ -362,6 +341,10 @@ fun refusjonskravJournalpost(
idType = "ORGNR",
navn = null,
),
bruker = Journalpost.Bruker(
id = organisasjonsnummer.value,
idType = "ORGNR",
),
tema = "TIL",
datoMottatt = LocalDateTime.now().toString(),
dokumenter = listOf(
Expand All @@ -380,6 +363,5 @@ fun refusjonskravJournalpost(
journalfoerendeEnhet = "9999", // Automatisk journalføring
kanal = "NAV_NO", // Påkrevd for INNGAENDE. Se https://confluence.adeo.no/display/BOA/Mottakskanal
sak = null,
bruker = null,
behandlingstema = null,
)
Original file line number Diff line number Diff line change
Expand Up @@ -276,6 +276,7 @@ class RefusjonskravRepository(private val db: Database) {
kontonummer = stringOrNull("kontonummer")?.let { Kontonummer(it) },
kid = stringOrNull("kid")?.let { Kid(it) },
),
journalpostId = stringOrNull("journalpost_id"),
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ data class RefusjonskravDto(
val arrangor: Arrangor,
val beregning: RefusjonKravBeregning,
val betalingsinformasjon: Betalingsinformasjon,
val journalpostId: String?,
) {
@Serializable
data class Gjennomforing(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
package no.nav.mulighetsrommet.api.refusjon.task

import com.github.kagkarlsson.scheduler.SchedulerClient
import com.github.kagkarlsson.scheduler.task.helper.OneTimeTask
import com.github.kagkarlsson.scheduler.task.helper.Tasks
import no.nav.mulighetsrommet.api.clients.dokark.DokarkClient
import no.nav.mulighetsrommet.api.pdfgen.Pdfgen
import no.nav.mulighetsrommet.api.refusjon.HentAdressebeskyttetPersonBolkPdlQuery
import no.nav.mulighetsrommet.api.refusjon.db.DeltakerRepository
import no.nav.mulighetsrommet.api.refusjon.db.RefusjonskravRepository
import no.nav.mulighetsrommet.api.refusjon.model.RefusjonKravAft
import no.nav.mulighetsrommet.api.refusjon.model.RefusjonskravStatus
import no.nav.mulighetsrommet.api.refusjon.refusjonskravJournalpost
import no.nav.mulighetsrommet.api.refusjon.toRefusjonskrav
import no.nav.mulighetsrommet.api.tilsagn.TilsagnService
import no.nav.mulighetsrommet.database.Database
import no.nav.mulighetsrommet.tasks.executeSuspend
import no.nav.mulighetsrommet.tokenprovider.AccessType
import org.slf4j.LoggerFactory
import java.time.Instant
import java.util.*

class JournalforRefusjonskrav(
database: Database,
private val refusjonskravRepository: RefusjonskravRepository,
private val tilsagnService: TilsagnService,
private val dokarkClient: DokarkClient,
private val deltakerRepository: DeltakerRepository,
private val pdl: HentAdressebeskyttetPersonBolkPdlQuery,
) {
private val logger = LoggerFactory.getLogger(javaClass)

val task: OneTimeTask<UUID> = Tasks
.oneTime(javaClass.simpleName, UUID::class.java)
.executeSuspend { inst, _ ->
journalforRefusjonskrav(inst.data)
}

private val client = SchedulerClient.Builder
.create(database.getDatasource(), task)
.build()

fun schedule(refusjonskravId: UUID, startTime: Instant = Instant.now()): UUID {
val id = UUID.randomUUID()
val instance = task.instance(id.toString(), refusjonskravId)
client.scheduleIfNotExists(instance, startTime)
return id
}

suspend fun journalforRefusjonskrav(id: UUID) {
logger.info("Journalfører refusjonskrav med id: $id")
val krav = refusjonskravRepository.get(id)
requireNotNull(krav) { "Fant ikke refusjonskrav med id=$id" }
require(krav.status == RefusjonskravStatus.GODKJENT_AV_ARRANGOR) { "Krav må være godkjent" }

val pdf = run {
val tilsagn = tilsagnService.getArrangorflateTilsagnTilRefusjon(
gjennomforingId = krav.gjennomforing.id,
periode = krav.beregning.input.periode,
)
val refusjonsKravAft: RefusjonKravAft = toRefusjonskrav(pdl, deltakerRepository, krav)
Pdfgen.refusjonJournalpost(refusjonsKravAft, tilsagn)
}

dokarkClient.opprettJournalpost(
refusjonskravJournalpost(pdf, krav.id, krav.arrangor.organisasjonsnummer),
AccessType.M2M,
)
.onRight {
refusjonskravRepository.setJournalpostId(id, it.journalpostId)
}
.onLeft {
throw Exception("Feil ved opprettelse av journalpost. Message: ${it.message}")
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ select refusjonskrav.id,
refusjonskrav.godkjent_av_arrangor_tidspunkt,
refusjonskrav.kontonummer,
refusjonskrav.kid,
refusjonskrav.journalpost_id,
gjennomforing.id as gjennomforing_id,
gjennomforing.navn as gjennomforing_navn,
arrangor.id as arrangor_id,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ import no.nav.mulighetsrommet.api.refusjon.db.RefusjonskravDbo
import no.nav.mulighetsrommet.api.refusjon.model.RefusjonKravAft
import no.nav.mulighetsrommet.api.refusjon.model.RefusjonKravBeregningAft
import no.nav.mulighetsrommet.api.refusjon.model.RefusjonskravPeriode
import no.nav.mulighetsrommet.api.refusjon.model.RefusjonskravStatus
import no.nav.mulighetsrommet.api.withTestApplication
import no.nav.mulighetsrommet.database.kotest.extensions.FlywayDatabaseTestListener
import no.nav.mulighetsrommet.database.kotest.extensions.truncateAll
Expand Down Expand Up @@ -230,7 +229,7 @@ class ArrangorflateRoutesTest : FunSpec({
}
}

test("riktig sjekksum ved godkjenning av refusjon gir 200") {
test("riktig sjekksum ved godkjenning av refusjon gir 200, og spawner journalforing task") {
withTestApplication(appConfig()) {
val client = createClient {
install(ContentNegotiation) {
Expand All @@ -254,7 +253,7 @@ class ArrangorflateRoutesTest : FunSpec({
}
}

test("feil mot dokark ruller tilbake godkjenning") {
test("feil mot dokark gir fortsatt 200 på godkjenn siden det skjer i en task") {
withTestApplication(
appConfig(
listOf(
Expand All @@ -270,7 +269,7 @@ class ArrangorflateRoutesTest : FunSpec({
json()
}
}
var response = client.post("/api/v1/intern/arrangorflate/refusjonskrav/${krav.id}/godkjenn-refusjon") {
val response = client.post("/api/v1/intern/arrangorflate/refusjonskrav/${krav.id}/godkjenn-refusjon") {
bearerAuth(oauth.issueToken(claims = mapOf("pid" to identMedTilgang.value)).serialize())
contentType(ContentType.Application.Json)
setBody(
Expand All @@ -283,16 +282,7 @@ class ArrangorflateRoutesTest : FunSpec({
),
)
}
response.status shouldBe HttpStatusCode.InternalServerError

response = client.get("/api/v1/intern/arrangorflate/refusjonskrav/${krav.id}") {
bearerAuth(oauth.issueToken(claims = mapOf("pid" to identMedTilgang.value)).serialize())
contentType(ContentType.Application.Json)
}
response.status shouldBe HttpStatusCode.OK
val responseBody = response.bodyAsText()
val kravResponse: RefusjonKravAft = Json.decodeFromString(responseBody)
kravResponse.status shouldBe RefusjonskravStatus.KLAR_FOR_GODKJENNING
}
}
})
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,7 @@ class RefusjonskravRepositoryTest : FunSpec({
kontonummer = Kontonummer("11111111111"),
kid = Kid("12345"),
),
journalpostId = null,
)
}

Expand Down
Loading

0 comments on commit 93b9fcb

Please sign in to comment.