From c1572c5ec6e7f67cc960d0ba160090eb818dac1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Z=C3=BCrcher?= Date: Tue, 10 Feb 2026 21:37:00 +0100 Subject: [PATCH] add new report handler --- handlers/report.go | 124 +++++++++++++++++++++++++++++++++++++++++++++ models/date.go | 6 +++ models/report.go | 20 ++++++++ models/weekdays.go | 11 ++++ 4 files changed, 161 insertions(+) create mode 100644 handlers/report.go create mode 100644 models/date.go create mode 100644 models/report.go create mode 100644 models/weekdays.go diff --git a/handlers/report.go b/handlers/report.go new file mode 100644 index 0000000..7e92ad5 --- /dev/null +++ b/handlers/report.go @@ -0,0 +1,124 @@ +package handlers + +import ( + "errors" + "slices" + + "gitea.tecamino.com/paadi/memberDB/models" +) + +type counter struct { + event int + total int +} + +func (dh *DatabaseHandler) GetReport(filter models.ReportFilter) (report models.Report, err error) { + if !dh.DatabaseOpened() { + return report, errors.New("database not opened") + } + + var events []models.Event + + if len(filter.Name) > 0 { + err = dh.database.GetByKey(&events, "name", filter.Name, true) + } else { + events, err = dh.GetEvent(0) + } + if err != nil { + return + } + + report.Data = make(map[string]*models.Data) + + //helper + count := make(map[string]*counter) + + addedMember := make(map[uint]bool) + + for _, e := range events { + // skip if date lower or not equal from date as well as greater than to date + if (e.Date < filter.Date.From || e.Date > filter.Date.From) && e.Date != filter.Date.From { + continue + } + + // skip if day not selected + switch e.Day { + case "Monday": + if !filter.Weekdays.Monday { + continue + } + case "Tuesday": + if !filter.Weekdays.Tuesday { + continue + } + case "Wednesday": + if !filter.Weekdays.Wednesday { + continue + } + case "Thursday": + if !filter.Weekdays.Thursday { + continue + } + case "Friday": + if !filter.Weekdays.Friday { + continue + } + case "Saturday": + if !filter.Weekdays.Saturday { + continue + } + case "Sunday": + if !filter.Weekdays.Sunday { + continue + } + } + + var data *models.Data + if _, ok := count[e.Day]; !ok { + count[e.Day] = &counter{} + } + count[e.Day].event += 1 + + data, ok := report.Data[e.Day] + if !ok { + data = &models.Data{} + report.Data[e.Day] = data + } + + if data.Minimal > len(e.Attendees) { + data.Minimal = len(e.Attendees) + } + + if data.Maximal < len(e.Attendees) { + data.Maximal = len(e.Attendees) + } + + count[e.Day].total = +len(e.Attendees) + data.Average = count[e.Day].total / count[e.Day].event + + for _, a := range e.Attendees { + if _, ok := addedMember[a.Id]; ok { + continue + } + report.Attendees = append(report.Attendees, a) + addedMember[a.Id] = true + } + } + + // add all member not attended + members, err := dh.GetMember(0) + if err != nil { + return + } + + for _, m := range members { + if _, ok := addedMember[m.Id]; ok { + continue + } else if !slices.Contains(filter.Groups, m.Group.Id) { + continue + } + report.NonAttendees = append(report.NonAttendees, &m) + } + + return +} diff --git a/models/date.go b/models/date.go new file mode 100644 index 0000000..6ad5131 --- /dev/null +++ b/models/date.go @@ -0,0 +1,6 @@ +package models + +type Date struct { + From string ` json:"from,omitempty"` + To string ` json:"to,omitempty"` +} diff --git a/models/report.go b/models/report.go new file mode 100644 index 0000000..a4b2eb7 --- /dev/null +++ b/models/report.go @@ -0,0 +1,20 @@ +package models + +type ReportFilter struct { + Weekdays Weekdays `json:"weekdays"` + Date Date `json:"date"` + Groups []uint `json:"groupIds,omitempty"` + Name []string `json:"name,omitempty"` +} + +type Report struct { + Data map[string]*Data `json:"data,omitempty"` + Attendees []*Member `json:"attendees,omitempty"` + NonAttendees []*Member `json:"nonAttendees,omitempty"` +} + +type Data struct { + Minimal int `json:"minimal,omitempty"` + Average int `json:"average,omitempty"` + Maximal int `json:"maximal,omitempty"` +} diff --git a/models/weekdays.go b/models/weekdays.go new file mode 100644 index 0000000..6378957 --- /dev/null +++ b/models/weekdays.go @@ -0,0 +1,11 @@ +package models + +type Weekdays struct { + Monday bool `json:"monday,omitempty"` + Tuesday bool `json:"tuesday,omitempty"` + Wednesday bool `json:"wednesday,omitempty"` + Thursday bool `json:"thursday,omitempty"` + Friday bool `json:"friday,omitempty"` + Saturday bool `json:"saturday,omitempty"` + Sunday bool `json:"sunday,omitempty"` +}