From 13000ec4703d1dd49fd12f8c2cb427130e4899b7 Mon Sep 17 00:00:00 2001 From: Gregor Kleen Date: Wed, 20 Aug 2025 15:05:36 +0200 Subject: ... --- overlays/worktime/worktime/__main__.py | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) (limited to 'overlays/worktime') diff --git a/overlays/worktime/worktime/__main__.py b/overlays/worktime/worktime/__main__.py index e4daf6d9..3e7aeb9f 100755 --- a/overlays/worktime/worktime/__main__.py +++ b/overlays/worktime/worktime/__main__.py @@ -375,8 +375,8 @@ class Worktime(object): parse_datestr(stripped_line) for day in [fromDay + timedelta(days = x) for x in range(0, (toDay - fromDay).days + 1)]: - if self.end_date.date() < day or day < self.start_date.date(): - continue + # if self.end_date.date() < day or day < self.start_date.date(): + # continue if self.would_be_workday(day): if excused_kind == 'leave': @@ -444,6 +444,9 @@ class Worktime(object): if e.errno != 2: raise e + for year in range(self.end_date.year + 1, max(self.pull_forward.keys()).year + 1): + holidays |= {k: v * timedelta(hours = hours_per_week(k)) / len(self.workdays) for k, v in Worktime.holidays(year).items()} + self.days_to_work = dict() # if self.pull_forward: @@ -485,10 +488,23 @@ class Worktime(object): day_time = max(timedelta(), self.time_per_day(extra_day) - self.extra_days_to_work[extra_day]) self.extra_days_to_work[extra_day] += extra_day_time * (day_time / extra_day_time_left) - hours_per_day_forward = time_forward / len(days_forward) if len(days_forward) > 0 else timedelta() + def days_count(days_forward): + r = 0 + for day in sorted(days_forward): + day_time = timedelta() + if day in self.extra_days_to_work: + day_time += self.extra_days_to_work + if day in holidays and not day in self.extra_days_to_work: + day_time -= holidays[day] + if day.isoweekday() in self.workdays: + day_time += timedelta(hours = hours_per_week(day)) / len(self.workdays) + r += max(timedelta(), day_time) / (timedelta(hours = hours_per_week(day)) / len(self.workdays)) + return r + + hours_per_day_forward = time_forward / days_count(days_forward) if days_count(days_forward) > 0 else timedelta() days_forward.discard(self.end_date.date()) - self.time_pulled_forward += time_forward - hours_per_day_forward * len(days_forward) + self.time_pulled_forward += time_forward - hours_per_day_forward * days_count(days_forward) if self.end_date.date() in self.extra_days_to_work: self.time_pulled_forward += self.extra_days_to_work[self.end_date.date()] -- cgit v1.2.3