Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
63ce7dc
Flytt v1-pakken inn under api-pakken
vskjefst May 23, 2025
e886fdb
Endepunkt som returnerer klassifisert inntekt
vskjefst May 26, 2025
dc87d54
Få VaktmesterTest til å kjøre først
vskjefst May 27, 2025
48a5b50
Lag test for KlassifisertInntektRouteV3
vskjefst May 27, 2025
abdf431
Lagre periode på inntekt_person_mapping
vskjefst May 27, 2025
b788dab
Legg til test for getStoredInntektMedMetadata
vskjefst May 30, 2025
1812289
Endre navn på test til norsk
vskjefst May 30, 2025
406b366
Map beregningsdato og periode til og fra frontend
vskjefst May 27, 2025
3c95dea
Kolonner som skal med i StoredInntektMedMetadata må også hentes fra d…
vskjefst May 28, 2025
4d6f920
Bruk opptjeningsperiode fra requesten
vskjefst May 28, 2025
154072a
Test henting av inntektPersonMapping fra database
JMLindseth May 28, 2025
267185f
Støtte for lagring og uthenting av begrunnelse
vskjefst May 28, 2025
e0c3450
Bruk riktig kolonnenavn i manuelt_redigert ved henting av uklassifise…
JMLindseth May 30, 2025
5c8306f
Test at begrunnelse blir hentet ut riktig fra database
JMLindseth May 30, 2025
f8f502a
Gå tilbake til standard DB-navn nå som G-justering er gjennomført
vskjefst Jun 2, 2025
b12fac9
Deploy til dev
vskjefst Jun 2, 2025
01c17da
Returner begrunnelse for redigering i responsen
vskjefst Jun 2, 2025
92434b4
Endre periode-felter på virksomhet til fraOgMed og tilOgMed
JMLindseth Jun 3, 2025
69724fc
Fjern deploy til dev for branchen
JMLindseth Jun 10, 2025
3b7c6e1
Juster verdier for minne
JMLindseth Jun 10, 2025
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 @@ -32,6 +32,11 @@ import io.micrometer.prometheusmetrics.PrometheusConfig
import io.micrometer.prometheusmetrics.PrometheusMeterRegistry
import io.prometheus.metrics.model.registry.PrometheusRegistry
import mu.KotlinLogging
import no.nav.dagpenger.inntekt.api.v1.enhetsregisteret
import no.nav.dagpenger.inntekt.api.v1.inntekt
import no.nav.dagpenger.inntekt.api.v1.opptjeningsperiodeApi
import no.nav.dagpenger.inntekt.api.v1.uklassifisertInntekt
import no.nav.dagpenger.inntekt.api.v3.inntektV3
import no.nav.dagpenger.inntekt.db.IllegalInntektIdException
import no.nav.dagpenger.inntekt.db.InntektNotFoundException
import no.nav.dagpenger.inntekt.db.InntektStore
Expand All @@ -41,10 +46,6 @@ import no.nav.dagpenger.inntekt.oppslag.PersonNotFoundException
import no.nav.dagpenger.inntekt.oppslag.PersonOppslag
import no.nav.dagpenger.inntekt.oppslag.enhetsregister.EnhetsregisterClient
import no.nav.dagpenger.inntekt.serder.jacksonObjectMapper
import no.nav.dagpenger.inntekt.v1.enhetsregisteret
import no.nav.dagpenger.inntekt.v1.inntekt
import no.nav.dagpenger.inntekt.v1.opptjeningsperiodeApi
import no.nav.dagpenger.inntekt.v1.uklassifisertInntekt
import org.slf4j.event.Level
import java.net.URI

Expand All @@ -60,7 +61,12 @@ internal fun Application.inntektApi(
enhetsregisterClient: EnhetsregisterClient,
healthChecks: List<HealthCheck>,
collectorRegistry: PrometheusRegistry = PrometheusRegistry.defaultRegistry,
meterRegistry: PrometheusMeterRegistry = PrometheusMeterRegistry(PrometheusConfig.DEFAULT, collectorRegistry, Clock.SYSTEM),
meterRegistry: PrometheusMeterRegistry =
PrometheusMeterRegistry(
PrometheusConfig.DEFAULT,
collectorRegistry,
Clock.SYSTEM,
),
) {
install(DefaultHeaders)
install(MicrometerMetrics) {
Expand Down Expand Up @@ -232,6 +238,11 @@ internal fun Application.inntektApi(
}
}
}
authenticate("azure") {
route("/v3/inntekt") {
inntektV3(behandlingsInntektsGetter, personOppslag, inntektStore)
}
}
naischecks(healthChecks, meterRegistry)
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
package no.nav.dagpenger.inntekt.v1
package no.nav.dagpenger.inntekt.api.v1

