Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/adressebeskyttelse #4554

Merged
merged 3 commits into from
Oct 30, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ fun httpJsonClient(engine: HttpClientEngine = CIO.create()) = HttpClient(engine)
json(
Json {
ignoreUnknownKeys = true
coerceInputValues = true
},
)
}
Expand Down
2 changes: 1 addition & 1 deletion frontend/arrangor-flate/app/domene/domene.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ export type TilsagnDetaljer = {

export interface Deltaker {
id: string;
person?: RefusjonKravDeltakelsePerson;
person: RefusjonKravDeltakelsePerson;
veileder?: string;
startDatoTiltaket?: string;
startDatoPerioden?: string;
Expand Down
13 changes: 7 additions & 6 deletions frontend/arrangor-flate/app/mocks/arrangorflateMocks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,9 @@ const mockKrav: RefusjonKravAft[] = [
{
id: uuid(),
person: {
norskIdent: "01012212345",
navn: "Per Petterson",
fodselsdato: "1980-01-01",
fodselsaar: 1980,
},
manedsverk: 0.3,
perioder: [
Expand All @@ -44,8 +45,8 @@ const mockKrav: RefusjonKravAft[] = [
{
id: uuid(),
person: {
norskIdent: "10012212346",
navn: "Stian Bjærvik",
fodselsaar: 1980,
},
manedsverk: 1,
perioder: [
Expand Down Expand Up @@ -90,8 +91,9 @@ const mockKrav: RefusjonKravAft[] = [
{
id: uuid(),
person: {
norskIdent: "01012212345",
navn: "Per Petterson",
fodselsdato: "1980-01-01",
fodselsaar: 1980,
},
manedsverk: 0.3,
perioder: [
Expand All @@ -105,7 +107,6 @@ const mockKrav: RefusjonKravAft[] = [
{
id: uuid(),
person: {
norskIdent: "10012212346",
navn: "Stian Bjærvik",
},
manedsverk: 1,
Expand Down Expand Up @@ -151,8 +152,9 @@ const mockKrav: RefusjonKravAft[] = [
{
id: uuid(),
person: {
norskIdent: "01012212345",
navn: "Per Petterson",
fodselsdato: "1980-01-01",
fodselsaar: 1980,
},
manedsverk: 0.3,
perioder: [
Expand All @@ -166,7 +168,6 @@ const mockKrav: RefusjonKravAft[] = [
{
id: uuid(),
person: {
norskIdent: "10012212346",
navn: "Stian Bjærvik",
},
manedsverk: 1,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import { formaterDato } from "~/utils";
import { formaterNOK } from "@mr/frontend-common/utils/utils";
import { GenerelleDetaljer } from "~/components/refusjonskrav/GenerelleDetaljer";
import { sortBy, SortBySelector, SortOrder } from "~/utils/sort-by";
import { RefusjonKravDeltakelsePerson } from "@mr/api-client";

export const meta: MetaFunction = () => {
return [{ title: "Refusjon" }, { name: "description", content: "Refusjonsdetaljer" }];
Expand Down Expand Up @@ -97,16 +98,18 @@ export default function RefusjonskravBeregning() {
</Table.Header>
<Table.Body>
{sortedData.map((deltaker) => {
const { id, person, startDatoPerioden, sluttDatoPerioden } = deltaker;
const fodselsdato = getFormattedFodselsdato(person);
return (
<Table.ExpandableRow key={deltaker.id} content={null} togglePlacement="right">
<Table.HeaderCell>{deltaker.person?.navn}</Table.HeaderCell>
<Table.DataCell>{deltaker.person?.norskIdent}</Table.DataCell>
<Table.ExpandableRow key={id} content={null} togglePlacement="right">
<Table.HeaderCell>{person.navn}</Table.HeaderCell>
<Table.DataCell>{fodselsdato}</Table.DataCell>
<Table.DataCell>{deltaker.startDatoTiltaket}</Table.DataCell>
<Table.DataCell>
{deltaker.startDatoPerioden && formaterDato(deltaker.startDatoPerioden)}
{startDatoPerioden && formaterDato(startDatoPerioden)}
</Table.DataCell>
<Table.DataCell>
{deltaker.sluttDatoPerioden && formaterDato(deltaker.sluttDatoPerioden)}
{sluttDatoPerioden && formaterDato(sluttDatoPerioden)}
</Table.DataCell>
<Table.DataCell>{deltaker.stillingsprosent}</Table.DataCell>
<Table.DataCell>{deltaker.maanedsverk}</Table.DataCell>
Expand Down Expand Up @@ -152,3 +155,11 @@ function getDeltakerSelector(sortKey: DeltakerSortKey): SortBySelector<Deltaker>
return (d) => d.veileder;
}
}

function getFormattedFodselsdato(person: RefusjonKravDeltakelsePerson) {
return person.fodselsdato
? formaterDato(person.fodselsdato)
: person.fodselsaar
? `Fødselsår: ${person.fodselsaar}`
: null;
}
Original file line number Diff line number Diff line change
Expand Up @@ -40,3 +40,10 @@ enum class TypeGeografiskTilknytning {
UDEFINERT,
UTLAND,
}

enum class PdlGradering {
FORTROLIG,
STRENGT_FORTROLIG,
STRENGT_FORTROLIG_UTLAND,
UGRADERT,
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@ import io.ktor.http.*
import io.ktor.server.application.*
import io.ktor.server.auth.*
import io.ktor.server.plugins.*
import io.ktor.server.request.receive
import io.ktor.server.request.*
import io.ktor.server.response.*
import io.ktor.server.routing.*
import io.ktor.server.util.*
import io.ktor.util.pipeline.*
import kotlinx.serialization.Serializable
import no.nav.mulighetsrommet.api.clients.pdl.HentPersonBolkPdlQuery
import no.nav.mulighetsrommet.api.clients.pdl.PdlGradering
import no.nav.mulighetsrommet.api.clients.pdl.PdlIdent
import no.nav.mulighetsrommet.api.domain.dto.DeltakerDto
import no.nav.mulighetsrommet.api.okonomi.models.DeltakelsePeriode
Expand Down Expand Up @@ -51,7 +51,7 @@ fun Route.arrangorflateRoutes() {
val refusjonskrav: RefusjonskravRepository by inject()
val deltakerRepository: DeltakerRepository by inject()

val pdl: HentPersonBolkPdlQuery by inject()
val pdl: HentAdressebeskyttetPersonBolkPdlQuery by inject()

suspend fun <T : Any> PipelineContext<T, ApplicationCall>.arrangorerMedTilgang(): List<UUID> {
return call.principal<ArrangorflatePrincipal>()
Expand Down Expand Up @@ -165,7 +165,7 @@ fun Route.arrangorflateRoutes() {
}

suspend fun toRefusjonskrav(
pdl: HentPersonBolkPdlQuery,
pdl: HentAdressebeskyttetPersonBolkPdlQuery,
deltakerRepository: DeltakerRepository,
krav: RefusjonskravDto,
) = when (val beregning = krav.beregning) {
Expand Down Expand Up @@ -219,7 +219,7 @@ suspend fun toRefusjonskrav(
}

private suspend fun getPersoner(
pdl: HentPersonBolkPdlQuery,
pdl: HentAdressebeskyttetPersonBolkPdlQuery,
deltakere: List<DeltakerDto>,
): Map<NorskIdent, RefusjonKravDeltakelse.Person> {
val identer = deltakere
Expand All @@ -229,16 +229,12 @@ private suspend fun getPersoner(

return pdl.hentPersonBolk(identer)
.map {
it.entries
.mapNotNull { (ident, person) ->
person.navn.firstOrNull()?.let { navn ->
RefusjonKravDeltakelse.Person(
norskIdent = NorskIdent(ident.value),
navn = "${navn.etternavn}, ${navn.fornavn}",
)
}
buildMap {
it.entries.forEach { (ident, person) ->
val refusjonskravPerson = toRefusjonskravPerson(person)
put(NorskIdent(ident.value), refusjonskravPerson)
}
.associateBy { person -> person.norskIdent }
}
}
.getOrElse {
throw StatusException(
Expand All @@ -248,6 +244,30 @@ private suspend fun getPersoner(
}
}

private fun toRefusjonskravPerson(person: HentPersonBolkResponse.Person) =
when (person.adressebeskyttelse.gradering) {
PdlGradering.UGRADERT -> {
val navn = person.navn.firstOrNull()?.let { navn ->
val fornavnOgMellomnavn = listOfNotNull(navn.fornavn, navn.mellomnavn)
.joinToString(" ")
.takeIf { it.isNotEmpty() }
listOfNotNull(navn.etternavn, fornavnOgMellomnavn).joinToString(", ")
}
val foedselsdato = person.foedselsdato.firstOrNull()
RefusjonKravDeltakelse.Person(
navn = navn ?: "Mangler navn",
fodselsaar = foedselsdato?.foedselsaar,
fodselsdato = foedselsdato?.foedselsdato,
)
}

else -> RefusjonKravDeltakelse.Person(
navn = "Adressebeskyttet",
fodselsaar = null,
fodselsdato = null,
)
}

@Serializable
data class RefusjonKravAft(
@Serializable(with = UUIDSerializer::class)
Expand Down Expand Up @@ -288,8 +308,10 @@ data class RefusjonKravDeltakelse(
) {
@Serializable
data class Person(
val norskIdent: NorskIdent,
val navn: String,
@Serializable(with = LocalDateSerializer::class)
val fodselsdato: LocalDate?,
val fodselsaar: Int?,
)
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,17 @@
package no.nav.mulighetsrommet.api.clients.pdl
package no.nav.mulighetsrommet.api.okonomi.refusjon

import arrow.core.Either
import arrow.core.NonEmptySet
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import no.nav.mulighetsrommet.api.clients.pdl.*
import no.nav.mulighetsrommet.domain.serializers.LocalDateSerializer
import no.nav.mulighetsrommet.securelog.SecureLog
import no.nav.mulighetsrommet.tokenprovider.AccessType
import org.slf4j.LoggerFactory
import java.time.LocalDate

class HentPersonBolkPdlQuery(
class HentAdressebeskyttetPersonBolkPdlQuery(
private val pdl: PdlClient,
) {
private val log = LoggerFactory.getLogger(javaClass)
Expand All @@ -18,14 +21,21 @@ class HentPersonBolkPdlQuery(
query = """
query(${'$'}identer: [ID!]!) {
hentPersonBolk(identer: ${'$'}identer) {
ident,
ident
person {
navn {
fornavn
mellomnavn
etternavn
}
},
adressebeskyttelse {
gradering
}
foedselsdato {
foedselsdato
foedselsaar
}
}
code
}
}
Expand All @@ -41,7 +51,7 @@ class HentPersonBolkPdlQuery(
val person = requireNotNull(it.person) {
"person forventet siden response var OK"
}
PdlIdent(it.ident) to HentPersonBolkResponse.Person(person.navn)
PdlIdent(it.ident) to person
}

else -> {
Expand All @@ -63,6 +73,20 @@ data class HentPersonBolkResponse(
@Serializable
data class Person(
val navn: List<PdlNavn>,
val adressebeskyttelse: Adressebeskyttelse,
val foedselsdato: List<Foedselsdato>,
)

@Serializable
data class Adressebeskyttelse(
val gradering: PdlGradering = PdlGradering.UGRADERT,
)

@Serializable
data class Foedselsdato(
val foedselsaar: Int,
@Serializable(with = LocalDateSerializer::class)
val foedselsdato: LocalDate?,
)

@Serializable
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,11 @@ import no.nav.mulighetsrommet.api.clients.msgraph.MicrosoftGraphClient
import no.nav.mulighetsrommet.api.clients.norg2.Norg2Client
import no.nav.mulighetsrommet.api.clients.oppfolging.VeilarboppfolgingClient
import no.nav.mulighetsrommet.api.clients.pamOntologi.PamOntologiClient
import no.nav.mulighetsrommet.api.clients.pdl.HentPersonBolkPdlQuery
import no.nav.mulighetsrommet.api.clients.pdl.PdlClient
import no.nav.mulighetsrommet.api.clients.sanity.SanityClient
import no.nav.mulighetsrommet.api.clients.tiltakshistorikk.TiltakshistorikkClient
import no.nav.mulighetsrommet.api.clients.vedtak.VeilarbvedtaksstotteClient
import no.nav.mulighetsrommet.api.okonomi.refusjon.HentAdressebeskyttetPersonBolkPdlQuery
import no.nav.mulighetsrommet.api.okonomi.refusjon.RefusjonService
import no.nav.mulighetsrommet.api.okonomi.refusjon.RefusjonskravRepository
import no.nav.mulighetsrommet.api.okonomi.tilsagn.TilsagnRepository
Expand Down Expand Up @@ -226,7 +226,7 @@ private fun services(appConfig: AppConfig) = module {
tokenProvider = cachedTokenProvider.withScope(appConfig.pdl.scope),
)
}
single { HentPersonBolkPdlQuery(get()) }
single { HentAdressebeskyttetPersonBolkPdlQuery(get()) }
single<PoaoTilgangClient> {
PoaoTilgangHttpClient(
baseUrl = appConfig.poaoTilgang.url,
Expand Down
9 changes: 6 additions & 3 deletions mulighetsrommet-api/src/main/resources/web/openapi.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5028,16 +5028,19 @@ components:
- id
- perioder
- manedsverk
- person

RefusjonKravDeltakelsePerson:
type: object
properties:
norskIdent:
type: string
navn:
type: string
fodselsdato:
type: string
format: date
fodselsaar:
type: integer
required:
- norskIdent
- navn

RefusjonKravDeltakelsePeriode:
Expand Down
Loading