From 1397530cb66c92409ac11f45d07499beb5cc52b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=20Tr=C3=B6ger?= Date: Wed, 3 Sep 2025 14:27:27 +0200 Subject: [PATCH] added absence hours --- Backend/models/absence.go | 73 ++++++++++++++++++++++++++++++++++----- 1 file changed, 65 insertions(+), 8 deletions(-) diff --git a/Backend/models/absence.go b/Backend/models/absence.go index bbc9cc7..48a604b 100644 --- a/Backend/models/absence.go +++ b/Backend/models/absence.go @@ -7,8 +7,9 @@ import ( ) type AbsenceType struct { - Id int8 - Name string + Id int8 + Name string + WorkTime float32 } type Absence struct { @@ -23,7 +24,7 @@ func NewAbsence(card_uid string, abwesenheit_typ int, datum time.Time) (Absence, if abwesenheit_typ < 0 { return Absence{ CardUID: card_uid, - AbwesenheitTyp: AbsenceType{0, "Custom absence"}, + AbwesenheitTyp: AbsenceType{0, "Custom absence", 100}, Datum: datum, }, nil } @@ -44,6 +45,7 @@ func (a *Absence) Insert() error { log.Println("Error preparing sql Statement", err) return err } + defer qStr.Close() err = qStr.QueryRow(a.CardUID, a.AbwesenheitTyp.Id, a.Datum).Scan(&a.CounterId) if err != nil { log.Println("Error executing insert statement", err) @@ -52,13 +54,53 @@ func (a *Absence) Insert() error { return nil } -// func (a *Absence) GetStringType() string { -// return AbsenceTypesLabel[a.AbwesenheitTyp] -// } +func GetAbsenceById(counterId int) (Absence, error) { + var absence Absence = Absence{CounterId: counterId} + qStr, err := DB.Prepare("SELECT card_uid, abwesenheit_typ, datum FROM abwesenheit WHERE counter_id = $1;") + if err != nil { + return absence, err + } + defer qStr.Close() + err = qStr.QueryRow(counterId).Scan(&absence.CardUID, &absence.AbwesenheitTyp.Id, &absence.Datum) + if err != nil { + return absence, err + } + return absence, nil +} + +func GetAbsenceByCardUID(card_uid string, tsFrom time.Time, tsTo time.Time) ([]Absence, error) { + var absences []Absence + qStr, err := DB.Prepare("SELECT counter_id, abwesenheit_typ, datum FROM abwesenheit WHERE card_uid = $1 AND datum BETWEEN $2::DATE AND $3::DATE ORDER BY datum;") + if err != nil { + return absences, err + } + defer qStr.Close() + rows, err := qStr.Query(card_uid, tsFrom, tsTo) + if err != nil { + return absences, err + } + defer rows.Close() + for rows.Next() { + var absence Absence + if err := rows.Scan(&absence.CounterId, &absence.AbwesenheitTyp.Id, &absence.Datum); err != nil { + return absences, err + } + absence.AbwesenheitTyp, err = GetAbsenceTypeById(absence.AbwesenheitTyp.Id) + if err == nil { + absences = append(absences, absence) + } else { + log.Println("Cannot populate absence type!", err) + } + } + if err = rows.Err(); err != nil { + return absences, err + } + return absences, nil +} 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;") + qStr, err := DB.Prepare("SELECT abwesenheit_id, abwesenheit_name, arbeitszeit_equivalent FROM s_abwesenheit_typen;") if err != nil { return types, err } @@ -71,7 +113,7 @@ func GetAbsenceTypes() (map[int8]AbsenceType, error) { defer rows.Close() for rows.Next() { var absenceType AbsenceType - if err := rows.Scan(&absenceType.Id, &absenceType.Name); err != nil { + if err := rows.Scan(&absenceType.Id, &absenceType.Name, &absenceType.WorkTime); err != nil { log.Println("Error scanning absence row!", err) } types[absenceType.Id] = absenceType @@ -86,3 +128,18 @@ func GetAbsenceTypesCached() map[int8]AbsenceType { } return types.(map[int8]AbsenceType) } + +func GetAbsenceTypeById(absenceTypeId int8) (AbsenceType, error) { + var absenceType AbsenceType = AbsenceType{Id: absenceTypeId} + + qStr, err := DB.Prepare("SELECT abwesenheit_name, arbeitszeit_equivalent FROM s_abwesenheit_typen WHERE abwesenheit_id = $1;") + if err != nil { + return absenceType, err + } + defer qStr.Close() + err = qStr.QueryRow(absenceTypeId).Scan(&absenceType.Name, &absenceType.WorkTime) + if err != nil { + return absenceType, err + } + return absenceType, nil +}