diff options
-rwxr-xr-x | overlays/worktime/worktime/__main__.py | 30 |
1 files changed, 23 insertions, 7 deletions
diff --git a/overlays/worktime/worktime/__main__.py b/overlays/worktime/worktime/__main__.py index b0ac57e1..3e7aeb9f 100755 --- a/overlays/worktime/worktime/__main__.py +++ b/overlays/worktime/worktime/__main__.py | |||
@@ -375,8 +375,8 @@ class Worktime(object): | |||
375 | parse_datestr(stripped_line) | 375 | parse_datestr(stripped_line) |
376 | 376 | ||
377 | for day in [fromDay + timedelta(days = x) for x in range(0, (toDay - fromDay).days + 1)]: | 377 | for day in [fromDay + timedelta(days = x) for x in range(0, (toDay - fromDay).days + 1)]: |
378 | if self.end_date.date() < day or day < self.start_date.date(): | 378 | # if self.end_date.date() < day or day < self.start_date.date(): |
379 | continue | 379 | # continue |
380 | 380 | ||
381 | if self.would_be_workday(day): | 381 | if self.would_be_workday(day): |
382 | if excused_kind == 'leave': | 382 | if excused_kind == 'leave': |
@@ -444,6 +444,9 @@ class Worktime(object): | |||
444 | if e.errno != 2: | 444 | if e.errno != 2: |
445 | raise e | 445 | raise e |
446 | 446 | ||
447 | for year in range(self.end_date.year + 1, max(self.pull_forward.keys()).year + 1): | ||
448 | holidays |= {k: v * timedelta(hours = hours_per_week(k)) / len(self.workdays) for k, v in Worktime.holidays(year).items()} | ||
449 | |||
447 | self.days_to_work = dict() | 450 | self.days_to_work = dict() |
448 | 451 | ||
449 | # if self.pull_forward: | 452 | # if self.pull_forward: |
@@ -485,15 +488,28 @@ class Worktime(object): | |||
485 | day_time = max(timedelta(), self.time_per_day(extra_day) - self.extra_days_to_work[extra_day]) | 488 | day_time = max(timedelta(), self.time_per_day(extra_day) - self.extra_days_to_work[extra_day]) |
486 | self.extra_days_to_work[extra_day] += extra_day_time * (day_time / extra_day_time_left) | 489 | self.extra_days_to_work[extra_day] += extra_day_time * (day_time / extra_day_time_left) |
487 | 490 | ||
488 | hours_per_day_forward = time_forward / len(days_forward) if len(days_forward) > 0 else timedelta() | 491 | def days_count(days_forward): |
492 | r = 0 | ||
493 | for day in sorted(days_forward): | ||
494 | day_time = timedelta() | ||
495 | if day in self.extra_days_to_work: | ||
496 | day_time += self.extra_days_to_work | ||
497 | if day in holidays and not day in self.extra_days_to_work: | ||
498 | day_time -= holidays[day] | ||
499 | if day.isoweekday() in self.workdays: | ||
500 | day_time += timedelta(hours = hours_per_week(day)) / len(self.workdays) | ||
501 | r += max(timedelta(), day_time) / (timedelta(hours = hours_per_week(day)) / len(self.workdays)) | ||
502 | return r | ||
503 | |||
504 | hours_per_day_forward = time_forward / days_count(days_forward) if days_count(days_forward) > 0 else timedelta() | ||
489 | days_forward.discard(self.end_date.date()) | 505 | days_forward.discard(self.end_date.date()) |
490 | 506 | ||
491 | self.time_pulled_forward += time_forward - hours_per_day_forward * len(days_forward) | 507 | self.time_pulled_forward += time_forward - hours_per_day_forward * days_count(days_forward) |
492 | 508 | ||
493 | if self.end_date.date() in self.extra_days_to_work: | 509 | if self.end_date.date() in self.extra_days_to_work: |
494 | self.time_pulled_forward += self.extra_days_to_work[self.end_date.date()] | 510 | self.time_pulled_forward += self.extra_days_to_work[self.end_date.date()] |
495 | 511 | ||
496 | self.time_to_work += self.time_pulled_forward | 512 | # self.time_to_work += self.time_pulled_forward |
497 | 513 | ||
498 | self.time_worked += api.get_billable_hours(self.start_date, self.now) | 514 | self.time_worked += api.get_billable_hours(self.start_date, self.now) |
499 | 515 | ||
@@ -572,7 +588,7 @@ def worktime(pull_forward_cutoff, waybar, **args): | |||
572 | pull_forward_sum = sum(worktime.pull_forward.values(), start=timedelta(milliseconds=0)) | 588 | pull_forward_sum = sum(worktime.pull_forward.values(), start=timedelta(milliseconds=0)) |
573 | if pull_forward_sum >= min(pull_forward_cutoff, timedelta(seconds = 1)): | 589 | if pull_forward_sum >= min(pull_forward_cutoff, timedelta(seconds = 1)): |
574 | worktime_no_pulled_forward = deepcopy(worktime) | 590 | worktime_no_pulled_forward = deepcopy(worktime) |
575 | worktime_no_pulled_forward.time_to_work -= worktime_no_pulled_forward.time_pulled_forward | 591 | # worktime_no_pulled_forward.time_to_work -= worktime_no_pulled_forward.time_pulled_forward |
576 | worktime_no_pulled_forward.time_pulled_forward = timedelta() | 592 | worktime_no_pulled_forward.time_pulled_forward = timedelta() |
577 | worktime_no_pulled_forward.pull_forward = dict() | 593 | worktime_no_pulled_forward.pull_forward = dict() |
578 | worktime.time_to_work += pull_forward_sum | 594 | worktime.time_to_work += pull_forward_sum |
@@ -641,7 +657,7 @@ def time_worked(now, waybar, **args): | |||
641 | 657 | ||
642 | clockout_time, exact_clockout_time, clockout_difference = round_clockout_time(difference) | 658 | clockout_time, exact_clockout_time, clockout_difference = round_clockout_time(difference) |
643 | clockout_time_pull_forward, exact_clockout_time_pull_forward, clockout_difference_pull_forward = round_clockout_time(difference_pull_forward) | 659 | clockout_time_pull_forward, exact_clockout_time_pull_forward, clockout_difference_pull_forward = round_clockout_time(difference_pull_forward) |
644 | clockout_pull_forward_sum, exact_clockout_pull_forward_sum, _ = round_clockout_time(now.time_to_work - now.time_pulled_forward - now.time_worked + sum(now.pull_forward.values(), start=timedelta(milliseconds=0))) | 660 | clockout_pull_forward_sum, exact_clockout_pull_forward_sum, _ = round_clockout_time(now.time_to_work - now.time_worked + sum(now.pull_forward.values(), start=timedelta(milliseconds=0))) |
645 | 661 | ||
646 | if now.running_entry and clockout_time and (clockout_difference >= 0 or clockout_difference_pull_forward >= 0): | 662 | if now.running_entry and clockout_time and (clockout_difference >= 0 or clockout_difference_pull_forward >= 0): |
647 | out_text = f"{difference_string}/{clockout_time:%H:%M}" | 663 | out_text = f"{difference_string}/{clockout_time:%H:%M}" |