Compare commits

...

1 Commits

Author SHA1 Message Date
2ee8bde397
Add simple computation of utilization to workload overview report
This way, it should be easier to spot days where utilzation is too high
to take any more work.
2024-10-03 10:14:30 +02:00

View File

@ -749,7 +749,12 @@ PARAMS is a property list of the following parameters:
weekends, use \"Sat\\|Sun\" as regular expression.
This can also be a function taking a formatted timestamp as
argument and returning non-nil when the date should be skipped."
argument and returning non-nil when the date should be skipped.
`:work-hours'
The time available per day for work, given as duration string.
Defauls to \"8:00\"."
(let* ((start-date (org-read-date t t
(or (plist-get params :start-date)
"00:00")))
@ -767,13 +772,19 @@ PARAMS is a property list of the following parameters:
#'(lambda (x) (string-match arg x)))
((and (pred functionp) fun) fun)
(_ (user-error "Invalid argument to :skip-matches: %s" arg))))
(work-hours (or (plist-get params :work-hours)
"8:00"))
date-range)
;; Check input
(unless (string-match-p (rx bos "+" (+ digit) (in "dwmy") eos)
increment)
(user-error "Increment must be of the form +1d, +2m, +3y, …, but it's %s" increment))
(unless (org-duration-p work-hours)
(user-error "Work hours must be a duration string, but it's %s" work-hours))
;; Compute range of dates to check; simple but potentially costly approach
;; taken from https://sachachua.com/blog/2015/08/org-mode-date-arithmetic/;
;; maybe consider `org-read-date-get-relative' as well?
@ -794,9 +805,10 @@ PARAMS is a property list of the following parameters:
(insert (format "#+CAPTION: Workload Overview Report at [%s] with start date [%s]\n"
(format-time-string timestamp-format (current-time))
(format-time-string timestamp-format start-date)))
(insert "| End Time | Planned Total |\n| <r> | <r> |\n|---|\n")
(insert "| End Time | Planned Total | Utilization |\n| <r> | <r> | <r> |\n|---|\n")
;; Compute workload report for each date and record the total time;
;; XXX: this might be slow, try to reduce the calls to `db/org-planned-tasks-in-range'.
(let ((days 0))
(dolist (interval-end-date date-range)
(let ((total-time (car (db/org-planned-tasks-in-range
;; Set start date to nil to also include tasks scheduled or deadlined
@ -805,7 +817,11 @@ PARAMS is a property list of the following parameters:
nil
interval-end-date
org-ql-match))))
(insert (format "| [%s] | %s |\n" interval-end-date total-time))))
(let ((utilization (* (/ (org-duration-to-minutes total-time)
(* (cl-incf days)
(org-duration-to-minutes work-hours)))
100)))
(insert (format "| [%s] | %s | %.2f%% |\n" interval-end-date total-time utilization))))))
(insert "|--|")
(org-table-align)))