From 7670efa99b48782a54b1c7c65fc6ee0326af26f0 Mon Sep 17 00:00:00 2001 From: tom Date: Sat, 2 Aug 2025 08:55:40 +0200 Subject: [PATCH] added control tables (s_*) + working on implementing absence and booking types --- Backend/endpoints/time.go | 7 +- Backend/models/absence.go | 102 ++++++++++++++++------ Backend/models/booking.go | 36 ++++++++ Backend/models/controlTables.go | 15 ++++ Backend/models/user.go | 8 +- Backend/models/workDay.go | 4 +- Backend/templates/timeComponents.templ | 6 +- Backend/templates/timeComponents_templ.go | 14 +-- DB/initdb/01_create_tables.sql | 35 ++++++-- DB/initdb/02_create_user.sh | 3 +- 10 files changed, 176 insertions(+), 54 deletions(-) create mode 100644 Backend/models/controlTables.go diff --git a/Backend/endpoints/time.go b/Backend/endpoints/time.go index 477ad96..9dae1a3 100644 --- a/Backend/endpoints/time.go +++ b/Backend/endpoints/time.go @@ -163,7 +163,12 @@ func createAbsence(absenceType int, user models.User, loc *time.Location, r *htt log.Println("Cannot get date from input! Skipping absence creation", err) return } - absence := models.NewAbsence(user.CardUID, int8(absenceType), absenceDate) + + absence, err := models.NewAbsence(user.CardUID, absenceType, absenceDate) + if err != nil { + log.Println("Error creating absence!", err) + return + } err = absence.Insert() if err != nil { log.Println("Error inserting absence!", err) diff --git a/Backend/models/absence.go b/Backend/models/absence.go index 2f352c6..a1f1b9e 100644 --- a/Backend/models/absence.go +++ b/Backend/models/absence.go @@ -1,52 +1,65 @@ package models import ( + "errors" "log" "time" ) type AbsenceType struct { - Value int8 - Label string + Id int8 + Name string } -const ( - AbsenceNone int8 = iota - AbsenceUrlaub - AbsenceKurzarbeit - AbsenceKrank - AbsenceKindkrank -) +// const ( +// AbsenceNone int8 = iota +// AbsenceUrlaub +// AbsenceKurzarbeit +// AbsenceKrank +// AbsenceKindkrank +// ) -var AbsenceTypes = []AbsenceType{ - // {Value: AbsenceNone, Label: "Abwesenheit"}, - {Value: AbsenceUrlaub, Label: "Urlaub"}, - {Value: AbsenceKurzarbeit, Label: "Kurzarbeit"}, - {Value: AbsenceKrank, Label: "Krank"}, - {Value: AbsenceKindkrank, Label: "Kindkrank"}, -} +// var AbsenceTypes = []AbsenceType{ +// // {Value: AbsenceNone, Label: "Abwesenheit"}, +// {Id: AbsenceUrlaub, Name: "Urlaub"}, +// {Id: AbsenceKurzarbeit, Name: "Kurzarbeit"}, +// {Id: AbsenceKrank, Name: "Krank"}, +// {Id: AbsenceKindkrank, Name: "Kindkrank"}, +// } -var AbsenceTypesLabel = map[int8]string{ - 0: "None", - AbsenceUrlaub: "Urlaub", - AbsenceKurzarbeit: "Kurzarbeit", - AbsenceKrank: "Krank", - AbsenceKindkrank: "Kindkrank", -} +// var AbsenceTypesLabel = map[int8]string{ +// 0: "None", +// AbsenceUrlaub: "Urlaub", +// AbsenceKurzarbeit: "Kurzarbeit", +// AbsenceKrank: "Krank", +// AbsenceKindkrank: "Kindkrank", +// } type Absence struct { CounterId int CardUID string - AbwesenheitTyp int8 + AbwesenheitTyp AbsenceType Datum time.Time + // Comment string } -func NewAbsence(card_uid string, abwesenheit_typ int8, datum time.Time) Absence { +func NewAbsence(card_uid string, abwesenheit_typ int, datum time.Time) (Absence, error) { + if abwesenheit_typ < 0 { + return Absence{ + CardUID: card_uid, + AbwesenheitTyp: AbsenceType{0, "Custom absence"}, + Datum: datum, + }, nil + } + _absenceType, ok := GetAbsenceTypesCached()[int8(abwesenheit_typ)] + if !ok { + return Absence{}, errors.New("Invalid absencetype") + } return Absence{ CardUID: card_uid, - AbwesenheitTyp: abwesenheit_typ, + AbwesenheitTyp: _absenceType, Datum: datum, - } + }, nil } func (a *Absence) Insert() error { @@ -63,6 +76,37 @@ func (a *Absence) Insert() error { return nil } -func (a *Absence) GetStringType() string { - return AbsenceTypesLabel[a.AbwesenheitTyp] +// func (a *Absence) GetStringType() string { +// return AbsenceTypesLabel[a.AbwesenheitTyp] +// } + +func GetAbsenceTypes() (map[int8]AbsenceType, error) { + var types = make(map[int8]AbsenceType) + qStr, err := DB.Prepare("SELECT abwesenheit_id, abwesenheit_name FROM s_abwesenheit_typen;") + if err != nil { + return types, err + } + defer qStr.Close() + rows, err := qStr.Query() + if err != nil { + log.Println("Error getting abwesenheit rows!", err) + return types, err + } + defer rows.Close() + for rows.Next() { + var absenceType AbsenceType + if err := rows.Scan(&absenceType.Id, &absenceType.Name); err != nil { + log.Println("Error scanning absence row!", err) + } + types[absenceType.Id] = absenceType + } + return types, nil +} + +func GetAbsenceTypesCached() map[int8]AbsenceType { + types, err := definedTypes.Get("s_abwesenheit_typen") + if err != nil { + return map[int8]AbsenceType{} + } + return types.(map[int8]AbsenceType) } diff --git a/Backend/models/booking.go b/Backend/models/booking.go index 24533c2..9265808 100644 --- a/Backend/models/booking.go +++ b/Backend/models/booking.go @@ -13,6 +13,11 @@ import ( type SameBookingError struct{} +type BookingType struct { + Id int8 + Name string +} + func (e SameBookingError) Error() string { return "the same booking already exists!" } @@ -261,3 +266,34 @@ func (b *Booking) UpdateTime(newTime time.Time) { func (b *Booking) ToString() string { return fmt.Sprintf("Booking %d: at: %s, as type: %d", b.CounterId, b.Timestamp.Format("15:04"), b.CheckInOut) } + +func GetBokkingTypes() ([]BookingType, error) { + var types []BookingType + qStr, err := DB.Prepare("SELECT anwesenheit_id, anwesenheit_name FROM s_anwesenheit_typen;") + if err != nil { + return types, err + } + defer qStr.Close() + rows, err := qStr.Query() + if err != nil { + log.Println("Error getting anwesenheit rows!", err) + return types, err + } + defer rows.Close() + for rows.Next() { + var bookingType BookingType + if err := rows.Scan(&bookingType.Id, &bookingType.Name); err != nil { + log.Println("Error scanning row!", err) + } + types = append(types, bookingType) + } + return types, nil +} + +func GetBookingTypesCached() []BookingType { + types, err := definedTypes.Get("s_anwesenheit_typen") + if err != nil { + return []BookingType{} + } + return types.([]BookingType) +} diff --git a/Backend/models/controlTables.go b/Backend/models/controlTables.go new file mode 100644 index 0000000..e943837 --- /dev/null +++ b/Backend/models/controlTables.go @@ -0,0 +1,15 @@ +package models + +import ( + "arbeitszeitmessung/helper" +) + +var definedTypes = helper.NewCache(3600, func(key string) (any, error) { + switch key { + case "s_abwesenheit_typen": + return GetAbsenceTypes() + case "s_anwesenheit_typen": + return GetBokkingTypes() + } + return nil, nil +}) diff --git a/Backend/models/user.go b/Backend/models/user.go index 7c45242..2f181a2 100644 --- a/Backend/models/user.go +++ b/Backend/models/user.go @@ -40,7 +40,7 @@ func (u *User) GetUserFromSession(Session *scs.SessionManager, ctx context.Conte } func (u *User) GetAll() ([]User, error) { - qStr, err := DB.Prepare((`SELECT card_uid, vorname, nachname FROM personal_daten;`)) + qStr, err := DB.Prepare((`SELECT card_uid, vorname, nachname FROM s_personal_daten;`)) var users []User if err != nil { fmt.Printf("Error preparing query statement %v\n", err) @@ -98,7 +98,7 @@ func (u *User) CheckOut() error { func (u *User) GetByPersonalNummer(personalNummer int) (User, error) { var user User - qStr, err := DB.Prepare((`SELECT personal_nummer, card_uid, vorname, nachname, arbeitszeit_per_tag FROM personal_daten WHERE personal_nummer = $1;`)) + qStr, err := DB.Prepare((`SELECT personal_nummer, card_uid, vorname, nachname, arbeitszeit_per_tag FROM s_personal_daten WHERE personal_nummer = $1;`)) if err != nil { return user, err } @@ -146,7 +146,7 @@ func (u *User) ChangePass(password, newPassword string) (bool, error) { func (u *User) GetTeamMembers() ([]User, error) { var teamMembers []User - qStr, err := DB.Prepare(`SELECT personal_nummer, card_uid, vorname, nachname, arbeitszeit_per_tag FROM personal_daten WHERE vorgesetzter_pers_nr = $1`) + qStr, err := DB.Prepare(`SELECT personal_nummer, card_uid, vorname, nachname, arbeitszeit_per_tag FROM s_personal_daten WHERE vorgesetzter_pers_nr = $1`) if err != nil { return teamMembers, err } @@ -234,7 +234,7 @@ func (u *User) GetFromCardUID(card_uid string) (User, error) { user := User{} var err error - qStr, err := DB.Prepare((`SELECT personal_nummer, card_uid, vorname, nachname, arbeitszeit_per_tag FROM personal_daten WHERE card_uid = $1;`)) + qStr, err := DB.Prepare((`SELECT personal_nummer, card_uid, vorname, nachname, arbeitszeit_per_tag FROM s_personal_daten WHERE card_uid = $1;`)) if err != nil { return user, err } diff --git a/Backend/models/workDay.go b/Backend/models/workDay.go index 6585742..13a0166 100644 --- a/Backend/models/workDay.go +++ b/Backend/models/workDay.go @@ -117,8 +117,8 @@ func (d *WorkDay) GetWorkDays(card_uid string, tsFrom, tsTo time.Time) []WorkDay } if absenceType.Valid { - workDay.Absence = NewAbsence(card_uid, int8(absenceType.Int16), workDay.Day) - log.Println("Found absence", workDay.Absence) + workDay.Absence, err = NewAbsence(card_uid, int(absenceType.Int16), workDay.Day) + // log.Println("Found absence", workDay.Absence) } if workDay.Day.Equal(time.Now().Truncate(24 * time.Hour)) { diff --git a/Backend/templates/timeComponents.templ b/Backend/templates/timeComponents.templ index 576ff9e..bdd7c10 100644 --- a/Backend/templates/timeComponents.templ +++ b/Backend/templates/timeComponents.templ @@ -68,7 +68,7 @@ templ dayComponent(workDay models.WorkDay) { @lineComponent()
if (workDay.Absence != models.Absence{}) { -

{ workDay.Absence.GetStringType() }

+

{ workDay.Absence.AbwesenheitTyp.Name }

} if len(workDay.Bookings) < 1 && (workDay.Absence == models.Absence{}) {

Keine Buchung gefunden. Bitte Arbeitsstunden oder Grund der Abwesenheit eingeben!

@@ -147,8 +147,8 @@ templ absenceComponent(d models.WorkDay) { diff --git a/Backend/templates/timeComponents_templ.go b/Backend/templates/timeComponents_templ.go index 75776c4..c560ce9 100644 --- a/Backend/templates/timeComponents_templ.go +++ b/Backend/templates/timeComponents_templ.go @@ -267,9 +267,9 @@ func dayComponent(workDay models.WorkDay) templ.Component { return templ_7745c5c3_Err } var templ_7745c5c3_Var13 string - templ_7745c5c3_Var13, templ_7745c5c3_Err = templ.JoinStringErrs(workDay.Absence.GetStringType()) + templ_7745c5c3_Var13, templ_7745c5c3_Err = templ.JoinStringErrs(workDay.Absence.AbwesenheitTyp.Name) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/timeComponents.templ`, Line: 71, Col: 41} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/timeComponents.templ`, Line: 71, Col: 45} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var13)) if templ_7745c5c3_Err != nil { @@ -554,15 +554,15 @@ func absenceComponent(d models.WorkDay) templ.Component { if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - for _, absence := range models.AbsenceTypes { + for _, absence := range models.GetAbsenceTypesCached() { templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 40, "