create org-effectiveness-plot
[worg.git] / code / elisp / org-effectiveness.el
1 ;;; org-effectiveness.el --- Measuring the personal effectiveness
2
3 ;; Copyright (C) 2013 Free Software Foundation, Inc.
4
5 ;; Author: David Arroyo Menéndez <davidam@es.gnu.org>
6 ;; Keywords: effectiveness, plot
7 ;; Homepage: http://orgmode.org
8 ;;
9 ;; This file is not part of GNU Emacs, yet.
10 ;;
11 ;; GNU Emacs is free software: you can redistribute it and/or modify
12 ;; it under the terms of the GNU General Public License as published by
13 ;; the Free Software Foundation, either version 3 of the License, or
14 ;; (at your option) any later version.
15
16 ;; GNU Emacs is distributed in the hope that it will be useful,
17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19 ;; GNU General Public License for more details.
20
21 ;; You should have received a copy of the GNU General Public License
22 ;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
23 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
24 ;;
25 ;;; Commentary:
26
27 ;; This file implements functions to measure the effectiveness in org.
28 ;; Org-mode doesn't load this module by default - if this is not what
29 ;; you want, configure the variable `org-modules'. Thanks to #emacs-es
30 ;; irc channel for your support.
31
32 ;;; Code:
33
34 (require 'org)
35
36 (defun org-count-keyword(keyword)
37   "Print a message with the number of keyword outline in the current buffer"
38   (interactive "sKeyword: ")
39   (save-excursion
40     (goto-char (point-min))
41     (message "Number of %s: %d" keyword (count-matches (concat "* " keyword)))))
42
43 (defun org-count-todo()
44   "Print a message with the number of todo tasks in the current buffer"
45   (interactive)
46   (save-excursion 
47     (goto-char (point-min))
48     (message "Number of TODO: %d" (count-matches "* TODO"))))
49                                                                              
50 (defun org-count-done()
51   "Print a message with the number of done tasks in the current buffer"
52   (interactive)
53   (save-excursion
54     (goto-char (point-min))
55     (message "Number of DONE: %d" (count-matches "* DONE"))))
56
57 (defun org-count-canceled()
58   "Print a message with the number of canceled tasks in the current buffer"
59   (interactive)
60   (save-excursion
61     (goto-char (point-min))
62     (message "Number of Canceled: %d" (count-matches "* CANCELED"))))
63
64 (defun org-effectiveness()
65   "Returns the effectiveness in the current org buffer"
66   (interactive)
67   (save-excursion
68     (goto-char (point-min))
69     (let ((done (float (count-matches "* DONE.*\n.*")))
70           (canc (float (count-matches "* CANCELED.*\n.*"))))
71       (if (and (= done canc) (zerop done))
72           (setq effectiveness 0)
73         (setq effectiveness (* 100 (/ done (+ done canc)))))
74       (message "Effectiveness: %f" effectiveness))))
75
76 (defun org-keywords-in-date(keyword date)
77   (interactive "sKeyword: \nsDate: " keyword date)
78   (setq count (count-matches (concat keyword ".*\n.*" date)))
79   (message (concat "%sS: %d" keyword count)))
80
81 (defun org-dones-in-date(date)
82    (interactive "sGive me a date: " date)
83    (setq count (count-matches (concat "DONE.*\n.*" date)))
84    (message "DONES: %d" count))
85
86 (defun org-todos-in-date(date)
87    (interactive "sGive me a date: " date)
88    (setq count (count-matches (concat "TODO.*\n.*" date)))
89    (message "TODOS: %d" count))
90
91 (defun org-canceled-in-date(date)
92    (interactive "sGive me a date: " date)
93    (setq count (count-matches (concat "TODO.*\n.*" date)))
94    (message "CANCELEDS: %d" count))
95
96 (defun org-effectiveness-in-date(date &optional notmessage)
97   (interactive "sGive me a date: " date)
98   (save-excursion
99     (goto-char (point-min))
100     (let ((done (float (count-matches (concat "* DONE.*\n.*" date))))
101           (canc (float (count-matches (concat "* CANCELED.*\n.*" date)))))
102       (if (and (= done canc) (zerop done))
103           (setq effectiveness 0)
104         (setq effectiveness (* 100 (/ done (+ done canc)))))
105       (if (eq notmessage 1)
106           (message "%d" effectiveness)
107         (message "Effectiveness: %d " effectiveness)))))
108
109 (defun org-effectiveness-month-to-string (m)
110   (if (< m 10)
111       (concat "0" (number-to-string m))
112     (number-to-string m)))
113
114 (org-effectiveness-month-to-string 9)
115
116 (defun org-effectiveness-plot(startdate enddate)
117   (interactive "sGive me the start date: \nsGive me the end date: " startdate enddate)
118 ;; Checking the format of the dates
119   (if (not (string-match "[0-9][0-9][0-9][0-9]-[0-9][0-9]" startdate)) 
120       (message "The start date must have the next format YYYY-MM"))
121   (if (not (string-match "[0-9][0-9][0-9][0-9]-[0-9][0-9]" enddate)) 
122       (message "The end date must have the next format YYYY-MM"))
123 ;; Checking if startdate < enddate
124   (if (string-match "^[0-9][0-9][0-9][0-9]" startdate)
125       (setq startyear (string-to-number (match-string 0 startdate))))
126   (if (string-match "[0-9][0-9]$" startdate)
127       (setq startmonth (string-to-number (match-string 0 startdate))))
128   (if (string-match "^[0-9][0-9][0-9][0-9]" enddate)
129       (setq endyear (string-to-number (match-string 0 enddate))))
130   (if (string-match "[0-9][0-9]$" enddate)
131       (setq endmonth (string-to-number (match-string 0 enddate))))
132   (if (> startyear endyear)
133        (message "The start date must be before that end date"))
134   (if (and (= startyear endyear) (> startmonth endmonth))
135       (message "The start date must be before that end date"))
136 ;; Create a file 
137   (let ((month startmonth)
138         (year startyear)
139         (str ""))
140     (while (and (>= endyear year) (>= endmonth month))
141       (setq str (concat str (number-to-string year) "-" (org-effectiveness-month-to-string month) " " (org-effectiveness-in-date (concat (number-to-string year) "-" (org-effectiveness-month-to-string month)) 1) "\n"))
142       (if (= month 12)
143           (progn 
144             (setq year (+ 1 year))
145             (setq month 1))
146         (setq month (+ 1 month))))
147       (write-region str nil "/tmp/org-effectiveness"))
148 ;; Create the bar graph 
149   (call-process "/bin/bash" nil t nil "-c" "/usr/bin/gnuplot -e 'plot \"/tmp/org-effectiveness\" using 2:xticlabels(1) with histograms' -p"))
150
151 (provide 'org-effectiveness)