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\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'};
46 for my $year (keys %{ $events }) {
47 for my $month (sort keys %{ $events->{$year} }) {
48 for my $day (sort keys %{ $events->{$year}{$month} }) {
49 for my $uid (keys %{ $events->{$year}{$month}{$day} }) {
50 my $summary = $events->{$year}{$month}{$day}{$uid}{'SUMMARY'} || '';
51 my $desc = $events->{$year}{$month}{$day}{$uid}{'DESCRIPTION'} || 'misc';
52 my $hours = $events->{$year}{$month}{$day}{$uid}{'hours'} || 0;
53 my $dtstart = $events->{$year}{$month}{$day}{$uid}{'DTSTART'} || '';
56 if defined $events->{$year}{$month}{$day}{$uid}{'allday'};
61 $total_hours += $hours;
64 my ($day) = split(/ /, $dtstart);
65 $days{$day}{lc($summary)}{'work'}{$desc} += $hours;
66 $days{$day}{lc($summary)}{'client'} ||= $summary;
69 $clients{lc($summary)}{'work'}{$desc}{'hours'} += $hours;
70 $clients{lc($summary)}{'hours'} += $hours;
71 $clients{lc($summary)}{'client'} ||= $summary;
72 push @{ $clients{lc($summary)}{'work'}{$desc}{'times'} }, [ $hours, $dtstart ];
73 #print "event: $summary - $dtstart - $desc\n";
74 #print Dumper($entry);
80 print_clients_summary();
86 print "Total Hours Worked: $total_hours\n\n";
92 return sprintf((' ' x $indent) . "%2.2f - %s\n", @_);
95 sub print_clients_summary {
96 $Text::Wrap::columns = 78;
97 for my $client (sort keys %clients) {
98 print detail_line(2, $clients{$client}{'hours'}, $clients{$client}{'client'});
103 $Text::Wrap::columns = 78;
104 for my $client (sort keys %clients) {
105 print "$clients{$client}{'client'}:\n";
106 print detail_line(2, $clients{$client}{'hours'}, 'Client Total');
109 for my $desc (sort keys %{ $clients{$client}{'work'} }) {
110 print wrap(' ', ' ', $desc) . "\n";
112 for my $time (sort { $a->[1] cmp $b->[1] } @{ $clients{$client}{'work'}{$desc}{'times'} }) {
113 print detail_line(4, $time->[0], $time->[1]);
116 if (scalar(@{ $clients{$client}{'work'}{$desc}{'times'} }) > 1) {
117 print detail_line(4, $clients{$client}{'work'}{$desc}{'hours'}, 'Total');
126 $Text::Wrap::columns = 70;
127 for my $day (sort keys %days) {
130 for my $client (sort keys %{ $days{$day} }) {
131 for my $desc (sort keys %{ $days{$day}{$client}{'work'} }) {
132 print detail_line(2, $days{$day}{$client}{'work'}{$desc}, wrap('', ' ', "$days{$day}{$client}{'client'} - $desc"));