From 9ded540314d3015610b63edb2758b7a735dae824 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=20Tr=C3=B6ger?= Date: Thu, 4 Sep 2025 21:22:26 +0200 Subject: [PATCH] closed #25, #32 --- .gitignore | 1 + Backend/endpoints/time.go | 10 +- Backend/endpoints/user-session.go | 1 - Backend/helper/logs/main.go | 24 ++++ Backend/helper/time.go | 4 + Backend/models/booking.go | 15 ++- Backend/models/user.go | 7 +- Backend/models/workDay.go | 6 +- Backend/models/workWeek.go | 22 ++-- Backend/static/css/styles.css | 50 +++++++++ Backend/templates/pages.templ | 11 +- Backend/templates/pages_templ.go | 110 ++++++++++--------- Backend/templates/teamComponents.templ | 2 - Backend/templates/teamComponents_templ.go | 38 +++---- DB/initdb/01_schema.sql | 4 +- migrations/20250904114004_intervals.down.sql | 7 ++ migrations/20250904114004_intervals.up.sql | 13 +++ migrations/atlas.sum | 18 ++- 18 files changed, 224 insertions(+), 119 deletions(-) create mode 100644 Backend/helper/logs/main.go create mode 100644 migrations/20250904114004_intervals.down.sql create mode 100644 migrations/20250904114004_intervals.up.sql diff --git a/.gitignore b/.gitignore index 4e80b98..13ae14c 100644 --- a/.gitignore +++ b/.gitignore @@ -38,3 +38,4 @@ DB/pg_data node_modules atlas.hcl .scannerwork +Backend/logs diff --git a/Backend/endpoints/time.go b/Backend/endpoints/time.go index c5edf3f..ac930e7 100644 --- a/Backend/endpoints/time.go +++ b/Backend/endpoints/time.go @@ -73,11 +73,11 @@ func getBookings(w http.ResponseWriter, r *http.Request) { lastSub := user.GetLastWorkWeekSubmission() var aggregatedOvertime time.Duration - for _, days := range workDays { - if days.Day.Before(lastSub) { + for _, day := range workDays { + if day.Day.Before(lastSub) { continue } - aggregatedOvertime += days.CalcOvertime(user) + aggregatedOvertime += day.CalcOvertime(user) } if reportedOvertime, err := user.GetReportedOvertime(); err == nil { user.Overtime = (reportedOvertime + aggregatedOvertime).Round(time.Minute) @@ -92,10 +92,6 @@ func getBookings(w http.ResponseWriter, r *http.Request) { return } - if err != nil { - log.Println("Error calc overtime: ", err) - } - ctx := context.WithValue(r.Context(), "user", user) templates.TimePage(workDays, lastSub).Render(ctx, w) } diff --git a/Backend/endpoints/user-session.go b/Backend/endpoints/user-session.go index 296fc3b..c115257 100644 --- a/Backend/endpoints/user-session.go +++ b/Backend/endpoints/user-session.go @@ -18,7 +18,6 @@ var Session *scs.SessionManager func CreateSessionManager(lifetime time.Duration) *scs.SessionManager { Session = scs.New() Session.Lifetime = lifetime - log.Println("Created Session") return Session } diff --git a/Backend/helper/logs/main.go b/Backend/helper/logs/main.go new file mode 100644 index 0000000..764a51c --- /dev/null +++ b/Backend/helper/logs/main.go @@ -0,0 +1,24 @@ +package logs + +import ( + "log" + "os" + "time" +) + +type FileLog struct { + Logger *log.Logger + Close func() error +} + +var Logs map[string]FileLog = make(map[string]FileLog) + +func NewAudit() (i *log.Logger, close func() error) { + LOG_FILE := "logs/" + time.Now().Format("2006-01-02") + ".log" + logFile, err := os.OpenFile(LOG_FILE, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) + if err != nil { + log.Panic(err) + } + + return log.New(logFile, "", log.LstdFlags), logFile.Close +} diff --git a/Backend/helper/time.go b/Backend/helper/time.go index 70ace8a..643072e 100644 --- a/Backend/helper/time.go +++ b/Backend/helper/time.go @@ -16,6 +16,10 @@ func GetMonday(ts time.Time) time.Time { return ts } +func IsWeekend(ts time.Time) bool { + return ts.Weekday() == time.Saturday || ts.Weekday() == time.Sunday +} + // Converts duration to string func FormatDuration(d time.Duration) string { hours := int(d.Abs().Hours()) diff --git a/Backend/models/booking.go b/Backend/models/booking.go index a293ee5..8b1140e 100644 --- a/Backend/models/booking.go +++ b/Backend/models/booking.go @@ -2,6 +2,7 @@ package models import ( "arbeitszeitmessung/helper" + "arbeitszeitmessung/helper/logs" "database/sql" "fmt" "log" @@ -199,6 +200,7 @@ func (b Booking) Save() { log.Fatalf("Error preparing query: %v", err) return } + _, err = qStr.Query(b.CounterId, b.CardUID, b.GeraetID, b.CheckInOut, b.Timestamp) if err != nil { log.Fatalf("Error executing query: %v", err) @@ -231,6 +233,8 @@ func (b *Booking) GetBookingType() string { } func (b *Booking) Update(nb Booking) { + auditLog, closeLog := logs.NewAudit() + defer closeLog() if b.CheckInOut != nb.CheckInOut && nb.CheckInOut != 0 { b.CheckInOut = nb.CheckInOut } @@ -241,6 +245,7 @@ func (b *Booking) Update(nb Booking) { b.GeraetID = nb.GeraetID } if b.Timestamp != nb.Timestamp { + auditLog.Printf("Änderung in Buchung %d von '%s': Buchungszeit (%s -> %s).", b.CounterId, b.CardUID, b.Timestamp.Format("15:04"), nb.Timestamp.Format("15:04)")) b.Timestamp = nb.Timestamp } } @@ -281,11 +286,15 @@ func (b *Booking) UpdateTime(newTime time.Time) { if b.CheckInOut == 254 { newBooking.CheckInOut = 4 } - log.Println("Updating") b.Update(newBooking) // TODO Check verify - b.Verify() - b.Save() + if b.Verify() { + b.Save() + } else { + log.Println("Cannot save updated booking!", b.ToString()) + } + // b.Verify() + // b.Save() } func (b *Booking) ToString() string { diff --git a/Backend/models/user.go b/Backend/models/user.go index 56169d4..37f216a 100644 --- a/Backend/models/user.go +++ b/Backend/models/user.go @@ -44,19 +44,16 @@ func (u *User) GetUserFromSession(Session *scs.SessionManager, ctx context.Conte // Returns the actual overtime for this moment func (u *User) GetReportedOvertime() (time.Duration, error) { var overtime time.Duration - var overtimeReport float64 - qStr, err := DB.Prepare("SELECT COALESCE(SUM(ueberstunden), 0) AS total_ueberstunden FROM wochen_report WHERE personal_nummer = $1;") + qStr, err := DB.Prepare("SELECT COALESCE(SUM(EXTRACT(EPOCH FROM ueberstunden) * 1000000000)::BIGINT, 0) AS total_ueberstunden_ns FROM wochen_report WHERE personal_nummer = $1;") if err != nil { return 0, err } defer qStr.Close() - err = qStr.QueryRow(u.PersonalNummer).Scan(&overtimeReport) + err = qStr.QueryRow(u.PersonalNummer).Scan(&overtime) if err != nil { return 0, err } - overtime = time.Duration(overtimeReport * float64(time.Hour)).Round(time.Minute) - log.Println("Overtime from wochen_report: ", overtime) return overtime, nil } diff --git a/Backend/models/workDay.go b/Backend/models/workDay.go index 734e935..c009df3 100644 --- a/Backend/models/workDay.go +++ b/Backend/models/workDay.go @@ -203,11 +203,15 @@ func (d *WorkDay) GetWorkDayProgress(user User) uint8 { } func (d *WorkDay) CalcOvertime(user User) time.Duration { + if helper.IsWeekend(d.Day) && len(d.Bookings) == 0 { + return 0 + } var overtime time.Duration overtime = d.workTime - time.Duration(user.ArbeitszeitPerTag*float32(time.Hour)).Round(time.Minute) // weekday is WE - if (d.Day.Weekday() == 6 || d.Day.Weekday() == 0) && len(d.Bookings) == 0 { + if (d.Absence != Absence{}) { overtime = 0 } + return overtime } diff --git a/Backend/models/workWeek.go b/Backend/models/workWeek.go index c093c58..5a9ef61 100644 --- a/Backend/models/workWeek.go +++ b/Backend/models/workWeek.go @@ -44,7 +44,7 @@ func NewWorkWeek(user User, tsMonday time.Time, populate bool) WorkWeek { return week } -func (w *WorkWeek) PopulateWithBookings(overtime time.Duration, worktime time.Duration) { +func (w *WorkWeek) PopulateWithBookings(worktime time.Duration, overtime 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 @@ -52,7 +52,10 @@ func (w *WorkWeek) PopulateWithBookings(overtime time.Duration, worktime time.Du 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) + w.Overtime = w.Worktime - time.Duration(w.User.ArbeitszeitPerWoche*float32(time.Hour)) + + w.Worktime = w.Worktime.Round(time.Minute) + w.Overtime = w.Overtime.Round(time.Minute) if overtime == 0 && worktime == 0 { return @@ -114,7 +117,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, arbeitszeit, ueberstunden FROM wochen_report WHERE bestaetigt = FALSE AND personal_nummer = $1;`) + qStr, err := DB.Prepare(`SELECT id, woche_start::DATE, (EXTRACT(epoch FROM arbeitszeit)*1000000000)::BIGINT, (EXTRACT(epoch FROM ueberstunden)*1000000000)::BIGINT FROM wochen_report WHERE bestaetigt = FALSE AND personal_nummer = $1;`) if err != nil { log.Println("Error preparing SQL statement", err) return weeks @@ -129,15 +132,12 @@ func (w *WorkWeek) GetSendWeeks(user User) []WorkWeek { defer rows.Close() for rows.Next() { var week WorkWeek = WorkWeek{User: user} - var workHours, overtime sql.NullFloat64 - if err := rows.Scan(&week.Id, &week.WeekStart, &workHours, &overtime); err != nil { + if err := rows.Scan(&week.Id, &week.WeekStart, &week.Worktime, &week.Overtime); err != nil { log.Println("Error scanning row!", err) return weeks } - 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)) - } + week.PopulateWithBookings(week.Worktime, week.Overtime) weeks = append(weeks, week) } if err = rows.Err(); err != nil { @@ -160,19 +160,19 @@ func (w *WorkWeek) SendWeek() error { } if w.CheckStatus() != WeekStatusNone { - qStr, err = DB.Prepare(`UPDATE "wochen_report" SET bestaetigt = FALSE, arbeitszeit = $3, ueberstunden = $4 WHERE personal_nummer = $1 AND woche_start = $2;`) + qStr, err = DB.Prepare(`UPDATE "wochen_report" SET bestaetigt = FALSE, arbeitszeit = make_interval(secs => $3::numeric / 1000000000), ueberstunden = make_interval(secs => $4::numeric / 1000000000) 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, arbeitszeit, ueberstunden) VALUES ($1, $2, $3, $4);`) + qStr, err = DB.Prepare(`INSERT INTO wochen_report (personal_nummer, woche_start, arbeitszeit, ueberstunden) VALUES ($1, $2, make_interval(secs => $3::numeric / 1000000000), make_interval(secs => $4::numeric / 1000000000));`) if err != nil { log.Println("Error preparing SQL statement", err) return err } } - _, err = qStr.Exec(w.User.PersonalNummer, w.WeekStart, w.Worktime.Hours(), w.Overtime.Hours()) + _, err = qStr.Exec(w.User.PersonalNummer, w.WeekStart, int64(w.Worktime), int64(w.Overtime)) if err != nil { log.Println("Error executing query!", err) return err diff --git a/Backend/static/css/styles.css b/Backend/static/css/styles.css index 2f2f5e3..de26b86 100644 --- a/Backend/static/css/styles.css +++ b/Backend/static/css/styles.css @@ -298,6 +298,9 @@ width: calc(var(--spacing) * 4); height: calc(var(--spacing) * 4); } + .h-2 { + height: calc(var(--spacing) * 2); + } .h-4 { height: calc(var(--spacing) * 4); } @@ -316,6 +319,9 @@ .w-4 { width: calc(var(--spacing) * 4); } + .w-9 { + width: calc(var(--spacing) * 9); + } .w-9\/10 { width: calc(9/10 * 100%); } @@ -328,6 +334,9 @@ .w-full { width: 100%; } + .flex-shrink { + flex-shrink: 1; + } .flex-shrink-0 { flex-shrink: 0; } @@ -340,9 +349,15 @@ .grow-1 { flex-grow: 1; } + .border-collapse { + border-collapse: collapse; + } .cursor-pointer { cursor: pointer; } + .resize { + resize: both; + } .grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } @@ -412,6 +427,10 @@ border-style: var(--tw-border-style); border-width: 1px; } + .border-0 { + border-style: var(--tw-border-style); + border-width: 0px; + } .border-neutral-200 { border-color: var(--color-neutral-200); } @@ -433,6 +452,9 @@ .bg-neutral-400 { background-color: var(--color-neutral-400); } + .bg-neutral-700 { + background-color: var(--color-neutral-700); + } .bg-orange-500 { background-color: var(--color-orange-500); } @@ -442,6 +464,9 @@ .bg-red-600 { background-color: var(--color-red-600); } + .mask-repeat { + mask-repeat: repeat; + } .p-1 { padding: calc(var(--spacing) * 1); } @@ -500,6 +525,13 @@ .uppercase { text-transform: uppercase; } + .underline { + text-decoration-line: underline; + } + .outline { + outline-style: var(--tw-outline-style); + outline-width: 1px; + } .filter { filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,); } @@ -667,6 +699,12 @@ } } } + .max-md\:border-0 { + @media (width < 48rem) { + border-style: var(--tw-border-style); + border-width: 0px; + } + } .max-md\:border-b-1 { @media (width < 48rem) { border-bottom-style: var(--tw-border-style); @@ -755,6 +793,12 @@ } } } + .lg\:border-0 { + @media (width >= 64rem) { + border-style: var(--tw-border-style); + border-width: 0px; + } + } .\@7xl\:grid { @container (width >= 80rem) { display: grid; @@ -853,6 +897,11 @@ syntax: "*"; inherits: false; } +@property --tw-outline-style { + syntax: "*"; + inherits: false; + initial-value: solid; +} @property --tw-blur { syntax: "*"; inherits: false; @@ -917,6 +966,7 @@ --tw-border-style: solid; --tw-divide-y-reverse: 0; --tw-font-weight: initial; + --tw-outline-style: solid; --tw-blur: initial; --tw-brightness: initial; --tw-contrast: initial; diff --git a/Backend/templates/pages.templ b/Backend/templates/pages.templ index 7915162..d192f43 100644 --- a/Backend/templates/pages.templ +++ b/Backend/templates/pages.templ @@ -4,7 +4,6 @@ import ( "arbeitszeitmessung/helper" "arbeitszeitmessung/models" "fmt" - "log" "strconv" "time" ) @@ -26,6 +25,9 @@ templ TimePage(workDays []models.WorkDay, lastSub time.Time) { @inputForm() for _, day := range workDays { @dayComponent(day, day.Day.Before(lastSub)) + if (day.Day.Weekday() == time.Monday) { +
+ } } @LegendComponent() @@ -94,11 +96,10 @@ templ TeamPage(weeks []models.WorkWeek, userWeek models.WorkWeek) { @headerComponent() {{ progress := (float32(userWeek.Worktime.Hours()) / userWeek.User.ArbeitszeitPerWoche) * 100 - log.Println(userWeek.CheckStatus()) }}
-
-
+
+

Eigene Abrechnung

@@ -187,5 +188,5 @@ templ TeamPresencePage(teamPresence map[bool][]models.User) { } templ LogoutButton() { - + } diff --git a/Backend/templates/pages_templ.go b/Backend/templates/pages_templ.go index 346d818..30e1bba 100644 --- a/Backend/templates/pages_templ.go +++ b/Backend/templates/pages_templ.go @@ -12,7 +12,6 @@ import ( "arbeitszeitmessung/helper" "arbeitszeitmessung/models" "fmt" - "log" "strconv" "time" ) @@ -88,8 +87,18 @@ func TimePage(workDays []models.WorkDay, lastSub time.Time) templ.Component { if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 3, " ") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + if day.Day.Weekday() == time.Monday { + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 4, "
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + } } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 3, "
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 5, "
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -126,17 +135,17 @@ func LoginPage(failed bool) templ.Component { if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 4, "

Benutzer Anmelden

") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 6, "

Benutzer Anmelden

") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } if failed { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 5, "

Login fehlgeschlagen, bitte erneut versuchen!

") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 7, "

Login fehlgeschlagen, bitte erneut versuchen!

") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 6, "
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 8, "
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -173,28 +182,28 @@ func UserPage(status int) templ.Component { if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 7, "

Passwort ändern

") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 9, "

Passwort ändern

") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } switch { case status == 401: - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 8, "

Aktuelles Passwort nicht korrekt!

") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 10, "

Aktuelles Passwort nicht korrekt!

") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } case status >= 400: - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 9, "

Passwortwechsel fehlgeschlagen, bitte erneut versuchen!

") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 11, "

Passwortwechsel fehlgeschlagen, bitte erneut versuchen!

") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } case status == 202: - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 10, "

Passwortänderung erfolgreich

") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 12, "

Passwortänderung erfolgreich

") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 11, "

Nutzer abmelden

Nutzer von Weboberfläche abmelden.

") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 13, "

Nutzer abmelden

Nutzer von Weboberfläche abmelden.

") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -224,12 +233,12 @@ func statusCheckMark(status models.WeekStatus, target models.WeekStatus) templ.C } ctx = templ.ClearChildren(ctx) if status >= target { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 12, "
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 14, "
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } } else { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 13, "
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 15, "
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -269,8 +278,7 @@ func TeamPage(weeks []models.WorkWeek, userWeek models.WorkWeek) templ.Component } progress := (float32(userWeek.Worktime.Hours()) / userWeek.User.ArbeitszeitPerWoche) * 100 - log.Println(userWeek.CheckStatus()) - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 14, "

