From 7c99c0866a450da76a288efeae9c71b98b638a9e Mon Sep 17 00:00:00 2001 From: Ramin Esfandiari Date: Mon, 23 Sep 2024 13:21:31 +0200 Subject: [PATCH] =?UTF-8?q?Lagt=20til=20st=C3=B8tte=20for=20=C3=A5=20kopie?= =?UTF-8?q?re=20journalpost=20(#1117)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Lagt til støtte for å kopiere journalpost (#1117) * WIP Støtte for å kopiere journalpost * Testjobb * Fikser kopiering av journalpost * Refaktorerer ut krav for kopiering. * Fjerner ubrukt felt. * Fjerner rapid og ubrukte klasser. * Fikser circular reference. * Lagrer journalpostkopi gjennom hendelseMottaker. * Etterspørr datoOpprettet ved kall mot SAF. * Legger på TODO... * Fjerner konsumering fra punsjbolle topic. * Fikser feilhåndtering ved kopiering av journalpost. * Rydder opp kode * Bruker enum for string verdier. * Fjerner ubrukt variabel. * Bruker enum for string verdier. * Forenkler logikk. * Returnerer mer detaljert respons ved kopiering av JP. --- nais/dev-fss.yml | 4 - nais/prod-fss.yml | 4 - pom.xml | 6 - .../k9punsj/domenetjenester/SoknadService.kt | 4 +- .../k9punsj/felles/PunsjFagsakYtelseType.kt | 12 ++ .../k9punsj/innsending/InnsendingClient.kt | 69 -------- .../KopierJournalpostInnsendingClient.kt | 44 ----- .../integrasjoner/dokarkiv/DokarkivGateway.kt | 55 ++++++- .../k9punsj/integrasjoner/dokarkiv/SafDtos.kt | 20 ++- .../integrasjoner/dokarkiv/SafGateway.kt | 2 +- .../integrasjoner/gosys/GosysService.kt | 2 +- .../integrasjoner/k9sak/K9SakService.kt | 5 + .../integrasjoner/k9sak/K9SakServiceImpl.kt | 39 ++++- .../k9sak/dto/HentK9SaksnummerGrunnlagDto.kt | 6 +- .../k9punsj/journalpost/JournalpostRoutes.kt | 58 ++----- .../k9punsj/journalpost/JournalpostService.kt | 13 +- .../JournalpostkopieringService.kt | 155 ++++++++++++++++++ .../journalpost/dto/KopierJournalpostDto.kt | 13 ++ .../journalpost/dto/KopierJournalpostInfo.kt | 15 +- .../no/nav/k9punsj/kafka/KafkaConsumers.kt | 12 -- .../no/nav/k9punsj/utils/PeriodeUtils.kt | 4 + src/main/resources/application.yml | 7 - .../no/nav/k9punsj/MockConfiguration.kt | 1 - .../AksjonspunktServiceImplTest.kt | 4 - .../domenetjenester/SoknadServiceTest.kt | 7 +- .../no/nav/k9punsj/fordel/FordelKafkaTest.kt | 4 - .../k9punsj/fordel/HendelseMottakerTest.kt | 4 - ...pieringJournalpostInnsendingMappingTest.kt | 57 ------- .../innsending/LoggingInnsendingClient.kt | 16 -- .../journalpost/JournalpostServiceTest.kt | 4 + .../journalpost/KopierJournalpostRouteTest.kt | 131 +++++++++++++-- .../no/nav/k9punsj/journalpost/SafDtosTest.kt | 13 +- .../postmottak/PostMottakServiceTest.kt | 4 +- .../rest/eksternt/k9sak/LokalK9SakService.kt | 5 + .../rest/eksternt/k9sak/TestK9SakService.kt | 7 +- .../no/nav/k9punsj/wiremock/SafMocks.kt | 3 + 36 files changed, 478 insertions(+), 331 deletions(-) delete mode 100644 src/main/kotlin/no/nav/k9punsj/innsending/InnsendingClient.kt delete mode 100644 src/main/kotlin/no/nav/k9punsj/innsending/KopierJournalpostInnsendingClient.kt create mode 100644 src/main/kotlin/no/nav/k9punsj/journalpost/JournalpostkopieringService.kt delete mode 100644 src/test/kotlin/no/nav/k9punsj/innsending/KopieringJournalpostInnsendingMappingTest.kt delete mode 100644 src/test/kotlin/no/nav/k9punsj/innsending/LoggingInnsendingClient.kt diff --git a/nais/dev-fss.yml b/nais/dev-fss.yml index db2025ea5..01a163bd1 100644 --- a/nais/dev-fss.yml +++ b/nais/dev-fss.yml @@ -146,8 +146,6 @@ spec: value: api://dev-fss.teamdokumenthandtering.dokarkiv-q1/.default # Integrasjoner (Kafka) - - name: K9_RAPID_TOPIC - value: "omsorgspenger.k9-rapid-v2" - name: SEND_AKSJONSPUNKTHENDELSE_TIL_K9LOS value: "k9saksbehandling.punsj-aksjonspunkthendelse-v1" - name: SEND_BREVBESTILLING_TIL_K9_FORMIDLING @@ -156,8 +154,6 @@ spec: value: "k9saksbehandling.k9-punsj-til-los" - name: K9_FORDEL_TOPIC value: "k9saksbehandling.fordel-journalforing" - - name: K9_PUNSJBOLLE_TOPIC - value: "k9saksbehandling.punsjbar-journalpost" # Div - name: SETT_PAA_VENT_TID diff --git a/nais/prod-fss.yml b/nais/prod-fss.yml index feff52237..c37e5bb13 100644 --- a/nais/prod-fss.yml +++ b/nais/prod-fss.yml @@ -139,8 +139,6 @@ spec: value: api://prod-fss.teamdokumenthandtering.dokarkiv/.default # Integrasjoner (Kafka) - - name: K9_RAPID_TOPIC - value: "omsorgspenger.k9-rapid-v2" - name: SEND_AKSJONSPUNKTHENDELSE_TIL_K9LOS value: "k9saksbehandling.punsj-aksjonspunkthendelse-v1" - name: SEND_BREVBESTILLING_TIL_K9_FORMIDLING @@ -149,8 +147,6 @@ spec: value: "k9saksbehandling.k9-punsj-til-los" - name: K9_FORDEL_TOPIC value: "k9saksbehandling.fordel-journalforing" - - name: K9_PUNSJBOLLE_TOPIC - value: "k9saksbehandling.punsjbar-journalpost" # Feature toggles - name: FERDIGSTILL_GOSYSOPPGAVE_ENABLED diff --git a/pom.xml b/pom.xml index 5557d914e..2183d6783 100644 --- a/pom.xml +++ b/pom.xml @@ -34,7 +34,6 @@ 4.2.0 10.1.0 9.5.2 - 1.20240510083323-9f05ca1 42.7.4 @@ -126,11 +125,6 @@ soknad ${k9-format.version} - - no.nav.k9.rapid - behov - ${k9-rapid.version} - diff --git a/src/main/kotlin/no/nav/k9punsj/domenetjenester/SoknadService.kt b/src/main/kotlin/no/nav/k9punsj/domenetjenester/SoknadService.kt index f407a820f..99c260347 100644 --- a/src/main/kotlin/no/nav/k9punsj/domenetjenester/SoknadService.kt +++ b/src/main/kotlin/no/nav/k9punsj/domenetjenester/SoknadService.kt @@ -74,7 +74,7 @@ class SoknadService( val journalposter = safGateway.hentJournalposter(journalpostIdListe) val journalposterMedTypeUtgaaende = journalposter.filterNotNull() - .filter { it.journalposttype == SafDtos.JournalpostType.U.toString() } + .filter { it.journalposttype == SafDtos.JournalpostType.UTGAAENDE.kode } .map { it.journalpostId } .toSet() if (journalposterMedTypeUtgaaende.isNotEmpty()) { @@ -339,7 +339,7 @@ class SoknadService( private suspend fun hentOgSjekkJournalpostene(journalpostIdListe: List): Pair, Set> { val journalposter = safGateway.hentJournalposter(journalpostIdListe) val journalposterMedTypeUtgaaende = journalposter.filterNotNull() - .filter { it.journalposttype == SafDtos.JournalpostType.U.toString() } + .filter { it.journalposttype == SafDtos.JournalpostType.UTGAAENDE.kode } .map { it.journalpostId } .toSet() return Pair(journalposter, journalposterMedTypeUtgaaende) diff --git a/src/main/kotlin/no/nav/k9punsj/felles/PunsjFagsakYtelseType.kt b/src/main/kotlin/no/nav/k9punsj/felles/PunsjFagsakYtelseType.kt index 59e818ba9..f5360284f 100644 --- a/src/main/kotlin/no/nav/k9punsj/felles/PunsjFagsakYtelseType.kt +++ b/src/main/kotlin/no/nav/k9punsj/felles/PunsjFagsakYtelseType.kt @@ -40,5 +40,17 @@ enum class PunsjFagsakYtelseType(@JsonValue val kode: String, val navn: String, fun fraNavn(navn: String): PunsjFagsakYtelseType { return values().firstOrNull { it.name == navn } ?: UDEFINERT } + + fun FagsakYtelseType.somPunsjFagsakYtelseType(): PunsjFagsakYtelseType = when(this) { + FagsakYtelseType.PLEIEPENGER_SYKT_BARN -> PLEIEPENGER_SYKT_BARN + FagsakYtelseType.PLEIEPENGER_NÆRSTÅENDE -> PLEIEPENGER_LIVETS_SLUTTFASE + FagsakYtelseType.OMSORGSPENGER -> OMSORGSPENGER + FagsakYtelseType.OMSORGSPENGER_KS -> OMSORGSPENGER_KRONISK_SYKT_BARN + FagsakYtelseType.OMSORGSPENGER_MA -> OMSORGSPENGER_MIDLERTIDIG_ALENE + FagsakYtelseType.OMSORGSPENGER_AO -> OMSORGSPENGER_ALENE_OMSORGEN + FagsakYtelseType.OPPLÆRINGSPENGER -> OPPLÆRINGSPENGER + FagsakYtelseType.UDEFINERT -> UKJENT + else -> throw IllegalStateException("Ikke støttet fagsakytelsetype: $this") + } } } diff --git a/src/main/kotlin/no/nav/k9punsj/innsending/InnsendingClient.kt b/src/main/kotlin/no/nav/k9punsj/innsending/InnsendingClient.kt deleted file mode 100644 index d75277b8f..000000000 --- a/src/main/kotlin/no/nav/k9punsj/innsending/InnsendingClient.kt +++ /dev/null @@ -1,69 +0,0 @@ -package no.nav.k9punsj.innsending - -import com.fasterxml.jackson.module.kotlin.convertValue -import de.huxhorn.sulky.ulid.ULID -import kotlinx.coroutines.runBlocking -import net.logstash.logback.argument.StructuredArguments.keyValue -import no.nav.k9.kodeverk.behandling.FagsakYtelseType -import no.nav.k9.rapid.behov.Behov -import no.nav.k9.rapid.behov.Behovssekvens -import no.nav.k9.søknad.Søknad -import no.nav.k9punsj.journalpost.dto.KopierJournalpostInfo -import no.nav.k9punsj.utils.objectMapper -import org.slf4j.LoggerFactory -import java.util.* - -interface InnsendingClient { - fun mapKopierJournalpost(info: KopierJournalpostInfo): Pair { - val behovssekvensId = ulid.nextULID() - val correlationId = UUID.randomUUID().toString() - logger.info( - "Sender journalpost (${info.journalpostId}) til kopiering med ytelse ${info.ytelse.kode}", - keyValue("journalpost_id", info.journalpostId), - keyValue("correlation_id", correlationId), - keyValue("behovssekvens_id", behovssekvensId) - ) - return Behovssekvens( - id = behovssekvensId, - correlationId = correlationId, - behov = arrayOf( - Behov( - navn = KopierPunsjbarJournalpostBehovNavn, - input = mapOf( - VersjonKey to KopierPunsjbarJournalpostVersjon, - "journalpostId" to info.journalpostId, - "fra" to info.fra, - "til" to info.til, - "pleietrengende" to info.pleietrengende, - "annenPart" to info.annenPart, - "søknadstype" to info.ytelse.somSøknadstype() - ) - ) - ) - ).keyValue - } - - suspend fun sendKopierJournalpost(info: KopierJournalpostInfo) = send(mapKopierJournalpost(info)) - - suspend fun send(pair: Pair) - - companion object { - private val logger = LoggerFactory.getLogger(InnsendingClient::class.java) - private val objectMapper = objectMapper() - private val ulid = ULID() - private const val VersjonKey = "versjon" - - private const val KopierPunsjbarJournalpostBehovNavn = "KopierPunsjbarJournalpost" - private const val KopierPunsjbarJournalpostVersjon = "1.0.0" - - private fun FagsakYtelseType.somSøknadstype() = when (this) { - FagsakYtelseType.PLEIEPENGER_SYKT_BARN -> "PleiepengerSyktBarn" - FagsakYtelseType.OMSORGSPENGER -> "Omsorgspenger" - FagsakYtelseType.OMSORGSPENGER_KS -> "OmsorgspengerKroniskSyktBarn" - FagsakYtelseType.PLEIEPENGER_NÆRSTÅENDE -> "PleiepengerLivetsSluttfase" - else -> throw IllegalArgumentException("Støtter ikke ytelse ${this.navn}") - } - - internal fun Søknad.somMap(): Map = objectMapper.convertValue(this) - } -} diff --git a/src/main/kotlin/no/nav/k9punsj/innsending/KopierJournalpostInnsendingClient.kt b/src/main/kotlin/no/nav/k9punsj/innsending/KopierJournalpostInnsendingClient.kt deleted file mode 100644 index 8a2231881..000000000 --- a/src/main/kotlin/no/nav/k9punsj/innsending/KopierJournalpostInnsendingClient.kt +++ /dev/null @@ -1,44 +0,0 @@ -package no.nav.k9punsj.innsending - -import no.nav.k9punsj.StandardProfil -import org.apache.kafka.clients.CommonClientConfigs -import org.apache.kafka.clients.producer.KafkaProducer -import org.apache.kafka.clients.producer.ProducerConfig -import org.apache.kafka.clients.producer.ProducerRecord -import org.apache.kafka.common.serialization.StringSerializer -import org.slf4j.LoggerFactory -import org.springframework.beans.factory.annotation.Value -import org.springframework.stereotype.Component - -@Component -@StandardProfil -class KopierJournalpostInnsendingClient( - kafkaBaseProperties: Map, - @Value("\${no.nav.kafka.k9_rapid.topic}") private val k9rapidTopic: String -): InnsendingClient { - private val clientId = kafkaBaseProperties.getValue(CommonClientConfigs.CLIENT_ID_CONFIG) - private val kafkaProducer = KafkaProducer( - kafkaBaseProperties.toMutableMap().also { - it[ProducerConfig.ACKS_CONFIG] = "1" - it[ProducerConfig.LINGER_MS_CONFIG] = "0" - it[ProducerConfig.MAX_IN_FLIGHT_REQUESTS_PER_CONNECTION] = "1" - }, - StringSerializer(), - StringSerializer() - ) - - override suspend fun send(pair: Pair) { - val (key, value) = pair - kotlin.runCatching { - kafkaProducer.send(ProducerRecord(k9rapidTopic, key, value)).get() - }.onSuccess { metadata -> - logger.info("Innsending OK, Key=[$key], ClientId=[$clientId], Topic=[${metadata.topic()}], Offset=[${metadata.offset()}], Partition=[${metadata.partition()}]") - }.onFailure { throwable -> - throw IllegalStateException("Feil ved innsending, Key=[$key], ClientId=[$clientId], Topic=[$k9rapidTopic]", throwable) - } - } - - private companion object { - private val logger = LoggerFactory.getLogger(KopierJournalpostInnsendingClient::class.java) - } -} diff --git a/src/main/kotlin/no/nav/k9punsj/integrasjoner/dokarkiv/DokarkivGateway.kt b/src/main/kotlin/no/nav/k9punsj/integrasjoner/dokarkiv/DokarkivGateway.kt index 80504d7c0..8bae1498b 100644 --- a/src/main/kotlin/no/nav/k9punsj/integrasjoner/dokarkiv/DokarkivGateway.kt +++ b/src/main/kotlin/no/nav/k9punsj/integrasjoner/dokarkiv/DokarkivGateway.kt @@ -38,10 +38,8 @@ import org.springframework.http.MediaType import org.springframework.http.ResponseEntity import org.springframework.stereotype.Service import org.springframework.web.reactive.function.BodyInserters -import org.springframework.web.reactive.function.client.ClientResponse import org.springframework.web.reactive.function.client.ExchangeStrategies import org.springframework.web.reactive.function.client.WebClient -import org.springframework.web.reactive.function.client.toEntity import java.net.URI import java.util.* import kotlin.coroutines.coroutineContext @@ -208,6 +206,56 @@ class DokarkivGateway( } } + internal suspend fun knyttTilAnnenSak( + journalpostId: JournalpostId, + identitetsnummer: Identitetsnummer, + saksnummer: String + ): JournalpostId { + val accessToken = cachedAccessTokenClient + .getAccessToken( + scopes = dokarkivScope, + onBehalfOf = coroutineContext.hentAuthentication().accessToken + ) + + @Language("JSON") + val dto = """ + { + "sakstype": "${SafDtos.Sakstype.FAGSAK}", + "fagsaksystem": "${FagsakSystem.K9}", + "fagsakId": "$saksnummer", + "journalfoerendeEnhet": "9999", + "tema": "${Tema.OMS}", + "bruker": { + "idType": "${IdType.FNR}", + "id": "$identitetsnummer" + } + } + """.trimIndent() + val body = BodyInserters.fromValue(dto) + val url = URI.create(knyttTilAnnenSakUrl(journalpostId)) + + val response = client + .put() + .uri(url) + .header(ConsumerIdHeaderKey, ConsumerIdHeaderValue) + .header(CorrelationIdHeader, coroutineContext.hentCorrelationId()) + .header(HttpHeaders.AUTHORIZATION, accessToken.asAuthoriationHeader()) + .accept(MediaType.APPLICATION_JSON) + .contentType(MediaType.APPLICATION_JSON) + .body(body) + .retrieve() + .toEntity(String::class.java) + .awaitFirst() + + check(response.statusCode.is2xxSuccessful) { + "Feil ved kopiering av journalpost. HttpStatus=[${response.statusCode.value()}, Response=[${response.body}], Url=[$url]" + } + + val nyJournalpostId = JSONObject(response.body).get("nyJournalpostId").toString().somJournalpostId() + + return nyJournalpostId + } + private companion object { private val logger: Logger = LoggerFactory.getLogger(DokarkivGateway::class.java) private const val ConsumerIdHeaderKey = "Nav-Consumer-Id" @@ -233,6 +281,8 @@ class DokarkivGateway( private fun String.oppdaterJournalpostUrl() = "$baseUrl/rest/journalpostapi/v1/journalpost/$this" private val opprettOgFerdigstillJournalpostUrl = "$baseUrl/rest/journalpostapi/v1/journalpost?forsoekFerdigstill=true" private fun String.ferdigstillJournalpostUrl() = "$baseUrl/rest/journalpostapi/v1/journalpost/$this/ferdigstill" + private fun knyttTilAnnenSakUrl(journalpostId: JournalpostId) = + "$baseUrl/rest/journalpostapi/v1/journalpost/$journalpostId/knyttTilAnnenSak" private fun JSONObject.stringOrNull(key: String) = when (notNullNotBlankString(key)) { true -> getString(key) @@ -371,6 +421,7 @@ data class JournalPostRequest( } enum class Tema { OMS } +enum class IdType { FNR } enum class JournalpostType { NOTAT } enum class DokumentKategori { IS } enum class FagsakSystem { K9 } diff --git a/src/main/kotlin/no/nav/k9punsj/integrasjoner/dokarkiv/SafDtos.kt b/src/main/kotlin/no/nav/k9punsj/integrasjoner/dokarkiv/SafDtos.kt index 359e9abe5..c9a2dae19 100644 --- a/src/main/kotlin/no/nav/k9punsj/integrasjoner/dokarkiv/SafDtos.kt +++ b/src/main/kotlin/no/nav/k9punsj/integrasjoner/dokarkiv/SafDtos.kt @@ -14,6 +14,7 @@ internal object SafDtos { tema tittel journalposttype + datoOpprettet relevanteDatoer { dato datotype @@ -89,8 +90,8 @@ internal object SafDtos { OMS } - enum class JournalpostType { - I, N, U + enum class JournalpostType(val kode: String) { + INNGAAENDE("I"), NOTAT("N"), UTGAAENDE("U") } internal enum class AvsenderType { @@ -117,6 +118,9 @@ internal object SafDtos { GENERELL_SAK, FAGSAK } + internal enum class K9Type { SØKNAD, ETTERSENDELSE } + internal enum class K9Kilde { DIGITAL } + internal data class Bruker( val id: String?, val type: String? @@ -164,18 +168,24 @@ internal object SafDtos { val avsenderMottaker: AvsenderMottaker?, val dokumenter: List, val relevanteDatoer: List, + val datoOpprettet: LocalDateTime, private val tilleggsopplysninger: List = emptyList() ) { val k9Kilde = tilleggsopplysninger.firstOrNull { it.nokkel == "k9.kilde" }?.verdi val k9Type = tilleggsopplysninger.firstOrNull { it.nokkel == "k9.type" }?.verdi - private val erDigital = "DIGITAL" == k9Kilde - private val erEttersendelse = "ETTERSENDELSE" == k9Type - private val erSøknad = "SØKNAD" == k9Type + val erUtgående = journalposttype == JournalpostType.UTGAAENDE.kode + private val erDigital = K9Kilde.DIGITAL.name == k9Kilde + val erEttersendelse = K9Type.ETTERSENDELSE.name == k9Type + private val erSøknad = K9Type.SØKNAD.name == k9Type val erIkkeStøttetDigitalJournalpost = when (erDigital) { true -> !(erEttersendelse || erSøknad) false -> false } val ikkeErTemaOMS = tema?.let { Tema.OMS.name != it } ?: false + + private val erInngående = journalposttype == JournalpostType.INNGAAENDE.kode + private val erNotat = journalposttype == JournalpostType.NOTAT.kode + internal val kanKopieres = erInngående || erNotat } internal data class Tilleggsopplysning( diff --git a/src/main/kotlin/no/nav/k9punsj/integrasjoner/dokarkiv/SafGateway.kt b/src/main/kotlin/no/nav/k9punsj/integrasjoner/dokarkiv/SafGateway.kt index 8519216c1..1f13d570d 100644 --- a/src/main/kotlin/no/nav/k9punsj/integrasjoner/dokarkiv/SafGateway.kt +++ b/src/main/kotlin/no/nav/k9punsj/integrasjoner/dokarkiv/SafGateway.kt @@ -158,7 +158,7 @@ class SafGateway( } // Kan ikke oppdatere eller ferdigstille Notater som er under redigering. - if (journalpost?.journalposttype == "N" && + if (journalpost?.journalposttype == SafDtos.JournalpostType.NOTAT.kode && journalpost.journalstatus?.equals("UNDER_ARBEID") == true ) throw NotatUnderArbeidFeil().also { logger.warn("Ikke støttet journalpost: Type NOTAT med status UNDER_ARBEID") diff --git a/src/main/kotlin/no/nav/k9punsj/integrasjoner/gosys/GosysService.kt b/src/main/kotlin/no/nav/k9punsj/integrasjoner/gosys/GosysService.kt index e52938087..500d50aac 100644 --- a/src/main/kotlin/no/nav/k9punsj/integrasjoner/gosys/GosysService.kt +++ b/src/main/kotlin/no/nav/k9punsj/integrasjoner/gosys/GosysService.kt @@ -49,7 +49,7 @@ internal class GosysService( ?: return ServerResponse.status(HttpStatus.NOT_FOUND).buildAndAwait() .also { logger.warn("Kunne ikke finne journalpost med id {}", oppgaveRequest.journalpostId) } - if (!(journalpostInfo.journalpostType == SafDtos.JournalpostType.I.name + if (!(journalpostInfo.journalpostType == SafDtos.JournalpostType.INNGAAENDE.kode && journalpostInfo.journalpostStatus == SafDtos.Journalstatus.MOTTATT.name) ) { logger.warn( diff --git a/src/main/kotlin/no/nav/k9punsj/integrasjoner/k9sak/K9SakService.kt b/src/main/kotlin/no/nav/k9punsj/integrasjoner/k9sak/K9SakService.kt index 71855a408..e3eece3e8 100644 --- a/src/main/kotlin/no/nav/k9punsj/integrasjoner/k9sak/K9SakService.kt +++ b/src/main/kotlin/no/nav/k9punsj/integrasjoner/k9sak/K9SakService.kt @@ -10,6 +10,7 @@ import no.nav.k9punsj.felles.dto.PeriodeDto import no.nav.k9punsj.felles.dto.SaksnummerDto import no.nav.k9punsj.felles.dto.SøknadEntitet import no.nav.k9punsj.integrasjoner.k9sak.dto.Fagsak +import no.nav.k9punsj.integrasjoner.k9sak.dto.HentK9SaksnummerGrunnlag import no.nav.k9punsj.integrasjoner.k9sak.dto.ReservertSaksnummerDto import no.nav.k9punsj.integrasjoner.k9sak.dto.ReserverSaksnummerDto @@ -42,6 +43,10 @@ interface K9SakService { punsjFagsakYtelseType: PunsjFagsakYtelseType ): Pair + suspend fun hentEllerOpprettSaksnummer( + hentK9SaksnummerGrunnlag: HentK9SaksnummerGrunnlag + ): String + suspend fun sendInnSoeknad( soknad: Søknad, journalpostId: String, diff --git a/src/main/kotlin/no/nav/k9punsj/integrasjoner/k9sak/K9SakServiceImpl.kt b/src/main/kotlin/no/nav/k9punsj/integrasjoner/k9sak/K9SakServiceImpl.kt index 499b5d03a..1841a5609 100644 --- a/src/main/kotlin/no/nav/k9punsj/integrasjoner/k9sak/K9SakServiceImpl.kt +++ b/src/main/kotlin/no/nav/k9punsj/integrasjoner/k9sak/K9SakServiceImpl.kt @@ -41,8 +41,8 @@ import no.nav.k9punsj.integrasjoner.k9sak.K9SakServiceImpl.Urls.sendInnSøknadUr import no.nav.k9punsj.integrasjoner.k9sak.K9SakServiceImpl.Urls.sokFagsakerUrl import no.nav.k9punsj.integrasjoner.k9sak.dto.Fagsak import no.nav.k9punsj.integrasjoner.k9sak.dto.HentK9SaksnummerGrunnlag -import no.nav.k9punsj.integrasjoner.k9sak.dto.ReservertSaksnummerDto import no.nav.k9punsj.integrasjoner.k9sak.dto.ReserverSaksnummerDto +import no.nav.k9punsj.integrasjoner.k9sak.dto.ReservertSaksnummerDto import no.nav.k9punsj.journalpost.JournalpostService import no.nav.k9punsj.korrigeringinntektsmelding.tilOmsvisning import no.nav.k9punsj.omsorgspengeraleneomsorg.tilOmsAOvisning @@ -64,8 +64,7 @@ import org.springframework.http.HttpHeaders import org.springframework.http.HttpStatus import java.net.URI import java.time.LocalDate -import java.util.Base64 -import java.util.UUID +import java.util.* import kotlin.coroutines.coroutineContext @Configuration @@ -300,6 +299,40 @@ class K9SakServiceImpl( } } + override suspend fun hentEllerOpprettSaksnummer( + k9SaksnummerGrunnlag: HentK9SaksnummerGrunnlag + ): String { + val søkerAktørId = personService.finnEllerOpprettPersonVedNorskIdent(k9SaksnummerGrunnlag.søker).aktørId + val pleietrengendeAktørId = + if (!k9SaksnummerGrunnlag.pleietrengende.isNullOrEmpty() && k9SaksnummerGrunnlag.pleietrengende != "null") { + personService.finnEllerOpprettPersonVedNorskIdent(k9SaksnummerGrunnlag.pleietrengende).aktørId + } else null + val annenpartAktørId = + if (!k9SaksnummerGrunnlag.annenPart.isNullOrEmpty() && k9SaksnummerGrunnlag.annenPart != "null") { + personService.finnEllerOpprettPersonVedNorskIdent(k9SaksnummerGrunnlag.annenPart).aktørId + } else null + + val ytelseTypeKode = k9SaksnummerGrunnlag.søknadstype.somK9FagsakYtelseType().kode + val k9Periode = k9SaksnummerGrunnlag.periode?.let { Periode(it.fom, it.tom) } + requireNotNull(k9Periode) { "Mangler periode" } + + val payloadMedAktørId = FinnEllerOpprettSak( + ytelseTypeKode, + søkerAktørId, + pleietrengendeAktørId, + annenpartAktørId, + k9Periode, + null + ) + + val body = kotlin.runCatching { objectMapper(kodeverdiSomString = kodeverdiSomString).writeValueAsString(payloadMedAktørId) }.getOrNull() + ?: throw IllegalStateException("Feilet serialisering") + + val response = httpPost(body, opprettFagsakUrl) + + return JSONObject(response).getString("saksnummer").toString() + } + override suspend fun sendInnSoeknad( soknad: Søknad, journalpostId: String, diff --git a/src/main/kotlin/no/nav/k9punsj/integrasjoner/k9sak/dto/HentK9SaksnummerGrunnlagDto.kt b/src/main/kotlin/no/nav/k9punsj/integrasjoner/k9sak/dto/HentK9SaksnummerGrunnlagDto.kt index ab7e4c2bc..44906d7f9 100644 --- a/src/main/kotlin/no/nav/k9punsj/integrasjoner/k9sak/dto/HentK9SaksnummerGrunnlagDto.kt +++ b/src/main/kotlin/no/nav/k9punsj/integrasjoner/k9sak/dto/HentK9SaksnummerGrunnlagDto.kt @@ -10,4 +10,8 @@ data class HentK9SaksnummerGrunnlag( val pleietrengende: String?, val annenPart: String?, val periode: PeriodeDto?, -) +) { + override fun toString(): String { + return "HentK9SaksnummerGrunnlag(søknadstype=$søknadstype, harSøker=true, harpleietrengende=${pleietrengende != null}, harAnnenPart=${annenPart != null}, periode=$periode)" + } +} diff --git a/src/main/kotlin/no/nav/k9punsj/journalpost/JournalpostRoutes.kt b/src/main/kotlin/no/nav/k9punsj/journalpost/JournalpostRoutes.kt index 17077dd52..8753b9a11 100644 --- a/src/main/kotlin/no/nav/k9punsj/journalpost/JournalpostRoutes.kt +++ b/src/main/kotlin/no/nav/k9punsj/journalpost/JournalpostRoutes.kt @@ -8,14 +8,14 @@ import no.nav.k9punsj.RequestContext import no.nav.k9punsj.SaksbehandlerRoutes import no.nav.k9punsj.akjonspunkter.AksjonspunktService import no.nav.k9punsj.domenetjenester.PersonService -import no.nav.k9punsj.felles.PunsjFagsakYtelseType import no.nav.k9punsj.felles.IdentOgJournalpost import no.nav.k9punsj.felles.Identitetsnummer.Companion.somIdentitetsnummer import no.nav.k9punsj.felles.IkkeFunnet import no.nav.k9punsj.felles.IkkeStøttetJournalpost import no.nav.k9punsj.felles.IkkeTilgang +import no.nav.k9punsj.felles.JournalpostId.Companion.somJournalpostId +import no.nav.k9punsj.felles.PunsjFagsakYtelseType import no.nav.k9punsj.fordel.K9FordelType -import no.nav.k9punsj.innsending.InnsendingClient import no.nav.k9punsj.integrasjoner.dokarkiv.SafDtos import no.nav.k9punsj.integrasjoner.gosys.GosysService import no.nav.k9punsj.integrasjoner.k9sak.K9SakService @@ -24,7 +24,6 @@ import no.nav.k9punsj.journalpost.dto.BehandlingsAarDto import no.nav.k9punsj.journalpost.dto.IdentDto import no.nav.k9punsj.journalpost.dto.JournalpostInfoDto import no.nav.k9punsj.journalpost.dto.KopierJournalpostDto -import no.nav.k9punsj.journalpost.dto.KopierJournalpostInfo import no.nav.k9punsj.journalpost.dto.LukkJournalpostDto import no.nav.k9punsj.journalpost.dto.PunsjJournalpost import no.nav.k9punsj.journalpost.dto.PunsjJournalpostKildeType @@ -49,8 +48,6 @@ import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import org.springframework.http.HttpHeaders import org.springframework.http.HttpStatus -import org.springframework.http.ProblemDetail -import org.springframework.web.ErrorResponseException import org.springframework.web.reactive.function.BodyExtractors import org.springframework.web.reactive.function.server.ServerRequest import org.springframework.web.reactive.function.server.ServerResponse @@ -59,7 +56,7 @@ import org.springframework.web.reactive.function.server.buildAndAwait import org.springframework.web.reactive.function.server.json import java.time.LocalDate import java.time.LocalDateTime -import java.util.UUID +import java.util.* import java.util.regex.Pattern import kotlin.coroutines.coroutineContext @@ -67,11 +64,11 @@ import kotlin.coroutines.coroutineContext internal class JournalpostRoutes( private val authenticationHandler: AuthenticationHandler, private val journalpostService: JournalpostService, + private val journalpostkopieringService: JournalpostkopieringService, private val pdlService: PdlService, private val personService: PersonService, private val aksjonspunktService: AksjonspunktService, private val pepClient: IPepClient, - private val innsendingClient: InnsendingClient, private val gosysService: GosysService, private val sakService: SakService, private val k9SakService: K9SakService, @@ -120,7 +117,7 @@ internal class JournalpostRoutes( val safJournalPost = journalpostService.hentSafJournalPost(journalpostId = journalpostId) val kanOpprettesJournalforingsOppgave = - (journalpostInfo.journalpostType == SafDtos.JournalpostType.I.name && + (journalpostInfo.journalpostType == SafDtos.JournalpostType.INNGAAENDE.kode && journalpostInfo.journalpostStatus == SafDtos.Journalstatus.MOTTATT.name) val erFerdigstiltEllerJournalfoert = ( journalpostInfo.journalpostStatus == SafDtos.Journalstatus.FERDIGSTILT.name || @@ -411,8 +408,6 @@ internal class JournalpostRoutes( RequestContext(coroutineContext, request) { val journalpostId = request.pathVariable("journalpost_id") val dto = request.body(BodyExtractors.toMono(KopierJournalpostDto::class.java)).awaitFirst() - val journalpost = journalpostService.hentHvisJournalpostMedId(journalpostId) - ?: throw KanIkkeKopieresErrorResponse("Finner ikke journalpost.") val identListe = mutableListOf(dto.fra, dto.til) dto.barn?.let { identListe.add(it) } @@ -424,43 +419,14 @@ internal class JournalpostRoutes( .bodyValueAndAwait("Har ikke lov til å kopiere journalpost.") } - val safJournalpost = journalpostService.hentSafJournalPost(journalpostId) - if (safJournalpost != null && safJournalpost.journalposttype == "U") { - throw KanIkkeKopieresErrorResponse("Ikke støttet journalposttype: ${safJournalpost.journalposttype}") - } - - val k9FagsakYtelseType: FagsakYtelseType = - dto.ytelse?.somK9FagsakYtelseType() ?: journalpost.ytelse?.let { - val punsjFagsakYtelseType = PunsjFagsakYtelseType.fromKode(it) - journalpost.utledK9sakFagsakYtelseType(punsjFagsakYtelseType.somK9FagsakYtelseType()) - } ?: throw KanIkkeKopieresErrorResponse("Mangler ytelse for journalpost.") - - if (journalpost.type == K9FordelType.INNTEKTSMELDING_UTGÅTT.kode) { - throw KanIkkeKopieresErrorResponse("Kan ikke kopiere journalpost med type inntektsmelding utgått.") - } - - val støttedeYtelseTyperForKopiering = setOf( - FagsakYtelseType.OMSORGSPENGER_KS, - FagsakYtelseType.PLEIEPENGER_SYKT_BARN, - FagsakYtelseType.PLEIEPENGER_NÆRSTÅENDE + val kopierJournalpostInfo = journalpostkopieringService.kopierJournalpost( + journalpostId = journalpostId.somJournalpostId(), + kopierJournalpostDto = dto ) - if (k9FagsakYtelseType !in støttedeYtelseTyperForKopiering) { - throw KanIkkeKopieresErrorResponse("Støtter ikke kopiering av ${k9FagsakYtelseType.navn} for relaterte journalposter") - } - - innsendingClient.sendKopierJournalpost( - KopierJournalpostInfo( - journalpostId = journalpostId, - fra = dto.fra, - til = dto.til, - pleietrengende = dto.barn, - ytelse = k9FagsakYtelseType - ) - ) return@RequestContext ServerResponse - .status(HttpStatus.ACCEPTED) - .bodyValueAndAwait("Journalposten vil bli kopiert.") + .status(HttpStatus.CREATED) + .bodyValueAndAwait(kopierJournalpostInfo) } } } @@ -548,10 +514,6 @@ internal class JournalpostRoutes( } } - private class KanIkkeKopieresErrorResponse(feil: String) : - ErrorResponseException(HttpStatus.CONFLICT, ProblemDetail.forStatusAndDetail(HttpStatus.CONFLICT, feil), null) - - private fun ServerRequest.journalpostId(): String = pathVariable(JournalpostIdKey) private fun ServerRequest.dokumentId(): String = pathVariable(DokumentIdKey) diff --git a/src/main/kotlin/no/nav/k9punsj/journalpost/JournalpostService.kt b/src/main/kotlin/no/nav/k9punsj/journalpost/JournalpostService.kt index 127a35b01..c8223a364 100644 --- a/src/main/kotlin/no/nav/k9punsj/journalpost/JournalpostService.kt +++ b/src/main/kotlin/no/nav/k9punsj/journalpost/JournalpostService.kt @@ -2,10 +2,10 @@ package no.nav.k9punsj.journalpost import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.module.kotlin.convertValue -import no.nav.k9punsj.felles.PunsjFagsakYtelseType import no.nav.k9punsj.felles.Identitetsnummer import no.nav.k9punsj.felles.Identitetsnummer.Companion.somIdentitetsnummer import no.nav.k9punsj.felles.IkkeTilgang +import no.nav.k9punsj.felles.PunsjFagsakYtelseType import no.nav.k9punsj.felles.Sak import no.nav.k9punsj.felles.dto.JournalposterDto import no.nav.k9punsj.felles.dto.SøknadEntitet @@ -97,7 +97,7 @@ class JournalpostService( norskIdent = norskIdent, aktørId = aktørId, mottattDato = mottattDato, - erInngående = SafDtos.JournalpostType.I == parsedJournalpost.journalpostType, + erInngående = SafDtos.JournalpostType.INNGAAENDE == parsedJournalpost.journalpostType, journalpostStatus = safJournalpost.journalstatus!!, journalpostType = safJournalpost.journalposttype ) @@ -141,7 +141,10 @@ class JournalpostService( } } - internal suspend fun oppdaterOgFerdigstillForMottak(dto: JournalpostMottaksHaandteringDto, saksnummer: String): Pair { + internal suspend fun oppdaterOgFerdigstillForMottak( + dto: JournalpostMottaksHaandteringDto, + saksnummer: String, + ): Pair { val journalpostDataFraSaf = safGateway.hentDataFraSaf(dto.journalpostId) return dokarkivGateway.oppdaterJournalpostDataOgFerdigstill( dataFraSaf = journalpostDataFraSaf, @@ -175,7 +178,7 @@ class JournalpostService( } private fun utledMottattDato(parsedSafJournalpost: ParsedSafJournalpost): LocalDateTime { - return if (parsedSafJournalpost.journalpostType == SafDtos.JournalpostType.I) { + return if (parsedSafJournalpost.journalpostType == SafDtos.JournalpostType.INNGAAENDE) { parsedSafJournalpost.relevanteDatoer.firstOrNull { it.datotype == SafDtos.Datotype.DATO_REGISTRERT }?.dato } else { parsedSafJournalpost.relevanteDatoer.firstOrNull { it.datotype == SafDtos.Datotype.DATO_JOURNALFOERT }?.dato @@ -294,7 +297,7 @@ private fun SafDtos.Journalpost.parseJournalpost(): ParsedSafJournalpost { } return ParsedSafJournalpost( - journalpostType = enumValueOfOrNull(journalposttype), + journalpostType = SafDtos.JournalpostType.entries.first { it.kode == journalposttype }, brukerType = enumValueOfOrNull(bruker?.type), avsenderType = enumValueOfOrNull(avsender?.type), tema = enumValueOfOrNull(tema), diff --git a/src/main/kotlin/no/nav/k9punsj/journalpost/JournalpostkopieringService.kt b/src/main/kotlin/no/nav/k9punsj/journalpost/JournalpostkopieringService.kt new file mode 100644 index 000000000..6031b08fb --- /dev/null +++ b/src/main/kotlin/no/nav/k9punsj/journalpost/JournalpostkopieringService.kt @@ -0,0 +1,155 @@ +package no.nav.k9punsj.journalpost + +import no.nav.k9.kodeverk.behandling.FagsakYtelseType +import no.nav.k9punsj.domenetjenester.PersonService +import no.nav.k9punsj.felles.Identitetsnummer.Companion.somIdentitetsnummer +import no.nav.k9punsj.felles.JournalpostId +import no.nav.k9punsj.felles.PunsjFagsakYtelseType +import no.nav.k9punsj.felles.PunsjFagsakYtelseType.Companion.somPunsjFagsakYtelseType +import no.nav.k9punsj.fordel.FordelPunsjEventDto +import no.nav.k9punsj.fordel.HendelseMottaker +import no.nav.k9punsj.fordel.K9FordelType +import no.nav.k9punsj.integrasjoner.dokarkiv.DokarkivGateway +import no.nav.k9punsj.integrasjoner.dokarkiv.SafDtos +import no.nav.k9punsj.integrasjoner.dokarkiv.SafGateway +import no.nav.k9punsj.integrasjoner.k9sak.K9SakService +import no.nav.k9punsj.integrasjoner.k9sak.dto.HentK9SaksnummerGrunnlag +import no.nav.k9punsj.journalpost.dto.KopierJournalpostDto +import no.nav.k9punsj.journalpost.dto.KopierJournalpostInfo +import no.nav.k9punsj.journalpost.dto.utledK9sakFagsakYtelseType +import no.nav.k9punsj.utils.PeriodeUtils.somPeriodeDto +import org.slf4j.LoggerFactory +import org.springframework.http.HttpStatus +import org.springframework.http.ProblemDetail +import org.springframework.stereotype.Service +import org.springframework.web.ErrorResponseException + +@Service +class JournalpostkopieringService( + private val journalpostRepository: JournalpostRepository, + private val k9SakService: K9SakService, + private val hendeMottaker: HendelseMottaker, + private val safGateway: SafGateway, + private val dokarkivGateway: DokarkivGateway, + private val personService: PersonService +) { + private companion object { + private val logger = LoggerFactory.getLogger(JournalpostkopieringService::class.java) + } + + internal suspend fun kopierJournalpost( + journalpostId: JournalpostId, + kopierJournalpostDto: KopierJournalpostDto, + ): KopierJournalpostInfo { + val (safJournalpost, k9FagsakYtelseType: FagsakYtelseType) = validerJournalpostKopiering( + journalpostId = journalpostId, + kopierJournalpostDto = kopierJournalpostDto + ) + + val k9SakGrunnlag = kopierJournalpostDto.somK9SakGrunnlag( + k9FagsakYtelseType = k9FagsakYtelseType, + periodeDto = safJournalpost.datoOpprettet.toLocalDate().somPeriodeDto() + ) + + val saksnummer = hentEllerOpprettSaksnummer( + journalpostId = journalpostId.toString(), + kopierJournalpostDto = kopierJournalpostDto, + k9SakGrunnlag = k9SakGrunnlag + ) + + val nyJournalpostId = dokarkivGateway.knyttTilAnnenSak( + journalpostId = journalpostId, + identitetsnummer = k9SakGrunnlag.søker.somIdentitetsnummer(), + saksnummer = saksnummer + ) + logger.info("Kopiert journalpost: $journalpostId til ny journalpost: $nyJournalpostId med saksnummer: $saksnummer") + + val tilPersonAktørId = personService.finnAktørId(kopierJournalpostDto.til) + hendeMottaker.prosesser( + FordelPunsjEventDto( + aktørId = tilPersonAktørId, + journalpostId = nyJournalpostId.toString(), + type = K9FordelType.KOPI.kode, + ytelse = k9FagsakYtelseType.kode, + gosysoppgaveId = null + ) + ) + + return KopierJournalpostInfo( + nyJournalpostId = nyJournalpostId.toString(), + saksnummer = saksnummer, + fra = kopierJournalpostDto.fra, + til = kopierJournalpostDto.til, + pleietrengende = kopierJournalpostDto.barn, + annenPart = kopierJournalpostDto.annenPart, + ytelse = k9FagsakYtelseType.somPunsjFagsakYtelseType() + ) + } + + private suspend fun validerJournalpostKopiering( + journalpostId: JournalpostId, + kopierJournalpostDto: KopierJournalpostDto, + ): Pair { + + val journalpost = journalpostRepository.hentHvis(journalpostId.toString()) + ?: throw KanIkkeKopieresErrorResponse("Finner ikke journalpost i DB.") + + val safJournalpost = safGateway.hentJournalpostInfo(journalpostId.toString()) + ?: throw KanIkkeKopieresErrorResponse("Finner ikke SAF journalpost.") + + if (safJournalpost.erUtgående) { + throw KanIkkeKopieresErrorResponse("Ikke støttet journalposttype: ${safJournalpost.journalposttype}") + } + + if (!safJournalpost.kanKopieres) { + throw KanIkkeKopieresErrorResponse("Kan ikke kopieres. $journalpost.") + } + + if (journalpost.type != null && journalpost.type == K9FordelType.INNTEKTSMELDING_UTGÅTT.kode) { + throw KanIkkeKopieresErrorResponse("Kan ikke kopier journalpost med type inntektsmelding utgått.") + } + + val k9FagsakYtelseType: FagsakYtelseType = + kopierJournalpostDto.ytelse?.somK9FagsakYtelseType() ?: journalpost.ytelse?.let { + val punsjFagsakYtelseType = PunsjFagsakYtelseType.fromKode(it) + journalpost.utledK9sakFagsakYtelseType(punsjFagsakYtelseType.somK9FagsakYtelseType()) + } ?: throw KanIkkeKopieresErrorResponse("Mangler ytelse for journalpost.") + + val støttedeYtelseTyperForKopiering = listOf( + FagsakYtelseType.OMSORGSPENGER_KS, + FagsakYtelseType.PLEIEPENGER_SYKT_BARN, + FagsakYtelseType.PLEIEPENGER_NÆRSTÅENDE + ) + + if (!støttedeYtelseTyperForKopiering.contains(k9FagsakYtelseType)) { + throw KanIkkeKopieresErrorResponse("Støtter ikke kopiering av ${k9FagsakYtelseType.navn} for relaterte journalposter") + } + + return Pair(safJournalpost, k9FagsakYtelseType) + } + + private suspend fun hentEllerOpprettSaksnummer( + journalpostId: String, + kopierJournalpostDto: KopierJournalpostDto, + k9SakGrunnlag: HentK9SaksnummerGrunnlag, + ): String { + + // Sjekker om journalposten kopieres til samme person og logger hvis så er tilfelle + if (kopierJournalpostDto.fra == kopierJournalpostDto.til) { + val saksnummer = k9SakService.hentEllerOpprettSaksnummer(k9SakGrunnlag) + logger.info("Kopierer journalpost: $journalpostId til samme person med saksnummer: $saksnummer") + return saksnummer // Bruker eksisterende saksnummer for samme person + } + + // Hvis journalposten kopieres til en annen person, Hent eller opprett nytt saksnummer + val saksnummer = k9SakService.hentEllerOpprettSaksnummer( + k9SakGrunnlag.copy(søker = kopierJournalpostDto.til) + ) + logger.info("Kopierer journalpost: $journalpostId til ny person med saksnummer: $saksnummer") + return saksnummer + } + + class KanIkkeKopieresErrorResponse(feil: String) : + ErrorResponseException(HttpStatus.CONFLICT, ProblemDetail.forStatusAndDetail(HttpStatus.CONFLICT, feil), null) + +} diff --git a/src/main/kotlin/no/nav/k9punsj/journalpost/dto/KopierJournalpostDto.kt b/src/main/kotlin/no/nav/k9punsj/journalpost/dto/KopierJournalpostDto.kt index 850f45529..8a14cad5a 100644 --- a/src/main/kotlin/no/nav/k9punsj/journalpost/dto/KopierJournalpostDto.kt +++ b/src/main/kotlin/no/nav/k9punsj/journalpost/dto/KopierJournalpostDto.kt @@ -1,6 +1,11 @@ package no.nav.k9punsj.journalpost.dto +import no.nav.k9.kodeverk.behandling.FagsakYtelseType +import no.nav.k9punsj.felles.Identitetsnummer.Companion.somIdentitetsnummer import no.nav.k9punsj.felles.PunsjFagsakYtelseType +import no.nav.k9punsj.felles.PunsjFagsakYtelseType.Companion.somPunsjFagsakYtelseType +import no.nav.k9punsj.felles.dto.PeriodeDto +import no.nav.k9punsj.integrasjoner.k9sak.dto.HentK9SaksnummerGrunnlag data class KopierJournalpostDto( val fra: String, @@ -14,4 +19,12 @@ data class KopierJournalpostDto( "Må sette minst en av barn og annenPart" } } + + fun somK9SakGrunnlag(k9FagsakYtelseType: FagsakYtelseType, periodeDto: PeriodeDto?): HentK9SaksnummerGrunnlag = HentK9SaksnummerGrunnlag( + søknadstype = ytelse ?: k9FagsakYtelseType.somPunsjFagsakYtelseType(), + søker = fra.somIdentitetsnummer().toString(), + pleietrengende = barn?.somIdentitetsnummer().toString(), + annenPart = annenPart?.somIdentitetsnummer().toString(), + periode = periodeDto + ) } diff --git a/src/main/kotlin/no/nav/k9punsj/journalpost/dto/KopierJournalpostInfo.kt b/src/main/kotlin/no/nav/k9punsj/journalpost/dto/KopierJournalpostInfo.kt index 8e0ded904..0c7b4e667 100644 --- a/src/main/kotlin/no/nav/k9punsj/journalpost/dto/KopierJournalpostInfo.kt +++ b/src/main/kotlin/no/nav/k9punsj/journalpost/dto/KopierJournalpostInfo.kt @@ -1,12 +1,13 @@ package no.nav.k9punsj.journalpost.dto -import no.nav.k9.kodeverk.behandling.FagsakYtelseType +import no.nav.k9punsj.felles.PunsjFagsakYtelseType data class KopierJournalpostInfo( - internal val journalpostId: String, - internal val fra: String, - internal val til: String, - internal val pleietrengende: String? = null, - internal val annenPart: String? = null, - internal val ytelse: FagsakYtelseType + val nyJournalpostId: String, + val saksnummer: String, + val fra: String, + val til: String, + val pleietrengende: String? = null, + val annenPart: String? = null, + val ytelse: PunsjFagsakYtelseType ) diff --git a/src/main/kotlin/no/nav/k9punsj/kafka/KafkaConsumers.kt b/src/main/kotlin/no/nav/k9punsj/kafka/KafkaConsumers.kt index 5946f55c4..c9cf5c5d7 100644 --- a/src/main/kotlin/no/nav/k9punsj/kafka/KafkaConsumers.kt +++ b/src/main/kotlin/no/nav/k9punsj/kafka/KafkaConsumers.kt @@ -13,20 +13,9 @@ import java.io.IOException @StandardProfil class KafkaConsumers( val hendelseMottaker: HendelseMottaker, - @Value("\${no.nav.kafka.k9_punsjbolle.topic}") private val meldingerFraPunsjbolleTopic: String, @Value("\${no.nav.kafka.k9_fordel.topic}") private val meldingerFraFordelTopic: String, ) { - @KafkaListener( - topics = [PUNSJBOLLE_TOPIC], - groupId = "k9-punsj-1", - properties = ["auto.offset.reset:earliest"] - ) - @Throws(IOException::class) - fun consumePunsjbarJournalpost(message: String) { - runBlocking { hendelseMottaker.prosesser(message.somFordelPunsjEventDto(meldingerFraPunsjbolleTopic)) } - } - @KafkaListener( topics = [FORDEL_TOPIC], groupId = "k9-punsj-1", @@ -38,7 +27,6 @@ class KafkaConsumers( } private companion object { - private const val PUNSJBOLLE_TOPIC = "k9saksbehandling.punsjbar-journalpost" private const val FORDEL_TOPIC = "k9saksbehandling.fordel-journalforing" } } diff --git a/src/main/kotlin/no/nav/k9punsj/utils/PeriodeUtils.kt b/src/main/kotlin/no/nav/k9punsj/utils/PeriodeUtils.kt index a0ecbaac2..e4b73cde0 100644 --- a/src/main/kotlin/no/nav/k9punsj/utils/PeriodeUtils.kt +++ b/src/main/kotlin/no/nav/k9punsj/utils/PeriodeUtils.kt @@ -3,6 +3,8 @@ package no.nav.k9punsj.utils import no.nav.fpsak.tidsserie.LocalDateInterval import no.nav.k9.søknad.felles.type.Periode import no.nav.k9punsj.felles.dto.PeriodeDto +import java.time.LocalDate +import kotlin.concurrent.thread object PeriodeUtils { fun PeriodeDto?.erSatt() = this != null && (fom != null || tom != null) @@ -18,4 +20,6 @@ object PeriodeUtils { fun LocalDateInterval.somK9Periode(): Periode { return Periode(this.fomDato, this.tomDato) } + + fun LocalDate.somPeriodeDto() = PeriodeDto(fom = this, tom = this) } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 7822ccdb5..d8987018a 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -56,9 +56,6 @@ no.nav: base_url: ${K9SAK_BASE_URL} scope: ${K9SAK_SCOPE} - k9punsjbolle: - base_url: ${K9PUNSJBOLLE_BASE_URL} - scope: ${K9PUNSJBOLLE_SCOPE} gosys: base_url: ${GOSYS_BASE_URL} @@ -99,12 +96,8 @@ no.nav: topic: ${SEND_AKSJONSPUNKTHENDELSE_TIL_K9LOS} k9_punsj_til_los: topic: ${SEND_OPPDATERING_TIL_K9LOS} - k9_rapid: - topic: ${K9_RAPID_TOPIC} k9_fordel: topic: ${K9_FORDEL_TOPIC} - k9_punsjbolle: - topic: ${K9_PUNSJBOLLE_TOPIC} override_truststore_password: ${KAFKA_OVERRIDE_TRUSTSTORE_PASSWORD} server: diff --git a/src/test/kotlin/no/nav/k9punsj/MockConfiguration.kt b/src/test/kotlin/no/nav/k9punsj/MockConfiguration.kt index b28ec53e5..f36c1508f 100644 --- a/src/test/kotlin/no/nav/k9punsj/MockConfiguration.kt +++ b/src/test/kotlin/no/nav/k9punsj/MockConfiguration.kt @@ -67,7 +67,6 @@ internal object MockConfiguration { "SEND_AKSJONSPUNKTHENDELSE_TIL_K9LOS" to "privat-k9punsj-aksjonspunkthendelse-v1", "SEND_OPPDATERING_TIL_K9LOS" to "k9saksbehandling.k9-punsj-til-los", "K9_FORDEL_TOPIC" to "k9saksbehandling.fordel-journalforing", - "K9_PUNSJBOLLE_TOPIC" to "k9saksbehandling.punsjbar-journalpost" ) } } diff --git a/src/test/kotlin/no/nav/k9punsj/akjonspunkter/AksjonspunktServiceImplTest.kt b/src/test/kotlin/no/nav/k9punsj/akjonspunkter/AksjonspunktServiceImplTest.kt index 970fe9804..bf8dce971 100644 --- a/src/test/kotlin/no/nav/k9punsj/akjonspunkter/AksjonspunktServiceImplTest.kt +++ b/src/test/kotlin/no/nav/k9punsj/akjonspunkter/AksjonspunktServiceImplTest.kt @@ -12,7 +12,6 @@ import no.nav.k9punsj.felles.PunsjFagsakYtelseType import no.nav.k9punsj.felles.dto.SøknadEntitet import no.nav.k9punsj.fordel.FordelPunsjEventDto import no.nav.k9punsj.integrasjoner.k9losapi.PunsjEventDto -import no.nav.k9punsj.innsending.InnsendingClient import no.nav.k9punsj.integrasjoner.dokarkiv.DokarkivGateway import no.nav.k9punsj.integrasjoner.dokarkiv.SafGateway import no.nav.k9punsj.integrasjoner.k9sak.K9SakService @@ -40,9 +39,6 @@ internal class AksjonspunktServiceImplTest: AbstractContainerBaseTest() { @MockBean private lateinit var dokarkivGateway: DokarkivGateway - @MockBean - private lateinit var innsendingClient: InnsendingClient - @MockBean private lateinit var søknadMetrikkService: SøknadMetrikkService diff --git a/src/test/kotlin/no/nav/k9punsj/domenetjenester/SoknadServiceTest.kt b/src/test/kotlin/no/nav/k9punsj/domenetjenester/SoknadServiceTest.kt index 6b1952a14..1e057df63 100644 --- a/src/test/kotlin/no/nav/k9punsj/domenetjenester/SoknadServiceTest.kt +++ b/src/test/kotlin/no/nav/k9punsj/domenetjenester/SoknadServiceTest.kt @@ -14,7 +14,6 @@ import no.nav.k9.søknad.ytelse.psb.v1.PleiepengerSyktBarn import no.nav.k9punsj.domenetjenester.repository.SøknadRepository 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.integrasjoner.dokarkiv.DokarkivGateway import no.nav.k9punsj.integrasjoner.dokarkiv.FerdigstillJournalpost import no.nav.k9punsj.integrasjoner.dokarkiv.JoarkTyper.JournalpostStatus.Companion.somJournalpostStatus @@ -45,9 +44,6 @@ internal class SoknadServiceTest { @MockK(relaxUnitFun = true) private lateinit var mockSøknadRepository: SøknadRepository - @MockK(relaxUnitFun = true) - private lateinit var mockInnsendingClient: InnsendingClient - @MockK(relaxUnitFun = true) private lateinit var mockSøknadMetrikkService: SøknadMetrikkService @@ -96,7 +92,7 @@ internal class SoknadServiceTest { journalpostId = "525115311", tittel = "omsorgspengerutbetaling", tema = "OMS", - journalposttype = "N", + journalposttype = SafDtos.JournalpostType.NOTAT.kode, journalstatus = "FEILREGISTRERT", bruker = SafDtos.Bruker( id = "2351670926708", @@ -121,6 +117,7 @@ internal class SoknadServiceTest { ) ) ), + datoOpprettet = LocalDateTime.parse("2022-07-01T13:32:05"), relevanteDatoer = listOf( SafDtos.RelevantDato( dato = LocalDateTime.parse("2022-07-01T13:32:05"), diff --git a/src/test/kotlin/no/nav/k9punsj/fordel/FordelKafkaTest.kt b/src/test/kotlin/no/nav/k9punsj/fordel/FordelKafkaTest.kt index 6d7f18650..8d7793ad0 100644 --- a/src/test/kotlin/no/nav/k9punsj/fordel/FordelKafkaTest.kt +++ b/src/test/kotlin/no/nav/k9punsj/fordel/FordelKafkaTest.kt @@ -7,7 +7,6 @@ import no.nav.k9punsj.akjonspunkter.AksjonspunktKode import no.nav.k9punsj.akjonspunkter.AksjonspunktServiceImpl import no.nav.k9punsj.akjonspunkter.AksjonspunktStatus import no.nav.k9punsj.domenetjenester.SoknadService -import no.nav.k9punsj.innsending.InnsendingClient import no.nav.k9punsj.integrasjoner.dokarkiv.DokarkivGateway import no.nav.k9punsj.integrasjoner.dokarkiv.SafGateway import no.nav.k9punsj.integrasjoner.k9losapi.PunsjEventDto @@ -34,9 +33,6 @@ internal class FordelKafkaTest: AbstractContainerBaseTest() { @MockBean private lateinit var dokarkivGateway: DokarkivGateway - @MockBean - private lateinit var innsendingClient: InnsendingClient - @MockBean private lateinit var soknadService: SoknadService diff --git a/src/test/kotlin/no/nav/k9punsj/fordel/HendelseMottakerTest.kt b/src/test/kotlin/no/nav/k9punsj/fordel/HendelseMottakerTest.kt index d93714f44..ee756dec8 100644 --- a/src/test/kotlin/no/nav/k9punsj/fordel/HendelseMottakerTest.kt +++ b/src/test/kotlin/no/nav/k9punsj/fordel/HendelseMottakerTest.kt @@ -7,7 +7,6 @@ import no.nav.k9punsj.akjonspunkter.AksjonspunktRepository import no.nav.k9punsj.akjonspunkter.AksjonspunktService import no.nav.k9punsj.akjonspunkter.AksjonspunktStatus import no.nav.k9punsj.domenetjenester.SoknadService -import no.nav.k9punsj.innsending.InnsendingClient import no.nav.k9punsj.integrasjoner.dokarkiv.DokarkivGateway import no.nav.k9punsj.integrasjoner.dokarkiv.SafGateway import no.nav.k9punsj.journalpost.JournalpostService @@ -31,9 +30,6 @@ internal class HendelseMottakerTest: AbstractContainerBaseTest() { @MockBean private lateinit var dokarkivGateway: DokarkivGateway - @MockBean - private lateinit var innsendingClient: InnsendingClient - @MockBean private lateinit var soknadService: SoknadService diff --git a/src/test/kotlin/no/nav/k9punsj/innsending/KopieringJournalpostInnsendingMappingTest.kt b/src/test/kotlin/no/nav/k9punsj/innsending/KopieringJournalpostInnsendingMappingTest.kt deleted file mode 100644 index 1ecd355b1..000000000 --- a/src/test/kotlin/no/nav/k9punsj/innsending/KopieringJournalpostInnsendingMappingTest.kt +++ /dev/null @@ -1,57 +0,0 @@ -package no.nav.k9punsj.innsending - -import no.nav.k9.kodeverk.behandling.FagsakYtelseType -import no.nav.k9punsj.journalpost.dto.KopierJournalpostInfo -import org.intellij.lang.annotations.Language -import org.json.JSONObject -import org.junit.jupiter.api.Test -import org.skyscreamer.jsonassert.JSONAssert - -internal class KopieringJournalpostInnsendingMappingTest { - private val innsendingClient = LoggingInnsendingClient() - - @Test - fun `mappe kopiering av journalpost for pleiepenger syk barn`() { - mapKopierJournalpostOgAssert( - fagsakYtelseType = FagsakYtelseType.PLEIEPENGER_SYKT_BARN, - søknadstype = "PleiepengerSyktBarn" - ) - } - - @Test - fun `mappe kopiering av journalpost for omsorgspengr kronisk sykt barn`() { - mapKopierJournalpostOgAssert( - fagsakYtelseType = FagsakYtelseType.OMSORGSPENGER_KS, - søknadstype = "OmsorgspengerKroniskSyktBarn" - ) - } - - private fun mapKopierJournalpostOgAssert(fagsakYtelseType: FagsakYtelseType, søknadstype: String) { - val (_, value) = innsendingClient.mapKopierJournalpost( - KopierJournalpostInfo( - journalpostId = "11111111111", - fra = "22222222222", - til = "33333333333", - pleietrengende = "44444444444", - ytelse = fagsakYtelseType - ) - ) - - val behov = JSONObject(value).getJSONObject("@behov").getJSONObject("KopierPunsjbarJournalpost").toString() - - @Language("JSON") - val expected = """ - { - "versjon": "1.0.0", - "journalpostId": "11111111111", - "fra": "22222222222", - "til": "33333333333", - "pleietrengende": "44444444444", - "annenPart": null, - "søknadstype": "$søknadstype" - } - """.trimIndent() - - JSONAssert.assertEquals(expected, behov, true) - } -} diff --git a/src/test/kotlin/no/nav/k9punsj/innsending/LoggingInnsendingClient.kt b/src/test/kotlin/no/nav/k9punsj/innsending/LoggingInnsendingClient.kt deleted file mode 100644 index 88387d200..000000000 --- a/src/test/kotlin/no/nav/k9punsj/innsending/LoggingInnsendingClient.kt +++ /dev/null @@ -1,16 +0,0 @@ -package no.nav.k9punsj.innsending - -import org.slf4j.LoggerFactory -import org.springframework.stereotype.Component - -@Component -class LoggingInnsendingClient : InnsendingClient { - override suspend fun send(pair: Pair) { - val (key, value) = pair - logger.info("Innsending. Key=[$key], Value=[$value]") - } - - private companion object { - private val logger = LoggerFactory.getLogger(LoggingInnsendingClient::class.java) - } -} diff --git a/src/test/kotlin/no/nav/k9punsj/journalpost/JournalpostServiceTest.kt b/src/test/kotlin/no/nav/k9punsj/journalpost/JournalpostServiceTest.kt index e35e2efe4..5d786fc30 100644 --- a/src/test/kotlin/no/nav/k9punsj/journalpost/JournalpostServiceTest.kt +++ b/src/test/kotlin/no/nav/k9punsj/journalpost/JournalpostServiceTest.kt @@ -10,6 +10,7 @@ import no.nav.k9punsj.felles.Identitetsnummer.Companion.somIdentitetsnummer import no.nav.k9punsj.felles.Sak import no.nav.k9punsj.integrasjoner.dokarkiv.DokarkivGateway import no.nav.k9punsj.integrasjoner.dokarkiv.SafGateway +import no.nav.k9punsj.integrasjoner.k9sak.K9SakService import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test import org.junit.jupiter.api.assertThrows @@ -28,6 +29,9 @@ internal class JournalpostServiceTest: AbstractContainerBaseTest() { @MockK private lateinit var objectMapper: ObjectMapper + @MockK + private lateinit var k9SakService: K9SakService + @InjectMockKs private lateinit var journalpostService: JournalpostService diff --git a/src/test/kotlin/no/nav/k9punsj/journalpost/KopierJournalpostRouteTest.kt b/src/test/kotlin/no/nav/k9punsj/journalpost/KopierJournalpostRouteTest.kt index 6c631376a..14276cdaa 100644 --- a/src/test/kotlin/no/nav/k9punsj/journalpost/KopierJournalpostRouteTest.kt +++ b/src/test/kotlin/no/nav/k9punsj/journalpost/KopierJournalpostRouteTest.kt @@ -3,33 +3,37 @@ package no.nav.k9punsj.journalpost import io.micrometer.core.instrument.simple.SimpleMeterRegistry import kotlinx.coroutines.runBlocking import no.nav.helse.dusseldorf.testsupport.jws.Azure -import no.nav.k9.kodeverk.behandling.FagsakYtelseType import no.nav.k9punsj.AbstractContainerBaseTest import no.nav.k9punsj.akjonspunkter.AksjonspunktService import no.nav.k9punsj.domenetjenester.SoknadService +import no.nav.k9punsj.felles.Identitetsnummer.Companion.somIdentitetsnummer +import no.nav.k9punsj.felles.JournalpostId.Companion.somJournalpostId import no.nav.k9punsj.felles.PunsjFagsakYtelseType import no.nav.k9punsj.fordel.FordelPunsjEventDto import no.nav.k9punsj.fordel.HendelseMottaker import no.nav.k9punsj.fordel.K9FordelType -import no.nav.k9punsj.innsending.InnsendingClient import no.nav.k9punsj.integrasjoner.dokarkiv.DokarkivGateway +import no.nav.k9punsj.integrasjoner.dokarkiv.SafDtos import no.nav.k9punsj.integrasjoner.dokarkiv.SafGateway import no.nav.k9punsj.journalpost.dto.BehandlingsAarDto import no.nav.k9punsj.journalpost.dto.KopierJournalpostDto import no.nav.k9punsj.util.IdGenerator import no.nav.k9punsj.wiremock.saksbehandlerAccessToken +import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.AfterEach import org.junit.jupiter.api.Assertions import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test import org.junit.jupiter.params.ParameterizedTest import org.junit.jupiter.params.provider.ValueSource +import org.mockito.Mockito import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.actuate.metrics.MetricsEndpoint import org.springframework.boot.test.mock.mockito.MockBean import org.springframework.http.HttpHeaders import org.springframework.web.reactive.function.BodyInserters import java.time.LocalDate +import java.time.LocalDateTime internal class KopierJournalpostRouteTest : AbstractContainerBaseTest() { @@ -39,9 +43,6 @@ internal class KopierJournalpostRouteTest : AbstractContainerBaseTest() { @MockBean private lateinit var dokarkivGateway: DokarkivGateway - @MockBean - private lateinit var innsendingClient: InnsendingClient - @MockBean private lateinit var soknadService: SoknadService @@ -80,10 +81,47 @@ internal class KopierJournalpostRouteTest : AbstractContainerBaseTest() { @Test fun `Mapper kopierjournalpostinfo med barn og sender inn`(): Unit = runBlocking { - val journalpostId = IdGenerator.nesteId() + val saksnummer = "ABC123" + val søkerAktørId = "27519339353" + val barn = "05032435485" + + Mockito.`when`(safGateway.hentJournalpostInfo(journalpostId)).thenReturn( + SafDtos.Journalpost( + journalpostId = journalpostId, + tema = null, + journalstatus = SafDtos.Journalstatus.JOURNALFOERT.name, + journalposttype = SafDtos.JournalpostType.NOTAT.kode, + dokumenter = emptyList(), + relevanteDatoer = emptyList(), + avsender = null, + avsenderMottaker = null, + bruker = SafDtos.Bruker( + id = søkerAktørId, + type = "AKTOER_ID" + ), + sak = SafDtos.Sak( + sakstype = SafDtos.Sakstype.FAGSAK, + fagsakId = saksnummer, + fagsaksystem = "K9", + tema = SafDtos.Tema.OMS.name + ), + datoOpprettet = LocalDateTime.now(), + tittel = null + ) + ) + + val nyJournalpostId = IdGenerator.nesteId() + Mockito.`when`( + dokarkivGateway.knyttTilAnnenSak( + journalpostId = journalpostId.somJournalpostId(), + identitetsnummer = søkerAktørId.somIdentitetsnummer(), + saksnummer = saksnummer + ) + ).thenReturn(nyJournalpostId.somJournalpostId()) + val melding = FordelPunsjEventDto( - aktørId = "1234567890", + aktørId = søkerAktørId, journalpostId = journalpostId, type = K9FordelType.PAPIRSØKNAD.kode, ytelse = "PSB" @@ -95,7 +133,7 @@ internal class KopierJournalpostRouteTest : AbstractContainerBaseTest() { val kopierJournalpostDto = KopierJournalpostDto( fra = journalpost.aktørId.toString(), til = journalpost.aktørId.toString(), - barn = "05032435485", + barn = barn, annenPart = null, ytelse = null ) @@ -106,15 +144,67 @@ internal class KopierJournalpostRouteTest : AbstractContainerBaseTest() { .body(BodyInserters.fromValue(kopierJournalpostDto)) .header(HttpHeaders.AUTHORIZATION, saksbehandlerAuthorizationHeader) .exchange() - .expectStatus().isAccepted + .expectStatus().isCreated + .expectBody() + .json(""" + { + "nyJournalpostId":"$nyJournalpostId", + "saksnummer":"$saksnummer", + "fra":"$søkerAktørId", + "til":"$søkerAktørId", + "pleietrengende":"$barn", + "annenPart":null, + "ytelse":"PSB" + }""".trimIndent()) + + val journalpostKopi = journalpostRepository.hentHvis(nyJournalpostId) + Assertions.assertNotNull(journalpostKopi) + assertThat(journalpostKopi!!.type).isNotNull().isEqualTo(K9FordelType.KOPI.kode) } @Test fun `Støtter å overstyre ytelse på journalpost ved kopiering`(): Unit = runBlocking { - val journalpostId = IdGenerator.nesteId() + val saksnummer = "ABC123" + val søkerAktørId = "27519339353" + val barn = "05032435485" + + Mockito.`when`(safGateway.hentJournalpostInfo(journalpostId)).thenReturn( + SafDtos.Journalpost( + journalpostId = journalpostId, + tema = null, + journalstatus = SafDtos.Journalstatus.JOURNALFOERT.name, + journalposttype = SafDtos.JournalpostType.NOTAT.kode, + dokumenter = emptyList(), + relevanteDatoer = emptyList(), + avsender = null, + avsenderMottaker = null, + bruker = SafDtos.Bruker( + id = søkerAktørId, + type = "AKTOER_ID" + ), + sak = SafDtos.Sak( + sakstype = SafDtos.Sakstype.FAGSAK, + fagsakId = saksnummer, + fagsaksystem = "K9", + tema = SafDtos.Tema.OMS.name + ), + datoOpprettet = LocalDateTime.now(), + tittel = null + ) + ) + + val nyJournalpostId = IdGenerator.nesteId() + Mockito.`when`( + dokarkivGateway.knyttTilAnnenSak( + journalpostId = journalpostId.somJournalpostId(), + identitetsnummer = søkerAktørId.somIdentitetsnummer(), + saksnummer = saksnummer + ) + ).thenReturn(nyJournalpostId.somJournalpostId()) + val melding = FordelPunsjEventDto( - aktørId = "1234567890", + aktørId = søkerAktørId, journalpostId = journalpostId, type = K9FordelType.PAPIRSØKNAD.kode, ytelse = PunsjFagsakYtelseType.UKJENT.kode @@ -126,7 +216,7 @@ internal class KopierJournalpostRouteTest : AbstractContainerBaseTest() { val kopierJournalpostDto = KopierJournalpostDto( fra = journalpost.aktørId.toString(), til = journalpost.aktørId.toString(), - barn = "05032435485", + barn = barn, annenPart = null, ytelse = PunsjFagsakYtelseType.PLEIEPENGER_SYKT_BARN ) @@ -137,7 +227,22 @@ internal class KopierJournalpostRouteTest : AbstractContainerBaseTest() { .body(BodyInserters.fromValue(kopierJournalpostDto)) .header(HttpHeaders.AUTHORIZATION, saksbehandlerAuthorizationHeader) .exchange() - .expectStatus().isAccepted + .expectStatus().isCreated + .expectBody() + .json(""" + { + "nyJournalpostId":"$nyJournalpostId", + "saksnummer":"$saksnummer", + "fra":"$søkerAktørId", + "til":"$søkerAktørId", + "pleietrengende":"$barn", + "annenPart":null, + "ytelse":"PSB" + }""".trimIndent()) + + val journalpostKopi = journalpostRepository.hentHvis(nyJournalpostId) + Assertions.assertNotNull(journalpostKopi) + assertThat(journalpostKopi!!.type).isNotNull().isEqualTo(K9FordelType.KOPI.kode) } @ParameterizedTest diff --git a/src/test/kotlin/no/nav/k9punsj/journalpost/SafDtosTest.kt b/src/test/kotlin/no/nav/k9punsj/journalpost/SafDtosTest.kt index 4504c559c..050bb2404 100644 --- a/src/test/kotlin/no/nav/k9punsj/journalpost/SafDtosTest.kt +++ b/src/test/kotlin/no/nav/k9punsj/journalpost/SafDtosTest.kt @@ -3,6 +3,7 @@ package no.nav.k9punsj.journalpost import no.nav.k9punsj.integrasjoner.dokarkiv.SafDtos import org.assertj.core.api.Assertions import org.junit.jupiter.api.Test +import java.time.LocalDateTime internal class SafDtosTest { @@ -12,8 +13,9 @@ internal class SafDtosTest { journalpostId = "123456789", tema = "test", tittel = "omsorgspengerutbetaling", - journalposttype = "test", + journalposttype = SafDtos.JournalpostType.UTGAAENDE.kode, journalstatus = "test", + datoOpprettet = LocalDateTime.now(), bruker = null, sak = null, avsender = null, @@ -32,8 +34,9 @@ internal class SafDtosTest { journalpostId = "123456789", tema = "AAP", tittel = "Arbeidsavklaringspenger", - journalposttype = SafDtos.JournalpostType.I.name, + journalposttype = SafDtos.JournalpostType.INNGAAENDE.kode, journalstatus = SafDtos.Journalstatus.MOTTATT.name, + datoOpprettet = LocalDateTime.now(), bruker = null, sak = null, avsender = null, @@ -52,8 +55,9 @@ internal class SafDtosTest { journalpostId = "123456789", tema = "test", tittel = "omsorgspengerutbetaling", - journalposttype = "test", + journalposttype = SafDtos.JournalpostType.INNGAAENDE.kode, journalstatus = "test", + datoOpprettet = LocalDateTime.now(), bruker = null, sak = null, avsender = null, @@ -72,8 +76,9 @@ internal class SafDtosTest { journalpostId = "123456789", tema = "test", tittel = "omsorgspengerutbetaling", - journalposttype = "test", + journalposttype = SafDtos.JournalpostType.NOTAT.kode, journalstatus = "test", + datoOpprettet = LocalDateTime.now(), bruker = null, sak = null, avsender = null, diff --git a/src/test/kotlin/no/nav/k9punsj/journalpost/postmottak/PostMottakServiceTest.kt b/src/test/kotlin/no/nav/k9punsj/journalpost/postmottak/PostMottakServiceTest.kt index 83a94b911..bb3b073f0 100644 --- a/src/test/kotlin/no/nav/k9punsj/journalpost/postmottak/PostMottakServiceTest.kt +++ b/src/test/kotlin/no/nav/k9punsj/journalpost/postmottak/PostMottakServiceTest.kt @@ -27,6 +27,7 @@ import org.springframework.beans.factory.annotation.Value import org.springframework.http.HttpStatus import org.springframework.kafka.test.utils.KafkaTestUtils import java.time.Duration +import java.time.LocalDateTime import java.util.* class PostMottakServiceTest : AbstractContainerBaseTest() { @@ -145,7 +146,7 @@ class PostMottakServiceTest : AbstractContainerBaseTest() { journalpostId = journalpostId, tema = "OMS", tittel = "Søknad om pleipenger til sykt barn", - journalposttype = SafDtos.JournalpostType.I.name, + journalposttype = SafDtos.JournalpostType.INNGAAENDE.kode, journalstatus = SafDtos.Journalstatus.MOTTATT.name, bruker = SafDtos.Bruker( id = brukerIdent, @@ -157,6 +158,7 @@ class PostMottakServiceTest : AbstractContainerBaseTest() { fagsaksystem = "K9", tema = SafDtos.Tema.OMS.name ), + datoOpprettet = LocalDateTime.now(), avsender = null, avsenderMottaker = null, dokumenter = listOf(), diff --git a/src/test/kotlin/no/nav/k9punsj/rest/eksternt/k9sak/LokalK9SakService.kt b/src/test/kotlin/no/nav/k9punsj/rest/eksternt/k9sak/LokalK9SakService.kt index d627f8985..b3f8bac32 100644 --- a/src/test/kotlin/no/nav/k9punsj/rest/eksternt/k9sak/LokalK9SakService.kt +++ b/src/test/kotlin/no/nav/k9punsj/rest/eksternt/k9sak/LokalK9SakService.kt @@ -14,6 +14,7 @@ import no.nav.k9punsj.felles.dto.SøknadEntitet import no.nav.k9punsj.integrasjoner.k9sak.K9SakService import no.nav.k9punsj.integrasjoner.k9sak.dto.Fagsak import no.nav.k9punsj.integrasjoner.k9sak.dto.ReserverSaksnummerDto +import no.nav.k9punsj.integrasjoner.k9sak.dto.HentK9SaksnummerGrunnlag import no.nav.k9punsj.integrasjoner.k9sak.dto.ReservertSaksnummerDto import no.nav.k9punsj.util.MockUtil.erFødtI import org.springframework.stereotype.Component @@ -97,6 +98,10 @@ class LokalK9SakService : K9SakService { return Pair("ABC123", null) } + override suspend fun hentEllerOpprettSaksnummer(hentK9SaksnummerGrunnlag: HentK9SaksnummerGrunnlag): String { + return "ABC123" + } + override suspend fun sendInnSoeknad( soknad: Søknad, journalpostId: String, diff --git a/src/test/kotlin/no/nav/k9punsj/rest/eksternt/k9sak/TestK9SakService.kt b/src/test/kotlin/no/nav/k9punsj/rest/eksternt/k9sak/TestK9SakService.kt index 0b3faa223..03cdb6664 100644 --- a/src/test/kotlin/no/nav/k9punsj/rest/eksternt/k9sak/TestK9SakService.kt +++ b/src/test/kotlin/no/nav/k9punsj/rest/eksternt/k9sak/TestK9SakService.kt @@ -12,8 +12,9 @@ import no.nav.k9punsj.felles.dto.SaksnummerDto import no.nav.k9punsj.felles.dto.SøknadEntitet import no.nav.k9punsj.integrasjoner.k9sak.K9SakService import no.nav.k9punsj.integrasjoner.k9sak.dto.Fagsak -import no.nav.k9punsj.integrasjoner.k9sak.dto.ReserverSaksnummerDto +import no.nav.k9punsj.integrasjoner.k9sak.dto.HentK9SaksnummerGrunnlag import no.nav.k9punsj.integrasjoner.k9sak.dto.ReservertSaksnummerDto +import no.nav.k9punsj.integrasjoner.k9sak.dto.ReserverSaksnummerDto import org.springframework.context.annotation.Profile import org.springframework.stereotype.Component import java.time.LocalDate @@ -103,6 +104,10 @@ internal class TestK9SakService : K9SakService { return Pair("ABC123", null) } + override suspend fun hentEllerOpprettSaksnummer(hentK9SaksnummerGrunnlag: HentK9SaksnummerGrunnlag): String { + return "ABC123" + } + override suspend fun sendInnSoeknad( soknad: Søknad, journalpostId: String, diff --git a/src/test/kotlin/no/nav/k9punsj/wiremock/SafMocks.kt b/src/test/kotlin/no/nav/k9punsj/wiremock/SafMocks.kt index e1a0c679a..193eeaaf0 100644 --- a/src/test/kotlin/no/nav/k9punsj/wiremock/SafMocks.kt +++ b/src/test/kotlin/no/nav/k9punsj/wiremock/SafMocks.kt @@ -253,6 +253,7 @@ object SafMockResponses { "tema": "$tema", "journalposttype": "I", "journalstatus": "MOTTATT", + "datoOpprettet": "2020-10-12T12:53:21", "relevanteDatoer" : [ { "dato" : "2020-10-12T12:53:21.046Z", @@ -337,6 +338,7 @@ object SafMockResponses { "tema": "OMS", "journalposttype": "I", "journalstatus": "MOTTATT", + "datoOpprettet": "2020-10-12T12:53:21", "relevanteDatoer" : [ { "dato" : "2020-10-12T12:53:21.046Z", @@ -418,6 +420,7 @@ object SafMockResponses { "fagsaksystem": "K9", "tema": "OMS" }, + "datoOpprettet": "2020-10-12T12:53:21", "relevanteDatoer" : [ { "dato" : "2022-10-12T12:53:21.046Z",