Reckonings

Reckonings (called reckonings before version 360), are etm's way of showing exactly how you spent your time. As you will see, a myriad of possibilities exist for detail and breakdowns.

Reckonings are invoked by beginning the e.py command line with '-r' followed an optional argument string including one or more of the following:

switchvariablevalue
-Cc_positionnon-negative integer
-Dd_positionnon-negative integer
-Kk_levelnon-negative integer
-IitemizeTrue if -I is included, False otherwise

E.g., 'e.py -r -C2 -D1 -K3' would set c_position=2, d_position=1, k_level=3 and, since '-I' was not included, itemize=False.

Alternatively, entering 'e.py -R' would display usage information followed by a prompt for options.

Pressing 'R' in the gui version brings up a prompt in which the same argument string can be entered. Alternatively, pressing 'r' in the gui version would produce a reckoning using the default arguments.

Reckonings are based on the contexts, dates, starting time, ending time, keywords and titles of items in your etm '.txt' files. Of these, only keywords can be hierarchical. With the keyword 'a:b:c....', for example, 'a' would be regarded as the top level, 'a:b' as the second level, 'a:b:c' as the third level and so forth. A lawyer, for example, might want to use the first level for the name of the client, the second level for the project and so forth.

How are times aggregated? Suppose we have the following event:

* T @d D @s S @e E @c C @k a:b:c:d

The number of minutes that this event would contribute to report totals and subtotals, M, would be computed by first taking the number of minutes, m, between the starting time, S, and the ending time, E. Alternatively, for the time journal entry

~ T @d D @j m @c C @k a:b:c:d

the number of minutes, m, would be obtained directly from the value of the @j field.

Now suppose that i is the value of 'increment' in your '~/.etmrc'. For example, a lawyer using 0.1 hour or 6 minute billing, would have increment = 6. Then M is equal to ceil(m/)i where you will recall that ceiling is the smallest integer at least as great as m/i. E.g., if m = 27 and i = 6, then M = ceil(27/6)*6 = ceil(4.5)*6 = 5*6 = 30. In short, M is obtained by rounding m up to the next increment.

To prepare a report, etm first constructs a list for each event and journal entry with components that depend upon the values of c_position, d_position, k_level and itemize. Here are some examples of the list that would be constructed from our illustrative event:

c_positiond_positionk_levelitemizelist
a)000False()
b)000True(T)
c)100False(C)
d)010False(D)
e)010True(D, T)
f)001False(a)
g)002False(a, b)
h)002True(a, b, T)
i)012False(D, a, b)
j)032True(a, b, D, T)
k)022True(a, D, b, T)

The reports that would be generated by each of these settings are illustrated below.

Next, etm forms totals and subtotals corresponding to the list so that the computed M for all lists with the same first component would be added to form the first level totals. Next the M's for all lists with the same first two components would be added to form second level totals and so forth.

This is best illustrated by example. Suppose that we have a single etm data file with the contents:

    legal eg
    ~ Activity 1 @d 2009-05-05 @p 15 @c context 2 @k client 1:project 2
    ~ Activity 2 @d 2009-05-05 @p 27 @c context 1 @k client 1: project 1
    ~ Activity 2 @d 2009-05-05 @p 18 @c context 1 @k client 1: project 1
    * Event 1 @d 2009-05-05 @s 10:30AM @e 12:00PM @c context 1 @k client 1:project 1 
    ~ Activity 3 @d 2009-05-05 @p 150 @c context 1 @k client 2:project 1
    + Task 1 @d 2009-05-05 @f 2009-05-05 @c context 2 @k client 1:project 1
    * Event 2 @d 2009-05-06 @s 1:30PM @e 3:00PM @c context 2 @k client 2:project 2 
    ~ Activity 4 @d 2009-05-06 @p 60 @c context 3 @k client 1 :project 2
    - Task 2 @d 2009-05-06 @f 2009-05-06 @c context 2 @k client 2:project 1
    ~ Activity 5 @d 2009-05-06 @p 30 @c context 3 @k client 2:project 2
    * Event 3 @d 2009-05-07 @s 10:00AM @e 11:00AM @c context 1 @k client 1:project 1 
    ~ Activity 6 @d 2009-05-07 @p 120 @c context 1 @k client 2:project 1
    * Event 4 @d 2009-05-07 @s 4:00PM @e 5:00PM @c context 3 @k client 1:project 2 
    * Event 5 @d 2009-05-08 @s 10:00AM @e 2:00PM @c context 3 @k client 1:project 2 
    + Task 3 @d 2009-05-08 @f 2009-05-08 @c context 1 @k client 2: project 2