Eigene Abrechnung

") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 16, "

Eigene Abrechnung

") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -278,20 +286,20 @@ func TeamPage(weeks []models.WorkWeek, userWeek models.WorkWeek) templ.Component if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 15, "

") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 17, "

") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } var templ_7745c5c3_Var7 string templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%s %s", userWeek.User.Vorname, userWeek.User.Name)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/pages.templ`, Line: 108, Col: 101} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/pages.templ`, Line: 109, Col: 101} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var7)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 16, "

") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 18, "
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -299,7 +307,7 @@ func TeamPage(weeks []models.WorkWeek, userWeek models.WorkWeek) templ.Component if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 17, "Gesendet ") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 19, "Gesendet ") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -307,7 +315,7 @@ func TeamPage(weeks []models.WorkWeek, userWeek models.WorkWeek) templ.Component if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 18, "Akzeptiert
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 20, "Akzeptiert
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -315,33 +323,33 @@ func TeamPage(weeks []models.WorkWeek, userWeek models.WorkWeek) templ.Component if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 19, "

Arbeitszeit: ") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 21, "

Arbeitszeit: ") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } var templ_7745c5c3_Var8 string templ_7745c5c3_Var8, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%s", helper.FormatDuration(userWeek.Worktime))) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/pages.templ`, Line: 123, Col: 84} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/pages.templ`, Line: 124, Col: 84} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var8)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 20, "

