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
")
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, "")
+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 36, "
")
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
@@ -506,16 +525,52 @@ func absenceComponent(d models.WorkDay) templ.Component {
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 35, "
")
+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 38, "\" class=\"grow cursor-pointer rounded-md text-neutral-800 p-2 md:px-4 border text-center text-sm transition-colors border-neutral-900\" disabled>
")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ for _, absence := range models.AbsenceTypes {
+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 39, "
")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ }
+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 42, "
")
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, "Arbeitszeit unter regulär ")
+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 55, "Arbeitszeit unter regulär ")
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