Skip to content
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
2 changes: 1 addition & 1 deletion buildSrc/src/main/kotlin/common.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import org.gradle.api.tasks.testing.logging.TestExceptionFormat
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import org.gradle.api.tasks.testing.logging.TestLogEvent
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
kotlin("jvm")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,15 +47,16 @@ fun main() {
val cachedInntektsGetter = BehandlingsInntektsGetter(inntektskomponentHttpClient, postgresInntektStore)
// Marks inntekt as used
val subsumsjonBruktDataConsumer =
KafkaSubsumsjonBruktDataConsumer(config, postgresInntektStore).apply {
listen()
}.also {
Runtime.getRuntime().addShutdownHook(
Thread {
it.stop()
},
)
}
KafkaSubsumsjonBruktDataConsumer(config, postgresInntektStore)
.apply {
listen()
}.also {
Runtime.getRuntime().addShutdownHook(
Thread {
it.stop()
},
)
}

// Provides a HTTP API for getting inntekt
embeddedServer(Netty, port = config.application.httpPort) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ interface InntektStore {

fun getBeregningsdato(inntektId: InntektId): LocalDate

fun getInntektPersonMapping(inntektId: String): InntektPersonMapping

fun storeInntekt(
command: StoreInntektCommand,
created: ZonedDateTime = ZonedDateTime.now(ZoneOffset.UTC),
Expand Down Expand Up @@ -52,6 +54,16 @@ data class StoreInntektCommand(
val manueltRedigert: ManueltRedigert? = null,
)

data class InntektPersonMapping(
val inntektId: InntektId,
val aktoerId: String,
val fnr: String? = null,
val kontekstId: String,
val beregningsdato: LocalDate,
val timestamp: LocalDateTime,
val kontekstType: String,
)

data class ManueltRedigert(
val redigertAv: String,
) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,30 @@ internal class PostgresInntektStore(
}
}

override fun getInntektPersonMapping(inntektId: String): InntektPersonMapping {
@Language("sql")
val statement = "SELECT * FROM inntekt_V1_person_mapping WHERE inntektId = :inntektId)".trimMargin()

return using(sessionOf(dataSource)) { session ->
session.run(
queryOf(
statement,
mapOf("inntektId" to inntektId),
).map { row ->
InntektPersonMapping(
inntektId = InntektId(row.string("inntektid")),
aktoerId = row.string("aktorid"),
fnr = row.string("fnr"),
kontekstId = row.string("kontekstid"),
beregningsdato = row.zonedDateTime("beregningsdato").toLocalDate(),
timestamp = row.zonedDateTime("timestamp").toLocalDateTime(),
kontekstType = row.string("konteksttype"),
)
}.asSingle,
) ?: throw InntektNotFoundException("Inntekt with id $inntektId not found.")
}
}

override fun getBeregningsdato(inntektId: InntektId): LocalDate {
@Language("sql")
val statement =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ data class GUIInntekt(
)

data class Inntektsmottaker(
val pnr: String?,
val fnr: String?,
val navn: String?,
)

Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,18 @@
package no.nav.dagpenger.inntekt.mapping

import de.huxhorn.sulky.ulid.ULID
import mu.KotlinLogging
import no.nav.dagpenger.inntekt.db.DetachedInntekt
import no.nav.dagpenger.inntekt.db.InntektId
import no.nav.dagpenger.inntekt.db.StoredInntekt
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.Aktoer
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.AktoerType
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.ArbeidsInntektInformasjon
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.ArbeidsInntektMaaned
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.Inntekt
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.InntektkomponentResponse
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.TilleggInformasjon
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.TilleggInformasjonsDetaljer

private val logg = KotlinLogging.logger {}
private val sikkerlogg = KotlinLogging.logger("tjenestekall.MapFromGUIInntekt")
import java.time.LocalDateTime.now

fun mapToStoredInntekt(guiInntekt: GUIInntekt): StoredInntekt =
StoredInntekt(
Expand All @@ -26,6 +25,17 @@ fun mapToStoredInntekt(guiInntekt: GUIInntekt): StoredInntekt =
guiInntekt.manueltRedigert,
)

fun mapToStoredInntekt(
inntekterDto: InntekterDto,
inntektId: String,
): StoredInntekt =
StoredInntekt(
inntektId = InntektId(id = inntektId),
inntekt = mapToInntektkomponentResponse(inntekterDto),
manueltRedigert = true,
timestamp = now(),
)

fun mapToDetachedInntekt(guiInntekt: GUIInntekt): DetachedInntekt =
DetachedInntekt(
InntektkomponentResponse(
Expand All @@ -36,13 +46,66 @@ fun mapToDetachedInntekt(guiInntekt: GUIInntekt): DetachedInntekt =
guiInntekt.manueltRedigert,
)

private fun mapToArbeidsInntektMaaneder(arbeidsMaaneder: List<GUIArbeidsInntektMaaned>?): List<ArbeidsInntektMaaned>? {
return arbeidsMaaneder?.map { GUIarbeidsInntektMaaned ->
private fun mapToInntektkomponentResponse(inntekterDto: InntekterDto): InntektkomponentResponse {
val arbeidsInntektMaaneder: MutableList<ArbeidsInntektMaaned> = mutableListOf()

inntekterDto.virksomheter.forEach { virksomhet ->
arbeidsInntektMaaneder.addAll(
virksomhet.inntekter?.map {
ArbeidsInntektMaaned(
it.aarMaaned,
virksomhet.avvikListe,
ArbeidsInntektInformasjon(
virksomhet.inntekter.map { inntektMaaned ->
Inntekt(
inntektMaaned.belop,
inntektMaaned.inntektskilde,
inntektMaaned.beskrivelse,
inntektMaaned.inntektskilde,
inntektMaaned.inntektsstatus,
inntektMaaned.inntektsperiodetype ?: "Maaned",
inntektMaaned.leveringstidspunkt,
inntektMaaned.opptjeningsland,
inntektMaaned.opptjeningsperiode,
inntektMaaned.skattemessigBosattLand,
inntektMaaned.utbetaltIMaaned,
// TODO: Er det mottaker som skal brukes her?
mapToAktoerNaturligIdent(inntekterDto.mottaker.fnr),
// TODO: Er det virksomhet som skal brukes her?
mapToAktoerOrganisasjon(virksomhet),
mapToAktoerOrganisasjon(virksomhet),
mapToAktoerNaturligIdent(inntekterDto.mottaker.fnr),
inntektMaaned.inngaarIGrunnlagForTrekk,
inntektMaaned.utloeserArbeidsgiveravgift,
inntektMaaned.informasjonsstatus,
inntektMaaned.inntektType,
inntektMaaned.tilleggsinformasjon,
)
},
),
)
} ?: listOf(),
)
}

return InntektkomponentResponse(
arbeidsInntektMaaneder,
mapToAktoerNaturligIdent(inntekterDto.mottaker.fnr),
)
}

private fun mapToAktoerOrganisasjon(virksomhet: Virksomhet): Aktoer = Aktoer(AktoerType.ORGANISASJON, virksomhet.virksomhetsnummer)

private fun mapToAktoerNaturligIdent(fnr: String?): Aktoer =
Aktoer(AktoerType.NATURLIG_IDENT, fnr ?: throw IllegalArgumentException("Fødselsenummer mangler"))

private fun mapToArbeidsInntektMaaneder(arbeidsMaaneder: List<GUIArbeidsInntektMaaned>?): List<ArbeidsInntektMaaned>? =
arbeidsMaaneder?.map { guiArbeidsInntektMaaned ->
ArbeidsInntektMaaned(
GUIarbeidsInntektMaaned.aarMaaned,
GUIarbeidsInntektMaaned.avvikListe,
guiArbeidsInntektMaaned.aarMaaned,
guiArbeidsInntektMaaned.avvikListe,
ArbeidsInntektInformasjon(
GUIarbeidsInntektMaaned.arbeidsInntektInformasjon?.inntektListe?.map { inntekt ->
guiArbeidsInntektMaaned.arbeidsInntektInformasjon?.inntektListe?.map { inntekt ->
val datagrunnlagForVerdikode: DatagrunnlagKlassifisering = dataGrunnlag(inntekt.verdikode)
Inntekt(
inntekt.beloep,
Expand Down Expand Up @@ -78,4 +141,3 @@ private fun mapToArbeidsInntektMaaneder(arbeidsMaaneder: List<GUIArbeidsInntektM
),
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,17 @@ import no.nav.dagpenger.inntekt.inntektskomponenten.v1.Avvik
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.InntektBeskrivelse
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.InntektType
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.InntektkomponentResponse
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.Periode
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.TilleggInformasjon
import java.math.BigDecimal
import java.time.YearMonth

fun InntektkomponentResponse.mapToFrontend(
person: Inntektsmottaker,
organisasjonsInfoListe: MutableList<OrganisasjonNavnOgIdMapping>,
): InntekterResponse {
): InntekterDto {
val inntekt = arbeidsInntektMaaned
val virksomhetListe: MutableList<Virksomhet> = mutableListOf()
val virksomheter: MutableList<Virksomhet> = mutableListOf()

inntekt?.forEach { arbeidsInntektMaaned ->
val inntektsInformasjon = arbeidsInntektMaaned.arbeidsInntektInformasjon
Expand All @@ -34,10 +35,12 @@ fun InntektkomponentResponse.mapToFrontend(
fordel = inntekt.fordel,
beskrivelse = inntekt.beskrivelse,
inntektsstatus = inntekt.inntektsstatus,
inntektsperiodetype = inntekt.inntektsperiodetype,
utbetaltIMaaned = inntekt.utbetaltIMaaned,
inntektType = inntekt.inntektType,
leveringstidspunkt = inntekt.leveringstidspunkt,
opptjeningsland = inntekt.opptjeningsland,
opptjeningsperiode = inntekt.opptjeningsperiode,
skattemessigBosattLand = inntekt.skattemessigBosattLand,
inntektsinnsender = inntekt.inntektsinnsender,
virksomhet = inntekt.virksomhet,
Expand All @@ -50,7 +53,7 @@ fun InntektkomponentResponse.mapToFrontend(
)

val eksisterendeVirksomhet =
virksomhetListe.find { it.virksomhetsnummer == virksomhet?.identifikator }
virksomheter.find { it.virksomhetsnummer == virksomhet?.identifikator }
if (eksisterendeVirksomhet != null) {
eksisterendeVirksomhet.inntekter?.addAll(inntekter)
eksisterendeVirksomhet.periode =
Expand All @@ -60,7 +63,7 @@ fun InntektkomponentResponse.mapToFrontend(
)
eksisterendeVirksomhet.totalBeløp = eksisterendeVirksomhet.inntekter.sumOf { it.belop }
} else {
virksomhetListe.add(
virksomheter.add(
Virksomhet(
virksomhetsnummer = virksomhet?.identifikator ?: "",
virksomhetsnavn = virksomhetNavn,
Expand All @@ -79,14 +82,14 @@ fun InntektkomponentResponse.mapToFrontend(
}
}

return InntekterResponse(
virksomhetsinntekt = virksomhetListe,
return InntekterDto(
virksomheter = virksomheter,
mottaker = person,
)
}

data class InntekterResponse(
val virksomhetsinntekt: List<Virksomhet>,
data class InntekterDto(
val virksomheter: List<Virksomhet>,
val mottaker: Inntektsmottaker,
)

Expand All @@ -110,8 +113,10 @@ data class InntektMaaned(
val beskrivelse: InntektBeskrivelse,
val inntektskilde: String,
val inntektsstatus: String,
val inntektsperiodetype: String?,
val leveringstidspunkt: YearMonth? = null,
val opptjeningsland: String? = null,
val opptjeningsperiode: Periode? = null,
val skattemessigBosattLand: String? = null,
val utbetaltIMaaned: YearMonth,
val inntektsinnsender: Aktoer? = null,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import no.nav.dagpenger.inntekt.inntektskomponenten.v1.AktoerType
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.InntektkomponentRequest
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.InntektskomponentClient
import no.nav.dagpenger.inntekt.mapping.GUIInntekt
import no.nav.dagpenger.inntekt.mapping.InntekterDto
import no.nav.dagpenger.inntekt.mapping.Inntektsmottaker
import no.nav.dagpenger.inntekt.mapping.OrganisasjonNavnOgIdMapping
import no.nav.dagpenger.inntekt.mapping.dataGrunnlagKlassifiseringToVerdikode
Expand Down Expand Up @@ -167,6 +168,39 @@ fun Route.uklassifisertInntekt(
}
}
}
post {
withContext(Dispatchers.IO) {
val inntektId = call.parameters["inntektId"]!!
mapToStoredInntekt(
inntekterDto = call.receive<InntekterDto>(),
inntektId = inntektId,
).let {
val person = personOppslag.hentPerson(it.inntekt.ident.identifikator)
val inntektPersonMapping = inntektStore.getInntektPersonMapping(inntektId)
inntektStore.storeInntekt(
StoreInntektCommand(
inntektparametre =
Inntektparametre(
aktørId = person.aktørId,
fødselsnummer = person.fødselsnummer,
regelkontekst = RegelKontekst(inntektPersonMapping.kontekstId, inntektPersonMapping.kontekstType),
beregningsdato = inntektPersonMapping.beregningsdato,
),
inntekt = it.inntekt,
manueltRedigert =
ManueltRedigert.from(
true,
call.getSubject(),
),
),
)
}.let {
call.respond(HttpStatusCode.OK, it.inntektId)
}.also {
inntektKorrigeringCounter.inc()
}
}
}
}

route("/uklassifisert/uncached/{aktørId}/{kontekstType}/{kontekstId}/{beregningsDato}") {
Expand Down
Loading
Loading