package models import ( "arbeitszeitmessung/helper" "log" "log/slog" "time" ) type IWorkDay interface { Date() time.Time ToString() string Type() DayType IsWorkDay() bool IsKurzArbeit() bool GetDayProgress(User) int8 RequiresAction() bool GetWorktime(User, WorktimeBase, bool) time.Duration GetPausetime(User, WorktimeBase, bool) time.Duration GetTimes(User, WorktimeBase, bool) (work, pause, overtime time.Duration) GetOvertime(User, WorktimeBase, bool) time.Duration } type DayType int const ( DayTypeWorkday DayType = 1 DayTypeAbsence DayType = 2 DayTypeHoliday DayType = 3 ) func GetDays(user User, tsFrom, tsTo time.Time, orderedForward bool) []IWorkDay { var allDays map[string]IWorkDay = make(map[string]IWorkDay) for _, day := range GetWorkDays(user, tsFrom, tsTo) { allDays[day.Date().Format(time.DateOnly)] = &day } absences, err := GetAbsencesByCardUID(user.CardUID, tsFrom, tsTo) if err != nil { log.Println("Error gettings absences for all Days!", err) return nil } holidays, err := GetHolidaysFromTo(tsFrom, tsTo) if err != nil { slog.Warn("Error getting holidays from DB!", slog.Any("Error", err)) } for _, day := range absences { if helper.IsWeekend(day.Date()) { continue } // Absence should be integrated in workday switch { case day.AbwesenheitTyp.WorkTime < 0: if workDay, ok := allDays[day.Date().Format(time.DateOnly)].(*WorkDay); ok { workDay.kurzArbeit = true workDay.kurzArbeitAbsence = day } case day.AbwesenheitTyp.WorkTime < 100: if workDay, ok := allDays[day.Date().Format(time.DateOnly)].(*WorkDay); ok { workDay.worktimeAbsece = day } default: allDays[day.Date().Format(time.DateOnly)] = &day } } for _, day := range holidays { if helper.IsWeekend(day.Date()) { continue } allDays[day.Date().Format(time.DateOnly)] = &day slog.Debug("Logging Holiday: ", slog.String("HolidayName", allDays[day.Date().Format(time.DateOnly)].ToString()), slog.Any("Overtime", day.GetOvertime(user, WorktimeBaseDay, false).String()), "wokrtie", float32(day.worktime)/100) } sortedDays := sortDays(allDays, orderedForward) return sortedDays }