-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrechnung.typ
More file actions
110 lines (103 loc) · 2.82 KB
/
Copy pathrechnung.typ
File metadata and controls
110 lines (103 loc) · 2.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#import "templates/tmpl_letter.typ": tmpl_letter
#import "templates/common.typ": colors, money
#import "@preview/cades:0.3.1": 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 * decimal(e.at(1).price) - decimal(e.at(1).sale)),
))
.flatten()
.map(e => [#e]),
)
#align(right)[
#pad(x: 1em)[
*Gesamtbetrag: #money(config.entries.map(e => e.pieces * decimal(e.price) - decimal(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 * decimal(e.price) - decimal(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
]
]
]
]
]
]