Allow to specify available work hours using custom functions

This allows to specify variable work hours depending on the
corresponding date.
This commit is contained in:
Daniel Borchmann 2024-10-03 18:01:02 +02:00
parent d63cba9756
commit 9e3fe2a3b0
No known key found for this signature in database
GPG Key ID: 784AA8DF0CCDF625

View File

@ -772,8 +772,12 @@ 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)
(arg (user-error "Invalid argument to :skip-matches: %s" arg)))) (arg (user-error "Invalid argument to :skip-matches: %s" arg))))
(work-hours (or (plist-get params :work-hours) (work-hours (pcase (plist-get params :work-hours)
"8:00")) ((pred null) #'(lambda (_) "8:00"))
((and (pred org-duration-p) arg)
#'(lambda (_) arg))
((and (pred functionp) fun) fun)
(arg (user-error "Invalid argument to :work-hours: %s" arg))))
date-range) date-range)
;; Check input ;; Check input
@ -782,9 +786,6 @@ PARAMS is a property list of the following parameters:
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?
@ -819,7 +820,9 @@ PARAMS is a property list of the following parameters:
interval-end-date interval-end-date
org-ql-match))) org-ql-match)))
(utilization (* (/ (org-duration-to-minutes total-time-duration) (utilization (* (/ (org-duration-to-minutes total-time-duration)
(cl-incf total-work-hours (org-duration-to-minutes work-hours))) (cl-incf total-work-hours
(org-duration-to-minutes
(funcall work-hours interval-end-date))))
100))) 100)))
(insert (format "| [%s] | %s | %s | %s |\n" (insert (format "| [%s] | %s | %s | %s |\n"
interval-end-date interval-end-date