112 lines
2.6 KiB
Typst
112 lines
2.6 KiB
Typst
#let timetable = state("6467cc7b-cfda-4f4d-a2fe-2e5e696dff91", (:))
|
|
|
|
#let format_int(x) = (
|
|
if x == 0 [0] else if x > 0 [$+$#str(x)] else [#str(x)]
|
|
)
|
|
|
|
#let addTimetable(times) = {
|
|
timetable.update(tt => {
|
|
for (date, tasks) in times.pairs() {
|
|
tt.insert(date, tasks.filter(t => t.name != "Total"))
|
|
}
|
|
return tt
|
|
})
|
|
}
|
|
|
|
#let dayNr = state("345de571-1c11-4fba-9ebf-61c2088e286a", 0)
|
|
#let entry(
|
|
day: datetime,
|
|
defaultPerson: str,
|
|
supplementaryPersons: (:),
|
|
tagesablauf,
|
|
hilfestellungen,
|
|
gut,
|
|
schlecht,
|
|
erkenntnisse,
|
|
) = {
|
|
dayNr.update(i => i + 1)
|
|
context {
|
|
if dayNr.get() > 1 { pagebreak(weak: true) }
|
|
|
|
heading(level: 2, [Tag #dayNr.get() | #day.display("[day].[month].[year]")])
|
|
|
|
show heading.where(level: 3): set heading(numbering: none, outlined: false)
|
|
show heading.where(level: 3): set heading(numbering: none, outlined: false)
|
|
|
|
|
|
let taetigkeiten = timetable.get().at(day.display("[day padding:none]-[month padding:none]-[year]"))
|
|
|
|
|
|
let total_soll = (
|
|
taetigkeiten.fold(
|
|
0,
|
|
(acc, t) => if t.keys().contains("should") { acc + t.should } else { acc },
|
|
)
|
|
/ 60
|
|
) // total should hours
|
|
|
|
let total_ist = (
|
|
taetigkeiten.fold(
|
|
0,
|
|
(acc, t) => if t.keys().contains("is") { acc + t.is } else { acc },
|
|
)
|
|
/ 60
|
|
) // total should hours
|
|
|
|
figure(
|
|
table(
|
|
columns: (3fr, 1fr, 1fr, 1fr, 1fr),
|
|
align: (left, center, center, center, center),
|
|
table.header([Tätigkeiten], [Beteiligte Personen], [Aufwand SOLL [h]], [Aufwand IST [h]], [Differenz [h]]),
|
|
|
|
..taetigkeiten
|
|
.map(t => (
|
|
t.at("name"),
|
|
if supplementaryPersons.keys().contains(t.at("name")) {
|
|
(defaultPerson, ..supplementaryPersons.at(t.at("name"))).join(", ")
|
|
} else {
|
|
defaultPerson
|
|
},
|
|
str(t.at("should", default: "") / 60),
|
|
str(t.at("is", default: "") / 60),
|
|
if t.keys().contains("is") and t.keys().contains("should") {
|
|
format_int((t.is / 60) - (t.should / 60))
|
|
} else { "" },
|
|
))
|
|
.flatten(),
|
|
[*Totaler Zeitaufwand*],
|
|
[],
|
|
str(total_soll),
|
|
str(total_ist),
|
|
|
|
format_int(total_ist - total_soll),
|
|
),
|
|
caption: [Tätigkeiten Tag #dayNr.get()],
|
|
)
|
|
[
|
|
=== Tagesablauf
|
|
|
|
#tagesablauf
|
|
|
|
=== Hilfestellungen
|
|
|
|
#hilfestellungen
|
|
|
|
=== Reflexion
|
|
|
|
_Was lief gut?_
|
|
|
|
#gut
|
|
|
|
_Was lief weniger gut?_
|
|
|
|
#schlecht
|
|
|
|
_Erkenntnisse_
|
|
|
|
#erkenntnisse
|
|
|
|
]
|
|
}
|
|
}
|