added overtime to time and team page + ui improvements + mobile support for team page closed #12

This commit is contained in:
2025-09-04 00:11:33 +02:00
parent 45440b6457
commit 1ae30c11cb
19 changed files with 2138 additions and 387 deletions

View File

@@ -11,13 +11,16 @@ import (
// Workweeks are
type WorkWeek struct {
Id int
WorkDays []WorkDay
Absences []Absence
User User
WeekStart time.Time
WorkHours time.Duration
Status WeekStatus
Id int
WorkDays []WorkDay
Absences []Absence
User User
WeekStart time.Time
Worktime time.Duration
Overtime time.Duration
Status WeekStatus
overtimeDiff time.Duration
worktimeDiff time.Duration
}
type WeekStatus int8
@@ -26,6 +29,7 @@ const (
WeekStatusNone WeekStatus = iota
WeekStatusSent
WeekStatusAccepted
WeekStatusDifferences
)
func NewWorkWeek(user User, tsMonday time.Time, populate bool) WorkWeek {
@@ -35,17 +39,32 @@ func NewWorkWeek(user User, tsMonday time.Time, populate bool) WorkWeek {
Status: WeekStatusNone,
}
if populate {
week.WorkDays = (*WorkDay).GetWorkDays(nil, user.CardUID, tsMonday, tsMonday.Add(7*24*time.Hour))
if absences, err := GetAbsenceByCardUID(user.CardUID, tsMonday, tsMonday.Add(7*24*time.Hour)); err == nil {
week.Absences = absences
} else {
log.Printf("Error populating absences in workWeek (%s): %v", tsMonday, err)
}
week.WorkHours = week.aggregateWorkTime()
week.PopulateWithBookings(0, 0)
}
return week
}
func (w *WorkWeek) PopulateWithBookings(overtime time.Duration, worktime time.Duration) {
w.WorkDays = (*WorkDay).GetWorkDays(nil, w.User.CardUID, 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)
}
w.Worktime = w.aggregateWorkTime()
w.Overtime = w.Worktime - time.Duration(w.User.ArbeitszeitPerWoche*float32(time.Hour)).Round(time.Minute)
if overtime == 0 && worktime == 0 {
return
}
if overtime != w.Overtime || worktime != w.Worktime {
w.Status = WeekStatusDifferences
w.overtimeDiff = overtime
w.worktimeDiff = worktime
}
}
func (w *WorkWeek) CheckStatus() WeekStatus {
if w.Status != WeekStatusNone {
return w.Status
@@ -78,7 +97,7 @@ func (w *WorkWeek) CheckStatus() WeekStatus {
}
func (w *WorkWeek) GetWorkHourString() string {
return helper.FormatDuration(w.WorkHours)
return helper.FormatDuration(w.Worktime)
}
func (w *WorkWeek) aggregateWorkTime() time.Duration {
@@ -95,7 +114,7 @@ func (w *WorkWeek) aggregateWorkTime() time.Duration {
func (w *WorkWeek) GetSendWeeks(user User) []WorkWeek {
var weeks []WorkWeek
qStr, err := DB.Prepare(`SELECT id, woche_start::DATE FROM wochen_report WHERE bestaetigt = FALSE AND personal_nummer = $1;`)
qStr, err := DB.Prepare(`SELECT id, woche_start::DATE, arbeitszeit, ueberstunden FROM wochen_report WHERE bestaetigt = FALSE AND personal_nummer = $1;`)
if err != nil {
log.Println("Error preparing SQL statement", err)
return weeks
@@ -109,14 +128,16 @@ func (w *WorkWeek) GetSendWeeks(user User) []WorkWeek {
}
defer rows.Close()
for rows.Next() {
var week WorkWeek
week.User = user
if err := rows.Scan(&week.Id, &week.WeekStart); err != nil {
var week WorkWeek = WorkWeek{User: user}
var workHours, overtime sql.NullFloat64
if err := rows.Scan(&week.Id, &week.WeekStart, &workHours, &overtime); err != nil {
log.Println("Error scanning row!", err)
return weeks
}
week.WorkDays = (*WorkDay).GetWorkDays(nil, user.CardUID, week.WeekStart, week.WeekStart.Add(7*24*time.Hour))
week.WorkHours = week.aggregateWorkTime()
if workHours.Valid && overtime.Valid {
week.PopulateWithBookings(time.Duration(workHours.Float64*float64(time.Hour)).Round(time.Minute), time.Duration(overtime.Float64*float64(time.Hour)).Round(time.Minute))
}
weeks = append(weeks, week)
}
if err = rows.Err(); err != nil {
@@ -128,13 +149,8 @@ func (w *WorkWeek) GetSendWeeks(user User) []WorkWeek {
var ErrRunningWeek = errors.New("Week is in running week")
func (w *WorkWeek) GetOvertime() time.Duration {
var weekOvertime time.Duration = w.WorkHours - time.Duration(w.User.ArbeitszeitPerWoche*float32(time.Hour)).Round(time.Minute)
return weekOvertime
}
// creates a new entry in the woche_report table with the given workweek
func (w *WorkWeek) Send() error {
func (w *WorkWeek) SendWeek() error {
var qStr *sql.Stmt
var err error
@@ -144,19 +160,19 @@ func (w *WorkWeek) Send() error {
}
if w.CheckStatus() != WeekStatusNone {
qStr, err = DB.Prepare(`UPDATE "wochen_report" SET bestaetigt = FALSE, ueberstunden = $3 WHERE personal_nummer = $1 AND woche_start = $2;`)
qStr, err = DB.Prepare(`UPDATE "wochen_report" SET bestaetigt = FALSE, arbeitszeit = $3, ueberstunden = $4 WHERE personal_nummer = $1 AND woche_start = $2;`)
if err != nil {
log.Println("Error preparing SQL statement", err)
return err
}
} else {
qStr, err = DB.Prepare(`INSERT INTO wochen_report (personal_nummer, woche_start, ueberstunden) VALUES ($1, $2, $3);`)
qStr, err = DB.Prepare(`INSERT INTO wochen_report (personal_nummer, woche_start, arbeitszeit, ueberstunden) VALUES ($1, $2, $3, $4);`)
if err != nil {
log.Println("Error preparing SQL statement", err)
return err
}
}
_, err = qStr.Exec(w.User.PersonalNummer, w.WeekStart, w.GetOvertime().Hours())
_, err = qStr.Exec(w.User.PersonalNummer, w.WeekStart, w.Worktime.Hours(), w.Overtime.Hours())
if err != nil {
log.Println("Error executing query!", err)
return err