package handlers import ( "errors" "slices" "strings" "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") } if len(filter.Date) == 0 { return } 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 { var includesDate bool for _, d := range filter.Date { if strings.Contains(e.Date, d) { includesDate = true } } if !includesDate { 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{Minimal: len(e.Attendees)} 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 len(filter.Groups) > 0 { if m.Group == nil { continue } else if !slices.Contains(filter.Groups, m.Group.Id) { continue } } report.NonAttendees = append(report.NonAttendees, &m) } return }