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 }