Skip to content

Commit

Permalink
Henter ut arbeidsgivere fra legacySøknad.
Browse files Browse the repository at this point in the history
  • Loading branch information
ramrock93 committed Feb 16, 2024
1 parent c444031 commit f05ea08
Show file tree
Hide file tree
Showing 16 changed files with 213 additions and 48 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,12 @@ class SwaggerConfiguration(
{
"søknadId": "10ed495f-83f2-46c1-a7bb-58d55fd1b1b2",
"søknadstype": "SØKNAD",
"arbeidsgivere": [
{
"organisasjonsnummer": "123456789",
"navn": "Arbeidsgiver AS"
}
],
"k9FormatSøknad": {
"søknadId": "10ed495f-83f2-46c1-a7bb-58d55fd1b1b2",
"versjon": "1.0.0",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@ package no.nav.sifinnsynapi.legacy.legacyinnsynapi

import com.fasterxml.jackson.annotation.JsonCreator
import com.fasterxml.jackson.annotation.JsonProperty
import no.nav.sifinnsynapi.legacy.legacyinnsynapi.utils.PSBJsonUtils.arbeidsgivere
import no.nav.sifinnsynapi.oppslag.Organisasjon
import org.json.JSONObject
import java.util.*

data class LegacySøknadDTO @JsonCreator constructor(
Expand All @@ -14,6 +17,11 @@ data class LegacySøknadDTO @JsonCreator constructor(
override fun toString(): String {
return "SøknadDTO()"
}

fun arbeidsgivere(): List<Organisasjon> = when (søknadstype) {
LegacySøknadstype.PP_SYKT_BARN -> JSONObject(søknad).arbeidsgivere()
else -> throw NotSupportedArbeidsgiverMeldingException(søknadId.toString(), søknadstype)
}
}

enum class LegacySøknadstype {
Expand All @@ -23,7 +31,7 @@ enum class LegacySøknadstype {
OMS_ETTERSENDELSE,
PP_SYKT_BARN_ENDRINGSMELDING;

fun gjelderPP() = when(this){
fun gjelderPP() = when (this) {
PP_SYKT_BARN, PP_ETTERSENDELSE, PP_SYKT_BARN_ENDRINGSMELDING -> true
else -> false
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package no.nav.sifinnsynapi.legacy.legacyinnsynapi

import no.nav.sifinnsynapi.util.ServletUtils
import org.springframework.http.HttpStatus
import org.springframework.http.ProblemDetail
import org.springframework.web.ErrorResponseException
import java.net.URI
import java.net.URLDecoder
import java.nio.charset.Charset

class NotSupportedArbeidsgiverMeldingException(søknadId: String, søknadstype: LegacySøknadstype) :
ErrorResponseException(HttpStatus.BAD_REQUEST, asProblemDetail(søknadId, søknadstype), null) {
private companion object {
private fun asProblemDetail(søknadId: String, søknadstype: LegacySøknadstype): ProblemDetail {
val problemDetail = ProblemDetail.forStatus(HttpStatus.BAD_REQUEST)
problemDetail.title = "Arbeidsgivermelding ikke støttet"
problemDetail.detail =
"Søknad med søknadId = $søknadId og søknadstype = $søknadstype støtter ikke arbeidsgivermelding."
problemDetail.type = URI("/problem-details/arbeidsgivermelding-ikke-støttet")
ServletUtils.currentHttpRequest()?.let {
problemDetail.instance = URI(URLDecoder.decode(it.requestURL.toString(), Charset.defaultCharset()))
}
return problemDetail
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package no.nav.sifinnsynapi.legacy.legacyinnsynapi

import no.nav.sifinnsynapi.util.ServletUtils
import org.springframework.http.HttpStatus
import org.springframework.http.ProblemDetail
import org.springframework.web.ErrorResponseException
import java.net.URI
import java.net.URLDecoder
import java.nio.charset.Charset

class PleiepengesøknadMedOrganisasjonsnummerIkkeFunnetException(søknadId: String, organisasjonsnummer: String) :
ErrorResponseException(HttpStatus.NOT_FOUND, asProblemDetail(søknadId, organisasjonsnummer), null) {
private companion object {
private fun asProblemDetail(søknadId: String, organisasjonsnummer: String): ProblemDetail {
val problemDetail = ProblemDetail.forStatus(HttpStatus.NOT_FOUND)
problemDetail.title = "Arbeidsgiver ikke funnet"
problemDetail.detail =
"Søknad med søknadId = $søknadId og organisasjonsnummer = $organisasjonsnummer ble ikke funnet."
problemDetail.type = URI("/problem-details/arbeidsgiver-ikke-funnet")
ServletUtils.currentHttpRequest()?.let {
problemDetail.instance = URI(URLDecoder.decode(it.requestURL.toString(), Charset.defaultCharset()))
}

return problemDetail
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package no.nav.sifinnsynapi.legacy.legacyinnsynapi.utils

import no.nav.sifinnsynapi.legacy.legacyinnsynapi.PleiepengesøknadMedOrganisasjonsnummerIkkeFunnetException
import no.nav.sifinnsynapi.oppslag.Organisasjon
import org.json.JSONArray
import org.json.JSONObject

object PSBJsonUtils {
const val ARBEIDSGIVERE = "arbeidsgivere"
const val ORGANISASJONER = "organisasjoner"
const val ORGANISASJONSNUMMER = "organisasjonsnummer"

fun JSONObject.finnOrganisasjon(søknadId: String, organisasjonsnummer: String): JSONObject {
val organisasjoner = when (val arbeidsgivereObjekt = get(ARBEIDSGIVERE)) {
is JSONObject -> arbeidsgivereObjekt.getJSONArray(ORGANISASJONER)
is JSONArray -> arbeidsgivereObjekt
else -> throw Error("Ugyldig type for feltet $ARBEIDSGIVERE. Forventet enten JSONObject eller JSONArray, men fikk ${arbeidsgivereObjekt.javaClass}")
}

var organisasjon: JSONObject? = null

for (i in 0 until organisasjoner.length()) {
val org = organisasjoner.getJSONObject(i)
if (org.getString(ORGANISASJONSNUMMER) == organisasjonsnummer) {
organisasjon = org
}
}

if (organisasjon == null) throw PleiepengesøknadMedOrganisasjonsnummerIkkeFunnetException(
søknadId,
organisasjonsnummer
)
return organisasjon
}

fun JSONObject.arbeidsgivere(): MutableList<Organisasjon> {
val organisasjonerJsonArray = when (val arbeidsgivereObjekt = get(ARBEIDSGIVERE)) {
is JSONObject -> arbeidsgivereObjekt.getJSONArray(ORGANISASJONER)
is JSONArray -> arbeidsgivereObjekt
else -> throw Error("Ugyldig type for feltet $ARBEIDSGIVERE. Forventet enten JSONObject eller JSONArray, men fikk ${arbeidsgivereObjekt.javaClass}")
}

val organisasjoner = mutableListOf<Organisasjon>()

for (i in 0 until organisasjonerJsonArray.length()) {
val org = organisasjonerJsonArray.getJSONObject(i)
val organisasjonsnummer = org.getString(ORGANISASJONSNUMMER)
val organisasjonsnavn = org.optString("navn", null)
organisasjoner.add(Organisasjon(organisasjonsnummer, organisasjonsnavn))
}

return organisasjoner
}
}
12 changes: 10 additions & 2 deletions src/main/kotlin/no/nav/sifinnsynapi/oppslag/OppslagsService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ class OppslagsService(
.build()
}

fun hentAktørId(): SøkerOppslagRespons? {
fun hentSøker(): SøkerOppslagRespons? {
logger.info("Slår opp søker...")
val exchange = oppslagsKlient.getForEntity(søkerUrl.toUriString(), SøkerOppslagRespons::class.java)
logger.info("Fikk response {} for oppslag av søker.", exchange.statusCode)
Expand Down Expand Up @@ -153,7 +153,10 @@ class OppslagsService(
}
}

data class SøkerOppslagRespons(@JsonAlias("aktør_id") val aktørId: String) {
data class SøkerOppslagRespons(
@JsonAlias("aktør_id") val aktørId: String,

) {
override fun toString(): String {
return "SøkerOppslagRespons(aktør_id='******')"
}
Expand Down Expand Up @@ -188,3 +191,8 @@ data class BarnOppslagDTO(
return "BarnOppslagDTO(fødselsdato='******', fornavn='******', mellomnavn='******', etternavn='******', aktør_id='******', identitetsnummer='******')"
}
}

class Organisasjon (
val organisasjonsnummer: String,
val navn: String?
)
10 changes: 6 additions & 4 deletions src/main/kotlin/no/nav/sifinnsynapi/sak/PleietrengendeMedSak.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import no.nav.k9.kodeverk.behandling.FagsakYtelseType
import no.nav.k9.sak.typer.Saksnummer
import no.nav.k9.søknad.Søknad
import no.nav.k9.søknad.felles.DtoKonstanter
import no.nav.sifinnsynapi.oppslag.Organisasjon
import java.net.URL
import java.time.LocalDate
import java.time.ZonedDateTime
Expand Down Expand Up @@ -38,15 +39,16 @@ data class BehandlingDTO(
val status: BehandlingStatus,
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DtoKonstanter.DATO_TID_FORMAT, timezone = DtoKonstanter.TIDSSONE) val opprettetTidspunkt: ZonedDateTime,
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DtoKonstanter.DATO_TID_FORMAT, timezone = DtoKonstanter.TIDSSONE)val avsluttetTidspunkt: ZonedDateTime? = null,
valknader: List<SøknaderISakDTO>,
valknader: List<SøknadISakDTO>,
val aksjonspunkter: List<AksjonspunktDTO>,
)

data class SøknaderISakDTO(
valknadId: UUID,
valknadstype: Søknadstype,
data class SøknadISakDTO(
valknadId: UUID,
valknadstype: Søknadstype,
val k9FormatSøknad: Søknad,
val dokumenter: List<DokumentDTO>,
val arbeidsgivere: List<Organisasjon>? = null,
)

enum class Søknadstype {
Expand Down
74 changes: 40 additions & 34 deletions src/main/kotlin/no/nav/sifinnsynapi/sak/SakService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import no.nav.k9.søknad.Søknad
import no.nav.k9.søknad.felles.Kildesystem
import no.nav.sifinnsynapi.dokumentoversikt.DokumentService
import no.nav.sifinnsynapi.legacy.legacyinnsynapi.LegacyInnsynApiService
import no.nav.sifinnsynapi.legacy.legacyinnsynapi.LegacySøknadDTO
import no.nav.sifinnsynapi.legacy.legacyinnsynapi.LegacySøknadstype
import no.nav.sifinnsynapi.omsorg.OmsorgService
import no.nav.sifinnsynapi.oppslag.BarnOppslagDTO
Expand Down Expand Up @@ -42,10 +43,10 @@ class SakService(

@Transactional
fun hentSaker(fagsakYtelseType: FagsakYtelseType): List<PleietrengendeMedSak> {
val søkersAktørId = oppslagsService.hentAktørId()?.aktørId
?: throw IllegalStateException("Feilet med å hente søkers aktørId.")
val søker = oppslagsService.hentSøker()
?: throw IllegalStateException("Feilet med å hente søker.")

val pleietrengendeSøkerHarOmsorgFor = omsorgService.hentPleietrengendeSøkerHarOmsorgFor(søkersAktørId)
val pleietrengendeSøkerHarOmsorgFor = omsorgService.hentPleietrengendeSøkerHarOmsorgFor(søker.aktørId)

// Returner tom liste hvis søker ikke har omsorg for noen pleietrengende.
if (pleietrengendeSøkerHarOmsorgFor.isEmpty()) {
Expand All @@ -60,7 +61,7 @@ class SakService(

val pleietrengendeMedBehandlinger = oppslagsbarn
.map { it.somPleietrengendeDTO() }
.assosierPleietrengendeMedBehandlinger(søkersAktørId, fagsakYtelseType)
.assosierPleietrengendeMedBehandlinger(søker.aktørId, fagsakYtelseType)

val søkersDokmentoversikt = dokumentService.hentDokumentOversikt()
logger.info("Fant ${søkersDokmentoversikt.size} dokumenter i søkers dokumentoversikt.")
Expand Down Expand Up @@ -92,49 +93,29 @@ class SakService(
return åpenBehandling?.let { SaksbehandlingstidUtleder.utled(it) }?.toLocalDate()
}

private fun utledSøknadsType(
k9FormatSøknad: Søknad,
knadId: String,
): Søknadstype = when (val ks = k9FormatSøknad.kildesystem.getOrNull()) {
null -> {
logger.info("Fant ingen kildesystem for søknad med søknadId $søknadId.")
val legacySøknad = kotlin.runCatching { legacyInnsynApiService.hentLegacySøknad(søknadId) }.getOrNull()
if (legacySøknad == null) {
logger.warn("Fant ingen legacy søknad for søknad med søknadId $søknadId og kunne ikke utlede søknadstype. Returnerer ukjent.")
Søknadstype.UKJENT
} else when (legacySøknad.søknadstype) {
LegacySøknadstype.PP_SYKT_BARN -> Søknadstype.SØKNAD
LegacySøknadstype.PP_ETTERSENDELSE -> Søknadstype.ETTERSENDELSE
LegacySøknadstype.PP_LIVETS_SLUTTFASE_ETTERSENDELSE -> Søknadstype.ETTERSENDELSE
LegacySøknadstype.OMS_ETTERSENDELSE -> Søknadstype.ETTERSENDELSE
LegacySøknadstype.PP_SYKT_BARN_ENDRINGSMELDING -> Søknadstype.ENDRINGSMELDING
}
}

Kildesystem.ENDRINGSDIALOG -> Søknadstype.ENDRINGSMELDING
Kildesystem.SØKNADSDIALOG -> Søknadstype.SØKNAD
Kildesystem.PUNSJ -> Søknadstype.SØKNAD // TODO: Blir dette riktig?
Kildesystem.UTLEDET -> Søknadstype.SØKNAD // // TODO: Blir dette riktig?

else -> throw error("Ukjent kildesystem $ks")
}

private fun MutableList<Behandling>.behandlingerMedTilhørendeSøknader(søkersDokmentoversikt: List<DokumentDTO>): List<BehandlingDTO> =
map { behandling ->

val søknaderISak: List<SøknaderISakDTO> = behandling.søknader
val søknaderISak: List<SøknadISakDTO> = behandling.søknader
.medTilhørendeDokumenter(søkersDokmentoversikt)
.filterNot { (søknad, _) -> søknad.hentOgMapTilK9FormatSøknad() == null } // Filtrer bort søknader som ikke finnes
.map { (søknad, dokumenter) ->
val k9FormatSøknad =
søknad.hentOgMapTilK9FormatSøknad()!! // verifisert at søknad finnes ovenfor

val søknadId = k9FormatSøknad.søknadId.id
val søknadsType = utledSøknadsType(k9FormatSøknad, søknadId)
val legacySøknad = kotlin.runCatching { legacyInnsynApiService.hentLegacySøknad(søknadId) }.getOrNull()

SøknaderISakDTO(
val søknadsType = utledSøknadsType(
k9FormatSøknad = k9FormatSøknad,
søknadId = søknadId,
legacySøknad = legacySøknad
)

SøknadISakDTO(
søknadId = UUID.fromString(søknadId),
søknadstype = søknadsType,
arbeidsgivere = legacySøknad?.arbeidsgivere(),
k9FormatSøknad = k9FormatSøknad,
dokumenter = dokumenter
)
Expand All @@ -149,6 +130,31 @@ class SakService(
)
}

private fun utledSøknadsType(
k9FormatSøknad: Søknad,
knadId: String,
legacySøknad: LegacySøknadDTO?,
) = when (val ks = k9FormatSøknad.kildesystem.getOrNull()) {
null -> {
logger.info("Fant ingen kildesystem for søknad med søknadId $søknadId.")
when (legacySøknad?.søknadstype) {
LegacySøknadstype.PP_SYKT_BARN -> Søknadstype.SØKNAD
LegacySøknadstype.PP_ETTERSENDELSE -> Søknadstype.ETTERSENDELSE
LegacySøknadstype.PP_LIVETS_SLUTTFASE_ETTERSENDELSE -> Søknadstype.ETTERSENDELSE
LegacySøknadstype.OMS_ETTERSENDELSE -> Søknadstype.ETTERSENDELSE
LegacySøknadstype.PP_SYKT_BARN_ENDRINGSMELDING -> Søknadstype.ENDRINGSMELDING
null -> Søknadstype.UKJENT
}
}

Kildesystem.ENDRINGSDIALOG -> Søknadstype.ENDRINGSMELDING
Kildesystem.SØKNADSDIALOG -> Søknadstype.SØKNAD
Kildesystem.PUNSJ -> Søknadstype.SØKNAD // TODO: Blir dette riktig?
Kildesystem.UTLEDET -> Søknadstype.SØKNAD // // TODO: Blir dette riktig?

else -> throw error("Ukjent kildesystem $ks")
}

fun hentGenerellSaksbehandlingstid(): SaksbehandlingtidDTO {
val saksbehandlingstidUker = Konstant.FORVENTET_SAKSBEHANDLINGSTID.days.div(7L)
return SaksbehandlingtidDTO(saksbehandlingstidUker = saksbehandlingstidUker)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ class SøknadService(
@Transactional(readOnly = true)
fun slåSammenSøknadsopplysningerPerBarn(): List<SøknadDTO> {
val søkersAktørId =
(oppslagsService.hentAktørId()
(oppslagsService.hentSøker()
?: throw IllegalStateException("Feilet med å hente søkers aktørId.")).aktørId

val barnOppslagDTOS: List<BarnOppslagDTO> = oppslagsService.hentBarn()
Expand Down
15 changes: 15 additions & 0 deletions src/main/kotlin/no/nav/sifinnsynapi/util/ServletUtils.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package no.nav.sifinnsynapi.util

import jakarta.servlet.http.HttpServletRequest
import org.springframework.web.context.request.RequestContextHolder
import org.springframework.web.context.request.ServletRequestAttributes

object ServletUtils {

fun currentHttpRequest(): HttpServletRequest? {
val requestAttributes = RequestContextHolder.getRequestAttributes()
return if (requestAttributes is ServletRequestAttributes) {
requestAttributes.request
} else null
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ class KafkaHendelseKonsumentIntegrasjonsTest {
internal fun beforeEach() {
logger.info("Tømmer databasen...")
søknadRepository.deleteAll()
every { oppslagsService.hentAktørId() } returns SøkerOppslagRespons(aktørId = hovedSøkerAktørId)
every { oppslagsService.hentSøker() } returns SøkerOppslagRespons(aktørId = hovedSøkerAktørId)
every { oppslagsService.hentBarn() } returns listOf(
BarnOppslagDTO(
aktørId = barn1AktørId,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ internal class OppslagsServiceTest {

@Test
fun hentAktørId() {
val hentAktørId = oppslagsService.hentAktørId()
val hentAktørId = oppslagsService.hentSøker()
assertThat(hentAktørId).isNotNull()
}

Expand Down
Loading

0 comments on commit f05ea08

Please sign in to comment.