Files
arbeitszeitmessung/Backend/models/workDay.go
2025-02-23 09:44:18 +01:00

78 lines
2.0 KiB
Go

package models
import (
"fmt"
"time"
)
type WorkDay struct {
Day time.Time
Bookings []Booking
workTime time.Duration
}
// Gets the duration someone worked that day
func (d WorkDay) GetWorkTime() time.Duration{
var workTime, pauseTime time.Duration
var lastBooking Booking
for _, booking := range d.Bookings{
if booking.CheckInOut % 2 == 1 {
if !lastBooking.Timestamp.IsZero() {
pauseTime += booking.Timestamp.Sub(lastBooking.Timestamp)
}
}else {
workTime += booking.Timestamp.Sub(lastBooking.Timestamp)
}
lastBooking = booking
}
// checks if booking is today and has no gehen yet, so the time since last kommen booking is added to workTime
if(d.Day.Day() == time.Now().Day() && len(d.Bookings) % 2 == 1){
workTime += time.Since(lastBooking.Timestamp.Local())
}
if workTime > 6 * time.Hour && pauseTime < 45 * time.Minute {
if workTime < 9 * time.Hour && pauseTime < 30 * time.Minute {
diff := 30 * time.Minute - pauseTime
workTime -= diff
pauseTime += diff
}else if pauseTime < 45 * time.Minute {
diff := 45 * time.Minute - pauseTime
workTime -= diff
pauseTime += diff
}
}
return workTime
}
func formatDuration(d time.Duration) string{
hours := int(d.Hours())
minutes := int(d.Minutes()) % 60
if d.Hours() > 0 {
return fmt.Sprintf("%dh %dmin", hours, minutes)
}
return fmt.Sprintf("%dmin", minutes)
}
// Converts duration to string and replaces 0s with in
//
// -> output xhxmin
func (d WorkDay) GetWorkTimeString() string {
str := formatDuration(d.GetWorkTime().Abs().Round(time.Minute))
if(len(str) > 2){
return str
}
return ""
}
// returns bool wheter the workday was ended with an automatic logout
func (d WorkDay) RequiresAction() bool {
return d.Bookings[len(d.Bookings)-1].CheckInOut == 255
}
// returns a integer percentage of how much day has been worked of
func (d WorkDay) GetWorkDayProgress() uint8 {
defaultWorkTime, _ := time.ParseDuration("7h42m")
progress := (d.GetWorkTime().Seconds()/defaultWorkTime.Seconds())*100
return uint8(progress)
}