e.py -l -b 5/4 -e 5/8

First, note that in list view tasks appear along with journal entries and events. Since tasks (reminders of things that need to be done), take no time themselves, they will not appear in any of the reckonings.

    _________________________ list: 2009-05-04 ~ 2009-05-08 ________________________
    Tue May 05 09
                 15m  Activity 1
                 27m  Activity 2
                 18m  Activity 2
                150m  Activity 3
        10:30a 12:00p Event 1
                  X   Task 1

    Wed May 06 09
                60m   Activity 4
                30m   Activity 5
        1:30p  3:00p  Event 2
                 X    Task 2

    Thu May 07 09
               120m   Activity 6
       10:00a 11:00a  Event 3
        4:00p  5:00p  Event 4

    Fri May 08 09
       10:00a  2:00p  Event 5
                 X    Task 3
    ___ etm ________________________________________________________________________

Illustrative reckonings

In the following, increment=6, c_position=0, d_position=0 and k_level=0 are the default values set in '~/.etmrc'.

a) e.py -r -b 5/4 -e 5/8

Here c_position=0, d_position=0, and k_level=0 entails no breakdown whatever and etm simply reports the total time.

    _________________ reckoning: 2009-05-04 ~ 2009-05-08 (16:06) _________________
    total time: 16:06 

    ___ etm ______________________________________________________________________

The time is displayed in HH::MM format because 'hours_minutes = True' is set in '~/.etmrc'. Otherwise time periods would be displayed as hours and tenths.

b) e.py -r -b 5/4 -e 5/8 -I

    _________________ reckoning: 2009-05-04 ~ 2009-05-08 (16:06) _________________
     0:18)  Activity 1 
     0:48)  Activity 2 
     2:30)  Activity 3 
     1:00)  Activity 4 
     0:30)  Activity 5 
     2:00)  Activity 6 
     1:30)  Event 1 
     1:30)  Event 2 
     1:00)  Event 3 
     1:00)  Event 4 
     4:00)  Event 5 

    ___ etm ______________________________________________________________________

c) e.py -r -b 5/4 -e 5/8 -C1

    _________________ reckoning: 2009-05-04 ~ 2009-05-08 (16:06) _________________
     7:48)  context 1 
     1:48)  context 2 
     6:30)  context 3 

    ___ etm ______________________________________________________________________

d) e.py -r -b 5/4 -e 5/8 -D1

    _________________ reckoning: 2009-05-04 ~ 2009-05-08 (16:06) _________________
     5:06)  2009-05-05 
     3:00)  2009-05-06 
     4:00)  2009-05-07 
     4:00)  2009-05-08 

    ___ etm ______________________________________________________________________

e) e.py -r -b 5/4 -e 5/8 -D1 -I

    _________________ reckoning: 2009-05-04 ~ 2009-05-08 (16:06) _________________
     5:06)  2009-05-05 
             0:18)  Activity 1 
             0:48)  Activity 2 
             2:30)  Activity 3 
             1:30)  Event 1 
     3:00)  2009-05-06 
             1:00)  Activity 4 
             0:30)  Activity 5 
             1:30)  Event 2 
     4:00)  2009-05-07 
             2:00)  Activity 6 
             1:00)  Event 3 
             1:00)  Event 4 
     4:00)  2009-05-08 
             4:00)  Event 5 

    ___ etm ______________________________________________________________________

f) e.py -r -b 5/4 -e 5/8 -K1

    _________________ reckoning: 2009-05-04 ~ 2009-05-08 (16:06) _________________
     9:36)  client 1 
     6:30)  client 2 

    ___ etm ______________________________________________________________________

