Skip to content

Commit

Permalink
Merge pull request #399 from navikt/test_userinfov3
Browse files Browse the repository at this point in the history
oppdater digisyfoservice iht ny userInfo kontrakt
  • Loading branch information
kenglxn authored Feb 7, 2025
2 parents bd17e1a + 0281586 commit 9e57176
Show file tree
Hide file tree
Showing 26 changed files with 1,808 additions and 590 deletions.
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.4.1</version>
<version>3.4.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>

Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package no.nav.arbeidsgiver.min_side.services.digisyfo

import com.fasterxml.jackson.annotation.JsonIgnore
import io.micrometer.core.instrument.MeterRegistry
import no.nav.arbeidsgiver.min_side.models.Organisasjon
import no.nav.arbeidsgiver.min_side.services.digisyfo.DigisyfoRepository.Virksomhetsinfo
import no.nav.arbeidsgiver.min_side.services.ereg.EregOrganisasjon
import no.nav.arbeidsgiver.min_side.services.ereg.EregOrganisasjon.Companion.orgnummerTilOverenhet
import no.nav.arbeidsgiver.min_side.services.ereg.EregService
import no.nav.arbeidsgiver.min_side.services.ereg.GyldighetsPeriode.Companion.erGyldig
import org.springframework.stereotype.Component

