Skip to content

Commit 4f5621a

Browse files
vskjefstArselanSultaniJMLindseth
committed
Legg til endepunkt for lagring av inntekt
Dette endepunktet skal brukes av den nye frontenden. Inkludert mapping fra dto til intern klasse. Co-authored-by: Vegard Skjefstad <[email protected]> Co-authored-by: Arselan.Sultani <[email protected]> Co-authored-by: John Martin Lindseth <[email protected]>
1 parent 8df1321 commit 4f5621a

File tree

13 files changed

+750
-77
lines changed

13 files changed

+750
-77
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 aktørId: 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+
aktørId = 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/MapFromGUIInntekt.kt

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
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
@@ -12,9 +11,6 @@ import no.nav.dagpenger.inntekt.inntektskomponenten.v1.InntektkomponentResponse
1211
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.TilleggInformasjon
1312
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.TilleggInformasjonsDetaljer
1413

15-
private val logg = KotlinLogging.logger {}
16-
private val sikkerlogg = KotlinLogging.logger("tjenestekall.MapFromGUIInntekt")
17-
1814
fun mapToStoredInntekt(guiInntekt: GUIInntekt): StoredInntekt =
1915
StoredInntekt(
2016
guiInntekt.inntektId ?: InntektId(ULID().nextULID()),
@@ -36,13 +32,13 @@ fun mapToDetachedInntekt(guiInntekt: GUIInntekt): DetachedInntekt =
3632
guiInntekt.manueltRedigert,
3733
)
3834

