diff --git a/resources/arbeidsgiver.svg b/resources/arbeidsgiver.svg new file mode 100644 index 0000000..08e4615 --- /dev/null +++ b/resources/arbeidsgiver.svg @@ -0,0 +1,28 @@ + + + Group + Created with Sketch. + + + + + + + + + + + + + + + + diff --git a/resources/checkbox.svg b/resources/checkbox.svg new file mode 100644 index 0000000..0e00b59 --- /dev/null +++ b/resources/checkbox.svg @@ -0,0 +1,10 @@ + + + + Shape + Created with Sketch. + + + + diff --git a/src/main/kotlin/no/nav/pdfgen/Bootstrap.kt b/src/main/kotlin/no/nav/pdfgen/Bootstrap.kt index 49c958e..cf63752 100644 --- a/src/main/kotlin/no/nav/pdfgen/Bootstrap.kt +++ b/src/main/kotlin/no/nav/pdfgen/Bootstrap.kt @@ -66,6 +66,7 @@ val templateRoot: Path = Paths.get("templates/") val imagesRoot: Path = Paths.get("resources/") val fontsRoot: Path = Paths.get("fonts/") val images = loadImages() +val resources = loadResources() val handlebars: Handlebars = Handlebars(FileTemplateLoader(templateRoot.toFile())).apply { registerNavHelpers(this) infiniteLoops(true) @@ -216,15 +217,30 @@ fun loadTemplates() = Files.list(templateRoot) fun loadImages() = Files.list(imagesRoot) .filter { - val validExtensions = setOf("jpg", "jpeg", "png", "bmp") + val validExtensions = setOf("jpg", "jpeg", "png", "bmp", "svg") !Files.isHidden(it) && it.fileName.extension in validExtensions } .map { val fileName = it.fileName.toString() - val extension = if (it.fileName.extension == "jpg") "jpeg" else it.fileName.extension // jpg is not a valid mime-type + val extension = when(it.fileName.extension) { + "jpg" -> "jpeg"// jpg is not a valid mime-type + "svg" -> "svg+xml" + else -> it.fileName.extension + } val base64string = base64encoder.encodeToString(Files.readAllBytes(it)) val base64 = "data:image/$extension;base64,$base64string" fileName to base64 } .toList() .toMap() + +fun loadResources() = Files.list(imagesRoot) + .filter { + val validExtensions = setOf("svg") + !Files.isHidden(it) && it.fileName.extension in validExtensions + } + .map { + it.fileName.toString() to Files.readAllBytes(it) + } + .toList() + .toMap() diff --git a/src/main/kotlin/no/nav/pdfgen/Helpers.kt b/src/main/kotlin/no/nav/pdfgen/Helpers.kt index 5cfe68b..77b06e1 100644 --- a/src/main/kotlin/no/nav/pdfgen/Helpers.kt +++ b/src/main/kotlin/no/nav/pdfgen/Helpers.kt @@ -4,19 +4,29 @@ import com.github.jknack.handlebars.Handlebars import com.github.jknack.handlebars.Helper import no.nav.pdfgen.domain.syfosoknader.Periode import no.nav.pdfgen.domain.syfosoknader.PeriodeMapper +import java.time.LocalDate import java.time.format.DateTimeFormatter +import java.time.temporal.ChronoUnit fun registerNavHelpers(handlebars: Handlebars) { handlebars.apply { registerHelper("iso_to_nor_date", Helper { context, _ -> if (context == null) return@Helper "" - dateFormat.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME.parse(context)) + try { + dateFormat.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME.parseBest(context)) + } catch (e: Exception) { + dateFormat.format(DateTimeFormatter.ISO_DATE_TIME.parse(context)) + } }) registerHelper("iso_to_date", Helper { context, _ -> if (context == null) return@Helper "" dateFormat.format(DateTimeFormatter.ISO_DATE.parse(context)) }) + registerHelper("duration", Helper { context, options -> + ChronoUnit.DAYS.between(LocalDate.from(DateTimeFormatter.ISO_DATE.parse(context)), LocalDate.from(DateTimeFormatter.ISO_DATE.parse(options.param(0)))) + }) + // Expects json-objects of the form { "fom": "2018-05-20", "tom": "2018-05-29" } registerHelper("json_to_period", Helper { context, _ -> if (context == null) { @@ -50,6 +60,10 @@ fun registerNavHelpers(handlebars: Handlebars) { if (context == null) "" else images[context] }) + registerHelper("resource", Helper { context, _ -> + resources[context]?.toString(Charsets.UTF_8) ?: "" + }) + registerHelper("capitalize", Helper { context, _ -> if (context == null) "" else context.toLowerCase().capitalize() }) @@ -61,5 +75,14 @@ fun registerNavHelpers(handlebars: Handlebars) { registerHelper("formatComma", Helper { context, _ -> if (context == null) "" else context.toString().replace(".", ",") }) + + registerHelper("doubleIf", Helper { a, options -> + val operator = options.param(0, null as Any?) + val b = options.param(1, null as Any?) + when(operator) { + "||" -> if (options.isFalsy(a) && options.isFalsy(b)) { options.inverse() } else { options.fn() } + else -> options.inverse() + } + }) } } diff --git a/templates/syfosm/syfosm.hbs b/templates/syfosm/syfosm.hbs new file mode 100644 index 0000000..4d83a1d --- /dev/null +++ b/templates/syfosm/syfosm.hbs @@ -0,0 +1,408 @@ + + + + + + + +
+
+ + {{{ resource "arbeidsgiver.svg" }}} + + Sykmelding til NAV +
+
+
+
+
+

1. Pasientopplysninger

+

+ {{ pasient.fornavn }} {{#if pasient.mellomnavn }}{{pasient.mellomnavn}} {{/if}}{{pasient.etternavn}} +

+

1.2 Fødselsnummer

+ {{ pasient.personnummer }} +
+ +
+

2. Arbeidsgiver

+

2.1 Arbeidsgiver har

+ + {{#eq sykmelding.arbeidsgiver.harArbeidsgiver "EN_ARBEIDSGIVER"}}Én arbeidsgiver{{/eq}} + {{#eq sykmelding.arbeidsgiver.harArbeidsgiver "FLERE_ARBEIDSGIVERE"}}Flere arbeidsgivere{{/eq}} + {{#eq sykmelding.arbeidsgiver.harArbeidsgiver "INGEN_ARBEIDSGIVER"}}Ingen arbeidsgiver{{/eq}} + +

2.2 Arbeidsgiver for denne sykmeldingen

+ {{ sykmelding.arbeidsgiver.navn }} +

2.3 Yrke/stilling for dette arbeidsforholdet

+ {{ sykmelding.arbeidsgiver.yrkesbetegnelse }} +

2.4 Stillingsprosent

+ {{ sykmelding.arbeidsgiver.stillingsprosent }} +
+ +
+

3. Diagnose

+

3.1 Hoveddiagnose

+
+ + + + + + + + + + + + + + + +
KodesystemKodeDiagnose
{{ sykmelding.medisinskVurdering.hovedDiagnose.system }}{{ sykmelding.medisinskVurdering.hovedDiagnose.kode }}TODO: Diagnosetekst
+
+

3.2 Bidiagnoser

+
+ + + + + + + + + + + {{#each sykmelding.medisinskVurdering.biDiagnoser }} + + + + {{/each}} + + +
KodesystemKodeDiagnose
{{ system }}{{ kode }}TODO: Diagnosetekst
+
+
+

4. Mulighet for arbeid

+ + {{# each sykmelding.perioder }} +
+

Periode

+
+ {{ iso_to_date fom }} + + {{ iso_to_date tom }} + • {{ duration fom tom }} dager +
+
+ {{# if avventendeInnspillTilArbeidsgiver }} +
+

4.1 Avventende sykmelding

+

4.1.3 Innspill til arbeidsgiver om tilrettelegging

+

{{ avventendeInnspillTilArbeidsgiver }}

+
+ {{/if}} + {{# if gradert }} +
+

4.2 Pasienten kan være delvis i arbeid (gradert sykmelding)

+

4.2.3 Grad for sykmelding

+

{{ gradert.grad }} % sykmeldt

+

4.2.4 Pasienten kan være delvis i arbeid ved bruk av reisetilskudd

+ {{# if gradert.reisetilskudd }} +

Med reisetilskudd

+ {{/if}} + {{#unless gradert.reisetilskudd }} +

Uten reisetilskudd

+ {{/unless}} +
+ {{/if}} + + {{# if aktivitetIkkeMulig }} +

{{ iso_to_date fom }} - {{ iso_to_date tom }} ({{ duration fom tom }} dager)

+
+

4.3 Pasienten kan ikke være i arbeid (100 % sykmeldt)

+ {{#if aktivitetIkkeMulig.arbeidsrelatertArsak }} +

+ {{ resource "checkbox.svg" }} + Forhold på arbeidsplassen vanskeliggjør arbeidsrelatert aktivitet +

+ {{#if aktivitetIkkeMulig.medisinskArsak }} +

4.3.3 Medisinske årsaker hindrer arbeidsrelatert aktivitet

+

4.3.3.1 Angi hva som er årsaken

+

– {{ aktivitetIkkeMulig.medisinskArsak.arsak }}

+

4.3.3.2 Beskriv nærmere

+

– {{ aktivitetIkkeMulig.medisinskArsak.beskrivelse }}

+ {{/if}} + {{#if aktivitetIkkeMulig.arbeidsrelatertArsak }} +

4.3.4 Og forhold på arbeidsplassen vanskeliggjør arbeidsrelatert aktivitet

+

4.3.4.1 Angi hva som er årsaken

+

– {{ aktivitetIkkeMulig.arbeidsrelatertArsak.arsak }}

+

4.3.3.2 Beskriv nærmere

+

– {{ aktivitetIkkeMulig.arbeidsrelatertArsak.beskrivelse }}

+ {{/if}} + {{/if}} +
+ {{/ if }} + {{# if behandlingsdager }} +
+

4.4 Behandlingsdager

+

4.4.3 Oppgi antall dager i perioden

+

{{ behandlingsdager }} behandlingsdag(er)

+
+ {{/ if }} + {{# if reisetilskudd }} +
+

4.5 Reisetilskudd

+
+ {{/if}} +
+
+ {{/ each }} +
+

5. Friskmelding/Prognose

+ {{# if sykmelding.prognose.arbeidsforEtterPeriode }} +

+ {{ resource "checkbox.svg" }} + + 5.1 Pasienten er 100 % arbeidsfør etter perioden +

+ {{/if}} +
+ {{#if sykmelding.prognose.hensynArbeidsplassen }} +
+

5.1.1 Beskriv eventuelle hensyn som må tas på arbeidsplassen

+

+ {{ sykmelding.prognose.hensynArbeidsplassen }} +

+
+ {{/if}} + + {{#if sykmelding.arbeidsgiver }} +
+

Arbeidsgiver som legen har skrevet inn

+

+ {{ sykmelding.arbeidsgiver.navn }} +

+ {{#if sykmelding.arbeidsgiver.stillingsprosent }} +

{{ sykmelding.arbeidsgiver.stillingsprosent }}

+ {{/if}} +
+ {{/if}} +
+
+
+
+

12.1 Pasienten er kjent eller har vist legitimasjon.

+

– {{ iso_to_nor_date sykmelding.behandletTidspunkt }}

+

12.2 Sykmelders navn

+

– {{ sykmelding.behandler.fornavn }} {{#if sykmelding.behandler.mellomnavn }}{{ sykmelding.behandler.mellomnavn }} {{/if}}{{ sykmelding.behandler.etternavn }}

+

12.4 HPR-nummer

+

– {{ sykmelding.behandler.hpr }}

+ {{#if sykmelding.behandler.telefonNummer }} +

12.5 Telefon

+

– {{ sykmelding.behandler.telefonNummer }}

+ {{/if}} +

12.6 Adresse

+

– {{ sykmelding.behandler.adresse.gate }}, {{ sykmelding.behandler.adresse.postnummer }} {{ sykmelding.behandler.adresse.kommune }}

+
+
+ {{#doubleIf prognose.arbeidsutsikter.harEgetArbeidPaaSikt "||" prognose.arbeidsutsikter.harAnnetArbeidPaaSikt }} +
+
+

Friskmelding

+ {{#if prognose.arbeidsutsikter.harEgetArbeidPaaSikt }} +
+ {{ resource "checkbox.svg" }} +

Jeg antar at pasienten kan komme tilbake til eget eller annet arbeid hos samme arbeidsgiver

+
+
+

Når antar du at det kan skje?

+

+ – {{ iso_to_nor_date prognose.arbeidsutsikter.arbeidFom }} +

+
+ {{/if}} + {{#if prognose.arbeidsutsikter.harAnnetArbeidPaaSikt }} +
+ {{ resource "checkbox.svg" }} +

+ Jeg antar at pasienten på sikt kan komme i arbeid hos annen arbeidsgiver +

+
+ {{/if}} +
+
+ {{/doubleIf}} + {{#if tiltak.tiltakArbeidsplassen }} +
+
+

Hva skal til for å bedre arbeidsevnen?

+

Tilrettelegging/hensyn som bør tas på arbeidsplassen

+

– {{ tiltak.tiltakArbeidsplassen }} +

+
+
+ {{/if}} + {{#if meldingTilArbeidsgiver}} +
+
+

Melding til arbeidsgiver

+

Innspill til arbeidsgiver

+

+ – {{ meldingTilArbeidsgiver }} +

+
+
+ {{/if}} + +
+
+

Annet

+

Telefon til lege/sykmelder

+

– {{ behandler.kontaktInfo.teleAddresss.v}}

+
+
+
+
+ +