Files
stugago-vvlist/main.go

135 lines
3.2 KiB
Go
Raw Permalink Normal View History

2026-04-10 16:26:03 +02:00
package main
import (
"bufio"
2026-04-10 16:26:03 +02:00
"encoding/csv"
"fmt"
"log"
2026-04-10 16:26:03 +02:00
"math"
"os"
"github.com/signintech/gopdf"
2026-04-10 16:26:03 +02:00
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
fmt.Print("Moin! Dieses kleine Tool erstellt dir eine Teilnahmeliste als PDF, welche du an den AStA schicken kannst, um nach einer Vollversammlung den StugA bestätigen zu lassen.\n\n")
fmt.Print("Wahrscheinlich/hoffentlich habt ihr für die Teilnahmeliste eine Umfrage auf Nextcloud erstellt, in welcher sich Leute eintragen konnten. Falls dem so ist -- perfekt! Exportiere die Daten aus Nextcloud im CSV-Format und packe sie in den selben Ordner, in welchem auch dieses Programm liegt.\n\n")
fmt.Println("Gib bitte jetzt den Namen der Datei ein, z.B. 'liste.csv':")
scanner.Scan()
err := scanner.Err()
if err != nil {
log.Fatalln(err.Error())
}
fileName := scanner.Text()
fmt.Print("Danke! Jetzt brauche ich noch ein paar weitere Infos.\n\n")
fmt.Println("Wie heißt euer StugA? Beispiel: 'StugA Lehramt GO':")
scanner.Scan()
err = scanner.Err()
if err != nil {
log.Fatalln(err.Error())
}
stuga := scanner.Text()
fmt.Println("Zuletzt brauche ich das Datum der Vollversammlung, Beispiel: '28.05.2026':")
scanner.Scan()
err = scanner.Err()
if err != nil {
log.Fatalln(err.Error())
}
date := scanner.Text()
fmt.Println("Deine Datei wird erstellt...")
title := fmt.Sprintf("Teilnahmeliste der %s-Vollversammlung vom %s", stuga, date)
createPdf(fileName, title)
fmt.Println("Die Datei wurde erstellt! Das Programm schließt sich jetzt.")
}
func createPdf(fileName, title string) {
2026-04-10 16:26:03 +02:00
// Prepare data
file, err := os.Open(fileName)
2026-04-10 16:26:03 +02:00
if err != nil {
log.Fatalln("Fehler beim Öffnen der Datei: " + err.Error())
2026-04-10 16:26:03 +02:00
}
reader := csv.NewReader(file)
reader.LazyQuotes = true
records, errRecords := reader.ReadAll()
if errRecords != nil {
log.Fatalln("Fehler beim Auslesen der Datei: " + errRecords.Error())
2026-04-10 16:26:03 +02:00
}
defer file.Close()
// Prepare document
pdf := &gopdf.GoPdf{}
pdf.Start(gopdf.Config{
PageSize: *gopdf.PageSizeA4,
})
pdf.AddTTFFont("inter", "./inter.ttf")
pdf.SetMargins(20, 20, 20, 20)
2026-04-10 16:26:03 +02:00
var tableEntries [][]string
var tablePageIndex = 0
var tablePageLength = 36
var isFirst bool = true
2026-04-10 16:26:03 +02:00
// Write data to document
for index, record := range records[1:] {
2026-04-10 16:26:03 +02:00
tableEntries = append(tableEntries, []string{
fmt.Sprintf("%d", index+1),
2026-04-10 16:26:03 +02:00
record[3],
record[5],
})
}
iterations := math.Ceil(float64(len(tableEntries)) / 31.0)
for i := 0; i < int(iterations); i += 1 {
// create each page here
pdf.AddPage()
var table gopdf.TableLayout
if isFirst {
pdf.SetFont("inter", "", 12)
pdf.Cell(nil, title)
pdf.SetFont("inter", "", 10)
isFirst = false
2026-04-10 16:26:03 +02:00
table = pdf.NewTableLayout(20, 40, 21, 1)
} else {
table = pdf.NewTableLayout(20, 20, 21, 1)
2026-04-10 16:26:03 +02:00
}
table.AddColumn("#", 30, "left")
table.AddColumn("Name", 170, "left")
table.AddColumn("Fächer", 340, "left")
for i := tablePageIndex; i < tablePageIndex+tablePageLength; i += 1 {
if i >= len(tableEntries) {
break
}
table.AddRow(tableEntries[i])
}
table.DrawTable()
2026-04-10 16:26:03 +02:00
tablePageIndex += tablePageLength
pdf.SetXY(573, 815)
pdf.Cell(nil, fmt.Sprintf("%d", int(i+1)))
2026-04-10 16:26:03 +02:00
}
// Finish document
pdf.WritePdf("vvliste.pdf")
}