import io.ktor.client.plugins.ClientRequestException
import io.ktor.http.CacheControl
import io.ktor.http.ContentType
import io.ktor.http.HttpStatusCode
import io.ktor.server.application.call
import io.ktor.server.plugins.BadRequestException
import io.ktor.server.response.cacheControl
import io.ktor.server.response.respondText
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package no.nav.dagpenger.inntekt.v1
package no.nav.dagpenger.inntekt.api.v1

import io.ktor.http.HttpStatusCode
import io.ktor.server.application.call
import io.ktor.server.plugins.MissingRequestParameterException
import io.ktor.server.plugins.callid.callId
import io.ktor.server.request.receive
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,18 @@
package no.nav.dagpenger.inntekt.v1
package no.nav.dagpenger.inntekt.api.v1

import io.ktor.http.HttpStatusCode
import io.ktor.server.application.call
import io.ktor.server.request.receive
import io.ktor.server.response.respond
import io.ktor.server.routing.Route
import io.ktor.server.routing.post
import io.ktor.server.routing.route
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import no.nav.dagpenger.inntekt.api.v1.models.InntjeningsperiodeParametre
import no.nav.dagpenger.inntekt.api.v1.models.InntjeningsperiodeResultat
import no.nav.dagpenger.inntekt.db.InntektId
import no.nav.dagpenger.inntekt.db.InntektStore
import no.nav.dagpenger.inntekt.opptjeningsperiode.Opptjeningsperiode
import no.nav.dagpenger.inntekt.v1.models.InntjeningsperiodeParametre
import no.nav.dagpenger.inntekt.v1.models.InntjeningsperiodeResultat
import java.time.LocalDate

fun Route.opptjeningsperiodeApi(inntektStore: InntektStore) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package no.nav.dagpenger.inntekt.v1
package no.nav.dagpenger.inntekt.api.v1

import com.auth0.jwt.exceptions.JWTDecodeException
import io.ktor.http.HttpStatusCode
Expand All @@ -18,6 +18,8 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import mu.KotlinLogging
import mu.withLoggingContext
import no.nav.dagpenger.inntekt.api.v1.models.InntekterDto
import no.nav.dagpenger.inntekt.api.v1.models.mapToStoredInntekt
import no.nav.dagpenger.inntekt.db.InntektId
import no.nav.dagpenger.inntekt.db.InntektNotFoundException
import no.nav.dagpenger.inntekt.db.InntektStore
Expand All @@ -40,8 +42,6 @@ import no.nav.dagpenger.inntekt.oppslag.Person
import no.nav.dagpenger.inntekt.oppslag.PersonOppslag
import no.nav.dagpenger.inntekt.oppslag.enhetsregister.EnhetsregisterClient
import no.nav.dagpenger.inntekt.opptjeningsperiode.Opptjeningsperiode
import no.nav.dagpenger.inntekt.v1.models.InntekterDto
import no.nav.dagpenger.inntekt.v1.models.mapToStoredInntekt
import java.time.LocalDate
import kotlin.coroutines.CoroutineContext