39-
private fun mapToArbeidsInntektMaaneder(arbeidsMaaneder: List<GUIArbeidsInntektMaaned>?): List<ArbeidsInntektMaaned>? {
40-
return arbeidsMaaneder?.map { GUIarbeidsInntektMaaned ->
35+
private fun mapToArbeidsInntektMaaneder(arbeidsMaaneder: List<GUIArbeidsInntektMaaned>?): List<ArbeidsInntektMaaned>? =
36+
arbeidsMaaneder?.map { guiArbeidsInntektMaaned ->
4137
ArbeidsInntektMaaned(
42-
GUIarbeidsInntektMaaned.aarMaaned,
43-
GUIarbeidsInntektMaaned.avvikListe,
38+
guiArbeidsInntektMaaned.aarMaaned,
39+
guiArbeidsInntektMaaned.avvikListe,
4440
ArbeidsInntektInformasjon(
45-
GUIarbeidsInntektMaaned.arbeidsInntektInformasjon?.inntektListe?.map { inntekt ->
41+
guiArbeidsInntektMaaned.arbeidsInntektInformasjon?.inntektListe?.map { inntekt ->
4642
val datagrunnlagForVerdikode: DatagrunnlagKlassifisering = dataGrunnlag(inntekt.verdikode)
4743
Inntekt(
4844
inntekt.beloep,
@@ -78,4 +74,3 @@ private fun mapToArbeidsInntektMaaneder(arbeidsMaaneder: List<GUIArbeidsInntektM
7874
),
7975
)
8076
}
81-
}

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

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,18 @@ 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
10+
import no.nav.dagpenger.inntekt.v1.models.InntekterDto
911
import java.math.BigDecimal
1012
import java.time.YearMonth
1113

1214
fun InntektkomponentResponse.mapToFrontend(
1315
person: Inntektsmottaker,
14-
organisasjonsInfoListe: MutableList<OrganisasjonNavnOgIdMapping>,
15-
): InntekterResponse {
16+
organisasjonsInfoListe: List<OrganisasjonNavnOgIdMapping>,
17+
): InntekterDto {
1618
val inntekt = arbeidsInntektMaaned
17-
val virksomhetListe: MutableList<Virksomhet> = mutableListOf()
19+
val virksomheter: MutableList<Virksomhet> = mutableListOf()
1820

1921
inntekt?.forEach { arbeidsInntektMaaned ->
2022
val inntektsInformasjon = arbeidsInntektMaaned.arbeidsInntektInformasjon
@@ -34,10 +36,12 @@ fun InntektkomponentResponse.mapToFrontend(
3436
fordel = inntekt.fordel,
3537
beskrivelse = inntekt.beskrivelse,
3638
inntektsstatus = inntekt.inntektsstatus,
39+
inntektsperiodetype = inntekt.inntektsperiodetype,
3740
utbetaltIMaaned = inntekt.utbetaltIMaaned,
3841
inntektType = inntekt.inntektType,
3942
leveringstidspunkt = inntekt.leveringstidspunkt,
4043
opptjeningsland = inntekt.opptjeningsland,
44+
opptjeningsperiode = inntekt.opptjeningsperiode,
4145
skattemessigBosattLand = inntekt.skattemessigBosattLand,
4246
inntektsinnsender = inntekt.inntektsinnsender,
4347
virksomhet = inntekt.virksomhet,
@@ -50,7 +54,7 @@ fun InntektkomponentResponse.mapToFrontend(
5054
)
5155

5256
val eksisterendeVirksomhet =
53-
virksomhetListe.find { it.virksomhetsnummer == virksomhet?.identifikator }
57+
virksomheter.find { it.virksomhetsnummer == virksomhet?.identifikator }
5458
if (eksisterendeVirksomhet != null) {
5559
eksisterendeVirksomhet.inntekter?.addAll(inntekter)
5660
eksisterendeVirksomhet.periode =
@@ -60,7 +64,7 @@ fun InntektkomponentResponse.mapToFrontend(
6064
)
6165
eksisterendeVirksomhet.totalBeløp = eksisterendeVirksomhet.inntekter.sumOf { it.belop }
6266
} else {
63-
virksomhetListe.add(
67+
virksomheter.add(
6468
Virksomhet(
6569
virksomhetsnummer = virksomhet?.identifikator ?: "",
6670
virksomhetsnavn = virksomhetNavn,
@@ -79,17 +83,12 @@ fun InntektkomponentResponse.mapToFrontend(
7983
}
8084
}
8185

82-
return InntekterResponse(
83-
virksomhetsinntekt = virksomhetListe,
86+
return InntekterDto(
87+
virksomheter = virksomheter,
8488
mottaker = person,
8589
)
8690
}
8791

88-
data class InntekterResponse(
89-
val virksomhetsinntekt: List<Virksomhet>,
90-
val mottaker: Inntektsmottaker,
91-
)
92-
9392
data class Virksomhet(
9493
val virksomhetsnummer: String,
9594
val virksomhetsnavn: String,
@@ -110,10 +109,13 @@ data class InntektMaaned(
110109
val beskrivelse: InntektBeskrivelse,
111110
val inntektskilde: String,
112111
val inntektsstatus: String,
112+
val inntektsperiodetype: String?,
113113
val leveringstidspunkt: YearMonth? = null,
114114
val opptjeningsland: String? = null,
115+
val opptjeningsperiode: Periode? = null,
115116
val skattemessigBosattLand: String? = null,
116117
val utbetaltIMaaned: YearMonth,
118+
val opplysningspliktig: Aktoer? = null,
117119
val inntektsinnsender: Aktoer? = null,
118120
val virksomhet: Aktoer? = null,
119121
val inntektsmottaker: Aktoer? = null,

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

Lines changed: 49 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import kotlinx.coroutines.Dispatchers
1818
import kotlinx.coroutines.withContext
1919
import mu.KotlinLogging
2020
import mu.withLoggingContext
21+
import no.nav.dagpenger.inntekt.db.InntektId
2122
import no.nav.dagpenger.inntekt.db.InntektNotFoundException
2223
import no.nav.dagpenger.inntekt.db.InntektStore
2324
import no.nav.dagpenger.inntekt.db.Inntektparametre
@@ -39,7 +40,10 @@ import no.nav.dagpenger.inntekt.oppslag.Person
3940
import no.nav.dagpenger.inntekt.oppslag.PersonOppslag
4041
import no.nav.dagpenger.inntekt.oppslag.enhetsregister.EnhetsregisterClient
4142
import no.nav.dagpenger.inntekt.opptjeningsperiode.Opptjeningsperiode
43+
import no.nav.dagpenger.inntekt.v1.models.InntekterDto
44+
import no.nav.dagpenger.inntekt.v1.models.mapToStoredInntekt
4245
import java.time.LocalDate
46+
import kotlin.coroutines.CoroutineContext
4347

4448
private val logger = KotlinLogging.logger {}
4549
const val INNTEKT_KORRIGERING = "inntekt_korrigering"
@@ -69,11 +73,12 @@ fun Route.uklassifisertInntekt(
6973
inntektStore: InntektStore,
7074
personOppslag: PersonOppslag,
7175
enhetsregisterClient: EnhetsregisterClient,
76+
coroutineContext: CoroutineContext = Dispatchers.IO,
7277
) {
7378
authenticate("azure") {
7479
route("/uklassifisert/{aktørId}/{kontekstType}/{kontekstId}/{beregningsDato}") {
7580
get {
76-
withContext(Dispatchers.IO) {
81+
withContext(coroutineContext) {
7782
call.withInntektRequest("GET /uklassifisert/") {
7883
val person = personOppslag.hentPerson(this.aktørId)
7984
inntektStore
@@ -96,7 +101,7 @@ fun Route.uklassifisertInntekt(
96101
}
97102
}
98103
post {
99-
withContext(Dispatchers.IO) {
104+
withContext(coroutineContext) {
100105
call.withInntektRequest("POST /uklassifisert/") {
101106
val person = personOppslag.hentPerson(this.aktørId)
102107
val guiInntekt = call.receive<GUIInntekt>()
@@ -138,12 +143,8 @@ fun Route.uklassifisertInntekt(
138143

139144
route("/uklassifisert/{inntektId}") {
140145
get {
141-
withContext(Dispatchers.IO) {
142-
val inntektId =
143-
call.parameters["inntektId"]?.let {
144-
no.nav.dagpenger.inntekt.db
145-
.InntektId(it)
146-
} ?: throw IllegalArgumentException("Missing inntektId")
146+
withContext(coroutineContext) {
147+
val inntektId = InntektId(call.parameters["inntektId"]!!)
147148
inntektStore
148149
.getInntektMedPersonFnr(inntektId)
149150
.let {
@@ -167,12 +168,49 @@ fun Route.uklassifisertInntekt(
167168
}
168169
}
169170
}
171+
post {
172+
withContext(coroutineContext) {
173+
val inntektId = call.parameters["inntektId"]!!
174+
call
175+
.receive<InntekterDto>()
176+
.mapToStoredInntekt(
177+
inntektId = inntektId,
178+
).let {
179+
val inntektPersonMapping = inntektStore.getInntektPersonMapping(inntektId)
180+
inntektStore.storeInntekt(
181+
StoreInntektCommand(
182+
inntektparametre =
183+
Inntektparametre(
184+
aktørId = inntektPersonMapping.aktørId,
185+
fødselsnummer = it.inntekt.ident.identifikator,
186+
regelkontekst =
187+
RegelKontekst(
188+
inntektPersonMapping.kontekstId,
189+
inntektPersonMapping.kontekstType,
190+
),
191+
beregningsdato = inntektPersonMapping.beregningsdato,
192+
),
193+
inntekt = it.inntekt,
194+
manueltRedigert =
195+
ManueltRedigert.from(
196+
true,
197+
call.getSubject(),
198+
),
199+
),
200+
)
201+
}.let {
202+
call.respond(HttpStatusCode.OK, it.inntektId.id)
203+
}.also {
204+
inntektKorrigeringCounter.inc()
205+
}
206+
}
207+
}
170208
}
171209

172210
route("/uklassifisert/uncached/{aktørId}/{kontekstType}/{kontekstId}/{beregningsDato}") {
173211
get {
174212
val callId = call.callId
175-
withContext(Dispatchers.IO) {
213+
withContext(coroutineContext) {
176214
call.withInntektRequest("GET /uklassifisert/uncached/") {
177215
val person = personOppslag.hentPerson(this.aktørId)
178216
val opptjeningsperiode = Opptjeningsperiode(this.beregningsDato)
@@ -195,7 +233,7 @@ fun Route.uklassifisertInntekt(
195233
}
196234

197235
post {
198-
withContext(Dispatchers.IO) {
236+
withContext(coroutineContext) {
199237
call.withInntektRequest("POST /uklassifisert/uncached/") {
200238
val guiInntekt = call.receive<GUIInntekt>()
201239
val person = personOppslag.hentPerson(this.aktørId)
@@ -237,9 +275,7 @@ fun Route.uklassifisertInntekt(
237275
}
238276
route("/verdikoder") {
239277
get {
240-
withContext(Dispatchers.IO) {
241-
call.respond(HttpStatusCode.OK, dataGrunnlagKlassifiseringToVerdikode.values)
242-
}
278+
call.respond(HttpStatusCode.OK, dataGrunnlagKlassifiseringToVerdikode.values)
243279
}
244280
}
245281
}

0 commit comments

Comments
 (0)