diff --git a/main.go b/main.go index 72b96a8..8f37041 100644 --- a/main.go +++ b/main.go @@ -7,6 +7,7 @@ import ( "math" "net/http" "os" + "sort" "strconv" "strings" "time" @@ -55,6 +56,12 @@ type Abteilung struct { WertItem float64 } +type Monatsstatistik struct { + Monat string // z. B. "07.2025" + Summe float64 // bezahlte + SummeOffen float64 // noch nicht bezahlt +} + var tmpl = template.Must(template.New("form").Funcs(template.FuncMap{ "formatNumber": formatNumber, "div": func(a, b float64) float64 { @@ -236,7 +243,6 @@ func main() { } e.Gesamtwert = e.Endbestand - e.Anfangsbestand e.Bezahlt = bezahlt == 1 - eintraege = append(eintraege, e) if !e.Bezahlt { offeneSumme += e.Abgabe @@ -250,8 +256,40 @@ func main() { e.CreatedAt = "unbekannt" } + eintraege = append(eintraege, e) + } + monatsMap := map[string]*Monatsstatistik{} + for _, e := range eintraege { + parsed, err := time.Parse("2006-01-02 15:04:05", e.CreatedAt) + if err != nil { + continue + } + monatKey := parsed.Format("01.2006") // z. B. "07.2025" + + if _, ok := monatsMap[monatKey]; !ok { + monatsMap[monatKey] = &Monatsstatistik{Monat: monatKey} + } + if e.Bezahlt { + monatsMap[monatKey].Summe += e.Abgabe + } else { + monatsMap[monatKey].SummeOffen += e.Abgabe + } + } + + var monatsStat []Monatsstatistik + for _, stat := range monatsMap { + monatsStat = append(monatsStat, *stat) + } + + sort.Slice(monatsStat, func(i, j int) bool { + // Nach Datum aufsteigend sortieren + ti, _ := time.Parse("01.2006", monatsStat[i].Monat) + tj, _ := time.Parse("01.2006", monatsStat[j].Monat) + return ti.Before(tj) + }) + // Dynamische Abteilungen – frei anpassbar abteilungen := []Abteilung{ {Name: "Raumkampf", Anteil: 15, Beispiel: "CF-337 Panther", WertItem: 36308}, @@ -278,19 +316,21 @@ func main() { } tmpl.Execute(w, struct { - Entries []Entry - Summe float64 - OffeneSumme float64 - Abteilungen []Abteilung - LoggedIn bool - Member string + Entries []Entry + Summe float64 + OffeneSumme float64 + Abteilungen []Abteilung + Monatsstatistik []Monatsstatistik + LoggedIn bool + Member string }{ - Entries: eintraege, - Summe: summe, - OffeneSumme: offeneSumme, - Abteilungen: abteilungen, - LoggedIn: isAuthenticated(r), - Member: membername, + Entries: eintraege, + Summe: summe, + OffeneSumme: offeneSumme, + Abteilungen: abteilungen, + Monatsstatistik: monatsStat, + LoggedIn: isAuthenticated(r), + Member: membername, }) }) @@ -467,6 +507,28 @@ const htmlTemplate = `
Monat | +Abgaben verteilt | +Abgaben offen | +
---|---|---|
{{.Monat}} | +{{formatNumber .Summe}} UEC | +{{formatNumber .SummeOffen}} UEC | +