Files
arbeitszeitmessung/Backend/models/compoundDay.go
tom_trgr 4ded8632e5
Some checks failed
Arbeitszeitmessung Deploy / Build Document Creator (push) Successful in 2m30s
Tests / Run Go Tests (push) Failing after 2m35s
Arbeitszeitmessung Deploy / Build Webserver (push) Successful in 3m19s
fixed overtime calc issue
2026-01-05 00:39:00 +01:00

110 lines
2.7 KiB
Go

package models
import (
"log/slog"
"time"
)
type CompoundDay struct {
Day time.Time
DayParts []IWorkDay
}
func NewCompondDay(date time.Time, dayParts ...IWorkDay) *CompoundDay {
return &CompoundDay{Day: date, DayParts: dayParts}
}
func (c *CompoundDay) AddDayPart(dayPart IWorkDay) {
c.DayParts = append(c.DayParts, dayPart)
}
func (c *CompoundDay) GetWorkDay() WorkDay {
workday, ok := c.DayParts[0].(*WorkDay)
if ok {
return *workday
}
return WorkDay{}
}
// IsEmpty implements [IWorkDay].
func (c *CompoundDay) IsEmpty() bool {
return len(c.DayParts) == 0
}
// Date implements [IWorkDay].
func (c *CompoundDay) Date() time.Time {
return c.Day
}
// GetDayProgress implements [IWorkDay].
func (c *CompoundDay) GetDayProgress(u User) int8 {
var dayProcess int8
for _, day := range c.DayParts {
dayProcess += day.GetDayProgress(u)
}
return dayProcess
}
// GetOvertime implements [IWorkDay].
func (c *CompoundDay) GetOvertime(u User, base WorktimeBase, includeKurzarbeit bool) time.Duration {
work := c.GetWorktime(u, base, includeKurzarbeit)
var targetHours time.Duration
switch base {
case WorktimeBaseDay:
targetHours = u.ArbeitszeitProTagFrac(1)
case WorktimeBaseWeek:
targetHours = u.ArbeitszeitProWocheFrac(.2)
}
return (work - targetHours).Round(time.Minute)
}
// GetPausetime implements [IWorkDay].
func (c *CompoundDay) GetPausetime(u User, base WorktimeBase, includeKurzarbeit bool) time.Duration {
var pausetime time.Duration
for _, day := range c.DayParts {
pausetime += day.GetPausetime(u, base, includeKurzarbeit)
}
return pausetime
}
// GetTimes implements [IWorkDay].
func (c *CompoundDay) GetTimes(u User, base WorktimeBase, includeKurzarbeit bool) (work time.Duration, pause time.Duration, overtime time.Duration) {
return c.GetWorktime(u, base, includeKurzarbeit), c.GetPausetime(u, base, includeKurzarbeit), c.GetOvertime(u, base, includeKurzarbeit)
}
// GetWorktime implements [IWorkDay].
func (c *CompoundDay) GetWorktime(u User, base WorktimeBase, includeKurzarbeit bool) time.Duration {
var worktime time.Duration
for _, day := range c.DayParts {
worktime += day.GetWorktime(u, base, includeKurzarbeit)
slog.Info("Calc worktime for day", "day", day, "worktime", worktime.String())
}
return worktime
}
// IsKurzArbeit implements [IWorkDay].
func (c *CompoundDay) IsKurzArbeit() bool {
return false
}
// IsWorkDay implements [IWorkDay].
func (c *CompoundDay) IsWorkDay() bool {
return true
}
// RequiresAction implements [IWorkDay].
func (c *CompoundDay) RequiresAction() bool {
return false
}
// ToString implements [IWorkDay].
func (c *CompoundDay) ToString() string {
return "Compound Day"
}
// Type implements [IWorkDay].
func (c *CompoundDay) Type() DayType {
return DayTypeCompound
}