997b10161a122dd7c415c48f69f4f71a1e22f717
[ical-summary.git] / bin / summary-ics.pl
1 #!/usr/bin/perl -w
2
3 use strict;
4 use Getopt::Long;
5 use Date::Manip;
6 use iCal::Parser;
7 use Text::Wrap;
8
9 my $start = undef;
10 my $end   = undef;
11
12 GetOptions(
13  'start' => \$start,
14  'end'   => \$end,
15 );
16
17 $start ||= UnixDate(ParseDate('last month'), '%Y-%m-01');
18 $end   ||= UnixDate(ParseDate('now'), '%Y-%m-01');
19
20 $start = ParseDate($start);
21 $end   = ParseDate($end);
22
23 my $filename = shift;
24
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"
28   unless -f $filename;
29
30 print "Processing date range: " . UnixDate($start, '%Y-%m-%d') . " - " . UnixDate($end, '%Y-%m-%d') . "\n";
31
32 my $parser = iCal::Parser->new(
33   'start' => UnixDate($start, '%Y%m%d'),
34   'end'   => UnixDate($end, '%Y%m%d'),
35   'no_todos' => 1,
36 );
37
38 my $cal = $parser->parse($filename);
39 my $events = $cal->{'events'};
40
41 my %clients;
42
43 use Data::Dumper;
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'}     || '';
52
53         $hours = 8
54           if defined $events->{$year}{$month}{$day}{$uid}{'allday'};
55
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);
61       }
62     }
63   }
64 }
65
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";
70
71     for my $time (sort @{ $clients{$client}{'work'}{$desc}{'times'} }) {
72       print detail_line($time->[0], $time->[1]);
73     }
74
75     if (scalar(@{ $clients{$client}{'work'}{$desc}{'times'} }) > 1) {
76       print detail_line($clients{$client}{'work'}{$desc}{'hours'}, 'Total');
77     }
78   }
79   print "\n";
80 }
81
82 sub detail_line {
83   return sprintf("    %5.2f - %s\n", @_);
84 }
85