Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Flere begrunnelser v1 - Oppdatert IM modell og PDF støtte #837

Merged
merged 12 commits into from
Feb 25, 2025
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

package no.nav.helsearbeidsgiver.inntektsmelding.joark.dokument

import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.*
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.AarsakInnsending
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Bonus
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Feilregistrert
Expand All @@ -27,7 +28,6 @@ class PdfDokument(
) {
private val pdf = PdfBuilder(bodySize = 20, topText = "Innsendt: ${inntektsmelding.mottatt.tilNorskFormat()}") // Setter skriftstørrelsen på labels og text
private var y = 0
private var forklaringEndring = FORKLARING_ENDRING
private val kolonneEn = 0
private val kolonneTo = 420
private val naturalytelse1 = kolonneEn
Expand Down Expand Up @@ -199,91 +199,91 @@ class PdfDokument(
"Registrert inntekt (per ${inntektsmelding.inntekt?.inntektsdato?.tilNorskFormat()})",
"${inntektsmelding.inntekt?.beloep?.tilNorskFormat()} kr/måned",
)

val endringAarsaker = inntektsmelding.inntekt?.endringAarsaker.orDefault(emptyList())
val antall = endringAarsaker.size
endringAarsaker.forEachIndexed { indeks, endringAarsak ->
forklaringEndring = FORKLARING_ENDRING + if (antall > 1) " (${indeks + 1} av $antall)" else ""

val forklaringEndring =
if (antall > 1) {
"$FORKLARING_ENDRING (${indeks + 1} av $antall)"
} else {
FORKLARING_ENDRING
}

when (endringAarsak) {
is Bonus -> addBonus()
is Feilregistrert -> addFeilregistrert()
is Ferie -> addFerie(endringAarsak)
is Ferietrekk -> addFerietrekk()
is NyStilling -> addNyStilling(endringAarsak)
is NyStillingsprosent -> addNyStillingsprosent(endringAarsak)
is Nyansatt -> addNyAnsatt()
is Permisjon -> addPermisjon(endringAarsak)
is Permittering -> addPermittering(endringAarsak)
is Sykefravaer -> addSykefravaer(endringAarsak)
is Tariffendring -> addTariffendring(endringAarsak)
is VarigLoennsendring -> addVarigLonnsendring(endringAarsak)
is Bonus ->
addLabel(forklaringEndring, endringAarsak.beskrivelse())
is Feilregistrert ->
addLabel(forklaringEndring, endringAarsak.beskrivelse())
is Nyansatt ->
addLabel(forklaringEndring, endringAarsak.beskrivelse())
is Ferietrekk ->
addLabel(forklaringEndring, endringAarsak.beskrivelse())

is Ferie ->
addInntektEndringPerioder(forklaringEndring, endringAarsak.beskrivelse(), endringAarsak.ferier)
is Permisjon ->
addInntektEndringPerioder(forklaringEndring, endringAarsak.beskrivelse(), endringAarsak.permisjoner)
is Permittering ->
addInntektEndringPerioder(forklaringEndring, endringAarsak.beskrivelse(), endringAarsak.permitteringer)
is Sykefravaer ->
addInntektEndringPerioder(forklaringEndring, endringAarsak.beskrivelse(), endringAarsak.sykefravaer)

is NyStilling ->
addNyStilling(forklaringEndring, endringAarsak)
is Tariffendring ->
addTariffendring(forklaringEndring, endringAarsak)
is VarigLoennsendring ->
addVarigLonnsendring(forklaringEndring, endringAarsak)
is NyStillingsprosent ->
addNyStillingsprosent(forklaringEndring, endringAarsak)
}
}
}

private fun addInntektEndringPerioder(
forklaringEndring: String,
endringAarsak: String,
perioder: List<Periode>,
) {
addLabel(forklaringEndring, endringAarsak, linefeed = false)
addPerioder(kolonneTo, perioder)
}

private fun addPermisjon(permisjon: Permisjon) {
addInntektEndringPerioder("Permisjon", permisjon.permisjoner)
}

private fun addFerie(ferie: Ferie) {
addInntektEndringPerioder("Ferie", ferie.ferier)
}

private fun addPermittering(permittering: Permittering) {
addInntektEndringPerioder("Permittering", permittering.permitteringer)
}

private fun addSykefravaer(sykefravaer: Sykefravaer) {
addInntektEndringPerioder("Sykefravær", sykefravaer.sykefravaer)
}

private fun addNyAnsatt() {
addLabel(forklaringEndring, "Nyansatt")
}

private fun addFeilregistrert() {
addLabel(forklaringEndring, "Mangelfull eller uriktig rapportering til A-ordningen")
}

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

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

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

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

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

private fun addFerietrekk() {
addLabel(forklaringEndring, "Ferietrekk/Utbetaling av feriepenger")
}

private fun addRefusjon() {
val redusertLoennIAgp = inntektsmelding.agp?.redusertLoennIAgp
val refusjon = inntektsmelding.refusjon
Expand Down Expand Up @@ -338,3 +338,21 @@ class PdfDokument(
moveCursorBy(pdf.bodySize)
}
}

