98 lines
No EOL
2.7 KiB
Typst
98 lines
No EOL
2.7 KiB
Typst
#import "templates/tmpl_letter.typ": tmpl_letter
|
|
#import "templates/common.typ": colors, money
|
|
#import "@preview/cades:0.3.0": qr-code
|
|
#let config = yaml("rechnung.yml")
|
|
|
|
#show: doc => tmpl_letter(
|
|
title: (
|
|
invoice: "Rechnung",
|
|
offer: "Angebot",
|
|
estimate: "Kostenvoranschlag",
|
|
internal: "Eigenbeleg"
|
|
).at(config.type),
|
|
address: config.address,
|
|
info: [
|
|
Datum: #config.date \
|
|
#if config.type != "internal" [
|
|
Kunden-Nr.: #config.customer_no \
|
|
]
|
|
#if config.type == "invoice" [
|
|
Rechnungs-Nr.: #config.invoice_no \
|
|
] else if config.type == "offer" [
|
|
Angebots-Nr.: #config.invoice_no \
|
|
]
|
|
],
|
|
footer: [
|
|
#if config.type == "invoice" [
|
|
Vielen Dank für deine Bestellung! \
|
|
] else if config.type == "estimate" or config.type == "offer" [
|
|
Wir freuen uns auf deine Bestellung! \
|
|
] else if config.type == "internal" [
|
|
*Grund für Eigenbeleg:* \
|
|
#config.internal_reason
|
|
]
|
|
|
|
#text(size: 0.7em, fill: colors.subtext)[
|
|
#if config.type == "invoice" [
|
|
Gesamtbetrag fällig in 10 Tagen ab Rechnungserhalt. \
|
|
Für überfällige Zahlungen wird eine Bearbeitungsgebühr von min. 5 % pro Monat berechnet.
|
|
] else if config.type == "offer" [
|
|
Dieses Angebot ist für einen Monat gültig.
|
|
] else if config.type == "estimate" [
|
|
Dieser Kostenvoranschlag ist unverbindlich.
|
|
]
|
|
]
|
|
],
|
|
doc,
|
|
)
|
|
|
|
|
|
#if config.type == "invoice" [
|
|
Bitte nutze deine Rechnungs-Nr. als Verwendungszweck für die Überweisung!
|
|
]
|
|
#table(
|
|
columns: (auto, 1fr, auto, auto, auto ,auto),
|
|
fill: (_, row) => if row == 0 { colors.highlight } else { white },
|
|
stroke: 0.1pt + colors.subtext,
|
|
[*Pos.*],
|
|
[*Beschreibung*],
|
|
[*Stück*],
|
|
[*Einzelpreis*],
|
|
[*Rabatt*],
|
|
[*Betrag*],
|
|
..config.entries.enumerate().map(e => (
|
|
e.at(0)+1,
|
|
e.at(1).description,
|
|
e.at(1).pieces,
|
|
money(e.at(1).price),
|
|
money(e.at(1).sale),
|
|
money(e.at(1).pieces * e.at(1).price - e.at(1).sale),
|
|
)).flatten().map(e => [#e]),
|
|
)
|
|
|
|
#align(right)[
|
|
#pad(x:1em)[
|
|
*Gesamtbetrag: #money(config.entries.map(e => e.pieces * e.price - e.sale).sum())*
|
|
]
|
|
]
|
|
|
|
#if config.type == "invoice" [
|
|
#v(1em)
|
|
#align(right)[
|
|
#block(
|
|
stroke: 1pt,
|
|
inset: 1em,
|
|
radius: 1em
|
|
)[
|
|
#qr-code("BCD\n002\n1\nSCT\n\nswablab e.V.\nDE18603913100125634005\nEUR" + str(config.entries.map(e => e.pieces * e.price - e.sale).sum()) + "\nGDDS\n\nRechnung " + str(config.invoice_no) + "\nswablab Rechnung", width: 2cm)
|
|
|
|
#place(center+bottom, dy: 1.1em)[
|
|
#block(width: 100%+0.75em, fill: white)[
|
|
#text(size: 8pt)[
|
|
Zahlen mit Code
|
|
]
|
|
]
|
|
]
|
|
]
|
|
]
|
|
] |