Skip to content

Commit 53828e7

Browse files
vskjefstJMLindsethArselanSultani
committed
Lagre inntekt (WiP, squash før merge)
Co-authored-by: John Martin Lindseth <[email protected]> Co-authored-by: Arselan Sultani <[email protected]>
1 parent d25cace commit 53828e7

File tree

10 files changed

+187
-49
lines changed

10 files changed

+187
-49
lines changed

buildSrc/src/main/kotlin/common.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import org.gradle.api.tasks.testing.logging.TestExceptionFormat
2-
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
32
import org.gradle.api.tasks.testing.logging.TestLogEvent
3+
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
44

55
plugins {
66
kotlin("jvm")

dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/Application.kt

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -47,15 +47,16 @@ fun main() {
4747
val cachedInntektsGetter = BehandlingsInntektsGetter(inntektskomponentHttpClient, postgresInntektStore)
4848
// Marks inntekt as used
4949
val subsumsjonBruktDataConsumer =
50-
KafkaSubsumsjonBruktDataConsumer(config, postgresInntektStore).apply {
51-
listen()
52-
}.also {
53-
Runtime.getRuntime().addShutdownHook(
54-
Thread {
55-
it.stop()
56-
},
57-
)
58-
}
50+
KafkaSubsumsjonBruktDataConsumer(config, postgresInntektStore)
51+
.apply {
52+
listen()
53+
}.also {
54+
Runtime.getRuntime().addShutdownHook(
55+
Thread {
56+
it.stop()
57+
},
58+
)
59+
}
5960

6061
// Provides a HTTP API for getting inntekt
6162
embeddedServer(Netty, port = config.application.httpPort) {

dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/db/InntektStore.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ interface InntektStore {
1818

1919
fun getBeregningsdato(inntektId: InntektId): LocalDate
2020

21+
fun getInntektPersonMapping(inntektId: String): InntektPersonMapping
22+
2123
fun storeInntekt(
2224
command: StoreInntektCommand,
2325
created: ZonedDateTime = ZonedDateTime.now(ZoneOffset.UTC),
@@ -52,6 +54,16 @@ data class StoreInntektCommand(
5254
val manueltRedigert: ManueltRedigert? = null,
5355
)
5456

57+
data class InntektPersonMapping(
58+
val inntektId: InntektId,
59+
val aktoerId: String,
60+
val fnr: String? = null,
61+
val kontekstId: String,
62+
val beregningsdato: LocalDate,
63+
val timestamp: LocalDateTime,
64+
val kontekstType: String,
65+
)
66+
5567
data class ManueltRedigert(
5668
val redigertAv: String,
5769
) {

dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/db/PostgresInntektStore.kt

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,30 @@ internal class PostgresInntektStore(
9393
}
9494
}
9595

96+
override fun getInntektPersonMapping(inntektId: String): InntektPersonMapping {
97+
@Language("sql")
98+
val statement = "SELECT * FROM inntekt_V1_person_mapping WHERE inntektId = :inntektId)".trimMargin()
99+
100+
return using(sessionOf(dataSource)) { session ->
101+
session.run(
102+
queryOf(
103+
statement,
104+
mapOf("inntektId" to inntektId),
105+
).map { row ->
106+
InntektPersonMapping(
107+
inntektId = InntektId(row.string("inntektid")),
108+
aktoerId = row.string("aktorid"),
109+
fnr = row.string("fnr"),
110+
kontekstId = row.string("kontekstid"),
111+
beregningsdato = row.zonedDateTime("beregningsdato").toLocalDate(),
112+
timestamp = row.zonedDateTime("timestamp").toLocalDateTime(),
113+
kontekstType = row.string("konteksttype"),
114+
)
115+
}.asSingle,
116+
) ?: throw InntektNotFoundException("Inntekt with id $inntektId not found.")
117+
}
118+
}
119+
96120
override fun getBeregningsdato(inntektId: InntektId): LocalDate {
97121
@Language("sql")
98122
val statement =

dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/mapping/GUIInntektsKomponentResponse.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ data class GUIInntekt(
2121
)
2222

2323
data class Inntektsmottaker(
24-
val pnr: String?,
24+
val fnr: String?,
2525
val navn: String?,
2626
)
2727

dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/mapping/MapFromGUIInntekt.kt

Lines changed: 72 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,18 @@
11
package no.nav.dagpenger.inntekt.mapping
22

33
import de.huxhorn.sulky.ulid.ULID
4-
import mu.KotlinLogging
54
import no.nav.dagpenger.inntekt.db.DetachedInntekt
65
import no.nav.dagpenger.inntekt.db.InntektId
76
import no.nav.dagpenger.inntekt.db.StoredInntekt
7+
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.Aktoer
8+
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.AktoerType
89
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.ArbeidsInntektInformasjon
910
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.ArbeidsInntektMaaned
1011
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.Inntekt
1112
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.InntektkomponentResponse
1213
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.TilleggInformasjon
1314
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.TilleggInformasjonsDetaljer
14-
15-
private val logg = KotlinLogging.logger {}
16-
private val sikkerlogg = KotlinLogging.logger("tjenestekall.MapFromGUIInntekt")
15+
import java.time.LocalDateTime.now
1716

1817
fun mapToStoredInntekt(guiInntekt: GUIInntekt): StoredInntekt =
1918
StoredInntekt(
@@ -26,6 +25,17 @@ fun mapToStoredInntekt(guiInntekt: GUIInntekt): StoredInntekt =
2625
guiInntekt.manueltRedigert,
2726
)
2827

28+
fun mapToStoredInntekt(
29+
inntekterDto: InntekterDto,
30+
inntektId: String,
31+
): StoredInntekt =
32+
StoredInntekt(
33+
inntektId = InntektId(id = inntektId),
34+
inntekt = mapToInntektkomponentResponse(inntekterDto),
35+
manueltRedigert = true,
36+
timestamp = now(),
37+
)
38+
2939
fun mapToDetachedInntekt(guiInntekt: GUIInntekt): DetachedInntekt =
3040
DetachedInntekt(
3141
InntektkomponentResponse(
@@ -36,13 +46,66 @@ fun mapToDetachedInntekt(guiInntekt: GUIInntekt): DetachedInntekt =
3646
guiInntekt.manueltRedigert,
3747
)
3848

39-
private fun mapToArbeidsInntektMaaneder(arbeidsMaaneder: List<GUIArbeidsInntektMaaned>?): List<ArbeidsInntektMaaned>? {
40-
return arbeidsMaaneder?.map { GUIarbeidsInntektMaaned ->
49+
private fun mapToInntektkomponentResponse(inntekterDto: InntekterDto): InntektkomponentResponse {
50+
val arbeidsInntektMaaneder: MutableList<ArbeidsInntektMaaned> = mutableListOf()
51+
52+
inntekterDto.virksomheter.forEach { virksomhet ->
53+
arbeidsInntektMaaneder.addAll(
54+
virksomhet.inntekter?.map {
55+
ArbeidsInntektMaaned(
56+
it.aarMaaned,
57+
virksomhet.avvikListe,
58+
ArbeidsInntektInformasjon(
59+
virksomhet.inntekter.map { inntektMaaned ->
60+
Inntekt(
61+
inntektMaaned.belop,
62+
inntektMaaned.inntektskilde,
63+
inntektMaaned.beskrivelse,
64+
inntektMaaned.inntektskilde,
65+
inntektMaaned.inntektsstatus,
66+
inntektMaaned.inntektsperiodetype ?: "Maaned",
67+
inntektMaaned.leveringstidspunkt,
68+
inntektMaaned.opptjeningsland,
69+
inntektMaaned.opptjeningsperiode,
70+
inntektMaaned.skattemessigBosattLand,
71+
inntektMaaned.utbetaltIMaaned,
72+
// TODO: Er det mottaker som skal brukes her?
73+
mapToAktoerNaturligIdent(inntekterDto.mottaker.fnr),
74+
// TODO: Er det virksomhet som skal brukes her?
75+
mapToAktoerOrganisasjon(virksomhet),
76+
mapToAktoerOrganisasjon(virksomhet),
77+
mapToAktoerNaturligIdent(inntekterDto.mottaker.fnr),
78+
inntektMaaned.inngaarIGrunnlagForTrekk,
79+
inntektMaaned.utloeserArbeidsgiveravgift,
80+
inntektMaaned.informasjonsstatus,
81+
inntektMaaned.inntektType,
82+
inntektMaaned.tilleggsinformasjon,
83+
)
84+
},
85+
),
86+
)
87+
} ?: listOf(),
88+
)
89+
}
90+
91+
return InntektkomponentResponse(
92+
arbeidsInntektMaaneder,
93+
mapToAktoerNaturligIdent(inntekterDto.mottaker.fnr),
94+
)
95+
}
96+
97+
private fun mapToAktoerOrganisasjon(virksomhet: Virksomhet): Aktoer = Aktoer(AktoerType.ORGANISASJON, virksomhet.virksomhetsnummer)
98+
99+
private fun mapToAktoerNaturligIdent(fnr: String?): Aktoer =
100+
Aktoer(AktoerType.NATURLIG_IDENT, fnr ?: throw IllegalArgumentException("Fødselsenummer mangler"))
101+
102+
private fun mapToArbeidsInntektMaaneder(arbeidsMaaneder: List<GUIArbeidsInntektMaaned>?): List<ArbeidsInntektMaaned>? =
103+
arbeidsMaaneder?.map { guiArbeidsInntektMaaned ->
41104
ArbeidsInntektMaaned(
42-
GUIarbeidsInntektMaaned.aarMaaned,
43-
GUIarbeidsInntektMaaned.avvikListe,
105+
guiArbeidsInntektMaaned.aarMaaned,
106+
guiArbeidsInntektMaaned.avvikListe,
44107
ArbeidsInntektInformasjon(
45-
GUIarbeidsInntektMaaned.arbeidsInntektInformasjon?.inntektListe?.map { inntekt ->
108+
guiArbeidsInntektMaaned.arbeidsInntektInformasjon?.inntektListe?.map { inntekt ->
46109
val datagrunnlagForVerdikode: DatagrunnlagKlassifisering = dataGrunnlag(inntekt.verdikode)
47110
Inntekt(
48111
inntekt.beloep,
@@ -78,4 +141,3 @@ private fun mapToArbeidsInntektMaaneder(arbeidsMaaneder: List<GUIArbeidsInntektM
78141
),
79142
)
80143
}
81-
}

dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/mapping/MapToInntektFrontend.kt

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,17 @@ import no.nav.dagpenger.inntekt.inntektskomponenten.v1.Avvik
55
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.InntektBeskrivelse
66
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.InntektType
77
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.InntektkomponentResponse
8+
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.Periode
89
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.TilleggInformasjon
910
import java.math.BigDecimal
1011
import java.time.YearMonth
1112

1213
fun InntektkomponentResponse.mapToFrontend(
1314
person: Inntektsmottaker,
1415
organisasjonsInfoListe: MutableList<OrganisasjonNavnOgIdMapping>,
15-
): InntekterResponse {
16+
): InntekterDto {
1617
val inntekt = arbeidsInntektMaaned
17-
val virksomhetListe: MutableList<Virksomhet> = mutableListOf()
18+
val virksomheter: MutableList<Virksomhet> = mutableListOf()
1819

1920
inntekt?.forEach { arbeidsInntektMaaned ->
2021
val inntektsInformasjon = arbeidsInntektMaaned.arbeidsInntektInformasjon
@@ -34,10 +35,12 @@ fun InntektkomponentResponse.mapToFrontend(
3435
fordel = inntekt.fordel,
3536
beskrivelse = inntekt.beskrivelse,
3637
inntektsstatus = inntekt.inntektsstatus,
38+
inntektsperiodetype = inntekt.inntektsperiodetype,
3739
utbetaltIMaaned = inntekt.utbetaltIMaaned,
3840
inntektType = inntekt.inntektType,
3941
leveringstidspunkt = inntekt.leveringstidspunkt,
4042
opptjeningsland = inntekt.opptjeningsland,
43+
opptjeningsperiode = inntekt.opptjeningsperiode,
4144
skattemessigBosattLand = inntekt.skattemessigBosattLand,
4245
inntektsinnsender = inntekt.inntektsinnsender,
4346
virksomhet = inntekt.virksomhet,
@@ -50,7 +53,7 @@ fun InntektkomponentResponse.mapToFrontend(
5053
)
5154

5255
val eksisterendeVirksomhet =
53-
virksomhetListe.find { it.virksomhetsnummer == virksomhet?.identifikator }
56+
virksomheter.find { it.virksomhetsnummer == virksomhet?.identifikator }
5457
if (eksisterendeVirksomhet != null) {
5558
eksisterendeVirksomhet.inntekter?.addAll(inntekter)
5659
eksisterendeVirksomhet.periode =
@@ -60,7 +63,7 @@ fun InntektkomponentResponse.mapToFrontend(
6063
)
6164
eksisterendeVirksomhet.totalBeløp = eksisterendeVirksomhet.inntekter.sumOf { it.belop }
6265
} else {
63-
virksomhetListe.add(
66+
virksomheter.add(
6467
Virksomhet(
6568
virksomhetsnummer = virksomhet?.identifikator ?: "",
6669
virksomhetsnavn = virksomhetNavn,
@@ -79,14 +82,14 @@ fun InntektkomponentResponse.mapToFrontend(
7982
}
8083
}
8184

82-
return InntekterResponse(
83-
virksomhetsinntekt = virksomhetListe,
85+
return InntekterDto(
86+
virksomheter = virksomheter,
8487
mottaker = person,
8588
)
8689
}
8790

88-
data class InntekterResponse(
89-
val virksomhetsinntekt: List<Virksomhet>,
91+
data class InntekterDto(
92+
val virksomheter: List<Virksomhet>,
9093
val mottaker: Inntektsmottaker,
9194
)
9295

@@ -110,8 +113,10 @@ data class InntektMaaned(
110113
val beskrivelse: InntektBeskrivelse,
111114
val inntektskilde: String,
112115
val inntektsstatus: String,
116+
val inntektsperiodetype: String?,
113117
val leveringstidspunkt: YearMonth? = null,
114118
val opptjeningsland: String? = null,
119+
val opptjeningsperiode: Periode? = null,
115120
val skattemessigBosattLand: String? = null,
116121
val utbetaltIMaaned: YearMonth,
117122
val inntektsinnsender: Aktoer? = null,

dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/v1/UklassifisertInntektRoute.kt

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import no.nav.dagpenger.inntekt.inntektskomponenten.v1.AktoerType
2828
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.InntektkomponentRequest
2929
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.InntektskomponentClient
3030
import no.nav.dagpenger.inntekt.mapping.GUIInntekt
31+
import no.nav.dagpenger.inntekt.mapping.InntekterDto
3132
import no.nav.dagpenger.inntekt.mapping.Inntektsmottaker
3233
import no.nav.dagpenger.inntekt.mapping.OrganisasjonNavnOgIdMapping
3334
import no.nav.dagpenger.inntekt.mapping.dataGrunnlagKlassifiseringToVerdikode
@@ -167,6 +168,39 @@ fun Route.uklassifisertInntekt(
167168
}
168169
}
169170
}
171+
post {
172+
withContext(Dispatchers.IO) {
173+
val inntektId = call.parameters["inntektId"]!!
174+
mapToStoredInntekt(
175+
inntekterDto = call.receive<InntekterDto>(),
176+
inntektId = inntektId,
177+
).let {
178+
val person = personOppslag.hentPerson(it.inntekt.ident.identifikator)
179+
val inntektPersonMapping = inntektStore.getInntektPersonMapping(inntektId)
180+
inntektStore.storeInntekt(
181+
StoreInntektCommand(
182+
inntektparametre =
183+
Inntektparametre(
184+
aktørId = person.aktørId,
185+
fødselsnummer = person.fødselsnummer,
186+
regelkontekst = RegelKontekst(inntektPersonMapping.kontekstId, inntektPersonMapping.kontekstType),
187+
beregningsdato = inntektPersonMapping.beregningsdato,
188+
),
189+
inntekt = it.inntekt,
190+
manueltRedigert =
191+
ManueltRedigert.from(
192+
true,
193+
call.getSubject(),
194+
),
195+
),
196+
)
197+
}.let {
198+
call.respond(HttpStatusCode.OK, it.inntektId)
199+
}.also {
200+
inntektKorrigeringCounter.inc()
201+
}
202+
}
203+
}
170204
}
171205

172206
route("/uklassifisert/uncached/{aktørId}/{kontekstType}/{kontekstId}/{beregningsDato}") {

0 commit comments

Comments
 (0)