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 }