2012-04-12 2 views
38

) 직장에서 우리는 flexitime (flex hours, flexi hours ...)을 사용합니다. 그러나 좋지만 추적하기가 어려울 수 있습니다. 나는 현재 나의 시간 (org-clock-(out|in))을 추적하기 위해 org-mode를 사용하고있다. 그러나 나는 8 시간 이상을 일했는지 자동 계산할 수 있도록 확장하고 싶다. (잉여 시간은 나의 flexitime 'account'에 추가되어야한다.) (점심 시간이 얼마나 오래 걸렸는가에 따라), 내 flexitime '계정'의 잔고 등이 포함됩니다.이맥스를 사용하여 flexitime 추적하기 (

누구든지이 용도로 Emacs를 사용합니까?

나는 현재 내 시간을 추적하는 데 매우 기본 설정을 사용하고 있습니다 :

(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

코드는'current-buffer'를'selected-window'에 표시된 버퍼와 혼동합니다. Elisp로부터'switch-to-buffer'를 호출하는 것은 일반적으로 그러한 문제의 징후입니다. current-buffer + find-file + switch-to-buffer 대신'(with-current-buffer (find-file-noselect ...) ...)'를 사용하고 싶다. 한 가지 더주의하십시오 :'convert-standard-filename'을 호출하는 것은 귀찮은 일이 아닙니다. 아마도 여러분이 생각하는 것을 실제로하지 않을 것이고, 여러분의 코드는 그것 없이도 잘 작동 할 것입니다. – Stefan

답변

4

내가 제대로 문제를 이해한다고 가정하면, 내가 함께 빠른 해결책을 해킹. 첫째, 여러 번 체크 인 및 체크 아웃하는 경우 하루에 하나의 개요 항목 만 작성해야합니다. 주어진 날에 대한 초과 근무를 계산할 다음 함수를 정의하십시오.

(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))) 

그리고, 파일 whatnot에 시계 테이블이 식을 사용한다. 당신이 그것을 재생하기 위해 시계 테이블에있는 경우

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

C-C의 C-C를 누르십시오.

다른 수식을 사용하여 초과 근무 시간을 합산하여 초과 근무 수당을 얻을 수 있습니다. 그러나, 나는 그것을 해결하지 못했습니다.

+0

나는 확실히 그것을 최대한 빨리 시도 할 것이다. –

+0

안녕하세요! 나는 파티에 꽤 늦었지만 고마워! 마지막 질문 하나, 나중에 이것을 보충 할 경우 8 시간 미만 근무할 수 있습니다. 위의 코드는 나의 초과 작업 ('if (if)'- 명령문을 제거해야만하는)이 -1 : -1 (작업 6시 59 분 이후) 일 수있는 날을 초래합니다. 나는'(org-minutes-to-hh : mm-string)'의 정의를 보았지만 그것을하는 법을 알 수 없었다. – monotux

+0

나는 그것을 결국 알아 냈다. 감사! – monotux

관련 문제