95 lines
3.0 KiB
Go
95 lines
3.0 KiB
Go
package endpoints
|
|
|
|
import (
|
|
"arbeitszeitmessung/helper"
|
|
"arbeitszeitmessung/models"
|
|
"arbeitszeitmessung/templates"
|
|
"log"
|
|
"net/http"
|
|
"time"
|
|
)
|
|
|
|
type typstMetadata struct {
|
|
ISOWeek string `json:"iso-week"`
|
|
EmployeeName string `json:"employee-name"`
|
|
WorkTime string `json:"worktime"`
|
|
Overtime string `json:"overtime"`
|
|
OvertimeTotal string `json:"overtime-total"`
|
|
}
|
|
|
|
type typstDayPart struct {
|
|
BookingFrom string `json:"booking-from"`
|
|
BookingTo string `json:"booking-to"`
|
|
WorkType string `json:"worktype"`
|
|
IsWorkDay bool `json:"is-workday"`
|
|
}
|
|
|
|
type typstDay struct {
|
|
Date string `json:"date"`
|
|
DayParts []typstDayPart `json:"day-parts"`
|
|
Worktime string `json:"worktime"`
|
|
Pausetime string `json:"pausetime"`
|
|
Overtime string `json:"overtime"`
|
|
}
|
|
|
|
func ConvertDaysToTypst(days []models.IWorkDay, u models.User) ([]typstDay, error) {
|
|
var typstDays []typstDay
|
|
for _, day := range days {
|
|
var typstDay typstDay
|
|
var typstDayParts []typstDayPart
|
|
work, pause, overtime := day.GetAllWorkTimesVirtual(u)
|
|
typstDay.Date = day.Date().Format("01.02.2006")
|
|
typstDay.Worktime = helper.FormatDuration(work)
|
|
typstDay.Pausetime = helper.FormatDuration(pause)
|
|
typstDay.Overtime = helper.FormatDuration(overtime)
|
|
if day.IsWorkDay() {
|
|
workDay, _ := day.(*models.WorkDay)
|
|
for i := 0; i < len(workDay.Bookings); i += 2 {
|
|
var typstDayPart typstDayPart
|
|
typstDayPart.BookingFrom = workDay.Bookings[i].Timestamp.Format("15:04")
|
|
typstDayPart.BookingTo = workDay.Bookings[i+1].Timestamp.Format("15:04")
|
|
typstDayPart.WorkType = workDay.Bookings[i].BookingType.Name
|
|
typstDayPart.IsWorkDay = true
|
|
typstDayParts = append(typstDayParts, typstDayPart)
|
|
}
|
|
} else {
|
|
absentDay, _ := day.(*models.Absence)
|
|
typstDayParts = append(typstDayParts, typstDayPart{IsWorkDay: false, WorkType: absentDay.AbwesenheitTyp.Name})
|
|
}
|
|
typstDay.DayParts = typstDayParts
|
|
typstDays = append(typstDays, typstDay)
|
|
}
|
|
return typstDays, nil
|
|
}
|
|
|
|
func PDFHandler(w http.ResponseWriter, r *http.Request) {
|
|
helper.RequiresLogin(Session, w, r)
|
|
startDate, err := parseTimestamp(r, "start_date", time.Now().Format("2006-01-02"))
|
|
if err != nil {
|
|
log.Println("Error parsing 'start_date' time", err)
|
|
http.Error(w, "Timestamp 'start_date' cannot be parsed!", http.StatusBadRequest)
|
|
return
|
|
}
|
|
if startDate.Day() > 1 {
|
|
startDate = startDate.AddDate(0, 0, -(startDate.Day() - 1))
|
|
}
|
|
endDate := startDate.AddDate(0, 1, -1)
|
|
|
|
user, err := models.GetUserFromSession(Session, r.Context())
|
|
if err != nil {
|
|
log.Println("Error getting user!")
|
|
}
|
|
|
|
//TODO: only accepted weeks
|
|
|
|
weeks := models.GetDays(user, startDate, endDate, false)
|
|
var aggregatedOvertime, aggregatedWorkTime time.Duration
|
|
for _, day := range weeks {
|
|
aggregatedOvertime += day.TimeOvertimeReal(user)
|
|
aggregatedWorkTime += day.TimeWorkVirtual(user)
|
|
}
|
|
|
|
// log.Printf("Using Dates: %s - %s\n", startDate.String(), endDate.String())
|
|
templates.PDFReportEmploye(user, aggregatedOvertime, aggregatedWorkTime, weeks, startDate, endDate).Render(r.Context(), w)
|
|
}
|