Skip to content

Commit

Permalink
Korrigering av k9 saksnummer håndtering (#1007)
Browse files Browse the repository at this point in the history
* Oppretter ikke nytt saksnr når man starter ny søknad,
saksnummer fra k9 hentes fra SAF når vi sender in søknad.
Finner vi ikke saksnummer så kaller vi /fordel/fagsak/opprett med data fra punsj søknaden

* Fiks uhåndtert feil SAFGateway, fix k9sakimpl
  • Loading branch information
albrektsson authored Oct 2, 2023
1 parent 4bd93fe commit 2a22fc4
Show file tree
Hide file tree
Showing 21 changed files with 215 additions and 212 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -442,6 +442,7 @@ internal class MappeService(
return Mappe(mappeId, søker, bunkerMedSøknader)
}

@Deprecated("Bruk soknadService")
suspend fun hentSøknad(søknad: String): SøknadEntitet? {
return soknadService.hentSøknad(søknad)
}
Expand Down
25 changes: 13 additions & 12 deletions src/main/kotlin/no/nav/k9punsj/domenetjenester/SoknadService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@ 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.k9punsj.domenetjenester.repository.BunkeRepository
import no.nav.k9punsj.domenetjenester.repository.SøknadRepository
import no.nav.k9punsj.felles.FagsakYtelseType
import no.nav.k9punsj.felles.Identitetsnummer.Companion.somIdentitetsnummer
import no.nav.k9punsj.felles.JournalpostId.Companion.somJournalpostId
import no.nav.k9punsj.felles.Søknadstype
Expand Down Expand Up @@ -39,15 +41,16 @@ import java.util.UUID
import kotlin.coroutines.coroutineContext

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

internal suspend fun sendSøknad(
Expand All @@ -59,7 +62,7 @@ internal class SoknadService(

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

val søkerFnr = søknad.søker.personIdent.verdi
val k9YtelseType = Søknadstype.fraBrevkode(brevkode).k9YtelseType
Expand Down Expand Up @@ -106,15 +109,7 @@ internal class SoknadService(
}
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)
val k9Respons = k9SakService.hentEllerOpprettSaksnummer(søknad.søknadId.toString())
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
Expand Down Expand Up @@ -240,6 +235,12 @@ internal class SoknadService(
return søknadRepository.hentSøknad(søknadId)?.endret_av!!.replace("\"", "")
}

suspend fun henteYtelsetypeForSøknad(søknadId: String): FagsakYtelseType? {
return hentSøknad(søknadId)?.bunkeId?.let { bunkeId ->
bunkeRepository.hentYtelseTypeForBunke(bunkeId)
}
}

private suspend fun leggerVedPayload(
knad: Søknad,
journalpostIder: MutableSet<String>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,4 +72,23 @@ class BunkeRepository(private val dataSource: DataSource) {
}
}
}

suspend fun hentYtelseTypeForBunke(bunkeId: String): FagsakYtelseType? {
return using(sessionOf(dataSource)) {
return@using it.transaction { tx ->
return@transaction tx.run(
queryOf(
"""
select ytelse_type from $BUNKE_TABLE where bunke_id = :bunkeId
""",
mapOf(
"bunkeId" to UUID.fromString(bunkeId)
)
).map { row ->
FagsakYtelseType.fromKode(row.string("ytelse_type"))
}.asSingle
)
}
}
}
}
26 changes: 15 additions & 11 deletions src/main/kotlin/no/nav/k9punsj/integrasjoner/dokarkiv/SafGateway.kt
Original file line number Diff line number Diff line change
Expand Up @@ -94,17 +94,21 @@ class SafGateway(
UUID.randomUUID().toString()
}

val response = client
.post()
.uri { it.pathSegment("graphql").build() }
.header(ConsumerIdHeaderKey, ConsumerIdHeaderValue)
.header(CorrelationIdHeader, correlationId)
.header(HttpHeaders.AUTHORIZATION, accessToken.asAuthoriationHeader())
.accept(MediaType.APPLICATION_JSON)
.bodyValue(SafDtos.JournalpostQuery(journalpostId))
.retrieve()
.toEntity(SafDtos.JournalpostResponseWrapper::class.java)
.awaitFirst()
val response = try {
client
.post()
.uri { it.pathSegment("graphql").build() }
.header(ConsumerIdHeaderKey, ConsumerIdHeaderValue)
.header(CorrelationIdHeader, correlationId)
.header(HttpHeaders.AUTHORIZATION, accessToken.asAuthoriationHeader())
.accept(MediaType.APPLICATION_JSON)
.bodyValue(SafDtos.JournalpostQuery(journalpostId))
.retrieve()
.toEntity(SafDtos.JournalpostResponseWrapper::class.java)
.awaitFirst()
} catch (e: Exception) {
throw IllegalStateException("Feil ved oppslag mot SAF graphql. ${e.message}", e)
}