Expand Down Expand Up @@ -146,14 +146,14 @@ fun Route.uklassifisertInntekt(
withContext(coroutineContext) {
val inntektId = InntektId(call.parameters["inntektId"]!!)
inntektStore
.getInntektMedPersonFnr(inntektId)
.let {
val person = personOppslag.hentPerson(it.fødselsnummer)
val inntektsmottaker = Inntektsmottaker(it.fødselsnummer, person.sammensattNavn())
.getStoredInntektMedMetadata(inntektId)
.let { storedInntektMedMetadata ->
val person = personOppslag.hentPerson(storedInntektMedMetadata.fødselsnummer)
val inntektsmottaker = Inntektsmottaker(storedInntektMedMetadata.fødselsnummer, person.sammensattNavn())
val organisasjoner =
hentOrganisasjoner(
enhetsregisterClient,
it.inntekt.arbeidsInntektMaaned
storedInntektMedMetadata.inntekt.arbeidsInntektMaaned
?.flatMap { it.arbeidsInntektInformasjon?.inntektListe.orEmpty() }
?.filter { inntekt ->
inntekt.virksomhet?.aktoerType == AktoerType.ORGANISASJON &&
Expand All @@ -162,7 +162,11 @@ fun Route.uklassifisertInntekt(
?.toTypedArray()
?.toList() ?: emptyList(),
)
it.inntekt.mapToFrontend(inntektsmottaker, organisasjoner)
storedInntektMedMetadata.inntekt.mapToFrontend(
person = inntektsmottaker,
organisasjoner = organisasjoner,
storedInntektMedMetadata,
)
}.let {
call.respond(HttpStatusCode.OK, it)
}
Expand All @@ -171,8 +175,8 @@ fun Route.uklassifisertInntekt(
post {
withContext(coroutineContext) {
val inntektId = call.parameters["inntektId"]!!
call
.receive<InntekterDto>()
val inntekterDto = call.receive<InntekterDto>()
inntekterDto
.mapToStoredInntekt(
inntektId = inntektId,
).let {
Expand All @@ -189,12 +193,16 @@ fun Route.uklassifisertInntekt(
inntektPersonMapping.kontekstType,
),
beregningsdato = inntektPersonMapping.beregningsdato,
),
).apply {
this.opptjeningsperiode.førsteMåned = inntekterDto.periode.fraOgMed
this.opptjeningsperiode.sisteAvsluttendeKalenderMåned = inntekterDto.periode.tilOgMed
},
inntekt = it.inntekt,
manueltRedigert =
ManueltRedigert.from(
true,
call.getSubject(),
bool = true,
redigertAv = call.getSubject(),
begrunnelse = inntekterDto.begrunnelse,
),
),
)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package no.nav.dagpenger.inntekt.v1.models
package no.nav.dagpenger.inntekt.api.v1.models

import no.nav.dagpenger.inntekt.db.InntektId
import no.nav.dagpenger.inntekt.db.StoredInntekt
Expand All @@ -17,6 +17,13 @@ import java.time.YearMonth
data class InntekterDto(
val virksomheter: List<Virksomhet>,
val mottaker: Inntektsmottaker,
val periode: PeriodeDto,
val begrunnelse: String? = null,
)

data class PeriodeDto(
val fraOgMed: YearMonth,
val tilOgMed: YearMonth,
)

fun InntekterDto.mapToStoredInntekt(inntektId: String): StoredInntekt =
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package no.nav.dagpenger.inntekt.v1.models
package no.nav.dagpenger.inntekt.api.v1.models

data class InntjeningsperiodeParametre(
val beregningsdato: String,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package no.nav.dagpenger.inntekt.v1.models
package no.nav.dagpenger.inntekt.api.v1.models

class InntjeningsperiodeResultat(
val sammeInntjeningsPeriode: Boolean,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
package no.nav.dagpenger.inntekt.api.v3

import io.ktor.http.HttpStatusCode
import io.ktor.server.plugins.callid.callId
import io.ktor.server.request.receive
import io.ktor.server.response.respond
import io.ktor.server.routing.Route
import io.ktor.server.routing.post
import io.ktor.server.routing.route
import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.withContext
import no.nav.dagpenger.inntekt.BehandlingsInntektsGetter
import no.nav.dagpenger.inntekt.db.InntektId
import no.nav.dagpenger.inntekt.db.InntektStore
import no.nav.dagpenger.inntekt.db.Inntektparametre
import no.nav.dagpenger.inntekt.db.ManueltRedigert
import no.nav.dagpenger.inntekt.db.RegelKontekst
import no.nav.dagpenger.inntekt.oppslag.PersonOppslag
import no.nav.dagpenger.inntekt.v1.Inntekt
import no.nav.dagpenger.inntekt.v1.KlassifisertInntektMåned
import java.time.LocalDate
import java.time.YearMonth

fun Route.inntektV3(
behandlingsInntektsGetter: BehandlingsInntektsGetter,
personOppslag: PersonOppslag,
inntektStore: InntektStore,
) {
route("/klassifisert") {
post {
withContext(IO) {
val klassifisertInntektRequestDto = call.receive<KlassifisertInntektRequestDto>()
val person = personOppslag.hentPerson(klassifisertInntektRequestDto.personIdentifikator)
val inntektparametre =
Inntektparametre(
aktørId = person.aktørId,
fødselsnummer = person.fødselsnummer,
regelkontekst = klassifisertInntektRequestDto.regelkontekst,
beregningsdato = klassifisertInntektRequestDto.beregningsDato,
).apply {
opptjeningsperiode.førsteMåned = klassifisertInntektRequestDto.periodeFraOgMed
opptjeningsperiode.sisteAvsluttendeKalenderMåned = klassifisertInntektRequestDto.periodeTilOgMed
}
val klassifisertInntekt =
behandlingsInntektsGetter.getKlassifisertInntekt(
inntektparametre,
call.callId,
)
val manueltRedigert = inntektStore.getManueltRedigert(InntektId(klassifisertInntekt.inntektsId))

call.respond(
HttpStatusCode.OK,
mapToKlassifisertInntektResponseDto(klassifisertInntekt, manueltRedigert),
)
}
}
}
}

data class KlassifisertInntektRequestDto(
val personIdentifikator: String,
val regelkontekst: RegelKontekst,
val beregningsDato: LocalDate,
val periodeFraOgMed: YearMonth,
val periodeTilOgMed: YearMonth,
)

data class KlassifisertInntektResponseDto(
val inntektsId: String,
val inntektsListe: List<KlassifisertInntektMåned>,
val manueltRedigert: Boolean? = false,
val begrunnelseManueltRedigert: String? = null,
val sisteAvsluttendeKalenderMåned: YearMonth,
)

private fun mapToKlassifisertInntektResponseDto(
inntekt: Inntekt,
manueltRedigert: ManueltRedigert?,
): KlassifisertInntektResponseDto =
KlassifisertInntektResponseDto(
inntektsId = inntekt.inntektsId,
inntektsListe = inntekt.inntektsListe,
manueltRedigert = inntekt.manueltRedigert,
begrunnelseManueltRedigert = manueltRedigert?.begrunnelse,
sisteAvsluttendeKalenderMåned = inntekt.sisteAvsluttendeKalenderMåned,
)
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import no.nav.dagpenger.inntekt.opptjeningsperiode.Opptjeningsperiode
import no.nav.dagpenger.inntekt.v1.SpesifisertInntekt
import java.time.LocalDate
import java.time.LocalDateTime
import java.time.YearMonth
import java.time.ZoneOffset
import java.time.ZonedDateTime

Expand All @@ -29,7 +30,7 @@ interface InntektStore {

fun markerInntektBrukt(inntektId: InntektId): Int

fun getInntektMedPersonFnr(inntektId: InntektId): StoredInntektMedFnr
fun getStoredInntektMedMetadata(inntektId: InntektId): StoredInntektMedMetadata
}

data class Inntektparametre(
Expand Down Expand Up @@ -66,13 +67,15 @@ data class InntektPersonMapping(

data class ManueltRedigert(
val redigertAv: String,
val begrunnelse: String? = null,
) {
companion object {
fun from(
bool: Boolean,
redigertAv: String,
begrunnelse: String? = null,
) = when (bool) {
true -> ManueltRedigert(redigertAv)
true -> ManueltRedigert(redigertAv, begrunnelse)
false -> null
}
}
Expand Down Expand Up @@ -102,12 +105,20 @@ data class InntektId(
}
}

data class StoredInntektMedFnr(
data class StoredInntektMedMetadata(
val inntektId: InntektId,
val inntekt: InntektkomponentResponse,
val manueltRedigert: Boolean,
val timestamp: LocalDateTime? = null,
val fødselsnummer: String,
val beregningsdato: LocalDate,
val storedInntektPeriode: StoredInntektPeriode?,
val begrunnelse: String? = null,
)

data class StoredInntektPeriode(
val fraOgMed: YearMonth?,
val tilOgMed: YearMonth?,
)

class InntektNotFoundException(
Expand Down
Loading
Loading