From 504fba89741728b116f391f0977a63097b01d91f Mon Sep 17 00:00:00 2001 From: Mads Opheim <71336041+madsop-nav@users.noreply.github.com> Date: Wed, 11 Sep 2024 04:18:51 +0200 Subject: [PATCH] =?UTF-8?q?EY-4328:=20Flyttar=20over=20og=20flettar=20inn?= =?UTF-8?q?=20fr=C3=A5=20libs-repoet=20og=20hit.=20Har=20kun=20tatt=20med?= =?UTF-8?q?=20det=20som=20er=20ulikt,=20og=20gjort=20s=C3=A5=20f=C3=A5=20e?= =?UTF-8?q?ndringar=20som=20mogleg=20for=20=C3=A5=20f=C3=A5=20det=20s?= =?UTF-8?q?=C3=A5=20likt=20som=20mogleg.=20Samk=C3=B8yring=20og=20forenkli?= =?UTF-8?q?ng=20f=C3=A5r=20komme=20etterp=C3=A5=20(#323)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/release-common.yaml | 88 +++ README.md | 51 ++ buildSrc/build.gradle.kts | 12 +- .../src/main/kotlin/etterlatte.gradle.kts | 22 + common/build.gradle.kts | 52 ++ .../barnepensjon/Barnepensjon.kt | 49 ++ .../innsendtsoeknad/common/InnsendtSoeknad.kt | 46 ++ .../innsendtsoeknad/common/Opplysning.kt | 33 + .../innsendtsoeknad/common/Opplysninger.kt | 429 ++++++++++ .../common/innsendtsoeknad/common/PDFMal.kt | 3 + .../common/innsendtsoeknad/common/Personer.kt | 201 +++++ .../innsendtsoeknad/common/SoeknadType.kt | 15 + .../omstillingsstoenad/Omstillingsstoenad.kt | 33 + .../inntektsjustering/Inntektsjustering.kt | 14 + .../libs/common/person/Foedselsnummer.kt | 118 +++ .../common/person/FoedselsnummerValidator.kt | 57 ++ .../pdl/hentAdressebeskyttelse.graphql | 10 + .../common/InnsendtSoeknadTest.kt | 63 ++ .../innsendtsoeknad/common/PersonerTest.kt | 132 ++++ .../test/kotlin/person/FoedselsnummerTest.kt | 86 ++ .../person/FoedselsnummerValidatorTest.kt | 63 ++ .../test/resources/soeknad/barnepensjon.json | 210 +++++ .../soeknad/barnepensjon_utland.json | 307 ++++++++ .../resources/soeknad/omstillingsstoenad.json | 734 ++++++++++++++++++ gradle/libs.versions.toml | 9 + settings.gradle.kts | 3 +- 26 files changed, 2836 insertions(+), 4 deletions(-) create mode 100644 .github/workflows/release-common.yaml create mode 100644 buildSrc/src/main/kotlin/etterlatte.gradle.kts create mode 100644 common/build.gradle.kts create mode 100644 common/src/main/kotlin/no/nav/etterlatte/libs/common/innsendtsoeknad/barnepensjon/Barnepensjon.kt create mode 100644 common/src/main/kotlin/no/nav/etterlatte/libs/common/innsendtsoeknad/common/InnsendtSoeknad.kt create mode 100644 common/src/main/kotlin/no/nav/etterlatte/libs/common/innsendtsoeknad/common/Opplysning.kt create mode 100644 common/src/main/kotlin/no/nav/etterlatte/libs/common/innsendtsoeknad/common/Opplysninger.kt create mode 100644 common/src/main/kotlin/no/nav/etterlatte/libs/common/innsendtsoeknad/common/PDFMal.kt create mode 100644 common/src/main/kotlin/no/nav/etterlatte/libs/common/innsendtsoeknad/common/Personer.kt create mode 100644 common/src/main/kotlin/no/nav/etterlatte/libs/common/innsendtsoeknad/common/SoeknadType.kt create mode 100644 common/src/main/kotlin/no/nav/etterlatte/libs/common/innsendtsoeknad/omstillingsstoenad/Omstillingsstoenad.kt create mode 100644 common/src/main/kotlin/no/nav/etterlatte/libs/common/inntektsjustering/Inntektsjustering.kt create mode 100644 common/src/main/kotlin/no/nav/etterlatte/libs/common/person/Foedselsnummer.kt create mode 100644 common/src/main/kotlin/no/nav/etterlatte/libs/common/person/FoedselsnummerValidator.kt create mode 100644 common/src/main/resources/pdl/hentAdressebeskyttelse.graphql create mode 100644 common/src/test/kotlin/innsendtsoeknad/common/InnsendtSoeknadTest.kt create mode 100644 common/src/test/kotlin/innsendtsoeknad/common/PersonerTest.kt create mode 100644 common/src/test/kotlin/person/FoedselsnummerTest.kt create mode 100644 common/src/test/kotlin/person/FoedselsnummerValidatorTest.kt create mode 100644 common/src/test/resources/soeknad/barnepensjon.json create mode 100644 common/src/test/resources/soeknad/barnepensjon_utland.json create mode 100644 common/src/test/resources/soeknad/omstillingsstoenad.json diff --git a/.github/workflows/release-common.yaml b/.github/workflows/release-common.yaml new file mode 100644 index 00000000..75c62ec3 --- /dev/null +++ b/.github/workflows/release-common.yaml @@ -0,0 +1,88 @@ +name: Release common + +on: + workflow_dispatch: # Allow manually triggered workflow run + push: + paths: + - common + - gradle/libs.versions.toml + +jobs: + build: + name: Verification + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Setup Java + uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: 21 + cache: gradle + + # Build + - name: Test and build + run: ./gradlew :common:build + + release-dev: + name: Create Release - Dev + needs: build + runs-on: ubuntu-latest + permissions: + contents: write + packages: write + if: github.ref != 'refs/heads/main' + steps: + - name: Checkout code + uses: actions/checkout@v4 + - name: Setup Java + uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: 21 + cache: gradle + - name: Create Release + id: create_release + uses: elgohr/Github-Release-Action@v5 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + title: common.dev + prerelease: true + - name: Upload artifact + run: ./gradlew :common:publish -Pversion="dev.$(echo $GITHUB_SHA | cut -c 1-12).dev" + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + release: + name: Create Release + needs: build + runs-on: ubuntu-latest + permissions: + contents: write + packages: write + if: github.ref == 'refs/heads/main' + steps: + - name: Checkout code + uses: actions/checkout@v4 + - name: Setup Java + uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: 21 + cache: gradle + - name: Set release tag + run: | + export TAG_NAME="$(TZ="Europe/Oslo" date +%Y.%m.%d-%H.%M).$(echo $GITHUB_SHA | cut -c 1-12)" + echo "RELEASE_TAG=$TAG_NAME" >> $GITHUB_ENV + - name: Create Release + id: create_release + uses: elgohr/Github-Release-Action@v5 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + title: common.${{ env.RELEASE_TAG }} + - name: Upload artifact + run: ./gradlew :common:publish -Pversion="${{ env.RELEASE_TAG }}" + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/README.md b/README.md index 2cba5d26..7449a51c 100644 --- a/README.md +++ b/README.md @@ -134,3 +134,54 @@ Fant ikke ressurs -> 404 eller 204? Noe feilet -> 500 ``` + + +----- +# pensjon-etterlatte-libs + +Felles biblioteker for Team Etterlatte. + + +# Libs + +- [common](common) + + +# Kom i gang + +Pakkene som produseres ved release her lagres i Github Package Registry, som krever autentisering. +For å ta de i bruk som dependencies i et annet prosjekt er det enkleste er å lage et +[PAT (Personal Access Token)](https://github.com/settings/tokens). + +1. [Opprett PAT her](https://github.com/settings/tokens). I tilfelle lenken ikke fungerer går man til `Github -> Settings -> Developer settings -> Personal access tokens` +2. Huk av `read:packages`. Ikke legg til flere scopes enn nødvendig. +3. Autoriser navikt-organisasjonen for SSO ved å velge "Configure SSO" på tokenet +4. Tokenet legges i `.zshrc` med `export GITHUB_TOKEN=` + + +# Felles apper + +Alle apper som er felles for Team Etterlatte ligger i [etterlatte-pensjon-felles](https://github.com/navikt/pensjon-etterlatte-felles). + + +# Kafka / Rapids & Rivers + +Topic.yaml-filer er flyttet til [etterlatte-pensjon-felles](https://github.com/navikt/pensjon-etterlatte-felles). + + +# Bygg og release + + +En app bygges og deployes automatisk når en endring legges til i `main`. + +For å trigge **manuell deploy** kan du gå til `Actions -> (velg workflow) -> Run workflow from ` + + +# Henvendelser + +Spørsmål knyttet til koden eller prosjektet kan stilles som issues her på GitHub. + + +## For NAV-ansatte + +Interne henvendelser kan sendes via Slack i kanalen [#po-pensjon-team-etterlatte](https://nav-it.slack.com/archives/C01KJ597UAU). diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 4b9aeddf..8d09878c 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -1,5 +1,6 @@ -import ca.cutterslade.gradle.analyze.AnalyzeDependenciesTask import org.jetbrains.kotlin.gradle.tasks.KotlinCompile +import ca.cutterslade.gradle.analyze.AnalyzeDependenciesTask +import org.gradle.api.tasks.testing.logging.TestLogEvent plugins { `kotlin-dsl` @@ -28,15 +29,20 @@ tasks { gradleVersion = "8.10" } + withType { + useJUnitPlatform() + testLogging { + events(TestLogEvent.PASSED, TestLogEvent.SKIPPED, TestLogEvent.FAILED) + } + } + withType { kotlinOptions.jvmTarget = JavaVersion.VERSION_21.toString() } - java { sourceCompatibility = JavaVersion.VERSION_21 targetCompatibility = JavaVersion.VERSION_21 } - withType { warnUsedUndeclared = true warnUnusedDeclared = true diff --git a/buildSrc/src/main/kotlin/etterlatte.gradle.kts b/buildSrc/src/main/kotlin/etterlatte.gradle.kts new file mode 100644 index 00000000..34b424f8 --- /dev/null +++ b/buildSrc/src/main/kotlin/etterlatte.gradle.kts @@ -0,0 +1,22 @@ +import org.gradle.accessors.dm.LibrariesForLibs +import org.gradle.api.tasks.testing.logging.TestLogEvent + +val libs = the() + +plugins { + kotlin("jvm") + application +} + +repositories { + mavenCentral() +} + +tasks { + withType { + useJUnitPlatform() + testLogging { + events(TestLogEvent.PASSED, TestLogEvent.SKIPPED, TestLogEvent.FAILED) + } + } +} diff --git a/common/build.gradle.kts b/common/build.gradle.kts new file mode 100644 index 00000000..b76ad0e2 --- /dev/null +++ b/common/build.gradle.kts @@ -0,0 +1,52 @@ +plugins { + id("maven-publish") + id("etterlatte") +} + +dependencies { + api(kotlin("stdlib")) + api(kotlin("reflect")) + + api(libs.jacksonDatatypejsr310) + api(libs.jackson.datatypejdk8) + api(libs.jackson.modulekotlin) + + testImplementation(libs.jupiter.api) + testImplementation(libs.test.kotest.assertionscore) + testImplementation(libs.mockk) +} + +publishing { + repositories { + maven { + url = uri("https://maven.pkg.github.com/navikt/pensjon-etterlatte-felles") + credentials { + username = System.getenv("GITHUB_ACTOR") + password = System.getenv("GITHUB_TOKEN") + } + } + } + publications { + create("mavenJava") { + + pom { + name.set("common") + url.set("https://github.com/navikt/pensjon-etterlatte-felles") + + licenses { + license { + name.set("MIT License") + url.set("https://opensource.org/licenses/MIT") + } + } + + scm { + connection.set("scm:git:https://github.com/navikt/pensjon-etterlatte-felles.git") + developerConnection.set("scm:git:https://github.com/navikt/pensjon-etterlatte-felles.git") + url.set("https://github.com/navikt/pensjon-etterlatte-felles") + } + } + from(components["java"]) + } + } +} diff --git a/common/src/main/kotlin/no/nav/etterlatte/libs/common/innsendtsoeknad/barnepensjon/Barnepensjon.kt b/common/src/main/kotlin/no/nav/etterlatte/libs/common/innsendtsoeknad/barnepensjon/Barnepensjon.kt new file mode 100644 index 00000000..78b884b3 --- /dev/null +++ b/common/src/main/kotlin/no/nav/etterlatte/libs/common/innsendtsoeknad/barnepensjon/Barnepensjon.kt @@ -0,0 +1,49 @@ +package no.nav.etterlatte.libs.common.innsendtsoeknad.barnepensjon + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties +import java.time.LocalDate +import no.nav.etterlatte.libs.common.innsendtsoeknad.BankkontoType +import no.nav.etterlatte.libs.common.innsendtsoeknad.Kontaktinfo +import no.nav.etterlatte.libs.common.innsendtsoeknad.Spraak +import no.nav.etterlatte.libs.common.innsendtsoeknad.UtbetalingsInformasjon +import no.nav.etterlatte.libs.common.innsendtsoeknad.common.Barn +import no.nav.etterlatte.libs.common.innsendtsoeknad.common.BetingetOpplysning +import no.nav.etterlatte.libs.common.innsendtsoeknad.common.EnumSvar +import no.nav.etterlatte.libs.common.innsendtsoeknad.common.ImageTag +import no.nav.etterlatte.libs.common.innsendtsoeknad.common.Innsender +import no.nav.etterlatte.libs.common.innsendtsoeknad.common.InnsendtSoeknad +import no.nav.etterlatte.libs.common.innsendtsoeknad.common.Opplysning +import no.nav.etterlatte.libs.common.innsendtsoeknad.common.Person +import no.nav.etterlatte.libs.common.innsendtsoeknad.common.PersonType +import no.nav.etterlatte.libs.common.innsendtsoeknad.common.SoeknadType +import no.nav.etterlatte.libs.common.person.Foedselsnummer +import java.time.LocalDateTime + +@JsonIgnoreProperties(ignoreUnknown = true) +data class Barnepensjon( + override val imageTag: ImageTag, + override val spraak: Spraak, + override val innsender: Innsender, + override val harSamtykket: Opplysning, + override val utbetalingsInformasjon: BetingetOpplysning, UtbetalingsInformasjon>?, + override val soeker: Barn, + val foreldre: List, + val soesken: List, +) : InnsendtSoeknad { + override val versjon = "2" + override val type = SoeknadType.BARNEPENSJON + override val mottattDato: LocalDateTime = LocalDateTime.now() +} + +data class GjenlevendeForelder( + override val fornavn: Opplysning, + override val etternavn: Opplysning, + override val foedselsnummer: Opplysning, + override val foedselsdato: Opplysning? = null, + + val adresse: Opplysning, + val statsborgerskap: Opplysning, + val kontaktinfo: Kontaktinfo, +) : Person { + override val type = PersonType.GJENLEVENDE_FORELDER +} diff --git a/common/src/main/kotlin/no/nav/etterlatte/libs/common/innsendtsoeknad/common/InnsendtSoeknad.kt b/common/src/main/kotlin/no/nav/etterlatte/libs/common/innsendtsoeknad/common/InnsendtSoeknad.kt new file mode 100644 index 00000000..16186fef --- /dev/null +++ b/common/src/main/kotlin/no/nav/etterlatte/libs/common/innsendtsoeknad/common/InnsendtSoeknad.kt @@ -0,0 +1,46 @@ +package no.nav.etterlatte.libs.common.innsendtsoeknad.common + +import com.fasterxml.jackson.annotation.JsonGetter +import com.fasterxml.jackson.annotation.JsonSubTypes +import com.fasterxml.jackson.annotation.JsonTypeInfo +import no.nav.etterlatte.libs.common.innsendtsoeknad.BankkontoType +import no.nav.etterlatte.libs.common.innsendtsoeknad.Spraak +import no.nav.etterlatte.libs.common.innsendtsoeknad.UtbetalingsInformasjon +import no.nav.etterlatte.libs.common.innsendtsoeknad.barnepensjon.Barnepensjon +import no.nav.etterlatte.libs.common.innsendtsoeknad.omstillingsstoenad.Omstillingsstoenad +import java.time.LocalDateTime + +@JsonTypeInfo( + use = JsonTypeInfo.Id.NAME, + include = JsonTypeInfo.As.EXISTING_PROPERTY, + property = "type", +) +@JsonSubTypes( + JsonSubTypes.Type(value = Barnepensjon::class, name = "BARNEPENSJON"), + JsonSubTypes.Type(value = Omstillingsstoenad::class, name = "OMSTILLINGSSTOENAD"), +) +interface InnsendtSoeknad : PDFMal { + val versjon: String + val spraak: Spraak + val imageTag: ImageTag + val type: SoeknadType + val mottattDato: LocalDateTime + val innsender: Innsender + val soeker: Person + val harSamtykket: Opplysning + val utbetalingsInformasjon: BetingetOpplysning, UtbetalingsInformasjon>? + + @JsonGetter("template") + fun template(): String = "${type.name.lowercase()}_v$versjon" +} + +/** + * Docker Image Tag + * Gjør det mulig å vite hvilken versjon + */ +typealias ImageTag = String + +// Kan inneholde søknad for både omstillingsstønad og barnepensjon +data class SoeknadRequest( + val soeknader: List, +) diff --git a/common/src/main/kotlin/no/nav/etterlatte/libs/common/innsendtsoeknad/common/Opplysning.kt b/common/src/main/kotlin/no/nav/etterlatte/libs/common/innsendtsoeknad/common/Opplysning.kt new file mode 100644 index 00000000..bd552769 --- /dev/null +++ b/common/src/main/kotlin/no/nav/etterlatte/libs/common/innsendtsoeknad/common/Opplysning.kt @@ -0,0 +1,33 @@ +package no.nav.etterlatte.libs.common.innsendtsoeknad.common + +import java.time.LocalDate + +data class Opplysning( + val svar: T, + val spoersmaal: String? = null, +) + +data class BetingetOpplysning( + val svar: T, + val spoersmaal: String? = null, + val opplysning: R?, +) + +interface Svar { + val innhold: Any +} + +data class FritekstSvar( + override val innhold: String, +) : Svar + +data class DatoSvar( + override val innhold: LocalDate, +) : Svar + +data class EnumSvar>( + val verdi: E, + override val innhold: String, +) : Svar + +enum class JaNeiVetIkke { JA, NEI, VET_IKKE } diff --git a/common/src/main/kotlin/no/nav/etterlatte/libs/common/innsendtsoeknad/common/Opplysninger.kt b/common/src/main/kotlin/no/nav/etterlatte/libs/common/innsendtsoeknad/common/Opplysninger.kt new file mode 100644 index 00000000..8fe21070 --- /dev/null +++ b/common/src/main/kotlin/no/nav/etterlatte/libs/common/innsendtsoeknad/common/Opplysninger.kt @@ -0,0 +1,429 @@ +package no.nav.etterlatte.libs.common.innsendtsoeknad + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties +import com.fasterxml.jackson.annotation.JsonValue +import no.nav.etterlatte.libs.common.innsendtsoeknad.common.BetingetOpplysning +import no.nav.etterlatte.libs.common.innsendtsoeknad.common.DatoSvar +import no.nav.etterlatte.libs.common.innsendtsoeknad.common.EnumSvar +import no.nav.etterlatte.libs.common.innsendtsoeknad.common.FritekstSvar +import no.nav.etterlatte.libs.common.innsendtsoeknad.common.JaNeiVetIkke +import no.nav.etterlatte.libs.common.innsendtsoeknad.common.Opplysning + +data class Utenlandsadresse( + val land: Opplysning, + val adresse: Opplysning? = null, +) + +data class OppholdUtlandInformasjon( + val oppholdLand: Opplysning, + val oppholdFra: Opplysning? = null, + val oppholdTil: Opplysning? = null, +) + +data class UtbetalingsInformasjon( + val kontonummer: Opplysning? = null, + val utenlandskBankNavn: Opplysning? = null, + val utenlandskBankAdresse: Opplysning? = null, + val iban: Opplysning? = null, + val swift: Opplysning? = null, + val skattetrekk: Skattetrekk? = null, +) + +data class Skattetrekk( + val svar: Opplysning>? = null, + val trekk: Opplysning? = null, + val beskrivelse: Opplysning? = null, +) + +@JsonIgnoreProperties(ignoreUnknown = true) +data class Kontaktinfo( + val telefonnummer: Opplysning, +) + +enum class Spraak( + @get:JsonValue val verdi: String, +) { + NB("nb"), + NN("nn"), + EN("en"), +} + +enum class BankkontoType { NORSK, UTENLANDSK } + +enum class InntektType { ARBEIDSINNTEKT, PENSJON, KAPITALINNTEKT, ANDRE_YTELSER } + +enum class ForholdTilAvdoedeType { GIFT, SEPARERT, SAMBOER, SKILT, TIDLIGERE_SAMBOER } + +enum class OppholdUtlandType { BODD, ARBEIDET } + +enum class JobbStatusType { ARBEIDSTAKER, SELVSTENDIG, UNDER_UTDANNING, ARBEIDSSOEKER, INGEN } + +enum class JobbStatusTypeOMS { ARBEIDSTAKER, SELVSTENDIG, ETABLERER, TILBUD, UNDER_UTDANNING, ARBEIDSSOEKER, INGEN } + +enum class IngenJobb { + HJEMMEARBEIDENDE, + OMSORG_BARN, + OMSORG_NAERSTAAENDE, + FRIVILLIG_ARBEID, + ETABLERER_BEDRIFT, + SYK, + ANNET, +} + +enum class SagtOppEllerRedusertType { OPPSAGT, REDUSERT, NEI } + +enum class StudieformType { HELTID, DELTID } + +enum class StillingType { FAST, MIDLERTIDIG, SESONGARBEID, TILKALLINGSVIKAR } + +enum class OmsorgspersonType { GJENLEVENDE, VERGE, ANNET } + +enum class SivilstatusType { ENKE, ENSLIG, EKTESKAP, SAMBOERSKAP } + +enum class EndringAvInntektGrunnType { + OEKT_STILLINGSPROSENT, + REDUSERT_STILLINGSPROSENT, + PERMISJON_UTEN_LOENN, + LOENNSOEKNING, + ARBEIDSLEDIG, + SESONGARBEID, + BYTTE_AV_JOBB, + ANNEN_GRUNN, +} + +enum class PensjonEllerTrygdType { TJENESTEPENSJONSORDNING, UFOEREPENSJON_FRA_NAV, ALDERSPENSJON_FRA_NAV, PENSJON_FRA_UTLANDET } + +enum class PensjonsYtelseType { + AVTALEFESTET_PENSJON_OFFENTLIG, + AVTALEFESTET_PENSJON_PRIVAT, + SAERALDERSPENSJON, + UFOEREPENSJON, + ALDERSPENSJON, +} + +enum class InntektEllerUtbetalingType { + DAGSPENGER, + SYKEPENGER, + PLEIEPENGER, + SVANGERSKAPSPENGER, + FORELDREPENGER, + ARBEIDSAVKLARINGSPENGER, + KVALIFISERINGSSTOENAD, + KOMMUNAL_OMSORGSSTOENAD, + FOSTERHJEMSGODTGJOERING, + OMSORGSPENGER, + OPPLAERINGSPENGER, +} + +enum class SoekbareYtelserNAVType { + DAGSPENGER, + SYKEPENGER, + PLEIEPENGER, + SVANGERSKAPSPENGER, + FORELDREPENGER, + ARBEIDSAVKLARINGSPENGER, + KVALIFISERINGSSTOENAD, + KOMMUNAL_OMSORGSSTOENAD, + FOSTERHJEMSGODTGJOERING, + OMSORGSPENGER, + OPPLAERINGSPENGER, + UFOEREPENSJON, + ALDERSPENSJON, +} + +enum class SoekbareYtelserAndreType { + AVTALEFESTET_PENSJON_OFFENTLIG, + AVTALEFESTET_PENSJON_PRIVAT, + SAERALDERSPENSJON, + UFOEREPENSJON, + ALDERSPENSJON, +} + +enum class NorgeEllerUtlandType { NORGE, UTLAND } + +data class SamboerInntekt( + val inntektstype: Opplysning>>, + val samletBruttoinntektPrAar: Opplysning, +) + +data class ForholdTilAvdoede( + val relasjon: Opplysning>, + val datoForInngaattPartnerskap: Opplysning? = null, + val datoForInngaattSamboerskap: Opplysning? = null, + val datoForSkilsmisse: Opplysning? = null, + val datoForSamlivsbrudd: Opplysning? = null, + val fellesBarn: Opplysning>?, + val samboereMedFellesBarnFoerGiftemaal: Opplysning>? = null, + val tidligereGift: Opplysning>? = null, + val omsorgForBarn: Opplysning>? = null, + val mottokBidrag: BetingetOpplysning, Opplysning?>? = null, // Finner ikke igjen + val mottokEktefelleBidrag: Opplysning>? = null, // Finner ikke igjen? +) + +data class ForholdTilAvdoedeOMS( + val relasjon: Opplysning>, + val datoForInngaattPartnerskap: Opplysning? = null, + val datoForInngaattSamboerskap: Opplysning? = null, + val datoForSkilsmisse: Opplysning? = null, + val datoForSamlivsbrudd: Opplysning? = null, + val fellesBarn: Opplysning>?, + val samboereMedFellesBarnFoerGiftemaal: Opplysning>? = null, + val tidligereGift: Opplysning>? = null, + val mottokBidrag: BetingetOpplysning, Opplysning?>? = null, +) + +data class Utenlandsopphold( + val land: Opplysning, + val fraDato: Opplysning?, + val tilDato: Opplysning?, + val oppholdsType: Opplysning>>, + val medlemFolketrygd: Opplysning>, + val pensjonsutbetaling: Opplysning?, +) + +data class Naeringsinntekt( + val naeringsinntektPrAarFoerDoedsfall: Opplysning?, + val naeringsinntektVedDoedsfall: Opplysning>?, +) + +typealias AarstallForMilitaerTjeneste = FritekstSvar + +data class ArbeidOgUtdanning( + val dinSituasjon: Opplysning>>, + val arbeidsforhold: Opplysning>?, + val selvstendig: Opplysning>?, + val utdanning: Opplysning?, + val annet: Opplysning>?, +) + +data class ArbeidOgUtdanningOMS( + val dinSituasjon: Opplysning>>, + val arbeidsforhold: Opplysning>?, + val selvstendig: Opplysning>?, + val etablererVirksomhet: Opplysning?, + val tilbud: Opplysning?, + val arbeidssoeker: Opplysning?, + val utdanning: Opplysning?, + val annenSituasjon: Opplysning?, +) + +data class Utdanning( + val navn: Opplysning, + val startDato: Opplysning, + val sluttDato: Opplysning, +) + +data class UtdanningOMS( + val startDato: Opplysning, + val sluttDato: Opplysning, + val studiested: Opplysning, + val studie: Opplysning, + val studieform: Opplysning>, + val studieprosent: Opplysning?, + val godkjentUtdanning: Opplysning>, + val aktivitetsplan: Opplysning>?, +) + +typealias AnnenUtdanning = FritekstSvar + +enum class HoeyesteUtdanning { + GRUNNSKOLE, + VIDEREGAAENDE, + FAGBREV, + UNIVERSITET_OPPTIL_4_AAR, + UNIVERSITET_OVER_4_AAR, + INGEN, + ANNEN, +} + +typealias EndretInntektBegrunnelse = FritekstSvar + +data class SelvstendigNaeringsdrivende( + val firmanavn: Opplysning, + val orgnr: Opplysning, + val endretInntekt: BetingetOpplysning, Opplysning>, +) + +data class SelvstendigNaeringsdrivendeOMS( + val firmanavn: Opplysning, + val orgnr: Opplysning, + val arbeidsmengde: Opplysning, + val endretArbeidssituasjon: BetingetOpplysning, Opplysning?>, +) + +data class Arbeidstaker( + val arbeidsgiver: Opplysning, + val ansettelsesforhold: Opplysning>, + val stillingsprosent: Opplysning, + val endretInntekt: BetingetOpplysning, Opplysning>, +) + +data class ArbeidstakerOMS( + val arbeidsgiver: Opplysning, + val ansettelsesforhold: Opplysning>, + val arbeidsmengde: Opplysning, + val harSluttDato: Opplysning>?, + val sluttDato: Opplysning?, + val endretArbeidssituasjon: BetingetOpplysning, Opplysning?>, + val sagtOppEllerRedusert: Opplysning>? = null, // Venter på avklaring om den skal fjernes +) + +data class EtablererVirksomhet( + val virksomheten: Opplysning, + val orgnr: Opplysning, + val forretningsplan: Opplysning>, + val samarbeidMedNav: Opplysning>?, +) + +data class TilbudOmJobb( + val nyttArbeidssted: Opplysning, + val ansettelsesdato: Opplysning, + val ansettelsesforhold: Opplysning>, + val arbeidsmengde: Opplysning, + val harSluttdato: Opplysning>?, + val sluttdato: Opplysning?, + val aktivitetsplan: Opplysning>?, +) + +data class Arbeidssoeker( + val registrertArbeidssoeker: Opplysning>, + val aktivitetsplan: Opplysning>?, +) + +data class AnnenSituasjon( + val beskrivelse: Opplysning>>, + val annet: Opplysning?, +) + +data class InntektOgPensjon( + val loennsinntekt: Opplysning?, + val naeringsinntekt: Opplysning?, + val pensjonEllerUfoere: PensjonEllerUfoere?, + val inntektViaYtelserFraNAV: InntektViaYtelserFraNAV?, + val ingenInntekt: IngenInntekt?, + val ytelserNAV: YtelserNav, + val ytelserAndre: YtelserAndre, +) + +data class Loennsinntekt( + val norgeEllerUtland: Opplysning>>, + val norge: InntektSamlet?, + val utland: InntektSamlet?, + val endringAvInntekt: EndringAvInntekt, +) + +data class InntektSamlet( + val inntektAaretFoerDoedsfall: Opplysning?, + val inntektIFjor: TilDoedsfallOgAarsinntekt?, + val inntektIAar: TilDoedsfallOgAarsinntekt?, + val inntektNesteAar: Aarsinntekt?, + val jevntOpptjentNaeringsinntekt: JevntOpptjentNaeringsinntekt?, +) + +data class TilDoedsfallOgAarsinntekt( + val tilDoedsfall: Opplysning?, + val aarsinntekt: Opplysning?, +) + +data class Aarsinntekt( + val aarsinntekt: Opplysning?, +) + +data class JevntOpptjentNaeringsinntekt( + val svar: Opplysning>, + val beskrivelse: Opplysning?, +) + +data class EndringAvInntekt( + val fremtidigEndringAvInntekt: Opplysning>, + val grunn: Opplysning>?, + val annenGrunn: Opplysning?, +) + +data class PensjonEllerUfoere( + val pensjonstype: Opplysning>>, + val tjenestepensjonsordning: Tjenestepensjonsordning?, + val utland: Utland?, +) + +data class Tjenestepensjonsordning( + val type: Opplysning>, + val utbetaler: Opplysning, +) + +data class Utland( + val type: Opplysning?, + val land: Opplysning?, + val beloepMedValuta: Opplysning?, +) + +data class InntektViaYtelserFraNAV( + val ytelser: Opplysning>>, + val aktivitetsplan: Opplysning>?, +) + +data class IngenInntekt( + val svar: Opplysning>, + val beloep: Opplysning?, + val beskrivelse: Opplysning?, +) + +data class YtelserNav( + val soektOmYtelse: Opplysning>, + val soektYtelse: Opplysning>>?, +) + +data class YtelserAndre( + val soektOmYtelse: Opplysning>, + val soektYtelse: Opplysning>>?, + val pensjonsordning: Opplysning?, +) + +enum class Ytelser { + DAGPENGER, + SYKEPENGER, + PLEIEPENGER, + SVANGERSKAPSPENGER, + FORELDREPENGER, + ARBEIDSAVKLARINGSPENGER, + KVALIFISERINGSSTOENAD, + KOMMUNAL_OMSORGSSTONAD, + FOSTERHJEMSGODTGJOERING, + OMSORGSPENGER, + OPPLAERINGSPENGER, +} + +enum class Stoenader { + BARNETILSYN, + SKOLEPENGER, + TILLEGGSSTOENAD_BARNEPASS, + TILLEGGSSTOENAD_UTDANNING, +} + +typealias Pensjonsordning = FritekstSvar + +data class AndreYtelser( + val kravOmAnnenStonad: BetingetOpplysning, Opplysning>?>, + val annenPensjon: BetingetOpplysning, Opplysning?>, + val pensjonUtland: BetingetOpplysning, PensjonUtland?>, +) + +data class PensjonUtland( + val pensjonsType: Opplysning?, + val land: Opplysning?, + val bruttobeloepPrAar: Opplysning?, +) + +@JsonIgnoreProperties(ignoreUnknown = true) +data class OppholdUtland( + val land: Opplysning? = null, +) + +@JsonIgnoreProperties(ignoreUnknown = true) +data class OppholdUtlandOMS( + val bosattLand: Opplysning? = null, + val oppholderSegIUtlandet: Opplysning>? = null, + val oppholdsland: Opplysning? = null, + val oppholdFra: Opplysning? = null, + val oppholdTil: Opplysning? = null, +) diff --git a/common/src/main/kotlin/no/nav/etterlatte/libs/common/innsendtsoeknad/common/PDFMal.kt b/common/src/main/kotlin/no/nav/etterlatte/libs/common/innsendtsoeknad/common/PDFMal.kt new file mode 100644 index 00000000..62c9b2b7 --- /dev/null +++ b/common/src/main/kotlin/no/nav/etterlatte/libs/common/innsendtsoeknad/common/PDFMal.kt @@ -0,0 +1,3 @@ +package no.nav.etterlatte.libs.common.innsendtsoeknad.common + +interface PDFMal \ No newline at end of file diff --git a/common/src/main/kotlin/no/nav/etterlatte/libs/common/innsendtsoeknad/common/Personer.kt b/common/src/main/kotlin/no/nav/etterlatte/libs/common/innsendtsoeknad/common/Personer.kt new file mode 100644 index 00000000..9ae2908e --- /dev/null +++ b/common/src/main/kotlin/no/nav/etterlatte/libs/common/innsendtsoeknad/common/Personer.kt @@ -0,0 +1,201 @@ +package no.nav.etterlatte.libs.common.innsendtsoeknad.common + +import com.fasterxml.jackson.annotation.JsonSubTypes +import com.fasterxml.jackson.annotation.JsonTypeInfo +import java.time.LocalDate +import no.nav.etterlatte.libs.common.innsendtsoeknad.AarstallForMilitaerTjeneste +import no.nav.etterlatte.libs.common.innsendtsoeknad.AndreYtelser +import no.nav.etterlatte.libs.common.innsendtsoeknad.AnnenUtdanning +import no.nav.etterlatte.libs.common.innsendtsoeknad.ArbeidOgUtdanning +import no.nav.etterlatte.libs.common.innsendtsoeknad.ArbeidOgUtdanningOMS +import no.nav.etterlatte.libs.common.innsendtsoeknad.ForholdTilAvdoede +import no.nav.etterlatte.libs.common.innsendtsoeknad.ForholdTilAvdoedeOMS +import no.nav.etterlatte.libs.common.innsendtsoeknad.HoeyesteUtdanning +import no.nav.etterlatte.libs.common.innsendtsoeknad.InntektOgPensjon +import no.nav.etterlatte.libs.common.innsendtsoeknad.Kontaktinfo +import no.nav.etterlatte.libs.common.innsendtsoeknad.Naeringsinntekt +import no.nav.etterlatte.libs.common.innsendtsoeknad.OmsorgspersonType +import no.nav.etterlatte.libs.common.innsendtsoeknad.OppholdUtland +import no.nav.etterlatte.libs.common.innsendtsoeknad.OppholdUtlandInformasjon +import no.nav.etterlatte.libs.common.innsendtsoeknad.OppholdUtlandOMS +import no.nav.etterlatte.libs.common.innsendtsoeknad.SamboerInntekt +import no.nav.etterlatte.libs.common.innsendtsoeknad.SivilstatusType +import no.nav.etterlatte.libs.common.innsendtsoeknad.Utenlandsadresse +import no.nav.etterlatte.libs.common.innsendtsoeknad.Utenlandsopphold +import no.nav.etterlatte.libs.common.innsendtsoeknad.barnepensjon.GjenlevendeForelder +import no.nav.etterlatte.libs.common.person.Foedselsnummer + +@JsonTypeInfo( + use = JsonTypeInfo.Id.NAME, + include = JsonTypeInfo.As.EXISTING_PROPERTY, + property = "type", +) +@JsonSubTypes( + JsonSubTypes.Type(value = Gjenlevende::class, name = "GJENLEVENDE"), + JsonSubTypes.Type(value = GjenlevendeOMS::class, name = "GJENLEVENDE_OMS"), + JsonSubTypes.Type(value = GjenlevendeForelder::class, name = "GJENLEVENDE_FORELDER"), + JsonSubTypes.Type(value = Avdoed::class, name = "AVDOED"), + JsonSubTypes.Type(value = Samboer::class, name = "SAMBOER"), + JsonSubTypes.Type(value = Verge::class, name = "VERGE"), + JsonSubTypes.Type(value = Barn::class, name = "BARN"), + JsonSubTypes.Type(value = Forelder::class, name = "FORELDER"), + JsonSubTypes.Type(value = Innsender::class, name = "INNSENDER"), +) +interface Person { + val type: PersonType + val fornavn: Opplysning + val etternavn: Opplysning + val foedselsnummer: Opplysning? + val foedselsdato: Opplysning? +} + +enum class PersonType { + INNSENDER, + GJENLEVENDE, + GJENLEVENDE_OMS, + GJENLEVENDE_FORELDER, + AVDOED, + SAMBOER, + VERGE, + BARN, + FORELDER, +} + +data class Innsender( + override val fornavn: Opplysning, + override val etternavn: Opplysning, + override val foedselsnummer: Opplysning, +) : Person { + override val type: PersonType = PersonType.INNSENDER + override val foedselsdato: Opplysning? = null +} + +data class Gjenlevende( + override val fornavn: Opplysning, + override val etternavn: Opplysning, + override val foedselsnummer: Opplysning, + override val foedselsdato: Opplysning? = null, + + val statsborgerskap: Opplysning, + val sivilstatus: Opplysning, + val adresse: Opplysning?, + val bostedsAdresse: Opplysning?, + val kontaktinfo: Kontaktinfo, + val flyktning: Opplysning>?, + val oppholdUtland: BetingetOpplysning, OppholdUtland?>?, + val nySivilstatus: BetingetOpplysning, Samboer?>, + val arbeidOgUtdanning: ArbeidOgUtdanning?, + val fullfoertUtdanning: BetingetOpplysning, Opplysning?>?, + val andreYtelser: AndreYtelser, + val uregistrertEllerVenterBarn: Opplysning>, + val forholdTilAvdoede: ForholdTilAvdoede, +) : Person { + override val type = PersonType.GJENLEVENDE +} + +data class GjenlevendeOMS( + override val fornavn: Opplysning, + override val etternavn: Opplysning, + override val foedselsnummer: Opplysning, + override val foedselsdato: Opplysning? = null, + + val statsborgerskap: Opplysning, + val sivilstatus: Opplysning, + val adresse: Opplysning?, + val bostedsAdresse: Opplysning?, + val kontaktinfo: Kontaktinfo, + val flyktning: Opplysning>?, + val oppholdUtland: BetingetOpplysning, OppholdUtlandOMS?>, + val nySivilstatus: BetingetOpplysning, Samboer?>, + val arbeidOgUtdanning: ArbeidOgUtdanningOMS, + val fullfoertUtdanning: Opplysning>>?, + val inntektOgPensjon: InntektOgPensjon, + val uregistrertEllerVenterBarn: Opplysning>, + val forholdTilAvdoede: ForholdTilAvdoedeOMS, + val omsorgForBarn: Opplysning>, +) : Person { + override val type = PersonType.GJENLEVENDE_OMS +} + +data class Forelder( + override val fornavn: Opplysning, + override val etternavn: Opplysning, + override val foedselsnummer: Opplysning? = null, + override val foedselsdato: Opplysning? = null, +) : Person { + override val type: PersonType = PersonType.FORELDER + + init { + check (foedselsdato != null || foedselsnummer != null) { + "Kan ikke opprette forelder uten verken fødselsnummer eller fødselsdato" + } + } +} + +data class Barn( + override val fornavn: Opplysning, + override val etternavn: Opplysning, + override val foedselsnummer: Opplysning? = null, + override val foedselsdato: Opplysning? = null, + + val statsborgerskap: Opplysning, + val utenlandsAdresse: BetingetOpplysning, Utenlandsadresse?>?, + val bosattNorge: BetingetOpplysning, OppholdUtlandInformasjon?>? = null, + val foreldre: List, + val ukjentForelder: Opplysning? = null, + val verge: BetingetOpplysning, Verge>?, + val dagligOmsorg: Opplysning>?, + val ufoeretrygd: Opplysning>? = null, + val arbeidsavklaringspenger: Opplysning>? = null, +) : Person { + override val type = PersonType.BARN + + init { + check (foedselsdato != null || foedselsnummer != null) { + "Kan ikke opprette barn uten verken fødselsnummer eller fødselsdato" + } + } +} + +data class Avdoed( + override val fornavn: Opplysning, + override val etternavn: Opplysning, + override val foedselsnummer: Opplysning? = null, + override val foedselsdato: Opplysning? = null, + + val datoForDoedsfallet: Opplysning, + val statsborgerskap: Opplysning, + val utenlandsopphold: BetingetOpplysning, List>, + val doedsaarsakSkyldesYrkesskadeEllerYrkessykdom: Opplysning>, + // Næringsinntekt og militærtjeneste er kun relevant dersom begge foreldrene er døde. + val naeringsInntekt: BetingetOpplysning, Naeringsinntekt?>?, + val militaertjeneste: BetingetOpplysning, Opplysning?>?, +) : Person { + override val type = PersonType.AVDOED + + init { + check (foedselsdato != null || foedselsnummer != null) { + "Kan ikke opprette avdød uten verken fødselsnummer eller fødselsdato" + } + } +} + +data class Verge( + val fornavn: Opplysning? = null, + val etternavn: Opplysning? = null, + val foedselsnummer: Opplysning? = null, +) { + val type = PersonType.VERGE +} + +data class Samboer( + override val fornavn: Opplysning, + override val etternavn: Opplysning, + override val foedselsnummer: Opplysning, + override val foedselsdato: Opplysning? = null, + + val fellesBarnEllertidligereGift: Opplysning>, + val inntekt: BetingetOpplysning, SamboerInntekt?>?, +) : Person { + override val type = PersonType.SAMBOER +} diff --git a/common/src/main/kotlin/no/nav/etterlatte/libs/common/innsendtsoeknad/common/SoeknadType.kt b/common/src/main/kotlin/no/nav/etterlatte/libs/common/innsendtsoeknad/common/SoeknadType.kt new file mode 100644 index 00000000..f57c5c4c --- /dev/null +++ b/common/src/main/kotlin/no/nav/etterlatte/libs/common/innsendtsoeknad/common/SoeknadType.kt @@ -0,0 +1,15 @@ +package no.nav.etterlatte.libs.common.innsendtsoeknad.common + +enum class SoeknadType( + val behandlingsnummer: Behandlingsnummer, +) { + BARNEPENSJON(Behandlingsnummer.BARNEPENSJON), + OMSTILLINGSSTOENAD(Behandlingsnummer.OMSTILLINGSSTOENAD), +} + +enum class Behandlingsnummer( + val verdi: String, +) { + BARNEPENSJON("B359"), + OMSTILLINGSSTOENAD("B373"), +} diff --git a/common/src/main/kotlin/no/nav/etterlatte/libs/common/innsendtsoeknad/omstillingsstoenad/Omstillingsstoenad.kt b/common/src/main/kotlin/no/nav/etterlatte/libs/common/innsendtsoeknad/omstillingsstoenad/Omstillingsstoenad.kt new file mode 100644 index 00000000..403ea00f --- /dev/null +++ b/common/src/main/kotlin/no/nav/etterlatte/libs/common/innsendtsoeknad/omstillingsstoenad/Omstillingsstoenad.kt @@ -0,0 +1,33 @@ +package no.nav.etterlatte.libs.common.innsendtsoeknad.omstillingsstoenad + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties +import no.nav.etterlatte.libs.common.innsendtsoeknad.BankkontoType +import no.nav.etterlatte.libs.common.innsendtsoeknad.Spraak +import no.nav.etterlatte.libs.common.innsendtsoeknad.UtbetalingsInformasjon +import no.nav.etterlatte.libs.common.innsendtsoeknad.common.Avdoed +import no.nav.etterlatte.libs.common.innsendtsoeknad.common.Barn +import no.nav.etterlatte.libs.common.innsendtsoeknad.common.BetingetOpplysning +import no.nav.etterlatte.libs.common.innsendtsoeknad.common.EnumSvar +import no.nav.etterlatte.libs.common.innsendtsoeknad.common.GjenlevendeOMS +import no.nav.etterlatte.libs.common.innsendtsoeknad.common.ImageTag +import no.nav.etterlatte.libs.common.innsendtsoeknad.common.Innsender +import no.nav.etterlatte.libs.common.innsendtsoeknad.common.InnsendtSoeknad +import no.nav.etterlatte.libs.common.innsendtsoeknad.common.Opplysning +import no.nav.etterlatte.libs.common.innsendtsoeknad.common.SoeknadType +import java.time.LocalDateTime + +@JsonIgnoreProperties(ignoreUnknown = true) +data class Omstillingsstoenad( + override val imageTag: ImageTag, + override val spraak: Spraak, + override val innsender: Innsender, + override val harSamtykket: Opplysning, + override val utbetalingsInformasjon: BetingetOpplysning, UtbetalingsInformasjon>?, + override val soeker: GjenlevendeOMS, + val avdoed: Avdoed, + val barn: List, +) : InnsendtSoeknad { + override val versjon = "1" + override val type: SoeknadType = SoeknadType.OMSTILLINGSSTOENAD + override val mottattDato: LocalDateTime = LocalDateTime.now() +} diff --git a/common/src/main/kotlin/no/nav/etterlatte/libs/common/inntektsjustering/Inntektsjustering.kt b/common/src/main/kotlin/no/nav/etterlatte/libs/common/inntektsjustering/Inntektsjustering.kt new file mode 100644 index 00000000..85988285 --- /dev/null +++ b/common/src/main/kotlin/no/nav/etterlatte/libs/common/inntektsjustering/Inntektsjustering.kt @@ -0,0 +1,14 @@ +package no.nav.etterlatte.libs.common.inntektsjustering + +import java.time.Instant +import java.util.UUID + +data class Inntektsjustering( + val id: UUID, + val inntektsaar: Int, + val arbeidsinntekt: Int, + val naeringsinntekt: Int, + val arbeidsinntektUtland: Int, + val naeringsinntektUtland: Int, + val tidspunkt: Instant, +) \ No newline at end of file diff --git a/common/src/main/kotlin/no/nav/etterlatte/libs/common/person/Foedselsnummer.kt b/common/src/main/kotlin/no/nav/etterlatte/libs/common/person/Foedselsnummer.kt new file mode 100644 index 00000000..98297109 --- /dev/null +++ b/common/src/main/kotlin/no/nav/etterlatte/libs/common/person/Foedselsnummer.kt @@ -0,0 +1,118 @@ +package no.nav.etterlatte.libs.common.person + +import com.fasterxml.jackson.annotation.JsonCreator +import com.fasterxml.jackson.annotation.JsonValue +import java.time.LocalDate +import java.time.temporal.ChronoUnit + +/** + * Norwegian national identity number + * + * The Norwegian national identity number is an 11-digit personal identifier. + * Everyone on the Norwegian National Registry has a national identity number. + * + * @see Skatteetaten om fødselsnummer + */ +class Foedselsnummer private constructor( + @JsonValue val value: String, +) { + init { + require(FoedselsnummerValidator.isValid(value)) + } + + companion object { + @JvmStatic + @JsonCreator + fun of(fnr: String?): Foedselsnummer = + try { + Foedselsnummer(fnr!!.replace(Regex("[^0-9]"), "")) + } catch (e: Exception) { + throw InvalidFoedselsnummer(fnr, e) + } + + fun isValid(fnr: String?): Boolean = FoedselsnummerValidator.isValid(fnr!!.replace(Regex("[^0-9]"), "")) + } + + /** + * @return birthdate as [LocalDate] + */ + fun getBirthDate(): LocalDate { + val month = value.slice(2 until 4).toInt() + + val fnrDay = value.slice(0 until 2).toInt() + val day = if (isDNumber()) fnrDay - 40 else fnrDay + + return LocalDate.of(getYearOfBirth(), month, day) + } + + /** + * @return the birthdate as a ISO 8601 [String] + */ + fun getBirthDateAsIso() = getBirthDate().toString() + + /** + * Checks if the identity number is of type D-number. + * + * A D-number consists of 11 digits, of which the first six digits show the date of birth, + * but the first digit is increased by 4. + */ + fun isDNumber(): Boolean = Character.getNumericValue(value[0]) in 4..7 + + /** + * Calculates year of birth using the individual number. + * + * @return 4 digit year of birth as [Int] + */ + private fun getYearOfBirth(): Int { + val century: String = + when (val individnummer = value.slice(6 until 9).toInt()) { + in 0..499, + in 900..999, + -> "19" + in 500..999 -> "20" + in 500..749 -> "18" + else -> { + throw IllegalArgumentException("Ingen gyldig årstall funnet for individnummer $individnummer") + } + } + + val year = value.slice(4 until 6) + + return "$century$year".toInt() + } + + fun getAge(): Int = ChronoUnit.YEARS.between(getBirthDate(), LocalDate.now()).toInt() + + /** + * Sjekker om fødselsnummeret er av typen "Hjelpenummer". + * + * H-nummer er et hjelpenummer, en virksomhetsintern, unik identifikasjon av en person som + * ikke har fødselsnummer eller D-nummer eller hvor dette er ukjent. + */ + private fun isHNumber(): Boolean = Character.getNumericValue(value[2]) >= 4 + + /** + * Sjekker om fødselsnummeret er av typen "Felles Nasjonalt Hjelpenummer". + * + * Brukes av helsevesenet i tilfeller hvor de har behov for unikt å identifisere pasienter + * som ikke har et kjent fødselsnummer eller D-nummer. + */ + + private fun isFhNumber(): Boolean = Character.getNumericValue(value[0]) in 8..9 + + override fun equals(other: Any?): Boolean = this.value == (other as Foedselsnummer?)?.value + + override fun hashCode(): Int = this.value.hashCode() + + /** + * Skal ALLTID returnere anonymisert fødselsnummer. + * + * Bruk [value] ved behov for komplett fødselsnummer. + */ + override fun toString(): String = this.value.replaceRange(6 until 11, "*****") +} + +class InvalidFoedselsnummer( + value: String?, + cause: Throwable, +) : Exception("Ugyldig fødselsnummer $value", cause) diff --git a/common/src/main/kotlin/no/nav/etterlatte/libs/common/person/FoedselsnummerValidator.kt b/common/src/main/kotlin/no/nav/etterlatte/libs/common/person/FoedselsnummerValidator.kt new file mode 100644 index 00000000..0f2044af --- /dev/null +++ b/common/src/main/kotlin/no/nav/etterlatte/libs/common/person/FoedselsnummerValidator.kt @@ -0,0 +1,57 @@ +package no.nav.etterlatte.libs.common.person + +class FoedselsnummerValidator { + companion object { + private val controlDigits1 = intArrayOf(3, 7, 6, 1, 8, 9, 4, 5, 2) + private val controlDigits2 = intArrayOf(5, 4, 3, 2, 7, 6, 5, 4, 3, 2) + + /** + * Validates foedselsnummer. + * + * It consists of 11 digits. + * It does not have a BigInteger value of 0. + * Control digits are valid. + */ + fun isValid(value: String): Boolean = + !Regex("(0{11})|([0-9]{6}0{5})").matches(value) && + value.length == 11 && + value.toBigIntegerOrNull() != null && + validateControlDigits(value) + + /** + * Validate control digits. + */ + private fun validateControlDigits(value: String): Boolean { + val ks1 = Character.getNumericValue(value[9]) + + val c1 = mod(controlDigits1, value) + if (c1 == 10 || c1 != ks1) { + return false + } + + val c2 = mod(controlDigits2, value) + + return !(c2 == 10 || c2 != Character.getNumericValue(value[10])) + } + + /** + * Control Digits 1: + * k1 = 11 - ((3 × d1 + 7 × d2 + 6 × m1 + 1 × m2 + 8 × å1 + 9 × å2 + 4 × i1 + 5 × i2 + 2 × i3) mod 11) + * + * Control Digits 2 + * k2 = 11 - ((5 × d1 + 4 × d2 + 3 × m1 + 2 × m2 + 7 × å1 + 6 × å2 + 5 × i1 + 4 × i2 + 3 × i3 + 2 × k1) mod 11) + */ + private fun mod( + arr: IntArray, + value: String, + ): Int { + val sum = + arr + .withIndex() + .sumOf { (i, m) -> m * Character.getNumericValue(value[i]) } + + val result = 11 - (sum % 11) + return if (result == 11) 0 else result + } + } +} diff --git a/common/src/main/resources/pdl/hentAdressebeskyttelse.graphql b/common/src/main/resources/pdl/hentAdressebeskyttelse.graphql new file mode 100644 index 00000000..0f4b1471 --- /dev/null +++ b/common/src/main/resources/pdl/hentAdressebeskyttelse.graphql @@ -0,0 +1,10 @@ +query($identer: [ID!]!){ + hentPersonBolk(identer: $identer) { + ident, + person { + adressebeskyttelse(historikk: false) { + gradering + } + } + } +} diff --git a/common/src/test/kotlin/innsendtsoeknad/common/InnsendtSoeknadTest.kt b/common/src/test/kotlin/innsendtsoeknad/common/InnsendtSoeknadTest.kt new file mode 100644 index 00000000..1cc0bd60 --- /dev/null +++ b/common/src/test/kotlin/innsendtsoeknad/common/InnsendtSoeknadTest.kt @@ -0,0 +1,63 @@ +package innsendtsoeknad.common + +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule +import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper +import com.fasterxml.jackson.module.kotlin.jacksonTypeRef +import com.fasterxml.jackson.module.kotlin.readValue +import io.kotest.matchers.ints.shouldBeExactly +import io.kotest.matchers.shouldBe +import no.nav.etterlatte.libs.common.innsendtsoeknad.barnepensjon.Barnepensjon +import no.nav.etterlatte.libs.common.innsendtsoeknad.common.InnsendtSoeknad +import no.nav.etterlatte.libs.common.innsendtsoeknad.common.SoeknadRequest +import no.nav.etterlatte.libs.common.innsendtsoeknad.common.SoeknadType +import no.nav.etterlatte.libs.common.innsendtsoeknad.omstillingsstoenad.Omstillingsstoenad +import org.junit.jupiter.api.Assertions.assertTrue +import org.junit.jupiter.api.Test + +@Suppress("ktlint:standard:max-line-length") +internal class InnsendtSoeknadTest { + private val mapper = + jacksonObjectMapper() + .registerModule(JavaTimeModule()) + + @Test + fun `Deserialisering fungerer som forventet`() { + val json = """{"soeknader":[{"imageTag":"d79803f3acb657cf657ee46af1db293a665eb0d2","spraak":"nb","type":"OMSTILLINGSSTOENAD","harSamtykket":{"spoersmaal":"Jeg vil svare så godt jeg kan på spørsmålene i søknaden.","svar":true},"innsender":{"type":"INNSENDER","fornavn":{"spoersmaal":"Fornavn","svar":"KALD"},"etternavn":{"spoersmaal":"Etternavn","svar":"FOLK"},"foedselsnummer":{"spoersmaal":"Fødselsnummer","svar":"24876696580"}},"utbetalingsInformasjon":{"spoersmaal":"Ønsker du å motta utbetalingen på norsk eller utenlandsk bankkonto?","svar":{"verdi":"NORSK","innhold":"Norsk"},"opplysning":{"kontonummer":{"spoersmaal":"Oppgi norsk kontonummer for utbetaling","svar":{"innhold":"1241.24.12412"}}}},"soeker":{"type":"GJENLEVENDE_OMS","fornavn":{"spoersmaal":"Fornavn","svar":"KALD"},"etternavn":{"spoersmaal":"Etternavn","svar":"FOLK"},"foedselsnummer":{"spoersmaal":"Fødselsnummer","svar":"24876696580"},"statsborgerskap":{"spoersmaal":"Statsborgerskap","svar":"Norge"},"sivilstatus":{"spoersmaal":"Sivilstatus","svar":"Gift"},"adresse":{"spoersmaal":"Bostedsadresse","svar":"Nedre Ovrå 28, 6212 Liabygda"},"kontaktinfo":{"telefonnummer":{"spoersmaal":"Telefonnummer","svar":{"innhold":"+4799999999"}}},"oppholdUtland":{"spoersmaal":"Er du bosatt i Norge?","svar":{"verdi":"JA","innhold":"Ja"},"opplysning":{"oppholderSegIUtlandet":{"spoersmaal":"Har du bodd eller oppholdt deg i utlandet de siste 12 månedene?","svar":{"verdi":"NEI","innhold":"Nei"}}}},"nySivilstatus":{"spoersmaal":"Sivilstanden din i dag","svar":{"verdi":"ENSLIG","innhold":"Enslig"}},"arbeidOgUtdanning":{"dinSituasjon":{"spoersmaal":"Hva er situasjonen din nå?","svar":[{"verdi":"ARBEIDSTAKER","innhold":"Jeg er arbeidstaker og/eller lønnsmottaker som frilanser"}]},"arbeidsforhold":{"spoersmaal":"Om arbeidsforholdet ditt","svar":[{"arbeidsgiver":{"spoersmaal":"Navn på arbeidssted","svar":{"innhold":"NAV"}},"arbeidsmengde":{"spoersmaal":"Fyll ut stillingsprosenten din","svar":{"innhold":"100% Prosent"}},"ansettelsesforhold":{"spoersmaal":"Hva slags type ansettelsesforhold har du?","svar":{"verdi":"FAST","innhold":"Fast ansatt"}},"endretArbeidssituasjon":{"spoersmaal":"Forventer du endringer i arbeidsforholdet ditt fremover i tid?","svar":{"verdi":"NEI","innhold":"Nei"}}},{"arbeidsgiver":{"spoersmaal":"Navn på arbeidssted","svar":{"innhold":"EH"}},"arbeidsmengde":{"spoersmaal":"Fyll ut stillingsprosenten din","svar":{"innhold":"30 Prosent"}},"ansettelsesforhold":{"spoersmaal":"Hva slags type ansettelsesforhold har du?","svar":{"verdi":"FAST","innhold":"Fast ansatt"}},"endretArbeidssituasjon":{"spoersmaal":"Forventer du endringer i arbeidsforholdet ditt fremover i tid?","svar":{"verdi":"JA","innhold":"Ja"},"opplysning":{"spoersmaal":"Gi en kort beskrivelse av endringene","svar":{"innhold":"Hmmm"}}}}]}},"fullfoertUtdanning":{"spoersmaal":"Hva er din høyeste fullførte utdanning?","svar":[{"verdi":"UNIVERSITET_OVER_4_AAR","innhold":"Universitet eller høyskole mer enn 4 år"},{"verdi":"FAGBREV","innhold":"Fagbrev"},{"verdi":"ANNEN","innhold":"Annen utdanning"}]},"inntektOgPensjon":{"loennsinntekt":{"spoersmaal":"Arbeidsinntekt","svar":{"norgeEllerUtland":{"spoersmaal":"Hvor har du arbeidsinntekt fra?","svar":[{"verdi":"NORGE","innhold":"Norge"},{"verdi":"UTLAND","innhold":"Utland"}]},"norge":{"inntektAaretFoerDoedsfall":{"spoersmaal":"Hva var brutto årsinntekt året før dødsfallet?","svar":{"innhold":"500000"}},"inntektIFjor":{"tilDoedsfall":{"spoersmaal":"Hva var brutto arbeidsinntekt frem til dødsfallet?","svar":{"innhold":"500000"}},"aarsinntekt":{"spoersmaal":"Hva forventer du i brutto årsinntekt til neste år?","svar":{"innhold":"140 000"}}},"inntektIAar":{"tilDoedsfall":{"spoersmaal":"Hva var brutto arbeidsinntekt frem til dødsfallet?","svar":{"innhold":"500000"}},"aarsinntekt":{"spoersmaal":"Hva forventer du i brutto årsinntekt til neste år?","svar":{"innhold":"140 000"}}}},"utland":{"inntektAaretFoerDoedsfall":{"spoersmaal":"Hva var brutto årsinntekt året før dødsfallet?","svar":{"innhold":"500000"}},"inntektIFjor":{"tilDoedsfall":{"spoersmaal":"Hva var brutto arbeidsinntekt frem til dødsfallet?","svar":{"innhold":"500000"}},"aarsinntekt":{"spoersmaal":"Hva forventer du i brutto årsinntekt til neste år?","svar":{"innhold":"140 000"}}},"inntektIAar":{"tilDoedsfall":{"spoersmaal":"Hva var brutto arbeidsinntekt frem til dødsfallet?","svar":{"innhold":"500000"}},"aarsinntekt":{"spoersmaal":"Hva forventer du i brutto årsinntekt til neste år?","svar":{"innhold":"140 000"}}}},"endringAvInntekt":{"fremtidigEndringAvInntekt":{"spoersmaal":"Regner du med at inntekten din endrer seg fremover i tid?","svar":{"verdi":"VET_IKKE","innhold":"Vet ikke"}}}}},"naeringsinntekt":{"spoersmaal":"Næringsinntekt","svar":{"norgeEllerUtland":{"spoersmaal":"Hvor har du næringsinntekt fra?","svar":[{"verdi":"NORGE","innhold":"Norge"},{"verdi":"UTLAND","innhold":"Utland"}]},"norge":{"inntektAaretFoerDoedsfall":{"spoersmaal":"Hva var brutto årsinntekt året før dødsfallet?","svar":{"innhold":"500000"}},"inntektIFjor":{"tilDoedsfall":{"spoersmaal":"Hva var brutto arbeidsinntekt frem til dødsfallet?","svar":{"innhold":"500000"}},"aarsinntekt":{"spoersmaal":"Hva forventer du i brutto årsinntekt til neste år?","svar":{"innhold":"140 000"}}},"inntektIAar":{"tilDoedsfall":{"spoersmaal":"Hva var brutto arbeidsinntekt frem til dødsfallet?","svar":{"innhold":"500000"}},"aarsinntekt":{"spoersmaal":"Hva forventer du i brutto årsinntekt til neste år?","svar":{"innhold":"140 000"}}}},"utland":{"inntektAaretFoerDoedsfall":{"spoersmaal":"Hva var brutto årsinntekt året før dødsfallet?","svar":{"innhold":"500000"}},"inntektIFjor":{"tilDoedsfall":{"spoersmaal":"Hva var brutto arbeidsinntekt frem til dødsfallet?","svar":{"innhold":"500000"}},"aarsinntekt":{"spoersmaal":"Hva forventer du i brutto årsinntekt til neste år?","svar":{"innhold":"140 000"}}},"inntektIAar":{"tilDoedsfall":{"spoersmaal":"Hva var brutto arbeidsinntekt frem til dødsfallet?","svar":{"innhold":"500000"}},"aarsinntekt":{"spoersmaal":"Hva forventer du i brutto årsinntekt til neste år?","svar":{"innhold":"140 000"}}}},"endringAvInntekt":{"fremtidigEndringAvInntekt":{"spoersmaal":"Regner du med at inntekten din endrer seg fremover i tid?","svar":{"verdi":"JA","innhold":"Ja"}},"grunn":{"spoersmaal":"Hva er grunnen til endringene?","svar":{"verdi":"REDUSERT_STILLINGSPROSENT","innhold":"Redusert stillingsprosent"}}}}},"pensjonEllerUfoere":{"pensjonstype":{"spoersmaal":"Hvilken pensjon eller trygd har du?","svar":[{"verdi":"UFOEREPENSJON_FRA_NAV","innhold":"Uføretrygd fra NAV"},{"verdi":"ALDERSPENSJON_FRA_NAV","innhold":"Alderspensjon fra NAV"},{"verdi":"TJENESTEPENSJONSORDNING","innhold":"Pensjon fra tjenestepensjonsordning"}]},"tjenestepensjonsordning":{"type":{"spoersmaal":"Hva slags pensjon mottar du?","svar":{"verdi":"AVTALEFESTET_PENSJON_OFFENTLIG","innhold":"Avtalefestet pensjon i offentlig sektor"}},"utbetaler":{"spoersmaal":"Hvilken tjenestepensjonsordning utbetaler pensjonen din?","svar":{"innhold":"Satans Pensjonskasse"}}},"utland":{"type":{"spoersmaal":"Hva slags pensjon?","svar":{"innhold":"Ufør"}},"land":{"spoersmaal":"Hvilket land mottar du fra? ","svar":{"innhold":"Polen"}},"beloepMedValuta":{"spoersmaal":"Årlig beløp i landets valuta","svar":{"innhold":"4000 PLN"}}}},"inntektViaYtelserFraNAV":{"ytelser":{"spoersmaal":"Hvilke andre inntekter eller utbetalinger har du?","svar":[{"verdi":"DAGSPENGER","innhold":"Dagpenger"},{"verdi":"SVANGERSKAPSPENGER","innhold":"Svangerskapspenger"},{"verdi":"KOMMUNAL_OMSORGSSTOENAD","innhold":"Kommunal omsorgsstønad"}]}},"ytelserNAV":{"soektOmYtelse":{"spoersmaal":"Har du søkt om ytelser fra NAV som du ikke har fått svar på?","svar":{"verdi":"JA","innhold":"Ja"}},"soektYtelse":{"spoersmaal":"Hva har du søkt om?","svar":[{"verdi":"FORELDREPENGER","innhold":"Foreldrepenger"},{"verdi":"OMSORGSPENGER","innhold":"Omsorgspenger"},{"verdi":"FOSTERHJEMSGODTGJOERING","innhold":"Fosterhjemsgodtgjøring"}]}},"ytelserAndre":{"soektOmYtelse":{"spoersmaal":"Har du søkt om ytelser fra andre enn NAV som du ikke har fått svar på?","svar":{"verdi":"NEI","innhold":"Nei"}}}},"uregistrertEllerVenterBarn":{"spoersmaal":"Venter du barn eller har du barn som ikke er registrert i folkeregisteret?","svar":{"verdi":"NEI","innhold":"Nei"}},"forholdTilAvdoede":{"relasjon":{"spoersmaal":"Relasjonen din til avdøde da dødsfallet skjedde","svar":{"verdi":"GIFT","innhold":"Gift eller registrert partner"}},"datoForInngaattPartnerskap":{"spoersmaal":"Vi giftet oss","svar":{"innhold":"2005-12-01"}},"fellesBarn":{"spoersmaal":"Har eller har dere hatt felles barn?","svar":{"verdi":"JA","innhold":"Ja"}}},"omsorgForBarn":{"spoersmaal":"Har du minst 50 prosent omsorg for barn under 18 år på dødsfallstidspunktet?","svar":{"verdi":"JA","innhold":"Ja"}}},"avdoed":{"type":"AVDOED","fornavn":{"spoersmaal":"Fornavn","svar":"Overeksponert"},"etternavn":{"spoersmaal":"Etternavn","svar":"Mobiltelefon"},"foedselsnummer":{"spoersmaal":"Fødselsnummer / d-nummer","svar":"16498203950"},"datoForDoedsfallet":{"spoersmaal":"Når skjedde dødsfallet?","svar":{"innhold":"2023-11-20"}},"statsborgerskap":{"spoersmaal":"Statsborgerskap","svar":{"innhold":"Norge"}},"utenlandsopphold":{"spoersmaal":"Har han eller hun bodd og/eller arbeidet i et annet land enn Norge etter fylte 16 år?","svar":{"verdi":"JA","innhold":"Ja"},"opplysning":[{"land":{"spoersmaal":"Land","svar":{"innhold":"Sverige"}},"fraDato":{"spoersmaal":"Fra dato (valgfri)","svar":{"innhold":"2003-07-22"}},"tilDato":{"spoersmaal":"Til dato (valgfri)","svar":{"innhold":"2003-12-31"}},"oppholdsType":{"spoersmaal":"Bodd og/eller arbeidet?","svar":[{"verdi":"BODD","innhold":"Bodd"},{"verdi":"ARBEIDET","innhold":"Arbeidet"}]},"medlemFolketrygd":{"spoersmaal":"Var han eller hun medlem av folketrygden under oppholdet?","svar":{"verdi":"JA","innhold":"Ja"}},"pensjonsutbetaling":{"spoersmaal":"Oppgi eventuell pensjon han eller hun mottok fra dette landet (valgfri)","svar":{"innhold":"140 000"}}}]},"naeringsInntekt":{"spoersmaal":"Var han eller hun selvstendig næringsdrivende?","svar":{"verdi":"NEI","innhold":"Nei"}},"doedsaarsakSkyldesYrkesskadeEllerYrkessykdom":{"spoersmaal":"Skyldes dødsfallet yrkesskade eller yrkessykdom?","svar":{"verdi":"NEI","innhold":"Nei"}}},"barn":[{"type":"BARN","fornavn":{"spoersmaal":"Fornavn","svar":"Innsiktsfull"},"etternavn":{"spoersmaal":"Etternavn","svar":"Koloni"},"foedselsnummer":{"spoersmaal":"Barnets fødselsnummer / d-nummer","svar":"24871899386"},"statsborgerskap":{"spoersmaal":"Statsborgerskap","svar":"Norge"},"utenlandsAdresse":{"spoersmaal":"Bor barnet i et annet land enn Norge?","svar":{"verdi":"JA","innhold":"Ja"},"opplysning":{"land":{"spoersmaal":"Land","svar":{"innhold":"Danmark"}},"adresse":{"spoersmaal":"Adresse i utlandet","svar":{"innhold":"Kamelåså"}}}},"foreldre":[{"type":"FORELDER","fornavn":{"spoersmaal":"Fornavn","svar":"KALD"},"etternavn":{"spoersmaal":"Etternavn","svar":"FOLK"},"foedselsnummer":{"spoersmaal":"Fødselsnummer","svar":"24876696580"}},{"type":"FORELDER","fornavn":{"spoersmaal":"Fornavn","svar":"Overeksponert"},"etternavn":{"spoersmaal":"Etternavn","svar":"Mobiltelefon"},"foedselsnummer":{"spoersmaal":"Fødselsnummer","svar":"16498203950"}}],"verge":{"spoersmaal":"Er det oppnevnt en verge for barnet?","svar":{"verdi":"JA","innhold":"Ja"},"opplysning":{"type":"VERGE","fornavn":{"spoersmaal":"Fornavn","svar":"Verg"},"etternavn":{"spoersmaal":"Etternavn","svar":"Vikernes"}}}}],"andreStoenader":[],"mottattDato":"2023-11-30T18:05:49.337092713","template":"omstillingsstoenad_v2"},{"imageTag":"d79803f3acb657cf657ee46af1db293a665eb0d2","spraak":"nb","innsender":{"fornavn":{"svar":"TRADISJONSBUNDEN","spoersmaal":"Fornavn"},"etternavn":{"svar":"KØYESENG","spoersmaal":"Etternavn"},"foedselsnummer":{"svar":"13848599411","spoersmaal":"Fødselsnummer / d-nummer"},"type":"INNSENDER"},"harSamtykket":{"svar":true,"spoersmaal":"Jeg, TRADISJONSBUNDEN KØYESENG, bekrefter at jeg vil gi riktige og fullstendige opplysninger."},"utbetalingsInformasjon":{"svar":{"verdi":"NORSK","innhold":"Norsk"},"spoersmaal":"Ønsker du å motta utbetalingen på norsk eller utenlandsk bankkonto?","opplysning":{"kontonummer":{"svar":{"innhold":"1231.23.13137"},"spoersmaal":"Oppgi norsk kontonummer for utbetaling av barnepensjon"},"utenlandskBankNavn":null,"utenlandskBankAdresse":null,"iban":null,"swift":null,"skattetrekk":{"svar":{"svar":{"verdi":"NEI","innhold":"Nei"},"spoersmaal":"Ønsker du at vi legger inn et skattetrekk for barnepensjonen?"}}}},"soeker":{"fornavn":{"svar":"Blaut","spoersmaal":"Fornavn"},"etternavn":{"svar":"Sandkasse","spoersmaal":"Etternavn"},"foedselsnummer":{"svar":"19021370870","spoersmaal":"Fødselsnummer / d-nummer"},"statsborgerskap":{"svar":"Norge","spoersmaal":"Statsborgerskap"},"utenlandsAdresse":{"svar":{"verdi":"NEI","innhold":"Nei"},"spoersmaal":"Bor barnet i et annet land enn Norge?","opplysning":null},"bosattNorge":null,"foreldre":[{"fornavn":{"svar":"TRADISJONSBUNDEN","spoersmaal":"Fornavn"},"etternavn":{"svar":"KØYESENG","spoersmaal":"Etternavn"},"foedselsnummer":{"svar":"13848599411","spoersmaal":"Fødselsnummer / d-nummer"},"type":"FORELDER"},{"fornavn":{"svar":"TREG","spoersmaal":"Fornavn"},"etternavn":{"svar":"BILDE","spoersmaal":"Etternavn"},"foedselsnummer":{"svar":"03428317423","spoersmaal":"Fødselsnummer / d-nummer"},"type":"FORELDER"}],"ukjentForelder":null,"verge":{"svar":{"verdi":"NEI","innhold":"Nei"},"spoersmaal":"Er det oppnevnt en verge for barnet?","opplysning":null},"dagligOmsorg":null,"type":"BARN"},"foreldre":[{"fornavn":{"svar":"TRADISJONSBUNDEN","spoersmaal":"Fornavn"},"etternavn":{"svar":"KØYESENG","spoersmaal":"Etternavn"},"foedselsnummer":{"svar":"13848599411","spoersmaal":"Fødselsnummer / d-nummer"},"adresse":{"svar":"Tonnesveien 275, 8750 Tonnes","spoersmaal":"Bostedsadresse"},"statsborgerskap":{"svar":"Norge","spoersmaal":"Statsborgerskap"},"kontaktinfo":{"telefonnummer":{"svar":{"innhold":"+4799999999"},"spoersmaal":"Telefonnummer"}},"type":"GJENLEVENDE_FORELDER"},{"fornavn":{"svar":"TREG","spoersmaal":"Fornavn"},"etternavn":{"svar":"BILDE","spoersmaal":"Etternavn"},"foedselsnummer":{"svar":"03428317423","spoersmaal":"Fødselsnummer / d-nummer"},"datoForDoedsfallet":{"svar":{"innhold":"2023-11-01"},"spoersmaal":"Når skjedde dødsfallet?"},"statsborgerskap":{"svar":{"innhold":"Norge"},"spoersmaal":"Statsborgerskap"},"utenlandsopphold":{"svar":{"verdi":"NEI","innhold":"Nei"},"spoersmaal":"Har han eller hun bodd og/eller arbeidet i et annet land enn Norge etter fylte 16 år?","opplysning":null},"doedsaarsakSkyldesYrkesskadeEllerYrkessykdom":{"svar":{"verdi":"NEI","innhold":"Nei"},"spoersmaal":"Skyldes dødsfallet yrkesskade eller yrkessykdom?"},"naeringsInntekt":{"svar":{"verdi":"NEI","innhold":"Nei"},"spoersmaal":"Var han eller hun selvstendig næringsdrivende?","opplysning":null},"militaertjeneste":null,"type":"AVDOED"}],"soesken":[],"versjon":"2","type":"BARNEPENSJON","mottattDato":"2023-11-30T18:05:49.337092713","template":"barnepensjon_v2"}]}""" + + val deserialized = mapper.readValue(json, jacksonTypeRef()) + + deserialized.soeknader.size shouldBeExactly 2 + + val omstillingsstoenad = deserialized.soeknader.first() + omstillingsstoenad.type shouldBe SoeknadType.OMSTILLINGSSTOENAD + omstillingsstoenad.template() shouldBe "omstillingsstoenad_v1" + + val barnepensjon = deserialized.soeknader.last() + barnepensjon.type shouldBe SoeknadType.BARNEPENSJON + barnepensjon.template() shouldBe "barnepensjon_v2" + } + + @Test + fun `Deserialisering av barnepensjon`() { + val json = javaClass.getResource("/soeknad/barnepensjon.json")!!.readText() + + val soeknad = mapper.readValue(json) + assertTrue(soeknad is Barnepensjon) + } + + @Test + fun `Deserialisering av barnepensjon utland`() { + val json = javaClass.getResource("/soeknad/barnepensjon_utland.json")!!.readText() + + val soeknad = mapper.readValue(json) + assertTrue(soeknad is Barnepensjon) + } + + @Test + fun `Deserialisering av omstillingsstoenad`() { + val json = javaClass.getResource("/soeknad/omstillingsstoenad.json")!!.readText() + + val soeknad = mapper.readValue(json) + assertTrue(soeknad is Omstillingsstoenad) + } +} diff --git a/common/src/test/kotlin/innsendtsoeknad/common/PersonerTest.kt b/common/src/test/kotlin/innsendtsoeknad/common/PersonerTest.kt new file mode 100644 index 00000000..32287b58 --- /dev/null +++ b/common/src/test/kotlin/innsendtsoeknad/common/PersonerTest.kt @@ -0,0 +1,132 @@ +package innsendtsoeknad.common + +import com.fasterxml.jackson.databind.exc.ValueInstantiationException +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule +import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper +import com.fasterxml.jackson.module.kotlin.jacksonTypeRef +import io.kotest.assertions.throwables.shouldThrow +import io.kotest.matchers.shouldBe +import io.kotest.matchers.shouldNotBe +import java.time.LocalDate +import no.nav.etterlatte.libs.common.innsendtsoeknad.common.Avdoed +import no.nav.etterlatte.libs.common.innsendtsoeknad.common.Barn +import no.nav.etterlatte.libs.common.innsendtsoeknad.common.JaNeiVetIkke +import no.nav.etterlatte.libs.common.innsendtsoeknad.common.Opplysning +import no.nav.etterlatte.libs.common.innsendtsoeknad.common.Person +import no.nav.etterlatte.libs.common.innsendtsoeknad.common.Verge +import no.nav.etterlatte.libs.common.person.Foedselsnummer +import org.junit.jupiter.api.Test + +@Suppress("ktlint:standard:max-line-length") +internal class PersonerTest { + private val mapper = + jacksonObjectMapper() + .registerModule(JavaTimeModule()) + + @Test + fun `Serde av verge fungerer`() { + val verge = + Verge( + Opplysning("Fornavn"), + Opplysning("Etternavn"), + Opplysning(Foedselsnummer.of("24014021406")), + ) + + val serialized = mapper.writeValueAsString(verge) + + val deserialized = mapper.readValue(serialized, jacksonTypeRef()) + + (deserialized is Verge) shouldBe true + deserialized.fornavn shouldBe verge.fornavn + deserialized.etternavn shouldBe verge.etternavn + deserialized.foedselsnummer shouldBe verge.foedselsnummer + } + + @Test + fun `Serde av verge fungerer med nullable felter`() { + val verge = + Verge( + fornavn = Opplysning("Fornavn"), + ) + + val serialized = mapper.writeValueAsString(verge) + + val deserialized = mapper.readValue(serialized, jacksonTypeRef()) + + (deserialized is Verge) shouldBe true + deserialized.fornavn shouldBe verge.fornavn + deserialized.etternavn shouldBe null + deserialized.foedselsnummer shouldBe null + } + + @Test + fun `Deserialisering av barn fungerer`() { + val barnJson = """{"type":"BARN","fornavn":{"spoersmaal":"Fornavn","svar":"Blåøyd"},"etternavn":{"spoersmaal":"Etternavn","svar":"Saks"},"foedselsnummer":{"spoersmaal":"Barnets fødselsnummer / d-nummer","svar":"09011350027"},"statsborgerskap":{"spoersmaal":"Statsborgerskap","svar":"Norge"},"utenlandsAdresse":{"spoersmaal":"Bor barnet i et annet land enn Norge?","svar":{"verdi":"JA","innhold":"Ja"},"opplysning":{"land":{"spoersmaal":"Land","svar":{"innhold":"Polen"}},"adresse":{"spoersmaal":"Adresse i utlandet","svar":{"innhold":"Polski gatski 13"}}}},"foreldre":[{"type":"FORELDER","fornavn":{"spoersmaal":"Fornavn","svar":"STOR"},"etternavn":{"spoersmaal":"Etternavn","svar":"SNERK"},"foedselsnummer":{"spoersmaal":"Fødselsnummer","svar":"11057523044"}},{"type":"FORELDER","fornavn":{"spoersmaal":"Fornavn","svar":"Polski"},"etternavn":{"spoersmaal":"Etternavn","svar":"Dødski"},"foedselsnummer":{"spoersmaal":"Fødselsnummer","svar":"26104500284"}}],"verge":{"spoersmaal":"Er det oppnevnt en verge for barnet?","svar":{"verdi":"JA","innhold":"Ja"},"opplysning":{"type":"VERGE","fornavn":{"spoersmaal":"Fornavn","svar":"Verg"},"etternavn":{"spoersmaal":"Etternavn","svar":"Vikernes"},"foedselsnummer":{"spoersmaal":"Fødselsnummer","svar":"30106519672"}}}}""" + + val deserialized = mapper.readValue(barnJson, jacksonTypeRef()) + + (deserialized as Barn) shouldNotBe null + deserialized.fornavn.svar shouldBe "Blåøyd" + deserialized.etternavn.svar shouldBe "Saks" + deserialized.foedselsdato shouldBe null + deserialized.foedselsnummer!!.svar.value shouldBe "09011350027" + + deserialized.foreldre.size shouldBe 2 + deserialized.dagligOmsorg?.svar shouldBe null + deserialized.statsborgerskap.svar shouldBe "Norge" + deserialized.utenlandsAdresse!!.svar.verdi shouldBe JaNeiVetIkke.JA + } + + @Test + fun `Deserialisering av barn, uten foedselsnummer`() { + val barnJson = """{"type":"BARN","fornavn":{"spoersmaal":"Fornavn","svar":"Blåøyd"},"etternavn":{"spoersmaal":"Etternavn","svar":"Saks"},"foedselsnummer": null,"foedselsdato":{"spoersmaal":"Fødselsdato","svar":"2013-01-09"},"statsborgerskap":{"spoersmaal":"Statsborgerskap","svar":"Norge"},"utenlandsAdresse":{"spoersmaal":"Bor barnet i et annet land enn Norge?","svar":{"verdi":"JA","innhold":"Ja"},"opplysning":{"land":{"spoersmaal":"Land","svar":{"innhold":"Polen"}},"adresse":{"spoersmaal":"Adresse i utlandet","svar":{"innhold":"Polski gatski 13"}}}},"foreldre":[{"type":"FORELDER","fornavn":{"spoersmaal":"Fornavn","svar":"STOR"},"etternavn":{"spoersmaal":"Etternavn","svar":"SNERK"},"foedselsnummer":{"spoersmaal":"Fødselsnummer","svar":"11057523044"}},{"type":"FORELDER","fornavn":{"spoersmaal":"Fornavn","svar":"Polski"},"etternavn":{"spoersmaal":"Etternavn","svar":"Dødski"},"foedselsnummer":{"spoersmaal":"Fødselsnummer","svar":"26104500284"}}],"verge":{"spoersmaal":"Er det oppnevnt en verge for barnet?","svar":{"verdi":"JA","innhold":"Ja"},"opplysning":{"type":"VERGE","fornavn":{"spoersmaal":"Fornavn","svar":"Verg"},"etternavn":{"spoersmaal":"Etternavn","svar":"Vikernes"},"foedselsnummer":{"spoersmaal":"Fødselsnummer","svar":"30106519672"}}}}""" + + val deserialized = mapper.readValue(barnJson, jacksonTypeRef()) + + (deserialized as Barn) shouldNotBe null + deserialized.fornavn.svar shouldBe "Blåøyd" + deserialized.etternavn.svar shouldBe "Saks" + deserialized.foedselsnummer shouldBe null + deserialized.foedselsdato!!.svar shouldBe LocalDate.of(2013, 1, 9) + } + + @Test + fun `Deserialisering av barn, uten verken foedselsnummer eller foedselsdato`() { + val barnJson = """{"type":"BARN","fornavn":{"spoersmaal":"Fornavn","svar":"Blåøyd"},"etternavn":{"spoersmaal":"Etternavn","svar":"Saks"},"foedselsnummer":null,"foedselsdato":null,"statsborgerskap":{"spoersmaal":"Statsborgerskap","svar":"Norge"},"utenlandsAdresse":{"spoersmaal":"Bor barnet i et annet land enn Norge?","svar":{"verdi":"JA","innhold":"Ja"},"opplysning":{"land":{"spoersmaal":"Land","svar":{"innhold":"Polen"}},"adresse":{"spoersmaal":"Adresse i utlandet","svar":{"innhold":"Polski gatski 13"}}}},"foreldre":[{"type":"FORELDER","fornavn":{"spoersmaal":"Fornavn","svar":"STOR"},"etternavn":{"spoersmaal":"Etternavn","svar":"SNERK"},"foedselsnummer":{"spoersmaal":"Fødselsnummer","svar":"11057523044"}},{"type":"FORELDER","fornavn":{"spoersmaal":"Fornavn","svar":"Polski"},"etternavn":{"spoersmaal":"Etternavn","svar":"Dødski"},"foedselsnummer":{"spoersmaal":"Fødselsnummer","svar":"26104500284"}}],"verge":{"spoersmaal":"Er det oppnevnt en verge for barnet?","svar":{"verdi":"JA","innhold":"Ja"},"opplysning":{"type":"VERGE","fornavn":{"spoersmaal":"Fornavn","svar":"Verg"},"etternavn":{"spoersmaal":"Etternavn","svar":"Vikernes"},"foedselsnummer":{"spoersmaal":"Fødselsnummer","svar":"30106519672"}}}}""" + + shouldThrow { + mapper.readValue(barnJson, jacksonTypeRef()) + } + } + + @Test + fun `Avdød med fødselsdato, uten fnr`() { + val avdoedUtenFnrJson = """{"type":"AVDOED","fornavn":{"spoersmaal":"Fornavn","svar":"Overeksponert"},"etternavn":{"spoersmaal":"Etternavn","svar":"Mobiltelefon"},"foedselsnummer": null,"foedselsdato":{"spoersmaal":"Fødselsdato","svar":"1982-09-16"},"datoForDoedsfallet":{"spoersmaal":"Når skjedde dødsfallet?","svar":{"innhold":"2023-11-20"}},"statsborgerskap":{"spoersmaal":"Statsborgerskap","svar":{"innhold":"Norge"}},"utenlandsopphold":{"spoersmaal":"Har han eller hun bodd og/eller arbeidet i et annet land enn Norge etter fylte 16 år?","svar":{"verdi":"JA","innhold":"Ja"},"opplysning": [{"land":{"spoersmaal":"Land","svar":{"innhold":"Sverige"}},"fraDato":{"spoersmaal":"Fra dato (valgfri)","svar":{"innhold":"2003-07-22"}},"tilDato":{"spoersmaal":"Til dato (valgfri)","svar":{"innhold":"2003-12-31"}},"oppholdsType":{"spoersmaal":"Bodd og/eller arbeidet?","svar": [{"verdi":"BODD","innhold":"Bodd"},{"verdi":"ARBEIDET","innhold":"Arbeidet"}]},"medlemFolketrygd":{"spoersmaal":"Var han eller hun medlem av folketrygden under oppholdet?","svar":{"verdi":"JA","innhold":"Ja"}},"pensjonsutbetaling":{"spoersmaal":"Oppgi eventuell pensjon han eller hun mottok fra dette landet (valgfri)","svar":{"innhold":"140 000"}}}]},"naeringsInntekt":{"spoersmaal":"Var han eller hun selvstendig næringsdrivende?","svar":{"verdi":"NEI","innhold":"Nei"}},"doedsaarsakSkyldesYrkesskadeEllerYrkessykdom":{"spoersmaal":"Skyldes dødsfallet yrkesskade eller yrkessykdom?","svar":{"verdi":"NEI","innhold":"Nei"}}}""" + + val avdoedUtenFnr = mapper.readValue(avdoedUtenFnrJson, jacksonTypeRef()) + + (avdoedUtenFnr is Avdoed) shouldBe true + avdoedUtenFnr.foedselsnummer shouldBe null + avdoedUtenFnr.foedselsdato?.svar shouldBe LocalDate.of(1982, 9, 16) + } + + @Test + fun `Avdød med fnr, uten fødselsdato`() { + val avdoedUtenFdatoJson = """{"type":"AVDOED","fornavn":{"spoersmaal":"Fornavn","svar":"Overeksponert"},"etternavn":{"spoersmaal":"Etternavn","svar":"Mobiltelefon"},"foedselsnummer":{"spoersmaal":"Fødselsnummer / d-nummer","svar":"16498203950"},"foedselsdato":null,"datoForDoedsfallet":{"spoersmaal":"Når skjedde dødsfallet?","svar":{"innhold":"2023-11-20"}},"statsborgerskap":{"spoersmaal":"Statsborgerskap","svar":{"innhold":"Norge"}},"utenlandsopphold":{"spoersmaal":"Har han eller hun bodd og/eller arbeidet i et annet land enn Norge etter fylte 16 år?","svar":{"verdi":"JA","innhold":"Ja"},"opplysning": [{"land":{"spoersmaal":"Land","svar":{"innhold":"Sverige"}},"fraDato":{"spoersmaal":"Fra dato (valgfri)","svar":{"innhold":"2003-07-22"}},"tilDato":{"spoersmaal":"Til dato (valgfri)","svar":{"innhold":"2003-12-31"}},"oppholdsType":{"spoersmaal":"Bodd og/eller arbeidet?","svar": [{"verdi":"BODD","innhold":"Bodd"},{"verdi":"ARBEIDET","innhold":"Arbeidet"}]},"medlemFolketrygd":{"spoersmaal":"Var han eller hun medlem av folketrygden under oppholdet?","svar":{"verdi":"JA","innhold":"Ja"}},"pensjonsutbetaling":{"spoersmaal":"Oppgi eventuell pensjon han eller hun mottok fra dette landet (valgfri)","svar":{"innhold":"140 000"}}}]},"naeringsInntekt":{"spoersmaal":"Var han eller hun selvstendig næringsdrivende?","svar":{"verdi":"NEI","innhold":"Nei"}},"doedsaarsakSkyldesYrkesskadeEllerYrkessykdom":{"spoersmaal":"Skyldes dødsfallet yrkesskade eller yrkessykdom?","svar":{"verdi":"NEI","innhold":"Nei"}}}""" + + val avdoedUtenFdato = mapper.readValue(avdoedUtenFdatoJson, jacksonTypeRef()) + + (avdoedUtenFdato is Avdoed) shouldBe true + avdoedUtenFdato.foedselsdato shouldBe null + avdoedUtenFdato.foedselsnummer?.svar shouldBe Foedselsnummer.of("16498203950") + } + + @Test + fun `Avdød uten fnr eller fødselsdato`() { + val avdoedUtenFdatoJson = """{"type":"AVDOED","fornavn":{"spoersmaal":"Fornavn","svar":"Overeksponert"},"etternavn":{"spoersmaal":"Etternavn","svar":"Mobiltelefon"},"foedselsnummer":null,"foedselsdato":null,"datoForDoedsfallet":{"spoersmaal":"Når skjedde dødsfallet?","svar":{"innhold":"2023-11-20"}},"statsborgerskap":{"spoersmaal":"Statsborgerskap","svar":{"innhold":"Norge"}},"utenlandsopphold":{"spoersmaal":"Har han eller hun bodd og/eller arbeidet i et annet land enn Norge etter fylte 16 år?","svar":{"verdi":"JA","innhold":"Ja"},"opplysning": [{"land":{"spoersmaal":"Land","svar":{"innhold":"Sverige"}},"fraDato":{"spoersmaal":"Fra dato (valgfri)","svar":{"innhold":"2003-07-22"}},"tilDato":{"spoersmaal":"Til dato (valgfri)","svar":{"innhold":"2003-12-31"}},"oppholdsType":{"spoersmaal":"Bodd og/eller arbeidet?","svar": [{"verdi":"BODD","innhold":"Bodd"},{"verdi":"ARBEIDET","innhold":"Arbeidet"}]},"medlemFolketrygd":{"spoersmaal":"Var han eller hun medlem av folketrygden under oppholdet?","svar":{"verdi":"JA","innhold":"Ja"}},"pensjonsutbetaling":{"spoersmaal":"Oppgi eventuell pensjon han eller hun mottok fra dette landet (valgfri)","svar":{"innhold":"140 000"}}}]},"naeringsInntekt":{"spoersmaal":"Var han eller hun selvstendig næringsdrivende?","svar":{"verdi":"NEI","innhold":"Nei"}},"doedsaarsakSkyldesYrkesskadeEllerYrkessykdom":{"spoersmaal":"Skyldes dødsfallet yrkesskade eller yrkessykdom?","svar":{"verdi":"NEI","innhold":"Nei"}}}""" + + shouldThrow { + mapper.readValue(avdoedUtenFdatoJson, jacksonTypeRef()) + } + } +} diff --git a/common/src/test/kotlin/person/FoedselsnummerTest.kt b/common/src/test/kotlin/person/FoedselsnummerTest.kt new file mode 100644 index 00000000..9fed2a2c --- /dev/null +++ b/common/src/test/kotlin/person/FoedselsnummerTest.kt @@ -0,0 +1,86 @@ +package person + +import no.nav.etterlatte.libs.common.person.Foedselsnummer +import no.nav.etterlatte.libs.common.person.InvalidFoedselsnummer +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.assertAll +import org.junit.jupiter.api.assertThrows + +internal class FoedselsnummerTest { + @Test + fun `Sjekk diverse gyldige test fnr`() { + val gyldigeFnrListe = + listOf( + "11057523044", + "26117512737", + "26104500284", + "24116324268", + "04096222195", + "05126307952", + ) + + assertAll( + gyldigeFnrListe.map { + { assertEquals(it, Foedselsnummer.of(it).value) } + }, + ) + } + + @Test + fun `Sjekk diverse gyldige test fnr med mellomrom eller bindestrek`() { + assertAll( + { assertEquals("11057523044", Foedselsnummer.of("110575 23044").value) }, + { assertEquals("11057523044", Foedselsnummer.of("110575-23044").value) }, + { assertEquals("26117512737", Foedselsnummer.of("26 11 75 12737").value) }, + { assertEquals("26117512737", Foedselsnummer.of("26-11-75-12737").value) }, + { assertEquals("26104500284", Foedselsnummer.of(" 26104500284 ").value) }, + { assertEquals("24116324268", Foedselsnummer.of(" 2 4 1 1 6 3 2 4 2 6 8 ").value) }, + { assertEquals("05126307952", Foedselsnummer.of(" 05 126 307 952").value) }, + ) + } + + @Test + fun `Sjekk diverse ugyldige numeriske verdier`() { + assertThrows { + Foedselsnummer.of("1234") + } + + val ugyldigeFnrListe = + listOf( + "00000000000", + "11111111111", + "22222222222", + "33333333333", + "44444444444", + "55555555555", + "66666666666", + "77777777777", + "88888888888", + "99999999999", + "36117512737", + "12345678901", + "00000000001", + "10000000000", + ) + + assertAll( + ugyldigeFnrListe.map { + { assertThrows { Foedselsnummer.of(it) } } + }, + ) + } + + @Test + fun `Sjekk diverse ugyldige tekst verdier`() { + assertThrows { Foedselsnummer.of("") } + assertThrows { Foedselsnummer.of("hei") } + } + + @Test + fun `Foedselsnummer sin toString anonymiserer`() { + val fnr = Foedselsnummer.of("24014021406") + + assertEquals("240140*****", fnr.toString()) + } +} diff --git a/common/src/test/kotlin/person/FoedselsnummerValidatorTest.kt b/common/src/test/kotlin/person/FoedselsnummerValidatorTest.kt new file mode 100644 index 00000000..1395893c --- /dev/null +++ b/common/src/test/kotlin/person/FoedselsnummerValidatorTest.kt @@ -0,0 +1,63 @@ +package person + +import io.kotest.matchers.shouldBe +import no.nav.etterlatte.libs.common.person.FoedselsnummerValidator.Companion.isValid +import org.junit.jupiter.api.Test + +internal class FoedselsnummerValidatorTest { + @Test + fun `Sjekk diverse gyldige test fnr`() { + isValid("11057523044") shouldBe true + isValid("26117512737") shouldBe true + isValid("26104500284") shouldBe true + isValid("24116324268") shouldBe true + isValid("04096222195") shouldBe true + isValid("05126307952") shouldBe true + } + + @Test + fun `Sjekk diverse syntetiske fnr`() { + isValid("07823847585") shouldBe true + isValid("24910198617") shouldBe true + isValid("06859597627") shouldBe true + isValid("21919898760") shouldBe true + isValid("12900799991") shouldBe true + isValid("20840699480") shouldBe true + isValid("27813648046") shouldBe true + isValid("07823847585") shouldBe true + isValid("24910198617") shouldBe true + isValid("06859597627") shouldBe true + isValid("21919898760") shouldBe true + isValid("06488309690") shouldBe true + isValid("30017215759") shouldBe true + } + + @Test + fun `Sjekk diverse ugyldige numeriske verdier`() { + isValid("1234") shouldBe false + + isValid("15048900000") shouldBe false + isValid("00000000000") shouldBe false + isValid("11111111111") shouldBe false + isValid("22222222222") shouldBe false + isValid("33333333333") shouldBe false + isValid("44444444444") shouldBe false + isValid("55555555555") shouldBe false + isValid("66666666666") shouldBe false + isValid("77777777777") shouldBe false + isValid("88888888888") shouldBe false + isValid("99999999999") shouldBe false + + isValid("36117512737") shouldBe false + isValid("12345678901") shouldBe false + isValid("00000000001") shouldBe false + isValid("10000000000") shouldBe false + } + + @Test + fun `Sjekk diverse ugyldige tekst verdier`() { + isValid("") shouldBe false + isValid("hei") shouldBe false + isValid("gyldigfnrmedtekst11057523044") shouldBe false + } +} diff --git a/common/src/test/resources/soeknad/barnepensjon.json b/common/src/test/resources/soeknad/barnepensjon.json new file mode 100644 index 00000000..c37a814a --- /dev/null +++ b/common/src/test/resources/soeknad/barnepensjon.json @@ -0,0 +1,210 @@ +{ + "imageTag": "d79803f3acb657cf657ee46af1db293a665eb0d2", + "spraak": "nb", + "innsender": { + "fornavn": { + "svar": "TRADISJONSBUNDEN", + "spoersmaal": "Fornavn" + }, + "etternavn": { + "svar": "KØYESENG", + "spoersmaal": "Etternavn" + }, + "foedselsnummer": { + "svar": "13848599411", + "spoersmaal": "Fødselsnummer / d-nummer" + }, + "type": "INNSENDER" + }, + "harSamtykket": { + "svar": true, + "spoersmaal": "Jeg, TRADISJONSBUNDEN KØYESENG, bekrefter at jeg vil gi riktige og fullstendige opplysninger." + }, + "utbetalingsInformasjon": { + "svar": { + "verdi": "NORSK", + "innhold": "Norsk" + }, + "spoersmaal": "Ønsker du å motta utbetalingen på norsk eller utenlandsk bankkonto?", + "opplysning": { + "kontonummer": { + "svar": { + "innhold": "1231.23.13137" + }, + "spoersmaal": "Oppgi norsk kontonummer for utbetaling av barnepensjon" + }, + "utenlandskBankNavn": null, + "utenlandskBankAdresse": null, + "iban": null, + "swift": null, + "skattetrekk": { + "svar": { + "svar": { + "verdi": "NEI", + "innhold": "Nei" + }, + "spoersmaal": "Ønsker du at vi legger inn et skattetrekk for barnepensjonen?" + } + } + } + }, + "soeker": { + "fornavn": { + "svar": "Blaut", + "spoersmaal": "Fornavn" + }, + "etternavn": { + "svar": "Sandkasse", + "spoersmaal": "Etternavn" + }, + "foedselsnummer": { + "svar": "19021370870", + "spoersmaal": "Fødselsnummer / d-nummer" + }, + "statsborgerskap": { + "svar": "Norge", + "spoersmaal": "Statsborgerskap" + }, + "utenlandsAdresse": { + "svar": { + "verdi": "NEI", + "innhold": "Nei" + }, + "spoersmaal": "Bor barnet i et annet land enn Norge?", + "opplysning": null + }, + "bosattNorge": null, + "foreldre": [ + { + "fornavn": { + "svar": "TRADISJONSBUNDEN", + "spoersmaal": "Fornavn" + }, + "etternavn": { + "svar": "KØYESENG", + "spoersmaal": "Etternavn" + }, + "foedselsnummer": { + "svar": "13848599411", + "spoersmaal": "Fødselsnummer / d-nummer" + }, + "type": "FORELDER" + }, + { + "fornavn": { + "svar": "TREG", + "spoersmaal": "Fornavn" + }, + "etternavn": { + "svar": "BILDE", + "spoersmaal": "Etternavn" + }, + "foedselsnummer": { + "svar": "03428317423", + "spoersmaal": "Fødselsnummer / d-nummer" + }, + "type": "FORELDER" + } + ], + "ukjentForelder": null, + "verge": { + "svar": { + "verdi": "NEI", + "innhold": "Nei" + }, + "spoersmaal": "Er det oppnevnt en verge for barnet?", + "opplysning": null + }, + "dagligOmsorg": null, + "type": "BARN" + }, + "foreldre": [ + { + "fornavn": { + "svar": "TRADISJONSBUNDEN", + "spoersmaal": "Fornavn" + }, + "etternavn": { + "svar": "KØYESENG", + "spoersmaal": "Etternavn" + }, + "foedselsnummer": { + "svar": "13848599411", + "spoersmaal": "Fødselsnummer / d-nummer" + }, + "adresse": { + "svar": "Tonnesveien 275, 8750 Tonnes", + "spoersmaal": "Bostedsadresse" + }, + "statsborgerskap": { + "svar": "Norge", + "spoersmaal": "Statsborgerskap" + }, + "kontaktinfo": { + "telefonnummer": { + "svar": { + "innhold": "+4799999999" + }, + "spoersmaal": "Telefonnummer" + } + }, + "type": "GJENLEVENDE_FORELDER" + }, + { + "fornavn": { + "svar": "TREG", + "spoersmaal": "Fornavn" + }, + "etternavn": { + "svar": "BILDE", + "spoersmaal": "Etternavn" + }, + "foedselsnummer": { + "svar": "03428317423", + "spoersmaal": "Fødselsnummer / d-nummer" + }, + "datoForDoedsfallet": { + "svar": { + "innhold": "2023-11-01" + }, + "spoersmaal": "Når skjedde dødsfallet?" + }, + "statsborgerskap": { + "svar": { + "innhold": "Norge" + }, + "spoersmaal": "Statsborgerskap" + }, + "utenlandsopphold": { + "svar": { + "verdi": "NEI", + "innhold": "Nei" + }, + "spoersmaal": "Har han eller hun bodd og/eller arbeidet i et annet land enn Norge etter fylte 16 år?", + "opplysning": null + }, + "doedsaarsakSkyldesYrkesskadeEllerYrkessykdom": { + "svar": { + "verdi": "NEI", + "innhold": "Nei" + }, + "spoersmaal": "Skyldes dødsfallet yrkesskade eller yrkessykdom?" + }, + "naeringsInntekt": { + "svar": { + "verdi": "NEI", + "innhold": "Nei" + }, + "spoersmaal": "Var han eller hun selvstendig næringsdrivende?", + "opplysning": null + }, + "militaertjeneste": null, + "type": "AVDOED" + } + ], + "soesken": [], + "versjon": "2", + "type": "BARNEPENSJON", + "mottattDato": "2023-11-30T18:05:49.337092713", + "template": "barnepensjon_v2" +} \ No newline at end of file diff --git a/common/src/test/resources/soeknad/barnepensjon_utland.json b/common/src/test/resources/soeknad/barnepensjon_utland.json new file mode 100644 index 00000000..75c67f46 --- /dev/null +++ b/common/src/test/resources/soeknad/barnepensjon_utland.json @@ -0,0 +1,307 @@ +{ + "imageTag": "d79803f3acb657cf657ee46af1db293a665eb0d2", + "spraak": "nb", + "innsender": { + "fornavn": { + "svar": "TRADISJONSBUNDEN", + "spoersmaal": "Fornavn" + }, + "etternavn": { + "svar": "KØYESENG", + "spoersmaal": "Etternavn" + }, + "foedselsnummer": { + "svar": "13848599411", + "spoersmaal": "Fødselsnummer / d-nummer" + }, + "type": "INNSENDER" + }, + "harSamtykket": { + "svar": true, + "spoersmaal": "Jeg, TRADISJONSBUNDEN KØYESENG, bekrefter at jeg vil gi riktige og fullstendige opplysninger." + }, + "utbetalingsInformasjon": { + "svar": { + "verdi": "NORSK", + "innhold": "Norsk" + }, + "spoersmaal": "Ønsker du å motta utbetalingen på norsk eller utenlandsk bankkonto?", + "opplysning": { + "kontonummer": { + "svar": { + "innhold": "1301.35.01385" + }, + "spoersmaal": "Oppgi norsk kontonummer for utbetaling av barnepensjon" + }, + "utenlandskBankNavn": null, + "utenlandskBankAdresse": null, + "iban": null, + "swift": null, + "skattetrekk": { + "svar": { + "svar": { + "verdi": "NEI", + "innhold": "Nei" + }, + "spoersmaal": "Ønsker du at vi legger inn et skattetrekk for barnepensjonen?" + }, + "trekk": { + "svar": { + "innhold": "20%" + }, + "spoersmaal": "Frivillig skattetrekk i prosent per måned" + }, + "beskrivelse": { + "svar": { + "innhold": "Ikke i desember" + }, + "spoersmaal": "Vi trenger beskjed hvis det ikke skal være trekk i desember eller andre deler av året (valgfritt)" + } + } + } + }, + "soeker": { + "fornavn": { + "svar": "Blaut", + "spoersmaal": "Fornavn" + }, + "etternavn": { + "svar": "Sandkasse", + "spoersmaal": "Etternavn" + }, + "foedselsnummer": { + "svar": "19021370870", + "spoersmaal": "Fødselsnummer / d-nummer" + }, + "statsborgerskap": { + "svar": "Norge", + "spoersmaal": "Statsborgerskap" + }, + "utenlandsAdresse": { + "svar": { + "verdi": "JA", + "innhold": "Ja" + }, + "spoersmaal": "Bor barnet i et annet land enn Norge?", + "opplysning": { + "land": { + "svar": { + "innhold": "Sverige" + }, + "spoersmaal": "Land" + }, + "adresse": { + "svar": { + "innhold": "Søta bror vegen 123, 12345 Stockholm" + }, + "spoersmaal": "Adresse i utlandet" + } + } + }, + "bosattNorge": null, + "foreldre": [ + { + "fornavn": { + "svar": "TRADISJONSBUNDEN", + "spoersmaal": "Fornavn" + }, + "etternavn": { + "svar": "KØYESENG", + "spoersmaal": "Etternavn" + }, + "foedselsnummer": { + "svar": "13848599411", + "spoersmaal": "Fødselsnummer / d-nummer" + }, + "type": "FORELDER" + }, + { + "fornavn": { + "svar": "Treg", + "spoersmaal": "Fornavn" + }, + "etternavn": { + "svar": "Bilde", + "spoersmaal": "Etternavn" + }, + "foedselsnummer": { + "svar": "03428317423", + "spoersmaal": "Fødselsnummer / d-nummer" + }, + "type": "FORELDER" + } + ], + "ukjentForelder": null, + "verge": { + "svar": { + "verdi": "JA", + "innhold": "Ja" + }, + "spoersmaal": "Er det oppnevnt en verge for barnet?", + "opplysning": { + "fornavn": { + "svar": "Verg", + "spoersmaal": "Fornavn (valgfri)" + }, + "etternavn": { + "svar": "Vikernes", + "spoersmaal": "Etternavn (valgfri)" + }, + "foedselsnummer": null, + "type": "VERGE" + } + }, + "dagligOmsorg": null, + "type": "BARN" + }, + "foreldre": [ + { + "fornavn": { + "svar": "TRADISJONSBUNDEN", + "spoersmaal": "Fornavn" + }, + "etternavn": { + "svar": "KØYESENG", + "spoersmaal": "Etternavn" + }, + "foedselsnummer": { + "svar": "13848599411", + "spoersmaal": "Fødselsnummer / d-nummer" + }, + "adresse": { + "svar": "Tonnesveien 275, 8750 Tonnes", + "spoersmaal": "Bostedsadresse" + }, + "statsborgerskap": { + "svar": "Norge", + "spoersmaal": "Statsborgerskap" + }, + "kontaktinfo": { + "telefonnummer": { + "svar": { + "innhold": "+4799999999" + }, + "spoersmaal": "Telefonnummer" + } + }, + "type": "GJENLEVENDE_FORELDER" + }, + { + "fornavn": { + "svar": "Treg", + "spoersmaal": "Fornavn" + }, + "etternavn": { + "svar": "Bilde", + "spoersmaal": "Etternavn" + }, + "foedselsnummer": { + "svar": "03428317423", + "spoersmaal": "Fødselsnummer / d-nummer" + }, + "datoForDoedsfallet": { + "svar": { + "innhold": "2023-11-15" + }, + "spoersmaal": "Når skjedde dødsfallet?" + }, + "statsborgerskap": { + "svar": { + "innhold": "Norge" + }, + "spoersmaal": "Statsborgerskap" + }, + "utenlandsopphold": { + "svar": { + "verdi": "JA", + "innhold": "Ja" + }, + "spoersmaal": "Har han eller hun bodd og/eller arbeidet i et annet land enn Norge etter fylte 16 år?", + "opplysning": [ + { + "land": { + "svar": { + "innhold": "Sverige" + }, + "spoersmaal": "Land" + }, + "fraDato": { + "svar": { + "innhold": "2023-01-01" + }, + "spoersmaal": "Fra dato" + }, + "tilDato": { + "svar": { + "innhold": "2023-12-31" + }, + "spoersmaal": "Til dato" + }, + "oppholdsType": { + "svar": [ + { + "verdi": "BODD", + "innhold": "BODD" + }, + { + "verdi": "ARBEIDET", + "innhold": "ARBEIDET" + } + ], + "spoersmaal": "Bodd og/eller arbeidet?" + }, + "medlemFolketrygd": { + "svar": { + "verdi": "VET_IKKE", + "innhold": "Vet ikke" + }, + "spoersmaal": "Var han eller hun medlem av folketrygden under oppholdet?" + }, + "pensjonsutbetaling": { + "svar": { + "innhold": "0" + }, + "spoersmaal": "Oppgi eventuell pensjon han eller hun mottok fra dette landet (valgfri)" + } + } + ] + }, + "doedsaarsakSkyldesYrkesskadeEllerYrkessykdom": { + "svar": { + "verdi": "JA", + "innhold": "Ja" + }, + "spoersmaal": "Skyldes dødsfallet yrkesskade eller yrkessykdom?" + }, + "naeringsInntekt": { + "svar": { + "verdi": "JA", + "innhold": "Ja" + }, + "spoersmaal": "Var han eller hun selvstendig næringsdrivende?", + "opplysning": { + "naeringsinntektPrAarFoerDoedsfall": { + "svar": { + "innhold": "130 000" + }, + "spoersmaal": "Oppgi næringsinntekt fra kalenderåret før dødsfallet (valgfri)" + }, + "naeringsinntektVedDoedsfall": { + "svar": { + "verdi": "JA", + "innhold": "Ja" + }, + "spoersmaal": "Hadde han eller hun næringsinntekt når dødsfallet skjedde?" + } + } + }, + "militaertjeneste": null, + "type": "AVDOED" + } + ], + "soesken": [], + "versjon": "2", + "type": "BARNEPENSJON", + "mottattDato": "2023-12-01T08:22:25.684453816", + "template": "barnepensjon_v2" +} \ No newline at end of file diff --git a/common/src/test/resources/soeknad/omstillingsstoenad.json b/common/src/test/resources/soeknad/omstillingsstoenad.json new file mode 100644 index 00000000..f942d106 --- /dev/null +++ b/common/src/test/resources/soeknad/omstillingsstoenad.json @@ -0,0 +1,734 @@ +{ + "imageTag": "d79803f3acb657cf657ee46af1db293a665eb0d2", + "spraak": "nb", + "type": "OMSTILLINGSSTOENAD", + "harSamtykket": { + "spoersmaal": "Jeg vil svare så godt jeg kan på spørsmålene i søknaden.", + "svar": true + }, + "innsender": { + "type": "INNSENDER", + "fornavn": { + "spoersmaal": "Fornavn", + "svar": "KALD" + }, + "etternavn": { + "spoersmaal": "Etternavn", + "svar": "FOLK" + }, + "foedselsnummer": { + "spoersmaal": "Fødselsnummer", + "svar": "24876696580" + } + }, + "utbetalingsInformasjon": { + "spoersmaal": "Ønsker du å motta utbetalingen på norsk eller utenlandsk bankkonto?", + "svar": { + "verdi": "NORSK", + "innhold": "Norsk" + }, + "opplysning": { + "kontonummer": { + "spoersmaal": "Oppgi norsk kontonummer for utbetaling", + "svar": { + "innhold": "1241.24.12412" + } + } + } + }, + "soeker": { + "type": "GJENLEVENDE_OMS", + "fornavn": { + "spoersmaal": "Fornavn", + "svar": "KALD" + }, + "etternavn": { + "spoersmaal": "Etternavn", + "svar": "FOLK" + }, + "foedselsnummer": { + "spoersmaal": "Fødselsnummer", + "svar": "24876696580" + }, + "statsborgerskap": { + "spoersmaal": "Statsborgerskap", + "svar": "Norge" + }, + "sivilstatus": { + "spoersmaal": "Sivilstatus", + "svar": "Gift" + }, + "adresse": { + "spoersmaal": "Bostedsadresse", + "svar": "Nedre Ovrå 28, 6212 Liabygda" + }, + "kontaktinfo": { + "telefonnummer": { + "spoersmaal": "Telefonnummer", + "svar": { + "innhold": "+4799999999" + } + } + }, + "oppholdUtland": { + "spoersmaal": "Er du bosatt i Norge?", + "svar": { + "verdi": "JA", + "innhold": "Ja" + }, + "opplysning": { + "oppholderSegIUtlandet": { + "spoersmaal": "Har du bodd eller oppholdt deg i utlandet de siste 12 månedene?", + "svar": { + "verdi": "NEI", + "innhold": "Nei" + } + } + } + }, + "nySivilstatus": { + "spoersmaal": "Sivilstanden din i dag", + "svar": { + "verdi": "ENSLIG", + "innhold": "Enslig" + } + }, + "arbeidOgUtdanning": { + "dinSituasjon": { + "spoersmaal": "Hva er situasjonen din nå?", + "svar": [ + { + "verdi": "ARBEIDSTAKER", + "innhold": "Jeg er arbeidstaker og/eller lønnsmottaker som frilanser" + } + ] + }, + "arbeidsforhold": { + "spoersmaal": "Om arbeidsforholdet ditt", + "svar": [ + { + "arbeidsgiver": { + "spoersmaal": "Navn på arbeidssted", + "svar": { + "innhold": "NAV" + } + }, + "arbeidsmengde": { + "spoersmaal": "Fyll ut stillingsprosenten din", + "svar": { + "innhold": "100% Prosent" + } + }, + "ansettelsesforhold": { + "spoersmaal": "Hva slags type ansettelsesforhold har du?", + "svar": { + "verdi": "FAST", + "innhold": "Fast ansatt" + } + }, + "endretArbeidssituasjon": { + "spoersmaal": "Forventer du endringer i arbeidsforholdet ditt fremover i tid?", + "svar": { + "verdi": "NEI", + "innhold": "Nei" + } + } + }, + { + "arbeidsgiver": { + "spoersmaal": "Navn på arbeidssted", + "svar": { + "innhold": "EH" + } + }, + "arbeidsmengde": { + "spoersmaal": "Fyll ut stillingsprosenten din", + "svar": { + "innhold": "30 Prosent" + } + }, + "ansettelsesforhold": { + "spoersmaal": "Hva slags type ansettelsesforhold har du?", + "svar": { + "verdi": "FAST", + "innhold": "Fast ansatt" + } + }, + "endretArbeidssituasjon": { + "spoersmaal": "Forventer du endringer i arbeidsforholdet ditt fremover i tid?", + "svar": { + "verdi": "JA", + "innhold": "Ja" + }, + "opplysning": { + "spoersmaal": "Gi en kort beskrivelse av endringene", + "svar": { + "innhold": "Hmmm" + } + } + } + } + ] + } + }, + "fullfoertUtdanning": { + "spoersmaal": "Hva er din høyeste fullførte utdanning?", + "svar": [ + { + "verdi": "UNIVERSITET_OVER_4_AAR", + "innhold": "Universitet eller høyskole mer enn 4 år" + }, + { + "verdi": "FAGBREV", + "innhold": "Fagbrev" + }, + { + "verdi": "ANNEN", + "innhold": "Annen utdanning" + } + ] + }, + "inntektOgPensjon": { + "loennsinntekt": { + "spoersmaal": "Arbeidsinntekt", + "svar": { + "norgeEllerUtland": { + "spoersmaal": "Hvor har du arbeidsinntekt fra?", + "svar": [ + { + "verdi": "NORGE", + "innhold": "Norge" + }, + { + "verdi": "UTLAND", + "innhold": "Utland" + } + ] + }, + "norge": { + "inntektAaretFoerDoedsfall": { + "spoersmaal": "Hva var brutto årsinntekt året før dødsfallet?", + "svar": { + "innhold": "500000" + } + }, + "inntektIFjor": { + "tilDoedsfall": { + "spoersmaal": "Hva var brutto arbeidsinntekt frem til dødsfallet?", + "svar": { + "innhold": "500000" + } + }, + "aarsinntekt": { + "spoersmaal": "Hva forventer du i brutto årsinntekt til neste år?", + "svar": { + "innhold": "140 000" + } + } + }, + "inntektIAar": { + "tilDoedsfall": { + "spoersmaal": "Hva var brutto arbeidsinntekt frem til dødsfallet?", + "svar": { + "innhold": "500000" + } + }, + "aarsinntekt": { + "spoersmaal": "Hva forventer du i brutto årsinntekt til neste år?", + "svar": { + "innhold": "140 000" + } + } + } + }, + "utland": { + "inntektAaretFoerDoedsfall": { + "spoersmaal": "Hva var brutto årsinntekt året før dødsfallet?", + "svar": { + "innhold": "500000" + } + }, + "inntektIFjor": { + "tilDoedsfall": { + "spoersmaal": "Hva var brutto arbeidsinntekt frem til dødsfallet?", + "svar": { + "innhold": "500000" + } + }, + "aarsinntekt": { + "spoersmaal": "Hva forventer du i brutto årsinntekt til neste år?", + "svar": { + "innhold": "140 000" + } + } + }, + "inntektIAar": { + "tilDoedsfall": { + "spoersmaal": "Hva var brutto arbeidsinntekt frem til dødsfallet?", + "svar": { + "innhold": "500000" + } + }, + "aarsinntekt": { + "spoersmaal": "Hva forventer du i brutto årsinntekt til neste år?", + "svar": { + "innhold": "140 000" + } + } + } + }, + "endringAvInntekt": { + "fremtidigEndringAvInntekt": { + "spoersmaal": "Regner du med at inntekten din endrer seg fremover i tid?", + "svar": { + "verdi": "VET_IKKE", + "innhold": "Vet ikke" + } + } + } + } + }, + "naeringsinntekt": { + "spoersmaal": "Næringsinntekt", + "svar": { + "norgeEllerUtland": { + "spoersmaal": "Hvor har du næringsinntekt fra?", + "svar": [ + { + "verdi": "NORGE", + "innhold": "Norge" + }, + { + "verdi": "UTLAND", + "innhold": "Utland" + } + ] + }, + "norge": { + "inntektAaretFoerDoedsfall": { + "spoersmaal": "Hva var brutto årsinntekt året før dødsfallet?", + "svar": { + "innhold": "500000" + } + }, + "inntektIFjor": { + "tilDoedsfall": { + "spoersmaal": "Hva var brutto arbeidsinntekt frem til dødsfallet?", + "svar": { + "innhold": "500000" + } + }, + "aarsinntekt": { + "spoersmaal": "Hva forventer du i brutto årsinntekt til neste år?", + "svar": { + "innhold": "140 000" + } + } + }, + "inntektIAar": { + "tilDoedsfall": { + "spoersmaal": "Hva var brutto arbeidsinntekt frem til dødsfallet?", + "svar": { + "innhold": "500000" + } + }, + "aarsinntekt": { + "spoersmaal": "Hva forventer du i brutto årsinntekt til neste år?", + "svar": { + "innhold": "140 000" + } + } + } + }, + "utland": { + "inntektAaretFoerDoedsfall": { + "spoersmaal": "Hva var brutto årsinntekt året før dødsfallet?", + "svar": { + "innhold": "500000" + } + }, + "inntektIFjor": { + "tilDoedsfall": { + "spoersmaal": "Hva var brutto arbeidsinntekt frem til dødsfallet?", + "svar": { + "innhold": "500000" + } + }, + "aarsinntekt": { + "spoersmaal": "Hva forventer du i brutto årsinntekt til neste år?", + "svar": { + "innhold": "140 000" + } + } + }, + "inntektIAar": { + "tilDoedsfall": { + "spoersmaal": "Hva var brutto arbeidsinntekt frem til dødsfallet?", + "svar": { + "innhold": "500000" + } + }, + "aarsinntekt": { + "spoersmaal": "Hva forventer du i brutto årsinntekt til neste år?", + "svar": { + "innhold": "140 000" + } + } + } + }, + "endringAvInntekt": { + "fremtidigEndringAvInntekt": { + "spoersmaal": "Regner du med at inntekten din endrer seg fremover i tid?", + "svar": { + "verdi": "JA", + "innhold": "Ja" + } + }, + "grunn": { + "spoersmaal": "Hva er grunnen til endringene?", + "svar": { + "verdi": "REDUSERT_STILLINGSPROSENT", + "innhold": "Redusert stillingsprosent" + } + } + } + } + }, + "pensjonEllerUfoere": { + "pensjonstype": { + "spoersmaal": "Hvilken pensjon eller trygd har du?", + "svar": [ + { + "verdi": "UFOEREPENSJON_FRA_NAV", + "innhold": "Uføretrygd fra NAV" + }, + { + "verdi": "ALDERSPENSJON_FRA_NAV", + "innhold": "Alderspensjon fra NAV" + }, + { + "verdi": "TJENESTEPENSJONSORDNING", + "innhold": "Pensjon fra tjenestepensjonsordning" + } + ] + }, + "tjenestepensjonsordning": { + "type": { + "spoersmaal": "Hva slags pensjon mottar du?", + "svar": { + "verdi": "AVTALEFESTET_PENSJON_OFFENTLIG", + "innhold": "Avtalefestet pensjon i offentlig sektor" + } + }, + "utbetaler": { + "spoersmaal": "Hvilken tjenestepensjonsordning utbetaler pensjonen din?", + "svar": { + "innhold": "Satans Pensjonskasse" + } + } + }, + "utland": { + "type": { + "spoersmaal": "Hva slags pensjon?", + "svar": { + "innhold": "Ufør" + } + }, + "land": { + "spoersmaal": "Hvilket land mottar du fra? ", + "svar": { + "innhold": "Polen" + } + }, + "beloepMedValuta": { + "spoersmaal": "Årlig beløp i landets valuta", + "svar": { + "innhold": "4000 PLN" + } + } + } + }, + "inntektViaYtelserFraNAV": { + "ytelser": { + "spoersmaal": "Hvilke andre inntekter eller utbetalinger har du?", + "svar": [ + { + "verdi": "DAGSPENGER", + "innhold": "Dagpenger" + }, + { + "verdi": "SVANGERSKAPSPENGER", + "innhold": "Svangerskapspenger" + }, + { + "verdi": "KOMMUNAL_OMSORGSSTOENAD", + "innhold": "Kommunal omsorgsstønad" + } + ] + } + }, + "ytelserNAV": { + "soektOmYtelse": { + "spoersmaal": "Har du søkt om ytelser fra NAV som du ikke har fått svar på?", + "svar": { + "verdi": "JA", + "innhold": "Ja" + } + }, + "soektYtelse": { + "spoersmaal": "Hva har du søkt om?", + "svar": [ + { + "verdi": "FORELDREPENGER", + "innhold": "Foreldrepenger" + }, + { + "verdi": "OMSORGSPENGER", + "innhold": "Omsorgspenger" + }, + { + "verdi": "FOSTERHJEMSGODTGJOERING", + "innhold": "Fosterhjemsgodtgjøring" + } + ] + } + }, + "ytelserAndre": { + "soektOmYtelse": { + "spoersmaal": "Har du søkt om ytelser fra andre enn NAV som du ikke har fått svar på?", + "svar": { + "verdi": "NEI", + "innhold": "Nei" + } + } + } + }, + "uregistrertEllerVenterBarn": { + "spoersmaal": "Venter du barn eller har du barn som ikke er registrert i folkeregisteret?", + "svar": { + "verdi": "NEI", + "innhold": "Nei" + } + }, + "forholdTilAvdoede": { + "relasjon": { + "spoersmaal": "Relasjonen din til avdøde da dødsfallet skjedde", + "svar": { + "verdi": "GIFT", + "innhold": "Gift eller registrert partner" + } + }, + "datoForInngaattPartnerskap": { + "spoersmaal": "Vi giftet oss", + "svar": { + "innhold": "2005-12-01" + } + }, + "fellesBarn": { + "spoersmaal": "Har eller har dere hatt felles barn?", + "svar": { + "verdi": "JA", + "innhold": "Ja" + } + } + }, + "omsorgForBarn": { + "spoersmaal": "Har du minst 50 prosent omsorg for barn under 18 år på dødsfallstidspunktet?", + "svar": { + "verdi": "JA", + "innhold": "Ja" + } + } + }, + "avdoed": { + "type": "AVDOED", + "fornavn": { + "spoersmaal": "Fornavn", + "svar": "Overeksponert" + }, + "etternavn": { + "spoersmaal": "Etternavn", + "svar": "Mobiltelefon" + }, + "foedselsnummer": { + "spoersmaal": "Fødselsnummer / d-nummer", + "svar": "16498203950" + }, + "datoForDoedsfallet": { + "spoersmaal": "Når skjedde dødsfallet?", + "svar": { + "innhold": "2023-11-20" + } + }, + "statsborgerskap": { + "spoersmaal": "Statsborgerskap", + "svar": { + "innhold": "Norge" + } + }, + "utenlandsopphold": { + "spoersmaal": "Har han eller hun bodd og/eller arbeidet i et annet land enn Norge etter fylte 16 år?", + "svar": { + "verdi": "JA", + "innhold": "Ja" + }, + "opplysning": [ + { + "land": { + "spoersmaal": "Land", + "svar": { + "innhold": "Sverige" + } + }, + "fraDato": { + "spoersmaal": "Fra dato (valgfri)", + "svar": { + "innhold": "2003-07-22" + } + }, + "tilDato": { + "spoersmaal": "Til dato (valgfri)", + "svar": { + "innhold": "2003-12-31" + } + }, + "oppholdsType": { + "spoersmaal": "Bodd og/eller arbeidet?", + "svar": [ + { + "verdi": "BODD", + "innhold": "Bodd" + }, + { + "verdi": "ARBEIDET", + "innhold": "Arbeidet" + } + ] + }, + "medlemFolketrygd": { + "spoersmaal": "Var han eller hun medlem av folketrygden under oppholdet?", + "svar": { + "verdi": "JA", + "innhold": "Ja" + } + }, + "pensjonsutbetaling": { + "spoersmaal": "Oppgi eventuell pensjon han eller hun mottok fra dette landet (valgfri)", + "svar": { + "innhold": "140 000" + } + } + } + ] + }, + "naeringsInntekt": { + "spoersmaal": "Var han eller hun selvstendig næringsdrivende?", + "svar": { + "verdi": "NEI", + "innhold": "Nei" + } + }, + "doedsaarsakSkyldesYrkesskadeEllerYrkessykdom": { + "spoersmaal": "Skyldes dødsfallet yrkesskade eller yrkessykdom?", + "svar": { + "verdi": "NEI", + "innhold": "Nei" + } + } + }, + "barn": [ + { + "type": "BARN", + "fornavn": { + "spoersmaal": "Fornavn", + "svar": "Innsiktsfull" + }, + "etternavn": { + "spoersmaal": "Etternavn", + "svar": "Koloni" + }, + "foedselsnummer": { + "spoersmaal": "Barnets fødselsnummer / d-nummer", + "svar": "24871899386" + }, + "statsborgerskap": { + "spoersmaal": "Statsborgerskap", + "svar": "Norge" + }, + "utenlandsAdresse": { + "spoersmaal": "Bor barnet i et annet land enn Norge?", + "svar": { + "verdi": "JA", + "innhold": "Ja" + }, + "opplysning": { + "land": { + "spoersmaal": "Land", + "svar": { + "innhold": "Danmark" + } + }, + "adresse": { + "spoersmaal": "Adresse i utlandet", + "svar": { + "innhold": "Kamelåså" + } + } + } + }, + "foreldre": [ + { + "type": "FORELDER", + "fornavn": { + "spoersmaal": "Fornavn", + "svar": "KALD" + }, + "etternavn": { + "spoersmaal": "Etternavn", + "svar": "FOLK" + }, + "foedselsnummer": { + "spoersmaal": "Fødselsnummer", + "svar": "24876696580" + } + }, + { + "type": "FORELDER", + "fornavn": { + "spoersmaal": "Fornavn", + "svar": "Overeksponert" + }, + "etternavn": { + "spoersmaal": "Etternavn", + "svar": "Mobiltelefon" + }, + "foedselsnummer": { + "spoersmaal": "Fødselsnummer", + "svar": "16498203950" + } + } + ], + "verge": { + "spoersmaal": "Er det oppnevnt en verge for barnet?", + "svar": { + "verdi": "JA", + "innhold": "Ja" + }, + "opplysning": { + "type": "VERGE", + "fornavn": { + "spoersmaal": "Fornavn", + "svar": "Verg" + }, + "etternavn": { + "spoersmaal": "Etternavn", + "svar": "Vikernes" + } + } + } + } + ], + "andreStoenader": [], + "mottattDato": "2023-11-30T18:05:49.337092713", + "template": "omstillingsstoenad_v2" +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b128723a..9b7f65b0 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -8,6 +8,7 @@ jupiter-version = "5.11.0" cxf-version = "4.0.5" # Obs: Når vi oppgraderer denne, bør vi også kunne rydde bort guava og guava-workarounden bcpkix-version = "1.78.1" angus-version = "1.1.0" +jackson-version = "2.17.2" [libraries] @@ -30,6 +31,11 @@ ktor-serverContentNegotiation = { module = "io.ktor:ktor-server-content-negotiat ktor-serverNetty = { module = "io.ktor:ktor-server-netty", version.ref = "ktor-version" } ktor-serverTests = { module = "io.ktor:ktor-server-tests", version.ref = "ktor-version" } +#Jackson +jacksonDatatypejsr310 = { module = "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", version.ref = "jackson-version" } +jackson-datatypejdk8 = { module = "com.fasterxml.jackson.datatype:jackson-datatype-jdk8", version.ref = "jackson-version" } +jackson-modulekotlin = { module = "com.fasterxml.jackson.module:jackson-module-kotlin", version.ref = "jackson-version" } + #Kafka kafka-avro-serializer = { module = "io.confluent:kafka-avro-serializer", version = "7.6.0"} commons-compress = { module = "org.apache.commons:commons-compress", version = "1.27.1" } @@ -50,6 +56,9 @@ micrometer-prometheus = { module = "io.micrometer:micrometer-registry-prometheus #MockK mockk = { module = "io.mockk:mockk", version = "1.13.12" } +# Kotest +test-kotest-assertionscore = { module = "io.kotest:kotest-assertions-core", version = "5.9.1" } + #Cxf cxf-logging = { module = "org.apache.cxf:cxf-rt-features-logging", version.ref = "cxf-version" } cxf-jax-ws = { module = "org.apache.cxf:cxf-rt-frontend-jaxws", version.ref = "cxf-version" } diff --git a/settings.gradle.kts b/settings.gradle.kts index 6058b034..87d9b43d 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -6,5 +6,6 @@ plugins { include( "apps:etterlatte-proxy", - "apps:etterlatte-notifikasjoner" + "apps:etterlatte-notifikasjoner", + "common" )