Add 'timesheet' command
This commit is contained in:
parent
c91cf1d41a
commit
cd8f142f46
16
README.md
16
README.md
@ -1,5 +1,6 @@
|
||||
Программа написана на [Scheme](http://www.schemers.org/) (реализация - [GNU Guile](http://www.gnu.org/software/guile/)) и предназначена для учета
|
||||
рабочего времени. Применяется следующим образом:
|
||||
Программа написана на [Scheme](http://www.schemers.org/) (реализация -
|
||||
[GNU Guile](http://www.gnu.org/software/guile/)) и предназначена для
|
||||
учета рабочего времени. Применяется следующим образом:
|
||||
|
||||
Usage: timer [command]
|
||||
Commands:
|
||||
@ -14,6 +15,11 @@
|
||||
deadline clear [TASK] Remove deadline for project (or for last task)
|
||||
deadline [TASK] Show deadline for project
|
||||
deadline all Show all deadlines
|
||||
timesheet Show all raw events
|
||||
timesheet day [DATE] Show raw events for today or DATE
|
||||
timesheet week [DATE] Show raw events for current week or week of DATE
|
||||
timesheet month [DATE] Show raw events for current month or month of DATE
|
||||
timesheet TASK Show raw events
|
||||
refresh Refresh worksheet file after manual edit
|
||||
(no command) Show running task and timer
|
||||
|
||||
@ -63,10 +69,8 @@
|
||||
Команда `report` может иметь параметры:
|
||||
|
||||
- `day [DATE]` - отчет по текущему дню или по дате DATE;
|
||||
|
||||
- `week [DATE]` - отчет по текущей неделе или по неделе, в которую входит день
|
||||
DATE;
|
||||
|
||||
- `month [DATE]` - отчет по текущему месяцу или по месяцу, в который входит день
|
||||
DATE;
|
||||
|
||||
@ -109,6 +113,10 @@
|
||||
останется еще 40 минут. Это может быть удобно при планировании времени на
|
||||
день/неделю/месяц.
|
||||
|
||||
Для того, чтобы посмотреть историю работы, можно воспользоваться командой
|
||||
`timesheet`. Эта команда показывает выполнявшиеся задачи в таком виде, в котором
|
||||
они сохраняются на диск. Параметры команды такие-же, как у команды `report`.
|
||||
|
||||
# Автодополнение для zsh
|
||||
|
||||
Для включения автодополнения в zsh скопируйте файл `zsh-completion/_timer` в
|
||||
|
||||
@ -22,6 +22,11 @@ Commands:
|
||||
deadline clear [TASK] Remove deadline for project (or for last task)
|
||||
deadline [TASK] Show deadline for project
|
||||
deadline all Show all deadlines
|
||||
timesheet Show all raw events
|
||||
timesheet day [DATE] Show raw events for today or DATE
|
||||
timesheet week [DATE] Show raw events for current week or week of DATE
|
||||
timesheet month [DATE] Show raw events for current month or month of DATE
|
||||
timesheet TASK Show raw events
|
||||
refresh Refresh worksheet file after manual edit
|
||||
(no command) Show running task and timer
|
||||
#+end_src
|
||||
@ -130,6 +135,10 @@ Commands:
|
||||
останется еще 40 минут. Это может быть удобно при планировании времени на
|
||||
день/неделю/месяц.
|
||||
|
||||
Для того, чтобы посмотреть историю работы, можно воспользоваться командой
|
||||
=timesheet=. Эта команда показывает выполнявшиеся задачи в таком виде, в котором
|
||||
они сохраняются на диск. Параметры команды такие-же, как у команды =report=.
|
||||
|
||||
** Автодополнение для zsh
|
||||
Для включения автодополнения в zsh скопируйте файл =zsh-completion/_timer= в
|
||||
=~/.zsh-completion/=, и добавте в файл =~/.zshrc= строки
|
||||
|
||||
@ -5,7 +5,7 @@ _timer()
|
||||
case "$COMP_CWORD" in
|
||||
1)
|
||||
# Commands
|
||||
COMPREPLY=( $(compgen -W "start stop report deadline refresh help" -- $uncomplete) )
|
||||
COMPREPLY=( $(compgen -W "start stop report deadline refresh timesheet help" -- $uncomplete) )
|
||||
;;
|
||||
2)
|
||||
# Command argument 1
|
||||
@ -14,7 +14,7 @@ _timer()
|
||||
local tasklist=$(timer tasklist)
|
||||
COMPREPLY=( $(compgen -W "$tasklist" -- $uncomplete))
|
||||
;;
|
||||
report)
|
||||
report|timesheet)
|
||||
local tasklist=$(timer tasklist)
|
||||
COMPREPLY=( $(compgen -W "day week month $tasklist" -- $uncomplete))
|
||||
;;
|
||||
@ -27,7 +27,7 @@ _timer()
|
||||
3)
|
||||
# Command argument 2
|
||||
case "${COMP_WORDS[1]}" in
|
||||
report)
|
||||
report|timesheet)
|
||||
case "${COMP_WORDS[2]}" in
|
||||
day)
|
||||
local d=$(date +"%Y-%m-%d")
|
||||
|
||||
131
worktimer.scm
131
worktimer.scm
@ -197,6 +197,12 @@
|
||||
(let ((jd (date->julian-day date)))
|
||||
(+ jd (- 7 (remainder-and-rest jd 7)))))))
|
||||
|
||||
;;; Returns n-th element of list l, or NUL if list is shorter than n
|
||||
(define (nth-maybe n l)
|
||||
(if (null? l) '()
|
||||
(if (zero? n) (car l)
|
||||
(nth-maybe (- n 1) (cdr l)))))
|
||||
|
||||
;;; ========================= PROJECT SPECIFIC HELPERS =========================
|
||||
|
||||
;;; Find task or deadline by path
|
||||
@ -509,6 +515,60 @@
|
||||
(walk l (+ level 2)))
|
||||
(cdddr tree)))))
|
||||
|
||||
;;; Filter sheet by qualis and range.
|
||||
;;; Qualis is string "day", "week", "month" or task name.
|
||||
;;; Range is the date string. Both qualis and range may be nil.
|
||||
;;;
|
||||
;;; Function returns values of filtered sheet and string
|
||||
;;; with description of filtering range.
|
||||
(define (filter-sheet sheet qualis range)
|
||||
(if (null? qualis)
|
||||
(values sheet '())
|
||||
(let ((date (catch #t
|
||||
(lambda () (string->date range date-format))
|
||||
(lambda (key . args) (current-date)))))
|
||||
(let-values (((description filter-lambda)
|
||||
(cond
|
||||
;; Filter records by day
|
||||
((string-ci= qualis "day")
|
||||
(values
|
||||
(format #f "DAY ~a" (date->string date "~Y-~m-~d"))
|
||||
(lambda (x) (same-day? date (cadr x)))))
|
||||
|
||||
;; Filter records by month
|
||||
((string-ci= qualis "month")
|
||||
(values
|
||||
(format #f "MONTH ~a" (date->string date "~Y-~m"))
|
||||
(lambda (x) (same-month? date (cadr x)))))
|
||||
|
||||
;; Filter records by week
|
||||
((string-ci= qualis "week")
|
||||
(let ((beg (monday-of-week date))
|
||||
(end (monday-of-next-week date)))
|
||||
(values
|
||||
(format #f "WEEK [~a - ~a)"
|
||||
(date->string beg date-format)
|
||||
(date->string end date-format))
|
||||
(lambda (x) (date-in-range? (cadr x) beg end)))))
|
||||
|
||||
;; Filter records by path
|
||||
(else
|
||||
(values
|
||||
(format #f "PROJECT ~a" qualis)
|
||||
(let ((rep-path (path-split qualis)))
|
||||
(lambda (x)
|
||||
(let loop ((path (car x))
|
||||
(rep-path rep-path))
|
||||
(if (or
|
||||
(null? path)
|
||||
(null? rep-path)) #t
|
||||
(if (string-ci= (car path) (car rep-path))
|
||||
(loop (cdr path) (cdr rep-path))
|
||||
#f))))))))))
|
||||
(values
|
||||
(filter filter-lambda sheet)
|
||||
description)))))
|
||||
|
||||
;;; ================================ COMMANDS ==================================
|
||||
|
||||
;;; Start new task. Returns new sheet with started task or #f if nothing started.
|
||||
@ -545,50 +605,18 @@
|
||||
;;; Print report
|
||||
(define (cmd-report sheet deadlines . params)
|
||||
(format #t "--- REPORT")
|
||||
(let ((sheet
|
||||
(if (null? params) sheet
|
||||
(let* ((interval (car params))
|
||||
(report-date (catch #t
|
||||
(lambda () (string->date (cadr params) date-format))
|
||||
(lambda (key . args) (current-date)))))
|
||||
(filter (cond
|
||||
;; Filter records by day
|
||||
((string-ci= interval "day")
|
||||
(format #t ". DAY ~a" (date->string report-date "~Y-~m-~d"))
|
||||
(lambda (x) (same-day? report-date (cadr x))))
|
||||
|
||||
;; Filter records by month
|
||||
((string-ci= interval "month")
|
||||
(format #t ". MONTH ~a" (date->string report-date "~Y-~m"))
|
||||
(lambda (x) (same-month? report-date (cadr x))))
|
||||
|
||||
;; Filter records by week
|
||||
((string-ci= interval "week")
|
||||
(let ((beg (monday-of-week report-date))
|
||||
(end (monday-of-next-week report-date)))
|
||||
(format #t ". WEEK [~a - ~a)"
|
||||
(date->string beg date-format)
|
||||
(date->string end date-format))
|
||||
(lambda (x) (date-in-range? (cadr x) beg end))))
|
||||
|
||||
;; Filter records by path
|
||||
(else
|
||||
(format #t ". PROJECT ~a" interval)
|
||||
(let ((rep-path (path-split interval)))
|
||||
(lambda (x)
|
||||
(let loop ((path (car x))
|
||||
(rep-path rep-path))
|
||||
(if (or
|
||||
(null? path)
|
||||
(null? rep-path)) #t
|
||||
(if (string-ci= (car path) (car rep-path))
|
||||
(loop (cdr path) (cdr rep-path))
|
||||
#f)))))))
|
||||
sheet)))))
|
||||
(let ((qualis (nth-maybe 0 params))
|
||||
(range (nth-maybe 1 params)))
|
||||
(let-values (((sheet description)
|
||||
(filter-sheet sheet qualis range)))
|
||||
(when (not (null? description))
|
||||
(display ". ")
|
||||
(display description))
|
||||
(newline)
|
||||
(print-report
|
||||
(add-deadlines-to-report!
|
||||
(make-report sheet) deadlines)))
|
||||
(make-report sheet) deadlines))))
|
||||
|
||||
(let ((last (last-task sheet)))
|
||||
(when last
|
||||
(format #t "\n--- ~a TASK\n"
|
||||
@ -680,6 +708,20 @@
|
||||
(values sheet deadlines)
|
||||
(values #f #f))))
|
||||
|
||||
;;; Events
|
||||
(define (cmd-timesheet sheet deadlines . params)
|
||||
(format #t "--- TIMESHEET")
|
||||
(let ((qualis (nth-maybe 0 params))
|
||||
(range (nth-maybe 1 params)))
|
||||
(let-values (((sheet description)
|
||||
(filter-sheet sheet qualis range)))
|
||||
(when (not (null? description))
|
||||
(display ". ")
|
||||
(display description))
|
||||
(newline)
|
||||
(print-timerecords sheet)))
|
||||
(values #f #f))
|
||||
|
||||
;;; ================================ MAIN FUNCTION ==================================
|
||||
|
||||
(define (main cmdl)
|
||||
@ -724,6 +766,8 @@
|
||||
((string= command "report") cmd-report)
|
||||
((string= command "refresh") (lambda (s d . p) (values s d)))
|
||||
((string= command "deadline") cmd-deadline)
|
||||
((string= command "timesheet") cmd-timesheet)
|
||||
;; Service commands
|
||||
((string= command "tasklist") cmd-tasklist)
|
||||
((string= command "deadlist") cmd-deadlist)
|
||||
|
||||
@ -744,6 +788,11 @@
|
||||
(format #t " deadline clear [TASK] Remove deadline for project (or for last task)\n")
|
||||
(format #t " deadline [TASK] Show deadline for project\n")
|
||||
(format #t " deadline all Show all deadlines\n")
|
||||
(format #t " timesheet Show all raw events\n")
|
||||
(format #t " timesheet day [DATE] Show raw events for today or DATE\n")
|
||||
(format #t " timesheet week [DATE] Show raw events for current week or week of DATE\n")
|
||||
(format #t " timesheet month [DATE] Show raw events for current month or month of DATE\n")
|
||||
(format #t " timesheet TASK Show raw events\n")
|
||||
(format #t " refresh Refresh worksheet file after manual edit\n")
|
||||
(format #t " (no command) Show running task and timer\n\n")
|
||||
(format #t "DATE format: YYYY-mm-dd\n")
|
||||
|
||||
@ -13,7 +13,7 @@ _timer() {
|
||||
case "$state" in
|
||||
(command)
|
||||
# Commands
|
||||
_arguments '1:commands:(start stop report deadline refresh help)'
|
||||
_arguments '1:commands:(start stop report deadline refresh timesheet help)'
|
||||
;;
|
||||
|
||||
(arg1)
|
||||
@ -22,7 +22,7 @@ _timer() {
|
||||
(start)
|
||||
compadd $(timer tasklist)
|
||||
;;
|
||||
(report)
|
||||
(report|timesheet)
|
||||
compadd day week month $(timer tasklist)
|
||||
;;
|
||||
(deadline)
|
||||
@ -34,7 +34,7 @@ _timer() {
|
||||
(arg2)
|
||||
# Command argument 2
|
||||
case $words[2] in
|
||||
(report)
|
||||
(report|timesheet)
|
||||
case $words[3] in
|
||||
(day)
|
||||
compadd $(date +"%Y-%m-%d")
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user