@Component
Expand All @@ -13,109 +15,77 @@ class DigisyfoService(
private val meterRegistry: MeterRegistry
) {

data class VirksomhetOgAntallSykmeldte(
val organisasjon: Organisasjon,
val antallSykmeldte: Int,
)

data class VirksomhetOgAntallSykmeldteV3(
val orgnr: String,
val navn: String,
val organisasjonsform: String,
val antallSykmeldte: Int,
val underenheter: List<VirksomhetOgAntallSykmeldteV3>
)

fun hentVirksomheterOgSykmeldte(fnr: String): Collection<VirksomhetOgAntallSykmeldte> {
val underenheter = digisyfoRepository.virksomheterOgSykmeldte(fnr)
.flatMap { hentUnderenhet(it) }
val overenheterOrgnr = underenheter
.mapNotNull { it.organisasjon.parentOrganizationNumber }
.toSet()
val resultat = underenheter + overenheterOrgnr
.flatMap { hentOverenhet(it) }

meterRegistry.counter(
"msa.digisyfo.tilgang",
"virksomheter",
resultat.size.toString()
).increment()

return resultat.distinctBy { it.organisasjon.organizationNumber }
}

fun hentVirksomheterOgSykmeldteV3(fnr: String): List<VirksomhetOgAntallSykmeldteV3> {
val underenheter = digisyfoRepository.virksomheterOgSykmeldte(fnr)
.flatMap { hentUnderenhet(it) }
fun hentVirksomheterOgSykmeldte(fnr: String): List<VirksomhetOgAntallSykmeldte> {
val virksomheterOgSykmeldte = digisyfoRepository.virksomheterOgSykmeldte(fnr)

val alleOverenheter = underenheter
.mapNotNull { it.organisasjon.parentOrganizationNumber }
.toSet()
.flatMap { hentOverenhet(it) }
.distinctBy { it.organisasjon.organizationNumber }
val orgs = mutableMapOf<String, VirksomhetOgAntallSykmeldte>()

//TODO når v2 er borte kan vi kanskje bygge treet mens vi henter overenheter?

val alleOrganisasjoner = underenheter + alleOverenheter

fun byggHierarki(org: VirksomhetOgAntallSykmeldte): VirksomhetOgAntallSykmeldteV3 {
val direkteUnderenheter = alleOrganisasjoner.filter {
it.organisasjon.parentOrganizationNumber == org.organisasjon.organizationNumber
for (virksomhetOgSykmeldt in virksomheterOgSykmeldte) {
val virksomhet = orgs.computeIfAbsent(virksomhetOgSykmeldt.virksomhetsnummer) {
val eregOrg = eregService.hentUnderenhet(it) ?: throw RuntimeException("Fant ikke underenhet for $it")
VirksomhetOgAntallSykmeldte.from(eregOrg, virksomhetOgSykmeldt.antallSykmeldte)
}
return VirksomhetOgAntallSykmeldteV3(
orgnr = org.organisasjon.organizationNumber,
navn = org.organisasjon.name,
organisasjonsform = org.organisasjon.organizationForm,
antallSykmeldte = org.antallSykmeldte,
underenheter = direkteUnderenheter.map(::byggHierarki)
)
orgs[virksomhet.orgnr] = virksomhet
berikOverenheter(orgs, virksomhet)
}

val underenheter = orgs.values.filter {it.underenheter.isEmpty() }
val overenheter = orgs.values.filter {it.orgnrOverenhet == null }

meterRegistry.counter(
"msa.digisyfo.tilgang",
"virksomheter",
underenheter.size.toString()
).increment()

return alleOverenheter
.filter { it.organisasjon.parentOrganizationNumber == null }
.map(::byggHierarki)
return overenheter
}

private fun hentForfedre(org: Organisasjon, orgs: MutableList<Organisasjon> = mutableListOf()): List<Organisasjon> {
if (org.parentOrganizationNumber == null) return orgs

val overenhet = eregService.hentOverenhet(org.parentOrganizationNumber!!).let {
Organisasjon.fromEregOrganisasjon(it)
} ?: return orgs

orgs.add(overenhet)
return hentForfedre(overenhet, orgs)
private fun berikOverenheter(orgs: MutableMap<String, VirksomhetOgAntallSykmeldte>, virksomhet: VirksomhetOgAntallSykmeldte) {
val orgnummerTilOverenhet = virksomhet.orgnrOverenhet ?: return

val overenhet = orgs.computeIfAbsent(orgnummerTilOverenhet) {
val eregOrg = eregService.hentOverenhet(it) ?: throw RuntimeException("Fant ikke overenhet for $it")
VirksomhetOgAntallSykmeldte.from(eregOrg)
}
orgs[overenhet.orgnr] = overenhet
overenhet.leggTilUnderenhet(virksomhet)
berikOverenheter(orgs, overenhet)
}

data class VirksomhetOgAntallSykmeldte(
val orgnr: String,
val navn: String,
val organisasjonsform: String,
var antallSykmeldte: Int,
val underenheter: MutableList<VirksomhetOgAntallSykmeldte>,
@JsonIgnore val orgnrOverenhet: String?,
) {
fun leggTilUnderenhet(underenhet: VirksomhetOgAntallSykmeldte) {
val eksisterende = underenheter.firstOrNull { it.orgnr == underenhet.orgnr }
if (eksisterende !== null) {
underenhet.underenheter.forEach {
eksisterende.leggTilUnderenhet(it)
}
} else {
underenheter.add(underenhet)
underenheter.sortBy { it.orgnr }
}
antallSykmeldte = underenheter.sumOf { it.antallSykmeldte }
}

private fun hentOverenhet(orgnr: String): List<VirksomhetOgAntallSykmeldte> {
val hovedenhet = eregService.hentOverenhet(orgnr).let {
Organisasjon.fromEregOrganisasjon(it)
} ?: return listOf()
val forfedre = hentForfedre(hovedenhet)
val result = mutableListOf<VirksomhetOgAntallSykmeldte>()
result.add(VirksomhetOgAntallSykmeldte(hovedenhet, 0))
result.addAll(forfedre.map { VirksomhetOgAntallSykmeldte(it, 0) })
return result
}

private fun hentUnderenhet(virksomhetsinfo: Virksomhetsinfo): List<VirksomhetOgAntallSykmeldte> {
val underenhet = eregService.hentUnderenhet(virksomhetsinfo.virksomhetsnummer).let {
Organisasjon.fromEregOrganisasjon(it)
companion object {
fun from(eregOrganisasjon: EregOrganisasjon, antallSykmeldte: Int = 0) =
VirksomhetOgAntallSykmeldte(
orgnr = eregOrganisasjon.organisasjonsnummer,
navn = eregOrganisasjon.navn.sammensattnavn,
organisasjonsform = eregOrganisasjon.organisasjonDetaljer.enhetstyper?.first {
it.gyldighetsperiode.erGyldig()
}?.enhetstype ?: "",
antallSykmeldte = antallSykmeldte,
orgnrOverenhet = eregOrganisasjon.orgnummerTilOverenhet(),
underenheter = mutableListOf(),
)
}
?: return listOf()
return listOf(
VirksomhetOgAntallSykmeldte(
underenhet,
virksomhetsinfo.antallSykmeldte
)
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ class EregService(
EregOrganisasjon::class.java,
mapOf("virksomhetsnummer" to virksomhetsnummer)
)
return request.body
request.body
} catch (e: RestClientResponseException) {
if (e.statusCode == HttpStatus.NOT_FOUND) {
return null
Expand All @@ -57,9 +57,11 @@ class EregService(
fun hentOverenhet(orgnummer: String): EregOrganisasjon? {
return try {
restTemplate.getForEntity(
"/v2/organisasjon/{orgnummer}",
"/v2/organisasjon/{orgnummer}?inkluderHierarki=true",
EregOrganisasjon::class.java,
mapOf("orgnummer" to orgnummer)
mapOf(
"orgnummer" to orgnummer,
)
).body
} catch (e: RestClientResponseException) {
if (e.statusCode == HttpStatus.NOT_FOUND) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package no.nav.arbeidsgiver.min_side.services.tiltak

import no.nav.arbeidsgiver.min_side.models.Organisasjon
import no.nav.arbeidsgiver.min_side.services.altinn.AltinnService
import org.springframework.stereotype.Service

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package no.nav.arbeidsgiver.min_side.userinfo

import com.fasterxml.jackson.annotation.JsonProperty
import kotlinx.coroutines.async
import kotlinx.coroutines.supervisorScope
import no.nav.arbeidsgiver.min_side.controller.AuthenticatedUserHolder
Expand All @@ -26,121 +25,34 @@ class UserInfoController(
}
}

val syfoVirksomheter = async {
runCatching {
digisyfoService.hentVirksomheterOgSykmeldteV3(authenticatedUserHolder.fnr)
}
}
val refusjoner = async {
runCatching {
refusjonStatusService.statusoversikt(authenticatedUserHolder.fnr)
}
}
UserInfoResponsV3.from(tilganger.await(), syfoVirksomheter.await(), refusjoner.await())
}

@GetMapping("/api/userInfo/v2")
suspend fun getUserInfo() = supervisorScope {
val tilganger = async {
runCatching {
altinnService.hentAltinnTilganger()
}
}

val syfoVirksomheter = async {
runCatching {
digisyfoService.hentVirksomheterOgSykmeldte(authenticatedUserHolder.fnr)
}
}

val refusjoner = async {
runCatching {
refusjonStatusService.statusoversikt(authenticatedUserHolder.fnr)
}
}

UserInfoRespons.from(tilganger.await(), syfoVirksomheter.await(), refusjoner.await())
}
}

data class UserInfoRespons(
val altinnError: Boolean,
val digisyfoError: Boolean,
val organisasjoner: List<AltinnTilganger.AltinnTilgang>,
val tilganger: Map<String, Collection<String>>,
val digisyfoOrganisasjoner: Collection<VirksomhetOgAntallSykmeldteV2>,
val refusjoner: List<RefusjonStatusService.Statusoversikt>,
) {
companion object {
data class OrganisasjonV2(
@field:JsonProperty("Name") var name: String,
@field:JsonProperty("ParentOrganizationNumber") var parentOrganizationNumber: String? = null,
@field:JsonProperty("OrganizationNumber") var organizationNumber: String,
@field:JsonProperty("OrganizationForm") var organizationForm: String,
)

data class VirksomhetOgAntallSykmeldteV2(
val organisasjon: OrganisasjonV2,
val antallSykmeldte: Int,
)

fun from(
tilgangerResult: Result<AltinnTilganger>,
syfoResult: Result<Collection<DigisyfoService.VirksomhetOgAntallSykmeldte>>,
refusjonerResult: Result<List<RefusjonStatusService.Statusoversikt>>
) = UserInfoRespons(
digisyfoError = syfoResult.isFailure,

altinnError = tilgangerResult.fold(
onSuccess = { it.isError || refusjonerResult.isFailure },
onFailure = { true }
),

organisasjoner = tilgangerResult.fold(
onSuccess = { it.hierarki },
onFailure = { emptyList() }
),

digisyfoOrganisasjoner = syfoResult.fold(
onSuccess = { it.map{virksomhetOgAntallSykmeldte -> VirksomhetOgAntallSykmeldteV2(
antallSykmeldte = virksomhetOgAntallSykmeldte.antallSykmeldte,
organisasjon = OrganisasjonV2(
name = virksomhetOgAntallSykmeldte.organisasjon.name,
parentOrganizationNumber = virksomhetOgAntallSykmeldte.organisasjon.parentOrganizationNumber,
organizationNumber = virksomhetOgAntallSykmeldte.organisasjon.organizationNumber,
organizationForm = virksomhetOgAntallSykmeldte.organisasjon.organizationForm
))
} },
onFailure = { emptyList() }
),

refusjoner = refusjonerResult.fold(
onSuccess = { it },
onFailure = { emptyList() }
),

tilganger = tilgangerResult.fold(
onSuccess = { it.tilgangTilOrgNr },
onFailure = { emptyMap() }
),
)
UserInfoV3.from(tilganger.await(), syfoVirksomheter.await(), refusjoner.await())
}
}

data class UserInfoResponsV3(
data class UserInfoV3(
val altinnError: Boolean,
val digisyfoError: Boolean,
val organisasjoner: List<AltinnTilganger.AltinnTilgang>,
val tilganger: Map<String, Collection<String>>,
val digisyfoOrganisasjoner: List<DigisyfoService.VirksomhetOgAntallSykmeldteV3>,
val digisyfoOrganisasjoner: List<DigisyfoService.VirksomhetOgAntallSykmeldte>,
val refusjoner: List<RefusjonStatusService.Statusoversikt>,
) {
companion object {
fun from(
tilgangerResult: Result<AltinnTilganger>,
syfoResult: Result<List<DigisyfoService.VirksomhetOgAntallSykmeldteV3>>,
syfoResult: Result<List<DigisyfoService.VirksomhetOgAntallSykmeldte>>,
refusjonerResult: Result<List<RefusjonStatusService.Statusoversikt>>
) = UserInfoResponsV3(
) = UserInfoV3(
digisyfoError = syfoResult.isFailure,

altinnError = tilgangerResult.fold(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package no.nav.arbeidsgiver.min_side

import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.kotlin.readValue
import no.nav.arbeidsgiver.min_side.models.Organisasjon
import no.nav.arbeidsgiver.min_side.services.altinn.AltinnService
import org.mockito.Mockito.*
import org.springframework.beans.factory.annotation.Value
Expand Down
Loading

0 comments on commit 9e57176

Please sign in to comment.