#!/usr/bin/env perl
|
|
|
|
use warnings;
|
|
use strict;
|
|
use 5.10.0;
|
|
|
|
use File::HomeDir;
|
|
|
|
my $rcfile = File::HomeDir->my_home . "/.timelogrc";
|
|
# set an unreasonable default, so it's obvious:
|
|
our $hourly_rate = 10000;
|
|
do $rcfile if -e $rcfile;
|
|
|
|
my $total_hours = 0;
|
|
my $total_expenses = 0;
|
|
|
|
# while we've got input from a file/stdin, split it into two datestamps
|
|
# and feed that to date(1)
|
|
while (my $line = <>) {
|
|
|
|
chomp($line);
|
|
|
|
if ($line =~ m/
|
|
^
|
|
\s{2,} # leading whitespace, two or more
|
|
|
|
expense: # the string "expense"
|
|
|
|
[ ] # a space
|
|
|
|
\$ ([\d.]+) # an amount
|
|
|
|
[ ]
|
|
- # a dash with spaces
|
|
[ ]
|
|
|
|
(.*?) # any notes
|
|
|
|
$ # eol
|
|
/ix)
|
|
{
|
|
my $expense_amount = $1;
|
|
$total_expenses += $expense_amount;
|
|
my $expense_notes = $2;
|
|
say "* $line";
|
|
}
|
|
|
|
# skip things that don't look like a date range - everything else can
|
|
# just be commentary.
|
|
next unless $line =~ m/
|
|
^
|
|
\s{2,} # leading whitespace of two or more chars
|
|
|
|
(
|
|
\d{4} - \d{2} - \d{2} # date
|
|
)
|
|
|
|
[ ] # space
|
|
|
|
(
|
|
\d{1,2} : \d{2} # start timestamp
|
|
)
|
|
|
|
[ ] - [ ] # delimiter
|
|
|
|
(
|
|
\d{1,2} : \d{2} # end timestamp
|
|
)
|
|
$
|
|
/ix;
|
|
|
|
my $start_timestamp = "$1 $2";
|
|
my $end_timestamp = "$1 $3";
|
|
|
|
my ($start, $end) = map { get_seconds($_) } ($start_timestamp, $end_timestamp);
|
|
my $interval = $end - $start;
|
|
my $hours = $interval / 3600;
|
|
$total_hours += $hours;
|
|
say sprintf("* $line\t%.3f hours", $hours);
|
|
|
|
}
|
|
|
|
my $hourly_total = $total_hours * $hourly_rate;
|
|
my $overall_total = $hourly_total + $total_expenses;
|
|
|
|
print "\n";
|
|
say sprintf(
|
|
# extra spaces at end for newline in markdown:
|
|
'%.3f total hours at $%.2f/hr = $%.2f ',
|
|
$total_hours,
|
|
$hourly_rate,
|
|
$hourly_total
|
|
);
|
|
|
|
say sprintf(
|
|
'$%.2f in expenses',
|
|
$total_expenses
|
|
);
|
|
|
|
print "\n";
|
|
say sprintf('**Total due = $%.2f**', $overall_total);
|
|
|
|
sub get_seconds {
|
|
my ($stamp) = @_;
|
|
my $seconds = `date --date="$stamp" +%s`;
|
|
chomp($seconds);
|
|
return $seconds;
|
|
}
|