2012-04-12 13 views
38

Tak więc w pracy używamy elastycznego czasu pracy (flex hours, flexi hours ...), co jest miłe, ale może być trudne do śledzenia. Obecnie używam trybu org, aby śledzić moje godziny pracy (org-clock-(out|in)), ale chciałbym je rozszerzyć, aby automagicznie obliczyć, czy przepracowałem więcej niż 8 godzin (nadwyżka czasu powinna zostać dodana do mojego "konta" elastycznego) lub mniej (w zależności od tego, jak długo trwała przerwa obiadowa itp.), saldo na moim "koncie" elastycznym i takie.Śledzenie elastycznego czasu pracy za pomocą Emacsa (tryb & org)

Czy ktoś jeszcze używa do tego Emacsa?

obecnie używam bardzo podstawową konfigurację, aby śledzić czas:

(defun check-in() 
    (interactive) 
    (let (pbuf (current-buffer)) 
    (find-file (convert-standard-filename "whatnot")) 
    (goto-char (point-max)) 
    (insert "\n") 
    (org-insert-heading) 
    (org-insert-time-stamp (current-time)) 
    (org-clock-in) 
    (save-buffer) 
    (switch-to-buffer pbuf))) 

(defun check-out() 
    (interactive) 
    (let (pbuf (current-buffer)) 
    (find-file (convert-standard-filename "whatnot")) 
    (goto-char (point-max)) 
    (org-clock-out) 
    (save-buffer) 
    (switch-to-buffer pbuf))) 
+2

Twój kod myli "bufor bieżący" z buforem wyświetlanym w "wybranym oknie". Wywołanie 'switch-to-buffer' od Elisp jest zazwyczaj oznaką takich problemów. Zamiast obecnego bufora + pliku-find + przełącznika na bufor, chcesz użyć '(with-current-buffer (find-file-noselect ...) ...)'. Jeszcze jedna uwaga: nie zawracaj sobie głowy wywoływaniem 'convert-standard-filename', ponieważ prawdopodobnie nie robi to, co myślisz, a twój kod będzie działał równie dobrze bez niego. – Stefan

Odpowiedz

4

Zakładając, że zrozumiałem swój problem prawidłowo, I hacked razem szybkie rozwiązanie. Po pierwsze, powinieneś upewnić się, że tworzysz tylko jeden wpis konspektu na dzień, jeśli wielokrotnie wchodzisz i wychodzisz. Zdefiniuj następującą funkcję, która wyliczy nadgodziny na dany dzień.

(defun compute-overtime (duration-string) 
    "Computes overtime duration string for the given time DURATION-STRING." 
    (let (minutes-in-a-workday 
     work-minutes 
     overtime-minutes) 
    (defconst minutes-in-a-workday 480) 
    (setq work-minutes (org-duration-string-to-minutes duration-string) 
      overtime-minutes (- work-minutes minutes-in-a-workday)) 
    (if (< overtime-minutes 0) (setq overtime-minutes 0)) 
    (org-minutes-to-hh:mm-string overtime-minutes))) 

Następnie użyć w formule tabeli zegara w pliku whatnot.

#+BEGIN: clocktable :maxlevel 1 :emphasize nil :scope file :formula "$3='(compute-overtime $2)::@2$3=string(\"Overtime\")"  
#+END: clocktable 

Hit CC CC gdy jesteś na stole zegara, aby ją zregenerować.

Możesz uzyskać łączną liczbę nadgodzin poprzez zsumowanie nadpisań za pomocą innej formuły. Ale ja tego nie wymyśliłem.

+0

Zdecydowanie wypróbuję to jak najszybciej. –

+0

Cześć! Jestem już dość późno na przyjęcie, ale dziękuję! Jedno ostatnie pytanie, mogę pracować mniej niż 8 godzin, jeśli później to wynagrodzę. Powyższy kod daje w wyniku dni, w których moje nadgodziny (musiałem usunąć "(jeśli)") mogą być "-1: -1" (po pracy 6:59). Spojrzałem na definiton off '(org-minutes-to-hh: mm-string)' ale nie mogłem wymyślić jak to zrobić. – monotux

+0

W końcu to rozgryzłem. Dzięki! – monotux

Powiązane problemy