136 lines
3.7 KiB
Go
136 lines
3.7 KiB
Go
package endpoints
|
|
|
|
import (
|
|
"arbeitszeitmessung/helper"
|
|
"arbeitszeitmessung/models"
|
|
"arbeitszeitmessung/templates"
|
|
"context"
|
|
"errors"
|
|
"log"
|
|
"net/http"
|
|
"strconv"
|
|
"time"
|
|
)
|
|
|
|
func TeamHandler(w http.ResponseWriter, r *http.Request) {
|
|
helper.RequiresLogin(Session, w, r)
|
|
switch r.Method {
|
|
case http.MethodPost:
|
|
submitReport(w, r)
|
|
break
|
|
case http.MethodGet:
|
|
showWeeks(w, r)
|
|
break
|
|
default:
|
|
http.Error(w, "Method not allowed!", http.StatusMethodNotAllowed)
|
|
break
|
|
}
|
|
// user, err := (*models.User).GetUserFromSession(nil, 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
|
|
// }
|
|
// var userWorkDays []models.WorkDay
|
|
// userWorkDays = (*models.WorkDay).GetWorkDays(nil, user.CardUID, time.Date(2025, time.February, 24, 0, 0, 0, 0, time.Local), time.Date(2025, time.February, 24+7, 0, 0, 0, 0, time.Local))
|
|
// log.Println("User:", user)
|
|
// teamMembers, err := user.GetTeamMembers()
|
|
// getWeeksTillNow(time.Now().AddDate(0, 0, -14))
|
|
// templates.TeamPage(teamMembers, userWorkDays).Render(r.Context(), w)
|
|
}
|
|
|
|
func submitReport(w http.ResponseWriter, r *http.Request) {
|
|
err := r.ParseForm()
|
|
if err != nil {
|
|
log.Println("Error parsing form", err)
|
|
return
|
|
}
|
|
userPN, _ := strconv.Atoi(r.FormValue("user"))
|
|
_weekTs := r.FormValue("week")
|
|
weekTs, err := time.Parse(time.DateOnly, _weekTs)
|
|
user, err := (*models.User).GetByPersonalNummer(nil, userPN)
|
|
workWeek := (*models.WorkWeek).GetWeek(nil, user, weekTs, false)
|
|
|
|
if err != nil {
|
|
log.Println("Could not get user!")
|
|
return
|
|
}
|
|
|
|
switch r.FormValue("method") {
|
|
case "send":
|
|
err = workWeek.Send()
|
|
break
|
|
case "accept":
|
|
err = workWeek.Accept()
|
|
break
|
|
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.User).GetUserFromSession(nil, 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
|
|
}
|
|
submissionDate := r.URL.Query().Get("submission_date")
|
|
lastSub := user.GetLastSubmission()
|
|
if submissionDate != "" {
|
|
submissionDate, err := time.Parse("2006-01-02", submissionDate)
|
|
if err == nil {
|
|
lastSub = getMonday(submissionDate)
|
|
}
|
|
}
|
|
userWeek := (*models.WorkWeek).GetWeek(nil, 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.TeamPage(workWeeks, userWeek).Render(r.Context(), w)
|
|
}
|
|
|
|
func getWeeksTillNow(lastWeek time.Time) []time.Time {
|
|
var weeks []time.Time
|
|
if lastWeek.After(time.Now()) {
|
|
log.Println("Timestamp is after today, no weeks till now!")
|
|
return weeks
|
|
}
|
|
if lastWeek.Weekday() != time.Monday {
|
|
if lastWeek.Weekday() == time.Sunday {
|
|
lastWeek = lastWeek.AddDate(0, 0, -6)
|
|
} else {
|
|
lastWeek = lastWeek.AddDate(0, 0, -int(lastWeek.Weekday()-1))
|
|
}
|
|
}
|
|
if time.Since(lastWeek) < 24*5*time.Hour {
|
|
log.Println("Timestamp in running week, cannot split!")
|
|
}
|
|
|
|
for t := lastWeek; t.Before(time.Now()); t = t.Add(7 * 24 * time.Hour) {
|
|
weeks = append(weeks, t)
|
|
}
|
|
log.Println(weeks)
|
|
return weeks
|
|
}
|
|
|
|
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
|
|
}
|