Skip to content
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

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

Merged
merged 1 commit into from
Sep 25, 2023
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
7 changes: 0 additions & 7 deletions .github/workflows/build-pull-request.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,6 @@ on:
jobs:
Build:
runs-on: ubuntu-latest
permissions:
pull-requests: write
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v3
Expand All @@ -26,8 +24,3 @@ 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: 2 additions & 0 deletions nais/dev-fss.yml
Original file line number Diff line number Diff line change
Expand Up @@ -136,3 +136,5 @@ spec:
# Feature toggles
- name: FERDIGSTILL_GOSYSOPPGAVE_ENABLED
value: "true"
- name: INNSENDING_REST_ENABLED
value: "true"
2 changes: 2 additions & 0 deletions nais/prod-fss.yml
Original file line number Diff line number Diff line change
Expand Up @@ -137,3 +137,5 @@ spec:
# Feature toggles
- name: FERDIGSTILL_GOSYSOPPGAVE_ENABLED
value: "false"
- name: INNSENDING_REST_ENABLED
value: "true"
19 changes: 16 additions & 3 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>9.0.4</k9-format.version>
<k9-format.version>8.3.4</k9-format.version>
<k9-rapid.version>1.20230823104755-1fc16e7</k9-rapid.version>

<!-- database -->
Expand All @@ -48,6 +48,7 @@
<!-- 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 @@ -63,7 +64,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.10</dusseldorf-ktor.version>
<dusseldorf-ktor.version>4.0.8</dusseldorf-ktor.version>
<de.huxhorn.sulky.ulid.version>8.3.0</de.huxhorn.sulky.ulid.version>
</properties>

Expand Down Expand Up @@ -125,7 +126,7 @@
</dependency>
<dependency>
<groupId>no.nav.k9</groupId>
<artifactId>soknad</artifactId>
<artifactId>soknad-jakarta</artifactId>
<version>${k9-format.version}</version>
</dependency>
<dependency>
Expand Down Expand Up @@ -224,11 +225,23 @@
<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,4 +18,5 @@ 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,6 +67,35 @@ 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: 20 additions & 156 deletions src/main/kotlin/no/nav/k9punsj/domenetjenester/SoknadService.kt
Original file line number Diff line number Diff line change
@@ -1,70 +1,42 @@
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.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.innsending.InnsendingClient
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 val søknadRepository: SøknadRepository,
private val innsendingClient: InnsendingClient,
private val søknadMetrikkService: SøknadMetrikkService,
private val safGateway: SafGateway,
private val k9SakService: K9SakService,
private val sakClient: SakClient,
private val pdlService: PdlService,
private val dokarkivGateway: DokarkivGateway
private val safGateway: SafGateway
) {

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

internal suspend fun sendSøknad(
sø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.toString()
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 @@ -87,130 +59,21 @@ internal class SoknadService(
return HttpStatus.CONFLICT to "Journalposter med status feilregistrert ikke støttet: $journalposterMedStatusFeilregistrert"
}


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.toString(),
annenPart = søknad.berørtePersoner?.firstOrNull()?.personIdent.toString(),
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
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
)
)
} 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 @@ -255,6 +118,7 @@ internal class SoknadService(

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