From 15c5238f77679aacb109362f56c4e93cc9444028 Mon Sep 17 00:00:00 2001 From: Gustav Berggren <83211434+b162214@users.noreply.github.com> Date: Thu, 31 Oct 2024 11:31:56 +0100 Subject: [PATCH] =?UTF-8?q?Legg=20p=C3=A5=20sykmeldingsperiode=20i=20p?= =?UTF-8?q?=C3=A5minnelse=20varselet=20(#741)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ta med sykmeldingsperioder i påminnelse varselet til arbeidsgiver. Dermed blir det lettere for arbeidsgiver å forstå hvilken forespørsel eposten handler om. Co-authored-by: Magnus Sælensminde --- .../ArbeidsgiverNotifikasjonKlientUtils.kt | 18 ++++++++- .../OpprettForespoerselSakOgOppgaveRiver.kt | 5 +++ ...ArbeidsgiverNotifikasjonKlientUtilsTest.kt | 17 +++++++++ ...pprettForespoerselSakOgOppgaveRiverTest.kt | 37 +++++++++++++------ 4 files changed, 64 insertions(+), 13 deletions(-) diff --git a/notifikasjon/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/notifikasjon/ArbeidsgiverNotifikasjonKlientUtils.kt b/notifikasjon/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/notifikasjon/ArbeidsgiverNotifikasjonKlientUtils.kt index 466e1c21c..810e95dca 100644 --- a/notifikasjon/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/notifikasjon/ArbeidsgiverNotifikasjonKlientUtils.kt +++ b/notifikasjon/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/notifikasjon/ArbeidsgiverNotifikasjonKlientUtils.kt @@ -6,11 +6,14 @@ import no.nav.helsearbeidsgiver.arbeidsgivernotifikasjon.Paaminnelse import no.nav.helsearbeidsgiver.arbeidsgivernotifikasjon.SakEllerOppgaveDuplikatException import no.nav.helsearbeidsgiver.arbeidsgivernotifikasjon.SakEllerOppgaveFinnesIkkeException import no.nav.helsearbeidsgiver.arbeidsgivernotifkasjon.graphql.generated.enums.SaksStatus +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Periode import no.nav.helsearbeidsgiver.felles.domene.Person import no.nav.helsearbeidsgiver.utils.log.logger import no.nav.helsearbeidsgiver.utils.log.sikkerLogger import no.nav.helsearbeidsgiver.utils.wrapper.Fnr import no.nav.helsearbeidsgiver.utils.wrapper.Orgnr +import java.time.LocalDate +import java.time.format.DateTimeFormatter import java.util.UUID import kotlin.time.Duration.Companion.days @@ -64,9 +67,10 @@ object NotifikasjonTekst { fun paaminnelseInnhold( orgnr: Orgnr, orgNavn: String, + sykmeldingsPerioder: List, ): String = listOf( - "Nav venter fortsatt på inntektsmelding for en av deres ansatte.", + "Nav venter fortsatt på inntektsmelding for en av deres ansatte${sykmeldingsPerioder.tilString() ?: ""}.", "Vi trenger inntektsmeldingen så snart som mulig,", "ellers kan vi ikke behandle søknaden om sykepenger.", "Logg inn på Min side – arbeidsgiver på Nav for å finne ut hvilken inntektsmelding det gjelder.", @@ -171,6 +175,7 @@ fun ArbeidsgiverNotifikasjonKlient.opprettOppgave( skalHaPaaminnelse: Boolean, paaminnelseAktivert: Boolean, tidMellomOppgaveopprettelseOgPaaminnelse: String, + sykmeldingsPerioder: List, ): String = try { runBlocking { @@ -188,7 +193,7 @@ fun ArbeidsgiverNotifikasjonKlient.opprettOppgave( if (skalHaPaaminnelse && paaminnelseAktivert) { Paaminnelse( tittel = "Påminnelse: ${NotifikasjonTekst.STATUS_TEKST_UNDER_BEHANDLING}", - innhold = NotifikasjonTekst.paaminnelseInnhold(orgnr, orgNavn), + innhold = NotifikasjonTekst.paaminnelseInnhold(orgnr, orgNavn, sykmeldingsPerioder), tidMellomOppgaveopprettelseOgPaaminnelse = tidMellomOppgaveopprettelseOgPaaminnelse, ).also { logger.info("Satte påminnelse for forespørsel $forespoerselId") } } else { @@ -260,6 +265,15 @@ private fun Fnr.lesFoedselsdato(): String { } } +fun LocalDate.tilString(): String = format(DateTimeFormatter.ofPattern("dd.MM.yyyy")) + +fun List.tilString(): String? = + when (size) { + 0 -> null + 1 -> " for periode: ${first().fom.tilString()} - ${first().tom.tilString()}" + else -> " for periode: ${first().fom.tilString()} - [...] - ${last().tom.tilString()}" + } + private fun loggWarnIkkeFunnetEllerThrow( melding: String, error: Throwable, diff --git a/notifikasjon/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/notifikasjon/river/OpprettForespoerselSakOgOppgaveRiver.kt b/notifikasjon/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/notifikasjon/river/OpprettForespoerselSakOgOppgaveRiver.kt index 1b835c26e..6d38c9ab3 100644 --- a/notifikasjon/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/notifikasjon/river/OpprettForespoerselSakOgOppgaveRiver.kt +++ b/notifikasjon/src/main/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/notifikasjon/river/OpprettForespoerselSakOgOppgaveRiver.kt @@ -5,9 +5,11 @@ import kotlinx.serialization.json.JsonElement import no.nav.helsearbeidsgiver.arbeidsgivernotifikasjon.ArbeidsgiverNotifikasjonKlient import no.nav.helsearbeidsgiver.felles.EventName import no.nav.helsearbeidsgiver.felles.Key +import no.nav.helsearbeidsgiver.felles.domene.Forespoersel import no.nav.helsearbeidsgiver.felles.domene.Person import no.nav.helsearbeidsgiver.felles.json.krev import no.nav.helsearbeidsgiver.felles.json.les +import no.nav.helsearbeidsgiver.felles.json.lesOrNull import no.nav.helsearbeidsgiver.felles.json.toJson import no.nav.helsearbeidsgiver.felles.json.toMap import no.nav.helsearbeidsgiver.felles.rapidsrivers.model.Fail @@ -32,6 +34,7 @@ data class OpprettForespoerselSakOgOppgaveMelding( val sykmeldt: Person, val orgNavn: String, val skalHaPaaminnelse: Boolean, + val forespoersel: Forespoersel?, ) class OpprettForespoerselSakOgOppgaveRiver( @@ -56,6 +59,7 @@ class OpprettForespoerselSakOgOppgaveRiver( sykmeldt = Key.SYKMELDT.les(Person.serializer(), data), orgNavn = Key.VIRKSOMHET.les(String.serializer(), data), skalHaPaaminnelse = Key.SKAL_HA_PAAMINNELSE.les(Boolean.serializer(), data), + forespoersel = Key.FORESPOERSEL.lesOrNull(Forespoersel.serializer(), data), ) } @@ -79,6 +83,7 @@ class OpprettForespoerselSakOgOppgaveRiver( skalHaPaaminnelse = skalHaPaaminnelse, paaminnelseAktivert = paaminnelseToggle.oppgavePaaminnelseAktivert, tidMellomOppgaveopprettelseOgPaaminnelse = paaminnelseToggle.tidMellomOppgaveopprettelseOgPaaminnelse, + sykmeldingsPerioder = forespoersel?.sykmeldingsperioder.orEmpty(), ) return mapOf( diff --git a/notifikasjon/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/notifikasjon/ArbeidsgiverNotifikasjonKlientUtilsTest.kt b/notifikasjon/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/notifikasjon/ArbeidsgiverNotifikasjonKlientUtilsTest.kt index 62c8e7ad3..66b725597 100644 --- a/notifikasjon/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/notifikasjon/ArbeidsgiverNotifikasjonKlientUtilsTest.kt +++ b/notifikasjon/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/notifikasjon/ArbeidsgiverNotifikasjonKlientUtilsTest.kt @@ -1,8 +1,13 @@ package no.nav.helsearbeidsgiver.inntektsmelding.notifikasjon import io.kotest.core.spec.style.FunSpec +import io.kotest.data.row +import io.kotest.datatest.withData import io.kotest.matchers.shouldBe +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.til import no.nav.helsearbeidsgiver.felles.domene.Person +import no.nav.helsearbeidsgiver.utils.test.date.februar +import no.nav.helsearbeidsgiver.utils.test.date.januar import no.nav.helsearbeidsgiver.utils.wrapper.Fnr class ArbeidsgiverNotifikasjonKlientUtilsTest : @@ -21,4 +26,16 @@ class ArbeidsgiverNotifikasjonKlientUtilsTest : NotifikasjonTekst.sakTittel(person) shouldBe "Inntektsmelding for Pierce Brosjan: f. 230475" } } + + context("Generer riktig periode tekst for oppgave varsel tekst") { + withData( + mapOf( + "ingen perioder" to row(emptyList(), null), + "en periode" to row(listOf(1.januar til 31.januar), " for periode: 01.01.2018 - 31.01.2018"), + "to perioder" to row(listOf(1.januar til 31.januar, 1.februar til 28.februar), " for periode: 01.01.2018 - [...] - 28.02.2018"), + ), + ) { (perioder, forventet) -> + perioder.tilString() shouldBe forventet + } + } }) diff --git a/notifikasjon/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/notifikasjon/river/OpprettForespoerselSakOgOppgaveRiverTest.kt b/notifikasjon/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/notifikasjon/river/OpprettForespoerselSakOgOppgaveRiverTest.kt index 9b0fc885c..04ac803df 100644 --- a/notifikasjon/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/notifikasjon/river/OpprettForespoerselSakOgOppgaveRiverTest.kt +++ b/notifikasjon/src/test/kotlin/no/nav/helsearbeidsgiver/inntektsmelding/notifikasjon/river/OpprettForespoerselSakOgOppgaveRiverTest.kt @@ -18,17 +18,19 @@ import no.nav.helsearbeidsgiver.arbeidsgivernotifkasjon.graphql.generated.enums. import no.nav.helsearbeidsgiver.felles.BehovType import no.nav.helsearbeidsgiver.felles.EventName import no.nav.helsearbeidsgiver.felles.Key +import no.nav.helsearbeidsgiver.felles.domene.Forespoersel import no.nav.helsearbeidsgiver.felles.domene.Person import no.nav.helsearbeidsgiver.felles.json.toJson import no.nav.helsearbeidsgiver.felles.json.toMap import no.nav.helsearbeidsgiver.felles.rapidsrivers.model.Fail +import no.nav.helsearbeidsgiver.felles.test.mock.mockForespoersel import no.nav.helsearbeidsgiver.felles.test.rapidsrivers.firstMessage import no.nav.helsearbeidsgiver.felles.test.rapidsrivers.sendJson import no.nav.helsearbeidsgiver.inntektsmelding.notifikasjon.NotifikasjonTekst import no.nav.helsearbeidsgiver.inntektsmelding.notifikasjon.PaaminnelseToggle import no.nav.helsearbeidsgiver.inntektsmelding.notifikasjon.sakLevetid +import no.nav.helsearbeidsgiver.utils.collection.mapValuesNotNull import no.nav.helsearbeidsgiver.utils.json.toJson -import no.nav.helsearbeidsgiver.utils.test.wrapper.genererGyldig import no.nav.helsearbeidsgiver.utils.wrapper.Fnr import no.nav.helsearbeidsgiver.utils.wrapper.Orgnr import java.util.UUID @@ -94,7 +96,14 @@ class OpprettForespoerselSakOgOppgaveRiverTest : paaminnelse = Paaminnelse( tittel = "Påminnelse: ${NotifikasjonTekst.STATUS_TEKST_UNDER_BEHANDLING}", - innhold = NotifikasjonTekst.paaminnelseInnhold(innkommendeMelding.orgnr, innkommendeMelding.orgNavn), + innhold = + NotifikasjonTekst.paaminnelseInnhold( + innkommendeMelding.orgnr, + innkommendeMelding.orgNavn, + innkommendeMelding.forespoersel + ?.sykmeldingsperioder + .orEmpty(), + ), tidMellomOppgaveopprettelseOgPaaminnelse = "P28D", ), ) @@ -240,19 +249,24 @@ class OpprettForespoerselSakOgOppgaveRiverTest : } }) +private object OpprettSakOgOppgaveMock { + val forespoerselId = UUID.randomUUID() + val forespoersel = mockForespoersel() + val orgnr = Orgnr(forespoersel.orgnr) + val orgNavn = "Peer Gynts Løgn og Bedrageri LTD" + val person = Person(Fnr(forespoersel.fnr), "Peer Gynt") +} + fun innkommendeOpprettForespoerselSakOgOppgaveMelding(): OpprettForespoerselSakOgOppgaveMelding = OpprettForespoerselSakOgOppgaveMelding( eventName = EventName.SAK_OG_OPPGAVE_OPPRETT_REQUESTED, transaksjonId = UUID.randomUUID(), - forespoerselId = UUID.randomUUID(), - orgnr = Orgnr.genererGyldig(), - sykmeldt = - Person( - fnr = Fnr.genererGyldig(), - navn = "Peer Gynt", - ), - orgNavn = "Peer Gynts Løgn og Bedrageri LTD", + forespoerselId = OpprettSakOgOppgaveMock.forespoerselId, + orgnr = OpprettSakOgOppgaveMock.orgnr, + sykmeldt = OpprettSakOgOppgaveMock.person, + orgNavn = OpprettSakOgOppgaveMock.orgNavn, skalHaPaaminnelse = true, + forespoersel = OpprettSakOgOppgaveMock.forespoersel, ) private fun OpprettForespoerselSakOgOppgaveMelding.toMap() = @@ -266,7 +280,8 @@ private fun OpprettForespoerselSakOgOppgaveMelding.toMap() = Key.SYKMELDT to sykmeldt.toJson(Person.serializer()), Key.VIRKSOMHET to orgNavn.toJson(), Key.SKAL_HA_PAAMINNELSE to skalHaPaaminnelse.toJson(Boolean.serializer()), - ).toJson(), + Key.FORESPOERSEL to forespoersel?.toJson(Forespoersel.serializer()), + ).mapValuesNotNull { it }.toJson(), ) private fun forventetUtgaaendeMelding(