From df3779d2649216648e6e249ff40e1fdcc23c8ade Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=20Tr=C3=B6ger?= Date: Mon, 19 May 2025 21:42:30 +0200 Subject: [PATCH] added absence - abwesenheit, closes #11 --- Backend/endpoints/time.go | 37 ++- Backend/models/absence.go | 52 +++- Backend/models/workDay.go | 42 ++- Backend/models/workWeek.go | 14 +- Backend/templates/pages.templ | 6 +- Backend/templates/pages_templ.go | 6 +- Backend/templates/timeComponents.templ | 16 +- Backend/templates/timeComponents_templ.go | 305 +++++++++++++--------- DB/initdb/01_create_tables.sql | 4 +- DB/initdb/02_create_user.sh | 2 +- 10 files changed, 311 insertions(+), 173 deletions(-) diff --git a/Backend/endpoints/time.go b/Backend/endpoints/time.go index 09844b6..36abc91 100644 --- a/Backend/endpoints/time.go +++ b/Backend/endpoints/time.go @@ -94,16 +94,14 @@ func updateBooking(w http.ResponseWriter, r *http.Request) { log.Println("Error loading location", err) loc = time.Local } + user, err := (*models.User).GetUserFromSession(nil, Session, r.Context()) + if err != nil { + log.Println("No user found!", err) + return + } switch r.FormValue("action") { case "add": - log.Println("Adding Booking") - user, err := (*models.User).GetUserFromSession(nil, Session, r.Context()) - if err != nil { - log.Println("No user found!", err) - } - timestamp, err := time.ParseInLocation("2006-01-02|15:04", r.FormValue("date")+"|"+r.FormValue("timestamp"), loc) - log.Println(timestamp) if err != nil { log.Println("Error parsing timestamp", err) return @@ -124,17 +122,14 @@ func updateBooking(w http.ResponseWriter, r *http.Request) { } break case "change": - log.Println("Changing Booking") - absence, err := strconv.Atoi(r.FormValue("absence")) + absenceType, err := strconv.Atoi(r.FormValue("absence")) if err != nil { log.Println("Error parsing absence type.", err) - absence = 0 + absenceType = 0 } - if absence != 0 { - log.Println("New absence", absence) - log.Println("At date", r.FormValue("date")) + if absenceType != 0 { + createAbsence(absenceType, user, loc, r) } - for index, possibleBooking := range r.PostForm { if len(index) > 7 && index[:7] == "booking" { booking_id, err := strconv.Atoi(index[8:]) @@ -162,6 +157,20 @@ func updateBooking(w http.ResponseWriter, r *http.Request) { getBookings(w, r) } +func createAbsence(absenceType int, user models.User, loc *time.Location, r *http.Request) { + absenceDate, err := time.ParseInLocation("2006-01-02", r.FormValue("date"), loc) + if err != nil { + log.Println("Cannot get date from input! Skipping absence creation", err) + return + } + absence := models.NewAbsence(user.CardUID, int8(absenceType), absenceDate) + err = absence.Insert() + if err != nil { + log.Println("Error inserting absence!", err) + return + } +} + func getBookingsAPI(w http.ResponseWriter, r *http.Request) { _user_pn := r.URL.Query().Get("personal_nummer") user_pn, err := strconv.Atoi(_user_pn) diff --git a/Backend/models/absence.go b/Backend/models/absence.go index 0692c83..2f352c6 100644 --- a/Backend/models/absence.go +++ b/Backend/models/absence.go @@ -1,6 +1,38 @@ package models -import "time" +import ( + "log" + "time" +) + +type AbsenceType struct { + Value int8 + Label string +} + +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 AbsenceTypesLabel = map[int8]string{ + 0: "None", + AbsenceUrlaub: "Urlaub", + AbsenceKurzarbeit: "Kurzarbeit", + AbsenceKrank: "Krank", + AbsenceKindkrank: "Kindkrank", +} type Absence struct { CounterId int @@ -17,6 +49,20 @@ func NewAbsence(card_uid string, abwesenheit_typ int8, datum time.Time) Absence } } -func (a *Absence) Insert() { - // qStr, err := DB.Prepare(`INSERT INTO`) +func (a *Absence) Insert() error { + qStr, err := DB.Prepare(`INSERT INTO abwesenheit (card_uid, abwesenheit_typ, datum) VALUES ($1, $2, $3) RETURNING counter_id;`) + if err != nil { + log.Println("Error preparing sql Statement", err) + return err + } + err = qStr.QueryRow(a.CardUID, a.AbwesenheitTyp, a.Datum).Scan(&a.CounterId) + if err != nil { + log.Println("Error executing insert statement", err) + return err + } + return nil +} + +func (a *Absence) GetStringType() string { + return AbsenceTypesLabel[a.AbwesenheitTyp] } diff --git a/Backend/models/workDay.go b/Backend/models/workDay.go index 1e2a813..23aaa39 100644 --- a/Backend/models/workDay.go +++ b/Backend/models/workDay.go @@ -2,6 +2,7 @@ package models import ( "arbeitszeitmessung/helper" + "database/sql" "encoding/json" "fmt" "log" @@ -16,6 +17,7 @@ type WorkDay struct { pauseTime time.Duration TimeFrom time.Time TimeTo time.Time + Absence Absence } func (d *WorkDay) GetWorkDays(card_uid string, tsFrom, tsTo time.Time) []WorkDay { @@ -23,8 +25,8 @@ func (d *WorkDay) GetWorkDays(card_uid string, tsFrom, tsTo time.Time) []WorkDay var workSec, pauseSec float64 qStr, err := DB.Prepare(` - WITH all_days AS ( - SELECT generate_series($2::DATE, $3::DATE - INTERVAL '1 day', INTERVAL '1 day')::DATE AS work_date + WITH all_days AS ( + SELECT generate_series($2, $3, INTERVAL '1 day')::DATE AS work_date ), ordered_bookings AS ( SELECT @@ -38,6 +40,15 @@ func (d *WorkDay) GetWorkDays(card_uid string, tsFrom, tsTo time.Time) []WorkDay WHERE card_uid = $1 AND timestamp::DATE >= $2 AND timestamp::DATE <= $3 + ), + abwesenheiten AS ( + SELECT + datum::DATE AS work_date, + abwesenheit_typ + FROM abwesenheit + WHERE card_uid = $1 + AND datum::DATE >= $2 + AND datum::DATE <= $3 ) SELECT d.work_date, @@ -46,7 +57,7 @@ func (d *WorkDay) GetWorkDays(card_uid string, tsFrom, tsTo time.Time) []WorkDay COALESCE( EXTRACT(EPOCH FROM SUM( CASE - WHEN b.prev_check IN (1, 3) AND b.check_in_out IN (2, 4, 254) + WHEN b.prev_check IN (1, 3) AND b.check_in_out IN (2, 4, 255) THEN b.timestamp - b.prev_timestamp ELSE INTERVAL '0' END @@ -55,7 +66,7 @@ func (d *WorkDay) GetWorkDays(card_uid string, tsFrom, tsTo time.Time) []WorkDay COALESCE( EXTRACT(EPOCH FROM SUM( CASE - WHEN b.prev_check IN (2, 4, 254) AND b.check_in_out IN (1, 3) + WHEN b.prev_check IN (2, 4, 255) AND b.check_in_out IN (1, 3) THEN b.timestamp - b.prev_timestamp ELSE INTERVAL '0' END @@ -65,10 +76,12 @@ func (d *WorkDay) GetWorkDays(card_uid string, tsFrom, tsTo time.Time) []WorkDay 'check_in_out', b.check_in_out, 'timestamp', b.timestamp, 'counter_id', b.counter_id - ) ORDER BY b.timestamp), '[]'::jsonb) AS bookings + ) ORDER BY b.timestamp), '[]'::jsonb) AS bookings, + a.abwesenheit_typ FROM all_days d LEFT JOIN ordered_bookings b ON d.work_date = b.work_date - GROUP BY d.work_date + LEFT JOIN abwesenheiten a ON d.work_date = a.work_date + GROUP BY d.work_date, a.abwesenheit_typ ORDER BY d.work_date;`) if err != nil { @@ -87,7 +100,8 @@ func (d *WorkDay) GetWorkDays(card_uid string, tsFrom, tsTo time.Time) []WorkDay for rows.Next() { var workDay WorkDay var bookings []byte - if err := rows.Scan(&workDay.Day, &workDay.TimeFrom, &workDay.TimeTo, &workSec, &pauseSec, &bookings); err != nil { + var absenceType sql.NullInt16 + if err := rows.Scan(&workDay.Day, &workDay.TimeFrom, &workDay.TimeTo, &workSec, &pauseSec, &bookings, &absenceType); err != nil { log.Println("Error scanning row!", err) return workDays } @@ -98,6 +112,15 @@ func (d *WorkDay) GetWorkDays(card_uid string, tsFrom, tsTo time.Time) []WorkDay log.Println("Error parsing bookings JSON!", err) return nil } + // better empty day handling + if len(workDay.Bookings) == 1 && workDay.Bookings[0].CounterId == 0 { + workDay.Bookings = []Booking{} + } + + if absenceType.Valid { + workDay.Absence = NewAbsence(card_uid, int8(absenceType.Int16), workDay.Day) + log.Println("Found absence", workDay.Absence) + } if workDay.Day.Equal(time.Now().Truncate(24 * time.Hour)) { workDay.getWorkTime() @@ -179,7 +202,10 @@ func (d *WorkDay) GetWorkTimeString() (string, string) { // returns bool wheter the workday was ended with an automatic logout func (d *WorkDay) RequiresAction() bool { - return d.Bookings[len(d.Bookings)-1].CheckInOut == 254 + if len(d.Bookings) > 0 { + return d.Bookings[len(d.Bookings)-1].CheckInOut == 254 + } + return false } // returns a integer percentage of how much day has been worked of diff --git a/Backend/models/workWeek.go b/Backend/models/workWeek.go index 9cb5f89..1ce0a30 100644 --- a/Backend/models/workWeek.go +++ b/Backend/models/workWeek.go @@ -18,9 +18,9 @@ type WorkWeek struct { type WeekStatus int8 const ( - None WeekStatus = iota - Sent - Accepted + WeekStatusNone WeekStatus = iota + WeekStatusSent + WeekStatusAccepted ) func (w *WorkWeek) GetWeek(user User, tsMonday time.Time, populateDays bool) WorkWeek { @@ -35,7 +35,7 @@ func (w *WorkWeek) GetWeek(user User, tsMonday time.Time, populateDays bool) Wor } func (w *WorkWeek) CheckStatus() WeekStatus { - weekStatus := None + weekStatus := WeekStatusNone qStr, err := DB.Prepare(`SELECT bestaetigt FROM wochen_report WHERE woche_start = $1::DATE AND personal_nummer = $2;`) if err != nil { log.Println("Error preparing SQL statement", err) @@ -52,9 +52,9 @@ func (w *WorkWeek) CheckStatus() WeekStatus { return weekStatus } if beastatigt { - weekStatus = Accepted + weekStatus = WeekStatusAccepted } else { - weekStatus = Sent + weekStatus = WeekStatusSent } return weekStatus } @@ -114,7 +114,7 @@ func (w *WorkWeek) Send() error { log.Println("Cannot send week, because it's the running week!") return ErrRunningWeek } - if w.CheckStatus() != None { + if w.CheckStatus() != WeekStatusNone { qStr, err = DB.Prepare(`UPDATE "wochen_report" SET bestaetigt = FALSE WHERE personal_nummer = $1 AND woche_start = $2;`) if err != nil { log.Println("Error preparing SQL statement", err) diff --git a/Backend/templates/pages.templ b/Backend/templates/pages.templ index 2940737..73d9785 100644 --- a/Backend/templates/pages.templ +++ b/Backend/templates/pages.templ @@ -114,13 +114,13 @@ templ TeamPage(weeks []models.WorkWeek, userWeek models.WorkWeek) { switch userWeek.CheckStatus() { - case models.None: + case models.WeekStatusNone:

