fix: wrong kurzarbeit calculation fixed #80
Some checks failed
Tests / Run Go Tests (push) Failing after 1m5s

This commit is contained in:
2026-02-15 18:16:12 +01:00
parent 7e54800bc3
commit 23896e4f08
3 changed files with 24 additions and 45 deletions

View File

@@ -21,7 +21,7 @@ import (
const DE_DATE string = "02.01.2006"
const FILE_YEAR_MONTH string = "2006_01"
const PDF_DIRECTORY = "/home/tom/Code/arbeitszeitmessung/Backend/doc"
var PDF_DIRECTORY = helper.GetEnv("PDF_PATH", "/doc/") // TODO
func PDFCreateController(w http.ResponseWriter, r *http.Request) {
helper.RequiresLogin(Session, w, r)
@@ -99,9 +99,11 @@ func convertDaysToTypst(days []models.IWorkDay, u models.User, weekbase models.W
var thisTypstDay typstDay
workVirtual, pause, overtime := day.GetTimes(u, weekbase, true)
overtime = workVirtual - u.ArbeitszeitProWocheFrac(0.2)
if day.Type() != models.DayTypeHoliday {
overtime = workVirtual - u.ArbeitszeitProWocheFrac(0.2)
if day.Type() == models.DayTypeHoliday {
// workVirtual = 0
overtime = 0
}
thisTypstDay.Date = day.Date().Format(DE_DATE)
thisTypstDay.Worktime = helper.FormatDurationFill(workVirtual, true)
@@ -173,13 +175,13 @@ func createReports(employes []models.User, startDate time.Time) []typstData {
}
func createEmployeReport(employee models.User, startDate, endDate time.Time) (typstData, error) {
publicHolidays, _ := models.GetHolidaysFromTo(startDate, endDate)
targetHoursThisMonth := employee.ArbeitszeitProWocheFrac(.2) * time.Duration(helper.GetWorkingDays(startDate, endDate)-len(publicHolidays))
daysThisMonth := helper.GenerateDateRange(startDate, endDate)
mondaysThisMonth := helper.GetMondays(daysThisMonth, false)
// publicHolidays, _ := models.GetHolidaysFromTo(startDate, endDate)
targetHoursThisMonth := employee.ArbeitszeitProWocheFrac(.2) * time.Duration(helper.GetWorkingDays(startDate, endDate)) //-len(publicHolidays)
mondaysThisMonth := helper.GetMondays(helper.GenerateDateRange(startDate, endDate), false)
var weeks []models.WorkWeek
var workHours, kurzarbeitHours time.Duration
for _, monday := range mondaysThisMonth {
var week models.WorkWeek
if monday.After(startDate) {
@@ -188,9 +190,13 @@ func createEmployeReport(employee models.User, startDate, endDate time.Time) (ty
week = models.NewWorkWeek(employee, startDate, monday.Add(6*24*time.Hour), true)
}
workHours += week.WorktimeVirtual
kurzarbeitHours += week.WorktimeVirtual - week.Worktime
kurzarbeitHours += week.Kurzarbeit
weeks = append(weeks, week)
}
monthOvertime := workHours - targetHoursThisMonth
totalOvertime, err := employee.GetReportedOvertime(endDate)
var typstDays []typstDay
for _, week := range weeks {
weekTypstDays, err := convertDaysToTypst(week.Days, employee, week.WeekBase)
@@ -201,37 +207,6 @@ func createEmployeReport(employee models.User, startDate, endDate time.Time) (ty
typstDays = append(typstDays, weekTypstDays...)
}
slog.Info("Weeks for the month", "week len", len(weeks), "week", weeks)
// workDaysThisMonth := models.GetDays(employee, startDate, endDate.AddDate(0, 0, 1), false)
// var weekbase models.WorktimeBase
// if lenWorkDays(workDaysThisMonth) == helper.GetWorkingDays(startDate, endDate) {
// weekbase = models.WorktimeBaseWeek
// } else {
// weekbase = models.WorktimeBaseDay
// }
// slog.Debug("Baseline Working hours", "targetHours", targetHoursThisMonth.Hours(), "days", helper.GetWorkingDays(startDate, endDate), "workdays", lenWorkDays(workDaysThisMonth))
// var workHours, kurzarbeitHours time.Duration
// for _, day := range workDaysThisMonth {
// tmpvirtualHours := day.GetWorktime(employee, weekbase, true)
// tmpactualHours := day.GetWorktime(employee, weekbase, false)
// if day.IsKurzArbeit() && tmpvirtualHours > tmpactualHours {
// slog.Debug("Adding kurzarbeit to workday", "day", day.Date())
// kurzarbeitHours += tmpvirtualHours - tmpactualHours
// }
// workHours += tmpvirtualHours
// }
worktimeBalance := workHours - targetHoursThisMonth
// typstDays, err := convertDaysToTypst(workDaysThisMonth, employee, weekbase)
// if err != nil {
// slog.Warn("Failed to convert to days", slog.Any("error", err))
// return typstData{}, err
// }
totalOvertime, err := employee.GetReportedOvertime(endDate)
if err != nil {
slog.Error("Cannot retrieve total Overtime", "Error", err)
}
@@ -239,10 +214,10 @@ func createEmployeReport(employee models.User, startDate, endDate time.Time) (ty
metadata := typstMetadata{
EmployeeName: fmt.Sprintf("%s %s", employee.Vorname, employee.Name),
TimeRange: fmt.Sprintf("%s - %s", startDate.Format(DE_DATE), endDate.Format(DE_DATE)),
Overtime: helper.FormatDurationFill(worktimeBalance, true),
Overtime: helper.FormatDurationFill(monthOvertime, true),
WorkTime: helper.FormatDurationFill(workHours, true),
Kurzarbeit: helper.FormatDurationFill(kurzarbeitHours, true),
OvertimeTotal: helper.FormatDurationFill(totalOvertime+worktimeBalance, true),
OvertimeTotal: helper.FormatDurationFill(totalOvertime+monthOvertime, true),
CurrentTimestamp: time.Now().Format("02.01.2006 - 15:04 Uhr"),
}
return typstData{Meta: metadata, Days: typstDays, FileName: fmt.Sprintf("%s_%s.pdf", startDate.Format(FILE_YEAR_MONTH), employee.Name)}, nil