package handlers import ( "errors" "slices" "gitea.tecamino.com/paadi/memberDB/models" ) 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) addedMember := make(map[uint]bool) for _, e := range events { var includesDate bool if len(e.Date) < 10 { continue } for _, d := range filter.Date { if len(d) < 10 { continue } else if d[:10] == e.Date[:10] { includesDate = true break } } if !includesDate { continue } attendanceLength := len(e.Attendees) total, ok := report.Data["total"] if !ok { total = models.AddNewData(attendanceLength) report.Data["total"] = total } data, ok := report.Data[e.Day] if !ok { data = models.AddNewData(attendanceLength) report.Data[e.Day] = data } data.AddData(attendanceLength) total.AddData(attendanceLength) 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 }