From c4b4a97b6e0508f9553409862f86d1bc62098170 Mon Sep 17 00:00:00 2001 From: Vegard Skjefstad Date: Wed, 14 May 2025 15:11:17 +0200 Subject: [PATCH] =?UTF-8?q?Lagre=20inntekt=20(WiP,=20squash=20f=C3=B8r=20m?= =?UTF-8?q?erge)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: John Martin Lindseth Co-authored-by: Arselan Sultani --- buildSrc/src/main/kotlin/common.gradle.kts | 2 +- .../no/nav/dagpenger/inntekt/Application.kt | 19 +++-- .../nav/dagpenger/inntekt/db/InntektStore.kt | 12 +++ .../inntekt/db/PostgresInntektStore.kt | 24 ++++++ .../mapping/GUIInntektsKomponentResponse.kt | 2 +- .../inntekt/mapping/MapFromGUIInntekt.kt | 82 ++++++++++++++++--- .../inntekt/mapping/MapToInntektFrontend.kt | 21 +++-- .../inntekt/v1/UklassifisertInntektRoute.kt | 34 ++++++++ .../mapping/MapToInntektFrontendTest.kt | 24 +++--- .../v1/UklassifisertInntektRouteTest.kt | 16 ++-- 10 files changed, 187 insertions(+), 49 deletions(-) diff --git a/buildSrc/src/main/kotlin/common.gradle.kts b/buildSrc/src/main/kotlin/common.gradle.kts index e3f09123..668e8de4 100644 --- a/buildSrc/src/main/kotlin/common.gradle.kts +++ b/buildSrc/src/main/kotlin/common.gradle.kts @@ -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") diff --git a/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/Application.kt b/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/Application.kt index 3588f3ed..d5b5f442 100644 --- a/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/Application.kt +++ b/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/Application.kt @@ -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) { diff --git a/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/db/InntektStore.kt b/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/db/InntektStore.kt index 937a1f81..f70001b2 100644 --- a/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/db/InntektStore.kt +++ b/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/db/InntektStore.kt @@ -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), @@ -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, ) { diff --git a/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/db/PostgresInntektStore.kt b/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/db/PostgresInntektStore.kt index 18c5427a..f9dd5194 100644 --- a/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/db/PostgresInntektStore.kt +++ b/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/db/PostgresInntektStore.kt @@ -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 = diff --git a/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/mapping/GUIInntektsKomponentResponse.kt b/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/mapping/GUIInntektsKomponentResponse.kt index de84e601..90764c45 100644 --- a/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/mapping/GUIInntektsKomponentResponse.kt +++ b/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/mapping/GUIInntektsKomponentResponse.kt @@ -21,7 +21,7 @@ data class GUIInntekt( ) data class Inntektsmottaker( - val pnr: String?, + val fnr: String?, val navn: String?, ) diff --git a/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/mapping/MapFromGUIInntekt.kt b/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/mapping/MapFromGUIInntekt.kt index f592a541..22a39245 100644 --- a/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/mapping/MapFromGUIInntekt.kt +++ b/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/mapping/MapFromGUIInntekt.kt @@ -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( @@ -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( @@ -36,13 +46,66 @@ fun mapToDetachedInntekt(guiInntekt: GUIInntekt): DetachedInntekt = guiInntekt.manueltRedigert, ) -private fun mapToArbeidsInntektMaaneder(arbeidsMaaneder: List?): List? { - return arbeidsMaaneder?.map { GUIarbeidsInntektMaaned -> +private fun mapToInntektkomponentResponse(inntekterDto: InntekterDto): InntektkomponentResponse { + val arbeidsInntektMaaneder: MutableList = 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?): List? = + 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, @@ -78,4 +141,3 @@ private fun mapToArbeidsInntektMaaneder(arbeidsMaaneder: List, -): InntekterResponse { +): InntekterDto { val inntekt = arbeidsInntektMaaned - val virksomhetListe: MutableList = mutableListOf() + val virksomheter: MutableList = mutableListOf() inntekt?.forEach { arbeidsInntektMaaned -> val inntektsInformasjon = arbeidsInntektMaaned.arbeidsInntektInformasjon @@ -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, @@ -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 = @@ -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, @@ -79,14 +82,14 @@ fun InntektkomponentResponse.mapToFrontend( } } - return InntekterResponse( - virksomhetsinntekt = virksomhetListe, + return InntekterDto( + virksomheter = virksomheter, mottaker = person, ) } -data class InntekterResponse( - val virksomhetsinntekt: List, +data class InntekterDto( + val virksomheter: List, val mottaker: Inntektsmottaker, ) @@ -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, diff --git a/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/v1/UklassifisertInntektRoute.kt b/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/v1/UklassifisertInntektRoute.kt index 59e7aa43..7729bcb0 100644 --- a/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/v1/UklassifisertInntektRoute.kt +++ b/dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/v1/UklassifisertInntektRoute.kt @@ -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 @@ -167,6 +168,39 @@ fun Route.uklassifisertInntekt( } } } + post { + withContext(Dispatchers.IO) { + val inntektId = call.parameters["inntektId"]!! + mapToStoredInntekt( + inntekterDto = call.receive(), + 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}") { diff --git a/dp-inntekt-api/src/test/kotlin/no/nav/dagpenger/inntekt/mapping/MapToInntektFrontendTest.kt b/dp-inntekt-api/src/test/kotlin/no/nav/dagpenger/inntekt/mapping/MapToInntektFrontendTest.kt index f1280550..0b65c446 100644 --- a/dp-inntekt-api/src/test/kotlin/no/nav/dagpenger/inntekt/mapping/MapToInntektFrontendTest.kt +++ b/dp-inntekt-api/src/test/kotlin/no/nav/dagpenger/inntekt/mapping/MapToInntektFrontendTest.kt @@ -166,7 +166,7 @@ val inntektkomponentResponse = val mottaker = Inntektsmottaker( - pnr = "2044350291600", + fnr = "2044350291600", navn = "Ola Nordmann", ) @@ -191,16 +191,16 @@ class MapToInntektFrontendTest { organisasjonNavnOgIdMappingForTesting, ) - assertEquals(2, mappedToInntektFrontend.virksomhetsinntekt.size) + assertEquals(2, mappedToInntektFrontend.virksomheter.size) assertEquals(mottaker, mappedToInntektFrontend.mottaker) - assertTrue { mappedToInntektFrontend.virksomhetsinntekt.any { it.virksomhetsnummer == "896929119" } } - assertTrue { mappedToInntektFrontend.virksomhetsinntekt.any { it.virksomhetsnummer == "896929120" } } - assertFalse { mappedToInntektFrontend.virksomhetsinntekt.any { it.virksomhetsnummer == "8969291001" } } + assertTrue { mappedToInntektFrontend.virksomheter.any { it.virksomhetsnummer == "896929119" } } + assertTrue { mappedToInntektFrontend.virksomheter.any { it.virksomhetsnummer == "896929120" } } + assertFalse { mappedToInntektFrontend.virksomheter.any { it.virksomhetsnummer == "8969291001" } } assertEquals( 2, - mappedToInntektFrontend.virksomhetsinntekt + mappedToInntektFrontend.virksomheter .filter { it.virksomhetsnummer == "896929119" }[0] .inntekter ?.size, @@ -208,14 +208,14 @@ class MapToInntektFrontendTest { assertEquals( BigDecimal(100000), - mappedToInntektFrontend.virksomhetsinntekt + mappedToInntektFrontend.virksomheter .filter { it.virksomhetsnummer == "896929119" }[0] .totalBeløp, ) assertEquals( 1, - mappedToInntektFrontend.virksomhetsinntekt + mappedToInntektFrontend.virksomheter .filter { it.virksomhetsnummer == "896929120" }[0] .inntekter ?.size, @@ -223,7 +223,7 @@ class MapToInntektFrontendTest { assertEquals( BigDecimal(50000), - mappedToInntektFrontend.virksomhetsinntekt + mappedToInntektFrontend.virksomheter .filter { it.virksomhetsnummer == "896929120" }[0] .totalBeløp, ) @@ -332,9 +332,9 @@ class MapToInntektFrontendTest { val mapTilFrontendMedNullVirksomhet = inntektkomponentResponseMedTomVirksomhet.mapToFrontend(mottaker, organisasjonNavnOgIdMappingForTesting) - assertEquals(3, mapTilFrontendMedNullVirksomhet.virksomhetsinntekt.size) - assertEquals(2, mapTilFrontendMedNullVirksomhet.virksomhetsinntekt.filter { it.virksomhetsnummer == "" }.size) - assertEquals(1, mapTilFrontendMedNullVirksomhet.virksomhetsinntekt.filter { it.virksomhetsnummer == "896929120" }.size) + assertEquals(3, mapTilFrontendMedNullVirksomhet.virksomheter.size) + assertEquals(2, mapTilFrontendMedNullVirksomhet.virksomheter.filter { it.virksomhetsnummer == "" }.size) + assertEquals(1, mapTilFrontendMedNullVirksomhet.virksomheter.filter { it.virksomhetsnummer == "896929120" }.size) jacksonObjectMapper.writeValueAsString(mapTilFrontendMedNullVirksomhet) println( diff --git a/dp-inntekt-api/src/test/kotlin/no/nav/dagpenger/inntekt/v1/UklassifisertInntektRouteTest.kt b/dp-inntekt-api/src/test/kotlin/no/nav/dagpenger/inntekt/v1/UklassifisertInntektRouteTest.kt index b374fe7b..4332cf08 100644 --- a/dp-inntekt-api/src/test/kotlin/no/nav/dagpenger/inntekt/v1/UklassifisertInntektRouteTest.kt +++ b/dp-inntekt-api/src/test/kotlin/no/nav/dagpenger/inntekt/v1/UklassifisertInntektRouteTest.kt @@ -33,7 +33,7 @@ import no.nav.dagpenger.inntekt.mapping.GUIArbeidsInntektMaaned import no.nav.dagpenger.inntekt.mapping.GUIInntekt import no.nav.dagpenger.inntekt.mapping.GUIInntektsKomponentResponse import no.nav.dagpenger.inntekt.mapping.InntektMedVerdikode -import no.nav.dagpenger.inntekt.mapping.InntekterResponse +import no.nav.dagpenger.inntekt.mapping.InntekterDto import no.nav.dagpenger.inntekt.oppslag.Person import no.nav.dagpenger.inntekt.oppslag.PersonOppslag import no.nav.dagpenger.inntekt.oppslag.enhetsregister.EnhetsregisterClient @@ -487,13 +487,13 @@ internal class UklassifisertInntektRouteTest { assertEquals(HttpStatusCode.OK, response.status) val storedInntekt = - jacksonObjectMapper.readValue(response.bodyAsText()) - assertEquals(2, storedInntekt.virksomhetsinntekt.size) - assertEquals(4, storedInntekt.virksomhetsinntekt[0].inntekter?.size) - assertEquals("1111111", storedInntekt.virksomhetsinntekt.first().virksomhetsnummer) - assertEquals("Test Org", storedInntekt.virksomhetsinntekt.first().virksomhetsnavn) - assertEquals("2222222", storedInntekt.virksomhetsinntekt[1].virksomhetsnummer) - assertEquals("", storedInntekt.virksomhetsinntekt[1].virksomhetsnavn) + jacksonObjectMapper.readValue(response.bodyAsText()) + assertEquals(2, storedInntekt.virksomheter.size) + assertEquals(4, storedInntekt.virksomheter[0].inntekter?.size) + assertEquals("1111111", storedInntekt.virksomheter.first().virksomhetsnummer) + assertEquals("Test Org", storedInntekt.virksomheter.first().virksomhetsnavn) + assertEquals("2222222", storedInntekt.virksomheter[1].virksomhetsnummer) + assertEquals("", storedInntekt.virksomheter[1].virksomhetsnavn) } } }