val safResponse = response.body
val errors = safResponse?.errors
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
package no.nav.k9punsj.integrasjoner.k9sak

import no.nav.k9punsj.felles.FagsakYtelseType
import no.nav.k9punsj.felles.dto.PeriodeDto

data class HentK9SaksnummerGrunnlag(
valknadstype: FagsakYtelseType,
valker: String,
val pleietrengende: String?,
val annenPart: String?,
val journalpostId: String
val periode: PeriodeDto?,
)
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,9 @@ interface K9SakService {

/**
* Henter saksnummer fra K9Sak, hvis det ikke finnes oppretter vi en ny fagsak.
* Bruker behandlingsAar fra PunsjJournalpost for å sikkre riktig periode for saksnummeret.
* Periode hentes fra soknaden å defaulter til 1/1 og 31/12 hvis fom eller tom ikke er satt.
*/
suspend fun hentEllerOpprettSaksnummer(k9SaksnummerGrunnlag: HentK9SaksnummerGrunnlag): Pair<String?, String?>
suspend fun hentEllerOpprettSaksnummer(knadId: String): Pair<String?, String?>

suspend fun hentSisteSaksnummerForPeriode(
fagsakYtelseType: FagsakYtelseType,
Expand Down
153 changes: 135 additions & 18 deletions src/main/kotlin/no/nav/k9punsj/integrasjoner/k9sak/K9SakServiceImpl.kt
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,16 @@ import no.nav.k9.kodeverk.behandling.FagsakYtelseType
import no.nav.k9.kodeverk.dokument.Brevkode
import no.nav.k9.sak.kontrakt.arbeidsforhold.InntektArbeidYtelseArbeidsforholdV2Dto
import no.nav.k9.sak.kontrakt.mottak.FinnEllerOpprettSak
import no.nav.k9.sak.typer.JournalpostId
import no.nav.k9.sak.typer.Periode
import no.nav.k9.søknad.Søknad
import no.nav.k9punsj.StandardProfil
import no.nav.k9punsj.domenetjenester.PersonService
import no.nav.k9punsj.domenetjenester.SoknadService
import no.nav.k9punsj.felles.ZoneUtils.Oslo
import no.nav.k9punsj.felles.dto.ArbeidsgiverMedArbeidsforholdId
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.hentCallId
import no.nav.k9punsj.integrasjoner.k9sak.K9SakServiceImpl.Urls.finnFagsak
import no.nav.k9punsj.integrasjoner.k9sak.K9SakServiceImpl.Urls.hentIntektsmeldingerUrl
Expand All @@ -26,6 +27,13 @@ import no.nav.k9punsj.integrasjoner.k9sak.K9SakServiceImpl.Urls.sendInnSøknadUr
import no.nav.k9punsj.integrasjoner.k9sak.K9SakServiceImpl.Urls.sokFagsaker
import no.nav.k9punsj.integrasjoner.k9sak.K9SakServiceImpl.Urls.sokFagsakerUrl
import no.nav.k9punsj.journalpost.JournalpostService
import no.nav.k9punsj.omsorgspengeraleneomsorg.tilOmsAOvisning
import no.nav.k9punsj.omsorgspengerkronisksyktbarn.tilOmsKSBvisning
import no.nav.k9punsj.omsorgspengermidlertidigalene.tilOmsMAvisning
import no.nav.k9punsj.omsorgspengerutbetaling.tilOmsUtvisning
import no.nav.k9punsj.opplaeringspenger.tilOlpvisning
import no.nav.k9punsj.pleiepengerlivetssluttfase.tilPlsvisning
import no.nav.k9punsj.pleiepengersyktbarn.tilPsbvisning
import no.nav.k9punsj.utils.objectMapper
import org.intellij.lang.annotations.Language
import org.json.JSONArray
Expand All @@ -47,7 +55,8 @@ class K9SakServiceImpl(
@Value("\${no.nav.k9sak.scope}") private val k9sakScope: Set<String>,
@Qualifier("sts") private val accessTokenClient: AccessTokenClient,
private val personService: PersonService,
private val journalpostService: JournalpostService
private val journalpostService: JournalpostService,
private val soknadService: SoknadService,
) : K9SakService {

private val cachedAccessTokenClient = CachedAccessTokenClient(accessTokenClient)
Expand Down Expand Up @@ -185,26 +194,28 @@ class K9SakServiceImpl(
}
}

/*
* 1. Utleder periode fra PunsjJournalpost.behandlingsAar eller bruker nåvarande år som periode.
* 2. Slår opp saksnummer basert på ytelsetype, periode & inkluderte aktørIder.
*/
override suspend fun hentEllerOpprettSaksnummer(
k9SaksnummerGrunnlag: HentK9SaksnummerGrunnlag,
knadId: String
): Pair<String?, String?> {
val aar = journalpostService.hentBehandlingsAar(k9SaksnummerGrunnlag.journalpostId)
val periode = Periode(
LocalDate.of(aar, 1, 12),
LocalDate.of(aar, 12, 31)
)
val søknad = soknadService.hentSøknad(søknadId)
?: return Pair(null, "Fant ikke søknad")
val fagsakYtelseType = soknadService.henteYtelsetypeForSøknad(søknad!!.søknadId)
?: return Pair(null, "Fant ikke fagsakytelsetype")
val k9SaksnummerGrunnlag = søknad.tilK9saksnummerGrunnlag(fagsakYtelseType)

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 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 periode = Periode(
k9SaksnummerGrunnlag.periode?.fom ?: LocalDate.now().withMonth(1).withDayOfMonth(1),
k9SaksnummerGrunnlag.periode?.tom ?: LocalDate.now().withMonth(12).withDayOfMonth(31)
)

val payloadMedAktørId = FinnEllerOpprettSak(
FagsakYtelseType.fraKode(k9SaksnummerGrunnlag.søknadstype.kode).kode,
Expand Down Expand Up @@ -313,6 +324,112 @@ class K9SakServiceImpl(
)
}

private fun SøknadEntitet.tilK9saksnummerGrunnlag(
fagsakYtelseType: no.nav.k9punsj.felles.FagsakYtelseType
): HentK9SaksnummerGrunnlag {
// Kontrakt fra k9-sak FagsakYtelseType
// https://github.com/navikt/k9-sak/blob/83b654701d242629a20eabbab642c399c6c27182/kodeverk/src/main/java/no/nav/k9/kodeverk/behandling/FagsakYtelseType.java#L57
return when (fagsakYtelseType) {
no.nav.k9punsj.felles.FagsakYtelseType.PLEIEPENGER_SYKT_BARN -> {
val psbVisning = this.tilPsbvisning()
HentK9SaksnummerGrunnlag(
søknadstype = fagsakYtelseType,
søker = psbVisning.soekerId!!,
pleietrengende = psbVisning.barn?.norskIdent,
annenPart = null,
periode = psbVisning.soeknadsperiode?.firstOrNull()
)
}

no.nav.k9punsj.felles.FagsakYtelseType.OMSORGSPENGER -> {
val omsVisning = this.tilOmsUtvisning()
HentK9SaksnummerGrunnlag(
søknadstype = fagsakYtelseType,
søker = omsVisning.soekerId!!,
pleietrengende = null,
annenPart = null,
periode = omsVisning.periodeForHeleAretMedFravaer()
)
}

no.nav.k9punsj.felles.FagsakYtelseType.OMSORGSPENGER_UTBETALING -> {
val omsUtvisning = this.tilOmsUtvisning()
HentK9SaksnummerGrunnlag(
søknadstype = fagsakYtelseType,
søker = omsUtvisning.soekerId!!,
pleietrengende = null,
annenPart = null,
periode = omsUtvisning.periodeForHeleAretMedFravaer()
)
}

no.nav.k9punsj.felles.FagsakYtelseType.OMSORGSPENGER_ALENE_OMSORGEN -> {
val omsAoVisning = this.tilOmsAOvisning()
HentK9SaksnummerGrunnlag(
søknadstype = fagsakYtelseType,
søker = omsAoVisning.soekerId!!,
pleietrengende = omsAoVisning.barn!!.norskIdent,
annenPart = null,
periode = omsAoVisning.periode
)
}

no.nav.k9punsj.felles.FagsakYtelseType.OMSORGSPENGER_MIDLERTIDIG_ALENE -> {
val omsMaVisning = this.tilOmsMAvisning()
HentK9SaksnummerGrunnlag(
søknadstype = fagsakYtelseType,
søker = omsMaVisning.soekerId!!,
pleietrengende = null,
annenPart = omsMaVisning.annenForelder!!.norskIdent,
periode = omsMaVisning.annenForelder.periode
)
}

no.nav.k9punsj.felles.FagsakYtelseType.OMSORGSPENGER_KRONISK_SYKT_BARN -> {
val omsKsVisning = this.tilOmsKSBvisning()
HentK9SaksnummerGrunnlag(
søknadstype = fagsakYtelseType,
søker = omsKsVisning.soekerId!!,
pleietrengende = omsKsVisning.barn!!.norskIdent,
annenPart = null,
periode = omsKsVisning.mottattDato?.periodeDtoForHeleAret()
)
}

no.nav.k9punsj.felles.FagsakYtelseType.PLEIEPENGER_LIVETS_SLUTTFASE -> {
val tilPlsvisning = this.tilPlsvisning()
HentK9SaksnummerGrunnlag(
søknadstype = fagsakYtelseType,
søker = tilPlsvisning.soekerId!!,
pleietrengende = tilPlsvisning.pleietrengende!!.norskIdent,
annenPart = null,
periode = tilPlsvisning.soeknadsperiode?.firstOrNull()
)
}

no.nav.k9punsj.felles.FagsakYtelseType.OPPLÆRINGSPENGER -> {
val tilOlpvisning = this.tilOlpvisning()
HentK9SaksnummerGrunnlag(
søknadstype = fagsakYtelseType,
søker = tilOlpvisning.soekerId!!,
pleietrengende = tilOlpvisning.barn!!.norskIdent,
annenPart = null,
periode = tilOlpvisning.soeknadsperiode?.firstOrNull()
)
}

no.nav.k9punsj.felles.FagsakYtelseType.UKJENT -> throw IllegalStateException("Ustøttet fagsakytelsetype")
no.nav.k9punsj.felles.FagsakYtelseType.UDEFINERT -> throw IllegalStateException("Ustøttet fagsakytelsetype")
}
}

private fun LocalDate.periodeDtoForHeleAret(): PeriodeDto {
return PeriodeDto(
fom = this.withMonth(1).withDayOfMonth(1),
tom = this.withMonth(12).withDayOfMonth(31)
)
}

internal companion object {
private suspend fun hentCallId() = try {
coroutineContext.hentCallId()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import org.springframework.web.reactive.function.client.WebClient
import java.net.URI

@Service
internal class SakClient(
class SakClient(
@Value("\${no.nav.sak.base_url}") private val baseUrl: URI,
@Qualifier("sts") private val accessTokenClient: AccessTokenClient,
) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,12 +50,14 @@ class JournalpostService(
internal suspend fun hentSafJournalPost(journalpostId: String): SafDtos.Journalpost? =
safGateway.hentJournalpostInfo(journalpostId)

@Deprecated("Periode skal hentes fra søknaden i soknadservice. FIXME")
internal suspend fun hentBehandlingsAar(journalpostId: String): Int {
val behandlingsAar = journalpostRepository.hent(journalpostId).behandlingsAar
logger.info("Hentet behandlingsår ($behandlingsAar) for journalpost: $journalpostId")
return behandlingsAar ?: LocalDate.now().year
}

@Deprecated("Periode skal hentes fra søknaden i soknadservice. FIXME")
internal suspend fun lagreBehandlingsAar(journalpostId: String, behandlingsAar: Int) {
val journalpost = journalpostRepository.hentHvis(journalpostId)
if (journalpost != null) {
Expand Down Expand Up @@ -105,6 +107,7 @@ class JournalpostService(
}
}

@Deprecated("Kan sende in betyr att den har blitt sendt in fra før? FIXME")
internal fun kanSendesInn(søknadEntitet: SøknadEntitet): MutableSet<String> {
val journalPoster = søknadEntitet.journalposter!!
val journalposterDto: JournalposterDto = objectMapper.convertValue(journalPoster)
Expand Down Expand Up @@ -200,6 +203,7 @@ class JournalpostService(
return journalpostRepository.hentHvis(journalpostId)
}

@Deprecated("Kan sende in betyr att den har blitt sendt in fra før? FIXME")
internal suspend fun kanSendeInn(journalpostId: List<String>): Boolean {
return journalpostRepository.kanSendeInn(journalpostId)
}
Expand Down
Loading

0 comments on commit 2a22fc4

Please sign in to comment.