2012-04-12 19 views
38

Quindi, al lavoro usiamo il flexitime (orario flessibile, orario flessibile ...) che è bello ma può essere difficile da tenere sotto controllo. Attualmente sto utilizzando la modalità org per tenere traccia dei miei orari (org-clock-(out|in)) ma mi piacerebbe estenderlo per calcolare automaticamente se ho lavorato più di 8 ore (il tempo in più deve essere aggiunto al mio account 'flessibile') o meno (a seconda di quanto a lungo pausa pranzo ho preso, ecc), il saldo sul mio conto 'flessibile' e così via.Tracking flexitime usando Emacs (& org-mode)

Qualcun altro utilizza Emacs per questo?

Attualmente sto usando una configurazione molto semplice per monitorare il mio tempo:

(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

Il tuo codice confonde il 'buffer corrente 'con il buffer visualizzato nella' finestra selezionata'. Chiamare 'switch-to-buffer' da Elisp è generalmente un segno di tali problemi. Invece di current-buffer + find-file + switch-to-buffer, si vuole usare '(with-current-buffer (find-file-noselect ...) ...)'. Ancora una nota: non preoccupatevi di chiamare 'convert-standard-filename' dato che probabilmente non fa realmente quello che pensate, e il vostro codice funzionerà altrettanto bene senza di esso. – Stefan

risposta

4

Supponendo che ho capito il tuo problema in modo corretto, ho messo insieme una soluzione rapida. Innanzitutto, è necessario assicurarsi di creare solo una voce di struttura al giorno, se si effettua il check-in e il ritiro più volte. Definisci la seguente funzione che calcolerà gli straordinari per un determinato giorno.

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

Quindi, utilizzare questo in una formula tabella di orologio nel file 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 quando si è sul tavolo orologio per rigenerarlo.

È possibile ottenere il totale straordinario sommando i tempi supplementari utilizzando un'altra formula. Ma non l'ho ancora risolto.

+0

Sicuramente lo proverò appena possibile. –

+0

Ciao! Sono in ritardo per la festa ora, ma grazie! Un'ultima domanda, ho il permesso di lavorare per meno di 8 ore se ripenso a questo dopo. Il codice sopra risulta in giorni in cui il mio overtime (ho dovuto rimuovere il '(if)' -statement) può essere '-1: -1' (dopo aver funzionato 6:59). Ho visto la definizione di "(org-minutes-to-hh: mm-string)", ma non sono riuscito a capire come farlo. – monotux

+0

Alla fine ho capito. Grazie! – monotux