Maybe I should do this as a blog post ... basically we use our own product, Decal CMS for managing our tasks. It exposes all your pages and data in an XML API. We have "tree" templates and "sprint" templates. A sprint page is added as the child of a tree page. You can timesheet against a tree, if you're doing some unplanned maintenance or something that just crops up, or you timesheet against a sprint if this is actually what you're supposed to be working on (this allows us, theoretically, to tell when a sprint is late because someone has been pulled in too many other directions, but in practice we don't have tools to report on this yet).
So the IRC bot reads from the task system so that you can just type like:
askl: start decal
in order to start working on decal if you're doing some unplanned support or maintenance work, or if you're helping someone else out with their work, basically this is seen as an interruption from what you're scheduled to do.
Otherwise you can do this:
askl start: decal: some release
to timesheet against a sprint (we block off time in google calendar to allocate work). Each "sprint page" has a structured xml component on it (this is like, Decal terminology that won't make sense until you try it - we should have a live demo ready in a few weeks so you can give us your email address by going here if you want to be told when that happens: http://www.decalcms.com/page/Try_it_Out).
This structured XML component is where we put the client name, dates for the sprint and costs basis (either fixed price or amount per hour). This information is then used to make entries in the timesheeting system so we can tell whether to mark time as billable (in the case of per hour) so that it will generate an invoice, or not in the case of a fixed price where I raise an invoice separately and then the profit made on that "sale" is offset by the "loss" made in the development hours.
All of this is very ad-hoc, strung together with duct tape and pixie dust and most of it works most of the time. The most important thing is that all our hours and work are logged, and that's how we work out leave entitlements at the end of the year.
ie. each person is expected to put in 6 billable hours per day for 219 work days per year. So at the end of the year we just sum the hours you worked, and whatever is left over is how much leave you get the following year.
Right. yeah. I should really do a blog post at some point about this :)