2012-04-12 27 views
38

Vì vậy, tại nơi làm việc chúng tôi sử dụng flexitime (flex giờ, flexi giờ ...) mà là tốt đẹp nhưng có thể khó theo dõi. Tôi hiện đang sử dụng chế độ org để theo dõi số giờ của tôi (org-clock-(out|in)) nhưng tôi muốn mở rộng để tính toán tự động nếu tôi đã làm việc hơn 8 giờ (thời gian dư thừa sẽ được thêm vào tài khoản 'flex' của tôi) hoặc ít hơn (tùy thuộc vào thời gian nghỉ trưa tôi đã lấy vv), số dư trên tài khoản 'flex' của tôi và như vậy.Theo dõi flexitime bằng Emacs (& org-mode)

Có ai khác sử dụng Emacs cho mục đích này không?

Tôi hiện đang sử dụng một thiết lập rất cơ bản để theo dõi thời gian của tôi:

(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

Mã của bạn gây nhầm lẫn với 'bộ đệm hiện tại' với bộ đệm được hiển thị trong' cửa sổ đã chọn'. Gọi 'switch-to-buffer' từ Elisp thường là dấu hiệu của những vấn đề như vậy. Thay vì bộ đệm hiện tại + find-file + switch-to-buffer, bạn muốn sử dụng '(với hiện tại-bộ đệm (find-file-noselect ...) ...)'. Một lưu ý nữa: đừng bận tâm gọi 'conversion-standard-filename' vì nó có thể không thực sự làm những gì bạn nghĩ, và mã của bạn sẽ hoạt động tốt mà không có nó. – Stefan

Trả lời

4

Giả sử rằng tôi hiểu vấn đề của bạn một cách chính xác, tôi bị tấn cùng một giải pháp nhanh chóng. Trước tiên, bạn nên đảm bảo rằng bạn chỉ tạo một mục nhập phác thảo mỗi ngày, nếu bạn đang kiểm tra trong và ngoài nhiều lần. Xác định hàm sau sẽ tính giờ làm thêm cho một ngày nhất định.

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

Sau đó, sử dụng công thức bảng đồng hồ trong tệp whatnot.

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

Hit C-c C-c khi bạn đang ở trên bảng đồng hồ để tái tạo nó.

Bạn có thể nhận tổng số giờ làm thêm bằng cách cộng tổng số lần sử dụng công thức khác. Nhưng, tôi đã không làm việc đó.

+0

Tôi chắc chắn sẽ thử điều đó càng sớm càng tốt. –

+0

Xin chào! Tôi khá muộn cho bữa tiệc bây giờ, nhưng cảm ơn bạn! Một câu hỏi cuối cùng, tôi được phép làm việc ít hơn 8 giờ nếu tôi bù lại điều này sau. Đoạn mã trên kết quả trong những ngày mà thời gian làm thêm của tôi (tôi phải loại bỏ '(if)' -statement) có thể là '-1: -1' (sau khi làm việc 6:59). Tôi nhìn vào definiton tắt '(org-phút-to-hh: mm-string)' nhưng không thể tìm ra cách để làm điều đó. – monotux

+0

Tôi đã tìm ra nó cuối cùng. Cảm ơn! – monotux

Các vấn đề liên quan