Skip to content

Commit

Permalink
Flyttet synkron innsending in i soknadservice, lagt til tester med k9…
Browse files Browse the repository at this point in the history
…sak mocks take two (#1005)

* Revert "Revert "Flyttet synkron innsending in i soknadservice, lagt til tester med k9sak mocks (#994)" (#1004)"

This reverts commit 66ee6b6.

* Mapping personident
  • Loading branch information
albrektsson authored Sep 26, 2023
1 parent 66ee6b6 commit 5efe952
Show file tree
Hide file tree
Showing 44 changed files with 870 additions and 1,030 deletions.
7 changes: 7 additions & 0 deletions .github/workflows/build-pull-request.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ on:
jobs:
Build:
runs-on: ubuntu-latest
permissions:
pull-requests: write
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v3
Expand All @@ -24,3 +26,8 @@ jobs:
GITHUB_PASSWORD: ${{ secrets.READER_TOKEN }}
- name: Bygg Docker image
run: docker build --pull .
- name: Dependency Review
uses: actions/dependency-review-action@v3
with:
fail-on-severity: moderate
comment-summary-in-pr: on-failure
2 changes: 0 additions & 2 deletions nais/dev-fss.yml
Original file line number Diff line number Diff line change
Expand Up @@ -136,5 +136,3 @@ spec:
# Feature toggles
- name: FERDIGSTILL_GOSYSOPPGAVE_ENABLED
value: "true"
- name: INNSENDING_REST_ENABLED
value: "true"
2 changes: 0 additions & 2 deletions nais/prod-fss.yml
Original file line number Diff line number Diff line change
Expand Up @@ -137,5 +137,3 @@ spec:
# Feature toggles
- name: FERDIGSTILL_GOSYSOPPGAVE_ENABLED
value: "false"
- name: INNSENDING_REST_ENABLED
value: "true"
19 changes: 3 additions & 16 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
<!-- Kontrakt -->
<k9-sak.version>4.1.2</k9-sak.version>
<k9-formidling.version>1.0.0</k9-formidling.version>
<k9-format.version>8.3.4</k9-format.version>
<k9-format.version>9.0.4</k9-format.version>
<k9-rapid.version>1.20230823104755-1fc16e7</k9-rapid.version>

<!-- database -->
Expand All @@ -48,7 +48,6 @@
<!-- Test + Mock -->
<zonky-postgresql.version>13.4.0</zonky-postgresql.version>
<mockk.version>1.13.7</mockk.version>
<wiremock.version>3.0.0-beta-10</wiremock.version> <!-- Beta for Jetty 11 support -->
<jsonassert.version>1.5.1</jsonassert.version>

<!-- pdf -->
Expand All @@ -64,7 +63,7 @@
<fuel.version>2.3.1</fuel.version>
<kotlinx-coroutines.version>1.7.3</kotlinx-coroutines.version>
<token-support.version>3.0.3</token-support.version>
<dusseldorf-ktor.version>4.0.8</dusseldorf-ktor.version>
<dusseldorf-ktor.version>4.0.10</dusseldorf-ktor.version>
<de.huxhorn.sulky.ulid.version>8.3.0</de.huxhorn.sulky.ulid.version>
</properties>

Expand Down Expand Up @@ -126,7 +125,7 @@
</dependency>
<dependency>
<groupId>no.nav.k9</groupId>
<artifactId>soknad-jakarta</artifactId>
<artifactId>soknad</artifactId>
<version>${k9-format.version}</version>
</dependency>
<dependency>
Expand Down Expand Up @@ -225,23 +224,11 @@
<version>${mockk.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.github.tomakehurst</groupId>
<artifactId>wiremock</artifactId>
<version>${wiremock.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>no.nav.helse</groupId>
<artifactId>dusseldorf-test-support</artifactId>
<scope>test</scope>
<version>${dusseldorf-ktor.version}</version>
<exclusions>
<exclusion>
<groupId>com.github.tomakehurst</groupId>
<artifactId>wiremock-jre8</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,4 @@ interface AksjonspunktService {

suspend fun settUtførtPåAltSendLukkOppgaveTilK9Los(journalpostId: Collection<String>, erSendtInn: Boolean, ansvarligSaksbehandler: String?)
suspend fun settUtførtPåAltSendLukkOppgaveTilK9Los(journalpostId: String, erSendtInn: Boolean, ansvarligSaksbehandler: String?)
suspend fun settUtførtAksjonspunktOgSendLukkOppgaveTilK9Los(journalpostId: String, aksjonspunkt: Pair<AksjonspunktKode, AksjonspunktStatus>, ansvarligSaksbehandler: String?)
}
Original file line number Diff line number Diff line change
Expand Up @@ -67,35 +67,6 @@ internal class AksjonspunktServiceImpl(
}
}

override suspend fun settUtførtAksjonspunktOgSendLukkOppgaveTilK9Los(
journalpostId: String,
aksjonspunkt: Pair<AksjonspunktKode, AksjonspunktStatus>,
ansvarligSaksbehandler: String?
) {
val journalpost = journalpostService.hent(journalpostId)
val eksternId = journalpost.uuid
val (aksjonspunktKode, aksjonspunktStatus) = aksjonspunkt
val aksjonspunktEntitet = aksjonspunktRepository.hentAksjonspunkt(journalpostId, aksjonspunktKode.kode)!!
val punsjDtoJson = lagPunsjDto(
eksternId = eksternId,
journalpostId = journalpostId,
aktørId = journalpost.aktørId,
aksjonspunkter = mutableMapOf(aksjonspunktKode.kode to aksjonspunktStatus.kode),
ferdigstiltAv = ansvarligSaksbehandler
)

hendelseProducer.sendMedOnSuccess(
topicName = k9losAksjonspunkthendelseTopic,
data = punsjDtoJson,
key = eksternId.toString()
) {
runBlocking {
aksjonspunktRepository.settStatus(aksjonspunktEntitet.aksjonspunktId, AksjonspunktStatus.UTFØRT)
log.info("Setter aksjonspunkt(" + aksjonspunktEntitet.aksjonspunktId + ") med kode (" + aksjonspunktEntitet.aksjonspunktKode.kode + ") til UTFØRT")
}
}
}

override suspend fun settUtførtPåAltSendLukkOppgaveTilK9Los(
journalpostId: String,
erSendtInn: Boolean,
Expand Down
176 changes: 156 additions & 20 deletions src/main/kotlin/no/nav/k9punsj/domenetjenester/SoknadService.kt
Original file line number Diff line number Diff line change
@@ -1,42 +1,70 @@
package no.nav.k9punsj.domenetjenester

import com.fasterxml.jackson.databind.node.ObjectNode
import com.fasterxml.jackson.module.kotlin.convertValue
import no.nav.k9.kodeverk.Fagsystem
import no.nav.k9.kodeverk.dokument.Brevkode
import no.nav.k9.sak.typer.Saksnummer
import no.nav.k9.søknad.Søknad
import no.nav.k9.søknad.ytelse.Ytelse
import no.nav.k9punsj.domenetjenester.repository.SøknadRepository
import no.nav.k9punsj.felles.Identitetsnummer.Companion.somIdentitetsnummer
import no.nav.k9punsj.felles.JournalpostId.Companion.somJournalpostId
import no.nav.k9punsj.felles.dto.SøknadEntitet
import no.nav.k9punsj.innsending.InnsendingClient
import no.nav.k9punsj.hentCorrelationId
import no.nav.k9punsj.innsending.journalforjson.HtmlGenerator
import no.nav.k9punsj.innsending.journalforjson.PdfGenerator
import no.nav.k9punsj.integrasjoner.dokarkiv.DokarkivGateway
import no.nav.k9punsj.integrasjoner.dokarkiv.DokumentKategori
import no.nav.k9punsj.integrasjoner.dokarkiv.FagsakSystem
import no.nav.k9punsj.integrasjoner.dokarkiv.FerdigstillJournalpost
import no.nav.k9punsj.integrasjoner.dokarkiv.JournalPostRequest
import no.nav.k9punsj.integrasjoner.dokarkiv.JournalpostType
import no.nav.k9punsj.integrasjoner.dokarkiv.Kanal
import no.nav.k9punsj.integrasjoner.dokarkiv.SafDtos
import no.nav.k9punsj.integrasjoner.dokarkiv.SafGateway
import no.nav.k9punsj.integrasjoner.dokarkiv.SaksType
import no.nav.k9punsj.integrasjoner.dokarkiv.Tema
import no.nav.k9punsj.integrasjoner.k9sak.HentK9SaksnummerGrunnlag
import no.nav.k9punsj.integrasjoner.k9sak.K9SakService
import no.nav.k9punsj.integrasjoner.pdl.PdlService
import no.nav.k9punsj.integrasjoner.sak.SakClient
import no.nav.k9punsj.journalpost.JournalpostService
import no.nav.k9punsj.metrikker.SøknadMetrikkService
import no.nav.k9punsj.utils.objectMapper
import org.slf4j.LoggerFactory
import org.springframework.http.HttpStatus
import org.springframework.stereotype.Service
import java.util.UUID
import kotlin.coroutines.coroutineContext

@Service
internal class SoknadService(
private val journalpostService: JournalpostService,
private valknadRepository: SøknadRepository,
private val innsendingClient: InnsendingClient,
private valknadMetrikkService: SøknadMetrikkService,
private val safGateway: SafGateway
private val safGateway: SafGateway,
private val k9SakService: K9SakService,
private val sakClient: SakClient,
private val pdlService: PdlService,
private val dokarkivGateway: DokarkivGateway
) {

init {
logger.info("SøknadService init: innsendingClient = ${innsendingClient.toString()}")
}

internal suspend fun sendSøknad(
knad: Søknad,
brevkode: Brevkode,
journalpostIder: MutableSet<String>
): Pair<HttpStatus, String>? {
val correlationId = try { coroutineContext.hentCorrelationId() } catch (e: Exception) { UUID.randomUUID().toString() }

val journalpostIdListe = journalpostIder.toList()
val journalposterKanSendesInn = journalpostService.kanSendeInn(journalpostIdListe)
val punsjetAvSaksbehandler = søknadRepository.hentSøknad(søknad.søknadId.id)?.endret_av!!.replace("\"", "")

val søkerFnr = søknad.søker.personIdent.verdi
val ytelse = søknad.getYtelse<Ytelse>()
val fagsakYtelseType = no.nav.k9punsj.felles.FagsakYtelseType.fraNavn(ytelse.type.kode())

if (!journalposterKanSendesInn) {
return HttpStatus.CONFLICT to "En eller alle journalpostene $journalpostIder har blitt sendt inn fra før"
}
Expand All @@ -59,21 +87,130 @@ internal class SoknadService(
return HttpStatus.CONFLICT to "Journalposter med status feilregistrert ikke støttet: $journalposterMedStatusFeilregistrert"
}

try {
innsendingClient.sendSøknad(
søknadId = søknad.søknadId.id,
søknad = søknad,
correlationId = UUID.randomUUID().toString(), // TODO: Erstattes med f.eks. LogFilter
tilleggsOpplysninger = mapOf(
PunsjetAvSaksbehandler to punsjetAvSaksbehandler,
Søknadtype to brevkode.kode

val fagsakIder = journalposter.filterNotNull()
.filterNot { it.sak?.fagsakId.isNullOrEmpty() }
.map { it.journalpostId to it.sak?.fagsakId }
.toSet()

/*
* Bruker fagsakId fra journalposten om den finnes, ellers henter vi den fra k9sak
* Kaster feil om vi har fler æn 1 unik fagsakId
*/
val k9Saksnummer = if(fagsakIder.isNotEmpty()) {
if(fagsakIder.size > 1) {
throw IllegalStateException("Fant flere fagsakIder på innsending: ${fagsakIder.map { it.second }}")
}
fagsakIder.map {
logger.info("Journalpost ${it.first} knyttet til fagsakId ${it.second}")
}
fagsakIder.first().second
} else {
// Hent k9saksnummer
val k9SaksnummerGrunnlag = HentK9SaksnummerGrunnlag(
søknadstype = fagsakYtelseType,
søker = søkerFnr,
pleietrengende = søknad.berørtePersoner?.firstOrNull()?.personIdent?.verdi,
annenPart = søknad.berørtePersoner?.firstOrNull()?.personIdent?.verdi,
journalpostId = journalpostIder.first() // TODO: Brukes for å utlede dato, hentes fra behandlingsAar.
)
val k9Respons = k9SakService.hentEllerOpprettSaksnummer(k9SaksnummerGrunnlag)
require(k9Respons.second.isNullOrBlank()) { "Feil ved henting av saksnummer: ${k9Respons.second}" }
logger.info("Fick saksnummer (${k9Respons.second} av K9Sak for Journalpost ${journalpostIder.first()}")
k9Respons.first
}

require(k9Saksnummer != null) { "K9Saksnummer er null" }

// Sikkrer att saken kommer opp som valg i modia, ikke vart implementert sedan flytten till synkron
//sakClient.forsikreSakskoblingFinnes(k9Saksnummer, søknad.søker.toString(), UUID.randomUUID().toString())

// Ferdigstill journalposter
val søkerNavn = pdlService.hentPersonopplysninger(setOf(søkerFnr))
require(søkerNavn.isNotEmpty()) { throw IllegalStateException("Fant ikke søker i PDL") }
val bruker = FerdigstillJournalpost.Bruker(
identitetsnummer = søkerFnr.somIdentitetsnummer(),
navn = søkerNavn.first().navn(),
sak = Fagsystem.K9SAK to Saksnummer(k9Saksnummer)
)

val ferdigstillJournalposter = journalpostIder.map { journalpostId ->
safGateway.hentFerdigstillJournalpost(journalpostId = journalpostId.somJournalpostId())
}.filterNot { ferdigstillJournalpost ->
ferdigstillJournalpost.erFerdigstilt.also {
if (it) {
logger.info("JournalpostId=[${ferdigstillJournalpost.journalpostId}] er allerede ferdigstilt.")
}
}
}.map {
it.copy(
bruker = bruker,
sak = FerdigstillJournalpost.Sak(
sakstype = "FAGSAK",
fagsaksystem = "K9",
fagsakId = k9Saksnummer
)
)
} catch (e: Exception) {
logger.error("Feil vid innsending av søknad for journalpostIder: ${journalpostIder.joinToString(", ")}")
return Pair(HttpStatus.INTERNAL_SERVER_ERROR, e.stackTraceToString())
}

// TODO: Håndtere om vi manglerAvsendernavn?
val manglerAvsendernavn = ferdigstillJournalposter.filter { it.manglerAvsendernavn() }
require(manglerAvsendernavn.isEmpty()) {
"Mangler avsendernavn på journalposter=[${manglerAvsendernavn.map { it.journalpostId }}]"
}

// Alle journalposter klare til oppdatering & ferdigstilling
check(ferdigstillJournalposter.all { it.kanFerdigstilles }).also {
logger.info("Journalposter klare for ferdigstilling: ${ferdigstillJournalposter.map { it.journalpostId }}")
}

ferdigstillJournalposter.forEach { ferdigstillJournalpost ->
dokarkivGateway.oppdaterJournalpostForFerdigstilling(ferdigstillJournalpost)
dokarkivGateway.ferdigstillJournalpost(ferdigstillJournalpost.journalpostId.toString(), "9999")
logger.info("Ferdigstilt journalpost=[${ferdigstillJournalpost.journalpostId}]")
}

val søknadObject = objectMapper().convertValue<ObjectNode>(søknad)
søknadObject.put("punsjet av", punsjetAvSaksbehandler)

// Journalfør o ferdigstill søknadjson
val pdf = PdfGenerator.genererPdf(
html = HtmlGenerator.genererHtml(
tittel = "Innsending fra Punsj",
json = søknadObject
)
)

val nyJournalpostRequest = JournalPostRequest(
eksternReferanseId = correlationId,
tittel = "PunsjetSøknad",
brevkode = K9_PUNSJ_INNSENDING_BREVKODE,
tema = Tema.OMS,
kanal = Kanal.INGEN_DISTRIBUSJON,
journalposttype = JournalpostType.NOTAT,
dokumentkategori = DokumentKategori.IS,
fagsystem = FagsakSystem.K9,
sakstype = SaksType.FAGSAK,
saksnummer = k9Saksnummer!!,
brukerIdent = søkerFnr,
avsenderNavn = punsjetAvSaksbehandler,
pdf = pdf,
json = søknadObject
)

val journalpostId = dokarkivGateway.opprettOgFerdigstillJournalpost(nyJournalpostRequest).journalpostId.somJournalpostId()
logger.info("Opprettet Oppsummerings-PDF for PunsjetSøknad. JournalpostId=[$journalpostId]")

// Send in søknad til k9sak
k9SakService.sendInnSoeknad(
soknad = søknad,
journalpostId = journalpostId.toString(),
fagsakYtelseType = fagsakYtelseType,
saksnummer = k9Saksnummer,
brevkode = brevkode
)


leggerVedPayload(søknad, journalpostIder)
journalpostService.settAlleTilFerdigBehandlet(journalpostIdListe)
logger.info("Punsj har market disse journalpostIdene $journalpostIder som ferdigbehandlet")
Expand Down Expand Up @@ -118,7 +255,6 @@ internal class SoknadService(

companion object {
private val logger = LoggerFactory.getLogger(SoknadService::class.java)
private const val PunsjetAvSaksbehandler = "saksbehandler"
private const val Søknadtype = "søknadtype"
const val K9_PUNSJ_INNSENDING_BREVKODE = "K9_PUNSJ_INNSENDING"
}
}
Loading

0 comments on commit 5efe952

Please sign in to comment.