Files
arbeitszeitmessung/Backend/endpoints/team-report.go
Tom Tröger 46218f9bca fix: weekbased calculation pdf report
with this change the time calculations for pdf reports should be better
line with the reports send as "week_report"
2026-02-15 18:16:57 +01:00

84 lines
2.2 KiB
Go

package endpoints
// this endpoint served at "/team/report" handles the report page
// and also the submission/change of reports
import (
"arbeitszeitmessung/helper"
"arbeitszeitmessung/helper/paramParser"
"arbeitszeitmessung/models"
"arbeitszeitmessung/templates"
"context"
"errors"
"log"
"net/http"
"time"
)
func ReportHandler(w http.ResponseWriter, r *http.Request) {
helper.RequiresLogin(Session, w, r)
switch r.Method {
case http.MethodPost:
submitReport(w, r)
case http.MethodGet:
showWeeks(w, r)
default:
http.Error(w, "Method not allowed!", http.StatusMethodNotAllowed)
}
}
func submitReport(w http.ResponseWriter, r *http.Request) {
err := r.ParseForm()
if err != nil {
log.Println("Error parsing form", err)
return
}
pp := paramParser.New(r.Form)
userPN, err := pp.ParseInt("user")
weekTs := pp.ParseTimestampFallback("week", time.DateOnly, time.Now())
user, err := models.GetUserByPersonalNr(userPN)
if err != nil {
log.Println("Could not get user!")
return
}
workWeek := models.NewWorkWeekSimple(user, weekTs, true)
switch r.FormValue("method") {
case "send":
err = workWeek.SendWeek()
case "accept":
err = workWeek.Accept()
default:
break
}
if errors.Is(err, models.ErrRunningWeek) {
showWeeks(w, r.WithContext(context.WithValue(r.Context(), "error", true)))
}
showWeeks(w, r)
}
func showWeeks(w http.ResponseWriter, r *http.Request) {
user, err := models.GetUserFromSession(Session, r.Context())
if err != nil {
log.Println("No user found with the given personal number!")
http.Redirect(w, r, "/user/login", http.StatusSeeOther)
return
}
pp := paramParser.New(r.URL.Query())
submissionDate := pp.ParseTimestampFallback("submission_date", time.DateOnly, user.GetLastWorkWeekSubmission())
lastSub := helper.GetMonday(submissionDate)
userWeek := models.NewWorkWeekSimple(user, lastSub, true)
var workWeeks []models.WorkWeek
teamMembers, err := user.GetTeamMembers()
for _, member := range teamMembers {
weeks := (*models.WorkWeek).GetSendWeeks(nil, member)
workWeeks = append(workWeeks, weeks...)
}
// isRunningWeek := time.Since(lastSub) < 24*5*time.Hour //the last submission is this week and cannot be send yet
templates.ReportPage(workWeeks, userWeek).Render(r.Context(), w)
}