public fun InntektEndringAarsak.beskrivelse(): String =
when (this) {
is Bonus -> "Bonus"
is Feilregistrert -> "Mangelfull eller uriktig rapportering til A-ordningen"
is Nyansatt -> "Nyansatt"
is Ferietrekk -> "Ferietrekk/Utbetaling av feriepenger"
is Ferie -> "Ferie"
is Permisjon -> "Permisjon"
is Permittering -> "Permittering"
is Sykefravaer -> "Sykefravær"
is NyStilling -> "Ny stilling"
is Tariffendring -> "Tariffendring"
is VarigLoennsendring -> "Varig lønnsendring"
is NyStillingsprosent -> "Ny stillingsprosent"

else -> throw NotImplementedError("Ingen beskrivelse definert for InntektEndringAarsak")
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package no.nav.helsearbeidsgiver.inntektsmelding.joark.dokument

import io.kotest.matchers.nulls.shouldNotBeNull
import io.kotest.matchers.string.shouldContain
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Bonus
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Feilregistrert
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Ferie
Expand Down Expand Up @@ -30,6 +31,7 @@ import java.time.LocalDate
class PdfDokumentTest {
private val dag = LocalDate.of(2022, 12, 24)
private val im = mockInntektsmeldingV1()
private val endringAarsaker = endringAarsakMap().values.toList()

@Test
fun `betaler full lønn i arbeidsgiverperioden`() {
Expand Down Expand Up @@ -224,20 +226,7 @@ class PdfDokumentTest {

@Test
fun `med inntekt endring årsak - alle varianter`() {
val perioder = listOf(Periode(dag, dag.plusDays(12)), Periode(dag.plusDays(13), dag.plusDays(18)))
val map = HashMap<String, InntektEndringAarsak>()
map["bonus"] = Bonus
map["feilregistrert"] = Feilregistrert
map["ferie"] = Ferie(perioder)
map["ferietrekk"] = Ferietrekk
map["nyansatt"] = Nyansatt
map["nystilling"] = NyStilling(dag)
map["nystillingsprosent"] = NyStillingsprosent(dag)
map["permisjon"] = Permisjon(perioder)
map["permittering"] = Permittering(perioder)
map["sykefravaer"] = Sykefravaer(perioder)
map["tariffendring"] = Tariffendring(dag, dag.plusDays(2))
map["variglonnsendring"] = VarigLoennsendring(dag)
val map = endringAarsakMap()

map.forEach {
writePDF(
Expand Down Expand Up @@ -265,12 +254,66 @@ class PdfDokumentTest {
)
}

@Test
fun `med en begrunnelse blir teksten lagt til`() {
endringAarsaker.map { listOf(it) }.map { it.tilIm() }.forEach { im ->
im.inntekt?.endringAarsaker?.forEach { endring ->
pdfTekstFraIm(im) shouldContain "Endringsårsak\n${endring.beskrivelse()}"
}
}
}

@Test
fun `med alle mulige parvise kombinasjoner av begrunnelser blir teksten lagt til`() {
endringAarsaker
.parviseKombinasjoner()
.map { it.tilIm() }
.forEach { im ->
im.inntekt?.endringAarsaker?.forEachIndexed { indeks, endring ->
pdfTekstFraIm(im) shouldContain "Endringsårsak (${indeks + 1} av 2)\n${endring.beskrivelse()}"
}
}
}

private fun <E> List<E>.parviseKombinasjoner(): List<List<E>> = flatMapIndexed { i, foorste -> drop(i + 1).map { andre -> listOf(foorste, andre) } }

@Test
fun `med 2, 3, 4 og 5 begrunnelser blir teksten lagt til`() {
(2..5).forEach { n ->
endringAarsaker
.windowed(n, 1, partialWindows = false)
.map { it.tilIm() }
.forEach { im ->
im.inntekt?.endringAarsaker?.forEachIndexed { indeks, endring ->
val tekst = pdfTekstFraIm(im)
tekst shouldContain "Endringsårsak (${indeks + 1} av $n)"
tekst shouldContain endring.beskrivelse()
}
}
}
}

private fun List<InntektEndringAarsak>.tilIm(): Inntektsmelding =
im.copy(
inntekt =
im.inntekt.shouldNotBeNull().copy(
beloep = 123.0,
endringAarsaker = this,
),
)

private fun pdfTekstFraIm(im: Inntektsmelding): String {
val pdfDok = PdfDokument(im).export()
val pdfTekst = extractTextFromPdf(pdfDok)
return pdfTekst.shouldNotBeNull()
}

private fun writePDF(
title: String,
im: Inntektsmelding,
) {
// val file = File(System.getProperty("user.home"), "/Desktop/pdf/$title.pdf")
val file = File.createTempFile(title, ".pdf")
val file = File(System.getProperty("user.home"), "/Desktop/pdf/$title.pdf")
// val file = File.createTempFile(title, ".pdf")
val writer = FileOutputStream(file)
writer.write(PdfDokument(im).export())
println("Lagde PDF $title med filnavn ${file.toPath()}")
Expand All @@ -284,4 +327,22 @@ class PdfDokumentTest {
pdfReader.close()
return allTextInDocument
}

private fun endringAarsakMap(): HashMap<String, InntektEndringAarsak> {
val perioder = listOf(Periode(dag, dag.plusDays(12)), Periode(dag.plusDays(13), dag.plusDays(18)))
val map = HashMap<String, InntektEndringAarsak>()
map["bonus"] = Bonus
map["feilregistrert"] = Feilregistrert
map["ferie"] = Ferie(perioder)
map["ferietrekk"] = Ferietrekk
map["nyansatt"] = Nyansatt
map["nystilling"] = NyStilling(dag)
map["nystillingsprosent"] = NyStillingsprosent(dag)
map["permisjon"] = Permisjon(perioder)
map["permittering"] = Permittering(perioder)
map["sykefravaer"] = Sykefravaer(perioder)
map["tariffendring"] = Tariffendring(dag, dag.plusDays(2))
map["variglonnsendring"] = VarigLoennsendring(dag)
return map
}
}
Loading