CHANGE: added report section

This commit is contained in:
2025-02-26 15:05:50 +01:00
parent 0ddca8b9ce
commit 54104d5a0e
15 changed files with 376 additions and 96 deletions

View File

@@ -116,11 +116,11 @@ func (b *Booking) GetBookingsByCardID(card_uid string, tsFrom time.Time, tsTo ti
return bookings, nil
}
func (b *Booking) GetBookingsGrouped(card_uid string, tsFrom time.Time, tsTo time.Time) ([]WorkDay, error){
func (b *Booking) GetBookingsGrouped(card_uid string, tsFrom time.Time, tsTo time.Time) ([]WorkDay, error) {
var grouped = make(map[string][]Booking)
bookings, err := b.GetBookingsByCardID(card_uid, tsFrom, tsTo)
if (err != nil){
log.Println("Failed to get bookings",err)
if err != nil {
log.Println("Failed to get bookings", err)
return []WorkDay{}, nil
}
for _, booking := range bookings {
@@ -161,14 +161,14 @@ func (b Booking) Save() {
}
func (b *Booking) GetBookingType() string {
switch b.CheckInOut{
case 1,3: //manuelle Änderung
switch b.CheckInOut {
case 1, 3: //manuelle Änderung
return "kommen"
case 2, 4: //manuelle Änderung
case 2, 4: //manuelle Änderung
return "gehen"
case 255:
case 255:
return "abgemeldet"
default:
default:
return "Buchungs Typ unbekannt"
}
}
@@ -183,7 +183,7 @@ func (b *Booking) Update(nb Booking) {
if b.GeraetID != nb.GeraetID && nb.GeraetID != 0 {
b.GeraetID = nb.GeraetID
}
if(b.Timestamp != nb.Timestamp){
if b.Timestamp != nb.Timestamp {
b.Timestamp = nb.Timestamp
}
}
@@ -209,19 +209,19 @@ func checkLastBooking(b Booking) bool {
return true
}
func (b *Booking) UpdateTime(newTime time.Time){
func (b *Booking) UpdateTime(newTime time.Time) {
hour, minute, _ := newTime.Clock()
if(hour == b.Timestamp.Hour() && minute == b.Timestamp.Minute()){
if hour == b.Timestamp.Hour() && minute == b.Timestamp.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)
if(b.CheckInOut < 3){
newBooking.Timestamp = time.Date(b.Timestamp.Year(), b.Timestamp.Month(), b.Timestamp.Day(), hour, minute, 0, 0, time.Local)
if b.CheckInOut < 3 {
newBooking.CheckInOut = b.CheckInOut + 2
}
if(b.CheckInOut == 255){
if b.CheckInOut == 255 {
newBooking.CheckInOut = 4
}
b.Update(newBooking)

View File

@@ -194,17 +194,38 @@ func parseUser(rows *sql.Rows) (User, error) {
return user, nil
}
// returns the start of the week, the last submission was made, submission == first booking or last send booking_report to team leader
func (u *User) GetLastSubmission() time.Time {
var lastSub time.Time
qStr, err := DB.Prepare("SELECT woche_start FROM buchung_wochen WHERE personal_nummer = $1 ORDER BY woche_start DESC LIMIT 1")
qStr, err := DB.Prepare(`
SELECT COALESCE(
(SELECT woche_start + INTERVAL '1 week' FROM wochen_report WHERE personal_nummer = $1 ORDER BY woche_start DESC LIMIT 1),
(SELECT timestamp FROM anwesenheit WHERE card_uid = $2 ORDER BY timestamp LIMIT 1)
) AS letzte_buchung;
`)
if err != nil {
log.Println("Error preparing statement!", err)
return lastSub
}
err = qStr.QueryRow(u.PersonalNummer).Scan(&lastSub)
err = qStr.QueryRow(u.PersonalNummer, u.CardUID).Scan(&lastSub)
if err != nil {
log.Println("Error executing query!", err)
return lastSub
}
log.Println("From DB: ", lastSub)
lastSub = getMonday(lastSub)
lastSub = lastSub.Round(24 * time.Hour)
log.Println("After truncate: ", lastSub)
return lastSub
}
func getMonday(ts time.Time) time.Time {
if ts.Weekday() != time.Monday {
if ts.Weekday() == time.Sunday {
ts = ts.AddDate(0, 0, -6)
} else {
ts = ts.AddDate(0, 0, -int(ts.Weekday()-1))
}
}
return ts
}

View File

@@ -1,27 +1,45 @@
package models
import (
"errors"
"log"
"time"
)
type WorkWeek struct {
Id int
WorkDays []WorkDay
User User
WeekStart time.Time
WorkHours time.Duration
}
func (w *WorkWeek) GetWeek(user User, tsMonday time.Time) WorkWeek {
func (w *WorkWeek) GetWeek(user User, tsMonday time.Time, populateDays bool) WorkWeek {
var week WorkWeek
week.WorkDays = (*WorkDay).GetWorkDays(nil, user.CardUID, tsMonday, tsMonday.Add(7*24*time.Hour))
if populateDays {
week.WorkDays = (*WorkDay).GetWorkDays(nil, user.CardUID, tsMonday, tsMonday.Add(7*24*time.Hour))
week.WorkHours = aggregateWorkTime(week.WorkDays)
}
week.User = user
week.WeekStart = tsMonday
return week
}
func (w *WorkWeek) GetWorkHourString() string {
return formatDuration(w.WorkHours)
}
func aggregateWorkTime(days []WorkDay) time.Duration {
var workTime time.Duration
for _, day := range days {
workTime += day.workTime
}
return workTime
}
func (w *WorkWeek) GetSendWeeks(user User) []WorkWeek {
var weeks []WorkWeek
qStr, err := DB.Prepare(`SELECT woche_start::DATE FROM buchung_wochen WHERE bestaetigt = FALSE AND personal_nummer = $1;`)
qStr, err := DB.Prepare(`SELECT id, woche_start::DATE FROM wochen_report WHERE bestaetigt = FALSE AND personal_nummer = $1;`)
if err != nil {
log.Println("Error preparing SQL statement", err)
return weeks
@@ -37,11 +55,12 @@ func (w *WorkWeek) GetSendWeeks(user User) []WorkWeek {
for rows.Next() {
var week WorkWeek
week.User = user
if err := rows.Scan(&week.WeekStart); err != nil {
if err := rows.Scan(&week.Id, &week.WeekStart); err != nil {
log.Println("Error scanning row!", err)
return weeks
}
week.WorkDays = (*WorkDay).GetWorkDays(nil, user.CardUID, week.WeekStart, week.WeekStart.Add(7*24*time.Hour))
week.WorkHours = aggregateWorkTime(week.WorkDays)
weeks = append(weeks, week)
}
if err = rows.Err(); err != nil {
@@ -50,3 +69,39 @@ func (w *WorkWeek) GetSendWeeks(user User) []WorkWeek {
return weeks
}
var ErrRunningWeek = errors.New("Week is in running week")
// creates a new entry in the woche_report table with the given workweek
func (w *WorkWeek) Send() error {
if time.Since(w.WeekStart) < 5*24*time.Hour {
log.Println("Cannot send week, because it's the running week!")
return ErrRunningWeek
}
qStr, err := DB.Prepare(`INSERT INTO wochen_report (personal_nummer, woche_start) VALUES ($1, $2);`)
if err != nil {
log.Println("Error preparing SQL statement", err)
return err
}
_, err = qStr.Exec(w.User.PersonalNummer, w.WeekStart)
if err != nil {
log.Println("Error executing query!", err)
return err
}
return nil
}
func (w *WorkWeek) Accept() error {
qStr, err := DB.Prepare(`UPDATE "wochen_report" SET bestaetigt = TRUE WHERE personal_nummer = $1 AND woche_start = $2;`)
if err != nil {
log.Println("Error preparing SQL statement", err)
return err
}
_, err = qStr.Exec(w.User.PersonalNummer, w.WeekStart)
if err != nil {
log.Println("Error executing query!", err)
return err
}
return nil
}