Skip to content

Instantly share code, notes, and snippets.

@Simon-Laux
Created December 19, 2025 14:45
Show Gist options
  • Select an option

  • Save Simon-Laux/9d0683dc646698c7be81768a1930ccb1 to your computer and use it in GitHub Desktop.

Select an option

Save Simon-Laux/9d0683dc646698c7be81768a1930ccb1 to your computer and use it in GitHub Desktop.
German: Erstattungsforderung um Arbeitsausgaben vom Arbeitgeber zurückzufordern.
// ---- Stammdaten ------
#let my_name = "Otto Normalverbraucher"
#let my_iban = "DE49201202005467194628"
#let my_address = ("Sesamstr. 7", "Stuttgart, BW 70173")
#let your_name = "Max Muster"
#let your_address = ("Musterfirma", "Sesamstr. 5", "Stuttgart, BW 70173")
#let anrede = "Sehr geehrter Herr Muster"
#let currency = (
code: "EUR",
normal: "euro",
cent: "cent",
symbol: "€"
)
// ---- Einmal Daten ------
#let betreff = "Erstattung der Merch Artikel Bestellungen"
#let what = "die Merch Bestellung"
#let posten = csv(bytes("
ElektronikShop,Bluetooth Kopfhörer,50.00,59.50
TechnikWelt,Externe Festplatte,80.00,95.20
GadgetStore,USB-C Adapter,20.00,23.80
OfficePlus,Ergonomische Maus,35.00,41.65
SoftwareCenter,Projektmanagement Software,120.00,142.80
"))
// you can uncomment this if you only have one position
// #let posten = csv(bytes("
// ElektronikShop,Bluetooth Kopfhörer,50.00,59.50
// "))
// ---- start of template ------
#import "@preview/numeris-scribere:0.1.2": *
#import "@preview/ibanator:0.1.0": iban
// ---- calculate ------
#let (total_netto, total_gross) = {
let extract_net((vendor, product, net, gross)) = decimal(net)
let extract_gross((vendor, product, net, gross)) = decimal(gross)
let total_netto = posten.map(extract_net).sum()
let total_gross = posten.map(extract_gross).sum()
(total_netto, total_gross)
}
#let betrag = total_gross
#let betrag_in_worten = {
let amount = calc.floor(betrag)
let cent_amount = int((betrag - calc.floor(betrag)) * 100)
spell-number(amount, lang: "de") + " " + currency.normal + " und "+ spell-number(cent_amount, lang: "de") + " "+ currency.cent
}
// ---- Document ------
#set text(
font: "Noto Sans",
size: 12pt,
lang: "de"
)
#set document(
title: [
Betreff: #betreff
],
author: "#name"
)
#set page(
paper: "a4",
margin: (top: 4.5cm, x: 2cm), // für brief fenster
header: [
#set align(right)
#text(size: 20pt)[
#my_name
#linebreak()
#my_address.join(", ")
]
],
)
#text(size: 9pt)[
#my_name, #my_address.join(", ")
]
#your_name
#linebreak()
#your_address.join(linebreak())
#linebreak()
#show title: set text(size: 12pt)
#title()
#linebreak()
#anrede,
#underline[
Mit diesem Schreiben bitte ich um Erstattung der #betrag #currency.code (#betrag_in_worten) Kosten für die Merch Bestellung.
]
Bitte überweisen Sie die den Betrag auf mein Gehalts Konto: *#iban(my_iban)*
#let table-value-cell(number) = align(right)[#number#h(0.2em, weak: true)#currency.symbol]
#let table-row(vendor, product, net, gross) = ([#vendor], [#product], table-value-cell(net), table-value-cell(gross))
#table(
columns: (auto, 1fr, auto, auto),
inset: 5pt,
align: horizon,
table.header(
[*Händler*], [*Bezeichnung*], align(right)[*Netto*], align(right)[*Brutto* (mit MwSt.)],
),
table.hline(stroke: 2pt, start: 0),
..posten.map(item => table-row(..item)).flatten(),
..(if posten.len() > 1 {(
// [],[],[],[],
table.hline(stroke: 2pt, start: 0),
[*Total*],[],[#table-value-cell(total_netto)], [#table-value-cell(total_gross)],
)} else {()})
)
Die Rechnung#{if posten.len() > 1 {"en"}} mit allen Details finden Sie im Anhang.
#linebreak()
Mit freundlichen Grüßen,
#my_name
@Simon-Laux
Copy link
Author

To use this you need this package which is not released yet typst/packages#3698

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment