diff options
| -rw-r--r-- | rt-liberation-report.el | 97 | 
1 files changed, 55 insertions, 42 deletions
| diff --git a/rt-liberation-report.el b/rt-liberation-report.el index 81fd50c..2e6a545 100644 --- a/rt-liberation-report.el +++ b/rt-liberation-report.el @@ -32,12 +32,20 @@  (require 'rt-liberation-rest) -(defun rt-liberation-report-resolved-interval (rt-queue start-date end-date) +(defvar rt-liber-report-csv-header +  '("date" "tickets resolved") +  "Headers for comma separated value output.") + +(defun rt-liber-report-get-interval (rt-queue start-date end-date)    "Return tickets resolved between START-DATE and END-DATE.  The tickets must have their current status be Resolved in order  to be returned by this function. If no tickets match the query,  return `nil'." +  (when (or (not (stringp rt-queue)) +	    (not (stringp start-date)) +	    (not (stringp end-date))) +    (error "bad argument/s"))    (rt-liber-rest-run-show-base-query     (rt-liber-rest-run-ls-query      (rt-liber-compile-query @@ -45,47 +53,52 @@ return `nil'."  	  (resolved start-date end-date)  	  (status   "resolved")))))) -;; (rt-liberation-report-resolved-interval "licensing" "2015-09-18" "2015-09-17") - - -;; ((("TimeLeft" . "0") -;;   ("TimeWorked" . "0") -;;   ("TimeEstimated" . "0") -;;   ("Told" . "Thu Oct 08 00:53:59 2015") -;;   ("Resolved" . "Thu Oct 08 00:53:59 2015") -;;   ("Due" . "Not set") -;;   ("Started" . "Wed Oct 07 06:52:03 2015") -;;   ("Starts" . "Not set") -;;   ("Created" . "Wed Oct 07 06:39:22 2015") -;;   ("Requestors" . "ian.macintosh@gtxweb.uk") -;;   ("FinalPriority" . "0") -;;   ("InitialPriority" . "0") -;;   ("Priority" . "0") -;;   ("Status" . "resolved") -;;   ("Subject" . "Badly worded and misleading paragraph") -;;   ("Creator" . "ian.macintosh@gtxweb.uk") -;;   ("Owner" . "jgay@fsf.org") -;;   ("Queue" . "licensing") -;;   ("id" . "ticket/1052419")) -;;  (("TimeLeft" . "0") -;;   ("TimeWorked" . "0") -;;   ("TimeEstimated" . "0") -;;   ("Told" . "Thu Oct 08 07:54:47 2015") -;;   ("Resolved" . "Thu Oct 08 07:54:47 2015") -;;   ("Due" . "Not set") -;;   ("Started" . "Wed Oct 07 12:03:20 2015") -;;   ("Starts" . "Not set") -;;   ("Created" . "Mon Sep 21 13:33:24 2015") -;;   ("Requestors" . "juan.balderas.0@gmail.com") -;;   ("FinalPriority" . "0") -;;   ("InitialPriority" . "0") -;;   ("Priority" . "0") -;;   ("Status" . "resolved") -;;   ("Subject" . "Softare donation to FSF") -;;   ("Creator" . "juan.balderas.0@gmail.com") -;;   ("Owner" . "donald") -;;   ("Queue" . "licensing") -;;   ("id" . "ticket/1048183"))) +(defun rt-liber-report-scan-ticket (ticket-alist) +  (let ((date-resolved (cdr (assoc "Resolved" ticket-alist))) +	(owner         (cdr (assoc "Owner" ticket-alist)))) +    `(,(format-time-string "%d-%m-%Y" (date-to-time date-resolved)) +      . ,owner))) + +(defun rt-liber-report-scan-interval (interval) +  "Convert the list of tickets into an ordered format." +  (when (not interval) +    (error "no tickets in interval")) +  (let ((l (copy-tree interval)) +	(r nil)) +    (while l +      (setq r (append r `(,(rt-liber-report-scan-ticket (car l))))) +      (setq l (cdr l))) +    (setq r (sort r +		  #'(lambda (a b) +		      (string-lessp (car a) (car b))))) +    r)) + +(defun rt-liber-report-count-by-date (l) +  (let ((h (make-hash-table :test 'equal))) +    (while l +      (let ((d (or (gethash (caar l) h) 0))) +	(puthash (caar l) (+ d 1) h)) +      (setq l (cdr l))) +    h)) + +(defun rt-liber-report-count-by-owner (l) +  (let ((h (make-hash-table :test 'equal))) +    (while l +      (let ((d (or (gethash (cdar l) h) 0))) +	(puthash (cdar l) (+ d 1) h)) +      (setq l (cdr l))) +    h)) + +(defun rt-liber-report (rt-queue start-date end-date) +  (let ((tickets (rt-liber-report-scan-interval +		  (rt-liber-report-get-interval +		   rt-queue start-date end-date))) +	by-date by-owner) +    (when (not tickets) +      (error (concat "no tickets in interval between " +		     start-date " and " end-date))) +    (setq by-date  (rt-liber-report-count-by-date tickets) +	  by-owner (rt-liber-report-count-by-owner tickets))))  (provide 'rt-report) | 
