From f73cf0884c966e5eafb9a7481b0aa143732276e2 Mon Sep 17 00:00:00 2001 From: tom Date: Sun, 23 Feb 2025 09:44:18 +0100 Subject: [PATCH] CHANGE: added work and pause time --- Backend/database.go | 2 +- Backend/models/user.go | 21 +++------------ Backend/models/workDay.go | 48 ++++++++++++++++++++++++++-------- Backend/static/css/styles.css | 3 --- DB/initdb/01_create_tables.sql | 2 +- 5 files changed, 43 insertions(+), 33 deletions(-) diff --git a/Backend/database.go b/Backend/database.go index bf1c4de..1a6bf9e 100644 --- a/Backend/database.go +++ b/Backend/database.go @@ -13,7 +13,7 @@ func OpenDatabase() (*sql.DB, error) { dbUser := helper.GetEnv("POSTGRES_USER", "arbeit_zeit") dbPassword := helper.GetEnv("POSTGRES_PASS", "password") - connStr := fmt.Sprintf("postgres://%s:%s@%s:5432/%s?sslmode=disable", dbUser, dbPassword, dbHost, dbName) + connStr := fmt.Sprintf("postgres://%s:%s@%s:5432/%s?sslmode=disable&TimeZone=Europe/Berlin", dbUser, dbPassword, dbHost, dbName) return sql.Open("postgres", connStr) } diff --git a/Backend/models/user.go b/Backend/models/user.go index e0d4418..adbc41a 100644 --- a/Backend/models/user.go +++ b/Backend/models/user.go @@ -10,6 +10,7 @@ type User struct { Name string `json:"name"` Vorname string `json:"vorname"` PersonalNummer int `json:"personal_nummer"` + Arbeitszeit float32 `json:"arbeitszeit"` } func (u *User) GetAll() ([]User, error) { @@ -66,27 +67,15 @@ func (u *User) Logout() error { return nil } -func (u *User) GetByCardUID(card_uid string) (User, error) { - var user User - qStr, err := DB.Prepare((`SELECT personal_nummer, card_uid, vorname, nachname FROM personal_daten WHERE card_uid = $1;`)) - if err != nil { - return user, err - } - err = qStr.QueryRow(card_uid).Scan(&user.PersonalNummer, &user.CardUID, &user.Vorname, &user.Name) - if err != nil{ - return user, err - } - return user, nil -} - func (u *User) GetByPersonalNummer (personalNummer int) (User, error) { var user User - qStr, err := DB.Prepare((`SELECT personal_nummer, card_uid, vorname, nachname FROM personal_daten WHERE personal_nummer = $1;`)) + qStr, err := DB.Prepare((`SELECT personal_nummer, card_uid, vorname, nachname, arbeitszeit_per_tag FROM personal_daten WHERE personal_nummer = $1;`)) if err != nil { return user, err } - err = qStr.QueryRow(personalNummer).Scan(&user.PersonalNummer, &user.CardUID, &user.Vorname, &user.Name) + err = qStr.QueryRow(personalNummer).Scan(&user.PersonalNummer, &user.CardUID, &user.Vorname, &user.Name, &user.Arbeitszeit) + if err != nil{ return user, err } @@ -107,6 +96,4 @@ func (u *User) Login(password string) bool { return false } return loginSuccess - // userPassword := strings.ToLower(fmt.Sprintf("%s_%s", u.Vorname, u.Name)) //temp password: "max_mustermann" - // return userPassword == password } diff --git a/Backend/models/workDay.go b/Backend/models/workDay.go index 86d3eb6..a867566 100644 --- a/Backend/models/workDay.go +++ b/Backend/models/workDay.go @@ -1,6 +1,7 @@ package models import ( + "fmt" "time" ) @@ -12,26 +13,51 @@ type WorkDay struct { // Gets the duration someone worked that day func (d WorkDay) GetWorkTime() time.Duration{ - d.workTime = 0 - for i := 0; i < len(d.Bookings) - (1 + len(d.Bookings)%2); i += 2{ - start := d.Bookings[i].Timestamp - end := d.Bookings[i+1].Timestamp - d.workTime += end.Sub(start) + 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()) } - // checks if booking is today and has no gehen yet, so the time since last kommen booking is added to workTime - if(d.Day.Equal(time.Now().Truncate(24 * time.Hour)) && len(d.Bookings) % 2 == 1){ - d.workTime += time.Since(d.Bookings[len(d.Bookings)-1].Timestamp) + 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 d.workTime + 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 := d.GetWorkTime().Abs().Round(time.Minute).String() - str = str[:len(str)-2] + "in" + str := formatDuration(d.GetWorkTime().Abs().Round(time.Minute)) if(len(str) > 2){ return str } diff --git a/Backend/static/css/styles.css b/Backend/static/css/styles.css index a412b03..6b73928 100644 --- a/Backend/static/css/styles.css +++ b/Backend/static/css/styles.css @@ -600,9 +600,6 @@ .h-4 { height: calc(var(--spacing) * 4); } - .h-\[90vh\] { - height: 90vh; - } .h-\[100vh\] { height: 100vh; } diff --git a/DB/initdb/01_create_tables.sql b/DB/initdb/01_create_tables.sql index 09275fd..a2a7aaf 100644 --- a/DB/initdb/01_create_tables.sql +++ b/DB/initdb/01_create_tables.sql @@ -4,7 +4,7 @@ DROP TABLE IF EXISTS "anwesenheit"; CREATE TABLE "anwesenheit" ( "counter_id" bigserial PRIMARY KEY, - "timestamp" timestamp(6) DEFAULT CURRENT_TIMESTAMP, + "timestamp" timestamptz(6) DEFAULT CURRENT_TIMESTAMP, "card_uid" varchar(255), "check_in_out" int2, "geraet_id" int2