Überstunden: ") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 22, "

Überstunden: ") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } var templ_7745c5c3_Var9 string templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%s", helper.FormatDuration(userWeek.Overtime))) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/pages.templ`, Line: 124, Col: 85} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/pages.templ`, Line: 125, Col: 85} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var9)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 21, "

") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 23, "

") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -351,7 +359,7 @@ func TeamPage(weeks []models.WorkWeek, userWeek models.WorkWeek) templ.Component return templ_7745c5c3_Err } } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 22, "
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 24, "
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -359,79 +367,79 @@ func TeamPage(weeks []models.WorkWeek, userWeek models.WorkWeek) templ.Component if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 23, "
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 27, "\"> ") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } switch userWeek.CheckStatus() { case models.WeekStatusNone: - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 26, "

an Vorgesetzten senden

") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 28, "

an Vorgesetzten senden

") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } case models.WeekStatusSent: - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 27, "

an Vorgesetzten gesendet

") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 29, "

an Vorgesetzten gesendet

") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } case models.WeekStatusAccepted: - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 28, "

vom Vorgesetzten bestätigt

") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 30, "

vom Vorgesetzten bestätigt

") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 29, "Korrigieren = models.WeekStatusSent { templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 32, " disabled") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 33, " type=\"submit\" class=\"btn\">Senden
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 33, " type=\"submit\" class=\"btn\">Korrigieren = models.WeekStatusSent { + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 34, " disabled") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 35, " type=\"submit\" class=\"btn\">Senden
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } if len(weeks) > 0 { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 34, "

Abrechnung Mitarbeiter

") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 36, "

Abrechnung Mitarbeiter

") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -442,7 +450,7 @@ func TeamPage(weeks []models.WorkWeek, userWeek models.WorkWeek) templ.Component return templ_7745c5c3_Err } } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 35, "
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 37, "
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -479,7 +487,7 @@ func TeamPresencePage(teamPresence map[bool][]models.User) templ.Component { if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 36, "

Anwesend

") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 38, "

Anwesend

") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -489,7 +497,7 @@ func TeamPresencePage(teamPresence map[bool][]models.User) templ.Component { return templ_7745c5c3_Err } } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 37, "

Nicht Anwesend

") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 39, "

Nicht Anwesend

") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -499,7 +507,7 @@ func TeamPresencePage(teamPresence map[bool][]models.User) templ.Component { return templ_7745c5c3_Err } } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 38, "
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 40, "
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -528,7 +536,7 @@ func LogoutButton() templ.Component { templ_7745c5c3_Var13 = templ.NopComponent } ctx = templ.ClearChildren(ctx) - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 39, "") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 41, "") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } diff --git a/Backend/templates/teamComponents.templ b/Backend/templates/teamComponents.templ index a43a3f6..6e1a48d 100644 --- a/Backend/templates/teamComponents.templ +++ b/Backend/templates/teamComponents.templ @@ -4,7 +4,6 @@ import ( "arbeitszeitmessung/helper" "arbeitszeitmessung/models" "fmt" - "log" "strconv" "time" ) @@ -65,7 +64,6 @@ templ employeComponent(week models.WorkWeek) { {{ year, kw := week.WeekStart.ISOWeek() progress := (float32(week.Worktime.Hours()) / week.User.ArbeitszeitPerWoche) * 100 - log.Println(progress) }}
diff --git a/Backend/templates/teamComponents_templ.go b/Backend/templates/teamComponents_templ.go index abe699c..022e701 100644 --- a/Backend/templates/teamComponents_templ.go +++ b/Backend/templates/teamComponents_templ.go @@ -12,7 +12,6 @@ import ( "arbeitszeitmessung/helper" "arbeitszeitmessung/models" "fmt" - "log" "strconv" "time" ) @@ -47,7 +46,7 @@ func weekPicker(weekStart time.Time) templ.Component { var templ_7745c5c3_Var2 string templ_7745c5c3_Var2, templ_7745c5c3_Err = templ.JoinStringErrs(weekStart.Format(time.DateOnly)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 17, Col: 98} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 16, Col: 98} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var2)) if templ_7745c5c3_Err != nil { @@ -77,7 +76,7 @@ func weekPicker(weekStart time.Time) templ.Component { var templ_7745c5c3_Var4 string templ_7745c5c3_Var4, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%02d, %d", kw, year)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 23, Col: 69} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 22, Col: 69} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var4)) if templ_7745c5c3_Err != nil { @@ -161,7 +160,7 @@ func weekDayComponent(user models.User, day models.WorkDay) templ.Component { var templ_7745c5c3_Var7 string templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.JoinStringErrs(day.Day.Format("Mon")) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 40, Col: 89} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 39, Col: 89} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var7)) if templ_7745c5c3_Err != nil { @@ -174,7 +173,7 @@ func weekDayComponent(user models.User, day models.WorkDay) templ.Component { var templ_7745c5c3_Var8 string templ_7745c5c3_Var8, templ_7745c5c3_Err = templ.JoinStringErrs(day.Day.Format("02.01.2006")) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 40, Col: 130} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 39, Col: 130} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var8)) if templ_7745c5c3_Err != nil { @@ -187,7 +186,7 @@ func weekDayComponent(user models.User, day models.WorkDay) templ.Component { var templ_7745c5c3_Var9 string templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.JoinStringErrs(work) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 42, Col: 36} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 41, Col: 36} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var9)) if templ_7745c5c3_Err != nil { @@ -200,7 +199,7 @@ func weekDayComponent(user models.User, day models.WorkDay) templ.Component { var templ_7745c5c3_Var10 string templ_7745c5c3_Var10, templ_7745c5c3_Err = templ.JoinStringErrs(pause) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 43, Col: 42} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 42, Col: 42} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var10)) if templ_7745c5c3_Err != nil { @@ -218,7 +217,7 @@ func weekDayComponent(user models.User, day models.WorkDay) templ.Component { var templ_7745c5c3_Var11 string templ_7745c5c3_Var11, templ_7745c5c3_Err = templ.JoinStringErrs(day.Absence.AbwesenheitTyp.Name) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 51, Col: 41} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 50, Col: 41} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var11)) if templ_7745c5c3_Err != nil { @@ -236,7 +235,7 @@ func weekDayComponent(user models.User, day models.WorkDay) templ.Component { var templ_7745c5c3_Var12 string templ_7745c5c3_Var12, templ_7745c5c3_Err = templ.JoinStringErrs(day.TimeFrom.Format("15:04")) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 53, Col: 41} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 52, Col: 41} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var12)) if templ_7745c5c3_Err != nil { @@ -249,7 +248,7 @@ func weekDayComponent(user models.User, day models.WorkDay) templ.Component { var templ_7745c5c3_Var13 string templ_7745c5c3_Var13, templ_7745c5c3_Err = templ.JoinStringErrs(day.TimeTo.Format("15:04")) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 55, Col: 39} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 54, Col: 39} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var13)) if templ_7745c5c3_Err != nil { @@ -297,7 +296,6 @@ func employeComponent(week models.WorkWeek) templ.Component { year, kw := week.WeekStart.ISOWeek() progress := (float32(week.Worktime.Hours()) / week.User.ArbeitszeitPerWoche) * 100 - log.Println(progress) templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 24, "

") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err @@ -305,7 +303,7 @@ func employeComponent(week models.WorkWeek) templ.Component { var templ_7745c5c3_Var15 string templ_7745c5c3_Var15, templ_7745c5c3_Err = templ.JoinStringErrs(week.User.Vorname) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 72, Col: 53} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 70, Col: 53} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var15)) if templ_7745c5c3_Err != nil { @@ -318,7 +316,7 @@ func employeComponent(week models.WorkWeek) templ.Component { var templ_7745c5c3_Var16 string templ_7745c5c3_Var16, templ_7745c5c3_Err = templ.JoinStringErrs(week.User.Name) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 72, Col: 72} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 70, Col: 72} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var16)) if templ_7745c5c3_Err != nil { @@ -339,7 +337,7 @@ func employeComponent(week models.WorkWeek) templ.Component { var templ_7745c5c3_Var17 string templ_7745c5c3_Var17, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%s", helper.FormatDuration(week.Worktime))) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 76, Col: 78} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 74, Col: 78} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var17)) if templ_7745c5c3_Err != nil { @@ -352,7 +350,7 @@ func employeComponent(week models.WorkWeek) templ.Component { var templ_7745c5c3_Var18 string templ_7745c5c3_Var18, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%s", helper.FormatDuration(week.Overtime))) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 77, Col: 79} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 75, Col: 79} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var18)) if templ_7745c5c3_Err != nil { @@ -375,7 +373,7 @@ func employeComponent(week models.WorkWeek) templ.Component { var templ_7745c5c3_Var19 string templ_7745c5c3_Var19, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%02d-%d", kw, year)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 87, Col: 85} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 85, Col: 85} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var19)) if templ_7745c5c3_Err != nil { @@ -388,7 +386,7 @@ func employeComponent(week models.WorkWeek) templ.Component { var templ_7745c5c3_Var20 string templ_7745c5c3_Var20, templ_7745c5c3_Err = templ.JoinStringErrs(strconv.Itoa(week.User.PersonalNummer)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 89, Col: 82} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 87, Col: 82} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var20)) if templ_7745c5c3_Err != nil { @@ -401,7 +399,7 @@ func employeComponent(week models.WorkWeek) templ.Component { var templ_7745c5c3_Var21 string templ_7745c5c3_Var21, templ_7745c5c3_Err = templ.JoinStringErrs(week.WeekStart.Format(time.DateOnly)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 90, Col: 80} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 88, Col: 80} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var21)) if templ_7745c5c3_Err != nil { @@ -478,7 +476,7 @@ func userPresenceComponent(user models.User, present bool) templ.Component { var templ_7745c5c3_Var23 string templ_7745c5c3_Var23, templ_7745c5c3_Err = templ.JoinStringErrs(user.Vorname) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 110, Col: 19} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 108, Col: 19} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var23)) if templ_7745c5c3_Err != nil { @@ -491,7 +489,7 @@ func userPresenceComponent(user models.User, present bool) templ.Component { var templ_7745c5c3_Var24 string templ_7745c5c3_Var24, templ_7745c5c3_Err = templ.JoinStringErrs(user.Name) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 110, Col: 33} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 108, Col: 33} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var24)) if templ_7745c5c3_Err != nil { diff --git a/DB/initdb/01_schema.sql b/DB/initdb/01_schema.sql index 8547504..b08fad3 100644 --- a/DB/initdb/01_schema.sql +++ b/DB/initdb/01_schema.sql @@ -81,8 +81,8 @@ CREATE TABLE "wochen_report" ( "personal_nummer" int4, "woche_start" date, "bestaetigt" bool DEFAULT FALSE, - "arbeitszeit" float4, - "ueberstunden" float4, + "arbeitszeit" interval, + "ueberstunden" interval, UNIQUE ("personal_nummer", "woche_start") ); diff --git a/migrations/20250904114004_intervals.down.sql b/migrations/20250904114004_intervals.down.sql new file mode 100644 index 0000000..de68f25 --- /dev/null +++ b/migrations/20250904114004_intervals.down.sql @@ -0,0 +1,7 @@ +ALTER TABLE wochen_report + ALTER COLUMN ueberstunden TYPE float4 + USING + extract(epoch from ueberstunden) / 3600.0, + ALTER COLUMN arbeitszeit TYPE float4 + USING + extract(epoch from arbeitszeit) / 3600.0; diff --git a/migrations/20250904114004_intervals.up.sql b/migrations/20250904114004_intervals.up.sql new file mode 100644 index 0000000..272ceb8 --- /dev/null +++ b/migrations/20250904114004_intervals.up.sql @@ -0,0 +1,13 @@ +ALTER TABLE wochen_report + ALTER COLUMN ueberstunden TYPE interval + USING + make_interval( + hours => floor(ueberstunden)::int, + mins => round((ueberstunden - floor(ueberstunden)) * 60)::int + ), + ALTER COLUMN arbeitszeit TYPE interval + USING + make_interval( + hours => floor(arbeitszeit)::int, + mins => round((arbeitszeit - floor(arbeitszeit)) * 60)::int + ); diff --git a/migrations/atlas.sum b/migrations/atlas.sum index f860f4a..d57ff83 100644 --- a/migrations/atlas.sum +++ b/migrations/atlas.sum @@ -1,11 +1,7 @@ -h1:8l1ysZIcRMDXUdjWvSQVhVJjVUEfiVlYw7Q/jUB0Wn0= -20250901201159_initial.down.sql h1:cmF5CvNGqEfcmbRgiqaqDWERdNNRaMzarbNLJ/Y35o4= -20250901201159_initial.up.sql h1:Yrak/+wfQ4Tu/dVR/cUZ/75DlAcv4G/OJXDqpgSw47U= -20250901201250_control_tables.down.sql h1:f/KmhO9pOI45J8ZRjFonvD3CypB+rOoGOPN2WMFHvOw= -20250901201250_control_tables.up.sql h1:of5E07p0N1aen9CdQNEOrO7ffbKZC6kp4oK5KPzU9+g= -20250901201710_triggers_extension.down.sql h1:a9va3FSfHBWzODJSJO+ywNa2hiZwjG/vmvYGb3L1lnM= -20250901201710_triggers_extension.up.sql h1:nUBPd2eDssi/TwMVF/nOJkIM5rUM0iINdg1K9pZRZN0= -20250903221313_overtime.down.sql h1:X+jJESqcZ6ZTd2H563z6kRaXb4dn4sA02D3ck2795v8= -20250903221313_overtime.up.sql h1:C3DSiNVpe9v0Un1DEQ0lsy5yToR8iqcggv91GSr6tRE= -20250903233030_non_null_contraints.down.sql h1:jAIc4pRyTS/X0qONQKhjhVx891JCA9/KZbx619240AY= -20250903233030_non_null_contraints.up.sql h1:Ts4CuDO3gP/VSBu1OhnVhiyOIiLnT8qvEf/kHjCmeCU= +h1:31y/DB0ca2cm603nNckNvVCwm+XuMaVsoGUB+JvrOKs= +20250901201159_initial.up.sql h1:Mb1RlVdFvcxqU9HrSK6oNeURqFa3O4KzB3rDa+6+3gc= +20250901201250_control_tables.up.sql h1:a5LATgR/CRiC4GsqxkJ94TyJOxeTcW74eCnodIy+c1E= +20250901201710_triggers_extension.up.sql h1:z9b6Hk9btE2Ns4mU7B16HjvYBP6EEwHAXVlvPpkn978= +20250903221313_overtime.up.sql h1:t/B435ShW5ZEnzC81jRABWVZ5gNm7tPZPnOO6/ZY6ow= +20250903233030_non_null_contraints.up.sql h1:e7d+6ZdpEjPh2cc65N3S06oD2e6diMuG7+klhgYsym8= +20250904114004_intervals.up.sql h1:Sz8FIVvvcCIS3aIuSjyzFYLs32fjMcMMHk62shj6Qpw=