Tuesday, August 28, 2007
This is the conclusion to my sordid affair with timesheets and Slimtimer.
I've worked in consulting agencies practically my entire career, and of course with consulting comes time tracking. And I've always been horrible at it, and I've always despised it. What is more counter-productive than having to report about every moment you are being productive?
As an employee though, there were some advantages. Once I got through the pain of recording my time entries, I could send them on their way and they'd eventually reach accounting, and I'd never have to think about them again. Now that I am
in business for myself, not only do I have to track my own time, I have to aggregate other people's time and expenses, bring them into
Quickbooks, and create invoices for my clients. Woe, the responsibilities of a small business owner...
I started out as rough as you can get. Excel spreadsheets, and manual cut and paste (and massage) into Quickbooks. That was no fun. Then, one of our projects was being outsourced to us by another consultancy, so it began to look like I would have to keep my time in three places - Excel, for convenience of entry, Quickbooks for my own billing and payroll, and in our partner's time tracking system.
I had to put my foot down!
I wanted to find a way to track my time in one place, and be able to export it to the other destinations. And it had to be more user-friendly and flexible than QB' nasty stand-alone Timer app. I preferred a web app, so I could update from any pc, any location. I quickly remembered
Slimtimer, the shiny Ruby on Rails time tracking app. In an nutshell, Slimtimer lets you manage your Tasks, and record Time Entries against each Task. You tag Tasks and Time Entries, and run reports. I raced off to see what kind of options it offered for exporting time data. CSV reports was the first answer. But it wasn't flexible enough. It might actually work for our partner agency, but would be a real pain to get into QB. I needed more control over which data I retrieved and how I retrieved it. Then I noticed the "
API" link (you need a slimtimer account to see that link).
Slimtimer allows you to retrieve and manipulate your tasks and time entries through a very nice (
almost RESTful) API. Looking at the output files of QB's own Timer application, and this
example page1, I set out to bring down my Slimtimer tasks and cram them into Quickbooks IIF file format to import. At the bottom of the API page, there happened to be links to two different
.NET wrappers for the Slimtimer API. At a quick glance, there were things I liked and didn't like about each, and I thought about writing my own. But, then I remembered the pain of parsing XML (at least until I get into LINQ for XML,
Steve), combined with the fact that the API calls were not pure XML representations of objects, but hybrids including some other values, and I decided to build it on top of these chap. I chose Mike Pilone's
SlimTimerDotNet.
The key to this process is using Slimtimer's tags to add the QB info you need. I use 3 tags in Slimtimer that map to QB properties: "Billable, "qb_job," and "qb_item". "Billable" is simple enough, if the task or entry is tagged as billable, it is marked as billable in QB. The other two are "compound tags" in that you need to add info to them to make them useful. Slimtimer uses comma-delimited tags, which at first annoyed me, but now I am very thankful for. It enables me to add a tag like so, "qb_job:Big Company:Big Project" without having to worry about the spaces or colons messing up the tags. In my SlimTimerConverter object, I parse that tag, and know that that Time Entry should be charged to Big Company's Big Project. Same goes for the item: "qb_item:Consulting:Programming" This will make sure the entry gets charged at the appropriate rate for my Consulting:Programming item in QB. I make sure the user's name in Slimtimer matches their name in Quickbooks. Finally, I combine the name of the task in Slimtimer with the comments for that entry, to get a nice "Note" field for QB such as, "[Big Project - Deployments] Deployed some big features to production."
I set most of my tags at the Task level in Slimtimer, and you can share tasks with other Slimtimer users, either individually, or by tagging them with a "shared" tag. You can then override the Task level tags by adding different ones at the Time Entry level (so I could re-use a Task name, but bill to a different project). The only downside I have seen so far is that when you share tasks, the tags do not share, so each user has to re-tag their tasks. I hear that Slimtimer is working on adding the ability to share tags though.
Right now I have this all running as a console app with the command line:
<code>> "slimtimerconverter.exe <username> <password> <start_date> <end_date></code>
There is still work to be done, and I'd like to add a GUI to it, maybe even in
Silverlight! Please leave a comment if you have any interest in the code - I'd be happy to share, but it's not quite ready to post as a finished product.
1 Neither the QB Timer app I have nor the example page apparently shows the correct, current, Quickbooks 2007 IIF file format. This results in a warning that you are using an older format, but still works fine. Quickbooks includes a Timer app in their Quickbooks 2007 CD-version, but it is not available in the downloadable version that I purchased. I am hoping to get a copy from a friend who has purchased the CD version, and will update my format accordingly after that.
Oh, Timesheets. How unfaithful I have been to you over the years. Shall we take a look back at our tumultuous relationship?
In the beginning, I tried to keep you with me throughout the day and update you as I worked... But I would end up pushing you off to the background, behind sexier applications, and at the end of the day you'd come nagging, asking me where I've been. "I've got to finish this up and get home," I'd say, "I'll spend some time with you tomorrow."
The end of the week would come and you'd be livid. "How am I supposed to get you paid if you won't even give me the time of day (that you are working on specific tasks)?" Flustered, I'd scramble through notes, emails, recently saved files, source control commits, and my own hazy memory, and somehow come up with a half-decent story about how my week went. You'd sigh, and shake your head, and off to accounting you'd go.
After years of this, I began to feel very guilty about my weakness. I knew I was no good at tracking my time, and I decided as a display of good will, I'd submit myself to surveillance. I purchased
Timesnapper. Life seemed good. I would never have to tell you I didn't know where I was or who I was with. If I was sashaying with C#, tickling T-SQL, or flirting with Firefox, it would be recorded. But it couldn't last. You see, it turned out to be no fun at all to replay your life a week or two (or three or four) after the fact and try to translate it into hours and tasks. And I still ended up looking at chat records, emails, and source control commits. There was less chance I'd miss something.
But I still felt something was missing.
I have another confession. Over the last year, I've spent some time with
Slimtimer. She was so young and lean and well... you seemed so outdated and... bloated. But I didn't like how she made me tell her the exact time (down to the second!) that I started and finished a task. Sometimes things just aren't so linear. She seemed very rigid that way, and I broke it off.
But recently, I found myself thinking about her again. I peeked in on her from time to time, and would track a task or two for old time's sake. In our conversations, I realized I had been a little too harsh on her. She told me I didn't
have to use her timer features, if they didn't suit me. I was surprised. "But your name is Slim
timer!" She looked at me seductively and asked, "What's in a name?"
And then she whispered something to me that made my hair stand on end. "Besides... I have an API. If you're clever, you can use me any way you want."
How could I resist?
To be continued...

