Utvikling av brevmaler i brevbakeren
Brevbakeren inneholder brevmaler i form av vår egen Kotlin DSL(Domain specific language).
DSL’en er utviklet for å kun inneholde de elementene vi trenger for å representere innholdet i brev i nav.
Vi har bevisst utelatt funksjonalitet som ikke direkte har med visningslogikk å gjøre, f. eks aritmetiske operasjoner for tall.
Mal-spåket er laget spesifikt for å gjøre det mindre sannsynlig at man implementerer tekniske feil i maler og at disse fører til at et brev produserers med uheldige feil og mangler. Dette inkluderer blant annet null-safety, slik at det ikke er mulig å bruke nullable inndata på en måte hvor man risikerer NPE eller at teksten null havner i produserte brev.
Informasjonsmodellen bør ta hensyn til virkelighetsbildet når det gjelder hvordan data er knyttet sammen og nullabillity. For eksempel om det ikke gir mening å ha verdi A uten verdi B så bør det vurderes om disse skal grupperes sammen (i en nøstet data-klasse). Om brevet krever en verdi C så bør den vær non-nullable slik at brevproduksjonen kan feile allerede der hvor man populerer opp informasjonsmodellen.
Denne guiden er laget for å komme i gang med mal-utvikling, men inneholder ikke en komplett liste over funksjonalitet.
Eksempel på en enkel mal
Her er ett eksempel på en veldig lite komplisert mal:
// Annotasjon som gjør at malen blir plukket opp av en kode-generator. Det vil da genereres extension functions og properties basert på data-klassen som er angitt for malen som gir deg lett tilgang til feltene i en dataklasse i scopet til malen.
@TemplateModelHelpers
// Det finnes også RedigerbarTemplate som er for brev som kan redigeres i skribenten.
object EksempelBrev : AutobrevTemplate<EksempelDto> {
// Brevkode som identifiserer dette brevet. Defineres i API-model (enum)
override val kode = Aldersbrevkoder.AutoBrev.EKSEMPEL_BREV
override val template = createTemplate(
// Metadata
// Støttede språk som type-parameter. Disse brukes for å sjekke at du har inkludert innhold for alle språk-lag ved compile-time
languages = languages(Bokmal, Nynorsk, English),
letterMetadata = LetterMetadata(
//Tittel som settes i arkivet. Det er denne tittelen som vises for saksbehandler i brevvelger.
displayTitle = "Nav har beregnet for høyt gjenlevendetillegg",
// Distribusjonstype. Avgjør hvordan varslingen ved distribusjon blir. [VEDTAK,VIKTIG,ANNET]
distribusjonstype = LetterMetadata.Distribusjonstype.VIKTIG,
// VEDTAKSBREV,INFORMASJONSBREV fører til endringer i signatur/slutt-tekst og første-side
brevtype = LetterMetadata.Brevtype.VEDTAKSBREV,
)
) {
// Her starter DSL.
// Hoved-tittel til brevet
title {
text(
bokmal { + "Nav har endret utbetalingen din" },
nynorsk { + "Nav har endret utbetalingen din" },
english { + "Nav har endret utbetalingen din" }
)
}
outline {
title1 {
text(
bokmal { + "Vedtak" },
nynorsk { + "Vedtak" },
english { + "Decision" }
)
}
paragraph {
text(
// beloep er en generert funksjon som plukker feltet. Alle verdier må formatteres riktig gitt visnings-språk
// , så ulike typer har egen format(). Her vil f.eks Kroner(1000) bli vist som "1 000 kroner" på norsk,
bokmal { + "Du får "+ beloep.format() + " før skatt." },
nynorsk { + "Du får "+ beloep.format() + " før skatt." },
english { + "You will receive "+ beloep.format() + " before tax." }
)
}
// includePhrase inkluderer gjenbrukbare blokker med innhold
includePhrase(RettTilAAKlage)
includePhrase(RettTilInnsyn(dineRettigheterOgMulighetTilAaKlagePensjonStatisk))
includePhrase(HarDuSpoersmaalAlder)
}
// inkluderer vedlegg
includeAttachment(dineRettigheterOgMulighetTilAaKlagePensjonStatisk)
}
}
// Data modell som bestillende system sender til brevbakeren.
// Denne legges inn i api-model og selectors må genereres deretter.
data class EksempelDto(
val beloep: Kroner
)
Malen over er bare en liten del av den fullstendige funksjonaliteten brevmal-dsl’en har å tilby.
Videre lesing: