Skip to content

Commit

Permalink
Svaralternativer og svar (#71)
Browse files Browse the repository at this point in the history
  • Loading branch information
fredrikmork authored Jan 27, 2025
1 parent 38257ee commit f38e39b
Show file tree
Hide file tree
Showing 7 changed files with 224 additions and 138 deletions.
70 changes: 17 additions & 53 deletions src/main/kotlin/no/nav/familie/pdf/pdf/PdfElementUtils.kt
Original file line number Diff line number Diff line change
Expand Up @@ -27,27 +27,9 @@ object PdfElementUtils {

fun lagVerdiElement(element: VerdilisteElement): Paragraph =
Paragraph().apply {
(element.label)
.takeIf { it.isNotEmpty() }
?.let {
add(
Text(leggTilKolon(it)).apply {
settFont(FontStil.SEMIBOLD)
},
)
}
element.alternativer?.takeIf { it.isNotEmpty() }?.let {
add(Text("\n"))
add(
Text(it).apply {
settFont(FontStil.ITALIC)
setFontSize(10f)
},
)
}
add(Text(leggTilKolon(element.label)).apply { settFont(FontStil.SEMIBOLD) })
add(Text("\n"))
add(element.verdi)
setFontSize(12f)
isKeepTogether = true
accessibilityProperties.role = StandardRoles.P
}
Expand All @@ -60,40 +42,19 @@ object PdfElementUtils {
tekst
}

fun lagPunktliste(element: VerdilisteElement): Paragraph =
Paragraph().apply {
add(
Text(element.label).apply {
settFont(
FontStil.SEMIBOLD,
)
},
)
element.alternativer?.takeIf { it.isNotEmpty() }?.let {
add(Text("\n"))
add(
Text(it).apply {
settFont(FontStil.ITALIC)
setFontSize(10f)
},
)
}
element.verdi?.takeIf { it.isNotEmpty() }?.let {
add(Text("\n\n"))
val valgteAlternativer = element.verdi.split("\n\n")
val punktListe =
List().apply {
symbolIndent = 8f
setListSymbol("\u2022")
}
valgteAlternativer.forEach { alternativ ->
punktListe.add(ListItem(alternativ))
}
add(punktListe)
fun lagPunktliste(punkter: kotlin.collections.List<VerdilisteElement>): Div =
Div().apply {
punkter.forEach { punkt ->
add(punktliste().apply { add(ListItem(punkt.label)) })
}
setFontSize(12f)
isKeepTogether = true
accessibilityProperties.role = StandardRoles.P
accessibilityProperties.role = StandardRoles.DIV
}

private fun punktliste() =
List().apply {
symbolIndent = 8f
setListSymbol("\u2022")
}

fun lagTekstElement(
Expand All @@ -102,8 +63,8 @@ object PdfElementUtils {
): Paragraph =
Paragraph().apply {
add(Text(tekst))
setFontSize(12f)
settFont(fontStil)
isKeepTogether = true
accessibilityProperties.role = StandardRoles.P
}

Expand All @@ -113,13 +74,16 @@ object PdfElementUtils {

fun lagOverskriftH3(tekst: String): Paragraph = lagOverskrift(tekst, 14f, StandardRoles.H3)

fun lagOverskriftH4(tekst: String): Paragraph = lagOverskrift(tekst, 12f, StandardRoles.H4, false)

private fun lagOverskrift(
tekst: String,
tekstStørrelse: Float,
rolle: String,
erFarget: Boolean = true,
): Paragraph =
Paragraph(tekst).apply {
setFontColor(DeviceRgb(0, 52, 125))
if (erFarget) setFontColor(DeviceRgb(0, 52, 125))
setFontSize(tekstStørrelse)
settFont(FontStil.SEMIBOLD)
accessibilityProperties.role = rolle
Expand Down
52 changes: 34 additions & 18 deletions src/main/kotlin/no/nav/familie/pdf/pdf/VisningsvariantUtils.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package no.nav.familie.pdf.pdf

import com.itextpdf.layout.element.Div
import no.nav.familie.pdf.pdf.PdfElementUtils.lagOverskriftH4
import no.nav.familie.pdf.pdf.PdfElementUtils.lagPunktliste
import no.nav.familie.pdf.pdf.PdfElementUtils.lagTabell
import no.nav.familie.pdf.pdf.PdfElementUtils.lagTekstElement
Expand All @@ -14,43 +15,58 @@ object VisningsvariantUtils {
verdilisteElement: VerdilisteElement,
seksjon: Div,
) {
when (visningsVariant) {
VisningsVariant.TABELL.toString() -> {
håndterTabeller(verdilisteElement, seksjon)
}
VisningsVariant.PUNKTLISTE.toString() -> {
håndterPunktliste(verdilisteElement, seksjon)
}
VisningsVariant.VEDLEGG.toString() -> {
håndterVedlegg(verdilisteElement, seksjon)
if (verdilisteElement.verdiliste?.isNotEmpty() == true) {
when (visningsVariant) {
VisningsVariant.TABELL.toString() -> {
håndterTabeller(verdilisteElement.verdiliste, seksjon)
}

VisningsVariant.PUNKTLISTE.toString() -> {
håndterPunktliste(verdilisteElement, seksjon)
}

VisningsVariant.VEDLEGG.toString() -> {
håndterVedlegg(verdilisteElement.verdiliste, seksjon)
}
}
}
}

private fun håndterTabeller(
verdilisteElement: VerdilisteElement,
verdiliste: List<VerdilisteElement>,
seksjon: Div,
) = verdilisteElement.verdiliste?.forEach { verdilisteElement ->
verdilisteElement.verdiliste?.let { seksjon.apply { add(lagTabell(verdilisteElement)) } }
) = verdiliste.forEach { verdilisteElement ->
verdiliste.let { seksjon.apply { add(lagTabell(verdilisteElement)) } }
}

private fun håndterPunktliste(
verdi: VerdilisteElement,
seksjon: Div,
) {
seksjon.apply {
add(lagPunktliste(verdi))
if (verdi.verdiliste?.isNotEmpty() == true) {
seksjon.apply {
add(lagOverskriftH4(verdi.label).apply { setMarginLeft(30f) })
add(lagPunktliste(verdi.verdiliste).apply { setMarginLeft(30f) })
}
}
}

private fun håndterVedlegg(
verdilisteElement: VerdilisteElement,
verdiliste: List<VerdilisteElement>,
seksjon: Div,
) {
verdilisteElement.verdiliste?.forEach { vedlegg ->
verdiliste.forEach { vedlegg ->
vedlegg.verdi?.takeIf { it.isEmpty() }?.let {
seksjon.apply { add(lagTekstElement("Ingen vedlegg lastet opp i denne søknaden").apply { setMarginLeft(15f) }) }
} ?: håndterRekursivVerdiliste(verdilisteElement.verdiliste, seksjon)
seksjon.apply {
add(
lagTekstElement("Ingen vedlegg lastet opp i denne søknaden").apply {
setMarginLeft(
15f,
)
},
)
}
} ?: håndterRekursivVerdiliste(verdiliste, seksjon)
}
}
}
1 change: 0 additions & 1 deletion src/main/kotlin/no/nav/familie/pdf/pdf/domain/FeltMap.kt
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ data class VerdilisteElement(
val verdi: String? = null,
val visningsVariant: String? = null,
val verdiliste: List<VerdilisteElement>? = null,
val alternativer: String? = null,
)

data class PdfConfig(
Expand Down
65 changes: 54 additions & 11 deletions src/test/kotlin/no/nav/familie/pdf/pdf/PdfServiceTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ import no.nav.familie.pdf.no.nav.familie.pdf.pdf.utils.lagMedBarneTabell
import no.nav.familie.pdf.no.nav.familie.pdf.pdf.utils.lagMedFlereArbeidsforhold
import no.nav.familie.pdf.no.nav.familie.pdf.pdf.utils.lagMedForskjelligLabelIVerdiliste
import no.nav.familie.pdf.no.nav.familie.pdf.pdf.utils.lagMedInnholdsfortegnelse
import no.nav.familie.pdf.no.nav.familie.pdf.pdf.utils.lagMedPunktliste
import no.nav.familie.pdf.no.nav.familie.pdf.pdf.utils.lagMedTomPunktliste
import no.nav.familie.pdf.no.nav.familie.pdf.pdf.utils.lagMedTomVerdiliste
import no.nav.familie.pdf.no.nav.familie.pdf.pdf.utils.lagMedTomtSkjemanummer
import no.nav.familie.pdf.no.nav.familie.pdf.pdf.utils.lagMedVerdiliste
Expand Down Expand Up @@ -44,6 +46,13 @@ class PdfServiceTest {
lagToSiderInnholdsfortegnelse(),
)

@JvmStatic
fun tomPunktliste(): Stream<FeltMap> =
Stream.of(
lagMedTomPunktliste(),
lagMedTomPunktliste(listOf()),
)

@JvmStatic
fun underOverskriftUtenSkjemanummer(): Stream<FeltMap> =
Stream.of(
Expand Down Expand Up @@ -171,6 +180,34 @@ class PdfServiceTest {
assertTrue(faktiskSideTekst.contains(label))
}
}

@Test
fun `Pdf lager forside uten innholdsfortegnelse`() {
// Arrange
val feltMap = lagUteninnholdsfortegnelse()

// Act
val pdfDoc = opprettPdf(feltMap)
val førsteSideTekst = PdfTextExtractor.getTextFromPage(pdfDoc.getPage(1))

// Assert
assertTrue(førsteSideTekst.contains("Søknad om overgangsstønad"))
assertFalse(førsteSideTekst.contains("Innholdsfortegnelse"))
}

@Test
fun `Pdf lager forside med innholdsfortegnelse`() {
// Arrange
val feltMap = lagMedInnholdsfortegnelse()

// Act
val pdfDoc = opprettPdf(feltMap)
val førsteSideTekst = PdfTextExtractor.getTextFromPage(pdfDoc.getPage(1))

// Assert
assertTrue(førsteSideTekst.contains("Søknad om overgangsstønad"))
assertTrue(førsteSideTekst.contains("Innholdsfortegnelse"))
}
//endregion

//region Tabeller
Expand Down Expand Up @@ -235,33 +272,39 @@ class PdfServiceTest {
}
//endregion

// region Punktliste
@Test
fun `Pdf lager forside uten innholdsfortegnelse`() {
fun `Pdf lager en punktliste når visningsvarianten har PUNKTLISTE valgt`() {
// Arrange
val feltMap = lagUteninnholdsfortegnelse()
val feltMap = lagMedPunktliste()

// Act
val pdfDoc = opprettPdf(feltMap)
val førsteSideTekst = PdfTextExtractor.getTextFromPage(pdfDoc.getPage(1))
val tekstIPdf = PdfTextExtractor.getTextFromPage(pdfDoc.getPage(2))

// Assert
assertTrue(førsteSideTekst.contains("Søknad om overgangsstønad"))
assertFalse(førsteSideTekst.contains("Innholdsfortegnelse"))
val faktiskPunkter = tekstIPdf.count { it == '\u2022' }
val forventetPunkter = 5
assertTrue(
faktiskPunkter == forventetPunkter,
"Forventet $forventetPunkter punkter men fikk $faktiskPunkter",
)
}

@Test
fun `Pdf lager forside med innholdsfortegnelse`() {
@ParameterizedTest
@MethodSource("tomPunktliste")
fun `Pdf lager ikke en punktliste når verdiliste er tom`() {
// Arrange
val feltMap = lagMedInnholdsfortegnelse()
val feltMap = lagMedTomPunktliste()

// Act
val pdfDoc = opprettPdf(feltMap)
val førsteSideTekst = PdfTextExtractor.getTextFromPage(pdfDoc.getPage(1))
val tekstIPdf = PdfTextExtractor.getTextFromPage(pdfDoc.getPage(2))

// Assert
assertTrue(førsteSideTekst.contains("Søknad om overgangsstønad"))
assertTrue(førsteSideTekst.contains("Innholdsfortegnelse"))
assertFalse(tekstIPdf.contains("Gjelder noe av dette deg?"))
}
// endregion

private fun opprettPdf(feltMap: FeltMap): PdfADocument {
val result = pdfOppretterService.opprettPdf(feltMap)
Expand Down
10 changes: 8 additions & 2 deletions src/test/kotlin/no/nav/familie/pdf/pdf/PdfValidatorTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,13 @@ class PdfValidatorTest {
// Act
val result = PdfValidator.validerPdf(pdfBytes, standard)
// Assert
// Spesial-tilfelle fordi regel 8.8-2 ikke er oppfylt ved klikkbar lenke i innholdsfortegnelsen
assertTrue(result.feiletRegel.contains("[specification=ISO 14289-2:2024 clause=8.8 testNumber=2]=12") || result.samsvarer, "Pdf-en samsvarer ikke med standarden $standard med feilen ${result.feiletRegel}")
// Spesialtilfelle fordi regel 8.8-2 ikke er oppfylt ved klikkbar lenke i innholdsfortegnelsen.
// Den trengs også å sjekkes med mellomrom på slutten i tillegg til uten. Noe rart med dataen.
assertTrue(
result.feiletRegel == "[[specification=ISO 14289-2:2024 clause=8.8 testNumber=2]=12 ]" ||
result.feiletRegel == "[[specification=ISO 14289-2:2024 clause=8.8 testNumber=2]=12]" ||
result.samsvarer,
"Pdf-en samsvarer ikke med standarden $standard med feilen ${result.feiletRegel}",
)
}
}
Loading

0 comments on commit f38e39b

Please sign in to comment.