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.
This commit is contained in:
Daniel Borchmann 2024-10-03 10:14:30 +02:00
parent f948f3dca3
commit ca1b3613f9
No known key found for this signature in database
GPG Key ID: 784AA8DF0CCDF625

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)))