CHANGE: finalized user auth + added booking edit view

This commit is contained in:
2025-02-20 01:56:21 +01:00
parent 35778e58b3
commit 8baf2f378a
17 changed files with 852 additions and 572 deletions

View File

@@ -132,6 +132,9 @@ func (b *Booking) GetBookingsGrouped(card_uid string, tsFrom time.Time, tsTo tim
var result []WorkDay
for key, bookings := range grouped {
day, _ := time.Parse("2006-01-02", key)
sort.Slice(bookings, func(i, j int) bool {
return bookings[i].Timestamp.Before(bookings[j].Timestamp)
})
result = append(result, WorkDay{Day: day, Bookings: bookings})
}
@@ -157,11 +160,11 @@ func (b Booking) Save() {
func (b *Booking) GetBookingType() string {
switch b.CheckInOut{
case (1):
case 1,3: //manuelle Änderung
return "kommen"
case (2):
case 2, 4: //manuelle Änderung
return "gehen"
case(255):
case 255:
return "abgemeldet"
default:
return "Buchungs Typ unbekannt"
@@ -203,3 +206,22 @@ func checkLastBooking(b Booking) bool {
}
return true
}
func (b *Booking) UpdateTime(newTime time.Time){
hour, minute, _ := newTime.Clock()
if(hour == b.Timestamp.Local().Hour() && minute == b.Timestamp.Local().Minute()){
return
}
// TODO: add check for time overlap
var newBooking Booking
newBooking.Timestamp = time.Date(b.Timestamp.Year(), b.Timestamp.Month(), b.Timestamp.Day(), hour, minute, 0, 0, time.Local).UTC()
if(b.CheckInOut < 3){
newBooking.CheckInOut = b.CheckInOut + 2
}
if(b.CheckInOut == 255){
newBooking.CheckInOut = 4
}
b.Update(newBooking)
b.Save()
}

View File

@@ -10,6 +10,7 @@ type User struct {
Name string `json:"name"`
Vorname string `json:"vorname"`
HauptbeschaeftigungsOrt int8 `json:"hauptbeschaeftigungsort"`
PersonalNummer int `json:"personal_nummer"`
}
func (u *User) GetAll() ([]User, error) {
@@ -66,13 +67,27 @@ func (u *User) Logout() error {
return nil
}
func (u *User) GetById(card_uid string) (User, error) {
func (u *User) GetByCardUID(card_uid string) (User, error) {
var user User
qStr, err := DB.Prepare((`SELECT card_uid, vorname, nachname, hauptbeschaeftigung_ort FROM personal_daten WHERE card_uid = $1;`))
qStr, err := DB.Prepare((`SELECT personal_nummer, card_uid, vorname, nachname, hauptbeschaeftigung_ort FROM personal_daten WHERE card_uid = $1;`))
if err != nil {
return user, err
}
err = qStr.QueryRow(card_uid).Scan(&user.CardUID, &user.Vorname, &user.Name, &user.HauptbeschaeftigungsOrt)
err = qStr.QueryRow(card_uid).Scan(&user.PersonalNummer, &user.CardUID, &user.Vorname, &user.Name, &user.HauptbeschaeftigungsOrt)
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, hauptbeschaeftigung_ort 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, &user.HauptbeschaeftigungsOrt)
if err != nil{
return user, err
}

View File

@@ -1,31 +1,34 @@
package models
import "time"
import (
"time"
)
type WorkDay struct {
Day time.Time
workTime time.Duration
Bookings []Booking
workTime time.Duration
}
// Gets the duration someone worked that day
func (d WorkDay) GetWorkTime() time.Duration{
if(d.workTime > 0) {
return d.workTime
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 lastCame Booking
for _, booking := range d.Bookings{
if(booking.CheckInOut == 1){//kommen
lastCame = booking
}else{
d.workTime = d.workTime + booking.Timestamp.Sub(lastCame.Timestamp)
}
}
if(time.Since(d.Day) < 24 * time.Hour && len(d.Bookings) % 2 == 1){
d.workTime += time.Since(lastCame.Timestamp)
// 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)
}
return d.workTime
}
// 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"
@@ -35,10 +38,12 @@ func (d WorkDay) GetWorkTimeString() string {
return ""
}
// returns bool wheter the workday was ended with an automatic logout
func (d WorkDay) RequiresAction() bool {
return d.Bookings[len(d.Bookings)-1].CheckInOut == 255
}
// returns a integer percentage of how much day has been worked of
func (d WorkDay) GetWorkDayProgress() uint8 {
defaultWorkTime, _ := time.ParseDuration("7h42m")
progress := (d.GetWorkTime().Seconds()/defaultWorkTime.Seconds())*100