added interface for workday and absence + multiday absences closes #38, #39

This commit is contained in:
2025-09-23 12:30:02 +02:00
parent 55b0332600
commit db6fc10c28
19 changed files with 1396 additions and 1034 deletions

View File

@@ -1,10 +1,10 @@
package models
import (
"arbeitszeitmessung/helper"
"database/sql"
"errors"
"log"
"sort"
"time"
)
@@ -14,6 +14,7 @@ type WorkWeek struct {
Id int
WorkDays []WorkDay
Absences []Absence
Days []IWorkDay
User User
WeekStart time.Time
Worktime time.Duration
@@ -39,20 +40,21 @@ func NewWorkWeek(user User, tsMonday time.Time, populate bool) WorkWeek {
Status: WeekStatusNone,
}
if populate {
week.PopulateWithBookings(0, 0)
week.PopulateWithDays(0, 0)
}
return week
}
func (w *WorkWeek) PopulateWithBookings(worktime time.Duration, overtime time.Duration) {
w.WorkDays = GetWorkDays(w.User, w.WeekStart, w.WeekStart.Add(7*24*time.Hour))
if absences, err := GetAbsencesByCardUID(w.User.CardUID, w.WeekStart, w.WeekStart.Add(7*24*time.Hour)); err == nil {
w.Absences = absences
} else {
log.Printf("Error populating absences in workWeek (%s): %v", w.WeekStart, err)
func (w *WorkWeek) PopulateWithDays(worktime time.Duration, overtime time.Duration) {
w.Days = GetDays(w.User, w.WeekStart, w.WeekStart.Add(6*24*time.Hour))
sort.Slice(w.Days, func(i, j int) bool {
return w.Days[i].Date().Before(w.Days[j].Date())
})
for _, day := range w.Days {
w.Worktime += day.TimeWorkVirtual(w.User)
}
w.Worktime = w.aggregateWorkTime()
w.Overtime = w.Worktime - time.Duration(w.User.ArbeitszeitPerWoche*float32(time.Hour))
w.Overtime = w.Worktime - w.User.ArbeitszeitProWoche()
w.Worktime = w.Worktime.Round(time.Minute)
w.Overtime = w.Overtime.Round(time.Minute)
@@ -99,10 +101,6 @@ func (w *WorkWeek) CheckStatus() WeekStatus {
return w.Status
}
func (w *WorkWeek) GetWorkHourString() string {
return helper.FormatDuration(w.Worktime)
}
func (w *WorkWeek) aggregateWorkTime() time.Duration {
var workTime time.Duration
for _, day := range w.WorkDays {
@@ -138,7 +136,7 @@ func (w *WorkWeek) GetSendWeeks(user User) []WorkWeek {
return weeks
}
week.PopulateWithBookings(week.Worktime, week.Overtime)
week.PopulateWithDays(week.Worktime, week.Overtime)
weeks = append(weeks, week)
}
if err = rows.Err(); err != nil {
@@ -196,8 +194,8 @@ func (w *WorkWeek) Accept() error {
}
func (w *WorkWeek) RequiresAction() bool {
var requiresAction bool = true
for _, day := range w.WorkDays {
var requiresAction bool = false
for _, day := range w.Days {
requiresAction = requiresAction || day.RequiresAction()
}
return requiresAction