I'm really starting to crack. I already have a Macbook Pro. "It's for music," I said. Music. Yeah, right. I used to play music, but that was before this little guy on the right showed up. He's not one to let you sit and play a nice pretty song on guitar. He's all rock and roll, and he's the lead singer. I've used my Macbook almost exclusively in Bootcamp mode doing .NET development and bringing it to client sites, etc. For music I now own or have owned 6 total iPods, although 2 were shuffles that I got for free, and shuffles don't really count anyway.
Then of course, they drop the iPhone on us. We ooh and ahh, understandably. Friends and relatives rush out to get one as soon as they are released. "Not me," I say, "I will wait until they work the kinks out in a 2nd revision, and come down in price!" (Note to self, Apple products never come down in price, they just add sexiness - not to mention fix their mistakes - in later revisions.) "I'm also under contract to T-Mobile through September," I mumble under my breath. Well, September is rolling in, and I'm finding lots of reasons to justify getting one of those shiny bad boys.
Refurbs, anyone?
And now, some of my .NET blogging heroes are showing off about how they run
Visual Studio on their Mac desktops! Hammet, of
MonoRail fame, just recently posted a
screenshot of his desktop. Please note there is nothing fancy about his desktop. EXCEPT THAT IT HAS VISUAL STUDIO RUNNING ON IT (possible via
VMWare Fusion and
Parallels)! I am convinced he posted this just to mess with my mind. Not that I didn't already know he was a
Mac guy, but the picture really hurt my feelings.
Then Scott Bellware posted one of his uncomfortably angry rants about Microsoft's "suckage" with
One Less Stupid, Piece of Microsoft Usability Negligence Crap in My Life. Scott certainly doesn't mince words, but the thing that really hit home for me was when he mentioned how he is realizing how much time he was wasting troubleshooting obscure and annoying issues with Microsoft OS's and software products. Having upgraded to Vista in the last few months, I've lost several days to some anoying issues with Visual Studio 2005, IIS 7, and even network and permissions issues. Not to mention, I was unable to use Quickbooks SDK (more on that soon!) without turning on User Account Control on Vista, which was something I immediately removed because it was so damned annoying. That could be a
whole post in itself.
Anyway, all this Mac talk has gotten me all hot and bothered, and thinking about the possibility of leaving the Windows world behind... some day... But for now, I just put together the Jeff Atwood "
LIttle Bang" PC, and I don't think I'm ready to use my Macbook Pro, with it's teeny 100GB hard drive, as my main computer yet, but I may just have to repartition and try VMWare Fusion rather than Bootcamp (the partitioning for which probably is why the hard drive seems teeny). The real question is - will it be able to run a Nortel VPN client on VMWare Fusion??
UPDATE:
Another one of my heroes flips.