17 $start ||= UnixDate(ParseDate('last month'), '%Y-%m-01');
18 $end ||= UnixDate(ParseDate('now'), '%Y-%m-01');
20 $start = ParseDate($start);
21 $end = ParseDate($end);
25 die "Please tell me a filename to work on!\n"
26 unless defined $filename;
27 die "I can't find the file: $filename\n"
30 print "Processing date range: " . UnixDate($start, '%Y-%m-%d') . " - " . UnixDate($end, '%Y-%m-%d') . "\n";
32 my $parser = iCal::Parser->new(
33 'start' => UnixDate($start, '%Y%m%d'),
34 'end' => UnixDate($end, '%Y%m%d'),
38 my $cal = $parser->parse($filename);
39 my $events = $cal->{'events'};
44 for my $year (keys %{ $events }) {
45 for my $month (sort keys %{ $events->{$year} }) {
46 for my $day (sort keys %{ $events->{$year}{$month} }) {
47 for my $uid (keys %{ $events->{$year}{$month}{$day} }) {
48 my $summary = $events->{$year}{$month}{$day}{$uid}{'SUMMARY'} || '';
49 my $desc = $events->{$year}{$month}{$day}{$uid}{'DESCRIPTION'} || 'misc';
50 my $hours = $events->{$year}{$month}{$day}{$uid}{'hours'} || 0;
51 my $dtstart = $events->{$year}{$month}{$day}{$uid}{'DTSTART'} || '';
54 if defined $events->{$year}{$month}{$day}{$uid}{'allday'};
56 $clients{lc($summary)}{'work'}{$desc}{'hours'} += $hours;
57 $clients{lc($summary)}{'client'} ||= $summary;
58 push @{ $clients{lc($summary)}{'work'}{$desc}{'times'} }, [ $hours, $dtstart ];
59 #print "event: $summary - $dtstart - $desc\n";
60 #print Dumper($entry);
66 for my $client (sort keys %clients) {
67 print "$clients{$client}{'client'}:\n";
68 for my $desc (sort keys %{ $clients{$client}{'work'} }) {
69 print wrap(' ', ' ', $desc) . "\n";
71 for my $time (sort @{ $clients{$client}{'work'}{$desc}{'times'} }) {
72 print detail_line($time->[0], $time->[1]);
75 if (scalar(@{ $clients{$client}{'work'}{$desc}{'times'} }) > 1) {
76 print detail_line($clients{$client}{'work'}{$desc}{'hours'}, 'Total');
83 return sprintf(" %5.2f - %s\n", @_);