Skip to content

Commit

Permalink
Merge branch 'main' into dev/domene-pakke
Browse files Browse the repository at this point in the history
  • Loading branch information
bjerga committed Oct 11, 2023
2 parents a4ba3f2 + f097a57 commit a8b37ed
Show file tree
Hide file tree
Showing 11 changed files with 217 additions and 29 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import kotlinx.serialization.SerializationException
import kotlinx.serialization.builtins.serializer
import no.nav.helsearbeidsgiver.domene.inntektsmelding.FullLoennIArbeidsgiverPerioden
import no.nav.helsearbeidsgiver.domene.inntektsmelding.Innsending
import no.nav.helsearbeidsgiver.domene.inntektsmelding.Refusjon
import no.nav.helsearbeidsgiver.inntektsmelding.api.RedisPollerTimeoutException
import no.nav.helsearbeidsgiver.inntektsmelding.api.Routes
import no.nav.helsearbeidsgiver.inntektsmelding.api.auth.authorize
Expand Down Expand Up @@ -42,20 +43,53 @@ fun RouteExtra.innsendingRoute() {

if (forespoerselId != null) {
try {
val request = call.receiveText().fromJson(Innsending.serializer()).let {
// TODO gjør denne sjekken ved opprettelse
if (it.fullLønnIArbeidsgiverPerioden?.utbetalerFullLønn == true) {
it.copy(
fullLønnIArbeidsgiverPerioden = FullLoennIArbeidsgiverPerioden(
utbetalerFullLønn = true,
begrunnelse = null,
utbetalt = null
val request = call.receiveText().fromJson(Innsending.serializer())
.let {
// TODO gjør denne sjekken ved opprettelse
if (it.fullLønnIArbeidsgiverPerioden?.utbetalerFullLønn == true) {
it.copy(
fullLønnIArbeidsgiverPerioden = FullLoennIArbeidsgiverPerioden(
utbetalerFullLønn = true,
begrunnelse = null,
utbetalt = null
)
)
)
} else {
it
} else {
it
}
}
.let {
// TODO gjør denne sjekken ved opprettelse
if (!it.refusjon.utbetalerHeleEllerDeler) {
it.copy(
refusjon = Refusjon(
utbetalerHeleEllerDeler = false,
refusjonPrMnd = null,
refusjonOpphører = null,
refusjonEndringer = null
)
)
} else {
it
}
}
.let {
// TODO gjør denne sjekken ved opprettelse
if (it.forespurtData?.contains("arbeidsgiverperiode") == false) {
if (it.fullLønnIArbeidsgiverPerioden != null) {
"Frontend sender med ${Innsending::fullLønnIArbeidsgiverPerioden.name} når man ikke ber om AGP."
.also { feilmelding ->
logger.error(feilmelding)
sikkerLogger.error(feilmelding)
}
}
it.copy(
fullLønnIArbeidsgiverPerioden = null
)
} else {
it
}
}
}

"Mottok innsending med forespørselId: $forespoerselId".let {
logger.info(it)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ import org.valiktor.functions.isGreaterThanOrEqualTo
import org.valiktor.functions.isLessThan
import org.valiktor.functions.isNotEmpty
import org.valiktor.functions.isNotNull
import org.valiktor.functions.isNull
import org.valiktor.functions.isTrue
import org.valiktor.functions.validate
import org.valiktor.functions.validateForEach
Expand All @@ -36,9 +35,6 @@ fun Innsending.validate() {
validate(FullLoennIArbeidsgiverPerioden::utbetalt).isLessThan(1_000_000.0)
}
}
} else {
// skal ikke komme i delvis im - gir ikke mening - og da bør vi heller ikke ta det imot og lagre det!!
validate(Innsending::fullLønnIArbeidsgiverPerioden).isNull()
}
// Den ansatte
validate(Innsending::orgnrUnderenhet).isNotNull()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,21 @@

package no.nav.helsearbeidsgiver.inntektsmelding.api.innsending

import io.kotest.matchers.nulls.shouldBeNull
import io.kotest.matchers.shouldBe
import io.ktor.client.statement.bodyAsText
import io.ktor.http.HttpStatusCode
import io.mockk.clearAllMocks
import io.mockk.coEvery
import io.mockk.every
import io.mockk.verifySequence
import kotlinx.serialization.json.JsonNull
import no.nav.helsearbeidsgiver.domene.inntektsmelding.BegrunnelseIngenEllerRedusertUtbetalingKode
import no.nav.helsearbeidsgiver.domene.inntektsmelding.FullLoennIArbeidsgiverPerioden
import no.nav.helsearbeidsgiver.domene.inntektsmelding.Innsending
import no.nav.helsearbeidsgiver.domene.inntektsmelding.Inntektsmelding
import no.nav.helsearbeidsgiver.domene.inntektsmelding.Refusjon
import no.nav.helsearbeidsgiver.domene.inntektsmelding.RefusjonEndring
import no.nav.helsearbeidsgiver.felles.Tilgang
import no.nav.helsearbeidsgiver.felles.test.mock.DELVIS_INNSENDING_REQUEST
import no.nav.helsearbeidsgiver.felles.test.mock.GYLDIG_INNSENDING_REQUEST
Expand All @@ -23,6 +31,8 @@ import no.nav.helsearbeidsgiver.inntektsmelding.api.utils.ApiTest
import no.nav.helsearbeidsgiver.utils.json.fromJson
import no.nav.helsearbeidsgiver.utils.json.toJson
import no.nav.helsearbeidsgiver.utils.json.toJsonStr
import no.nav.helsearbeidsgiver.utils.test.date.april
import no.nav.helsearbeidsgiver.utils.test.date.mars
import no.nav.helsearbeidsgiver.utils.test.mock.mockConstructor
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.BeforeEach
Expand Down Expand Up @@ -117,6 +127,127 @@ class InnsendingRouteKtTest : ApiTest() {
assertEquals(InnsendingResponse(Mock.forespoerselId).toJsonStr(InnsendingResponse.serializer()), response.bodyAsText())
}

@Test
fun `fjern ugyldige verdier ved utbetaling av full lønn i arbeisdgiverperioden`() = testApi {
mockTilgang(Tilgang.HAR_TILGANG)

val mockClientId = UUID.randomUUID()

// Må bare returnere noe
coEvery { anyConstructed<RedisPoller>().hent(mockClientId, any(), any()) } returns JsonNull

val request = GYLDIG_INNSENDING_REQUEST.copy(
fullLønnIArbeidsgiverPerioden = FullLoennIArbeidsgiverPerioden(
utbetalerFullLønn = true,
begrunnelse = BegrunnelseIngenEllerRedusertUtbetalingKode.StreikEllerLockout,
utbetalt = 1_000_000.0
)
)
.toJson(Innsending.serializer())

mockConstructor(InnsendingProducer::class) {
every { anyConstructed<InnsendingProducer>().publish(any(), any(), any()) } returns mockClientId

post(path, request)

verifySequence {
anyConstructed<InnsendingProducer>().publish(
forespoerselId = any(),
request = withArg {
it.fullLønnIArbeidsgiverPerioden shouldBe FullLoennIArbeidsgiverPerioden(
utbetalerFullLønn = true,
begrunnelse = null,
utbetalt = null
)
},
arbeidsgiverFnr = any()
)
}
}
}

@Test
fun `fjern ugyldige verdier ved ingen refusjon`() = testApi {
mockTilgang(Tilgang.HAR_TILGANG)

val mockClientId = UUID.randomUUID()

// Må bare returnere noe
coEvery { anyConstructed<RedisPoller>().hent(mockClientId, any(), any()) } returns JsonNull

val request = GYLDIG_INNSENDING_REQUEST.copy(
refusjon = Refusjon(
utbetalerHeleEllerDeler = false,
refusjonPrMnd = 2_222_222.0,
refusjonOpphører = 28.april,
refusjonEndringer = listOf(
RefusjonEndring(
beløp = 1_111_111.0,
dato = 20.mars
)
)
)
)
.toJson(Innsending.serializer())

mockConstructor(InnsendingProducer::class) {
every { anyConstructed<InnsendingProducer>().publish(any(), any(), any()) } returns mockClientId

post(path, request)

verifySequence {
anyConstructed<InnsendingProducer>().publish(
forespoerselId = any(),
request = withArg {
it.refusjon shouldBe Refusjon(
utbetalerHeleEllerDeler = false,
refusjonPrMnd = null,
refusjonOpphører = null,
refusjonEndringer = null
)
},
arbeidsgiverFnr = any()
)
}
}
}

@Test
fun `fjern ugyldige verdier dersom man ikke spør om AGP`() = testApi {
mockTilgang(Tilgang.HAR_TILGANG)

val mockClientId = UUID.randomUUID()

// Må bare returnere noe
coEvery { anyConstructed<RedisPoller>().hent(mockClientId, any(), any()) } returns JsonNull

val request = GYLDIG_INNSENDING_REQUEST.copy(
forespurtData = listOf("inntekt", "refusjon"),
fullLønnIArbeidsgiverPerioden = FullLoennIArbeidsgiverPerioden(
utbetalerFullLønn = false,
begrunnelse = BegrunnelseIngenEllerRedusertUtbetalingKode.FravaerUtenGyldigGrunn,
utbetalt = 222_333.0
)
)
.toJson(Innsending.serializer())

mockConstructor(InnsendingProducer::class) {
every { anyConstructed<InnsendingProducer>().publish(any(), any(), any()) } returns mockClientId

post(path, request)

verifySequence {
anyConstructed<InnsendingProducer>().publish(
forespoerselId = any(),
request = withArg {
it.fullLønnIArbeidsgiverPerioden.shouldBeNull()
},
arbeidsgiverFnr = any()
)
}
}
}

private object Mock {
val forespoerselId: UUID = UUID.randomUUID()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,11 +40,11 @@ class InnsendingValidateKtTest : FunSpec({
val maksNaturalBeloep = 1_000_000.0
val negativtBeloep = -0.1

test("skal akseptere gyldig") {
test("godtar fullstendig innsending") {
GYLDIG_INNSENDING_REQUEST.validate()
}

test("skal tillate at refusjon i arbeidsgiverperioden ikke settes (ved delvis innsending)") {
test("godtar delvis innsending") {
DELVIS_INNSENDING_REQUEST.validate()
}

Expand Down Expand Up @@ -105,10 +105,6 @@ class InnsendingValidateKtTest : FunSpec({
).validate()
}
test("skal godta delvis innsending") {
DELVIS_INNSENDING_REQUEST.validate()
}
test("skal gi feilmelding når orgnummer er ugyldig") {
shouldThrowExactly<ConstraintViolationException> {
GYLDIG_INNSENDING_REQUEST.copy(orgnrUnderenhet = "").validate()
Expand Down
3 changes: 3 additions & 0 deletions dokument/src/main/resources/spesifikasjon.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -283,6 +283,9 @@ components:
Feilregistrert:
allOf:
- $ref: '#/components/schemas/InntektEndringAarsak'
Ferietrekk:
allOf:
- $ref: '#/components/schemas/InntektEndringAarsak'

InntektsmeldingDokument:
type: object
Expand Down
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ kotlinVersion=1.9.10
kotlinterVersion=3.13.0

# Dependency versions
hagDomeneInntektsmeldingVersion=0.0.5
hagDomeneInntektsmeldingVersion=0.0.7
junitJupiterVersion=5.10.0
kotestVersion=5.7.2
kotlinCoroutinesVersion=1.7.3
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import no.nav.helsearbeidsgiver.domene.inntektsmelding.AarsakInnsending
import no.nav.helsearbeidsgiver.domene.inntektsmelding.Bonus
import no.nav.helsearbeidsgiver.domene.inntektsmelding.Feilregistrert
import no.nav.helsearbeidsgiver.domene.inntektsmelding.Ferie
import no.nav.helsearbeidsgiver.domene.inntektsmelding.Ferietrekk
import no.nav.helsearbeidsgiver.domene.inntektsmelding.Inntektsmelding
import no.nav.helsearbeidsgiver.domene.inntektsmelding.NyStilling
import no.nav.helsearbeidsgiver.domene.inntektsmelding.NyStillingsprosent
Expand Down Expand Up @@ -184,6 +185,7 @@ class PdfDokument(val dokument: Inntektsmelding) {
null -> return // trenger ikke sende inn årsak...
is Permisjon -> addPermisjon(endringsårsak)
is Ferie -> addFerie(endringsårsak)
is Ferietrekk -> addFerietrekk()
is Permittering -> addPermittering(endringsårsak)
is Tariffendring -> addTariffendring(endringsårsak)
is VarigLonnsendring -> addVarigLonnsendring(endringsårsak)
Expand Down Expand Up @@ -249,6 +251,9 @@ class PdfDokument(val dokument: Inntektsmelding) {
// addLabel("Estimert årlig bonus", årligBonus.toNorsk())
// addLabel("Dato siste bonus", datoBonus.toNorsk())
}
private fun addFerietrekk() {
addLabel(FORKLARING_ENDRING, "Ferietrekk")
}

private fun addRefusjon() {
addSection("Refusjon")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package no.nav.helsearbeidsgiver.inntektsmelding.joark.mappers
import no.nav.helsearbeidsgiver.domene.inntektsmelding.Bonus
import no.nav.helsearbeidsgiver.domene.inntektsmelding.Feilregistrert
import no.nav.helsearbeidsgiver.domene.inntektsmelding.Ferie
import no.nav.helsearbeidsgiver.domene.inntektsmelding.Ferietrekk
import no.nav.helsearbeidsgiver.domene.inntektsmelding.InntektEndringAarsak
import no.nav.helsearbeidsgiver.domene.inntektsmelding.NyStilling
import no.nav.helsearbeidsgiver.domene.inntektsmelding.NyStillingsprosent
Expand All @@ -20,6 +21,7 @@ fun InntektEndringAarsak.stringValue(): String {
is Nyansatt -> "Nyansatt"
is Bonus -> "Bonus" // Beløp og dato ikke implementert i frontend
is Ferie -> "Ferie: ${liste.lesbar()}"
is Ferietrekk -> "Ferietrekk"
is Sykefravaer -> "Sykefravær: ${liste.lesbar()}"
is NyStilling -> "Ny stilling: fra $gjelderFra"
is NyStillingsprosent -> "Ny stillingsprosent: fra $gjelderFra"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package no.nav.helsearbeidsgiver.inntektsmelding.joark.dokument

import io.kotest.core.spec.style.FunSpec
import io.kotest.datatest.withData
import io.kotest.matchers.collections.shouldBeIn
import no.nav.helsearbeidsgiver.felles.inntektsmelding.felles.models.BegrunnelseIngenEllerRedusertUtbetalingKode
import no.nav.helsearbeidsgiver.felles.inntektsmelding.felles.models.NaturalytelseKode
import no.nav.inntektsmelding.xml.kodeliste._20210216.BegrunnelseIngenEllerRedusertUtbetalingKodeliste
import no.nav.inntektsmelding.xml.kodeliste._20210216.NaturalytelseKodeliste

class EnumTilKodeverkListeTest : FunSpec({
context("Sjekk at NaturalytelseKodeliste i kodeverk tilsvarer NaturalYtelseKode i domenemodellen") {
withData(NaturalytelseKode.entries) { kode ->
kode.value shouldBeIn NaturalytelseKodeliste.entries.map { it.value().uppercase() }
}
}

context("Sjekk at BegrunnelseIngenEllerRedusertUtbetalingKodeliste i kodeverk tilsvarer BegrunnelseIngenEllerRedusertUtbetalingKode i domenemodellen") {
withData(BegrunnelseIngenEllerRedusertUtbetalingKode.entries.map { it.value }) { kode ->
kode shouldBeIn BegrunnelseIngenEllerRedusertUtbetalingKodeliste.entries.map { it.value() }
}
}
})
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ class OpprettOppgaveLoeser(
grupperingsid = forespørselId,
varslingTittel = "Nav trenger inntektsmelding",
varslingInnhold = "En av dine ansatte har sendt søknad for sykepenger og vi trenger inntektsmelding for å behandle " +
"søknaden. Logg inn på Min side – arbeidsgiver på nav.no"
"søknaden. Logg inn på Min side – arbeidsgiver hos NAV"
)
}.also {
requestTimer.observeDuration()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,7 @@ class TilgangService(
else -> null
}

return if (manglendeDatafelt != null) {
if (manglendeDatafelt != null) {
val feilmelding = Feilmelding("Teknisk feil, prøv igjen senere.", -1, manglendeDatafelt)

sikkerLogger.error("Mottok feilmelding: '${feilmelding.melding}'")
Expand All @@ -222,11 +222,9 @@ class TilgangService(
.toJson(FeilReport.serializer())

feilKey.write(feilReport)

Transaction.TERMINATE
} else {
Transaction.IN_PROGRESS
}

return Transaction.TERMINATE
}

private fun RedisKey.write(json: JsonElement) {
Expand Down

0 comments on commit a8b37ed

Please sign in to comment.