Worktime is intended as a personal time tracker for cases where the employer trusts you to work the amount of hours set in your contract but you want to make sure you really did.
# worktime help
Manage worktimes in CouchDB
Usage:
worktime [command]
Available Commands:
overtime Shows total overtime over all time
show Display a summary of the given / current day
tag Adds or removes a tag from the day or time entry inside the day
time manipulate times of a day
Flags:
--config string config file (default is $HOME/.worktime.yaml)
--couchdb string URL to access couchdb (http://user:pass@host:port/database)
You will need:
- The worktime binary (see latest release)
- A CouchDB instance already set up with a database
- One design document (
analysis
) with (at least) one view (overtime
) in it (see below for an example)
After you've set up all of this you will need to export the COUCHDB
environment variable in the form https://user:pass@host/db
when using the worktime
commandline tool. (Alternatively you could pass the --couchdb
commandline flag to worktime every time you call it)
This view (analysis/overtime
) does the time calculation for you so you definitely need to adjust that one for your personal needs (weekly hours, tags, ...).
Map Function
function(day) {
var hasTag = function(day, tag) { return day.tags && day.tags.indexOf(tag) > -1 }
var worked_time = 0.0;
var daily_hours = 8.0;
for (var idx = 0; idx < day.times.length; idx++) {
var time = day.times[idx];
var s = new Date(day._id + 'T' + time.start);
var e = new Date(day._id + 'T' + time.end);
var diff = (e - s) / 1000.0 / 3600.0;
if (hasTag(time, "break")) {
worked_time = worked_time - diff;
} else {
worked_time = worked_time + diff;
}
}
if (hasTag(day, "holiday") || hasTag(day, "vacation") || hasTag(day, "ill") || hasTag(day, "weekend")) {
required_time = 0.0;
} else {
required_time = daily_hours;
}
var outcome = worked_time - required_time;
emit(day._id, outcome);
}
Reduce Function
function(keys, values, rereduce) {
var sum = 0.0;
for(var idx = 0; idx < values.length; idx++) {
sum = sum + values[idx];
}
return sum;
}
Of course this does not need to be the only view: You can for example add a view to count your days of vacation or even any other evaluation you can imagine. The tool just relies on analysis/overtime
to be present.