CHANGE: added work and pause time
This commit is contained in:
@@ -13,7 +13,7 @@ func OpenDatabase() (*sql.DB, error) {
|
|||||||
dbUser := helper.GetEnv("POSTGRES_USER", "arbeit_zeit")
|
dbUser := helper.GetEnv("POSTGRES_USER", "arbeit_zeit")
|
||||||
dbPassword := helper.GetEnv("POSTGRES_PASS", "password")
|
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)
|
return sql.Open("postgres", connStr)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ type User struct {
|
|||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
Vorname string `json:"vorname"`
|
Vorname string `json:"vorname"`
|
||||||
PersonalNummer int `json:"personal_nummer"`
|
PersonalNummer int `json:"personal_nummer"`
|
||||||
|
Arbeitszeit float32 `json:"arbeitszeit"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (u *User) GetAll() ([]User, error) {
|
func (u *User) GetAll() ([]User, error) {
|
||||||
@@ -66,27 +67,15 @@ func (u *User) Logout() error {
|
|||||||
return nil
|
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) {
|
func (u *User) GetByPersonalNummer (personalNummer int) (User, error) {
|
||||||
var user User
|
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 {
|
if err != nil {
|
||||||
return user, err
|
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{
|
if err != nil{
|
||||||
return user, err
|
return user, err
|
||||||
}
|
}
|
||||||
@@ -107,6 +96,4 @@ func (u *User) Login(password string) bool {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
return loginSuccess
|
return loginSuccess
|
||||||
// userPassword := strings.ToLower(fmt.Sprintf("%s_%s", u.Vorname, u.Name)) //temp password: "max_mustermann"
|
|
||||||
// return userPassword == password
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package models
|
package models
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -12,26 +13,51 @@ type WorkDay struct {
|
|||||||
|
|
||||||
// Gets the duration someone worked that day
|
// Gets the duration someone worked that day
|
||||||
func (d WorkDay) GetWorkTime() time.Duration{
|
func (d WorkDay) GetWorkTime() time.Duration{
|
||||||
d.workTime = 0
|
var workTime, pauseTime time.Duration
|
||||||
for i := 0; i < len(d.Bookings) - (1 + len(d.Bookings)%2); i += 2{
|
var lastBooking Booking
|
||||||
start := d.Bookings[i].Timestamp
|
for _, booking := range d.Bookings{
|
||||||
end := d.Bookings[i+1].Timestamp
|
if booking.CheckInOut % 2 == 1 {
|
||||||
d.workTime += end.Sub(start)
|
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 workTime > 6 * time.Hour && pauseTime < 45 * time.Minute {
|
||||||
if(d.Day.Equal(time.Now().Truncate(24 * time.Hour)) && len(d.Bookings) % 2 == 1){
|
if workTime < 9 * time.Hour && pauseTime < 30 * time.Minute {
|
||||||
d.workTime += time.Since(d.Bookings[len(d.Bookings)-1].Timestamp)
|
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
|
// Converts duration to string and replaces 0s with in
|
||||||
//
|
//
|
||||||
// -> output xhxmin
|
// -> output xhxmin
|
||||||
func (d WorkDay) GetWorkTimeString() string {
|
func (d WorkDay) GetWorkTimeString() string {
|
||||||
str := d.GetWorkTime().Abs().Round(time.Minute).String()
|
str := formatDuration(d.GetWorkTime().Abs().Round(time.Minute))
|
||||||
str = str[:len(str)-2] + "in"
|
|
||||||
if(len(str) > 2){
|
if(len(str) > 2){
|
||||||
return str
|
return str
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -600,9 +600,6 @@
|
|||||||
.h-4 {
|
.h-4 {
|
||||||
height: calc(var(--spacing) * 4);
|
height: calc(var(--spacing) * 4);
|
||||||
}
|
}
|
||||||
.h-\[90vh\] {
|
|
||||||
height: 90vh;
|
|
||||||
}
|
|
||||||
.h-\[100vh\] {
|
.h-\[100vh\] {
|
||||||
height: 100vh;
|
height: 100vh;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
DROP TABLE IF EXISTS "anwesenheit";
|
DROP TABLE IF EXISTS "anwesenheit";
|
||||||
CREATE TABLE "anwesenheit" (
|
CREATE TABLE "anwesenheit" (
|
||||||
"counter_id" bigserial PRIMARY KEY,
|
"counter_id" bigserial PRIMARY KEY,
|
||||||
"timestamp" timestamp(6) DEFAULT CURRENT_TIMESTAMP,
|
"timestamp" timestamptz(6) DEFAULT CURRENT_TIMESTAMP,
|
||||||
"card_uid" varchar(255),
|
"card_uid" varchar(255),
|
||||||
"check_in_out" int2,
|
"check_in_out" int2,
|
||||||
"geraet_id" int2
|
"geraet_id" int2
|
||||||
|
|||||||
Reference in New Issue
Block a user