fix: wrong kurzarbeit calculation fixed #80
Some checks failed
Tests / Run Go Tests (push) Failing after 1m5s
Some checks failed
Tests / Run Go Tests (push) Failing after 1m5s
This commit is contained in:
@@ -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)
|
||||
|
||||
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
|
||||
|
||||
@@ -119,8 +119,6 @@ func (p *PublicHoliday) RequiresAction() bool {
|
||||
}
|
||||
|
||||
func (p *PublicHoliday) GetWorktime(u User, base WorktimeBase, includeKurzarbeit bool) time.Duration {
|
||||
return 0
|
||||
|
||||
switch base {
|
||||
case WorktimeBaseDay:
|
||||
return u.ArbeitszeitProTagFrac(float32(p.worktime) / 100)
|
||||
|
||||
@@ -31,6 +31,7 @@ type WorkWeek struct {
|
||||
Overtime time.Duration
|
||||
Status WeekStatus
|
||||
WeekBase WorktimeBase
|
||||
Kurzarbeit time.Duration
|
||||
}
|
||||
|
||||
type WeekStatus int8
|
||||
@@ -72,8 +73,13 @@ func (w *WorkWeek) PopulateWithDays(worktime time.Duration, overtime time.Durati
|
||||
}
|
||||
|
||||
for _, day := range w.Days {
|
||||
w.Worktime += day.GetWorktime(w.User, w.WeekBase, false)
|
||||
w.WorktimeVirtual += day.GetWorktime(w.User, w.WeekBase, true)
|
||||
dWorkTime := day.GetWorktime(w.User, w.WeekBase, false)
|
||||
dWorkTimeVirtual := day.GetWorktime(w.User, w.WeekBase, true)
|
||||
if dWorkTime < dWorkTimeVirtual {
|
||||
w.Kurzarbeit += dWorkTimeVirtual - dWorkTime
|
||||
}
|
||||
w.Worktime += dWorkTime
|
||||
w.WorktimeVirtual += dWorkTimeVirtual
|
||||
slog.Debug("Calculated Worktime", "Day", day.ToString(), "worktime", w.Worktime.String())
|
||||
}
|
||||
slog.Debug("Got worktime for user", "worktime", w.Worktime.String(), "virtualWorkTime", w.WorktimeVirtual.String())
|
||||
|
||||
Reference in New Issue
Block a user