g) e.py -r -b 5/4 -e 5/8 -K2

    _________________ reckoning: 2009-05-04 ~ 2009-05-08 (16:06) _________________
     9:36)  client 1 
             3:18)  project 1 
             6:18)  project 2 
     6:30)  client 2 
             4:30)  project 1 
             2:00)  project 2 

    ___ etm ______________________________________________________________________

h) e.py -r -b 5/4 -e 5/8 -K2 -I

    _________________ reckoning: 2009-05-04 ~ 2009-05-08 (16:06) _________________
     9:36)  client 1 
             3:18)  project 1 
                     0:48)  Activity 2 
                     1:30)  Event 1 
                     1:00)  Event 3 
             6:18)  project 2 
                     0:18)  Activity 1 
                     1:00)  Activity 4 
                     1:00)  Event 4 
                     4:00)  Event 5 
     6:30)  client 2 
             4:30)  project 1 
                     2:30)  Activity 3 
                     2:00)  Activity 6 
             2:00)  project 2 
                     0:30)  Activity 5 
                     1:30)  Event 2 

    ___ etm ______________________________________________________________________

i) e.py -r -b 5/4 -e 5/8 -D1 -K2

    _________________ reckoning: 2009-05-04 ~ 2009-05-08 (16:06) _________________
     5:06)  2009-05-05 
             2:36)  client 1 
                     2:18)  project 1 
                     0:18)  project 2 
             2:30)  client 2 
                     2:30)  project 1 
     3:00)  2009-05-06 
             1:00)  client 1 
                     1:00)  project 2 
             2:00)  client 2 
                     2:00)  project 2 
     4:00)  2009-05-07 
             2:00)  client 1 
                     1:00)  project 1 
                     1:00)  project 2 
             2:00)  client 2 
                     2:00)  project 1 
     4:00)  2009-05-08 
             4:00)  client 1 
                     4:00)  project 2 

    ___ etm ______________________________________________________________________

j) e.py -r -b 5/4 -e 5/8 -D3 -K2 -I

This one provides the detail that might be useful for billing clients.

    _________________ reckoning: 2009-05-04 ~ 2009-05-08 (16:06) _________________
     9:36)  client 1 
             3:18)  project 1 
                     2:18)  2009-05-05 
                             0:48)  Activity 2 
                             1:30)  Event 1 
                     1:00)  2009-05-07 
                             1:00)  Event 3 
             6:18)  project 2 
                     0:18)  2009-05-05 
                             0:18)  Activity 1 
                     1:00)  2009-05-06 
                             1:00)  Activity 4 
                     1:00)  2009-05-07 
                             1:00)  Event 4 
                     4:00)  2009-05-08 
                             4:00)  Event 5 
     6:30)  client 2 
             4:30)  project 1 
                     2:30)  2009-05-05 
                             2:30)  Activity 3 
                     2:00)  2009-05-07 
                             2:00)  Activity 6 
             2:00)  project 2 
                     2:00)  2009-05-06 
                             0:30)  Activity 5 
                             1:30)  Event 2 

    ___ etm ______________________________________________________________________

k) e.py -r -b 5/4 -e 5/8 -D2 -K2 -I -k 'client 1'

or by date before the second level keyword and just for client 1:

    __________ reckoning: (k~'client 1'): 2009-05-04 ~ 2009-05-08 (9:36) _________
     9:36)  client 1 
             2:36)  2009-05-05 
                     2:18)  project 1 
                             0:48)  Activity 2 
                             1:30)  Event 1 
                     0:18)  project 2 
                             0:18)  Activity 1 
             1:00)  2009-05-06 
                     1:00)  project 2 
                             1:00)  Activity 4 
             2:00)  2009-05-07 
                     1:00)  project 1 
                             1:00)  Event 3 
                     1:00)  project 2 
                             1:00)  Event 4 
             4:00)  2009-05-08 
                     4:00)  project 2 
                             4:00)  Event 5 

    ___ etm ______________________________________________________________________