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:
parent
f948f3dca3
commit
ca1b3613f9
@ -749,7 +749,12 @@ PARAMS is a property list of the following parameters:
|
|||||||
weekends, use \"Sat\\|Sun\" as regular expression.
|
weekends, use \"Sat\\|Sun\" as regular expression.
|
||||||
|
|
||||||
This can also be a function taking a formatted timestamp as
|
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
|
(let* ((start-date (org-read-date t t
|
||||||
(or (plist-get params :start-date)
|
(or (plist-get params :start-date)
|
||||||
"00:00")))
|
"00:00")))
|
||||||
@ -767,13 +772,19 @@ PARAMS is a property list of the following parameters:
|
|||||||
#'(lambda (x) (string-match arg x)))
|
#'(lambda (x) (string-match arg x)))
|
||||||
((and (pred functionp) fun) fun)
|
((and (pred functionp) fun) fun)
|
||||||
(_ (user-error "Invalid argument to :skip-matches: %s" arg))))
|
(_ (user-error "Invalid argument to :skip-matches: %s" arg))))
|
||||||
|
(work-hours (or (plist-get params :work-hours)
|
||||||
|
"8:00"))
|
||||||
date-range)
|
date-range)
|
||||||
|
|
||||||
;; Check input
|
;; Check input
|
||||||
|
|
||||||
(unless (string-match-p (rx bos "+" (+ digit) (in "dwmy") eos)
|
(unless (string-match-p (rx bos "+" (+ digit) (in "dwmy") eos)
|
||||||
increment)
|
increment)
|
||||||
(user-error "Increment must be of the form +1d, +2m, +3y, …, but it's %s" 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
|
;; Compute range of dates to check; simple but potentially costly approach
|
||||||
;; taken from https://sachachua.com/blog/2015/08/org-mode-date-arithmetic/;
|
;; taken from https://sachachua.com/blog/2015/08/org-mode-date-arithmetic/;
|
||||||
;; maybe consider `org-read-date-get-relative' as well?
|
;; maybe consider `org-read-date-get-relative' as well?
|
||||||
@ -794,18 +805,23 @@ PARAMS is a property list of the following parameters:
|
|||||||
(insert (format "#+CAPTION: Workload Overview Report at [%s] with start date [%s]\n"
|
(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 (current-time))
|
||||||
(format-time-string timestamp-format start-date)))
|
(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;
|
;; 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'.
|
;; XXX: this might be slow, try to reduce the calls to `db/org-planned-tasks-in-range'.
|
||||||
(dolist (interval-end-date date-range)
|
(let ((days 0))
|
||||||
(let ((total-time (car (db/org-planned-tasks-in-range
|
(dolist (interval-end-date date-range)
|
||||||
;; Set start date to nil to also include tasks scheduled or deadlined
|
(let ((total-time (car (db/org-planned-tasks-in-range
|
||||||
;; before `start-date', as those are also still open and need to be
|
;; Set start date to nil to also include tasks scheduled or deadlined
|
||||||
;; done somewhen.
|
;; before `start-date', as those are also still open and need to be
|
||||||
nil
|
;; done somewhen.
|
||||||
interval-end-date
|
nil
|
||||||
org-ql-match))))
|
interval-end-date
|
||||||
(insert (format "| [%s] | %s |\n" interval-end-date total-time))))
|
org-ql-match))))
|
||||||
|
(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 "|--|")
|
(insert "|--|")
|
||||||
(org-table-align)))
|
(org-table-align)))
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user