an Vorgesetzten senden

if time.Since(userWeek.WeekStart) < 24*7*time.Hour {

Die Woche kann erst am nächsten Montag abgesendet werden!

} - case models.Sent: + case models.WeekStatusSent:

an Vorgesetzten gesendet

@@ -129,7 +129,7 @@ templ TeamPage(weeks []models.WorkWeek, userWeek models.WorkWeek) {

- case models.Accepted: + case models.WeekStatusAccepted:

vom Vorgesetzten bestätigt

diff --git a/Backend/templates/pages_templ.go b/Backend/templates/pages_templ.go index c6d6e39..c649f96 100644 --- a/Backend/templates/pages_templ.go +++ b/Backend/templates/pages_templ.go @@ -355,7 +355,7 @@ func TeamPage(weeks []models.WorkWeek, userWeek models.WorkWeek) templ.Component return templ_7745c5c3_Err } switch userWeek.CheckStatus() { - case models.None: + case models.WeekStatusNone: templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 25, "

an Vorgesetzten senden

an Vorgesetzten gesendet

akzeptiert:

") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - case models.Accepted: + case models.WeekStatusAccepted: templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 30, "

vom Vorgesetzten bestätigt

akzeptiert:

") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err diff --git a/Backend/templates/timeComponents.templ b/Backend/templates/timeComponents.templ index d9689e8..c8ce0c5 100644 --- a/Backend/templates/timeComponents.templ +++ b/Backend/templates/timeComponents.templ @@ -63,7 +63,10 @@ templ dayComponent(workDay models.WorkDay) {
@lineComponent()
- if len(workDay.Bookings) <= 1 && workDay.Bookings[len(workDay.Bookings)-1].CounterId == 0 { + if (workDay.Absence != models.Absence{}) { +

{ workDay.Absence.GetStringType() }

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

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

@absenceComponent(workDay) @newBookingComponent(workDay) @@ -140,10 +143,9 @@ templ absenceComponent(d models.WorkDay) { } @@ -160,8 +162,8 @@ templ newBookingComponent(d models.WorkDay) {
} diff --git a/Backend/templates/timeComponents_templ.go b/Backend/templates/timeComponents_templ.go index 878cd56..2d5a0c3 100644 --- a/Backend/templates/timeComponents_templ.go +++ b/Backend/templates/timeComponents_templ.go @@ -245,8 +245,27 @@ func dayComponent(workDay models.WorkDay) templ.Component { if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - if len(workDay.Bookings) <= 1 && workDay.Bookings[len(workDay.Bookings)-1].CounterId == 0 { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 20, "

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

") + if (workDay.Absence != models.Absence{}) { + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 20, "

") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var12 string + templ_7745c5c3_Var12, templ_7745c5c3_Err = templ.JoinStringErrs(workDay.Absence.GetStringType()) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/timeComponents.templ`, Line: 67, Col: 41} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var12)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 21, "

") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + } + if len(workDay.Bookings) <= 1 && (workDay.Absence == models.Absence{}) { + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 22, "

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

") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -254,7 +273,7 @@ func dayComponent(workDay models.WorkDay) templ.Component { if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 21, " ") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 23, " ") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -273,7 +292,7 @@ func dayComponent(workDay models.WorkDay) templ.Component { return templ_7745c5c3_Err } } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 22, " ") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 24, " ") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -282,7 +301,7 @@ func dayComponent(workDay models.WorkDay) templ.Component { return templ_7745c5c3_Err } } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 23, "
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 25, "
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -290,7 +309,7 @@ func dayComponent(workDay models.WorkDay) templ.Component { if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 24, "
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 26, "") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -314,25 +333,25 @@ func changeButtonComponent(id string) templ.Component { }() } ctx = templ.InitializeContext(ctx) - templ_7745c5c3_Var12 := templ.GetChildren(ctx) - if templ_7745c5c3_Var12 == nil { - templ_7745c5c3_Var12 = templ.NopComponent + templ_7745c5c3_Var13 := templ.GetChildren(ctx) + if templ_7745c5c3_Var13 == nil { + templ_7745c5c3_Var13 = templ.NopComponent } ctx = templ.ClearChildren(ctx) templ_7745c5c3_Err = templ.RenderScriptItems(ctx, templ_7745c5c3_Buffer, templ.JSFuncCall("editDay", templ.JSExpression("this"), templ.JSExpression("event"), id)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 25, "") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 28, "\">

Ändern

Absenden

") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -356,9 +375,9 @@ func timeGaugeComponent(progress uint8, today bool, warning bool) templ.Componen }() } ctx = templ.InitializeContext(ctx) - templ_7745c5c3_Var14 := templ.GetChildren(ctx) - if templ_7745c5c3_Var14 == nil { - templ_7745c5c3_Var14 = templ.NopComponent + templ_7745c5c3_Var15 := templ.GetChildren(ctx) + if templ_7745c5c3_Var15 == nil { + templ_7745c5c3_Var15 = templ.NopComponent } ctx = templ.ClearChildren(ctx) @@ -381,65 +400,65 @@ func timeGaugeComponent(progress uint8, today bool, warning bool) templ.Componen break } if today { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 27, "
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 29, "
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - var templ_7745c5c3_Var15 = []any{"flex w-full items-center justify-center overflow-hidden rounded-full", bgColor} - templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var15...) + var templ_7745c5c3_Var16 = []any{"flex w-full items-center justify-center overflow-hidden rounded-full", bgColor} + templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var16...) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 28, "
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 31, "\" style=\"") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var18 string + templ_7745c5c3_Var18, templ_7745c5c3_Err = templruntime.SanitizeStyleAttributeValues(fmt.Sprintf("height: %d%%", int(progress))) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/timeComponents.templ`, Line: 123, Col: 149} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var18)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 32, "\">
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } } else { - var templ_7745c5c3_Var18 = []any{"w-2 h-full bg-accent rounded-md", bgColor} - templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var18...) + var templ_7745c5c3_Var19 = []any{"w-2 h-full bg-accent rounded-md", bgColor} + templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var19...) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 31, "
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 34, "\">") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -464,12 +483,12 @@ func lineComponent() templ.Component { }() } ctx = templ.InitializeContext(ctx) - templ_7745c5c3_Var20 := templ.GetChildren(ctx) - if templ_7745c5c3_Var20 == nil { - templ_7745c5c3_Var20 = templ.NopComponent + templ_7745c5c3_Var21 := templ.GetChildren(ctx) + if templ_7745c5c3_Var21 == nil { + templ_7745c5c3_Var21 = templ.NopComponent } ctx = templ.ClearChildren(ctx) - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 33, "
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 35, "
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -493,12 +512,12 @@ func absenceComponent(d models.WorkDay) templ.Component { }() } ctx = templ.InitializeContext(ctx) - templ_7745c5c3_Var21 := templ.GetChildren(ctx) - if templ_7745c5c3_Var21 == nil { - templ_7745c5c3_Var21 = templ.NopComponent + templ_7745c5c3_Var22 := templ.GetChildren(ctx) + if templ_7745c5c3_Var22 == nil { + templ_7745c5c3_Var22 = templ.NopComponent } ctx = templ.ClearChildren(ctx) - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 34, "") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -539,58 +594,58 @@ func newBookingComponent(d models.WorkDay) templ.Component { }() } ctx = templ.InitializeContext(ctx) - templ_7745c5c3_Var23 := templ.GetChildren(ctx) - if templ_7745c5c3_Var23 == nil { - templ_7745c5c3_Var23 = templ.NopComponent + templ_7745c5c3_Var26 := templ.GetChildren(ctx) + if templ_7745c5c3_Var26 == nil { + templ_7745c5c3_Var26 = templ.NopComponent } ctx = templ.ClearChildren(ctx) - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 37, "") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 49, ">Gehen") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -614,64 +669,64 @@ func bookingComponent(booking models.Booking) templ.Component { }() } ctx = templ.InitializeContext(ctx) - templ_7745c5c3_Var26 := templ.GetChildren(ctx) - if templ_7745c5c3_Var26 == nil { - templ_7745c5c3_Var26 = templ.NopComponent + templ_7745c5c3_Var29 := templ.GetChildren(ctx) + if templ_7745c5c3_Var29 == nil { + templ_7745c5c3_Var29 = templ.NopComponent } ctx = templ.ClearChildren(ctx) - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 44, "

") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - var templ_7745c5c3_Var27 string - templ_7745c5c3_Var27, templ_7745c5c3_Err = templ.JoinStringErrs(booking.Timestamp.Format("15:04")) - if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/timeComponents.templ`, Line: 172, Col: 97} - } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var27)) - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 45, " ") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 50, "

") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } var templ_7745c5c3_Var30 string - templ_7745c5c3_Var30, templ_7745c5c3_Err = templ.JoinStringErrs(booking.GetBookingType()) + templ_7745c5c3_Var30, templ_7745c5c3_Err = templ.JoinStringErrs(booking.Timestamp.Format("15:04")) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/timeComponents.templ`, Line: 174, Col: 29} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/timeComponents.templ`, Line: 174, Col: 97} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var30)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 48, "

") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 51, " ") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var33 string + templ_7745c5c3_Var33, templ_7745c5c3_Err = templ.JoinStringErrs(booking.GetBookingType()) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/timeComponents.templ`, Line: 176, Col: 29} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var33)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 54, "

") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -695,12 +750,12 @@ func LegendComponent() templ.Component { }() } ctx = templ.InitializeContext(ctx) - templ_7745c5c3_Var31 := templ.GetChildren(ctx) - if templ_7745c5c3_Var31 == nil { - templ_7745c5c3_Var31 = templ.NopComponent + templ_7745c5c3_Var34 := templ.GetChildren(ctx) + if templ_7745c5c3_Var34 == nil { + templ_7745c5c3_Var34 = templ.NopComponent } ctx = templ.ClearChildren(ctx) - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 49, "
Fehler
Arbeitszeit unter regulär
Arbeitszeit vollständig
Überstunden
Keine Buchungen
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 55, "
Fehler
Arbeitszeit unter regulär
Arbeitszeit vollständig
Überstunden
Keine Buchungen
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } diff --git a/DB/initdb/01_create_tables.sql b/DB/initdb/01_create_tables.sql index 82cb49a..4cac87c 100644 --- a/DB/initdb/01_create_tables.sql +++ b/DB/initdb/01_create_tables.sql @@ -70,8 +70,8 @@ CREATE TABLE "wochen_report" ( UNIQUE ("personal_nummer", "woche_start") ); -DROP TABLE IF EXISTS "abwesenheiten"; -CREATE TABLE "abwesenheiten" ( +DROP TABLE IF EXISTS "abwesenheit"; +CREATE TABLE "abwesenheit" ( "counter_id" bigserial PRIMARY KEY, "card_uid" varchar(255), "abwesenheit_typ" int2, diff --git a/DB/initdb/02_create_user.sh b/DB/initdb/02_create_user.sh index 4b942c1..160c76e 100644 --- a/DB/initdb/02_create_user.sh +++ b/DB/initdb/02_create_user.sh @@ -7,7 +7,7 @@ psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-E CREATE USER $POSTGRES_API_USER WITH ENCRYPTED PASSWORD '$POSTGRES_API_PASS'; GRANT CONNECT ON DATABASE $POSTGRES_DB TO $POSTGRES_API_USER; GRANT USAGE ON SCHEMA public TO $POSTGRES_API_USER; - GRANT SELECT, INSERT, UPDATE ON anwesenheit, personal_daten, user_password, wochen_report TO $POSTGRES_API_USER; + GRANT SELECT, INSERT, UPDATE ON anwesenheit, abwesenheit, personal_daten, user_password, wochen_report TO $POSTGRES_API_USER; GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO $POSTGRES_API_USER; EOSQL