closed #25, #32
All checks were successful
GoLang Tests / Run Go Tests (push) Successful in 49s

This commit is contained in:
2025-09-04 21:22:26 +02:00
parent 0dd75c2126
commit 9ded540314
18 changed files with 224 additions and 119 deletions

View File

@@ -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 {

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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