Skip to content

Commit

Permalink
Vis sykmeldingsperioder som tilleggsinfo på sak (#746)
Browse files Browse the repository at this point in the history
  • Loading branch information
bjerga authored Nov 4, 2024
1 parent 766c130 commit 6613483
Show file tree
Hide file tree
Showing 13 changed files with 77 additions and 73 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,11 @@ package no.nav.helsearbeidsgiver.felles.utils

import java.time.LocalDate
import java.time.YearMonth
import java.time.format.DateTimeFormatter

private val norskDatoFormat = DateTimeFormatter.ofPattern("dd.MM.yyyy")

fun LocalDate.tilNorskFormat(): String = format(norskDatoFormat)

fun LocalDate.toYearMonth(): YearMonth = YearMonth.of(year, month)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,9 @@ class ForespoerselMottattRiver : PriObjectRiver<Melding>() {
Key.DATA to
mapOf(
Key.FORESPOERSEL_ID to forespoerselId.toJson(),
// TODO kan fjernes etter overgangsfase
Key.ORGNRUNDERENHET to orgnr.toJson(),
// TODO kan fjernes etter overgangsfase
Key.FNR to fnr.toJson(),
Key.SKAL_HA_PAAMINNELSE to skalHaPaaminnelse.toJson(Boolean.serializer()),
Key.FORESPOERSEL to forespoerselFraBro.toForespoersel().toJson(Forespoersel.serializer()),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import io.kotest.matchers.nulls.shouldNotBeNull
import io.kotest.matchers.shouldBe
import io.mockk.coEvery
import kotlinx.serialization.builtins.serializer
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.til
import no.nav.helsearbeidsgiver.felles.BehovType
import no.nav.helsearbeidsgiver.felles.EventName
import no.nav.helsearbeidsgiver.felles.Key
Expand All @@ -21,6 +22,8 @@ import no.nav.helsearbeidsgiver.utils.json.fromJson
import no.nav.helsearbeidsgiver.utils.json.serializer.UuidSerializer
import no.nav.helsearbeidsgiver.utils.json.serializer.set
import no.nav.helsearbeidsgiver.utils.json.toJson
import no.nav.helsearbeidsgiver.utils.test.date.januar
import no.nav.helsearbeidsgiver.utils.test.date.mars
import no.nav.helsearbeidsgiver.utils.test.wrapper.genererGyldig
import no.nav.helsearbeidsgiver.utils.wrapper.Fnr
import no.nav.helsearbeidsgiver.utils.wrapper.Orgnr
Expand Down Expand Up @@ -52,7 +55,7 @@ class ForespoerselMottattIT : EndToEndTest() {
fnr = Mock.fnr,
forespoerselId = Mock.forespoerselId,
vedtaksperiodeId = UUID.randomUUID(),
sykmeldingsperioder = emptyList(),
sykmeldingsperioder = listOf(23.januar til 15.mars),
egenmeldingsperioder = emptyList(),
bestemmendeFravaersdager = emptyMap(),
forespurtData = mockForespurtData(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,14 @@ import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Permittering
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Sykefravaer
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Tariffendring
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.VarigLoennsendring
import no.nav.helsearbeidsgiver.felles.utils.tilNorskFormat

private const val FORKLARING_ENDRING = "Forklaring for endring"

class PdfDokument(
val inntektsmelding: Inntektsmelding,
) {
private val pdf = PdfBuilder(bodySize = 20, topText = "Innsendt: ${inntektsmelding.mottatt.toNorsk()}") // Setter skriftstørrelsen på labels og text
private val pdf = PdfBuilder(bodySize = 20, topText = "Innsendt: ${inntektsmelding.mottatt.tilNorskFormat()}") // Setter skriftstørrelsen på labels og text
private var y = 0
private val kolonneEn = 0
private val kolonneTo = 420
Expand Down Expand Up @@ -158,7 +159,7 @@ class PdfDokument(
val seksjonStartY = y // Husk når denne seksjonen starter i y-aksen

// --- Kolonnen til venstre -------------------------------------------------
addLabel("Bestemmende fraværsdag (skjæringstidpunkt)", inntektsmelding.inntekt?.inntektsdato?.toNorsk(), kolonneEn)
addLabel("Bestemmende fraværsdag (skjæringstidpunkt)", inntektsmelding.inntekt?.inntektsdato?.tilNorskFormat(), kolonneEn)
addLabel("Arbeidsgiverperiode", x = kolonneEn)
addPerioder(kolonneEn, inntektsmelding.agp?.perioder.orEmpty())

Expand All @@ -185,14 +186,17 @@ class PdfDokument(
perioder: List<Periode>,
) {
perioder.forEach {
addLabel("Fra", it.fom.toNorsk(), x, linefeed = false)
addLabel("Til", it.tom.toNorsk(), x + 200)
addLabel("Fra", it.fom.tilNorskFormat(), x, linefeed = false)
addLabel("Til", it.tom.tilNorskFormat(), x + 200)
}
}

private fun addInntekt() {
addSection("Beregnet månedslønn")
addLabel("Registrert inntekt (per ${inntektsmelding.inntekt?.inntektsdato?.toNorsk()})", "${inntektsmelding.inntekt?.beloep?.toNorsk()} kr/måned")
addLabel(
"Registrert inntekt (per ${inntektsmelding.inntekt?.inntektsdato?.tilNorskFormat()})",
"${inntektsmelding.inntekt?.beloep?.tilNorskFormat()} kr/måned",
)
val endringAarsak = inntektsmelding.inntekt?.endringAarsak
when (endringAarsak) {
null -> return // trenger ikke sende inn årsak...
Expand Down Expand Up @@ -245,29 +249,29 @@ class PdfDokument(

private fun addTariffendring(tariffendring: Tariffendring) {
addLabel(FORKLARING_ENDRING, "Tariffendring")
addLabel("Gjelder fra", tariffendring.gjelderFra.toNorsk(), linefeed = false)
addLabel("Ble kjent", tariffendring.bleKjent.toNorsk(), kolonneTo)
addLabel("Gjelder fra", tariffendring.gjelderFra.tilNorskFormat(), linefeed = false)
addLabel("Ble kjent", tariffendring.bleKjent.tilNorskFormat(), kolonneTo)
}

private fun addVarigLonnsendring(varigLoennsendring: VarigLoennsendring) {
addLabel(FORKLARING_ENDRING, "Varig lønnsendring")
addLabel("Gjelder fra", varigLoennsendring.gjelderFra.toNorsk())
addLabel("Gjelder fra", varigLoennsendring.gjelderFra.tilNorskFormat())
}

private fun addNyStilling(nyStilling: NyStilling) {
addLabel(FORKLARING_ENDRING, "Ny stilling", linefeed = false)
addLabel("Gjelder fra", nyStilling.gjelderFra.toNorsk(), kolonneTo)
addLabel("Gjelder fra", nyStilling.gjelderFra.tilNorskFormat(), kolonneTo)
}

private fun addNyStillingsprosent(nyStillingsprosent: NyStillingsprosent) {
addLabel(FORKLARING_ENDRING, "Ny stillingsprosent", linefeed = false)
addLabel("Gjelder fra", nyStillingsprosent.gjelderFra.toNorsk(), kolonneTo)
addLabel("Gjelder fra", nyStillingsprosent.gjelderFra.tilNorskFormat(), kolonneTo)
}

private fun addBonus() {
addLabel(FORKLARING_ENDRING, "Bonus")
// addLabel("Estimert årlig bonus", årligBonus.toNorsk())
// addLabel("Dato siste bonus", datoBonus.toNorsk())
// addLabel("Estimert årlig bonus", årligBonus.tilNorskFormat())
// addLabel("Dato siste bonus", datoBonus.tilNorskFormat())
}

private fun addFerietrekk() {
Expand All @@ -280,28 +284,28 @@ class PdfDokument(

addSection("Refusjon")

addLabel("Betaler arbeidsgiver full lønn til arbeidstaker i arbeidsgiverperioden?", (redusertLoennIAgp == null).toNorsk())
addLabel("Betaler arbeidsgiver full lønn til arbeidstaker i arbeidsgiverperioden?", (redusertLoennIAgp == null).tilNorskFormat())
if (redusertLoennIAgp != null) {
// Redusert lønn i AGP - to ekstra spørsmål
addLabel("Begrunnelse", redusertLoennIAgp.begrunnelse.tilTekst())
addLabel("Utbetalt under arbeidsgiverperiode", redusertLoennIAgp.beloep.toNorsk() + " kr")
addLabel("Utbetalt under arbeidsgiverperiode", redusertLoennIAgp.beloep.tilNorskFormat() + " kr")
}

addLabel("Betaler arbeidsgiver lønn under hele eller deler av sykefraværet?", (refusjon != null).toNorsk())
addLabel("Betaler arbeidsgiver lønn under hele eller deler av sykefraværet?", (refusjon != null).tilNorskFormat())
if (refusjon != null) {
// Ja - tre ekstra spørsmål
addLabel("Refusjonsbeløp pr måned", refusjon.beloepPerMaaned.toNorsk() + " kr/måned")
addLabel("Refusjonsbeløp pr måned", refusjon.beloepPerMaaned.tilNorskFormat() + " kr/måned")

val sluttdato = refusjon.sluttdato
addLabel("Opphører refusjonskravet i perioden", (sluttdato != null).toNorsk())
addLabel("Opphører refusjonskravet i perioden", (sluttdato != null).tilNorskFormat())
if (sluttdato != null) {
addLabel("Siste dag dere krever refusjon for", sluttdato.toNorsk())
addLabel("Siste dag dere krever refusjon for", sluttdato.tilNorskFormat())
}

addLabel("Endringer i refusjon i perioden", refusjon.endringer.isNotEmpty().toNorsk())
addLabel("Endringer i refusjon i perioden", refusjon.endringer.isNotEmpty().tilNorskFormat())
refusjon.endringer.forEach {
addLabel("Beløp", it.beloep.toNorsk(), kolonneEn, linefeed = false)
addLabel("Dato", it.startdato.toNorsk(), kolonneTo)
addLabel("Beløp", it.beloep.tilNorskFormat(), kolonneEn, linefeed = false)
addLabel("Dato", it.startdato.tilNorskFormat(), kolonneTo)
}
}
}
Expand All @@ -316,15 +320,15 @@ class PdfDokument(
addLabel("Verdi naturalytelse - kr/måned", x = naturalytelse3)
inntektsmelding.inntekt?.naturalytelser?.forEach {
addText(it.naturalytelse.name, naturalytelse1, linefeed = false)
addText(it.sluttdato.toNorsk(), naturalytelse2, linefeed = false)
addText(it.verdiBeloep.toNorsk(), naturalytelse3)
addText(it.sluttdato.tilNorskFormat(), naturalytelse2, linefeed = false)
addText(it.verdiBeloep.tilNorskFormat(), naturalytelse3)
}
moveCursorBy(pdf.bodySize * 2)
}
}

private fun addTidspunkt() {
pdf.addItalics("Innsendt: ${inntektsmelding.mottatt.toNorsk()}", kolonneEn, y)
pdf.addItalics("Innsendt: ${inntektsmelding.mottatt.tilNorskFormat()}", kolonneEn, y)
moveCursorBy(pdf.bodySize)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,17 @@ package no.nav.helsearbeidsgiver.inntektsmelding.joark.dokument

import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.RedusertLoennIAgp
import java.text.DecimalFormat
import java.time.LocalDate
import java.time.OffsetDateTime
import java.time.format.DateTimeFormatter

fun LocalDate.toNorsk(): String = this.format(DateTimeFormatter.ofPattern("dd.MM.yyyy"))
fun OffsetDateTime.tilNorskFormat(): String = this.format(DateTimeFormatter.ofPattern("dd.MM.yyyy ' kl. ' HH.mm.ss"))

fun OffsetDateTime.toNorsk(): String = this.format(DateTimeFormatter.ofPattern("dd.MM.yyyy ' kl. ' HH.mm.ss"))

fun Double.toNorsk(): String {
fun Double.tilNorskFormat(): String {
val format = DecimalFormat("#,###.##")
return format.format(this)
}

fun Boolean.toNorsk(): String =
fun Boolean.tilNorskFormat(): String =
if (this) {
"Ja"
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,11 @@ import no.nav.helsearbeidsgiver.arbeidsgivernotifikasjon.SakEllerOppgaveFinnesIk
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.felles.utils.tilNorskFormat
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

Expand Down Expand Up @@ -52,6 +51,8 @@ object NotifikasjonTekst {

fun sakTittel(sykmeldt: Person): String = "Inntektsmelding for ${sykmeldt.navn}: f. ${sykmeldt.fnr.lesFoedselsdato()}"

fun sakTilleggsinfo(sykmeldingsperioder: List<Periode>): String = "Sykmeldingsperiode ${sykmeldingsperioder.tilString()}"

fun oppgaveInnhold(
orgnr: Orgnr,
orgNavn: String,
Expand All @@ -67,10 +68,10 @@ object NotifikasjonTekst {
fun paaminnelseInnhold(
orgnr: Orgnr,
orgNavn: String,
sykmeldingsPerioder: List<Periode>,
sykmeldingsperioder: List<Periode>,
): String =
listOf(
"Nav venter fortsatt på inntektsmelding for en av deres ansatte${sykmeldingsPerioder.tilString() ?: ""}.",
"Nav venter fortsatt på inntektsmelding for en av deres ansatte for periode: ${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.",
Expand All @@ -83,6 +84,7 @@ fun ArbeidsgiverNotifikasjonKlient.opprettSak(
inntektsmeldingTypeId: UUID,
orgnr: Orgnr,
sykmeldt: Person,
sykmeldingsperioder: List<Periode>,
initiellStatus: SaksStatus = SaksStatus.UNDER_BEHANDLING,
): String {
val statusTekst =
Expand All @@ -100,6 +102,7 @@ fun ArbeidsgiverNotifikasjonKlient.opprettSak(
lenke = lenke,
tittel = NotifikasjonTekst.sakTittel(sykmeldt),
statusTekst = statusTekst,
tilleggsinfo = NotifikasjonTekst.sakTilleggsinfo(sykmeldingsperioder),
initiellStatus = initiellStatus,
hardDeleteOm = sakLevetid,
)
Expand Down Expand Up @@ -255,6 +258,13 @@ fun ArbeidsgiverNotifikasjonKlient.settOppgaveUtgaatt(
}
}

fun List<Periode>.tilString(): String =
if (size < 2) {
"${first().fom.tilNorskFormat()} - ${first().tom.tilNorskFormat()}"
} else {
"${first().fom.tilNorskFormat()} - [...] - ${last().tom.tilNorskFormat()}"
}

// Støtter d-nummer
private fun Fnr.lesFoedselsdato(): String {
val foersteSiffer = verdi.first().digitToInt()
Expand All @@ -265,15 +275,6 @@ private fun Fnr.lesFoedselsdato(): String {
}
}

fun LocalDate.tilString(): String = format(DateTimeFormatter.ofPattern("dd.MM.yyyy"))

fun List<Periode>.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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,6 @@ import java.util.UUID
data class Steg0(
val transaksjonId: UUID,
val forespoerselId: UUID,
val orgnr: Orgnr,
val fnr: Fnr,
val skalHaPaaminnelse: Boolean,
val forespoersel: Forespoersel,
)
Expand All @@ -53,8 +51,6 @@ class HentDataTilSakOgOppgaveService(
Steg0(
transaksjonId = Key.UUID.les(UuidSerializer, melding),
forespoerselId = Key.FORESPOERSEL_ID.les(UuidSerializer, melding),
orgnr = Key.ORGNRUNDERENHET.les(Orgnr.serializer(), melding),
fnr = Key.FNR.les(Fnr.serializer(), melding),
skalHaPaaminnelse = Key.SKAL_HA_PAAMINNELSE.les(Boolean.serializer(), melding),
forespoersel = Key.FORESPOERSEL.les(Forespoersel.serializer(), melding),
)
Expand Down Expand Up @@ -93,7 +89,7 @@ class HentDataTilSakOgOppgaveService(
Key.DATA to
data
.plus(
Key.ORGNR_UNDERENHETER to setOf(steg0.orgnr).toJson(Orgnr.serializer()),
Key.ORGNR_UNDERENHETER to setOf(steg0.forespoersel.orgnr).toJson(String.serializer()),
).toJson(),
)
}
Expand All @@ -111,7 +107,7 @@ class HentDataTilSakOgOppgaveService(
Key.DATA to
data
.plus(
Key.FNR_LISTE to setOf(steg0.fnr).toJson(Fnr.serializer()),
Key.FNR_LISTE to setOf(steg0.forespoersel.fnr).toJson(String.serializer()),
).toJson(),
)
}
Expand All @@ -127,16 +123,17 @@ class HentDataTilSakOgOppgaveService(
sikkerLogger.info(it)
}

val orgNavn = steg1.orgnrMedNavn[steg0.orgnr] ?: ORG_NAVN_DEFAULT
val sykmeldt = steg2.personer[steg0.fnr] ?: personDefault(steg0.fnr)
val orgNavn = steg1.orgnrMedNavn[steg0.forespoersel.orgnr.let(::Orgnr)] ?: ORG_NAVN_DEFAULT
val sykmeldt = steg2.personer[steg0.forespoersel.fnr.let(::Fnr)] ?: personDefault(steg0.forespoersel.fnr.let(::Fnr))

rapid.publish(
Key.EVENT_NAME to EventName.SAK_OG_OPPGAVE_OPPRETT_REQUESTED.toJson(),
Key.UUID to steg0.transaksjonId.toJson(),
Key.DATA to
mapOf(
Key.FORESPOERSEL_ID to steg0.forespoerselId.toJson(),
Key.ORGNRUNDERENHET to steg0.orgnr.toJson(),
// TODO kan fjernes etter overgangsfase
Key.ORGNRUNDERENHET to steg0.forespoersel.orgnr.toJson(),
Key.SYKMELDT to sykmeldt.toJson(Person.serializer()),
Key.VIRKSOMHET to orgNavn.toJson(),
Key.SKAL_HA_PAAMINNELSE to steg0.skalHaPaaminnelse.toJson(Boolean.serializer()),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ data class OpprettForespoerselSakOgOppgaveMelding(
val eventName: EventName,
val transaksjonId: UUID,
val forespoerselId: UUID,
val orgnr: Orgnr,
val sykmeldt: Person,
val orgNavn: String,
val skalHaPaaminnelse: Boolean,
Expand All @@ -54,7 +53,6 @@ class OpprettForespoerselSakOgOppgaveRiver(
eventName = Key.EVENT_NAME.krev(EventName.SAK_OG_OPPGAVE_OPPRETT_REQUESTED, EventName.serializer(), json),
transaksjonId = Key.UUID.les(UuidSerializer, json),
forespoerselId = Key.FORESPOERSEL_ID.les(UuidSerializer, data),
orgnr = Key.ORGNRUNDERENHET.les(Orgnr.serializer(), data),
sykmeldt = Key.SYKMELDT.les(Person.serializer(), data),
orgNavn = Key.VIRKSOMHET.les(String.serializer(), data),
skalHaPaaminnelse = Key.SKAL_HA_PAAMINNELSE.les(Boolean.serializer(), data),
Expand All @@ -69,15 +67,16 @@ class OpprettForespoerselSakOgOppgaveRiver(
agNotifikasjonKlient.opprettSak(
lenke = lenke,
inntektsmeldingTypeId = forespoerselId,
orgnr = orgnr,
orgnr = forespoersel.orgnr.let(::Orgnr),
sykmeldt = sykmeldt,
sykmeldingsperioder = forespoersel.sykmeldingsperioder,
)

val oppgaveId =
agNotifikasjonKlient.opprettOppgave(
lenke = lenke,
forespoerselId = forespoerselId,
orgnr = orgnr,
orgnr = forespoersel.orgnr.let(::Orgnr),
orgNavn = orgNavn,
skalHaPaaminnelse = skalHaPaaminnelse,
paaminnelseAktivert = paaminnelseToggle.oppgavePaaminnelseAktivert,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ class OpprettSelvbestemtSakRiver(
inntektsmeldingTypeId = inntektsmelding.type.id,
orgnr = inntektsmelding.avsender.orgnr,
sykmeldt = inntektsmelding.sykmeldt.let { Person(it.fnr, it.navn) },
sykmeldingsperioder = inntektsmelding.sykmeldingsperioder,
initiellStatus = SaksStatus.FERDIG,
)

Expand Down
Loading

0 comments on commit 6613483

Please sign in to comment.